# Task 8+9 对账 —— 处方 3 判据 2–8（含 §18.8 漏登的判据 8）

**环境名 `wt-fault`** · 三元组 `(c1db57b8, n/a, n/a)`

## 0. 闸的真实判据（读实现取，⛔ 不从处方抄）

[`scripts/audit-stale-anchors.mjs:129-131`](../../..) 逐字：
```
报孤儿 ⟺ ① span 是**显式相对路径**（`./` / `../` 开头）
       ∧ ② 目录分量按**路径段边界**后缀匹配到本仓某个实存目录
       ∧ ③ 完整路径在**任何一个**匹配到的目录下都不存在
```
⚠️ **① 是处方没有的，DS 主动收窄了 lab 处方 §4.2 建议的判据**，并给了量化理由：
按处方原判据在本仓 78 条候选 span 上会报红 2 条，而 **2/2 都是假阳性**（都是另一个仓库的路径，
只是目录布局与本仓同构）。DS 登记为边界 **B1**：「仓库根相对形态解析不到时一律不报」。

⇒ **lab 接受这个收窄** —— 它让判据真的达成处方 §4.2 自己写的目的，⛔ 不是把它改软。
（按 AGENTS §2.6 元指标：这是一条「处方被**带实证的修改**后采纳」的记录。）

## 1. 判据 2 / 3 / 8 —— 该拦的拦住了

| # | 动作 | EXIT | 孤儿行原文 |
|---|---|---:|---|
| **2** | 删 `docs/_archive/retrospection/2026-06-01-rule-execution-discipline-gap.md` | **1** | `docs/internal/mockup-conventions.md:3241  [code-span-path]  ../_archive/retrospection/2026-06-01-rule-execution-discipline-gap.md  — 目标文件不存在（目录分量 `_archive/retrospection/` 在本仓存在，文件 `…` 不在）` |
| **3** | 删 `…/2026-06-01-v4-1865-rules-backflow.md` | **1** | 同一行 `:3241` 的第 ③ 条引用，形态相同 |
| **8** | 报实际 exit code + 孤儿行原文 | — | **即上表两行**（§18.8 漏登的那格） |

### 预注册对账 —— **5 HIT / 0 MISS**

| # | 预测 | 结果 |
|---|---|---|
| **T8-P1** | 删第一份 ⇒ exit ≠ 0，孤儿清单含该文件 | **HIT**（`EXIT=1`） |
| **T8-P2** | 引用方是 **`docs/internal/mockup-conventions.md:3241`**，⛔ 不是处方写的 `mockup-conventions.md:3237` | **HIT** —— 逐字 `docs/internal/mockup-conventions.md:3241` |
| **T8-P3** | 孤儿清单里的路径形态很可能是**相对路径原文**，⛔ 不必然是仓根路径 | **HIT** —— 逐字 `../_archive/retrospection/…` |
| **T8-P4** | 删第二份 ⇒ 同样 exit ≠ 0 | **HIT** |
| **T8-P5** | 贴实际 exit code + 孤儿行原文 | **HIT**（见上表） |

⚠️ **计划 §0.3 的预判全部命中**：处方逐字写的 `mockup-conventions.md:3237` 在 P3 上
**根本不存在那个路径**（真身 `docs/internal/…`，行号 **3241**）。
若照处方原文直接 `rm` 并按仓根路径去匹配输出，会拿到「没命中」而误判成「闸漏了」。

## 2. 判据 4 / 5 / 6 —— 不该拦的没拦（处方逐字说**这一侧更重要**）

### 2.1 🔴 先讲一次**失败的阳性对照** —— 它救下了三条假绿

第一次做阳性对照用的是**仓根形态**：
```
docs/_archive/retrospection/this-file-does-not-exist.md   ⇒ EXIT=0，不报
```
⚠️ **若不做这个对照，判据 4/5/6 的 `exit 0` 全部是空判** ——
无法区分「这三种形态确实不该报」与「我插入的行根本没进扫描面」。

换**显式相对形态**重做，同一插入位置、同一 code-span 语法、只换路径内容：
```
../_archive/retrospection/this-file-does-not-exist.md
⇒ EXIT=1，报在 docs/internal/mockup-conventions.md:3244（正是我插入的那行）
```
⇒ **插入位置确实在扫描面内** ⇒ 判据 4/5/6 的 `exit 0` **从此有意义**。

⇒ 这正是 `lab:N48` 主条：**判据返回 0 且 0 本身是有意义的结论时，必须先独立确认判定面非空。**

