# 处方：「这次的绿不可全信」那一族 WARN，6 条里 4 条没人守

- **执行状态**：✅ **6/6 全部执行完毕**（3 条 2026-09-14 · 3 条 2026-09-15）
  ⇒ **外加订正 3 判出的那条新缺口也已闭合**（引擎那两处，见下方「2026-09-15 收口」）。
  1. 🟢 `audit-rule-load-map` ⇒ DS **`cfbeaf44`**（`tests/audit-rule-load-map-cli.test.ts` 8 条 +
     棘轮 `BASELINE 40→39`）· 读数见 [review §40](../docs/2026-09-09-ds-slim-optimize-review.md)
  2. 🟢 `audit-artifact-routing`（**两条 reason 一次补齐**）⇒ DS **`7dcc65d1`**
     （`tests/audit-artifact-routing-cli.test.ts` 9 条 + 棘轮 `BASELINE 39→38`）·
     读数见 [review §41](../docs/2026-09-09-ds-slim-optimize-review.md)
  3. 🟢 `audit-figma-variables-freshness`（**V4 之外的四条一次补齐**）⇒ DS **`5d429249`**
     （`tests/audit-figma-variables-freshness-cli.test.ts` 10 条 · 棘轮 **不动**）·
     读数见 [review §42](../docs/2026-09-09-ds-slim-optimize-review.md)
     🔴 **⛔ 别把「棘轮没动」读成「这次没效果」** —— 两臂实测该闸 `face` **补前补后都是 `E-fx`**
     （补前的证据是 `tests/figma-variables-pipeline.test.ts:348`，它**只守 V4**）
     ⇒ 棘轮口径是「**有没有**整脚本面」，对「补**已有面的盲区**」这类改善**结构上零敏感**。
     效果的证据在造故障两臂（全量 failed **9 → 15**），⛔ 不在棘轮。

  ✅ **2026-09-15 收口 —— 剩下 3 条 + 订正 3 那条新缺口，一次做完（⛔ 一条一个 commit）**：
  4. 🟢 `audit-mockup-colors`（403 ⇒ C2/C3）⇒ DS **`774608ee`**
     （`tests/audit-mockup-colors-cli.test.ts` 3 条 · 棘轮**不动**）
     🔴 **⛔ 别把「棘轮没动」读成「这次没效果」**（同第 3 条那条纪律）——
     该脚本**不在棘轮的 91 条闸清单里**（它没有自己的 npm key）⇒ 结构上不进分母。
     效果在造故障两臂：注入 ⇒ **3 failed** · 干净臂 ⇒ **3 passed**。
  5. 🟢 `audit-mockup-binding-fidelity`（403 ⇒ B-SEM）⇒ DS **`8b57a4c2`**
     （`tests/audit-mockup-binding-fidelity-cli.test.ts` 3 条 · 棘轮 **BASELINE 37→36**，
     归因四臂实测：两面都在 36 / 只移开本条 37 / 只移开 colors 面 36 / 都移开 37）
  6. 🟢 `export-claude-design-bundle`（构建产物缺失那 4 条）⇒ DS **`7161df26`**
     （`tests/export-claude-design-bundle-cli.test.ts` 2 条 · 棘轮**不动** ——
     实测坐实它**不在闸清单里**，与 §2 那句「它不是闸」一致）
  7. 🟢 **订正 3 判出的新缺口**（引擎 `audit-mockup-conformance.mjs`）⇒ DS **`52022864`**
     （`tests/audit-mockup-conformance-cli.test.ts` 3 条 · 棘轮 **BASELINE 36→35**，
     归因两臂：新面在 35 / 移开 36）

  🔴 **第 7 条【换了判据】才测得到 —— 原 §1 那个判据对它结构上无效**（订正 3 早已登记）：
  引擎的 `console.warn` 计数是 **0**，两处承载物是 `process.stderr.write` 与规则模块返回的
  **结构化 `unverified` 字段**。换判据后实测：**此前两处都零人守**（各自注入 + 全量 ⇒ 3526 passed / 0 failed）。
  ⚠️ 那个 `0` 有**阳性对照**撑着（⛔ 不是「装置坏了」的 0）：fixture 里跑引擎三臂，
  两个量的读数互不相同且**正交** —— 原样 `1/6` · 摘 `stderr.write` **`0/6`** · `unverified` 恒 null **`1/3`**。
  ⇒ **订正 3 末尾那句「它们有没有人守，lab 未答」现已作答：零人守，现已补上。**

  ⚠️ **装置（四条共用，⛔ 零改动被测对象）**：`NODE_OPTIONS=--import <stub>` 覆写
  `globalThis.fetch`。三条 403 的闸 API 基址是写死常量、不可参数化，而 [[INFRA-F138]]
  封死了「为了让 harness 能用去改活闸」⇒ 这是唯一入口。
  ⇒ 共享 harness `runGate` 新增**可选第 4 参 `env`**（merge 进 `gitCleanEnv`，不传时行为
  一字不变、35 份既有用户零影响），⛔ 没有自建第四份 spawn。

  🔴 **「stub 没生效」会造成整组假绿，已内建反制**：stub 若没加载，闸会拿假 token 去打真
  上游 API，而真 API 对无效 token **同样返回 403** ⇒ 那句 WARN 照样打出来。
  ⇒ 每份新面都断言一个**哨兵值**（本文件编出来的 nodeId / 变量名 / `resolvedVariableNames`
  的确定条数），真 API 不可能返回它 ⇒ 一旦绿就同时证明了 stub 接管了 fetch。

  🔴 **顺带实测出一条【新缺陷】，⛔ 只登记不排期**（已进 `docs/frozen-worklist.md` §3）：
  `audit-mockup-colors` 那句 WARN 逐字写「C2/C3 may **under**-report」，
  而 **C2 在 403 下实际是 over-report** —— `!varName` 分支把**合规**的 `:hover` 节点
  报成违例，且闸整体 **exit 1**（⛔ 不是绿档）。两臂实测在案，已如实钉进 B3 用例。
  ⚠️ lab **⛔ 不主张文案该怎么改**，只把两个方向的读数摆出来。

  ~~**其余 3 条通路仍 ⏳ 未执行** —— ⚠️ **lab ⛔ 不再排序**，理由见 §2 顶部的更新块。~~
  〔原状态留痕，⛔ 不删〕
  🔴 **2026-09-14 改判（review §43）**：剩下这 3 条**落在同一个命题里** ——
  补哪条都**不改变任何闸的自动覆盖读数**（前两条 403 的 WARN 在**无自动执行点**的 CLI 路径上，
  两臂实测；第三条整个不是闸）。**⛔ 这不是「不该补」，是排序的前提变了。**
  并由此判出**一条未验的新缺口**：引擎 `audit-mockup-conformance.mjs:450` 那条 ——
  详见 §1 下方的**订正 3**。
  ⚠️ §2 那句「照抄自建 `spawnAt`」**已过期**，见下方 §2 的订正块。

  🔴 **措辞订正（2026-09-14 执行第 2 条时实测，⛔ 留痕不删）**：§1 那张表的「摘了会红吗 = 否」
  ⛔ **不等于「这条 WARN 零覆盖」**。以 `audit-artifact-routing` 为例，
  `tests/artifact-routing.test.ts:52` / `:95` **早就断言了** `status === 'warn'` 这个返回值
  ⇒ **判定逻辑层有覆盖**；本表判出的「否」，指的是**发射层**
  （`console.warn` 那条通路真的把它打出去 + runner 的接线）。
  ⇒ 两者是不同的层，⛔ 别把本表读成「作者没测过这条分支」。
  ⚠️ 这与 §5 撤回的那次**不是同一个错**：那次是把窄口径的 0 读成宽口径的 0（**结论错了**），
  这次判据本身没错（造故障口径可靠），错的是**「零覆盖」这个措辞盖住了两个层**。
