# 预注册：N 格 —— 复核**闸的测试文件**（假绿的第二层：**钉子本身对不对**）

> 落盘时间：2026-08-28 10:0x · lab HEAD 起手 `10c3904`（clean，单 remote `origin`，与 `origin/master` 0/0）
> 🔴 **DS HEAD 起手 `02fc77b6`** —— ⛔ **不是交接单写的 `a786e0d2`**：第 11 次交接**又漂了**（漂 2 commit）。
> 🔴 **且勘察期间【格内又漂一次】`02fc77b6 → 0e04ceb9`** —— 见 §4 锚 A0 两栏，**两次都逐条 diff 过判定面、两次都未命中**。
> 入口：用户在本 session 起手六候选里**挑定候选 5**（⛔ 不是 lab 自己开的格，§8 单向纪律）
> ⚠️ **本轮候选编号 ≠ §28.10 / §28.11 / §28.12 / §28.13 的候选编号**（§18.7 同族，K / L / M 三格均已实证撞过）
> 被验对象：**DS 侧**（`tests/audit-acceptance-gate-coverage-cli.test.ts` 34 条 + `tests/audit-gate-ci-parity-cli.test.ts` 23 条）
> 立格依据：`docs/round2-status.md` §28.13 未覆盖第 3 条逐字「**仍未复核闸的测试文件**⇒ 损失**回归钉正确性面**」
> ⚠️ **编号用 `N1–N5`，⛔ 不用 `M*` / `L*` / `K*` / `J*`** —— 同名会撞面（第 26 条推论二 / 第 27 条推论二同族）

---

## 0. 一句话命题

L 格判出闸的**分母**漏收 7 段（`ACC_RE` 三形态）⇒ 棘轮 S2 是**假绿**。
M 格判出那 13 段兑现**全部由 14 行注释承载**、且 S4 对**散文形态**结构性失明（`[0]` 字面为假）、
段边界判据在 `AGENTS.md#Jira` 上**已经错了**（段内逐字 7 条，闸只收 4 条）。

⇒ 两格判出的**全是闸的判据缺陷**。而这条闸有 **34 条「整脚本回归」测试** ——
它是本仓自称最强形态的钉子（头注释逐字：「⛔ 刻意不 import 该闸的任何符号……这里 spawn 整个脚本」）。

🔴 **命题**：这 34 条钉子，钉住的是**对的行为**，还是**把 L / M 两格判出的错误行为一起钉死了**？

⇒ 若是后者，后果是**方向性的**：DS 将来要修 L / M 判出的缺陷时，**测试会变红** ——
**钉子从「防回归」变成「修复的阻力」**，而红的那条会被读成「你把闸改坏了」。
这是假绿的**第二层**：第一层是闸的判据看不见真缺口（L / M 已判），
第二层是**钉子把第一层固化下来**，让缺口获得「有 34 条测试守着」的背书。

⚠️ **本格价值⛔ 不在推翻这 34 条** —— 判「34 条全对、且对已知缺陷保持中立」同样是结论
（那就把 §28.13 未覆盖第 3 条从**未核**升到**已核**）。
⛔ 真正不可接受的是：**M 格已据「闸有整脚本回归面」把它当作比只测判据函数更强的形态引用过，
而这 34 条至今没有任何人验过它们钉的是什么。**（与 L 格 `83`、M 格 `70` 同型：结论比基数走得远。）

---

## 1. 口径（⛔ 全部跑前写死）

### 1.1 判定面与时点（🔴 每栏写死 sha，⛔ 不许用「现行」）

| 面 | 定义（写死） | 时点 | 起手实测 |
|---|---|---|---|
| **NAIL-A** | `tests/audit-acceptance-gate-coverage-cli.test.ts` | @`02fc77b6` | **589** 行 · blob `abca29d7` · **34** 条用例 / **10** 个 describe |
| **NAIL-B** | `tests/audit-gate-ci-parity-cli.test.ts` | @`02fc77b6` | **472** 行 · blob `b15300fd` · **23** 条用例 / **5** 个 describe |
| **HARNESS** | `tests/lib/gate-fixture-root.ts` | @`02fc77b6` | **219** 行 · `REPO_ROOT = resolve(__dirname,'../..')` ⇒ **跟随导出树** |
| **GATE‴** | `scripts/audit-acceptance-gate-coverage.mjs` | @`02fc77b6` | **418** 行 · blob `ffea0a1a` · `BASELINE_UNCLASSIFIED = 67`（`:129`） |
| **NAIL-C** | `tests/audit-exports-types-contract-cli.test.ts` | @`02fc77b6` | **401** 行 · **27** 条 —— ⚠️ **另一条闸**，⛔ **不并入 N1–N5 读数**，只在 §5 登记 |

