# 处方 — 设计走查 Acceptance 的**闸覆盖缺口**：规则写了 15 条，闸只接住 5 条

- **执行状态**：✅ **已重取（2026-09-15，DS `7161df26`，判定面 `scripts/audit-*.mjs` = 81 道）**
  - 🟢 **已回改的一处（⛔ 不是待做）**：§3.1a 那条候选解（`--config` 扩 `controlPatterns` 如 `^Item/`）**已被 DS live 实测证伪并就地回改**（本文件 `:135-144`，带划线 + 「⛔ 别再走」）。
  - ✅ **那张逐条对位表已逐条重取** —— 15 条里**只有第 15 条改判**（(a) ⇒ **(e)**）。
    **新计数 `n_a=4 · n_b=8 · n_c=0 · n_e=3 · n_total=15`**（原 `n_a=5 · n_e=2`）。
    逐条依据（每条带闸源码行号 + 逐字）见 [`reports/2026-09-15-l4-designqa-pairing-recheck.md`](../reports/2026-09-15-l4-designqa-pairing-recheck.md)；
    量具 `metrics/acceptance-item-gate-recheck.mjs`（6 条控制全绿）· 候选面落盘
    `subjects/tvu-ds/inventory/acceptance-item-gate-recheck-7161df26.json`。
  - ⚠️ **第 4 行未重取（射程外）**：owner **2026-09-14 终裁**「rows 家族维持「默认不开」，28 条存量偏差不逐条判，`CANONICAL-F104` 的 backlog entry 已整条删档」（真源 = `audit-mockup-geometry-consistency.mjs:137`，归因 `0f50fcf3`）⇒ 沿用 K 格的 **(e)** 判读，⛔ 别再把它当待办重新提。
  - 🔴 **重取撞出的判定口径（⛔ 别再踩）**：闸头注释那行 `// covers-acceptance: <段 id> [N]` 的粒度是**段**、⛔ 不是**条目**，且 `[N]` 是**变更探测的锚、不是覆盖度声明** —— 三道闸（`geometry-consistency:16` / `binding-fidelity:20-21` / `mockup-overlap:13`）各自逐字写了「⛔ 别读成『这 N 项都有闸』」。**本表 8 条 (b) 里有 5 条所在的段是【被自陈覆盖的】** ⇒ 只看自陈会把它们读成「已覆盖」。

- 日期：2026-08-27 · 出处：[`reports/2026-08-27-round2-designqa-gap.md`](../reports/2026-08-27-round2-designqa-gap.md)
- 目标 sha：**`8183a1c6`**（活源；DS 侧执行时按当时 HEAD 重核行号）
- 执行方：**DS 侧 session 在真源执行。lab 只出处方（`§8` 只读边界），⛔ 未改 DS 任何文件。**
- 入口：用户 2026-08-27 逐字提问「表格的行之间还放了间距，设计的时候不知道怎么做？
  理论上应该自动设计走查了，但是也没发现，**类似这样的审查缺口，现在堵上了吗？**」

---

## 0. 一句话

**⛔ 不是「规则真源缺失」，是「规则写了、闸没跟上」。**
几何/尺寸/间距类 Acceptance **15 条**里，**5 条有闸、9 条只能靠人走查、1 条闸的判定面窄于规则**；
**「无据可依」的 0 条**。
其中最该先补的一条，与已上闸的三条**写在同一句话里** ——
`domain-tvu.md:214` 那条 Acceptance 列了 **4 个**核查项，
`audit-mockup-geometry-consistency.mjs` 精确实现了**前 3 个**，第 ④ 个「**行高与分隔线间距**」零覆盖。

> ### 🟢 0.1 执行状态（K 格回改 `lab:N61`，2026-08-27，读数时点 DS HEAD `60d644a0`）—— **⛔ 标题与上面这段已过期**
>
> 原文留痕不删（§2.11）。**逐条现取值**：
>
> | 上文的话 | 现状 |
> |---|---|
> | 标题「闸只接住 **5** 条」 | 🔴 **已过期 ⇒ 6 条有闸**（④ 的 `--family rows` 已 ship，见 §4.2） |
> | §0「5 条有闸 / 9 条靠人 / 1 条判定面窄」 | 🔴 **改判 `n_a = 5 · n_b = 8 · n_c = 0 · n_e = 2`** —— ④ 从 **(b)** 迁入 **(e)**（有闸，但判定面窄于规则；⛔ 不是 (a)，理由见 §4.3） |
> | §0「第 ④ 个…**零覆盖**」 | 🔴 **已过期** —— 现由 R1/R2/R3 覆盖，⚠️ **但覆盖的是「宽读法」那一半**，「分隔线自身的间距」仍无 probe 量（§4.3） |
> | `:4` 目标 sha `8183a1c6` | ⚠️ 已漂 **5 步**以上；K 格所有读数改锚 **`60d644a0`**，⛔ 引本处方行号前先核 sha |
>
> 🔴 **本表的 `n_*` 于 2026-09-15 又被重取改判一次**（`n_a 5⇒4` · `n_e 2⇒3`，第 15 条 (a)⇒(e)）——
> 真源看**头栏「执行状态」**与 §2 计数段，⛔ 别引本表这一行。
>
> ⚠️ **⛔ 别把「6 条有闸」读成「缺口小了一档」** —— 本处方的 15 条是**几何族**；
> DS 那道对位闸的全量分母是 **118 段 Acceptance**，其中 **83 段（70.3%）至今 `unclassified`**（§4.2）。
> **两个面不可互推**（第 27 条：基数面 ≠ 缺口面）。

---

## 1. 🔴 先纠正提问里的一个前提（lab 实测）

| 提问里的判断 | 实测 | 依据 |
|---|---|---|
| 「设计的时候不知道怎么做」= **规则缺失** | 🔴 **不成立** | 规则**写了**，且有具体取值 —— `mockup-conventions.md:2519-2520` 逐字「Table row（dense / **行高 36px**）」「Table row（comfortable / **行高 ≥ 56px**）」；`domain-tvu.md:214` 逐字把「**行高与分隔线间距**」列进几何一致性核查项 |
| 「理论上应该自动设计走查了」 | ⚠️ **一半** | 走查**规则**有（105 条 checklist / ~~54 个~~ 🔴 **59 个** Acceptance 段，K 格订正见 §5.3），走查**闸**只接住其中一部分 |
| 「但是也没发现」 | ✅ **成立，且成因可定位** | 该维度**没有任何一道闸在量** —— 68 道闸里 `height` 的比较仅 1 处，且是 `typeof b.height === 'number'` 的类型检查 |

⇒ **真正的病是「规则与闸之间没有对位登记」** —— 没有任何机制回答「这条 Acceptance 有没有闸在管」。
⇒ ⚠️ **取值分层要注意**：做法与核查项类别在 DS 真源，**具体像素取值在仓外**
（`domain-tvu.md:207` 逐字「已搬至 `TVU Pack/docs/specs/lcd-canonical-spec.md`」）。
补闸时**判据类别进 DS、阈值走 `--config`**，与 `geometry-consistency` 现有做法一致
（该脚本逐字「Thresholds, classifiers and per-probe baselines are ALL configurable」）。

---

## 2. 逐条对位表（几何 / 尺寸 / 间距类 **15 条**）

**口径**：`grep -nE "^- \[ \]"` 取 `mockup-conventions.md` + `domain-tvu.md` 的 checklist 条目，
按几何/尺寸/间距措辞筛出 15 条，逐条对 68 道 `scripts/audit-*.mjs` 找判据。
⚠️ **⛔ 不声称穷尽** —— 这 15 条是 **105 条 checklist 的子集**，只覆盖几何/尺寸/间距一族。