- **被测对象**：DS `scripts/` 下有 `console.warn` 通路的 7 条脚本 @ `4be8cb7e`
- **读数出处**：lab [`docs/2026-09-09-ds-slim-optimize-review.md` §39](../docs/2026-09-09-ds-slim-optimize-review.md)
- **前置**：无。本处方的读数由**造故障**取得，⛔ 不依赖 `runGate` 的行为。

## §0 承诺指标（⛔ 改动之前写死，事后不得换）

这条改动承诺让**这一个量**动，⛔ 不承诺别的：

| 指标 | 改前（实测 @ `4be8cb7e`） | 改后必须 |
|---|---|---|
| 造故障「7 条闸全部静默 `console.warn`」⇒ 全量 `vitest run` 的 failed 条数 | **3** | **≥ 4**，且新增那条点名被补的那个闸 |

⛔ **不承诺**：任何闸的 `EXIT` 码（这一族全走 exit 0）· 其它测试的读数 · 耗时 ·
把 6 条缺口一次补完（见 §2 的排序，**⛔ 一条一个 commit**）。

## §1 缺陷：读数与它的取法

**取法（⛔ 这是本处方唯一可靠的那个判据）**：在 `git clone` 树里给 7 条闸各注入一行
`globalThis.console.warn = () => {}`，跑全量 `vitest run`，**红的条数 = 被测试守住的 WARN 通路数**。

