# Proposal · 归档三分法处置 — tvu-ds @ 71ac2711

- **执行状态**：🟡 **分项各有下场，⛔ 不是单一状态** —— 逐项真源 = 本文件下方 `:26-27` 的 I 格订正块 + 那张**双栏**表（§2 桶二整条线 🔴 已被 DS 裁定不做 · §3 第 2/3/4/6 步 🔴 已被裁定不执行 · §3 第 5 步 ✅ DS 已执行 · §5 验收表第 1 行 ⛔ 已作废 `lab:E33`）。
  - **@`d07be8e9` 重取（2026-09-11 §30）**：⏳ **未逐项重取** —— 本格只补栏位。⚠️ **降级损失的是【分项状态的时效】，⛔ 不是【分项清单本身】**（`AGENTS §2.27`）⇒ 那张双栏表的**条目**仍完整可用，但每一条的「已裁定 / 已执行」都取自 `01db…`/`c1db57b8` 时代，⛔ 引用前必须自己重取。
  - ~~🔴 **本文件挂着一条【已到期 10 天】的重开条件，本格现取确认它仍在原位**~~（DS `scripts/audit-doc-shape.mjs:29-40`@`d07be8e9`，回落线 `STATUS ≤ 8.1` · `backlog ≤ 14.8` KB/工作日）⇒ 🟢 **2026-09-11（§31）已复核并关闭**，⛔ 上面那句不再是待做项（留痕不删）。
  - 🟢 **复核结论（pin `30c2ab86`，执行者 = lab 自己，⛔ 不是 DS）**：**未达成 ⇒ ⛔ 不给 backlog 上闸。**
    口径 = **net（两端存量字节差）**，理由是**闸自己 S4 的度量就是 `bytes(text)`** = 某时刻文件大小 ⇒ 同一判定面。
    按注释字面的「2026-09-01 起」窗口：backlog `401,302 → 247,385 B` = **净 −153,917 B（−38.4%）= −16.7 KB/工作日**（D1=9）·
    STATUS `51,865 → 54,505 B` = **+0.29 KB/工作日**。换「立闸日起」读法也不翻案（+0.86 / −0.24）。
    🔴 **两条限制**：① 注释登记的基线 13.4 / 32.5 **lab 复现不出**（3 度量 × 4 窗口 × D1/D2 × KB 两制，没有一组让两文件同时落进 ±10%）⇒ 它们很可能不是同一套口径；② 若当初用的是 **gross（毛增）** 口径，则「立闸日起」窗口下 backlog = 20.2–25.8 ⇒ **该读法下超线**。取 net 是**判断、不是读数**。
    ⇒ 已就地把 DS 那条**日期型**重开条件换成**存量阈值型**（`REOPEN_BACKLOG_BYTES = 401302`，S4 每次运行自判自印 + 4 项回归钉子）—— 日期型这次实测失效：到期后整整 10 天无任何机制提醒。DS commit 见 [`docs/2026-09-09-ds-slim-optimize-review.md` §31](../docs/2026-09-09-ds-slim-optimize-review.md)。

- 日期：2026-08-24 · 对应 spec §14 第一轮第 2 步（§11.2 / D5）
- 归属：**DS session 在真源执行**；lab 只出处方（§8 单向纪律）
- 证据：`subjects/tvu-ds/inventory/doc-graph-archive-71ac2711.json`
- 裁判来源：lab 自写 `adapters/ds-doc-graph.mjs`

---

## 0. 与 spec 预期的偏差（先说，因为它改变了处置方式）

| 项 | spec | 实测 @71ac2711 | 影响 |
|---|---|---|---|
| `_archive` 总量 | 29,537 行 | **28,990 行 / 107 份** | 无 |
| `_generated` | 4,885 行，「移到 reports/ 或 gitignore」 | **4 份 md 5,340 行 + 若干 json/jsonl 活数据** | ⚠️ **不能整目录移**，见 §2 |
| `STATUS-CHANGELOG.md` | 3,951 行 | **3,889 行** | 无 |
| `_reports` 可删 | 16 份 2,490 行 | **仅 8 份 1,171 行是 0 外部引用** | 可删量减半 |
| retrospection | 53 份 7,471 行 | 53 份 7,524 行 | 见 S1 报告 |

> ⚠️ **2026-08-24 二次订正（第 8 步）**：上表 `_reports` 与下表 §1 的入站读数**已按修补后的 `path` 口径重取**。
> 原读数（`_reports` 9 份 / 1,430 行、`_plans` 8 份 / 2,512 行、retrospection 38 份 / 5,075 行）建立在一个
> **有漏洞的判据**上：`ds-doc-graph.mjs` 原来只认「`](` 开头」或「`docs|scripts|src|tests` 打头」的路径，
> 漏掉了写在**行内代码 span 里的相对路径**（`` `../_archive/x/y.md` ``）。
> 全归档面因此有 **5 份 / 762 行**从「0 入站 ⇒ 可删」翻成「有入站 ⇒ 不可删」。
> 详见 [`reports/2026-08-24-retrospection-s2-s3.md`](../reports/2026-08-24-retrospection-s2-s3.md) §1。
> ~~**本处方尚未执行，故就地改数而非另立勘误。**~~
> 🔴 **2026-08-27 I 格订正（`lab:N59`）：末句已失效 —— 本处方⛔ 已不再是「尚未执行」。**
> 它写于 08-24；此后本处方**分项**各自被改过（§2 桶二、§3 第 4 / 6 步逐字「已被 DS 裁定不执行」；
> §3 第 5 步逐字「该文件已被删」），**而这句文件级总述一直没跟着改**
> ⇒ **同一份处方里 `:26` 与那几处直接矛盾**（行号见下表**双栏**）。
> ⇒ 这是 §26.4「**知情面与登记面分叉**」的第 6 个实例，且**这次分叉在同一个文件内部**
> （前几次是 status 与处方之间）。⇒ 见下方 §0.1 现行执行状态表。

### 0.1 🟢 现行执行状态（2026-08-27 I 格补建 —— 本处方此前**结构性没有这一栏**）

> ⚠️ **口径**：本表只登记「**这一步还该不该做**」，⛔ **不登记「做得对不对」**（那要逐步验收，本次未做）。
> ⛔ 本表由 lab 在 `01b6589` 上按已有判定汇编，**⛔ 不代执行方勾验收框**（§8 单向纪律）。

> ⚠️ **本表的行号是双栏的** —— I 格在 `:26` 后插入了本节，**其后全部行号整体 `+31`**（实测差值，⛔ 非估算）。
> ⛔ 只写一栏必然 stale（这正是 `audit-stale-anchors` 那条处方在治的病）。