| # | Acceptance 条目（逐字节选） | 闸 | 类 |
|---|---|---|:-:|
| 1 | `domain-tvu:214` ① **同类控件是否同宽** | `geometry-consistency` **G1** | **(a)** |
| 2 | `domain-tvu:214` ② **同一控件在各状态帧之间是否同宽** | 同上 **G2** | **(a)** |
| 3 | `domain-tvu:214` ③ **动作按钮右缘是否对齐控件右缘** | 同上 **G3** | **(a)** |
| **4** | `domain-tvu:214` ④ **行高与分隔线间距** | 🔴 **无** → 🟢 **`geometry-consistency --family rows` R1/R2/R3**（K 格回改） | **(b)** → ⚠️ **(e)** |
| 5 | `domain-tvu:216` 按钮宽度按文字 hug + 统一 padding | 🔴 **无**（2 处关键词命中经验证**全假阳**：`huge size` / 「ZH hugs its EN」） | **(b)** |
| 6 | `mockup:794` PRD 卡宽 == UX Delivery 卡宽 == User Journey 卡宽 | 🔴 **无**（0 命中） | **(b)** |
| 7 | `mockup:830` `EN→其 ZH` < `对→对` < `段→段` 三档可视递增 | `bilingual-spacing` | ⚠️ **(e)** |
| 8 | `mockup:834` 不靠分隔线 / 换色 / 加粗制造分组（仅靠间距） | 🔴 **无**（`file-local-fidelity` 判分隔线**数量**，⛔ 不判**做法**） | **(b)** |
| 9 | `mockup:1279` 容器尺寸变更后跑一次兄弟求交 | `mockup-overlap`（checklist 自己点名） | **(a)** |
| 10–14 | `mockup:1278/1280/1281/1282/1283` 容器尺寸变更后的另 5 条（贴实测尺寸 · 列「谁按它坐标画的」· 贴 `间距 baseline→now` · 每次改动后都量 · 超 canonical 写授权来源） | 🔴 **无**（全属 handoff 记录类，无机检） | **(b)** ×5 |
| 15 | `mockup:3155` 交付前 probe 四清单（style 绑定率 / **间距绑定 + scale 合规** / …） | `binding-fidelity` **B-SCALE** + **B-COVERAGE** | ~~**(a)**~~ ⇒ 🔴 **(e)**（2026-09-15 重取改判）|

**另两条同族但不在几何筛内，一并登记**：
`mockup:1600` 卡内施工记录 / 等高不变量 · `mockup:2559` 行高 / maxLines 决策有文档化依据
—— **两条均 0 命中，属 (b)**。

**计数**：`n_a = 5` · `n_b = 9` · `n_c = **0**` · `n_e = 1` · `n_total = 15`
🔴 **K 格回改（`60d644a0`）**：第 4 行 ④ 已上闸 ⇒ **`n_a = 5` · `n_b = 8` · `n_c = 0` · `n_e = 2` · `n_total = 15`**
（⛔ 全档并排，第 26 条推论三；⛔ 不许只报变动那一栏）。**④ 归 (e) 不归 (a) 的理由见 §4.3。**

🔴 **2026-09-15 逐条重取（DS `7161df26` · 判定面 `scripts/audit-*.mjs` = 81 道 · 原文留痕不删）**：
**15 条里只有第 15 条改判**（(a) ⇒ (e)）⇒ **`n_a = 4` · `n_b = 8` · `n_c = 0` · `n_e = 3` · `n_total = 15`**
（⛔ 全档并排）。改判依据 = `audit-mockup-binding-fidelity.mjs:21` **逐字自认**
「§M52 那 2 条里「字段 parity 表 / 反馈类 inventory / 强调预算」**本闸都不管**，照样计入」
⇒ 有闸（B-SCALE `:179` / B-COVERAGE `:204` 覆盖四清单**前两项**）、**判定面窄于规则** = **(e)**。
逐条依据（每条带闸源码行号 + 逐字）见
[`reports/2026-09-15-l4-designqa-pairing-recheck.md`](../reports/2026-09-15-l4-designqa-pairing-recheck.md)。
⚠️ **第 4 行未重取** —— owner 2026-09-14 终裁 rows 默认不开（见头栏），沿用 K 格的 (e)。

### 2.1 分类定义（跑前写死）

| 类 | 规则真源 | 自动闸 | 含义 |
|---|:-:|:-:|---|
| **(a)** | 有 | 有 | 已覆盖 |
| **(b)** | 有 | **无** | 🔴 **只能靠人走查** ← 本轮 9 条落这里 |
| **(c)** | **无** | 无 | 无据可依 ← **本轮 0 条** |
| **(e)** | 有 | 有但**判定面窄于规则** | ← 本轮 1 条 |

---

## 3. 🔴 最该先补的一条：`domain-tvu:214` ④「行高与分隔线间距」

> 🟢 **执行状态（K 格回改 `lab:N61`，@`60d644a0`）：本节这条**已 ship** ——
> `--family rows`（R1/R2/R3）已落地，本节整节的「该不该补 / 怎么补」⛔ **别再当待办读**。
> ⚠️ **但覆盖的是「宽读法」那一半**：「分隔线**自身**的间距」仍无 probe 量 ⇒ 该条归 **(e)** 不归 **(a)**，
> 判据逐字证据见 **§4.3**。⛔ 本节 §3.1a 的证伪结论不受影响，原样有效。

**为什么是它**（三条客观依据，⛔ lab 不裁优先级，只给依据）：

1. **它与已上闸的三条写在同一句话里** —— 同一条 Acceptance 的 4 个子项，闸实现 3 个。
   ⇒ 这不是「还没想到」，是**实现时漏了一项而没有任何机制发现**。
2. **DS 自己已登记为 `CANONICAL-F104`**，判据清单逐字：
   > ① 同一设置页各行 `height` 必一致 ② 各行右侧控件列右缘一致
   > ③ 展开标记是 VECTOR 不是 Unicode 字符 ④ 分隔线厚度与色值一致
   同 entry「现状核实」栏逐字：**「脚本里 `--family` / `family` 零命中 ⇒ 这一族确实还没动工。」**
3. **`geometry-consistency` 自陈的存在理由，正是同型盲区的水平版**：
   > 26 consecutive walkthrough rounds passed and I1–I4 were green every round,
   > while the SAME control had two different widths across five state frames
   ⇒ **26 轮人工走查全绿而水平不一致没被发现** ⇒ 垂直方向今天处在完全相同的位置。

### 3.1 ⚠️ 必须原样带走的前置风险（`CANONICAL-F104` entry 逐字）

> **前置**：需先确认「行」的结构特征可稳定识别 —— `§M-DISCIPLINE.SCOPE` 硬约束 5 ③ 点名过这类假设
> （「每一行都是一个独立的行 frame」不成立时按容器特征过滤会**整类漏掉**）。

⇒ **第一步 ⛔ 不是写闸，是对真实 Figma 文件核一次「行」到底长什么样。**
⚠️ 同 entry 另一条 —— **🔴 措辞订正（2026-08-27，`AGENTS.md` 第 23 条推论五）**：
本行原写「另一条**已实测**：`DEFAULT_CONFIG.controlPatterns`（`:54-61`）」，
实为**转引自 DS 自己的 backlog entry**，**lab ⛔ 未自取过那个行号**
⇒ 改为「转引 + 现取 + 标 sha」三件套：

- **转引自**：DS `docs/internal/backlog.md:633` **@`8183a1c6`**（`CANONICAL-F104` entry），原文称 `:54-61`。
  ⚠️ **该出处已不在 DS 现 HEAD 上**：`@1cc95824` 的 `backlog.md` 里 `54-61` **零命中**
  （DS 已重写该 entry，见下方 §3.1a）⇒ **转引出处本身也必须标 sha。**
- **lab 现取**（本格自取，⛔ 不转引 §28.6）：`DEFAULT_CONFIG.controlPatterns` =
  **`:68-75` @`8183a1c6`**（键行 `:68`，`^select box` 在 `:69`，`^WebUI/Form/Input` 在 `:74`）·
  **`:97-104` @`8a341f46` 与 @`1cc95824`**（键行 `:97`，六条正则 `:98-103`）
  ⇒ **同一个数组、三个 sha、两个不同值 ⇒ 引行号不标 sha 等于没引。**
- **lab 亲验的那一半**：六条正则逐字 = `^select box` / `^input box` / `^textarea` / `^InputNumber` /
  `^Drop down List` / `^WebUI/Form/Input`（@`1cc95824` 现取）。
- ⛔ **lab 未亲验的那一半**：「无一匹配 LCD 的 file-local 命名」—— 需 live Figma 读 LCD 文件的图层名，
  **lab 够不到** ⇒ 此结论**仍属转引**，⛔ 不当已验事实用。

### 🔴 3.1a 本节原结论**已被 DS live 实测证伪** —— ⛔ 别再走（2026-08-27 回改）

**原文留痕**（按 `AGENTS.md` §2.11：被推翻的框架要留痕，否则下轮会照旧措辞再引一次）：

> ~~⇒ **先试 `--config` 扩 `controlPatterns`（如 `^Item/`）实测一次，再谈新判据。**~~

**DS 侧证伪逐字**（`docs/internal/backlog.md:622` @`1cc95824`，live 节点 `0054ib0nLmt27bC3QlGDl7` `9402:59`）：

