# 复盘 2026-08-27（下半场）—— 判据可能只对**一种书写形态**灵敏；以及「能不能自动判定」该怎么切

> **范围**：只记本轮学到的**可复用 pattern**。逐项实证（注入清单 / 分档读数 / 偏差分布）已在
> [STATUS-CHANGELOG](../STATUS-CHANGELOG.md) 第五十四轮、[[INFRA-F142]] / [[CANONICAL-F104]] 两条 entry 里，
> **本文刻意不复述**。上半场那两条 pattern 在 [2026-08-27-a](./2026-08-27-a-new-gate-must-pass-the-repo-s-own-contracts.md)。

---

## 一 · 新 pattern：一条「数得对不对」的判据，可能只对真源的**一种书写形态**灵敏

`audit-acceptance-gate-coverage` 的 S4 被 entry、CHANGELOG、闸头注释**三处**称为「这条闸里最值钱的判据」，
凭据是一次真实的注入：往 `domain-tvu.md` §M17 那条 Acceptance 里加第 5 个核查项 ⇒ 当场红。

那次验证是真的。**但它只覆盖了一种写法。** 同一个语义有两种写法：

| 写法 | 例 | 旧判据 `actual = Math.max(各条项数)` |
|---|---|---|
| 核查项用 `·` 挤在**同一条** checklist 里 | `- [ ] 至少核到：A · B · C · D` | ✅ 加第 5 项 ⇒ max 变 ⇒ 红 |
| 核查项**一项一行** | `- [ ] A`<br>`- [ ] B` | ❌ 新增一行 ⇒ max 不变 ⇒ **exit 0，且印「自陈子项数对得上」** |

而实测**全仓 118 个 Acceptance 段里 104 段是第二种**。§M17 恰好是第一种，且它的 max 由被自陈那条**唯一**提供
—— 换句话说，**当初那次成功的验证，挑中的是语料里最有利的一段**。

🔑 **可复用的自查**：写任何「核对数量」的判据（几个核查项 / 几个字段 / 几条规则 / 几个 variant）之前，先问

> **这个量在真源里有几种写法？我的判据对每一种都灵敏吗？**

⛔ **别用「造一个故障、它红了」当充分凭据** —— 那只证明「至少有一种形态能被抓到」。
`regression-pass-needs-fault-proof` 治的是「绿是不是空过」；本条治的是**红也可能只覆盖了一个形态**。
判据的选择器（`max` / `first` / `any`）往往就是形态盲区的来源：`max` 对「加一条低值项」天然不敏感。

⚠️ 顺带一个具体教训：`Math.max` 这类**聚合选择器**在做「变更探测」时几乎总是错的 ——
它把 N 个数压成 1 个，那 N-1 个的变化就都看不见了。要探测变更就用 **Σ 或全量指纹**，别用极值。

---

## 二 · 新 pattern：「能不能自动判定」不该按「AI 能不能判」切，要按「**真源有没有自己的声明可比**」切

owner 问的是「rows 那 28 条能不能自动根据规则判定，减少人工参与」。
**错误的切法**是去想「AI 判不判得出这个设计是不是缺陷」—— 那必然滑向启发式，而
`FIGMA_AS_SOURCE_OF_TRUTH.md` §验证方法 逐字禁止（它记的 5 次错估全部源于「凭名字猜语义」）。

**对的切法**：问真源自己有没有说过「应该是多少」。分出来的档立刻是可判的：

- 容器 auto-layout 声明 `itemSpacing=16`，实际相邻 gap 34，且无 `layoutPositioning=ABSOLUTE` 子可解释
  ⇒ **这不是审美问题，是「文件说 16、文件又渲染成 34」** ⇒ 无需人判。
- 离群行 `layoutSizingVertical='HUG'`（行高由内容决定）⇒ 不等高是**该声明的预期结果** ⇒ 有解释。
- 容器不是 auto-layout ⇒ 真源从未声明「应该多少」⇒ **只能人判，且诚实标成「判不了」**。

🔑 **推广形态**：把「这个东西对不对」重写成「**这个东西和它自己的声明一致吗**」。
前者需要外部标准（= 设计意图 = 人），后者只需要真源内部两处的比对（= 可机械化）。
本仓 render-verification manifest 走的正是同一条路：它不判「这个颜色好不好」，只判「code 值 == Figma 值」。

⛔ **两条边界，都要如实登记，否则这个 pattern 会被滥用**：

1. **「有一步推断」的档必须单列，不能混进「无需人判」。** 本轮的 🅰️²（离群行全 `FIXED` ⇒ 有人单独改过）
   看起来很像结论，但设计师**可以**故意让 footer 行 FIXED 得不一样 ⇒ 它是**证据档不是结论档**，
   理由里必须留着「仍可能是有意」，并配一条测试钉住那句保留（否则下一个人会把它当 🅰️ 用）。
2. **档位只许收窄不许放宽。** 已配两条「防变宽」的钉：「有 `ABSOLUTE` 就不许还算 🅰️」
   「`FIXED`+`HUG` 混合不许升成 🅰️²」。🅰️ 是唯一「不需要人判」的档，它悄悄变宽就等于开始替真源编设计理由。

---

## 三 · 同一轮里，这个 pattern 立刻**否掉了它自己引出的一个动作**（值得单记）

分档的副产品是一条很有说服力的观察：🅱️ 档 14 条**全部**是 `HUG`，占 28 个决策点的一半
⇒ 看起来顺理成章的下一步是「把 HUG 行从 R1 排除，假阳减半」。

**量完偏差分布后否掉了它**：那 14 条里有 4 条相对偏差 **33–50%**（一行比众数矮一半），
那是内容缺失/溢出的真症状候选；≤8% 的只有 5 条。⇒ 排除 HUG 会**吞掉那 4 条**，
与 [[CANONICAL-F104]] 落地当天「R1 复用 `widthTolerance` 把 13 条吞成 4 条」是**同一个坑的镜像**。

🔑 **两条可复用的**：

1. **「某一类命中全都有同一个属性」不等于「这一类都该排除」** —— 先量那一类**内部**的分布。
   同一个属性下可以同时藏着噪声和真症状（本轮：3% 和 50% 都是 `HUG`）。
2. **「改判据」和「改报告」的选择有一条硬判据：谁看得见。** 把假阳压进报告的分档里，owner 看得见、可推翻；
   改探针判据他看不见（memory `audit-whitelist-vs-sot-refactor`「别为凑工具 pass 改 SoT」的正向用法）。
   ⇒ 拿不准的收窄先做成**报告侧的分档**，别做成**判据侧的排除**。

⚠️ 还有一个更钝的理由，容易被漂亮的机制盖过去：**分档已经把 28 条降到实际要看的 ~11 条了，
改 R1 只移动边界、不省人力** —— 达不成它声称的那个目的（推荐自审第 5 问）。

---

## 四 · 「绿的原因不是判据」的第四种形态：**闸的扫描面排除项**

删掉一份被两处文档引用的文件后，先跑 `audit:stale-anchors` ⇒ EXIT=0。差点当成「闸确认无死链」收工。

实际成因：该闸的 `LIVE_TREE_EXCLUDE_FILES` 逐字排除了 `docs/internal/STATUS-CHANGELOG.md`
（历史归档不该被要求保持链接有效 —— 这是**刻意取舍，不是缺陷**）。
⇒ 那处带反引号的路径删文件后**是真死链，而闸结构上看不见**。

memory `verification-criterion-must-be-terminal-state` 已记三种形态（代理判据 / 恒真 echo / 红的原因不是判据）。
**这是第四种：绿是真的、退出码是真的、而那个对象根本不在分母里。**

🔑 **自查**：跑完一条闸拿到绿，若你关心的对象是**刚刚新增或刚刚删除**的，
先确认**它在不在这条闸的扫描面里**（读闸自印的覆盖面，别读退出码）。
本仓每条闸都自印覆盖面，正是为了让这一步只花一眼。

⚠️ 附带一条取舍的代价要留痕：**历史归档里的路径引用会静默腐烂，没有任何闸会提醒。**
⇒ 在归档里提已删对象时**不加反引号**（同 `audit:stale-anchors` 头注释「§ 是活指针、裸号是历史提及」的约定）。

---

## 五 · 两条已登记规则的再次实证（不是新 pattern，记次数）

1. **`fault-probe-name-must-be-absent-from-repo`** —— 这次不是撞仓库里的字符串，是**撞被测判据自己的字符**：
   新钉的探针文本写了「（一项一行，不含 `·`）」，而 `·` 正是 `countCheckItems` 的分隔符
   ⇒ 该条被数成 2 项、Σ=9 而非 8，**测试红的原因变成我自己造的污染**。
   ⇒ 探针文本的自查要多问一句：**它含不含被测判据要解析的那个字符？**
2. **[[INFRA-F137]]（指向不存在的 npm script key）** —— 同一轮我犯两次：把 harvest 闸写成
   `gate-output-harvest`（真 key `report:gate-output-harvest`）、又用了压根不存在的 `audit:backlog-schema`
   （EXIT=254 = command not found，**不是判据失败** —— 差点读成「闸红了」）。
   F137 的结论「四族噪声刻意不上新闸」仍成立，但**人这一侧的复发率不低**；
   ⇒ 跑一条没跑过的闸之前，先 `node -e` 查一次 `package.json.scripts`，比事后解释 254 便宜。
