Skip to content

fix(ci): run /resolve without the container sandbox and pin its CLI version - #10428

Merged
wenshao merged 20 commits into
mainfrom
fix/resolve-restore-no-sandbox
Aug 31, 2026
Merged

fix(ci): run /resolve without the container sandbox and pin its CLI version#10428
wenshao merged 20 commits into
mainfrom
fix/resolve-restore-no-sandbox

Conversation

@wenshao

@wenshao wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Restores @qwen-code /resolve to a working state, stops it from mis-reporting infrastructure failures as agent verdicts, and — because the fix turns the container sandbox off — moves the credentialed half of the lane onto a runner the agent never touches. Changes, plus the tests that pin them:

  1. The agent no longer runs inside the container sandbox (tools.sandbox: false, explicit rather than absent).
  2. The CLI is installed in its own step at an exact version (QWEN_CLI_VERSION: '0.21.10') instead of the npm latest dist-tag; the follow-up bot's action input is pinned to the same version.
  3. The agent step gets its own timeout-minutes: 75, and when it ends without outcome=success the run records failure_kind=infra and posts a comment that says the agent never ran — naming the outcome and the timeout — instead of the generic "attempted to resolve … did not complete successfully" and the "check the logs" nudge that reads as an invitation to re-run.
  4. The agent is invoked directly (qwen --auth-type openai --approval-mode yolo …, settings written to a per-run QWEN_HOME, workspace .qwen/settings.json removed first) rather than through qwen-code-action, inside a ::stop-commands:: window with decoyed runner command files that are truncated on every exit path — this keeps the agent job's own later steps (packaging, upload) honest.
  5. The credentialed half runs in a new job. resolve-pr now ends without credentials once the agent has run: a Package resolution step bundles the resolution (git bundle, prerequisite = the head the agent resolved from) into the run artifact next to the report files, and the job exposes decision, pr_number, the agent step's outcome and the prepare-time refs as outputs. publish-resolution (needs: resolve-pr, always() && decision == 'run') checks out fresh, downloads the artifact, fetches the base and PR-head refs from GitHub, pins the comparison ref to the head the agent resolved from (fetched by SHA if the PR head moved), git bundle verifys and imports the bundle, requires the resolution to descend from that head, and only then runs the unchanged Resolution check guards and the Report result push/comment. A missing artifact (agent job cancelled or crashed) is reported as an infrastructure failure. Both jobs hold the qwen-pr-head-write-<pr> lock. The in-job scrubs, .git guards and BASH_ENV/LD_* pins from earlier rounds are removed rather than extended.

Tests: contract pins moved to the publish job and now assert the structure itself (no secrets. in resolve-pr after the agent step; no agent and no CLI install in publish-resolution; the token-bearing step only there; matching artifact names; the verify → import → lineage order; both jobs on ephemeral hosted runners); a fixture test drives the real Package resolution and Resolution check run blocks across a bare origin, an agent-side clone and a fresh publish-side clone — happy path, a bundle that does not descend from the head, a bundle with an unknown prerequisite, a no-op against a clean base and its refusal against a still-conflicting one, a missing artifact, and an out-of-scope file smuggled in the bundle. The invocation wiring (--prompt, --auth-type), the set +e/set -e bracketing, the four decoys and the settings-file removal order are pinned too.

Why it's needed

A survey of every /resolve request since the command shipped (839 requests on 323 PRs, 2026-06-25 → 08-27, paired with the bot's <!-- qwen-resolve-result --> comments and the failed runs' job logs) shows the command has had zero successes since 2026-08-15: 0 of 81 agent runs, after pushing a resolution in 84% of the 273 agent runs before that date. None of the 81 failures involved the model looking at the conflict:

  • 14 runs, 08-15 → 08-16: @qwen-code/qwen-code@latest resolved to 0.21.12 while npm reported No matching version found — the action's install step died. Pinning the version removes the dependency on the release pipeline of the moment; 0.21.10 is the last version with a measured record on this job (16 of 19 requests pushed on 08-12).
  • 24 runs, 08-17 → 08-26: fix(ci): stop dropping agent settings in resolve and follow-up workflows #9252 corrected the settings_jsonsettings input name, so the block that had been silently dropped since the command shipped took effect for the first time — including "sandbox": true. The CLI then hopped into ghcr.io/qwenlm/qwen-code:<cli version> and died on manifest unknown because the versioned image lags the npm release (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 covers this half for 0.22.0; the same happened for 0.21.13 and 0.22.1).
  • 40 runs, 08-16 → 08-27: with the image present, the sandboxed agent produced no output at all until the 120-minute job timeout cancelled it; git status in the artifact step afterwards showed the merge had not even started.

Every /resolve run that ever pushed a resolution ran without the container; every run that entered the container failed. Turning the sandbox off, however, removed the one thing that kept the agent's writes away from the runner the credentialed push ran on. Review rounds 2–5 on this PR demonstrated, with probes, that an in-job scrub cannot close that surface: git config scopes and hooks, a gitfile-replaced .git, a moved ref, PATH shims, appends to the real $GITHUB_ENV (discoverable on disk despite the decoys), lowercase proxy variables, GIT_TRACE, a FIFO in place of a command file, BASH_FUNC_* exports, and a detached process reading the push step's /proc/<pid>/environ — the last one reachable by no scrub at all. Item 5 is the structural answer: nothing credentialed runs on the agent's runner once the agent has started.

The 120-minute job timeout has never ended a healthy run (p95 41 min, p99 70 min, request to result comment over the 294 resolutions ever produced; only two exceeded 75), so a step-level 75 keeps the tail while cutting the cost of a hang by a third. And because the failure comment did not distinguish "the agent never started" from "the agent gave up", the outage produced 13 days of re-runs against the same broken install (13 requests each on 08-21 and 08-24); the new wording says the request will fail the same way until the cause in the run is fixed.

Reviewer Test Plan

How to verify

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js scripts/tests/qwen-autofix-workflow.test.js scripts/tests/ci-flaky-rerun-workflow.test.js scripts/tests/qwen-pr-review-workflow.test.js scripts/tests/workflow-size.test.js → all pass (33 in the resolve file, including the two-runner fixture test).
  • node --test --test-name-pattern='resolve-pr|agent settings|follow-up|resolve jobs|publishes' .github/scripts/qwen-triage-workflow.test.mjs → 10 pass; node --test .github/scripts/ci-runner-routing.test.mjs .github/scripts/resolve-sandbox-image.test.mjs → 53 pass. (The triage file's "flakiness gate — behavioral" suites need GNU timeout, absent on macOS, and fail identically on origin/main; they run on the Linux CI leg.)
  • Every run: block of both jobs passes bash -n after stripping ${{ }} expressions; the workflow parses with js-yaml; bash .github/scripts/check-workflow-size.sh passes.
  • Mutation checks, each expected red: dropping the lineage check (git merge-base --is-ancestor), the git bundle verify, the head pinning (git update-ref "$HEAD_FETCH_REF" "$HEAD_SHA") or the missing-artifact branch fails the fixture test (2, 2, 2 and 1 tests respectively); moving the push back into resolve-pr or adding a secrets. reference after the agent step fails the structure tests; "sandbox": falsetrue, QWEN_CLI_VERSION'latest', or a step timeout-minutes change without AGENT_TIMEOUT_MINUTES each fail their pins.
  • After merge, the first @qwen-code /resolve on a conflicted PR is the real check: expect resolve-pr to end at Upload run artifacts with a resolution.bundle in the artifact, publish-resolution to log git bundle verify then the guards, and the result comment to be a pushed resolution or the agent's own failure.md.

Evidence (Before & After)

Before — every /resolve since 08-15, three failure shapes from the run logs (105 failed runs classified; the 81 since 08-15 are 14 / 24 / 40 + 3 in a lost-log/other bucket):

npm error notarget No matching version found for @qwen-code/qwen-code@0.21.12.        ← 08-15 → 08-16
hopping into sandbox (command: docker) ...
Checking for sandbox image: ghcr.io/qwenlm/qwen-code:0.22.0
Error response from daemon: manifest unknown
Fatal error: Failed to relaunch the CLI process.                                       ← 08-17 → 08-26
##[error]The operation was canceled.  (duration_ms=7160109, no agent output)           ← 08-16 → 08-27

Monthly, agent runs → pushed: June 34 → 28 (82%), July 208 → 175 (84%), 08-01..14 31 → 27 (87%), 08-15..27 81 → 0.

After — the two-runner fixture, from the new test (real git, the workflow's own run blocks):

(a) bundle on the resolved-from head        → outcome=fixed, publish HEAD == agent's resolution commit
(b) bundle built on main alone              → "does not descend from the PR head" → outcome=failed
(b2) bundle with an agent-local prerequisite → "does not verify against the PR head" → outcome=failed
(c) no bundle + no-action.md, clean base    → outcome=noop; same against a conflicting base → "still has merge conflicts"
(d) no artifact directory                   → outcome=failed, failure_kind=infra
(e) out-of-scope file inside the bundle     → "Agent modified files outside the conflict set" → outcome=failed

Live: N/A until merged (the workflow runs from the default branch).

Tested on

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

Environment (optional)

Unit tests only (node --test, vitest with real git fixtures); GitHub data via gh api.

Risk & Scope

  • Main risk or tradeoff: the agent runs on a hosted runner without a container, as it did for every successful run to date, and its runner is treated as untrusted once the agent starts: the only things that leave it are the artifact (bundle + report files, verified/sanitised downstream) and runner-tracked step outputs written before the agent ran. The extra job adds one runner start-up (~30 s) per run. If the agent job is cancelled before prepare finishes, publish-resolution is skipped and no comment is posted (the old single-job shape posted one); the artifact-missing path covers cancellation after that point. Pinning the CLI means /resolve does not pick up new CLI releases until someone bumps the pin, the same trade the uses: SHA already makes.
  • Not validated / out of scope: why the sandboxed agent hangs (no output is captured before the cancel) — left as the precondition for re-enabling the sandbox. A live moved-head run. Head-moved push retries, early maintainerCanModify detection, and a consecutive-failure alarm are fix(ci): recover /resolve requests lost to moved heads, fork pushes, 503s and drafts #10429 and ci: watch /resolve for consecutive failures and file a tracking issue #10439; fix(ci): recover /resolve requests lost to moved heads, fork pushes, 503s and drafts #10429's replay will re-home into publish-resolution once this lands.
  • Breaking changes / migration notes: none for users; the result comment for the never-ran case changes wording; the run now shows two jobs for /resolve.

Linked Issues

Related: #9898, #9961 (the missing-image half), #9252 (the change that activated the block).

中文说明

本 PR 做了什么

@qwen-code /resolve 恢复可用,不再把基础设施故障报成 agent 的判断,并且——由于修复会关闭容器沙箱——把链路中带凭据的一半挪到 agent 从未接触过的 runner 上。改动及相应测试:

  1. agent 不再在容器沙箱内运行(tools.sandbox: false,显式写 false 而不是删掉键)。
  2. CLI 在独立步骤里按精确版本安装(QWEN_CLI_VERSION: '0.21.10'),不再跟随 npm 的 latest dist-tag;follow-up bot 的 action 输入也钉到同一版本。
  3. agent 步骤单独设 timeout-minutes: 75;当该步骤不是 outcome=success 结束时,run 记录 failure_kind=infra,评论改为说明 agent 根本没跑起来(写明 outcome 与超时值),而不是原来那句笼统的 "attempted to resolve … did not complete successfully" 加 "check the logs"——后者读起来像是在邀请重试。
  4. agent 改为直接调用(qwen --auth-type openai --approval-mode yolo …,settings 写入每次运行独立的 QWEN_HOME,先删除工作区 .qwen/settings.json),不再经过 qwen-code-action,运行在 ::stop-commands:: 窗口内,runner 命令文件诱饵化并在每条退出路径上清空——这只是为了让 agent 自己 job 里后续步骤(打包、上传)保持诚实。
  5. 带凭据的一半改在新 job 里运行。 resolve-pr 在 agent 运行之后不再持有任何凭据:新增 Package resolution 步骤把解决结果打成 git bundle(前置提交 = agent 当时基于的 head),与报告文件一起上传为 run artifact,并以 job 输出暴露 decisionpr_number、agent 步骤结果和 prepare 阶段的 ref。publish-resolutionneeds: resolve-pralways() && decision == 'run')全新检出、下载 artifact、从 GitHub 重新拉取 base 与 PR head ref、把比较用的 ref 钉到 agent 当时基于的 head(PR head 已移动时按 SHA 拉取)、git bundle verify 并导入 bundle、要求解决提交必须派生自该 head,之后才运行原封不动的 Resolution check 守卫与 Report result 推送/评论。artifact 缺失(agent job 被取消或崩溃)作为基础设施故障上报。两个 job 都持有 qwen-pr-head-write-<pr> 锁。早前轮次加的 job 内清洗、.git 守卫和 BASH_ENV/LD_* 钉子一并移除而非继续扩充。

测试:契约钉子移到 publish job,并改为断言结构本身(agent 步骤之后的 resolve-pr 不含 secrets.publish-resolution 没有 agent、没有 CLI 安装;带 token 的步骤只在那里;artifact 名字两边一致;verify → 导入 → 谱系的顺序;两个 job 都在一次性托管 runner 上);一个 fixture 测试把真实的 Package resolutionResolution check run 块跑在裸 origin、agent 侧克隆和全新 publish 侧克隆上——正常路径、不派生自 head 的 bundle、前置提交未知的 bundle、干净 base 上的 no-op 及其在仍冲突 base 上的拒绝、artifact 缺失、bundle 里夹带越界文件。调用接线(--prompt--auth-type)、set +e/set -e 包裹、四个诱饵与 settings 文件删除顺序也都钉住。

为什么需要

统计了该命令上线以来的全部 /resolve 请求(2026-06-25 → 08-27,323 个 PR 上 839 条,与 bot 的 <!-- qwen-resolve-result --> 结果评论配对,失败 run 再拉 job 日志归因):自 2026-08-15 起 81 次 agent 运行 0 次成功,而此前 273 次 agent 运行的推送成功率是 84%。这 81 次失败没有一次是模型看过冲突之后失败的:

  • 14 次,08-15 → 08-16: @qwen-code/qwen-code@latest 解析到 0.21.12,而 npm 报 No matching version found,action 的安装步骤直接挂掉。钉版本后不再依赖当时的发布流水线状态;0.21.10 是在这条 job 上有实测记录的最后一个版本(08-12 当天 19 次请求 16 次推送成功)。
  • 24 次,08-17 → 08-26: fix(ci): stop dropping agent settings in resolve and follow-up workflows #9252settings_json 改成 settings,让上线以来一直被静默丢弃的这段配置第一次生效——包括 "sandbox": true。CLI 于是尝试进入 ghcr.io/qwenlm/qwen-code:<cli 版本> 镜像,因为版本镜像滞后于 npm 发布而在 manifest unknown 上挂掉(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 记录了 0.22.0 的情况;0.21.13、0.22.1 也一样)。
  • 40 次,08-16 → 08-27: 镜像存在时,沙箱内的 agent 没有任何输出,直到 120 分钟 job 超时被取消;之后 artifact 步骤里的 git status 显示 merge 根本没开始。

历史上所有推送成功的 /resolve 都是在容器外跑的;所有进过容器的都失败了。但关掉沙箱也就去掉了唯一把 agent 写入与带凭据推送所在 runner 隔开的东西。本 PR 第 2–5 轮评审用探针证明 job 内清洗关不住这个面:git config 各层与 hooks、被 gitfile 替换的 .git、被移动的 ref、PATH 垫片、写入真实 $GITHUB_ENV(诱饵挡不住磁盘上的发现)、小写代理变量、GIT_TRACE、用 FIFO 冒充命令文件、BASH_FUNC_* 导出,以及读取推送步骤 /proc/<pid>/environ 的脱离进程——最后这一个任何清洗都碰不到。第 5 项就是结构性答案:agent 一旦启动,其 runner 上就不再运行任何带凭据的步骤。

120 分钟的 job 超时从未终止过一次健康的 run(历史上 294 次产出解决结果的请求,从请求到结果评论 p95 41 分钟、p99 70 分钟,只有两次超过 75),因此步骤级 75 分钟既保住长尾又把挂死的代价砍掉三分之一。另外,失败评论此前不区分"agent 根本没启动"和"agent 放弃了",导致这次故障期间对同一个坏掉的安装重试了 13 天(08-21、08-24 各 13 次);新措辞明确说明在 run 里的原因修复之前,再次请求会以同样方式失败。

评审验证方案

如何验证

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js scripts/tests/qwen-autofix-workflow.test.js scripts/tests/ci-flaky-rerun-workflow.test.js scripts/tests/qwen-pr-review-workflow.test.js scripts/tests/workflow-size.test.js → 全部通过(resolve 文件 33 个,含双 runner fixture 测试)。
  • node --test --test-name-pattern='resolve-pr|agent settings|follow-up|resolve jobs|publishes' .github/scripts/qwen-triage-workflow.test.mjs → 10 通过;node --test .github/scripts/ci-runner-routing.test.mjs .github/scripts/resolve-sandbox-image.test.mjs → 53 通过。(triage 文件里 "flakiness gate — behavioral" 套件依赖 GNU timeout,macOS 没有,在 origin/main 上同样失败;CI 的 Linux 腿会跑。)
  • 两个 job 的每个 run: 块去掉 ${{ }} 表达式后通过 bash -n;workflow 能被 js-yaml 解析;bash .github/scripts/check-workflow-size.sh 通过。
  • 变异检查,每项预期变红:去掉谱系检查(git merge-base --is-ancestor)、git bundle verify、head 钉定(git update-ref "$HEAD_FETCH_REF" "$HEAD_SHA")或 artifact 缺失分支,fixture 测试分别有 2、2、2、1 个用例变红;把推送挪回 resolve-pr 或在 agent 步骤之后加 secrets. 引用使结构测试变红;"sandbox": falsetrueQWEN_CLI_VERSION'latest'、只改步骤 timeout-minutes 不改 AGENT_TIMEOUT_MINUTES 各使其钉子变红。
  • 合入后,在一个有冲突的 PR 上发第一条 @qwen-code /resolve 才是真正的检验:预期 resolve-prUpload run artifacts 结束且 artifact 里有 resolution.bundlepublish-resolution 日志先出现 git bundle verify 再是各项守卫,结果评论要么是推送成功,要么是 agent 自己写的 failure.md

证据(改动前后)

改动前——08-15 之后每一次 /resolve 都是 run 日志里的三种形态之一(105 个失败 run 已分类;08-15 以来的 81 个为 14 / 24 / 40,另有 3 个日志丢失/其他):

npm error notarget No matching version found for @qwen-code/qwen-code@0.21.12.        ← 08-15 → 08-16
hopping into sandbox (command: docker) ...
Checking for sandbox image: ghcr.io/qwenlm/qwen-code:0.22.0
Error response from daemon: manifest unknown
Fatal error: Failed to relaunch the CLI process.                                       ← 08-17 → 08-26
##[error]The operation was canceled.  (duration_ms=7160109, no agent output)           ← 08-16 → 08-27

按月,agent 运行数 → 推送成功数:6 月 34 → 28(82%),7 月 208 → 175(84%),08-01..14 31 → 27(87%),08-15..27 81 → 0。

改动后——新测试里的双 runner fixture(真实 git,跑的是 workflow 自己的 run 块):

(a) 基于 agent 当时 head 的 bundle          → outcome=fixed,publish 侧 HEAD == agent 的解决提交
(b) 只基于 main 构造的 bundle               → "does not descend from the PR head" → outcome=failed
(b2) 前置提交只存在于 agent 本地的 bundle    → "does not verify against the PR head" → outcome=failed
(c) 无 bundle + no-action.md,base 干净      → outcome=noop;对仍冲突的 base → "still has merge conflicts"
(d) 没有 artifact 目录                       → outcome=failed,failure_kind=infra
(e) bundle 内夹带越界文件                    → "Agent modified files outside the conflict set" → outcome=failed

真实运行:合入前无法实测(workflow 从默认分支运行)。

测试平台

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

环境(可选)

仅单元测试(node --test、带真实 git fixture 的 vitest);GitHub 数据通过 gh api 获取。

风险与范围

  • 主要风险或取舍:agent 在托管 runner 上不带容器运行,与历史上每一次成功 run 相同;agent 一旦启动其 runner 即视为不可信:能离开它的只有 artifact(bundle + 报告文件,下游校验/消毒)和 agent 运行前由 runner 记录的步骤输出。多一个 job 每次多约 30 秒的 runner 启动。若 agent job 在 prepare 完成前被取消,publish-resolution 会被跳过且不发评论(旧的单 job 形态会发);此后的取消由 artifact 缺失路径覆盖。钉 CLI 版本意味着 /resolve 在有人主动升级前不会拿到新 CLI 版本,这与 uses: 钉 SHA 是同一种取舍。
  • 未验证 / 不在范围内:沙箱内的 agent 为什么会挂死(取消前没有捕获到任何输出)——留作重新启用沙箱的前置条件。真实的 head 变动 run。head 变动后的推送重试、提前检测 maintainerCanModify、连续失败告警分别在 fix(ci): recover /resolve requests lost to moved heads, fork pushes, 503s and drafts #10429ci: watch /resolve for consecutive failures and file a tracking issue #10439;本 PR 合入后 fix(ci): recover /resolve requests lost to moved heads, fork pushes, 503s and drafts #10429 的重放会挪进 publish-resolution
  • 破坏性变更 / 迁移说明:对用户无;"agent 未运行"情形的结果评论措辞有变化;/resolve 的 run 现在显示两个 job。

关联 Issue

相关:#9898#9961(镜像缺失那一半)、#9252(激活该配置块的改动)。

…ersion

Every /resolve since 2026-08-15 has failed before the agent looked at the
conflict: 0 of 81 agent runs pushed a resolution, against 84% of the 273
runs before that date. Three causes, none of them the model:

- 14 runs: `@qwen-code/qwen-code@latest` pointed at an unresolvable 0.21.12
  and the action's npm install died on `notarget`.
- 24 runs: #9252 made the settings block take effect for the first time,
  `"sandbox": true` with it; the CLI hopped into the versioned ghcr image,
  which lags the npm release, and died on `manifest unknown` (#9898).
- 40 runs: with the image present the sandboxed agent produced no output
  until the 120-minute job timeout; the merge had not even started.

No sandboxed /resolve run has ever pushed a resolution and every pushed one
ran outside the container, so pin tools.sandbox to false, pin the CLI to
0.21.10 (the last version with a measured record on this job), give the
agent step a 75-minute timeout (p99 is 70), and when the step ends without
outcome=success report it as an infrastructure failure that a re-run will
repeat, instead of the generic "did not complete successfully" that read
as the model giving up and drew 13 days of re-runs.

The two contract tests that pinned sandbox: true now pin false; new tests
pin the exact-semver version input, the step timeout mirrored into the
comment, and the infra-failure wording.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

⚠️ Qwen Triage ended earlyview run. It stopped before finishing; check the run log.

⚠️ Qwen Triage 提前结束 —— 查看运行。未跑完,请查看运行日志。

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run at head 4fb0c449 (triggered by @qwen-code /triage). Five substantive commits landed since the last gate pass at f745f9db — the round-4 containment fixes (c5a45e55), the two-job credential split (af381c10), the invocation-wiring pins (1d7b829d), the stale-resolution guard (4fb0c449) and one unrelated-reformat drop (91678f0f) — plus four main-merges. The gate assessment itself still passes, with one new flag under Approach.

  • Template looks good ✓
  • Problem: observed, not theoretical — unchanged and it bears repeating: /resolve went from 84% pushed (273 agent runs) to 0 of 81 in a row from 2026-08-15, with every failure classified into one of three infrastructure shapes (unresolvable latest version, missing versioned sandbox image, silent sandbox hang), corroborated by 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, Sandbox entry in CI lanes should fail with an actionable missing-image error #9961 and merged fix(ci): stop dropping agent settings in resolve and follow-up workflows #9252.
  • Direction: aligned. Restores a maintainer tool that has been down for two weeks; CI configuration, not product surface. The sandbox-off + credential-handling surface is exactly the kind of thing this gate normally escalates — but it has been the subject of seven review rounds on this very PR and the author is a repo admin driving it, so escalating to the author would be circular; recorded here instead.
  • Size: no core-module paths. ~504 production lines (495 resolve workflow + 7 followup bot + 2 size-baseline) vs ~956 test lines — under the 1000-line advisory. The growth across review rounds is nonetheless real (the review lane measured 142 → 658 source diff lines, ~4.6x), and the two Criticals currently open both originate in the two newest increments — see Approach.
  • Approach: the core maps 1:1 to the observed failures (pinned install, sandbox off, infra-failure reporting), and the two-job split is the structural answer the containment reviews prescribed. What gives me pause is the fix-on-fix accretion at the tail: the run_attempt artifact suffix that fixed round 6's R6-2 broke failed-jobs re-runs, and the followup-bot version pin is inert on the lane it was added for (both verified in Stage 2). Genuine question, not a block: if making the pin real on the ECS lane costs more than it's worth, rewriting that hunk to document the true contract (fleet binary authoritative there) is the simpler move.
  • Risk: no high-risk-path match in the changed files; no elevated risk signals.

Moving on to code review — which at this head confirms the two Criticals above. 🔍

中文说明

在 head 4fb0c449 上重跑(由 @qwen-code /triage 触发)。自上次门禁通过(f745f9db)以来有五个实质提交——第 4 轮隔离修复(c5a45e55)、双 job 凭据拆分(af381c10)、调用接线钉子(1d7b829d)、防过期解决结果守卫(4fb0c449)以及一次无关重排清理(91678f0f)——外加四次 main 合并。门禁结论本身仍然通过,仅方案一项新增一个提醒。

  • 模板完整 ✓
  • 问题:已观测到的事实,不是理论性担忧——结论不变,值得重申:/resolve 从 84% 推送成功(273 次运行)自 2026-08-15 起跌到连续 81 次 0 成功,每次失败都被归入三种基础设施形态(latest 解析到不可安装版本、版本化沙箱镜像缺失、沙箱内静默挂死),并有 Sandbox image for 0.22.0 never published: v0.22.0 image build failed (ETXTBSY) and was not retried, breaking sandbox-based CI lanes #9898Sandbox entry in CI lanes should fail with an actionable missing-image error #9961 与已合并的 fix(ci): stop dropping agent settings in resolve and follow-up workflows #9252 佐证。
  • 方向:对齐。恢复一个已停摆两周的维护者工具;属于 CI 配置而非产品面。关闭沙箱 + 凭据处理这类改动通常是门禁要上报的类型——但本 PR 已经过七轮评审,且作者本人就是驱动它的仓库管理员,上报给作者本人没有意义,故在此记录而不上报。
  • 规模:未触及核心模块路径。生产代码约 504 行(495 行 resolve workflow + 7 行 followup bot + 2 行 size-baseline),测试约 956 行——低于 1000 行建议线。但评审轮次间的增长是真实的(审查链路实测源码 diff 142 → 658 行,约 4.6 倍),且当前两个未关闭的 Critical 都出自最新的两次增量——见"方案"。
  • 方案:核心改动与已观测失败形态一一对应(钉版本安装、关闭沙箱、基础设施故障上报),双 job 拆分也是隔离评审所要求的结构性答案。让人迟疑的是尾部的"修复之上叠修复":修复第 6 轮 R6-2 的 run_attempt artifact 后缀弄坏了"重跑失败的 jobs",followup bot 的版本钉在它要保护的链路上是无效的(两者都在 Stage 2 中核实)。一个真诚的问题,不是阻断:如果让钉在 ECS 链路上真正生效的代价大于收益,把那段改成如实记录真实契约(该链路上以集群预装版本为准)是更简单的做法。
  • 风险:改动文件未命中高风险路径;无升级风险信号。

进入代码审查——在本头上确认了上述两个 Critical。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run at head 4fb0c449. Independent proposal first, then the comparison: pin the CLI install at a known-good version; turn the container sandbox off (every run that ever pushed a resolution ran outside it); report infrastructure failures as such instead of agent verdicts; and — because no-sandbox removes the isolation between the agent and the credentialed push — move the push into a job that never ran the agent, handing the resolution over as a verified artifact. That is the shape this PR landed, and it is the right one. What follows was checked against the files at this SHA, not the commit messages.

The structural core verifies clean at this head:

  • resolve-pr holds no secrets. after the agent step — the sole exception, 'Report skipped request', is gated on decision being skip/unsupported/failed, i.e. it only runs when the agent never did. 'Package resolution' and 'Upload run artifacts' are token-free.
  • publish-resolution starts from a fresh checkout, fetches the base and PR-head refs from GitHub itself, pins the comparison ref to the prepare-time head SHA (fetched by SHA if the PR head moved), git bundle verifys and imports the agent's bundle, requires the resolution to descend from that head, then runs the scope guard and the push. The push token lives only in this job, and the push is hookless with a force-with-lease pinned to the recorded head.
  • The agent step carries timeout-minutes: 75 with its percentile basis in the comment, a direct invocation inside a stop-commands window with decoyed runner command files, settings written to a per-run QWEN_HOME, and tools.sandbox: false with the incident history recorded inline.
  • Round 6's R6-1 (the double-quoted if: "${{ always() }}" lines that failed yamllint) is fixed — both sites are single-quoted at this head.

Two Criticals remain open at this head. Both independently verified here, not taken on faith from the review lane:

  1. The -attempt-N artifact name breaks GitHub's "Re-run failed jobs" for publish-resolution (round 7's R6-2, fix-induced). Traced end to end at this SHA: attempt 1 — the agent succeeds and uploads qwen-resolve-pr-N-attempt-1, the publish-side push fails (say workflow_scope), and the comment tells the maintainer to fix the cause and re-run. They click "Re-run failed jobs": run_attempt becomes 2, but resolve-pr is not re-executed, so nothing ever uploads …-attempt-2. 'Download run artifacts' (a by-name, continue-on-error download) finds nothing and creates no directory; 'Resolution check' falls into the no-artifact branch and writes outcome=failed + failure_kind=infra with the carried-over agent_outcome=success; 'Report result' posts "the agent step ended with outcome=success before producing a result … Requesting /resolve again will fail the same way until the cause … is fixed" — false on every clause — and the resolution stays unpublished. Every further failed-jobs re-run repeats it; only "Re-run all jobs" escapes. At the merge base the push lived in the agent's job, so a failed-jobs re-run re-ran the whole chain and recovered — the two-job split plus the attempt-suffixed name is what wedges it. The fix needs publish-side partial-rerun awareness: on RESOLVE_OUTCOME=success with the current-attempt artifact missing, pattern-download the latest qwen-resolve-pr-<pr>-attempt-* artifact and verify/publish it, or emit a distinct failure_kind whose comment says the agent succeeded and instructs "Re-run all jobs".

  2. The follow-up bot's qwen_cli_version: '0.21.10' pin is a dead switch on its primary lane (round 7's R7-1). Verified against the pinned action source at 05f8171: its 'Install Qwen Code' step opens with if command -v qwen … ; then "Qwen Code already installed, skipping install" — when qwen is on PATH the version input is never consulted. The follow-up job routes to the self-hosted ecs-qwen pool by default, and update-ecs-runner-qwen.yml maintains the fleet binary at @qwen-code/qwen-code@latest — so on the primary lane the bot runs the fleet version, and the pin only bites on the ubuntu-latest fallback. The diff comment's "the pin wins" and the new contract test (a /^\d+\.\d+\.\d+$/ match on the YAML value) certify that false claim green. The two honest fixes: install the pinned version ahead of the fleet binary on the ECS lane, or rewrite the comment and test to state the real contract — fleet version authoritative on ecs-qwen, pin effective only on the fallback lane.