> 🔴 **本条原写的候选解 `--config` 扩 `controlPatterns`（如 `^Item/`）已 live 实测证伪，⛔ 别再走**：
> 扩了确实从 0 控件变成扫出 **18 个**，但 G1/G2 报的 **2/2 全是假阳** —— `Item/active`/`Item/normal`
> 是**行内部**的水平 Mode pills（`1 s`/`2 s`/`Continuous`），**不是行**；而它们按文字 hug 本来就该不等宽…
> ⇒ 假阳的方向正好与规则相反。**行必须按结构识别，不能按名字** —— 同一份文件里的行有三种命名
> （`row · Pattern` / `Frame 1992 · Receiver` / `Frame 1999 · 720p50`），**任何名字正则都看不全**。

⇒ **改后的结论**：⛔ **不要**走「扩 `controlPatterns`」这条；**行必须按结构识别**
（与 §3.1 那条前置风险 `§M-DISCIPLINE.SCOPE` 硬约束 5 ③ **同向加强** —— 它警告的正是
「按容器/名字特征过滤会整类漏掉」）。

⚠️ **lab 的边界**：`0 → 18 control` 与 `2/2 全假阳` 这两个**读数** ⛔ lab 不可亲验（需 live Figma token）；
lab 可亲验的是**规则依据**（`domain-tvu.md:216` 逐字「不为『看起来一样宽』写死宽度或改字体」）
⇒ **「假阳方向与规则相反」成立**。两句话不可互相冒充。

⚠️ **本条为什么迟到**：`docs/round2-status.md:2074-2077`（§28.6 ②）**早已逐字记下这条证伪**，
但当时**只写进了 status，⛔ 没回改本处方正文** —— 而本处方才是 DS 的执行入口。
⇒ **`lab:N56` 推论一那条口径（判出对方已裁 ⇒ 当场回改处方正文）在 §28.6 未执行，本格补上。**

### 3.2 可验收判据长什么样（形态建议，⛔ 不替 DS 选实现）

沿用 `geometry-consistency` 现有的 probe + 可配置 baseline 形态，新增 `--family rows`：

| probe | 不变量 | fail-closed 控制 |
|---|---|---|
| `R1 row-height-uniform` | 同一设置页内，同类行 frame 的 `absoluteBoundingBox.height` 必一致 | 扫出 **0 个行对象 ⇒ 红**，⛔ 不是绿（`lab:N48`：分母塌不许静默降级） |
| `R2 row-gap-uniform` | 相邻行之间的**垂直间隙**必一致（= `next.y − (cur.y + cur.height)`） | 同上 |
| `R3 divider-consistency` | 分隔线**厚度与色值**一致（F104 判据 ④） | 同上 |

⚠️ **`R1`/`R2` 必须分开** —— 「各行等高」与「行间距一致」是**两个独立不变量**：
行等高但间距不等、间距等而行不等高，都会各自破坏节奏。
**用户报的正是 `R2` 那一态（「行之间还放了间距」），⛔ 用 `R1` 判它会漏。**

⚠️ **阈值与期望值属项目资料**（`§M-DISCIPLINE.SOURCE` 三问②）⇒ 走 `--config` / `BASELINE_R*`，
**⛔ 不写死进 DS 真源**，与 `geometry-consistency` 现有做法一致。

---

## 4. 结构性的那一条：**没有任何机制回答「这条 Acceptance 有没有闸在管」**

本处方这份对位表是**手工**做出来的（lab 逐条 grep 68 道闸）。DS 侧现有两道相关闸，**都不管这件事**：

| 闸 | 它管什么 | 为什么不覆盖 |
|---|---|---|
| `audit-rule-inventory.mjs` | 规则**清单**是否对活源 stale（逐字「5 处各自枚举一套清单、内容 4 种、全部对活源 stale，一致漏掉 11 个真实 section」） | 治「规则存在但清单漏了」，**⛔ 不治「规则存在但没闸」** |
| `audit-rule-load-map.mjs` | 每条 rule heading 是否进了 §🤖 AI 读取指引 路由表 | 治「AI 读不读得到」，**⛔ 不治「有没有闸在拦」** |
| `audit-hard-rule-compliance.mjs` | 把 memory 里的 AI 行为硬规则编码成 grep pattern | 逐字「scoped to memory-only rules **NOT already covered by existing audits**」⇒ 它**维护了一份「已覆盖」清单**，但入口是 memory 规则，**⛔ 不是 Acceptance checklist** |

⇒ **同族证据**：DS 自己 commit `bd53474d` subject 逐字「**「一条闸」不是判性质的单位** —— F139 的绿不是全空，是 3/4 空」。
⚠️ **那个「3/4」与本处方的「4 条实现 3 条」数值撞车是巧合**（F139 讲的是一道闸内 4 条判据里 3 条**分母恒空**）
—— **同族的是 pattern，⛔ 不是数**：两者都是「**闸绿 ≠ 该管的都管了**」。

**⇒ owner 决策点（⛔ lab 不裁）**：要不要立一条「Acceptance ↔ 闸」的对位登记，让「这条规则没闸」变成可机检的状态？
可选形态两种，各有代价：
- **(i) 在 Acceptance 条目上加机器可读标记**（如 `- [ ] {gate:geometry-consistency#G1}` / `{gate:none}`）
  ⇒ 精确，但要改 105 条 checklist，且**新增一处会漂的镜像面**（正是 `audit-rule-inventory` 在治的病）。
- **(ii) 闸侧自陈覆盖了哪条 Acceptance**（在闸头注释里声明，沿用 `INFRA-F126` 挂载真源纪律）
  ⇒ 不新增镜像面、与现有纪律同形，但**只能发现「闸说自己管什么」，发现不了「没有闸的那些条」**。
⚠️ **两种都不能单独回答本处方的问题** —— (i) 能，(ii) 不能。这个代价差**是决策的关键**，交 owner。

> ### 🟢 4.1 2026-08-27 执行状态回改（I 格，`lab:N59`）—— **这个决策点 DS 侧已落地，⛔ 别再读成「待 owner 拍」**
>
> **上面 `:172` 那句「⇒ owner 决策点（⛔ lab 不裁）」写于本处方交付时，⛔ 现已过期。** 原文留痕不删（§2.11）。
>
> **DS 侧现取读数（⛔ 不是转引 `docs/round2-status.md`；全部标 sha）**：
>
> | 事实 | 现取值 |
> |---|---|
> | 引入 commit | **`bf0df7d5`**，2026-08-27 **13:45:20 +0800**，subject 逐字「`feat(gate): 「Acceptance ↔ 闸」对位登记上闸 + rows 存量可判清单（INFRA-F142 / CANONICAL-F104）`」 |
> | 新闸 | `scripts/audit-acceptance-gate-coverage.mjs` **存在**，**391 行** @`f15c8500` |
> | 落地形态 | **本节形态 (ii)**（闸侧自陈 `covers-acceptance:` 头注释）+ 一道**新闸机械核**那些自陈 |
> | 🔴 **存量声明面** | `covers-acceptance:` 在 `f15c8500` 全 `scripts/` 上仅命中 **2 个文件**：新闸自己 4 处（模式串/文档）+ `audit-mockup-geometry-consistency.mjs` **1 处** ⇒ **真正带声明的被审闸目前 = 1 道** |
> | 已迭代 | `bf0df7d5` 之后已再走 **3 个 commit** 到 `f15c8500`，含 `ae07769d` 逐字「`fix(gate): acceptance 对位闸的三处判据粒度 —— S4 改 Σ · 段边界收窄 · 豁免加文件级`」（脚本 +89 行 / CLI 测试 +170 行） |
> | 语义变过一次 | `audit-mockup-geometry-consistency.mjs` 头注释的 `covers-acceptance: …#M17 [N]` 里 **`N` 由 4 → 7**，且逐字加了「⛔ 别把 `[7]` 读成『这 7 项本闸全覆盖』—— N 是**变更探测的锚**，不是覆盖度声明」 |
>
> ⛔ **本次⛔ 未复核的（⇒ 上面只是「已落地」，⛔ 不是「已解决」）**：
> 1. ⛔ **⛔ 未查是不是 owner 亲裁** —— `bf0df7d5` 是 DS session 的 commit，「owner 拍过」目前**无独立读数**。
> 2. ⛔ **⛔ 未复核形态 (ii) 那半个缺口补上了没有** —— 本节 `:177` 逐字判过 (ii)「**发现不了「没有闸的那些条」**」。
>    新闸有没有从别的入口补上这一半（例如反向枚举 Acceptance 段），**本次零复核**。
> 3. ⛔ **⛔ 未取那条「④ 现由 R1/R2/R3 全部覆盖」类自称的独立读数**（该措辞在 `f15c8500` 上已被 DS 自己改写）。
> ⇒ 这三件是**下一格的活**（用户尚未点，`§8` 单向纪律 ⇒ ⛔ lab 不自己开）。
> 🔴 **↑ 这一句 2026-08-27 已过期（K 格已把三件全跑完）** —— 原文留痕不删（§2.11），结论见 §4.2。

