# 预注册 —— E 格：桶二**剩余** `_generated` 产物移出影响 + 边界件 `ds-health-mockup-targets.json` 归属

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

- **格位**：第二轮 E 格（承 `docs/round2-status.md` §22.7 第 5/6 条 = 报告 §10 第 5/6 条）
- **日期**：2026-08-26
- **成本承诺**：**0 个新 run** · ⛔ 不 build · ⛔ 不跑 `pnpm release`（含 `--dry-run`） · ⛔ 不碰四个 pin 的工作树
- **起始不变式**：四个 pin `HEAD` = `339a72bf` / `4a68e02d` / `71ac2711` / `c1db57b8`，`dirty` = 0/0/0/0；
  golden set v1 @ `c1db57b8` **真实 `EXIT=0`**（⛔ 不带管道单跑取得，`lab:N47`；6 条引文逐字命中 ·
  `identical ×3` · 控制 9/9）

---

## 1. 被验命题

§22.7 第 5/6 条逐字要追的是：

> 5. 🔴 **另外 5 个 `_generated` 产物的移出影响未查** —— 尤其 `ds-health-history.jsonl`
>    （处方 §2 逐字「DIM-U12 本体」、append-only），**被 4 个脚本硬编码，风险面比 pattern-index 更大**。
> 6. `docs/internal/ds-health-mockup-targets.json` 不在 `_generated/` 下却在 `CRITERION_FILES` 里
>    ⇒ 是否属桶二 ⛔ 本格未判。

⇒ **命题 Q1**：桶二口径下**剩余**的 `_generated` json/jsonl 产物，各自移出 docs 树的**失效形态**，
与 D 格对 `product-pattern-index.json` 算出的那一套（① 不当场断 / ② 三重静默 / ③ 被写回 / ④ 延迟一周期）
**是不是同一套**。
⇒ **命题 Q2**：`ds-health-mockup-targets.json` 是否落在桶二处置口径内。

⚠️ **本格仍是事前审计**：DS HEAD `19ff2888` 上 `git ls-files` 仍跟踪全部 8 个 `_generated` 文件
⇒ 桶二**至今未执行**（§2 第 5 条）。⛔ 判的是「移出会不会断」，不是「移出之后断没断」。

⚠️ **⛔ 本格不判该不该移出、不替 DS 选修法**（承 `lab:N49` / `lab:N50` / `lab:N51` 三格 §8 单向纪律）。

---

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

### 2.0 三行块前提核验（AGENTS §2.18 推论二 / DS 触发器 S 格式）

**① 承接项本身的数**

```
登记记的：  「另外 5 个 _generated 产物的移出影响未查 …… 被 4 个脚本硬编码」
现取的：    git ls-files 'docs/internal/_generated/*' @c1db57b8 → 8 个 = 4 份 .md + 4 份 json/jsonl。
            桶二口径（处方 §2 逐字 *.json *.jsonl）⇒ 除 pattern-index 外剩【3 个】。
            含 .md 全口径则是 7 个。5 匹配不上任何一种口径。
            git grep 'ds-health-history' → 硬编码该路径【字面量】的确是 4 个（见下第 2 条）。
前提还成不成立：核心成立、【数错一半】。「4 个脚本」✅；「另外 5 个产物」❌ ——
            桶二口径应为 3，全口径应为 7。
```

⚠️ 那个 `5` 恰好等于处方重核 ① 逐字「其余 **5 个**（**脚本**）管的是别的产物」的数
⇒ 形态与 `lab:E50`（主语窄化）一致：**主语从脚本变成了产物**。
⛔ **本格不断言搬运路径**（无直接证据），只登记「两个数相同 + 实测产物数是 3」这个事实。
🔴 若成立，这是 D 格在 §22.5 第 1 条**刚抓完主语错之后、在同一份报告的未覆盖清单里又犯一次**。

**② D 格自己的收尾自证（不在候选清单里，顺带核出）**

```
登记记的：  §22.6a / 报告 §9.1 逐字「pin c1db57b8 落后 3 个 commit
            （cee7265c → 1622b261 → 19ff2888）」+ 表末行「3 个新 commit 碰过的判定面文件只有 AGENTS.md」
现取的：    git rev-list --count c1db57b8..HEAD = 【19】；merge-base --is-ancestor = YES（直系祖先）；
            cee7265c^ = 6d97866a，⛔ 不是 c1db57b8
前提还成不成立：【结论成立、证据窗口错】—— D 格只扫了 19 个里最新的 3 个。
            按完整 19-commit 窗口重扫六个判定面文件：只有 2 个 commit 碰过 AGENTS.md
            （6b8ad767 / 59f0c066），三处路径脚本 + release.mjs 一次都没被碰；
            DS HEAD 上 :58 / :79 / :224 / :226 / AGENTS.md:139 逐字复核全部仍在
            ⇒ §22.6a 的判定不变，错的只是「3」这个数与它蕴含的扫描窗口。
```