Testing — the PR's own CI at this commit; I run none of this PR's code myself. The Qwen Code CI run on this head is on attempt 2 after a re-run; the unit Test (ubuntu-latest) job restarted at 07:16 UTC and was still in flight at review time. Everything completed so far is green, including the yamllint-carrying suite's siblings; the two Test-dependent checks (web-shell E2E Smoke, Post Coverage Comment) have not started yet. I don't poll — the table below is a snapshot and the finalize job updates it when CI lands.

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

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

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

On sandboxed verification: the two open Criticals are static logic defects — a YAML wiring interaction and an action install-step branch — and both are settled by reading the code at this SHA plus the pinned action's source, as done above; no /verify or /tmux lane would move them. The one claim no pre-merge lane can settle is inherent to the change — workflows execute from the default branch, so the first real /resolve on a conflicted PR after merge remains the genuine check (absent hopping into sandbox in the step log, install line reads @qwen-code/qwen-code@0.21.10, result comment is a pushed resolution or the agent's own failure.md). Nothing user-visible in the TUI, so no local real-scenario run applies.

中文说明

在 head 4fb0c449 上重跑。先写独立方案再对照:把 CLI 安装钉在有实测记录的版本;关闭容器沙箱(历史上所有推送成功的运行都在容器外);把基础设施故障如实上报而不是冒充 agent 的判断;并且——关掉沙箱就去掉 agent 与带凭据推送之间的隔离——把推送挪进一个从未运行过 agent 的 job,解决结果以经过校验的 artifact 交接。这正是本 PR 落地的形态,也是正确的形态。以下均对照本 SHA 的文件核实,不是照抄提交信息。

结构性核心在本头上核实无误:

  • agent 步骤之后的 resolve-pr 不含任何 secrets.——唯一例外 'Report skipped request' 以 decision 为 skip/unsupported/failed 为前提,即只在 agent 没有运行时执行。'Package resolution' 与 'Upload run artifacts' 均不带令牌。
  • publish-resolution 从全新检出开始,自行从 GitHub 拉取 base 与 PR head ref,把比较用的 ref 钉到 prepare 阶段记录的 head SHA(PR head 已移动时按 SHA 拉取),git bundle verify 校验并导入 agent 的 bundle,要求解决提交派生自该 head,再跑越界守卫与推送。推送令牌只存在于这个 job,推送禁用钩子并以 force-with-lease 钉在记录的 head 上。
  • agent 步骤带 timeout-minutes: 75 且注释写明分位数依据,直接调用包在 stop-commands 窗口内并对 runner 命令文件做了诱饵化,settings 写入每次运行独立的 QWEN_HOMEtools.sandbox: false 连同事故记录一起内联写明。
  • 第 6 轮的 R6-1(yamllint 拒绝的双引号 if: "${{ always() }}")已修复——本头上两处均为单引号。

本头上仍有两个未关闭的 Critical,均已在此独立核实,不是照搬审查链路的结论:

  1. -attempt-N artifact 命名破坏了 publish-resolution 的"重跑失败的 jobs"(第 7 轮 R6-2,修复引入)。在本 SHA 上端到端追过:第 1 次尝试——agent 成功并上传 qwen-resolve-pr-N-attempt-1,publish 侧推送失败(如 workflow_scope),评论让维护者修复原因后重跑。维护者点"重跑失败的 jobs":run_attempt 变为 2,但 resolve-pr 不会重新执行,因此永远不会有 …-attempt-2 上传。'Download run artifacts'(按名下载、continue-on-error)找不到任何东西也不创建目录;'Resolution check' 落入无 artifact 分支,在携带的 agent_outcome=success 下写出 outcome=failed + failure_kind=infra;'Report result' 发布 "the agent step ended with outcome=success before producing a result … Requesting /resolve again will fail the same way"——每一句都不成立——解决结果保持未推送。之后每次"重跑失败的 jobs"都会重复;只有"重跑所有 jobs"能逃脱。合并基线上推送与 agent 同在一个 job,重跑失败 jobs 会重跑整条链路并恢复——正是双 job 拆分加 attempt 后缀的命名使其卡死。修复需要 publish 侧感知部分重跑:RESOLVE_OUTCOME=success 而当前尝试的 artifact 缺失时,按模式下载最新的 qwen-resolve-pr-<pr>-attempt-* 并校验/发布,或输出独立的 failure_kind,其评论说明 agent 已成功并指示"重跑所有 jobs"。

  2. follow-up bot 的 qwen_cli_version: '0.21.10' 钉在其主链路上是无效开关(第 7 轮 R7-1)。对照钉住版本 05f8171 的 action 源码核实:其 'Install Qwen Code' 步骤开头是 if command -v qwen … ; then "Qwen Code already installed, skipping install"——qwen 在 PATH 上时版本输入根本不会被读取。follow-up job 默认路由到自托管 ecs-qwen 池,而 update-ecs-runner-qwen.yml 把集群二进制维持在 @qwen-code/qwen-code@latest——因此主链路上 bot 跑的是集群预装版本,钉只在 ubuntu-latest 兜底链路上生效。diff 注释里的 "the pin wins" 与新增契约测试(对 YAML 值做 /^\d+\.\d+\.\d+$/ 匹配)把这个不成立的结论认证为绿。两个诚实的修法:在 ECS 链路上把钉住版本装到集群二进制之前/之上,或把注释与测试改写为真实契约——ecs-qwen 上以集群版本为准,钉只在兜底链路生效。

测试——本提交上 PR 自己的 CI;我本人不运行这个 PR 的任何代码。 本头上的 Qwen Code CI 在重跑后处于第 2 次尝试;Test (ubuntu-latest) 单测 job 于 07:16 UTC 重新开始,审查时仍在运行。目前已完成的全部为绿(包括携带 yamllint 的套件的同族检查);两个依赖 Test 的检查(web-shell E2E Smoke、Post Coverage Comment)尚未开始。不做轮询——下表是快照,CI 落定后由 finalize job 更新。

关于沙箱化验证:两个未关闭的 Critical 都是静态逻辑缺陷——一处 YAML 接线交互、一处 action 安装步骤分支——靠阅读本 SHA 的代码加钉住版本的 action 源码即可定论(上文已做),/verify/tmux 都改变不了结论。唯一无法在合并前由任何链路定论的是改动本身的性质——workflow 从默认分支执行,因此合并后对冲突 PR 的第一次真实 /resolve 仍是真正的检验(步骤日志中不再出现 hopping into sandbox,安装行读作 @qwen-code/qwen-code@0.21.10,结果评论是推送成功的解决结果或 agent 自己的 failure.md)。TUI 上无用户可见变化,故不适用本地真实场景运行。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 2/5 — the structural split is right and verifies clean, but two independently confirmed Criticals stand on this head, and both come from the two newest increments.

Stepping back: measured against the proposal I would have written from the incident data alone — pin the install, drop the container, report infra failures honestly, and move the credentialed push onto a runner the agent never touches — this PR's shape is the right one, and the two-job split closes the round-2-through-5 containment body of work by construction rather than by another denylist. That part I would defend. What I cannot sign is the tail: the run_attempt suffix that fixed round 6's R6-2 wedges "Re-run failed jobs" with a self-contradictory comment and no push retry, and the follow-up bot's version pin is inert on the ECS lane it was added for while a shape-only test certifies it green. Both I re-derived from the files at this SHA and the pinned action's source — they are not review-lane hearsay. Green suites that do not pin the behavior they claim are exactly the failure mode this gate exists to catch, and two of them in the same head is not a coincidence to smooth over.

The pattern deserves naming too: seven review rounds, a diff that grew ~4.6x, and findings that keep regenerating in the same cluster — the review lane's advisory that a human should re-weigh whether the shape is still right before more fix-on-fix is fair. My own read: the shape is right, the last two increments are not, and their fixes are small and bounded (partial-rerun-aware publish; pin-or-document for the follow-up bot). If the ECS-lane pin cannot be made real cheaply, cutting that hunk to an honest contract is the simpler move.

Verdict: request changes. Practically: this bot's round-7 /review already stands as CHANGES_REQUESTED on exactly this commit, and the API can neither edit reviews nor usefully stack duplicates of one that already gates the PR — so no new review here, and this comment records that the gate's independent pass agrees with that review on both Criticals. Nothing is approved at this head, and no approve-on-green marker is emitted: the verdict isn't approve, and the unit suite is still in flight on attempt 2 regardless. Once both fixes land with witnesses, the rest of this PR verifies clean, and approval follows on green CI.

中文说明

置信度:2/5——结构性拆分方向正确且核实无误,但本头上有两个经独立核实的 Critical,且都出自最新两次增量。

退一步看:如果只凭事故数据写方案——钉住安装版本、去掉容器、如实上报基础设施故障、把带凭据的推送挪到 agent 从未接触过的 runner——本 PR 的形态正是如此,双 job 拆分以构造性方式(而非又一张拒绝清单)关闭了第 2 至第 5 轮的隔离问题。这部分我为它背书。但我不能签字的是尾部:修复第 6 轮 R6-2 的 run_attempt 后缀让"重跑失败的 jobs"卡死在一条自相矛盾的评论上且不重试推送;follow-up bot 的版本钉在它要保护的 ECS 链路上无效,而一个只匹配形状的测试把它认证为绿。这两条都是我从本 SHA 的文件和钉住版本的 action 源码重新推导出来的,不是审查链路的转述。绿套件没有钉住它所声称的行为,正是这道门禁要拦的失败形态;同一个头上出现两次,不是可以轻轻带过的巧合。

模式本身也值得点名:七轮评审、约 4.6 倍增长的 diff、不断在同一簇再生的发现——审查链路"在继续修复叠修复之前,应由人重新衡量整体形态是否仍然正确"的建议是合理的。我的判断:形态是对的,最后两次增量不对,且它们的修复小而有限(publish 侧感知部分重跑;follow-up bot 要么真钉住要么如实记录)。如果 ECS 链路上的钉无法低成本生效,把那段砍成诚实的契约是更简单的做法。

判定:要求修改。实际操作上:本 bot 第 7 轮 /review 已经以 CHANGES_REQUESTED 钉在同一个提交上,API 既不能编辑评审、也不宜在已有同等门禁时再叠一份——因此不再提交新评审,本评论记录门禁独立复核与该评审在两个 Critical 上结论一致。本头不予批准,也不发出 approve-on-green 标记:判定不是批准,且单测在第 2 次尝试中仍在运行。两个修复带着见证落地后,本 PR 其余部分核实无误,批准将随 CI 转绿而来。

Qwen Code · qwen3.8-max

Reviewed at 4fb0c4490a6eaf867dde0aec5a399993dfc22c03 · 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 mechanical point — see the review notes above. 🙏 The workflow-size gate is red on this commit: the new comments grow qwen-code-pr-review.yml ~7.5 KB past its recorded baseline (4 KB allowance) and .size-baseline is untouched. Bump that line in this PR and say why (or move some prose to a sibling .md), ideally with the three stale sandbox-containment comments aligned too — then CI will finally run the tests that pin the change. Everything else checks out.

就一点机械性问题请求修改,详见上方审查意见。🙏 本提交上 workflow 体积门禁是红的:新注释让 qwen-code-pr-review.yml 超出记录基线约 7.5 KB(容差 4 KB),而 .size-baseline 未更新。请在本 PR 里更新该行并说明原因(或把部分注释移到 sibling .md),最好顺带对齐三处过时的沙箱隔离注释——之后 CI 才会真正运行钉住该改动的测试。其余均已核实无误。

@wenshao

wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 28, 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-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.

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

  • R1-3 three stale sandbox-containment comments (~2794, ~2800-2801, ~2927) — already reported (triage review 5053859162, comment 5456134264, non-blocking item 3)

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory; @qwen-code/qwen-code@0.21.10no such file or directory.

中文说明

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

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

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory; @qwen-code/qwen-code@0.21.10no such file or directory

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

Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread scripts/tests/qwen-resolve-workflow.test.js Outdated
Comment thread scripts/tests/qwen-resolve-workflow.test.js Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

  • R1-3 three stale sandbox containment comments (~2794, ~2800-2801, ~2927) — already reported (triage review 5053859162, comment 5456134264, non-blocking item 3; recorded in round-1 review 5054818149)
  • R1-4 follow-up bot still follows npm latest — already reported (round-1 comment 3883806880)
  • R1-5 75-minute tail percentiles not reproducible from the PR — already reported (round-1 comment 3883806890)
  • R1-6 unordered toContain pins none of the infra-branch structure (four surviving mutants measured) — already reported (round-1 comment 3883806896)
  • R1-7 toBeLessThan(120) hardcodes the job ceiling — already reported (round-1 comment 3883806904)

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory; @qwen-code/qwen-code@0.21.10no such file or directory.

中文说明

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

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

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory; @qwen-code/qwen-code@0.21.10no such file or directory

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

Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml
@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

… sandbox mentions

The settings-block rationale for tools.sandbox=false and the version pin
grow qwen-code-pr-review.yml by ~7.5 KB, past the 4096-byte ratchet;
the growth is the incident record itself, so bump the baseline.

Two comments on the scope guard still named the sandbox as part of the
containment story; align them with the settings block (write
authorization + no agent token + ephemeral runner).
@wenshao

wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #10428 deep verification — fix(ci): run /resolve without the container sandbox and pin its CLI version

Verdict: merge-ready — 697/697 scripted assertions passed, 0 unexpected failures. The central
load-bearing change is proven by an A/B against the base build, the changed surface is exercised by
mock-free replay harnesses, and every new/changed test is proven non-vacuous by a mutation matrix.

  • Verified head OID: git rev-parse HEAD^2a2aba41d0397d81865cf808b21d5d41c8bc57b84
  • Base (control) OID: HEAD^1a268b7d1754bf7856fa74ce464a7dce5a59dff41
  • Merge commit: 3fe1b3fc65… (depth-2 CI merge-ref checkout; effective diff = git diff HEAD^1..HEAD)
中文摘要

结论:merge-ready。697/697 条脚本化断言全部通过,0 个非预期失败。

  • A/B 结论:对 resolve-pr job 的核心改动做了基线对照。结构化 A/B(解析两侧 YAML)证实三处
    load-bearing 翻转:tools.sandbox true→falseqwen_cli_version 缺失(跟随 npm latest)→0.21.10
    agent 步骤 timeout-minutes 缺失(仅有 job 级 120)→75settings 结构其余部分未变。行为化 A/B
    (逐字抽取 run: 块、bash --noprofile --norc 重放、stub 掉 gh/git)证实:基建失败措辞在
    FAILURE_KIND=infra 时从笼统的 "did not complete successfully" 翻转为 "not a verdict / 重跑仍会同样失败",
    其余 5 类场景(失败带 failure.md / noop / dry-run / 推送 / 无文件的 failed)两侧逐字节相同——无措辞回归。
  • findings:无阻断项。两条非阻断观察(见 Findings):超时对与 failure_kind 仅由 vitest 文件钉住
    (与作者测试计划的分工一致,属覆盖位置说明而非缺陷);以及一次由我方 harness 自身引入又修复的断言错误
    (与 PR 无关,见 Methodology)。
  • 未覆盖范围:真实生产 /resolve 端到端运行(离线不可复现,需合并后首次真实调用);作者引用的线上
    事故统计(84%→0/81、p95/p99 等)无法离线独立核验,仅作为动机;0.21.10 在合并时是否可从 npm 解析、
    以及第三方 action 运行时是否真正消费这两个输入(已用仓库文档 + 兄弟 workflow 佐证输入名有效,但未实际运行
    action 本体);yamllint(容器内 pip3 无权限安装,已用 actionlint + shellcheck + bash -n 替代)。

Central claim + A/B

Central claim: restore @qwen-code /resolve to a working state by (1) taking the agent out of the
container sandbox (tools.sandbox: false), (2) pinning the CLI to an exact version
(qwen_cli_version: '0.21.10') instead of the npm latest dist-tag, and (3) bounding the agent step
(timeout-minutes: 75) and reporting a non-success exit as an infrastructure failure (failure_kind=infra)
rather than as a model verdict.

This is a workflow/CI PR, so unit tests are not the primary oracle. The A/B below is a structural parse
of both workflow revisions plus a verbatim behavioral replay of the changed run: blocks.