> ### 🟢 4.2 2026-08-27 K 格复核结果（`lab:N61`）—— **三件全有读数：一件不可判 · 两件仍有实质缺口**
>
> 读数时点 **DS HEAD = `60d644a0`**（⚠️ **⛔ 不是** `f15c8500`；两者之间 DS 又走了 4 个 commit，
> 其中 `9f8fd5a2` 直接改了本节讨论的那道闸 ⇒ **照旧 sha 取数会整条判错**）。
> 装置 `runs/acceptance-gate-recheck/run.mjs` · 报告 [`reports/2026-08-27-round2-acceptance-gate-recheck.md`](../reports/2026-08-27-round2-acceptance-gate-recheck.md) ·
> 交叉验证锚 **7/7** 全对上（含复现 §4.1 `:191` 那条「被审闸 = 1 道」）。
>
> | 未复核项 | 落档 | 结论 |
> |---|:-:|---|
> | ① owner 亲裁 | 🔴 **不可判** | 四通道**全部非零**、通道③甚至有 owner **反问**的往返痕迹（`tracker.md:438` 逐字「owner 当日拍定「按 #1 形态改」+ 问「能不能自动判定」」），**但四条证据全部由被验方书写** ⇒ 判「亲裁」与判「自称亲裁」读数**完全相同**。⚠️ ⛔ 这不是造假指控 —— 可判的是**结构**：**DS 仓没有任何机制能区分二者**，与本节治的病同型。⇒ **唯一权威读数在 owner 本人处**（⛔ lab 不代答） |
> | ② 形态 (ii) 半缺口 | ⚠️ **部分补上** | 🟢 **机制上闭合**：新闸分母来自**规则真源**逐段枚举（⛔ 不是 `scripts/` 自陈），没有闸的段落进 `unclassified` 默认态 + 棘轮 ⇒ `:177` 那半个缺口**不再存在**。🔴 **但存量上 70.3% 仍未答**，见下 |
> | ③「④ 全部覆盖」自称 | 🔴 **过强** | 见 §4.3 |
>
> #### 🔴 ②的存量读数（lab 侧独立复算，⛔ 全档，第 26 条推论三）
>
> | 时点 | 扫描面 | Acceptance 段 | gated | 豁免 | **unclassified** | BASELINE |
> |---|:-:|:-:|:-:|:-:|:-:|:-:|
> | @`f15c8500` | 3 份 | **84** | 1 | 0 | **83（98.8%）** | 83 |
> | @`60d644a0` | 7 份 | **118** | 5 | 30 | **83（70.3%）** | 83 |
>
> 🔴 **⛔ 别把 98.8% → 70.3% 读成「减了」**：`unclassified` **绝对数 83 → 83，一段没减**，
> 百分比下降**全部来自分母变大**（+34 段扩面，同批 4 gated + 30 豁免）。
> 🔴 **棘轮余量 = 0**（83 = BASELINE 83）⇒ 再新增一段就红（好事），
> ⚠️ **但棘轮只保证「不再增」，⛔ 无任何机制逼它减到 0** —— 83 段可以永远停在 83。
>
> 🔴 **↑ 上表两个数已被 L 格（`lab:N62`）实测推翻方向，⛔ 别再当上界读**：闸的**枚举器本身漏了 7 段**
> （`ACC_RE` 不收 `- **Acceptance**：` / 缩进 `**Acceptance**：` / 中文 `#### 验收标准` 三种形态），
> 这 7 段全部无自陈、不在豁免表 ⇒ **语义口径下分母 118 → 125、`unclassified` 83 → 90 > BASELINE 83
> ⇒ 棘轮 S2 本该红（超 7 段），实际绿。** 详见 §4.4。
> ⚠️ **文件级豁免静默盖住 17 段**，且其正确性**结构上不可机检**（闸自己 `:32-34` 已逐字登记此代价）。
> **83 段全部集中在原 3 份**：`mockup-conventions` **59** + `design-process` **19** + `domain-tvu` **5**
> （与 DS backlog entry 逐字「只剩原 3 份里那批段待分类」独立对上）。
>
> ⚠️ **本节 `:178` 那句「两种都不能单独回答本处方的问题 —— (i) 能，(ii) 不能」结论对、但穷举不全**：
> DS 实际走的是**第三种形态** —— **(i) 的效果用 (ii) 的成本拿到**（真源侧零改动，反向枚举放在闸里）。
> 原文留痕不删。

> ### 🔴 4.3 K 格新判出：「④ 由 R1/R2/R3 全部覆盖」这句自称**过强**（⛔ 缺陷不是「覆盖错了」）
>
> §M17 第 2 条那 4 项，逐条对**实现**（⛔ 不对措辞）：①→G1 `same-component-width` 🟢 精确 ·
> ②→G2 `cross-frame-same-name` 🟢 精确 · ③→G3 `action-right-edge-align` 🟢 精确 ·
> **④「行高与分隔线间距」→ R1+R2+R3 🔴 过强**。
>
> 🔴 **决定性证据在行栅格构造 `audit-mockup-geometry-consistency.mjs:453-454`@`60d644a0`**：
> 逐字 `// Dividers sit BETWEEN rows — they are R3's subject, not rows.` +
> `c.absoluteBoundingBox.height > cfg.rows.dividerMaxThickness` ⇒ **分隔线被显式排除出 `rows`**；
> 而 `:478` 的 gap = `boxes[i].y − (boxes[i−1].y + boxes[i−1].height)` = **跨过分隔线的行底→行顶总距离**。
> ⇒ **分隔线在那段空隙里偏上偏下、上下留白是否对称、两条分隔线隔多远 —— R2 全看不见**；
> **R3 只量 `thickness` 与 `colors`，⛔ 结构里没有任何位置/间距字段**。
>
> ⇒ 「行高与分隔线间距」有两种读法，而 **lab ⛔ 不裁规则内容**（§8）：
> **逐字读法**（= 分隔线自身的间距）⇒ 三个 probe 都不量 ⇒ 自称不成立；
> **宽读法**（= 有分隔线的行栅格的间距节奏）⇒ R2 覆盖 ⇒ 自称成立。
>
> 🔴 **可判的那一条**：闸头注释 `:15` 与 `.changeset/acceptance-coverage-claim-semantics.md:9`
> 把这一项断言成「**全部覆盖**」，而**这个歧义在 DS 侧零处登记** —— 同一段注释里对 `[N]` 的语义
> 反复设防（逐字「⛔ 别把 `[7]` 读成『这 7 项都有闸』」），却对「④ 到底指什么」直接给了确定答案。
> **⇒ owner 决策点（⛔ lab 不裁）**：要么把 ④ 的语义在真源侧写死，要么在闸侧登记「按宽读法覆盖」。
>
> ✅ **对照臂**（第 25 条）：同一判据在同段 4 项上跑 = **①②③ 精确 · ④ 过强** ⇒ **3 绿 1 红，⛔ 非恒红非恒绿**。
>
> 📌 **为什么这条迟到**：`docs/round2-status.md:2293`（§28.8 顺带登记）当天就记了「DS 侧已落地某个形态」并自标「⛔ 本格未复核，只记事实」，
> 而**本处方 `:172` 没跟着改** ⇒ DS 若从处方入口读，会以为这事还没定、可能**重开一次已经做完两轮的决策**。

