# 预注册 —— D 格：`product-pattern-index.json` 移出影响审计

> **跑前落盘，⛔ 事后不改假设**（照 `919e7ed` / `c7e6e1c` 纪律）。
> 本文件在读任何一个被验脚本的**正文**之前写就；下面 §2「起手实测」逐条登记了写这份预注册**之前**
> 我已经看到的东西 —— 那些**不算**本格的验证结果，⛔ 不得事后当成「假设被证实」。

- **格位**：第二轮 D 格（承 `docs/round2-status.md` §21.6 第 3 条 / 报告 §9 第 3 条「只登记未追」）
- **日期**：2026-08-26
- **成本承诺**：**0 个新 run**、⛔ 不 build、⛔ 不碰四个 pin 的工作树
- **起始不变式**：四个 pin `HEAD` = `339a72bf` / `4a68e02d` / `71ac2711` / `c1db57b8`，`dirty` = 0 / 0 / 0 / 0；
  golden set v1 @ `c1db57b8` **`EXIT=0`**（6 条引文逐字命中 · `identical ×3` · 控制 9/9）

---

## 1. 被验命题

§21.6 第 3 条逐字要追的是：

> `product-pattern-index.json`（桶二移出项，GT-002 2/5 run 读过 + 7 个脚本硬编码）**只登记未追**
> …… ⛔ 未查**移出会不会同时打断 AI 侧与发布链两条路**。

⇒ **命题 P**：把 `docs/internal/_generated/product-pattern-index.json` 移出 docs 树，
会**同时**打断 (a) **AI 侧**（模型在 run 里读到 / 检索到它）与 (b) **发布链**（脚本硬编码它的路径）两条路。

⚠️ **本格是事前审计**：该文件在 `c1db57b8` 上**仍在场**（见 §2 第 3 条）⇒ 桶二这一项 DS 尚未执行
⇒ 本格判的是「**移出会不会断**」，⛔ 不是「移出之后断没断」。
（同 `lab:N50` 推论二：能写成事前的，⛔ 别写成事后。）

---

## 2. 起手实测（**非假设** —— 写预注册之前已经看到的，如实登记）

1. **处方 §2 桶二那一行自己数不平。** 逐字「**7 个脚本**硬编码了路径」，紧跟着列了 **8 个**脚本名：
   `release.mjs`、`ds-health-delta.mjs`、`ds-health-scan-consumers.mjs`、`ds-health-scan-mockups.mjs`、
   `pattern-index-lookup.mjs`、`a11y-contrast-inspector.mjs`、`a11y-token-contrast.mjs`、
   `f129-rootradius-silent-gap-probe.mjs`。⇒ 7 ≠ 8，登记面缺陷（§21.5 第 3/4 条同族）。
2. **那一行的主语是整批，不是单个文件。** 它逐字管的是 `docs/internal/_generated/*.json` `*.jsonl`
   **整批**。⇒ §21.6 第 3 条把「7 个脚本硬编码」写成 `product-pattern-index.json` 的属性，
   是**把整批的数挂到了单文件上**。⛔ 本格不得沿用这个挂法。
3. **该文件在 `c1db57b8` 上仍存在**：`docs/internal/_generated/product-pattern-index.json`，
   **83,539 字节 / 2,389 行**。⇒ 桶二未执行，本格是事前审计。
4. **文件级粗筛（`grep -l 'product-pattern-index'`，pin `c1db57b8`，排 `node_modules`/`.git`）= 12 个文件**：
   `AGENTS.md` · `docs/internal/STATUS-CHANGELOG.md` · 该 json 自身 · `docs/internal/ds-health-dimensions.md` ·
   `docs/internal/ds-health-mockup-targets.json` · `docs/superpowers/specs/2026-08-13-product-pattern-index-proposal.md` ·
   `scripts/ds-health-delta.mjs` · `scripts/ds-health-scan-mockups.mjs` · `scripts/lib/product-pattern-index.mjs` ·
   `scripts/pattern-index-lookup.mjs` · `scripts/release.mjs` · `tests/ProductPatternIndex.test.ts`
   ⚠️ **这是文件级 `grep -l`，⛔ 不区分「硬编码路径」与「文档提及」** —— 精确分类是本格的活。
   🔴 **处方点名的 8 个里有 4 个在这份粗筛里缺席**：`ds-health-scan-consumers.mjs`、
   `a11y-contrast-inspector.mjs`、`a11y-token-contrast.mjs`、`f129-rootradius-silent-gap-probe.mjs`。
5. **GT-002 五个 run 的 transcript 全在场**：`r007`–`r011`，389–576 行 / 1.2–1.5 MB 各。
6. **既有量具 `delete-surface-coverage.mjs` 把桶二按目录纳入**：`B2_DIRS = ['docs/_archive/superpowers/plans',
   'docs/internal/_generated']`，且 `if (!existsSync(...)) die('桶二目录不在场')` ⇒ fail-closed 已在。