| 步 | 现行状态 | 出处（⛔ 引行号必标 sha） |
|---|---|---|
| §2 桶二**整条线** | 🔴 **已被 DS 裁定不做** | 本文件 `:188`/`:198`@`01b6589` = **`:219`/`:229`**（本次插入后）· `lab:N54` |
| §3 第 2 / 3 步 | 🔴 **已被 DS 裁定不执行**（随桶二） | 本文件 `:198`@`01b6589` = **`:229`** |
| §3 第 4 步（删 `STATUS-CHANGELOG.md`） | 🔴 **已被 DS 裁定不执行** | 本文件 `:300`@`01b6589` = **`:331`**；真源 = DS `scripts/audit-doc-shape.mjs:48-73` @**`c1db57b8`**（⚠️ 该行号锚在 `c1db57b8`，⛔ **不是**本处方头部那个 `71ac2711` —— I 格实测：`71ac2711` 上 `:48-73` 是 `import` + JSDoc，⛔ 不是裁定块） |
| §3 第 5 步（`_design-kickoffs` 真删） | ✅ **DS 已执行** | 本文件 `:420`/`:424`@`01b6589` = **`:451`/`:455`**（`c1db57b8` 上该目录不存在） |
| §3 第 6 步（`_archive/superpowers/plans` 移出） | 🔴 **已被 DS 裁定不执行** | 本文件 `:330`/`:332`@`01b6589` = **`:361`/`:363`** |
| §5 验收表第 1 行 | ⛔ **已作废**（勘误 `lab:E33`） | 本文件 `:344`/`:350`@`01b6589` = **`:375`/`:381`** |

**⚠️ 一条本处方此前零处登记的到期项（I 格实测：`2026-09-01` 在 `proposals/` 全 9 份 **0 处**）**：
DS `scripts/audit-doc-shape.mjs` **`:29-40`**（两 pin `71ac2711` / `c1db57b8` **逐位相同**，日期在 `:32`）
是「该不该给 `backlog.md` 也上阻塞判据」重开条件的**唯一真源**，判据逐字
「形态契约落地满 4 周（= **2026-09-01 起**）后重算日增速，仍未回落则给 backlog 上闸」。
~~⛔ **owner = DS，lab 只登记**（⛔ 不催、⛔ 不代裁）。~~⚠️ 该头注释自己逐字警告「到期时**必须自己重算**…**别引用本行**」。
🟢 **2026-09-11（review §31）已复核并关闭 —— 上面那句划掉的「只登记」其边界前提（`AGENTS §1.1` 改判前）已于 2026-09-01 过期**：
实测 pin `30c2ab86`，**未达成 ⇒ ⛔ 不给 backlog 上闸**（net 口径，backlog 窗口内净 **−153,917 B / −38.4%**）；
日期型重开条件已就地换成**存量阈值型**（`REOPEN_BACKLOG_BYTES`，S4 自判自印 + 4 项回归钉子）。
⚠️ 完整口径分歧与**两条如实登记的限制**（基线复现不出 · gross 读法下会超线）⇒ 本文件头 `- **执行状态**` 栏第 3 条。
📌 **登记在此的理由**：它与上表第 4 步同源（同一个闸的另一个裁定块），而处方是 DS 的执行入口
—— 只写进 `docs/round2-status.md:1828`/`:1915` 的话，**到期那天从处方读不到它**。

**新发现**：存在 `docs/_archive/_archive/`——**归档的归档**。这是 §11.3「没有出口的池子」最直白的实证。

---

## 1. 入站引用实测（判「还在被现行文档指着」）

判据（`path` 口径，**已含 2026-08-24 补的第 ④ 条「部分路径 / 代码 span 内相对路径」**）：
markdown 链接 / 引用式定义 / 仓库相对裸路径 / 按路径段边界后缀匹配的部分路径；
**不含「只提文件名」**（放宽会把散文算成引用）。
⇒ 入站数仍是**下界**：`>0 ⇒ 确定不能删`，`=0 ⇒ 需再过一道，不等于确定能删`。

| 子目录 | 份 | 行 | 外部入站=0 |
|---|---|---|---|
| `_archive/superpowers/plans` | 24 | 15,343 | 18 份 / 10,883 行 |
| `_archive/retrospection` | 53 | 7,524 | **35 份 / 4,665 行** |
| `_archive/_reports` | 16 | 2,506 | **8 份 / 1,171 行** |
| `_archive/_plans` | 9 | 2,895 | **7 份 / 2,419 行** |
| `_archive/translation-md-pre-schema`（即「归档的归档」） | 1 | 322 | 1 份 / 322 行 |
| `_archive/_design-kickoffs` | 2 | 210 | 2 份 / 210 行 |
| `_archive/_prompts` | 2 | 189 | 0 份 |
| `_archive/_prompts` | 2 | 189 | **0 份**（全部在用） |

**⚠️ 链式风险**：31 份「有外部入站」的归档物里，最大引用方是 `docs/internal/STATUS-CHANGELOG.md`（8 份）
和 `docs/internal/backlog.md`（4 份）。**而 STATUS-CHANGELOG 自己就是本 proposal 要移出的流水账。**
⇒ **执行顺序必须是「先移 STATUS-CHANGELOG、再重算入站引用、才谈删归档」**，否则会按一个即将失效的引用图做删除决策。

---

## 2. 处置（按 §11.2 三分法）

### 桶一 · 决策依据 → 提炼成 ADR，**提炼完原件才可删**