🔴 **主裁定时点 = `02fc77b6`**（起手 DS HEAD）。格内已漂到 `0e04ceb9`，
逐条 diff：只改 `docs/internal/STATUS-CHANGELOG.md` 11 行 · 与闸 `SCAN_FILES` 7 份**零交集** ·
`GATE‴` / `NAIL-A` / `NAIL-B` 三个 blob **逐字未变** ⇒ **本格全部读数在 `0e04ceb9` 上同样成立**。
⚠️ **收尾仍必须再重取一次**（第 29 条推论五）。

### 1.2 判定单元（⛔ 处数 ≠ 行数 ≠ 出现次数 ≠ 条目数 ≠ 用例数 ≠ 断言数）

- **1 条用例** = 一个 `it(...)` 调用 ⇒ `NAIL-A` **34**、`NAIL-B` **23**
  🔴 **已按第 29 条独立重数**：宽模式（`it|test` + `.each/.skip/.only/…`）在 `NAIL-A` 上得 **36**，
  差额 **2 处逐处定案 = 2/2 全假阳**（`:578` / `:586` 是 `re.test(…)` **正则方法调用**，非用例）
  ⇒ **34 与 vitest 自报数一致，无真差额**。
- **1 次注入** = 对**导出树里**闸实现的一处定点改写（⛔ 不改 DS，见 §4）
- **1 条被拦的用例** = 注入后由绿转红的用例 ⇒ 必须**点名到 `it` 的标题**，⛔ 不许只报计数
- **敏感 / 不敏感**：注入后 `NAIL-A` 整体 `EXIT` 与红条集合的变化；
  ⛔ 「EXIT 非零」不够 —— 崩溃也是非零（`HARNESS` 判据 2 自己写的），必须核**红在哪条、断言是什么**

### 1.3 五档各自的判据（⛔ 跑前写死）

#### N1 · 用例数分母复核（第 29 条正面对撞）
两份钉子各自的用例数，独立于 vitest 自报数再数一遍，差额逐处定案。
⚠️ **起手已完成 `NAIL-A`**（见 §1.2）；`NAIL-B` 待跑。

#### N2 · 钉子对 **L 格判出的 `ACC_RE` 漏收 7 段**是否敏感
- **注入 ①（放宽）**：把 `ACC_RE` 改宽到收 L 格判出的三种形态（`- **Acceptance**：` / 缩进 `**Acceptance**：` / 中文 `#### 验收标准`）。
- **判据**：跑 `NAIL-A` 34 条 —— 红几条？点名哪条？
- **对照臂（⛔ 必须有，否则恒绿 = 零信息）**：注入 ①′ 把 `ACC_RE` 改成**恒不匹配** ⇒ 若不红则判据本身失效。
- **先证注入生效**：注入后先**单独 spawn 闸**打印 `ACC_RE` 的 `source` + 在一份含三形态的探针文档上的段数，
  ⛔ 不许直接看测试结果（第 29 条推论二：探针必须先证落在目标面上）。

#### N3 · 钉子有没有把 **M 格判出的段边界错误行为**固化（推论三正面对撞）
M 格实测：段边界「撞到顶层散文就停」在 `domain-tvu.md#M17` 上**正确**、在 `AGENTS.md#Jira` 上**错误**（7 条 → 收 4 条），
而 `NAIL-A:169` 那条用例**逐字把「散文行终止该段」钉成正确**（注释还写「⛔ 别删」）。
- **注入 ②**：把段边界改成**不因顶层散文行终止**。
- **判据**：红几条、点名哪条。🔴 **若 `:169` 转红 ⇒ 钉子会拦住对 `#Jira` 那处错误的修复。**
- **⚠️ 两面并报**（推论三硬要求）：同一注入下，钉子在 `#M17` 形态上**该红**（它确实是正确收窄），
  在 `#Jira` 形态上**该绿**。⇒ 判的不是「红/绿对不对」，而是**钉子有没有机制区分这两面**。