### 2.1 复用既有量具前，先对它的「覆盖边界」（`lab:N50` 推论一纪律）

`metrics/delete-surface-coverage.mjs` 头注释 6 条边界逐条对本格被验动作：

| 边界 | 逐字内容 | 对本格是否够用 |
|---|---|---|
| ① | 检索面是本器新增第四面，`context-manifest.mjs` 不采 | ✅ 够用，本格要的就是四面 |
| ② | 检索面用**严口径**（行首 + `:` 或行尾） | ✅ 够用，但结论须带「严口径」限定词 |
| ③ | 检索面 = 路径进上下文，**⛔ 不等于模型用了它** | ⚠️ **约束 H4 的读法**，见 H4 判定规则 |
| ④ | 清单两口径必须显式选；`exact` 依赖归档树同构 | ✅ 桶二走目录级，不吃归档树同构 |
| ⑤ | 频次谱不是噪声地板 | ✅ 本格不立地板，不引用它当地板 |
| ⑥ | **本器不判「该不该删」，只报「在哪些面上被碰到过」** | 🔴 **不够用** —— 它答不了「**通道类型**」（Read 文件 vs Bash 跑 CLI），而 H4/H5 的核心正是通道类型 ⇒ **必须 raw transcript 直核补上**，⛔ 不能只拿它的面命中数交差 |

⇒ **量具分工定死**：面命中数（哪个面、几个 run）复用既有量具；**通道类型**走 transcript 直核；
**脚本侧依赖**走 pin 上静态读码。三者⛔ 不并池成一个数。

---

## 3. 预注册假设与判定规则

> 每条都写明：**判定面** · **什么读数算 HIT / MISS / 推翻** · **我现在的预测**。
> ⛔ 事后不许改这一节；订正只能以「§X 事后订正」另段追加。

### H1 —— 专门引用该文件的脚本子集**严格小于** 8

- **判定面**：pin `c1db57b8` 上 `scripts/` + `tests/` 里对该文件路径 / 文件名的引用，逐处读码分类为
  ① 直接写死路径字符串 · ② 经 `scripts/lib/` 间接 · ③ 只提及不读（注释/文案）。
- **HIT**：能给出精确分类表，且「真的会因移出而坏掉」的脚本数 **< 8**。
- **MISS**：≥ 8，即处方那个数对得上（则 §2 第 1/2 条只是措辞问题，不是口径问题）。
- **预测**：**HIT**。预测真受影响脚本 ≤ 5，且其中 `scripts/lib/product-pattern-index.mjs` 是间接层、
  处方没点名它。

### H2 —— 路径真源是**单点**，不是每个脚本各写死一份

- **判定面**：路径字面量 `docs/internal/_generated/product-pattern-index.json`（及等价拼接）
  在 pin 上的**独立出现处数**。
- **HIT**：≤ 2 处 ⇒ 移出只需改 ≤ 2 处 ⇒ **处方高估了「打断发布链」的改动成本**。
- **MISS**：≥ 5 处各自写死 ⇒ 处方的担忧成立且成本如其所述。
- **预测**：**HIT**（`lib/product-pattern-index.mjs` 为唯一真源）。
- ⚠️ **⛔ 预登记一条会推翻我自己的可能**：`lib/` 那个文件可能只是**类型/校验**而非路径真源，
  路径仍散落在各 CLI 里 ⇒ 那 H2 是 MISS。两种机制都预登记，不事后择一。

### H3 —— 发布链是**硬依赖**（缺文件即抛）还是**软依赖**（静默降级）

- **判定面**：`scripts/release.mjs` 里该引用所在的控制流 —— 有无 `existsSync` 守卫 / `try-catch` /
  可选分支；以及它是否在 `release` 的**必经**路径上。
- **HIT-硬**：无守卫、在必经路径 ⇒ 移出后发布**当场断**。
- **HIT-软**：有守卫或在可选分支 ⇒ 发布能过，但产物少一块（**这更危险**：`lab:E48` 家族的静默降级）。
- **推翻**：`release.mjs` 那处引用其实只是注释/文案 ⇒ 「发布链」这条路根本不存在。
- **预测**：不预测方向，**两种都预登记**（我尚未读该文件正文）。
- ⛔ **不跑 `pnpm release --dry-run`**：处方 §3 步骤 2 建议过它，但本格承诺不碰 pin 工作树
  （`lab:E48`：`dist/` 会脏 pin）。⇒ 结论一律带限定词「**静态读码所得，未实跑**」，
  ⛔ 不得写成「实测发布链会断」。若中途认定必须实跑，**先单独证明它只读、不写盘**，并另立一段登记。

### H4 —— AI 侧的**碰触通道**是哪一种

