# entry 对自己的描述也是二手源（2026-08-03 · session R）

> **触发**：[[INFRA-F58]] 残余「元层 SoT 小型 dedup」六小项。起手 prompt 与 backlog entry 都把它判为「纯 `.md`，杠杆低」。
> **落点**：`85a4bf4f` / `32770296`。逐字过程在 [`_archive/superpowers/plans/2026-08-03-f58-sot-dedup-and-inventory-gate.md`](../../_archive/superpowers/plans/2026-08-03-f58-sot-dedup-and-inventory-gate.md)。
> **本文只写可迁移的东西** —— 具体改了什么不在这里。

---

## 1. 已知的「二手源」纪律有个没覆盖的面：entry 对**自己性质**的判定

仓库已有的纪律（memory `entry-restatement-is-secondhand`）说的是：entry 里写的**数字与因果**是二手的，动手前要自跑基线。本轮把它往前推了一格 —— **entry 里写的「这是小事 / 低杠杆 / 不阻塞」同样是二手的**，而这一层几乎从不被复核，因为它读起来像是**分类**而不是**声明**。

实证：D3 那条记「AGENTS M-number 3 处枚举」，归类「纯 .md，杠杆低」。对活源核完：

- **5 处**不是 3 处，**4 种不同内容**，全部对活源 stale；
- 五处**一致漏掉 11 个真实 section**，其中 `M48` 的标题字面就是「起手强制 Gate」；
- `Phase 0` 与 `Stage 0.5` 被漏在**不同**的版本里（而它们加 `Pre-Phase 0` 在活源里是三个独立 section）；
- 另一份目标文件的四处镜像都写 6 条，实际 **12** 条 —— 漏掉的一半从未进过任何清单。

**为什么归类会错**：写 entry 的人当时看到的是「几处文档写重了」这个**形状**，而危害取决于**哪条读取路径在消费它**，那是另一次调查。形状相同、危害差三个数量级。

**下次怎么做**：接手一条被标为低优先/低杠杆的 entry 时，除了重测数字，**额外问一句「这份东西是谁在什么路径上读」**。本例的答案把结论翻了过来 —— 这两份文件在 mockup 任务里是 mandatory **全读**（全读时清单漂移无害），受害的是同一份文件里 §Lazy Reference Loading 定义的 **scoped / 按需加载**：按任一份镜像清单挑，都会漏掉一半以上规则。

---

## 2. 二手数不分自己人

同一 session 内，我一边在计划文件里写「⚠️ entry 里的行号是二手数，一律按活源重新定位」，一边用 `grep -c '^## '` 数出目标文件有 26 个 H2 并把这个数写进了计划。真值是 **25** —— 第 858 行那个 `## User Journey Map` 落在 ```markdown 围栏里，是 report 模板不是 section。**是我随后写的闸的解析函数（它剥围栏）把我自己的数纠正的。**

**教训不是「grep 不可靠」**，是：**「要验的二手源」这个类别里包含我三十秒前自己产生的数**。给纪律加个可执行的判据：**凡是要写进产出物的计数，用最终会消费它的那段代码算，别用手边最快的命令算。** 本例里两者的差别正好是「剥不剥代码围栏」——而这恰恰是闸必须处理、grep 不会处理的那件事。

---

## 3. 新闸的假阳该收窄谓词，不该开豁免

首版判据在现状上抓出 13 条，其中 **3 条是假阳**：

| 假阳形态 | 为什么是假阳 |
|---|---|
| `Read <file> § A + § B + § C + § D` | **prescriptive 读取范围**（去读这几节），不是内容复述。删掉会丢真信息 |
| §反模式 里举例的 `../foo.md` + §实证 的两个路径 | 论述里散落的路径被「framing 词往下 N 行凑够 3 个」凑成一条「链路」 |
| 散文指针「起手第一份必读 X，然后读 Y」+ 15 行后一条无关 bullet | 同上 |

**当时有两条路**：给三处加具名带日期的豁免（仓库已有 shrink-only 豁免范式，合规），或者回去改谓词。选了后者，理由是**豁免表的正当场景是「抓到存量缺陷但修法被别的门卡住」，不是「判据没想清楚」**。新闸落地第一天就带一张豁免表，等于把判据的债务写成配置。

收窄后的两条判据都指向同一个区分：**引用 vs 复述**。`§X` 是指向那个文件某一节的引用（读者会跟着跳过去）；裸枚举是复述那个文件有哪些内容（会各自 stale）。链路是**一串路径列表**；指针是散文里提到的路径。

⚠️ **两条都如实登记了自己是形态代理不是语义判定** —— 每项都加 `§` 就能规避。闸拦的是**复述形态的自然漂移**，不是恶意规避；这句话写进了脚本头注释，免得后人把它当强保证。

---

## 4. 「闸漏了」之前先读它的覆盖面声明

修 C1 时发现一条悬空引用（`docs/internal/retrospection/…` 的目标已被移到 `docs/_archive/`），第一反应是「`audit:stale-anchors` 漏了」，并且已经准备把它当 finding 报出去。读源码发现那里明写着：

> 反引号「文件路径」**刻意不校验** —— basename 提及 / 外部仓路径 / 模式串混杂、无可靠信号分离，误报率过高；导航式文件锚点由 markdown 链接覆盖。

即：**声明过的覆盖边界，不是漏。** 正确动作也随之变了 —— 不是去改闸，而是**把那条引用从反引号裸路径改写成 markdown 链接**，让它落进闸已有的覆盖面。

**可迁移的判据**：说某条闸「没抓到 X」之前，先在它的源码/输出里找覆盖面声明。本仓库的闸普遍会自印覆盖面（`audit:layout-tokens` / `smoke:peer-floor` / 本轮新闸都是），那些话是给这一刻读的。

---

## 5. 顺带暴露的一类结构性盲区：未决项藏在 `docs/internal/`

`docs/internal/runtime-additions.md` 的标题写着「Phase 6.4 **待实现**」（实际发于 v0.3.0），里面挂着一条 `Input.XL（待决）· TODO: 待用户确认`。实测**早已决已发，且落地形态与提案不同**（最终 `'M' | 'L' | 'XL'` 三档大写，提案是 `s|m|l|xl` 四档小写）。而 STATUS §等 owner 拍板 与 backlog §Active **两处零命中** —— 如果有人当真按它去问 owner，问的是一个 v0.x 就落地的东西。

没被 `audit:deliverable-open-questions`（触发器 P 的机械化）抓到的原因是它的覆盖面 = handoff-marked 与 `docs/handoffs/` 下的 `.md`，**不含 `docs/internal/`**。

**这条没有当场扩闸**（扩覆盖面会把大量历史决策档案里的「待定/TODO」字样一并点亮，是另一次带 FP 评估的工作），只把这份文件的措辞改准并把盲区写在原地。**留给后人的判据**：`docs/internal/` 下带「待决 / 待确认 / TODO」的行，在被当成待办之前先核活源 —— 那里没有闸。

---

## 关联

- 真源纪律：[`AGENTS.md`](../../../AGENTS.md) 硬规则 #10（结论必须对活源验证）· [`docs/meta-rules.md`](../../meta-rules.md) §1 真源单一
- 同型前例：`2026-07-31-probes-that-cannot-see-their-own-blind-spot`（探针测不出自己的盲区）
- 本轮新闸：`pnpm audit:rule-inventory`（S1–S6，覆盖面每次自印）