#### N4 · 钉子有没有把 **M 格判出的 `ITEM_RE` 散文盲区**固化（推论九正面对撞）
M 格实测：`ITEM_RE` 只认 `^- `，散文形态核查项一律计 0 ⇒ 4 条 `[0]` 自陈**字面为假**；
而 `NAIL-A:195` 那条用例逐字把「散文形态 Acceptance 段（0 条 checklist）」钉成 `unclassified 1`（Σ=0 是预期）。
- **注入 ③**：把 `ITEM_RE` 扩到也认散文形态核查项。
- **判据**：红几条、点名哪条。
- **⚠️ 枚举形态（推论九硬要求）**：本档必须列出**注入后判据认得的全部形态**并逐条给读数，
  ⛔ 「改了一版正则」不算修完。

#### N5 · 钉子**自陈**的「看得见接线」是否为真 + `NAIL-B` 复核
`NAIL-A` 头注释逐字自陈：「只 import 判据函数的测试**结构上看不见接线**（摘掉 `main()` 照样全绿）。
这里 spawn 整个脚本」。`HARNESS` 头注释另有实证（`audit:doc-shape` 摘 `main()` ⇒ 全量 vitest 1993 passed）。
- **注入 ④**：摘掉闸的 `main()` 接线。**预期红** —— 这是**验证自陈**，不是找缺陷。
- **注入 ⑤**：`process.exit(1)` → `exit(0)`。⚠️ DS 自己在 `88443639` 逐字登记 exports-types 的**旧面对这一整档零敏感**；
  本档核 `NAIL-A` 是否同病。
- **注入 ⑥**：入口守卫恒假（`is-cli-entry` 那一档）。
- **`NAIL-B`**：23 条独立数一遍 + 跑通 + 判它守的是哪个面（CI ↔ 本地挂载对位），**⛔ 不与 `NAIL-A` 读数混报**。

---

## 2. 预测（🔴 跑前写死，⛔ 事后不许改；对错都如实登记）

| # | 注入 | 预测 | 若预测错，说明什么 |
|:-:|---|---|---|
| **N2 ①** | `ACC_RE` 放宽收三形态 | **34 全绿**（fixture 里三种形态一个都没有 ⇒ 闸收得多也读不到） | 若红 ⇒ 钉子里有我没读到的形态断言，`ACC_RE` 口径**是被守着的** |
| **N2 ①′** | `ACC_RE` 恒不匹配 | **红**（S1「一个 Acceptance 段都没扫到 ⇒ 枚举器坏了」，`NAIL-A:462`） | 若绿 ⇒ 判据恒绿，本档全部读数作废 |
| **N3 ②** | 段边界不因散文停 | 🔴 **至少 `:169` 那条红**（它逐字钉 Σ=2 vs 旧边界 Σ=4） | 若全绿 ⇒ 那条注释的自陈与实际不符 |
| **N4 ③** | `ITEM_RE` 认散文 | **至少 1 条红**（`:195` acc-prose 钉 `unclassified 1`；`:143` acc-bare 钉 `[2]`） | 若全绿 ⇒ 散文口径**未被钉住**，M 格那处修起来无阻力 |
| **N5 ④** | 摘 `main()` | **大量红** | 若全绿 ⇒ 头注释的核心自陈**为假**，这份钉子并不比 import 判据函数强 |
| **N5 ⑤** | `exit(1)` → `exit(0)` | **大量红**（`expectGateRed` 断言 `status === 1`） | 若全绿 ⇒ 与 exports-types 旧面同病，DS 自己刚登记过那一档 |
| **N5 ⑥** | 入口守卫恒假 | **大量红**（`HARNESS` 已为此专门加 `realpathSync`） | 若全绿 ⇒ fixture 的 realpath 修复没在这条闸上生效 |

🔴 **本格最重的一问先写死**：如果 **N2 ① 全绿** 而 **N3 ② / N4 ③ 有红**，
结论就是 **钉子的敏感面与真缺陷面【方向相反】** ——
对**已知缺口**（`ACC_RE` 漏 7 段）零敏感，对**已知错误行为**（段边界 / 散文盲区）反而钉得很紧。
⇒ 那不是「测试写得差」，是**测试把缺陷面固化成了规范**。