### 2.1 其余起手读数

1. **`_generated` 实际清单（pin `c1db57b8`，`git ls-files`）= 8 个**：
   `a11y-contrast-report.md` · `ds-health-component-origin-cache.json`（61,206 B）·
   `ds-health-history.jsonl`（27,934 B）· `f129-rootradius-silent-gap.probe.json`（174,836 B）·
   `foreign-library-cleanup.md` · `product-pattern-index.json`（83,539 B）·
   `react-render-verification-report.md` · `render-verification-report.md`。
   ⇒ **本格被验对象 = 除 pattern-index 外的 3 个 json/jsonl**。
2. **`ds-health-history.jsonl` 的路径字面量出现在 4 处**：
   `ds-health-delta.mjs:37` · `ds-health-scan-consumers.mjs:40` · `ds-health-scan-mockups.mjs:55` ·
   `release.mjs:222`。
   🔴 **处方重核 ① 只列了前两个**（`delta` / `scan-consumers`），**漏了 `scan-mockups:55`
   （它同时是 pattern-index 的写入方）与 `release.mjs:222`** ⇒ 登记面缺陷，本格顺带订正。
3. **`release.mjs` 的 `healthArtifacts` 数组（`:221–226`）共 4 个成员**：
   `ds-health-history.jsonl` · `ds-health-component-origin-cache.json` · `product-pattern-index.json` ·
   `foreign-library-cleanup.md`，尾随 `.filter((p) => existsSync(p))`（`:226`）。
   ⇒ **`f129-rootradius-silent-gap.probe.json` 不在这个数组里**（已知，⛔ 不算本格预测）。
4. **`CRITERION_FILES`（`ds-health-delta.mjs:49–56`）共 6 项**，第 6 项逐字
   `'docs/internal/ds-health-mockup-targets.json'`；该文件被 git 跟踪，路径在 `docs/internal/`
   **而非 `_generated/`**；`scan-mockups.mjs:20` 逐字称它「**人工维护**」⇒ 它**不是派生产物**。
5. **DS HEAD = `19ff2888`**（未再漂），`git ls-files` 仍跟踪全部 8 个 `_generated` 文件
   ⇒ **桶二至今未执行**。DS 既存 dirty 两项（`vocabulary.md`、`backlog-owner-decisions.html`）⛔ 未碰。

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

本格**默认不新增量具**。若要报「AI 侧碰触面」，沿用 D 格定死的三方分工，⛔ 不并池：

| 用途 | 走哪条 | 边界 |
|---|---|---|
| 面命中数（哪个面、几个 run） | `context-manifest.json` / `delete-surface-coverage.mjs` | ⚠️ 其边界 ⑥ 答不了**通道类型**；且 D 格 §22.4 已证它**采不到第四面**（定向 `Grep` 进正文，路径在 `tool_use.input.path`）⇒ 引用它的数必须带「**已知漏第四面**」限定词 |
| 通道类型 | raw transcript 直核 | 只能逐条读，⛔ 无自动器 |
| 脚本侧依赖 | pin 上静态读码 | ⛔ 不是实跑，结论必带「静态读码所得」 |

⇒ ⛔ **本格不重算 C 格那张 52 文件覆盖表**（那是改 C 格量具，需单独裁）。

---

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

> 每条写明：**判定面** · **HIT / MISS / 推翻 的完整分区** · **我现在的预测**。
> 🔴 **判定规则必须无空档** —— D 格 H2 就是因为只定义了「≤2=HIT / ≥5=MISS」、实测落 3
> 而掉进空档。本节每条的分区都必须覆盖全部可能取值。
> ⛔ 事后不许改这一节；订正只能以「§X 事后订正」另段追加。

### H1 —— append-only 类的失效形态与快照类**不同**（本格核心判据）

- **判定面**：对 `ds-health-history.jsonl` 逐个问 D 格那四问（① 当场断 / ② 静默降级 /
  ③ 被写回 / ④ 延迟一周期），每问各给逐字证据；再与 D 格对 pattern-index 的四问结果**逐格比对**。