- 注入成立的证据：marker 命中 **7/7 文件**。
- 还原：`cp` 回写 + `cmp` 逐字节核 **7/7 一致** + 残留 marker **0**。
- **对照臂**：同树未注入 ⇒ 全量 **0 failed**（基线那条 `demo-renderer-react` 是文件级失败，
  §38.3 已归因为 clone 树缺 `dist`，不产生 failed test）。

**读数**：摘掉 7 条闸的**全部** WARN ⇒ 全量只红 **3 条**。

| 闸 | WARN 通路 | 摘了会红吗 |
|---|---|:---:|
| `audit-mockup-library-binding` | 空分母 `--allow-empty` 放行 | ✅ |
| `audit-mockup-library-binding` | handdrawn 疑似手搓组件 | ✅ |
| `audit-figma-variables-freshness` | V4 手改检测（臂 B） | ✅ |
| `audit-artifact-routing` | 声明解析失败 ⇒ **fail-open** 放行（2 条 reason） | ~~🔴 **否**~~ ⇒ 🟢 **已补**（`7dcc65d1`，两条 reason 一次补齐）|
| `audit-mockup-binding-fidelity` | `/variables/local` 403 ⇒ B-SEM **under-report** | ~~🔴 **否**~~ ⇒ 🟢 **已补**（`8b57a4c2`）⚠️ **主语见下方订正 3** |
| `audit-mockup-colors` | `/variables/local` 403 ⇒ C2/C3 **under-report** | ~~🔴 **否**~~ ⇒ 🟢 **已补**（`774608ee`）⚠️ 主语见订正 3；**且实测 C2 的方向与文案相反**，见上方收口块 |
| `audit-rule-load-map` | 子规则**仅靠 parent 覆盖**（scoped-load 盲区） | ~~🔴 **否**~~ ⇒ 🟢 **已补**（`cfbeaf44`）|
| `audit-figma-variables-freshness` | V4 之外的 warnings（**实测共 4 条**，见下方主语订正） | ~~🔴 **否**~~ ⇒ 🟢 **已补**（`5d429249`，四条一次补齐）|
| `export-claude-design-bundle` | 裸 `console.warn(w)`（⚠️ 「零前缀」措辞已订正，见下） | ~~🔴 **否**~~ ⇒ 🟢 **已补**（`7161df26`，4/6 条通路）|

🔴 **两处措辞订正（2026-09-14 执行第 3 条时实测，⛔ 留痕不删）**：

1. **`figma-variables-freshness` 那一行的主语写窄了。** 原文「V4 之外的 warnings（**ack 覆盖 /
   恢复新鲜**等）」只点名了两条，而实测是**四条**，那个「等」字盖住的两条恰恰包含
   **真仓库当前唯一在打的那条**：
   | # | 触发条件 | 现树在打吗 |
   |---|---|---|
   | 1 | 收据说上次抓取**失败**（`lastFailure` 比 `lastSuccess` 新） | 🔴 **在打**（403 断流）|
   | 2 | 恒等式 `normalized + 具名待映射 + 定案不映射 ≠ 收据 variableCount` | 否 |
   | 3 | 已知 stale 被**完整 ack** 压着（FAIL 降级成 WARN） | 否 |
   | 4 | 已恢复新鲜但旧 ack 还在 | 否 |
   ⇒ **⛔ 写「等」会让下一格按两条去估成本、也会漏掉「现树就在打」这个事实。**
   （`AGENTS` §2.18 推论二同族：主语窄化。）

2. **`export-claude-design-bundle` 的「零前缀」说反了一半。** `:500` 那个**发射语句**确实是裸
   `console.warn(w)`（⛔ 不加前缀），但**六条 warnings 的内容全部以 `⚠ ` 开头**
   （`:351` `:402` `:404` `:416` `:418` `:496`）⇒ **最终字节是带前缀的**。
   真正抓不到它的理由**不是「没有前缀」，是「前缀是 `⚠`（U+26A0 裸，`e2 9a a0`）
   而不是 `⚠️`（带 VS16，`e2 9a a0 ef b8 8f`）」** ——
   §2 末尾那句「任何按 `⚠️` / `Warning:` 前缀写的判据都抓不到它」**结论仍成立，理由要换**。
   ⚠️ 同理 review §39.7 的四种形态表把它归在「零前缀」档：那一档的**主语是发射语句**，
   ⛔ 不是输出字节；判「前缀判据抓不抓得到」要看**后者**。

3. 🔴 **那两条 403 的主语写窄了 —— 它们所在的通路没有自动执行点**（2026-09-14 两臂实测，
   读数见 [review §43](../docs/2026-09-09-ds-slim-optimize-review.md)，⛔ 留痕不删）。
   表里写的是「这条闸的这条 WARN 没人守」，实为「**这条 WARN 所在的那条路只有手动 CLI 单跑才会走**」：
   两条闸**都无自有挂载**（各自头注释的挂载真源块逐字写明），唯一会自动跑它们判据的是
   `audit-mockup-conformance.mjs` 引擎，而引擎只 `import` 几个纯函数 ⇒ `main()` 不执行。
   | 臂（两条闸各独立跑一遍）| 模块加载 | `main()` | 403 那行所在函数 |
   |---|:---:|:---:|:---:|
   | **A 引擎等价路径**（import + 调纯函数）| ✅ 1 | **0** | **0** |
   | **B CLI 路径**（阳性对照）| ✅ 1 | 1 | 1 |
   ⇒ **补它仍守住一条真实通路**（手动单跑是这族闸的正常用法），**但它⛔ 不改变任何闸的自动覆盖读数**
   —— 这一点与 `export-claude-design-bundle`（**整个不是闸**）**落在同一个命题里**，理由不同。
   ⚠️ **⛔ 这不是「不该补」，是排序前必须摆出来的事实。排序是 DS 的事。**
   🔴 **而同一个语义在会自动跑的那条路上另有两个承载物，本表的判据对它们结构上无效**：
   `audit-mockup-conformance.mjs:450` 的 **`process.stderr.write`**（该引擎的 `console.warn` 计数 = **0**）
   与 `scripts/mockup-rules/colors.mjs` 的**结构化 `unverified` 字段**（`count:2` + reason 原文）。
   ⇒ 造故障注入 `globalThis.console.warn` **抓不到这两种形态** ⇒ 要判它们得**先换判据**。
   ⚠️ 它们有没有人守，lab **未答**（只有一个静态下界：`tests/` 里 `resolvedVariableNames` 零命中，
   阳性对照证过判定面非空）—— **判「有没有人守」只认造故障，⛔ 别拿那个 0 当结论。**

🔴 **这一族的语义是同一个：「这次的 exit 0 不可全信」** —— fail-open 放行 / under-report /
扫描盲区。**⛔ 它们不是普通提示，是绿档唯一的免责声明。**
而 `audit-mockup-library-binding` 那条被守住的逐字写着「⛔ 别把这次的 exit 0 读成『绑定合规』」
⇒ **同族里已经有两条证明这类断言是写得出来的**，⛔ 不是「结构上测不了」。

## §2 修法方向（⛔ lab 不替 DS 排完，但给一个起点）

🟢 **本节推荐的两个起点都已消费（2026-09-14）**：`audit-rule-load-map`（`cfbeaf44`）与
`audit-artifact-routing`（`7dcc65d1`）。第三条 `audit-figma-variables-freshness`
（`5d429249`）**由 lab 实测成本后自选**，⛔ 不是按本节的排序拿的。

**剩下 3 条 lab ⛔ 不再排序。** 已实测过的成本读数：

| 条 | fixture 成本（实测） | 结论 |
|---|---|---|
| `figma-variables-freshness` V4 之外 | 6 文件（3 份 `copyFiles` + 3 份 JSON）· raw payload 可由 `FIGMA_NAME_TO_CSS` / `INTENTIONALLY_UNMAPPED` **现读现生成** | 🟢 **已做**（`5d429249`）|
| `mockup-binding-fidelity` / `mockup-colors`（403） | **要先造 API 403 响应** | 🟢 **已做**（`8b57a4c2` / `774608ee`）—— 实测成本**远低于预期**：`NODE_OPTIONS=--import` 一个 stub 就够，**⛔ 不需要 mock server、⛔ 不需要改被测对象**。⚠️ 那条 WARN 仍在无自动执行点的 CLI 路径上（订正 3 未被推翻）|
| `export-claude-design-bundle` | ~~**lab 仍未实测**~~ ⇒ ✅ **已实测（2026-09-15）**：要 **git 仓**（它跑 `git rev-parse --short HEAD`）+ **20 个必需项**（19 文件 + 1 整目录 `docs/internal/affordance-categories`），缺任一个就 `exit 1` / ENOENT 崩 ⇒ **比同族那批闸贵一个数量级**。⚠️ 但其中 **14 个由被测脚本自己 `export` 的 `REFERENCE_DOCS` 动态取**，⛔ 不写死 ⇒ 实际可维护 | 🟢 **已做**（`7161df26`）。⚠️ 6 条 warnings 只覆盖 **4 条**（触发条件同为 `dist*` 缺失）；另两条（`--with-icon-svg` 超上限 · 系统无 `zip`）**未钉、已登记为边界** |