Table A — structural A/B (parsed with: inputs of the Resolve conflicts step)

input base HEAD^1 head HEAD^2 oracle
settings.tools.sandbox true false parsed YAML → JSON
with.qwen_cli_version (absent → action default latest) '0.21.10' parsed YAML
step timeout-minutes (absent → job-level 120) 75 parsed YAML
settings top-level keys model, tools model, tools unchanged

Reproduce:
node -e '…parse both revisions, print step.with…' (see logs/, harness/extract-blocks.mjs). The
version pin is a real, respected input of the pinned action SHA: the repo's own integration doc lists
qwen_cli_version (default latest, accepts an exact version), and sibling workflows pass it to the
same action SHA — qwen-ci-flaky-rerun.yml pins qwen_cli_version: '0.19.9', qwen-triage.yml passes
a computed version.

Table B — behavioral A/B of Report result (verbatim replay, gh/git stubbed)

scenario (env) base comment head comment
OUTCOME=failed FAILURE_KIND=infra RESOLVE_OUTCOME=failure "…attempted to resolve…but the run did not complete successfully." + "Check the [workflow run]…" "…could not run conflict resolution…outcome=failure…the step's 75-minute timeout. This is not a verdict…Requesting /resolve again will fail the same way…"
OUTCOME=failed FAILURE_KIND=infra RESOLVE_OUTCOME=cancelled generic same infra wording with outcome=cancelled
OUTCOME=failed + failure.md (no infra) generic + ### failure.md byte-identical
OUTCOME=noop no-action body byte-identical
OUTCOME=fixed DRY_RUN=true dry-run message byte-identical
OUTCOME=fixed push (stubbed git) pushed message + --force-with-lease=…:<HEAD_SHA> byte-identical
OUTCOME=failed, no files, no infra generic, no sections byte-identical

Witness: evidence/01-ab-report-replay-base-vs-head.png (84 scripted checks, all PASS). The infra
wording flips exactly on the FAILURE_KIND=infra axis and interpolates RESOLVE_OUTCOME and
AGENT_TIMEOUT_MINUTES; every non-infra path is byte-identical, proving the wording change is scoped and
introduces no comment regression. Resolution check cells likewise flip: head writes
outcome=failed and failure_kind=infra to $GITHUB_OUTPUT; base writes only outcome=failed.

Table C — scope-guard containment, behavioral A/A (real scratch git repo)

The PR's risk argument rests on the no-sandbox agent being contained by the Resolution check scope guard.
The diff only edits that step's comments, so this is an A/A — both arms must agree.

scenario base head
accept (in-scope resolution) exit 0, outcome=fixed exit 0, outcome=fixed (stdout byte-identical)
reject (edits a file base never touched) exit 1, outcome=failed, names common.txt exit 1, outcome=failed, names common.txt (stdout byte-identical)

Witness: evidence/03-scope-guard-accept-reject-aa.png (20 scripted checks). The guard fails closed on an
out-of-scope edit and accepts a clean resolution, identically on both arms — the containment the PR relies
on is present and unchanged.

Table D — mutation matrix (vacuity check on the new/changed tests)

Each mutant restores one pin in a scratch worktree; the expectation is a red test. All restorations were
verified byte-identical via SHA-256. Witness: evidence/02-mutation-matrix.png.

mutant expected vitest (qwen-resolve-workflow.test.js) node --test (qwen-triage-workflow.test.mjs)
M1 "sandbox": falsetrue red RED — "pins the core security controls" RED — "agent settings"
M2 qwen_cli_version'latest' red RED — "pins the CLI version…" RED — "agent settings"
M3 step timeout-minutes 75→80 (pair broken) red RED — "…bounds the agent step" green (not pinned here)
M4 delete failure_kind=infra output red RED — "…infrastructure failure, not a verdict" green (not pinned here)
M5 0.21.100.21.11 (negative control) green green green

The unmutated control went green on both suites first, so the kills are meaningful. M5 (still an exact
semver) staying green confirms the tests pin the shape of the pin, not a magic string.

Targeted gates

Witness: evidence/04-gates-vitest-262.png.

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js scripts/tests/qwen-autofix-workflow.test.js scripts/tests/ci-flaky-rerun-workflow.test.js3 files, 262 passed (resolve file: 31 tests, +2 new vs base's 29). Matches the author's claim.
  • node --test --test-name-pattern='resolve-pr|agent settings|follow-up' .github/scripts/qwen-triage-workflow.test.mjs6 passed, 0 fail. Matches the author's claim.
  • node --test .github/scripts/qwen-triage-workflow.test.mjs (full file, Linux leg) → 119 passed, 0 fail. The "flakiness gate — behavioral" suites the author flagged as macOS-only passed here: GNU timeout is present at /usr/bin/timeout on this container.
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js195 passed. The .size-baseline bump is correct: wc -c .github/workflows/qwen-code-pr-review.yml = 173427, exactly matching the recorded 173427 qwen-code-pr-review.yml.
  • Lint on the extracted blocks: bash -n clean and shellcheck clean on all four run: blocks (base+head × verify+report); repo actionlint gate passes (and was proven live — a planted invalid step id was caught, then reverted).

Corrections

None — no prior review round or bot comment needed correcting, and the author's description matches the
code (the settings: vs settings_json: history, the input names, and the timeout pairing all check out).

Findings

No blocking findings. Two non-blocking observations:

  1. (note) Timeout pair + failure_kind are pinned in one file only. The timeout-minutes
    AGENT_TIMEOUT_MINUTES pairing and the failure_kind=infra output are asserted by
    scripts/tests/qwen-resolve-workflow.test.js but not by .github/scripts/qwen-triage-workflow.test.mjs
    (see Table D, M3/M4 green in the node column). This matches the author's own test plan, which assigns
    those pins to vitest — it is a coverage-placement observation, not a defect. Both suites together catch
    every mutant.
  2. (note, self-inflicted, already corrected) Two transient harness failures were mine, not the PR's.
    (i) The first report-replay run reported 1 FAIL ("C6 git not called") because my harness asserted "git
    not called" for the one scenario that legitimately invokes the stubbed git push; fixed by excluding the
    push scenario from that check, re-ran → 84/84. (ii) The first scope-guard run failed 8 checks because
    my fixture committed the resolution on the branch used as HEAD_FETCH_REF, which in production is a
    frozen fetched ref; fixed by detaching HEAD before the agent commit (the harness now asserts that
    invariant), re-ran → 20/20. No PR code was involved in either; final counts reflect the corrected runs.

Not covered

  • Real production /resolve run. The end-to-end "agent resolves and pushes without the sandbox" outcome
    is not reproducible offline (it needs a live @qwen-code /resolve on a conflicted PR after merge, which is
    exactly the author's stated post-merge check). Every offline-verifiable precondition is proven above.
  • Author's production incident statistics (84%→0/81, 839 requests, p95/p99 latencies, the 14/24/40
    failure split). These cannot be independently verified without the GitHub API; treated as motivation, not
    verified fact.
  • Whether 0.21.10 resolves on npm at merge time, and whether the third-party action runtime actually
    consumes qwen_cli_version/settings.
    Input names/semantics are corroborated by the repo's integration
    doc and sibling workflows using the same action SHA, but the action itself was not executed here.
  • yamllintpip3 install --user failed (Permission denied) in this container; substituted with
    actionlint + shellcheck + bash -n, all green.
  • Per-commit attribution. The checkout is depth 2: git rev-list HEAD^1..HEAD^2 yields 1 reachable
    commit while the metadata snapshot lists 4 (two are merges of main into the branch), and
    git rev-parse --is-shallow-repository is true — so the intermediate commits are unreachable and the
    verification covers the aggregate HEAD^1..HEAD diff, not each commit separately.
  • Trial merge into current main. Deeper history is unreachable at depth 2; the merge commit already
    incorporates the base tip, and the diff touches only CI/test files, so the residual risk is noted rather
    than measured.

Methodology

Environment: the sandboxed CI verify job (node:22-bookworm), working tree = refs/pull/10428/merge at
depth 2, with npm ci + npm run build already complete. The metadata snapshot's baseRefOid
(5ae363e2…) had drifted behind the checkout; per the merge-ref contract the effective base is HEAD^1
(a268b7d1…), which the merge commit message confirms. Base side came from git show HEAD^1:… and a
scratch git worktree (node_modules symlinked), so the control differs from head only by the PR diff.

How each harness drove the code: harness/extract-blocks.mjs parses both workflow revisions with yaml
and writes the Resolution check and Report result run: blocks verbatim (the single run-URL ${{ }}
expression substituted). harness/report-replay.mjs executes those blocks under bash --noprofile --norc
with stub gh/git on PATH across 7 report scenarios + 2 verify scenarios per arm, asserting exit codes,
$GITHUB_OUTPUT, and byte-equality of the generated report.md. harness/scope-guard-replay.mjs builds a
real scratch git repo (base advances with a conflicting edit + a base-only file, PR head diverges, agent
merge-resolves in-scope or out-of-scope) and runs the extracted guard end-to-end. Mutations ran in
tmp/…/mut-tree with byte-identical restore verified by SHA-256. Raw per-cell stdout/stderr and logs live in
logs/ (01-vitest-3files.log, 03-node-test-full.log, 05-mutation-matrix.log,
06-report-replay.log, 07-scope-guard.log, 09-actionlint.log, 10-shellcheck.log) and cells/.

Assertion accounting (assertions.json, all executed): report-replay 84, scope-guard 20, vitest 3-file gate
262, node --test full triage file 119, workflow-size gate 195, mutation matrix 17 (10 per-suite
killed/green-as-predicted outcomes + 5 byte-identical restores + 2 unmutated-control greens) =
697 pass, 0 fail. The 6-test pattern run is the author's command re-executed and passed; its assertions
are a subset of the 119 and are not double-counted.

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/qwen-triage-workflow.test.mjs: (cd .) node --test ./.github/scripts/qwen-triage-workflow.test.mjs
file scripts/tests/qwen-resolve-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/qwen-resolve-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/qwen-triage-workflow.test.mjs: PPPPP
  scripts/tests/qwen-resolve-workflow.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 1 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 2 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 2 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 3 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 3 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 4 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 4 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 5 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 5 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)

Evidence images

01-ab-report-replay-base-vs-head

02-mutation-matrix

03-scope-guard-accept-reject-aa