- **判定面**：`runs/r007`–`r011` 的 raw transcript，逐条 tool_use / tool_result。
- 三种通道互斥分类：
  (a) 模型**直接 `Read`** 该 json（实读面）
  (b) 模型 **`Bash` 跑 `pattern-index-lookup.mjs`** 等 CLI 间接取（**既非实读面也非检索面**）
  (c) 仅 **`Grep`/`Glob` 命中路径**（检索面，边界 ③：⛔ 不等于模型用了它）
- **HIT**：三步链可核（命中 → 动作 → 返回），且能定出是 (a)/(b)/(c) 中的哪个（可并存，各报 run 数）。
- **MISS**：`2/5` 这个既有登记值核不出来 ⇒ 那 §21.6 第 3 条的前提本身是陈旧值（`lab:E49` 同族）。
- **预测**：**(a) 分片读 + (c)**，⛔ 预测 (b) **不出现**（run 是 mockup 生成任务，不太会去跑 DS 脚本）。
- ⚠️ 「分片」的判定：`coveredBytes < bytes`（该 json 83,539 B ⇒ 整文件读会是很大一笔上下文成本）。
- **阳性对照（`§2.15` 推论三 / `lab:N48`，⛔ 不可省）**：同一检测器须在**至少一个** run 上返回非 0、
  在**至少一个** run 上返回 0 ⇒ 才证 0 是读数不是装置故障。若五个 run 全 0，⛔ 先证检测器活着。

### H5 —— 「同时打断两条路」是否成立，以及**是不是同一个断点**（本格核心判据）

- **判定面**：H3 与 H4 的结果做交叉。
- 四象限，预注册全部四种读法：

| AI 侧通道 | 发布链 | ⇒ 判定 |
|---|---|---|
| (a)/(c) 靠 docs 路径 | 硬依赖 | **P 成立**，且两条路**共用同一个断点**（那个路径）⇒ 修法是**一处**，⛔ 成本不是两份 |
| (a)/(c) 靠 docs 路径 | 软依赖 | P 半成立 —— AI 侧真断、发布链静默降级 ⇒ **更该管的是静默那一半** |
| (b) 靠 CLI | 硬/软 | **P 不成立** —— 改脚本内路径常量即可，**AI 侧不受移出影响** |
| 都不在 | — | P 空判 ⇒ §21.6 第 3 条的担忧无载体 |

- **预测**：第 1 行（P 成立、单一断点、修法一处）。
- ⚠️ ⛔ 无论落哪一象限，**本格只报「会不会断」与「断在哪」，⛔ 不替 DS 选修法**（§8 单向纪律，
  同 `lab:N49` / `lab:N50` 两格）。

### H6 —— 移出后 AI 侧有无**旁路**仍能拿到同一信息

- **判定面**：pin 上 `AGENTS.md` / `STATUS-CHANGELOG.md` / `ds-health-dimensions.md` 三处提及的上下文，
  以及 `pattern-index-lookup.mjs` 移出后是否仍可跑。
- **HIT**：存在旁路（模型仍能知道「有这么个索引」或仍能取到内容）⇒ 「打断 AI 侧」的**严重度被下调**。
- **MISS**：无旁路 ⇒ 移出即彻底失联。
- **预测**：**HIT**（`AGENTS.md` 有提及 ⇒ 仍知其存在），但**取不到内容** ⇒ 严重度介于两者之间。

---

## 4. ⛔ 本格明确不做（预先划界，防止范围漂移）

1. ⛔ **不跑任何新 run**（承诺 0 个）。
2. ⛔ **不 build、不跑 `pnpm release`（含 `--dry-run`）**，除非先单独证明只读并另段登记（`lab:E48`）。
3. ⛔ **不替 DS 选修法**，也不催严/宽口径（DS 侧至今零处提及）。
4. ⛔ **不判「该不该移出」** —— 只判「移出会断什么、断在哪、修法涉及几处」（同量具边界 ⑥）。
5. ⛔ **不把三个数据源并池**：面命中数（量具）/ 通道类型（transcript）/ 脚本依赖（静态读码）分开报。
6. ⛔ **不越读检索面**（边界 ③：路径进上下文 ≠ 模型用了它）。
7. ⛔ **静态读码的数与实跑的数同值时，引用必须带限定词**（本格几乎全是静态 ⇒ 通篇带）。

## 5. 收尾必交

- 报告 `reports/2026-08-26-round2-patternindex.md`：H1–H6 逐条 HIT/MISS/推翻 + 与本预注册的对账表
- `docs/round2-status.md` §22
- 不变式表（四个 pin 起止 `dirty`/`HEAD` · 新 run 数 · build 状态 · golden set `EXIT`）
- **⛔ 未覆盖清单**（如实登记；且下一格引用它前须先核它还成不成立 —— `lab:E49`）
- 若查出新的通用失效形态 ⇒ `AGENTS.md` §2 新条目；⛔ 无新形态就不硬凑