> ### 🔴 4.4 L 格复核**闸自己的判据**（`lab:N62`，2026-08-27）—— 三类实质缺陷，其中一类**推翻了 §4.2 的方向**
>
> 读数时点 **DS HEAD = `60d644a0`**（与 §4.2 同一时点 ⇒ 两节可直接比）。
> 装置 [`runs/gate-residual/l3-criteria.mjs`](../runs/gate-residual/l3-criteria.mjs) + [`runs/gate-residual/l1-l4.mjs`](../runs/gate-residual/l1-l4.mjs)，
> 报告 [`reports/2026-08-27-round2-gate-residual.md`](../reports/2026-08-27-round2-gate-residual.md)。
> ⛔ **未跑 DS 的 CLI**：import 闸的纯函数 + 注入 `git archive` 只读 tree。
> 🟢 起手锚：K 格装置复跑，三态 `5/30/83` + 5 锚 + 逐份分布**逐位复现 §4.2** ⇒ 判据可用于产新读数。
>
> #### 🔴 (1) `ACC_RE` 漏收 7 段 ⇒ 棘轮本该红
>
> 穷尽扫 7 份 `SCAN_FILES` 全部含 `Acceptance｜验收` 的行、按形态分桶、**fence 感知**排掉代码块、逐处回读定案：
>
> | 形态 | 处数 | 定案 |
> |---|:-:|---|
> | `- **Acceptance**：…`（列表项） | 5 | **4 真漏** + 1 假阳（`:1608` 是卡**段名枚举**） |
> | `**Acceptance**：…`（缩进） | 2 | **2 真漏** |
> | `#### 验收标准`（中文标题） | 1 | **1 真漏** |
> | 表格行 / 散文提及 / 代码块内 | 33 | 全假阳（`design-process.md:687` 在 ``` 内 ⇒ **闸不收是对的**） |
>
> **7 处真漏**（全在 `mockup-conventions.md`）：`:693` · `:917` · `:1247` · `:1256` · `:2730` · `:3079` · `:3107`
> 🟢 **反向也核过**：闸在 fence 内**多收 = 0 段** ⇒ `^` 锚定挡住了代码块假命中，这一面闸是对的。
>
> ⇒ **分母 118 → 125 · `unclassified` 83 → 90 > BASELINE 83 ⇒ S2 本该红（超 7 段）。**
> ⚠️ ⛔ **这不是「闸错了」的断言** —— 收哪些形态是闸作者定的口径（§8：lab 不裁规则内容）。
> **可断言的是：这 7 种形态被排除这件事，闸里零处登记** —— 与 §4.3 判的病**同型**
> （闸对 `[N]` 的语义反复设防，却对「段长什么样」直接给了确定答案）。
>
> #### 🔴 (2) `id` 的 `~N` 位置相关 —— 不写 `[N]` 则完全静默
>
> `id = <file>#<slug>~<第几个>`，序号按**文档内出现顺序**编。注入实证：往同一 slug 辖区加 1 个新 Acceptance 段
> （= 「给某条规则再加一条验收」这个最常见的动作）⇒ **8/14 段 id 位移 · 4/5 条自陈改指向另一段**。
>
> | 支 | 闸的红灯 | 含义 |
> |:-:|:-:|---|
> | A · 自陈带 `[N]`（现状） | S4 红 **3** 条 | 兜住 **3/4** —— `~8` 那条 Σ 恰好 `3⇒3` **静默通过** |
> | B · 自陈**不写** `[N]` | **总红灯 0** | 🔴 **完全静默** |
>
> 🔴 闸 `:44` 逐字「⚠️ 可选：不写 `[N]` 就不核（不强制，避免把没准备好的闸逼进假声明）」——
> **这个「不强制」同时也把 (2) 的唯一兜底关掉了**：`S3c dangling` 只检「id 不存在」，
> **检不出「id 仍在、但指向了另一段」** ⇒ 该形态**结构上无判据覆盖**。
> ✅ 对照臂：A 红 / B 绿 ⇒ 非恒红非恒绿。
>
> #### 🔴 (3) 段中间的散文让闸**少收 17 条** checklist
>
> 边界实现是「**列表已开始**、撞顶层散文 ⇒ break」。checklist 中间夹一行散文时，后半截全被挡在外面：
> **6 段 · 共 17 条**（gated 1 段 5 条 · 豁免 1 段 3 条 · unclassified 4 段 9 条）。
>
> | 段 | 闸收 | 漏 | 定案 |
> |---|:-:|:-:|---|
> | `domain-tvu.md#M17` | 4 | 5 | 🟢 **正确收窄** —— 闸 `:68-73` 逐字登记：那 5 条是「LCD surface 注记（**做法层**）」 |
> | `AGENTS.md#Jira` | 4 | 3 | 🔴 **确凿错误漏收** —— 段内逐字 **7 条 `- [ ]`**（`:801-804` + `:807-809`），中间 `:806` 一行实证散文截断 |
> | 另 4 段（`#M23.12` `#M23.14` `#M-INTEGRITY` `#Acceptance~4`） | — | 9 | ⛔ **lab 不裁**（需判「漏的是核查项还是做法层注记」= 规则内容，§8） |
>
> 🔴 **`AGENTS.md#Jira` 这例⛔ 不需要 lab 做任何语义裁定**：DS **自己**的豁免 `reason` 逐字写
> 「§Jira 评论的**七条**」，而闸读出 **4 条** ⇒ **DS 的两处书写互相矛盾**。
> 🔴 **同一判据在 `#M17` 上正确、在 `#Jira` 上错误，而闸没有任何机制区分二者** —— 又一次与本节治的病同型。
>
> ⚠️ **顺带：闸头注释的影响面读数已过期。** `:72-73` 逐字「全扫描面实测只 **5/84 段**受影响、共收窄 **14 条**」
> 是**扩面前**（84 段）的数；@`60d644a0`（118 段）实测 **6 段 · 17 条**。
> 扩面 commit `9f8fd5a2` 改了 `SCAN_FILES` 却没回改这两个数（多出来的正是新扩进来的 `AGENTS.md#Jira`）。
>
> #### 🟢 (4) 三个面复核后**无缺陷**（⛔ 全档，非恒红）
>
> `ITEM_RE` 只认 `- `：6 处候选**全在 fence 内**（闸不收是对的）· 自陈**只读前 60 行**：全仓 106 个 `.mjs`
> 自陈最大行号 **46**、余量 **14 行** · `collectCovers` **不递归**：子目录 34 个 `.mjs`，带自陈的 **0 个**
> （⚠️ **将来型**：把闸拆进子目录即静默失效）。⇒ **8 个面里 4 红 4 绿，⛔ 非恒红非恒绿。**
>
> #### 🔴 (5) 那 83 段 `unclassified` **⛔ 不是均质的「未答」**
>
> 判据先证鉴别力：**P**（段内点名闸）在 gated 5 段命中 **60.0%** vs unclassified **13.3%** 🟢；
> **Q**（疑似无仓内被测物）在豁免 30 段命中 **46.7%** vs gated **20.0%** 🟢。
>
> | 档 | 段数 | 含义 |
> |:-:|:-:|---|
> | **a** | **11**（13.3%） | 真源**自己点名了闸** ⇒ 按闸 `:96-97` 自立的分类判据（「规则文本自己点名了闸 ⇒ `gated`」），本该 `gated` |
> | **b** | 35（42.2%） | 疑似无仓内被测物 ⇒ 本该走**豁免** ⚠️ **只报候选，⛔ 未定案** |
> | **c** | 37（44.6%） | 两信号皆不命中 ⇒ **真·未分类残余** |
>
> **a 档 11 段逐段回读定案**：
> - **a1 = 4 段整段级点名 ⇒ 登记漏报**：`#C5:431`（「机检见 D16 verifier」）·
>   `#M-COLOR:475` 与 `#M-INTEGRITY~2:1293`（**「共用 Acceptance」型，整段就是讲那道闸怎么跑**）·
>   `#M-DISCIPLINE.SYNC:3111`（标题行自陈 `Conformance report:`）
> - **a2 = 7 段段内单条点名 ⇒ 部分已有闸**：`#M23.14` · `#M23.18.1` · `#M-INTEGRITY` ·
>   `#M32.1` · `#M32.2` · `#Acceptance~21` · `design-process.md#Acceptance`
>
> ⚠️ **三态里没有「部分覆盖」这一档** —— 这是 a2 那 7 段无处安放的**结构原因**（⛔ lab 不裁该不该加档）。
>
> #### 🟢 (6) 豁免表 14 条 entry **全部成立**（⛔ 先订正单位：是 14 条 entry、不是「30 条」）
>
> `30` 是**被豁免的段数** = 1 条文件级 × 17 段 + 13 条段级 × 1 段。
> **文件级那条**（占全部豁免 **56.7%**，单点失效面最大）：lab 独立机检 17 段全文找反例 ⇒
> **唯一命中 `#Acceptance~4:397`（`audit-style`）**，而这**正是 DS 自己 `reason` 里逐字登记的唯一 borderline**。
> ⇒ lab 这条读数是**从规则原文机检出来的、⛔ 不依赖 DS 任何声明** ⇒ **真正的独立佐证**
> （⛔ 与「非零但同源」性质不同）⇒ 该 reason 的「**逐段读过全文**」声明**得到独立支持**。
> **段级 13 条**：reason 186–387 字、逐条对应段内核查项、**0 条**只写「难测」；
> 判据对造假 reason 敏感（`"这份文件很难测"` ⇒ 判不成立）⇒ **非恒绿**。
>
> #### ⇒ owner 决策点（⛔ lab 不裁）
>
> 1. `ACC_RE` 要不要收那 3 种形态？（收 ⇒ 棘轮当场红 7 段，需同批分类掉，与 `9f8fd5a2` 的做法同形）
> 2. `[N]` 要不要从「可选」改「必填」？（那是 (2) 唯一的兜底；不改则 id 错配无判据覆盖）
> 3. 段边界撞到中间散文时该收还是该停？（`#M17` 要停、`#Jira` 要收 —— 需要一个能区分二者的判据）
>
> #### 🔴 (7) 收尾重取：以上读数时点是 @`60d644a0`；DS 已漂到 `ce3fd7e7`，四条逐条复核过
>
> 本节 (1)–(6) 全部取自 @`60d644a0`。lab 收尾重取时 DS 已走到 **`ce3fd7e7`**
> （逐字「按 owner『都按推荐执行』落三件 —— **再判 13 段 gated（83→70）**」）。
> 新区间用**逐字取自该 commit subject** 的四个锚复核：`gated` +13 🟢 · `unclassified` 70 🟢 ·
> BASELINE 70 🟢 · 段数仍 118 🟢 ⇒ 读数可用。**结论逐条如下（⛔ 无空档）**：
>
> | 本节条目 | 在 `ce3fd7e7` 上 | 说明 |
> |---|:-:|---|
> | **(1) `ACC_RE` 漏 7 段** | 🔴 **仍成立，且数值同向** | `ACC_RE` 逐字未改、7 处原行仍在 7/7 ⇒ 闸口径 **70**（BASELINE 70，绿）· **语义口径 77 > 70 ⇒ 仍超 7 段**。🔴 **分类掉 13 段 + BASELINE 收到 70 都没动这条** —— 那 7 段既不在分子也不在分母 ⇒ **「超 7」是结构性差额，⛔ 不是时点噪声** |
> | **(2) `id` 位置相关** | 🔴 **实害面扩大 3.3 倍** | 自陈 6 → **20 条**、被审闸 4 → **12 道**；且新增自陈里 **4 条写 `[0]`**（散文段），`[0]` 同样兜不住改指向 |
> | **(3) 少收 17 条** | ⚠️ **升级** | `#M23.14` 与 `#M-INTEGRITY` 现已 **gated 且带 `[5]`/`[6]`** ⇒ 从「只影响 unclassified 计数」变成**直接进 S4 的 Σ 判据** |
> | **(5) a 档 11 段** | 🟢 **11/11 被验证** | 你们新判的 13 段 gated **完整包含** lab 独立判出的那 11 段（lab 的 commit 当时尚未做 ⇒ 两个独立过程一致）。🔴 **但 lab 的判据有假阴：13 段里只判出 11 段（召回 84.6%），漏了 `#Acceptance~9:1993` 与 `#M52:3153`** ⇒ **a 档应读作「至少 11 段」** |
> | **(6) 豁免 14 条** | 🟢 **不受影响** | 豁免表未改 |
>
> 🟢 **一条正面读数**：新 BASELINE 注释逐字「每次真的分类掉一批，就把这个数收到现取值，
> 否则那批兑现量没被锁住：别人把自陈删回去，闸照样绿」⇒ **§4.2 判的「棘轮只止增、无机制逼它减」
> 那半个缺口被补上了一部分：现在【兑现即锁定】**。⛔ 但仍无机制逼它继续减，**余量依旧 = 0**。