04-gates-vitest-262

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.81% 85.81% 91.18% 84.76%
Core 88.91% 88.91% 90.58% 87.32%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.81 |    84.76 |   91.18 |   85.81 |                   
 src               |   86.53 |    82.86 |   88.88 |   86.53 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.22 |    77.73 |   80.76 |   73.22 | ...1345-1349,1476 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   75.07 |    77.54 |   93.73 |   75.07 |                   
  acpAgent.ts      |   74.22 |    77.45 |   93.04 |   74.22 | ...66,13344-13345 
  ...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 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...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.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...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 |   90.92 |    86.34 |   95.73 |   90.92 |                   
  Session.ts       |   90.29 |    85.09 |   95.13 |   90.29 | ...69,13496-13500 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...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.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...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.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  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.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  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    |   86.65 |    80.81 |   94.01 |   86.65 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.56 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.73 |    78.53 |   65.62 |   90.73 |                   
  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.94 |      100 |      50 |   98.94 | 106               
  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.46 |    88.72 |   90.68 |   89.46 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.84 |    96.22 |     100 |   96.84 | ...40-245,303-306 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.72 |    85.81 |   94.33 |   93.72 | ...1305,1312-1313 
  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         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...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  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  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     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.96 |    90.53 |   93.54 |   91.96 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.68 |     97.6 |   94.11 |   94.68 | 269,1334-1372     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  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.41 |    93.96 |   98.73 |   97.41 | ...6570-6614,6874 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  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.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1219,1254-1285 
  ...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 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  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   |   81.27 |    80.45 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  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 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...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.34 |    94.73 |    98.7 |   97.34 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...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 |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  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     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  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.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     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 |    99.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.36 |    89.24 |     100 |   94.36 | ...36,669-670,818 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...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         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  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.09 |     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 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     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.37 |    90.47 |    95.3 |   94.37 |                   
  ...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        |    88.2 |    90.75 |   86.11 |    88.2 | ...2314,2316-2324 
  ...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.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...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.52 |    92.85 |   90.32 |   91.52 | ...1073,1075-1076 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...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 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...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.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...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.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   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/peerMessaging |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 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.72 |    95.47 |     100 |   99.72 |                   
  ...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 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...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.53 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.37 |     85.3 |   90.79 |   87.37 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.21 |     100 |     100 | 737               
  ...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.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...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.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...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 |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  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 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |     85.1 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.06 |    82.04 |   77.03 |   84.06 | ...9492,9510-9514 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   46.92 |     62.5 |   76.92 |   46.92 | ...1058,1070-1093 
  ...-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        |   89.45 |    91.44 |   71.75 |   89.45 | ...3253,3284-3285 
  ...-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.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...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.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...90-591,598-599 
  ...e-remember.ts |   98.31 |    93.31 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.76 |     100 |   89.85 | ...06-207,275-296 
  ...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.72 |     80.5 |   94.53 |   80.72 |                   
  ...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.99 |    77.48 |   93.44 |   75.99 | ...5708,5765-5771 
  index.ts         |   83.61 |    80.67 |   91.22 |   83.61 | ...2465,2551-2552 
  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 |   86.63 |    79.05 |   92.96 |   86.63 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.35 |     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.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.53 |    90.2 |    76.6 |                   
  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 |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...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 |    90.09 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.38 |    81.73 |   95.79 |   86.38 |                   
  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.42 |     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    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |    98.5 |    93.65 |     100 |    98.5 | ...98,600,824-825 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.73 |    83.11 |   94.35 |   86.73 | ...7167,7169-7170 
  sse-events.ts    |   87.01 |    84.95 |   94.44 |   87.01 | ...40-951,954,961 
  ...e-sessions.ts |    86.9 |    80.57 |     100 |    86.9 | ...81-483,486-491 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...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.31 |    80.47 |      90 |   83.31 | ...1055,1060,1067 
  ...extensions.ts |   89.91 |    79.47 |   93.93 |   89.91 | ...2340,2385-2386 
  ...-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.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...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 |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...management.ts |   87.14 |    84.21 |     100 |   87.14 | ...1802,1812-1817 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...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.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...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  |   93.52 |    91.71 |   96.15 |   93.52 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...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 |   88.93 |    84.37 |     100 |   88.93 | ...74,891,954-963 
  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   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |    95.2 |     87.5 |     100 |    95.2 | 191-197           
  ...on-archive.ts |   92.43 |     90.3 |   97.61 |   92.43 | ...1140,1181-1182 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.88 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |     100 |    97.05 |     100 |     100 | 199,252,427       
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.27 |     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 |   89.96 |    87.66 |   91.48 |   89.96 |                   
  index.ts         |   89.62 |    87.32 |   90.24 |   89.62 | ...1411,1424,1438 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    92.7 |    89.68 |   98.13 |    92.7 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...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.45 |     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 | ...96-898,901-903 
 ...s/housekeeping |   93.06 |    88.57 |      95 |   93.06 |                   
  scheduler.ts     |   93.06 |    88.57 |      95 |   93.06 | ...62-364,416-420 
 ...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.6 |    76.66 |      80 |    94.6 |                   
  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 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.65 |    78.58 |   72.18 |   71.65 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...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 |   68.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...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       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |    84.7 |    84.48 |   91.66 |    84.7 |                   
  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 |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.75 |    74.02 |   83.33 |   73.75 | ...72-605,616-617 
  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.95 |       80 |     100 |   80.95 | 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 | 95,146            
  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 |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  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.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  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.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...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 |   74.07 |    80.32 |   78.81 |   74.07 |                   
  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 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  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 
  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.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...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 
  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 |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...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           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...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 |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...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 |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  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.71 |    87.78 |   86.53 |   90.71 |                   
  ...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 |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |    96.07 |   76.92 |   92.35 | ...59-361,364-367 
  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  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |   86.34 |    82.18 |    86.6 |   86.34 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  ...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.79 |      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.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.99 |      100 |       0 |    3.99 |                   
  ...gerDialog.tsx |    3.99 |      100 |       0 |    3.99 | 79-137,140-678    
 ...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 |   69.22 |    71.81 |   61.11 |   69.22 |                   
  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    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.27 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  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.49 |    84.45 |   88.88 |   86.49 |                   
  ...dProcessor.ts |   85.53 |     85.2 |     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.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.85 |    85.07 |   85.18 |   88.85 | ...6260,6262,6367 
  ...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 |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |    97.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...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.64 |     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       
  ...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    
  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 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...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 |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  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 |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 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.06 |     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.33 |     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      |   88.05 |    86.01 |   96.15 |   88.05 |                   
  ...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   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  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.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 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-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  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 |    81.09 |     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 |      90 |     87.5 |     100 |      90 | 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.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...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.75 |    95.93 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...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.24 |    89.84 |   96.14 |   92.24 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     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 |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...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.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.31 |    91.36 |     100 |   94.31 | ...34,440,443-447 
  ...-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  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...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.91 |    87.32 |   90.58 |   88.91 |                   
 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.53 |    84.82 |   94.55 |   90.53 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.74 |       78 |    85.1 |   85.74 | ...1803-1807,1810 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   95.91 |    87.12 |   94.44 |   95.91 | ...76-478,601,728 
  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.87 |    68.43 |   78.94 |   76.87 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    75.8 |    65.46 |   78.57 |    75.8 | ...1879,1885-1886 
  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 |   77.77 |    86.68 |   75.86 |   77.77 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.12 |    90.74 |   97.05 |   92.12 | ...37-538,666-672 
  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.39 |    87.49 |   91.59 |   93.39 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  ...-test-mock.ts |   98.82 |    66.66 |   58.33 |   98.82 | 85                
  agent-core.ts    |   90.38 |    80.91 |   81.25 |   90.38 | ...2550,2596-2598 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.57 |    89.41 |   83.33 |   93.57 | ...04-505,508-509 
  ...nteractive.ts |   81.64 |     82.6 |      80 |   81.64 | ...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.86 |    90.47 |     100 |   93.86 | ...2213,2306-2309 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   93.17 |     83.6 |      95 |   93.17 | ...14,372,392-395 
  ...ow-sandbox.ts |    97.4 |    89.37 |     100 |    97.4 | ...1846,1852-1853 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...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   |   85.75 |     86.2 |   91.15 |   85.75 |                   
  TeamManager.ts   |   80.12 |    84.78 |   84.37 |   80.12 | ...2089,2112-2113 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     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   |   92.99 |    94.52 |      95 |   92.99 | ...29-330,415-425 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.28 |    95.34 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |    85.71 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.96 |     100 |     100 | 189,198           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |    86.3 |    88.53 |   78.38 |    86.3 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.86 |    87.79 |   76.28 |   84.86 | ...9561,9565-9567 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...ver-config.ts |   97.29 |      100 |   83.33 |   97.29 | 48-49             
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...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.84 |    88.69 |   93.96 |   92.84 |                   
  ...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.48 |    88.27 |   91.91 |   92.48 | ...4688,4786-4787 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...09-510,555-561 
  ...lScheduler.ts |   90.22 |    84.96 |   94.73 |   90.22 | ...6488,6516-6532 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  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 |                   
  llm-chat.ts      |   95.21 |     90.8 |   96.66 |   95.21 | ...5769,5814-5815 
  llm-request.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 |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...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.2 |      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   
  stream-guards.ts |   91.16 |    93.18 |     100 |   91.16 | ...89,218-229,294 
  ...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.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.21 |    94.69 |     100 |   99.21 | 784-785,854       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.62 |    89.21 |   97.43 |   96.62 |                   
  ...tGenerator.ts |   97.71 |    89.13 |   97.43 |   97.71 | ...1539,1568,1579 
  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 |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.41 |    90.86 |   96.33 |   92.41 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.25 |    89.66 |   96.87 |   91.25 | ...1946,2115-2130 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |    96.3 |    91.36 |     100 |    96.3 | ...1204-1205,1312 
  ...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.24 |       92 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.27 |    90.56 |     100 |   95.27 | ...52-153,166-167 
  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 |                   
  openrouter.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     |   89.16 |    86.49 |   93.61 |   89.16 |                   
  ...ive-safety.ts |    97.9 |     92.8 |     100 |    97.9 | 235-236,313-316   
  ...-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 |                   
  ...git-client.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.1 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.96 |    84.05 |      83 |   84.96 | ...3159,3197-3198 
  ...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 |   78.91 |    86.04 |   85.71 |   78.91 | ...95,202,214-248 
  github.ts        |   92.61 |    87.44 |     100 |   92.61 | ...1310-1311,1321 
  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.78 |    82.27 |   86.84 |   84.78 |                   
  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.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...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.59 |    90.38 |      95 |   93.59 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.96 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.82 |   97.36 |   95.75 | ...76,666,684-685 
  goal-runtime.ts  |   96.51 |    90.64 |   96.49 |   96.51 | ...1645-1646,1777 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   98.58 |     95.2 |   96.15 |   98.58 | ...41-242,350-351 
  ...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.53 |     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         |   90.59 |    86.89 |   90.32 |   90.59 |                   
  ...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    |   85.68 |    82.96 |    92.3 |   85.68 | ...1289,1299-1302 
  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 |   82.47 |    84.21 |      75 |   82.47 | 63-67,169-184     
  ...oksManager.ts |   94.87 |    90.12 |     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/ipc           |   94.64 |    94.01 |   96.72 |   94.64 |                   
  inbound-gate.ts  |   98.99 |    89.71 |     100 |   98.99 | 557-559           
  ...-directory.ts |     100 |      100 |     100 |     100 |                   
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.61 |    97.22 |     100 |   97.61 | 262-264           
  peer-routing.ts  |     100 |      100 |     100 |     100 |                   
  peer-send.ts     |   97.17 |     98.3 |   88.88 |   97.17 | 183-187           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   88.52 |    92.59 |   85.71 |   88.52 | 172-185           
  uds-inbox.ts     |   82.42 |    84.09 |     100 |   82.42 | ...33,240-250,282 
 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        |   89.47 |    85.72 |    92.1 |   89.47 |                   
  ...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.71 |    81.14 |   94.44 |   90.71 | ...17,640,657-663 
  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.43 |    83.16 |   77.77 |   78.43 | ...1493,1506-1508 
  ...ent-config.ts |   92.22 |    84.78 |      92 |   92.22 | ...64,473-474,478 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  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      |   97.21 |    95.29 |     100 |   97.21 | ...29,341,345-347 
  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 |   79.76 |    76.84 |      80 |   79.76 | ...69-473,476,482 
  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.81 |    89.34 |   91.35 |   92.81 |                   
  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 |    64.51 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.07 |     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   |   84.44 |    91.62 |   71.77 |   84.44 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |   98.51 |    86.48 |     100 |   98.51 | 264-265           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    90.19 |     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 |   88.26 |     91.9 |   82.35 |   88.26 | ...1374,1480-1484 
  rule-parser.ts   |    94.9 |    92.81 |     100 |    94.9 | ...1552,1586-1588 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.06 |    95.23 |     100 |   99.06 |                   
  system-prompt.ts |   99.06 |    95.23 |     100 |   99.06 | 235               
 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     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  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 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...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.5 |      100 |       0 |    87.5 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  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.67 |    86.35 |   96.59 |   90.67 |                   
  ...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.77 |    96.56 |     100 |   97.77 | ...1098,1241-1249 
  ...ingService.ts |   92.25 |    87.59 |   94.79 |   92.25 | ...2924,2939-2940 
  ...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.11 |    89.74 |   98.03 |   94.11 | ...1366,1775-1776 
  cronTasksFile.ts |   95.88 |       92 |     100 |   95.88 | ...72,381-382,520 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   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 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.04 |    89.74 |     100 |   96.04 | 72,98-101,190-191 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |    98.8 |    96.73 |     100 |    98.8 | 630,684-685,743   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.09 |    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 |   84.56 |       75 |    97.8 |   84.56 | ...2666,2688,2702 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.33 |    87.47 |   91.72 |   89.33 | ...4207-4208,4249 
  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 |    95.83 |     100 |     100 | 139               
  ...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 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...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.06 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.06 |     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.78 |    86.08 |   94.73 |   89.78 |                   
  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.11 |    85.71 |   86.11 |   86.11 | ...1244,1251-1255 
  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 | 289-290           
 ...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.93 |    89.34 |   98.36 |   88.93 |                   
  ...ter-schema.ts |     100 |    98.18 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.75 |    86.38 |   97.56 |   85.75 | ...1653,1730-1731 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   94.14 |    95.23 |     100 |   94.14 | 47-52,65-66,71-76 
 src/telemetry     |   83.23 |    84.98 |   86.51 |   83.23 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...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.88 |    92.79 |   83.78 |   87.88 | ...55-561,564-568 
  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.83 |    77.77 |   66.66 |   60.83 | ...1523,1540-1560 
  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      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  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.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...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 |    88.81 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...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.73 |    86.34 |   90.34 |   87.73 |                   
  ...erQuestion.ts |      90 |    82.75 |   92.85 |      90 | ...01-402,409-410 
  ...-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   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  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   |   96.52 |    95.55 |    87.5 |   96.52 | 37-38,53-54       
  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 
  ...fier-input.ts |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.25 |    87.61 |   93.93 |   86.25 | ...2552,2556-2559 
  ...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 | ...1342,1350-1351 
  ...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      |   98.14 |     93.2 |     100 |   98.14 | ...1269,1324-1325 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...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 |   96.04 |    82.25 |     100 |   96.04 | ...41,594,604-608 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.13 |    93.93 |    92.3 |   99.13 | 255-257           
  ...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  |   86.86 |    93.18 |      75 |   86.86 | ...20-426,568-575 
  ...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         |   93.56 |    90.78 |   91.66 |   93.56 | ...49,653,701-723 
  ...-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 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   88.67 |     87.5 |   85.71 |   88.67 | ...2-48,72-73,129 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.73 |    90.47 |   93.75 |   95.73 | ...48-552,565-570 
  ...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.72 |    82.95 |   86.53 |   80.72 | ...1106,1114-1115 
  ...-finalizer.ts |    98.1 |    92.36 |   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.2 |    89.79 |   93.75 |    96.2 | ...10,260-265,428 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...67-568,584-590 
  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.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.26 |    88.53 |   89.71 |   87.26 |                   
  agent.ts         |   85.88 |    87.66 |   87.35 |   85.88 | ...4277,4311-4321 
  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.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-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 |   89.33 |    87.68 |   82.75 |   89.33 |                   
  workflow.ts      |   89.33 |    87.68 |   82.75 |   89.33 | ...33,878,880-881 
 src/utils         |   92.79 |    89.75 |    96.9 |   92.79 |                   
  ...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   |   99.49 |    96.29 |     100 |   99.49 | 224               
  ...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.58 |      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.64 |    84.87 |    92.3 |   91.64 | ...00,415-420,580 
  ...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    |   96.06 |    84.09 |     100 |   96.06 | 251,350-358       
  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.51 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.24 |     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.6 |     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 |    86.32 |     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 |       25 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...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.

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

  • R3-1 remaining stale 'sandboxed' containment comment (qwen-code-pr-review.yml:2928) — already reported as the third instance of R1-3 (triage review 5053859162, comment 5456134264, non-blocking item 3; recorded in round-1 review 5054818149 a…

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory; @qwen-code/qwen-code@0.21.10no such file or directory.

中文说明

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

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

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory; @qwen-code/qwen-code@0.21.10no such file or directory

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

Comment thread .github/workflows/qwen-code-pr-review.yml
…ntialed push

The no-sandbox /resolve agent runs --yolo before 'Resolution check' and
'Report result' in the same job: anything it appends to $GITHUB_ENV reaches
every later step, and it writes the workspace. A prompt-injected agent could
therefore plant BASH_ENV/LD_* hijacks, PATH shims, git-config url rewrites or
a pre-push hook that the workflow-scope push token then walks through
(measured by review probes; the pre-fix shape fires all three channels).

Harden both post-agent steps: pin BASH_ENV/LD_* empty at the step boundary
(they execute before any body line runs), pin PATH, drop git's env channels,
ignore host/global config, remove the agent-writable local .git/config, and
run the push hookless (--no-verify, core.hooksPath=/dev/null). Pin the
follow-up bot's CLI version too — it was the one sibling still following npm
`latest` through the 2026-08-15 notarget incident class.

Tests: witness assertions for every hardening layer (each one red when its
layer is removed), arm-slice pins for the infra/generic report bodies and
the failure_kind=infra write, and the step-vs-job timeout pair now reads the
job ceiling instead of duplicating it. Bump the size baseline for the
deliberate workflow growth.
@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 4 — Critical R2-1 fixed; four Suggestions closed; R1-5 answered with the extraction query

Root cause (R2-1). The no-sandbox /resolve agent runs --yolo before Resolution check and Report result in the same job. Anything it appends to $GITHUB_ENV reaches every later step, and it writes the workspace — so a prompt-injected agent can plant execution channels the credentialed push then walks through. Measured this round with real git (mirroring the review's probes): the pre-fix push shape under poisoned state fired all three channels — BASH_ENV sourced before the body, a PATH shim resolved git, and a planted core.hooksPath pre-push hook received the push URL.

Fix (house playbook, sized to this job). Both post-agent steps now:

  • pin BASH_ENV/LD_PRELOAD/LD_AUDIT/LD_LIBRARY_PATH empty in the step env: — these execute at process startup, before any body line runs (probed: --norc does NOT stop BASH_ENV; empty pins are inert);
  • pin PATH=/usr/bin:/bin, drop git's env channels (GIT_EXEC_PATH, GIT_DIR, …), set GIT_CONFIG_COUNT=0, GIT_CONFIG_SYSTEM/GLOBAL=/dev/null, and remove the agent-writable local .git/config (highest precedence; includes/filters/url rewrites planted there survive GIT_CONFIG_GLOBAL=/dev/null);
  • Report result additionally drops proxy and GH_HOST/GH_CONFIG_DIR/GH_ENTERPRISE_TOKEN vars, sets GIT_TERMINAL_PROMPT=0, and pushes via git -c core.hooksPath=/dev/null push --no-verify.

Same poisoned state against the hardened bodies: Resolution check still passes the guard (exit 0, outcome=fixed), the push lands, and zero channels fire. The guard's integrity was the other half: a PATH shim could previously falsify every check. Containment comments updated, including the third stale "sandboxed" mention (R1-3). The robust downstream-job variant was not adopted: the implemented layers close every measured channel and are test-witnessed; accepted residual — the post-agent steps without credentials (Show run artifacts, Upload run artifacts) still run with inherited state and only the read-only implicit token.

Other findings.

  • R1-4 (Suggestion, done): qwen-issue-followup-bot.yml now pins qwen_cli_version: '0.21.10' — it was the one sibling still following npm latest through the 2026-08-15 notarget incident class; witnessed in qwen-triage-workflow.test.mjs (org-level QWEN_CLI_VERSION caveat recorded on the step).
  • R1-6 (Suggestion, done): the infra/generic report bodies and their if [ "$FAILURE_KIND" = "infra" ] condition are now arm-sliced and pinned; the failure_kind=infra write is pinned to the never-ran block of Resolution check (and excluded from the failure.md branch). All four measured mutants (body transposition, condition rename, moved write, hardcoded timeout) go red.
  • R1-7 (Suggestion, done): the step-timeout assertion reads the job's timeout-minutes instead of the literal 120; lowering the job ceiling to the step value now fails the test.
  • R1-8 (Critical, done in round 3): re-verified — the baseline recorded exactly 173427 = wc -c at that HEAD. This round bumps it to 177091 for the deliberate hardening growth (within allowance, recorded exactly).
  • R1-5 (Suggestion, no code change): the finding itself needs no code if the data confirms the cap, and the duration rows exist only behind the GitHub API, which this flow cannot query. A maintainer can re-derive the percentiles with: gh run list --workflow qwen-code-pr-review.yml --limit 1000 --json databaseId,event,runStartedAt,updatedAt,conclusion --jq '.[] | [.databaseId,.event,.runStartedAt,.updatedAt,.conclusion] | @tsv' filtered to the resolve-pr runs (issue_comment/workflow_dispatch) in the 2026-06-25..08-27 window, duration = updatedAt − runStartedAt (gh run view <id> --json jobs for per-job timing). Thread left open for that confirmation.

Mutation probes (every guard witnessed, all RED with the guard removed, green restored): drop core.hooksPath=/dev/null and/or --no-verify; drop the BASH_ENV pin; drop the PATH pin (each step); drop rm -f .git/config; drop GIT_CONFIG_GLOBAL=/dev/null; job timeout 120→75; the four R1-6 mutants; follow-up pin → latest.

Verification

  • npm run typecheck — passed
  • npm run lint — passed
  • npm run build — passed
  • npm run test:scripts — 1908 passed, 16 skipped, 0 failed (71 files)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js scripts/tests/workflow-size.test.js — 227 passed (2 files)
  • node --test .github/scripts/qwen-triage-workflow.test.mjs — 120 passed, 0 failed
  • .github/scripts/check-workflow-size.sh — passed (every workflow within its baseline allowance)
  • YAML parse of both edited workflows (yaml library) — OK
  • Behavioral probe (real git, poisoned state): pre-fix shape fires BASH_ENV/shim/hook channels; hardened shape closes all three and still pushes — passed
  • No conflicts (--conflict false); no merge performed.
中文说明

第 4 轮 — Critical R2-1 已修复;四条 Suggestion 已关闭;R1-5 以提取查询作答

根因(R2-1)。 无沙箱的 /resolve agent 以 --yolo 在同一 job 中先于 Resolution checkReport result 运行:它向 $GITHUB_ENV 追加的内容会到达之后的每个步骤,且它会写入工作区——因此被提示注入的 agent 可以植入执行通道,让随后携带凭据的推送从中穿过。本轮用真实 git 实测(与审查探测同法):投毒状态下修复前的推送形态三条通道全部触发——BASH_ENV 在脚本主体之前被 source、PATH shim 解析了 git、植入的 core.hooksPath pre-push 钩子收到了推送 URL。

修复(仓库既有手册,按本 job 裁剪)。 两个 agent 之后的步骤现在都:

  • 在步骤 env: 中把 BASH_ENV/LD_PRELOAD/LD_AUDIT/LD_LIBRARY_PATH 钉为空——它们在进程启动时执行,早于任何脚本行(实测:--norc 并不能阻止 BASH_ENV;空值钉扎是惰性的);
  • 钉死 PATH=/usr/bin:/bin,剥离 git 的环境通道(GIT_EXEC_PATHGIT_DIR 等),设置 GIT_CONFIG_COUNT=0GIT_CONFIG_SYSTEM/GLOBAL=/dev/null,并删除 agent 可写的本地 .git/config(最高优先级;植入其中的 include/filter/url 重写在 GIT_CONFIG_GLOBAL=/dev/null 之下仍然生效);
  • Report result 额外剥离代理变量与 GH_HOST/GH_CONFIG_DIR/GH_ENTERPRISE_TOKEN,设置 GIT_TERMINAL_PROMPT=0,并以 git -c core.hooksPath=/dev/null push --no-verify 推送。

同一投毒状态下运行加固后的脚本:Resolution check 仍通过守卫(退出 0、outcome=fixed),推送成功落地,且通道触发。守卫自身的完整性是另一半:此前 PATH shim 可以伪造所有检查。隔离注释已更新,包括第三处过时的 "sandboxed" 字样(R1-3)。未采用更稳的下游 job 变体:已实现的各层关闭了所有实测通道并有测试见证;接受的残留——不带凭据的 agent 后步骤(Show run artifactsUpload run artifacts)仍带继承状态运行,但只接触只读的隐式令牌。

其余发现。

  • R1-4(Suggestion,已完成): qwen-issue-followup-bot.yml 现在钉住 qwen_cli_version: '0.21.10'——它是 2026-08-15 notarget 事故同类中唯一仍跟随 npm latest 的同族;由 qwen-triage-workflow.test.mjs 见证(组织级 QWEN_CLI_VERSION 的保留意见已记录在该步骤上)。
  • R1-6(Suggestion,已完成): infra/通用两段消息正文及其 if [ "$FAILURE_KIND" = "infra" ] 条件现在按分支切片钉住;failure_kind=infra 的写入被钉在 Resolution check 的 never-ran 块内(并被排除在 failure.md 分支之外)。四个实测变异(正文对调、条件重命名、写入移位、硬编码超时)全部变红。
  • R1-7(Suggestion,已完成): 步骤超时断言改为读取 job 的 timeout-minutes,不再是字面量 120;把 job 上限降到步骤值现在会让测试失败。
  • R1-8(Critical,第 3 轮已完成): 复核确认——基线记录的 173427 恰等于该 HEAD 的 wc -c。本轮因有意的加固增长把基线更新为 177091(在容差内,按精确值记录)。
  • R1-5(Suggestion,无需改码): 该发现本身写明数据证实则无需改代码,而耗时数据只存在于本流程无法访问的 GitHub API 之后。维护者可用以下查询复现百分位:gh run list --workflow qwen-code-pr-review.yml --limit 1000 --json databaseId,event,runStartedAt,updatedAt,conclusion --jq '.[] | [.databaseId,.event,.runStartedAt,.updatedAt,.conclusion] | @tsv',过滤 2026-06-25..08-27 窗口内的 resolve-pr 运行(issue_comment/workflow_dispatch),耗时 = updatedAt − runStartedAt(按 job 计时可用 gh run view <id> --json jobs)。该线程保持打开,等待该确认。

变异探测(每个守卫都有见证,移除守卫全部变红,恢复后变绿): 移除 core.hooksPath=/dev/null 和/或 --no-verify;移除 BASH_ENV 钉扎;移除 PATH 钉死(两个步骤各自);移除 rm -f .git/config;移除 GIT_CONFIG_GLOBAL=/dev/null;job 超时 120→75;R1-6 的四个变异;follow-up 版本钉 → latest

验证

  • npm run typecheck — 通过
  • npm run lint — 通过
  • npm run build — 通过
  • npm run test:scripts — 1908 通过、16 跳过、0 失败(71 个文件)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js scripts/tests/workflow-size.test.js — 227 通过(2 个文件)
  • node --test .github/scripts/qwen-triage-workflow.test.mjs — 120 通过、0 失败
  • .github/scripts/check-workflow-size.sh — 通过(所有 workflow 均在基线容差内)
  • 两个被改 workflow 的 YAML 解析(yaml 库)— 正常
  • 行为探测(真实 git、投毒状态):修复前形态触发 BASH_ENV/shim/hook 三条通道;加固后三条全部关闭且推送仍然成功 — 通过
  • 无冲突(--conflict false);未执行合并。

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

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


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

@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 702 passed · 0 failed · 702 total

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

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

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

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

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

Verification report

<!-- qwen-resolve-result -->
Qwen Code checked this PR and did not push changes.

x

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/qwen-triage-workflow.test.mjs: (cd .) node --test ./.github/scripts/qwen-triage-workflow.test.mjs
file scripts/tests/qwen-resolve-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/qwen-resolve-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/qwen-triage-workflow.test.mjs: PPPPP
  scripts/tests/qwen-resolve-workflow.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 1 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 2 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 2 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 3 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 3 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 4 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 4 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 5 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 5 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)

Evidence images

01-hijack-matrix-ab-base-vs-head

02-gates-vitest-263

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

Qwen Code · sandboxed verification

…, on top of the post-agent scrub

Complements the scrub that 'Resolution check' and 'Report result' now
open with (PATH pinned, git env channels dropped, every config scope
ignored, .git/config removed, BASH_ENV/LD_* pinned empty): those close
what the later steps can see, but a $GITHUB_ENV append made by the agent
is applied by the runner to every later step's environment, where an
unset list can only chase known names. So the agent is now invoked
directly — the pinned CLI installed in its own step — with its
invocation's $GITHUB_ENV, $GITHUB_PATH, $GITHUB_OUTPUT and
$GITHUB_STEP_SUMMARY pointed at decoys that die with the step, inside a
::stop-commands:: window with a random resume token, the way the review
lane runs its agent. Settings go to a per-run QWEN_HOME instead of the
action input.

On the scrubbed side: 'Show run artifacts' gets the same scrub, every
post-agent git call goes through a wrapper that disables hooks, the
fsmonitor command and credential helpers, and 'Report result' gives gh
a fresh empty config dir instead of leaving ~/.config/gh in reach.

The settings-block comment records the residual: a root-capable agent
on a hosted runner can defeat any in-job measure; the structural answer
is a downstream job for the credentialed push, tracked separately.

Tests pin the direct invocation, the decoys, the stop-commands window,
the scrub and wrapper on every post-agent step, the BASH_ENV/LD_* pins,
the gh config dir and --no-verify; the size baseline moves with the
growth.
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

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

Partially reviewed — gaps disclosed.

⚠️ Round 7, and the diff has grown 4.6x since this review first measured it (142 → 658 source diff lines). The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

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

  • follow-up bot qwen_cli_version pin has no contract test — already reported as R4-7 (comment 3886465040 on qwen-issue-followup-bot.yml:306)
  • producer half of the resolve-pr outputs contract unpinned (qwen-code-pr-review.yml:2478) — already reported as D6 in round-6 review 5059565836's deferred list
  • post-agent credential scan misses job-level env: and inline secrets in run: (qwen-triage-workflow.test.mjs:444) — already reported in round-6 review 5059565836's deferred list
  • resolve-lane decoy pins cover only two of the four assignments (qwen-resolve-workflow.test.js:960) — already reported as R5-2(d) (comment 3887462739)
  • settings.json write / export QWEN_HOME ordering before the invocation unpinned (qwen-triage-workflow.test.mjs:266) — already reported in round-6 review 5059565836's deferred list
  • skip-step exception gate pinned by substring only (qwen-triage-workflow.test.mjs:437) — already reported in round-6 review 5059565836's deferred list
  • publish 'Resolution check'/'Report result' bare-always() gates unpinned (qwen-resolve-workflow.test.js:907) — already reported in round-6 review 5059565836's deferred list
  • settings write source never bound to $QWEN_SETTINGS (qwen-triage-workflow.test.mjs:266) — already reported in round-6 review 5059565836's deferred list
  • review-lane truncation asymmetry reframed (review-artifact-upload.test.js:306) — re-file of a candidate rejected by this round's verification: the review-lane agent step itself holds CI_BOT_PAT (qwen-code-pr-review.yml:931), so the channel …
  • .size-baseline under-records the workflow size by 1209 bytes (.github/workflows/.size-baseline:40) — already reported in round-6 review 5059565836's deferred list
  • decoy assignments unpinned as invocation-scoped prefixes (qwen-triage-workflow.test.mjs:356) — already reported in round-6 review 5059565836's deferred list
  • moved-head update-ref re-pinning never exercised by the fixture (qwen-resolve-workflow.test.js:885) — already reported in round-6 review 5059565836's deferred list
  • status reassignment between status=$? and exit "$status" unpinned (qwen-resolve-workflow.test.js:959) — already reported as R4-7 (comment 3886465060)

Not reviewed: reverse audit — stopped at the reverse-audit round cap of 5 without converging.

Not explored to full depth (tool budget reached): chunk 4: none — vitest could not be run (no node_modules in the review worktree), so I replicated the changed tests' extraction logic and executed the extracted shell he….

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory.

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

  • .github/workflows/qwen-code-pr-review.yml:2934 — [review] 'Report skipped request' gate misses the empty decision — silent red run, no comment, on a pre-prepare failure
  • .github/workflows/qwen-code-pr-review.yml:2845 — [review] model wiring (OPENAI_MODEL / MODEL_ARGS) of the direct qwen invocation pinned by no test — deletion mutants ship green
  • .github/workflows/qwen-code-pr-review.yml:3027 — [review] the new unreachable-HEAD_SHA refusal guard has no test witness — guard-deletion mutant ships green
  • scripts/tests/qwen-resolve-workflow.test.js:1337 — [probe] 'Resolution check' crash before its first output write (transient fetch failure) posts the generic 'did not complete' wording, RESOLVE_OUTCOME=success unconsulted
  • .github/scripts/qwen-triage-workflow.test.mjs:496 — [probe] GH_TOKEN on 'Report result'/'Report skipped request' unpinned — credential swaps ship green and the result comment silently 403s
  • .github/workflows/qwen-code-pr-review.yml:3279 — [probe] artifact name quoted in the four push-failure comments is the only carrier pinned by no test — rename ships green, comments cite a nonexistent artifact
  • .github/workflows/qwen-code-pr-review.yml:3181 — [probe] load-bearing mkdir -p "${WORKDIR}" on 'Report result' exercised by no test — deletion mutant ships green, infra comment dies on ENOENT
  • .github/workflows/qwen-code-pr-review.yml:3028 — [probe] unreachable-HEAD refusal writes outcome=failed but no failure_kind — misleading 'did not complete' comment
  • .github/workflows/qwen-code-pr-review.yml:3236 — [probe] 'Report result' push arm and exit-code contract executed by no test — deleting the push_failed exit-1 ships green and kills the retry path

Convergence: round 7 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 2 (2 new). Findings keep coming back to the same files: .github/workflows/qwen-code-pr-review.yml (findings in round 6; 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 no anchor this round could use either — none at all, one with no certifier, one certified by an identity other than the one this round runs under, or one this round's fetch refused or resolved to the head — so the next review re-reads the whole diff unless recovery grafts an earlier own anchor that the round running it can use onto the complete work list this round leaves behind, and keeps doing so until a round's marker carries an anchor again or a graft lands that the round running it can use. (Stated, not acted on — this changes nothing about what the round posts.)

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step unconditionally skips when qwen is already on PATH — always true on the ecs-qwen pool the job routes to (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed version maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'. The pin bites only on the ubuntu-latest fallback lane, and the new contract test only regex-matches the YAML shape, so the diff comment's claim "the pin wins" ships green and falsely certified on the primary lane. Failure scenario: a broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: probe executed the pinned action's real install-step script at SHA 05f8171 — qwen-on-PATH arm (ECS model): exit=0, "Qwen Code already installed, skipping install:", zero npm invocations (pin inert, fleet version runs); no-qwen arm (ubuntu-latest model): "Installing Qwen Code from npm: @qwen-code/qwen-code@0.21.10" — the probe flips. Suggested fix: make the pin actually install on the ECS lane (install the pinned version over/ahead of the fleet binary before invoking the action), or rewrite the comment and contract test to state the real contract — fleet version authoritative on ecs-qwen, pin effective only on the ubuntu-latest fallback. (Relocated to the body: its inline location qwen-issue-followup-bot.yml:306 overlaps the existing R4-7 thread, comment 3886465040.)

中文说明

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

⚠️ 第 7 轮,且自本审查首次测量以来 diff 已增长 4.6 倍(源码 diff 行数 142 → 658)。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

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

未审查:reverse audit — stopped at the reverse-audit round cap of 5 without converging。

未探索到全部深度(达到工具调用预算):chunk 4:none — vitest could not be run (no node_modules in the review worktree), so I replicated the changed tests' extraction logic and executed the extracted shell he…

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory

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

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

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有留下本轮可用的锚点——要么完全没有、要么没有认证者、要么由本轮运行身份之外的身份认证、要么被本轮的获取拒绝或解析为头提交——因此下一次评审将重读整个 diff,除非恢复流程把本轮能使用的更早自有锚点嫁接到本轮留下的完整工作清单上;并会一直如此,直到某一轮的标记重新带上锚点,或落地的嫁接能被运行该轮的评审使用。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step unconditionally skips when qwen is already on PATH — always true on the ecs-qwen pool the job routes to (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed version maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'. The pin bites only on the ubuntu-latest fallback lane, and the new contract test only regex-matches the YAML shape, so the diff comment's claim "the pin wins" ships green and falsely certified on the primary lane. Failure scenario: a broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: probe executed the pinned action's real install-step script at SHA 05f8171 — qwen-on-PATH arm (ECS model): exit=0, "Qwen Code already installed, skipping install:", zero npm invocations (pin inert, fleet version runs); no-qwen arm (ubuntu-latest model): "Installing Qwen Code from npm: @qwen-code/qwen-code@0.21.10" — the probe flips. Suggested fix: make the pin actually install on the ECS lane (install the pinned version over/ahead of the fleet binary before invoking the action), or rewrite the comment and contract test to state the real contract — fleet version authoritative on ecs-qwen, pin effective only on the ubuntu-latest fallback. (Relocated to the body: its inline location qwen-issue-followup-bot.yml:306 overlaps the existing R4-7 thread, comment 3886465040.)

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

Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 946 passed · 1 failed · 947 total

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

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

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

脚本断言:946 通过 · 1 失败 · 947 总计

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

Verification report

Sandboxed verification: ❌ findings reported — delta claims proven, one re-run regression found (agent verdict)

Verified head: 4fb0c4490a6eaf867dde0aec5a399993dfc22c03 (PR head, merged over base tip 74e71c5945). Follow-up round; previous head 1d7b829d7c was reachable, so the delta (1d7b829d..4fb0c4490a, one commit, 3 files) was verified separately and every previous finding was re-measured at the new head.

Scripted assertions: 946 passed · 1 failed · 947 total (the 1 fail is the size-baseline drift in Findings #2)

中文 — 判定:❌ 报告了发现 · 增量改动已证实,发现一处重跑回归(agent 判定)

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

脚本断言:946 通过 · 1 失败 · 947 总计(唯一失败项为 Findings #2 的尺寸基线漂移)

  • 上一轮发现状态:见状态表。尺寸基线漂移恶化(769 → 1209 字节);"one sibling" 描述已修正;两处注释 nit 仍在;两个未钉住的守卫(M9/M10)变异重跑后仍未被钉住。
  • 本轮增量(R6-2 / R6-1)已证实:artifact 名字两侧加 run_attempt 后缀——A/B 显示 base(1d7b829d)在重跑时第二次上传 409、按名下载取回第一次的旧 bundle 并重新发布;head 上传/下载在每个 attempt 一致、发布本次产物(见 01-ab-artifact-naming-base-vs-head.png)。两处裸 if: "${{ always() }}" 已改为单引号,全文件无其他同类违例(yamllint 本体无法安装,以规则形状扫描替代)。
  • 新发现(Findings pre-release: fix ci #1:仅重跑 publish-resolution 的场景(agent job 已成功、publish 因瞬时原因失败后点 "Re-run failed jobs")——新后缀让下载按 attempt 2 找名字、而产物是 attempt 1 上传的,下载落空后用真实 Resolution check + Report result 块演示出两种错报:自相矛盾的 "agent step ended with outcome=success before producing a result",或事故期通用措辞 "still has merge conflicts"(见 02-rerun-misreport-real-blocks.png)。失败方向安全(不会错误推送),但该场景在上一轮 head 上本可恢复。已给出并模拟了修复方向(上传方记录 attempt 输出、下载方按该输出取名,4/4 拓扑通过)。
  • 未覆盖:合入后的真实 /resolve 运行、yamllint 本体(容器无 pip)、逐 commit 归因(浅克隆)、上一轮已验证且本轮输入闭包未变的变异项。

Follow-up round — status of the previous report

Previous verdict: findings (840 passed · 1 failed), verified head 1d7b829d7c. Every carried finding was re-measured at the new head, never diffed from the old report.

# previous finding severity status at new head 4fb0c4490a
1 .size-baseline undershoots the PR's own file (189756 recorded vs 190525 actual, drift 769 B) suggestion worsened — the delta grew the file to 190965 B (+440) without a bump; drift is now 1209 B. The ratchet still passes only inside its 4096-byte allowance. Re-measured: wc -c vs the baseline entry (this round's one scripted fail).
2 description called the follow-up bot "the one sibling still following npm latest" while 3 more consumers remained suggestion fixed (description side) — the current body no longer makes the claim. Factual residual stands and grew by one in the audit: four every-run @latest installs remain — qwen-triage.yml 'Ensure qwen CLI' (l.712), 'Install tmux runner tools' (l.1301), 'Install verify runner tools' (l.2600), and this file's review lane 'Install Qwen CLI if missing' (l.764). All pre-existing; the body no longer claims coverage, so no action is owed to this PR.
3 stale cross-reference comment in qwen-resolve-workflow.test.js "(see 'hardens the post-agent steps')" nit stands — now line 958. Both halves are stale: the referenced test no longer exists, and the "scrub in the later steps" it cites was replaced by the job split.
4 garbled scope-guard comment "ponytail: tr back to newlines…" nit stands — line 3143 of qwen-code-pr-review.yml; the delta did not touch it.
5 M9/M10 mutation survivors: gitfile refusal in Package resolution and GIT_TERMINAL_PROMPT=0 are behaviorally correct but unpinned completeness stands — both mutations re-executed at the new head against both suites: still all green. Classification unchanged (coverage gaps, not defects). The behavioral correctness of the gitfile refusal was proven by the previous round's H3-B4 cell and carries forward by proven-identical closure (the Package resolution block is byte-identical across the delta); this round's H3 re-proved the --no-verify backstop and the truncation/decoy set.

The previous round's Corrections section is also resolved: the current snapshot body describes the final (job-split) design accurately — the description no longer lags the code.

Scope

  • Central claim (delta): R6-2 — re-runs can no longer republish a stale resolution: the run-artifact name carries run_attempt on both the upload and the download side. A/B control: the previous head 1d7b829d (the exact state round 6 reviewed).
  • Secondary claim (delta): R6-1 — the two bare if: "${{ always() }}" conditions satisfy yamllint's enforced quoted-strings: {quote-type: single, required: true} rule.
  • Carried claims re-measured: infra-failure wording (H2), agent containment + --no-verify push channel (H3), test non-vacuity (mutation matrix).

Out of scope (see Not covered): post-merge live runs, the sandbox-hang root cause, per-commit attribution.

A/B on the delta claim (R6-2)

Harness h4-artifact-naming-ab.mjs extracts the upload/download with.name templates from both arms via js-yaml, evaluates them per attempt, and drives an emulated artifact store with the semantics observed in this repo's own runs (upload-artifact v4+ refuses a duplicate name; download-artifact fetches by exact name). Witness: 01-ab-artifact-naming-base-vs-head.png.

Scenario A — "Re-run failed jobs" re-executes resolve-pr while attempt 1's artifact (bundle B1, agent step died after committing) is still stored:

cell arm attempt-2 upload attempt-2 download picks up published
re-run base 1d7b829d (expected broken) 409 — name qwen-resolve-pr-42 already exists attempt 1's artifact B1 (stale)
re-run head ok — …-attempt-2 …-attempt-2 B2 (fresh)
contract head upload/download names agree on attempt 1 and 2

Scenario B — only publish-resolution re-runs after attempt 1 succeeded (transient publish failure):

cell arm attempt-2 download consequence
publish-only re-run base finds qwen-resolve-pr-42recovers, retries the push works
publish-only re-run head looks for …-attempt-2; artifact was uploaded as …-attempt-1miss Findings #1

14/14 scripted assertions. The R6-2 shape is fixed and the new pins are non-vacuous (mutations MD1/MD2 below). The scenario-B miss is the price paid — demonstrated end-to-end in the next section.

R6-1 (yamllint): yamllint itself cannot be installed in this container (no pip/pip3 — same environmental limit as the previous round), so the rule was checked by shape: .yamllint.yml enforces quoted-strings: {quote-type: 'single', required: true, allow-quoted-quotes: true}, under which a double-quoted scalar is only permitted when it contains a single quote. At the new head both bare always() conditions are single-quoted (2 single, 0 double), the delta adds no double-quoted scalar lacking a single quote, and a whole-file scan of qwen-code-pr-review.yml finds zero remaining scalars of the rejected shape. The "${{ … == 'run' }}" conditions legally stay double-quoted because they contain single quotes. 3 scripted assertions.

Findings

1. A publish-only re-run now misses its own artifact and misreports it — the sibling case of R6-2. Severity: worth fixing before merge if re-runs are expected; fails closed.

The suffix keys the download to the publish job's github.run_attempt, which equals the attempt the agent job uploaded under only when both jobs ran in the same attempt. When attempt 1's resolve-pr succeeded and publish-resolution failed (a transient push failure classified other, a network flake on the ref fetches, the 20-minute timeout), the maintainer's "Re-run failed jobs" re-runs only publish-resolution: resolve-pr is not re-executed and its outputs are preserved, while github.run_attempt becomes 2. The download then asks for qwen-resolve-pr-<n>-attempt-2; the artifact exists only as …-attempt-1.

What happens next was driven through the real Resolution check and Report result run blocks (extracted verbatim, ${{ }} interpolated, executed under bash --noprofile --norc on the PR's own bare-origin/clone fixture topology). RESOLVE_OUTCOME is success (preserved from attempt 1). Witness: 02-rerun-misreport-real-blocks.png.

WORKDIR state after the missed download Resolution check says emitted comment
absent "The agent job uploaded no run artifact (cancelled or crashed before packaging)" → failure_kind=infra "the agent step ended with `outcome=success` before producing a result … Requesting /resolve again will fail the same way" — self-contradictory (success yet no result), blames the agent job for an artifact it did upload, and the guidance is false: a fresh /resolve is a new run and would succeed
present but empty "Branch still has merge conflicts with main." the generic incident-era wording "did not complete successfully … Check the workflow run" — precisely the shape this PR exists to eliminate, and it invites re-runs

(Control cell: with RESOLVE_OUTCOME=failure — the branch the wording was written for — the same comment reads coherently, outcome=failure and the 75-minute timeout named.)

Properties: fails closed (nothing is pushed, stale or otherwise — that is the point of R6-2 and it holds); no corruption. Cost: one wasted re-run, a misleading comment in the exact dimension this PR set out to fix, and the resolution is only recovered by a fresh /resolve request (a full agent run). Reachability is concrete: the Report result push-classification arms themselves (other, and even moved/workflow_scope if a maintainer re-runs anyway) end the publish job with exit 1 after a successful agent run — the exact precondition. Note the sibling triage lane pairs the same run_attempt naming doctrine with an explicit download-miss branch (DOWNLOAD_OUTCOME != success at qwen-triage.yml:5635) that says "results unavailable" honestly; the resolve lane's missing-artifact branch was written for "agent crashed before packaging" and has no arm for "artifact exists under another attempt".

Reproduce: node tmp/pr10428-verify-<ts>/harness/h5-rerun-consequence.mjs <logs-dir> (the case-1/case-2 sections).

Suggested fix (measured at the naming-semantics level)

Have the uploader record the attempt it uploaded at, and have the downloader name by that output instead of by its own run_attempt:

# resolve-pr outputs:
artifact_attempt: '${{ github.run_attempt }}'
# publish-resolution 'Download run artifacts':
name: 'qwen-resolve-pr-${{ needs.resolve-pr.outputs.pr_number }}-attempt-${{ needs.resolve-pr.outputs.artifact_attempt }}'

Job outputs of a not-re-run job are preserved across failed-jobs re-runs, so this evaluates to 1 in the publish-only re-run and to 2 when resolve-pr re-runs. Simulated in h7-fix-simulation.mjs against the same emulated store: first run hits, full re-run uploads/downloads under attempt 2, the publish-only re-run recovers the attempt-1 artifact, and the download can never address another attempt's artifact than the one uploaded under the recorded value (4/4). This is a semantics-level measurement, not a workflow patch: landing it also needs the two contract pins updated (they currently spell github.run_attempt on the download side), which the mutation matrix shows are load-bearing. The comment-body references would keep github.run_attempt correctly, since they are posted by the same attempt that downloaded.

2. .size-baseline undershoots the PR's own final file by 1209 bytes — worsened from 769. The baseline records 189756 qwen-code-pr-review.yml; the file at the verified head is 190965 bytes. Base tip was self-consistent (173139 == 173139), the previous head drifted to 190525, and the delta added 440 more bytes (the suffix, its two comment blocks, the single-quote flips) without a bump. check-workflow-size.sh passes only inside its 4096-byte allowance. Reproduce: wc -c < .github/workflows/qwen-code-pr-review.yml vs grep qwen-code-pr-review .github/workflows/.size-baseline. Fix: record 190965 (then zero slack on this file).

3. Stale test comment (carried, stands). scripts/tests/qwen-resolve-workflow.test.js:958 — "(see 'hardens the post-agent steps')" references a test that no longer exists, and the sentence's "the scrub in the later steps cannot fully undo" describes a design the job split replaced. One-line fix.

4. Garbled comment (carried, stands). qwen-code-pr-review.yml:3143 — "ponytail: tr back to newlines because bash vars can't hold NUL" is dict-corruption of what reads as "then tr back…". Pre-existing, but adjacent lines were edited by this PR, so it was in view.

5. Two guards remain unpinned (carried, stands). Deleting [ ! -d .git ] from Package resolution (M9) or export GIT_TERMINAL_PROMPT=0 from Report result (M10) leaves both suites green at the new head, re-run this round. Completeness reporting, not merge conditions — both behaviors were re-proven correct by H3's cells; a future edit could drop either silently. The fixtures that would pin them are the ones the harnesses already run (a gitfile workspace; a prompt-attempting push stub).

Mutation matrix at the new head

mutate.mjs: in-place exact-string mutants of the workflow, both pinning suites per mutant (scripts/tests/qwen-resolve-workflow.test.js under vitest; .github/scripts/qwen-triage-workflow.test.mjs filtered under node:test), restored sha256-byte-identical after each. Witness: 03-mutation-matrix.png.

mutant expectation result
M0 maxSessionTurns 400→401 (positive control) red red — triage agent-settings suite
M1 "sandbox": falsetrue red red in both files
M2 QWEN_CLI_VERSION '0.21.10''latest' red red in both files
M6 drop --no-verify on the push red red — vitest "publishes from a job…"
M7 neuter merge-base --is-ancestor red red — vitest (behavioral fixture catches it)
M9 disable the gitfile refusal green (probe) green — survivor, stands (Finding #5)
M10 drop GIT_TERMINAL_PROMPT=0 green (probe) green — survivor, stands (Finding #5)
MD1 drop suffix from the upload name only red red in both files — failing test named: "publishes from a job whose runner never executed the agent", assertion expected the suffixed name (expected-vs-actual quoted in logs)
MD2 drop suffix from the download name only red red in both files
MD3 revert if: '${{ always() }}' to double quotes (×2) green (probe) green — pinned by yamllint in CI only; no unit test asserts quote style (see R6-1 section)

10/10 as expected. MD1/MD2 prove the delta's "extend the artifact-name agreement pins" claim non-vacuous on both sides. The previous round's lineage/bundle-verify/head-pinning/missing-artifact mutants were not re-run: the delta's hunks are confined to the two artifact names, the two if: quotes, and four comment lines (git diff 1d7b829d..4fb0c4490a hunk list verified), leaving the Resolution check block and the two-runner fixture test byte-identical — a proven-identical input closure for those measurements.

Targeted gates (all executed at the new head)

gate result
vitest: qwen-resolve-workflow + qwen-autofix-workflow + ci-flaky-rerun-workflow + qwen-pr-review-workflow + workflow-size + review-artifact-upload 667/667 (6 files)
node:test qwen-triage-workflow.test.mjs (full file) 124/124, 18 suites
node:test ci-runner-routing.test.mjs + resolve-sandbox-image.test.mjs 53/53
bash -n on all run blocks of both jobs (verbatim extraction, ${{ }} stripped) 11/11 clean
actionlint on both changed workflows 0 findings; liveness proven (planted unknown function caught: undefined function "unknown_function_xyz")
shellcheck per run block, head vs base no findings on either arm — no new codes
yamllint not installed (no pip in container); quoted-strings rule checked by shape scan instead (R6-1 section)
check-workflow-size.sh passes — within the 4096-B allowance; the 1209-B drift inside it is Finding #2

Witness: 04-gates-summary.png.

Not covered

  • Post-merge behavior: workflows run from the default branch; a live /resolve on a conflicted PR is not reproducible in a token-free container. This round verifies the extracted code paths, not a live Actions run.
  • Replay calibration: no real emitted &lt;!\-\- qwen-resolve-result --> comment from a failed run is retrievable offline; H2/H4/H5 are A/B-anchored to the base and previous-head YAML (extracted verbatim), not calibrated against a production comment.
  • Scenario-B's prerequisite semantics: that a failed-jobs re-run preserves outputs of a not-re-run job while bumping github.run_attempt is documented Actions behavior and the premise of both R6-2 and Finding pre-release: fix ci #1; it cannot be exercised outside Actions. Both directions of the empty-vs-absent WORKDIR cell were driven to cover whichever download-artifact leaves.
  • Per-commit attribution: depth-2 checkout (git rev-parse --is-shallow-repository = true; 1 commit locally reachable vs 15 in the snapshot's commits array) — the aggregate HEAD^1..HEAD diff and the single delta commit were verified; individual earlier commits were not.
  • yamllint could not be installed (no pip3/pip module in this container); actionlint and the shape scan cover the YAML surface.
  • Carried by proven-identical closure (not re-run): the previous round's git bundle verify / head-pinning / missing-artifact mutants, and the full hijack-matrix breadth beyond this round's compact H3 (agent step, decoys, truncation, --no-verify backstop — all re-run).
  • The PR's production statistics (0 of 81 runs since 08-15) are the author's survey; hypotheses consistent with the fix, not independently reproducible offline. The sandbox-hang root cause is out of scope per the PR.
  • Flakiness gate: run by the workflow itself on the changed test files; this round additionally re-ran the resolve suite across 12 mutation cycles with deterministic outcomes.

Methodology

Ran in the lane's own node:22-bookworm container, token-free; npm ci + npm run build were pre-run by the job. Every run block under test was extracted verbatim from js-yaml-parsed workflow text at the exact ref (HEAD^1 for the base arm, 1d7b829d for the delta control, worktree for head), ${{ }} expressions interpolated with fixture values the way Actions does before the shell runs, and executed under bash --noprofile --norc with each block's own set line. Only two boundaries were stubbed: gh (argv/comment body captured) and git push (a recording shim for the comment-path cells; real git against real bare/clone topologies for the hook-channel and fixture cells). The artifact store in H4/H7 emulates the name-keyed upload/download semantics observed in this repo's own runs (R6-2's 409 was observed in production by round 6). Mutations restored the workflow sha256-byte-identical after every mutant (verified). Harnesses live under harness/, per-cell logs under logs/. Assertion accounting: 92 harness checks (H2 32, H3 22, H4 14, H5 9, H6 11, H7 4) + 844 gate tests (vitest 667, node:test 124 + 53) + 10 mutant-expectation matches + 1 scripted baseline check (the single fail).

Flakiness gate log

rounds=5 files=3 skipped=0
file .github/scripts/qwen-triage-workflow.test.mjs: (cd .) node --test ./.github/scripts/qwen-triage-workflow.test.mjs
file scripts/tests/qwen-resolve-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/qwen-resolve-workflow.test.js
file scripts/tests/review-artifact-upload.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/review-artifact-upload.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/qwen-triage-workflow.test.mjs: PPPPP
  scripts/tests/qwen-resolve-workflow.test.js: PPPPP
  scripts/tests/review-artifact-upload.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 1 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 1 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 2 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 2 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 2 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 3 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 3 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 3 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 4 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 4 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 4 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 5 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 5 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 5 · scripts/tests/review-artifact-upload.test.js: P (exit 0)

Evidence images

01-ab-artifact-naming-base-vs-head

02-rerun-misreport-real-blocks

03-mutation-matrix

04-gates-summary

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

Qwen Code · sandboxed verification

Round-7 review findings:

R6-2 (fix-induced) — the run_attempt artifact-name suffix that fixed the
stale-republish defect broke "Re-run failed jobs" the other way: the re-run
executes only publish-resolution, whose attempt number has no artifact, so
the by-name download missed the agent's upload, 'Resolution check' called a
SUCCESSFUL agent an infrastructure failure, and 'Report result' posted a
comment self-contradictory on every clause ("outcome=success ... CLI
install, model endpoint or infrastructure failure ... Requesting /resolve
again will fail the same way") while the resolution stayed unpublished —
every further partial re-run repeated it. Thread the attempt that ran the
agent across the job boundary (the runner provides GITHUB_RUN_ATTEMPT; the
agent never writes it) and download by it, so the partial re-run picks up
the artifact that actually exists and publishes it. For the residual case —
the agent succeeded but the artifact is genuinely gone, upload failure or
expiry — classify the lost artifact (failure_kind=artifact_missing) instead
of the agent run, and word the comment accordingly: the agent finished, the
result could not be published, and "Re-run all jobs" is the one recovery
that re-produces the artifact. Fixture scenario (d) now drives the real
'Resolution check' block across both arms and reds on the pre-fix shape.

R7-1 — the follow-up bot's qwen_cli_version pin is inert on its primary
lane: the pinned action's 'Install Qwen Code' step skips when qwen is
already on PATH (verified at the pinned SHA), always true on the ecs-qwen
pool whose fleet CLI update-ecs-runner-qwen.yml maintains, so the comment's
"the pin wins" falsely certified there. Rewrite it to state the real
contract — fleet version authoritative on ecs-qwen, the pin governing the
ubuntu-latest fallback lane — and say so in the contract test too.

Also lands the round's mechanical items: .size-baseline records both
workflows' exact new sizes (the ratchet passed only on its 4096-byte
allowance); the unpinned gitfile guard in 'Package resolution' and
GIT_TERMINAL_PROMPT=0 in 'Report result' get contract pins (mutation
survivors M9/M10 of the sandboxed verification); a stale test
cross-reference ('hardens the post-agent steps' no longer exists) and a
garbled scope-guard comment repaired in passing.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

The bot already has a review of its own on 4fb0c4490a6eaf867dde0aec5a399993dfc22c03, which still stands.

机器人在 4fb0c4490a6eaf867dde0aec5a399993dfc22c03 上已有自己的评审,且仍然有效。

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #10428

One commit this round: 06d174bd7f fix(ci): let /resolve partial re-runs publish the agent's resolution. No conflicts (--conflict false; branch not merged).

Findings and dispositions

R6-2 fix-induced — partial "Re-run failed jobs" wedged publish-resolution (Critical, rc:3888643378) — FIXED. Reproduced first: drove the real Report result run block with the outputs this path produces (RESOLVE_OUTCOME=success, FAILURE_KIND=infra, artifact missing) and captured the posted comment — "the agent step ended with outcome=success before producing a result — a CLI install, model endpoint or infrastructure failure… Requesting /resolve again will fail the same way" — self-contradictory on every clause, and the resolution stayed unpublished on every further partial re-run. Root cause: the publish job downloaded the artifact by its OWN github.run_attempt, but only the attempt that ran the agent ever uploaded one. Fix: thread the agent's attempt across the job boundary (Resolve pull request writes run_attempt from the runner-provided GITHUB_RUN_ATTEMPT; resolve-pr exposes it as agent_run_attempt) and download by it — the partial re-run now picks up the artifact that exists and publishes it. Residual (agent succeeded, artifact genuinely lost to an upload failure/expiry) gets a distinct failure_kind=artifact_missing: the comment says the agent finished, the result could not be published, and Re-run all jobs is the one recovery that re-produces the artifact — never "will fail the same way". The four push-failure comments now cite the agent's attempt in the artifact name too. Witness: fixture scenario (d)/(d2) drive the real Resolution check block across both arms; all new pins red on the pre-round workflow (3 vitest + 1 node:test failures), green after; six mutation probes (remove the output write / unthread the name / drop the report arm / reclassify as infra / drop the gitfile guard / drop GIT_TERMINAL_PROMPT=0) each turned the suites red, then restored green.

R7-1 — follow-up bot's CLI pin inert on its primary lane (Critical, review body) — FIXED (documentation option). Verified against the pinned action source (SHA 05f8171): Install Qwen Code runs command -v qwen and skips when present — always true on the ecs-qwen pool, where update-ecs-runner-qwen.yml maintains the fleet CLI (@latest by default). The pin only bites on the ubuntu-latest fallback lane, so "the pin wins" falsely certified on the primary lane. Chose the reviewer's documentation option: the workflow comment and the contract-test comment now state the real contract (fleet version authoritative on ecs-qwen; the pin governs runners without qwen on PATH). The alternative (installing the pinned version over the fleet binary on shared self-hosted runners) touches fleet operations beyond this PR's footprint and is recorded as a deferred follow-up.

Verify-report findings (ic:5464747770):

  1. .size-baseline undershoot — FIXED: both touched workflows now recorded at exact size (qwen-code-pr-review.yml 193207, qwen-issue-followup-bot.yml 21443); check-workflow-size.sh passes with zero slack on both.
  2. Stale cross-reference at qwen-resolve-workflow.test.js ("see 'hardens the post-agent steps'" — test no longer exists) — FIXED, now points at the split test.
  3. Garbled scope-guard comment ("ponytail: tr back…", present on base) — FIXED in passing ("then tr back"), one clause.
  4. Mutation survivors M9/M10 — FIXED: contract pins for the [ ! -d .git ] gitfile guard in Package resolution and export GIT_TERMINAL_PROMPT=0 in Report result; both probes red on guard removal.

Re-verified as already resolved in earlier commits (threads listed for resolution): R1-8 size gate (both threads), R1-4, R1-6, R1-7, the R2-1 lineage, R4-1, R4-3, R4-5, R4-11, R4-12, R4-13, R4-17, R4-19, the R5-1/R5-5/R5-7/R5-8 findings, the R5-2 family (a/b/c/d/e/f/g/j), R6-1 yamllint quotes, R6-2 attempt suffix — all re-checked against the current tree: the structural split (af381c1), the wiring/ordering pins (1d7b829), and the attempt-suffix/yamllint fixes (4fb0c44) hold, and every pinned contract is green at this HEAD.

Not resolved in code: rc:3883806890 (R1-5, percentile reproducibility) — the finding itself allows "no code change if the data confirms"; the author posted the full extraction method in-thread (comment rc:3887615289). Left for the maintainer to close; a reply records the disposition. The reviewer's round-6/7 deferred probe lists were explicitly "recorded, not requested" and were not touched. The "Failed checks" section (Test CANCELLED, web-shell E2E Smoke, Post Coverage Comment) reflects the previous push: the yamllint failure that red-walled the Test job was fixed at the current HEAD before this round; the other two touch no file this PR changes — CI re-runs on the next push are the check.

Verification

Commands actually run this round (results):

  • Reproduction probe (pre-fix, real Report result block, stubbed gh): posted the contradictory comment — defect reproduced
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js scripts/tests/review-artifact-upload.test.js scripts/tests/workflow-size.test.js — 3 files, 250 passed (baseline before edits) and again 250 passed after
  • node --test .github/scripts/qwen-triage-workflow.test.mjs124 passed / 0 fail (before and after)
  • Pre-round gate: same suites against the pre-round workflow with this round's tests — 3 vitest failed + 1 node:test failed (witnesses are genuine, not vacuous)
  • Mutation probes ×6 (remove each new guard → suites red; restore → green) — all as required
  • Post-fix probe (real Report result block, failure_kind=artifact_missing): posts the honest "finished successfully … Re-run all jobs" wording
  • bash .github/scripts/check-workflow-size.shpass (zero slack on both bumped entries)
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • node scripts/lint.js --yamllint — yamllint binary not installed on this runner (xargs: yamllint: No such file or directory; CI pins yamllint 1.35.1 via pip, unavailable here as in the sandboxed verify job); every YAML value added this round uses the required single-quote form and the config has no line-length rule; CI's Run yamllint step remains the standing pin
  • R7-1 evidence: fetched QwenLM/qwen-code-action@05f8171… action.yml — install step command -v qwen skip confirmed; update-ecs-runner-qwen.yml fleet install confirmed
中文说明

Autofix 审查轮次 — PR #10428

本轮一个提交:06d174bd7f fix(ci): let /resolve partial re-runs publish the agent's resolution。无冲突(--conflict false;未合并 base 分支)。

发现与处置

R6-2 修复诱发 — 部分 "Re-run failed jobs" 卡死 publish-resolution(Critical,rc:3888643378)— 已修复。 先复现:用该路径真实产生的输出(RESOLVE_OUTCOME=successFAILURE_KIND=infra、artifact 缺失)驱动真实的 Report result run 块,捕获到发布的评论——"the agent step ended with outcome=success before producing a result — a CLI install, model endpoint or infrastructure failure… Requesting /resolve again will fail the same way"——每一句都自相矛盾,且解决结果在之后每次部分重跑中都保持未推送。根因:publish job 按自己的 github.run_attempt 下载 artifact,但只有运行过 agent 的那次尝试上传过它。修复:把运行 agent 的尝试编号跨过 job 边界传递(Resolve pull request 用 runner 提供的 GITHUB_RUN_ATTEMPT 写出 run_attemptresolve-pragent_run_attempt 暴露),并按它下载——部分重跑因此能取到真实存在的 artifact 并发布。残余情形(agent 成功、但 artifact 因上传失败/过期真正丢失)单独归类为 failure_kind=artifact_missing:评论说明 agent 已完成、结果未能发布、Re-run all jobs 是唯一能重新产生 artifact 的恢复方式——绝不再说 "will fail the same way"。四条推送失败评论中引用的 artifact 名也改用 agent 的尝试编号。见证:fixture 场景 (d)/(d2) 驱动真实 Resolution check 块覆盖两个分支;全部新钉子在改动前分支上为红(3 条 vitest + 1 条 node:test 失败)、修复后为绿;六个变异探针(删除输出写入 / 回退下载名 / 删除报告分支 / 重新归为 infra / 删除 gitfile 守卫 / 删除 GIT_TERMINAL_PROMPT=0)每次都让套件变红,恢复后变绿。

R7-1 — follow-up bot 的 CLI 版本钉在其主车道上无效(Critical,审查正文)— 已修复(采用文档化选项)。 对照钉住 SHA(05f8171)的 action 源码核实:Install Qwen Code 先执行 command -v qwen,已存在即跳过——在 ecs-qwen 池上恒为真(机群 CLI 由 update-ecs-runner-qwen.yml 维护,默认 @latest)。该钉子只在 ubuntu-latest 备用车道生效,因此 "the pin wins" 在主车道上构成虚假背书。选择审查者给出的文档化选项:workflow 注释与契约测试注释改为陈述真实契约(ecs-qwen 上以机群版本为准;钉子约束 PATH 上没有 qwen 的 runner)。另一选项(在共享自托管 runner 上把钉住的版本装到机群二进制之前/之上)触及本 PR 足迹之外的机群运维,已记入延期跟进队列。

验证报告发现(ic:5464747770):

  1. .size-baseline 低于实际 — 已修复:两个改动过的 workflow 均按精确大小记录(qwen-code-pr-review.yml 193207、qwen-issue-followup-bot.yml 21443);check-workflow-size.sh 以零余量通过。
  2. qwen-resolve-workflow.test.js 中的过期交叉引用("see 'hardens the post-agent steps'"——该测试已不存在)— 已修复,改指拆分测试。
  3. 范围守卫注释中的乱码("ponytail: tr back…",base 上已存在)— 顺带修复(改为 "then tr back"),仅一个分句。
  4. 变异幸存者 M9/M10 — 已修复:为 Package resolution[ ! -d .git ] gitfile 守卫与 Report resultexport GIT_TERMINAL_PROMPT=0 补契约钉;两个探针在守卫删除时均变红。

复核确认早先提交已解决(线程列表供解析): R1-8 体积门禁(两条)、R1-4、R1-6、R1-7、R2-1 谱系、R4-1、R4-3、R4-5、R4-11、R4-12、R4-13、R4-17、R4-19、R5-1/R5-5/R5-7/R5-8、R5-2 家族 (a/b/c/d/e/f/g/j)、R6-1 yamllint 引号、R6-2 attempt 后缀——全部在当前树上复核:结构性拆分(af381c10ac)、接线/顺序钉(1d7b829d7c)、attempt 后缀与 yamllint 修复(4fb0c4490a)均成立,所有被钉契约在本 HEAD 上为绿。

未以代码解决: rc:3883806890(R1-5,百分位可复现性)——该发现本身允许"数据证实则无需改代码";作者已在线程中贴出完整提取方法(评论 rc:3887615289)。留给维护者关闭;已回复记录处置。审查者第 6/7 轮的延后探针清单明确为"仅记录、本轮不要求",未触碰。"失败检查"部分(Test CANCELLED、web-shell E2E Smoke、Post Coverage Comment)反映的是上一次推送的状态:挡红 Test job 的 yamllint 失败在本轮之前已于当前 HEAD 修复;另外两项与本 PR 改动的文件无关——以下次推送的 CI 重跑为准。

验证

本轮实际执行的命令(结果):

  • 复现探针(修复前,真实 Report result 块,gh 打桩):发布出自相矛盾的评论——缺陷复现
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js scripts/tests/review-artifact-upload.test.js scripts/tests/workflow-size.test.js — 3 个文件,编辑前基线 250 通过,编辑后仍 250 通过
  • node --test .github/scripts/qwen-triage-workflow.test.mjs124 通过 / 0 失败(编辑前后一致)
  • 改动前门禁:本轮测试对改动前 workflow 运行 — 3 条 vitest 失败 + 1 条 node:test 失败(见证真实、非空转)
  • 变异探针 ×6(逐一删除新守卫 → 套件变红;恢复 → 变绿)— 全部符合要求
  • 修复后探针(真实 Report result 块,failure_kind=artifact_missing):发布如实的 "finished successfully … Re-run all jobs" 措辞
  • bash .github/scripts/check-workflow-size.sh通过(两处更新的条目均为零余量)
  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • node scripts/lint.js --yamllint — 本 runner 未安装 yamllint 二进制(xargs: yamllint: No such file or directory;CI 用 pip 钉住 yamllint 1.35.1,此处与沙箱验证容器同样不可用);本轮新增的每个 YAML 值均采用要求的单引号形式,配置无行宽规则;以 CI 的 Run yamllint 步骤为长期钉子
  • R7-1 证据:拉取 QwenLM/qwen-code-action@05f8171… 的 action.yml — 确认安装步骤 command -v qwen 跳过;确认 update-ecs-runner-qwen.yml 机群安装

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

🧵 Resolved all 37 selected review thread(s). · 已关闭全部选中的 37 条评审线程。

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.

⚠️ Round 8, and the diff has grown 4.9x since this review first measured it (142 → 700 source diff lines). The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

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

  • resolve-pr outputs producer-half contract unpinned (qwen-code-pr-review.yml:2478) — already reported in round-6 review 5059565836's deferred list, re-confirmed in round 7
  • resolve-pr job-level env credential scan (scripts/tests/qwen-resolve-workflow.test.js:842) — already reported in round-6 review 5059565836's deferred list
  • bare always() gates on publish steps unpinned (scripts/tests/qwen-resolve-workflow.test.js:907) — already reported in round-6 review 5059565836's deferred list
  • mkdir -p WORKDIR witness (qwen-code-pr-review.yml:3181) — already reported in round-6 review 5059565836's deferred list
  • moved-head update-ref fixture case (scripts/tests/qwen-resolve-workflow.test.js:885) — already reported in round-6 review 5059565836's deferred list
  • MODEL_ARGS/OPENAI_MODEL wiring pin (qwen-code-pr-review.yml:2845) — already reported in round-7 review 5060110516's deferred list
  • unreachable-HEAD refusal failure_kind witness (qwen-code-pr-review.yml:3028) — already reported in round-7 review 5060110516's deferred list
  • settings write source bound to $QWEN_SETTINGS (.github/scripts/qwen-triage-workflow.test.mjs:266) — already reported in round-6 review 5059565836's deferred list
  • decoy pins substring/position (.github/scripts/qwen-triage-workflow.test.mjs:356) — already reported in round-6 review 5059565836's deferred list
  • post-agent credential scan run:/if: coverage (.github/scripts/qwen-triage-workflow.test.mjs:444) — already reported in round-6 review 5059565836's deferred list
  • resolve-side decoy pins cover 2 of 4 assignments (scripts/tests/qwen-resolve-workflow.test.js:989) — already reported as R5-2(d), comment 3887462739
  • skip-step exception gate disjunction pin (.github/scripts/qwen-triage-workflow.test.mjs:437) — already reported in round-6 review 5059565836's deferred list

Not reviewed: reverse audit — stopped at the reverse-audit round cap of 5 without converging.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory.

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

  • .github/workflows/qwen-code-pr-review.yml:3047 — [review] infra early-exit discards a committed-and-packaged resolution bundle (probe-verified)
  • .github/scripts/qwen-triage-workflow.test.mjs:485 — [review] resolve-pr permissions block unpinned; delete/widen mutants ship green (probe-verified)
  • .github/workflows/qwen-code-pr-review.yml:3025 — [review] unguarded first git fetch aborts before outcome= is written (probe-verified)
  • .github/workflows/qwen-code-pr-review.yml:3072 — [review] bundle import lines unguarded under set -e bypass the classified refusal (probe-verified)
  • .github/workflows/qwen-code-pr-review.yml:2689 — [review] --registry flag on 'Install Qwen CLI' pinned by no test (probe-verified)
  • scripts/tests/review-artifact-upload.test.js:306 — [review] GITHUB_STATE never decoyed; 'All four runner command files' claim inaccurate (probe-verified)

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had no anchor this round could use either — none at all, one with no certifier, one certified by an identity other than the one this round runs under, or one this round's fetch refused or resolved to the head — so the next review re-reads the whole diff unless recovery grafts an earlier own anchor that the round running it can use onto the complete work list this round leaves behind, and keeps doing so until a round's marker carries an anchor again or a graft lands that the round running it can use. (Stated, not acted on — this changes nothing about what the round posts.)

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step skips unconditionally when qwen is already on PATH — always true on the ecs-qwen pool the job routes to by default (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'; the pin binds only the ubuntu-latest fallback lane. A broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: verified at HEAD 06d174b — qwen-issue-followup-bot.yml routes to the ecs-qwen pool by default (line 57) and pins qwen_cli_version: '0.21.10' (line 312), and the diff's own added comment concedes: 'On the ecs-qwen pool — this job's default lane — the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml is therefore authoritative; the pin binds the ubuntu-latest fallback lane.' Fix: make the pin effective on the primary lane — route the follow-up job to ubuntu-latest (where the pin binds), pin the fleet-installed version in update-ecs-runner-qwen.yml, or force the pinned install on the ecs-qwen lane even when qwen is already on PATH. (This round's inline anchor at the pin line was dropped by position overlap with existing comment 3886465040 — R4-7, a different finding on the same line; R7-1's only prior copy is in round 7's review body, so the still-standing blocker is carried here.)

中文说明

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

⚠️ 第 8 轮,且自本审查首次测量以来 diff 已增长 4.9 倍(源码 diff 行数 142 → 700)。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

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

未审查:reverse audit — stopped at the reverse-audit round cap of 5 without converging。

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory

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

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有留下本轮可用的锚点——要么完全没有、要么没有认证者、要么由本轮运行身份之外的身份认证、要么被本轮的获取拒绝或解析为头提交——因此下一次评审将重读整个 diff,除非恢复流程把本轮能使用的更早自有锚点嫁接到本轮留下的完整工作清单上;并会一直如此,直到某一轮的标记重新带上锚点,或落地的嫁接能被运行该轮的评审使用。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step skips unconditionally when qwen is already on PATH — always true on the ecs-qwen pool the job routes to by default (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'; the pin binds only the ubuntu-latest fallback lane. A broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: verified at HEAD 06d174b — qwen-issue-followup-bot.yml routes to the ecs-qwen pool by default (line 57) and pins qwen_cli_version: '0.21.10' (line 312), and the diff's own added comment concedes: 'On the ecs-qwen pool — this job's default lane — the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml is therefore authoritative; the pin binds the ubuntu-latest fallback lane.' Fix: make the pin effective on the primary lane — route the follow-up job to ubuntu-latest (where the pin binds), pin the fleet-installed version in update-ecs-runner-qwen.yml, or force the pinned install on the ecs-qwen lane even when qwen is already on PATH. (This round's inline anchor at the pin line was dropped by position overlap with existing comment 3886465040 — R4-7, a different finding on the same line; R7-1's only prior copy is in round 7's review body, so the still-standing blocker is carried here.)

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

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

⚠️ Round 9, and the diff has grown 4.9x since this review first measured it (142 → 700 source diff lines). The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

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

  • R9-1 post-agent containment scan misses resolve-pr's job-level env block — already reported (round-6 review 5059565836's deferred list, 'job-level secret mutant ships green'; re-confirmed in rounds 7 and 8)
  • R9-3 bare always() gates on publish's 'Resolution check'/'Report result' unpinned — already reported (round-6 review 5059565836's deferred list; re-confirmed in round 8)
  • R9-4 six of nine resolve-pr.outputs producer mappings unpinned — already reported (round-6 review 5059565836's deferred list, 'producer half of the resolve-pr outputs contract unpinned'; re-confirmed in rounds 7 and 8)

Not reviewed: reverse audit — stopped at the reverse-audit round cap of 5 without converging.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory.

6 Suggestion(s) were drafted inline past the resolved critical posting floor; the CLI moved them into the deferral list below (floor enforcement).

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

  • scripts/tests/qwen-resolve-workflow.test.js:1397 — [review] D9-1: The never-ran block's terminating exit 1 has no test witness: with a packageable bundle present, deleting that exit 1 leaves every test in this suite green while the publ…
  • .github/workflows/qwen-code-pr-review.yml:2772 — [review] D9-2: The suites pin PROMPT's content and its consumption ( --prompt "$PROMPT" ), but nothing asserts the step env defines the key PROMPT by name — unlike QWEN_SETTINGS , which th…
  • scripts/tests/qwen-resolve-workflow.test.js:800 — [review] D9-3: This pin moved Unresolved index conflicts remain to the publish job, but the git ls-files -u check it pins (qwen-code-pr-review.yml:3100) is structurally unreachable there…
  • .github/scripts/qwen-triage-workflow.test.mjs:406 — [review] D9-4: The agent step's credential scan matches env key names against /TOKEN|PAT/ only; no test scans the env values for ${{ secrets. refs, so a GitHub credential under an inno…
  • .github/workflows/qwen-code-pr-review.yml:2899 — [review] D9-5: The new artifact file resolution.sha is written and uploaded with the run artifact but has no reader anywhere — a dead write across the agent→publish trust boundary, implying…
  • .github/scripts/qwen-triage-workflow.test.mjs:384 — [review] D9-6: The new pin proves the four command-file truncations are textually present after status=$? , but not that they are reachable — an exit inserted between status=$? and th…

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had no anchor this round could use either — none at all, one with no certifier, one certified by an identity other than the one this round runs under, or one this round's fetch refused or resolved to the head — so the next review re-reads the whole diff unless recovery grafts an earlier own anchor that the round running it can use onto the complete work list this round leaves behind, and keeps doing so until a round's marker carries an anchor again or a graft lands that the round running it can use. (Stated, not acted on — this changes nothing about what the round posts.)

Residual risk: this loop is persistently critical — Criticals stood in the previous round's work-list and stand again this round (1 Critical(s)), the rate of first-time findings is not falling (this round 0, previous 0), and the standing Critical backlog is not shrinking. The severity floor will not converge it. Recommendation: land-with-residual-risk — the exit is a maintainer risk-acceptance decision (merge, carrying the residual risk), not another review round. Residual-risk inventory for that decision (maintainer to complete):

standing Critical attack surface attacker-dependency blast radius
(each standing Critical)

Advisory only — it does not block this review.

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step skips unconditionally when qwen is already on PATH — always true on the ecs-qwen pool the job routes to by default (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'; the pin binds only the ubuntu-latest fallback lane. A broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: verified at HEAD d166a23 — fetched QwenLM/qwen-code-action at the exact pinned SHA 05f81718: its 'Install Qwen Code' step reads if command -v qwen >/dev/null 2>&1; then echo "Qwen Code already installed, skipping install:"; qwen --version; else … npm install … @qwen-code/qwen-code@"${VERSION_INPUT}" …; fi — skip-on-PATH, unconditionally; qwen-issue-followup-bot.yml routes to the ecs-qwen pool by default (line 57) and pins qwen_cli_version: '0.21.10' (line 312), and the diff's own added comment concedes: 'On the ecs-qwen pool — this job's default lane — the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml is therefore authoritative; the pin binds the ubuntu-latest fallback lane.' Fix: make the pin effective on the primary lane — route the follow-up job to ubuntu-latest (where the pin binds), pin the fleet-installed version in update-ecs-runner-qwen.yml, or force the pinned install on the ecs-qwen lane even when qwen is already on PATH. (Carried since round 7; the inline anchor at the pin line overlaps existing comment 3886465040 — R4-7, a different finding on the same line — so the still-standing blocker is carried here.)

中文说明

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

⚠️ 第 9 轮,且自本审查首次测量以来 diff 已增长 4.9 倍(源码 diff 行数 142 → 700)。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

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

未审查:reverse audit — stopped at the reverse-audit round cap of 5 without converging。

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory

6 条 Suggestion 在已解析的 critical 发布下限之外被起草为行内评论;CLI 已将其移入下方延后清单(下限强制执行)。

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

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有留下本轮可用的锚点——要么完全没有、要么没有认证者、要么由本轮运行身份之外的身份认证、要么被本轮的获取拒绝或解析为头提交——因此下一次评审将重读整个 diff,除非恢复流程把本轮能使用的更早自有锚点嫁接到本轮留下的完整工作清单上;并会一直如此,直到某一轮的标记重新带上锚点,或落地的嫁接能被运行该轮的评审使用。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

残余风险:本循环处于 persistently-critical 形态——上一轮工作清单中的 Critical 本轮依然存在(本轮 1 条 Critical),首次发现的速率没有下降(本轮 0,上一轮 0),且未决 Critical 积压没有减少。severity floor 无法使其收敛。建议:land-with-residual-risk——出口是 maintainer 的风险接受决定(合入并承担残余风险),而非再开一轮评审。供该决定使用的残余风险清单(maintainer 填写):按每条未决 Critical 列出「攻击面 · 攻击者依赖性 · 影响范围」三栏。仅为建议——不阻断本次评审。

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step skips unconditionally when qwen is already on PATH — always true on the ecs-qwen pool the job routes to by default (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'; the pin binds only the ubuntu-latest fallback lane. A broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: verified at HEAD d166a23 — fetched QwenLM/qwen-code-action at the exact pinned SHA 05f81718: its 'Install Qwen Code' step reads if command -v qwen >/dev/null 2>&1; then echo "Qwen Code already installed, skipping install:"; qwen --version; else … npm install … @qwen-code/qwen-code@"${VERSION_INPUT}" …; fi — skip-on-PATH, unconditionally; qwen-issue-followup-bot.yml routes to the ecs-qwen pool by default (line 57) and pins qwen_cli_version: '0.21.10' (line 312), and the diff's own added comment concedes: 'On the ecs-qwen pool — this job's default lane — the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml is therefore authoritative; the pin binds the ubuntu-latest fallback lane.' Fix: make the pin effective on the primary lane — route the follow-up job to ubuntu-latest (where the pin binds), pin the fleet-installed version in update-ecs-runner-qwen.yml, or force the pinned install on the ecs-qwen lane even when qwen is already on PATH. (Carried since round 7; the inline anchor at the pin line overlaps existing comment 3886465040 — R4-7, a different finding on the same line — so the still-standing blocker is carried here.)

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Post Coverage Comment (ubuntu-latest, 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Post Coverage Comment (ubuntu-latest, 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

⚠️ Round 10, and the diff has grown 4.9x since this review first measured it (142 → 700 source diff lines). The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

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

  • post-agent containment scan checks only env/with values, not run:/job-level env — already reported (round-6 review 5059565836's deferred list; re-confirmed rounds 7-9 as R9-1)
  • BASE_REF/HEAD_FETCH_REF/HEAD_REF/HEAD_REPO consumer wires unpinned — already reported (round-6 review 5059565836's deferred list; re-confirmed rounds 7-9 as R9-4)
  • moved-head update-ref fixture never exercises the head-move (qwen-resolve-workflow.test.js:885) — already reported (round-6 review 5059565836's deferred list; re-confirmed rounds 7-8)
  • unreachable-HEAD_SHA refusal guard has no test witness (qwen-code-pr-review.yml:3027) — already reported (round-7 review 5060110516's deferred list; re-confirmed round 8)
  • 'Report skipped request' writes report.md without mkdir -p (qwen-code-pr-review.yml:2942) — already reported (round-6 review 5059565836's deferred list)
  • 'Resolution check' crash before its first output write posts the generic wording (qwen-resolve-workflow.test.js:1337) — already reported (round-7 review 5060110516's deferred list)
  • resolve-pr permissions block unpinned (qwen-triage-workflow.test.mjs:485) — already reported (round-8 review 5060625911's deferred list)
  • GITHUB_STATE never decoyed; 'All four runner command files' claim inaccurate (review-artifact-upload.test.js:306) — already reported (round-6 review 5059565836's deferred list)
  • resolve-lane GITHUB_OUTPUT/GITHUB_STEP_SUMMARY decoys unpinned — already reported as R5-2(d) (comment 3887462739, qwen-resolve-workflow.test.js:989)
  • settings.json write / export QWEN_HOME ordering before invocation unpinned (qwen-triage-workflow.test.mjs:266) — already reported (round-6 review 5059565836's deferred list)
  • skip-step exception gate pinned by substring — appending || failure() (qwen-triage-workflow.test.mjs:437) — already reported (round-6 review 5059565836's deferred list)
  • agent step decision=='run' gate unpinned (qwen-triage-workflow.test.mjs:435) — already reported (round-6 review 5059565836's deferred list)
  • decoy pins substring-only; export-form rewrite passes (qwen-triage-workflow.test.mjs:356 +2 locations) — already reported (round-6 review 5059565836's deferred list)
  • pr_number/head_sha producer wires unpinned — within R9-4's scope, 'six of nine resolve-pr.outputs producer mappings unpinned' (round-6 deferred list; re-confirmed rounds 7-9)
  • agent env credential scan checks key names only, not values (qwen-triage-workflow.test.mjs:404-409) — already reported as D9-4 (round-9 review 5061437424's deferred list)
  • 'Install Qwen CLI' before 'Resolve conflicts' unpinned (qwen-triage-workflow.test.mjs:334) — already reported (round-6 review 5059565836's deferred list)

Not reviewed: reverse audit — stopped at the reverse-audit round cap of 5 without converging.

Not reviewed: build-and-test — Test (macos-latest, Node 22.x) was skipped in CI and the changed suite ran locally on Linux only.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory.

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

  • .github/scripts/qwen-triage-workflow.test.mjs:401 — [probe] D10-1 decoy test pins presence only, not the resume-vs-diagnostics order (ordering mutant ships green)
  • .github/workflows/qwen-code-pr-review.yml:2817 — [probe] D10-2 rm -f .qwen/settings.json aborts the agent step when a fork tracks the path as a directory
  • .github/workflows/qwen-code-pr-review.yml:2892 — [probe] D10-3 planted resolution.bundle survives 'Package resolution' early exits and is published with bot endorsement
  • scripts/tests/qwen-resolve-workflow.test.js:1093 — [probe] D10-4 post-import rejection arms unpinned — flipping the failure.md arm's outcome ships a push
  • scripts/tests/qwen-resolve-workflow.test.js:1253 — [probe] D10-5 functional harness drops the runner's errexit; a broken git update-ref ships green
  • scripts/tests/qwen-resolve-workflow.test.js:845 — [probe] D10-6 'Report skipped request' gate's decision=='failed' arm — the documented crash path — is unpinned
  • scripts/tests/qwen-resolve-workflow.test.js:1436 — [probe] D10-7 push_fail_reason comment table pinned only by unordered substrings (arm transpose/delete ship green)
  • scripts/tests/qwen-resolve-workflow.test.js:967 — [probe] D10-8 attempt-suffix pin under-covers three of the four push-failure arms

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had no anchor this round could use either — none at all, one with no certifier, one certified by an identity other than the one this round runs under, or one this round's fetch refused or resolved to the head — so the next review re-reads the whole diff unless recovery grafts an earlier own anchor that the round running it can use onto the complete work list this round leaves behind, and keeps doing so until a round's marker carries an anchor again or a graft lands that the round running it can use. (Stated, not acted on — this changes nothing about what the round posts.)

Residual risk: this loop is persistently critical — Criticals stood in the previous round's work-list and stand again this round (1 Critical(s)), the rate of first-time findings is not falling (this round 0, previous 0), and the standing Critical backlog is not shrinking. The severity floor will not converge it. Recommendation: land-with-residual-risk — the exit is a maintainer risk-acceptance decision (merge, carrying the residual risk), not another review round. Residual-risk inventory for that decision (maintainer to complete):

standing Critical attack surface attacker-dependency blast radius
(each standing Critical)

Advisory only — it does not block this review.

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step skips unconditionally when qwen is already on PATH — always true on the ecs-qwen pool the job routes to by default (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'; the pin binds only the ubuntu-latest fallback lane. Re-checked at this HEAD: routing, pin, and the fleet-update workflow's @latest default (update-ecs-runner-qwen.yml:50) are unchanged, and no fix has landed since round 9. A broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: verified at HEAD 25c2935 — qwen-issue-followup-bot.yml routes to the ecs-qwen pool by default (line 57) and pins qwen_cli_version: '0.21.10' (line 312); update-ecs-runner-qwen.yml resolves specifier='@qwen-code/qwen-code@latest' by default (line 50); the diff's own added comment concedes: 'On the ecs-qwen pool — this job's default lane — the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml is therefore authoritative; the pin binds the ubuntu-latest fallback lane.' Fix: make the pin effective on the primary lane — route the follow-up job to ubuntu-latest (where the pin binds), pin the fleet-installed version in update-ecs-runner-qwen.yml, or force the pinned install on the ecs-qwen lane even when qwen is already on PATH. (Carried since round 7; the inline anchor at the pin line overlaps existing comment 3886465040 — R4-7, a different finding on the same line — so the still-standing blocker is carried here.)

中文说明

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

⚠️ 第 10 轮,且自本审查首次测量以来 diff 已增长 4.9 倍(源码 diff 行数 142 → 700)。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

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

未审查:reverse audit — stopped at the reverse-audit round cap of 5 without converging。

未审查:build-and-test — Test (macos-latest, Node 22.x) was skipped in CI and the changed suite ran locally on Linux only。

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory

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

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有留下本轮可用的锚点——要么完全没有、要么没有认证者、要么由本轮运行身份之外的身份认证、要么被本轮的获取拒绝或解析为头提交——因此下一次评审将重读整个 diff,除非恢复流程把本轮能使用的更早自有锚点嫁接到本轮留下的完整工作清单上;并会一直如此,直到某一轮的标记重新带上锚点,或落地的嫁接能被运行该轮的评审使用。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

残余风险:本循环处于 persistently-critical 形态——上一轮工作清单中的 Critical 本轮依然存在(本轮 1 条 Critical),首次发现的速率没有下降(本轮 0,上一轮 0),且未决 Critical 积压没有减少。severity floor 无法使其收敛。建议:land-with-residual-risk——出口是 maintainer 的风险接受决定(合入并承担残余风险),而非再开一轮评审。供该决定使用的残余风险清单(maintainer 填写):按每条未决 Critical 列出「攻击面 · 攻击者依赖性 · 影响范围」三栏。仅为建议——不阻断本次评审。

[Critical] R7-1: [certifies-falsely] [new-surface] The follow-up bot's CLI version pin is a dead switch on its primary lane: the pinned action's 'Install Qwen Code' step skips unconditionally when qwen is already on PATH — always true on the ecs-qwen pool the job routes to by default (qwen-issue-followup-bot.yml:57) — so the bot there runs the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml, not '0.21.10'; the pin binds only the ubuntu-latest fallback lane. Re-checked at this HEAD: routing, pin, and the fleet-update workflow's @latest default (update-ecs-runner-qwen.yml:50) are unchanged, and no fix has landed since round 9. A broken or unwanted npm publish propagates to the ECS fleet via the fleet-update workflow's @latest default, and the bot's next schedule run (cron 5 */6 * * *) executes the agent on that CLI despite the declared pin — the exact 2026-08-15 notarget outage class this hunk exists to prevent. Witness: verified at HEAD 25c2935 — qwen-issue-followup-bot.yml routes to the ecs-qwen pool by default (line 57) and pins qwen_cli_version: '0.21.10' (line 312); update-ecs-runner-qwen.yml resolves specifier='@qwen-code/qwen-code@latest' by default (line 50); the diff's own added comment concedes: 'On the ecs-qwen pool — this job's default lane — the fleet-installed CLI maintained at @latest by update-ecs-runner-qwen.yml is therefore authoritative; the pin binds the ubuntu-latest fallback lane.' Fix: make the pin effective on the primary lane — route the follow-up job to ubuntu-latest (where the pin binds), pin the fleet-installed version in update-ecs-runner-qwen.yml, or force the pinned install on the ecs-qwen lane even when qwen is already on PATH. (Carried since round 7; the inline anchor at the pin line overlaps existing comment 3886465040 — R4-7, a different finding on the same line — so the still-standing blocker is carried here.)

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

R7-1 (review rounds 7-10): the follow-up bot's qwen_cli_version pin was a
dead switch on its primary lane. The job routes to the ecs-qwen pool by
default, where `qwen` is always on PATH — the fleet-installed CLI that
update-ecs-runner-qwen.yml maintains at `latest` — and the pinned action's
'Install Qwen Code' step skips unconditionally when `qwen` is already
present (verified at the pinned action SHA). The bot therefore ran the
fleet CLI, not 0.21.10: a broken npm publish propagating through the
fleet update would run the agent despite the declared pin — the exact
2026-08-15 notarget outage class the pin exists to prevent. The previous
round rewrote the comment to concede the dead pin; this makes the pin
effective instead.

Add a job-local install step before the action: `npm install --prefix`
into $RUNNER_TEMP (not -g — a global install on the shared ECS machines
would fight the fleet-maintenance contract) and prepend its bin dir to
GITHUB_PATH. The pinned copy outranks the fleet CLI on ecs-qwen and is
the only CLI on the ubuntu-latest fallback lane; the action's install
then skips over the pinned copy on BOTH lanes. The action's
qwen_cli_version input now carries the installed version from the step
output, so the declared input can never drift from what runs (same
ensure->wire shape as qwen-triage.yml).

The contract test pins the whole mechanism: step presence, exact-version
pin, job-local --prefix install, registry pin, PATH prepend, ordering
before the action step, and the input wired from the step output.
Mutation probes: step deletion, -g install, dropped PATH prepend,
dist-tag version, reverted input literal, and reordered steps all red.

Also records the exact sizes in .size-baseline: qwen-code-pr-review.yml
193208 (one byte merged in from #10537's runner rename) and the
follow-up bot's grown file.
@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 轮)。改动内容与我反驳保留之处如下:

Review round summary — PR #10428

Outcome: changed. One commit (a85176154b) resolves the standing Critical
R7-1 and the remaining size-baseline drift; every other feedback point was
verified as already resolved at this HEAD or explicitly deferred by the
reviews themselves. No conflicts (--conflict false); the branch already
contains the origin/main merge, so no merge was performed.

Feedback points and dispositions

Critical R7-1 — the follow-up bot's CLI version pin was a dead switch on its primary lane → Fixed

Carried in review rounds 8/9/10 (rv:5060625911, rv:5061437424,
rv:5061835418). The claim is checkable and stood at this HEAD:
qwen-issue-followup-bot.yml routes the job to the ecs-qwen pool by
default, where qwen is always on PATH (the fleet-installed CLI maintained
at latest by update-ecs-runner-qwen.yml), and the pinned action's
'Install Qwen Code' step skips unconditionally when qwen is present — so
the declared qwen_cli_version: '0.21.10' never bound the lane where the bot
actually runs. The previous round answered with a comment rewrite conceding
the dead pin; the review correctly kept it open because the defect is
behavioral, not documentary.

Fix (the reviewer's "force the pinned install even when qwen is on PATH"
option — the minimal lane-local one; rerouting the job off the ECS pool or
pinning the whole fleet's CLI version were rejected as scope changes):

  • New Install pinned Qwen CLI step (id: install_qwen) before the action:
    installs @qwen-code/qwen-code@0.21.10 with npm install --prefix into
    $RUNNER_TEMP (job-local — a global install would fight the
    fleet-maintenance contract on the shared ECS machines), then prepends its
    bin dir to GITHUB_PATH. The pinned copy outranks the fleet CLI on
    ecs-qwen and is the only CLI on the ubuntu-latest fallback lane.
  • The action's own install then skips over the pinned copy on both lanes
    (skip-on-PATH, verified at the pinned action SHA), so the agent runs the
    pinned CLI everywhere.
  • The action's qwen_cli_version input now carries
    ${{ steps.install_qwen.outputs.version }} — the installed version, wired
    the same way qwen-triage.yml wires steps.ensure_qwen.outputs.version
    so the declared input can never drift from what actually runs.
  • The old 13-line comment that certified the dead pin is replaced by the
    rationale on the install step plus a 4-line note on the input.
  • The contract test (qwen-triage-workflow.test.mjs) now pins the whole
    mechanism: step presence, exact-version pin, job-local --prefix install,
    registry pin, PATH prepend, ordering before the action step, and the input
    wired from the step output.

Size baseline drift (verify-bot Finding #2) → Fixed

The verification comment measured the baseline undershooting the file; after
commit 06d174bd7f bumped the entries, the origin/main merge brought in
#10537's one-line ecs-qwenecs-agent rename in
qwen-code-pr-review.yml (+1 byte) without a matching bump. .size-baseline
now records exact sizes: 193208 qwen-code-pr-review.yml and
22680 qwen-issue-followup-bot.yml (this round's growth). The ratchet passes
with zero slack on both files.

Verify-bot Finding #1 — publish-only re-run misses its own artifact → Already fixed at this HEAD

The comment was produced against the previous head 4fb0c4490a; commit
06d174bd7f (already on this branch) landed the suggested fix shape.
Re-verified at this HEAD: the agent step records
run_attempt=${GITHUB_RUN_ATTEMPT} into its outputs, resolve-pr exposes
agent_run_attempt, and publish-resolution downloads by
needs.resolve-pr.outputs.agent_run_attempt — the attempt that ran the
agent, not its own. The residual genuinely-missing-artifact case has its own
classification (failure_kind=artifact_missing) and comment arm instead of
blaming the agent run. All three are pinned by the triage contract test,
which ran green this round.

Verify-bot Findings #3 and #4 — stale test comment / garbled comment → Already fixed at this HEAD

Both were repaired by commit 06d174bd7f; the strings
hardens the post-agent steps and ponytail: no longer exist anywhere in
the tree (grep-verified).

Verify-bot Finding #5 — unpinned M9/M10 guards → Already pinned at this HEAD; pins probe-verified this round

Commit 06d174bd7f added contract pins for the gitfile guard in
Package resolution and export GIT_TERMINAL_PROMPT=0 in Report result.
This round re-ran the mutation probes to confirm the pins have witnesses:
deleting the [ ! -d .git ] guard or the GIT_TERMINAL_PROMPT=0 line each
turns qwen-resolve-workflow.test.js red; the restored file is
byte-identical.

Review suggestions deferred under the convergence posture → No action (deferred by the reviews themselves)

Rounds 8/9/10 each list Suggestion-level findings (D9-1…D9-6, D10-1…D10-8,
and the 12/3/16 "already reported and not repeated" items) explicitly
"Deferred under the convergence posture — recorded, not requested in this
round" and "not a blocker". They remain tracked in the review's own ledger;
this round does not re-open them. Per the round-5+ guideline, the round
landed the Critical fix and the same-PR baseline correction only.

Residual-risk recommendation → Maintainer decision; the standing Critical is now retired

Round 10 recommended land-with-residual-risk, naming the exit as a
maintainer risk-acceptance decision, with R7-1 as the standing Critical.
R7-1 is now fixed and probe-witnessed, so the residual-risk inventory for
that decision no longer contains it.

Failed checks on the previous run → Nothing actionable in code

Test (ubuntu-latest Node 22.x) and Integration Tests (no-AK No Sandbox)
were CANCELLED (not failed) — superseded by later pushes. The still-red
checks list is empty. Post Coverage Comment FAILURE is a comment-posting
utility outside this PR's footprint; there is no evidence linking it to this
PR's content.

Changed files

  • .github/workflows/qwen-issue-followup-bot.yml — new Install pinned Qwen CLI step; action input rewired to the installed version; comments
    updated.
  • .github/scripts/qwen-triage-workflow.test.mjs — contract test rewritten
    to pin the new mechanism.
  • .github/workflows/.size-baseline — exact sizes recorded (193208,
    22680).

Verification

  • node --test .github/scripts/qwen-triage-workflow.test.mjspassed (124 passed · 0 failed)
  • npx vitest run --config ./scripts/tests/vitest.config.ts workflow-size qwen-resolve-workflow review-artifact-upload qwen-pr-review-workflowpassed (4 files · 431 passed)
  • bash .github/scripts/check-workflow-size.shpassed (every workflow under the gate and within its ratchet)
  • npm run buildpassed (exit 0)
  • npm run typecheckpassed (exit 0)
  • npm run lintpassed (exit 0)
  • npx prettier --check .github/scripts/qwen-triage-workflow.test.mjspassed
  • Mutation probes on this round's new pins — 6/6 mutants red, canonical green: delete the install step; drop the GITHUB_PATH prepend; revert the action input to a version literal; change the pin to latest; change --prefix to -g; move the install step after the action step.
  • Mutation probes re-verifying the prior round's M9/M10 pins — 2/2 mutants red (gitfile guard deletion; GIT_TERMINAL_PROMPT=0 deletion), file restored byte-identical.
  • npm install --prefix bin-layout premise — empirically confirmed with a benign proxy package (<prefix>/node_modules/.bin/<bin>).
  • YAML linting: yamllint and actionlint are not installable in this environment (same limitation the sandboxed verification reported). Shape checks substituted: the workflow parses with the repo's yaml parser (contract tests), bash -n is clean on the new run block, and every added quoted YAML scalar is single-quoted per .yamllint.yml.
中文说明

评审轮次总结 — PR #10428

结果:有改动。 一个提交(a85176154b)解决了遗留的 Critical R7-1
和剩余的尺寸基线漂移;其余每一条反馈要么已在本 HEAD 上核实为已解决,
要么由评审自身明确延后。无冲突(--conflict false);分支已包含
origin/main 的合并,因此未再执行合并。

反馈点与处置

Critical R7-1 —— follow-up bot 的 CLI 版本钉在其主通道上是死开关 → 已修复

由评审第 8/9/10 轮携带(rv:5060625911、rv:5061437424、
rv:5061835418)。该论断可检验且在本 HEAD 上依然成立:
qwen-issue-followup-bot.yml 默认把该 job 路由到 ecs-qwen 池,
该池上 qwen 始终在 PATH 中(由 update-ecs-runner-qwen.yml 维护在
latest 的机队安装 CLI),而钉住的 action 的 'Install Qwen Code' 步骤
qwen 已存在时无条件跳过 —— 因此声明的
qwen_cli_version: '0.21.10' 从未约束到 bot 实际运行的通道。上一轮以
重写注释承认该死钉作答;评审正确地让它继续开放,因为缺陷是行为性的,
不是文档性的。

修复(采用评审给出的"即使 qwen 已在 PATH 上也强制钉版安装"选项 ——
最小的通道内局部方案;把 job 改路由出 ECS 池、或钉住整个机队的 CLI
版本,均因属范围变更而被否决):

  • 在 action 之前新增 Install pinned Qwen CLI 步骤(id: install_qwen):
    npm install --prefix@qwen-code/qwen-code@0.21.10 安装到
    $RUNNER_TEMP(job 本地 —— 全局安装会在共享 ECS 机器上与机队维护
    契约冲突),然后将其 bin 目录前置到 GITHUB_PATH。钉版副本在
    ecs-qwen 上优先于机队 CLI,在 ubuntu-latest 后备通道上则是唯一
    CLI。
  • 随后 action 自己的安装在两条通道上都会跳过这个钉版副本
    (在 PATH 即跳过,已在钉住的 action SHA 上核实),因此 agent 在任何
    地方运行的都是钉版 CLI。
  • action 的 qwen_cli_version 输入现在携带
    ${{ steps.install_qwen.outputs.version }} —— 即安装出的版本,接线
    方式与 qwen-triage.ymlsteps.ensure_qwen.outputs.version 相同 ——
    因此声明的输入永远不会与实际运行的版本漂移。
  • 原先那段为死钉背书的 13 行注释,替换为安装步骤上的理由说明加输入处
    4 行说明。
  • 契约测试(qwen-triage-workflow.test.mjs)现在钉住整套机制:步骤
    存在、精确版本钉、job 本地 --prefix 安装、registry 钉、PATH 前置、
    位于 action 步骤之前的顺序、以及输入从步骤输出接线。

尺寸基线漂移(验证机器人发现 #2)→ 已修复

验证评论测得基线低于文件实际大小;在提交 06d174bd7f 提升条目之后,
origin/main 合并带入了 #10537qwen-code-pr-review.yml 的单行
ecs-qwenecs-agent 更名(+1 字节),却没有同步提升基线。
.size-baseline 现在记录精确尺寸:193208 qwen-code-pr-review.yml
22680 qwen-issue-followup-bot.yml(本轮增长)。棘轮在两个文件上以
零余量通过。

验证机器人发现 #1 —— 仅重跑 publish 时找不到自己的 artifact → 本 HEAD 上已修复

该评论产生于上一个 head 4fb0c4490a;提交 06d174bd7f(已在本分支上)
已按建议的修复形态落地。在本 HEAD 上复核:agent 步骤把
run_attempt=${GITHUB_RUN_ATTEMPT} 写入其输出,resolve-pr 暴露
agent_run_attemptpublish-resolution
needs.resolve-pr.outputs.agent_run_attempt 下载 —— 即运行 agent 的那次
attempt,而不是它自己的。真正丢失 artifact 的残留情形有自己的分类
failure_kind=artifact_missing)和评论分支,不再归咎于 agent 运行。
三者都由 triage 契约测试钉住,该测试本轮跑绿。

验证机器人发现 #3#4 —— 过期测试注释 / 乱码注释 → 本 HEAD 上已修复

两者均已由提交 06d174bd7f 修复;字符串
hardens the post-agent stepsponytail: 在整棵树中已不存在
(grep 核实)。

验证机器人发现 #5 —— 未钉住的 M9/M10 守卫 → 本 HEAD 上已钉住;本轮以探针核实

提交 06d174bd7fPackage resolution 中的 gitfile 守卫和
Report result 中的 export GIT_TERMINAL_PROMPT=0 补了契约钉。本轮
重跑变异探针确认这些钉有见证:删除 [ ! -d .git ] 守卫或删除
GIT_TERMINAL_PROMPT=0 行,都会让 qwen-resolve-workflow.test.js
变红;恢复后的文件逐字节一致。

收敛姿态下延后的评审建议 → 不处理(由评审自身延后)

第 8/9/10 轮各自列出建议级发现(D9-1…D9-6、D10-1…D10-8,以及
12/3/16 条"已报告不再重复"项),并明确标注"在收敛姿态下延后 ——
已记录,本轮不要求修改"且"非阻断"。它们仍由评审自己的台账跟踪;
本轮不重新打开。依照第 5 轮之后的准则,本轮只落地 Critical 修复与
同 PR 的基线更正。

残余风险建议 → 由 maintainer 决策;遗留 Critical 现已消除

第 10 轮建议 land-with-residual-risk,指出出口是 maintainer 的
风险接受决定,并把 R7-1 列为遗留 Critical。R7-1 现已修复并有探针
见证,因此该决策的残余风险清单中不再包含它。

上一次运行的失败检查 → 代码层面无可处理项

Test (ubuntu-latest Node 22.x)Integration Tests (no-AK No Sandbox)
是 CANCELLED(被取消,非失败)—— 已被后续推送取代。仍红检查清单为空。
Post Coverage Comment 的 FAILURE 是一个评论发布工具,位于本 PR 足迹
之外;没有证据表明它与本 PR 内容相关。

变更文件

  • .github/workflows/qwen-issue-followup-bot.yml —— 新增
    Install pinned Qwen CLI 步骤;action 输入改接安装出的版本;注释
    更新。
  • .github/scripts/qwen-triage-workflow.test.mjs —— 重写契约测试以
    钉住新机制。
  • .github/workflows/.size-baseline —— 记录精确尺寸(193208、
    22680)。

验证

  • node --test .github/scripts/qwen-triage-workflow.test.mjs —— 通过(124 通过 · 0 失败)
  • npx vitest run --config ./scripts/tests/vitest.config.ts workflow-size qwen-resolve-workflow review-artifact-upload qwen-pr-review-workflow —— 通过(4 个文件 · 431 通过)
  • bash .github/scripts/check-workflow-size.sh —— 通过(所有工作流低于门禁且位于棘轮之内)
  • npm run build —— 通过(exit 0)
  • npm run typecheck —— 通过(exit 0)
  • npm run lint —— 通过(exit 0)
  • npx prettier --check .github/scripts/qwen-triage-workflow.test.mjs —— 通过
  • 针对本轮新钉的变异探针 —— 6/6 变体变红、canonical 为绿:删除安装步骤;去掉 GITHUB_PATH 前置;把 action 输入还原为版本字面量;把钉改为 latest;把 --prefix 改为 -g;把安装步骤移到 action 步骤之后。
  • 复核上一轮 M9/M10 钉的变异探针 —— 2/2 变体变红(删除 gitfile 守卫;删除 GIT_TERMINAL_PROMPT=0),文件恢复后逐字节一致。
  • npm install --prefix 的 bin 布局前提 —— 以无害代理包实证确认<prefix>/node_modules/.bin/<bin>)。
  • YAML 检查:本环境无法安装 yamllint 与 actionlint(与沙箱验证报告的同一限制)。以形状检查替代:工作流可被仓库的 yaml 解析器解析(契约测试)、新 run 块通过 bash -n、且按 .yamllint.yml 要求,所有新增带引号的 YAML 标量均为单引号。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ Downgraded from Approve to Comment: CI failing: Post Coverage Comment (ubuntu-latest, 22.x), Test (ubuntu-latest, Node 22.x). Reviewed.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Test Plan (not a blocker): @qwen-code/qwen-code@0.21.12no such file or directory.

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

  • .github/scripts/qwen-triage-workflow.test.mjs:444 — [probe] D11-1 post-agent credential scan misses run:-inline and job-level env secrets
  • .github/workflows/qwen-code-pr-review.yml:3006 — [probe] D11-2 always() gates on 'Resolution check'/'Report result' unpinned
  • .github/workflows/qwen-code-pr-review.yml:2818 — [probe] D11-3 OPENAI_*/MODEL_ARGS model wiring unpinned
  • .github/workflows/qwen-code-pr-review.yml:3200 — [probe] D11-4 'Report result' mkdir -p "${WORKDIR}" load-bearing but unpinned
  • .github/workflows/qwen-code-pr-review.yml:1462 — [review] D11-5 review-side real command files never truncated; new comment contradicts the diff's own rationale
  • .github/scripts/qwen-triage-workflow.test.mjs:405 — [probe] D11-6 agent-env credential pin checks key names only, never values
  • .github/scripts/qwen-triage-workflow.test.mjs:438 — [probe] D11-7 'Report skipped request' gate admits || failure() widening
  • .github/workflows/qwen-code-pr-review.yml:2474 — [probe] D11-8 six resolve-pr job-output mappings producer-unpinned
  • .github/scripts/qwen-triage-workflow.test.mjs:641 — [probe] D11-9 followup-bot version= output producer unpinned
  • .github/workflows/qwen-code-pr-review.yml:2686 — [probe] D11-10 cross-workflow QWEN_CLI_VERSION equality unpinned
  • .github/workflows/qwen-code-pr-review.yml:2945 — [probe] D11-11 'Report skipped request' lacks the mkdir -p its mirror got in this diff
  • scripts/tests/qwen-resolve-workflow.test.js:874 — [probe] D11-12 publish checkout fetch-depth: 0 unpinned (shallow aborts 'Resolution check')
  • .github/workflows/qwen-code-pr-review.yml:3079 — [probe] D11-13 mid-stream artifact download defeats the artifact_missing classifier
  • .github/workflows/qwen-code-pr-review.yml:2825 — [review] D11-14 containment comment contradicts itself about the credentialed push
  • .github/workflows/qwen-code-pr-review.yml:2835 — [probe] D11-15 resolve-lane stop_token entropy assignment unpinned
  • .github/scripts/qwen-triage-workflow.test.mjs:512 — [probe] D11-16 BASE_REF/HEAD_FETCH_REF/PR_NUMBER consumer env wiring unpinned
  • .github/scripts/qwen-triage-workflow.test.mjs:493 — [probe] D11-17 no-agent pin on publish-resolution blind to uses: steps
  • scripts/tests/qwen-resolve-workflow.test.js:967 — [probe] D11-18 push-failure arms' attempt-suffix pinned once for the whole step
  • .github/workflows/qwen-code-pr-review.yml:3186 — [probe] D11-19 OUTCOME binding (the push gate) unpinned
  • .github/workflows/qwen-code-pr-review.yml:3183 — [probe] D11-20 HEAD_REF/HEAD_SHA/HEAD_REPO push-destination wiring unpinned
  • …and 9 more (see the run report)
中文说明

⚠️ 已从批准降级为评论:CI failing: Post Coverage Comment (ubuntu-latest, 22.x), Test (ubuntu-latest, Node 22.x)。 已审查。

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-issue-followup-bot.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

Test Plan(非阻断):@qwen-code/qwen-code@0.21.12no such file or directory

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

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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Requesting changes for one blocking concurrency regression in the new two-job handoff. The credential boundary, exact-head bundle lineage checks, partial-rerun artifact selection, and focused fixtures otherwise check out; the inline comment describes the race. This finding is independent of the still-running CI job.

Comment thread .github/workflows/qwen-code-pr-review.yml
…esolution is never dropped

The two-job split put publish-resolution in the shared
qwen-pr-head-write-<pr> concurrency group. GitHub keeps only one PENDING
job per group and replaces it when another same-group job is queued —
cancel-in-progress:false protects only a RUNNING job. So after resolve-pr
finished and uploaded a completed resolution, its publisher sat pending
in that group, where a second /resolve, a later publisher, or an autofix
writer could silently cancel it before the push or the result comment: a
resolution that already succeeded, dropped with no response to the user —
the exact silent-failure class this PR set exists to remove. (Reported by
a reviewer on #10428.)

Move the publisher to a per-run group (qwen-pr-publish-<run_id>): one
member for its whole life, so it can never be the replaced pending job.
Two publishers that do run at once stay correct through the push, not the
group — it is already force-with-lease pinned to the head the agent
resolved from, so exactly one wins and the other reports "moved" cleanly.
The expensive, wasteful-to-race work — the agent — stays in the shared
head-write group on resolve-pr, so #7355 (resolve vs autofix agent runs)
stays covered.

Tests: a new 'cannot drop a completed resolution while it waits to
publish' pins the per-run publisher group, the head-write agent group and
the lease; the triage and publish-job contracts are updated to the new
split. Reverting the publisher to the shared group reds all three.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round: no new changes were needed. The single blocking finding in this round's feedback is already fixed at the branch head; this round independently re-verified the fix instead of re-implementing it.

Triage of the feedback:

  • [rv:5063292261 / rc:3891861581] @doudouOUC — Critical concurrency regression (publisher replaceable while pending): RESOLVED IN CODE at HEAD (15399f4), re-verified this round. The publisher moved off the shared qwen-pr-head-write-<pr> group onto the per-run group qwen-pr-publish-${{ github.run_id }} (.github/workflows/qwen-code-pr-review.yml:2988), so it can never be the replaced pending job; competing publishers stay correct through the --force-with-lease="refs/heads/${HEAD_REF}:${HEAD_SHA}" push (line 3272), and the agent phase keeps the shared head-write group so the feat(autofix): render the managed fleet into the scan's run summary #7355 serialization is preserved. This is the reviewer's "separate phase groups and rely on the existing atomic force-with-lease" option. The contract tests pin it: reverting the publisher to the shared group turns red qwen-code-pr-review.yml resolve-pr: agent settings in .github/scripts/qwen-triage-workflow.test.mjs and both cannot drop a completed resolution while it waits to publish and publishes from a job whose runner never executed the agent in scripts/tests/qwen-resolve-workflow.test.js; restoring the fix returns everything to green.
  • [rv:5062703077] automated reviewer — downgraded Approve → Comment on failing CI: the cited failures (Post Coverage Comment, Test) were observed on the pre-fix commit a8517615, before 15399f4 landed; the check snapshot taken when this round's feedback was prepared shows no red checks (only SUCCESS/SKIPPED, with Test and Integration Tests still in progress on the fix commit). The deferred D11-* items are explicitly "recorded, not requested in this round", and the remaining notes are explicitly non-blockers. No action.
  • [rv:5063403632] @wenshao — empty review body: nothing to address.

Verification

All commands actually run this round, on HEAD 15399f428a (working tree clean before and after):

  • node --test --test-concurrency=1 .github/scripts/qwen-triage-workflow.test.mjs — passed (124 pass / 0 fail)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js — passed (34 passed)
  • Mutation probe (temporarily reverted the publisher group to qwen-pr-head-write-<pr>, re-ran both suites, restored): triage suite 123 pass / 1 fail, resolve suite 2 failed (cannot drop a completed resolution while it waits to publish, publishes from a job whose runner never executed the agent); after restore both suites green again — the contracts witness the fix
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • Integration tests / npm run bundle — not applicable: the change is workflow-concurrency configuration, exercised only by the contract tests above, not by the bundled CLI or the integration harness
  • npm run generate:settings-schema — not applicable: no settings source changed
中文说明

Autofix 本轮:无需任何新改动。 本轮反馈中唯一的阻断性问题已经在分支最新提交上修复;本轮只是独立复核了该修复,而不是重复实现。

反馈分诊:

  • [rv:5063292261 / rc:3891861581] @doudouOUC — Critical 并发回归(发布任务在等待期间可被替换):已在 HEAD(15399f4)的代码中修复,本轮已重新验证。 发布任务已从共享的 qwen-pr-head-write-<pr> 并发组迁移到按运行隔离的 qwen-pr-publish-${{ github.run_id }} 组(.github/workflows/qwen-code-pr-review.yml:2988),因此它永远不会成为被替换的等待中任务;两个并发发布者之间的正确性由 --force-with-lease="refs/heads/${HEAD_REF}:${HEAD_SHA}" 推送保证(第 3272 行),而 agent 阶段仍保留在共享的 head-write 组中,从而保留了 feat(autofix): render the managed fleet into the scan's run summary #7355 的串行化保护。这正是评审者提出的"分离各阶段并发组、依赖已有的原子 force-with-lease"方案。契约测试已将其钉住:把发布任务改回共享组后,.github/scripts/qwen-triage-workflow.test.mjs 中的 qwen-code-pr-review.yml resolve-pr: agent settings 以及 scripts/tests/qwen-resolve-workflow.test.js 中的 cannot drop a completed resolution while it waits to publishpublishes from a job whose runner never executed the agent 均变红;恢复修复后全部回到绿色。
  • [rv:5062703077] 自动评审 — 因 CI 失败从 Approve 降级为 Comment:所引用的失败(Post Coverage CommentTest)发生在修复前的提交 a8517615 上,早于 15399f4 落地;本轮反馈准备时刻的检查快照显示没有红色检查(只有 SUCCESS/SKIPPEDTestIntegration Tests 在修复提交上仍在运行中)。延后的 D11-* 条目明确标注"已记录,本轮不要求修改",其余说明也均明确为非阻断项。无需处理。
  • [rv:5063403632] @wenshao — 评审正文为空:无内容可处理。

验证

本轮在 HEAD 15399f428a 上实际运行的全部命令(工作区在前后均为干净状态):

  • node --test --test-concurrency=1 .github/scripts/qwen-triage-workflow.test.mjs — 通过(124 通过 / 0 失败)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-resolve-workflow.test.js — 通过(34 个测试通过)
  • 变异探测(临时将发布任务并发组改回 qwen-pr-head-write-<pr>,重跑两个测试套件后恢复):triage 套件 123 通过 / 1 失败,resolve 套件 2 个失败(cannot drop a completed resolution while it waits to publishpublishes from a job whose runner never executed the agent);恢复后两个套件重新全部变绿 —— 契约测试确实见证了该修复
  • npm run build — 通过(退出码 0)
  • npm run typecheck — 通过(退出码 0)
  • npm run lint — 通过(退出码 0)
  • 集成测试 / npm run bundle — 不适用:本次改动是工作流并发配置,只由上述契约测试覆盖,不经由打包后的 CLI 或集成测试框架执行
  • npm run generate:settings-schema — 不适用:未改动任何设置源

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

🧵 Resolved all 1 selected review thread(s). · 已关闭全部选中的 1 条评审线程。


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

@wenshao

wenshao commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 753 passed · 1 failed · 754 total

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

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

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

脚本断言:753 通过 · 1 失败 · 754 总计

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

Verification report

<!-- qwen-resolve-result -->
Qwen Code's conflict-resolution agent finished successfully, but its run artifact never reached the publish job — the upload failed or the artifact expired — so the result could not be verified or published. This is not a verdict on the conflict. Use Re-run all jobs on the workflow run to run the agent again and publish a fresh result; re-running only the failed jobs cannot recover the missing artifact.

Flakiness gate log

rounds=5 files=3 skipped=0
file .github/scripts/qwen-triage-workflow.test.mjs: (cd .) node --test ./.github/scripts/qwen-triage-workflow.test.mjs
file scripts/tests/qwen-resolve-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/qwen-resolve-workflow.test.js
file scripts/tests/review-artifact-upload.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/review-artifact-upload.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/qwen-triage-workflow.test.mjs: PPPPP
  scripts/tests/qwen-resolve-workflow.test.js: PPPPP
  scripts/tests/review-artifact-upload.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 1 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 1 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 2 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 2 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 2 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 3 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 3 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 3 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 4 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 4 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 4 · scripts/tests/review-artifact-upload.test.js: P (exit 0)
round 5 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 5 · scripts/tests/qwen-resolve-workflow.test.js: P (exit 0)
round 5 · scripts/tests/review-artifact-upload.test.js: P (exit 0)

Evidence images

01-ab-rerun-download-base-vs-head

02-real-blocks-artifact-missing-ab

03-mutation-matrix

04-followup-install-live

05-gates-summary

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

Qwen Code · sandboxed verification

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving. Reviewed the security split carefully: the push token (CI_DEV_BOT_PAT) lives only in publish-resolution, which runs on a fresh runner that never executed the agent, checks out fresh with persist-credentials:false, fetches base/head refs from GitHub itself, and admits the agent's output only as a git-bundle-verified set of objects pinned to the head the agent resolved from. resolve-pr carries no push token on the agent path (Report skipped only fires on skip/failed; Report result moved to the publish job). Tests pin each security-critical behavior with real git fixtures. Tradeoff is sound and evidenced: the container sandbox was already inert (config block silently dropped; 0/81 sandboxed runs ever pushed), so removing it and structurally isolating the push token is a net improvement. Note for merge ordering: this and #10429 both edit qwen-code-pr-review.yml, so whichever merges second needs a rebase.

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-reviewed the current head 15399f428a after the concurrency fix. The previous blocking race is fixed: resolve-pr keeps the shared per-PR head-write group, publish-resolution uses a per-run group so a completed resolution cannot be replaced while pending, and the exact-head force-with-lease prevents concurrent publishers or autofix from clobbering a moved branch. I also rechecked the fresh-runner credential boundary, run-attempt artifact handoff, bundle verification and lineage/scope guards, head-moved and missing-artifact failure paths, the follow-up CLI pin, and all updated comments/threads. Focused verification passed: resolve fixture 34/34, workflow agent-settings/follow-up contracts 10/10, routing/sandbox tests 53/53, YAML parse, and diff check. No new blocking findings.

@wenshao
wenshao added this pull request to the merge queue Aug 31, 2026
Merged via the queue into main with commit 4123aa6 Aug 31, 2026
100 of 102 checks passed
AaronZ345 pushed a commit to AaronZ345/qwen-code that referenced this pull request Aug 31, 2026
…503s and drafts (QwenLM#10429)

* fix(ci): recover /resolve requests lost to moved heads, fork pushes, 503s and drafts

Of the 294 resolutions the /resolve agent has ever produced, 17 were thrown
away because the PR head moved while it worked, ten more agent runs were
spent on fork PRs whose push was then rejected for lack of maintainer
edits, a 503 from the permission API denied writers silently, and 182
explicit requests on drafts were answered with a skip comment.

- Report result: when the lease push is declined for a moved head, fetch
  the new head, redo the base merge on it, take the agent's resolution for
  every still-conflicting file the new commits did not touch, re-run the
  marker / clean-merge / base-changed-files guards, and push with a lease
  on the new head. Anything else gives up and reports "moved" as before.
  The agent is never re-run.
- Prepare: refuse fork PRs with "Allow edits by maintainers" off before
  the agent runs, via maintainerCanModify.
- authorize: retry a 5xx from the permission API up to three times before
  treating it as a denial; still fails closed.
- Prepare: drop the draft gate for the command (the review lane keeps its
  own).

The replay functions are exercised against a real git fixture in three
cases; contract pins cover the push wiring, the fork preflight, the draft
gate and the retry loop.

* ci: record the resolve-pr replay growth in .size-baseline

The moved-head replay, the fork preflight and the authorize retry grow
qwen-code-pr-review.yml past the 4096-byte ratchet; the growth is the
recovery logic itself, so bump the baseline.

* fix(ci): pass BASE_REF into the /resolve Report result step

The moved-head replay merges the base branch again, but the step's env
never defined BASE_REF, so under `set -u` the first replay would have
aborted the step. Add the env entry and a test that walks every run
block of resolve-pr and fails on any expanded uppercase variable that
neither the job env, the step env, a shell assignment nor a runner
builtin defines — the fixture test injected BASE_REF itself, which is
why nothing caught it.

* fix(ci): fetch the moved head by URL in the /resolve replay

The post-agent scrub landing in QwenLM#10428 removes the workspace .git/config
— and with it the `origin` remote — before any credentialed step runs,
so the replay's `git fetch origin` would fail there. Fetch by URL, with
an env hook (empty in production) that the fixture test points at its
bare repository; a pin forbids `git fetch origin` in the replay.

* fix(ci): classify moved heads before permission patterns in /resolve replay

Address the second-round review findings on the /resolve recovery paths:

- classify_push_failure now tests the lease-decline signature (stale
  info, force-with-lease, non-fast-forward, fetch first) BEFORE the
  permission patterns: git echoes the destination branch into the push
  log, so a moved head on a branch named e.g. fix/permission-prompt or
  fix-403-error matched the permission arm first and the replay never
  ran — the exact loss class this PR recovers.
- The replay handles resolutions that deleted the conflicted file
  (delete/modify conflicts): checkout fails on a path absent from the
  resolved commit, so take the deletion via git rm instead.
- The replay-success comment no longer claims files were taken from the
  agent's merge when the replay merged clean, and says that the run
  artifact describes the original resolution, not the pushed tree.
- Tests: behavioural coverage for the authorize retry loop against a
  scripted gh (3 attempts, 5s/10s backoff, fail-closed denial arms) and
  for the classifier against real push logs (branch-name echoes,
  re-classification after a failed replay push); fixture coverage for
  the empty-merge give-up and the deletion resolution; the draft-gate
  pin now names the real delay-automatic-review job without the silent
  whole-file fallback.

* fix(ci): give the /resolve replay its own committer identity, match git's parenthesised lease reasons

The replay commits with `git commit -C`, which reuses the agent's author
and message but takes the committer from the environment or config. The
only identity in production was the workspace .git/config written by
'Prepare pull request branch' — the file the post-agent scrub (QwenLM#10428)
removes before this step. Export the bot identity inside the replay;
the fixture now runs it with no identity in the environment and no
.git/config, and asserts the committer.

Also match the moved-head push failure on git's parenthesised reason —
`(stale info)`, `(fetch first)`, `(non-fast-forward)` — rather than the
bare words, which are legal branch-name substrings echoed into the same
rejection line.

* fix(ci): keep the /resolve replay's pathspecs literal and lease reasons anchored

The replay's per-file git commands treated the literal conflicted filename
as a pathspec pattern, so a file named `spec[1].md` widened diff/checkout/rm
to its sibling `spec1.md` — give-ups on untouched files, and `git rm` staging
a sibling's deletion. Export GIT_LITERAL_PATHSPECS inside replay_on_moved_head
and pin both shapes with glob-named fixtures.

Anchor the classifier's moved arm to end-of-line: git prints the reason last,
so a branch merely containing `(non-fast-forward)` no longer matches before
the permission arm; pinned by branch-echo classifyLog cases that also guard
the parenthesised patterns against a bare-word regression.

Fold the four copies of the workflow-YAML block extractor into one
extractBlock helper and the duplicated classify scaffolding into one shared
spawn runner. Reword the replay comment so a clean-merge replay no longer
implies files were taken from the agent's merge. Re-record the size baseline
at the merged workflow size.

* fix(ci): preserve the pushed tree when the /resolve replay lands

The `qwen-resolve-pr-N` artifact is uploaded before 'Report result'
runs, so after a successful moved-head replay it describes the original
resolution, not the tree that was pushed. Record the replay's diff
against the base and its SHA under WORKDIR/pushed/ and upload them as
`qwen-resolve-pr-N-pushed` in a step after 'Report result' (same
always()/decision gate as the first upload, so it still runs when the
report exits 1); the replay-success comment now points at that
artifact. A contract test pins the regeneration, the second upload's
name/path/gate and its position after 'Report result'.

* fix(ci): re-record the review-workflow size after the pushed-tree step (QwenLM#10429)

* test(ci): point the /resolve replay tests at the publish job after the split re-home

The conflict resolution in cde150c re-homed the replay into
publish-resolution in the workflow but left the 'recovering requests that
used to be lost' test block sourcing `reportStep` (and the pushed-tree
upload, and the env-coverage walk) from resolve-pr, where 'Report result'
no longer exists — so reportStep was '' and every replay assertion and
fixture in that block failed.

Source the replay/push/upload assertions from publish-resolution, keep
prepare/authorize on resolve-pr, walk both jobs in the uppercase-variable
env-coverage test (the replay's BASE_REF lives in publish now, from
needs.resolve-pr.outputs), and match the pushed-tree artifact name
(needs.resolve-pr.outputs.pr_number) and its always() gate regardless of
quote style. 53 pass; mutation-checked (breaking the lease move or the
untouched-file guard in replay_on_moved_head reds the fixtures).

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
qwen-code-dev-bot added a commit that referenced this pull request Aug 31, 2026
Main split the /resolve lane into resolve-pr and publish-resolution
(#10428, #10429). Resolve the HELPER_TESTS conflict as the union of both
new entries, extend the health watch's producer pins to both jobs, and
classify the lane's new lost-artifact report sentence as infra_failed
instead of letting it fall through to unknown.

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

Copy link
Copy Markdown
Collaborator

Released in v0.23.0.

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants