Skip to content

fix(sdk): stop emitting a duplicated hashbang in the serve-mcp bin - #10485

Open
wenshao wants to merge 7 commits into
mainfrom
fix/sdk-serve-mcp-bin-double-shebang
Open

fix(sdk): stop emitting a duplicated hashbang in the serve-mcp bin#10485
wenshao wants to merge 7 commits into
mainfrom
fix/sdk-serve-mcp-bin-double-shebang

Conversation

@wenshao

@wenshao wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Removes the redundant hashbang banner from the qwen-serve-mcp esbuild step, and adds a build-time assertion that the produced bin starts with a hashbang and actually parses. Review follow-up (fec89f4a31): the assertion runs node --check in argv form rather than through a shell, and the bin's esbuild options moved to a module the build script and a new test share, so the regression is pinned by the suite and not only by the guard.

Why it's needed

Fixes #10484.

scripts/build.js passed banner: { js: '#!/usr/bin/env node' } for the serve-bridge bin, but esbuild already carries the entry point's own hashbang from src/daemon-mcp/serve-bridge/bin.ts into the bundle. Stacking the banner on top of it emitted a second hashbang on line 2 of dist/daemon-mcp/serve-bridge/bin.js. esbuild accepts that; node does not. Node strips only the first hashbang line, so the published qwen-serve-mcp bin died with SyntaxError: Invalid or unexpected token through both node <file> and the shebang — it has never been startable, and @qwen-code/sdk@0.1.8 ships it broken.

Dropping the banner is the smaller half of the fix. The larger half is that nothing in the pipeline ever started the bin: tsc, eslint and the 1699-test SDK suite all run against src, and the build's existing assertions cover only bundle byte budgets and browser-safety of the library entries. So this also adds assertExecutableBin, matching the existing assert* idiom in that file — it checks line 1 is a hashbang and shells out to node --check, which is the only oracle that actually catches this class of break.

No other build in the repo emits a hashbang banner; every other declared bin already relies on its entry point's own.

Two review findings on that guard are folded in. It ran node --check through execSync with a command string, so a checkout path containing $(…), a backtick or $VAR expanded under /bin/sh -c and then failed the build with a misleading does not parse — the argv form of execFileSync needs no quoting at all. And nothing in the suite exercised the guard, so a later edit swallowing its error would leave every test green while the next banner regression publishes. scripts/serve-bridge-bin-build-options.js now holds the bin's esbuild options for both the build script and test/unit/serve-bridge-bin.test.ts, which builds with them and asserts the emitted bytes; a second case pins the shipped dist/ artifact, catching a banner re-added at the call site instead.

Reviewer Test Plan

How to verify

  1. On main, run npm run build --workspace @qwen-code/sdk and head -2 packages/sdk-typescript/dist/daemon-mcp/serve-bridge/bin.js. Confirm two hashbang lines, and that running the file fails with SyntaxError.
  2. With this branch, rebuild and confirm line 1 is the hashbang and line 2 is code. Pipe a real MCP initialize into the bin over stdio and confirm it answers.
  3. Negative-control the new guard: put banner: { js: '#!/usr/bin/env node' } back and confirm the build now fails with Bin … does not parse; then delete the hashbang from bin.ts instead and confirm it fails with Bin … must start with a hashbang line.
  4. Negative-control the new test, which must red independently of the guard. Put the banner back in serveBridgeBinBuildOptions and confirm vitest run test/unit/serve-bridge-bin.test.ts fails. Then neutralize assertExecutableBin (if (filePath) return;) and spread a banner over the options at the call site: the build now exits 0 with #!/usr/bin/env node on line 2 of the shipped bin, and the dist/ case is what reds.

Evidence (Before & After)

before / after / negative control / gates

Before (origin/main, and the @qwen-code/sdk@0.1.8 tarball from npm):

$ head -2 dist/daemon-mcp/serve-bridge/bin.js
#!/usr/bin/env node
#!/usr/bin/env node

$ ./dist/daemon-mcp/serve-bridge/bin.js
…/bin.js:2
#!/usr/bin/env node
^
SyntaxError: Invalid or unexpected token

After, driving a real MCP handshake over stdio against the built bin, run in place as an executable:

$ echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}' \
    | ./dist/daemon-mcp/serve-bridge/bin.js
{"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":true}},"serverInfo":{"name":"qwen-serve-bridge","version":"1.0.0"}},"jsonrpc":"2.0","id":1}

Both negative controls fail the build as intended, and the patch as submitted builds clean.

Tested on

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

Environment (optional)

Linux, Node v22.22.2. npm run build exit 0; full @qwen-code/sdk suite 38 files / 1707 tests pass; eslint at --max-warnings 0 over the three changed files exit 0; tsc --noEmit and tsc --noEmit -p tsconfig.test-fence.json exit 0; prettier --check clean.

Risk & Scope

  • Main risk or tradeoff: the new assertion spawns node --check once per build (a few ms), and the new test bundles the bin once into a temp dir (23 ms — it externalizes @modelcontextprotocol/sdk). If a future bin entry legitimately needs a banner, the guard forces it to keep the output parseable rather than silently shipping a broken file.
  • The test's dist/ case skips rather than fails when the artifact is absent. npm ci builds every workspace through the root prepare script, so it runs in CI; lanes that set QWEN_SKIP_PREPARE=1 have no dist/, and the primary case does not depend on one.
  • Not validated / out of scope: macOS and Windows execution — the emitted bytes do not depend on the platform, and the guard is a byte/parse check. Other packages' bins are untouched; none of them use a banner.
  • Breaking changes / migration notes: none. The only behaviour change is that qwen-serve-mcp now starts.

Linked Issues

Fixes #10484

中文说明

本 PR 做了什么

移除 qwen-serve-mcp esbuild 步骤里多余的 hashbang banner,并新增一条构建期断言:产出的 bin 必须以 hashbang 开头,并且真的能被解析。评审跟进(fec89f4a31):该断言改用 argv 形式执行 node --check,不再经过 shell;bin 的 esbuild 选项抽成构建脚本与新测试共享的模块,使这个回归由测试套件钉住,而不只依赖构建期守卫。

为什么需要它

修复 #10484

scripts/build.js 给 serve-bridge bin 传了 banner: { js: '#!/usr/bin/env node' },但 esbuild 本来就会把入口 src/daemon-mcp/serve-bridge/bin.ts 自带的 hashbang 带进产物。banner 叠加在上面之后,dist/daemon-mcp/serve-bridge/bin.js 的第 2 行就多出了第二个 hashbang。esbuild 接受它,node 不接受。node 只会剥掉第一行 hashbang,所以发布出去的 qwen-serve-mcp 无论是 node <file> 还是走 shebang,都会以 SyntaxError: Invalid or unexpected token 挂掉——它从来就没能启动过,而 @qwen-code/sdk@0.1.8 发布的就是坏的。

去掉 banner 只是修复中较小的一半。更重要的一半是:整条流水线从来没有真的启动过这个 bin——tsceslint 和 1699 项 SDK 测试都只跑 src,构建里已有的断言只覆盖 bundle 字节预算和入口的浏览器安全性。所以这里同时加了 assertExecutableBin,沿用该文件里已有的 assert* 写法:检查第 1 行是 hashbang,并调用 node --check——这是唯一能抓到这类问题的判据。

仓库里没有第二处构建使用 hashbang banner;其他已声明的 bin 都直接依赖各自入口文件自带的 hashbang。

针对该守卫的两条评审意见已一并处理。它此前用字符串形式的 execSync 执行 node --check,因此含有 $(…)、反引号或 $VAR 的检出路径会在 /bin/sh -c 下展开,并让构建以误导性的 does not parse 失败——argv 形式的 execFileSync 完全不需要引号处理。另外测试套件从未覆盖这道守卫,日后若有改动吞掉它的错误,所有测试仍会全绿,而下一次 banner 回归照样会被发布。现在 scripts/serve-bridge-bin-build-options.js 承载 bin 的 esbuild 选项,由构建脚本与 test/unit/serve-bridge-bin.test.ts 共享;该测试用这份选项构建并断言产出的字节,另有一个用例钉住已构建的 dist/ 产物,覆盖 banner 改加在调用点的情形。

Reviewer 测试计划

如何验证

  1. main 上执行 npm run build --workspace @qwen-code/sdk,然后 head -2 packages/sdk-typescript/dist/daemon-mcp/serve-bridge/bin.js。确认有两行 hashbang,且运行该文件会报 SyntaxError
  2. 切到本分支重新构建,确认第 1 行是 hashbang、第 2 行是代码。通过 stdio 向该 bin 灌一个真实的 MCP initialize,确认它能回应。
  3. 对新守卫做反向对照:把 banner: { js: '#!/usr/bin/env node' } 加回去,确认构建以 Bin … does not parse 失败;再改为删掉 bin.ts 的 hashbang,确认构建以 Bin … must start with a hashbang line 失败。
  4. 对新测试做反向对照,它必须独立于守卫变红。先把 banner 加回 serveBridgeBinBuildOptions,确认 vitest run test/unit/serve-bridge-bin.test.ts 失败。再让 assertExecutableBin 失效(if (filePath) return;),同时在调用点用展开覆写加上 banner:此时构建 exit 0,发布出的 bin 第 2 行是 #!/usr/bin/env node,由 dist/ 那个用例变红抓住。

证据(修改前与修改后)

修改前(origin/main,以及 npm 上的 @qwen-code/sdk@0.1.8 tarball):

$ head -2 dist/daemon-mcp/serve-bridge/bin.js
#!/usr/bin/env node
#!/usr/bin/env node

$ ./dist/daemon-mcp/serve-bridge/bin.js
…/bin.js:2
#!/usr/bin/env node
^
SyntaxError: Invalid or unexpected token

修改后,把构建出的 bin 原地当作可执行文件运行,跑一次真实的 MCP 握手:

$ echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}' \
    | ./dist/daemon-mcp/serve-bridge/bin.js
{"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{"listChanged":true}},"serverInfo":{"name":"qwen-serve-bridge","version":"1.0.0"}},"jsonrpc":"2.0","id":1}

两个反向对照都按预期让构建失败,提交的这版则构建通过。

测试平台

OS 状态
🍏 macOS N/A
🪟 Windows N/A
🐧 Linux

环境(可选)

Linux,Node v22.22.2。npm run build exit 0;@qwen-code/sdk 全量测试 38 个文件 / 1707 项通过;对三个改动文件执行 eslint --max-warnings 0 exit 0;tsc --noEmittsc --noEmit -p tsconfig.test-fence.json exit 0;prettier --check 干净。

风险与范围

  • 主要风险或取舍:新断言每次构建会额外跑一次 node --check(几毫秒),新测试会把 bin 额外打包到临时目录一次(23 ms —— 它把 @modelcontextprotocol/sdk 外部化)。如果将来某个 bin 入口确实需要 banner,这道守卫会强制它保证产物仍可解析,而不是悄悄发布一个坏文件。
  • 测试中 dist/ 那个用例在产物缺失时是跳过而非失败。npm ci 会通过根 prepare 脚本构建所有 workspace,因此它在 CI 中会实际执行;设置了 QWEN_SKIP_PREPARE=1 的 lane 没有 dist/,而主用例并不依赖构建产物。
  • 未验证 / 范围外:macOS 与 Windows 上的执行——产出的字节与平台无关,而这道守卫是字节/解析级检查。其他包的 bin 未受影响,它们都没有使用 banner。
  • Breaking change / 迁移说明:无。唯一的行为变化是 qwen-serve-mcp 现在能启动了。

关联 Issue

Fixes #10484

esbuild already carries the entry point's own `#!/usr/bin/env node` into the
bundle, so the extra `banner` stacked a second hashbang onto line 2 of
`dist/daemon-mcp/serve-bridge/bin.js`. That is valid to esbuild and a
`SyntaxError` to node, which makes the published `qwen-serve-mcp` bin fail to
start through both `node <file>` and the shebang. The bin has never been
runnable since it was introduced, and `@qwen-code/sdk@0.1.8` ships it broken.

Drop the redundant banner and assert at build time that the bin starts with a
hashbang and that `node --check` can parse it, so neither failure mode can be
published again. Nothing else emits a hashbang banner in this repo; every other
bin already relies on its entry point's own.
@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 29, 2026
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 29, 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 29, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the fix!

Template looks good ✓ — all required sections present, bilingual.

Problem: observed bug with hard evidence, not theoretical — #10484 reproduces straight from the published @qwen-code/sdk@0.1.8 npm tarball: two hashbang lines, SyntaxError: Invalid or unexpected token through both node <file> and the shebang. The bin has never been startable.

Direction: clearly aligned — this repairs a bin the SDK already ships as broken, and adds the build-time guard that would have caught it. No auth/sandbox/model/telemetry/release-pipeline surface touched.

Size: not applicable — one file (packages/sdk-typescript/scripts/build.js, 28+/2−), outside the core-module paths; no thresholds in play.

Approach: exactly the minimal change. Dropping the redundant banner is the fix — I re-confirmed on main that the entry point carries its own #!/usr/bin/env node and that no other build in the repo emits a hashbang banner (the three remaining banner: usages are "use strict" ×2 and an import.meta shim). The new assertExecutableBin follows the existing assert* idiom in that file and reuses already-imported stdlib — no new dependencies, no drive-by changes.

Risk: no elevated risk signals — no high-risk paths touched (checked against the revert-history pattern list). Linked issue #10484 is open, so no duplicate/already-fixed exit applies.

Moving on to code review. 🔍

中文说明

感谢修复!

模板完整 ✓ —— 各必需小节齐全,中英双语。

问题:已观测到的 bug,证据确凿,不是理论问题 —— #10484 直接从已发布的 @qwen-code/sdk@0.1.8 npm tarball 复现:两行 hashbang,无论 node <file> 还是 shebang 启动都报 SyntaxError: Invalid or unexpected token。这个 bin 从未能启动过。

方向:明确对齐 —— 它修复了 SDK 已经发布但实际损坏的 bin,并补上了本可以拦住该问题的构建期守卫。不触及 auth/沙箱/模型/遥测/发布流水线相关面。

规模:不适用 —— 单文件(packages/sdk-typescript/scripts/build.js,28+/2−),不在核心模块路径内;不触发任何阈值。

方案:恰好是最小改动。去掉多余的 banner 即为修复 —— 本轮在 main 上再次确认:入口自带 #!/usr/bin/env node,且仓库中没有其他构建会输出 hashbang banner(其余 3 处 banner: 分别是 "use strict" ×2 和 import.meta shim)。新增的 assertExecutableBin 沿用该文件既有的 assert* 惯用法,复用已导入的标准库 —— 无新依赖、无顺手改动。

风险:无升级风险信号 —— 未触及高风险路径(已按 revert 历史模式列表核对)。关联 issue #10484 仍开放,不适用重复/已修复分支。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-run on the same commit — verdict on the code is unchanged: this is exactly the right change, and I found no blockers. My independent proposal for "bin ships a duplicated hashbang" was: drop the banner (the entry's own hashbang survives bundling, which is how every other bin in this repo works) and add a parse-level build guard. The diff does precisely that, and nothing else — assertExecutableBin follows the file's existing assert* idiom, reuses already-imported readFileSync/execSync, and the replacement comment records why the banner must stay gone. Both hunks are load-bearing: without the guard, a future banner regression ships silently again (the mutation matrix in the verify run proves this row-by-row).

The two /review findings stand as non-blocking:

  1. argv-form hardeningexecSync with a string interpolates through a shell, and JSON.stringify is not shell quoting. It stays acceptable here because the interpolated value is the local checkout path (no third-party input crosses that boundary), but the two-line execFileSync('node', ['--check', filePath]) form removes the class of concern entirely. Fine here or as an immediate follow-up.
  2. Artifact-pinning test — the guard already runs on every CI build and before every publish, so the regression cannot ship without first breaking the guard; a test pinning the built artifact would survive even that. Worth a follow-up.

Neither blocks this PR; the fix itself is minimal and correct.

Test evidence

This is an unattended CI run — no PR code was executed here; the evidence below is the PR's own CI read through the API, plus the sandboxed /verify job. No local tmux real-scenario pass applies on this path.

CI status on the reviewed commit at the time of this re-run (attempt 4 of Qwen Code CI re-runs the Linux unit job that attempts 1–3 cancelled/failed):

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

Check Conclusion
Test (ubuntu-latest, Node 22.x) ❌ failure
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
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Secret scan (TruffleHog) ✅ success

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

Reading the history so nobody has to: attempt 2's red is pre-existing flake, not this PR. The failures are all web-shell DOM/timing tests (main-boot.test.tsx, SessionOverviewPanel, channels/messages/skills components, useComposerCore.dom) dying on the 5s testTimeout. The same suites fail with the same shape on the merge base 866b7fe9main without this PR (run 33245195511: 2 failed/616 passed, 1 failed/57 passed, 7 failed/204 passed — matching attempt 2's 2/616, 1/57, 9 failed/204 passed). This diff touches only the SDK build script, and in that same attempt-2 log the SDK's own suite ran 37 files / 1699 tests, all green, alongside 918 files / 26037 tests green in the main workspace pass. Attempts 1 and 3 were cancelled mid-suite by the re-run triggers.

Sandboxed verification for the behavioural claim already ran and passed (46/46 scripted assertions): A/B against the base build (base emits two hashbangs and fails both launch paths; head boots and answers a real MCP initialize + tools/list over stdio), a 5-variant mutation matrix with no surviving mutants (restored banner → guard fails the build; stripped entry hashbang → the other clause catches it; guard removed alone → nothing changes, proving the banner removal is the fix), a sibling census (all 5 other declared bins healthy, no other hashbang banner in the repo), and an npm pack tarball probe. Advisory evidence, not a CI check — and a fresh /verify re-run (33259285348) is in flight on the same commit as of this writing.

中文说明

代码审查

同提交上的重跑 —— 对代码的结论不变:这正是正确的改动,未发现阻塞项。面对"发布产物出现重复 hashbang",我的独立方案是:去掉 banner(入口自带的 hashbang 会随打包保留,仓库里其他所有 bin 都是这么做的),并加一个解析级的构建守卫。diff 恰好就是这么做的,且没有多余内容 —— assertExecutableBin 沿用该文件既有的 assert* 惯用法,复用已导入的 readFileSync/execSync,替换处的注释记录了为什么 banner 必须保持移除。两个 hunk 都是承重的:没有守卫,未来 banner 回归又会悄悄发布(验证运行中的突变矩阵逐行证明了这一点)。

/review 的两条发现维持非阻塞

  1. argv 形式加固 —— 字符串形式的 execSync 会经过 shell 插值,JSON.stringify 不是 shell 引号。此处可接受,因为被插值的值是本地检出路径(没有第三方输入跨越该边界);但两行的 execFileSync('node', ['--check', filePath]) 形式可以彻底消除这一类疑虑。并入本 PR 或紧随其后跟进均可。
  2. 钉住产物的测试 —— 守卫已在每次 CI 构建和每次发布前执行,回归要被发布必须先破坏守卫;一个钉住构建产物的测试连那种情况也能幸存。值得跟进。

两者都不阻塞本 PR;修复本身最小且正确。

测试证据

本次为无人值守 CI 运行 —— 此处未执行任何 PR 代码;以下证据来自通过 API 读取的 PR 自身 CI,以及沙箱 /verify 任务。此路径不适用本地 tmux 真实场景测试。

审查提交上的 CI 状态:Qwen Code CI 第 4 次尝试正在重跑第 1–3 次被取消/失败的 Linux 单测 job。状态表见上方英文部分(中文不复制表格,以免重复维护)。

把历史讲清楚,免得别人再查一遍:第 2 次尝试的红是既有抖动,不是本 PR 造成。失败全部是 web-shell DOM/时序测试(main-boot.test.tsxSessionOverviewPanel、channels/messages/skills 组件、useComposerCore.dom)撞上 5 秒 testTimeout。同样的套件在合并基 866b7fe9(不含本 PR 的 main)上以同样的形态失败(run 33245195511:2 failed/616 passed、1 failed/57 passed、7 failed/204 passed —— 与第 2 次尝试的 2/616、1/57、9 failed/204 passed 吻合)。本 diff 只触及 SDK 构建脚本;在同一份第 2 次尝试日志里,SDK 自身套件 37 文件 / 1699 测试全绿,主工作区也有 918 文件 / 26037 测试通过。第 1、3 次尝试都是被重跑触发中途取消。

行为性声明的沙箱验证已经跑过并通过(46/46 脚本断言):与 base 构建 A/B 对照(base 输出两行 hashbang、两种启动方式都失败;head 能启动并通过 stdio 应答真实 MCP initialize + tools/list)、5 变体突变矩阵无幸存突变(加回 banner → 守卫让构建失败;删掉入口 hashbang → 另一条款抓住;只删守卫 → 无变化,证明 banner 移除才是修复)、同族普查(其余 5 个已声明 bin 全部健康,仓库无其他 hashbang banner)、以及 npm pack tarball 实测。属咨询性证据,不构成 CI 检查 —— 撰写时同一提交上还有一次新的 /verify 重跑(33259285348)在进行中。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean across every stage on the third pass; the two open items are the same non-blocking /review follow-ups (argv-form execFileSync hardening; an artifact-pinning test), neither of which belongs in front of this fix.

This re-run exists to answer one question: why hasn't the approval landed yet? The answer is mechanical, not substantive. My last pass left the approve-on-green instruction in place, but the finalize step only acts when every check on the reviewed commit is green — and the Linux unit suite never settled: attempts 1 and 3 were cancelled mid-suite by re-run triggers, and attempt 2's red was pre-existing web-shell timeout flake that fails identically on the merge base without this PR. Nothing in that history reflects on the change; the SDK's own 1699-test suite and the 46/46 sandboxed verification assertions stayed green throughout.