### 2.2 逐格结果（⛔ 逐格独立插入并还原，不三行一起插）

| # | 插入的 code-span | EXIT | 期望 | 输出提及该串 | 判 |
|---|---|---:|---:|---:|---|
| **4** | `MicroApps Console/docs/handoffs/x.md` | 0 | 0 | 0 | ✅ |
| **5a** | `Badge.figma.ts` | 0 | 0 | 0 | ✅ |
| **5b** | `x.md` | 0 | 0 | 0 | ✅ |
| **6** | `tion/2026-06-01-v4-1865-rules-backflow.md` | 0 | 0 | 0 | ✅ |

### 2.3 🔴 但这四格**全部在条件 ① 就被挡住** ⇒ 判据 6 没测到它想测的东西

四个形态**没有一个是 `./` 或 `../` 开头** ⇒ 条件 ① 直接失败 ⇒
**②「路径段边界匹配」这条规则在这四格里根本没被触发**。

⇒ 处方 3 判据 6 的意图是「**非段边界子串不得被误匹配**」（怕闸把 `tion/` 匹配到 `retrospection/`），
但它给的形态测不到 ② —— **是一格空判**。

**⇒ lab 补一格 `判据 6′`，用能打到 ② 的形态，并配阳性对照：**

| 插入的 code-span | ① 显式相对 | ② 段边界匹配 | EXIT | 判 |
|---|---|---|---:|---|
| `../tion/2026-06-01-v4-1865-rules-backflow.md` | ✅ 通过 | **失败** | **0** | ✅ **不报**（must-not-hit 成立） |
| `../retrospection/nope-does-not-exist.md`（阳性对照） | ✅ 通过 | ✅ 通过 | **1** | ✅ **报了** |

两者**唯一差异**是目录分量 `tion/` vs `retrospection/`
⇒ **② 的段边界匹配确实生效，且不会把 `tion/` 误匹配成 `retrospection/` 的后缀** ✅

⇒ **这是本轮对处方 3 的真增量**：原判据 6 是空判，`6′` 才真正验到那条规则，且通过。

⇒ **方法论（AGENTS §2.11 推论的反向）**：
**几个 must-not-hit 看起来在测不同的东西，可能全被同一条前置条件挡住 ⇒ 一格都没测到。**
⛔ 写 must-not-hit 时要问「**这个用例会走到我想测的那条规则吗**」，
而不只是「它的期望结果对不对」。判据 4/5/6 的期望结果全对，但三格测的是同一条规则。

## 3. 判据 7 —— 恢复后复跑

`git status` = **空** · `EXIT=0` · 覆盖面与 Task 1 基线 **diff 零差异**：

```
path 116 · fragment 35 · rule-ref 344 · script 54 · env 0 · retired-id 134 · code-span-path 84
TOTAL 767
```

⚠️ **`code-span-path` = 84** 就是处方 3 新增的那一类 ——
它是「判据 1：TOTAL 从 529 上升到 767」里可直接归因的一块。

⚠️ 取这段时我第一次用了 `grep -A6` ⇒ 只拿到 683（漏掉 `code-span-path 84` 与 `TOTAL` 两行），
**与 §18.7 第 4 例（`head -6` 截断当全集）同型**。改用节边界 `sed -n '/coverage/,/TOTAL/p'` 后正确。
⇒ **本轮第 8 例装置故障**，⛔ 计入。

## 4. 处方 3 判据 1–8 汇总

| # | 判据 | 本轮 |
|---|---|---|
| 1 | 未改动 ⇒ exit 0 且 TOTAL > 529 | ✅ 上轮已过（767），Task 1 复证 |
| 2 | 删文件 A ⇒ exit≠0 + 孤儿清单 + 指出引用方 | ✅ **本轮** |
| 3 | 删文件 B ⇒ exit≠0 | ✅ **本轮** |
| 4 | must-not-hit 外部仓路径 | ✅ **本轮**（但被 ① 挡，见 §2.3） |
| 5 | must-not-hit 无目录分量 | ✅ **本轮**（同上） |
| 6 | must-not-hit 非段边界 | ✅ **本轮** + **补 `6′` 才真正测到 ②** |
| 7 | 恢复后复跑回到判据 1 读数 | ✅ **本轮**（逐位零差异） |
| 8 | 报实际 exit code + 孤儿行原文 | ✅ **本轮**（§18.8 漏登那格） |

**⇒ 处方 3 的 8 条判据现已全部覆盖。**