- ~~`_archive/retrospection` 15 份 / 2,449 行有外部入站（详见 S1 报告）~~
  > 🔴 **2026-08-27 `A⁗ 格`订正：这是 S1 的【原报】读数，lab 自己早已订正，本行一直没跟着改。**
  > 现值 = **18 份 / 2,859 行**，与本文件 [§1 表](#L41) 逐位自洽（`53 − 35 = 18` · `7,524 − 4,665 = 2,859`）。
  > 订正真源：[`reports/2026-08-24-retrospection-s1.md:19`](../reports/2026-08-24-retrospection-s1.md#L19)
  > 表内即 **18 / 2,859** · [`s2-s3.md:16`](../reports/2026-08-24-retrospection-s2-s3.md#L16)
  > 逐字「live-source **18 份 / 2,859 行**（**原报** 15 / 2,449）」。
  > 成因 = `ds-doc-graph.mjs` 的入站判据漏了「行内代码 span + 相对/部分路径」一整类形态，
  > 补漏后全 `_archive` 面 **5 份 / 762 行**从「0 入站」翻成「有入站」（见 `specs/…-ai-ds-lab-design.md:664` **E20**）。
  > ⇒ **旧读数 `15 / 2,449` 与本文件 §1 表分属两个口径世代**（`7,524 − 2,449 = 5,075` = S1 原报 S2 待判「38 份 / 5,075 行」，
  > 两侧各自自洽）⇒ **`lab:N56` 知情面与登记面分叉，第 4 个实例。**
  > ⚠️ ⛔ **别把这个 `18 份`（文件数）与 A″′ 格臂 E 的 `18 处`（孤儿引用处数）抹平** —— 两个口径，
  > 数值相同 ⛔ 不足以判同批；要判需重跑臂 E（`A⁗ 格` 0 新 run 故未做，登记为未覆盖）。
- `_archive/retrospection` **18 份 / 2,859 行**有外部入站（详见 S1 报告 §7 订正后的表）
- `_archive/_prompts` 2 份 / 189 行（**全部在用**，不动）

**本轮不删任何一份。** 提炼动作属第二轮第 8 步。

### 桶二 · 数据不是文档 → 移出 docs 树，**配置跟改**

| 对象 | 处置 | ⚠️ 前置 |
|---|---|---|
| `_archive/superpowers/plans` 24 份 / 15,343 行 | 移出 docs 树 | `audit-plan-lifecycle.mjs` 的 `archiveDir: 'docs/_archive/superpowers/plans'` **是配置项**，必须同 commit 改，否则该闸语义当场破 |
| `docs/internal/_generated/*.json` `*.jsonl` | 移出 docs 树 | **7 个脚本硬编码了路径**：`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` |

> **⛔ 这是对 spec §10.1「`_generated` 移到 reports/ 或 gitignore」的修正**：该目录**不是纯报告**。
> `ds-health-history.jsonl` 是 append-only 时间序列（DIM-U12 本体）、`product-pattern-index.json` 是活索引、
> `ds-health-component-origin-cache.json` 是缓存——**`release.mjs` 读它们**。整目录 gitignore 会当场打断发布链。
> ⇒ 只有 **4 份 .md 报告**（5,340 行）适用「报告不该在 docs 树里给 AI 读」，json/jsonl 属桶二另行安置。

#### 🔴 桶二重核（2026-08-26，`lab:N51`）—— 只审了 `product-pattern-index.json` 一个

报告 [`reports/2026-08-26-round2-patternindex.md`](../reports/2026-08-26-round2-patternindex.md) · **0 个新 run**。
⚠️ 本段只审了**一个**产物，其余 5 个（尤其 `ds-health-history.jsonl`，**被 4 个脚本硬编码**）**未审**。

**① 上表「7 个脚本硬编码了路径」对整批**成立**（⛔ 本处方没错）** —— 实测那 8 个点名脚本**全部**确实硬编码了
`_generated/` 下的产物。**但硬编码 `product-pattern-index.json` 的只有 3 个**：
`ds-health-scan-mockups.mjs:58`（**写入方**）· `pattern-index-lookup.mjs:79`（**读取方**）· `release.mjs:224`（**发布链**）。
⚠️ 其余 5 个管的是别的产物：`ds-health-delta` / `ds-health-scan-consumers` → `ds-health-history.jsonl` ·
`a11y-contrast-inspector` / `a11y-token-contrast` → `a11y-contrast-report.md`（**两个指同一产物**）·
`f129-rootradius-silent-gap-probe` → `f129-rootradius-silent-gap.probe.json`。
> 🔴 **2026-08-26 E 格订正（本段是 lab 自己漏的，⛔ 不是处方的）**：上面这行把 `ds-health-history.jsonl`
> 的引用方只列了 **2 个**。实测硬编码它**路径字面量**的是 **4 个**：`ds-health-delta.mjs:37`（只读）·
> `ds-health-scan-consumers.mjs:40`（append）· **`ds-health-scan-mockups.mjs:55`（append —— 它同时是
> `product-pattern-index.json` 的写入方）** · **`release.mjs:222`（`git add` 清单）**。
> ⚠️ 另：本段「其余 **5 个**」的主语是**脚本**；`docs/round2-status.md` §22.7 第 5 条把它转述成
> 「另外 5 个**产物**」—— 桶二口径的产物实为 **3 个**（`ds-health-history.jsonl` /
> `ds-health-component-origin-cache.json` / `f129-rootradius-silent-gap.probe.json`），
> 全口径含 4 份 `.md` 则为 7 个。⇒ `lab:E50` 主语错同族第四次，⛔ 已在 §22.7 就地订正。
⇒ **逐产物的影响面 ⛔ 不等于整批的影响面**，移出时请按产物各算一遍。
（⚠️ 另：上表逐字写「**7 个**」却列了 **8 个**名字，登记备查，⛔ 不猜是否因 `a11y-*` 去重。）

**② 上面引用块「整目录 gitignore 会当场打断发布链」——✅ 实测成立**（临时 repo 内，`git add` **EXIT=1**）。
🔴 **但「移出」不会当场断**：`release.mjs:226` 的 `.filter((p) => existsSync(p))` 会把它**静默过滤**
（**EXIT=0**，阳性对照「无 `.filter`」则 **EXIT=128**）⇒ **tag 照推、CI 照接管**。
⇒ 这两个动作的失效形态**不同**，本处方只对 gitignore 那条算过。⛔ lab 不替执行方选方案。

**③ 移出 `product-pattern-index.json` 的四种后果，⛔ 前三种都不报错**：

| # | 后果 | 机制（逐字取自 pin `c1db57b8`） |
|---|---|---|
| ① | 当场断 | **不会** |
| ② | **静默降级** | `release.mjs:226` 静默过滤 · `:172-174` step 1e 逐字「NON-blocking observer, NOT a gate」「**不拦发版**，继续」 · `scan-mockups.mjs:419` `existsSync(…) ? JSON.parse(…) : {}` ⇒ **累积快照的历史基线静默丢失**（`:431` 仍印「✓ 已写」+ 一个**变小**的数） |
| ③ | **移出等于没移出** | `scan-mockups.mjs:430` **无条件** `writeFileSync`，路径来自 `:58`；每次发版 step 1e 都跑 `health:snapshot` ⇒ **不改 `:58` 就每次发版写回 docs 树** |
| ④ | **延迟一整个发版周期** | 改了 `:58` 没改 `release.mjs:224` ⇒ 新产物不进 `git add` ⇒ 发完版工作树留脏 ⇒ **下一次** release 的 preflight 才拦住（`release.mjs:218-219` 注释**逐字预言了这个形态**） |

⇒ 🔴 **建议把上表 `plans` 行那句「必须同 commit 改」也写到 `_generated` 行**：
三处路径（`:58` / `:79` / `:224`）**必须同 commit 改**，否则失效形态是 ③ 或 ④。
本行原文只登记了「有脚本硬编码」，**未登记同步性要求**。

**④ AI 侧：真会断，但断在「发现」那一步** —— 15 个既有 run 实测，模型走的是
`Glob docs/internal/_generated/*` **发现** → 定向 `Grep` 进正文 → **分片 `Read`**（读了 9.7% / 13.4%）。
移出 docs 树后 `Glob` 就列不到它 ⇒ ⛔ 不是断在读取，是断在「**根本不知道它在**」。
⚠️ 而 `AGENTS.md:139` 那条 owner **2026-08-14 拍定**的纪律逐字要求「跑一次 `pnpm pattern:lookup`」——
**15/15 run 都读到了 AGENTS.md 全文，执行它的是 0 个。**
⇒ 那条 CLI 旁路移出后**只需改一处** `lookup:79` 即恢复，且 `AGENTS.md` 指的是**命令而非路径**、**不需要改**；
但实测**没人走那条旁路** ⇒ **「旁路可用」⛔ 不等于「旁路会被用」。**

⇒ ⚠️ **⛔ lab 不判该不该移出、也不替执行方选修法**（§8 单向纪律）。唯一如实交出的事实是：
**三处路径 + 同 commit，是移出这一个产物的最小改动集**；其余产物见下方 E 格段。

#### 🔴 桶二重核·续（2026-08-26，E 格）—— 剩下 3 个产物 + 边界件，**失效形态互不相同**

报告 [`reports/2026-08-26-round2-generated-rest.md`](../reports/2026-08-26-round2-generated-rest.md) · **0 个新 run**。

**① 三个产物逐个不同，⛔ 不能照抄 pattern-index 那一套**：

| 产物 | 移出的失效形态 |
|---|---|
| `f129-rootradius-silent-gap.probe.json` | ✅ **零后果** —— 路径是 `--out` 的默认值（`:247`，**不是写死的 const**）· `:836` `mkdirSync(recursive)` **目录自愈** · `--gate` 逐字「**不写**产物」「零浏览器、零凭据、**只读两个 JSON**」（⛔ 不含它）· 完整跑 L1 **零挂载** |
| `ds-health-component-origin-cache.json` | ⚠️ **自愈但要打 Figma** —— `scan-mockups:101-103` 缺文件 ⇒ 空 map ⇒ `:99-100` 逐字「每个 distinct componentKey 问一次 `/v1/components/<key>`」全量重问；无凭据环境下 `release.mjs:166-168` 逐字「采集器会把那一轮记成 error」⇒ 该轮从「有数」退化成 `error` |
| `ds-health-history.jsonl` | 🔴 **比 pattern-index 多一重静默**（四重），且「被写回」的**后果性质不同** |

**② `history.jsonl` 新增的两重静默，共同点是「把历史丢失误报成尚未开始」**：
`delta.mjs:201-204` 逐字「⚠️  还没有 … —— **先跑 `pnpm health:snapshot`**」+ `return 0` ——
能让文件不在的原因至少三个（首次没跑过 / **桶二移出** / 误删），而那个修法**只对第一个成立**
（重跑只 append 一个新点，旧点在搬走的那份里）⇒ **fail-open**。
`delta.mjs:221-222` 逐字「只有 1 个点 ⇒ 无 delta 可打。**首次跑只是基线**」—— 移出后重建的文件正好 1 个点
⇒ 这句**主动安抚**，比 pattern-index 那句「✓ 已写 + 一个变小的数」更强（那句至少数变小了）。
且 `ds-health-delta.mjs` 自陈逐字「**观测器不是闸：always exit 0**」。
⇒ ③ 的性质也变了：`appendFileSync` 无条件写 ⇒ 同样「移出等于没移出」，但重建文件**只有新点**
⇒ 后果是**历史被劈成两半**，⛔ 不是「快照重算」。

**③ 同一个目录，写入方对「目录不在」的处置不一致 —— 一条可复用的判别式**：
隔离实测 `appendFileSync` / `writeFileSync` 在父目录不在时**都 THROW ENOENT**。而 `_generated/` 下
`f129` / 两个 `a11y-*` / 两个 render spec **都 `mkdirSync(recursive)`**，
`scan-mockups` / `scan-consumers` / `release` **都不**。
⇒ **`mkdirSync(recursive)` 在不在，决定移出是「自愈」还是「ENOENT」。**
⚠️ 但在 **release 路径上 ENOENT 不会发生** —— `release.mjs:79` 的 render 测试先跑，其 spec 的 `mkdirSync`
已把目录建回来。ENOENT 只在**单独手动跑 `health:snapshot` 且目录不在**时发生；真发生时
`health:snapshot` 的 `&&` 链会**第一个抛就带掉后两个**，而 `release.mjs:172` 的 `spawnSync` 逐字「不拦发版，继续」。

**④ `ds-health-mockup-targets.json`：落口径缺口，且移出会静默打掉一道守卫**：
它 `git` 跟踪中、在 `docs/internal/` 而非 `_generated/`、`scan-mockups.mjs:20` 逐字称它「**人工维护**」
⇒ 是**输入清单**不是派生产物 ⇒ 桶二标题「数据不是文档」**没定义**人工输入算不算 ⇒ **⛔ lab 不裁**。
🔴 但它在 `CRITERION_FILES`（`delta.mjs:49-56` 第 6 项）里，那份清单是 `git log` 的 pathspec。
**只读实测**：`git log … -- '<不存在的路径>'` = **EXIT 0 + 空输出**（⛔ 不报错）⇒ 移出后函数返回 `[]`
（= 没动过），⛔ 不是 `null`（= 没检查）⇒ `delta` 从此恒印「✅ 判据文件在这两点之间未动 ⇒ 同口径对比」。
⇒ 该函数 `catch` 分支逐字写了「git 不可用 / 不在仓库里 ⇒ 如实说『没检查』，⛔ 别静默当成『没动过』」——
**防住了「git 挂了」，没防住「路径被搬走了」。**
⚠️ 反向如实说：移出 `_generated/*.json` **这个动作本身**会被这道守卫看见（要改的两个脚本都在
`CRITERION_FILES` 里）⇒ **危险的只有把 `mockup-targets.json` 自己搬走这一种。**

**⑤ AI 侧：丢的是名字，⛔ 不是内容**：三个产物在 `context-manifest` 三面命中 **0/0/0**
（阳性对照 `product-pattern-index` = 2 ⇒ 判定面非空）；补第四面后三者 **`tool_use.input` 零命中**，
只在 **`Glob {"pattern":"docs/internal/_generated/*"}` 的目录清单**里露过名字
（`r007`/`r009`/`r012` 各 1 次 —— **一次 Glob 把 8 个文件名全塞进上下文**）。
⇒ **从来没有任何 run 读过、Grep 过它们。**

#### 🔴 桶二**整条线**的存在理由（2026-08-26，A′ 格，`lab:N54`）—— **DS 已裁定不做**

报告 [`reports/2026-08-26-round2-bucket2-hold.md`](../reports/2026-08-26-round2-bucket2-hold.md) ·
**0 个新 run · 0 个新量具**。

🔴 **DS 侧 `scripts/audit-plan-lifecycle.mjs:103-125`** 有一段 📌 注释，逐字自称
「**这一段是那条决定的唯一真源**」，内容是 `docs/_archive/superpowers/plans` 与
`docs/internal/_generated/`「**为什么刻意留在 docs 树里**」，起因**逐字点名本处方 §2 桶二**，
并写了三条理由 + **重开条件**（逐字「`declaredRuleDocs` 的口径改成含这两个目录，
或它们真的进了某条 onboarding 注入面。⛔『docs 树看起来乱』不构成重开条件」）。
⇒ **本处方 §2 桶二与 §3 第 2/3/6 步已被 DS 裁定不执行**（2026-08-25）。
⇒ ⚠️ 该裁定块的引入 commit **就是 `c1db57b8`**（lab C/D/E 三格测量所用的 pin），
活源 20 个 commit 里**一次未被碰**；而 lab 此前 **9 处**提及桶二处置状态、**0 处**知情。
⇒ ⛔ **lab 不裁该不该重开**，只交出下面三条理由的复核结果。

**① 理由 ①（收益押在不代表 AI 读取成本的分母上）✅ 成立。**
静态读 DS 的注入面声明数组（⛔ 未重跑 `context-cost.mjs` —— 它 `:96` 会 `spawnSync` 跑闸）：
`71ac2711` / `c1db57b8` / 活源 `cddb16dd` **三处逐字同一份**（`MIRROR_SCAN_DOCS` 12 +
`CHAIN_SCAN_DOCS` 6，+`ENTRY` 去重 = **14**），**均不含**这两个目录 ⇒ 交集 **`i = 0`**。
⚠️ 口径如实说：DS 引的三个数（`327 份 / 95,157 行`·`14 份 / 10,543 行`·`0.1123`）逐位取自
lab 的 `context-cost-71ac2711.json` = **`71ac2711` 口径**，而裁定写在 `c1db57b8` 上，
且该 commit 自己就删了 34 份 retrospection。⛔ 不影响 `i = 0` 的判定（`i` 与 docs 总量无关）。
⚠️ 另：本处方 §5.1 `:254` 的 `14 份 · 10,577 行` 是 **P0 口径**，与上面的 10,543 差 34 行
⇒ **口径时点差，不是错**；两处都该带 sha 名。

**② 理由 ②（没有任何机制会把 AI 引向这两个目录）🔴 后半句被实测推翻。**
3/15 个既有 run 命中 `_archive/superpowers/plans`，机制是 **agent 为完成任务对 `<pin>/docs`
做的全树 `Grep`**：`r009` 逐字 `Grep {"pattern":"Type of source|IP Source|NDI|Config-T",
"path":"…/pins/tvu-ds-4a68e02d/docs","output_mode":"content","-n":true,"head_limit":60}`
⇒ **归档 plan 的正文行进了上下文**（`r017` 同形态；`r015` 是 `files_with_matches` 只拿到文件名）。
⇒ `docs/_archive/` 在 `docs/` 下 ⇒ **凡 Grep `docs/`，归档必在检索面内**（机制，⛔ 不是偶然）。
⇒ 🔴 **但 DS 写的重开条件是「进了某条 onboarding 注入面」，按那个字面口径未达成**（见 ①）。
**论据被推翻 ≠ 重开条件达成 —— 这两句话不是同一个判据，⛔ lab 不裁哪个算。**
⇒ 🔴 **且两半形态不同**：`_archive/plans` 是**散文**（域名词大量命中、两次进正文窗口）·
`_generated/*.json` 是**数据**（在检索面内但不进返回窗口）—— 理由 ② 把两个目录并列，实测不是一回事。

**③ 理由 ③（代价是实的，四项）⚠️ 三项成立、第 ④ 项的「当场破」被推翻。**

| 分项 | 判定 |
|---|---|
| ① 处方未指定目的地 | ✅ **成立** —— §2 桶二只写「移出 docs 树」，§1 `:15` 记 spec 原话「移到 `reports/` 或 gitignore」并自标「不能整目录移」，**但没给新落点** |
| ② `backlog-owner-decisions.html` 未跟踪 | ✅ **成立** —— 活源 `git status` 仍 `??` |
| ③ 硬编码 8 个脚本含 `release.mjs` | ✅ **成立（带口径名）**：`git grep -l _generated -- 'scripts/*.mjs'` = **9**，其中 `audit-plan-lifecycle.mjs` 的 4 处**全在 📌 注释里、无一处是代码** ⇒ **8 = 代码口径 · 9 = 含注释口径** |
| ④ `archiveDir` 得同 commit 改，**否则语义当场破** | ⚠️ **部分不成立** —— 见下 |

**隔离三臂**（`git archive` 导出 `c1db57b8` 到 `mktemp -d`，⛔ 未碰 pin）：
基线 `EXIT=0`（`已归档 25 份`·`入站引用 : 37/37 份有引用` ⇒ `expiring = 0`）·
**臂 A**（移走归档目录、⛔ 不改 `archiveDir`）⇒ **`EXIT=0` ✓ PASS**，只把
`已归档 25 份` 静默变成 **`已归档 0 份 （归档落点未建）`** ·
**臂 C**（阳性对照：A + 造一份零入站引用的过期 plan）⇒ **`EXIT=1`**，
逐字 `[S3] 归档落点缺失：docs/_archive/superpowers/plans 不存在，而本轮有 1 份文件要归档过去`。
机制 `:509-511` 逐字「归档落点**只在本轮真有文件要归档时**才必须存在」+ `if (!archiveExists && expiring > 0)`。
⇒ **收窄为「延迟到下一次真有文件到期的那一轮才破」= 桶二重核四问的第 ④ 格，⛔ 不是第 ① 格。**
⚠️ 基线自己就现形过（`handoffs` 那行印着「（归档落点未建）」却没判红）⇒ **这道守卫在基线上就已静默。**

**④ 本处方自身的两处订正（⛔ 不改原文，只在此加注）**：
1. 🔴 **§2 桶二表 `:70` 那行文字写「7 个脚本硬编码了路径」，却在同一行列了 8 个名字。**
   代码口径实测 = **8** ⇒ **文字错、列名对。** ⚠️ `lab:E50` 那整场主语争议就起于这个数。
2. 🔴 **§2 桶二表 `:69` 与 §1 表 `:41` 的「24 份 / 15,343 行」两个原因叠在一个数上**：
   份数是**时点差**（`71ac2711` 期 24 份，`c1db57b8` 起 25 份 —— 多了
   `2026-08-21-r13-commit-message-trace-gate.md`）；行数是**口径差**
   —— `per-file (wc -l + 1)` 求和 @`71ac2711` = **15,343 逐位命中**，
   即 `split('\n').length` 口径（正是 lab 自己 `context-cost.mjs:37` 用的那个），
   `wc -l` 口径同 sha 是 **15,319**，差 24 = 份数。
   ⇒ **订正当前值：25 份 / 15,999 行（`split` 口径）= 15,974 行（`wc -l` 口径）。**
3. ⚠️ **§1 表里 `_archive/_prompts` 那一行重复出现两次**（`:38` / `:39`）。

### 桶三 · 纯流水账 → 真删（git 兜底）

| 对象 | 份 | 行 |
|---|---|---|
| `docs/internal/STATUS-CHANGELOG.md` | 1 | 3,889 |
| `_archive/_reports` 中 0 外部引用者 | 8 | 1,171 |
| `_archive/_plans` 中 0 外部引用者 | 7 | 2,419 |
| `_archive/_design-kickoffs` | 2 | 210 |
| `_archive/_archive/`（归档的归档） | 1 | 322 |
| `docs/internal/_generated/*.md`（4 份报告，移出而非删） | 4 | 5,340 |

**本轮 docs 净减约 1.37 万行**（其中真删 8,363 行 + 移出 5,340 行），与 spec 预估的「约 1.1 万行」同量级。

---

## 3. 执行顺序（不可换序）

1. **先改配置再动文件**：`audit-plan-lifecycle.mjs` 的 `archiveDir` + 7 个脚本的 `_generated` 路径
   > ✅ **2026-08-26 重核：这个顺序本身是对的**（`lab:N51`）—— 「先改配置」正好防住了
   > §2 桶二重核 ③「移出等于没移出」和 ④「延迟一个发版周期」两种后果。⛔ 别换序。
2. 移出 `_generated` 的 json/jsonl（桶二）→ 跑 `pnpm release --dry-run` 或等价校验，确认发布链没断
   > 🔴 **2026-08-26 重核：`--dry-run` 对「漏改了某一处路径」是空判**（`lab:N51`）——
   > `release.mjs:226` 的 `.filter((p) => existsSync(p))` 会把漏改的旧路径**静默过滤**
   > （隔离实测 `git add` **EXIT=0**）⇒ **dry-run 照样通过**；而真实后果（发完版工作树留脏、
   > 被**下一次** release 的 preflight 拦住）dry-run 根本模拟不到。
   > ⇒ 能验出来的是一条**事前、确定性、0 成本**的检查（同 `lab:N50` 推论二「事前交集 > 事后守恒」）：
   > **移出后 `grep -rn '<旧路径>' scripts/` 必须返回 0 命中** —— 非空即漏改，当场可否决。
   > ⛔ lab 不替执行方选，只指出 `--dry-run` 这一条验不到什么。
3. 移出 `_generated/*.md`（4 份）
   > 🔴 **2026-08-26 E 格：这是整个桶二/桶三里唯一会「当场断」的一步，而本步原先零前置登记。**
   > 隔离实测（`git archive` 导出临时目录，**pin `c1db57b8` 与 DS HEAD `19ff2888` 各跑一遍**，
   > ⛔ 未碰 pin、未碰 DS 工作树）：
   > **臂 A（只移第 2 步那批 json/jsonl）⇒ `audit:stale-anchors` `EXIT=0`；
   > 臂 B（再移本步这 4 份 `.md`）⇒ `EXIT=1`，5 条孤儿。两个 HEAD 上结果相同。**
   > 5 条逐字：`docs/STATUS.md` · `docs/internal/a11y-contrast-designer-review-2026-06-01.md` ×2 ·
   > `docs/internal/ds-health-dimensions.md:177` · `docs/superpowers/plans/2026-08-12-ux-scenario-coverage-expansion.md:224`。
   > `audit:stale-anchors` 在 `gate-chain` 里，`ci.yml:41` 逐字「`.gitea/…/pr-checks.yml` fires on
   > `pull_request` + `push: [master]` with **NO `paths:` filter at all** … **IS blocking on every master push**」
   > ⇒ **每次 master push 当场红**。⇒ 本步的前置应是：**先把这 5 处引用改掉（或改成裸文本），再动文件**。
   > ⚠️ 另：其中两份 report（`render-verification-report.md` / `react-render-verification-report.md`）被
   > `tests/visual-verify/manifest-verifier.spec.ts:155-156` 与
   > `tests/render-verification-react/react-drift-full.spec.ts:201-202` 用
   > `mkdirSync(recursive)+writeFileSync` **无条件重建**，且在 `release.mjs:79/85` 的**发版必经路径**上
   > ⇒ **移了等于没移，还会把 `_generated/` 目录本身带回来**。⛔ lab 不替执行方选修法。
4. **删 `STATUS-CHANGELOG.md`** → **重跑 `adapters/ds-doc-graph.mjs`**，拿到新的入站引用图
   > 🔴 **2026-08-26 A′′ 格：本步已被 DS 裁定不执行**（`lab:N54` 第二次命中）—— 真源
   > `scripts/audit-doc-shape.mjs:48-73`，含**四条理由 + 三条带判据的重开条件**，
   > **引入 commit = `c1db57b8`，与 §2 桶二那个裁定块是同一个 commit**。
   > 四条理由的复核见 [`reports/2026-08-26-round2-changelog-hold.md`](../reports/2026-08-26-round2-changelog-hold.md)：
   > **理由 ② ✅（`i=0`，三 sha 指纹逐字同一份）· 理由 ④ ✅（三数在其时点上逐位正确，差 53 = 该 commit 自身 prepend）·
   > 理由 ③ ⚠️ 半条被推翻（现行层锚点 `k=0` 比 DS 说的更强，但撞出一处行号形式引用**已错 3,505 行**）·
   > 理由 ① 🔴 技术阻断读法被造故障推翻（删掉它 `audit:doc-shape` `EXIT=0` ✓ PASS 且与基线空 diff）。**
   > **三条重开条件 (a)(b)(c) 全部未达成。⛔ lab 不裁该不该删、该不该重开。**
5. 按**新图**再确认桶三剩余各项仍是 0 外部引用 → 分批删
   > 🔴 **2026-08-27 A″′ 格：本步的 4/5 项已被 DS 执行完毕，⛔ 别再当待做项排期。**
   > 归因 `483e3feb`（2026-08-25，subject 逐字含「**归档桶三**」，且它是 `c1db57b8` 的祖先、
   > 不是 `71ac2711` 的祖先 ⇒ **C/D/E/A′/A″ 五格 pin 里从第一格起就带着执行结果**）。
   > 实删与本表**份数 + 行数四行逐位吻合**：`_plans` 7/2,419 · `_reports` 8/1,171 ·
   > `_design-kickoffs` 2/210 · `_archive/_archive` 1/322（split 口径，**第三次连续验证**）。
   > ⚠️ 处方写于 08-24、删除在 08-25 ⇒ **⛔ 不是事后抄 diff**。
   > **唯一未执行项 = `STATUS-CHANGELOG.md`，已由 DS 裁 hold**（见第 4 步）。
   > ⚠️ **本条早在 `docs/round2-status.md` §20.4 与 `AGENTS.md:314` 就已判定**，
   > 而本步正文此前一直没跟着改 ⇒ **知情面与登记面分叉**（新的第五种登记面缺陷，见报告 §4）。
   >
   > 🔴 **同时推翻 A″ 格在本步加的那条前置加注**（原文：「一道自检硬依赖 `_archive/retrospection`
   > 目录存在，而该目录属**桶三（真删）**」⇒「本步分批删前必须先测这一条」）—— **两半都不成立**：
   > ① `_archive/retrospection` 属 **§2 桶一**（本文件上方逐字「~~15 份 / 2,449 行~~ ⇒ **18 份 / 2,859 行**
   > 有外部入站」+「**本轮不删任何一份**」）⇒ **桶三清单里没有它，按处方执行永远触发不到那道 must-hit**（臂 B 实证：未触发）。
   > ⚠️ **2026-08-27 `A⁗ 格`：份数已订正（15 是 S1 原报，见 §2 桶一那条 🔴），但本条结论 ⛔ 不受影响** ——
   > 起作用的是「**本轮不删任何一份**」那半句，⛔ 不是份数。
   > ② 即便真去删它，**删光文件也不触发**（臂 E：EXIT=1 但 must-hit 未响），**只有整目录消失才触发**（臂 C）。
   > ⇒ 隔离四臂实测见 [`reports/2026-08-27-round2-bucket3-executed.md`](../reports/2026-08-27-round2-bucket3-executed.md) §3。
   > ⚠️ 行号也订正：该 must-hit 在**活源** `:718`、在 pin `c1db57b8` `:612`、
   > 在 `71ac2711` 上**根本不存在** ⇒ **⛔ 引它必须标 sha。**
6. `_archive/superpowers/plans` 移出（桶二，量最大，单独一批）
   > 🔴 **2026-08-26 A′ 格：本步（连同第 2/3 步）已被 DS 裁定不执行** —— 真源
   > `scripts/audit-plan-lifecycle.mjs:103-125`，含三条理由 + 重开条件。三条理由的复核见
   > §2「桶二**整条线**的存在理由」段：**理由 ① ✅ · 理由 ② 后半句 🔴 被推翻 ·
   > 理由 ③ 四项中三项成立、第 ④ 项「当场破」收窄为「延迟一周期」。**
   > ⛔ lab 不裁该不该重开。⚠️ 数已订正：**25 份 / 15,999 行（`split` 口径）**。

## 4. 安全网（§11.4 三层，全部确定性）

- **每批之后**跑 `node scripts/audit-stale-anchors.mjs` + `node scripts/audit-plan-lifecycle.mjs`。删错了当场红。
- 全程在 DS worktree 演练，指标无退化才上真源（§8）。
- git 可逆。

## 5. 验收指标（§8.2）

> ⚠️ **2026-08-25 已改（勘误 E33）—— 第一行原来那条验收作废，别照旧读。**
> 原表第一行是「`context-cost` 的规则文档总行数 94,830 → 约 81,000」。DS 指出它的分母错了，
> **这一半 lab 复核后认同**；但 DS 建议换成 `declaredRuleDocs` 的那一半 **实测走不通**。详见下面 §5.1。

| 指标 | 期望方向 | 备注 |
|---|---|---|
| ~~`context-cost` 的「规则文档总行数」 94,830 → 约 81,000~~ | ~~下降~~ | ⛔ **作废（E33）**：这是 `totals.docs` 口径，它与「上下文成本」无因果 —— 删的东西从不进上下文 |
| ~~**实读面守恒**：删前删后各跑 **N=5**，比较两组 **L2 实读·`.md` 的并集**~~ | ~~并集**不得丢失**任何一份~~ | 🔴 **2026-08-26 作废（`lab:N50`）** —— 载体只覆盖删/移清单 **3.8%**，见 §5.3 |
| ~~**L1Fingerprint** 不得变~~ | ~~**逐字节相同**~~ | 🔴 **2026-08-26 作废（`lab:N49`）** —— 两头堵（不 commit 恒真空判 / 已 commit 恒假），见 §5.4 |
| `audit-stale-anchors` | 保持 exit 0 | 每批后 |
| `audit-plan-lifecycle` | 保持 exit 0 | 每批后 |
| `first-shot` | **不得下降** | ⚠️ 需先有 MDE 才能判「没下降」，见 §6.2。**本轮拿不到，故这条验收要挂到第二轮** |

### 5.1 勘误 E33：分母错了，但 DS 建议的那个新分母会让验收恒真

**原话**：验收看 `context-cost` 的「规则文档总行数」94,830 → 约 81,000。
**DS 的勘误**：该换分母，用 `declaredRuleDocs` 而不是 `totals.docs`。
**lab 实测（pin `4a68e02d`，量具 `metrics/context-cost.mjs`）**：

| 口径 | 读数 | 与本处方删/移清单的交集 |
|---|---:|---|
| `totals.docs`（全 docs 树 `.md` 口径） | 330 份 · 96,687 行 | 全部 —— 94,830 确实是这个口径（P0 上的值） |
| `declaredRuleDocs`（`audit-rule-inventory` 声明的入口规则文档集口径） | 14 份 · 10,577 行 | **0 份**（逐条核过，14 份全在下面清单外） |

⇒ **DS 对了一半**：`totals.docs` 确实不该当验收分母 —— 它测的是**仓库文档体量**，不是上下文成本。
⇒ **但换成 `declaredRuleDocs` 之后交集是 0**，这条验收会**恒真**（删多少都不动），
   正是 AGENTS §3.2 推论二 / N43 那类「换代后恒真的空判据」。⛔ 不能这么改。

**为什么两个分母都测不动**：6′ 拿到真实 run 的 `contextManifest` 后可以直接查了 ——
GT-001 四个独立 run 的**实读面**里，落在本处方删/移清单上的文件 **均为 0 份**（成功面、尝试面都是 0）：

| run | L2 成功读 | 其中 `.md` | 命中删/移清单（成功面） | 命中（尝试面，含被工具拒的读） |
|---|---:|---:|---:|---:|
| r001 | 30 份 | 9 份 | **0** | **0** |
| r002 | 36 份 | 9 份 | **0** | **0** |
| r003 | 38 份 | 6 份 | **0** | **0** |
| r004 | 33 份 | 8 份 | **0** | **0** |

⇒ **真正的结论比 DS 那条更硬：本处方在「上下文成本」这个维度上的收益，用现有任何一个口径都测不到 ——
因为删的东西本来就不在任何一个上下文面里（自动注入面 / 声明面 / 实读面，三个都不在）。**
⇒ 修法**不是换分母，是换指标**：把「上下文成本下降」这个承诺**撤回**（它从来不成立），
改成上表的**守恒判据** —— 它测的是「有没有删错」，而那才是这个处方真正的风险面。

### 5.2 ⚠️ 守恒判据的第一版是错的（同日就地改，⛔ 别照初版执行）

初版写的是「删完后实读 `.md` 面**不得少任何一份**」。那建在一句 **N=2 的假象**上 ——
当时只有 r001/r002，两个 run 实读的 9 份 `.md` 恰好完全相同，于是被读成「文档面是稳定的」。

**N=4 实测不成立**：

| | r001 | r002 | r003 | r004 | 交集 | 并集 |
|---|---:|---:|---:|---:|---:|---:|
| L2 成功读的 `.md` 份数 | 9 | 9 | **6** | **8** | **5** | **10** |

`docs/STATUS.md` 这种 L-core 都不是每次都读。
⇒ **按单 run 判「少了一份」，会被随机层的噪声直接打穿**（噪声地板见
[6′-B 报告](../reports/2026-08-25-round2-step6prime-b-mde.md) §2.2）。

⇒ **正确判法**：删前删后**各跑 N=5**，比较两组 `.md` 实读的**并集**；
并集丢失才算信号，单 run 的出入按噪声处理。

⚠️ **登记这条结论自己的边界**：上面 0 命中是 **GT-001 口径**（N=4/5）。
GT-002（表单流）/ GT-003（数据可视化）**一次没跑过**，它们可能读到归档面。
⇒ 铺开那两条 task 之后要**重核一遍**。

---

### 5.3 🔴 重核做完了（2026-08-26，`lab:N50`）—— **§5.1 的核心前提被推翻，本判据作废**

上面 §5.2 那条「铺开 GT-002/GT-003 后要重核一遍」**已执行**（各 N=5，共 15 个既有 run，**0 个新 run**）。
量具 [`metrics/delete-surface-coverage.mjs`](../metrics/delete-surface-coverage.mjs)
· 报告 [`reports/2026-08-26-round2-readsurface-criterion.md`](../reports/2026-08-26-round2-readsurface-criterion.md)

**① §5.1 逐字写的「删的东西本来就不在任何一个上下文面里（自动注入面 / 声明面 / 实读面，三个都不在）」——
在 GT-002 上不成立：**

- **`docs/_archive/_design-kickoffs/v4-1827-ndi-into-ipsource.md`**（**§2 桶三「真删」项**）
  被 GT-002 的 `r007` / `r009`（**2/5 run**）**整文件读完**（`coveredBytes == bytes == 9431`）。
- 机制不是偶然：GT-002 = NDI **source type** 表单，该归档是 `v4-1827-ndi-into-**ipsource**` 的 Design Kickoff Packet。
- raw transcript 三步链核过：Grep 命中 → **模型主动 `Read`** → 返回正文。⛔ 非采集器错归属。
- 🔴 **该文件已被删**（`c1db57b8` 上 `_design-kickoffs/` 整个目录不存在）。
- ⚠️ 这是**本处方自己的缺口** —— §1 逐字写了「入站数是**下界**，`=0 ⇒ 需再过一道」，
  而那「再过一道」= 实读面核验，**只在 GT-001 上做过**。⛔ 不是执行方的差错。

**② 本判据的载体（实读面）只覆盖删/移清单的 3.8%**（精确清单 52 文件，N=15 并集）：

| 面 | 命中 | 占比 |
|---|---:|---:|
| **实读面**（本判据的载体） | 2 | **3.8%** |
| **检索面**（Grep/Glob 命中，**本处方枚举时漏了**） | 33 | **63.5%** |
| 三个面都没进 | 19 | 36.5% |

检索面**严格包含**实读面（16.5 倍）⇒ 判据选了包含关系里更小的那个。

**③ 信噪比 < 1**：真阳性那份频次仅 **2/5**（检出功率 < 1/2），而 freq==1 的并集成员有 **1–2 份**
（不删任何东西、只换一组 N=5 就会「少一份」）⇒ 报警时分不清真删错与随机抖动。
且守恒判据需要**第三组不重叠 N=5** 才有噪声地板 ⇒ **真实成本 N=15，⛔ 不是本表写的 N=10。**

⇒ **三条可选修法（⛔ lab 不替执行方选，§8 单向纪律）**：
① 改成**事前交集判据**「删/移清单 ∩ 删前（实读面 ∪ 检索面）= ∅」—— **0 个新 run、确定性、覆盖 63.5%**；
② 保留守恒口径，但先立并集的噪声地板（预算按 N=15）；
③ 给采集器加 `searchSurface` 面再谈守恒（= 换量具，会给既有 run 加新面，需单独裁）。
⚠️ ① 判「删之前它被碰过吗」（**事前、可否决**），② 判「删之后变了吗」（**事后、只能追认**）⇒ **⛔ 不等价。**

### 5.4 🔴 `L1Fingerprint 不得变` 那条也作废（2026-08-26，`lab:N49`）

见 [`reports/2026-08-26-round2-l1fingerprint.md`](../reports/2026-08-26-round2-l1fingerprint.md)：
口径「删了**不** commit」⇒ 指纹恒不变，且**分不清「删 11 个归档」/「建 11 个无关文件」/「什么都不做」** ⇒ **恒真空判**；
口径「删了**并** commit」（= §4 安全网逐字「git 可逆」⇒ 现实口径）⇒ `subjectSha` 必变 ⇒ **恒假**。
✅ 但**命题成立**：8 分量中 **7 个守恒** ⇒「确定性注入层结构上不该动」实测为真，坏的只是载体。
三条修法见该报告 §2.6，**⛔ lab 不替执行方选。**

> **诚实提示**：桶三的「真删」在拿到 MDE 之前**无法验证是否损害了产出质量**。
> 但删的是 0 引用的流水账，失败成本低且 git 可逆 ⇒ 建议照删，不必等 MDE。
> 桶一的提炼（有损压缩）则**应当等 MDE**——那是会改变 AI 读到内容的操作。
