# 复盘 2026-08-28-b（第六十二轮）—— **阴性结果只答它自己问的那个问题**；以及「求交集」这个词的定义

> **范围**：只记本轮学到的**可复用 pattern**。逐项实证（第四条缝的补扫方式 / 命中的那 1 段 / 三条阴性结果各自的判据 /
> 两向注入读数）已在 [STATUS-CHANGELOG](../STATUS-CHANGELOG.md) 第六十二轮与 [[INFRA-F142]] entry 里，**本文刻意不复述**。
> 前一轮同线的复盘：[2026-08-28-a](./2026-08-28-a-two-criteria-leave-a-seam-between-them.md)（本文是它的直接续篇）。

---

## 一 · 新 pattern：**判据写得再细，也只答它自己问的那个问题**

[复盘 g §二](./2026-08-27-g-a-negative-result-protects-itself.md) 立的纪律是「登记阴性结果时把扫描判据和结论写在一起」，
[复盘 a §二](./2026-08-28-a-two-criteria-leave-a-seam-between-them.md) 记下它第一次兑现。本轮兑现了第二次，
但**兑现的方式暴露了这条纪律的一个缺口**。

上一批登记的阴性结果之一逐字是：

> **`§M47` 与「§M23 字体规范」在分母里没有对应段。** 判据 = `grep -n '^#{2,5} .*M47'` 得 `:2779` / `:2826`，
> 而 `--list` 里相邻两段落在区间外 ⇒ typography-icon 那 4 条枚举里只有 §M32 与 §M48 落在分母内。

**这条判据是对的，结论也是真的。** 它写得足够细，本轮几十秒就复核完、没重扫。

问题在别处：**它问的是「§M47 有没有段」，它没问「那这条闸到底在测哪条有段的规则」。**
本轮反过来问了一次，答案是：`audit-mockup-typography-icon.mjs` 的 GLYPH 半，其判据常量与 **§M-TXT-ICON-AUDIT**
正文的 charset 是同一件事 —— 而那条规则有 3 个 Acceptance 段、全在 `unclassified` 里。
FONT 半同理，自陈的两条来源在分母里一段都没有。

🔑 **结构**：

| | 复盘 g §二（已有） | **本条（新）** |
|---|---|---|
| 治的病 | 只留结论 ⇒ 后来人只能全信或全部重做 | **判据是对的、结论是真的，而问题问偏了** |
| 症状 | 下一批白扫一遍 | 下一批**照着判据复核通过**，于是不再往下问 |
| 谁会发现 | 换个写法就暴露 | **没有人** —— 判据越写得细，越像已经查透了 |

⇒ **登记阴性结果时，除了留判据，还要留一句「这条判据没问的是什么」。**
最常见的那一类没问到的，是**同一个对象的反方向**：查了「A 有没有对应的 B」，就该顺手记一句
「⚠️ 本条没查 B 到底对应哪个 A」。

⚠️ 别把它读成「判据要写得更全」。判据窄是对的（窄才可复核）；要补的是**边界声明**，不是判据本身。

---

## 二 · 新 pattern：**复盘 e §一 那条加问有「判据侧形态」，不只是转述侧**

[复盘 e §一](./2026-08-27-e-restatement-that-redefines-a-term.md) 的加问逐字是「这句**转述**里有没有哪个词，
它用的定义和真源不是同一个」。前两轮它两次命中的都是**交接 prompt 里的量词**。

本轮它命中在**判据自己身上**：前三批的闸侧扫描步骤逐字是「拿闸头注释枚举的规则 id 与剩余段**求交集**」——
「求交集」求的是段的 `id`，而段 id 是 `slugOfHeading(紧邻 heading)` 造的，于是分母里 **37 / 63 段的 anchor
根本不是规则 id**（`Acceptance~N` · `例外` · `Step` · `⚠️` · `(B)`）。

⇒ **闸侧扫出来的任何 id，对这 37 段结构性失明**，id 正则写得多全都没用。
这与[复盘 a §一](./2026-08-28-a-two-criteria-leave-a-seam-between-them.md)「两支之间的缝」**不同型**：
那条是两支互推、各自自测都对；这条是**单个判据里一个词的定义与被测面的实际形态不符**。

⇒ **自查一句**：判据里出现「求交集 / 匹配 / 对上」这类词时，问一次
**「两边各自拿的是什么字段？那个字段在被测面里真的都是这个形态吗？」**
落点通常在**那个被默认当成 key 的字段**上。

---

## 三 · 一条边界（本轮踩了一次、当场自证）：**归属法各有系统性错法，别只用一种**

把「一个 Acceptance 段属于哪条规则」这件事机械化，本轮试了两法，**两法各在一份文档上系统性出错**：

| 归属法 | 在哪份文档上错 | 错的机制 |
|---|---|---|
| 段前**最近一条 rule heading** | `design-process.md` | 5 段被错配到 §M51 —— 它们与 §M51 之间隔着好几个**无 id 的 `##` 大段** |
| **heading 层级栈**回溯 | `mockup-conventions.md` | §I4 被弹掉、归属报成 §M-INTEGRITY —— 该文档用**同级 `####`** 写子段（`#### I4` 与紧随的 `#### 触发场景` 同级），栈遇同级即 pop |

⇒ 本轮用的是「① 出候选 → 逐条读 heading 链人核」。
🔑 要记的是：**这两法不是「一个好一个差」，是各自对一种文档写法失效**；
在真源写法不统一的仓库里，机械归属只能出**候选**，不能出**结论**。

---

## 四 · 验证过的好方法（连续第二轮兑现，记一次就够）

[复盘 a §四](./2026-08-28-a-two-criteria-leave-a-seam-between-them.md)立的那条 10 秒机械动作 ——
「写完任何理由段，把里面点名的每个函数 / 常量 `grep -c` 一遍」—— 本轮核了 10 个标识符，全部存在。
**但它抓到了另一类东西：一个事实错。** 我写「`M0`·`M1`·`M33` 有 heading 无 Acceptance 段」，
而 `M33` **有段**（`#Acceptance~8:1909`，仍 `unclassified`）。

⇒ 这条动作的收益比它当初被记下来时更宽：它不只防「编出来的函数名」，
也防**「顺手并进一个清单里的、没逐个核过的成员」** —— 后者同样落在理由段里，同样没有任何闸会发现。
⇒ 把纪律扩一句：**理由段里凡出现「A·B·C 三者都如何」这种并列清单，逐个核，别核头两个就写下去。**