> ### 🔴 4.5 M 格复核**那 13 段兑现的自陈质量**（`lab:N63`，2026-08-27）—— 棘轮再超 1 段，与 §4.4 可加
>
> 读数时点 **DS HEAD = `1c108de8`**（`ce3fd7e7` 之后的 wrap-up commit；`git diff --stat` 全仓只有 4 个文件，
> 与 `SCAN_FILES` 7 份**零交集**、`scripts/*.mjs` 零改动、`ACC_RE`/`BASELINE` 逐字未改 ⇒ **判定面等同 `ce3fd7e7`**）。
> 🟢 起手锚 **8 个**，逐字取自你们自己的 `STATUS-CHANGELOG.md` 与 `ce3fd7e7` subject
> （扫描面 7 · 段 118 · 自陈 20 · 豁免 14 · gated 18 · nmc 30 · unclassified 70 = BASELINE 70 · 新增 gated 13/移出 0）⇒ **全绿，读数可用**。
> ⛔ 本节**未跑你们的 CLI**、**未写你们的 tree**（注入全在内存里改文本喂给闸的枚举器）。
>
> **🔴 先说本节的起点**：`git diff --name-only 60d644a0 ce3fd7e7` 改了 17 个文件，
> 落在 `SCAN_FILES` 7 份**规则真源**上的是 **0 个**。⇒ 那 13 段兑现，**规则原文一个字节没改**，
> **全部由新写的 14 行 `covers-acceptance` 注释承载**。除了「注释是这么写的」，闸没有任何独立证据。
>
> | # | 复核面 | 结论 | 一句话 |
> |:-:|---|:-:|---|
> | **(a)** | 13 段的 Σ 有没有低报 | 🟢 **无一处低报** | 用比 `ITEM_RE` 更宽的四种口径独立重数：缩进子项**零差额** · 表格行唯一 4 处**全假阳** · 段边界 3 段共 13 条差额**逐条回读后 13/13 全是假阳**（`M23.14:848-850` 属同 heading 下的 **(B) 子块**、`M-INTEGRITY:1287/1290/1291` 是 V4-2333 实证叙事、`M17` 5 条是 L 格已定案的做法层注记）⇒ **`[5]`/`[6]` 等都是对的** |
> | **(b)** | 4 条 `[0]` | 🔴 **字面为假** | 3 段**全部含散文形态的核查项**：`#C5` 1 条（且**逐字点名了闸**）· `#Acceptance~9` fence 里逐字 3 行 trace + 1 条 `grep` probe · `#M-DISCIPLINE.SYNC` **一整段串了 8+ 条**。⇒ `[0]` 不是「没有核查项」，是「**没写成 `- ` 列表**」 |
> | **(c)** | S4 对形态的灵敏度 | 🔴 **结构性失明** | **两臂注入**（探针落位已打印）：往这 3 段插 1 条**列表**项 ⇒ S4 **3/3 红**；插 1 条**散文**核查项 ⇒ S4 **3/3 不红**。对照臂（`Σ=0` 但未 gated 的 `#M23.18`）⇒ 不红 ✅ 判据非恒绿。🔴 **这是你们那条复盘「判据只对一种书写形态灵敏」的第三次复发** —— `ce3fd7e7` 把 S4 从 `max` 改成 `Σ`，修的是「`·` 挤一行 vs 一项一行」，**没碰「列表 vs 散文」这一层** |
> | **(d)** | 两端声明一致性（你们自己写死的判据 ①②） | 🔴 **1 段只有一端** | 13 段：🟢 **10** 段内/本节即点名 · 🟠 **2** 需拉伸（`#M52` 父节 lvl3 31 行，温和；`#M23.18.1` 要拉到 **lvl2 整章 1082 行**）· 🔴 **1** 段四面全零 = **`#Acceptance~9:1993`** |
> | **(e)** | `[N]` 锚的强度 | 🔴 **相差 51 倍且零登记** | 全 118 段 Σ 分布：`Σ=3` 占 **55 段（46.6%）**、`Σ=8` 占 **2 段（0.9%）**。⇒ 改指向后碰撞率：`[3]` **46.2%**（**20 条自陈里 5 条用它**）↔ `[8]` **0.9%**。S4 只报「对上/对不上」，**不报这个锚有多弱** |
> | **(f)** | 段边界盲区的**全档** | 🟠 **将来型** | 18 段 gated：**11** 段列表直通下个 heading（无盲区）· **4** 段终止于 `---`（🟢 **闸对**，`---` 后不属本段）· **1** 段终止于 `>` 注记 · **2** 段终止于顶层散文 ⇒ 后 3 段**当前截的都是叙事、闸对，但补核查项就看不见**。🔴 而同一判据在 **`AGENTS.md#Jira`（豁免段）上已经错了**（1 段/3 条，本节在 `1c108de8` 上复现）⇒ **闸没有机制区分这四类** |
>
> #### 🔴 `#Acceptance~9:1993` 那一段值多少 —— 两栏读数（⛔ 条件式，不是断言）
>
> 你们 tracker 逐字写死「**两端各有声明才判 `gated`**」。这段 ② 成立（2 条自陈），① **四个定位面全零**：
> S-窄 `:1993–:2009` · S-节 · S-父 lvl3 `### M35 :1916–:2017` · S-父 lvl2 `## §M-LIFECYCLE :1303–:2242`（940 行，该章点名 4 个闸但都不是这两个）· **S-全整份文件**。
> 独立 `grep` 兜底（⛔ 未加 `head`/`-m`）：`commit-affordance-trace` **0 次** · `handoff-deliverable-sections` **0 次** · `handoff-sections` **0 次**。
>
> | 口径 | 分母 | gated | 豁免 | `unclassified` | BASELINE | S2 |
> |---|:-:|:-:|:-:|:-:|:-:|:-:|
> | 闸口径 @`1c108de8` | 118 | 18 | 30 | **70** | 70 | 🟢 绿（余量 **0**） |
> | ＋§4.4 的 `ACC_RE` 漏 7 段 | 125 | 18 | 30 | **77** | 70 | 🔴 红（超 **7**） |
> | ＋本节：按 ① 字面剔除该段 | 125 | **17** | 30 | **78** | 70 | 🔴 **红（超 8）** |
>
> ⇒ 🔴 **两格缺口可加、互不重叠**：§4.4 的 7 段是**闸看不见的段**（不在 118 里），本节的 1 段是**闸看得见但判错档**（在 118 里被算进分子）。
>
> ⚠️ ⛔ **仍不断言「闸错了」。** 该段**确实自带机检声明**（段内逐字 `grep -E "Affordance:|Vocabulary scan:|Chosen:" handoff-*.md`），
> 且**镜像规则里点名了** —— `code-conventions.md:1231-1232` 的表格逐字写 `pnpm audit:handoff-sections` 与
> `pnpm audit:commit-affordance-trace`，并注明「与 mockup 侧 M35 **同一条**」。
> ⇒ 可判的只是：**判据 ① 的扫描面不收 `grep` 形态、也不跨文件镜像，而这个取舍零处登记**（与 K3 / §4.4 的 `ACC_RE` 同型）。
> ⚠️ 顺带：`package.json` 实测 `audit:handoff-sections → scripts/audit-handoff-deliverable-sections.mjs`
> ⇒ **npm key 与脚本文件名不同名**，任何「按名字比对」的分类判据都会漏这种别名（lab 自己的判据先踩了，补上解析表后读数不变）。
>
> #### 🔴 回改 §4.4 (5) —— 那 2 个假阴的**成因相反**，⛔ 别当同一种
>
> §4.4 (5) 逐字「lab 的判据有假阴：13 段里只判出 11 段（召回 84.6%），漏了 `#Acceptance~9:1993` 与 `#M52:3153`」。
> **这个数没错**，但两个漏的性质完全不同：
> - `#M52` ⇒ 🔴 **lab 判据的定位面太窄**（扫段内，而闸名点在父节 lvl3 `:3129–:3159`，31 行的正常规则节）= **真假阴**
> - `#Acceptance~9` ⇒ 🟢 **lab 漏它是对的**（四面全零 + 全文 grep 三形态 0 次）= **你们侧判据 ① 未成立**
>
> ⇒ 两栏报：对「你们判的 13 段」召回 **11/13 = 84.6%**（不变）· 对「满足 ① 的 12 段」召回 **11/12 = 91.7%** · 精确率 **11/11 = 100%**。
> a 档仍写「**至少 11 段**」。
>
> #### 🔴 交给 owner 的 5 个决策点（⛔ lab 不代拍，与 §4.4 末那三个并列）
>
> | # | 决策点 |
> |:-:|---|
> | **M-D1** | 判据 ① 要不要放宽到「点名了**任何机检形态**」（收 `grep -E …` 这类 probe 声明） |
> | **M-D2** | 判据 ① 要不要允许**跨文件镜像**（`#Acceptance~9` 的点名住在 `code-conventions.md` 的镜像段里） |
> | **M-D3** | M-D1/M-D2 都判「不放宽」时，`#Acceptance~9` 该不该退回 `unclassified`（退回则 `71 > BASELINE 70` ⇒ S2 红） |
> | **M-D4** | `[N]` 要不要禁止 `[0]`，或对**散文形态 Acceptance** 另立计数口径 |
> | **M-D5** | `#M23.18.1` 的「拉伸到 1082 行整章才点名」算不算满足 ① |
>
> ⛔ **本节未覆盖**：闸的测试文件仍未复核（`ce3fd7e7` 改了它 6 行）· 只查了 13 新 + 5 旧 gated，其余 100 段无自陈面未查 ·
> W4（`、`/`；`/`,` 并列分隔）只报候选未定案（11/18 段有差额）· 不判「闸是否真的 enforce 了那条规则」（需读 11 个闸实现，且含规则语义，§8）。
>
> ### 🔴 4.5a 收尾重取时你们又落了**第二批** —— `a786e0d2`：缺口不是缩小了，是**扩大了**
>
> lab 收尾重取 DS HEAD 时读到 **`a786e0d2`**，subject 逐字「acceptance 对位登记第二批 —— **闸侧那条窄缝补 3 段 gated（70→67）**」。
> 按预注册硬要求重跑（另立 `anchors-a786e0d2.json`，逐字取自你们 `STATUS-CHANGELOG.md`@`a786e0d2` 的
> `扫描面 7 份 · 段 118 · 自陈 23 · 豁免 14 · gated 21 · nmc 30 · unclassified 67（BASELINE 67）` + 该 subject ⇒ **8 锚全绿**）。
>
> **(g) 第二批仍是「零规则原文改动」** —— `git diff --name-only 1c108de8 a786e0d2` 改 10 个文件，
> 落在 `SCAN_FILES` 7 份规则真源上的**仍是 0 个**；`ACC_RE` 仍逐字未改（§4.4 那 7 段漏收跨到第四个 sha 仍成立）。
>
> **(h) 🔴 新增的 3 段在判据 ① 上【全红】** —— 三种别名形态各 `grep` 全文（⛔ 无 `head`/`-m`）：
>
> | 新 gated 段 | 属哪条规则 | `[N]` | `handoff-deliverable-sections` | `audit:handoff-sections` | `handoff-sections` |
> |---|---|:-:|:-:|:-:|:-:|
> | `design-process.md#Acceptance~10:1379` | `## M-LIFECYCLE-CRUD` `:1357` | `[3]` | 0 | 0 | 0 |
> | `mockup-conventions.md#Acceptance~11:2123` | `### M37 — Reference-image probe` `:2094` | `[3]` | 0 | 0 | 0 |
> | `mockup-conventions.md#M42:2684` | `### M42 — Clone Gate` `:2636` | `[4]` | 0 | 0 | 0 |
>
> ⇒ M5「四面全零」**1 段 → 4 段**（16 段新 gated：🟢 10 · 🟠 2 · 🔴 **4**）。
> ⚠️ 你们 commit 里自己写了成因，逐字：「它头注释第 2 行早就写着自己守**四**条规则，却只自陈了 M35 那两个 id」
> ⇒ **这一批完全走 ②（闸头注释），⛔ 一步没走 ①**。而这条闸在两份规则真源里被点名 **0 次**
> （只在 `code-conventions.md:1231` 以别名 `pnpm audit:handoff-sections` 出现过一次）。
> ⇒ **判据 ① 在这条闸上不是「偶然漏了一段」，是【系统性不成立】。**
>
> **(i) 🔴 §4.4 (2) 那条位移缺陷在新自陈上原样复发** —— 新增 3 条里 **2 条用位置 id**：
> `design-process.md#Acceptance~10` 是该文件 **19 个** Acceptance 段里的第 **10** 个，**id 里零规则身份**（`~11` 同型）；
> 且这 2 条都写 **`[3]`** —— 碰撞率最高那一档（**46.2%**）。⇒ 该文件任意位置插一个 Acceptance 段，`~10`/`~11` 就指到别的规则上，而 `[3]` 有近半概率兜不住。
>
> **(j) 🔴 最重的一条：兑现越多，缺口越大**
>
> | 时点 | BASELINE | 闸口径 `unclassified` | 语义口径（＋§4.4 漏收 7 段，−按 ① 不成立的段） | 超额 |
> |---|:-:|:-:|:-:|:-:|
> | `60d644a0` | 83 | 83 | 90 | 超 **7** |
> | `1c108de8` | 70 | 70 | **78** | 超 **8** |
> | **`a786e0d2`** | **67** | 67 | **78**（纹丝不动） | 超 **11** |
>
> ⇒ **补 3 段 ⇒ BASELINE 降 3 ⇒ 语义残余一段没少 ⇒ 超额从 8 扩到 11。**
> §4.4 末那条正面读数（新 BASELINE 注释的「兑现即锁定」补上棘轮半个缺口）**要加一个前提**：
> 🔴 **它锁住的是【数】，不是【事实】。** 当兑现本身不满足你们自己的分类判据 ① 时，
> 这个机制会让假绿缺口**随每次兑现同步扩大** —— 因为 BASELINE 跟着降，而语义残余没降。
>
> ⇒ **M-D1 / M-D2 / M-D3 的紧迫度因此上调**：它们现在决定的不是 1 段，是 **4 段**，且**每落一批还会再涨**。