On the substance my read is unchanged, and I re-verified rather than rubber-stamped: the problem is real and reproduced from the published 0.1.8 tarball; the fix is exactly the minimal one (drop the duplicated banner, keep the entry's own hashbang like every other bin in the repo); the guard is load-bearing by mutation-matrix evidence, not decoration; the diff carries nothing else. yiliang114's approval of this exact commit already stands; mine is the second vote main requires, and it is withheld only because attempt 4 of the suite is still running. Approval lands pinned to the commit reviewed here as soon as CI goes green on it — no further trigger needed.

中文说明

这次重跑只为回答一个问题:为什么批准还没有落下?答案是机制性的,不是实质性的。上一轮我已留下"变绿即批准"的指令,但 finalize 步骤只在被审查提交上的所有检查全绿时才执行 —— 而 Linux 单测套件始终没有落定:第 1、3 次尝试被重跑触发中途取消,第 2 次尝试的红是既有的 web-shell 超时抖动,在不含本 PR 的合并基上以同样形态失败。这些历史与改动本身无关;SDK 自身的 1699 测试套件与 46/46 沙箱验证断言全程保持绿色。

实质判断不变,且本轮是重新核实而非照单全收:问题真实存在,可直接从已发布的 0.1.8 tarball 复现;修复恰好是最小方案(去掉重复的 banner,像仓库里其他所有 bin 一样保留入口自带的 hashbang);守卫经突变矩阵逐行证明是承重的,不是摆设;diff 不夹带任何其他内容。yiliang114 对同一提交的批准已经生效;我的批准是 main 所需的第二票,目前只因第 4 次尝试仍在运行而暂缓。CI 在该提交上变绿后,批准会自动落下并钉在这里审查的提交上 —— 无需再次触发。

Qwen Code · qwen3.8-max

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

yiliang114
yiliang114 previously approved these changes Aug 29, 2026

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

Not explored to full depth (tool budget reached): "agent 6a": Windows (cmd.exe) behavior of execSync( node --check ${JSON.stringify(filePath)} ) — no Windows runner available in this environment to verify empirically..

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

中文说明

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

未探索到全部深度(达到工具调用预算):"agent 6a"Windows (cmd.exe) behavior of execSync( node --check ${JSON.stringify(filePath)} ) — no Windows runner available in this environment to verify empirically.

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

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

throw new Error(`Bin ${filePath} must start with a hashbang line`);
}
try {
execSync(`node --check ${JSON.stringify(filePath)}`, { stdio: 'pipe' });

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-1: The new assertExecutableBin guard invokes execSync(node --check ${JSON.stringify(filePath)}). execSync with a command string runs through /bin/sh -c, and JSON.stringify is JSON quoting, not shell quoting — inside double quotes, $(...), backticks, and $VAR remain live command substitution on POSIX. filePath is derived from the checkout location (rootDir from import.meta.url), so if the repo is cloned under a path whose directory components contain $(…), a backtick, or $VAR (e.g. a worktree or job directory named from branch or job metadata), the embedded command executes as the build user during npm run build, and the expansion can rewrite the argument so node --check targets a wrong path and the build fails with a misleading Bin ... does not parse error. This is the only execSync site in this file interpolating a dynamic value (the tsc / dts-bundle-generator calls are fully literal strings).

Witness:

probe: real assertExecutableBin extracted from HEAD,
filePath=/tmp/probe-qwe$(touch /tmp/probe-finding-a-marker)ry/bin.js
BUGGY ARM (the PR's exact construction):
  marker before call: false
  threw: Bin ... does not parse: Cannot find module '/tmp/probe-qwery/bin.js'
  marker after call: true   <- embedded $(touch ...) executed
FIXED ARM (execFileSync('node', ['--check', filePath], { stdio: 'pipe' })):
  marker after call: false; literal path parses; guard returns clean

The fix spans two locations, so a regular code block instead of a suggestion:

// top of file: extend the existing import
import { execFileSync, execSync } from 'node:child_process';

// inside assertExecutableBin — the argv form needs no quoting at all
execFileSync('node', ['--check', filePath], { stdio: 'pipe' });
中文说明

新增的 assertExecutableBin 守卫使用 execSync(node --check ${JSON.stringify(filePath)})execSync 传入命令字符串时会经由 /bin/sh -c 执行,而 JSON.stringify 是 JSON 引号,不是 shell 引号——在双引号内部,$(...)、反引号和 $VAR 在 POSIX 上仍然是有效的命令替换。filePath 来自检出位置(由 import.meta.url 推导的 rootDir),因此如果仓库被克隆到目录组件中含有 $(…)、反引号或 $VAR 的路径下(例如以分支或任务元数据命名的 worktree 或任务目录),嵌入的命令就会在 npm run build 期间以构建用户身份执行,且展开可能改写参数,使 node --check 指向错误路径,构建会以误导性的 Bin ... does not parse 错误失败。这是该文件中唯一插入动态值的 execSync 调用点(tsc / dts-bundle-generator 调用都是纯字面量字符串)。

验证证据:

探针:从 HEAD 提取真实的 assertExecutableBin,
filePath=/tmp/probe-qwe$(touch /tmp/probe-finding-a-marker)ry/bin.js
BUGGY ARM(PR 中的原始写法):
  调用前 marker 存在:false
  抛出:Bin ... does not parse: Cannot find module '/tmp/probe-qwery/bin.js'
  调用后 marker 存在:true   <- 嵌入的 $(touch ...) 被执行了
FIXED ARM(execFileSync('node', ['--check', filePath], { stdio: 'pipe' })):
  调用后 marker 存在:false;字面量路径正常解析;守卫正常返回

修复涉及两处,因此给出普通代码块而非 suggestion

// 文件顶部:扩展现有 import
import { execFileSync, execSync } from 'node:child_process';

// assertExecutableBin 内部——argv 形式完全不需要引号处理
execFileSync('node', ['--check', filePath], { stdio: 'pipe' });

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed in fec89f4a31 — confirmed, and taken as written.

execFileSync('node', ['--check', filePath], { stdio: 'pipe' }) now, with the reason recorded at the call site so the string form doesn't come back. I reproduced your witness against the real guard body extracted from HEAD, with filePath under a directory named qwen$(touch …)ry:

BUGGY  execSync + JSON.stringify | marker created: true  | threw: Bin … does not parse: …
FIXED  execFileSync argv         | marker created: false | returned clean

Both halves of your finding hold: the embedded command ran, and the expansion rewrote the argument so the guard failed the build with a misleading does not parse. The argv form runs the literal path and returns clean.

中文说明

已在 fec89f4a31 修复 —— 结论确认,按建议原样采纳。

现在是 execFileSync('node', ['--check', filePath], { stdio: 'pipe' }),并在调用点记录了原因,避免字符串形式回潮。我用从 HEAD 提取的真实守卫函数体复现了你的验证证据,filePath 位于名为 qwen$(touch …)ry 的目录下:

BUGGY  execSync + JSON.stringify | marker created: true  | threw: Bin … does not parse: …
FIXED  execFileSync argv         | marker created: false | returned clean

你这条发现的两半都成立:嵌入的命令确实执行了,并且展开改写了参数,使守卫以误导性的 does not parse 让构建失败。argv 形式传的是字面量路径,正常返回。

Comment on lines +333 to +335
assertExecutableBin(
join(rootDir, 'dist', 'daemon-mcp', 'serve-bridge', 'bin.js'),
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-2: The new assertExecutableBin guard is the sole check pinning the duplicate-hashbang regression this PR fixes, and nothing in the suite exercises it — neither of its two failure branches (missing hashbang, node --check parse failure) is reachable from any test. A repo-wide sweep at HEAD confirms it: 0 test files reference assertExecutableBin, the built bin.js, or any hashbang assertion; test/unit/serve-bridge.test.ts imports source modules only, and the one integration test touching serve-bridge spawns the source via tsx — structurally blind to a build-time banner regression. A future edit neutralizing the guard (a refactor swallowing the error, converting a throw to a warning, or dropping the call) leaves every suite green; if the regression then recurs (banner re-added, or an esbuild config change that drops the entry hashbang), the published qwen-serve-mcp bin ships with #!/usr/bin/env node on line 2 and fails at startup with SyntaxError — exactly the break this PR fixes.

Witness:

repo-wide sweep at HEAD (node_modules excluded):
  assertExecutableBin referenced in test files: 0
  bin.js / hashbang assertions in packages/sdk-typescript/test/: 0
  test/unit/serve-bridge.test.ts imports source modules only
  integration-tests/cli/daemon-invocation-context.test.ts:165 spawns bin.ts via tsx (source, not the built artifact)

Suggested fix — add an artifact-level test that pins the shipped artifact rather than the guard (so it reds on a banner re-addition even if assertExecutableBin is later neutralized), e.g.:

// packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts (run post-build)
const binPath = join(distDir, 'daemon-mcp/serve-bridge/bin.js');
const lines = readFileSync(binPath, 'utf8').split('\n');
expect(lines[0]).toBe('#!/usr/bin/env node');
expect(lines[1].startsWith('#!')).toBe(false);
expect(() => execFileSync('node', ['--check', binPath])).not.toThrow();

Note the suite's shape when adding it: vitest.config.ts:29 sets include: ['test/**/*.test.ts'], so the test must live under test/ with a .test.ts suffix, and reading dist/ relies on the repo's built-dist precondition (the vitest globalSetup guard stops the run when dist/ is missing). If you add it, please prove it pins the regression: re-add the esbuild banner (or otherwise remove the fix) and confirm the new test goes red — it must fail when line 2 becomes #!... or the built output stops parsing, independent of whether assertExecutableBin still exists.

中文说明

新增的 assertExecutableBin 守卫是钉住本 PR 所修复的重复 hashbang 回归的唯一检查,但测试套件中没有任何内容覆盖它——它的两个失败分支(缺少 hashbang、node --check 解析失败)都无法被任何测试触达。在 HEAD 上的全仓库扫描确认:0 个测试文件引用 assertExecutableBin、构建产物 bin.js 或任何 hashbang 断言;test/unit/serve-bridge.test.ts 只导入源码模块,而唯一触及 serve-bridge 的集成测试通过 tsx 启动源码——在结构上无法看到构建期 banner 回归。未来任何使守卫失效的修改(重构吞掉错误、把 throw 变成警告、或删掉调用)都会让整个套件保持绿色;届时若回归复发(重新加回 banner,或 esbuild 配置变更丢弃了入口的 hashbang),发布出的 qwen-serve-mcp bin 将在第 2 行带着 #!/usr/bin/env node,并在启动时以 SyntaxError 失败——正是本 PR 要修复的问题。

验证证据:

HEAD 上的全仓库扫描(排除 node_modules):
  测试文件中 assertExecutableBin 的引用数:0
  packages/sdk-typescript/test/ 中 bin.js / hashbang 断言的引用数:0
  test/unit/serve-bridge.test.ts 仅导入源码模块
  integration-tests/cli/daemon-invocation-context.test.ts:165 通过 tsx 启动 bin.ts(源码,而非构建产物)

建议修复——添加一个钉住交付产物而非守卫本身的产物级测试(这样即使 assertExecutableBin 日后被失效,重新加回 banner 时它也会变红),例如:

// packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts(构建后运行)
const binPath = join(distDir, 'daemon-mcp/serve-bridge/bin.js');
const lines = readFileSync(binPath, 'utf8').split('\n');
expect(lines[0]).toBe('#!/usr/bin/env node');
expect(lines[1].startsWith('#!')).toBe(false);
expect(() => execFileSync('node', ['--check', binPath])).not.toThrow();

添加时请注意套件的约束:vitest.config.ts:29 设置了 include: ['test/**/*.test.ts'],因此测试必须位于 test/ 下且以 .test.ts 结尾;读取 dist/ 依赖仓库的已构建 dist 前置条件(vitest globalSetup 守卫会在 dist/ 缺失时中止运行)。如果添加了该测试,请证明它确实钉住了回归:重新加回 esbuild banner(或以其他方式移除修复),确认新测试变红——无论 assertExecutableBin 是否仍然存在,只要第 2 行变成 #!... 或构建产物不再可解析,它都必须失败。

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Added in fec89f4a31packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts, and it does red on a banner re-addition with assertExecutableBin gone. One deliberate deviation from the suggested shape, and one correction to its premise.

Deviation. A test that reads only dist/ is silent on any tree that hasn't been built, so I made the primary case build-independent: the bin's esbuild options moved into scripts/serve-bridge-bin-build-options.js, shared by the build script and the test, and the test builds the bin with those exact options into a temp dir (23 ms — the bundle externalizes @modelcontextprotocol/sdk) and asserts line 1 is #!/usr/bin/env node, line 2 is not a hashbang, and node --check parses. Your dist/ assertion is kept as a second case, skipIf the artifact is absent — it covers the one thing the options module cannot: a banner re-added at the call site as a spread override.

Correction. packages/sdk-typescript/vitest.config.ts has no globalSetup — nothing stops the run when dist/ is missing. What actually puts dist/ there in CI is the root prepare script: npm ci runs node scripts/prepare.jsnpm run build, which builds every workspace in order. The test job never runs a build step of its own. That also means QWEN_SKIP_PREPARE=1 lanes (qwen-autofix.yml, e2e.yml, the review tooling's scratch trees) have no dist/ — which is why the second case skips rather than fails there, and why the first case doesn't depend on it at all.

Mutation proof, exactly the pin you asked for:

mutant build test 1 (built from options) test 2 (dist/)
none (as pushed) exit 0
banner back in the shared options expected true to be false
banner at the call site + guard neutralized (if (filePath) return;) exit 0 — regression publishes
restored exit 0

Row 3 is your scenario: the build goes green with #!/usr/bin/env node on line 2 of the shipped bin, and the suite is what catches it. Full SDK suite after the change: 38 files / 1707 tests, all green; eslint --max-warnings 0, prettier --check and tsc --noEmit clean.

中文说明

已在 fec89f4a31 添加 —— packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts,并且确认它在"重新加回 banner + assertExecutableBin 已失效"时会变红。相对建议的形态有一处有意的偏离,另有一处前提需要更正。

偏离。 只读 dist/ 的测试在未构建的树上是静默的,所以我把主用例做成不依赖构建产物:bin 的 esbuild 选项抽到 scripts/serve-bridge-bin-build-options.js,由构建脚本与测试共享;测试用这份完全相同的选项把 bin 构建到临时目录(23 ms —— 该 bundle 把 @modelcontextprotocol/sdk 外部化),断言第 1 行是 #!/usr/bin/env node、第 2 行不是 hashbang、node --check 可解析。你建议的 dist/ 断言作为第二个用例保留,产物缺失时 skipIf —— 它覆盖了选项模块覆盖不到的一种情况:banner 以展开覆写的形式加在调用点上。

更正。 packages/sdk-typescript/vitest.config.ts 里没有 globalSetup —— dist/ 缺失时并没有什么会中止运行。CI 里真正把 dist/ 放到位的是根 prepare 脚本:npm ci 会执行 node scripts/prepare.jsnpm run build,按依赖顺序构建所有 workspace。test job 自身从不跑构建步骤。这也意味着设置了 QWEN_SKIP_PREPARE=1 的 lane(qwen-autofix.ymle2e.yml、review 工具的 scratch tree)没有 dist/ —— 所以第二个用例在那里是跳过而不是失败,而第一个用例根本不依赖它。

突变验证,正是你要求钉住的那一点:

突变 构建 用例 1(按选项构建) 用例 2(dist/
无(即已推送版本) exit 0
共享选项里加回 banner expected true to be false
调用点加 banner + 守卫失效if (filePath) return; exit 0 —— 回归会被发布
还原 exit 0

第 3 行就是你说的场景:构建全绿,而发布出的 bin 第 2 行是 #!/usr/bin/env node,靠测试套件抓住。改动后 SDK 全量套件:38 文件 / 1707 测试全绿;eslint --max-warnings 0prettier --checktsc --noEmit 均干净。

@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: ✅ 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: 46 passed · 0 failed · 46 total

Flakiness gate: not applicable — no runnable changed test files (0 out-of-scope file(s) noted in the log)

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

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

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

抖动门:不适用 — no runnable changed test files (0 out-of-scope file(s) noted in the log)

Verification report

PR 10485 — fix(sdk): stop emitting a duplicated hashbang in the serve-mcp bin

Verdict: merge-ready — 46/46 scripted assertions passed (0 unexpected failures), verified head 0d3ee99a31c0fd4ccf20c5cea3bdb165b16dc927 (merge 9ca06f4b90 over base 866b7fe9a6). Single-commit PR; per-commit attribution trivially holds.

中文摘要
  • 结论:merge-ready。46/46 脚本化断言全部通过,0 个意外失败。
  • A/B 结论(见 “Central claim” 表与 01-ab-base-vs-head.png):base(866b7fe9)构建 exit 0、产物 bin.js 第 1、2 行都是 #!/usr/bin/env nodenode --check 报 SyntaxError,node <file> 与 shebang 两种启动方式都拿不到任何 MCP 响应;head(0d3ee99a)产物第 1 行 hashbang、第 2 行代码,真实 stdio MCP 握手成功(initialize + tools/list 31 个工具,stderr 干净,exit 0)。11/11。
  • 守卫验证02-mutation-matrix.png):5 个构建单元 13/13。把 banner 加回去 → 构建以 “Bin … does not parse” 失败(守卫抓住原 bug);删掉入口 hashbang → 以 “must start with a hashbang line” 失败,且被拒产物本身 node --check 通过(证明两个子句各自钉住);只删守卫 → 构建通过且产物正常(修复来自 banner 移除);两个 hunk 同时回退 → 构建通过但产物重新变坏(组合行证明守卫防回归是 load-bearing)。无幸存突变。
  • 接收侧03-sibling-census-and-tarball.png):npm pack tarball 内含该 bin、保留可执行位,解压后握手成功;其余 5 个已声明 bin 全部单 hashbang 且可解析;仓库其余 3 处 banner: 均非 hashbang。
  • 门槛:eslint(已植入突变证明 gate 有效)、prettier、SDK 套件 37 文件 / 1699 测试全绿。
  • Findings:1 条 Nice-to-have(同款守卫可扩展到其余 bin;现状普查全部健康,不阻塞)。
  • 未覆盖:macOS/Windows 执行;npm registry 上已发布 0.1.8 的实测(无网络;base A/B 已在 baseRefOid 证明机制);initialize/tools/list 之外的完整工具调用;其余 workspace 套件(diff 只触及 sdk 构建脚本,PR 自身 CI 已覆盖)。

Central claim + A/B

Central claim: the built qwen-serve-mcp bin goes from unstartable (banner stacked on the entry's own hashbang → SyntaxError through both launch paths) to a working MCP stdio server, and the new assertExecutableBin makes that property fail-loud at build time.

Witness: 01-ab-base-vs-head.png (live re-run of harness/ab-harness.mjs; raw log logs/ab-run1.log).

Cell Oracle base 866b7fe9 (banner, no guard) head 0d3ee99a (no banner + guard)
node scripts/build.js exit code 0 — break ships silently 0 (guard passes)
bin.js lines 1–2 bytes #!… and #!… (duplicated) #!… then var __defProp…
node --check bin.js exit / stderr 1, SyntaxError: Invalid or unexpected token 0
node bin.js + MCP initialize stdio responses 0 responses, stderr SyntaxError, exit 1 serverInfo qwen-serve-bridge@1.0.0, protocolVersion 2024-11-05
shebang exec ./bin.js + initialize stdio responses 0 responses, stderr SyntaxError, exit 1 initialize OK, exit 0
tools/list tool count — (process dead) 31 tools
shutdown stderr / exit stderr "", exit 0 after stdin EOF

A/B assertions: 11/11 (every base-side red is an encoded expectation, i.e. a pass).

Secondary claim 1 — the guard is load-bearing, both clauses pinned. Witness: 02-mutation-matrix.png (live re-run of harness/mutation-matrix.mjs in tmp/head-tree; raw log logs/matrix-run1.log).

Build variant build exit produced bin interpretation
C0 unmutated head 0 works control
C1 banner restored 1 — “Bin … does not parse” + SyntaxError (broken: 2 hashbangs) guard catches the original bug
C2 entry hashbang stripped 1 — “Bin … must start with a hashbang line” parses fine (node --check 0) hashbang clause pins what the parse clause cannot
C3 guard removed, banner absent 0 works banner removal is the fix; guard changes no bytes
C4 both hunks reverted 0 — nothing catches it broken (2 hashbangs, no parse) combination row: without the guard the regression ships silently again

Matrix assertions: 13/13, no surviving mutants, no redundant defence (each hunk fails its own mutation).

Secondary claim 2 — no sibling of the bug class remains. Witness: 03-sibling-census-and-tarball.png (harness/census-harness.mjs + harness/tarball-harness.mjs).

Check result
Other declared bins (scripts/cli-entry.js, packages/cli/dist/index.js, packages/node-repl/dist/index.js, packages/channels/plugin-example/dist/start-server.js, sdk bin) each: line 1 hashbang, line 2 code, node --check 0 — 10/10
packages/mobile-mcp bin target absent from the repo build (standalone package, own lockfile, source entry has its own hashbang) — recorded, pre-existing, not a regression
Remaining banner: usages (vscode-ide-companion/esbuild.js, esbuild.config.js ×2) import.meta shim / "use strict" — none is a hashbang banner; the PR's claim holds
npm pack tarball contains dist/daemon-mcp/serve-bridge/bin.js, mode 755 preserved; extracted bin: hashbang+code, node --check 0, answers initialize + tools/list, clean stderr, exit 0 — 5/5

Census + tarball assertions: 18/18.

Gates

Witness: 04-gates.png (harness/gates-harness.mjs; first-run log logs/sdk-suite.log).

Gate result liveness proof
eslint packages/sdk-typescript/scripts/build.js exit 0 planted unused var under the same packages/ path → reported (@typescript-eslint/no-unused-vars), exit 1
prettier --check on the changed file clean
@qwen-code/sdk vitest suite 37 files / 1699 tests, all passed (matches the author's claim exactly) suite covers src; the diff touches only the build script, so it is cited as a no-drift regression gate

Gate assertions: 4/4.

Findings

  1. Nice-to-have — the new guard covers only the serve-bridge bin. The same two-line assertExecutableBin check could be applied to the other declared bins at their respective build steps; today they are unguarded but verified healthy by the census above (10/10). Not blocking: the PR's stated scope is the one bin that was broken, and the census shows no live sibling instance.

Not covered

  • macOS/Windows execution of the bin (same as the author). The fix is byte-level and the guard is a parse-level check; the container is Linux.
  • The published @qwen-code/sdk@0.1.8 tarball on the npm registry was not fetched (no network in this environment). The mechanism is proven at baseRefOid by the A/B, and the accept side is proven by packing + extracting + probing the head tarball.
  • Full MCP tool invocations beyond initialize / tools/list — the claim under test is startability; the handshake proves boot, event loop, and MCP wiring.
  • Repo-wide suites and other workspaces' tests — the diff is confined to packages/sdk-typescript/scripts/build.js; the PR's own CI covers the rest. The sdk suite was re-run here as the targeted gate.
  • npm-install-time bin chmod — the tarball already preserves mode 755; npm's install-time behavior is standard and not exercised.

Methodology

Environment: CI node:22-bookworm container (node v22.23.2), merge-ref checkout at depth 2 (HEAD = merge 9ca06f4b90, HEAD^1 = base 866b7fe9a6 = snapshot baseRefOid, HEAD^2 = 0d3ee99a31 = snapshot headRefOid; rev-list HEAD^1..HEAD^2 = exactly the one snapshot commit). Base and head scratch worktrees (tmp/base-tree, tmp/head-tree) reused the root node_modules: @qwen-code/sdk has no internal workspace dependencies, and readlink -f confirmed esbuild/zod/@modelcontextprotocol/sdk resolve to real directories under the root, so the control is a pure code A/B (no lockfile change in the diff). Every cell drove real artifacts: real esbuild builds per variant, real child processes for node <bin> / shebang exec, and a real stdio MCP handshake (harness/mcp-probe.mjs) — no stubs. The head dist was rebuilt during verification through the actual prepack pipeline (npm pack), so the HEAD cell and the tarball cell probe publish-pipeline output. Harnesses live in harness/, raw logs in logs/, evidence PNGs rendered by scripts/verify-capture.mjs from live re-runs. Assertion tally: 11 (A/B) + 13 (matrix) + 13 (census) + 5 (tarball) + 4 (gates) = 46. One harness-side defect was found and fixed during the round (the gates harness initially matched the vitest summary without stripping ANSI codes, reading a green suite as a parse failure); the fixed harness was re-run and re-captured, and the failure never touched the PR's code.

Flakiness gate log


verdict: n/a
summary: no runnable changed test files (0 out-of-scope file(s) noted in the log)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

03-sibling-census-and-tarball

04-gates

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's only review on 0d3ee99a31c0fd4ccf20c5cea3bdb165b16dc927 is a COMMENTED one, which carries no vote — so it has no verdict of its own on this commit, and main needs two approving reviews: an approval left by another account is a separate vote and does not count as the bot's own. Two different things look like this, and the stage-3 comment above says which: the triage skill deferring on purpose at 3/5 — a fork refactor hitting the approval guardrail, or a core change escalated for maintainer awareness, both normal outcomes — or an earlier approval that a push dismissed, leaving only the comment behind, which needs a fresh review.

⚠️ 机器人在 0d3ee99a31c0fd4ccf20c5cea3bdb165b16dc927 上唯一的评审是 COMMENTED不带票 —— 因此它在该 commit 上没有自己的裁决,而 main 需要两个批准(其他账号的批准是另一张票)。有两种情况长这样,上方的 stage-3 评论会说明是哪一种:triage skill 在 3/5 时有意 defer(fork refactor 命中审批护栏,或核心改动被升级交由维护者把关,两者都是正常结果);或者更早的批准被一次推送作废、只剩下这条评论,此时需要重新评审。

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

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

@github-actions

github-actions Bot commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.85% 85.85% 91.08% 84.69%
Core 88.94% 88.94% 90.59% 87.37%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.85 |    84.69 |   91.08 |   85.85 |                   
 src               |   86.55 |    82.86 |   88.88 |   86.55 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.43 |    77.73 |   80.76 |   73.43 | ...1354-1358,1485 
  ...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.57 |     78.1 |   93.85 |   75.57 |                   
  acpAgent.ts      |   74.73 |    77.95 |   93.18 |   74.73 | ...08,13886-13887 
  ...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 |   76.99 |    71.56 |     100 |   76.99 | ...20-524,533-537 
  ...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 |   91.04 |    86.21 |   95.86 |   91.04 |                   
  Session.ts       |   90.39 |    85.16 |    95.3 |   90.39 | ...96,13823-13827 
  ...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 |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...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.54 |   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.26 |   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.67 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    85.08 |     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.45 |    78.26 |   65.62 |   90.45 |                   
  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.06 |    75.72 |     100 |   89.06 | ...27-930,942,953 
  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.73 |   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 |     87.5 |     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 |    55.55 |     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.97 |   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.74 |    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.12 |     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.38 |    90.49 |   95.32 |   94.38 |                   
  ...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.34 |    90.87 |   86.84 |   88.34 | ...2335,2337-2345 
  ...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.87 |     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.17 |     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.57 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |    96.15 |     100 |     100 | 26                
 src/serve         |   87.66 |    85.38 |    91.2 |   87.66 |                   
  ...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.27 |     100 |     100 | 752               
  ...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.7 |    91.96 |     100 |    98.7 | ...1593,1595-1596 
  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.4 |       82 |   95.45 |    91.4 | ...47-556,634-635 
  ...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 |    84.94 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   85.03 |    82.08 |   78.57 |   85.03 | ...9592,9610-9614 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   47.11 |    63.01 |   76.92 |   47.11 | ...1061,1073-1096 
  ...-keepalive.ts |   94.31 |    89.18 |     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.62 |    91.52 |   72.38 |   89.62 | ...3301,3332-3333 
  ...-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 
  ...ssion-gate.ts |   98.48 |    94.44 |     100 |   98.48 | 70                
  ...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.9 |    88.88 |   92.59 |    89.9 | ...03-412,423-426 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...93-594,601-602 
  ...e-remember.ts |   98.31 |    93.29 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.69 |     100 |   89.85 | ...06-207,275-296 
  ...oordinator.ts |   98.27 |    96.87 |     100 |   98.27 | 147-148           
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.91 |    73.04 |   96.29 |   72.91 | ...98-899,906-910 
  ...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.64 |    80.25 |   94.53 |   80.64 |                   
  ...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.94 |    77.03 |   93.44 |   75.94 | ...5822,5879-5885 
  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.08 |   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.75 |   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.54 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.14 |    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.56 |    81.86 |   95.87 |   86.56 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.96 |    95.12 |     100 |   98.96 | 102               
  ...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.76 |    83.18 |   94.44 |   86.76 | ...7281,7283-7284 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.13 |    80.79 |     100 |   87.13 | ...90-492,495-500 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  user-language.ts |   99.24 |    87.87 |     100 |   99.24 | 167               
  ...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.27 |    80.75 |      90 |   83.27 | ...1071,1076,1083 
  ...extensions.ts |   89.92 |    79.52 |   94.36 |   89.92 | ...2588,2633-2634 
  ...-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.22 |    84.17 |     100 |   87.22 | ...1823,1833-1838 
  ...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 
  ...ce-runtime.ts |     100 |    96.55 |     100 |     100 | 117               
  ...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.56 |    91.69 |   96.17 |   93.56 |                   
  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 |    89.3 |    84.29 |     100 |    89.3 | ...41,958,985-994 
  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.27 |     87.5 |     100 |   95.27 | 194-200           
  ...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.07 |    97.31 |     100 |   99.07 | ...13,882,961-963 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |      90 |    87.33 |   91.66 |      90 |                   
  index.ts         |   89.65 |    86.98 |   90.47 |   89.65 | ...1393,1407,1421 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.71 |    89.76 |   98.13 |   92.71 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    86.48 |     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.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.85 |    92.98 |     100 |   97.85 | 178,185-186       
  ...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.77 |     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.68 |    78.68 |   72.18 |   71.68 |                   
  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 |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  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.71 |     84.5 |   91.66 |   84.71 |                   
  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.72 |     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.96 |    74.68 |   83.33 |   73.96 | ...76-609,620-621 
  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.31 |    81.81 |     100 |   78.31 | 37-52,73,92       
  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 |    4.07 |      100 |       0 |    4.07 |                   
  ...gerDialog.tsx |    4.07 |      100 |       0 |    4.07 | 78-136,139-667    
 ...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.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.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 |    72.72 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/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/opentui    |   83.78 |    76.39 |   80.59 |   83.78 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  dialogs-core.ts  |     100 |    94.28 |     100 |     100 | 179,190           
  ...gs-shared.tsx |   51.32 |     64.7 |      40 |   51.32 | ...28-331,371-449 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |   90.57 |    71.42 |   88.88 |   90.57 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...projection.ts |    83.6 |    63.26 |   86.66 |    83.6 | ...1069,1074,1079 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...h-dispatch.ts |   75.24 |     63.1 |      50 |   75.24 | ...73,592-593,636 
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
 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.27 |     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.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     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.07 |    86.06 |   96.15 |   88.07 |                   
  ...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.33 |     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.45 |     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.27 |    89.92 |   96.15 |   92.27 |                   
  ...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.44 |    97.36 |     100 |   99.44 | 121               
  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.94 |    87.37 |   90.59 |   88.94 |                   
 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.51 |    85.04 |      94 |   90.51 |                   
  ...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 |   94.64 |    88.67 |   95.71 |   94.64 | ...1676,1690-1692 
  ...w-snapshot.ts |   75.58 |    72.47 |    87.5 |   75.58 | ...24,448,455-457 
  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.43 |    87.58 |   91.66 |   93.43 |                   
  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 |   94.08 |     85.4 |   95.65 |   94.08 | ...68,435,455-458 
  ...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.41 |    88.75 |   78.54 |   86.41 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |      85 |    88.06 |   76.48 |      85 | ...9669,9673-9675 
  ...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.85 |    88.72 |   93.99 |   92.85 |                   
  ...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.5 |    88.28 |   91.91 |    92.5 | ...4705,4803-4804 
  ...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       |   94.11 |    91.47 |   86.36 |   94.11 | ...1311,1514-1515 
  ...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 |     92.1 |     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.29 |    86.64 |   93.68 |   89.29 |                   
  ...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 |   93.05 |    89.44 |   98.36 |   93.05 | ...1694-1700,1744 
  ...ionManager.ts |   85.41 |    84.48 |   83.49 |   85.41 | ...3261,3299-3300 
  ...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.37 |      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.71 |    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.73 |    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 |    84.61 |     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.36 |   96.58 |   90.67 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.47 |    88.69 |     100 |   98.47 | 85-86,109,473-474 
  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.55 |   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 |     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.7 |     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.95 |     86.4 |   94.73 |   89.95 |                   
  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    |   95.02 |    87.87 |     100 |   95.02 | ...19,239,251-253 
  skill-manager.ts |    86.6 |     86.6 |   86.11 |    86.6 | ...1286,1293-1297 
  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.86 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |     80.7 |   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.75 |    86.42 |   90.36 |   87.75 |                   
  ...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.55 |    88.01 |   94.02 |   86.55 | ...2581,2585-2588 
  ...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 |       85 |     100 |      96 | ...42,595,605-609 
  ...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.81 |    90.38 |      92 |   93.81 | ...70,674,722-744 
  ...-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.29 |    86.71 |   83.33 |   89.29 |                   
  workflow.ts      |   89.29 |    86.71 |   83.33 |   89.29 | ...91-892,991-992 
 src/utils         |   92.82 |    89.82 |   96.91 |   92.82 |                   
  ...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 |    92.99 |      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.39 |    81.95 |     100 |   95.39 | ...1075,1421-1422 
  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.57 |     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             
  ...ollow-open.ts |     100 |    93.33 |     100 |     100 | 134,177           
  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.16 |    89.28 |     100 |   96.16 | ...59,375,459,478 
  ...-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.

@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@wenshao
wenshao enabled auto-merge August 29, 2026 15:05
@qwen-code-ci-bot

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

Flakiness gate: not applicable — no runnable changed test files (0 out-of-scope file(s) noted in the log)

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

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

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

抖动门:不适用 — no runnable changed test files (0 out-of-scope file(s) noted in the log)

Verification report

PR 10485 — fix(sdk): stop emitting a duplicated hashbang in the serve-mcp bin (round 2)

Verdict: merge-ready — 77/77 scripted assertions passed (0 unexpected failures), verified head 0d3ee99a31c0fd4ccf20c5cea3bdb165b16dc927 (merge 9ca06f4b90 over base 866b7fe9a6). Single-commit PR; git rev-list HEAD^1..HEAD^2 = exactly the one commit in the metadata snapshot, so per-commit attribution trivially holds.

中文摘要
  • 结论:merge-ready。77/77 脚本化断言全部通过,0 个意外失败。本轮为跟进轮:头提交与上一轮完全相同(0d3ee99a31),按协议对全部测量在新头重新执行,而非复用旧报告数字;各表与上一轮一致(断言粒度更细:17+20+23+11+6)。
  • A/B 结论(见 “Central claim” 表与 01-ab-base-vs-head.png):base(866b7fe9)构建 exit 0、产物第 1、2 行都是 hashbang,node --check 报 SyntaxError,node <file> 与 shebang 两条启动路径都拿不到任何 MCP 响应(9/9 预期内的红);head(0d3ee99a)第 1 行 hashbang、第 2 行代码,真实 stdio MCP 握手成功(initialize + tools/list 31 个工具,stderr 干净,exit 0)。
  • 守卫验证02-mutation-matrix.png):5 个构建单元 20/20。banner 加回去 → 构建以 “Bin … does not parse”(含 SyntaxError)失败;删掉入口 hashbang → 以 “must start with a hashbang line” 失败,且被拒产物本身 node --check 通过(两个子句各自钉住不同的坏法);只删守卫 → 构建通过且产物正常(修复来自 banner 移除,守卫不改任何字节);两个 hunk 同时回退 → 构建通过但产物重新变坏(组合行证明守卫是防回归的 load-bearing)。无幸存突变。
  • 接收侧与兄弟普查03-sibling-census-and-tarball.png):npm pack(prepack = build + bundle:cli)产出 qwen-code-sdk-0.1.8.tgz,bin 以 755 收录,解压后握手成功(11/11);其余 6 个可普查 bin 全部单 hashbang 且可解析、仓库 5 处 banner: 用法均非 hashbang(23/23)。
  • 门槛04-gates.png):eslint / prettier 干净(均植入违规证明门禁有效),SDK 套件 37 文件 / 1699 测试全绿(与作者声明完全一致)。
  • Findings:沿用上一轮 1 条 Nice-to-have(守卫可扩展到其余 bin;普查证明现状全部健康,不阻塞)。
  • 未覆盖:macOS/Windows 执行;npm registry 已发布 0.1.8 的实测(无网络);initialize/tools/list 之外的完整工具调用;其余 workspace 套件;mobile-mcp bin(不在本仓库构建管线内,仅记录)。

Previous-finding status (follow-up round)

This is a follow-up round. The head OID is byte-identical to the previous round (0d3ee99a31 over the same base 866b7fe9a6; depth-2 checkout confirmed, snapshot OIDs match HEAD^1/HEAD^2 exactly), so the input closure is unchanged — nevertheless every measurement below was rebuilt and re-run at the new head per protocol, not carried forward.

# Previous finding Severity Status at this head
1 assertExecutableBin covers only the serve-bridge bin; the other declared bins are unguarded Nice-to-have stands — no code change since the previous head; census re-measured fresh at this head (table below): all six reachable bins are healthy (single hashbang + parse), so the unguarded siblings remain healthy but unguarded. Agree with the previous round's non-blocking treatment: the PR's scope is the one bin that was broken.

Central claim + A/B

Central claim: the built qwen-serve-mcp bin goes from unstartable (banner stacked on the entry point's own hashbang → SyntaxError through both launch paths, shipped silently because the base build still exits 0) to a working MCP stdio server, and the new assertExecutableBin makes that property fail-loud at build time.

Witness: 01-ab-base-vs-head.png (live run of harness/ab-harness.mjs; raw log logs/ab-run1.log). Both cells rebuilt from source in this round: base in a scratch worktree at HEAD^1 (build 100.8 s), head in the main tree (build 126.5 s).

Cell Oracle base 866b7fe9 (banner, no guard) head 0d3ee99a (no banner + guard)
node scripts/build.js exit code 0 — break ships silently 0 (guard passes)
bin.js lines 1–2 bytes #!/usr/bin/env node twice #!/usr/bin/env node then var __defProp = …
node --check bin.js exit / stderr 1 — SyntaxError: Invalid or unexpected token 0
node bin.js + MCP initialize stdio responses / stderr 0 responses, SyntaxError, exit 1 serverInfo qwen-serve-bridge@1.0.0, protocol 2024-11-05
shebang exec ./bin.js + initialize stdio responses / stderr 0 responses, SyntaxError, exit 1 initialize OK
tools/list tool count — (process dead) 31 tools
shutdown stderr / exit stderr "", exit 0 after stdin EOF

A/B assertions: 17/17 (every base-side red is an encoded expectation, i.e. a pass).

Reviewer Test Plan, per step — all three steps were executable and pass:

  1. On main: two hashbang lines + SyntaxError → base cells ab-01…ab-09 (reproduced at baseRefOid, not just read out of the tarball evidence).
  2. On branch: line 1 hashbang, line 2 code; real MCP initialize answers → head cells ab-10…ab-17.
  3. Negative controls → mutation matrix C1 (does not parse) and C2 (must start with a hashbang line), below.

Secondary claim 1 — the guard is load-bearing, both clauses pinned. Witness: 02-mutation-matrix.png (run in scratch worktree tmp/mutate-tree @​ HEAD; raw log logs/matrix-run1.log). Builds C0–C4 took 126.8 / 169.9 / 109.2 / 158.7 / 115.5 s.

Build variant build exit produced bin interpretation
C0 unmutated head 0 works (31 tools) control
C1 banner restored 1 — Error: Bin … does not parse + SyntaxError broken: 2 hashbangs, node --check fails guard catches the original bug
C2 entry hashbang stripped 1 — thrown at the “must start with a hashbang line” clause (Node framed the exact throw site) parses fine (node --check 0) hashbang clause pins what the parse clause cannot
C3 guard removed, banner absent 0 works (31 tools) banner removal is the fix; guard changes no bytes
C4 both hunks reverted 0 — nothing catches it broken: 2 hashbangs, node --check fails, 0 MCP responses combination row: without the guard the regression ships silently again

Matrix assertions: 20/20, no surviving mutants, no redundant defence — each hunk fails its own single-hunk mutation, and only the combination row reproduces the silent ship. Positive control: C1/C2 are the caught mutants; C0 is the unmutated green.

Secondary claim 2 — no sibling of the bug class remains. Witness: 03-sibling-census-and-tarball.png (harness/census-harness.mjs + harness/tarball-harness.mjs; raw logs logs/census-run1.log, logs/tarball-run1.log).

Check result
Declared bins: root scripts/cli-entry.js, packages/cli/dist/index.js, packages/node-repl/dist/index.js, packages/channels/plugin-example/dist/start-server.js, sdk bin, fixture integration-tests/fixtures/idle-mcp/server.mjs each: line 1 hashbang, line 2 code, node --check 0 — 18/18
packages/mobile-mcp bin target lib/index.js absent — not built by this repo's pipeline (own lockfile, own build tsc && chmod +x); source entry carries its own hashbang. Recorded, not asserted, pre-existing
Remaining banner: usages (esbuild.config.js ×2, vscode-ide-companion/esbuild.js, fzfWorkerHandle.test.ts fixture, two --banner:js CLI flags in integrations) "use strict" / import.meta shim / createRequire shim — none is a hashbang banner; the PR's claim holds — 5/5
npm pack tarball (prepack = build + bundle:cli, 209.4 s) qwen-code-sdk-0.1.8.tgz contains dist/daemon-mcp/serve-bridge/bin.js at -rwxr-xr-x; extracted bin: hashbang+code, node --check 0, answers initialize + tools/list (31 tools), clean stderr, exit 0 — 11/11

Census + tarball assertions: 23/23 and 11/11.

Gates

Witness: 04-gates.png (harness/gates-harness.mjs; raw log logs/gates-run1.log).

Gate result liveness proof
eslint packages/sdk-typescript/scripts/build.js exit 0 planted unused-var file in the same dir → @typescript-eslint/no-unused-vars, exit 1
prettier --check on the changed file clean
vitest runner collects and fails correctly planted failing test in test/ went red with expected 1 to be 2
@qwen-code/sdk vitest suite 37 files / 1699 tests, all passed in 51.7 s (matches the author's claim exactly) cited as a no-drift regression gate: the suite covers src, the diff touches only the build script

Gate assertions: 6/6.

Findings

  1. Nice-to-have (carried over from round 1, stands) — the new guard covers only the serve-bridge bin. The same two-line assertExecutableBin check could be applied to the other declared bins at their respective build steps; today they are unguarded but verified healthy by this round's fresh census (18/18). Not blocking: the PR's stated scope is the one bin that was broken, and no live sibling instance exists.
  2. Observation (pre-existing, not a regression)packages/mobile-mcp declares a bin whose target is not produced by the repo build (standalone lockfile/build). Its source entry has its own hashbang, so it does not instantiate this PR's bug class; recorded for completeness only.

No new findings this round.

Not covered

  • macOS/Windows execution of the bin (same as the author). The fix is byte-level and the guard is a parse-level check; this container is Linux (node:22-bookworm, node v22.23.2).
  • The published @qwen-code/sdk@0.1.8 tarball on the npm registry was not fetched (no network in this environment). The mechanism is proven at baseRefOid by the A/B, and the accept side by packing + extracting + probing the head tarball through the real prepack pipeline.
  • Full MCP tool invocations beyond initialize / tools/list — the claim under test is startability; the handshake proves boot, event loop, and MCP wiring (31 tools listed).
  • Repo-wide suites and other workspaces' tests — the diff is confined to packages/sdk-typescript/scripts/build.js; the PR's own CI covers the rest. The sdk suite was re-run here as the targeted gate.
  • npm-install-time bin wiring — the tarball already carries mode 755 and the exec-mode probes chmod to 755 (what npm install does); npm's own install path was not exercised.
  • verify-capture stdin-pipe mode initially failed in this environment (non-blocking stdin → EAGAIN on slow producers); all captures therefore used the documented -- cmd form or file redirection, so no evidence was lost to it.

Methodology

Environment: CI node:22-bookworm container (node v22.23.2), merge-ref checkout at depth 2 (HEAD = merge 9ca06f4b90, HEAD^1 = base 866b7fe9a6 = snapshot baseRefOid, HEAD^2 = 0d3ee99a31 = snapshot headRefOid; rev-list HEAD^1..HEAD^2 = exactly the one snapshot commit). Base and mutation scratch worktrees (tmp/base-tree, tmp/mutate-tree, both removed after use) reused the root node_modules: @qwen-code/sdk has no internal @qwen-code/* dependencies (dependencies = @modelcontextprotocol/sdk, zod only) and the diff changes no lockfile, and import.meta.resolve from inside the base worktree confirmed esbuild, zod, and @modelcontextprotocol/sdk all resolve to /__w/qwen-code/qwen-code/node_modules/… — identical on both arms, so the control is a pure code A/B. Every cell drove real artifacts: real esbuild+tsc builds per variant (build script run directly with node_modules/.bin on PATH), real child processes for node <bin> and shebang exec, and a real stdio MCP handshake (harness/mcp-probe.mjs: initialize → notifications/initialized → tools/list → stdin EOF shutdown) — no stubs. The head dist was additionally rebuilt through the actual publish pipeline (npm pack fires prepack = build + bundle:cli), so the tarball cell probes what a consumer installs. Guard-message matches were verified against the actual thrown Error: text / Node code frame, not just stack traces. Evidence PNGs: 01 and 04 are live captures of the harness runs; 03 is a live capture of the tarball run with the census log prepended; 02 was rendered from its run log. Assertion tally: 17 (A/B) + 20 (matrix) + 23 (census) + 11 (tarball) + 6 (gates) = 77. Raw logs in logs/, harnesses in harness/.

Flakiness gate log


verdict: n/a
summary: no runnable changed test files (0 out-of-scope file(s) noted in the log)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

03-sibling-census-and-tarball

04-gates

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's only review on 0d3ee99a31c0fd4ccf20c5cea3bdb165b16dc927 is a COMMENTED one, which carries no vote — so it has no verdict of its own on this commit, and main needs two approving reviews: an approval left by another account is a separate vote and does not count as the bot's own. Two different things look like this, and the stage-3 comment above says which: the triage skill deferring on purpose at 3/5 — a fork refactor hitting the approval guardrail, or a core change escalated for maintainer awareness, both normal outcomes — or an earlier approval that a push dismissed, leaving only the comment behind, which needs a fresh review.

⚠️ 机器人在 0d3ee99a31c0fd4ccf20c5cea3bdb165b16dc927 上唯一的评审是 COMMENTED不带票 —— 因此它在该 commit 上没有自己的裁决,而 main 需要两个批准(其他账号的批准是另一张票)。有两种情况长这样,上方的 stage-3 评论会说明是哪一种:triage skill 在 3/5 时有意 defer(fork refactor 命中审批护栏,或核心改动被升级交由维护者把关,两者都是正常结果);或者更早的批准被一次推送作废、只剩下这条评论,此时需要重新评审。

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

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

@CanReader CanReader left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Reviewed the build change and reproduced the bug end to end. This is a real break, not a theoretical one, and the fix is right.

I rebuilt the serve-bridge entry both ways with the repo's own esbuild to confirm the mechanism:

# A) with banner:js — the config on main today
$ esbuild src/daemon-mcp/serve-bridge/bin.ts --bundle --platform=node --format=esm \
    --banner:js='#!/usr/bin/env node' --external:@modelcontextprotocol/sdk
head -2:
  #!/usr/bin/env node
  #!/usr/bin/env node
$ node --check A.js
  SyntaxError: Invalid or unexpected token

# B) without the banner — this PR
head -2:
  #!/usr/bin/env node
  var __defProp = Object.defineProperty;
$ node --check B.js   ->  exit 0

src/daemon-mcp/serve-bridge/bin.ts already starts with #!/usr/bin/env node, and esbuild carries an entry point's own hashbang into the output, so the banner really was stacking a second one on line 2. Since dist/daemon-mcp/serve-bridge/bin.js is the qwen-serve-mcp bin in package.json, the published binary could not start at all.

I also ran the new assertExecutableBin against both artifacts: it throws on A and passes on B, so the guard actually catches the regression it is there to catch. Putting it in the build script rather than a unit test is the right layer — this is a property of the emitted artifact, and neither type checking nor vitest would ever see it.

One suggestion, not a blocker: the guard hardcodes the one bin path. Since package.json already declares the bin map, driving the assertion off that map instead would cover any bin added later without someone remembering to add a second call. Today there is exactly one entry so the coverage is complete either way.

Two review follow-ups on the duplicated-hashbang fix.

`assertExecutableBin` ran `node --check` through `execSync` with a command
string, so the path went through `/bin/sh -c` — and `JSON.stringify` is JSON
quoting, not shell quoting. A checkout under a directory containing `$(…)`, a
backtick or `$VAR` executed the embedded command as the build user and then
failed the build with a misleading `does not parse`. The argv form of
`execFileSync` needs no quoting at all.

Nothing in the suite covered the guard, so a later edit that swallows its error
or drops the call would leave every test green while the next banner regression
publishes. Extract the bin's esbuild options into a module the build script and
a new test share, and assert on the emitted bytes: exactly one hashbang, on
line 1, and `node --check` parses. That reds on a banner regression whatever
happens to the guard. A second case pins the shipped `dist/` artifact, catching
a banner re-added at the call site rather than in the shared options; `npm ci`
builds it through the root `prepare` script, and it skips on a tree without a
build rather than failing.
@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

Both /review findings are addressed in fec89f4a31, with replies and mutation evidence on each thread. And on the red that held the deferred approval: it was the runner, not this diff, in both jobs.

Review follow-ups

  • R1-1assertExecutableBin now runs execFileSync('node', ['--check', filePath]). Reproduced the finding against the real guard body first: under a directory named qwen$(touch …)ry the old string form both executed the embedded command and failed the build with a misleading does not parse; the argv form does neither.
  • R1-2 — the bin's esbuild options moved into scripts/serve-bridge-bin-build-options.js, shared by the build script and a new test/unit/serve-bridge-bin.test.ts. The primary case builds the bin with those exact options into a temp dir (23 ms) and pins the emitted bytes, so it reds on a banner regression whatever happens to the guard; a second case pins the shipped dist/ artifact, covering a banner re-added at the call site. With the guard neutralized and a call-site banner, the build still exits 0 and publishes a double hashbang — and the suite is what catches it.

On the previous red (e177c39170, run 33269725917)

Both failures are the same self-hosted-runner starvation, and neither reaches this diff:

  • web-shell E2E Smoke never got past installation — it entered npm ci at 20:02:25 and was still inside npm run build when the job was canceled 19 minutes later (Terminate orphan process: pid … (npm ci), … (esbuild)). Zero Playwright specs ran; the artifact upload found no test-results to collect.
  • Test (ubuntu-latest, Node 22.x) ran 1h00m44s and was cancelled at the job's 60-minute limit. (Correction to an earlier version of this comment: the Runner failed line in that log is a test fixture string from packages/cli/src/utils/relaunch.test.ts, not the Actions runner failing.) The failures are unrelated packages/cli suites dying on the clock, not on assertions — clipboardUtils (30s), update (15s), workspace-registration-store (16s), server-default-bridge-wiring (15s ×5), process-env-guard (40s). Post Coverage Comment then failed only because it had no junit.xml to parse.

This diff touches packages/sdk-typescript alone, and the SDK's own suite was green throughout that run. Fresh CI is now running on fec89f4a31.

Local gates on the new head: npm run build exit 0; SDK suite 38 files / 1707 tests green; eslint --max-warnings 0, prettier --check, tsc --noEmit and the test-fence typecheck all clean.

中文说明

两条 /review 发现均已在 fec89f4a31 处理,各自的评论串里都附了回复与突变验证。至于卡住延迟审批的那次红:两个 job 的原因都是 runner,与本 diff 无关。

评审跟进

  • R1-1 —— assertExecutableBin 现在使用 execFileSync('node', ['--check', filePath])。先用真实的守卫函数体复现了该问题:在名为 qwen$(touch …)ry 的目录下,旧的字符串形式既执行了嵌入命令,让构建以误导性的 does not parse 失败;argv 形式两者都不会发生。
  • R1-2 —— bin 的 esbuild 选项抽到 scripts/serve-bridge-bin-build-options.js,由构建脚本与新增的 test/unit/serve-bridge-bin.test.ts 共享。主用例用这份完全相同的选项把 bin 构建到临时目录(23 ms)并钉住产出字节,因此无论守卫发生什么,banner 回归都会让它变红;第二个用例钉住已构建的 dist/ 产物,覆盖 banner 改加在调用点的情形。当守卫失效调用点加了 banner 时,构建仍然 exit 0 并发布出双 hashbang —— 此时正是测试套件抓住它。

关于上一次的红(e177c39170run 33269725917

两处失败是同一个自建 runner 资源饥饿问题,都没有触及本 diff:

  • web-shell E2E Smoke 根本没跨过安装阶段 —— 20:02:25 进入 npm ci,19 分钟后 job 被取消时仍卡在 npm run build 里(Terminate orphan process: pid … (npm ci)… (esbuild))。没有任何 Playwright 用例执行,产物上传也没找到 test-results
  • Test (ubuntu-latest, Node 22.x) 跑了 1 小时 00 分 44 秒,在 job 的 60 分钟上限处被取消。(更正本评论的早先版本:该日志里的 Runner failedpackages/cli/src/utils/relaunch.test.ts 的测试夹具字符串,并非 Actions runner 崩溃。)失败的都是无关的 packages/cli 套件被时钟拖死,而非断言失败 —— clipboardUtils(30s)、update(15s)、workspace-registration-store(16s)、server-default-bridge-wiring(15s ×5)、process-env-guard(40s)。Post Coverage Comment 随后失败,仅仅是因为没有 junit.xml 可解析。

本 diff 只触及 packages/sdk-typescript,而在那次运行中 SDK 自身的套件全程为绿。新的 CI 已在 fec89f4a31 上运行。

新 head 的本地门禁:npm run build exit 0;SDK 套件 38 文件 / 1707 测试全绿;eslint --max-warnings 0prettier --checktsc --noEmit 及 test-fence 类型检查均干净。

@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator Author

CI attempt 1 on fec89f4a31 came back red in three jobs. None of them reached this diff, and one of them carries a clean A/B that says so outright. Attempt 2 is running.

Test (ubuntu-latest) — host contamination on actions-runner-9, not a test regression

It failed in the .github/scripts helper step, 4 of 489 node:test cases, all in web-shell-visuals-publish.test.mjs with the same error:

file:///tmp/visuals-hosting-CaV88E/work/scripts/upload-aliyun-oss-assets.js:2
const { copyFileSync, mkdirSync, writeFileSync } = require('node:fs');
ReferenceError: require is not defined in ES module scope
This file is being treated as an ES module because it has a '.js' file extension
and '/tmp/package.json' contains "type": "module".

The fixture writes a deliberately-CommonJS stub uploader into mkdtempSync(join(tmpdir(), 'visuals-hosting-')). Node resolves module type by walking up to the nearest package.json, so the stub is CJS on a clean host — and ESM on a host where some other job has left a /tmp/package.json with "type": "module". That is the whole failure.

The A/B is decisive, because the helper tests are byte-identical across the two commits (this PR touches only packages/sdk-typescript):

Run Runner Helper tests
33269725917 (e177c39170) actions-runner-16 489 pass / 0 fail
33299052561 (fec89f4a31) actions-runner-9 489 tests / 4 fail

Same code, different host, different result. The stray /tmp/package.json on actions-runner-9 is worth cleaning up, and the fixture is worth hardening — same family as #10214 and #10376 — but both belong in their own change, not bolted onto this one.

Integration Tests (no-AK) — timed out in installation. npm ci ran from 07:23:42 to 07:51:18 — 28 minutes (added 2124 packages in 28m) — and the job hit its 30-minute limit 106 seconds into typecheck:integration. Not one integration test executed.

web-shell E2E Smoke — Playwright specs timing out against a daemon that never came up ([WebServer] Error: connect ECONNREFUSED 127.0.0.1:4170), then canceled. Same pre-existing web-shell timing flake already established on the merge base. Post Coverage Comment failed only because the Test job produced no junit.xml.

What attempt 1 does prove about this PR: npm ci ran the root prepare → full build, so @qwen-code/sdk build executed the refactored scripts/build.js and its assertExecutableBin guard on CI hardware, and completed clean — no Bin … does not parse, no must start with a hashbang line.

中文说明

fec89f4a31 的第 1 次 CI 有三个 job 变红。没有一个触及本 diff,其中一个还带着能直接证明这一点的 A/B。第 2 次尝试正在运行。

Test (ubuntu-latest) —— actions-runner-9 的宿主污染,不是测试回归

失败发生在 .github/scripts helper 步骤,489 个 node:test 用例中有 4 个失败,全在 web-shell-visuals-publish.test.mjs,报错一致:

file:///tmp/visuals-hosting-CaV88E/work/scripts/upload-aliyun-oss-assets.js:2
const { copyFileSync, mkdirSync, writeFileSync } = require('node:fs');
ReferenceError: require is not defined in ES module scope
This file is being treated as an ES module because it has a '.js' file extension
and '/tmp/package.json' contains "type": "module".

该 fixture 会把一个刻意写成 CommonJS 的 stub 上传器写入 mkdtempSync(join(tmpdir(), 'visuals-hosting-'))。Node 通过向上查找最近的 package.json 判定模块类型,因此在干净宿主上这个 stub 是 CJS —— 而在有别的 job 遗留了 "type": "module"/tmp/package.json 的宿主上就变成 ESM。失败的全部原因就是这个。

A/B 是决定性的,因为这些 helper 测试在两个提交间逐字节相同(本 PR 只触及 packages/sdk-typescript):

Run Runner helper 测试
33269725917e177c39170 actions-runner-16 489 pass / 0 fail
33299052561fec89f4a31 actions-runner-9 489 tests / 4 fail

同样的代码,不同的宿主,不同的结果。actions-runner-9 上残留的 /tmp/package.json 值得清理,该 fixture 也值得加固 —— 与 #10214#10376 属同一类问题 —— 但两者都应各自成 PR,而不是塞进这个改动里。

Integration Tests (no-AK) —— 卡在安装阶段超时。 npm ci 从 07:23:42 跑到 07:51:18,28 分钟added 2124 packages in 28m),job 在进入 typecheck:integration 106 秒后撞上 30 分钟上限。没有任何一个集成测试执行。

web-shell E2E Smoke —— Playwright 用例在 daemon 始终未起来的情况下超时([WebServer] Error: connect ECONNREFUSED 127.0.0.1:4170),随后被取消。与已在合并基上确认的既有 web-shell 时序抖动同源。Post Coverage Comment 失败仅仅是因为 Test job 没有产出 junit.xml

第 1 次尝试确实证明了本 PR 的一件事: npm ci 会通过根 prepare 执行完整构建,因此 @qwen-code/sdk build 在 CI 机器上跑过了重构后的 scripts/build.js 及其 assertExecutableBin 守卫,并且干净通过 —— 没有 Bin … does not parse,也没有 must start with a hashbang line

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

Test Plan (not a blocker): test/unit/serve-bridge-bin.test.tsno such file or directory; @qwen-code/sdk@0.1.8no such file or directory.

中文说明

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

Test Plan(非阻断):test/unit/serve-bridge-bin.test.tsno such file or directory; @qwen-code/sdk@0.1.8no such file or directory

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

expect(lines[0]).toBe('#!/usr/bin/env node');
expect(lines[1]?.startsWith('#!')).toBe(false);
expect(() =>
execFileSync('node', ['--check', outfile], { stdio: 'pipe' }),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R2-1: The tmpdir node --check resolves the ESM parse goal only via Node's module-syntax detection — no package.json above os.tmpdir() declares "type": "module" — and that detection is default-enabled only from Node 22.7, while the package declares "engines": {"node": ">=22.0.0"}. A contributor running the SDK unit suite on any Node in that band below 22.7 (22.0–22.6) gets SyntaxError: Cannot use import statement outside a module and the test fails even though the built bin is correct. CI pins latest 22.x (.nvmrc = 22, 22.x in ci.yml), so it never surfaces there.

Witness:

Node v22.6.0, freshly esbuild-built tmp bin (the test's exact options and execFileSync call):
  node --check  ->  SyntaxError: Cannot use import statement outside a module (bin.js:9), exit 1
Same Node, {"type": "module"} package.json written beside the file:  exit 0
Control Node v22.23.2 on the same bare tmpdir:  exit 0

Write a minimal package.json into the temp dir right after mkdtempSync so the module goal is explicit across the whole engines range:

writeFileSync(join(outDir, 'package.json'), '{"type": "module"}\n');

The fix must keep the check valid across the whole declared "engines": {"node": ">=22.0.0"} range (packages/sdk-typescript/package.json), and the outfile must stay named bin.jsbin.qwen-serve-mcp maps to ./dist/daemon-mcp/serve-bridge/bin.js, so do not switch the temp outfile to .mjs. If you apply this, please confirm the mutation: 'emits exactly one hashbang, on line 1, and parses' should still pass under --no-experimental-detect-module with the fixture in place, and removing the fixture while detection is off should red it.

中文说明

R2-1:临时目录里的 node --check 只能依靠 Node 的模块语法检测来确定 ESM 解析目标 —— os.tmpdir() 上层没有任何 package.json 声明 "type": "module" —— 而该检测从 Node 22.7 起才默认开启,而包声明的是 "engines": {"node": ">=22.0.0"}。贡献者在低于 22.7 的 Node(22.0–22.6)上跑 SDK 单测时,会得到 SyntaxError: Cannot use import statement outside a module,测试失败,但构建出的 bin 本身完全正确。CI 固定使用最新的 22.x(.nvmrc = 22,ci.yml 用 22.x),所以那里永远看不到这个问题。

验证证据:在真实的 Node v22.6.0 二进制上执行 —— 用测试完全相同的选项和 execFileSync 调用在裸临时目录里新构建出的 bin,node --check 抛出上述 SyntaxError(bin.js:9),exit 1;在文件旁写入 {"type": "module"} 的 package.json 后:exit 0;对照用 Node v22.23.2 跑同一裸临时目录:exit 0。

修复方式:在 mkdtempSync 之后立即向临时目录写入一个最小的 package.jsonwriteFileSync(join(outDir, 'package.json'), '{"type": "module"}\n')),使模块目标在整个 engines 范围内都是显式确定的。

修复前提:该检查必须在声明的整个 "engines": {"node": ">=22.0.0"} 范围内有效(packages/sdk-typescript/package.json),且输出文件必须仍命名为 bin.js —— bin.qwen-serve-mcp 映射到 ./dist/daemon-mcp/serve-bridge/bin.js,因此不要把临时输出文件改成 .mjs。应用后请做一次突变确认:放入该文件后,即使加 --no-experimental-detect-module'emits exactly one hashbang, on line 1, and parses' 仍应通过;在关闭检测时移除该文件则应使其变红。

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Fixed in 4ebd40bd07 — confirmed, and taken as written: writeFileSync(join(outDir, 'package.json'), '{"type": "module"}\n') right after mkdtempSync, with the outfile still named bin.js so it keeps matching the shipped bin.qwen-serve-mcp mapping.

I reproduced your witness on v22.22.2 by driving the detection toggle directly, and ran the exact mutation you asked for:

ARM 1  patched, detection default                        2 passed
ARM 2  patched, NODE_OPTIONS=--no-experimental-detect-module   2 passed
ARM 3  fixture removed, detection still off              'emits exactly one hashbang, on line 1, and parses' FAILS:
                                                         SyntaxError: Cannot use import statement outside a module
restored                                                 2 passed

ARM 2 is the pin you asked for (the case passes with the fixture even with detection off), ARM 3 is the red without it. One scope note confirming your analysis: the tmpdir case was the only bare-goal site — the dist/ case and the build guard's own node --check both resolve under packages/sdk-typescript/package.json, which declares "type": "module", so neither needed a change. Full SDK suite after the fix and the main merge: 38 files / 1746 tests green.

中文说明

已在 4ebd40bd07 修复 —— 结论确认,按建议原样采纳:在 mkdtempSync 之后立即 writeFileSync(join(outDir, 'package.json'), '{"type": "module"}\n'),输出文件仍命名为 bin.js,与发布的 bin.qwen-serve-mcp 映射保持一致。

我在 v22.22.2 上直接驱动检测开关复现了你的验证证据,并完成了你要求的突变确认:

ARM 1  已修复,检测默认开启                                2 通过
ARM 2  已修复,NODE_OPTIONS=--no-experimental-detect-module   2 通过
ARM 3  移除 fixture,检测保持关闭                          'emits exactly one hashbang, on line 1, and parses' 变红:
                                                          SyntaxError: Cannot use import statement outside a module
还原                                                       2 通过

ARM 2 正是你要求钉住的点(放入 fixture 后即使关闭检测该用例仍通过),ARM 3 是移除后的变红。一个范围性备注,印证你的分析:tmpdir 用例是唯一缺少显式 module goal 的位置 —— dist/ 用例与构建守卫自身的 node --check 都在 packages/sdk-typescript/package.json(声明了 "type": "module")之下解析,无需改动。修复并合并 main 后 SDK 全量套件:38 文件 / 1746 测试全绿。

The bin test's node --check ran against a bare temp dir, where the ESM
parse goal rests on Node's module-syntax detection — default-enabled only
from 22.7, while the package supports >=22.0.0. On Node 22.0-22.6 the
check dies with 'Cannot use import statement outside a module' even
though the built bin is correct. Write {"type": "module"} beside the
bundle so the goal is explicit across the whole engines range; the
outfile stays bin.js to match the shipped bin mapping.

Verified with --no-experimental-detect-module: the case passes with the
fixture and reds without it.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

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

  • Agent 7 probe finding (build.js:234 call-site hunk survives revert) — overlaps the settled R1-2 thread (comment 3886351052); the call-site regression lane is the dist case the test's comments document as the second line of defence
  • Agent 7 probe finding (build.js:255 assertExecutableBin not exercised by any test) — overlaps the settled R1-2 thread (comment 3886351052); guard-independence of the suite is the test's documented design premise

Test Plan (not a blocker): test/unit/serve-bridge-bin.test.tsno such file or directory; @qwen-code/sdk@0.1.8no such file or directory; 1707 tests pass — this review observed 1746, 503, 5297, 94 passed.

Convergence: round 3 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 1 (1 new). Findings keep coming back to the same files: packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts (findings in round 2; 1 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

Test Plan(非阻断):test/unit/serve-bridge-bin.test.tsno such file or directory; @qwen-code/sdk@0.1.8no such file or directory; 1707 tests pass — this review observed 1746, 503, 5297, 94 passed

收敛情况:第 3 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 1 条(其中 1 条首次提出)。发现反复回到同一批文件:packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts(第 2 轮已出过发现,本轮又有 1 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。本轮没有未决的 Critical,因此"合入后把剩余 Suggestion 线程转到后续 issue"是一个可选的结束方式——已合入的 PR 不会继续发散。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment on lines +24 to +30
const shippedBinPath = join(
rootDir,
'dist',
'daemon-mcp',
'serve-bridge',
'bin.js',
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R3-1: shippedBinPath restates the bin.qwen-serve-mcp mapping from package.json, and it.skipIf(!existsSync(shippedBinPath)) cannot tell a diverged path from a clean tree. If someone relocates or renames the bin output, updating bin in package.json and serveBridgeBinPath in scripts/build.js consistently but not this constant, existsSync(shippedBinPath) is false forever and 'ships that same shape in dist/' silently skips from then on — the only suite-level check of the actually shipped bytes is gone with no signal, and a banner later re-introduced at the build.js call site ships an unstartable bin exactly like @qwen-code/sdk@0.1.8 did.

Witness:

drift simulation (bin renamed in package.json + build.js, test constant untouched):
  test/unit/serve-bridge-bin.test.ts (2 tests | 1 skipped)
  Tests  1 passed | 1 skipped (2)    <- dist case silently skipped, suite green
same drift state, path derived from package.json:
  Tests  2 passed (2)
fix applied + dist/ removed (QWEN_SKIP_PREPARE lane):
  Tests  1 passed | 1 skipped (2)    <- skip-don't-fail semantics preserved

Derive the path from the manifest instead of restating it:

Suggested change
const shippedBinPath = join(
rootDir,
'dist',
'daemon-mcp',
'serve-bridge',
'bin.js',
);
const pkg = JSON.parse(readFileSync(join(rootDir, 'package.json'), 'utf8'));
const shippedBinPath = join(rootDir, pkg.bin['qwen-serve-mcp']);

The fix must keep the skip-when-dist/-missing semantics: Dockerfile:30 installs with RUN QWEN_SKIP_PREPARE=1 npm ci (and scripts/prepare.js exits before building), so trees legitimately exist without a built dist/ where this case must skip, not fail. If applied, please confirm the mutation: after deriving the path from package.json, renaming the bin in package.json (with dist/ built) must leave 'ships that same shape in dist/' running, not skipping.

中文说明

R3-1:shippedBinPath 复述了 package.json 里的 bin.qwen-serve-mcp 映射,而 it.skipIf(!existsSync(shippedBinPath)) 无法区分「路径已漂移」与「干净树」。若将来有人移动或重命名 bin 产物,同步更新了 package.jsonbinscripts/build.js 里的 serveBridgeBinPath,却漏掉这个常量,existsSync(shippedBinPath) 将永远为假,'ships that same shape in dist/' 从此静默跳过——对实际发布字节的唯一套件级检查就在没有任何信号的情况下消失了;此后若有人在 build.js 调用点重新加回 banner,就会像 @qwen-code/sdk@0.1.8 一样再次发布无法启动的 bin。

验证证据(探针,临时树):漂移模拟(在 package.json 与 build.js 中重命名 bin,测试常量不动)→ Tests 1 passed | 1 skipped (2),dist 用例被静默跳过、套件全绿;同一漂移状态下改为从 package.json 推导路径 → Tests 2 passed (2);应用修复并删除 dist/QWEN_SKIP_PREPARE 场景)→ Tests 1 passed | 1 skipped (2),「跳过而非失败」的语义得以保留。

修复方式:从 package.json 推导该路径,而不是再复述一遍(见上方 suggestion 代码块)。

修复前提:必须保留 dist/ 缺失时跳过的语义——Dockerfile:30RUN QWEN_SKIP_PREPARE=1 npm ci 安装(scripts/prepare.js 会在构建前退出),确实存在没有构建产物的合法树,该用例在那里必须跳过而非失败。若应用此修复,请做一次突变确认:从 package.json 推导路径之后,重命名 package.json 中的 bin(在已构建 dist/ 的情况下),'ships that same shape in dist/' 必须仍在执行而不是跳过。

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

@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: ✅ 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: 92 passed · 0 failed · 92 total

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

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

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

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

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

Verification report

PR 10485 — fix(sdk): stop emitting a duplicated hashbang in the serve-mcp bin (round 3)

Verdict: merge-ready — 92/92 scripted assertions passed (0 unexpected failures), verified head 2bece7237fff142a1a2d640edc0ee67d299b558a (merge 8debfe2b2f over base tip 2f2e953f). Assertion totals: A/B 19 · mutation matrix 24 · shell-safety 7 · new-test vacuity 9 · census 13 · gates 9 · tarball 11.

中文 — 判定:✅ 通过 · 可合入(agent 判定)
  • 结论:merge-ready,92/92 脚本化断言全部通过。本轮为跟进轮(第 3 轮):相比上一轮(头提交 0d3ee99a),PR 新增了三个实质提交——守卫从 execSync 命令串改为 execFileSync argv 形式、抽出共享构建选项模块并新增钉住产物字节的双用例测试、为 tmpdir 检查显式声明 {"type": "module"} 以覆盖 Node 22.0–22.6。所有旧测量均在新头上重建重跑,未复用旧数字。
  • A/B 结论(“Central claim” 表,01-ab-base-vs-head.png):base(2f2e953)构建 exit 0 却产出双 hashbang 的坏 bin,node <file> 与 shebang 两条启动路径都拿不到任何 MCP 响应(9/9 预期内的红);head 第 1 行 hashbang、第 2 行代码,真实 stdio 握手成功(initialize + tools/list 31 个工具,两种启动方式,退出干净)。
  • 本轮新增表面的验证
    • 守卫反注入(03-guard-shell-safety.png):把真实构建脚本放进目录名含 $(touch …) 的检出路径里跑——现版 execFileSync 构建 exit 0、载荷未执行;按提交描述重建的旧版 execSync(JSON.stringify(…)) 变体则实际执行了载荷文件且以误导性的 “does not parse” 失败(7/7)。
    • 新测试钉住回归(0204):banner 加回共享选项 → 构建 “does not parse” 且测试独立变红;守卫失效 + banner 加在调用点 → 构建 exit 0 放出坏 bin,由 dist/ 用例变红抓住;{"type":"module"} 夹具在 --no-experimental-detect-module(模拟 22.0–22.6)下是承重的——删掉即以 “Cannot use import statement outside a module” 变红,保留则绿(矩阵 24/24 + 夹具 9/9)。
    • 接收侧(06):npm pack 走真实 prepack,tarball 内 bin 755、单 hashbang、解压后握手成功(11/11)。
  • 门槛05):eslint / prettier 干净(均植入违规证明门禁有效)、包 typecheck 脚本 exit 0、SDK 套件 38 文件 / 1746 测试全绿,与 base 的 37 / 1744 相比恰好 +1 文件 / +2 用例 = 本 PR 新增(作者写的 1707 是合入较新 main 之前的分支数字,见 “Corrections”)。
  • Findings:沿用前两轮 1 条 Nice-to-have(守卫只覆盖 serve-bridge bin;普查重测证明其余 bin 全部健康,不阻塞)。另记录两条既有观察(均非本 PR 引入)。
  • 未覆盖:逐提交验证(浅克隆仅 3 个提交可达,7 个提交中 4 个为合并提交,已改为验证聚合 diff);macOS/Windows;npm registry 上已发布的 0.1.8 实测(无网络);initialize/tools/list 之外的工具调用;其余 workspace 套件。

Previous-finding status (follow-up round)

This is a follow-up round. The head moved from 0d3ee99a (round 2, single commit) to 2bece72 (+2 substantive commits, +2 merges of newer main; the merge base moved from 866b7fe9 to 2f2e953). The input closure changed, so every carried measurement was rebuilt and re-run at the new head — nothing was diffed against the old report. The snapshot's baseRefOid (843d991a) has drifted and is not present in the depth-2 clone; the authoritative base is the merge-ref's first parent HEAD^1 = 2f2e953f per the environment contract.

# Previous finding Severity Status at this head
1 assertExecutableBin covers only the serve-bridge bin; the other declared bins are unguarded Nice-to-have stands — the guard is unchanged in this respect; census re-measured fresh at this head (06-census-and-tarball.png): all six buildable bins are healthy (single hashbang + node --check 0, 12/12 cell checks), so siblings remain healthy-but-unguarded. Agree with the prior rounds' non-blocking treatment.
2 (Observation) packages/mobile-mcp bin target not produced by this repo's pipeline Observation stands — census re-recorded lib/index.js absent; its source entry carries its own hashbang, so it does not instantiate this PR's bug class. Recorded, not asserted.

Central claim + A/B

Central claim (unchanged from prior rounds, re-proven at the new head): the built qwen-serve-mcp bin goes from unstartable (banner stacked on the entry hashbang → second hashbang on line 2 → SyntaxError through both launch paths, shipped silently because the base build still exits 0) to a working MCP stdio server, with build-time + test-time guards that make the regression fail loud.

Witness: 01-ab-base-vs-head.png (live run of harness/ab-harness.mjs; raw log logs/ab-run1.log). Both cells rebuilt from source in this round: base in a scratch worktree at HEAD^1 (30.1 s), head in the main tree (31.5 s).

Cell Oracle base 2f2e953 (banner, no guard) head 2bece72 (no banner + guard + shared options + test)
node scripts/build.js exit code 0 — break ships silently (ab-09) 0, guard passes
bin.js lines 1–2 bytes #!/usr/bin/env node twice (ab-02/03) hashbang then var __defProp = … (ab-11/12)
node --check bin.js exit / stderr 1 — SyntaxError: Invalid or unexpected token (ab-04) 0 (ab-13)
node bin.js + MCP initialize responses / exit 0 responses, exit 1, SyntaxError on stderr (ab-05/06) qwen-serve-bridge@1.0.0, protocol 2024-11-05 (ab-14/15)
shebang exec ./bin.js + initialize responses / exit 0 responses, exit 1 (ab-07/08) answers, tools/list = 31 (ab-18)
shutdown on stdin EOF stderr / exit — (dead) "" / 0 in both modes (ab-17/19)

A/B assertions: 19/19 (every base-side red is an encoded expectation, i.e. a pass).

Reviewer Test Plan, per step — all four steps were executable and passed:

  1. On main: two hashbang lines + SyntaxError → base cells ab-02…ab-08 (reproduced at the resolved base tip, not read from the npm evidence).
  2. On branch: line 1 hashbang, line 2 code; real MCP initialize answers → head cells ab-10…ab-19.
  3. Negative-control the guard → matrix C1 (does not parse) and C2 (must start with a hashbang line).
  4. Negative-control the new test → matrix C1-vitest (banner in shared options reds the tmpdir case independently of the guard) and C5 (guard neutralized + call-site banner: build exits 0 with a broken bin, and the dist/ case is what reds).

Secondary claim 1 — the guard is load-bearing, both clauses pinned, including the new option-sharing surface. Witness: 02-mutation-matrix.png (harness/matrix-harness.mjs in scratch worktree tmp/mutate-tree @​ HEAD; raw log logs/matrix-run3.log; builds 25.8–32.1 s each).

Build variant build exit produced bin vitest (new test) interpretation
C0 unmutated head 0 works (31 tools) green, 2 passed, dist case ran control
C1 banner in shared options 1 — Bin … does not parse + SyntaxError broken reds (byte assertion of case 1) guard + test both catch the original bug
C2 entry hashbang stripped from bin.ts 1 — must start with a hashbang line artifact parses fine (node --check 0) the two clauses catch disjoint failure classes
C3 guard call removed 0 works (31 tools) banner removal is the fix; the guard changes no bytes
C4 C1 + C3 (both hunks reverted) 0 — nothing catches it broken (2 hashbangs, node --check fails, 0 responses) reds via dist case combination row: without the guard the regression ships silently; the test still holds
C5 guard neutralized + banner at call site (step 4b) 0 broken (line 2 = hashbang) case 1 green, dist case reds the dist case catches a call-site banner the shared-options case cannot see

Matrix assertions: 24/24, no surviving mutants. Positive controls: C1/C2 are caught mutants, C0 is the unmutated green. (Unscheduled corroboration: an earlier harness sequencing error left the tree with C5's broken dist, and the dist case immediately red'd against it before a clean rebuild — the case bites on exactly the artifact shape it exists to catch.)

Secondary claim 2 — the execFileSync hardening (commit fec89f4a) is real, not cosmetic. Witness: 03-guard-shell-safety.png (harness/injection-harness.mjs; raw log logs/injection-run2.log). The real scripts/build.js was copied into a checkout whose directory name literally contains p$(touch <abs path>)x and built there:

Arm build exit payload file failure message
C7 head as shipped (execFileSync argv form) 0 absent — nothing executed
C6 reconstructed vulnerable variant (execSync command string, JSON.stringify quoting) 1 created$(…) expanded under /bin/sh -c and ran misleading Bin … does not parse

Shell-safety assertions: 7/7. Caveat stated plainly: the depth-2 checkout cannot reach fec89f4a's parent, so C6 is a reconstruction from the commit's own description (execSync + command string + JSON.stringify); the demonstrated behaviour (payload executes inside double quotes, misleading error) is exactly what that description predicts.

Secondary claim 3 — the new test is load-bearing and correct across the engines range (commit 4ebd40bd). Witness: 04-new-test-load-bearing.png (harness/testflag-harness.mjs; raw log logs/testflag-run2.log). The container's node is v22.23.2 (detection default on), so --no-experimental-detect-module simulated the 22.0–22.6 range:

Variant result
F0 unmutated test + flag green, 2 passed, no skip — the {"type": "module"} fixture carries the ESM goal
F1 fixture write removed + flag reds with Cannot use import statement outside a module; exactly one case failed — the dist case stays green because the sdk's own package.json carries "type": "module" (verified)
F2 dist/ absent green overall; dist case skipped, not failed (as the description promises for QWEN_SKIP_PREPARE lanes)

Test-flag assertions: 9/9.

Sibling census + accept side (carried over). Witness: 06-census-and-tarball.png (harness/census-harness.mjs, harness/tarball-harness.mjs; raw logs logs/census-run2.log, logs/tarball-run1.log).

Check result
Declared bins discovered from every package.json outside node_modules 8 entries; 6 buildable asserted healthy (line-1 hashbang, line-2 code, node --check 0) — 12/12; 2 recorded absent (mobile-mcp own-pipeline build; cli/dist/package.json's nested dist/dist/index.js, see Findings)
esbuild banner: option sites (incl. the two --banner:js flags under integrations/) 6 sites, 0 hashbang banners ("use strict" ×2, createRequire shim ×3, import.meta shim) — the PR's "no other build emits a hashbang banner" claim holds
npm pack tarball (prepack = build + bundle:cli) qwen-code-sdk-0.1.8.tgz, bin at -rwxr-xr-x, extracted bin parses and answers initialize + tools/list (31) through node and shebang exec, clean shutdown — 11/11

Corrections

  • Suite count in the PR description. The description says "38 files / 1707 tests pass". At the verified merge head the suite is 38 files / 1746 tests; the base tip runs 37 files / 1744 tests (logs/sdk-suite-run1.log, logs/base-suite-run1.log, scripted comparison logs/gates-rescore.log). The delta is exactly +1 file / +2 tests — the PR's new test file — with zero failures on either arm; 1707 was measured on the branch before it merged newer main. The description's number is stale, not wrong about the PR's contribution. This is a correction to the description, not a request to change code.

Findings

  1. Nice-to-have (carried over from rounds 1–2, stands)assertExecutableBin covers only the serve-bridge bin. The same two-clause check could guard the other bins at their build steps; today they are unguarded but verified healthy by this round's fresh census (12/12). Not blocking: the PR's scope is the one bin that was broken, and no live sibling instance exists.
  2. Observation (pre-existing, not a regression)packages/cli/dist/package.json (a build artifact) declares bin qwen → dist/dist/index.js, a path that does not exist relative to that package.json. The source declaration in packages/cli/package.json (dist/index.js) is healthy and asserted. Recorded by the census for completeness; this PR does not touch the cli package.
  3. Observation (methodology) — the vulnerable C6 arm is a reconstruction (see Secondary claim 2 caveat), and one harness sequencing error (stale C5 dist read by F0) was caught and rebuilt rather than reported; both are labelled here so no cell above is credited with more than it ran.

No new blocking findings this round.

Not covered

  • Per-commit verification. The checkout is depth 2 (merge commit + its two parents; HEAD^2 is grafted, git rev-parse --is-shallow-repository = true). The snapshot lists 7 commits (3 substantive + 4 merges); git rev-list HEAD^1..HEAD^2 returns 1 at the shallow boundary — a mismatch, so per-commit attribution is out of reach and the aggregate HEAD^1..HEAD diff was verified instead. The three substantive claims map 1:1 to the three probes above (A/B ↔ 0d3ee99a's surface, injection ↔ fec89f4a, flag fixture ↔ 4ebd40bd).
  • macOS/Windows execution (same as the author) — the fix is byte-level, the guard parse-level; container is Linux node:22-bookworm, node v22.23.2.
  • The published @qwen-code/sdk@0.1.8 tarball on the npm registry — no network in this environment. Accept side proven by packing the head through the real prepack pipeline.
  • Full MCP tool invocations beyond initialize / tools/list — the claim under test is startability; the handshake proves boot, event loop, and MCP wiring (31 tools listed).
  • Repo-wide suites / typecheck and other workspaces — the PR's own CI covers them; the diff is confined to packages/sdk-typescript. Related repo convention, noted: the new test file is consumed by vitest's esbuild transform only — the package tsconfig.json excludes test/ and the test-fence config covers a different file, so no gate type-checks it (pre-existing convention, shared by every other sdk test).
  • npm-install-time bin wiring — the tarball carries mode 755 and the exec-mode probes run it as installed; npm's own install path was not exercised.
  • The base arm's browser-bundle size warning (221474 > 221184, warning-only) reproduces on both arms — pre-existing, unrelated to this PR, not asserted.

Methodology

Environment: CI node:22-bookworm container (node v22.23.2), merge-ref checkout at depth 2 (HEAD = merge 8debfe2b2f, HEAD^1 = base tip 2f2e953f, HEAD^2 = 2bece72 = snapshot headRefOid; snapshot baseRefOid 843d991a drifted and absent locally). Scratch worktrees tmp/base-tree (base A/B arm) and tmp/mutate-tree (matrix + test mutations, removed after use) reused the root node_modules; from inside the base worktree, import.meta.resolve confirmed esbuild and @modelcontextprotocol/sdk resolve to /__w/qwen-code/qwen-code/node_modules/… on both arms. The sdk devDependencies do carry file: links to @qwen-code/acp-bridge/qwen-code-core, but no build path and no new test imports them — every @qwen-code/ mention in src/ is a comment — so the A/B remains a pure code comparison; the suite gate that does import them ran only on the head tree. Every cell drove real artifacts: real scripts/build.js runs per variant (tsc + dts-bundle-generator + esbuild), real child processes for node <bin> and shebang exec, and a real stdio MCP handshake (harness/mcp-probe.mjs: initialize → notifications/initialized → tools/list → stdin-EOF shutdown) — no stubs anywhere. The injection probe ran the actual build script in a directory named p$(touch <abs>)x created via fs (no shell touches the name unless the code under test invites one); the vulnerable arm replaced exactly the guard line. Raw per-cell logs in logs/, harnesses in harness/, evidence captures in evidence/ (01 A/B live, 02/04/05/06 rendered from their run logs, 03 live). The two G6 count checks initially failed inside gates-harness.mjs due to a harness regex missing vitest's ANSI-decorated summary; the underlying facts were re-established by two direct scripted suite runs and a scripted comparison (logs/gates-rescore.log, 4/4) — the fail count in assertions.json reflects only unexpected outcomes about the PR, so that harness defect contributes zero. Assertion tally: 19 (A/B) + 24 (matrix) + 7 (injection) + 9 (test-flag) + 13 (census) + 9 (gates incl. suite delta) + 11 (tarball) = 92.

Flakiness gate log

rounds=5 files=1 skipped=0
file packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts: (cd packages/sdk-typescript) npx --no-install vitest run ./test/unit/serve-bridge-bin.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts: P (exit 0)
round 2 · packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts: P (exit 0)
round 3 · packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts: P (exit 0)
round 4 · packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts: P (exit 0)
round 5 · packages/sdk-typescript/test/unit/serve-bridge-bin.test.ts: P (exit 0)

Evidence images

01-ab-base-vs-head

02-mutation-matrix

03-guard-shell-safety

04-new-test-load-bearing

05-gates-and-suite-delta

06-census-and-tarball

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

Qwen Code · sandboxed verification

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

Labels

review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

qwen-serve-mcp bin is unstartable: build emits a duplicated hashbang

4 participants