# 复盘 2026-08-28（第六十轮）—— **判据分两支时，缝在两支之间**；以及「阴性结果连判据一起留」第一次兑现

> **范围**：只记本轮学到的**可复用 pattern**。逐项实证（4 段分类清单 / 4 条不够格的理由 / 三向注入表 /
> 两条阴性结果的扫描判据）已在 [STATUS-CHANGELOG](../STATUS-CHANGELOG.md) 第六十轮与 [[INFRA-F142]] entry 里，
> **本文刻意不复述**。前一轮同线的复盘：[2026-08-27-g](./2026-08-27-g-a-negative-result-protects-itself.md)（本文是它的直接续篇）。

---

## 一 · 新 pattern：**判据分两支时，缝不在某一支内部，而在两支之间**

本闸判 `gated` 的判据逐字有两支：

> 规则文本自己**点名了闸** _或_ **自己给了可跑的 probe**

上一轮扫第二支（「自己给了可跑的 probe」）时，宽网列了七种写法：代码围栏 + 反引号里的
`grep|rg|node -e|python|bash|jq|curl`。本轮补扫，命中的全部指向一种它没列的写法：**`pnpm <非 audit: 前缀的 key>`**。

🔑 **关键是它漏掉的原因不是疏忽**：`pnpm audit:*` 是「点名了闸」那一支的典型形态 ——
于是扫第二支的人自然把「pnpm 开头的命令」整类当成**第一支的辖区**，不再往自己的网里放。
而 `pnpm design:kickoff` 这种 **key 不带 `audit:` 前缀的可跑命令**，两支都以为归对方管。

| | 复盘 b §一（已有） | **本条（新）** |
|---|---|---|
| 缺陷位置 | **单个判据内部**的盲点 | **两个判据的并集**有洞 |
| 形态 | 判据只对一种书写形态灵敏 | 每支各自都「合理地」把某一类划给了对方 |
| 造故障能不能抓到 | 能 —— 在那一支里造一个它认得的形态 | **不能** —— 在任一支里造故障，另一支都不该抓它 |
| 谁会发现 | 换个写法就暴露 | **没有人** —— 两支各自的自测都是对的 |

⇒ **自查一句**：判据写成「A _或_ B」时，除了分别问「A 扫全了吗 / B 扫全了吗」，
必须再问一次 —— **「有没有哪一类，A 觉得它属于 B、B 觉得它属于 A？」**
落点通常在**两支共用的表层特征**上（这里是「以 `pnpm ` 开头」）。

⚠️ 别把它读成「判据不该分支」。分支本身是对的（两支各有真实语料）；
要做的是**在定义两支的地方就写清分界线在哪**，而不是留给各自的扫描者去推断。

---

## 二 · 验证过的好方法：**阴性结果连判据一起留** —— 第一次兑现，且收益可量化

[复盘 g §二](./2026-08-27-g-a-negative-result-protects-itself.md) 立的纪律逐字是：

> 登记阴性结果时，必须把「扫描判据的实际形态」和结论写在一起。
> 只留结论 ⇒ 下一个人只能选择「全信」或「全部重做」；连判据一起留 ⇒ 他能用 30 秒判断
> 「那一遍扫得够不够宽」，然后只补差额。

**本轮是它第一次被真正使用，而且当场推翻了它所保护的那条结论。** 实际发生的事：

1. 读那一行（判据 + 结论同处）——**几十秒**看出七种写法里缺了哪一类；
2. 只补差额（两种写法），⛔ 没重扫那七种；
3. 命中 3 段 ⇒ 那条阴性结果为假。

🔑 **要记的是「机制生效」而不是「上一轮错了」**：
如果上一轮只留结论（「闸侧那一支为空，别重扫」），本轮唯一的选择是**全信**（于是 3 段永远留在缺口里）
或**全部重做**（成本约等于上一轮）。判据同处这一个动作，把这两个坏选项换成了「只补差额」。