> ### 🔴 4.6 N 格复核**你们的钉子**（`lab:N64`，2026-08-28，@`02fc77b6`）—— 修 §4.4 那 7 段会被**你们自己的闸**惩罚
>
> §4.4 判出 `ACC_RE` 漏收 7 段、§4.5 判出散文盲区与段边界错。N 格问的是下一层：
> **`tests/audit-acceptance-gate-coverage-cli.test.ts` 那 34 条整脚本回归，钉住的是对的行为吗？**
> 全部注入在 lab 的**导出树**上做（`git archive 02fc77b6` + 独立 `node_modules`），⛔ **未改你们仓库一个字节**。
>
> **(k) 🔴 修 `ACC_RE` ⇒ 钉子 34/34 全绿，而闸自己在真源上当场 4 条红**
>
> | 面 | `sections` | `unclassified` | 闸结论 | **34 条钉子** |
> |---|:-:|:-:|---|---|
> | 现状 | 118 | 67（= BASELINE） | 🟢 `failures=0` | 34/34 绿 |
> | 放宽 `ACC_RE` 收那三形态 | **126** | **75** | 🔴 **S2 + 3×S4** | **34/34 绿（纹丝不动）** |
>
> ⇒ 钉子对这个改动**零敏感**：`- **Acceptance` / 缩进 / `验收标准` 三种形态，
> 在**整个 `tests/` 目录 197 份 `.ts` 里一次都没出现过**（对照臂：`Acceptance` 命中 6 份 ⇒ grep 有效）。
>
> **(l) 🔴 那 3 条 S4 的成因是 `~N` 位移 —— §4.4 (2) 判的风险，在【修复动作发生的那一刻】变成实害**
>
> 放宽后新收的段排在前面，占用了原有的 `#slug` / `~N`，**4 段已有自陈的段 id 指向漂移**：
>
> | 段 id | 行号 | 该 id 的 `items` | 受影响的自陈 |
> |---|---|:-:|---|
> | `#M23.18.1` | :937 → **:917** | 5 → **0** | `audit-mockup-colors.mjs [7]` |
> | `#M-INTEGRITY` | :1276 → **:1247** | 6 → **0** | `audit-mockup-overlap.mjs [6]` |
> | `#M-INTEGRITY~2` | :1293 → **:1256** | 4 → **0** | `audit-mockup-integrity.mjs [4]` |
> | `#M-DISCIPLINE.SYNC` | :3111 → **:3079** | 0 → 0 | —— |
>
> ⇒ §4.5 判的「当前实害 0」**在静止状态下正确**，但要加前提：
> 🔴 **它只在【没人去修 `ACC_RE`】时成立。** 合起来是一个**惩罚修复**的结构 ——
> 修复者拿到的信号互相矛盾，而唯一会红的那份（闸）会被读成「**你把闸改坏了**」。
>
> **(m) 🔴 段边界那条判据【已被钉子固化】** —— 注入「不因顶层散文终止」⇒ 34 条里 **1 条当场红**，
> 逐字是 `:169`「Acceptance 之后的顶层散文行终止该段」，其注释写着「🔴 **⛔ 别删**」。
> 而 §4.5 已实测该判据在 `AGENTS.md#Jira` 上**错误漏收**（段内逐字 7 条，闸只收 4 条，
> 且**你们自己**的豁免 `reason` 逐字写「七条」）⇒ **钉子会拦住对那处的修复，且没有机制区分这两面。**
>
> **(n) 🔴 散文形态的 Σ 是【零覆盖】，⛔ 与 (m) 不是同一种病** —— 钉子里 **18 条 `covers-acceptance` 自陈
> 全部指向 `M17`/`M10`/`R0`/`M999` 四个【列表形态】段**，散文段 `M11` **零条自陈**；
> 唯一那条散文用例（`:195`）只断言「段进分母 + `unclassified 1`」，**零处断言 Σ**。
> ⇒ §4.5 那处 `[0]` 修复**不会被拦**（好消息），但也**得不到任何回归保护**。
>
> **(o) 🟢 如实登记一条正面读数**：钉子头注释自陈「spawn 整脚本 ⇒ 看得见接线」**为真** ——
> 摘 `main()` ⇒ **32 红** · `exit(1)→exit(0)` ⇒ **13 红** · 换回原始入口守卫 ⇒ **34 绿**
> （⇒ `gate-fixture-root.ts` 那个 `realpathSync` 修复**真的生效**）。⛔ 这不是空话。
>
> **(p) ⚠️ 一处形态差别**：`tests/audit-gate-ci-parity-cli.test.ts` 头注释逐字登记了自己的覆盖边界
> （「⛔ **本面覆盖不到具名豁免表的三条分支**」「**如实登记的边界，不是待补 TODO**」），
> 而 `audit-acceptance-gate-coverage-cli.test.ts` **零处登记自己的形态覆盖边界**
> （头 40 行那两处「边界」，一处说的是**另一条闸**的缺口、一处说的是 BASELINE 写死会漂）。
>
> #### ⇒ 交回你们的 4 个决策点（⛔ lab 不代拍）
>
> **N-D1** 修 `ACC_RE` 会连带打断 3 条现有自陈 ⇒ **要不要先把 `~N` 位置 id 换成规则身份 id，再动 `ACC_RE`**？
> **N-D2** `:169` 那条钉子写「⛔ 别删」而它钉的判据在 `#Jira` 上是错的 ⇒ **改钉子，还是给判据加区分机制**？
> **N-D3** 散文形态的 Σ 要不要**补一条钉子**（现在改对改错都不红）？
> **N-D4** 要不要照 `gate-ci-parity` 的形态，**在头注释登记「fixture 只覆盖 `^**Acceptance` 一种形态」**？

