Skip to content

fix(ci): retry sandbox image builds and file an issue when a release build fails - #9916

Merged
yiliang114 merged 16 commits into
mainfrom
fix/image-build-retry-and-alert
Aug 26, 2026
Merged

fix(ci): retry sandbox image builds and file an issue when a release build fails#9916
yiliang114 merged 16 commits into
mainfrom
fix/image-build-retry-and-alert

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

What this PR does

This PR makes the sandbox image publish step of the release pipeline self-healing and observable. The image build gets one bounded retry that survives transient buildx failures, and when a release build still fails, a follow-up job files (or updates) one GitHub issue per version so the missing image is visible and actionable instead of silently breaking downstream automation. The publish condition is consolidated into a single job-level expression so the login gate and both build steps cannot drift apart, and the existing workflow gate test is extended to pin the new contracts.

Why it's needed

The v0.22.0 tag build failed on a transient ETXTBSY during npm ci inside the docker build and was never retried, so ghcr.io/qwenlm/qwen-code:0.22.0 was never published while npm already served 0.22.0 as latest. Every sandbox-based CI lane (/resolve, sandboxed review, autofix) installs @latest, tries to enter the matching :0.22.0 sandbox image, and crashes with manifest unknown — for example the /resolve run on PR #9641 died before doing any work. The failure was silent for two days because nothing reports a released npm version that has no matching sandbox image. Details and run links are in #9898.

Reviewer Test Plan

How to verify

  1. Read the retry pair: the first build step carries continue-on-error: true and the retry gates on steps.build-and-push.outcome == 'failure' alone, so a successful retry turns the job green (a failure() gate would read false once continue-on-error absorbs the first attempt, silently skipping the retry).
  2. node scripts/lint.js --actionlint (or actionlint directly) reports nothing for the changed workflow.
  3. vitest run scripts/tests/build-and-publish-image-workflow.test.js passes; the new cases pin the retry contract, the shared PUSH_IMAGE expression, the issue-job gate, and the client-side dedup.
  4. The dedup query shape was probed against the live API (28 open scope/ci-cd issues fetched, exact-marker match returns empty as expected). Note the lookup deliberately avoids gh issue list --search (GitHub tokenizes the colon out of the marker) and --arg (not supported by gh issue list); it exports the issue list to JSON and matches with jq client-side.
  5. UI verification: N/A — pure CI workflow change, nothing user-visible.

Evidence (Before & After)

N/A — non-user-visible CI change. Before: failed run 32580293377 left 0.22.0 unpublished (recovered manually by rerunning the failed jobs; the tag exists on GHCR now). After: the same failure shape retries once, and if it still fails, one issue per version documents it.

Tested on

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

Environment (optional)

GitHub Actions ubuntu-latest semantics validated statically: actionlint clean, workflow gate test assertions verified with a standalone mirror (the focused vitest run needs the full dependency tree, which a fresh worktree does not have — CI runs the real vitest), and the dedup query validated against the live gh/jq shape. The docker build path itself is only exercised on tag push / publishing dispatch; this PR does not trigger either.

Risk & Scope

  • Main risk or tradeoff: continue-on-error: true on the first build step annotates the run as having a failed step even when the retry succeeds — cosmetic noise in exchange for a correct job conclusion. The issue job posts with the workflow's GITHUB_TOKEN (issues: write), no bot PAT.
  • Not validated / out of scope: the docker build and issue-filing paths cannot be exercised end-to-end from a PR (they need a tag push or a publishing dispatch); a live dry-run of the issue body is out of scope to avoid filing noise. Fallback behavior of sandbox consumers when an image is missing (the CLI-side error message from Sandbox image for 0.22.0 never published: v0.22.0 image build failed (ETXTBSY) and was not retried, breaking sandbox-based CI lanes #9898) is not touched here.
  • Breaking changes / migration notes: none — tag-push and dispatch behavior for successful builds is unchanged; the only new writes are a retried build step and, on double failure, one issue.

Linked Issues

Fixes #9898

中文说明

这个 PR 做了什么

让发布流水线里的沙箱镜像发布环节自愈、可观测:镜像构建增加一次有界重试,可以扛过 buildx 的瞬时失败;如果发布构建仍然失败,新增的 job 会为每个版本创建(或更新)一个 GitHub issue,让"镜像缺失"这件事可见、可处理,而不是静默打断下游自动化。发布条件收敛为一个 job 级共享表达式,登录门槛和两个构建步骤不会再各自漂移;同时扩展了已有的工作流门槛测试,把新契约钉住。

为什么需要

v0.22.0 tag 的镜像构建在 docker build 内部的 npm ci 阶段撞上瞬时 ETXTBSY 失败,之后没有任何重试,导致 ghcr.io/qwenlm/qwen-code:0.22.0 一直不存在,而 npm 上 latest 已经是 0.22.0。所有走沙箱的 CI lane(/resolve、沙箱 review、autofix)都会装 @latest、尝试进入对应的 :0.22.0 沙箱镜像,然后以 manifest unknown 崩溃——例如 PR #9641 上的 /resolve 就是在做任何事之前直接挂掉。这个失败静默了两天,因为没有任何机制上报"发布了 npm 版本但没有对应沙箱镜像"这种状态。详情和 run 链接见 #9898

评审测试计划

如何验证

  1. 看重试对:第一个构建步骤带 continue-on-error: true,重试步骤只以 steps.build-and-push.outcome == 'failure' 为门槛,这样重试成功后 job 能翻绿(如果用 failure() 做门槛,continue-on-error 吸收掉第一次失败后该条件恒为假,重试会被静默跳过)。
  2. node scripts/lint.js --actionlint(或直接 actionlint)对该工作流无告警。
  3. vitest run scripts/tests/build-and-publish-image-workflow.test.js 通过;新增用例钉住了重试契约、共享的 PUSH_IMAGE 表达式、issue job 门槛和客户端去重。
  4. 去重查询的形态已对真实 API 做过探针(拉到 28 个 scope/ci-cd open issue,精确 marker 匹配按预期返回空)。注意该查找刻意避开了 gh issue list --search(GitHub 搜索会把冒号从 marker 里切掉)和 --arggh issue list 不支持);它把 issue 列表导出为 JSON,用 jq 在客户端精确匹配。
  5. UI 验证:N/A —— 纯 CI 工作流改动,无用户可见面。

证据(前后对比)

N/A —— 非用户可见的 CI 改动。改动前:失败 run 32580293377 导致 0.22.0 未发布(后来通过重跑失败 jobs 手动恢复,GHCR 上现在已有该 tag)。改动后:同样的失败形态会先重试一次,如果仍失败,则每个版本建一个 issue 记录。

测试环境

见上方表格:仅 Linux 静态验证(actionlint + 测试断言 + 真实 API 探针)。

环境说明

按 GitHub Actions ubuntu-latest 语义做静态验证:actionlint 干净;工作流门槛测试的断言用独立镜像脚本验证过(聚焦的 vitest 运行需要完整依赖树,新 worktree 里没有——CI 会跑真正的 vitest);去重查询按真实的 gh/jq 形态验证过。docker 构建路径本身只会在 tag push / 发布 dispatch 时触发,本 PR 不会触发这两种事件。

风险与范围

  • 主要风险/权衡:第一个构建步骤的 continue-on-error: true 会让 run 里留下一个"步骤失败"的注解,即使重试成功也是如此——用表面噪音换正确的 job 结论。issue job 用工作流自带的 GITHUB_TOKEN(issues: write)发布,不引入机器人 PAT。
  • 未验证/超出范围:docker 构建和建 issue 路径无法在 PR 里端到端演练(需要 tag push 或发布 dispatch);为避免制造噪音,不在真实仓库演练 issue 正文。Sandbox image for 0.22.0 never published: v0.22.0 image build failed (ETXTBSY) and was not retried, breaking sandbox-based CI lanes #9898 提到的沙箱消费端缺镜像时的报错改进(CLI 侧)不在本 PR 范围。
  • 破坏性变更/迁移说明:无——构建成功时,tag push 和 dispatch 的行为不变;新增的写入只有一次重试构建,以及双重失败时的一个 issue。

关联 Issue

Fixes #9898

…build fails

The v0.22.0 tag build died on a transient ETXTBSY during `npm ci` and was
never retried, so ghcr.io/qwenlm/qwen-code:0.22.0 was never published while
npm already served 0.22.0. Every sandbox-based CI lane (/resolve, sandboxed
review, autofix) then crashes with "manifest unknown" until the image exists.

Add one bounded retry to the buildx step: the first attempt carries
continue-on-error so a successful retry turns the job green, and the retry
gates on the first attempt's outcome alone (a failure() gate would read false
once continue-on-error absorbs the first attempt). The publish condition is
shared through one job-level env so the two build steps cannot drift.

Add a follow-up job that files or updates one issue per version when both
attempts fail — for tag pushes and for publishing dispatches alike, since the
issue body itself recommends that dispatch as the recovery path. Dedup uses
an exact body marker matched client-side, because GitHub search tokenizes the
colon out of the marker and never finds these issues.

Extend the existing workflow gate test to pin the retry contract and the
issue-job gate.

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

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run at the author's request, on the updated head — two commits since the last pass: the round-4 hardening of the failure reporter, and a wording fix on the documented dedup gap.

Template ✓ — all sections present, bilingual summary included.

Problem: observed, well-evidenced. The v0.22.0 incident is documented in #9898 (P1): a transient ETXTBSY killed the image build — run 32580293377 exists and is exactly that v0.22.0 release run — nothing retried it, and every sandbox-based CI lane crashed with manifest unknown for two days before anyone noticed. The PR's two halves (one bounded retry, one deduplicated failure issue per version) map one-to-one onto the two documented harms — no recovery, no visibility.

Direction: aligned. Release-pipeline reliability for a failure mode that demonstrably broke sandboxed CI lanes. Success-path behavior is unchanged; the only new writes are a retried build step and, on double failure, one issue filed with the job-scoped GITHUB_TOKEN under minimal permissions.

Size: not a core-module change — 262 production lines (workflow 94, new .github/scripts/ shell script 162, .mjs cross-reference 4, .size-baseline 2) and 619 test lines. Stage 0 not applicable.

Approach: scope still feels right. The issue-filing logic lives in .github/scripts/image-build-failure-issue.sh, the residual workflow growth is recorded in .size-baseline (4638 → 9256 — matches the file's actual byte size at this head), and the two commits since the last pass are exactly the round-4 review responses: a stricter run-bullet matcher, BSD-safe heading strip, prose fallback re-checked after the strip, and the dedup gap documented accurately (label and marker). No scope creep.

Risk: no high-risk-path matches from the revert-history signal. The file-failure-issue job remains the part to read carefully (new write path, shell logic); permissions are minimal (contents: read + issues: write), gated to the canonical repo and publishing events.

Moving on to code review. 🔍

中文说明

应作者请求重跑,针对更新后的 head —— 距上一轮新增两个 commit:按 review 第四轮加固失败上报脚本,以及修正已记录去重缺口的措辞。

模板 ✓ —— 各部分齐全,含中文总结。

问题:已观测、证据充分。 v0.22.0 事故已记录在 #9898(P1):瞬时 ETXTBSY 导致镜像构建失败——run 32580293377 确实存在且正是那次 v0.22.0 发布 run——没有任何重试,所有走沙箱的 CI lane 以 manifest unknown 崩溃,静默两天才被发现。PR 的两半(一次有界重试、每版本一个去重失败 issue)与两个已记录的损害(无法自愈、不可见)一一对应。

方向:对齐。 发布流水线的可靠性修复,针对的是实际打断过沙箱 CI lane 的失败模式。构建成功时行为不变;新增写入只有一次重试的构建步骤,以及双重失败时一个用 job 级 GITHUB_TOKEN、以最小权限创建的 issue。

规模: 非核心模块改动 —— 262 行生产代码(工作流 94、新增 .github/scripts/ shell 脚本 162、.mjs 交叉引用注释 4、.size-baseline 2)与 619 行测试。Stage 0 不适用。

方案:范围依然合理。 建 issue 的逻辑在 .github/scripts/image-build-failure-issue.sh,工作流剩余增量记入 .size-baseline(4638 → 9256——与本 head 文件实际字节数一致);上一轮之后的两个 commit 正是对 review 第四轮的回应:更严格的运行记录匹配、BSD 兼容的标题剥离、剥离后复查的兜底叙述,以及去重缺口的准确措辞(标签 marker)。无范围蔓延。

风险: 回滚历史信号无高风险路径命中。file-failure-issue job 仍是需要仔细看的部分(新写入路径、shell 逻辑);权限最小化(contents: read + issues: write),且仅限主仓库与发布事件。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-read the full diff at the current head. The design still matches my independent proposal for this incident — one bounded retry, one deduplicated issue per version, publish decision defined once and exported — and the two commits since the last pass are pure round-4 review responses, all of which I verified in the diff:

  • Stricter run-bullet matcher. The awk split now recognizes a recorded run only by the full …/actions/runs/<digits> shape instead of any - bullet, so a hand-written annotation that happens to be bullet-shaped lands in the tail and survives verbatim instead of being reordered into the machine block. Pinned by a new replay case.
  • BSD-safe heading strip (sed '$d' instead of head -n -1), and the prose fallback is re-checked after the strip — the strip can itself empty the head, and the fallback must run again or the narrative (and the dedup marker it carries) would be lost. Both pinned by replay cases.
  • The marker-restore block was removed, correctly. The empty-head fallback re-emits the marker with the prose, and the case it can't cover — a human deleting the marker — makes the edit path unreachable by construction, so it belongs in the documented-gap list, which is where it now lives (the head commit's wording is accurate: dedup needs the label and the marker). The surviving-marker-elsewhere case is pinned by a replay test.
  • Cross-contract comment in both image-build-failure-issue.sh and main-failure-signature.mjs — I checked the referenced splitOccurrenceBlock() / renderIssueBody() exist; the two implementations now point at each other.

The contracts verified in earlier rounds still hold at this head and remain pinned with mutation-killing assertions: continue-on-error on the first attempt only, retry gated on steps.build-and-push.outcome == 'failure' (a failure() gate would be silently skipped), one shared PUSH_IMAGE pinned at the definition site, publish-decision exported before any failable step, and the reporting-job gate (failure() + canonical repo + exported push_image + versionless-dispatch skip). Permissions are minimal, checkout uses persist-credentials: false, timeout bounded at 5 minutes.

One non-blocking note carried over from earlier rounds: the retry step duplicates the first build step's with: block, and the tests pin parity only for the shared push: input — not tags/labels/build-args. Byte-identical today; tracked in the /review thread, right home for it.

Test evidence — the PR's own CI (unattended run; no local execution)

Both pull_request-event workflow runs are green at this head (Qwen Code CI, Security Checks); no pending runs. From the green Test (ubuntu-latest, Node 22.x) job log:

✅ every workflow file is under the 470000-byte gate and within 4096 bytes of its recorded baseline
✓ scripts/tests/build-and-publish-image-workflow.test.js (26 tests) 337ms