🔴 **2026-09-14 更新（review §43）：剩下 3 条现在落在同一个命题里** ——
补哪一条都**不改变任何闸的自动覆盖读数**（前两条：WARN 所在通路无自动执行点；
第三条：整个不是闸）。⚠️ ⛔ 这不是「三条都不该补」，是**排序的前提变了**。
🔴 **而 lab 判出一条新缺口、未验**：引擎 `audit-mockup-conformance.mjs:450` 的
`process.stderr.write` + 规则模块的结构化 `unverified` —— **那才是唯一会自动跑的路上的免责声明**，
而本处方 §1 的造故障判据对这两种形态**结构上抓不到**。

🔴 **但 `export-claude-design-bundle` 有一条比成本更该先答的**：review §39.10 边界 6 逐字
「**它不是闸**（是导出工具）—— 它列在供给侧表里只因为形态相同（裸 `console.warn`），
⛔ 别把它算进『闸的覆盖率』」。⇒ 补它**不会**改变任何闸的覆盖读数。
⛔ 这不等于「不该补」（它那条「跳过（缺失）」WARN 确实是绿档免责声明），
但**它与另两条不在同一个命题里** —— 排序前要先把这件事摆出来。**排序是 DS 的事。**

⚠️ **另一条给下一格的实测提醒（⛔ 别照抄 `linkDirs`）**：三条已做的闸里，
`artifact-routing` 传 `linkDirs: []`（零同仓依赖）、`variables-freshness` **留默认软链**
（`variable-map.mjs` → `../scripts/lib/is-cli-entry.mjs`）。
抄错方向会 ENOENT 崩，**而崩溃也是非零退出** ⇒ 红得理由不对。**动手前先 grep 那条闸的 import。**

**推荐起点：`audit-rule-load-map`。** 理由是**成本**而非重要性 ——
它的 WARN 只依赖本地规则文件（`子规则仅靠 parent 覆盖`），**不需要 mock 任何网络**，
而 `audit-mockup-binding-fidelity` / `audit-mockup-colors` 那两条要先造一个 403 响应。

- **照抄已有形态**：~~`tests/audit-mockup-library-binding.test.ts:395-402` 是本仓**已经做对**的样板
  —— 自建 `spawnAt`、断言 `run.status === 0` + `run.stderr` **点名**那条 WARN 的两句原文。~~

  🔴 **订正（2026-09-14 当日执行时实测，⛔ 留痕不删）**：「**自建** `spawnAt`」这半**已过期**。
  那份样板自建 `spawnAt` 的理由逐字写在它自己的头注释里 —— `runGate` 底下的 `execFileSync`
  **在成功分支不返回 stderr**。而 §38.4 已把 `runGate` 换成 `spawnSync`（两条路径都真捕获）
  ⇒ **共享 harness `tests/lib/gate-fixture-root.ts` 现在就能覆盖这一族**，
  而它存在的理由逐字是「不抽，第 2 条到第 N 条每条都要重付一遍建 harness 的成本」。
  ⇒ **本次执行走的是共享 harness**（`createGateFixture` + `runGate`），⛔ 没有自建第三份 spawn。
  ⚠️ 要照抄的仍是那份样板的**断言形态**（点名 WARN 原文），⛔ 不是它的 spawn 方式。

  ⚠️ **另一条同族的过期**：处方原文说这条闸「WARN 只依赖本地规则文件」⇒ 读起来像「随便造个
  fixture 就能测」。实测它 `REPO = resolve(__dirname, '..')` + `FILES` **硬编码**两份文档路径
  ⇒ **不可参数化**，只能靠「把闸拷进 fixture root」让 `__dirname` 跟着走 ——
  这正好是共享 harness 干的事。⇒ **结论没变（成本确实最低），但理由里少了这一环。**