---

## 3. 反自欺条款（⛔ 逐条执行，M 格三条自纠都出在这里）

1. **注入必须先自证生效** —— 每次注入后先单独 spawn 闸打印被改判据的实际行为（`RegExp.source` / 段数 / Σ），
   ⛔ 不许直接读测试结果。（第 29 条推论二；M 格 M4 探针插错面当场被这条抓住）
2. **0 有四种** —— 「红 0 条」必须区分：真零敏感 / 测试没跑到 / 注入没生效 / 命令失败。
   ⚠️ 🔴 **本 session 起手已在 `.vite` 那处撞过第四种**（zsh glob 无匹配 ⇒ `ls` 失败 ⇒ `|| echo` 把**命令失败**印成「不存在」）
   ⇒ ⛔ 本格所有 `|| echo` 兜底必须先核命令自身的退出码。
3. **对照臂** —— 每一注都要有反向臂，⛔ 恒红 / 恒绿 = 零信息。
4. **⛔ 结论性 echo 文案必须由读数生成**，⛔ 不许写死。
5. **逐级放宽定位面**（推论八）—— 凡判「钉子里有没有 X」，必须给：单条用例 / 该 describe / 整份文件 / 两份钉子全文 四栏。
6. **⛔ 不许由「测试全绿」推「闸是对的」** —— 那正是本格要证的东西。

---

## 4. 装置与锚（⛔ 不改 DS 一个字节）

- **导出树**：`git archive 02fc77b6 | tar -x -C <scratchpad>/tree-02fc77b6`（4968 文件）
  + `cp -R` DS 的 `node_modules`（334M，⛔ **不 symlink** —— symlink 会让 vitest 缓存写回 DS）
  🔴 **隔离已实证**：DS 的 `node_modules/.vite` mtime 停在 **2026-08-20 10:36:30**（8 天前），
  导出树自己的是 **2026-08-28 10:01:45** ⇒ 我跑的那次**没有写 DS**。
  且 `HARNESS` 的 `REPO_ROOT = resolve(__dirname,'../..')` ⇒ fixture 全部落在**导出树 + `tmpdir()`**。
- **装置**：`runs/gate-test-nail/inject.sh`（逐注入建独立树、跑、收红条）
- **锚**（⛔ 一个区间一套，换 sha 必另立 —— 第 29 条推论五）：
  | 锚 | 值 @`02fc77b6` |
  |---|---|
  | **A0** | 两次漂均未命中判定面：`GATE‴` blob `ffea0a1a` · `NAIL-A` blob `abca29d7` · `NAIL-B` blob `b15300fd` 在 `a786e0d2` / `02fc77b6` / `0e04ceb9` **三点全同** |
  | **A1** | `NAIL-A` baseline **34 passed / EXIT=0**（导出树实测，`Duration 1.20s`） |
  | **A2** | `GATE‴` 418 行 · `BASELINE_UNCLASSIFIED = 67`（`:129`） |
  | **A3** | 用例数独立重数：窄 34 / 宽 36 / 差额 2 全假阳 |
- ⛔ **不跑** `pnpm build` / `pnpm release` / `metrics/context-cost.mjs`；⛔ 不碰四个 pin；⛔ 不改 `provenance.pinnedSha`
- ⚠️ 本机无 `timeout` / `gtimeout`

---

## 5. ⛔ 本格不做什么（跑前写死，⛔ 收尾照抄进未覆盖节）

1. ⛔ **不判「闸是否真的 enforce 了那条规则」**（M 格未覆盖第 4 条原样保留，要读 11 个闸实现，§8）
2. ⛔ **不碰 `NAIL-C`（exports-types 那 401 行）的读数** —— 它是**另一条闸**，
   本轮漂移刚新增，⚠️ 只在收尾如实登记「候选 5 的面因起手漂移变大了」，⛔ 不混报
3. ⛔ **不代 owner 拍 M-D1…M-D5 / L 格三个决策点 / K1 / K3**
4. ⛔ **不 live 核 Figma**
5. ⛔ **不碰候选 1 / 2 / 3 / 4 / 6**
6. ⛔ **不改 DS**：全部注入在导出树，收尾核 DS `git status` 与 blob 三点全同