- **读数**：四格中答案**不同**的格数 `k ∈ {0,1,2,3,4}`（分区无空档）。
  - `k = 0` ⇒ **MISS**：两类失效形态完全相同，D 格结论可整套照抄。
  - `k ≥ 1` ⇒ **HIT**：⛔ 不能照抄，逐产物必须各算一遍。
- **预测**：**HIT，`k ≥ 1`，且差异出在第 ② 格**。理由：快照类丢历史基线可由下一次全量扫描重建，
  而 append-only 时间序列一旦丢，**过去的点无法重算**（DIM-U12 的历史不可回溯）。
- ⚠️ **⛔ 预登记一条会推翻我自己的机制**：若 `scan-mockups` 对 `HISTORY` 的写入用的是与
  `:419` 同一套 `existsSync(…) ? … : 默认值` 模式，且 `--write` 只 append 不读旧内容，
  则 ② 的**机制**可能与快照类相同（都是静默），差异退化成「后果可逆性」而非「失效形态」
  ⇒ 那 `k` 可能是 0，H1 MISS。两种都预登记，⛔ 不事后择一。

### H2 —— 不在 `healthArtifacts` 里的产物在发布链上**没有**其它接触点

- **判定面**：`f129-rootradius-silent-gap.probe.json` 在 pin 上 `scripts/` + CI 配置里的全部出现处，
  逐处读码分类为 ① 写入 · ② 读取 · ③ `git add` / preflight · ④ 只提及不读。
- **分区**（按「发布链上的接触点数 `m`」，无空档）：
  - `m = 0` ⇒ **HIT**：桶二对它只剩 AI 侧一条路，发布链无关。
  - `m ≥ 1` ⇒ **MISS**：`healthArtifacts` 不是发布链接触面的全集 ⇒ 🔴 **D 格的「三处路径 =
    最小改动集」那个方法本身要加一步**（只查 `healthArtifacts` 会漏）。
- **预测**：**HIT（`m = 0`）**。
- ⚠️ MISS 比 HIT 更有价值 —— 它会推翻 D 格找最小改动集的**方法**，⛔ 不是只推翻一个数。

### H3 —— `ds-health-component-origin-cache.json` 是缓存 ⇒ 移出后**可自愈**

- **判定面**：该文件读写方的控制流（缺文件时是重算重建，还是取默认值继续 / 抛错）。
- **分区**（无空档）：
  - **HIT-自愈-零代价**：缺文件 ⇒ 自动重算重建，且重算不依赖外部凭据/网络。
  - **HIT-自愈-有代价**：缺文件 ⇒ 重算，但重算要打 Figma 网络 / 要凭据 / 显著耗时
    ⇒ 在无凭据环境（CI）里会变成另一种失效。
  - **HIT-不自愈**：缺文件 ⇒ 静默取默认值或数据永久丢失。
  - **推翻**：它根本不是缓存（名字骗人）。
- **预测**：**HIT-自愈-有代价**。理由：`release.mjs:170` 逐字提到 step 1e「需要 Figma 凭据与消费仓在场」
  ⇒ origin 类数据大概率来自 Figma 侧。
- ⚠️ **⛔ 预登记推翻机制**：若它只是本地 AST/文件扫描的记忆化，则是「自愈-零代价」，我预测错。

### H4 —— `ds-health-mockup-targets.json` 的桶二归属，**处方口径答不了**

- **判定面**：桶二标题逐字「**数据不是文档 → 移出 docs 树，配置跟改**」这个口径，
  与该文件的实际性质（人工维护的**输入清单** vs 脚本产出的**派生产物**）。
- **分区**（无空档）：
  - **A-属桶二**：处方口径逐字覆盖它，或其性质与 `_generated` 那批一致。
  - **B-不属桶二**：处方口径逐字只写 `_generated/*`，且其性质是人工输入 ⇒ 明确排除。
  - **C-口径缺口**：处方口径**没定义**这个边界 ⇒ ⛔ 既不能说属、也不能说不属，
    只能登记「口径未覆盖」并把两种归法各自的后果算出来交给 DS。
- **预测**：**C-口径缺口**，且倾向指出「按性质它更像人工输入而非派生产物」。
  ⛔ **不替 DS 裁**（§8 单向纪律）。
- ⚠️ 若落 A 或 B，说明处方口径其实是自洽的，我预测错。

### H5 —— 「必须同 commit 改」的要求对 `history.jsonl` **比 pattern-index 更强**

- **判定面**：4 处路径字面量（`delta:37` / `scan-consumers:40` / `scan-mockups:55` / `release:222`）
  各自的角色，以及「只改其中一部分」时各自的后果是否**不可逆**。
- **读数**：4 处中「漏改会产生**不可逆**后果（数据永久丢失 / 写回 docs 树）」的处数 `n ∈ {0,1,2,3,4}`。
  - `n = 0` ⇒ **MISS**：漏改只导致可恢复的降级 ⇒ 同步性要求**不比** pattern-index 强。
  - `n = 1` ⇒ **HIT-持平**（pattern-index 侧不可逆的是 `:58` 一处）。
  - `n ≥ 2` ⇒ **HIT-更强**。
- **预测**：**`n ≥ 2`**（`scan-mockups:55` 与 `scan-consumers:40` 都可能 append 写入）。
- ⚠️ 推翻机制：若 append 一律走 `appendFileSync` 且缺文件时自动创建，则「漏改 ⇒ 在旧路径继续
  append」是**可逆**的（把文件搬回去即可）⇒ `n` 可能远小于预测。

### H6 —— 这 3 个产物在 15 个既有 run 里的 AI 侧碰触面**远小于** pattern-index

- **判定面**：既有 15 个 run 的 `context-manifest.json`（面命中数）+ 必要时 raw transcript 直核（通道类型）。
- **读数**：碰过的 run 数 `r`，逐产物各一个（分区无空档）：`r = 0` / `1 ≤ r ≤ 4` / `r ≥ 5`。
  - pattern-index 的对照值：实读面 **2 个 run**（`r007` / `r009`）。
  - **HIT**：3 个产物的 `r` **全部 ≤ 2**。
  - **MISS**：任一产物 `r ≥ 3`。
- **预测**：**HIT** —— 预测 `history.jsonl` `r ∈ {0,1}`、`origin-cache` `r = 0`、`f129 probe` `r = 0`。
- ⚠️ **⛔ 已知漏面**：D 格 §22.4 已证既有量具**采不到第四面**（定向 `Grep` 进正文）
  ⇒ 任何用 `context-manifest` 得到的 `r` 都是**下界**，报数必须带「**下界，已知漏第四面**」限定词。
  ⇒ 若某产物 `r = 0`，⛔ 不得写成「没有 run 碰过它」，只能写「在能采到的三面上是 0」。
  这条同时是 `lab:N48`（判据返回 0/空集先证判定面非空）的适用点。

---

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

1. ⛔ **不重算 C 格那张 52 文件覆盖表** —— 那是改 C 格量具，需单独裁（§22.7 第 1 条原样留着）。
2. ⛔ **不查 pattern-index 的热区行 1795–2124**（§22.7 第 3 条原样留着）。
3. ⛔ **不跑 `pnpm release`（含 `--dry-run`）、不 `pnpm build`**（`lab:E48`）。
4. ⛔ **不改 `provenance.pinnedSha` 去跟新 pin**（`lab:E46`）；⛔ 不动四个 pin 的工作树。
5. ⛔ **不产新 run**（承诺 0 个）。
6. ⛔ **不判「该不该移出」、不替 DS 选修法、不催严/宽口径**。
7. ⛔ **不追 `squeeze.readButNotDeclared`**（§22.7 第 4 条原样留着）。
8. ⛔ **不碰 DS 主仓工作树**（含它那两项既存 dirty）。

---

## 5. 收尾必交

1. **逐产物四问表**（3 个产物 × 4 问），每格逐字证据 + 行号；⛔ 不合并成「和 pattern-index 一样」。
2. **与本预注册逐条对账**（H1–H6），⛔ 事后不改假设；落判定空档要**如实说落了空档**。
3. **中途判断反转逐条交出**（D 格 §7.1 那个做法，本格照办）。
4. **两条登记面缺陷订正落盘**：`另外 5 个产物 → 3 个`（桶二口径）· `落后 3 个 commit → 19 个`
   （窗口已按 19 重扫，判定不变）。另订正处方重核 ① 漏列 `history.jsonl` 的两个引用方。
5. **收尾自证**：结论在 **DS 当前 HEAD** 上是否仍成立（⛔ 不靠 pin 一面之词）——
   且这次**扫完整窗口**，⛔ 不重蹈只扫最近 3 个 commit。
6. **起止不变式**：四个 pin `dirty=0`、`HEAD` 未变；golden set 若再跑，⛔ 不带管道单跑取退出码。
7. **本格未覆盖清单**，如实登记，⛔ 不算已验。