The suite grew from 20 to 26 cases with the round-4 hardening and executes green; the size gate passes with the new baseline (I verified the recorded 9256 matches the workflow's actual byte size at this head). actionlint and yamllint ran clean. shellcheck reports non-fatal SC2154/SC2312 warnings on the new script — the same pattern the existing .github/scripts/*.sh carry (env supplied by the workflow); the lint job is green. The Test (macos-latest / windows-latest) checks are skipped by design: they gate on the platform classifier, and this PR touches nothing platform-sensitive — the YAML pins run there when they do, and the replay suite skips itself on Windows by its own config.

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

One row per check name (latest run) at the reviewed commit; failures sort first. / 每个检查名一行(取最新一次运行),失败项排在最前。

What no pre-merge lane can settle, stated plainly: the retry and issue-filing paths only execute on tag push or publishing dispatch — the workflow's on: triggers. Neither @qwen-code /verify nor @qwen-code /tmux drives tag-push workflow runs, so naming a sandboxed lane here would be noise: the first real execution is the next release. The pre-merge signal this kind of change can carry is what's here — pinned gate contracts, the script's behavioral replay under a gh stub (green in CI), actionlint, and the author's live-API probe of the dedup query shape (the author's claim, not independently re-run). The disclosed tradeoff (a failed-step annotation lingers when the retry succeeds) and the two documented residual gaps (pre-first-step failure; human-removed label/marker) are recorded in the workflow itself.

Real-scenario testing: N/A — pure CI workflow change, nothing user-visible (unattended run; no tmux attempted).

中文说明

代码审查:在当前 head 重读完整 diff。方案仍与独立评估一致——一次有界重试、每版本一个去重 issue、发布条件单点定义并导出。上一轮之后的两个 commit 都是 review 第四轮的回应,逐条在 diff 中核实:运行记录匹配收紧为完整 …/actions/runs/<数字> 形态(项目符号形状的手写批注不再被卷进机器块,落入 tail 原样保留,有新回放用例钉住);标题剥离改用 BSD 兼容的 sed '$d',且剥离后复查兜底叙述(剥离本身可能清空 head,兜底必须再跑一次,否则叙述与其中的去重 marker 会丢失,均有回放用例);删除了 marker 恢复块——空 head 兜底会随叙述重新输出 marker,覆盖不到的"人为删除 marker"情形按构造就让编辑路径不可达,归入已记录缺口列表(头 commit 的措辞准确:去重需要标签 marker),marker 存于他处的情形有回放测试钉住;两个实现文件互相加了契约交叉引用注释(已核对 splitOccurrenceBlock() / renderIssueBody() 存在)。早先各轮核实的契约在本 head 依然成立且被杀变异断言钉住:continue-on-error 只在首步、重试门槛为 outcome == 'failure'failure() 门槛会被静默跳过)、PUSH_IMAGE 在定义处钉住、publish-decision 先于一切可失败步骤导出、上报 job 门槛四件套齐全;权限最小、persist-credentials: false、5 分钟超时。非阻断备注延续:重试步骤复制了首步的 with: 块,测试只钉住共享的 push:,未钉 tags/labels/build-args——目前逐字节相同,已在 /review 线程跟踪。

测试证据:无人为运行,全部来自该 PR 自身 CI(API + job 日志)。两条 pull_request 事件工作流(Qwen Code CISecurity Checks)在本 head 全绿,无挂起。绿色 Test (ubuntu-latest, Node 22.x) job 日志:体积门槛通过、build-and-publish-image-workflow.test.js (26 tests) ✓ 337ms。套件随第四轮加固从 20 增至 26 例;新基线 9256 与文件实际字节数逐字节核对一致;actionlint / yamllint 干净;shellcheck 对新脚本只有非致命的 SC2154/SC2312 警告(与现有 .github/scripts/*.sh 同型,环境由工作流注入),lint job 为绿。macOS/Windows 单测按平台分类器设计跳过(本 PR 不涉平台敏感面);回放套件在 Windows 上按其自身配置自跳过、YAML 钉住仍会运行。任何合入前 lane 都无法验证:重试与建 issue 路径只在 tag push / 发布 dispatch 时执行,/verify/tmux 均不能驱动 tag push 工作流——点名沙箱 lane 只会是噪音,首次真实执行是下一次发布。这类改动合入前能承载的信号就是现有这些:钉住的门槛契约、gh stub 下的脚本行为回放(CI 已绿)、actionlint,以及作者对去重查询形态的线上 API 探针(作者自述,未独立复跑)。已披露的权衡(重试成功时留下失败步骤批注)与两个残留缺口(首步前失败;人为删除标签/marker)都写在工作流注释里。真实场景测试:N/A——纯 CI 改动,无用户可见面。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean re-review at the updated head: the round-4 findings are verifiably addressed in the current diff, the follow-up /review round on this exact head found nothing, and CI is green with the hardened 26-case suite actually executing. The one standing non-blocking nit (with: parity pinned only for push:) stays tracked in the /review thread.

Stepping back: this is still the right response to a real incident, now thoroughly hardened. The two commits since the last pass did exactly what the gate wants from review rounds — the run-bullet matcher got strict, the strip got portable, the fallback got re-checked after the strip, and the gap that can't be fixed in code (a human removing the dedup marker) got documented precisely instead of papered over. The approach matches my independent proposal; I didn't find a simpler path it missed, and every change in the diff serves the stated goal. The standing CHANGES_REQUESTED predates these commits — the review round on the current head came back empty, and I verified the round-4 items in the diff myself rather than taking the closeout comment's word for it.

The only thing no pre-merge lane can prove is the tag-push runtime behavior itself; that's inherent to release-pipeline changes. The first real execution is the next release, and the pinned contracts plus the script's behavioral replay are as much pre-merge signal as this kind of change can carry. If I had to maintain this in six months, the comments in that workflow — the continue-on-error rationale, the two documented residual gaps — are the reason I'd thank the author.

Approving, pinned to the reviewed commit.

中文说明

置信度:4/5 —— 更新后 head 的重审干净利落:第四轮提出的各项发现已在当前 diff 中可核实地修复,针对本 head 的后续 /review 一无所获,CI 全绿且加固后的 26 例套件真正执行。唯一延续的非阻断备注(with: 一致性只钉住 push:)继续在 /review 线程跟踪。

整体看:这仍然是对真实事故的正确回应,且已充分加固。上一轮之后的两个 commit 做的正是门槛希望 review 轮次做的事——运行记录匹配收紧、标题剥离可移植、兜底在剥离后复查、代码修不了的缺口(人为删除去重 marker)被精确记录而非粉饰。方案与我的独立评估一致,没有找到更简的路径,diff 中每一处改动都服务于既定目标。现存的 CHANGES_REQUESTED 早于这些 commit——针对当前 head 的 review 轮次空手而归,各项第四轮条目是我在 diff 里亲自核实的,不是采信收尾评论的说法。

唯一任何合入前 lane 都无法证明的是 tag push 时的运行时行为本身;这是发布流水线改动的固有属性。首次真实执行是下一次发布,钉住的契约测试加脚本行为回放已经是这类改动在合入前能承载的全部信号。如果六个月后由我来维护,工作流里的那些注释——continue-on-error 的理由、两个被明确写出的残留缺口——就是我会感谢作者的地方。

批准,锚定在已审查的 commit 上。

Qwen Code · qwen3.8-max

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

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

Requesting changes on one blocking item — see the staged comments above for the full review.

The workflow-size ratchet fails on this PR's own growth: .github/workflows/build-and-publish-image.yml is 9843 bytes against a 4638-byte baseline + 4096-byte allowance, and the Test (ubuntu-latest, Node 22.x) job died at that gate before vitest ran — so the new workflow-gate tests have not actually executed in CI yet. The gate's error names both fixes: move the issue-filing script into .github/scripts/ and trim prose, or update .github/workflows/.size-baseline in this PR with the justification (the vitest mirror reads the same baseline file).

The design and implementation themselves review clean — this is the only blocker.

The workflow-size ratchet rejects growth past the recorded baseline +4096
bytes; the inline issue-filing step grew build-and-publish-image.yml by
~5.2 KB. Move the step body to .github/scripts/image-build-failure-issue.sh
(the gate's own recommended remedy), leaving the job as a thin env + script
call. No behavior change; the gate test now pins the script call and reads
the dedup contract from the script.
@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.4% 85.4% 90.69% 84.41%
Core 88.56% 88.56% 90.26% 87.04%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |    85.4 |    84.41 |   90.69 |    85.4 |                   
 src               |   85.82 |    81.89 |   88.03 |   85.82 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.34 |    78.04 |   80.76 |   73.34 | ...1336-1340,1467 
  ...ractiveCli.ts |   88.26 |    82.64 |   88.88 |   88.26 | ...3135,3141,3207 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |    73.5 |    76.25 |   93.17 |    73.5 |                   
  acpAgent.ts      |   72.37 |    75.94 |   92.27 |   72.37 | ...74,12285,12331 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |     91.3 |     100 |     100 | 73,124            
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.05 |    86.57 |   95.75 |   91.05 |                   
  Session.ts       |    90.4 |    85.32 |   95.13 |    90.4 | ...50,12677-12681 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.16 |    86.36 |     100 |   94.16 | ...43,347,427,431 
  ...y-replayer.ts |   83.41 |    93.22 |   94.11 |   83.41 | ...29-147,265-267 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.02 |    89.69 |   94.44 |   96.02 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.56 |   91.53 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |     77.6 |   94.28 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |    85.04 |   90.69 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.27 |   77.41 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   95.37 |    86.44 |     100 |   95.37 | 203-204,228-233   
 src/commands      |   90.66 |    78.53 |   65.62 |   90.66 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.06 |    88.56 |   90.64 |   89.06 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.83 |    96.35 |     100 |   95.83 | ...03-208,266-269 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.55 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.25 |    84.61 |   83.33 |   90.25 |                   
  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.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.64 |    89.98 |      93 |   91.64 |                   
  agent-prompt.ts  |   94.89 |    92.99 |   97.95 |   94.89 | ...3286,3621-3701 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   73.58 |     90.9 |      75 |   73.58 | 112-116,163-186   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.18 |    89.69 |    90.9 |   92.18 | ...1061,1063-1064 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.06 |    93.57 |   98.52 |   97.06 | ...5745-5789,6064 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |    94.1 |    92.85 |   92.85 |    94.1 | ...80-782,787-789 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |   96.07 |    92.17 |     100 |   96.07 | ...1271,1280-1281 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.49 |    95.66 |     100 |   99.49 | 585,856,912       
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.07 |    87.76 |     100 |   96.07 | ...2256,2356-2372 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1214,1249-1280 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...22,638-692,706 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   83.78 |    78.57 |   88.88 |   83.78 | ...69-783,785-807 
  submit.ts        |   94.11 |    89.38 |   94.44 |   94.11 | ...1673,1701-1738 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |    97.3 |    94.75 |   98.61 |    97.3 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 824-825           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |   93.48 |    93.45 |     100 |   93.48 | ...79-385,583-584 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.47 |     97.2 |    90.9 |   99.47 | 602,820           
  coverage.ts      |   98.97 |    95.11 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.77 |    93.26 |     100 |   98.77 | ...78,301,327-328 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.77 |    93.93 |     100 |   96.77 | 234-235,272-273   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.4 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |     98.1 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  ...boxed-exec.ts |   94.55 |    92.39 |   95.45 |   94.55 | ...91-492,542-543 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.04 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.24 |    90.34 |   95.02 |   94.24 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.54 |    90.29 |   83.78 |   89.54 | ...2497,2499-2507 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.51 |    92.63 |   95.23 |   94.51 | ...24-625,679-680 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.16 |    92.89 |      90 |   91.16 | ...1027,1029-1030 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.82 |     89.2 |   85.18 |   80.82 | ...85-603,610-618 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  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 |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.09 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.18 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.69 |    96.28 |     100 |   99.69 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.24 |    84.45 |    90.8 |   87.24 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 703               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.04 |    80.69 |   76.06 |   84.04 | ...7995,8013-8017 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    89.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   91.16 |    90.45 |   71.42 |   91.16 | ...3012,3042-3043 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...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.6 |     79.8 |     100 |    98.6 | 108,136,179,182   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.55 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |    80.4 |    80.15 |   94.53 |    80.4 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.65 |     77.1 |   93.44 |   75.65 | ...5536,5593-5599 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   90.17 |    85.32 |      95 |   90.17 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.09 |    78.66 |     100 |   89.09 | ...91-292,339-340 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   77.23 |     70.5 |   90.46 |   77.23 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   87.45 |    65.93 |   95.65 |   87.45 | ...1186-1187,1215 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.88 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    83.33 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.09 |     81.2 |   95.28 |   86.09 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.94 |    85.26 |   93.75 |   87.94 | ...1539,1584-1585 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   87.03 |    82.88 |   93.57 |   87.03 | ...6865,6867-6868 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.66 |    90.29 |   97.22 |   92.66 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   91.14 |    89.34 |   97.56 |   91.14 | ...1090,1153-1154 
  ...ion-export.ts |     100 |       95 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.67 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 106               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   70.85 |    77.49 |   72.04 |   70.85 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.09 |       72 |   69.44 |   76.09 | ...4301,4417-4423 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   71.53 |    75.47 |    62.5 |   71.53 | ...11,338,405-410 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.04 |     84.2 |   91.07 |   84.04 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   74.79 |    74.39 |   84.61 |   74.79 | ...89-622,633-634 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.01 |    85.76 |     100 |   86.01 | ...1093,1127-1132 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   73.25 |    80.19 |    77.7 |   73.25 |                   
  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 |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.54 |    87.42 |   85.71 |   90.54 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.96 |    88.66 |   93.75 |   93.96 | ...1070,1115-1117 
 ...ponents/shared |   86.52 |    82.36 |   86.72 |   86.52 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    87.05 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.54 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.01 |    83.88 |   87.81 |   86.01 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |    87.4 |    84.04 |   78.26 |    87.4 | ...5819-5821,5823 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |    72.72 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.95 |    86.03 |   96.09 |   87.95 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.27 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    80.74 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.74 |    92.06 |     100 |   95.74 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...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 |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.41 |    89.68 |   96.39 |   92.41 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.14 |     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       
  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        
  ...y-identity.ts |   87.06 |    81.91 |     100 |   87.06 | ...70-371,378-379 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...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 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  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 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  ...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 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.56 |    87.04 |   90.26 |   88.56 |                   
 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.24 |    84.51 |   94.55 |   90.24 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.64 |       78 |    85.1 |   85.64 | ...1793-1797,1800 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   93.18 |    83.47 |   94.44 |   93.18 | ...90,698,703-710 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.27 |    88.23 |   98.33 |   95.27 | ...1478,1492-1494 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.96 |    68.22 |   78.94 |   76.96 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.91 |     65.2 |   78.57 |   75.91 | ...1888,1894-1895 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.07 |    85.19 |   76.12 |   78.07 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   90.87 |    85.24 |   93.18 |   90.87 | ...83,685,687-688 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.32 |    87.44 |   91.34 |   93.32 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   90.27 |    80.44 |   80.95 |   90.27 | ...2525,2571-2573 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.87 |    90.47 |   91.48 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.77 |    84.16 |      95 |   95.77 | ...88,356,376-379 
  ...ow-sandbox.ts |   97.29 |    88.84 |     100 |   97.29 | ...1835,1841-1842 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   84.25 |    85.18 |   91.03 |   84.25 |                   
  TeamManager.ts   |   77.21 |    83.04 |   83.87 |   77.21 | ...1832,1855-1856 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |   91.71 |    94.44 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   85.58 |    87.79 |   77.53 |   85.58 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.12 |     87.1 |   75.28 |   84.12 | ...8996,9003-9004 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.02 |    93.38 |   89.28 |   96.02 | ...18-719,722-723 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.76 |    88.56 |   93.79 |   92.76 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.7 |    88.26 |   91.11 |    92.7 | ...4351,4449-4450 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...08-509,554-560 
  ...lScheduler.ts |   89.82 |    84.83 |   94.73 |   89.82 | ...6483,6511-6527 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |   95.19 |    90.72 |   96.69 |   95.19 | ...5651,5696-5697 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.89 |    91.66 |      85 |   93.89 | ...1272,1475-1476 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 698-699,768       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.59 |    89.11 |   97.43 |   96.59 |                   
  ...tGenerator.ts |   97.67 |    88.91 |   97.43 |   97.67 | ...1497,1526,1537 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  ...tGenerator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
 ...ntentGenerator |   96.65 |     91.3 |   95.23 |   96.65 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.59 |    90.75 |      95 |   96.59 | ...1299-1300,1328 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.18 |    90.83 |   96.58 |   92.18 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.26 |    89.66 |   96.87 |   91.26 | ...1948,2117-2132 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |   95.36 |    91.52 |     100 |   95.36 | ...1433-1434,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |    97.2 |    91.81 |   98.63 |    97.2 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.23 |    89.79 |     100 |   95.23 | ...49-150,163-164 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  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           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   88.71 |    86.07 |   93.41 |   88.71 |                   
  ...ive-safety.ts |   97.77 |    93.75 |     100 |   97.77 | 100-101           
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.27 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.52 |    83.52 |      83 |   84.52 | ...3139,3177-3178 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |    92.7 |     87.7 |     100 |    92.7 | ...1340-1341,1351 
  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.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.72 |    81.87 |   86.84 |   84.72 |                   
  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   |   76.36 |     70.4 |   58.33 |   76.36 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |      93 |    89.39 |   94.67 |      93 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |    91.17 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |   88.54 |    87.98 |   97.67 |   88.54 | ...1200,1223-1226 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.71 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 215-216           
  goal-reducer.ts  |   95.25 |    92.82 |   97.29 |   95.25 | ...73,552,570-571 
  goal-runtime.ts  |   96.38 |    89.73 |   95.83 |   96.38 | ...1349-1350,1480 
  goal-tools.ts    |   98.38 |    94.17 |   95.83 |   98.38 | ...05-206,307-308 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.35 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   88.97 |    85.08 |   91.31 |   88.97 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.16 |    78.76 |   94.44 |   90.16 | ...06,629,642-648 
  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.51 |    83.16 |   77.77 |   78.51 | ...1487,1500-1502 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.19 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   76.89 |    74.07 |   72.22 |   76.89 | ...47-451,454,460 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.82 |    89.74 |   91.35 |   92.82 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    68.96 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.18 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |    92.74 |     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.78 |    78.34 |   81.25 |   83.78 |                   
  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.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.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.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.61 |    86.29 |   96.73 |   90.61 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.72 |    96.53 |     100 |   97.72 | ...1081,1224-1232 
  ...ingService.ts |   92.43 |    87.77 |   94.73 |   92.43 | ...2843,2858-2859 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.52 |    90.99 |     100 |   95.52 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.66 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.23 |     100 |   98.26 | ...65-866,889-890 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.67 |    80.64 |     100 |   91.67 | ...1062-1063,1091 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.26 |    89.13 |     100 |   96.26 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.83 |    86.41 |   93.13 |   89.83 | ...3510,3524-3544 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...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             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.77 |    86.05 |   94.73 |   89.77 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   86.09 |    85.64 |   86.11 |   86.09 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   88.56 |    89.42 |    98.3 |   88.56 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.51 |    86.52 |   97.43 |   85.51 | ...1583,1660-1661 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.55 |    84.83 |   85.71 |   82.55 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.44 |      75 |   93.95 | ...41,483-484,500 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    95.68 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.39 |    85.83 |   90.09 |   87.39 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   90.64 |     93.1 |      75 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.06 |    80.15 |   85.71 |   82.06 | ...3234,3236-3237 
  mcp-client.ts    |   86.08 |     87.5 |   93.93 |   86.08 | ...2483,2487-2490 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   97.95 |    92.37 |     100 |   97.95 | ...1161,1216-1217 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |   95.79 |    81.35 |     100 |   95.79 | ...10,563,573-577 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.08 |    93.75 |    92.3 |   99.08 | 217-219           
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |      80 |    89.74 |   66.66 |      80 | ...59-265,333-340 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |    86.36 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.35 |    81.52 |   85.71 |   80.35 | ...1017,1025-1026 
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...64-565,581-587 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.06 |    85.71 |   89.47 |   87.06 | ...29-832,869-904 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.49 |    88.65 |   89.56 |   87.49 |                   
  agent.ts         |   86.18 |    87.83 |   87.36 |   86.18 | ...4385,4419-4429 
  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 |                   
 ...tools/workflow |   88.61 |    86.99 |   81.48 |   88.61 |                   
  workflow.ts      |   88.61 |    86.99 |   81.48 |   88.61 | ...51,796,798-799 
 src/utils         |   92.78 |    89.74 |   96.81 |   92.78 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |     100 |    97.14 |      95 |     100 | 79,86             
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  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     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.67 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.22 |    98.01 |     100 |   98.22 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.47 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...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 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  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             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |    57.14 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.82 |    92.48 |     100 |   96.82 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: the executable-script lint — .github/scripts/image-build-failure-issue.sh: shellcheck is not installed.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/build-and-publish-image.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

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

未审查:the executable-script lint — .github/scripts/image-build-failure-issue.sh: shellcheck is not installed。

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

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

Comment thread .github/workflows/build-and-publish-image.yml
Comment thread .github/scripts/image-build-failure-issue.sh
Comment thread .github/workflows/build-and-publish-image.yml Outdated
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread .github/scripts/image-build-failure-issue.sh
Comment thread scripts/tests/build-and-publish-image-workflow.test.js
Comment thread .github/workflows/build-and-publish-image.yml Outdated
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread .github/scripts/image-build-failure-issue.sh
Comment thread scripts/tests/build-and-publish-image-workflow.test.js
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout — round 1 (cap-4, 2 Criticals + 2 Suggestions handled):

  • Critical (file-failure-issue job missing contents: 'read' — default-token checkout would be rejected and the alerting would die at step 1): fixed in adf2482 — permissions now contents: 'read' + issues: 'write', matching every other checkout job in the repo.
  • Critical (dispatch INPUT_VERSION used verbatim while the tag branch strips vversion=v0.22.1 dispatch would miss the existing marker and file a duplicate for an impossible image tag): fixed in adf2482 — version normalized once after resolution (version="${version#v}"); verified across push/dispatch/v-prefixed/rc shapes.
  • Suggestion (failure-issue job gate unpinned): fixed in d511a5a — workflow test now pins failure() && github.repository == 'QwenLM/qwen-code' and needs: ['build-and-push-to-ghcr']; mutation-checked (deleting failure() && fails the suite).
  • Suggestion (retry invariant half-unpinned): fixed in d511a5a — test pins the first build step's id: 'build-and-push' and asserts the retry step carries no continue-on-error; both mutations flip it red.

scripts/tests/build-and-publish-image-workflow.test.js 10/10 (7 baseline + 3 new), bash -n clean, eslint/prettier clean. Push 5324b29..d511a5a (one non-force push). 8 Suggestions remain open by design (cap-4) for a next round; the push auto-triggers re-review.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

Not reviewed: the executable-script lint — .github/scripts/image-build-failure-issue.sh: shellcheck is not installed.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/build-and-publish-image.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .github/workflows/build-and-publish-image.yml:134 — [review] retry step duplicates the build definition without a parity pin; a one-sided edit keeps the gate tests green (deferred — code unchanged since round 1)
  • .github/scripts/image-build-failure-issue.sh:27 — [review] unvalidated dispatch version can poison or bypass the dedup marker — trailing space files permanent duplicates, crafted value hijacks another version's issue (deferred — code unchan…

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

中文说明

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

未审查:the executable-script lint — .github/scripts/image-build-failure-issue.sh: shellcheck is not installed。

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

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

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

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

Comment thread .github/workflows/build-and-publish-image.yml Outdated
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread .github/scripts/image-build-failure-issue.sh
Comment thread scripts/tests/build-and-publish-image-workflow.test.js
Comment thread scripts/tests/build-and-publish-image-workflow.test.js
Comment thread .github/workflows/build-and-publish-image.yml Outdated
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread .github/scripts/image-build-failure-issue.sh

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — the merge_group-only Test (windows-latest, Node 22.x) and Test (macos-latest, Node 22.x) lanes were skipped in CI and run the changed workflow-gate suite; it ran only on the Linux lane and locally (17/17 green), and its Windows-lane behavior is unverified.

Not reviewed: verification and reverse audit — both prompts were built, but no agent was launched with either — the posted findings cannot be counted as verified, and the pass that hunts what the rest of the review missed cannot be certified.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/build-and-publish-image.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • scripts/tests/build-and-publish-image-workflow.test.js:31 — [probe] hand-rolled regex extractions reimplement workflow-helpers getWorkflowJob/getWorkflowStep; lookaheads terminate on comment text, so rewording a comment empties them (deferr…
  • .github/scripts/image-build-failure-issue.sh:22 — [review] version normalization restated in the script and the build job's Process version step with nothing cross-pinning them; a future tag-derivation change desyncs marker from published t…
  • .github/workflows/build-and-publish-image.yml:147 — [probe] retry step with: block parity unpinned; a one-sided future edit publishes from stale configuration on the exact transient-failure path this PR exists for (deferred — code unchanged…
  • .github/scripts/image-build-failure-issue.sh:41 — [probe] dedup check-then-use race: concurrent same-version runs double-file a permanent duplicate; no concurrency: key on the workflow (deferred — code unchanged since round 2)

Convergence: round 3 posted 6 inline comment(s), 3 of them reported for the first time; the previous round posted 8 (0 new). Findings keep coming back to the same files: scripts/tests/build-and-publish-image-workflow.test.js (findings in round 1; 2 more now); .github/workflows/build-and-publish-image.yml (findings in round 1; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

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

[Critical] .github/scripts/image-build-failure-issue.sh:52 SC2016 — Expressions don't expand in single quotes, use double quotes for that. [lint]

[Critical] .github/scripts/image-build-failure-issue.sh:54 SC2016 — Expressions don't expand in single quotes, use double quotes for that. [lint]

[Critical] .github/scripts/image-build-failure-issue.sh:58 SC2016 — Expressions don't expand in single quotes, use double quotes for that. [lint]

中文说明

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

未审查:build-and-test — the merge_group-only Test (windows-latest, Node 22.x) and Test (macos-latest, Node 22.x) lanes were skipped in CI and run the changed workflow-gate suite; it ran only on the Linux lane and locally (17/17 green), and its Windows-lane behavior is unverified。

未审查:验证与反向审计——两份 prompt 都已构建,但都没有 agent 用它们启动——发布的发现不能算作已验证,搜寻评审遗漏问题的工序也无法作证。

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

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

收敛情况:第 3 轮发布了 6 条行内评论,其中 3 条是首次提出;上一轮发布了 8 条(其中 0 条首次提出)。发现反复回到同一批文件:scripts/tests/build-and-publish-image-workflow.test.js(第 1 轮已出过发现,本轮又有 2 条);.github/workflows/build-and-publish-image.yml(第 1 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

[Critical] .github/scripts/image-build-failure-issue.sh:52 SC2016 — Expressions don't expand in single quotes, use double quotes for that. [lint]

[Critical] .github/scripts/image-build-failure-issue.sh:54 SC2016 — Expressions don't expand in single quotes, use double quotes for that. [lint]

[Critical] .github/scripts/image-build-failure-issue.sh:58 SC2016 — Expressions don't expand in single quotes, use double quotes for that. [lint]

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

Comment thread scripts/tests/build-and-publish-image-workflow.test.js
Comment thread scripts/tests/build-and-publish-image-workflow.test.js
Comment thread .github/workflows/build-and-publish-image.yml
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread .github/workflows/build-and-publish-image.yml
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout pass on the 10 unresolved bot suggestions — 9 handled, 1 deferred. Pushed 3e4152ab9..a9c36234b (single non-force push).

Handled

  • R1-4 misattribution (3 duplicate threads) — 3cf4347: title/body no longer assert an image-build/buildx failure ("release build job failed"; Fix line points at the run's actual failing step; buildx race listed only as one transient-failure example). Workflow job comment reworded to match the whole-job gate.
  • R1-10 body-clobbering (3 duplicate threads) — 154b9a7: update path re-plans against the existing body like main-ci-failure-issue.yml — hand-written annotations survive verbatim, recorded runs accumulate (deduped, newest first, capped), marker restored if edited away. Behavioral tests extended (annotation/run survival, no double-record).
  • Test pins (2 threads) — a9c3623: create-line-scoped --label scope/ci-cd assertion and --state open assertion; both mutants (label deletion, --state all) verified failing locally.
  • R1-9 recovery success path — evidence-closed: tracked in Close the image-build failure issue when a recovery publish succeeds #9960 (verified OPEN), out of scope for this PR.

Deferred (next round)

  • Pre-first-step failure gate thread — untouched, as planned.

Verification: scripts/tests/build-and-publish-image-workflow.test.js 20/20 (vitest), bash -n on the shell script, both mutants killed. No whole-repo test run.

A build job that fails before its first step runs (runner provisioning
failure) never executes publish-decision, so push_image stays empty and
file-failure-issue is skipped despite failure() being true. Closing the
gap structurally would restate the publish predicate and re-introduce
the drift this PR removes, so document it on the job comment instead:
future "failed publish, no issue filed" investigations start here, and
a scheduled npm-vs-GHCR reconciliation remains the backstop.
…kflow size baseline

The retry logic and failure-issue filing steps added by this PR grew the
workflow from 4638 to 8887 bytes, past the 4096-byte allowance. Record
the new size so the size gate passes.
@yiliang114

Copy link
Copy Markdown
Collaborator Author

CI failed at the "Check workflow file size" gate: build-and-publish-image.yml grew to 8887 bytes, 4249 over its recorded baseline of 4638 (allowance 4096).

The growth is from this PR's own retry logic and failure-issue filing steps, so I recorded the new size in .github/workflows/.size-baseline (8887) in f1f42e8.

Local run of .github/scripts/check-workflow-size.sh exits 0. Same baseline-update pattern as #8583 / #9747 / #9822.

# Conflicts:
#	.github/workflows/.size-baseline
@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 276 passed · 0 failed · 276 total

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

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

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

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

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

Verification report

PR #9916fix(ci): retry sandbox image builds and file an issue when a release build fails

Verdict: merge-ready — 276/276 scripted assertions passed, 0 unexpected failures. Verified head 23078f8e9d64f21e5c10905b1f9ab13fbd9fc24f (merge base 8be07151f6). Harnesses, raw logs, and captures live in tmp/pr9916-verify-20260825-045843/.

中文摘要

结论:merge-ready(276/276 脚本断言全部通过,0 个意外失败)。

  • A/B 结论:用独立的 GitHub Actions 语义模型(表达式从 YAML 逐字解析,编码 continue-on-error/outcome vs conclusion/显式 if 覆盖默认 success() 等文档化语义)跑了 10 个场景 × 4 个检查:HEAD 44/44 全过,包括"重试成功翻绿、双失败建 issue、无版本 dispatch 跳过、fork 跳过、runner 级失败的空输出缺口按注释所述表现"。三个单点对照各复现了它所移除的危险(02-controls-reproduce-the-broken-behavior.png):failure() 门槛在双失败时静默翻绿(正是 Sandbox image for 0.22.0 never published: v0.22.0 image build failed (ETXTBSY) and was not retried, breaking sandbox-based CI lanes #9898 的形状)、去掉 continue-on-error 会在重试已发布镜像时误报 issue、在 issue 门槛里复述发布谓词会漏报 dispatch 失败——三处设计均为承重件。
  • 脚本行为image-build-failure-issue.sh 在真实 bash + 真实 jq 下、用编码了 gh 真实过滤语义(state 默认 open、label 过滤、limit)的 stub 重放 18 个场景,77/77(03-script-replay-real-bash-real-jq.png):去重、create/edit、v 前缀归一、10 条上限、注释保留、无版本硬失败、null body 响亮失败、恶意 dispatch 输入无注入。
  • 测试非空转:16 个单点突变对 PR 自己的 vitest 套件,15/16 被杀(04-mutation-matrix-15-of-16-killed.png);唯一存活者 max_runs=10→3 是覆盖缺口(行为正确,PR 套件没钉上限值,独立重放钉了),非合并条件。
  • Findings:均为低严重度——① 人工删掉 occurrences 标记行但留下旧 bullet 时,重建块会输出第二个 ## Failed runs 标题(数据不丢,已给出并度量过最小修复);② max_runs 无测试钉住;③ 新脚本在仓库 shellcheck 门槛下新增 14 条 advisory(与兄弟脚本同惯例,且该门槛因既有管道吞退出码而从不失败)。
  • 未覆盖:docker 构建/真实建 issue 的端到端(需要 tag push/publish dispatch,沙箱无 token);14 个 commit 中 13 个在 depth-2 checkout 不可达,只验证了聚合 diff;yamllint 无法在容器内安装(无 root/pip),YAML 结构由 yaml 解析 + actionlint 证明;label 存在性仅有仓库内分类法证据 + 作者的活体探针声明。

Central claim and A/B proof

Central claim: a failed release image build retries once, and a still-failed publishing run files/updates exactly one issue per version — deduplicated client-side by an exact body marker, preserving human annotations, without false positives on successful publishes or non-publishing runs.

The A/B is a semantics A/B: an independent model (semantics-simulator.mjs) parses the real workflow YAML with the repo's yaml package, evaluates the gate expressions verbatim with a small recursive-descent Actions-expression evaluator, and encodes the documented semantics (explicit if: overrides the default success(); continue-on-error flips conclusion not outcome; job conclusion from step conclusions; failure() is conclusion-based at both scopes; job outputs reach dependent jobs even when the producing job failed; missing inputs compare as ''). The assumptions are listed in the harness header (E1–E8); actionlint independently type-checked the step references (see static gates). Because every arm runs through the same model, a model error would have to hit the arms asymmetrically to flip a verdict, and the three control deltas follow directly from E1/E2.

arm change vs HEAD S1 first fails, retry succeeds S2 both fail result
HEAD job green, retry ran, no issue (correct: image published) job red, retry ran, issue filed 44/44, 01-semantics-ab-head-10-scenarios.png
C1 retry gate failure() job green, retry skipped, no issue — silent non-publish, the #9898 shape job green, no issue — double failure invisible broken as predicted, 16/16
C2 no continue-on-error job red and issue filed although the retry published the image same as HEAD broken as predicted, 16/16
C3 issue gate restates startsWith(ref,'refs/tags/v') S4 dispatch publish failure: no issue filed (drift loss); S2 tag push still files broken as predicted, 16/16

(02-controls-reproduce-the-broken-behavior.png.) All ten HEAD scenarios passed their intent, including: versionless publishing dispatch skipped by design (S5), non-publishing dispatch skipped (S6), checkout/login failure on a publishing run still files (S7/S10), fork guarded (S9), and the documented pre-first-step gap behaving exactly as the workflow comment says — push_image stays empty and the gate skips despite failure() (S8). The four PUSH_IMAGE expansion checks agree with the login gate in every event shape.

Script replay (mock-free, real bash + real jq)

script-replay.mjs runs the shipped script under bash --noprofile --norc with the workflow step's exact env contract; only gh is stubbed, and the stub encodes real gh semantics (open-by-default state filter, --label filter, --limit, per-issue body store, argv recording) — so --state open and the create-time label are behaviorally observable, not text-pinned. 77/77 (03-script-replay-real-bash-real-jq.png): create with both labels and exact title/marker/body; dedup on open+labeled marker issues; recurrence newest-first with previous runs and head/tail annotations preserved; pre-block bodies upgraded; moved-marker bodies still dedup; same-run repeat not duplicated; 10-run cap drops the three oldest; v-prefix tag push and typed-v dispatch normalize to the same marker; no version → ::error:: exit 1 with zero writes; closed or unlabeled marker issue → fresh create; null body → loud jq failure, no writes; hostile dispatch input ($(…), backticks) interpolated literally with no command execution.

Mutation matrix on the PR's own suite

16 single-point mutants, each run against scripts/tests/build-and-publish-image-workflow.test.js in a scratch dir; unmutated control 20/20 green first. 15/16 killed (04-mutation-matrix-15-of-16-killed.png). Positive controls: M12 (.body.title, the escape the PR comment cites) killed by 5 red tests; M13 (marker loses :${version}) by 6.

mutant verdict mutant verdict
M1 retry gate → failure() killed M11 --state openall killed
M2 drop continue-on-error killed M12 .body.title killed (5)
M3 rename build step id killed M13 marker w/o version killed (6)
M4 continue-on-error on retry killed M14 create w/o dedup label killed
M5 PUSH_IMAGE${{ false }} killed M15 oldest-first order killed
M6 gate restates predicate killed M16 max_runs=103 survived
M7 drop versionless-skip killed M17 drop occurrences marker killed
M8 drop repo guard killed
M9 drop needs: killed

M16 classification: coverage gap (behavior is correct; nothing in the PR's suite asserts the cap; my replay R10 pins it against the real script). Completeness reporting, not a merge condition.

Size gate and static gates

  • Recorded baseline 8887 == shipped wc -c 8887 (the "generator" re-run). Gate at HEAD with WORKFLOW_SIZE_BASE_SHA=HEAD^1: green, exit 0. Planted +5000 B growth → ::error:: … grew to 13887 … (allowance 4096), exit 1; new workflow without an entry → ::error:: … has no entry, exit 1 (05-size-gate-live-proof.png). Official vitest mirror: workflow-size.test.js 195/195.
  • actionlint (repo flags, pinned 1.7.12): clean at HEAD; planted steps.does-not-exist.outcome caught, exit 1 — and its error text independently enumerates the valid step object, corroborating the retry gate's steps.build-and-push.outcome reference. shellcheck (pinned 0.11.0, repo flags): 14 advisory findings on the new script (7× SC2154 env refs, 3× SC2016 printf-format, 4× SC2312) — same convention as sibling upsert-deferred-issue.sh (9 SC2154), and the gate is advisory anyway (see Findings). bash -n clean; planted syntax errors exit 2 (06-static-gates-live.png). Official in-tree run of both gate suites: 215/215.

Findings

  1. Low — stranded-heading duplication on human-mutilated bodies. If a human deletes the &lt;!\-\- image-build-failure-occurrences --> line but leaves the old run bullets, the rebuilt body carries two ## Failed runs headings (the strip only fires when the heading is the last head line). Repro: replay R7 fixture; data and dedup are preserved. Measured fix in mutants/fix-r7/ (replace the tail-check with printf '%s\n' "$(grep -vxF -- "${runs_heading}" "${head_file}")" > "${head_file}"): R7 heading 2→1, all 77 replay assertions pass, normal-recurrence body byte-identical (zero collateral), PR suite 20/20 green on both sides — i.e. the suite pins nothing along this axis; the R7 fixture is the pin a fix should ship with. Optional polish; not blocking.
  2. Completeness — max_runs=10 unpinned by the PR's suite (M16 survivor). My replay pins it; suggest the fixture if the author wants it in-tree.
  3. Nit — 14 new advisory shellcheck findings on the new script under the repo's gate command. Matches sibling convention; no CI impact.
  4. Pre-existing (not this PR) — the shellcheck gate can never fail: scripts/lint.js --shellcheck pipes through a trailing sed, whose exit 0 masks shellcheck's. Observed at HEAD with thousands of pre-existing warnings. The PR's additions ride on this advisory gate.
  5. Pre-existing (not this PR) — expression-injection surface in the untouched Process version step (INPUT_VERSION="${{ github.event.inputs.version }}" inlined into a run block). Requires write access to dispatch; unchanged by this PR; the PR's own env-var plumbing for the same input is injection-safe.

Not covered

  • Docker build/push and live issue filing end-to-end (need a tag push or publishing dispatch; no token in this sandbox). The replay reproduces the script's mechanism and wire shapes, not the live gh API; the semantics A/B models documented Actions behavior, not live Actions.
  • Per-commit attribution: 13 of the PR's 14 commits are unreachable at the depth-2 checkout; the aggregate HEAD^1..HEAD diff was verified instead.
  • yamllint could not be installed (no root, no pip); YAML well-formedness is proven by the yaml parse the simulator requires plus actionlint's parse.
  • Label existence (scope/ci-cd, type/bug) cannot be checked from inside the sandbox; local evidence: the repo's release-notes tooling uses the scope/* taxonomy and the author's stated live probe (28 open labeled issues). If a label were missing, gh issue create --label fails loud — the job goes red on a run whose build already failed, so the failure mode is visible.
  • The pre-first-step gap (runner provisioning failure files no issue) is verified to behave exactly as the workflow comment documents; closing it structurally would restate the predicate the PR consolidates — the author's documented tradeoff, with the scheduled reconciliation backstop named.

Methodology

Environment: the CI verify container (node 22, bookworm), tree at refs/pull/9916/merge, built at HEAD before the round. semantics-simulator.mjs drives the parsed YAML's expressions through a scenario matrix (head + three one-change controls); script-replay.mjs spawns the shipped script under the step's env contract with a semantics-encoding gh stub and real jq 1.6; mutation-matrix.mjs runs the PR's vitest suite per single-point mutant in scratch dirs; size/static gates run the repo's own scripts and pinned linters with planted-violation live proofs. Raw logs in logs/, harnesses and mutants in the artifact dir, captures in evidence/.

Flakiness gate log

rounds=5 files=1 skipped=0
file scripts/tests/build-and-publish-image-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/build-and-publish-image-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  scripts/tests/build-and-publish-image-workflow.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 2 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 3 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 4 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 5 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)

Evidence images

01-semantics-ab-head-10-scenarios

02-controls-reproduce-the-broken-behavior

03-script-replay-real-bash-real-jq

04-mutation-matrix-15-of-16-killed

05-size-gate-live-proof

06-static-gates-live

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: the executable-script lint — .github/scripts/image-build-failure-issue.sh: shellcheck is not installed.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/build-and-publish-image.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • scripts/tests/build-and-publish-image-workflow.test.js:40 — [probe] hand-rolled extraction regexes re-implement workflow-helpers getWorkflowJob/getWorkflowStep; rewording a terminator comment empties the extraction
  • .github/workflows/build-and-publish-image.yml:194 — [probe] workflow→script env wiring (EVENT_NAME/TAG_NAME/INPUT_VERSION/RUN_URL) pinned by no test; mutants stay green
  • .github/workflows/build-and-publish-image.yml:184 — [probe] file-failure-issue permissions block pinned by no test; deleting issues:'write' leaves the full suite green and the alert dead on first use

Convergence: round 4 posted 13 inline comment(s), 12 of them reported for the first time; the previous round posted 6 (3 new). Findings keep coming back to the same files: .github/scripts/image-build-failure-issue.sh (findings in round 1; 10 more now); scripts/tests/build-and-publish-image-workflow.test.js (findings in round 3; 2 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. (Observation only — nothing was withheld from this review because of this observation.)

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

中文说明

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

未审查:the executable-script lint — .github/scripts/image-build-failure-issue.sh: shellcheck is not installed。

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

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

收敛情况:第 4 轮发布了 13 条行内评论,其中 12 条是首次提出;上一轮发布了 6 条(其中 3 条首次提出)。发现反复回到同一批文件:.github/scripts/image-build-failure-issue.sh(第 1 轮已出过发现,本轮又有 10 条);scripts/tests/build-and-publish-image-workflow.test.js(第 3 轮已出过发现,本轮又有 2 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。(仅为观察——本轮评审未因此扣留任何内容。)

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

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

Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread scripts/tests/build-and-publish-image-workflow.test.js Outdated
Comment thread .github/scripts/image-build-failure-issue.sh
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread .github/scripts/image-build-failure-issue.sh
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
Comment thread scripts/tests/build-and-publish-image-workflow.test.js
Comment thread .github/scripts/image-build-failure-issue.sh
Comment thread .github/workflows/build-and-publish-image.yml
Comment thread .github/scripts/image-build-failure-issue.sh Outdated
@yiliang114 yiliang114 added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 25, 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 25, 2026

Copy link
Copy Markdown
Collaborator

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

中文说明

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

…9916)

- Replace GNU-only `head -n -1` with POSIX `sed '$d'` so the stranded-heading
  strip no longer corrupts the body on BSD userland (R4-1).
- Skip the bash replay suite on win32, where backslash RUNNER_TEMP and the
  ';'-separated PATH cannot express it; the YAML pins still run there (R4-2).
- Re-check head readability AFTER the normalization strip, which can itself
  empty the head and used to drop the narrative permanently (R4-8).
- Admit only recorded-run shapes into the machine block so a bullet-shaped
  human annotation is no longer reordered into it or clipped by the cap (R4-13).
- Remove the marker-restore branch: with the run shape pinned, every body that
  matched the dedup carries its marker in head+tail, so it was unreachable (R4-9).
- Cross-reference the sibling split/merge contract in both implementations (R4-5),
  disable SC2016 with rationale on the literal-backtick formats (R4-6), and
  document the label-removal residual gap on the job (R4-11).
- Behavioral witnesses: run-cap, stranded-heading, marker-survival, empty-head
  and empty-after-strip prose fallbacks, and the annotation shape; each guard
  mutation-probed red. Pin the dedup label on the list call too (R4-10).
@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 5 closeout — all 13 actionable round-4 findings handled in 95d3e23171

One additive commit on the PR head: fix(ci): harden the image-build failure reporter per review round 4 (#9916). 5 files, +245/−23.

Critical findings

  • R4-1 — GNU-only head -n -1 in the stranded-heading strip (BSD userland corruption): fixed. The strip now uses POSIX sed '$d', byte-identical output on GNU (diff probe: sed '$d' == head -n -1; a one-line file yields empty in both). The script no longer contains any negative-count head. Witnessed by the new stranded-heading and narrative-restore fixtures.
  • R4-2 — Windows lane runs the incompatible bash replay suite: fixed. The replay suite now skips when process.platform === 'win32' (a replayable capability const next to the jq probe), while the YAML text-pin suite above it still runs on Windows. Probe: forcing the const false skips exactly the 13 replay tests with the 13 YAML tests green.

Suggestions implemented

  • R4-3 (run cap unpinned): new fixture — 10 existing runs (newest-first, as the block is maintained) plus a new run; asserts exactly 10 bullets remain, the oldest is dropped, newest-first order holds. Probe: deleting && ++n <= max turns it red.
  • R4-4 (manual-edit recovery branches unwitnessed): two new fixtures — (a) head ending on a stranded ## Failed runs with the occurrences marker edited away asserts exactly one heading survives; (b) a marker that survives only outside the head prose asserts the rebuilt body still carries it. Probe: deleting the heading strip turns (a) red.
  • R4-5 (second merge-contract implementation): cross-reference comments added in BOTH files — the script now names splitOccurrenceBlock()/renderIssueBody() in .github/scripts/ci/main-failure-signature.mjs, and that file now names the bash/awk re-implementation, each saying a fix to one must reach the other.
  • R4-6 (SC2016 advisory noise): # shellcheck disable=SC2016 with a one-line rationale (literal markdown backticks, not command substitution) above write_prose(), matching the repo's established convention. shellcheck is not installed on this runner, so the warning drop is asserted from the directive, not measured.
  • R4-7 (empty-head fallback unwitnessed): new fixture — a body starting directly at the occurrences marker with the pre-existing marker below the block; asserts the full generated prose is restored (prose + marker presence, not marker count, per the finding's note).
  • R4-8 (head that normalizes to nothing loses the narrative — reproduced): fixed. The readability re-check now runs AFTER the trailing-blank/stranded-heading strip (the strip can itself empty the head), so the prose fallback fires for both the initially-empty and the emptied-by-normalization cases. The if/else flattened into one path. Probe: removing the re-check turns the new fixture red; both narrative fixtures also fail against the PRE-round script (defect witnesses for the gate).
  • R4-9 (marker-restore branch serves an unreachable state): resolved by REMOVING the branch. With R4-13's recorded-run shape pinned, every body that matched the dedup carries its marker on a head or tail line (run lines are bare URLs that cannot carry it), and the tail is re-emitted into the head before the old grep — the branch could never fire. The new marker-survival fixture (R4-4b) pins the invariant the branch claimed to serve; removing dead code instead of correcting its comment follows this round's subtract-first posture.
  • R4-10 (list-side dedup label unpinned): added issue list --repo QwenLM/qwen-code --state open --label scope/ci-cd assertion in the recurrence test. Probe: removing --label "${DEDUP_LABEL}" from the list call turns it red.
  • R4-11 (label-removal orphans the tracked issue): documented as the second known residual gap in the file-failure-issue job comment, alongside the runner-provisioning one — the option the finding sanctions (a fallback lookup was the alternative; the edit path is unreachable without the label, as the finding's own probe established). The workflow's size baseline was re-recorded in the same commit for the comment's bytes (8887 → 9227).
  • R4-13 (any - line admitted as a recorded run — reproduced): fixed. The runs state now admits only lines matching ^- https://<repo>/actions/runs/<digits>$ (the exact shape the script writes); anything else below the marker lands in the tail and is preserved verbatim. Disclosed trade-off accepted: machine runs written BELOW a human bullet accumulate uncapped above the block. Probe: reverting to /^- / turns the new annotation fixture red; the fixture also fails against the PRE-round script (defect witness for the gate).

Review-body items

  • rv:5006987367 (workflow-size ratchet blocking): verified RESOLVED at the current head — the review describes the first commit (9843 bytes, logic inline). Both fixes it names already landed: 5324b296e4 moved the logic into .github/scripts/, and f1f42e86aa recorded the baseline. Gate re-verified this round: .github/scripts/check-workflow-size.sh exits 0 both strict and with WORKFLOW_SIZE_BASE_SHA=<merge base>, and the vitest mirror passes 195/195.
  • R1-9 re-post (rc:3850497879, success path): NOT implemented — deliberately deferred to follow-up issue Close the image-build failure issue when a recovery publish succeeds #9960 (verified OPEN by the previous round); a success-path job expands this PR beyond failure reporting. Replied on the thread; it stays open.

Verification

  • npx vitest run --config scripts/tests/vitest.config.ts scripts/tests/build-and-publish-image-workflow.test.js — 26/26 passed (20 pre-existing + 6 new; re-run post-commit)
  • npx vitest run --config scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js — 195/195 passed
  • npx vitest run --config scripts/tests/vitest.config.ts scripts/tests/main-ci-failure-issue-workflow.test.js — 8/8 passed (mjs cross-reference comment touched)
  • .github/scripts/check-workflow-size.sh — exit 0 (strict) and exit 0 with WORKFLOW_SIZE_BASE_SHA=<merge base> (the CI shape)
  • bash -n .github/scripts/image-build-failure-issue.sh — clean
  • npm run build — exit 0
  • npm run typecheck — exit 0
  • npm run lint — exit 0
  • npx prettier --check on the touched test file — clean (repo config; the workflow YAML fails the same check at HEAD too — pre-existing, untouched convention)
  • shellcheck/actionlint — not installed on this runner; the SC2016 directive follows the repo convention, actionlint covers no changed construct
  • Mutation probes (each: mutate → suite red on the intended witness → restore → green): P1 heading-strip removal, P2 post-strip re-check removal, P3 prose fallback neutered (2 witnesses), P4 any-bullet regression, P5 cap-expression removal, P6 list-label removal, P7 forced skip (13 replay tests skip, 13 YAML tests run)
  • Defect-claim gate: the R4-8 and R4-13 witness tests FAIL against the pre-round script (2 failures) and pass at this commit
中文说明

第 5 轮收尾 —— 第 4 轮全部 13 条可执行发现已在 95d3e23171 中处理

在 PR head 上追加了一个提交:fix(ci): harden the image-build failure reporter per review round 4 (#9916)。5 个文件,+245/−23。

Critical 发现

  • R4-1 —— 孤立标题清理中的 GNU 专有 head -n -1(BSD 用户态下破坏正文):已修复。清理改用 POSIX 的 sed '$d',在 GNU 上输出字节级一致(diff 探针:sed '$d'head -n -1 相同;单行文件两者都输出空)。脚本中不再包含任何负数行数的 head。由新增的孤立标题与叙述恢复用例见证。
  • R4-2 —— Windows lane 会运行不兼容的 bash 回放套件:已修复。回放套件现在在 process.platform === 'win32' 时跳过(在 jq 探测旁新增了 replayable 能力常量),而上方的 YAML 文本断言套件仍在 Windows 上运行。探针:把该常量强制为 false 时,恰好 13 个回放测试被跳过、13 个 YAML 测试保持绿色。

已实现的建议

  • R4-3(运行上限无用例钉住):新增用例——10 条已有 run(按区块维护的最新在前顺序)加一条新 run;断言恰好保留 10 条、最旧一条被丢弃、最新在前顺序成立。探针:删除 && ++n <= max 后该用例变红。
  • R4-4(人工编辑恢复分支无见证):新增两个用例——(a) occurrences marker 被编辑删除后头部以孤立 ## Failed runs 结尾,断言恰好一个标题存活;(b) marker 仅存在于头部叙述之外,断言重建后的正文仍携带它。探针:删除标题清理块会使 (a) 变红。
  • R4-5(第二份合并契约实现):两个文件互相添加了交叉引用注释——脚本现在点名 .github/scripts/ci/main-failure-signature.mjs 中的 splitOccurrenceBlock()/renderIssueBody(),该文件也点名 bash/awk 再实现,双方都注明修复一处必须同步另一处。
  • R4-6(SC2016 咨询性噪音):在 write_prose() 上方添加带一行理由的 # shellcheck disable=SC2016(字面 markdown 反引号,不是命令替换),与仓库既定约定一致。本 runner 未安装 shellcheck,因此警告减少是指令推断而非实测。
  • R4-7(空头部兜底无见证):新增用例——正文直接以 occurrences marker 开头、既有 marker 位于区块下方;断言完整生成的叙述被恢复(按发现说明断言"叙述存在 + marker 存在",不断言 marker 数量)。
  • R4-8(归一化后变空的头部丢失叙述——已复现):已修复。可读性复查现在在"去空行/孤立标题"清理之后执行(清理本身可能把头部清空),因此头部初始为空和被归一化清空两种情况都会触发叙述兜底。原 if/else 压平成一条路径。探针:移除复查使新用例变红;两个叙述用例在"第 4 轮之前"的脚本上也失败(作为门禁的缺陷见证)。
  • R4-9(marker 恢复分支服务于不可达状态):通过删除该分支解决。在 R4-13 钉住记录 run 的形状后,任何匹配去重的正文其 marker 必然位于头部或尾部行上(run 行是不含空格的裸 URL,不可能携带 marker),而尾部在旧的 grep 之前就已并入头部——该分支永不可能触发。新的 marker 存活用例(R4-4b)钉住了该分支声称维护的不变量;删除死代码而非修正其注释,符合本轮"优先做减法"的姿态。
  • R4-10(list 侧去重标签未钉住):在复发测试中新增 issue list --repo QwenLM/qwen-code --state open --label scope/ci-cd 断言。探针:从 list 调用删除 --label "${DEDUP_LABEL}" 后变红。
  • R4-11(移除标签会使被跟踪 issue 成为孤儿):在 file-failure-issue job 注释中记录为第二个已知残留缺口,与 runner-provisioning 缺口并列——这是发现明确认可的选项(另一个选项是兜底查找;但没有标签就到不了 edit 路径,发现的探针已证实)。该注释增加的字节数已在同一提交中重新记录工作流大小基线(8887 → 9227)。
  • R4-13(任何 - 行都被当作记录 run——已复现):已修复。runs 状态现在只接受匹配 ^- https://<repo>/actions/runs/<digits>$ 的行(即脚本自己写出的精确形状);marker 下方的其他任何内容都落入 tail 并逐字保留。已接受的已披露权衡:写在人工列表项下方的机器 run 将不受上限约束地累积在区块上方。探针:回退到 /^- / 使新的批注用例变红;该用例在第 4 轮之前的脚本上也失败(作为门禁的缺陷见证)。

评审主体发现

  • rv:5006987367(工作流大小棘轮阻断):已核实当前 head 上已解决——该评审描述的是第一个提交(9843 字节、逻辑内联)。它点名的两个修复均已落地:5324b296e4 把逻辑移入 .github/scripts/f1f42e86aa 记录了基线。本轮重新验证门禁:.github/scripts/check-workflow-size.sh 在严格模式和 WORKFLOW_SIZE_BASE_SHA=<merge base>(CI 形态)下均退出码 0,vitest 镜像 195/195 通过。
  • R1-9 重发(rc:3850497879,成功路径):未实现——刻意推迟到后续 issue Close the image-build failure issue when a recovery publish succeeds #9960(上一轮已核实 OPEN);成功路径 job 会使本 PR 超出失败上报的范围。已在该线程回复,线程保持 open。

验证

  • npx vitest run --config scripts/tests/vitest.config.ts scripts/tests/build-and-publish-image-workflow.test.js —— 26/26 通过(20 个既有 + 6 个新增;提交后复跑)
  • npx vitest run --config scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js —— 195/195 通过
  • npx vitest run --config scripts/tests/vitest.config.ts scripts/tests/main-ci-failure-issue-workflow.test.js —— 8/8 通过(mjs 交叉引用注释涉及该文件)
  • .github/scripts/check-workflow-size.sh —— 退出码 0(严格模式),以及 WORKFLOW_SIZE_BASE_SHA=<merge base>(CI 形态)下退出码 0
  • bash -n .github/scripts/image-build-failure-issue.sh —— 干净
  • npm run build —— 退出码 0
  • npm run typecheck —— 退出码 0
  • npm run lint —— 退出码 0
  • 对改动的测试文件执行 npx prettier --check —— 干净(仓库配置;工作流 YAML 在 HEAD 上同样不过该检查——既有状态,约定未动)
  • shellcheck/actionlint —— 本 runner 未安装;SC2016 指令遵循仓库约定,actionlint 不覆盖本次改动的任何构造
  • 变异探针(每项:变异 → 套件在目标见证上变红 → 恢复 → 变绿):P1 删除标题清理、P2 删除清理后复查、P3 禁用叙述兜底(2 个见证)、P4 任意列表项回退、P5 删除上限表达式、P6 删除 list 标签、P7 强制跳过(13 个回放测试跳过、13 个 YAML 测试运行)
  • 缺陷声明门禁:R4-8 与 R4-13 的见证测试在第 4 轮之前的脚本上失败(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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI (merge_group-only lanes) and the changed workflow-gate suite ran only on the Linux lane and locally; Windows/macOS lane behavior is unverified.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/build-and-publish-image.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .github/workflows/build-and-publish-image.yml:147 — [probe] retry step with: parameters (context/platforms/tags/labels/build-args) pinned by no test; a one-sided edit publishes a silently different image on the transient-failure path (defer…
中文说明

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

未审查:build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI (merge_group-only lanes) and the changed workflow-gate suite ran only on the Linux lane and locally; Windows/macOS lane behavior is unverified。

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

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round 5 — no action required

This round's feedback contains no actionable items:

  • No new findings. The round-5 automated review posted zero findings (ledger: fresh: 0, posted: 0, reviewed at the current head 95d3e23).
  • No inline comments, issue-level comments, failed checks, or persisting red checks.
  • The single review entry (rv:5017573925) is a partial-review disclosure, not a change request:
    • The macOS/Windows test lanes were skipped in CI (merge_group-only lanes); the changed workflow-gate suite ran on the Linux lane and locally.
    • The embedded-shell actionlint pass for build-and-publish-image.yml is unsupported by the tooling (explicitly noted as not a blocker).
    • One probe-level gap (retry-step with: parameters pinned by no test) was explicitly deferred under the convergence posture (round 5) — "recorded, not requested in this round" by the reviewer, so it is an audit record, not work for this round.

No code changes were made this round. The branch remains at 95d3e23171 ("fix(ci): harden the image-build failure reporter per review round 4 (#9916)").

中文说明

Autofix 第 5 轮 —— 无需处理

本轮反馈中没有任何可处理的事项:

  • 没有新发现。 第 5 轮自动审查未提出任何发现(账目:fresh: 0, posted: 0,审查对象为当前 HEAD 95d3e23)。
  • 没有行内评论、issue 级评论、失败检查或持续未通过的检查。
  • 唯一的一条评审记录(rv:5017573925)是部分审查的缺口披露,而非修改要求:
    • macOS/Windows 测试通道在 CI 中被跳过(仅属于 merge_group 的通道);变更涉及的 workflow-gate 套件已在 Linux 通道和本地运行。
    • 针对 build-and-publish-image.yml 的嵌入式 shell actionlint 检查为工具所不支持(已明确标注非阻断项)。
    • 一条探针级缺口(retry 步骤的 with: 参数没有任何测试固定)已被审查方在收敛姿态下(第 5 轮)明确延后 —— "已记录,本轮不要求修改",因此它是一条审计记录,而非本轮的工作项。

本轮未做任何代码改动。分支保持在 95d3e23171("fix(ci): harden the image-build failure reporter per review round 4 (#9916)")。

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


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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout — the four round-4 findings (R4-1/R4-2 Critical, R4-3/R4-4 Suggestions) were verified already fixed at head 95d3e23 — the 07:28Z review anchored to the parent 23078f8e9 (verified via the comments' commit_id), and the round-4 hardening commit landed after it. No push needed; evidence verified at head and threads resolved:

  • R4-1: head -n -1 is gone — the strip is now tail -n 1 + sed '$d' (POSIX-safe; the BSD constraint is documented in-code). GNU parity checked byte-for-byte. Mutation: deleting the strip → 2 fixtures red.
  • R4-2: the replay suite is gated on process.platform !== 'win32' && jq (build-and-publish-image-workflow.test.js:190) — the exact option the finding offered, keeping the YAML pin tests running on Windows.
  • R4-3: fixture caps the recorded runs at the newest ten exists (line 398); mutation: deleting && ++n <= max → exactly that test red.
  • R4-4: stranded-heading fixture emits the run-block heading exactly once after a stranded one (line 441) + unconditional marker re-emit in write_body; mutation checks red/green both directions.

Targeted suite: 26/26 pass at head (vitest run --config ./scripts/tests/vitest.config.ts on this file). All four threads replied with this evidence and resolved. Remaining 9 threads (R4-5..R4-13 + R1-9 follow-up) stay open for the next round.

…ob (#9916)

Round 4 removed the unreachable marker-restore branch (R4-9) but left its
residual gap undocumented: the dedup lookup only finds the tracked issue
while the version marker survives in the body, so a human edit deleting
the marker orphans the issue and the next failure files a duplicate. Fold
the marker into the job's existing known-gap note alongside its sibling,
the scope/ci-cd label (R4-11), and record the workflow's new size.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #9916 (address-review)

This round processes the closeout instruction from the maintainer (ic:5408986699): the four round-4 findings R4-1..R4-4 were already verified fixed and resolved, and the remaining 9 threads (R4-5..R4-13 + the R1-9 follow-up) were left open for this round. Every one was re-verified at head source-blind; seven turned out to be already fixed by 95d3e23 (each re-confirmed with mutation probes and a parent-commit defect reproduction), R4-9 was completed by a small documentation change this round, and R1-9 stays deferred to its existing follow-up issue.

Feedback triage

  • Reviews rv:5017712985 / rv:5017714082 / rv:5017715269 / rv:5017716358 — empty COMMENTED containers carrying the maintainer's thread replies below. No action.
  • Inline rc:3851955238 / rc:3851956180 / rc:3851957173 / rc:3851958146 — maintainer replies confirming the R4-1..R4-4 fixes (already resolved last round). Informational; no action.
  • Issue comment ic:5408918954 — round-5 no-action summary. Informational; no action.
  • Issue comment ic:5408986699 — the actionable instruction: address the 9 remaining threads.

Dispositions

Resolved in code at 95d3e23 (re-verified this round, mutation-probed)

  • R4-5 (rc:3850497832) — cross-references between the two split/merge contract implementations exist in both directions: the bash/awk contract comment in image-build-failure-issue.sh names splitOccurrenceBlock()/renderIssueBody() in main-failure-signature.mjs, and main-failure-signature.mjs now carries the sibling note above splitOccurrenceBlock(). The minimal of the finding's two options (cross-reference instead of a shared-helper extraction) was taken.
  • R4-6 (rc:3850497838) — # shellcheck disable=SC2016 with a rationale sits above write_prose() (the literal-backtick formats), matching the repo convention documented in autofix-push-and-report.sh. Note: the shellcheck binary is not installed on this runner, so the directive was verified against the pinned convention text; the CI shellcheck lane remains authoritative.
  • R4-7 (rc:3850497845) — fixture restores the narrative when the body starts at the occurrences marker exists: body starts directly with the occurrences marker plus one bullet, and the test asserts the full generated prose and marker presence (not exactly-once, exactly as the finding advised). Mutation probe: deleting the prose-fallback guard turns it red.
  • R4-8 (rc:3850497848) — the readability re-check now runs AFTER the normalization/stranded-heading strip, so a head that normalizes down to nothing falls back to the generated prose. Witness restores the narrative when the head normalizes down to nothing; the defect reproduces on the parent commit's script (witness red), and deleting the guard at head turns it red again.
  • R4-10 (rc:3850497860) — the recurrence test pins the exact read-side call issue list --repo QwenLM/qwen-code --state open --label scope/ci-cd. Mutation probe: deleting the --label filter from the script's list call turns exactly that test red.
  • R4-11 (rc:3850497872) — the file-failure-issue job comment documents the label-removal orphaning gap and why the edit call cannot repair it (edit path unreachable without the label), pointing at the reconciliation backstop. This round's edit kept that note and extended it to the sibling marker case (see below).
  • R4-13 (rc:3850497882) — the awk split admits only recorded-run-shaped lines (^- https://…/actions/runs/<digits>$) into the machine block; any other bullet falls to the tail. Witness keeps a bullet-shaped annotation out of the recorded runs asserts the annotation is not reordered into the block nor counted against the cap. Mutation probe: reverting the gate to any-bullet turns it red; the defect also reproduces on the parent commit's script.

Resolved by this round's commit 9276ca60

  • R4-9 (rc:3850497852) — at 95d3e23 the unreachable marker-restore branch was deleted (its false repair claim is gone), but the finding's remaining ask — "future editors know marker deletion orphans the issue" — was documented nowhere. This round folds the version marker into the job's existing known-gap note alongside its sibling, the scope/ci-cd label: if a human removes either dedup artifact, the lookup misses the tracked issue and the next failure files a duplicate, and the edit path cannot repair either because it is unreachable without them. This satisfies the finding's "correct the comment" option; its other option (title-based fallback discovery) is deliberately not taken as additive complexity for a manual-edit edge case, consistent with how R4-11 was resolved. Also bumped .github/workflows/.size-baseline (9227 → 9256) to record the file's new size, matching the branch's exact-recording convention.

Deferred (thread stays open)

  • R1-9 (rc:3850497879) — verified still standing at head: a repo-wide grep confirms no success-path code references the image-build-failure: marker or closes these issues (only the failure path in image-build-failure-issue.sh defines it). The success path (marker lookup + close/comment) is deliberately out of this PR's failure-reporter scope and is already tracked by follow-up issue Close the image-build failure issue when a recovery publish succeeds #9960 (stated as verified OPEN in the finding). Recorded in deferred-findings.json; thread replied and left open.

Changes this round

  • .github/workflows/build-and-publish-image.yml — the Second known gap note on file-failure-issue now covers both dedup artifacts (label and version marker) instead of the label alone.
  • .github/workflows/.size-baselinebuild-and-publish-image.yml entry 9227 → 9256.

Verification

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/build-and-publish-image-workflow.test.js26/26 passed (at head, and again after the change)
  • Mutation probes at head (each reverted afterwards, suite re-run green):
    • deleted the post-strip prose fallback guard → 2 tests failed (restores the narrative when the body starts at the occurrences marker, restores the narrative when the head normalizes down to nothing) → restored → 26/26 (witnesses for R4-7 + R4-8)
    • deleted --label from the script's gh issue list call → 1 test failed (records the recurrence on the existing issue instead of creating) → restored → 26/26 (witness for R4-10)
    • reverted the awk run-shape gate to any-bullet → 1 test failed (keeps a bullet-shaped annotation out of the recorded runs) → restored → 26/26 (witness for R4-13)
  • Defect reproduction: ran the head's witnesses against the pre-fix parent script (23078f8e9) → exactly 2 failures (the R4-8 and R4-13 witnesses), proving both defects existed and the fixes resolve them → restored → 26/26
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js195/195 passed
  • npx vitest run --config ./scripts/tests/vitest.config.ts (full scripts/tests suite) — 65 files, 1752 passed | 16 skipped
  • shellcheck not installed on this runner (R4-6 verified against the convention text); integration tests not run — the changed behavior is exercised only through the scripts/tests harness, not the bundled CLI
中文说明

Autofix 审查轮次 — PR #9916(address-review)

本轮处理维护者收尾评论(ic:5408986699)中的指示:round-4 的 R4-1..R4-4 四项发现已验证修复并解决,其余 9 个线程(R4-5..R4-13 + R1-9 后续项) 留给本轮处理。每一项都在当前 head 上做了来源无关的重新验证:其中七项已由 95d3e23 修复(均通过变异探针和父提交缺陷复现重新确认),R4-9 由本轮的一个小型文档改动补完,R1-9 继续延后到其已有的后续 issue。

反馈分诊

  • 评审记录 rv:5017712985 / rv:5017714082 / rv:5017715269 / rv:5017716358 — 承载维护者线程回复的空 COMMENTED 容器,无需处理。
  • 行内评论 rc:3851955238 / rc:3851956180 / rc:3851957173 / rc:3851958146 — 维护者确认 R4-1..R4-4 已修复的回复(上一轮已解决),仅信息性,无需处理。
  • issue 评论 ic:5408918954 — 第 5 轮"无需处理"总结,仅信息性。
  • issue 评论 ic:5408986699 — 本轮的可执行指示:处理剩余 9 个线程。

处置结果

已在 95d3e23 中修复(本轮重新验证并做变异探针)

  • R4-5(rc:3850497832)— 两份切分/合并契约实现之间的互引注释双向齐备:image-build-failure-issue.sh 的契约注释点名了 main-failure-signature.mjs 中的 splitOccurrenceBlock()/renderIssueBody()main-failure-signature.mjs 也在 splitOccurrenceBlock() 上方补了兄弟实现注释。采用的是该发现两个选项中最小的一种(互引,而非抽取共享 helper)。
  • R4-6(rc:3850497838)— write_prose() 上方(字面反引号格式处)已有带理由的 # shellcheck disable=SC2016,与 autofix-push-and-report.sh 中记录的仓库约定一致。注意:本运行器未安装 shellcheck,该指令是按锁定约定的文本验证的;CI 的 shellcheck 通道仍是权威检查。
  • R4-7(rc:3850497845)— 用例 restores the narrative when the body starts at the occurrences marker 已存在:正文直接以 occurrences marker + 一条记录开头,断言完整生成的叙述存在、marker 存在(按该发现的提示,不断言"恰好一个")。变异探针:删除 prose 兜底守卫后该用例变红。
  • R4-8(rc:3850497848)— 可读性复查现在发生在归一化/孤立标题清理之后,归一化后变空的头部会回退到生成的叙述。用例 restores the narrative when the head normalizes down to nothing;该缺陷可在父提交的脚本上复现(用例变红),在 head 上删除该守卫也会再次变红。
  • R4-10(rc:3850497860)— 复发用例钉住了读侧调用的完整文本 issue list --repo QwenLM/qwen-code --state open --label scope/ci-cd。变异探针:从脚本 list 调用中删掉 --label 过滤后,恰好该用例变红。
  • R4-11(rc:3850497872)— file-failure-issue job 注释已记录"标签被移除导致 issue 孤儿化"的缺口,并说明 edit 调用为何无法修复(没有标签就到不了 edit 路径),指向对账兜底。本轮的编辑保留了该注释并将其扩展到同族的 marker 场景(见下)。
  • R4-13(rc:3850497882)— awk 切分只允许记录 run 形态的行(^- https://…/actions/runs/<数字>$)进入机器块;其他任何列表项落入 tail。用例 keeps a bullet-shaped annotation out of the recorded runs 断言批注不会被重排进机器块、也不计入上限。变异探针:把门槛还原为"任意列表项"后该用例变红;该缺陷同样可在父提交的脚本上复现。

由本轮提交 9276ca60 解决

  • R4-9(rc:3850497852)— 95d3e23 删除了不可达的 marker 恢复分支(虚假的修复声明已消失),但该发现剩余的诉求——"让后来的编辑者知道删除 marker 会使 issue 成为孤儿"——没有任何地方记录。本轮把版本 marker 并入 job 已有的已知缺口注释,与其同族的 scope/ci-cd 标签并列:人工移除两个去重凭证中的任何一个,查找都会错过被跟踪的 issue、下一次失败将创建重复 issue,且 edit 路径在没有它们时本就不可达、无法修复任何一方。这满足了该发现"修正注释"的选项;另一个选项(按标题兜底查找)作为对人工编辑边缘场景的额外复杂度被刻意放弃,与 R4-11 的处置方式一致。同时把 .github/workflows/.size-baseline(9227 → 9256)更新为该文件的最新大小,延续本分支精确记录尺寸的约定。

延后(线程保持 open)

  • R1-9(rc:3850497879)— 在 head 上验证依然成立:全仓库 grep 确认没有任何成功路径代码引用 image-build-failure: marker 或关闭这些 issue(只有 image-build-failure-issue.sh 的失败路径定义了它)。成功路径(查 marker + 关闭/评论)刻意不在本 PR 的失败上报范围内,且已由后续 issue Close the image-build failure issue when a recovery publish succeeds #9960 跟踪(发现中注明已验证 OPEN)。已记录到 deferred-findings.json;线程已回复并保持 open。

本轮改动

  • .github/workflows/build-and-publish-image.ymlfile-failure-issue 上的 "Second known gap" 注释现在同时覆盖两个去重凭证(标签与版本 marker),而非仅标签。
  • .github/workflows/.size-baselinebuild-and-publish-image.yml 条目 9227 → 9256。

验证

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/build-and-publish-image-workflow.test.js26/26 通过(head 上、改动后各一次)
  • head 上的变异探针(每次变异后还原并复跑至全绿):
    • 删除 strip 之后的 prose 兜底守卫 → 2 个测试失败(restores the narrative when the body starts at the occurrences markerrestores the narrative when the head normalizes down to nothing)→ 还原 → 26/26(R4-7 + R4-8 的 witness)
    • 从脚本 gh issue list 调用中删除 --label → 1 个测试失败(records the recurrence on the existing issue instead of creating)→ 还原 → 26/26(R4-10 的 witness)
    • 把 awk 的 run 形态门槛还原为任意列表项 → 1 个测试失败(keeps a bullet-shaped annotation out of the recorded runs)→ 还原 → 26/26(R4-13 的 witness)
  • 缺陷复现:用 head 的用例运行父提交(23078f8e9)的旧脚本 → 恰好 2 个失败(R4-8 与 R4-13 的 witness),证明两个缺陷真实存在且修复有效 → 还原 → 26/26
  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js195/195 通过
  • npx vitest run --config ./scripts/tests/vitest.config.ts(scripts/tests 全套件)— 65 个文件,1752 通过 | 16 跳过
  • 本运行器未安装 shellcheck(R4-6 按约定文本验证);未运行集成测试——变更行为只通过 scripts/tests 验证框架覆盖,不涉及打包后的 CLI

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — Test (macos-latest, Node 22.x) was skipped in CI (merge_group-only lane) and the changed workflow-gate suite did not run on that platform locally.

Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI (merge_group-only lane) and the changed workflow-gate suite did not run on that platform locally.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/build-and-publish-image.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

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

未审查:build-and-test — Test (macos-latest, Node 22.x) was skipped in CI (merge_group-only lane) and the changed workflow-gate suite did not run on that platform locally。

未审查:build-and-test — Test (windows-latest, Node 22.x) was skipped in CI (merge_group-only lane) and the changed workflow-gate suite did not run on that platform locally。

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #9916: no action required

Feedback triage

Everything newer than the last evaluation (2026-08-25T10:18:20Z) is confirmation, not new work. No findings, change requests, failed checks, or still-red checks were reported this round.

  • Automated reviewer (rv:5018545040, round 6): posted 0 findings (findings: [], posted: 0). Its body only discloses review gaps — the macOS/Windows test lanes (merge_group-only, skipped in CI, not run locally) and the actionlint embedded-shell source-mapping limitation — explicitly as tool limitations, not blockers.
  • @yiliang114's five COMMENTED reviews (rv:5018382079…rv:5018385506): empty-bodied carriers for the five inline comments below.
  • rc:3852531564: confirms the SC2016 directive is addressed — verified at HEAD: # shellcheck disable=SC2016 with its rationale comment sits directly above write_prose() in .github/scripts/image-build-failure-issue.sh.
  • rc:3852532286: confirms the dedup read side is pinned — verified at HEAD: the recurrence test asserts issue list --repo QwenLM/qwen-code --state open --label scope/ci-cd (line 301 of scripts/tests/build-and-publish-image-workflow.test.js).
  • rc:3852533076: confirms the prose fallback is re-checked AFTER the trailing-blank/stranded-heading strip — verified at HEAD: if [[ -z "$(cat "${head_file}")" ]]; then write_prose > "${head_file}"; fi, with the witness fixture restores the narrative when the head normalizes down to nothing present (test line 528).
  • rc:3852533869: confirms the occurrences-marker fixture covers the prose fallback — verified at HEAD: fixture restores the narrative when the body starts at the occurrences marker present (test line 499).
  • rc:3852530799: confirms the recovery-publish success path (closing/commenting the alert issue when a rebuild succeeds) stays deferred by design, tracked in Close the image-build failure issue when a recovery publish succeeds #9960 (verified OPEN by the maintainer), with the thread resolved on that follow-up citation. Not re-recorded in deferred-findings.json: durable tracking already exists and was maintainer-verified, and a formal deferral would reply on the thread and hold it open — contradicting the maintainer's explicit resolution.

Diff growth this window: source 7 / test 215 net lines against 400/400 budgets — well within budget, no growth audit triggered.

Verification performed (read-only round — no code changes, no commit)

  • Spot-checked every confirmation claim above against HEAD 9276ca60; all hold.
  • npm run test:scripts (full scripts suite) at HEAD: 1751 passed / 1 failed. The single failure was install-script.test.js > does not package audio-capture test artifacts, failing on ENOENT ... packages/audio-capture/dist — a missing build artifact in this checkout, in code byte-identical to origin/main (empty git diff origin/main...HEAD on all involved paths; the PR touches none of them). Building the package's TypeScript output (npm run build:ts in packages/audio-capture) removed it.
  • A second full-suite run then showed a different one-off failure (verify-capture.test.js, a terminal-rendering test) plus a vitest worker RPC timeout — load flake under the full parallel suite, not a deterministic failure: the file passes in focused runs, and the failing paths are likewise byte-identical to origin/main.
  • Focused run of all three files — npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/verify-capture.test.js scripts/tests/install-script.test.js scripts/tests/build-and-publish-image-workflow.test.js3 files passed, 154 passed | 16 skipped, including this PR's suite at 26/26.
  • CI reported no failed and no still-red checks this window.

Disposition

No code change and no commit this round. resolved-comments.txt lists the four findings fixed by earlier commits and re-verified as still holding at HEAD (SC2016 directive placement, dedup read-side pin, post-strip prose-fallback re-check, occurrences-marker fixture) so their threads close; rc:3852530799 is excluded — it is a deferral, not a code resolution, and the maintainer resolved its thread on the #9960 citation. No comment-replies.json (nothing declined, deferred, or escalated this round) and no deferred-findings.json (the one confirmed deferral is already tracked in #9960).

中文说明

Autofix 审查轮次 — PR #9916:无需任何操作

反馈分类

上次评估(2026-08-25T10:18:20Z)之后的所有内容都是确认性质的,不含新工作。本轮没有报告任何新发现、修改请求、失败检查或持续失败的检查。

  • 自动审查器(rv:5018545040,第 6 轮):发布 0 条发现findings: [], posted: 0)。其正文仅披露审查缺口 —— macOS/Windows 测试通道(仅 merge_group 触发,在 CI 中被跳过,本地也未运行)以及 actionlint 内嵌 shell 源码映射的限制 —— 并明确说明这些是工具限制而非阻断项。
  • @yiliang114 的五条 COMMENTED 审查(rv:5018382079…rv:5018385506):正文为空,只是下列五条行内评论的载体。
  • rc:3852531564:确认 SC2016 指令问题已处理 —— 已在 HEAD 核实:.github/scripts/image-build-failure-issue.sh# shellcheck disable=SC2016 及其理由注释就位于 write_prose() 正上方。
  • rc:3852532286:确认去重的读取侧已固化 —— 已在 HEAD 核实:复发测试断言了 issue list --repo QwenLM/qwen-code --state open --label scope/ci-cdscripts/tests/build-and-publish-image-workflow.test.js 第 301 行)。
  • rc:3852533076:确认散文回退在去除尾部空行/孤立标题之后重新检查 —— 已在 HEAD 核实:if [[ -z "$(cat "${head_file}")" ]]; then write_prose > "${head_file}"; fi,且见证用例 restores the narrative when the head normalizes down to nothing 存在(测试第 528 行)。
  • rc:3852533869:确认 occurrences-marker 用例覆盖了散文回退 —— 已在 HEAD 核实:用例 restores the narrative when the body starts at the occurrences marker 存在(测试第 499 行)。
  • rc:3852530799:确认 recovery-publish 成功路径(重建成功后关闭/评论告警 issue)按设计继续延后,由 Close the image-build failure issue when a recovery publish succeeds #9960 跟踪(维护者已核实该 issue 处于 OPEN 状态),并以该后续 issue 的引用关闭了该线程。不再重复记入 deferred-findings.json:持久的跟踪 issue 已存在且经维护者核实;若正式登记延后,将在该线程回复并保持线程开启 —— 与维护者明确的处置相矛盾。

本窗口 diff 增长:源码净 7 行 / 测试净 215 行,预算为 400/400 —— 远在预算之内,未触发增长审计。

已执行的验证(只读轮次 —— 无代码改动、无提交)

  • 对上述每条确认声明都在 HEAD 9276ca60 上做了抽查,全部成立。
  • 在 HEAD 上运行 npm run test:scripts(完整 scripts 套件):1751 通过 / 1 失败。唯一失败是 install-script.test.js > does not package audio-capture test artifacts,报错 ENOENT ... packages/audio-capture/dist —— 是本检出中缺失的构建产物,且相关代码与 origin/main 逐字节一致(对所涉全部路径 git diff origin/main...HEAD 为空;本 PR 完全未触及这些路径)。构建该包的 TypeScript 输出(在 packages/audio-capture 中运行 npm run build:ts)后该失败消失。
  • 第二次完整套件运行出现了另一个一次性失败(verify-capture.test.js,一个终端渲染测试)外加一个 vitest worker RPC 超时 —— 属于完整并行套件下的负载抖动,并非确定性失败:该文件在聚焦运行中通过,且失败相关路径同样与 origin/main 逐字节一致。
  • 三个文件的聚焦运行 —— npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/verify-capture.test.js scripts/tests/install-script.test.js scripts/tests/build-and-publish-image-workflow.test.js —— 3 个文件全部通过,154 通过 | 16 跳过,其中本 PR 的套件为 26/26
  • 本窗口 CI 未报告任何失败检查,也没有持续失败的检查。

处置

本轮不做任何代码改动,也不提交。resolved-comments.txt 列出了四个已由更早提交修复、并经重新验证在 HEAD 上依然成立的发现(SC2016 指令位置、去重读取侧固化、去除空白后的散文回退重检、occurrences-marker 用例),以便关闭相应线程;rc:3852530799 不包含在内 —— 它是延后事项而非代码层面的解决,且维护者已凭 #9960 的引用关闭了该线程。不生成 comment-replies.json(本轮没有拒绝、延后或升级的事项),也不生成 deferred-findings.json(唯一确认的延后事项已由 #9960 跟踪)。

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


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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 280 passed · 0 failed · 280 total

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

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

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

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

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

Verification report

PR #9916fix(ci): retry sandbox image builds and file an issue when a release build fails

Verdict: merge-ready — 280/280 scripted assertions passed, 0 unexpected failures (one carried-over low-severity residual re-measured and disclosed under Findings; not new, not blocking). Verified head 9276ca60ee35e1910f2a27e54efa3d2c1231b277, base tip 42b4c09cebc9f746844591811f573bc315817457. This is a follow-up round; the previous report verified head 23078f8e — two commits landed since (95d3e231 round-4 hardening, 9276ca60 dedup-gap doc + size baseline). Harnesses, raw logs, and captures live in tmp/pr9916-verify-20260825-130830/.

中文摘要

结论:merge-ready(280/280 脚本断言全部通过,0 个意外失败)。 本轮为跟进轮:上轮之后新增两个提交(round-4 加固 + dedup 缺口文档/尺寸基线),上轮全部发现均已在新 head 上重新度量(不引用旧报告数值)。

  • 上轮发现状态(详见下表):F2(max_runs 无测试钉住)已修复(新上限见证测试钉住,突变 M16 被杀);F3(shellcheck 14 条 advisory)改善为 11 条(3 条 SC2016 以行内理由禁用);F1 的形状 A(marker 与 bullets 同时被删)已修复并被测试钉住,形状 B(删 marker 留 bullets → 出现两个 ## Failed runs 标题)仍存在且与上轮完全一致——新证据:mjs 兄弟实现 main-failure-signature.mjs 采用完全相同的契约(含同一尾部锚定剥离形状),本脚本是忠实镜像;已度量一行修复(见 Findings,若采纳需同时改两处)。F4、F5 为既有问题(本 PR 未触碰相应文件),原样复测成立。
  • A/B 结论:独立 Actions 语义模型(表达式逐字取自 YAML)跑 10 场景,HEAD 38/38 全过(含"重试成功翻绿、双失败建 issue、无版本 dispatch 跳过、fork 跳过、pre-first-step 缺口按注释所述表现");三个单点对照 8/8 复现各自移除的危险(02-controls-reproduce-broken-behavior.png)。
  • 脚本行为:真实 bash + 真实 jq + 编码 gh 过滤语义的 stub,24 场景 96/96 通过(03-script-replay-96-assertions.png)。
  • 测试非空转:22 个单点突变,21/22 被杀,含全部 4 个 round-4 守卫(R4-8/R4-10/R4-13/孤立标题剥离)且逐个归属到具名测试;唯一存活者 sed→head -n -1 在本容器为行为等价(三形状逐字节比对相同),BSD 差异在此不可观测(04-mutation-matrix-21-of-22-killed.png)。
  • 门禁:尺寸门禁基线 9256==实际 9256、head 绿、植入 +5000B 与缺失条目均失败(05);actionlint 干净且植入错误步骤引用被捕获、bash -n 干净、植入语法错误被捕获(06)。
  • 未覆盖:docker 构建/真实建 issue 端到端(需 tag push,沙箱无 token);16 个 commit 中仅 1 个可达(depth-2),验证聚合 diff;yamllint 无法安装;BSD/win32 行为;标签存在性。

Previous-finding status (follow-up round)

Re-measured at the new head; nothing carried forward by reference. The two delta commits changed the script's input closure, so every prior measurement was re-run.

# previous finding severity status at new head
F1 stranded-heading duplication when a human edits the body low partially fixed. Shape A (marker and bullets removed → stranded heading is the last head line): fixed and pinned in-tree (emits the run-block heading exactly once after a stranded one); replay R7 measures 1 heading; strip-guard mutant M20 killed by 2 tests. Shape B (marker removed, bullets kept): stands, unchanged — replay R8 measures 2 headings, data and dedup preserved (captured body in logs/f1-shape-b-rebuilt-body.md). New bounding evidence: the mjs sibling uses the identical tail-anchored strip (head.replace(/\n*##\s+Recurrences\s*$/, '')), so shape B is the sibling-contract-consistent behavior; a one-sided fix would diverge the pair the R4-5 comment ties together. Measured fix available (Finding 1).
F2 max_runs=10 unpinned by the suite completeness fixed. Mutant M16 (max_runs=3) now killed by the new caps the recorded runs at the newest ten; my replay R4 independently pins the cap against the real script (13 prior runs + new → exactly 10, four oldest dropped, newest first).
F3 14 new advisory shellcheck findings nit improved: 14 → 11. The 3× SC2016 are disabled inline with rationale (R4-6, on the literal-backtick formats); remaining 7× SC2154 (workflow-provided env refs) + 4× SC2312, same convention as sibling scripts (gate is advisory-only, see Finding 3).
F4 pre-existing: scripts/lint.js --shellcheck can never fail (trailing sed masks shellcheck's exit) pre-existing stands. scripts/lint.js is untouched by this PR (0 diff lines); masking re-demonstrated with the repo's exact pipe shape: a file shellcheck errors on exits 0 through the pipe, 1 unpiped (06-static-gates-live.png).
F5 pre-existing: expression-injection surface in the untouched Process version step pre-existing stands, unchanged. 0 PR-diff lines touch the step; INPUT_VERSION="${{ github.event.inputs.version }}" still inlined at workflow line 56. The PR's own env-var plumbing for the same input (line 202) remains the injection-safe path the script consumes.

Central claim and A/B proof

Central claim: a failed release image build retries once, and a still-failed publishing run files/updates exactly one issue per version — deduplicated client-side by an exact body marker, preserving human annotations, without false positives on successful or non-publishing runs.

The A/B is a semantics A/B (semantics-simulator.mjs): the real workflow YAML is parsed with the repo's yaml package, every gate expression is evaluated verbatim by a recursive-descent Actions-expression evaluator encoding the documented semantics (explicit if: replaces the default success(); continue-on-error flips conclusion not outcome; job conclusion from step conclusions; failure() is conclusion-based at both scopes; job outputs reach dependent jobs after a producing-step ran; missing inputs compare as ''). Because every arm runs through the same model, a model error would have to hit arms asymmetrically to flip a verdict. HEAD: 38/38 across 10 scenarios (01-semantics-ab-head-10-scenarios.png), including: retry success turns the job green with no issue (S1), double failure files (S2), versionless publishing dispatch skipped by design (S5), non-publishing dispatch keeps push=false and skips (S6), checkout/login failures on publishing runs still file (S7/S10), fork guarded (S9), and the documented pre-first-step gap behaving exactly as the workflow comment says (S8: push_image stays empty, gate skips). The 4 PUSH_IMAGE expansion checks agree with the login gate on every event shape.

arm one-point change vs HEAD reproduced hazard result
C1 retry gate outcome == 'failure'failure() S1: retry skipped, job green — silent non-publish (the #9898 shape); S2: double failure invisible (job green, no issue) 3/3 predicted breakages, 02-controls-reproduce-broken-behavior.png
C2 drop continue-on-error from the first build step S1: retry published the image, yet job red and issue filed for an image that exists 3/3
C3 issue gate restates startsWith(github.ref, 'refs/tags/v') S4 publishing-dispatch failure: no issue filed (drift loss); S2 tag push still files 2/2

Script replay (mock-free, real bash + real jq)

script-replay.mjs runs the shipped script under the workflow step's exact env contract (bash .github/scripts/image-build-failure-issue.sh, cwd = repo root); only gh is stubbed, and the stub encodes real gh semantics so the script's flags are behaviorally observable: --state (default open), --label (all must match), newest-first ordering, --limit truncation, per-issue body store. 96/96 (03-script-replay-96-assertions.png): create with exact title and both labels; open-only + label-filtered dedup (a closed or unlabeled marker issue is invisible → fresh create); --limit 200 window observable (the marker issue, oldest of 205 open labeled issues, falls beyond the newest-200 window → create); v-prefix normalization both directions; same-run repeat not duplicated; cap 10 drops the four oldest of 14, newest first; marker moved onto a run line below the block survives rebuild through tail re-emission (the removed marker-restore branch stays unnecessary); empty head and emptied-after-strip heads fall back to generated prose; bullet-shaped annotation kept out of the machine block; hostile dispatch input ($(touch …), backticks) stays literal with zero execution; versionless run hard-fails with ::error:: and zero writes; two matching issues edit the newest.

Mutation matrix on the PR's own suite

22 single-point mutants against scripts/tests/build-and-publish-image-workflow.test.js in scratch dirs; unmutated control 26/26 green first; positive control M12 (.body.title, the escape the PR comment cites) killed by 11 red tests in the same collected file. 21/22 killed (04-mutation-matrix-21-of-22-killed.png). All four round-4 guards killed and attributed to the exact witness tests the commit message names: R4-8 post-strip re-check → restores the narrative when the body starts at the occurrences marker + …when the head normalizes down to nothing (2 red); R4-10 list-call label → records the recurrence… (1 red); R4-13 run-shape filter → keeps a bullet-shaped annotation out of the recorded runs (1 red); stranded-heading strip → 2 red. Carry-over guards M1–M15, M17 all killed; M16 (max_runs=10→3) killed this round by the new cap test (previous round's survivor, now pinned).

Sole survivor M23 (sed '$d'head -n -1) — classified environment-bound, not a coverage gap: GNU head accepts negative counts and the two are byte-identical on multi-line, single-line, and empty inputs (measured), so no test in this container can observe the mutation; the BSD regression it guards is only observable on BSD userland, which this lane cannot run.

Size gate and static gates

  • Recorded baseline 9256 == shipped wc -c 9256 (generator re-run); gate at HEAD with WORKFLOW_SIZE_BASE_SHA=HEAD^1 green; planted +5000 B → ::error:: … grew to 14275 … (allowance 4096) exit 1; planted missing entry → ::error:: … has no entry exit 1 (05-size-gate-live-proof.png). Official vitest mirror workflow-size.test.js: 186/186.
  • actionlint (repo flags, pinned 1.7.12): clean at HEAD; planted steps.does-not-exist.outcome caught, exit 1 — its error text independently enumerates the valid step object including build-and-push with outcome/conclusion, corroborating the retry gate's reference. shellcheck (pinned 0.11.0, repo flags) on the new script: 11 advisories (7× SC2154, 4× SC2312). bash -n clean; planted syntax error exits 2 (06-static-gates-live.png). Official in-tree run of the PR suite at HEAD: 26/26.

Findings

  1. Low (carried over, stands) — shape-B stranded-heading duplication. When a human deletes the &lt;!\-\- image-build-failure-occurrences --> line but keeps the old run bullets, the rebuilt body carries two ## Failed runs headings — the strip only fires when the heading is the last head line. Repro: script-replay.mjs scenario R8 (count 2) or logs/f1-shape-b-rebuilt-body.md for the exact rebuilt body. No data loss, dedup unaffected (the version marker lives in the head); human-mutilation-only trigger. Bounding new in this round: the mjs sibling (splitOccurrenceBlock/renderIssueBody) implements the same tail-anchored strip, so this script faithfully mirrors the sibling contract the R4-5 cross-reference names — fixing only this script would diverge the pair. Measured fix (scratch mutants/fix-r7/, replace the tail check with printf '%s\n' "$(grep -vxF -- "${runs_heading}" "${head_file}")" — any heading line above the marker is stranded by definition since write_body re-emits the real one): replay 96/96 on the fixed variant with shape-B count 2 → 1, normal-recurrence R1 body byte-identical (zero collateral), PR suite 26/26 green on both sides — i.e. the suite pins nothing along this axis; the R8 fixture is the pin a fix should ship with, applied to both implementations (07-fix-variant-replay.png). Optional polish; not blocking.
  2. Nit — a recorded run written after a human annotation is demoted to prose. Under the R4-13 shape filter, once any non-run line appears below the occurrences marker, everything after it lands in the tail — including genuine run-URL bullets. A demoted run URL is preserved (as prose, above the rebuilt block) but is no longer deduped against the machine block; if that exact run fails again, its URL appears twice in the body (once as prose, once in the block). Requires a human to interleave a bullet annotation between two recorded runs and the older run to fail again; cosmetic. Design-consistent with the stated R4-13 intent (only recorded-run shapes enter the machine block).
  3. Nit — 11 advisory shellcheck findings remain on the new script under the repo's gate flags (improved from 14; see status table). Matches sibling convention; the gate is advisory-only (Finding/previous F4 explains why it cannot fail regardless).
  4. Pre-existing (not this PR) — F4 shellcheck-gate exit masking, re-demonstrated at this head.
  5. Pre-existing (not this PR) — F5 expression-injection surface in the untouched Process version step, re-confirmed untouched.

Not covered

  • Docker build/push and live issue filing end-to-end (need a tag push or publishing dispatch; no token in this sandbox). The replay reproduces the script's mechanism and wire shapes against a semantics-encoding stub, not the live gh API — it is uncalibrated against live behavior: no real emitted artifact (a filed issue's actual body/argv) is retrievable in this token-free sandbox. What would calibrate it: a captured gh issue list/view/create/edit exchange from one real filing run (for example the manual recovery the PR description cites). The semantics A/B models documented Actions behavior (assumptions E1–E8 listed in the harness header), not live Actions.
  • Per-commit attribution: 1 of the PR's 16 commits is reachable at the depth-2 shallow checkout (git rev-list --count HEAD^1..HEAD^2 = 1 vs 16 in the snapshot); the aggregate HEAD^1..HEAD diff was verified. The two delta commits' claims were verified behaviorally (every round-4 guard mutation-probed, tests pin the contracts) rather than by per-commit diff review.
  • yamllint could not be installed (pip3: Permission denied in-container); YAML well-formedness is proven by the yaml parse the simulator requires plus actionlint's parse.
  • BSD behavior of sed '$d' vs head -n -1 (M23): GNU equivalence proven byte-identical on three shapes; BSD userland unreachable in this container. The win32 replay-skip path (R4-2) is likewise unreachable on this Linux lane; the YAML pins demonstrably still run here (26/26).
  • Label existence (scope/ci-cd, type/bug) cannot be checked without a token; a missing label fails loud at gh issue create --label on a run whose build already failed.
  • The flakiness gate (5 identical rounds) is run by the workflow itself, outside this round.

Methodology

Environment: the CI verify container (node 22.23.2, bookworm, bash 5.2.15, jq 1.6), tree at refs/pull/9916/merge, built at HEAD before the round. semantics-simulator.mjs drives the parsed YAML's expressions through a 10-scenario matrix (head + three one-change controls); script-replay.mjs spawns the shipped script under the step's env contract with a semantics-encoding gh stub and real jq (one harness bug found and fixed before scoring: jq 1.6 reserves $label, which silently emptied the stub's list output — every dedup scenario was re-run after the fix); mutation-matrix.mjs runs the PR's vitest suite per single-point mutant in scratch dirs symlinked to the repo's node_modules; size/static gates run the repo's own scripts and pinned linters (installed via scripts/lint.js --setup) with planted-violation live proofs in scratch worktrees. Raw logs in logs/, harnesses and mutants in the artifact dir, captures in evidence/.

Flakiness gate log

rounds=5 files=1 skipped=0
file scripts/tests/build-and-publish-image-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/build-and-publish-image-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  scripts/tests/build-and-publish-image-workflow.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 2 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 3 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 4 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)
round 5 · scripts/tests/build-and-publish-image-workflow.test.js: P (exit 0)

Evidence images

01-semantics-ab-head-10-scenarios

02-controls-reproduce-broken-behavior

03-script-replay-96-assertions

04-mutation-matrix-21-of-22-killed

05-size-gate-live-proof

06-static-gates-live

07-fix-variant-replay

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no code changes

This round triaged four inline items, four review submissions, and the sandboxed-verification report. Nothing requires a code change: the automated reviewer has approved (LGTM, looks ready to ship), the sandboxed verification reports merge-ready at this exact head (9276ca60), and no check is failing.

Inline findings — re-verified resolved (rc:3852990060, rc:3852990936, rc:3852991742, rc:3852992718)

These four items reached this round as replies confirming that the round-4 findings were addressed in 95d3e2317 / 9276ca60. Each underlying fix was re-verified against the code at head 9276ca60:

  • the cross-reference comments tying the two merge-contract implementations together are present in both .github/scripts/image-build-failure-issue.sh and .github/scripts/ci/main-failure-signature.mjs;
  • the marker-restore branch is deleted, and the Second known gap comment on the file-failure-issue job in build-and-publish-image.yml documents marker removal and label removal as unrepaired orphaning gaps with the reconciliation backstop named;
  • the awk runs state admits only recorded-run shapes (/^- https:\/\/[^ ]+\/actions\/runs\/[0-9]+$/), and its witness test is present.

The focused suites were re-run at this head: 26/26 (build-and-publish-image-workflow.test.js) and 8/8 (main-ci-failure-issue-workflow.test.js). All four findings are resolved in the code and are listed in resolved-comments.txt so any still-open thread can be closed.

Verification-report finding 1 — shape-B stranded heading (ic:5410657430): deferred to the follow-up queue

Verified real with a direct probe against the shipped script: when a human deletes the occurrences-marker line but keeps the run bullets, the rebuilt body carries two ## Failed runs headings while the recorded runs and the dedup marker are preserved (no data loss, dedup unaffected). Deferred rather than fixed here:

  • Low severity, explicitly optional polish and not blocking; the trigger is human mutilation only, and the outcome is a duplicated heading — cosmetic.
  • The current tail-anchored strip faithfully mirrors the mjs sibling's contract (splitOccurrenceBlock/renderIssueBody); the measured fix must change both implementations, which extends a behavior change into the main-ci-failure-issue flow — beyond this PR's purpose.
  • The PR is past ~5 review rounds and already approved, so per the repository's review policy only Critical fixes land in-round; remaining suggestions are deferred with a record so nothing is silently dropped.

Verification-report finding 2 — run demoted to prose: declined

Design-consistent under the R4-13 run-shape filter: the machine block ends at the first non-run-shaped line, so a recorded run written below a human annotation survives as prose. That trade-off was explicitly accepted in its thread; re-opening it would churn the pinned shape filter without a defect to fix.

Verification-report finding 3 — 11 advisory shellcheck findings: declined

The shellcheck gate is advisory-only (finding 4 below explains why it cannot fail regardless). The remaining SC2154 items reference workflow-provided env vars and the SC2312 items follow the established sibling-script convention; the three SC2016 items were already disabled inline with rationale in round 4.

Verification-report findings 4–5 — pre-existing, not this PR: deferred to the follow-up queue

Both re-measured real at this head but outside this PR's purpose and untouched by it (0 diff lines each): the shellcheck exit-code masking in scripts/lint.js (the trailing sed swallows shellcheck's failure exit), and the expression-injection surface in the untouched Process version step (INPUT_VERSION inlined from github.event.inputs.version; the PR's own env-var plumbing for the same input is the injection-safe path the script consumes). Recorded in deferred-findings.json so they survive the merge.

Verification

  • npx vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/build-and-publish-image-workflow.test.js — 26 passed
  • npx vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/main-ci-failure-issue-workflow.test.js — 8 passed
  • scratch shape-B probe (real script + gh stub): finding reproduced (heading count 2, runs and marker preserved) — the evidence behind the deferral

No code changed this round, so no build/typecheck/lint run applies.

中文说明

Autofix 评审轮 —— 无代码变更

本轮分诊了 4 条行内条目、4 个评审提交以及沙箱验证报告。无需任何代码变更:自动评审器已 批准LGTM, looks ready to ship),沙箱验证在当前 head(9276ca60)上报告 可合入(merge-ready),且没有任何失败的检查。

行内发现 —— 复核确认已解决(rc:3852990060、rc:3852990936、rc:3852991742、rc:3852992718)

这四条本轮以"回复"形式出现,确认 round-4 的发现已在 95d3e2317 / 9276ca60 中处理。每条背后的修复都已在 head 9276ca60 的代码上重新核实:

  • 将两个合并契约实现相互关联的交叉引用注释,在 .github/scripts/image-build-failure-issue.sh.github/scripts/ci/main-failure-signature.mjs 中均存在;
  • marker 恢复分支已删除,且 build-and-publish-image.ymlfile-failure-issue 任务上的 Second known gap 注释已将"删除 marker"和"删除标签"记录为无法修复的孤儿化缺口,并指明了 reconciliation 兜底;
  • awk 的 runs 状态仅接受记录运行形状(/^- https:\/\/[^ ]+\/actions\/runs\/[0-9]+$/),其见证测试也存在。

聚焦测试套件已在该 head 上重跑:26/26build-and-publish-image-workflow.test.js)和 8/8main-ci-failure-issue-workflow.test.js)。四个发现均已在代码中解决,并已列入 resolved-comments.txt,以便仍然打开的线程可以被关闭。

验证报告发现 1 —— shape-B 孤立标题(ic:5410657430):推迟到后续队列

通过直接对交付脚本做探针验证为真实存在:当人工删除出现次数标记行但保留运行项目符号时,重建后的正文会出现两个 ## Failed runs 标题,而记录的运行与去重标记均被保留(无数据丢失,去重不受影响)。此处选择 推迟 而非修复,理由如下:

  • 低严重度,明确属于可选打磨且不阻塞;触发条件仅为人工篡改,结果只是标题重复 —— 纯外观问题。
  • 当前的尾部锚定剥离忠实地镜像了 mjs 兄弟实现的契约(splitOccurrenceBlock/renderIssueBody);已度量的修复必须同时修改两个实现,这会把行为变更扩展到 main-ci-failure-issue 流程 —— 超出本 PR 的目的。
  • 本 PR 已经过约 5 轮评审并获批准,按仓库评审策略,轮内只合入 Critical 修复;其余建议推迟并留档,确保不会被悄悄丢弃。

验证报告发现 2 —— 运行被降级为散文:拒绝

在 R4-13 运行形状过滤下属于设计内行为:机器块在第一个非运行形状行处结束,因此写在人工注释下方的记录运行会作为散文保留。该取舍已在其线程中被明确接受;重新打开它只会搅动已钉住的形状过滤,而无缺陷可修。

验证报告发现 3 —— 11 条 shellcheck 建议:拒绝

shellcheck 门禁仅为建议性质(下方发现 4 解释了它无论如何都无法失败)。剩余的 SC2154 条目引用的是工作流提供的环境变量,SC2312 条目遵循既有的兄弟脚本惯例;三条 SC2016 已在 round 4 中以行内理由禁用。

验证报告发现 4–5 —— 既有问题、不属于本 PR:推迟到后续队列

两者在当前 head 上重新度量确认存在,但超出本 PR 目的且本 PR 未触碰(各 0 行 diff):scripts/lint.js 中 shellcheck 退出码被掩盖(尾部 sed 吞掉了 shellcheck 的失败退出码),以及未触碰的 Process version 步骤中的表达式注入面(INPUT_VERSION 直接内联 github.event.inputs.version;本 PR 自己为同一输入做的环境变量管道正是脚本消费的防注入路径)。已记录到 deferred-findings.json,确保合入后不丢失。

验证

  • npx vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/build-and-publish-image-workflow.test.js —— 26 通过
  • npx vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/main-ci-failure-issue-workflow.test.js —— 8 通过
  • shape-B 临时探针(真实脚本 + gh 桩):发现复现(标题计数 2,运行与标记均保留)—— 即推迟处理的依据

本轮未改动代码,因此不适用 build/typecheck/lint 运行。

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


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

@chiga0 chiga0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No blocking findings. Approved.

Checked:

  • Retry contract: continue-on-error: true on the first build step; retry gated on steps.build-and-push.outcome == 'failure' (not failure(), which would be false once continue-on-error absorbs the first attempt — silently skipping the retry). Job conclusion is correct in all three cases (success, retry-heals, retry-fails).
  • PUSH_IMAGE consolidation: the env var is evaluated once at job level and referenced consistently in the login gate (env.PUSH_IMAGE == 'true') and both build steps (push: '${{ env.PUSH_IMAGE }}'). The publish-decision step exports it before any step that can fail, so the file-failure-issue gate sees the value even on checkout/login failures.
  • file-failure-issue gate: failure() && github.repository == 'QwenLM/qwen-code' && needs.build-and-push-to-ghcr.outputs.push_image == 'true' && (github.event_name == 'push' || github.event.inputs.version != ''). Each clause is load-bearing and covered by a test that asserts deletion breaks the suite.
  • Bash script merge contract: writer (write_prose) and reader (jq contains()) use the same marker string. The awk state machine (head/runs/tail) correctly classifies lines; bullet-shaped human annotations that don't match the run-URL regex land in tail, not runs. The printf/sed pattern for in-place normalization is bash-safe (word expansion precedes redirect setup).
  • Dedup lookup: gh issue list --state open --label scope/ci-cd --limit 200 --json number,body + client-side jq contains(). The --state open and --label filter are both tested (deletion breaks the suite). The --search path is deliberately avoided because GitHub tokenizes the colon out of the marker.
  • Cross-file: main-failure-signature.mjs change is four comment lines only, no logic touched.
  • Tests: YAML-assertion suite (pins retry contract, PUSH_IMAGE expression, login gate, failure-issue gate) + shell-replay integration suite (12 scenarios; replayable gates on process.platform !== 'win32' && jq --version exit 0).

CI: Test (ubuntu-latest, Node 22.x) ✓ · Desktop Shell (ubuntu-22.04, windows-2022) ✓ · web-shell E2E Smoke ✓ · Secret scan ✓ · Dependency CVE audit ✓. All non-skipped checks green.

Unreviewed dimensions:

  • macOS and Windows workflow-test lanes: merge_group-only, not exercised on this PR.
  • actionlint: no CI job runs it on this PR; author reports local clean run.
  • Docker build and issue-filing paths: require tag push or publishing dispatch; not exercisable from a PR by design (acknowledged in the PR description).

Cross-check against prior reviews: All critical and blocking findings from rounds 1–4 (qwen-code-ci-bot) are addressed at this head: BSD head -n -1 replaced with sed '$d' (R4-1), Windows bash-test guard added via process.platform !== 'win32' (R4-2), cap/stranded-heading/empty-head/bullet-annotation fixtures added (R4-3/4/7/13). Remaining open items (R4-5 duplicate merge contract, R4-9 marker-removal gap, R4-11 label-removal gap, R1-9 no closure on recovery) are documented design limitations, tracked in follow-up issue #9960 where applicable, and not blockers.

Reviewed with AI assistance.

@yiliang114
yiliang114 added this pull request to the merge queue Aug 26, 2026
Merged via the queue into main with commit fc874df Aug 26, 2026
351 of 356 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.2.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Sandbox image for 0.22.0 never published: v0.22.0 image build failed (ETXTBSY) and was not retried, breaking sandbox-based CI lanes

4 participants