- ⚠️ **断言必须点名文案**，⛔ 别写 `expect(stderr).not.toBe('')` ——
  实测存在一个假阳源：fixture 非 git 仓时，闸内 `execSync git` 的 stderr 会透传
  `fatal: not a git repository`，那会让「非空」这类断言恒真（§39.4）。
- ⚠️ **⛔ 一条一个 commit**。六条缺口的触发条件互不相同（本地文件 / API 403 / ack 状态），
  合成一个 commit 会让造故障臂分不清是哪条在守。

**排序之外的一条**：`export-claude-design-bundle.mjs:500` 是裸 `console.warn(w)`、**零前缀**
⇒ 任何按 `⚠️` / `Warning:` 前缀写的判据都结构上抓不到它（§39.7 的四种形态表）。
⛔ 这条要不要统一前缀是**另一个决定**，不在本处方射程。

## §3 验收标准（⛔ 落地前必须造故障，`AGENTS` §3.8）

⛔ **跑一遍绿不算验证。** 必须给**两个臂**的读数，缺一不算：

| 臂 | 做法 | 期望 |
|---|---|---|
| **对照臂** | 什么都不改，跑新测试 | **绿**，且 `stderr` 里**确实**有那条 WARN（⛔ 不是恒真通过）|
| **故障臂** | 只给被补的那个闸注入 `console.warn = () => {}` | **新用例当场红**，且**只红它** |

🔴 **装置纪律（本轮逐条踩过，抄过来）**：

- 复现树用 `git clone` + checkout，⛔ **不用 `git archive`**（导出树无 `.git` ⇒ 读 git 史的判据
  静默变阴 ⇒ **假绿**，§38.1 的账）。
- 造故障**先证故障态成立**（marker 计数），跑完 `cp` 还原 + `cmp` 逐字节核 + 查残留 marker = 0。
  ⛔ 不用 `git checkout --`。
- zsh 下 `for g in $VAR` **不分词**（bash 才分）⇒ 批量注入要用显式列表，
  且**必须用 marker 计数验注入真的发生了**（本轮靠它拦住一次空注入）。
- zsh 下 `$sha:path` 会被解析成 `:s` 替换修饰符 ⇒ 写 `${sha}:path`（`AGENTS` 第 28 条推论一）。
- 闸单跑读 `$?`、⛔ 不带管道；取管道退出码用 `${pipestatus[1]}`。

## §4 边界（⛔ 是边界，不是 TODO）

- **本处方的判据只抓 must-hit 那一侧** —— 「摘掉 WARN 会不会红」。
  若某测试断言的是「WARN **不**出现」（负向对照），摘掉它反而不红 ⇒ **本判据看不见那类覆盖**。
  ⛔ 这是如实登记的边界。
- **供给侧只扫了 `scripts/`** 的 `console.warn` / `process.stderr.write`。
  `console.error` 有 **87 个文件**（红档主导）**未逐条分档** ⇒ 若某闸在绿档用 `console.error`
  打警告，本处方的表会漏它。⛔ 未排除，是未查。
- **`figma-sync/` 等目录未扫。**
- **环境名**：`git clone` 树 @`4be8cb7e` · 无 `dist/` · `node_modules` symlink 到 DS 工作树 ·
  macOS · vitest 1.6.1。⛔ 别把读数搬到 CI。

## §5 ~~原甲案：补 `audit-mockup-library-binding` 的空分母 WARN 断言~~ 🔴 **已撤回**

🔴 **撤回理由（2026-09-14 同日，⛔ 留痕不删）**：本处方初稿断言那条 WARN「零覆盖」，
依据是 `runGate` 探针读到它绿档 stderr 非空 = 0（22 次调用 / 8 次绿档）。
**那是把窄口径的 0 读成了宽口径的 0** ——
`tests/audit-mockup-library-binding.test.ts` 的头注释**逐字**写着它为什么不走 `runGate`：

> `runGate` 底下是 `execFileSync`，它在**成功**分支不返回 stderr…
> 本闸的 WARN 通路与「静默不跑」这两档**恰好都是 exit 0 且证据在 stderr** ⇒ 必须 `spawnSync`。

而 `:395-402` 逐字断言了那条 WARN 的两句原文。⇒ **那条缺口不存在，作者早就守住了。**
⇒ 详细归因见 §39.8。
