# 假绿出在判据之外，不出在判据之内

> **落点**：`178f26a6` / `16352be8`（走查回流线）。
> **同族真源**：[`2026-09-03-b-when-two-instruments-disagree-suspect-the-one-i-wrote.md`](./2026-09-03-b-when-two-instruments-disagree-suspect-the-one-i-wrote.md)
> —— 「两个量具矛盾时先怀疑我写的那个」全文在那里，⛔ 本篇不复写，只在 §三 补它没覆盖的**代价方向**。
> 本篇主体是它没讲的两件：**假绿的位置**（§一）与**分处方案的论证方式**（§二）。

---

## 一 · 同一轮里两次，两次都在判据的射程之外

owner 一眼看出 PRD 卡的超链接有问题时，`source-link-integrity` 是**绿的**。它没有算错——它逐字执行了自己的判据，只是那 8 处引用**根本不在分母里**：判据按「同一个 TEXT 内有没有溯源字样」判射程，而 PRD 的 Source 段是「段标题一个 TEXT + 引用行另外三个兄弟 TEXT」，引用行自己不含那四个词。闸报的是 `checkedUnits=0`——**那个绿的含义是「没有可判对象」，不是「判过了」**。

补完射程、同一轮里我给规则写下新的 Acceptance：「每个带 hyperlink 的 range 必须 cyan + 下划线」。几十分钟后在 Journey 卡实测到 `V4-1646` **已经是 cyan、但 hyperlink 是 null**——看起来能点、点不动。这一整类同样落在我刚写的判据之外：我只规定了「有链接的该长什么样」，没规定「长成链接样子的必须真有链接」。

两次的形态一模一样：**判据本身是对的，漏的是它没覆盖的那一侧**。

**⇒ 自查问法**（写完任何判据后跑一遍，⛔ 不是「这条判据会不会算错」）：

1. **分母是怎么来的？** 判据的射程由什么决定，什么东西会因为形态不同而整批落在射程外？`checkedUnits=0` 与 `findings=0` 是两件事——前者要按 `unverified` 读。
2. **反过来的那一侧谁管？** 判据形如「所有 A 必须有 B」时，「有 B 但不是 A」由谁判？本轮那两个反例（假可点、`[ ]` 当 checkbox）都出在这一侧。
3. **这条判据是在真实数据结构上验过的，还是在我想象的结构上？** 射程盲区的根因是「段标题与内容行是兄弟节点」这个**实际的 Figma 结构**，判据写的时候假设了它们在同一个节点里。

## 二 · 「内容零重复」不足以论证一个分处方案是对的

2026-08-05 立过一条规则：验收判据 **PRD 段 = 功能级 · UX 卡 = 界面级**，两段各留一行互指指路句、不复述对方内容。

2026-09-10 复核当轮交付：**那套规则被逐字做到了**——PRD 5 条全功能级、UX 卡 9 条全界面级、逐条零交集、两条指路句一字不差都在。

owner 扫一眼，仍然说「验收标准在 PRD 和 UX 交付说明里面都提了……不要重复了」。

读者感知的不是「内容有没有交集」，而是「**我要看验收，得去两个地方**」。规则当初论证自己成立时用的是前者，而使用者判断它的是后者。

**⇒ 可复用的判断**：

- 一个「按维度拆到两处」的方案，**不能用「两处内容不重叠」来证明它对**。要问的是：**读者为了得到一个完整答案，需要打开几个地方？**
- 这类规则的验收判据应当写成读者动作（「验收要看几处」），⛔ 不是内容属性（「两处有无交集」）。后者永远可以做到，且做到了也不解决问题。
- ⚠️ **推翻的是「归属地」，不是「判据单一归属」本身**——后者仍成立，且正是这次改动的依据（验收统一进 UX 卡，仍然只有一处）。改一条规则时要分清**它的原则**与**它当初选的那个落点**，⛔ 别连原则一起丢。

## 三 · 补 09-03-b 没覆盖的：用自己的量具去否定闸，代价是漏掉真缺陷

09-03-b 记的是「两个量具矛盾时先怀疑我写的那个」。本轮又一个实例，但**代价方向是新的**。

改完射程后闸报 `10366:840` 的 `V4-1646` 无链接。我写了个 REST probe 去核，probe 显示 override 11 带 hyperlink ⇒ 我判定「闸报的是假阳」，并已经开始去查闸的 `linkCovering` 实现哪里错了。

真相是**闸对、我错**：我的 probe 用了非全局 `.match()`，只取到 EN 行那个 `V4-1646`；闸用全局正则，抓的是 **ZH 行「Jira 主单 V4-1646」——它的 hyperlink 确实是 null**。那是一处我自己修链接时漏掉的真缺陷。

09-03-b 讲的代价是「假结论」。这里的代价更具体：**我差点用一个有缺陷的临时量具，把闸抓到的真缺陷判成假阳并放过它**，而且当时已经在改闸的路上——**再往前一步就是为了迁就我的错误读数去放宽一条正确的判据**。

⇒ 追加一条动作纪律：**当我的临时量具与已上闸的量具矛盾、且我准备据此改那个闸时，先把两者的输入对齐再说**（同一个正则的全局/非全局、同一段字符范围、同一个端点）。本轮对齐的成本是一次 `matchAll`；不对齐的成本是放宽一条刚修好的判据。