## 5. ⛔ lab 的边界（如实登记）

1. **⛔ 未改 DS 任何文件** —— 全程只读 `git grep` / `git show`。
2. **⛔ 不裁**：这些缺口该不该补 · 先补哪个 · 第 4 节两种形态选哪个 · 任何一条设计规则的**内容**该怎么写。
3. **⛔ 不声称穷尽**：15 条是 105 条 checklist 的几何/尺寸/间距子集；
   `mockup-conventions.md` 另有 **54 个 Acceptance 段**未逐段对位。
   > 🔴 **K 格订正（`lab:N61`）：这个 `54` ⛔ 不可复现，且本处方没写它的口径。**
   > 四个 sha（`1cc95824` / `6a78faa4` / `f15c8500` / `60d644a0`）上逐一实测，
   > **闸口径 `^(\*\*Acceptance｜#{2,6}\s+.*Acceptance)` 恒 = 59** · **窄口径 `^\*\*Acceptance` 恒 = 32** ·
   > 「59 − G 格已对位段（复算命中 **6** 段）」= **53**。⇒ **没有任何写明的口径能重建 `54`**（最近的 53 差 1）。
   > ⛔ **不断言 `54` 是错的**（复算所用引用行号集可能漏 1 条），可断言的是：**它不可验证**。
   > ⇒ **现取可复现读数：`mockup-conventions.md` 共 59 段，其中 59 段全部 `unclassified`**（§4.2 逐份表）。
   > ⚠️ 同型教训见第 27 条推论一 —— ⛔「有数」≠「数是对的」，**没写口径的数连查都没法查**。
   >
   > 🔴 **L 格加强（`lab:N62`，2026-08-27）**：把「未找到口径」升级为**穷举**。
   > 对 `mockup-conventions.md`@`60d644a0` 跑口径矩阵 **31 种组合**（10 单轴 + 6 单减 + 15 两两组合），
   > 矩阵先自证能重建已知的 **59** 与 **32** 两数（🟢 逐位对上）⇒ 矩阵可用；
   > ⇒ **31 种口径组合无一产 `54`**（最接近：`59 − items≤1 的段(9) = 50` · `59 − 散文段(7) = 52`）。
   > ⇒ 结论从「**未找到写明的口径**」升到「**穷举 31 种口径组合均不命中**」。⛔ 仍不断言它错。
   > ⚠️ K 格第三个数「扣已对位 **53**」**未纳入本矩阵**（该文件 gated = 0 段，53 用的「已对位」定义在矩阵外）⇒ 矩阵覆盖 **2/3** 个已知数。
4. **⛔ 未 live 核 Figma** —— 第 3.1 那条前置（「行」的结构特征）**必须由执行方实测**，
   lab 只把风险原样带到。
5. 分类里的 **(c) = 0 条**只对这 15 条成立 ⇒ **⛔ 不许外推成「DS 没有无据可依的维度」。**