⇒ **这条纪律从此不是提案，是有回报记录的做法。** 配套的两个执行细节也值得固定下来：

- **被推翻的阴性结果要就地划掉 + 标注**，⛔ 不能只在新一批里写「我们发现它是假的」——
  下一个人读到的可能还是旧那一行，它会照样劝退他。
- **推翻它不否定登记它的价值**：本轮同时按同一格式登记了自己的两条阴性结果（含正则原文与剔除的噪声源），
  理由与上一轮完全相同 —— 省下一批的重复劳动。**登记阴性结果是对的，只留结论才是错的。**

---

## 三 · 一条边界（连续第二轮同型，记一次就够）

「不判 `gated`」的**结论对、写下的理由却是假的」**——本轮又一次：

- 上一轮：`#I2` 的不判理由写成「点名的是 `use_figma` 实时 probe」，实测点的是仓内闸。
- **本轮**：`#M23.6` 的不判理由写成「规则原文逐字『无法 REST 机检』= 否定语境」——
  那句话在**合并探针段**里，**不在** Acceptance 段里。真正的理由是另一个（核查项被测物是 handoff 里的一张表）。

🔑 两次的共同结构：**不判的结论是从「整段读下来的印象」得出的，写理由时却去抓了段里最显眼的一句话。**
那句话往往真的存在、也真的相关，只是**不在被判定的那个位置**（Acceptance 段 vs 正文 vs 探针段）。

⇒ 写「为什么不判」时，判据是**逐字读被判定的那一段本身**，
而不是「这条规则给我的整体感觉」。⛔ 引用一句话作理由前，先确认那句话落在被判定的段界内。

---

## 四 · 新 pattern（本轮 self-audit 当场抓到）：**闸保护的是声明，不是声明下面那段理由**

本轮写的 `covers-acceptance` 自陈行受**两条判据**保护：S2 核它在不在（摘掉就红）、S4 核 `[N]` 对不对（改错就红）。
于是很容易产生一种错觉：**这块注释是被闸守着的**。

收尾 self-audit（AGENTS §Sprint 收尾 Self-Audit B 类「新加的字段引用是否 exist」）程序化核了我在自陈**理由段**里
点名的每个函数 —— 抓到一处：我写「判据实现在 `checkOne()` 的『颜色 + 圆点形态（C4）』段」，
而 **`checkOne` 这个函数不存在**，名字是我编的（真名 `classifyConnectorViolations`）。

🔑 **可复用的结构**：

| 这块注释的组成 | 有闸核吗 |
|---|---|
| `covers-acceptance: <id>` 这一行 | ✅ S2（在不在） |
| `[N]` | ✅ S4（对不对） |
| **下面那段理由**（两端声明的逐字引用 / 判据实现在哪个函数 / 底线判据怎么对上） | ❌ **一条都没有** |

⇒ 这与 memory `entry-restatement-is-secondhand` 记的「**闸豁免表的 `reason` 同样是转述，且没有任何闸会发现它假**」
**完全同型** —— 只是宿主从豁免表换成了自陈注释。它值得单独记一次，因为**自陈行被闸守着这件事**
会让人（包括我）把保护范围外推到整块注释。

⛔ **不该为它上闸**：要核「注释里点名的函数存在吗」，就得解析任意注释里的标识符引用，
而词法上分不开「引用本文件的函数」与「提到别处的名字」—— 那正是 [[INFRA-F133]] 用 86.7% 假阳率
换来的那个结论。⇒ 落点是**纪律 + 一条 10 秒的机械动作**：

> **写完任何「理由段」，把里面点名的每个函数 / 常量 / 字面量 `grep -c` 一遍。**

本轮那次 `grep` 一共核了 7 个名字（6 个真、1 个假），耗时不到 10 秒。
⚠️ 这条也是「收尾 self-audit 协议不是形式主义」的一个具体实证 —— **它抓到的是我自己 20 分钟前写下的东西**。
