# 第二轮状态与交接（活文档）

> 这份文件的存在理由：第二轮是**两条 session 并行**（lab 侧量、DS 侧执行），
> 而「谁在等谁」这件事此前只活在对话上下文里，换 session 就丢。
> ⇒ 任何续跑 prompt 都应先读本文件，而不是靠自然语言复述状态。
> **最后更新：~~2026-08-25 17:0x · pin `4a68e02d` · ⚠️ DS 真源 HEAD 已跑到 `6b8ad767`~~**
> ~~🔴 **现取（L 格 §28.12）：2026-08-27 · lab HEAD 见本次 commit · DS 真源 HEAD `60d644a0`**~~
> ~~🔴 **现取（M 格 §28.13）：2026-08-27 · lab HEAD 见本次 commit · DS 真源 HEAD `1c108de8`**~~
> 🔴 **现取（N 格 §28.14）：2026-08-28 · lab HEAD 见本次 commit · DS 真源 HEAD 起 `02fc77b6` → 止见 §28.14**
> ⚠️ **这一栏此前停在 08-25 未随 §28.6–§28.10 更新** —— K 格补上（第 26 条推论一：改完分项要回核总述句）。
> ⛔ **DS HEAD 这一栏会漂 ⇒ 引用前必须重取**：**11 次交接里漂了 10 次**（第 8 次首度砸在判定面上），
> **只有第 9 次（L 格起手）零漂**；第 10 次（M 格起手）、**第 11 次（N 格起手）都漂了**
> （`a786e0d2 → 02fc77b6`，2 commit）。
> 🔴 **但第 10、11 两次都【没有命中判定面】** —— 第 11 次全仓 diff 6 个文件，与闸 `SCAN_FILES` **零交集**，
> 闸 blob `ffea0a1a` 逐字未变 ⇒ **「漂了」与「判定面动了」是两件独立的事**：
> ⛔ 不许由「漂了」推「读数作废」，也⛔ 不许由「起手没漂」推「不用查」——**每次都得逐次 diff 判定面**。
> 🔴 **N 格给【格内漂】补了反向数据点**：交接单曾记「格内漂已连续两格发生、两次都砸判定面（**2/2**）」——
> N 格格内也漂了（`02fc77b6 → 0e04ceb9`）**但没砸面** ⇒ 现在是 **3 次里 2 次砸面**。
> ⇒ ⛔ **「格内漂必砸面」不成立**；唯一稳定的仍是「**收尾必须重取 + 每次逐条 diff**」。

---

## 0. 当前可以并行的两条线

| 线 | 归属 | 状态 | 阻塞于 |
|---|---|---|---|
| **第 7 步** mockup 闸合并 + 接执行点 | DS session | ✅ **已落地** `4a68e02d` · lab 已验收（§7） | — |
| **第 7b 步** 统一 stdout 输出契约 | DS session | ✅ **已落地** `4a68e02d` · lab 已验收（§7） | — |
| **第 8 步** retrospection S2 + S3 | lab session | ✅ 已交付（见 §6） | — |
| **第 9 步** 解 fail-fast | lab session | ✅ **处方已交付**（范围已收窄，见 §8） | 待 DS 执行 |
| **交叉校验缺口** | lab session | ✅ **处方已交付**（小改动，见 §8） | 待 DS 执行 |
| **第 10 步** golden set 冻结 | lab session | ✅ **已交付**（范围已改，见 §10） | — |
| **第 6′ 步** 噪声地板 | lab session | ✅ **正题已交付**（N=5 · MDE 已出 · 见 §12）⚠️ 仅 GT-001 口径 | — |
| **跨通道等价** | lab session | ⚠️ **一半**：subagent **判不等价（结案）**；manual **待用户人工跑 r006** | manual 等用户 |
| **第 11 步** | lab session | ⚠️ **分档交付**（见 §13）：`first-shot` 的 T1 那半 ✅ · `convergence` 判成探针 ⚠️ · `actionability` ⛔ 不开 | `actionability` 卡 §6.1 铁律 1（**第三家厂商**） |

**⇒ 现在 lab 侧只阻塞于一件事：manual 通道的 r006 要用户人工跑**（包见 [`runs/README.md`](../runs/README.md) §手把手版）。
**下一站三条**（都要用户授权）：
① 铺 GT-002/GT-003（点估计 **92 M**、区间 44–125 M —— ⚠️ 买区分度**不买统计力**，见 §13.2）；
② 加大 GT-001 的 N（买统计力，但过不去分辨率地板，见 §13.1）；
③ 解锁铁律 1 严口径 = **加一个他厂 API key**（零 token 成本），才能开 `actionability` / 铁律 2。

---

## 1. re-pin 已完成：三点口径，⛔ 别再用两点

| 记号 | sha | 是什么 | worktree |
|---|---|---|---|
| **P0** | `71ac2711` | 第一轮 + 第二轮第 8 步的 pin | `~/.ai-ds-lab/pins/tvu-ds-71ac2711` ⛔ **别拆**，是既有全部读数的基线 |
| **P1** | `339a72bf` | 处方落地 commit 的**父提交** = **归因基线** | `~/.ai-ds-lab/pins/tvu-ds-339a72bf` |
| **P2** | `4a68e02d` | 落地 commit = **当前 pin** | `~/.ai-ds-lab/pins/tvu-ds-4a68e02d` |

**为什么必须三点**：`git rev-list --count 71ac2711..4a68e02d` = **17**。
其中 16 个 commit 与这两份处方无关。拿 P0 算 delta，会把别人的漂移记到处方账上 ——
`KNOWN_SILENT` 那一项就实测差了整整 1 行（详见 delta 报告 §2.5）。

⇒ **协议已改**：re-pin 回报的第 1 项从「落地的 commit sha 范围」改为
「落地 commit **及其父提交** sha」。父提交才是 lab 能直接用的归因基线。

> ⚠️ 三个 worktree 都装了 `node_modules`（跑链需要）。`node_modules` 被 gitignore，
> 三个 worktree 的 `git status` 均为空，pin 未被污染（已核）。

---

## 2. 第 9 步为什么不再被阻塞（以及当时哪里判断错了）

`round2-status` 旧 §1 写的是「第 7 步改了 `prepublishOnly` 链条组成 ⇒ 第 9 步处方到货即过期」。

**实测：前提不成立（勘误 E23）。**
合并的那 10 条 mockup 闸**本来就不在 `prepublishOnly` 链里** —— 它们正是第一轮点名的未执行那批。
合并前后 `prepublishOnly` **逐字未变**（39 步）。

⇒ 当时高估了串行的必要性。**真正需要等 DS 的只有一件事：成本画像**
（要在合并后的树上量，且要 `node_modules` 才能跑）。这一条现在量完了。

---

## 3. 并行的两条硬纪律（不变）

1. **pin worktree 必须落在 DS 工作树之外**（`~/.ai-ds-lab/pins/`）。
   仓内 worktree 会被 DS 自己的 glob 算成重影 —— 勘误 E3、DS 侧 `410cd11b`。并行时它就是污染源。
2. **lab 不 re-pin，DS 落地后主动回报。** 两边都不主动，delta 就采不到。
   ⇒ 本轮 DS 把回报写进了 commit message，可用；但**第 1 项要带父提交 sha**（§1）。

---

## 4. 处方清单与执行状态

| 处方 | 对应 | 状态 |
|---|---|---|
| `2026-08-24-mockup-gate-merge.md` | 第二轮第 7 步 | ✅ **已执行** `4a68e02d` · lab 已验收 |
| `2026-08-24-gate-output-contract.md` | 第二轮第 7b 步 | ✅ **已执行** `4a68e02d` · lab 已验收 |
| `2026-08-24-archive-triage.md` | 第一轮第 2 步（归档三分法） | 待 DS 执行 · ⚠️ 已就地改数（见 §6） |
| `2026-08-24-stale-anchors-codespan-gap.md` | 第 8 步前置（补安全网） | 待 DS 执行 · **是下面那份的前置** |
| `2026-08-24-retrospection-adr.md` | 第二轮第 8 步（S3 提炼 + 分批删） | 待 DS 执行 |
| **`2026-08-25-chain-failfast-denominator.md`** | 第二轮第 9 步（**范围已收窄**） | **新 · 待 DS 执行** |
| **`2026-08-25-crosscheck-denominator-gap.md`** | 7b 的补丁（造故障发现） | **新 · 待 DS 执行** |

### 4.1 元指标（§13.1）第一次有了非零分子

「`proposal 采纳率 × 采纳后指标实际改善的命中率`」此前**分子分母都是 0**。现在：

- **采纳率**：7 份里 **2 份已执行**。
- **采纳后指标实际改善的命中率**：2 份都**命中了它们承诺的指标**，且是 lab 独立量出来的 ——
  `KNOWN_SILENT` 46 → 35（N32）、契约分母可读 0 → 11 条、上线当天抓出 1 条真假绿（N33）。
- ⚠️ **但也各有一处没兑现**：第 7 步的取数/耗时 lab 无法复核（要真调 Figma REST，被明文禁止），
  第 7b 步的交叉校验有一格漏（N27）。⇒ **不是「全中」，是「主指标中、边角有漏」。**

---

## 5. DS 真源的既有脏文件（不是 lab 造成的，别扫进 commit）

```
 M skills/shared-vocab-rules/vocabulary.md
?? docs/internal/_generated/backlog-owner-decisions.html
```

自 2026-08-24 lab 接手时就在，跨了另一个 session 的多个 commit 仍在（2026-08-25 复核仍在）。
⇒ DS session 提交时**不要 `git add -A`**，逐文件加。

---

## 6. 第 8 步交付了什么（2026-08-24，未变）

报告：[`reports/2026-08-24-retrospection-s2-s3.md`](../reports/2026-08-24-retrospection-s2-s3.md)

| 项 | 读数 |
|---|---|
| S1 分类**修正** | live-source 15 → **18 份**；S2 待判 38 → **35 份 / 4,665 行** |
| S2 裁决 | `extract-then-delete` 32 · `delete` 2 · `hold-for-human` 1 · **108 条证据全部逐字定位通过** |
| S3 提炼 | **106 条**结论候选，7 份带未闭合项 / 需 owner 裁定 |

**两件事 DS 侧仍需知道**（**均未因 re-pin 而失效**）：

1. ⛔ **§11.4 安全网第 1 层实测近乎无覆盖**（勘误 E19）。⇒ **先落 `stale-anchors-codespan-gap.md`，再动任何删除。**
2. `ds-doc-graph.mjs` 入站判据补了第 ④ 条 ⇒ `archive-triage` 的 `_reports` 可删量
   9 份 1,430 行 → **8 份 1,171 行**（已就地改）。

### 6.1 第 8 步的已知不足（不要当成已验证）

- **S2 是单裁判 AI 判定**，未满足 §6.1 铁律 1（三票须异构）与铁律 2（评委方差抽样复判）
  ⇒ 裁决**不具备 §6.1 要求的统计有效性**。复核器只验自洽 + 证据可定位，**不验对不对**。
- 因为安全网第 1 层无覆盖，**当前没有任何机制验证 S2 裁决的语义正确性**。
  处方里那条「补闸后闸红的清单 vs lab `path 口径` 的有入站清单**逐条对账**」是唯一的语义交叉验证 —— ⛔ 别跳过。
- `docs/internal/retrospection` **22 份 / 2,246 行**（现行、非归档）仍未覆盖（N8）。

---

## 7. 第 7 / 7b 步 delta：一句话结论

完整报告：[`reports/2026-08-25-round2-step7-7b-delta.md`](../reports/2026-08-25-round2-step7-7b-delta.md)

| 量（P1 `339a72bf` → P2 `4a68e02d`） | 前 | 后 |
|---|---:|---:|
| `KNOWN_SILENT` 具名豁免（生效行口径） | 45 | **35**（缩 10 增 0） |
| 在链闸走强制契约构造器 | 0 | **11** |
| 运行时 `totals.findings` 可读（真读得出计数） | 2 | **11** |
| 运行时 `totals.checkedUnits` 可读（**分母**） | 0 | **11** |
| 全链热态总耗时（N=3） | 8,718 ms | 8,847 ms（**+129 ms < 2σ=205 ms ⇒ 不算数**） |

- ✅ 契约**上线当天抓出 1 条真·假绿**：`audit:figma-conformance` = `exit 0 · findings 0 · checkedUnits 0`（N33）。
- ⚠️ **造故障发现收割器一处真缺口**：`findings>0 ∧ checkedUnits=0` 不报、exit 0（N27）⇒ 已出处方。
- ⛔ **lab 未能复核的三项**（如实登记，不算已验）：整文件耗时 27.02s / 请求数 3（要真调 Figma REST，禁止）、
  `unverified` 的行为验证、B1 真实端到端（要真写 Figma 文件，超出只读边界）。

---

## 8. 第 9 步处方：范围**收窄了**，别照 spec §10.3 抄

[`proposals/2026-08-25-chain-failfast-denominator.md`](../proposals/2026-08-25-chain-failfast-denominator.md)

spec §10.3 给第 9 步定了三个动作，实测后**只剩一个**：

| 原定 | 实测 | 结论 |
|---|---|---|
| 按成本重排 | 全链仅 **8.7 s**，单条 `audit:plan-lifecycle` 占 **70%（6.2 s）** | ⛔ **砍掉**（勘误 E24） |
| 分组并行 | 理论天花板收益 **2.7 s**，代价是把 39 步线性链改成并行图 | ⛔ **砍掉** |
| 解 fail-fast | N10：164 条失败 run 平均 9.1 条闸没跑到，跑到比例中位 56% | ✅ **唯一保留** |

**⇒ 第 9 步的理由与「省时间」无关，是 N10 分母可比。**
§10.3 当年建在「625 份 HTML 被解析 13 遍」这个已被 E3/E4 推翻的图景上。

顺带登记（**不在第 9 步范围内，但要一起排期**）：`audit:plan-lifecycle` 的 6.2 s
会被第 9 步**放大**（从「有时付」变成「每次付」）。

---

## 9. lab 的量具本轮改了什么

| 文件 | 改动 |
|---|---|
| `adapters/ds-gate-output-contract.mjs` | 新增**判据 ⑤**（契约辅助函数发射）+ 边界 ⑥⑦ + 5 条契约档控制；控制集按 `contractEra` **分档断言** |
| `adapters/ds-gate-chain-run.mjs` | **新建**。39 步逐步独立实跑：耗时（丢弃第一次）+ **lab 独立实现**的契约尾部解析 + 交叉分类 + 15 条内建控制 |

**可复现性控制**：判据 ⑤ 在契约前的 pin 上是**完全的 no-op** ——
P0 上扩展前后静态结果**逐字节相同**，12 条控制全过。

新增读数落在 `subjects/tvu-ds/inventory/`：
`gate-output-contract-{339a72bf,4a68e02d}.json` · `chain-run-{339a72bf,4a68e02d}.json`

---

## 10. 第 10 步（golden set 冻结）交付了什么 —— ⚠️ 范围改了，别照 spec §14 抄

报告：[`reports/2026-08-25-round2-step10-golden-set.md`](../reports/2026-08-25-round2-step10-golden-set.md)

spec §14 写的是「**补** 10–15 条 golden task」。**两个前提实测都不成立**（勘误 E25/E26）：

| 原定 | 实测 | 结论 |
|---|---|---|
| 「**补**」（预设已有 set） | lab 无 `tasks/`、无 `runs/`；DS pin 上 golden 语料 **0** | 是**从零建** |
| 「**10–15 条**」 | 生成侧调用 spec **从未计价**；§6.2「N≥5」与 §6.3「3 重复」自相矛盾 | ⇒ 改 **3 条** |

**条数是被成本倒推的，不是拍的**（两个口径，AGENTS §3.7）：单次注入
**254,846 token**（声明规则文档集口径，**上界**）/ **25,142**（入口文件口径，下界），差 **10.1 倍**。
真值要等第一次 run 的 `contextManifest`（§5.1）⇒ **真值未知时按上界选（fail closed）**：
3 条 × N=5 = 3.82 M 可承受，15 条 = 19.11 M 不可。
且这与 DS 自己 P0 计划 §P2 的「2-3 个任务」**独立吻合**。

### 10.1 冻结物

`tasks/tvu-ds/v1/` —— 3 条，三 archetype，各自的真实需求出处在 pin 上**逐字可定位**：

| taskId | archetype | 出处 |
|---|---|---|
| GT-001 | 列表台 | `_plans/2026-07-24-p0-systematic-gap-fixes.md:4`「直播源管理」 |
| GT-002 | 表单流 | `_archive/_design-kickoffs/v4-1827-ndi-into-ipsource.md:11`「V4-1827」 |
| GT-003 | 数据可视化 | `_metrics/phase0-ledger.md:45`「chart primitives 不在 library scope」 |

量具 `metrics/golden-set-freeze.mjs`：5 项判据 + 双向夹逼 + **9 条内建控制**，
**5 次造故障全部拦住**（exit 1）。每次用之前跑：

```bash
node metrics/golden-set-freeze.mjs --pin ~/.ai-ds-lab/pins/tvu-ds-4a68e02d
```

### 10.2 ⚠️ 一条要转给 DS 的：GT-002 的出处在 `archive-triage` 待删清单上

`proposals/2026-08-24-archive-triage.md` §2 桶三逐字列着 `_archive/_design-kickoffs | 2 | 210`，
判据是「外部入站 = 0」。**而 lab 的引用在 DS 仓外，DS 的 `ds-doc-graph` 结构上看不见**（发现 **N37**）。

- **已冻结的 v1 不受影响** —— pin worktree 是 detached 不可变快照，master 删了 pin 上照旧在。
- **影响在下一次 re-pin**：校验器会 fail ⇒ 触发 §7.5 set 升级。
- ⇒ **DS 执行 archive-triage 时不必为此停手**，但要知道这一格；lab 会在 re-pin 时按 §7.5 换出处。

### 10.3 ✅ 已裁决（2026-08-25）—— 结论见 §11.1

§5.1 执行纪律：「每次 run 必须在**全新会话**、固定 cwd」。
3 条 × N=5 = **15 个干净会话** —— 这是 6′ 的真门槛，**不是 token 数**。
而「**subagent 算不算『全新会话』**」spec 没裁过。两种答案给出两种实验：

- 算 ⇒ 15 个 subagent 可在少数 session 内跑完，但 `contextManifest` 里 harness 类型要如实记「subagent」
- 不算 ⇒ 要 15 次真正的新开 session，人工触发成本按 §15 重新评估

⇒ **这是 6′ 的第一个动作，不是跑到一半再补。**

### 10.4 第 10 步没覆盖的（⛔ 不算已验）

1. **三条 task 的实际区分度未知** —— 要跑完 6′ 才知道。本轮只保证「冻结物完好 + 出处可定位 + 判据存在」。
2. **T2 通道不可得**：`codex`/`gemini`/`llm`/`ollama`/`mistral`/`cohere`/`aichat` 本机**全 absent**，
   仅 `OPENAI_API_KEY` 存在（**未验证、未调用** —— 要花钱，需用户点头）。
   ⇒ §6.1 铁律 1「三票异构」最多凑到 2 家。**v1 的判据绑定全压在 T1**，⛔ 不预设 T2 可用。

> ⚠️ **上面第 2 条已被 6′ 推翻（2026-08-25）** —— 那个「全 absent」是 `command -v` 的**假阴性**
> （发现 N41/N44）。`codex-cli 0.149.0-alpha.4.3` 藏在 VSCode 扩展里，已实调跑通。详见 §11.3。

---

## 11. 第 6′ 步（噪声地板）交付了什么 —— ⚠️ **正题未交付**，别读成已完成

报告：[`reports/2026-08-25-round2-step6prime-noise-floor.md`](../reports/2026-08-25-round2-step6prime-noise-floor.md)

**一句话**：装置全齐、第一份 `contextManifest` 到手、成本真值到手，
但 **MDE 没出** —— 校准档 N=2 < §6.2 要求的 5，量具**结构上拒绝输出 MDE**（fail closed）。

### 11.1 §10.3 那个口径的裁决结果

用户裁的是「**判据化 + 先跑校准**」。⇒ **不裁「subagent 算不算全新会话」这个词，裁判据**：

> 两通道对 §5.1 等价 ⟺ **L1（确定性层）逐字段同构**（cwd 事实 + 入口规则文件 sha + hook 注入面 sha
> + **注入投递证据** ⇒ 落成可比对的 `L1Fingerprint`，1 run/通道即可判）
> **且 L2（随机层）结构可比**（两通道都得有非空按需加载面）。

**本轮验到哪**：

| | 状态 |
|---|---|
| **通道内**（headless × 2） | ✅ `L1Fingerprint` 逐字节相同（`87517baf72da418f…`）· 投递证据 4/4 |
| **跨通道 manual** | ⛔ **未跑**（要人工开真 session；包已备在 [`runs/README.md`](../runs/README.md)） |
| **跨通道 subagent** | ⛔ **完全未测**（本 session 系统约束禁止未经用户要求调 Agent 工具） |

⇒ **「subagent 算不算」本轮仍无答案**，但已从口径争论变成「跑一个 run 就能回答」的问题。

### 11.2 三个新量具（纯 Node 零依赖，D4）

| 文件 | 干什么 | 内建控制 | 造故障 |
|---|---|---|---|
| `metrics/context-manifest.mjs` | 采 §5.1 的 `contextManifest`（L1/L2 分层） | **12 条** | **5 次全拦** |
| `adapters/run-golden-task.mjs` | 跑 golden task，落 §5.1 三件套；通道可插拔（headless / manual） | 前后核 pin，脏即判 run 作废 | — |
| `metrics/noise-floor.mjs` | 打 T1 分、算散布；**N<5 拒绝输出 MDE** | **8 条** | — |
| `adapters/t2-probe-codex.mjs` | T2 通道探针（他厂 juror） | **8 条** | — |

### 11.3 三条要转给别人的

1. **⚠️ 给 DS：`onboarding-checklist.sh` 在 git worktree 里恒降级（N40）。**
   它用 `[ -d "$CLAUDE_PROJECT_DIR/.git" ]` 判 git 仓库，而 **worktree 的 `.git` 是文件**
   ⇒ 恒判 false ⇒ 每次都注入「探测失败 ⇒ 当作有并行 session」整段。
   **讽刺点：那段注入的正文正是「起手就开 worktree」—— 它推荐的机制会让它自己失效。**
   ⇒ 修法是 `-d` → `-e`。⚠️ 但 lab 已把这个降级钉成 must-hit（MH2），DS 修了 lab 的控制会当场炸 ——
   **那是设计意图**（注入面变了 ⇒ 既有读数不可比），不是 bug。修之前先知会 lab。
2. **T2 通道已跑通（N44）** —— 第 11 步的 T2 那半不再是无解前置。
   ⛔ 但只跑了一次、只有两家厂商、且 **铁律 2 结构上仍不可执行**（要 MDE，本轮没给）。
3. **`OPENAI_API_KEY` 已验证可用于鉴权**（`codex login status`）—— 第 10 步 §11.4 那一格可销。

### 11.4 新增勘误 E29–E32（详见报告 §8）

| # | 一句话 |
|---|---|
| **E29** | 成本模型把「一次 run」当成「一次 API 调用」。实测一次 run 是 ~70 次工具调用的 agentic loop，累计注入 = 唯一内容的 **36×** ⇒ 15 run 真实成本 **170 M token / 5.5 小时**，是第 10 步估算的 **44 倍**。⚠️ 错的不是单次注入那个数（估得准），是乘法次数 |
| **E30** | §15「单轮 10 分钟」适用面从未区分。对静态 T1 成立（全链 8.7 s），对生成侧结构上不成立 ⇒ 6′ 本质是批处理作业 |
| **E31** | §6.3「T2 的成本控制」建在「T2 是贵的那半」上，**实测反了** —— 生成侧比整个陪审团贵 **69×**。该约束值得留，但**理由要重写** |
| **E32** | §5.1 把 `contextManifest` 当固定标识写，**实测它自己有噪声地板** —— 同通道两 run 的 L2 文件数差 20%、字节差 18% ⇒ 必须分层，否则 `convergence` 测到的仍是它想避免的 session 噪声 |

### 11.5 ⛔ 6′ 未覆盖的（不算已验）

1. **MDE 本身**（正题）—— N=2 < 5。放量到 N≥5 要用户再授权（**3 条 × N=5 ≈ 170 M token / 5.5 小时串行**）。
2. **跨通道等价** —— manual / subagent 都没 run。
3. **GT-002 / GT-003 一次没跑过** —— 三条 task 的相互区分度仍未知（第 10 步 §11.1 原样保留）。
4. **保真度缺口两处** —— run 不能写文件/自查、无 Figma MCP ⇒ 测的是「不能自查时的一次成型质量」。
5. **T2 只跑了一次、只有两家厂商、铁律 2 不可执行**。

> ⚠️ 上面 §11 整节是**校准档**的记录。第 1、2 条已被 §12（放量档）部分推进，
> 第 3–5 条原样保留。⛔ 别把 §11 读成当前状态。

---

## 12. 第 6′ 步放量档（2026-08-25 下午）—— 正题交付 + 三条给 DS 的回话

报告：[`reports/2026-08-25-round2-step6prime-b-mde.md`](../reports/2026-08-25-round2-step6prime-b-mde.md)

### 12.1 ⚠️ DS 真源已跑到 `b7302741`，且**改了闸链的组织形态**

| 面 | `prepublishOnly` | `gate-chain` |
|---|---|---|
| 三个 pin（含当前 pin `4a68e02d`） | 39 步 | **ABSENT** |
| DS 真源 `b7302741` | **1 步**（退化成委托） | **39 步** |

⇒ lab 的量具已按 **`chainEra` 分档**（`gate-chain` 优先、缺失回落 `prepublishOnly`、
读了哪个 key 写进产物 `chainSource`、两档各自 must-hit + 跨档 must-not-hit）。
⇒ **发现 N45**：DS 点名了 2 个文件，lab 侧实际有 **3 个**消费者 ——
第三个 `metrics/context-cost.mjs:77` 还是 fail open（`?? ''` 会静默塌成 0 步），一并修了。
⇒ 验证：当前 pin 上 **no-op**（2,108 行逐字节相同）· 两档读数**等价**（差异 0 行）·
反事实（旧代码读新形态）**两个量具都 exit 1**。

### 12.2 MDE 出了，且推翻了校准档一条核心观察

| 指标 | mean | **MDE(2σ)** | MDE/mean |
|---|---:|---:|---:|
| `ds-conformance.errors`（严口径） | 1.6 | **3.0332** | **190%** ⛔ 判不出改善 |
| `escape-rate.unmatchedDistinct`（DS 缺的洞口径） | 18.2 | 3.847 | 21% ✅ 能用 |
| `escape-rate.escapeRate`（比率口径） | 0.391 | 0.063 | 16% ✅ 能用 |
| `output.htmlBytes` | 77,754.8 | 9,384.55 | 12% ✅ |

⛔ **校准档说的「离散型 T1 零变异」是 N=2 假象** —— N=5 实测 `ds-conformance.errors` 是全表方差**最大**的（CV 94.8%，逐 run `[1,1,4,0,2]`）。
⇒ **第 11 步选主验收指标时，⛔ 别选 `ds-conformance.errors`**，选 `escape-rate` 那一族。
⇒ DS 的复现判据从 2/2 变 **4/5**（仍达标）。

**成本**：3 个新 run 实耗 **23.3 M token / 2 路并发 35.5 分钟**（低于预估 31%）。
N=5 单 run 均值 9.20 M（校准档外推 11.33 M **偏高 23%**），且成本自身 **CV 32.7%、极差 2.85 倍**。

### 12.3 跨通道：subagent **结案（不等价）**，manual 待跑

**subagent 判不等价**，四层证据：`pwd` 不是 pin · `cd` 不跨工具调用持久 ·
`CLAUDE_PROJECT_DIR` 空 · Agent 工具**无 cwd 参数**（`isolation: worktree` 开的是 lab 仓的）。
⇒ **§10.3 挂了两轮的口径问题结案**：15 个干净会话**不能**用 15 个 subagent 顶替。
⇒ 只花了 35,573 token 判掉，⛔ 没跑那个注定不可比的 11 M run。

**manual（r006）待用户跑** —— 见 `runs/README.md` 的「📋 手把手版」。

### 12.4 发现 N46：`context-manifest.mjs` 把「被工具拒的读」当成了成功读

`Read` 会被拒（文件不存在 / 整文件超 256 KB）。采集器不看 `tool_result.is_error` ⇒ 两个虚高：
**r003 的 L2 字节虚高 2.18 倍**（591,391 → 271,554）、r004 份数虚高 1 份。
⇒ 补 `MN7`/`MN8`/`MH7`，收窄 `MN6`，`MH6` 改双口径。
⇒ **r001/r002 的既有读数不受影响**（0 条失败读，逐字段 no-op），5 个 run 的 `L1Fingerprint` 仍全同。

### 12.5 给 DS 的三条回话

| # | DS 说的 | lab 复核结论 |
|---|---|---|
| 1 | 量具改读 `scripts['gate-chain']` | ✅ 照做，**但必须分档**（三个 pin 上该 key 不存在）+ **你的清单漏了 `context-cost.mjs`** |
| 2 | `archive-triage` §5 换分母成 `declaredRuleDocs` | ⚠️ **只对一半**：`totals.docs` 确实不该用，但 `declaredRuleDocs` 与删除清单**交集 = 0** ⇒ 换了就恒真。**修法是换指标不是换分母**（勘误 E33） |
| 3 | `retrospection-adr` §2 的 106 条不穷尽（E9 是实证） | ✅ 采纳（覆盖率实测 **47.7%** 行口径，勘误 E34）。⚠️ **但 E9 对不上号** —— lab 的 E9 是 spec §14 排序错误，请补出处 |

**另有 N40 一条仍要知会 DS**（原 §11.3 第 1 条）：修 `onboarding-checklist.sh` 的 `-d .git` 前先告诉 lab，
lab 的 MH2 会当场炸 —— **那是设计意图**。

---

## 13. 第 11 步（2026-08-25 傍晚）—— **分档交付**，别读成「第 11 步开完了」

报告：[`reports/2026-08-25-round2-step11.md`](../reports/2026-08-25-round2-step11.md)
计划与口径裁决：[`docs/round2-step11-plan.md`](round2-step11-plan.md)

**零新生成 run** —— 全部复用 6′ 那 5 份既有产物。

| 格 | 结果 | 卡在哪 |
|---|---|---|
| `first-shot` | ✅ **T1 那半交付**（`metrics/first-shot.mjs` · 14 条控制 · 5 次造故障全拦） | T2 那半卡铁律 1 |
| `convergence` | ⚠️ **判成探针**（`metrics/convergence-probe.mjs` · 11 条控制）—— **只出点估计，⛔ 无地板** | 它是散布量 ⇒ 地板要**嵌套设计**（K 组 × N） |
| `actionability` | ⛔ **不开** | §6.1 铁律 1 要三家异构评委，**六层扫描后确认本机只有两家** |

### 13.1 ⛔ 选主验收指标的硬约束**又收紧了一格**：比例型指标有**两个**地板

6′ 只量了噪声地板（MDE）。**比例型指标还有第二个地板，且 N 加到多大都不动**：

> **分辨率地板 = 1 / 分母**（量化误差）。**有效地板 = max(分辨率地板, 噪声地板)。**

| 口径 | 分母 | 点估计 | 分辨率地板 | 噪声地板 | **有效地板** | 判「降到 0」 |
|---|---:|---:|---:|---:|---:|---|
| ①闸口径（run 级二值） | 5 run | 0.20 | 0.20 | 0.80（Fisher） | **0.80** | ⚠️ **落在边界**（比=1.00） |
| ②规则口径·全分母 | **5 条规则** | 0.84 | **0.20** | **0.1584** | **0.20** | ⛔ 判不出 |
| ②'规则口径·**有效分母** | **1 条** | 0.20 | **1.00** | 0.7924 | **1.00** | ⛔ 判不出（且退化成①） |
| ③格口径（run×rule） | **25 格** | 0.84 | **0.04** | **0.2905** | **0.2905** | ⛔ 判不出 |
| ④逃逸·`1−escapeRate` | 302 | 0.609 | 0.0033 | 0.0558 | **0.0558** | n/a |
| ④逃逸·`unmatchedDistinct` | 整数 | 18.2 | 1 | 3.4082 | **3.4082** | ✅ **判得出**（比=5.34） |

**⇒ 仍然只有 `escape-rate` 一族能做主验收**（与 6′ 的结论同向），但现在有了结构性理由：
**②那一行的噪声地板（0.1584）比分辨率地板（0.20）还小** ——
只报 MDE 会读成「能判出 16% 的改善」，而这个指标**根本表示不出小于 20% 的移动**。

### 13.2 三条「买不到统计力」的动作，同构

| 动作 | 买到什么 | ⛔ 买不到 |
|---|---|---|
| 铺 GT-002/GT-003 | **区分度**（不同 task 是不同被测对象）—— ✅ **已做，实测见 §15** | 统计力 |
| 拆细分母（格口径） | **分辨率**（0.20 → 0.04） | 统计力（噪声地板反而 0.1584 → **0.2905**） |
| 加大 GT-001 的 N · **规则口径** | **统计力** ✅ | 过不去**分辨率地板**（0.20 > 噪声地板 0.1584 ⇒ 分辨率主导） |
| 加大 GT-001 的 N · **主验收口径**（`unmatchedDistinct`） | **统计力** ✅ **且真能用** | — ⇒ **N 加到 58 之前分辨率地板一直不咬人**（1 << 噪声地板 3.41） |

⚠️ **订正（`lab:E40`，2026-08-26）**：最后两行原本合成一行写作「加大 N ⇒ 过不去分辨率地板」，
**那是把规则口径的结论写成了通用结论**。两个口径**谁主导地板是不同的**：
规则口径分辨率主导（加 N 无用），主验收口径噪声主导（加 N 到 58 之前一直有效）。
⇒ 同族于 `lab:E39`、AGENTS §2.4。详见 [`reports/2026-08-25-round2-task-discrimination.md`](../reports/2026-08-25-round2-task-discrimination.md) §5。

**⇒ 统计力只能靠增加独立复现单位（run）来买；而 run 加得再多也过不去分辨率地板 ⇒ 两件事都要做，或者换口径。**

### 13.3 `convergence` 为什么只能是探针 —— 以及那个数

它是**散布量** ⇒ 判「变好了」要比较两个散布估计，而 `sd` 自身的相对标准误 = `1/√(2(N−1))`：

| N=5 | N=10 | N=20 | **N=51** |
|---:|---:|---:|---:|
| **35.4%** | 23.6% | 16.2% | **10.0%** |

⇒ 要压到 10% 需 **N ≈ 51**，且判改善要**两组**（跨 DS 改动前后 ⇒ **还要 re-pin**）。
⇒ 成本 = `K × N × 单 run 成本`，**不是** 6′ 那种 `N × 单 run 成本`。

**点估计（⛔ 不得用于改善判定）**：组件面平均两两 Jaccard 距离 **0.4136**；
**16 个曾用组件里只有 6 个是每个 run 都用的**（`Button` `MenuList` `Notification` `PopupBox` `Table` `TopBar`）。
⇒ **一轮之内第三次撞到「随机层比假设的宽」**（前两次：6′ §2.3 的打分指标、§4.6 的 `.md` 实读面）。

### 13.4 `actionability` 卡的**不是「没有他厂 CLI」**

六层扫描（AGENTS §3.11 只要求四层）：PATH / 包管理器 / brew·pipx·Applications / 编辑器扩展捆绑 /
**模型访问权（本轮新增口径）** / **登录态·本地推理**。

⇒ 可得厂商恰好**两家**：Anthropic（`claude` 二进制）、OpenAI（`codex` 0.149.0-alpha.4.3，已鉴权）。
⇒ `github.copilot-chat` 看着像第三家，**两重不合格**：无捆绑 CLI（只有 wasm）+ 它路由的是 GPT/Claude/Gemini ⇒ 与已有两票同源。
⇒ **铁律 1 要的是「不同厂商的模型」，不是「不同的 CLI」** ⇒ **一个他厂 API key 就够，零 token 成本**（勘误 E38）。
⇒ ⚠️ **铁律 2 仍未执行** —— 6′ 说「MDE 到手后结构上可执行」，但它要**评委方差**，而评委还凑不齐。

### 13.5 给 DS 的回话：**5 条** —— ⚠️ **DS 已在 `a9e7169` 答了前 4 条，见 §14**

| # | 事项 | lab 的话 |
|---|---|---|
| 1 | 量具改读 `scripts['gate-chain']` | ✅ 照做但**必须分档**；⚠️ **你的清单漏了 `metrics/context-cost.mjs:77`**（N45） |
| 2 | `archive-triage` 换分母 | ⚠️ **只对一半**（E33）：换了就恒真，**修法是换指标不是换分母** |
| 3 | `retrospection-adr` 的 106 条 | ✅ 采纳（47.7% 行口径，E34）；⚠️ **你引的 E9 对不上号，请补出处** |
| 4 | `onboarding-checklist.sh` 的 `-d .git`（N40） | ⚠️ 修法是 `-d`→`-e`，但 lab 的 **MH2 会当场炸 —— 那是设计意图**。**修前先知会 lab** |
| **5** | **新增：请裁 §6.1 铁律 1 的口径** | 「不同厂商**/**型号」的斜杠读哪个？**严口径**不可得（解锁 = 加一个他厂 key）；**宽口径**现在能开但理由句部分失效。⇒ **lab 可先出「同厂两票相关性」读数供你裁**（走铁律 2 的 20% 重判顺带就有）。⛔ 本轮 lab 不替你裁 |

⚠️ **事实变化**：DS 真源 HEAD 从 `b7302741` 又跑到 **`6b8ad767`**（§12.1 记的是前者）。
lab 的 `chainEra` 分档**不受影响**（按 key 存在性判档，不按 sha）。

### 13.6 新增勘误 E35–E38（详见报告 §7）

| # | 一句话 |
|---|---|
| **E35** | **恒真分母稀释**：比例的分母里若有恒真项，会抬高读数并稀释分辨率。5 条规则里 4 条恒真 ⇒ 有效分母 = 1。与 E33 同族不同形态 |
| **E36** | 6′ §2.4 的「**出路 3**」（跨 run 聚合）**不是出路** —— 只降分辨率，噪声地板反而升 |
| **E37** | 6′ §2.2 的 `exitCode` 那行要订正：二值口径不该用 2σ。Fisher 精确 p=**0.0476** ⇒ 是「**落在判定边界**」不是「判不出」 |
| **E38** | 卡住 T2 的不是「没有他厂 CLI」，是**没有第三家厂商的模型访问权** —— N41/N44 的扫描口径漏了一整类通道 |

> ✅ 另有一条是**背书不是勘误**：6′ 的 `2σ` 启发式与正式两样本公式相差 13%，**方向安全，结论不翻**。

### 13.7 ⛔ 第 11 步**未覆盖**的（不算已验）

1. `first-shot` 的 **T2 那半未交付**（量具产物里 `t2Half.delivered = false`）⇒ ⛔ 别当完整 `first-shot`。
2. `convergence` **没有地板**，只有点估计。
3. `actionability` **一格没动**；且即便铁律 1 解了，它还额外要**新生成 run**（4 个修复 run）。
4. **铁律 2 仍未执行**（6′ §6 第 3 条那一格原样保留）。
5. **manual r006** 仍待用户人工跑。
6. ~~**GT-002 / GT-003 仍一次没跑过**~~ ⇒ ✅ **已销账（2026-08-26）**：各铺到 N=5，
   §13.1 那条「4 条规则未曾曝光」**重核结果是「每条 task 各有 4 条恒真，但恒真的不是同一批」** ——
   三 task 合并曝光面 1 → 3 条。详见 §15 与 [区分度实验报告](../reports/2026-08-25-round2-task-discrimination.md) §3。
7. 组件面检测的另两个失效形态未量（根 class 撞车 / 真手搓）；只有「`:class` 动态绑定」那个被实证并钉住（MN6）。

---

## 14. DS 已回话（commit `a9e7169`，2026-08-25 16:22）—— ⚠️ 它给 lab 派了活

真源：[`docs/ds-reply-2026-08-25.md`](ds-reply-2026-08-25.md)（DS session 新建，刻意没动本文件；DS HEAD `6b8ad767`）

> ⚠️ **本轮的一个流程事实**：这条 commit 在会话起始的 git 快照里**没出现**（快照停在 `dd171ee`），
> 是 push 时才看到 —— 我的 commit 父提交就是它。⇒ **§13.5 那 5 条里前 4 条其实已被答**，
> 我写 §13.5 时不知道。**并行 session 下，「谁在等谁」不能只靠会话起始快照判。**

### 14.1 DS 答了什么

| # | lab 问的 | DS 答的 | lab 侧还要做什么 |
|---|---|---|---|
| 1 | 清单漏 `context-cost.mjs`（N45） | ✅ 成立。**形态 = 跨仓给封闭清单**（lab 的量具在 lab 仓，DS 仓里 grep 不到，却按「我知道有哪些」给了封闭清单） | — 结案 |
| 2 | E33 换分母只对一半 | ✅ 接受推翻，并自我登记：这正是 DS 同日复盘 §1 定义的「逻辑封闭」，**在写完那条的同一天又犯了一次同型**；缺的是「执行前再跑一次自审」 | — 结案 |
| 3 | E9 对不上号 | ✅ **补出处：两套编号空间撞号**。`lab:E9` = spec §14 排序错；`ds-adr:E9` = `archive-extracted-adr.md:95` 那条 ADR 结论。**E34 结论不变，只是出处指向 DS 那套编号** | ✅ **采纳「跨仓引编号带仓前缀」的约定**（`lab:E9` / `ds-adr:E9`） |
| 4 | N40 先知会 lab 再修 | ✅ owner 已裁定「**修，但等 lab 的信号**」，且**决定性理由用的是 lab 那条「注入面变了 ⇒ 既有读数不可比」**，不是 fixture 便利 | ⏳ **DS 正卡在等 lab 给信号 —— 见 §14.3，有代价要先拍** |
| 5 | 请裁铁律 1 严/宽口径 | ⏳ **未答**（本轮才提出，在 DS 写完之后） | ⏳ 等 DS |

### 14.2 DS 推翻 / 订正 lab 的四处（要改 `proposals/2026-08-24-retrospection-adr.md`）

DS 在 `6b8ad767` 又删了两份（含**处方判 `hold-for-human` 的那一份** ——
`process-gap-report-2026-06-11.md` 465 行，理由是它装的 4 条 owner-gated 未决项已被 owner 全部拍完）：

| 处 | 原文 | 现状 |
|---|---|---|
| §238 / §257 | 剩余 **19 份 / 3,325 行** | **18 份 / 2,841 行**（DS 主工作树口径 `6b8ad767`） |
| §241 | 「`process-gap-report` 保留 ⇒ **故无死链**，是 hold 决定的独立旁证」 | ⛔ **旁证已失效** —— 删它之后 `consistency-dimensions-audit-2026-06-12.md:5` 真成了死链，DS 已同批改成裸文本 |
| §237 / §275 | 「34 份 / **4,199 行**」 | DS 实删 **34 份 / 4,165 行** ⇒ 要订正 |

**⚠️ 但 DS 那条订正里有一句 lab 不同意（新勘误 `lab:E39`）**：
DS 说「`:275` 的 4,199 是提炼覆盖率的分母，**与 E34 的 47.7% 是同一个算式**」——**不成立，两个是不同口径**：

| 数 | 口径 | 关系 |
|---|---:|---|
| **4,199** | 34 份**删除清单**口径 | + 466（`process-gap-report`，判 hold 未删）= **4,665** ✅ 逐位对上 |
| **4,665** | 35 份 **S2 裁定面**口径 —— **E34 用的是这个** | ÷ 9,770 = **47.7%** |

⇒ **E34 的 47.7% 不用改。** 处方那两行仍要改成 4,165，**且要补口径名**。
⇒ 这本身是 AGENTS §2.4「引分母必须带口径名」的又一次实证 —— 这次踩的是 DS。

### 14.3 ⚠️ N40 的信号有个**藏着的代价**，要先拍再给

DS 在等 lab 说「MH2 换桩 还是 分档」。**但这不是纯技术选择** ——

`MH2` 钉的是 DS onboarding hook 在 worktree 里恒降级成「探测失败」这个**注入面事实**。
DS 一修 `-d`→`-e`，**注入面就变了**。而注入面是 §5.1 `contextManifest` 的 L1 层：

⇒ **6′ 那 5 个 run 的 MDE 只对「降级档」成立。修完之后的新 run 与它们不可并池**
（同 §5.2 三元组「不允许跨线直接 diff」的精神）。
⇒ **想要新档的 MDE，要重跑 N=5 ≈ 46 M token。**

**⇒ 已拍（用户 2026-08-25 16:4x）：走 A —— 暂不修。** 三条路当时摆的是：

| 路 | 动作 | 代价 |
|---|---|---|
| A | **先别修**，让 DS 挂着 | 0 token。DS 侧无排队成本（它自己说的），但那条精度缺陷继续留着 |
| B | **lab 先落 `injectionEra` 分档**（与 `chainEra`/`contractEra` 同构），再让 DS 修 | 分档本身零 run 成本；但**旧档 MDE 不能外推到新档** ⇒ 要么接受「MDE 只对旧档有效」，要么付 C |
| C | B + **重跑 N=5 拿新档 MDE** | ≈ **46 M token**（按 9.20 M/run；⚠️ CV 32.7% ⇒ 按区间读，22–62 M） |

⚠️ **⛔ 不推荐「换桩」那条**：把 MH2 换成不依赖 DS 缺陷的桩，会让「注入面变了」这件事**不再被任何控制拦住** ——
而那恰恰是 lab 唯一的可比性哨兵。换桩等于把哨兵撤了换清静。

---

#### 📩 **给 DS 的信号（答你 §5.1 的「请 lab 给一个信号」）—— 结论：暂不修**

| 项 | 内容 |
|---|---|
| **裁决** | ⛔ **`-d` → `-e` 暂缓，别现在落地。** 不是因为修法不对（`-e` 是对的），是因为**代价的时点不对** |
| **理由** | MH2 钉的是**注入面事实**，而注入面是 §5.1 `contextManifest` 的 **L1 层**（确定性层）。一修 ⇒ L1 变 ⇒ **6′ 那 5 个 run 的 MDE 只对「降级档」成立，新旧 run 不可并池**（同 §5.2「不允许跨线直接 diff」）。⇒ 想要新档 MDE 要重跑 N=5 ≈ **46 M token**（区间 22–62 M）。⇒ 而第 11 步刚证明**当前那批 MDE 里只有 `escape-rate` 一族能用**（§13.1）——在换掉可用的那一族之前，先别把它作废 |
| **lab 会在什么时候给绿灯** | **下一次 re-pin 的同一批动作里**。届时 lab 会：① 先落 `injectionEra` 分档（与 `chainEra`/`contractEra` 同构）② 明确「跨档不并池」③ 然后你再修。⇒ **一次性把注入面的换代和 re-pin 合并付，不要分两次作废读数** |
| **⛔ lab 明确不选的那条** | **不要「换桩」。** 把 MH2 换成不依赖 DS 缺陷的桩，会让「注入面变了」**不再被任何控制拦住** —— 那恰恰是 lab 唯一的可比性哨兵。**换桩等于把哨兵撤了换清静。** ⇒ 你 §5.1 里替 lab 列的两个选项（换桩 / 分档），lab 只接受后者 |
| **你侧的成本** | 0（你自己说「无排队成本」）。⇒ 这条**不占你的排期**，等 lab 的 re-pin 信号即可 |
| **顺带确认** | 你 §5.2 那条自我更正**对**：lab §11.3 原文（「恒判 false ⇒ 每次都注入整段」）准确，缺陷是**精度不是安全**。lab 侧无需改，你那条「防御在最需要它的场景失效」的提法 lab 收下了 |

### 14.4 DS HEAD `6b8ad767` 对 lab 量具分母的三处影响（lab 读数在 pin 上，**re-pin 后才跳变**）

> ⚠️ **2026-08-26 换代登记**：DS HEAD 已从 `6b8ad767` 跑到 **`27dbbaad`**（+8 commit）。
> 本节下表仍以 `6b8ad767` 为准（那是量过的口径）；`27dbbaad` 的影响面**未量**，⛔ 不算已验。
>
> | 项 | 实测 |
> |---|---|
> | 新增的 8 个 commit | 第三十三轮 `40e3043a`（证伪跨仓缺口，见 §14.6）+ F138/F139 闸回归面线（`bd53474d` / `ef14d6e8` / `27dbbaad`）等 |
> | ⚠️ **DS 有 session 正在活跃跑** | `27dbbaad` 提交于 **08-26 10:41**（判定时刻 10:58，**17 分钟前**）；当日已推 2 个 commit；工作树脏 2 个文件 |
> | ⚠️ **严/宽口径仍未答** | 已 grep `6b8ad767..27dbbaad` **全量 diff**，「严口径 / 宽口径 / 铁律 / actionability」**零处提及** ⇒ §13.5 第 5 条仍挂着。⛔ 不催 |
> | 对 re-pin 时点的影响 | `repinProtocol.why` 逐字要求「自然 re-pin 时机 = DS 侧**执行完某份 proposal 之后**」，而 DS 现在跑的是**闸回归面线（不是 lab 的处方）且正跑到一半** ⇒ **此刻不是自然 re-pin 时机**，本轮据此把换 `pinnedSha` 推迟（见 §16.1） |

| 改动 | 影响 |
|---|---|
| `audit:stale-anchors` 现行层扫描面 **224 份**，修掉 **10 条**真死链 | 若 lab 量「DS 死链存量」会跳变 |
| `_archive` 全部 `.md` 现 **55 份** | `doc-graph` / `archive-triage` 系列分母 |
| STATUS `design-review-queue` 镜像 **4 → 6** | 若 lab 量 STATUS 镜像一致性 |

⚠️ **N37 那两份删除对 golden set 的影响，已核**：GT-002 的两条引文出处
（`docs/_archive/_design-kickoffs/v4-1827-ndi-into-ipsource.md:11` / `:23`）在 DS 主工作树上**已随整个目录消失**
（删除 commit `483e3feb`，取回 `git show 483e3feb^:<路径>`），
**但 pin `4a68e02d` 上文件仍在** ⇒ **本轮 `golden-set-freeze` 仍 9/9 通过、6 条引文全部逐字命中**。
⇒ ⛔ **但 re-pin 时必须换出处**，否则 GT-002 的冻结物会失去可定位性。这是 N37 的具体到期日。

### 14.5 DS 给 lab 的两条方法论回礼（不是勘误）

1. **「扩扫描面本身是形态发现手段」第三次验证**：DS 把 stale-anchors 四类判据铺到 224 份上逐条判性质 ——
   **fragment 真缺陷 9/10、script 1/27、env 0/15、rule-ref 0/6** ⇒
   「四类要不要一起扩」这个问法**把 90% 和 0% 捆在了一起**。
   本次炸出的新形态：**blockquote 内的 fenced code block（`> ```ini`）没被跳过**
   ⇒ 与 lab 的 `stale-anchors-codespan-gap` 处方同族，该并进去。
2. **DS 自我更正一条，lab 原文是对的**：DS 一度把 N40 写成「静默跳过」，实测那个 hook 是 **fail closed**
   （照发警告、标明「探测失败」）⇒ **真实缺陷是精度不是安全**：worktree session 永远看到恒定的
   「探测失败」+ 一个**假的理由字串**，且拿不到真实 dirty 数。**lab §11.3 的原文从头到尾是准的。**

### 14.6 ⚠️ 那条「结构缺口」**已被 DS 自己证伪**（2026-08-26 订正）

> ⛔ **本节原文三句全错，但逐字保留在下方，不删。**
> 理由同 AGENTS §2.11：被推翻的框架要留痕，否则下一轮会照旧措辞再引一次。
> 推翻它的是 DS 自己 —— commit `40e3043a`（08-25 17:28，第三十三轮），**读 lab 仓源码活源**之后。

<details>
<summary><b>原文（⛔ 已失效，别照它引用）</b></summary>

> DS 仓里全仓 grep `ai-ds-lab` **12 处，全部是「处方出处」，零处是「别动这个，lab 依赖它」**。
> ⇒ **N37**（删了 lab 冻结物引用的目录）· **N40**（lab 把 DS 的降级钉成 must-hit）·
> `prepublishOnly` 改名炸掉 lab 三个量具的展开 —— **是同一个缺口的三个实例**。
> DS 侧目前没有任何机制能在改动前发现「这会不会炸 lab」。
> ⇒ 治法二选一（**owner 未拍**）：DS 侧登记一张「外部消费者依赖面」表？还是 lab 侧自己做 **DS-HEAD 漂移检测**？

</details>

**逐句订正**：

| 原句 | 实测 |
|---|---|
| 「三个实例是**同一个缺口**」 | ⛔ **是三种不同性质，答案不一样** —— 逐条判性质后：① npm script key **已闭合**；② DS 文件路径 = **唯一真待决项**；③ hook 注入面 **无 DS 侧动作**（解锁条件本就在 lab 侧） |
| 「DS 与 lab 的引用向闸都只扫本仓 ⇒ **跨仓引用谁都看不见**」 | ⛔ **lab 侧三类全都看得见，且全是 fail-closed**：`adapters/ds-gate-chain-run.mjs:174-179` 双档回落 + `chainSource` 显式记录读了哪个 key + 两档皆空则 `throw`；`ds-gate-mount-inventory.mjs:96` 同型 |
| 「治法**二选一**（owner 未拍）」 | ⛔ **两个候选一个已存在、一个被 DS 本仓规则禁止** —— lab 早有 DS-HEAD 漂移检测（`subject.json` 的 `driftAtFirstRound.commitsAhead` + `repinProtocol.dsMustReport` 五条）；而「DS 侧登记依赖面表」是**手维护的第二份会漂副本**，DS 明令禁止，且 lab 那些 fail-closed 断言**本身就是可执行的依赖面真源** |
| 「全仓 **12** 处」 | ⛔ 现行 **23**（DS 同一天下半场自己又加了一批）。⇒ ⛔ 别抄，跑 `git grep -ci ai-ds-lab`。**但那句结论仍成立**：23/23 全是「处方出处」形态，零处是反向依赖声明 |
| （隐含前提）「lab 不在 CI 可达面」 | ⛔ **从未成立** —— lab 有 remote（Gitea `ux-team/ai-ds-lab`） |

**⇒ 真缺口是「发现时点」，不是「可见性」**：
lab 在**下一次 re-pin / 下次跑量具**时报错，DS 在**改的那一刻**没有信号。

**⇒ owner 只需拍一个问题**（另两个不需要拍）：**DS 文件路径那一类**（冻结物出处被删/被搬）。
且它的形态已被 DS 的边界 B1 实证约束住：⛔ **别走「扩 DS 某个闸扫描面」那条路**
（DS 文档里的外部仓路径与本仓同构目录词法不可分）。

⚠️ **lab 侧本轮的相关动作**：`C-missing-path` 这条判据按其头注释是「**下一次 re-pin 时**才 fail」——
DS 判定它是「唯一真待决项」正是指这个时点。**本轮（§16）把 N37 提前拆掉了**：
在 re-pin 之前主动换出处 ⇒ 那条判据下次 re-pin 时不会因 GT-002 而 fail。
⇒ **这给 owner 那个待拍问题提供了一个实测数据点**：缺口可以靠「lab 侧主动提前换出处」消化，
不必等它在 re-pin 时炸。⛔ 但这只消化了**已知的**那一处，**未知的**下一处仍无信号 —— 问题本身没被解决。

---

## 15. 区分度实验（2026-08-25 夜 → 08-26 晨）—— GT-002 / GT-003 各铺到 N=5

报告：[`reports/2026-08-25-round2-task-discrimination.md`](../reports/2026-08-25-round2-task-discrimination.md)
计划：[`docs/round2-task-discrimination-plan.md`](round2-task-discrimination-plan.md)

**成本**：成功 10 run **84.9 M**（8.49 M/run）· 含作废实付 **92.7 M** · 授权点估计 92 M ⇒ **几乎精确命中**。
**run id**：GT-002 = r007–r011 · GT-003 = r012–r015 + **r017**（r016 撞账号限额作废，见 §15.4）。
⛔ **r006 仍保留给 manual 通道，本轮未占用。**

### 15.1 主结论：DS 的闸指标**不能兼任测量指标**

| 指标 | 三对 task 里可区分几对 |
|---|---:|
| `ds-conformance.errors`（严口径） | **0 / 3** |
| `ds-conformance.exitCode` | **0 / 3** |
| `escape-rate.escapeRate` | **2 / 3** |
| `escape-rate.unmatchedDistinct` | 1 / 3 |
| `output.htmlBytes` | 1 / 3 |

⇒ 它是 pass/fail 闸不是测量仪，**本来就不该有区分度** —— 但 spec §7.2 的 `first-shot` 正建在它上面。
⇒ 比 6′/step11 的「MDE 太大判不出改善」（组内）**更强**：连三条完全不同的 archetype 都分不开（组间）。

### 15.2 ⚠️ 主验收指标的可用性是 **task 级**的

| task | `unmatchedDistinct` 效应量 / 有效地板 | 判定 |
|---|---|---|
| GT-001 | 18.2 / 3.41 = **5.34** | ✅ 判得出 |
| GT-002 | 9.4 / **11.93** = 0.79 | ⛔ **判不出**（六个口径全军覆没） |
| GT-003 | 13.6 / 7.15 = **1.90** | ✅ 判得出 |

⇒ **⛔ 别再写「只有 escape-rate 一族能做主验收」这种不带 task 口径的句子**（§13.1 那句要这样读）。

### 15.3 预注册预测 **2 HIT / 2 MISS** —— 两条 MISS 的信息量都比 HIT 大

预测冻结在 task JSON 的 `expectedDiscrimination` 里、跑之前就存在（MH6 断言逐字命中，未命中 0 条）。

- **P2 MISS**：错的不是「打多少」是「**打哪条**」。GT-002 打的是第三条 `handrolled-nav`（4/5 run）——
  prompt 里「顶部导航**不新增页签**」这条约束，诱发了**手搓 `<nav>`** 这个与约束无关的违规。
- **P4 MISS**：**预测和它的理由同时错**。理由句「chart primitives 缺位」已被 `lab:E41` 推翻。

### 15.4 新增勘误 `lab:E40` – `lab:E43`

| # | 一句话 |
|---|---|
| **E40** | §13.2「加大 N 过不去分辨率地板」**只对规则口径成立**；主验收口径噪声主导，N 加到 58 之前一直有效 |
| **E41** | **GT-003 的立论前提已失效** —— `src/components/Chart/` 在 pin 上真实存在（`tvu-chart`），且 GT-003 的 run 真的用了它。⚠️ task JSON 的 `boundaries` **逐字预警过这一天**，边界写对了 |
| **E42** | `convergence-probe` MH3 把「0 命中」钉成单解释「检测器坏了」——被 r007/r011 的**真手搓**推翻（边界 ②ⓑ 首次实证）。修法是把 §3.9「先证装置再归因」内建成两分支，⛔ 不是放松 |
| **E43** | `first-shot` MH2 钉的是**分布形状**（「4 个 1 + 1 个 0」）不是 task 特有事实 ⇒ GT-002 **巧合通过**，一条本该在换代时炸的控制**没炸** |

### 15.5 量具变化

- **新建** `metrics/task-discrimination.mjs`（12 条控制 · 6 次造故障全拦 · 三个检验均已用第二套实现独立对拍）
- **`taskEra` 分档**已在 `first-shot.mjs` / `convergence-probe.mjs` 落地，**三档都建好且都断言**；
  未建档的 task 走**建档档**并显式标 `baselineEstablishing`。两处改造均证明对 GT-001 读数 **逐字段 diff = 0 行**

### 15.6 re-pin 的动作清单又多一条（⇒ 三件事一次付清）

1. GT-002 换引文出处（`lab:N37` 的到期日）
2. **GT-003 重写立论**（`lab:E41` —— `whyThisTask` 与 P4 的理由句都建在已失效的前提上）
3. `injectionEra` 分档 + 放行 N40 的 `-d`→`-e`（§14.3 已裁）

⇒ ✅ **三条已于 2026-08-26 全部付清，见 §16。⚠️ 但换 `pinnedSha` 没做，且那是刻意的。**

---

## 16. re-pin 三件事一次付清（2026-08-26 上午）—— ⚠️ **`pinnedSha` 没换，别读成「re-pin 做完了」**

计划：[`docs/round2-repin-plan.md`](round2-repin-plan.md) · 报告：[`reports/2026-08-26-round2-repin-part1.md`](../reports/2026-08-26-round2-repin-part1.md)

**零新生成 run · 零 token 生成成本。**

### 16.1 ⚠️ 开工后实测推翻了「这三件事需要 re-pin」这个前提

用户拍板选 ③ 时（以及 lab 推荐它时），假设三件事都要等一个新 pin。**实测三条全错**：

| 事项 | 假设 | 实测 |
|---|---|---|
| GT-002 换引文出处 | 要新 pin 才能验新出处 | **替代出处 `phase0-ledger.md` 在旧 pin `4a68e02d` 上就逐字存在**（`V4-1827 Round 3` ×2 · `radio 三选一互斥` ×1）⇒ 旧 pin 上即可完成并校验 |
| GT-003 重写立论 | 要新 pin | `lab:E41` 本来就是在**旧 pin** 上证实的（`src/components/Chart/` 在 `4a68e02d` 上存在）⇒ 改的是文字 |
| `injectionEra` 分档 | 与 re-pin 绑定 | 纯 lab 量具代码，与 pin 无关 |

**且此刻也不该换 pin**：`repinProtocol.why` 逐字要求「自然 re-pin 时机 = DS 侧**执行完某份 proposal 之后**」，
而 DS 正在跑闸回归面线（**不是 lab 的处方**）且**跑到一半**（§14.4）⇒ 此刻 pin 下去，
pin 点落在 DS 一轮的中间，不是语义完整的边界。

**⇒ 换 `pinnedSha` 推迟到 DS 那轮收尾之后，且推迟不再有代价 —— 三件事的账已经清了。**

> 🔴 **本段后半句已于同日 11:36 被 §17 推翻，⛔ 别照它引用。**
> 「引对了协议原文、推错了结论」—— 错在把「自然时机」读成「**DS 空闲**」，
> 而协议逐字说的是「**执行完某份 proposal 之后**」= **一个已经发生过的时点，不是要等的状态**。
> 实测 lab 处方线在 **`c1db57b8`（08-25 14:13）就收尾了**，之后 12 个 commit 全是 DS 自己的线。
> ⇒ **re-pin 现在就能做，且目标是 `c1db57b8` 而不是 HEAD。** 详见 §17。

### 16.2 核心口径裁决：**「改了 task JSON」有三种性质，⛔ 不是一件事**

`manifest.json` 原本只存**整文件 `sha256`** ⇒ 在校验器眼里
「**换引文出处**」与「**改 prompt**」**完全不可区分**，两者都只表现为 sha 变了 ——
而后果天差地别：前者可比性不变，后者按 spec §7.5 要**新旧 set 各跑一遍桥接**（≈85 M token）。

⇒ 与 `lab:E42`（0 命中的双解释）同族 ⇒ **修法是把解释拆成三支，⛔ 不是「允许 sha 变」**：

| 档 | 判定 | 后果 |
|---|---|---|
| `provenance-only` | `subjectSha256` 同 ∧ `graderSha256` 同 | **既有读数完全可比，⛔ 不触发 §7.5 桥接** |
| `grader-changed` | 被测对象同、判定口径变 | 跨档读数不可并池（`lab:E28` 第 3 条） |
| `subject-changed` | `subjectSha256` 变 | **真 set 升级** ⇒ 按 §7.5 要桥接 |

⚠️ **`expectedDiscrimination` 逐字排除在 `graderSha256` 之外** —— 它是**预注册预测**不是判定口径。
⛔ 不排除的话，本轮 GT-003 重写一句预测的理由会被错归成「grader 变了 ⇒ 读数不可并池」。
（造故障 F-4 专门验了这一格，实测判成 `provenance-only`。）

### 16.3 三件事的落地与实测

| # | 事项 | 实测 `changeKind` | 关键点 |
|---|---|---|---|
| 1 | GT-002 换出处 → `phase0-ledger.md` | **`provenance-only`** | 旧 pin 与 DS master `27dbbaad` 两侧计数**逐位相同**（2 / 1）。⚠️ 换出处的性质 = **事前契约 → 事后流水**，是「为同一段已冻结的 prompt 重新找凭据」，⛔ **不是**「照新出处重新转写 prompt」 |
| 2 | GT-003 重写立论 + P4 预测 | **`provenance-only`** | ⚠️ 新预测是**改写后的**，⛔ **不再是盲预测**（写于 run 跑完之后）⇒ 不得当预注册命中率的分子/分母。⚠️ **失效的是「立论」不是「引文」** —— citation 一字不改，校验器没失职 |
| 3 | `injectionEra` 分档 | — | 两档都断言，`unknown` ⇒ MH2 炸。判档逻辑抽成单一真源 `injectionEraOf()`。⛔ 仍不选「换桩」 |

**⇒ 三条 task 的 `subjectSha256` 逐位未变 ⇒ 既有 15 个 run 的读数完全可比，⛔ 本轮不触发任何桥接。**

### 16.4 📩 给 DS 的 N40 绿灯（答 §14.3 那条「lab 会在什么时候给绿灯」）

| 项 | 内容 |
|---|---|
| **裁决** | ✅ **绿灯已给：`-d` → `-e` 可以落地了。** lab 侧的前置（`injectionEra` 分档）已于本轮完成 |
| **lab 侧已做** | `metrics/context-manifest.mjs` 的 MH2 落 `injectionEra` 两档，**两档都断言**；判不出档 ⇒ 炸（fail closed） |
| **你修完之后会发生什么** | lab 的 MH2 **不会炸**，会判成 `precise` 档并在 detail 里显式写「⛔ 与 degraded 档那批 run 不可并池」 |
| **⚠️ 要一起记的代价** | 注入面是 §5.1 `contextManifest` 的 **L1 层** ⇒ 你一修，6′/step11/区分度实验那批 run 的 MDE **只对 degraded 档成立**。想要新档 MDE 要重跑 N=5 ≈ **46 M token**（区间 22–62 M）。⇒ **lab 暂不打算马上重跑** —— 分档已经把「不可并池」这件事钉住了，不会有人误并 |
| **⛔ lab 仍不选的那条** | **换桩**。理由同 §14.3：换桩等于把 lab 唯一的可比性哨兵撤了换清静 |
| **⚠️ 顺带** | 严/宽口径（§13.5 第 5 条）**仍未答**，已 grep `6b8ad767..27dbbaad` 全量 diff 零处提及。⛔ lab 不催、也不替你裁 |

### 16.5 新增勘误与规则

| # | 一句话 |
|---|---|
| **`lab:E44`** | **冻结物只存整文件 sha ⇒「改了被测对象」和「改了它的说明文字」分不开。** 修法是按身份分别存 sha（被测对象 / 判定口径 / 其余），三档分支断言 ⇒ 已写进 AGENTS §2.12 |
| **`lab:E45`** | **控制少钉一维 = 换代时不炸**（`lab:E43` 同族第三例）。`golden-set-freeze` 的 `hitFor` 原只比 `mustContain` 不比 `path` ⇒ 出处换了文件而引文串不变时 MH2 **照样报绿**，还带着一句已不成立的 detail |
| **`lab:N47`** | **管道会吞掉退出码**：`node x.mjs \| tail` 之后 `$?` 拿到的是 `tail` 的、不是 node 的 —— 本轮实测把一次 `exit 1` 读成了 `EXIT=0`。⇒ 验 fail-closed 必须不带管道单跑。与 DS 同日记的「后台通知的 exit code 是 wrapper 的不是 vitest 的」**同族** |

### 16.6 ⛔ 本轮**未覆盖**的（不算已验）

1. **`pinnedSha` 没换** —— 仍是 `4a68e02d`。⛔ 别读成「re-pin 做完了」。等 DS 那轮收尾。
2. **`dsMustReport` 那 5 条一条没取** —— 本轮不需要它们（没换 pin）。真 re-pin 时要 lab 自己去 DS 真源实测提取，⛔ 不等 DS 递文字总结（AGENTS §4）。
3. **加大 N 没做** —— 留给 re-pin 之后的下一轮（`lab:E40` 给的理由仍成立：主验收口径 N 加到 58 之前一直有效）。
4. **DS HEAD `27dbbaad` 对量具分母的影响面未量**（§14.4）。
5. **`actionability` / 铁律 2 / `first-shot` T2 / manual r006** —— 四格原样未动。
6. **新出处引入一处单点风险**：GT-002 与 GT-003 现在引**同一份文件** `phase0-ledger.md` ⇒ 它若被删/被搬，两条 task 同时失去凭据。⛔ 如实登记。
7. **`grader-changed` 这一档只在造故障里验过，真实世界一次没发生过** ⇒ 它的下游后果（跨档不可并池怎么落地）**未实测**。

---

## 17. re-pin 预演（2026-08-26 上午 11:3x）—— ⚠️ **它当场推翻了 §16.1 的判断**

报告：[`reports/2026-08-26-round2-repin-rehearsal.md`](../reports/2026-08-26-round2-repin-rehearsal.md)

**零新生成 run · 零 token · ⛔ 未建第四个 worktree · 三个 pin 起止 dirty=0。**
取值时刻 **08-26 11:36**（DS HEAD `a16173db`）—— ⚠️ DS 仍在活跃推进，⛔ 数别抄，重跑。

### 17.1 🔴 §16.1「此刻不是自然 re-pin 时机」判错了

**引对了协议原文，推错了结论。** 错在把「自然时机」读成「**DS 空闲**」，
而 `repinProtocol.why` 逐字是「执行完**某份 proposal** 之后」——
**那是一个已经发生过的时点，不是一个要等的状态。**

| commit | 时间 | 是什么 |
|---|---|---|
| **`4a68e02d`** | 08-25 10:21 | **lab 当前 pin** |
| `483e3feb` | 08-25 12:25 | 执行 lab 的 5 份处方 —— ⚠️ **父提交就是 `4a68e02d`** |
| **`c1db57b8`** | **08-25 14:13** | 后续 4 项 ⇒ **lab 处方线收尾（21 小时前）** |
| 之后 12 个 commit | → 08-26 11:18 | **全是 DS 自己的线**，⛔ 无一执行 lab 处方 |

⇒ **re-pin 现在就能做，⛔ 不必等 DS。**

### 17.2 ⇒ pin 目标是 `c1db57b8`，**不是 HEAD**（有量化证据）

`subject.json` 的 `whyKeep` 对上次 pin 选择的理由逐字：「用 P0 做基线会**把别人的漂移记到处方账上**」。
**同一逻辑原样适用于 re-pin 目标。** 三方对比：

| 口径 | pin `4a68e02d` | `c1db57b8` | HEAD `a16173db` | **处方 delta** | **无关漂移** |
|---|---:|---:|---:|---:|---:|
| `_archive` 下 `.md` | 108 | 56 | 55 | **−52** | −1 |
| 全仓 tracked `.md` | 405 | 356 | 357 | **−49** | +1 |
| `scripts/` `audit-*.mjs` | 67 | 67 | 67 | **0** | **0** |
| `tests/` `.test.ts` | 145 | 146 | 159 | **+1** | **+13** |
| `retrospection/` `.md` | 23 | 23 | 24 | 0 | +1 |

**⇒ `tests/` 那一行是决定性的**：pin 到 HEAD 去量「处方对测试面的影响」会得到 **+14，其中 93% 是别人的账**。

⚠️ **但影响是逐口径不同的，⛔ 不得跨口径外推**（AGENTS §2.11 同族）：
`_archive` 那一格处方 −52 / 无关 −1 ⇒ **pin 到哪都差不多**。
⇒ ⛔ 别写「pin 到 HEAD 会污染读数」这种不带口径名的句子。

### 17.3 `dsMustReport` 五条 —— lab 自己实测提取（⛔ 未等 DS，AGENTS §4）

| # | 状态 | 实测 |
|---|---|---|
| ① 落地 commit + 父提交 | ✅ | `483e3feb`（父 = **现 pin**）· `c1db57b8`（父 = `483e3feb`） |
| ② 处方验收逐条实测 | ⚠️ **协议口径过期** | 写的是「**两份**」，实际 `proposals/` 下 **7 份** ⇒ 协议要订正（§17.5） |
| ③ 新链条组成 | ✅ | **39 步 → 39 步一步没变**；链入口 `prepublishOnly` → **`gate-chain`**；npm key 155 → 156 |
| ④ 受影响路径耗时 | ⛔ **未做** | 要 worktree + `pnpm install` ⇒ 成本待拍 |
| ⑤ `KNOWN_SILENT` 增删 | ✅ | **36 → 36，逐条相同，零增删** |

⚠️ ③ 的要点：**`chainEra` 会跳档**（`prepublishOnly` → `gate-chain`）。
`adapters/ds-gate-chain-run.mjs` 按 key 存在性判档、不按 sha ⇒ **自动跟上，⛔ 无需改代码**，
但**报告里必须写明读数属于哪一档**。

### 17.4 新增 `lab:N48` —— 「0」既是装置故障的返回值，也是一个合法读数

提取 `KNOWN_SILENT` 条数时**连续三次拿到 `0`**（sed 范围没框住 / macOS `grep -E` 不支持 `\s` /
函数内 `git show` 少了 `-C`）。⚠️ **而 `0` 在这个位置完全合理** ——
该表头注释逐字写着「表只会缩…**表空 = 终态**」。
⇒ 不实看表体的话，会把「装置坏了」写成「DS 已达终态」，**而那是一条会进报告的结论**。

⇒ **操作口径**：凡判据可能返回 `0`/空集、且 `0`/空集本身是有意义的结论时，
**必须先用一次独立方式确认判定面非空**。与 `lab:N33`（假绿）、`lab:N47`（管道吞退出码）同族。

### 17.5 两条要订正 `repinProtocol` 的（⛔ 本轮未改，待拍）

1. **`dsMustReport` ② 写死了「两份」** ⇒ 要改成「本轮 DS 声称执行的**全部**处方」，⛔ 不写死份数（写死了下次还会过期）。
2. **协议缺一条：pin 目标怎么选** —— 现协议只说「什么时候 re-pin」，没说「pin 到哪个 sha」。
   ⇒ 建议补：**pin 目标 = 本轮处方线的最后一个 commit，⛔ 不是 DS 当前 HEAD。**

### 17.6 `grader-changed` 档的下游后果已想清（销上一份报告 §10 第 3 条）

设计见预演报告 §6：产物记 `graderSha256` · 合并前必须同档否则炸 · 报告带档名 ·
⛔ 不自动迁移旧读数（那是伪造）。**⛔ 本轮不实现（YAGNI），真发生时按此落地。**

⚠️ 一条边界：`graderSha256` 只覆盖 grader 的**声明**，⛔ **不覆盖脚本内容** ——
DS 改了判定逻辑而不改 task JSON ⇒ 它纹丝不动。那一类由 **pin 的 sha** 兜住。**两者互不覆盖。**

### 17.7 ⛔ 本轮未覆盖

1. `dsMustReport` **④ 耗时未测** · **② 未逐条对账**（且其协议口径要先订正）。→ 🟢 **两条均已于 §18 付清**
2. §17.2 的三方对比**只覆盖 5 个文件计数口径** ⇒ ⛔ 不含内容变化、不含闸的行为变化。
3. `grader-changed` 仍未在真实世界发生过 —— §17.6 是**设计不是实证**。
4. **`pinnedSha` 仍未换** —— 本轮只证明了「现在能换、该换到哪」，⛔ 没换。→ 🟢 **已于 §18 换到 `c1db57b8`**

---

## 18. 真 re-pin 落地（2026-08-26 中午）—— ✅ **`pinnedSha` 已换到 `c1db57b8`**

报告：[`reports/2026-08-26-round2-repin-part2.md`](../reports/2026-08-26-round2-repin-part2.md)

**零新生成 run · 零 token 生成成本 · 四个 pin 起止 dirty=0 · 三个旧 pin ⛔ 一个未拆。**
⚠️ DS 真源本 session 内 HEAD 从 `e2132532` 漂到 `8dd0388c` ⇒ 读数按 sha 记，⛔ 别抄。

### 18.1 pin 换代

| 项 | 值 |
|---|---|
| 新 pin | **`c1db57b8`**（08-25 14:13，lab 5 份处方落地线的收尾 commit）= **P3** |
| §5.2 三元组主键 | `(c1db57b8…, claude-opus-5, pt-v1)` —— ⚠️ **本轮换代** |
| golden set 在新 pin 上 | `EXIT=0` · 3 条 · 6 条引文逐字命中 · `changeKind = identical ×3` · 控制 9/9 |
| `C-missing-path` | 返回 0，但**判定面非空已独立确认**（6 条引文各自带出行号，`lab:N48`）⇒ ⛔ 别读成「那条判据没用」 |

### 18.2 `dsMustReport` 五条 **首次全部取齐**

①`483e3feb`(父=`4a68e02d`)·`c1db57b8`(父=`483e3feb`) ✅ ｜ ② 见 §18.4 ｜
③ **39→39 步**、链入口 `prepublishOnly`→**`gate-chain`**、npm key 155→156 ✅ ｜
④ 见 §18.3 ✅ ｜ ⑤ `KNOWN_SILENT` **36→36 逐条 diff 为空** ✅（⛔ 未抄预演，两 pin 各自重取）

### 18.3 ④ 的推翻性读数：DS 的 `-73.8%` **在 lab 的量测环境里量不到**

| 口径 | P2 `4a68e02d`（`prepublishOnly` 档） | P3 `c1db57b8`（`gate-chain` 档） | delta |
|---|---:|---:|---:|
| 全链热态总（N=3 均值 / σ） | **8,831** / 347 | **8,976** / 133 | **+146 ms（+1.6%）** |
| `audit:plan-lifecycle` | **6,194** / 278 | **6,226** / 68 | **+33 ms（+0.5%）** |

合并 σ=263 ⇒ **噪声地板 2σ = 526 ms** ⇒ `+146 ms` **在地板以下，不算数**（方向还相反）。

⚠️ **`lab:E47` · ⛔ 这不是「DS 的数假」。** 四个环境完全自洽，机制唯一 ——
被排除的 `figma-data/mockup` **gitignored、1.1 GB、只在 DS 主工作树在场**
（`.gitignore:29`；`git ls-files` = 0；CI 用 `actions/checkout@v5` 新鲜 checkout）：

| 环境 | `plan-lifecycle` |
|---|---:|
| DS 主工作树 · 修前 / 修后 | 45,108 → **6,307**（DS 自测） |
| lab pin `4a68e02d` / `c1db57b8` | 6,194 → **6,226**（lab 实测） |

⇒ **那份收益只在开发者工作站上存在；在 CI 与 lab pin 口径上修前修后都是 ~6.2 s。**
⇒ ⚠️ DS 的 **commit body 逐字写清了这条**（「扫描面在本机与 CI 上不一样」），
但 **commit subject 的 `-73.8% 全链耗时` 不带环境限定词** —— 而那正是会被传播的数。
⇒ ⚠️ **lab `step7-7b-delta` §6.3 的处方前提未被动摇**：那 6.2 s 由 **tracked 的 67 MB** 主导，
DS 治的是**扫描面不确定性**（另一个真缺陷），⛔ 两件事别合并。

**预注册 4 HIT / 1 MISS。** MISS 的是 P2（预测「删 52 份文档会带来小幅真实下降」）——
实测是小幅**上升** ⇒ 「删文档 ⇒ 闸变快」这条直觉在本闸上**不成立**。

### 18.4 ② 逐条对账（口径已订正 = **本轮全部 5 份处方**）

**静态可核的全过**：阻断语义完整（38 个 `&&`）· runner 非第二真源 · workflow **4 处**调用点零改动 ·
11 条上契约闸各打 `findings`+`checkedUnits` 且**两 pin 逐位相同** · `lint:ds` `isGate=false`（E14）·
`empty-denominator` 两 pin 均只 1 条 · 锚点 TOTAL **529→767** · `LIVE_TREE_EXEMPTIONS`=2 ·
`_archive` **108→56** · ADR **A8 B5 C7 E9 F6 G6 H10 I12=63 + J3 = 66** · AGENTS.md **9→20 条**。

⚠️ 一处看似差异实为取值时刻不同：DS 称现行层扫描面 221、实测 **223** ——
`483e3feb` 时 = 221，而 `c1db57b8` **自己新增了恰好那 2 份文档** ⇒ 221+2=223。**⛔ 不是差异。**

⛔ **造故障那一类全部未做** —— lab 在只读 pin 上造故障会破坏 dirty=0 不变式。

### 18.5 新缺陷 `lab:E46` —— `frozenAgainstSha` 把两种身份挤进一个字段

re-pin 当场暴露：重新冻结到新 pin 后 `frozenAgainstSha` **纹丝不动**。
查源 —— 它取自 `tasks[0].task.provenance.pinnedSha`，**⛔ 不是 `--pin` 参数**。

三个不同身份此前挤在一处：**引文取证 sha**（历史事实）/ **校验 pin**（此前没被记）/
**run 的 §5.2 `subjectSha`**（实测取自 `context-manifest.mjs` 的 `cwdFacts.head`，⛔ 不是 task JSON）。
⇒ re-pin 后 manifest 永久停在旧 pin 上而**没有判据会炸**（`lab:E45` 同族）；且只取 `tasks[0]`，
三条 task 声明不同 sha 会被**静默吞掉**。

**修法 ⛔ 不改 task JSON**（改 `provenance.pinnedSha` = 伪造历史取证事实）—— 改量具：
新增 `verifiedAgainstPinSha` 与之分存 · freeze 时各 task 声明不一致**当场抛** ·
verify 时缺字段报 `B2-pin-caliper-missing` · 跨 pin 读取**显式报档但⛔ 不判失败**（复现旧读数是合法动作）。
**四态 + 造故障全部实测通过**（造故障走 `--set <副本>`，⛔ 真 set 一个字节没动）。

### 18.6 协议订正落地 —— 同一失效形态在 `subject.json` 里出现了**四次**

用户拍的两处：`dsMustReport` ②「两份」→「本轮全部处方」· 新增 `pinTarget` 规则。
**本轮顺手发现的另外两处同型**：③ 写死 key 名 `prepublishOnly`（DS 已挪进 `gate-chain`）·
`nodeModules.why` 写死「三个 worktree」（已是四个）。另订正 `why` 的时点语义 + `labThenDoes` 的写死代号。
⚠️ `subject.json` **不在冻结面里** ⇒ 改它不进 changeKind、不触发 §7.5 桥接（已实测确认）。

### 18.7 `lab:N48` 加一条 —— 我自己踩了**五次**装置故障，全都返回「看起来合理」的值

引号数当条数（10 vs **2**）· 跨节计数（B=8 vs **5**）· 假设标签形态被原样搬运（D=0 vs **11**）·
`head -6` 截断当全集（**2 vs 4**）· 字段路径写错（0 vs **11**）。

⚠️ **第 4 例最危险**：那个「2 处」差点被写成**与 DS 自称的「4 处」对立的发现**。
⇒ **操作口径**：**凡要把自己的计数与对方的自称对立起来之前，先证自己的计数器口径**
（截断 / 标签形态 / 节边界 / 字段路径 / 容器类型，五项各查一遍）。
⛔ 「我数出 X，他说 Y，所以他错了」在证完自己的装置之前**不是一条发现**。

### 18.8 ⛔ 本轮未覆盖

1. ~~② 的**造故障那一类全部未做**（处方 1 §5.1/§5.3 · 处方 2 造故障 A/B · 处方 3 判据 2–7）~~
   ⇒ ✅ **§19 已全部做完**。⚠️ **本条曾漏登 5 格**：实际未覆盖是 **17 条**不是 12 条 ——
   还有 处方 1 §5.2 两格 · §5.5-b · 处方 2 MN② · 处方 3 判据 8。**lab 自己的漏登，⛔ 不是 DS 的问题。**
2. 处方 4 的「实读面守恒 N=5 并集」与「`L1Fingerprint` 不得变」—— 要删后**新跑 N=5**。
3. 处方 2 的单测**未逐格核**（只确认文件存在）。
4. `grader-changed` 仍未在真实世界发生过。
5. **加大 N 没做**（`lab:E40` 的理由仍成立）· `actionability` / 铁律 2 / `first-shot` T2 / **manual r006** 四格原样未动。
6. **严/宽口径仍未答** —— DS 侧至今零处提及，⛔ lab 不催、也不替它裁。
7. §18.3 的耗时只覆盖「**逐步独立跑**」口径 ⇒ ⛔ 不含链内交互效应、不含 DS 自家 runner 的收集式开销。

---

## 19. A 格交付：② 造故障那一类（2026-08-26 下午）—— ✅ **17 条全部实测完成**

报告：[`reports/2026-08-26-round2-faultinjection.md`](../reports/2026-08-26-round2-faultinjection.md)
计划与预注册（**跑前落盘 commit `c7e6e1c`**）：[`docs/round2-faultinjection-plan.md`](round2-faultinjection-plan.md)

**四个 pin 起止 `dirty=0`，⛔ 一个未拆 · 一次性 worktree `wt-fault` 用完已 remove · golden set `EXIT=0`。**

### 19.1 覆盖面订正：§18.8 第 1 条登记 12 条，**实际 17 条**

三份处方共 **26** 条验收条目 = 上轮已过 **8** + 本轮 **17** + 单测 1（§18.8 第 3 条，一并做完）。
漏登的 5 格：处方 1 §5.2 两格 · §5.5-b · 处方 2 MN② · 处方 3 判据 8。
⚠️ 上轮报告 §4 表里 §5.2 那行判 ✅ 覆盖的是**命题的静态证据**，⛔ 与那两个**动态造故障** checkbox 不等价。

### 19.2 结果：**17/17 通过**，预注册 16 HIT / 1 MISS / 1 部分推翻

- **处方 1（7 条）**：逐步表 39 行全带 exit+耗时、`exit≠0` 集合恰好 `{1}`、双装置都报 40 步、
  坏 key 两条路径都非 0、双故障摘要恰好两条、单故障恰好一条。
- **处方 2（3 条 + 单测）**：A/B 都判 `empty-denominator`（B 未被 `blocked` 吃掉）、
  MN② 判成 **`unparseable`** 而非 `empty-denominator`；单测 **34 passed**，全覆盖且超额 ⇒ **§18.8 第 3 条结案**。
- **处方 3（7 条 + lab 补 1 格）**：判据 2/3 各 `EXIT=1`、4/5/6/7 全 must-not-hit 成立、
  判据 7 与基线 **diff 零差异**。

### 19.3 四条有独立价值的读数

1. **坏 npm key 两条路径责任方不同**：`node run-gate-chain.mjs` → **`EXIT=2`，runner 前置全量校验**；
   `pnpm run gate-chain` → `EXIT=1`，pnpm 兜底且第 1 步已跑完。**CI 走前者、开发者手敲走后者
   ⇒ 诊断质量不同，⛔ 别写成「一律 fail closed」。**
2. 🔴 **摘要「stderr 尾部」栏在 8/11 条契约闸上必空**（全量静态核，非 N=2 外推）。
   ⛔ **不是「DS 漏了」**（`run-gate-chain.mjs:249` 显式判空并打提示）、
   ⛔ **也不是契约强制的**（3 条契约闸两边都写）⇒ 是**实现习惯的分裂**。
   **lab 的增量 = 那个数**：处方 §3.3 第 1 条「失败要能定位」在 8/11 条上打折。⛔ lab 不替 DS 选修法。
3. **fail-fast 的代价**（`wt-fault` 口径，同一把尺）：全绿 **13,465**(σ102) · 第 1 步失败 **13,530**(σ73) ·
   等价失败即停 **157 ms** ⇒ 代价 **+13,373 ms = 86.2 倍**；(b)−(a)=+65 < 合并 2σ=177
   ⇒ **失败 run 与全绿 run 统计上等耗时 ⇒ 代价上界 = 全链跑满，⛔ 不随失败位置变化**。
   **这同时是 §5.1 的独立旁证**（若仍 fail-fast 应 ≈157 ms）—— ⛔ 不依赖 runner 自称。
4. 🔴 **处方 3 判据 4/5/6 全部在条件 ① 就被挡住 ⇒ 判据 6 是空判**。
   闸真实判据 = `① 显式相对 ∧ ② 段边界后缀匹配 ∧ ③ 完整路径不存在`，四个形态无一以 `./`/`../` 开头。
   ⇒ **lab 补 `6′`**：`../tion/…`（①过②失败）⇒ 不报 ✅ vs `../retrospection/nope…`（①②都过）⇒ 报了 ✅
   ⇒ **② 确实生效且不误匹配**。
   📌 ① 是 **DS 主动收窄 lab 处方 §4.2 的判据**并带量化理由（78 条候选按原判据报红 2 条，2/2 假阳性），
   登记为边界 **B1** ⇒ **lab 接受这个收窄**（AGENTS §2.6 元指标：处方被**带实证的修改**后采纳）。

### 19.4 🔴 新缺陷 `lab:E48` —— `dist/` 是 `lab:E47` 的第二个实例，且**更强**

`dist/` 同样 gitignored（`.gitignore:2`，`git ls-files dist`=0）、只在跑过 build 的工作树在场，
但 `figma-data/mockup` 只影响**耗时**，`dist/` 直接改变 **exit code**（新 worktree 首跑第 27/28 步 `EXIT=1`）。
⇒ **上轮「两 pin 39 步全 exit 0」是在「dist 已构建」的环境上取的** —— 一个**从未登记的 pin 环境维度**。
⇒ ✅ **上轮 §18.3 的 P2↔P3 对比两侧都有 dist，⛔ 未混入这一维**；⚠️ 但 `71ac2711` 上 **`dist` 与 `node_modules` 都不在 ⇒ 该 pin 跑不了闸链**。
⇒ 连带：`pnpm build` 弄脏 **tracked** 面 **292** 条（`playground-dist/` 刻意 tracked、内容哈希每次变
= **构建产物不可复现**）⇒ **这给「⛔ 不得在 pin 上跑 build」一个机制层面的理由**，此前只是不变式。
⇒ 复现姿势：`build` → `checkout -- .` + `clean -fd playground-dist react-pilot` ⇒ tracked 回 0、`dist/` 保留。

### 19.5 🔴 `lab:N48` 加两条推论 —— 本轮我自己踩了**6 次**

第 6–11 例：装置与命题不匹配 · 字段路径写错 · fail-open 写法（**结果对但装置错**）·
表驱动单测按 `it(` 切块 · **两装置共享错误假设互相印证** · `grep -A6` 截断。
另有一次**主动阳性对照失败**救下三条假绿（仓根形态 ⇒ 空判）。

- **推论七**：**读数与同一份产物里的控制结论矛盾时，先疑自己的取数装置，⛔ 不先疑被测对象。**
  （第 7 例是首次由**产物自带的控制**抓到，前六例全靠人工警觉。）
- **推论八**：**两个独立方法得到同一个数 ⛔ 不等于那个数对 —— 如果两者共享同一个错误假设。**
  与 AGENTS §3.8「同源测不出自己的盲区」**同构**，只是这次 lab 自己踩。
  ⇒ **交叉验证要换「实现范式」，不只是换「实现」**（正确的第二把尺是**运行时**，不是另一个静态解析器）。
- **造故障方法论**：**几个 must-not-hit 看起来在测不同的东西，可能全被同一条前置条件挡住 ⇒ 一格都没测到。**
  ⛔ 要问「这个用例会走到我想测的那条规则吗」，而不只是「期望结果对不对」。
- ✅ **一条被验证有效的做法**：取数脚本 **fail-closed 起手** —— 逐步表里的 `───` 分隔线让初版解析器抛错，
  改成显式排除后仍抛；若写成「解析不出就跳过」，行数会变 38 而不自知。

### 19.6 ⛔ 本轮未覆盖

1. 处方 4 的「实读面守恒 N=5 并集」与 `L1Fingerprint` 不得变（§18.8 第 2 条原样）。
   ⇒ ✅ **`L1Fingerprint` 那一格 §20 已做完**（结论：**判据恒真/恒假两头堵，命题对量具错**）；
   ⚠️ **「实读面守恒 N=5 并集」仍未做**。
   ⚠️ **本条的登记方式本身有缺陷**：处方 4 桶三**已被 DS 真实执行 4/5 项**（§20.4），
   lab 却整条写成「未覆盖」⇒ **「未覆盖」必须区分「lab 没验」与「对方没做」**。
2. 加大 N · `actionability` / 铁律 2 / `first-shot` T2 / **manual r006** 四格原样未动。
3. `grader-changed` 仍未在真实世界发生过。
4. 严/宽口径仍未答 —— DS 侧至今零处提及，⛔ lab 不催、也不替它裁。
5. CI 侧跑不出来（`lab:N14`）⇒ 处方 1 §5.6 两套 workflow 只能静态核（上轮已做）。
6. `71ac2711` 上无法跑闸链 ⇒ 任何声称取自该 pin 的闸链读数要单独核。**本轮不追。**
7. §19.3 第 3 条的耗时只覆盖「链内跑」口径 ⇒ ⛔ 不与 lab adapter 的「逐步独立跑」口径并池。
   ⇒ ⚠️ §20.5 又给这条加了第三个口径：第一轮的 **13.8s** 是「55 条可离线跑」口径，
   **⛔ 三个口径互不并池**（链内跑 13,465 ms / 逐步独立跑 / 55 条可离线跑 13.82s）。

---

## 20. B 格交付：处方 4 判据 `L1Fingerprint` + `71ac2711` 读数账（2026-08-26 傍晚）

报告：[`reports/2026-08-26-round2-l1fingerprint.md`](../reports/2026-08-26-round2-l1fingerprint.md)
预注册（**跑前落盘 commit `919e7ed`**）：[`docs/round2-l1fingerprint-plan.md`](round2-l1fingerprint-plan.md)

**四个 pin 起止 `dirty=0`、HEAD 未变，⛔ 一个未拆 · 一次性 worktree `wt-l1fp` 用完已 remove · golden set `EXIT=0`。**

### 20.1 结论：该判据**两头堵**，没有任何口径能让它给出与命题相关的读数

预注册 6 条假设 ⇒ **5 HIT / 1 MISS**（`wt-l1fp`，同一采集器同一口径）：

| 态 | dirty | **L1 指纹** | 变的分量数 |
|---|---:|---|---:|
| 基线 | 0 | `ec0f228c7baa6979` | — |
| 删 11 份桶三·**不 commit** | 11 | `ec0f228c7baa6979` | **0** |
| 建 11 个**与归档无关**的文件 | 11 | `ec0f228c7baa6979` | **0** |
| 删 11 份桶三·**已 commit** | 0 | **`0c730b956a8bcb1a`** | 1 (`subjectSha`) |
| 改 `AGENTS.md`（**阳性对照**） | 1 | **`79d04b79403a7d98`** | 1 (`entry`) |

- 口径「删了**不** commit」⇒ 指纹**恒不变** ⇒ **恒真空判**，且**分不清「删 11 个归档」/「建 11 个无关文件」/「什么都不做」**。
  ⇒ **`lab:N43` 的第二次，落在同一个字段上**（第一次修的是「注入是否投递」，这次漏的是「判据载体选谁」）。
- 口径「删了**并** commit」（= 处方现实口径，安全网逐字「git 可逆」）⇒ `subjectSha` 必变 ⇒ **恒假**。
- ✅ **阳性对照成立**（改 `entry` 面 ⇒ 指纹立刻变）⇒ 前三行的「不变」不是装置死值（§2.15 推论三）。

### 20.2 ✅ 建设性：**命题对、量具错**

「已 commit」态 8 分量中**只有 `subjectSha` 变、其余 7 个全同**
⇒ 处方自己写的命题「确定性注入层结构上不该动」**实测成立**。
错的是判据把「随任何 commit 必变的量」焊进了比对载体。
三条可选修法见报告 §2.6，**⛔ lab 不替 DS 选**。

### 20.3 两个新的操作陷阱

1. **`EXIT=1` ≠ 验收失败**：H1/H2/H4 的 `EXIT=1` 失败的是 `MN4`（禁 dirty），
   **⛔ 不是那条判据** —— 判据本身在 H1/H2 是「通过」的（空判通过）。两者必须分开读。
2. 🔴 **L1-only 与真 run 的指纹不可并池**：同一 pin `4a68e02d` 上
   L1-only = `f2dc3040` vs 真 run `r001` = `87517baf`，差 `sessionStartDelivered` 分量（刻意设计）
   ⇒ 比指纹前必须先对齐「有没有 transcript」这一维，否则拿到纯口径造成的「变了」。

### 20.4 🔴 处方 4 桶三**已被 DS 真实执行 4/5 项**（份数与清单逐行吻合）

`_reports` 16→8（删 8）· `_plans` 9→2（删 7）· `_design-kickoffs` 2→0 · `_archive/_archive` 1→0
⇒ 与桶三清单的 8/7/2/1 **逐行吻合**；归因 `483e3feb`（subject 逐字含「归档桶三」）。
⛔ **唯一未删：`docs/internal/STATUS-CHANGELOG.md`（3,889 行）** —— 本轮只登记，未追问原因。

⚠️ 真 pin `P2→P3` 对比**不可归因**：变的 2 个分量（`subjectSha` + `entry`）
**没有一个**是「删归档动了注入层」⇒ 归因 **0/2 = 100% 无关维**（§2.12 第 13 条同族，那里是 93%）。

### 20.5 🔴 `71ac2711` 读数账结清（§19.6 第 6 条）—— 查出一条**仍在用的约定**建在无法复核的读数上

自己实测复核：`71ac2711` 的 `dist/` 与 `node_modules` **都不在**（⛔ 未信交接的数）。
全仓命中 56 条逐条核：

- ✅ **合法**（静态采集）：`gate-mount` / `gate-output-contract` / `retrospection-s2-verdicts` 三个 inventory JSON、
  以及 §6′-B 报告里的「PRESENT · 39 步」（那是 **npm script key 的静态存在性**，不是实跑）。
  ⚠️ **但静态 39 与实跑 39 同值、口径不同** ⇒ 引用时必须带「静态解析 / 实跑」限定词。
- 🔴 **当前无法复核**：`first-round-baseline.md` §3+§4.3 的 gate 耗时组
  （**13.8s** / 均值 **13.82s** σ0.18 / 冷启 **46.9s**）—— 机制实证：
  `smoke-consumer-treeshake.mjs` 逐字跑 `npm pack` + `npm install` + `npx vite build`
  ⇒ **必然需要 `node_modules`**，而该报告**只标了 pin、没标环境名**。
  ⇒ 🔴 **那条「MDE = 2σ ≈ 0.35s，低于此的耗时改善不算数」是至今仍在用的 lab 约定**，
  建在这组无法复核的读数上 ⇒ **要么补环境名重取，要么降级为「历史参考」，⛔ 不能继续裸用。**
  ⇒ **`lab:E47` 的第三个实例**，且后果最远 —— 前两个是单次读数，这个是会被反复引用的**约定**。

### 20.6 ⛔ 本轮未覆盖

1. 处方 4 的**另一半「实读面守恒 N=5 并集」原样未做**（且它自己的边界：0 命中只是 GT-001 口径，~~GT-002/003 一次没跑过~~）。
   > 🔴 **2026-08-26 夜订正（`lab:E49`，见 §21.5 第 1 条）**：删除线那半是**陈旧值** ——
   > GT-002/GT-003 在 §15（08-25 夜）就**各铺到了 N=5**，本条抄的是过期约 20 小时的边界。
   > 且 §21 已用那 15 个既有 run **零新 run** 审完这条判据：**载体只覆盖删/移清单的 3.8%** ⇒ 建议**不跑** N=5。
2. `STATUS-CHANGELOG.md` 未删的原因**未追问**。
3. 加大 N · `actionability` / 铁律 2 / `first-shot` T2 / **manual r006** 四格原样未动。
4. `grader-changed` 仍未在真实世界发生过。
5. 严/宽口径仍未答 —— DS 侧至今零处提及，⛔ lab 不催、也不替它裁。
6. **`N40` 本身未修** —— 本轮只查清其连带后果。⛔ 修它会作废所有既有 run 的指纹读数（换量具），需单独裁。
7. §20.5 那组耗时读数**未重取** —— 重取要在 `71ac2711` 上装 `node_modules`，与「不得弄脏 pin」冲突。
8. `13.8s` **当时**是否真在 `71ac2711` 上取的**无法判定** ⇒ 只能判「当前无法复核」，⛔ 不写成「那个数是假的」。

---

## 21. C 格交付：处方 4 判据「实读面守恒 N=5 并集」载体审计（2026-08-26 夜）

报告：[`reports/2026-08-26-round2-readsurface-criterion.md`](../reports/2026-08-26-round2-readsurface-criterion.md)
量具（新增）：[`metrics/delete-surface-coverage.mjs`](../metrics/delete-surface-coverage.mjs)
**⛔ 本格无预注册**（起手定位是「A 格该不该跑」的决策前置，中途变成实质发现 —— 如实登记，⛔ 未追加事后预注册）
**0 个新 run · 未 build · 四个 pin 起止 `dirty=0`、HEAD 未变 · golden set `EXIT=0`。**

### 21.1 结论：载体只覆盖 3.8%，而漏掉的那个面覆盖 63.5%

精确删/移清单 **52** 个文件（桶三 18 + `STATUS-CHANGELOG` 1 + 桶二 33），N=15 并集口径：

| 面 | 命中 | 占比 |
|---|---:|---:|
| **实读面**（判据逐字用的载体） | **2** | **3.8%** |
| 尝试面（被工具拒的读） | 0 | 0% |
| 🔴 **检索面**（Grep/Glob 行首命中，**处方没枚举、采集器不采**） | **33** | **63.5%** |
| 三个面都没进 | 19 | 36.5% |

检索面**严格包含**实读面，倍数 **16.5x** ⇒ 判据选了包含关系里更小的那个。
✅ 精确清单自证：推出的 8/7/2/1 与处方 §2 桶三表**四行逐行吻合**。

### 21.2 🔴 处方 §5.1 的核心前提被推翻，而且是**已经发生的事**

处方 §5.1 逐字「删的东西本来就不在任何一个上下文面里（自动注入面 / 声明面 / 实读面，**三个都不在**）」。
实测 **`docs/_archive/_design-kickoffs/v4-1827-ndi-into-ipsource.md`**（**桶三真删项**）：

- 被 **GT-002 的 `r007` / `r009`（2/5 run）整文件读完**（`coveredBytes == bytes == 9431`，`exists=true`）
- 机制不是偶然：GT-002 = NDI **source type** 表单，该归档是 `v4-1827-ndi-into-**ipsource**` 的 kickoff ⇒ 按主题检索命中
- raw transcript 三步链核过（`[253]` Grep 命中 → `[258]` **主动 Read** → `[259]` 返回正文）⇒ ⛔ 非采集器错归属
- **DS 已删**：P3 `c1db57b8` 上 `_design-kickoffs/` 整个目录不存在

⚠️ **这是 lab 处方自己的缺口，⛔ 不是 DS 的差错** —— 处方 §1 自己写了「入站=0 是下界，需再过一道」，
而那「再过一道」= 实读面核验，**lab 只在 GT-001 上做过**。

### 21.3 判据的信噪比 < 1

`.md` 实读并集的频次谱（各 N=5）：GT-001 `5/3/0/1/1`、GT-002 `9/0/0/1/2`、GT-003 `8/1/0/0/2`（5/5→1/5）。
⇒ 每 task 有 **1–2 份 freq==1** ⇒ **不删任何东西**、只换一组 N=5，判据就可能报「并集丢失」。
🔴 而**真阳性那份自己的频次也只有 2/5** ⇒ 检出功率 < 1/2 ⇒ **真阳性淹在假阳性里**。
⚠️ freq==1 是**假阳性面的候选量，⛔ 不是噪声地板** —— 地板要两组不重叠的 N=5，每 task 只有 5 个 run ⇒ 拿不到。
⇒ **该判据真实成本 N=15（删前 5 + 删后 5 + 建地板 5），⛔ 不是处方写的 N=10。**

### 21.4 ⇒ **A 格「跑删后 N=5」建议不跑**，三条理由各自独立成立

① 载体覆盖 3.8% ⇒ 对 96.2% 的删除是空判；② 真阳性已用**零新 run 的确定性方法**拿到；③ 信噪比 < 1 且无地板。

✅ 建设性：**命题对（确实删错了一份）、量具错**。三条修法（⛔ lab 不选）：
① 改**事前交集判据**「删/移清单 ∩ 删前（实读面 ∪ 检索面）= ∅」—— **0 新 run、确定性、覆盖 63.5%**；
② 保留守恒口径但先立地板（N=15）；③ 给采集器加 `searchSurface` 面（= 换量具，需单独裁）。
⚠️ ① 判「删之前被碰过吗」（**事前、可否决**），② 判「删之后变了吗」（**事后、只能追认**）⇒ ⛔ 不等价。

### 21.5 🔴 登记面缺陷四条（`lab:N49` 推论四同族）

1. **「GT-002/GT-003 一次没跑过」是陈旧值** —— 处方 §5.2 与 **§20.6 第 1 条 / B 格报告 §7 第 1 条**都这么写，
   而 §15 标题逐字「各铺到 N=5」，实测 `r007–r011` / `r012–r015,r017` 全带 transcript。⇒ **上一格抄了个过期 20 小时的边界。**
2. `STATUS-CHANGELOG.md`（DS 唯一未删项）在检索面 **5/15 run**（GT-002 **3/5，该 task 最高频**）。
   ⚠️ **相关，⛔ 不是原因** —— 只作追问 §20.6 第 2 条时可带的证据。
3. 处方内同一对象两种路径写法（§1 `_archive/translation-md-pre-schema` vs §2 `_archive/_archive/`）；
   `_design-kickoffs` 处方称 210 行、实测 **208** 行。
4. ⚠️ 采集器 `L2_stochastic` **成功面用 `path`、尝试面用 `declaredAs`**（刻意：幽灵文件解析不出 `path`）
   ⇒ 统一取 `path` 的脚本会让尝试面**静默为空**。本格 fail-closed 当场抓到，⛔ 未加兜底绕过。

### 21.6 ⛔ 本轮未覆盖

1. 并集的**噪声地板仍未立**（要两组不重叠 N=5，拿不到）。
2. **检索面未进采集器** —— 本格从 transcript 旁路补采；要转正是换量具（给既有 run 加新面），需单独裁。
3. `product-pattern-index.json`（桶二移出项，GT-002 2/5 run 读过 + 7 个脚本硬编码）**只登记未追**。
   → **§22 已追。** ⚠️ 并查出本条自己的缺陷：「7 个脚本硬编码」的主语是**整批 `_generated/*`**，
   ⛔ 不是这个单文件（实测硬编码它的是 **3 个**）—— 见 §22.5 第 1 条 / `lab:E50`。
4. **那份 kickoff 被删的实际后果未测** —— 要在 P3 上跑 GT-002，那正是 A 格的贵路子。
   本格只证「判据测不到」，⛔ 不证「删了没事」也不证「删了有事」。
5. `STATUS-CHANGELOG.md` 未删**原因**仍未追问（§20.6 第 2 条原样）。
6. 严/宽口径仍未答（DS 侧零处提及，⛔ 不催不代裁）· `N40` 本身未修 · `grader-changed` 仍未真实发生。
7. 加大 N · `actionability` / 铁律 2 / `first-shot` T2 / **manual r006** 四格原样未动。

## 22. D 格交付：处方 4 桶二「`product-pattern-index.json` 移出」影响审计（2026-08-26 夜）

预注册：[`docs/round2-patternindex-plan.md`](round2-patternindex-plan.md)（`de73e1d`，**跑前落盘** —— C 格无预注册，本格补回）
报告：[`reports/2026-08-26-round2-patternindex.md`](../reports/2026-08-26-round2-patternindex.md)
**0 个新 run · 未 build · 未跑 `pnpm release`（含 `--dry-run`）· 四个 pin 起止 `dirty=0`、HEAD 未变 · golden set `EXIT=0` ×2。**
**⚠️ 本格未新增量具**（既有量具边界 ⑥ 答不了通道类型 ⇒ 面命中数取 `context-manifest.json`、通道类型走 raw transcript 直核、脚本依赖走静态读码，三者⛔ 不并池）。

### 22.1 结论：AI 侧真断、发布链**不断**，「同时打断两条路」⛔ 不准确

| 那条路 | 会不会断 | 断法 |
|---|---|---|
| **AI 侧** | ✅ **真断** | 发现链断在**第一步** `Glob docs/internal/_generated/*`（⛔ 不是断在读取） |
| **发布链** | ❌ **不断** | **三重静默降级**；且不改写入方路径则**移出等于没移出** |
| **跨脚本同步** | 🔴 **延迟一整个发版周期才暴露** | 三处路径必须**同 commit 改** |

⇒ 真正该管的是**静默那一半**与**同步性要求**，⛔ 不是「会不会当场断」。
⚠️ **证据分三层，⛔ 不得并成一句「实测发布链不断」**：① **静态读码**（控制流逐字引用）·
② ✅ **隔离实测**（§22.2a：`git add` 三种输入 EXIT = 0/1/128，临时 repo 内，未碰 pin）·
③ ⛔ **仍未实测**：整条 release 链端到端。⇒ 「移出后发版照常跑完」是 ①+② 的**强推断**，⛔ 不是端到端实测。

### 22.2 🔴 四个问题必须分开问，而最危险的三个都不报错（`lab:N51`）

① 当场断：**否**；② **静默降级**：`release.mjs:226` `.filter((p) => existsSync(p))` 静默过滤、`git add` 不报错、tag 照推 + `:172-174` step 1e 逐字「**NON-blocking observer**, NOT a gate」「**不拦发版**，继续」 + `scan-mockups.mjs:419` `existsSync(…) ? JSON.parse(…) : {}` 让**累积快照的历史基线静默丢失**（`:431` 仍印「✓ 已写」+ 变小的数）；③ **被写回**：`scan-mockups.mjs:430` **无条件** `writeFileSync`，不改 `:58` 就每次发版写回 docs 树；④ **延迟**：改了 `:58` 没改 `release.mjs:224` ⇒ 发完版工作树留脏 ⇒ **下一次** release 的 preflight 才拦住（而 `release.mjs:218-219` 注释**逐字预言了这个形态**）。

### 22.2a ✅ 隔离实测：`gitignore` 当场断、`移出` 静默 —— 处方 `:74` 那句**实测成立**

处方 §2 桶二引用块 `:74` 逐字「整目录 gitignore 会**当场打断发布链**」。临时 git repo 内实测
（⛔ 未碰 pin、⛔ 未跑 release）：**gitignore ⇒ `git add` EXIT=1**（抛 ⇒ 当场断）·
**移出 + `.filter` 生效 ⇒ EXIT=0**（静默跳过）· **移出无 `.filter`（阳性对照）⇒ EXIT=128**。
三种值都取到 ⇒ 那个 `0` ⛔ 不是死值。⇒ **处方 `:74` 是对的，只是说的不是同一个动作。**

🔴 **本格最强的一般结论（`lab:N51` 推论四）**：`release.mjs:226` 那个 `.filter((p) => existsSync(p))`
是为**善意场景**写的（`:220` 注释逐字「首次发版时派生产物可能还不存在」），
它顺带把**移出**这个动作从「当场断」吞成了「静默跳过」——
**守卫判的是「东西不在」这个状态，⛔ 分不清「还没生成」与「被搬走了」。**
⇒ 这是 §3.1 铁律「fail closed，不 fail open」的真实反例实例。
⚠️ 「会当场断」的方案反而更安全，**⛔ 但选哪个是 DS 的事**，lab 只把两种动作的失效形态分别算出来交出去。

### 22.3 🔴 规定通道 ≠ 实际通道：一条 owner 拍定的纪律，15/15 读到、0 执行

`AGENTS.md:139` 逐字「11. **跑一次 `pnpm pattern:lookup <本次的 figma URL>`**」（owner **2026-08-14 拍定**）。
15/15 run 都 `Read` 了 AGENTS.md 全文（33,056 B）⇒ **全部读到**，**执行者 0 个**。
实际走的是：`Glob` 发现 → **定向 `Grep` 进正文** → **分片 `Read`**（`r007` 9.7% / `r009` 13.4%）。
⚠️ CLI 旁路移出后**只需改一处** `lookup:79` 即恢复，`AGENTS.md` 因指的是**命令而非路径**、**不需要改**
⇒ **「旁路可用」⛔ 不等于「旁路会被用」。**

### 22.4 🔴 查出第四种通道，且 C 格量具采不到它（第 17 条推论一**第二次**命中）

**定向 Grep 进文件正文**（`Grep {"path": "<该 json>", "output_mode": "content"}`，`r007` 3 次 / `r009` 2 次）：
路径在 **`tool_use.input.path`** 里，而 C 格量具的检索面口径逐字扫「**`tool_result` 里行首**出现的路径」
⇒ **它扫的地方根本没有路径。** 🔴 C 格正是靠「面的枚举必须穷举」推翻处方 §5.1 的那一格。
⚠️ **本格未重算** C 格那张 52 文件覆盖表（补第四面后 3.8% / 63.5% 会变）—— 只说「量具采不到」，⛔ 不给新比值。

### 22.4a 处方 §3 执行顺序：第 1 步**是对的**，第 2 步的校验手段**空判**

✅ **第 1 步「先改配置再动文件」处方是对的** —— 正好防住后果 ③④，⛔ 别换序。**本格没找到它的问题，如实说。**
🔴 **第 2 步「跑 `pnpm release --dry-run` …确认发布链没断」对「漏改了某一处路径」是空判** ——
`.filter(existsSync)` 静默过滤漏改的旧路径（§22.2a 实测 EXIT=0）⇒ dry-run 照样通过；
真实后果（工作树留脏 ⇒ 下一次 preflight 拦住）dry-run 模拟不到（它不真 `git commit`）。
⇒ 能验的是**事前、确定性、0 成本**那条：**移出后 `grep -rn '<旧路径>' scripts/` 必须返回 0 命中**。
⚠️ 这是 `lab:N50` 推论二**同一形态的第二次出现**：事前确定性交集 > 事后跑一遍看断没断。

### 22.5 🔴 登记面缺陷五条（这次**是 lab 自己的**，⛔ 不是 DS/处方的）

1. 🔴 **主语窄化（`lab:E50`）**：「7 个脚本硬编码」的主语是**整批 `_generated/*.json|*.jsonl`**
   （实测 8 个点名脚本**全部**确实硬编码了 `_generated/` 下的产物 ⇒ **⛔ 处方没错**），
   而 §21.6 第 3 条 / C 格 §9 第 3 条把它转述成该**单文件**的属性。**实测硬编码它的是 3 个**
   （写入方 `scan-mockups:58` / 读取方 `lookup:79` / 发布链 `release:224`），差 **2.3 倍**。
   ⇒ 与 `lab:N49` 推论四（谓语错）、`lab:E49`（时效错）同族**第三种：主语错**。
2. 处方 §2 逐字「**7 个**脚本」却列了 **8 个**名字（⚠️ 其中 `a11y-*` 两个硬编码同一产物，是否因此去重 ⛔ 不猜）。
3. 处方 §2 对 `plans` 目录写了「必须同 commit 改」，对 `_generated` 那一行**没写** ⇒ 登记了依赖、未登记同步性。
4. §21.6 只登记 GT-002 的 2/5，**未登记 `r012`（GT-003）也在检索面上**。
5. C 格量具漏第四面，且其边界表未登记这一条（§22.4）。

### 22.6 与预注册对账：H4 三项全中 · H2 预测被推翻（**预登记的反面机制正好命中**）

H1 ✅ HIT（3 < 8）· H2 🔴 **落判定规则空档**（规则只定义 ≤2=HIT / ≥5=MISS，**实测 3**）且「`lib/` 是路径真源」
**被推翻**（它逐字「**纯函数，不打网络**」，完全不含 json 路径）· H3 ✅ HIT-软 · H4 ✅ **三项全中** ·
H5 ⚠️ MISS（象限预测错，落在我预登记的另一行）· H6 ✅ HIT（比预测更强）。
✅ **预登记「会推翻自己的机制」本格第二次生效**（B 格 hook `.git` 那次是第一次）——
H2 预注册逐字写了「`lib/` 那个文件可能只是类型/校验而非路径真源」，实测正是如此。
⚠️ **中途两次判断反转已逐条交出**（报告 §7.1），含「读到 `AGENTS.md:139` 时我当场以为 H4 要翻车」那次。
⚠️ 静态推算与采集器实测**同值**（234 / 319 行）⇒ 报告里带了限定词「两条独立路径互证，⛔ 不是一个数」；
另 `wc -l` 2,389 vs 采集器 2,390 **差 1**，⛔ 不当同一个数引用。

### 22.6a ✅ 收尾自证：本格结论在 **DS 当前 HEAD** 上仍成立（⛔ 不靠 pin 一面之词）

🔴 **DS HEAD 已漂到 `19ff2888`**（pin 是 `c1db57b8`）。
> 🔴 **2026-08-26 E 格订正**：本段原写「落后 **3 个 commit**：`cee7265c` → `1622b261` → `19ff2888`」——
> **实测是 19 个**（`git rev-list --count c1db57b8..HEAD` = 19，`merge-base --is-ancestor` = YES；
> `cee7265c^` = `6d97866a`，⛔ 不是 `c1db57b8`）。**下表五行的判定全部不变**（E 格按完整 19 窗口重扫过），
> 错的是「3」这个数与它蕴含的扫描窗口。⚠️ **这不是数字洁癖**：完整窗口一扫就抓到
> `scripts/audit-stale-anchors.mjs` 被 `40e3043a` / `245dbee4` 改过两次（后者逐字「现行层扩 fragment 类
> + AGENTS.md 入扫描面」）—— 3-commit 窗口看不见它，而 E 格正因此才去活源上重测（重测后同值）。

逐条实看（`git grep HEAD`，⛔ 未改 `provenance.pinnedSha`、⛔ 未动 pin）：

| 判定面 | DS 当前 HEAD `19ff2888` | 结论 |
|---|---|---|
| 三处路径 | `scan-mockups:58` · `lookup:79` · `release:224` **逐字不变、行号都没动** | ✅ 成立 |
| `AGENTS.md:139` CLI 纪律 | **逐字仍在，行号仍是 139** | ✅ 成立 |
| `.filter((p) => existsSync(p))` | `release.mjs:226` **仍在** | ✅ 成立 |
| 该 json 是否已被移出 | `git ls-files` **仍跟踪它** ⇒ **桶二至今未执行** | ✅ 本格仍是**事前**审计 |
| ~~3 个~~ **19 个** commit 碰过的判定面文件 | 只有 `AGENTS.md`（`6b8ad767` / `59f0c066`），且**不是** :139 那行；三处路径脚本 + `release.mjs` 一次都没被碰 | ✅ 无影响（E 格按完整窗口重扫） |

⇒ **报告⛔ 不会一交付就过期。** ⚠️ 这一步本身就是 `lab:E49` / DS 触发器 S 要求的动作。

### 22.6b DS 侧独立立了一条同族纪律（`cee7265c`，2026-08-26 14:59）—— lab 采纳其**三行块**格式

DS `docs/meta-rules.md` **触发器 S**：「接手已登记的待做项，动手前先核它的**前提**还成不成立」。
它把层次分得比 `lab:E49` 更清 —— 逐字「读活源」治**事实**过期，触发器 S 治**决策前提**过期：
「**活源可以全读对，而那条待做项的存在理由已不成立**」。
⇒ 按这个分法：`lab:E49`（边界值过期）属**事实**类；**本格的主语窄化（`lab:E50`）属决策前提类**。
⇒ ✅ lab 已把它要求的**三行块**（`登记记的 / 现取的 / 前提还成不成立`）采纳进 AGENTS §2.18 推论二。
⚠️ ⛔ **不写成「两边独立收敛」** —— 两仓 owner 是同一个人；⛔ 也不推断谁先谁后、谁影响谁。

### 22.7 ⛔ 本轮未覆盖

1. C 格 52 文件覆盖表**未重算**（补第四面后两个比值会变）。
2. `pnpm release --dry-run` **未实跑**（端到端那一层）—— §22.1 已按三层拆开登记；
   ⛔ 别把 §22.2a 的隔离实测读成端到端实测。
3. **热区未查** —— 两个 run 读的都是行 1795–2124 附近，⛔ 未查那段是什么。
4. `squeeze.readButNotDeclared` 未追（`r007`/`r009` 实读面有、声明面无）。
5. ~~🔴 **另外 5 个 `_generated` 产物的移出影响未查**~~ ⇒ ✅ **E 格已做**（§23）。
   > 🔴 **E 格订正**：本条原写「另外 **5 个**」—— 桶二口径（`*.json` `*.jsonl`）实为 **3 个**，
   > 全口径（含 4 份 `.md`）为 **7 个**，5 匹配不上任何一种。那个 `5` 恰好等于处方重核 ① 逐字
   > 「其余 **5 个**（**脚本**）管的是别的产物」的数 ⇒ 形态与 `lab:E50`（主语从**脚本**换成**产物**）一致；
   > ⛔ 不断言搬运路径。🔴 这是 D 格在 §22.5 第 1 条**刚抓完主语错之后、在同一份报告的未覆盖清单里又犯一次**。
   > （「被 4 个脚本硬编码」那半 ✅ 实测成立：`delta:37` / `scan-consumers:40` / `scan-mockups:55` / `release:222`。）
6. ~~`docs/internal/ds-health-mockup-targets.json` 是否属桶二 ⛔ 本格未判~~ ⇒ ✅ **E 格已判**（§23.4）：
   落**口径缺口**，且移出它会**静默打掉 `criterionChangesBetween` 那道守卫**。⛔ 仍不代 DS 裁归属。
7. 严/宽口径仍未答（DS 侧零处提及，⛔ 不催不代裁）· `N40` 本身未修 · `grader-changed` 仍未真实发生。
8. `STATUS-CHANGELOG.md` 未删**原因**仍未追问（§20.6 第 2 条 / C 格 §9 第 5 条原样）。
9. 加大 N · `actionability` / 铁律 2 / `first-shot` T2 / **manual r006** 四格原样未动。

---

## 23. E 格交付：桶二**剩余** `_generated` 产物 + 边界件 `ds-health-mockup-targets.json`（2026-08-26 夜）

预注册：[`docs/round2-generated-rest-plan.md`](round2-generated-rest-plan.md)（`f00fc9e`，**跑前落盘**）
报告：[`reports/2026-08-26-round2-generated-rest.md`](../reports/2026-08-26-round2-generated-rest.md)
**0 个新 run · ⛔ 未 build · ⛔ 未跑 `pnpm release`（含 `--dry-run`）· 四个 pin 起止 `dirty=0`、HEAD 未变 ·
golden set 真实 `EXIT=0`（⛔ 不带管道单跑）。**
⚠️ **本格新增了一个一次性量具**（transcript 通道分类器，偏离预注册 §2.2「默认不新增」，边界表见报告 §5.2）。

### 23.1 结论：三个产物的失效形态**互不相同**，也都不等于 pattern-index 那一套

| 产物 | 移出的失效形态 | 与 pattern-index 比 |
|---|---|---|
| `f129-rootradius-silent-gap.probe.json` | ✅ **零后果** —— 路径是 `--out` 默认值（`:247`）· 目录 `mkdirSync(recursive)` 自愈（`:836`）· `--gate` 逐字「**不写**产物」「只读两个 JSON」（⛔ 不含它）· L1 零挂载 | **完全不同** |
| `ds-health-component-origin-cache.json` | ⚠️ **自愈，但要打 Figma** —— 缺文件 ⇒ 空 map ⇒ 全量重问 `/v1/components/<key>`；无凭据环境 ⇒ 那一轮从「有数」退化成记 `error` | 不同（pattern-index 可本地重算） |
| `ds-health-history.jsonl` | 🔴 **比 pattern-index 多一重静默**，且 ③ 的后果性质不同 | **`k = 2` 格不同** |

### 23.2 🔴 `history.jsonl` 新增的两重静默，共同点是「把历史丢失误报成尚未开始」

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

### 23.3 🔴 同一个目录，写入方对「目录不在」的处置**不一致** —— 一条可复用的判别式

隔离实测：`appendFileSync` / `writeFileSync` 在父目录不在时**都 THROW ENOENT**（目录在则 OK）。
而 `_generated/` 下：`f129` / 两个 `a11y-*` / 两个 render spec **都 `mkdirSync(recursive)`**，
`scan-mockups` / `scan-consumers` / `release` **都不**。
⇒ **`mkdirSync(recursive)` 在不在，决定了「移出」是「自愈」还是「ENOENT」。**
⚠️ **本格自己推翻了这条的一半适用性**（报告 §7.1 第 3 条）：release 路径上 `:79` 的 render 测试**先跑**，
其 spec 的 `mkdirSync` 已把目录建回来 ⇒ ENOENT 到不了 `:172` 的 `health:snapshot`。
⇒ 结论收窄为「**只在单独手动跑 `health:snapshot` 且目录不在时**发生」。
⚠️ 另：`health:snapshot` 是 `&&` 链（`consumers --write && mockups --write && delta`）
⇒ 真发生时**第一个抛就把后两个全带掉**，而 `release.mjs:172` 的 `show = spawnSync` 逐字「不拦发版，继续」。

### 23.4 🔴 `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` 自己搬走这一种**。

### 23.5 AI 侧：移出这 3 个，丢的是**名字**，⛔ 不是内容

`context-manifest` 三面命中 **0 / 0 / 0**（阳性对照 `product-pattern-index` = 2 ⇒ **判定面非空**，`lab:N48`）。
补第四面的通道分类器：三者 **`tool_use.input` 零命中**，只在 **Glob 目录清单**里露过名字
（`r007` / `r009` / `r012` 各 1 次，来源逐字 `Glob {"pattern":"docs/internal/_generated/*"}`
—— **一次 Glob 把 8 个文件名全塞进上下文**）。
✅ **两条独立路径互证，⛔ 不是一个数**：D 格靠人工逐条直核得「`r007` Grep 3 次 / `r009` 2 次」，
本器靠程序分类得同一组值 —— 方法与口径独立。
⇒ **这 3 个产物从来没有任何 run 读过、Grep 过、或在任何工具参数里点过名。**

### 23.6 🔴 计划外发现：整个桶二/桶三里**唯一当场断**的，是处方 §3 **第 3 步**

⛔ 不在预注册 H1–H6 里，是量 H2 接触点时撞出来的，如实标注为计划外。
隔离实测（`git archive` 导出临时目录，pin 与 DS HEAD **各跑一遍**，⛔ 未碰 pin、未碰 DS 工作树）：

| 臂 | 动作 | pin `c1db57b8` | DS HEAD `19ff2888` |
|---|---|:---:|:---:|
| 基线 | 不动 | `EXIT=0` 零孤儿 | `EXIT=0` 零孤儿 |
| **A** | 只移 4 份 json/jsonl（**step 2**） | **`EXIT=0`** | **`EXIT=0`** |
| **B** | 再移 4 份 `.md`（**step 3**） | **`EXIT=1`，5 条孤儿** | **`EXIT=1`，5 条孤儿** |

`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**」
⇒ 移那 4 份 `.md` = **每次 master push 当场红**。
🔴 **而处方对这一步零前置登记** —— 桶二那行的 ⚠️ 前置只写 json/jsonl 的脚本硬编码，`.md` 在桶三表里只有
「移出而非删」五个字。**实测恰恰相反：json/jsonl 那一步闸是绿的，`.md` 那一步才是红的。**
⚠️ 顺带：两份 render report 被 `tests/*.spec.ts` 用 `mkdirSync(recursive)+writeFileSync` **无条件重建**
（`manifest-verifier.spec.ts:155-156` / `react-drift-full.spec.ts:201-202`），且在 `release.mjs:79/85` 的
**发版必经路径**上 ⇒ 移了等于没移，还会**把 `_generated/` 目录本身带回来**。

### 23.7 与预注册对账 · 三次判断反转 · 四条登记面缺陷

H1 ✅ HIT（`k=2`，比预测多一格）· H2 ✅ HIT（`m=0`，比预测更强）· H3 ✅ HIT-自愈-有代价 ·
H4 ✅ HIT（比预测更强）· H5 ⚠️ **落判定空档** · H6 ✅ HIT（按预注册指定判定面）⚠️ 规则未定义 `r` 取哪个面。
**三次判断反转已逐条交出**（报告 §7.1）：① 「表格行进不了第 1 类候选」被自己造的故障推翻 ·
② 「闸有盲点」被推翻 —— `:197` 落在 fenced code block（围栏 190 开 / 203 闭）内，**闸按设计正确**，
错的是我的静态枚举（6 行里 1 行在围栏内 ⇒ 真实候选 5 = 实测 5，完全对上）·
③ 「目录不在 ⇒ ENOENT ⇒ 发版时快照当场死」在 release 路径上被推翻（§23.3）。
🔴 **四条登记面缺陷全是 lab 自己的**（报告 §8）：① 「另外 5 个产物」实为 3（`lab:E50` 同族第四次）·
② 「落后 3 个 commit」实为 19 · ③ 处方重核 ① 漏列 `history.jsonl` 两个引用方 ·
④ **本格 H5/H6 判定规则又落空档 —— 而我在本格预注册里专门写了「必须无空档」并引用了 D 格的教训**。

### 23.8 ✅ 收尾自证：结论在 DS 当前 HEAD 上仍成立（这次扫**完整 19 窗口**）

9 个判定面文件里被碰的只有 2 个：`package.json`（只新增一个 audit key，`health:snapshot`/`prepublishOnly`
逐字未变）与 🔴 `scripts/audit-stale-anchors.mjs`（`40e3043a` / `245dbee4`，后者逐字「现行层扩 fragment 类
+ AGENTS.md 入扫描面」）⇒ **判定面确实变了，已在 DS HEAD 上重跑臂 A/B ⇒ 同样 `EXIT=0`/`EXIT=1`、同样 5 条孤儿。**
其余 7 个（三个 health 脚本 · `release.mjs` · `f129` probe · 两个 spec）**19 个 commit 里一次都没被碰**。

### 23.9 ⛔ 本轮未覆盖

1. **桶二端到端仍未实跑** —— `stale-anchors` / `appendFileSync` / `git log` 都是隔离或只读实测，
   `pnpm release` 全链与 `pnpm health:snapshot` 实跑 ⛔ 仍未做（`lab:E48`）。
2. **`_archive/superpowers/plans` 24 份（桶二另一半）未审** —— 处方 §3 第 6 步。
3. **4 份 `.md` 的完整影响面只查到闸与测试两层**，别的读取方 ⛔ 未穷举（计划外撞出来的那条）。
4. `ci.yml:26` 把 `stale-anchors` 扫描面写成 3+5 份规则文档，与 `LIVE_TREE_ROOT='docs'`（自印 219 份）
   不一致 ⇒ **DS 侧登记面陈旧，⛔ lab 只登记不代改**。
5. C 格 52 文件覆盖表未重算（§22.7 第 1 条原样）· pattern-index 热区 1795–2124 未查（第 3 条原样）·
   `squeeze.readButNotDeclared` 未追（第 4 条原样）。
6. 严/宽口径仍未答（DS 零处提及）· `N40` 未修 · `grader-changed` 未真实发生 · 处方 4 两条判据修法由 DS 选。
7. `STATUS-CHANGELOG.md` 未删原因仍未追问 · 加大 N · `actionability` / 铁律 2 / `first-shot` T2 /
   **manual r006** 四格原样未动。
8. **桶二该选 gitignore 还是移出，lab 仍不选** —— 只交出各自的失效形态。
   > 🔴 **2026-08-26 A′ 格订正（`lab:N54`，见 §24.1）**：这句把一个**已被 DS 裁定 hold 的动作**
   > 说成了「待选」。真源 `scripts/audit-plan-lifecycle.mjs:103-125`（2026-08-25，引入 commit = `c1db57b8` 本身）。
   > ⛔ 原文保留 —— 它是当时的真实登记状态，抹掉就看不见这条缺陷了。

---

## 24. A′ 格交付：桶二**整条线的存在理由**复核 —— DS 已裁 hold，lab 九处提及零处知情（2026-08-26 夜）

预注册：[`docs/round2-bucket2-hold-plan.md`](round2-bucket2-hold-plan.md)（`fce1030`，**跑前落盘**）
报告：[`reports/2026-08-26-round2-bucket2-hold.md`](../reports/2026-08-26-round2-bucket2-hold.md)
**0 个新 run · 0 个新量具 · ⛔ 未 build · ⛔ 未跑 `pnpm release`（含 `--dry-run`）·
四个 pin 起止 `dirty=0`、HEAD 未变 · golden set 真实 `EXIT=0`（⛔ 不带管道单跑）。**
⚠️ **计划外开格** —— 不在 §23.9 候选清单里，是核那张清单的前提时撞出来的；
它把候选 **A**（第 2 条）与候选 **B**（第 3 条）的**决策前提**掀掉了。

### 24.1 🔴 起因：一个从 C 格第一格起就在手里、却从没被读的裁定块

`scripts/audit-plan-lifecycle.mjs:103-125` 逐字「📌 **`docs/_archive/superpowers/plans` 与
`docs/internal/_generated/` 为什么刻意留在 docs 树里 —— 这一段是那条决定的唯一真源**
（2026-08-25 评估，起因 = ai-ds-lab `proposals/2026-08-24-archive-triage.md` §2 桶二）」+ 三条理由 + **重开条件**。
实测：引入 commit = **`c1db57b8` 本身**（= C/D/E 三格测量所用的 pin）· 完整 20 窗口里该文件**一次未被碰** ·
lab 全仓 `grep "刻意留在|重开条件|declaredShareOfDocs"` = **0 命中**（只从该文件取过耗时 6.2s 与 `archiveDir` 是配置项）。
⇒ 🔴 **第四种登记面缺陷：存在理由过期**（谓语 `lab:N49` / 时效 `lab:E49` / 主语 `lab:E50` 之后），
逐字命中 DS 触发器 S 那句「**活源可以全读对，而那条待做项的存在理由已不成立**」。

### 24.2 三条理由逐条核：两条成立、一条的一半被实测推翻

| 理由 | lab 侧独立取证 | 判定 |
|---|---|:-:|
| ① 收益押在不代表 AI 读取成本的分母上 | **静态读** DS 注入面声明数组（⛔ 不重跑 `context-cost.mjs` —— 它 `:96` 会 `spawnSync` 跑闸）：`71ac2711` / `c1db57b8` / 活源 **三处逐字同一份**（12+6，+ENTRY 去重 = 14），**均不含**这两个目录 ⇒ 交集 `i = 0` | ✅ **成立** |
| ② 没有任何机制会把 AI 引向这两个目录 | 🔴 **后半句被推翻** —— 3/15 个 run 命中，机制是 **agent 自发的全 `docs/` 树 `Grep`**，`r009`/`r017` 拿到**正文行** | 🔴 **半条不成立** |
| ③ 代价是实的（四项） | ①②③ 成立（③ 带口径名：**8 = 代码口径 · 9 = 含注释口径**）；🔴 **第 ④ 项「当场破」被隔离实测推翻** | ⚠️ **`c = 3`** |

### 24.3 🔴 理由 ② 的论据被推翻，但重开条件按其**字面**未达成 —— 两句话不是同一个判据

| run | `tool_use` 逐字 | 形态 |
|---|---|---|
| `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}` | 🔴 **正文行**进上下文 |
| `r015` | 同类查询，`"output_mode":"files_with_matches"` | 文件名 |
| `r017` | 同类查询，`"output_mode":"content","head_limit":40` | 🔴 **正文行** |

⇒ `docs/_archive/` 就在 `docs/` 下 ⇒ **凡对 `docs/` 做 Grep，归档必然在检索面内**（不是偶然，是机制）。
⇒ 而 DS 的重开条件逐字是「**真的进了某条 onboarding 注入面**」⇒ 按**那个**口径**未达成**（§24.2 理由 ① 已证）。
⇒ 🔴 **论据被推翻 ≠ 重开条件达成。⛔ lab 不裁哪个算**，只交出两句话的差。
⇒ 🔴 **且两半不是一回事**：`_archive/plans` 是**散文**（域名词大量命中、进正文窗口）·
`_generated/*.json` 是**数据**（在检索面内但不进返回窗口）—— **理由 ② 把两个目录并列，实测形态不同。**

### 24.4 🔴 `archiveDir` 漏改**不是当场破，是延迟一周期** —— 隔离三臂

`git archive` 导出 `c1db57b8` 到 `mktemp -d`（⛔ 未碰 pin）：

| 臂 | 动作 | **EXIT** | 逐字 |
|---|---|:---:|---|
| 基线 | 不动 | **0** | `已归档 25 份` · `入站引用 : 37/37 份有引用` ⇒ `expiring = 0` |
| **A** | 移走归档目录、**⛔ 不改 `archiveDir`** | **0** | `已归档 25 份` → **`已归档 0 份 （归档落点未建）`** · **✓ PASS** |
| **C**（阳性对照） | A + 造一份零入站引用的过期 plan | **1** | `[S3] 归档落点缺失：docs/_archive/superpowers/plans 不存在，而本轮有 1 份文件要归档过去` |

机制 `:509-511` 逐字「归档落点**只在本轮真有文件要归档时**才必须存在」+ `if (!archiveExists && expiring > 0)`。
⇒ 收窄为 **D 格四问的第 ④ 格（延迟一周期）**，⛔ 不是第 ① 格。降级形态 = **「✓ PASS + 一个变小的数」**，
与 D 格在 pattern-index 上抓到的**同构**。⚠️ 基线自己就现形过：`handoffs` 那行印着「（归档落点未建）」却没判红
⇒ **这道守卫在基线上就已经是静默的**，⛔ 不是故障注入弄出来的。臂 C 亮 ⇒ 装置活着（`lab:N48`）。

### 24.5 与预注册对账 · 三次判断反转 · 六条登记面缺陷

H1 ✅ HIT（`i=0`）· H2 🔴 **推翻（预测错）**· H3 ⚠️ `c=3`（**预测 4，错**）· H4 ✅ HIT（`p=9`）·
H5 ⚠️ 落**第一档**（预测第二档，**比预测好**）。
✅ **五条取值全部落在预注册 §4 逐值表预先指到的档里（无空档，兑现 §2.19 推论五）**，
🔴 **但 H2 那一档的语义写窄了** —— 把「论据被推翻」与「重开条件达成」焊在一档 ⇒
**「无空档」之外的第二种规则缺陷：档内塞了两个不同的判定。**
**三次反转**（报告 §7.1）：① 「归档目录不会被 AI 碰到」被实测推翻（⛔ 别把一个目录的暴露面外推到另一个）·
② 「归档挤掉现行文档配额」**被我自己的取证工具推翻**（`grep -r` 前 60 行归档占 1.7%，真实窗口占 93.3%
⇒ 两工具返回序不同 ⇒ 该问收窄为**未证**，`lab:N47` 一族）· ③ 「`archiveDir` 漏改当场破」被造故障推翻 ——
**这是预注册 §1 那句「最大风险是变成给 DS 那段话背书」的第一次真实命中**。
🔴 **六条登记面缺陷全是 lab 自己的**（报告 §8）：① 桶二 hold 零登记（9 处提及 / 0 处知情）·
② 「24 份 / 15,343 行」**两个原因叠在一个数上** —— 份数是**时点差**（`71ac2711` 期 24、`c1db57b8` 起 25）、
行数是**口径差**（`split('\n').length` vs `wc -l`，差恰好 = 份数，且那个 `split` 口径正是 lab 自己
`context-cost.mjs:37` 用的）⇒ **订正值 = 25 份 / 15,999 行（`split` 口径）= 15,974 行（`wc -l` 口径）** ·
③ §23.9 第 4 条把 `ci.yml` 扫描面转述成「3+5 份」（逐字是 1+5 = **6 份**；E 格报告 §6.4 是对的，
是 status 那行数错），且**活源实测已是 224 份**（不是 219）· ④ 处方 §2 桶二那行文字写「**7 个**脚本」
却在同一行**列了 8 个名字** —— E 格三行块核了「4 个脚本」✅ 却没核到这处，而 `lab:E50` 整场争议就起于这个数
⇒ **处方的文字错、列名对（代码口径实测也是 8）** · ⑤ 处方 §1 表 `_archive/_prompts` 行**重复两次**（`:38`/`:39`）·
⑥ `AGENTS.md` 第 19 条下**两个「推论四」**（`:482`/`:495`，后者实证属第 18 条）撞号。

### 24.6 ✅ 收尾自证：先列判定面清单，再扫**完整 20 窗口**

DS HEAD = **`cddb16dd`**（E 格记 `19ff2888`，已 +1）；pin 落后 **20** ——
**D 格记 3 / E 格记 19 / 本格 20 ⇒ 这个数每格必须重取，⛔ 不许沿用上一格。**
判定面 6 项里只有 `package.json` 被碰（`19ff2888`），活源实测 `gate-chain` **仍含 `plan-lifecycle`、仍 39 步**
⇒ 无影响；其余 5 项（`audit-plan-lifecycle.mjs` · `audit-rule-inventory.mjs` · `release.mjs` ·
`docs/_archive/superpowers/plans/` · `backlog-owner-decisions.html`）**一次都没被碰**。

### 24.7 顺带交付：候选 F 一行复核（⛔ 只报不改、⛔ 未开格）

活源 `.github/workflows/ci.yml:26-27` 逐字仍是 **6 份**扫描面；隔离跑活源该闸自印
「现行层扫描面……**224 份**（含 `docs/` 外根文件 1 份：`AGENTS.md`）」
⇒ **陈旧头注释仍在，差从 E 格记的「vs 219」扩到「vs 224」。** ⛔ lab 只登记。

### 24.8 ⛔ 本轮未覆盖

1. **归档在真实 `Grep` 返回序里被前置的机制未查明**（只有 93.3% vs 32.9% 这个差），
   「挤掉了哪些现行行」⛔ **未证** —— 复现工具与被测通道不同（`lab:N47`）。
2. 归档物进上下文对 run 产出的**影响**未量（只答「进没进 / 占多少窗口」）。
3. `_archive` 其余子目录（`_plans` / `_design-kickoffs` / `retrospection`）碰触面未量 ——
   `r009` 的 277 行命中里已见前两个。
4. `_archive/superpowers/plans` 移出只查了 `audit:plan-lifecycle` **一道闸**，
   `audit:stale-anchors` 对这 25 份的入站引用面 ⛔ 未测。
5. 候选 B（4 份 `_generated/*.md` 完整读取方）本格明确划界不做 ·
   C 格 52 文件覆盖表未重算 · pattern-index 热区 1795–2124 未查 · `squeeze.readButNotDeclared` 未追。
6. **桶二端到端仍未实跑**（`lab:E48` 原样）· **⛔ lab 不裁 hold 该不该重开**。
7. 严/宽口径未答（DS 零处提及）· `N40` 未修 · `grader-changed` 未真实发生 · 处方 4 两条判据修法由 DS 选。
8. `STATUS-CHANGELOG.md` 未删原因仍未追问 · 加大 N · `actionability` / 铁律 2 /
   `first-shot` T2 / **manual r006** 四格原样未动。

## 25. A′′ 格交付：`STATUS-CHANGELOG.md` 不删裁定的**第二个裁定块**复核 —— `lab:N54` 第二次命中（2026-08-26 夜）

预注册：[`docs/round2-changelog-hold-plan.md`](round2-changelog-hold-plan.md)（`cc36820`，**跑前落盘**）
报告：[`reports/2026-08-26-round2-changelog-hold.md`](../reports/2026-08-26-round2-changelog-hold.md)
**0 个新 run · 0 个新量具 · ⛔ 未 build · ⛔ 未跑 `pnpm release`（含 `--dry-run`）· ⛔ 未重跑 `context-cost.mjs` ·
⛔ 未用 golden set（故未跑 freeze）· 四个 pin 起止 `dirty=0`、HEAD 未变 · 隔离实测 `git archive` → `mktemp -d` 且已清理。**

### 25.1 🔴 起因：DS 侧不是一个裁定块，是**两个，同一个 commit**

`scripts/audit-doc-shape.mjs:48-73` 逐字「📌 **`STATUS-CHANGELOG.md`（= S1 的 `DEST.S1`…）为什么刻意不上体量闸、
也不切分、也不删 —— 这一段是那条决定的唯一真源**（2026-08-25 评估，起因 = ai-ds-lab
`proposals/2026-08-24-archive-triage.md` 把它列进「桶三 · 纯流水账 → 真删」）」+ 四条理由 + 三条带判据的重开条件。
实测：引入 commit = **`c1db57b8` 本身**（**与 A′ 格那个块同一个 commit**）· 活源 21 窗口里该文件**一次未被碰**。
⇒ 🔴 **`lab:N54`「存在理由过期」第二次命中，且形态更硬**：A′ 格是「9 处提及、0 处知情」，
本格是 lab **把它明文登记成「未追问 / 未删」13 处、0 处知情**（§20.6 第 2 条起，横跨 C/D/E/A′ 五格）。
⚠️ 抓到它靠的是**第四行 grep 裁定词**，⛔ 不是 grep 待做项自己的名字 —— **裁定块写在另一个闸的头注释里**。
⚠️ 同族块按措辞 grep 共 **3 个**（第三个 `audit-doc-shape.mjs:29-40` 起因是 DS 自己的 `INFRA-F95`，
带**日期型重开条件 2026-09-01 到期**，⛔ owner = DS，lab 只登记）。**⛔ 不声称「只有 3 个」。**

### 25.2 四条理由逐条核：两条成立、一条半条被推翻、一条的技术读法被造故障推翻

| 理由 | lab 侧独立取证 | 判定 |
|---|---|:-:|
| ① 删不了（是本闸判据落点） | 🔴 **隔离三臂**：臂 A 删掉该文件 ⇒ **`EXIT=0` ✓ PASS，且与基线输出 `diff` 为空**（比 A′ 格 `archiveDir` 更彻底 —— 那次还留「已归档 0 份」痕迹，**本次零痕迹**）；臂 C 阳性对照 `EXIT=1` ⇒ 装置活着 | 🔴 **技术阻断读法不成立** |
| ② 不在 AI 读取面 | 三 sha（`71ac2711`/`c1db57b8`/活源 `b593c301`）注入面**指纹逐字同一份**（14 份），**均不含** ⇒ `i = 0` | ✅ **成立** |
| ③ 切分不划算（77 处全整文件级） | 现行层真锚点 **`k = 0`**（比 DS 说的更强）；🔴 **但撞出一处行号形式的条目级引用 `ds-health-mockup-targets.json:92` → `STATUS-CHANGELOG.md:384（PMPP-1133）`，实测 `:384` 是空行、PMPP-1133 在 3889 行 ⇒ 已错 3,505 行** | ⚠️ **半条被推翻** |
| ④ §11.3 原则空转（+7,623/−3,477/+4,146） | `c1db57b8` 上重算 = **+7,676 / −3,477 / +4,199**；`c1db57b8` **自身** numstat = **53/0** ⇒ `7676−53=7623` ✅ `4199−53=4146` ✅ | ✅ **其时点上逐位正确** |

**三条重开条件 (a)(b)(c) 全部未达成**（(a) `STATUS.md` §起手必读链路 135–204 + `AGENTS.md:65` L-core 四份 +
`.husky/` + `.claude/settings*` 四面全不含 · (b) 那 14 份不含 · (c) 16 run 里 `is_error = 0`、**截断真值 0**）。
⛔ **lab 不裁该不该删 / 该不该重开。**

### 25.3 🔴 理由 ③ 的口径缺口：DS 的检验面**只扫 `.md`**，唯一那处条目级引用在 `.json` 里

`audit-stale-anchors.mjs` 定义的「现行层」只含 `.md` ⇒ `ds-health-mockup-targets.json` 里那处**行号形式**引用
**结构性地永远不被这道闸看见**。而该文件的写入方式是**每次 wrap-up 往顶部 prepend** ⇒
**任何行号引用下一轮即失效，⛔ 不用等分卷。**
⇒ ⛔ **lab 不说「DS 数错了」**（在它自定义口径内那句可能是对的），只交出**口径缺口**。
⚠️ 该文件正是 **E 格审过的边界件**，E 格未查到这一层。

### 25.4 🔴 计划外：臂 C 撞出 FAIL 文案是个**无守卫的死指针**

臂 C（文件已被臂 A 删掉的状态）下闸照常 FAIL，文案照印 `超出内容搬去：docs/internal/STATUS-CHANGELOG.md 顶部`
—— **指向一个不存在的文件，不报错、不知情、无守卫**。
⇒ 技术上 `d = 0`；后果是把「写了没人执行」升级成「**写了没地方执行**」。⛔ lab 不裁该不该造新落点。

### 25.5 与预注册对账 · 三次判断反转 · 六条登记面缺陷

**14 条可判定条目全部落在 §4 逐值表预先指到的档里（无空档）**，
🔴 **但两处规则本身有缺陷**（见下 ②③）⇒ **「无空档」与「档写得对」是两回事，第二次实证**（A′ 格 H2 是第一次）。
**三次反转**：① H1c 粗代理 `e=0.857`（部分执行档）→ 精代理 `e=1.043`（真被执行档），**两个代理落不同档** ·
② H6 `q=14 → 0`，**判定面被本格自己的预注册污染** · ③ H5(c) 截断 `16 → 0`，
**16 次全是同一段 DS 正文里讲 UI 三状态的「截断」二字** ⇒ 🔴 **后两条都是「我自己的取证工具造假象」
（`lab:N47` 一族），本格连中两次，两次都靠「读数太整齐 ⇒ 先追查再采信」抓到。**
🔴 **六条登记面缺陷全是 lab 自己的**：① `STATUS-CHANGELOG` 裁定零登记（13 处未追问 / 0 处知情）·
② 🔴 **预注册 H1b 一档塞了两个判定 —— 而我执行了档内自查仍然漏了**（焊接**不在措辞里、在命题本身**：
技术强制 vs 规范应然）⇒ 立新纪律，见 `AGENTS.md` §2 第 21 条 · ③ 预注册 H3b 的 `k` 定义**落了空档**
（只写 `§`/`#` 锚点，未覆盖行号形式，而实测恰恰命中行号形式）· ④ H6 判定面自污染 ·
⑤ **两次 grep 撑爆输出**（未排 `runs/*.jsonl` 799 KB、未排 `.claude/worktrees/` 517 KB）⇒ **口径要写死在命令里** ·
⑥ 🔴 **§24.8 第 3 条把 `_archive` 子目录写成「`_plans`/`_design-kickoffs`/`retrospection`」——
活源实为 5 个（`_plans`/`_prompts`/`_reports`/`retrospection`/`superpowers`），`_design-kickoffs` 不存在**（`lab:E50` 同族）。

### 25.6 ✅ 收尾自证 + 交付前程序化自核

DS HEAD = **`b593c301`**（A′ 格记 `cddb16dd`）；pin 落后 **21** ——
**D 格 3 / E 格 19 / A′ 格 20 / 本格 21 ⇒ ⛔ 每格必须重取。**
判定面 **9 项**逐项扫完整 21 窗口：🔴 **关键项 `audit-doc-shape.mjs` 被碰 0 次**
⇒ 闸代码在活源与 `c1db57b8` 逐字相同 ⇒ **造故障结论在 DS 当前 HEAD 上同样成立**；
其余被碰项（`STATUS.md` 19 / `STATUS-CHANGELOG` 14 / `stale-anchors` 2 / `AGENTS.md` 2 / `.husky` 1）
均已在活源或双 sha 上取过读数 ⇒ **无一项结论依赖过期读数**。
✅ **交付前程序化自核 23 ✅ / 1 🔴**：抓到报告一处引错行号（`PMPP-1133` 3891 → **3889**，偏移订正为 **3,505**）
⇒ **A′ 格立的这条纪律两格连中同类错误。**
⚠️ 自核脚本自己也报了一条假阳 ⇒ **自核脚本的期望值也要核，⛔ 别把它的红直接当结论。**

### 25.7 ⛔ 本轮未覆盖

1. `c1db57b8` 上的 **token 比未重算**（需跑量具）⇒ 分母过期对 `declaredShareOfDocs` 的影响未量。
2. H3a 那个「**差 1**」（78 vs DS 77）复现不出，只报「两读数不同值」，⛔ 未推因果。
3. `ds-health-mockup-targets.json:92` 那处行号引用**写下时是否就是错的**未追（只证「现在是错的」）。
4. 🔴 **起手撞见但本格 ⛔ 未测**：`audit-stale-anchors.mjs:717-718` 硬依赖 `_archive/retrospection` 目录存在
   （逐字 `if (!dirIndex.some(… ['_archive','retrospection']))` ⇒ `console.error`），
   而 `retrospection` 属**桶三（真删）**、`c1db57b8` 已删 34 份 ⇒ **删剩余会不会触发它，当场可测。**
5. `LIVE_TREE_EXCLUDE_PREFIXES` 排的是**出站**（归档作扫描源），**入站面未见排除** ⇒ §24.8 第 4 条前提仍成立。
6. §24.8 候选 **A**（Grep 返回序机制，⚠️ 本格四行块判为**测不动**：被测对象是 harness 内部排序/截断/去重，
   lab 无源码无可控输入面，且 §2.20 推论三已给出处置）· **B** · **C** · **D** 四格原样未开。
7. **桶二端到端仍未实跑**（`lab:E48` 原样）· C 格 52 文件覆盖表未重算 · pattern-index 热区 1795–2124 未查 ·
   `squeeze.readButNotDeclared` 未追。
8. 严/宽口径未答（DS 零处提及）· `N40` 未修 · `grader-changed` 未真实发生 · 处方 4 两条判据修法由 DS 选 ·
   加大 N · `actionability` / 铁律 2 / `first-shot` T2 / **manual r006** 四格原样未动。

---

## 26. A″′ 格交付：桶三「已被执行」复核 —— 🔴 **本格 H1–H4 是重复劳动，§20.4 早已交付**（2026-08-27）

预注册：[`docs/round2-bucket3-executed-plan.md`](round2-bucket3-executed-plan.md)（`0c7a156`，**跑前落盘**）
报告：[`reports/2026-08-27-round2-bucket3-executed.md`](../reports/2026-08-27-round2-bucket3-executed.md)
**0 个新 run · 0 个新量具 · ⛔ 未 build · ⛔ 未跑 `pnpm release`（含 `--dry-run`）· ⛔ 未重跑 `context-cost.mjs` ·
⛔ 未用 golden set（故未跑 freeze）· 四个 pin 起止 `dirty=0` · DS 工作树 dirty 起止均 2（既存两项，⛔ 未碰）·
隔离实测 `git archive` → `mktemp -d` 三副本，跑完已清、复证无残留。**

### 26.1 🔴 起手命题被自己推翻：不是「lab 不知情」，是「**我不知道 lab 已经知情**」

起手按 §2.20 四行块核候选 A 前提，核出前提不成立，再按 §2.21 推论一把裁定词 grep 跑完，
撞出 DS commit **`483e3feb`**（2026-08-25）subject 逐字「执行 lab 的 5 份处方 —— …… **归档桶三** ……」，
且它是 `c1db57b8` 的祖先、非 `71ac2711` 的祖先 ⇒ 五格 pin 从第一格起就带着执行结果。
**我据此报「`lab:N54` 第三次命中、lab 零处知情」——错了。**
实测 `q = 30` 处知情，其中 [§20.4](#L1122) 与 [`AGENTS.md:314`](../AGENTS.md#L314)
**逐字写着同一结论**（含 `483e3feb` 与 8/7/2/1 逐行吻合），另有 `ds-reply-2026-08-25.md:56-59`
的**逐份列表**、L1 指纹格预注册与报告、readsurface 格报告共四处独立复述。
⇒ 🔴 **H1–H4 是把已交付结论重跑一遍，读数完全相同。⛔ 不包装成新发现。**

### 26.2 ✅ 唯一真正新增：H5/H6 四臂隔离实测（A″ 格 §10 第 1 条逐字标「⛔ 未测」）

| 臂 | 动作（均在 `c1db57b8` 隔离副本） | **EXIT** | must-hit 触发 | 输出 |
|---|---|:-:|:-:|---|
| A 基线 | 原样跑 | **0** | 否 | 零孤儿 |
| B | 删 `STATUS-CHANGELOG.md`（桶三剩余项） | **1** | **否** | 🔴 **24 个孤儿** |
| C 阳性对照 | 删 `_archive/retrospection` **整目录** | **1** | ✅ **是** | **仅 1 行**，fail-closed 当场断 |
| E 区分臂 | 删光 retrospection **全部文件**、留空目录 | **1** | **否** | **18 个孤儿，18/18 指向 retrospection** |

⇒ 🔴 **那道 must-hit 只在「目录消失」时响，删光里面的文件它看不见** ——
与 DS `pr-checks.yml:263` 逐字登记的「「目录在但 0 份 .md ⇒ 不红」是 **Ruling-1 刻意保留的行为**」
**同族、在另一道闸上的第二个实例**。⛔ lab 不裁该不该改它。
⇒ 🔴 **A″ 格那条前置加注两半都不成立**：`retrospection` 属**桶一**（处方 §2 逐字「本轮不删任何一份」），
桶三清单里没有它 ⇒ **按处方执行永远触发不到**；且删文件也不触发，只有删目录才触发。
⚠️ **该 must-hit 在活源 `:718`、pin `c1db57b8` `:612`、`71ac2711` 上根本不存在 ⇒ ⛔ 引它必须标 sha；
本格 H5 结论只对 `c1db57b8` 成立，⛔ 未验证可外推到活源。**

### 26.3 🔴 反转三：A″ 格「理由 ① 技术阻断读法被推翻」**换一道闸就不成立**

A″ 格测 `audit:doc-shape` 删掉 `STATUS-CHANGELOG.md` ⇒ `EXIT=0` ✓ PASS 空 diff。
**本格臂 B 测 `audit:stale-anchors`（同 pin 同副本）⇒ `EXIT=1`，24 个孤儿**
（`STATUS.md` 6 处 · `WRAP-UP.md:13` · `backlog.md` 2 处 · `RELEASING.md` …）。
⇒ **两道闸给出相反答案**：「删不了」在另一条路径上**成立**，只是理由不是 DS 写的那个。
⇒ `§2.19` 推论四又一次命中：**口径不同 ⇒ 落不同档；A″ 格没换闸测。⛔ lab 仍不裁该不该删。**

### 26.4 🔴 第五种登记面缺陷：**知情面与登记面分叉**（三处叠加，全是 lab 自己的）

前四种是 `lab:N49` 谓语错 · `lab:E49` 时效错 · `lab:E50` 主语错 · `lab:N54` 存在理由错。第五种：
**lab 已在某格验过并写下正确结论，但那条待做项的登记面没跟着改**，
于是后续格在**过期的登记面**上继续加注、继续排期。
① §20.4 已判「桶三已执行 4/5 项」，而处方 §3 第 5 步**至今仍写「→ 分批删」**（本格已订正）·
② A″ 格在这条**已过期的待做项**上又加了一条前置加注（其前提本格已推翻）·
③ **§25.5 第 6 条归因错**：把 `_design-kickoffs` 不存在读成「登记的名字就错了」(`lab:E50`)，
实为「**该目录曾存在、被 `483e3feb` 按 lab 自己的处方删了**」(`lab:E49`)，
而 `ds-reply-2026-08-25.md:59` 逐字早写明「整个目录已不存在」
⇒ **同一事实在 lab 内部被给了两种互相矛盾的解释。**

### 26.5 与预注册对账 · 三次反转 · 🔴 两处空档 + 一处退路失效

**三次反转**：① `c=3份/529行 → 2份/210行`（`git show --stat` **路径列截断**，
截断后与另一目录同形 ⇒ `lab:N47` 第五个形态；**口径：按路径归类必须用 `--name-only`**）·
② `q=0 → 30`（核心命题被推翻）· ③ A″ 格结论边界被换闸推翻（§26.3）。
**🔴 空档 ①**：H1 逐字要求「必须比对文件名集合」，但**没定义「lab 侧没有名单时怎么办」**——
处方桶三表只给份数+行数，⇒ 实测无档可落，降级为「份数 + split 行数四行逐位相同 + 1 份点名互证」，
**⛔ 不声称名集已逐份核对**。与 A″ 格 `k` 定义落空档**同型（第二次）**。
**🔴 空档 ②**：H4 的 `q` 只有「知情 / 不知情」二值，**没有「状态知情但归因错」第三态**，
而 §25.5 第 6 条正落此态 ⇒ **§2.21 新判据这次执行了、取值域也逐档写了，仍然漏 ——
焊接既不在措辞里、也不在「事实 vs 应然」轴上，而在「同一读数的两个正交维度（状态 / 归因）」。**
**⚠️ 退路失效**：H5 预写「判定面为空 ⇒ 改在 `71ac2711` 上做」，
实测那道 must-hit 在 `71ac2711` **不存在** ⇒ 预注册给的退路本身不可用，临场改四臂。
✅ **交付前程序化自核 最终 26 ✅ / 0 🔴**（三轮：25/1 → 23/3 → **26/0**）：
🔴 **真红一条** —— 报告引错行号（§25.5 第 6 条 1655 → **1661**）
⇒ **A′ 格立的这条纪律三格连中同类错误，三次全是引错行号。**
🔴 **假阳两条，但假阳本身是个真发现** —— 写完本节 §26 与 `AGENTS.md` 第 22 条后重跑，
`p`/`q` 从 `68/30` 涨到 **`77/41`**，差值正是**刚写的那两段**。
⇒ **`§2.21` 推论二①「判定面排除本格自己的产物」在此结构性失效**：§26 是**追加进本文件**的，
而本文件**本身就是判定面**，文件级 `--exclude` 对它无效。
⇒ **新口径（已进 `AGENTS.md` §2 第 22 条推论五）：判定面取【跑前那个 commit 的树】**
（`git archive 0c7a156 | tar -x`），实测 `p=68 / q=30` 与报告逐位一致 ⇒ **错的是自核脚本口径，不是报告。**
⇒ ⚠️ **同一次自核里既有真红又有假阳** ⇒ **自核报红先判「红在被核对象、还是红在自核脚本的口径」。**

### 26.5a ✅ 收尾自证：🔴 **DS HEAD 在本 session 内就漂了**

起手 `8c36e6a1`（落后 **22**）→ 收尾 `d9cac2e1`（落后 **23**）——
新增 commit `d9cac2e1`（docs 站第四十六轮 + 立 `INFRA-F141`），**与本格判定面无关**。
⇒ D 3 / E 19 / A′ 20 / A″ 21 / **本格 22→23** ⇒ **「每格重取」不够，⚠️ 格内跨小时也可能漂。**
**判定面逐项扫完整落后 23 窗口**：`audit-stale-anchors.mjs` **被碰 3 次**
⇒ **正是活源 `:718` 与 pin `:612` 不同的成因，H5 结论已声明不外推** ✓ ·
`audit-doc-shape.mjs` **0 次**（A″ 格结论在活源仍成立）· `_archive/retrospection` 1 次（19→18）·
`.changeset/stale-anchors-b2-boundary-correction.md` 1 次 · `pr-checks.yml` 1 次。
⇒ **无一项结论依赖过期读数。**

### 26.6 🔴 由本格立的新纪律：四行块要加**第五行**

见 [`AGENTS.md`](../AGENTS.md) §2 第 22 条：
> `lab 自己验过没：<grep 该待做项的关键读数 / 归因 sha 在 lab 仓内的命中>`

第 20 条治「对方还该不该做」· 第 21 条推论一治「对方的裁定不止一个」·
**第 22 条治「这活我自己是不是已经干过了」——三者互不覆盖。**
本格起手若 `grep -rn "483e3feb" .` 就会立刻命中 30 处。

### 26.7 ⛔ 本轮未覆盖

1. `s`（DS 说的「5 份处方」是哪 5 份、哪 2 份没执行）**未取**。
2. H5 结论**未在活源 `8c36e6a1` 上复跑**（该文件两侧 `diff` 不同 ⇒ 需单独取证才能外推）。
3. 臂 B 那 **24 个孤儿**只取处数与样本，**未逐处核**它们与 A″ 格「77 处提及 / `k=0`」的口径关系。
4. `retrospection` **15 份有外部入站**（处方 §1）与臂 E 实测 **18 处孤儿**的差**未追**
   （口径不同：份数 vs 处数 —— ⛔ 别抹平）。
   ⇒ 🔴 **2026-08-27 `A⁗ 格`起手自查订正：这个「差」的一半是 lab 自己的过期读数。**
   处方 [§1 表](../proposals/2026-08-24-archive-triage.md#L41) 算出有入站 = **18 份 / 2,859 行**
   （`53 − 35` / `7,524 − 4,665`），而 [§2 桶一:60](../proposals/2026-08-24-archive-triage.md#L60)
   写的 `15 / 2,449` 是 **S1 原报**，lab 早已订正
   （[`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) 逐字「（**原报** 15 / 2,449）」）。
   **两侧算术各自自洽**（`7,524 − 2,449 = 5,075` = S1 原报 S2 待判「38 份 / 5,075 行」）
   ⇒ **同一份处方内 §1 与 §2 分属两个口径世代** ⇒ `lab:N56` **第 4 个实例**（处方正文已回改）。
   ⚠️ **仍 ⛔ 不抹平**：`18 份`（文件数）与臂 E 的 `18 处`（孤儿引用处数）**仍是两个口径**，
   数值相同 ⛔ 不足以判同批 —— 要判**需重跑臂 E**，`A⁗ 格` 0 新 run 故未做。
5. §25.7 原列 **B / C / D / E** 四格原样未开；**C 格「其余 4 个子目录」的表述已过期**
   （活源实为 5 个，且 `_design-kickoffs`、`_archive/_archive` 已被 `483e3feb` 删除）。
6. ~~`Ruling-N` 编号裁定体系**只登记未穷举**（`pr-checks.yml` 引 `Ruling-1` / `Ruling-11`，
   疑似真源在 DS `docs/internal/retrospection/2026-08-21-criteria-that-never-fire.md`）
   —— **A″ 格的措辞 grep 没覆盖到这一族。**~~
   ⇒ ✅ **2026-08-27 `A⁗ 格`已穷举**（见 [§27](#27-a-格交付ruling-n-编号裁定体系的悬空引用审计--17-条裁定ds-仓内-0-处定义)）。
   🔴 **上面这条登记的两半都要订正**：
   ① 「疑似真源在 `criteria-that-never-fire.md`」**不成立** —— 那份是**引用方**，
   且我把它表格末列读成了「处置」，实测表头逐字是「**谁发现的**」（**归因错**）。
   真源自称在 `audit-claim-vs-livesource.mjs:296` 逐字「**SDD ledger** Ruling-1」。
   ② 「A″ 格的措辞 grep 没覆盖到」**取决于路径口径，两个口径相反答案** ——
   **A″ 自己的口径**（`scripts/*.mjs` + `docs/meta-rules/`）⇒ `h=0` ✅ **成立**；
   **全仓口径** ⇒ `h=1`（`pr-checks.yml:263` 的「刻意」）⇒ 🔴 **不成立**。⛔ 引它必须标口径。
   ⇒ **结论**：体系实为 **17 条**（`1–7`/`9–18`，**刻意跳过 8**），DS 仓 tracked 面
   **引用 5 处 / 覆盖 3 个编号（17.6%）、0 处定义**；定义面只在 **DS 仓外**
   `~/.claude/sdd-archives/tvu-design-system/…`（**lab 取证承诺面之外**）。
   ⚠️ **那 17 条的正文 ⛔ 未读**（预注册限定只做存在性扫描）⇒ 仍是未覆盖项，见 §27.7。
7. ~~第三个裁定块 `audit-doc-shape.mjs:29-40`（日期型重开条件 **2026-09-01 到期**）⛔ owner = DS，只登记。~~
   ⇒ 🟢 **2026-09-11（§31）已复核并关闭**：未达成 ⇒ ⛔ 不上闸；日期型已换成存量阈值型。
   ⚠️ 「⛔ owner = DS，只登记」这半句写于 **2026-08-27**，其前提是 `AGENTS §1.1` 改判（**2026-09-01**）**之前**的边界 ⇒ 那半句自 09-01 起已过期（`lab:E49`）。
8. 桶二端到端仍未实跑（`lab:E48`）· C 格 52 文件覆盖表未重算 · pattern-index 热区未查 ·
   严/宽口径未答 · `N40` 未修 · `grader-changed` 未真实发生 · **manual r006** 原样未动。

---

## 27. A⁗ 格交付：`Ruling-N` 编号裁定体系的**悬空引用审计** —— 🔴 **17 条裁定，DS 仓内 0 处定义**（2026-08-27）

预注册：[`docs/round2-ruling-dangling-plan.md`](round2-ruling-dangling-plan.md)（`e7440c5`，**跑前落盘**）
报告：[`reports/2026-08-27-round2-ruling-dangling.md`](../reports/2026-08-27-round2-ruling-dangling.md)
⚠️ **命名**：本格 = §26.7 候选 **A** 改写后的形态，记作 **`A⁗ 格`**。⛔ **别与 §24 的 `A′ 格`（桶二）混淆。**
**0 个新 run · 0 个新量具 · ⛔ 未 build · ⛔ 未跑 `pnpm release`（含 `--dry-run`）· ⛔ 未重跑 `context-cost.mjs` ·
⛔ 未用 golden set（故未跑 freeze）· 全程只读 `git grep` / `git show` / `git archive`，⛔ 未 checkout ·
四个 pin 起止 `dirty=0` · DS 工作树 dirty 起止均 2（既存两项，⛔ 未碰）· 两棵导出树跑完已清。**

### 27.1 🔴 核心交付：悬空的是**编号这层索引**，⛔ 不是裁定内容

`Ruling-N` 是一套**真实存在、共 17 条**（`1–7` / `9–18`，**刻意跳过 8**）的编号裁定体系。

| 面 | 读数 | 说明 |
|---|:-:|---|
| DS **tracked** 引用 | **5 处 / 3 文件 / 3 个编号**（`1`×3 · `5`×1 · `11`×1） | **四 sha 逐处相同**（含行号） |
| DS **tracked** 定义 | **0** | 三个载体全是「用编号 + 顺带描述效果」，⛔ 无逐条定义 |
| DS untracked + gitignored | **0** | 判定面 **142,843 文件**，非空已证 |
| DS `.claude/`（含 `worktrees/`） | **16** | 🔴 **全是同 3 种 basename 的 worktree 副本**，⛔ 非新定义面 |
| **DS 仓外** `~/.claude/` | **40** | 🔴 **定义面在这里** —— `sdd-archives/tvu-design-system/2026-08-20-infra-f133-claim-vs-livesource-gate/` |

⇒ **DS 仓引用了 17 条中的 3 条（17.6%），其余 14 条仓内零处提及；定义面在 lab 取证承诺面之外。**
⇒ **任何只 clone DS 仓的读者（CI · 新接手的 agent · lab 自己）都无法解析 `pr-checks.yml:263` 的 `Ruling-1` 是什么。**
⛔ **lab 不裁这该不该修。**
⚠️ **那 17 条的正文 ⛔ 未读** —— 预注册 H3 逐字限定「只做存在性扫描」，本格**遵守**（见 §27.7）。

### 27.2 🔴 反转三次

① **`Ruling-11`**：起手 `grep -c -- "--all"` 三 sha 各 **2 行** ⇒ 疑 DS 自称「已整条删除」不成立。
**先证计数器口径**（§18.7）⇒ 那 2 行**全是注释**，逐字「所以**不留** `--all`」，
argv 判定使用 **0 处** + 日志 `708f84ea` 逐字「删 `--all` 死 flag」⇒ **DS 说对，错的是我的计数器**（第 6 次生效）。
② **H3**：预期「定义面到处都没有 ⇒ 悬空加强」，实测 `d_out = 40`
⇒ **「悬空」的准确表述变了**：⛔ 不是「没有定义」，是「**定义面存在，但不在任何 DS 仓读者能到达的面上**」。
③ **H6**：跑前预测 `h ≥ 1` **兑现**，但**换口径就反号**（见 27.3）。

### 27.3 🔴 决定结论的是**路径口径**，⛔ 不是措辞集 —— §2.19 推论四同族第三个实例

| 措辞集 | 全仓口径 | **A″ 格自己的路径口径** |
|---|:-:|:-:|
| `W6`（A″ `plan:52` 六措辞） · `W4`（`plan:73` 四措辞） · `W4′`（我预注册四措辞） | **1** | **0** |

**三套措辞集同口径下读数相同** ⇒ 措辞差异对结论无影响；**换路径口径则相反答案**：
A″ 自己的口径 ⇒ `h=0` ⇒ §26.7#6 那句 ✅ **成立**；全仓口径 ⇒ `h=1`（`pr-checks.yml:263` 的「刻意」）⇒ 🔴 **不成立**。
⇒ **⛔ 报「某次 grep 覆没覆盖到」必须标路径口径**，与「必须标是哪道闸」（§2.22 推论四）同族。

### 27.4 🔴 撞出 lab 自己三处登记面缺陷

① **A″ 格 plan 内部两套互不相同的措辞集**（`:52` 六个 / `:73` 四个）⇒「A″ 用了哪些措辞」在 lab 登记面上就有两个答案。
② **A″ 格那次 grep 的判定面有一半是空的**：`plan:52` 登记扫 `docs/meta-rules/`（**目录**），
而它在三 sha 上**均为 0 份** —— 真身是 `docs/meta-rules.md`（**文件**，967 行，`W6` 措辞**本可命中 3 行**）
⇒ `lab:N48`「判据返回空集先证判定面非空」**lab 自己没执行**。
⚠️ ⛔ **诚实边界**：lab 只能读到它**登记**的命令，⛔ 无法确认**实际**跑的是哪个 —— **登记面笔误**与**判定面塌**两种可能都报。
③ **`criteria-that-never-fire.md` 表末列我读错了**：实测表头逐字「**谁发现的**」，⛔ 不是「处置」
⇒ **状态对、归因错**（§2.22 推论三那条轴）。

### 27.5 H7 ⇒ 落 **H7-c**（状态登记了、归因写错了）· 🔴 **预注册内部矛盾一处**

`p_pre`（`2bf419e` 树）= **5** · `q` = **0** · `q_attr` = **3** —— **三值与跑前预测逐位相同**。
三处归因错全部写着「疑似真源在 / **真源疑在** `criteria-that-never-fire.md`」。
🔴 `p_reg`（`e7440c5` 跑前 commit 树）= **18**，差 13 全来自本格预注册自己
⇒ **`§2.22` 推论五那条口径对「新建文件型产物」反向失效**（详见 27.6）。
⚠️ `q_attr` 首轮只用 `疑似真源` 得 **2**，补上变体 `真源疑在` 才是 **3**
⇒ **「取值域覆盖全没有」这一问，`措辞变体` 是它反复漏掉的那一格（第三次）。**

### 27.6 🔴 由本格立的新纪律（进 `AGENTS.md` 第 23 条）

见 [`AGENTS.md`](../AGENTS.md) §2 第 23 条。三条要点：
**① 判定面取【接手时那个 commit 的树】= 上一格交付 commit，⛔ 不是【跑前 commit（含本格预注册）】。**
**② 「某次 grep 覆没覆盖到」必须标【路径口径】；口径不同 ⇒ 相反答案。**
**③ 「引用 ≠ 定义」—— 判某处是不是真源，要问「它是在【用】这个编号，还是在【定义】它」。**

### 27.7 ⛔ 本轮未覆盖

1. 🔴 **那 17 条裁定的正文 ⛔ 未读**（预注册限定只做存在性扫描，本格遵守）
   ⇒「三处 `Ruling-1` 引用是不是同一条裁定」**未答**。
   ⚠️ `~/.claude/sdd-archives/` **不在 lab 取证承诺面内** —— **要不要扩面 ⛔ 由用户裁。**
2. `Ruling-5`「dispatch 前逐行读 brief」的行为 **无从判**（流程规范，lab 无可实测面）。
3. 其余 **14 个编号**只取存在性，**⛔ 未查各自治什么**。
4. A″ 格那次 grep **实际**跑的路径 ⛔ 无法确认（§27.4②）。
5. 候选 D「`18 份`（文件）vs `18 处`（孤儿）是否同批」**需重跑臂 E**，0 新 run 故未做（§26.7#4 已回改登记面）。
6. 候选 **B / C / E / F** 原样未开 · §25.7 原列四格原样未开。
7. ~~第三个裁定块 `audit-doc-shape.mjs:29-40`（**2026-09-01 到期**）⛔ owner = DS，只登记。~~
   ⇒ 🟢 **2026-09-11（§31）已复核并关闭**（同上条：未达成 ⇒ ⛔ 不上闸；「只登记」那半句的边界前提已于 09-01 过期）。

### 27.8 ✅ 收尾自证：🔴 **DS HEAD 格内漂了 +3 —— 迄今最大**

起手 `d9cac2e1`（落后 **23**）→ 收尾 `8183a1c6`（落后 **26**）。
新增 3 个 commit 全是 gate-face 回归面，**六个判定面文件被碰次数全部 = 0**，
且在新 HEAD 上**复证 H1：`r=5` / `f=3` / 编号集不变** ⇒ **无一项结论依赖过期读数。**
⇒ D 3 / E 19 / A′ 20 / A″ 21 / A″′ 22→23 / **本格 23→26** ⇒ **「格内也会漂」第二次实证，且幅度是上次的 3 倍。**

---

## 28. G 格交付：DS **设计走查判据的覆盖面缺口** —— 🔴 **规则写了 15 条，闸只接住 5 条**（2026-08-27）

> 🟢 **标题执行状态（K 格 §28.11 回改，@`60d644a0`）**：**「5 条」已过期 ⇒ 6 条有闸**
> （④ 的 `--family rows` 已 ship）⇒ **`n_a=5 · n_b=8 · n_c=0 · n_e=2`**（⛔ 全档；④ 归 **(e)** 不归 **(a)**，
> 理由见处方 §4.3）。原标题留痕不删。
> ⚠️ **⛔ 别把「6 条有闸」读成缺口小了一档** —— 这 15 条是**几何族**；DS 那道对位闸的全量分母是
> **118 段**，其中 **83 段（70.3%）至今 `unclassified`**（§28.11）。**两个面不可互推**（第 27 条）。

预注册：[`docs/round2-designqa-gap-plan.md`](round2-designqa-gap-plan.md)（`aa1620c`，**跑前落盘**）
报告：[`reports/2026-08-27-round2-designqa-gap.md`](../reports/2026-08-27-round2-designqa-gap.md)
🔴 **交付物 = [`proposals/2026-08-27-designqa-gate-gap.md`](../proposals/2026-08-27-designqa-gate-gap.md)**
—— **连续 9 格 0 处方的记录到此终止。**
**入口 = 用户提问**（「表格的行之间还放了间距…类似这样的审查缺口现在堵上了吗」）。
**0 新 run · 0 新量具 · ⛔ 未 build / 未 release / 未 freeze / 未 checkout · ⛔ 未改 DS 任何文件（`§8`）·
四 pin 起止 dirty=0 · DS 工作树 dirty 起止均 2 · DS HEAD `8183a1c6` 本格内未漂。**

### 28.1 🔴 核心：⛔ 不是「规则缺失」，是「规则写了、闸没跟上」

用户命题拆四半 ⇒ **① ✅成立 · ② 🔴不成立 · ③ ⚠️半成立 · ④ ⛔ lab 不裁**。

`domain-tvu.md:214` 那条 Acceptance 逐字列了 **4 个**几何核查项，
`audit-mockup-geometry-consistency.mjs` 精确实现了**前 3 个**（`G1` 同类控件同宽 ·
`G2` 各状态帧同名控件同宽 · `G3` 动作按钮右缘对齐），第 ④ 个「**行高与分隔线间距**」**零覆盖**。
⇒ **不是「还没想到」，是实现时漏了一项而没有任何机制发现。**

`g_vert = 0`：68 道闸里 `height` 的比较仅 1 处，且是 `typeof b.height === 'number'` 的**类型检查**；
4 道命中 `.height` 的闸全部拿它做**几何辅助计算**（算底边判重叠 / 拼分组 key），⛔ 无一是判据。

### 28.2 逐条对位：`n_a=5 · n_b=9 · n_c=0 · n_e=1`（几何/尺寸/间距类 15 条）

| 类 | 规则 | 闸 | 本轮 |
|---|:-:|:-:|:-:|
| (a) 已覆盖 | 有 | 有 | **5** |
| **(b) 只能靠人走查** | 有 | **无** | 🔴 **9** |
| (c) 无据可依 | 无 | 无 | **0** |
| (e) 闸判定面**窄于**规则 | 有 | 部分 | **1** |

**(e) 那条**：`mockup:830` 双语三档间距有闸，但逐字只覆盖「**a SINGLE TEXT node**
that stacks MULTIPLE bilingual pairs」⇒ 每行独立 TEXT 节点的形态它看不见。
⚠️ **上一格立的「取值域必须留第三态」纪律，本格首次真的用上。**

### 28.3 🔴 结构性发现：没有机制回答「这条 Acceptance 有没有闸在管」

`rule-inventory` 治「规则清单 stale」· `rule-load-map` 治「AI 读不读得到」·
`hard-rule-compliance` 入口是 **memory 规则**而非 Acceptance checklist ⇒ **三道都不管这件事。**
本格这份对位表是 **lab 手工 grep 68 道闸**做出来的。
⇒ 与 DS `bd53474d` 逐字「**「一条闸」不是判性质的单位**」同族。
⚠️ 那个「3/4 空」与本格「4 条实现 3 条」**数值撞车是巧合**（F139 讲一道闸内 4 条判据 3 条分母恒空）
—— 按控制已验：**同族的是 pattern，⛔ 不是数**。
⇒ **owner 决策点**（⛔ lab 不裁）：要不要立「Acceptance ↔ 闸」对位登记；处方 §4 给了两种形态与各自代价。

### 28.4 ⛔ 本轮未覆盖

1. **⛔ 不声称穷尽**：15 条是 **105 条 checklist** 的几何子集；另有 ~~54 个~~ 🔴 **59 个** Acceptance 段未逐段对位
   （**K 格 §28.11 订正**：`54` 在四个 sha 上**不可复现**、且当时未写口径 —— 闸口径恒 **59** / 窄口径恒 **32** / 扣已对位 **53**）。
2. `(c) = 0` **只对这 15 条成立**，⛔ 不许外推。
3. **⛔ 未 live 核 Figma** —— `CANONICAL-F104` 那条前置（「行」的结构特征可否稳定识别）留给执行方。
4. `design-review-queue` 7 条（**100% `designer-action`，队列 0% 自动化**）只取计数，未逐条对位。
5. 取值层在 `TVU Pack/docs/specs/lcd-canonical-spec.md`，**不在 lab 取证承诺面内，⛔ 未读**。

### 28.5 📌 交棒登记：G 格处方**已交 DS session 执行**（2026-08-27 11:36）

**状态从「lab 出了处方」变为「DS 正在执行」** —— 下个 lab session 起手必须按此判「谁在等谁」。

| 项 | 交棒时刻的基线（**供下次对账，⛔ 别直接信，先 `git log` 实看**） |
|---|---|
| DS 活源 HEAD | **`8183a1c6`** · pin `c1db57b8` 落后 **26** |
| DS 工作树 dirty | **2**（既存两项 `vocabulary.md` / `backlog-owner-decisions.html`，⛔ 非本轮所致） |
| 四个 pin | 全 **`dirty=0`** —— 它们是 **detached worktree 且落在 DS 工作树之外**，⛔ 不受 DS session 影响 |

**交出去的是**：[`proposals/2026-08-27-designqa-gate-gap.md`](../proposals/2026-08-27-designqa-gate-gap.md)
+ 一份自包含 prompt（含前置纪律、R1/R2 必须分开、fail-closed、⛔ 别替 owner 裁 §4 决策点）。

⚠️ **本条之后 lab 的位置**：
1. **⛔ 别催、⛔ 别替它做、⛔ 别去评它做得对不对**（`§8` 单向纪律 + 「等别人的」纪律）——
   除非用户明确要求复核。
2. ⚠️ **DS HEAD 会开始快速漂**（那个 session 正在改 DS 仓）⇒ **下次开格 `pin 落后` 必然 ≫ 26**，
   **⛔ 别拿本表的 26 当现值**，⚠️ 且「格内也会漂」这条已两次实证（A″′ +1 · A⁗ **+3**）。
3. **等 DS 回报三件事**才能更新 §28：**① live 核「行」结构的结论 · ② `--config` 扩
   `controlPatterns` 的实测读数 · ③ 最终落地了哪几条 probe。**
   ⚠️ 拿到后属「对方声明」，按 `§2` 批量任务纪律**必须 lab 侧独立取一次读数**再采信
   （`§2.20` 推论一：「对方写了理由、听起来对」⛔ 不构成证据）。
4. ⚠️ **处方 §4 那个 owner 决策点（要不要立「Acceptance ↔ 闸」对位登记）⛔ 不是 DS session 能拍的**
   —— 若 DS 回报里出现「已选形态 (i)/(ii)」，**先查是不是 owner 亲自裁的**，⛔ 别默认接受。

### 28.6 ✅ lab 侧独立复核：DS 回报三件事全部亲验 —— 🔴 **4 处订正 3 对 1 半，且撞出 2 个新缺陷**（2026-08-27）

**起手实看（⛔ 未信 §28.5 那张交棒表的数）**：DS HEAD `8183a1c6` → **`8a341f46`（+5）**，处方交出后落了 `69153a00`。
**⛔ 未改 DS 任何文件**（全程 `git show` / `git archive` 只读）· DS dirty 起止均 **2**（既存两项）·
`figma-data/` dirty=**0** · 四 pin 起止全 **dirty=0** · ⛔ 未 build / 未 release / 未 freeze /
⛔ 未跑该闸 CLI（`requireFigmaToken` 需 live token）。

#### 复核方法：三条独立路径，⛔ 不采信对方声明

按 §28.5 第 3 条 + `§2.20` 推论一执行。⚠️ **`git show 69153a00` 拿到的 commit message 也是 DS 写的**，
与回报高度一致只证明「两份自述互相自洽」，⛔ 不构成证据。

| 路径 | 做法 |
|---|---|
| **1 读源码** | `git show <sha>:<path>` 逐行，两个 sha 分别取 |
| **2 离线实跑纯函数** | `git archive 8a341f46` 导出闸 + 2 个 lib 到 `mktemp -d`，把 DS **tracked** 的三份快照喂给导出的 `collectRowGroups` / `runProbes`。⛔ 不走 CLI（要 live token）。跑完 `rm -rf` 并复证 |
| **3 树/登记面 grep** | 口径写死在命令里，措辞先列同义变体表（`§2.23` 推论一） |

🔴 **路径 2 能证什么、⛔ 不能证什么（必须分开说）**：它用的是**DS 自己写的函数**跑 DS 自己的快照
⇒ 只证「**DS 报的数确实是那套装置在那份快照上的真实输出**」，**⛔ 不证判据本身正确**。
判据的正确性由路径 1 独立验（四条合取 / R1-R2 分开 / fail-closed / R1 不复用 `widthTolerance` 均逐行核到）。
⇒ **由此立 `AGENTS.md` 第 24 条。**

#### ③ 落地了哪几条 probe —— ✅ 成立

`probeR1`(`:494`) · `probeR2`(`:521`) · `probeR3`(`:597`) @ `8a341f46`；`--family controls|rows|all`，
默认 `controls`（`:651`/`:657`/`:741`）。
✅ `:514-516` 注释**逐字引用了处方 §3.2 与用户原话**「表格的行之间还放了间距」
⇒ **处方被逐条执行，⛔ 不是平行发明。**

- **测试面**：`it(` = **35** ✅（rows 文件）。DS 报的「53/53」= **35 + 18**（rows + 原 geometry 两份合计）
  ⇒ 两个数都真，但 **DS 两处都没标口径名**（lab 侧纪律：处数≠行数≠出现次数，引数必标口径）。
- **`BASELINE_R1/R2/R3` 机制真实存在**：`:762` `process.env[\`BASELINE_${k}\`]` 模板 + `:116`
  `baseline:{G1…R3}` + `:62` 注释逐字。
  🔴 ⚠️ **我第一次 grep `BASELINE_R` 零命中、差点报「声明与源码不一致」** —— 漏的是**模板字符串形态**。
  ⇒ **`§18.7`「先证自己的计数器」第 7 次生效**，其中**第 2 次差点反向冤枉对方**。

#### 存量表 —— ✅ 三列**逐项吻合**（lab 离线现取）

| 快照 | 行栅格 | 行 | 分隔线 | R1 | R2 | R3 |
|---|:-:|:-:|:-:|:-:|:-:|:-:|
| `0054…` LCD | 269 | 1029 | 37 | 13 | 4 | 0 |
| `xu7H…` TPC | 312 | 1087 | 2 | 15 | 1 | 0 |
| `DtZc…` | 242 | 985 | 68 | 15 | 22 | 1 |

**DS 报的三列与上表逐项相同** ⇒ ✅。⚠️ 五数全中「太整齐」，按纪律先当假阳查：
**这里的整齐是预期的** —— 同 commit 同函数同快照同默认 cfg 是确定性计算，**不同才是问题** ⇒ 不构成假阳。

🔴 **但 lab 现取纠正了 DS 回报一处口径错**：DS 逐字「R2 抓到的正是你报的那一态：**`Frame 3071`（8 处）**」。
- lab 现取：`Frame 3071` 在 R2 findings 里是 **20 条**（全在 `DtZc`），「**8**」的真身是
  **一条 finding 内的 8 个 gap**（`gaps=[16,16,16,16,16,16,16,34]`，9 行 ⇒ 8 间隙）。
  ⇒ 正是 lab 自己那条「**处数 ≠ 行数 ≠ 出现次数**」，**这次犯在 DS 的读数上**。
- ⚠️ **且这 20 条按 component id `842:24361` 归并后只有 1 种**（19 条是 `I…;842:24361` instance 副本）
  ⇒ **第 23 条推论二（副本膨胀）第 2 次生效**。真值 = **1 个 component 的缺陷被 19 个实例继承**，
  ⛔ 不是 20 个独立缺陷。**DS 也没做这次归并。**
- ✅ 「R1 结构上看不见它」**成立**：`Frame 3071` **不在** `DtZc` 的 R1 那 15 条里（逐条列过）
  ⇒ **处方「R1/R2 必须分开」这条判断得到实证。**

#### ① live 核「行」—— ⛔ lab 不可亲验，但结构判据可验且逐条对上

- ⛔ **不可亲验**：11 报 10 假 1 真 · 各行 42/40/35px · 15 个 `RECTANGLE h=0.9 #252525`
  —— 全需 live Figma，**不在 lab 取证承诺面内**（处方 §5.4 已预先声明）。
- ✅ **可验的那半**：`collectRowGroups` `:449-462` **五个 reject 分支**逐条对上 DS 说的「四条合取」
  （`notStacked`+`notEqualWidth` 合成其第一条 · `tooTall`=众数≤上限 · `modeShareLow`=众数占比 · `outlier`=无超幅离群）。
  ✅ `:442` 逐字用 `height > dividerMaxThickness` 过滤行，注释「Dividers sit BETWEEN rows — they are R3's subject, not rows」。
- ⚠️ **「分隔线」在 DS 三处口径是三个数**：**785**（全树扁矩形候选，不可亲验）/ **37**（行栅格子树内
  = lab 现取 `scanned.dividers` ✅）/ **15**（某设置页内，不可亲验）⇒ **引用时必须带 scope。**

#### ② `--config` 扩 `controlPatterns` —— 部分可亲验

- ✅ **可验**：`controlPatterns` 六条正则 @`8183a1c6` `:69-74` 逐字，**无一匹配 `^Item/`**；
  `domain-tvu.md:216` 逐字「不为「看起来一样宽」写死宽度或改字体」
  ⇒ **DS「假阳方向与规则相反」成立**（规则依据可验，读数不可验）。
- ⛔ **不可亲验**：0 → 18 control · G1/G2 报 2/2 全假阳。
- 🔴 ⚠️ **我原想拿自己 rows-only 跑法印出的 `controls:0` 去印证「默认 config 扫出 0 control」——
  不能用**，正因为下面**新缺陷 B**：那个 `0` 是「从没看」。⇒ 纪律自洽性在本格得到一次实测检验。

#### 四处订正逐条判：**3 对 · 1 半（且真源不是 lab）**

| # | DS 订正 | lab 判 |
|:-:|---|---|
| 1 | 「height 比较仅 1 处 typeof」措辞不准，真有 4 处 | ✅ **DS 对，错的是 lab 的读数** |
| 2 | `mockup:2519-2520` 是**默认 maxLines 表** | ✅ **DS 对**，且 lab 行号还偏 1 |
| 3 | `mockup:834` 语境是双语 PRD 卡 | ✅ **DS 对** ⇒ 处方 §2 第 8 条的 **(b) 分类站不住** |
| 4 | `controlPatterns` 在 `:66-75` 不是 `:54-61` | ⚠️ **方向对、值也不准，且 `:54-61` 的真源不是 lab** |

**订正 #1 详**（口径写死：判定面 = `8183a1c6` 树 · `scripts/audit-*.mjs`）：
- 闸数 = **68** ✅（与处方一致）· `.height` **带点**命中 = **4 道闸** ✅（§28.1 那个「4 道」口径正确）
  · `height` 不分大小写 = **7 文件 / 42 行**（另一个口径）
- 🔴 `integrity.mjs:413` `h: typeof b.height === 'number' ? …` 的上下文 `:408-414` 是在 push
  `{name,type,x,y,w,h,url}` ⇒ **构造报告字段**，且 `x/y/width/height` 四字段**同形**
  ⇒ **DS「连比较都不是」成立**；处方称它为「height 的比较仅 1 处」**措辞与事实都不对**。
- lab 重取「比较」**两个口径**：
  - **C1**（同一行出现在比较运算符操作数里）= **2 处**：`connector.mjs:42`（点在框内）·
    `integrity.mjs:345`（`bottom > pbox.height + 0.5` 溢出）
  - **C2**（含跨行赋值后参与比较）= **4 个比较点 / 4 道闸**：+ `integrity.mjs:189/191` 求交 ·
    `overlap.mjs:51/53` 求交
  ⇒ **DS 的「4 处」在 C2 口径成立；两个口径都 ≠ 处方的「1 处」。**
- ✅ DS 列的五类全部实测到位，**含处方漏列的一类**：**长宽比 = `integrity.mjs:215`
  `aspectRatio: h > 0 ? +(w / h).toFixed(3) : 0`**。
- ✅ 「没有任何一处**量相邻对象的垂直间隙**」= **0 处**成立（42 行里无一形如 `next.y − (cur.y + cur.height)`）。
- ⚠️ 「没有任何一处**比较两个同类对象的 height**」**要分两个口径**：
  - 按「有没有闸**报**不等高」⇒ ✅ 成立；
  - 按「有没有对同类对象 height 做**相等性运算**」⇒ 🔴 **有 1 处**（见**新缺陷 A**），
    只是下场是**静默分区、⛔ 不是报缺陷**。

**订正 #4 详**：

| 出处 | 值 | 实测 |
|---|---|---|
| 处方 §3.1 | `:54-61` | ❌ **两个 sha 都不对** |
| DS 订正 | `:66-75` | ⚠️ `:66` 是 `export const DEFAULT_CONFIG = {`；**且未标 sha** —— 该文件正是它自己 +495 行改过的，@`8a341f46` 该数组在 **`:97`** ⇒ `:66-75` 只在 `8183a1c6` 侧近似成立 |
| **lab @`8183a1c6`** | **`:68-75`**（数组本体；六条正则 `:69-74`） | ✅ |
| **lab @`8a341f46`** | **`:97`** | ✅ |

🔴 **`:54-61` 的真源不是 lab** —— `docs/internal/backlog.md:633` @`8183a1c6` **逐字**写着
「`DEFAULT_CONFIG.controlPatterns`（`:54-61`）」（entry 写于 2026-08-06，此后文件漂了）。
处方 §3.1 措辞写成「同 entry 另一条**已实测**」⇒ 命中第 23 条**口径一的一个新形态**：
**把对方登记面的行号转引成自己的实测**。⇒ **lab 的过错是「转引未自取」，⛔ 不是「数错了」**（进第 23 条推论五）。

⚠️ **附带一处 lab 自己的路径口径缺陷**：处方与 §28 全程写 `domain-tvu.md:214` / `mockup:830`（**basename**），
真实路径是 `docs/internal/domain-tvu.md` / `docs/internal/mockup-conventions.md`
⇒ **违自己刚立的第 23 条口径二**（不影响结论）。三处锚点 `:207`/`:214`/`:216` 逐字**均在原位** ✅。

#### 🔴 复核撞出的两个新缺陷（⛔ 不在处方、也不在 DS 回报里）

**新缺陷 A：`collectStateFrameGroups` 按 `WxH` 分组 ⇒ G2 的分母会因高度漂移静默缩小**
- `geometry-consistency.mjs:193` key = `` `${round(width)}x${round(height)}` ``，`:198` 只收 `frames.length >= 2` 的组。
- `:181-183` 注释逐字「same width AND height」+「built equal-height **by construction** — that's the
  invariant every TVU multi-state mockup already maintains」⇒ **把「各状态帧等高」当成前置假设，⛔ 不是判据。**
- ⇒ 两个 sibling state frame 若**高度不同**，落进不同 key ⇒ 组不成立 ⇒ **G2 对它们直接不检查。**
- `collectStateFrameGroups` @`8183a1c6` 全文件只有**定义(`:184`) + 调用(`:234`) 两处**，
  ⛔ **无任何 `unverified` / `checkedUnits` 登记**（三词 grep 零命中）⇒ 被丢弃的 frame 无处可查。
- ⇒ **`lab:N48`「分母塌不许静默降级」的形态。**
- ⚠️ **它加强了处方 §3 的第 1 条依据**：不只是「4 个核查项实现了 3 个」，而是
  **漏掉的第 ④ 个（行高）恰好是前 3 个赖以成立的前提。**

**新缺陷 B：`scanned` 计数器的纪律只守了一半（反向缺口）**
- `:696-700` 注释**逐字立了纪律**：rows 计数器**只在** rows 真跑了时才加，因为「在 controls-only
  跑法上报 `rowGroups: 0` 会把『从没看』说成『扫了零个』—— **正是本闸存在要消除的那个歧义**」。
- `:701-707` 对 **rows 侧执行了**（`wantRows ? {…} : {}`）。
- 🔴 `:711-713` 对 **controls 侧没执行**：`controls` / `buttons` **无条件**进 `scanned`，
  而 `:662` 是 `wantControls ? collectControls(…) : []` ⇒ **`--family rows` 跑法下二者结构上恒为 0**，
  输出 `"controls":0,"buttons":0`，而真相是「**从没看**」。
- lab 实测：三份快照 rows-only 跑法**全部**印 `controls:0,buttons:0`，而 F104 entry / DS 回报 ②
  逐字说默认 config 下是「0 control / **21 button**」⇒ **`buttons` 真值 21，闸报 0。**
- ⚠️ **结论不依赖数据**：`controls` 是空数组常量、`filter().length` 必然 0 ⇒ **结构性缺陷。**
- ⚠️ ⛔ 只出取证，**未出处方** —— 是否立项、怎么修属 owner / DS（`§8`）。

#### ✅ owner 决策点未被替裁，🔴 但登记落点有缺口

- ~~F104 entry @`8a341f46` 逐字「**⏳ 剩下的两件事都要 owner 拍，AI 不自裁**」
  = ① rows 要不要常开 ② 存量是不是缺陷 ⇒ ✅ **⛔ 无 (i)/(ii) 择一，DS 没替 owner 裁。**~~
  🔴 **2026-09-15 订正（本节原判「未被替裁」仍成立，⛔ 但那两件事已经不是「待拍」了）**：
  **owner 2026-09-14 已终裁，两件都裁「不做」，F104 entry 整条删档。**
  真源 = `scripts/audit-mockup-geometry-consistency.mjs:137-138` 逐字
  「🔴 **2026-09-14 owner 终裁：rows 家族维持「默认不开」，28 条存量偏差不逐条判，
  `CANONICAL-F104` 的 backlog entry 已整条删档。⛔ 别再把它当待办重新提。**」
  归因 commit `0f50fcf3`（2026-09-14 17:38:31），subject 逐字「owner 终裁删两条不做的 Active
  —— INFRA-F145 / CANONICAL-F104，封路理由搬进闸脚本」；`docs/internal/backlog.md` 有同步指针。
  ⚠️ **这条终裁比 lab 本轮接手早 15.5 小时，而 lab 全仓八个措辞变体 grep 零命中** ⇒ `lab:N54`
  （存在理由错：事实全读对了，那条待做项已经不该做了）。⇒ **`L4` 的逐条对位表重取，第 4 行
  （`--family rows` R1/R2/R3 归 `(e)`）⛔ 不能再按「有闸」重取。**
- 处方 §4 那个决策点的**唯一落点** = **`docs/internal/STATUS-CHANGELOG.md:131`**
  （措辞变体表四个：`对位登记` / `Acceptance ↔` / `gate:none` / `有没有闸在`；全仓 `docs/**` 仅 **1 文件 1 处**命中）。
- 🔴 **它不在任何 backlog entry 里** —— DS 有 `countOpenEntries` / `Active N` 机制，
  而 CHANGELOG 是**历史流水**、⛔ 不进 open-entries 计数
  ⇒ **处方 §4 的「owner 待拍」状态，结构上不被任何计数追踪，只能靠人翻 CHANGELOG。**
- ⚠️ DS 回报措辞已把「§4 上呈」与「另两件在 backlog F104」**分开说** ⇒ **⛔ 不是谎报**，
  是 lab 补上了它没说的后果。
- ⇒ 与 **§28.3 那个结构性发现同族**：又一次「**没有机制回答某件事的状态**」。

#### ⛔ 28.6 未覆盖 / 不可亲验（如实登记）

1. ⛔ **全部 live Figma 读数**：① 的 11 报 10 假 1 真 / 各行 px / 15 个 RECTANGLE；
   ② 的 0→18 control 与 G1/G2 2/2 假阳；R3 的 785 候选 / 26 形态 / 21 色 —— 需 token，不在承诺面内。
2. ⛔ **未跑该闸 CLI**（`requireFigmaToken`）· ⛔ **未跑 `pnpm vitest`** ⇒ DS 报的
   「2638 passed / 0 failed」与「5 轮故障注入逐条精确转红」**未亲验** · ⛔ 未跑棘轮。
3. ~~⛔ **未验「已 push 双 remote」**~~ ⇒ ✅ **§28.7 已补验**（两端 `master` 逐位相同）。
   ⚠️ 原因记错了一半：本机**`gtimeout` 也没有**（`timeout` / `gtimeout` 双双不在 PATH）
   ⇒ 改用 `git -c http.lowSpeedLimit=1000 -c http.lowSpeedTime=20 ls-remote`，两 remote 均 `exit=0`。
4. ~~**新缺陷 A / B 只出取证，⛔ 未出处方。**~~ ⇒ ✅ **§28.7 已出处方**
   [`proposals/2026-08-27-geometry-gate-denominator-defects.md`](../proposals/2026-08-27-geometry-gate-denominator-defects.md)。
   🔴 **并订正本节两处**：缺陷 B 的危害等级下调（见 §28.7）· 缺陷 A 判出 **DS 已有裁定**（三处逐字）。
5. G 格原「未覆盖」四项（另 **54** 个 Acceptance 段 · `design-review-queue` **7** 条 ·
   105 条 checklist 的非几何族 · 仓外取值层）**本格未动。**

---

### 28.7 ✅ 处置 §28.6 两个新缺陷 —— **处方已出**，且两项前置自查各撞出一条改变判断的证据（2026-08-27）

**起手实看**：lab HEAD `92056be` clean ✅ · DS HEAD 起 `8a341f46` → **止 `1cc95824`（+2）**
⚠️ **DS session 在本格进行中又落了 2 个 commit**（「格内也会漂」**第 4 次实证**）·
DS dirty 起止均 **2**（既存两项）· 四 pin 起止全 **dirty=0** · ⛔ 未改 DS 一字节 · ⛔ 未跑该闸 CLI / vitest / build / release。

✅ **漂移不影响取证**：`git diff --name-only 8a341f46 1cc95824 | grep -i geometry-consistency` = **空**
⇒ 该族**四个文件全未变**，全部行号在两 sha 下同时成立（`8a341f46` 经 `merge-base --is-ancestor` 复证仍是祖先）。

#### 前置自查一：第 22 条第五行「这活我自己干过没」（判定面 = `git archive 92056be`，⛔ 排 `runs/**/*.jsonl`）

判定面自证非空：**229 文件 / 75 md**，已知锚 `geometry-consistency` 命中 ✅（`lab:N48`）。

| 缺陷 | 判 | 证据 |
|:-:|---|---|
| **A** | **半知情** 🔴 | `reports/2026-08-27-round2-designqa-gap.md:64` @`92056be` **已逐字登记** `mockup-geometry-consistency.mjs:193` 的 `${width}x${height}` 分组 key —— 但**那列表头逐字是「是判据吗」**，判的是「⛔ 不是判据」，用途是撑 `g_vert=0`。「分组 key ⇒ **G2 分母塌**」这**第二个正交维度 0 处知情**（`collectStateFrameGroups` 全树 **2 行**、`equal-height` **1 行**、`same width AND height` **1 行**，**全在 §28.6**；**处方文件零命中**） |
| **B** | **零处** ✅ | `wantControls` / `wantRows` / `controls":0` 全树各 **1 行**，全在 §28.6；处方零命中 |

⇒ **第 22 条推论三那条轴（同一读数的两个正交维度）第 2 次生效** —— 这次是「**是不是判据**」vs「**作为分组 key 有没有副作用**」。
⚠️ 诚实边界：`分母`(321 行)/`checkedUnits`(346 行)/`scanned`(23 行) 三词太泛，**只登记进变体表、⛔ 未作判据**；按措辞 grep **⛔ 不保证穷尽**。

#### 前置自查二：第 20 条第四行「它还该做吗」（判定面 = 该族四文件 @`8a341f46`，11 个措辞变体）

🔴 **缺陷 A：已被 DS 裁定，三处互相加强** ——
① `audit-*.mjs:277-279`「same width AND height」+「built **equal-height by construction** — that's the **invariant**」·
② 🔴 `tests/audit-*.test.ts:151` **测试标题**逐字 `only pairs frames of the same size (**different-size frames are not state variants**)` + `:162-163` 双断言 ⇒ **被测试锁定的契约** ·
③ `audit-*.mjs:46-49` 头注释把 **`a grouping key`** 列进 height 用法清单并断言「**NOT ONE compared two sibling objects' heights**」。
⚠️ 且立场**有真实经验来源**：`test.ts:23-25` 逐字「five **1228x1077** state frames」。
⇒ **⛔ 不是「DS 没想到」，是「DS 认为等高是前置不变量」。**

✅ **缺陷 B：零处裁定** —— 全判定面无一处解释「为什么 controls 计数器不加 `wantControls` 条件」，
而 `:696-700` 那段注释逐字立的是**相反**的纪律 ⇒ **DS 自己的注释就是它的反证。**

#### 🔴 出处方过程中撞出的三条新证据（**两条实质改写了 §28.6**）

1. 🔴 **缺陷 B 的危害等级要下调**：`mockup-rules/geometry-consistency.mjs:149` 逐字
   `const checkedUnits = family === 'rows' ? rowUnits : controlUnits + rowUnits`
   ⇒ **rows 跑法下那个假的 0 ⛔ 不进 `checkedUnits`**；`:152` 那条空分母警告也带了 `probeKeys` 守。
   ⇒ **DS 在两个消费点都排除了 controls 侧**，只有 `:84` 文本与 `:179` 的 `extra.scanned` 没排除。
   ⇒ §28.6 记的「分母塌」**改为「输出面缺陷」**。⚠️ 但它仍违 `:696-700` 的纪律原文 —— 那段管的正是**结构化字段**。
2. 🔴 **缺陷 B 有第二个落点**（§28.6 只报了闸文件那处）：`mockup-rules/…:147` 与 `:148` **相邻两行**，
   `rowUnits` 守了 `wantRows ?`、`controlUnits` **没守** ⇒ 照 §28.6 那个改法会让 `:147` 产出 **`NaN`**。
3. 🔴 **`--probe` 在这一态上给假绿**：`inScopeIds` `:719-723` 只含 controls + rowGroups + dividers，
   **⛔ 不含 stateFrameGroups 的 frame**，而 `:797` 判的正是它 ⇒ 被丢弃 frame 里的 control **其 id 仍在**
   ⇒ **`--probe` PASS 而 G2 从未成组**。⚠️ **结构推理，⛔ 未离线实跑证实**（已在处方 §5.4 标明）。

#### ⚠️ 交付前自核撞出 **lab 自己的一处假阳** —— `§18.7` 第 8 次生效，**首次犯在自己的推理上**

处方初稿断言「分组 key 只用 width ⇒ `test:151` 当场转红」。实测 helper `:48` 逐字
`const frame = (id, name, children, w = 1228, h = 1077)`，而 `mixed` 的 `f:2` 是 `frame(…, **1000**, 1696)`
⇒ **连宽都不同** ⇒ 只用 width 仍落不同 key、**测试仍绿**。
⇒ **订正反而加强了结论**：该 fixture **无法区分两种实现** ⇒ **今天把 key 改成只用 width，整套测试不会有一条转红**
⇒ 「同宽不等高」这一态**既无闸也无测试**。

#### 交付

- **处方**：[`proposals/2026-08-27-geometry-gate-denominator-defects.md`](../proposals/2026-08-27-geometry-gate-denominator-defects.md)
- **形态**：**B 给完整修法**（方向由 DS 自己的注释决定，两种形态 + 代价差 + 3 个撞车点 + must-hit/must-not-hit）·
  **A 给「一条无条件成立的修法 + 两条预设应然的备选」** ——
  🟢 **补 `rejected` 登记面**（对称于 DS 自己 rows 侧的 `rowsRejected`）在**两种应然立场下都成立**
  ⇒ **lab 推荐这一条，⛔ 它不预设「不等高算不算状态变体」**；
  🟡 「key 只用 width」/「height 差异转 finding」**并列交出、标明各自预设的立场，⛔ lab 不选**。
- **⛔ lab 不裁的那一句**：「同宽不等高的帧还算不算同一 feature 的状态变体」= **设计规则内容**，交 DS / owner。

⚠️ **本格订正了一处 lab 自己的口径理解**：`§8 单向纪律`的真源是 `specs/2026-08-21-ai-ds-lab-design.md:100`
（逐字「`proposals/` **# 处方：结构化改进建议**」）与 `:306`（逐字「保持单向：**诊断 → 处方 → 执行 → 复检**」）
⇒ **单向指的是流程方向（lab 不执行），⛔ 不是「lab 不给修法」**；`:305` 甚至写 lab **可以在 worktree 里实改验证**。
**真边界是处方 §5.2 最后一句「⛔ 不裁任何一条设计规则的内容该怎么写」** —— 它切开的是
「**规则内容**（⛔ 不裁）」与「**工程实现**（该给）」，⛔ 不是「建议 vs 不建议」。

#### ✅ 顺手活（用户点头后执行）

1. ✅ **清 `/var/folders/…/tmp.bhvoEcIkGA`**（E 格隔离实测残留，删前逐项看过：`exists/{h.jsonl,p.json}` + `t.mjs`
   = `appendFileSync`/`writeFileSync` 对「目录不在」抛不抛的探针）⇒ 删后复证 **ABSENT** ✅ ·
   lab dirty=**0** ✅ · 四 pin dirty 仍全 **0** ✅。
2. ✅ **补验 DS 已 push 双 remote**：`github` 与 `origin` 的 `refs/heads/master` 均 = **`1cc95824`**，**逐位相同**，
   两端 `exit=0`。⚠️ ⛔ 未用 `gtimeout`（**本机 `timeout` / `gtimeout` 双双不在 PATH**，§28.6 第 3 条的原方案不成立）。

#### ⛔ 28.7 未覆盖 / 不可亲验（如实登记）

1. ⛔ **未跑该闸 CLI / `pnpm vitest`** ⇒ 处方里所有「改了会不会转红」的判断**均为读源码推理，未实跑**。
2. ~~⛔ **`--probe` 假绿那条未实证**~~ ⇒ ✅ **§28.8 已实证**（五臂对照 fixture 走离线纯函数路径）。
   🔴 并订正本节第 3 条两处：**盲区范围扩宽**（全域不可断言，⛔ 不限于同宽不等高这一态）·
   **危害面收窄**（同组件集时 G1 独立兜底 ⇒ 无假绿）。
3. ⚠️ **裁定 grep 的判定面只有该族四个文件** —— 换判定面（全仓 / `docs/`）可能有更多裁定，**本格未扫**。
4. ⛔ **§28.6 其余未覆盖项原样保留**（live Figma 读数 · 棘轮 · G 格原四项）。

### 28.8 ✅ H 格：`--probe` 在 G2 上的盲区 **已实证** —— 🔴 一宽一窄两处订正 lab 自己，且撞出「恒红」这一新形态（2026-08-27）

**起手实看**：lab HEAD `742d17d` clean ✅ → 预注册 `9284aeb` ·
DS HEAD 起 **`1cc95824`** → 🔴 **止 `6a78faa4`（+4 commit）**，DS dirty **2 → 1**（`vocabulary.md` 已被提交）·
四 pin 起止全 **dirty=0** · ⛔ 未改 DS 一字节 · ⛔ 未跑该闸 CLI / `vitest` / `build` / `release`。

⚠️ **「格内也会漂」第 5 次实证，且这次是【首次漂到被验文件本身】** —— 前四次都没碰该族。
🔴 **我在本节初稿里写了「本格 DS 未漂」（起手读数为真、收尾即失效）** ⇒ 已订正。
⇒ **口径**：起手基线只能写「起手时」，⛔ 不许写成整格结论；**收尾必须重取一次**。

✅ **漂移不影响本格结论，且已程序化复证**：
`git diff --stat 1cc95824 6a78faa4 -- <该闸>` = **+7 行 / 0 删除**（新增 `covers-acceptance:` 头注释），
`inScopeIds` 的 `new Set([` 从 `:719` 移到 **`:726`** ⇒ **A 与 A′ 都还没被修，只是行号整体 +7**。
🔴 **装置在 `6a78faa4` 上原样重跑，与 `1cc95824` 的输出 `diff` = 空（逐位相同）**
⇒ 本格全部读数在**当前 DS HEAD 上仍然成立**。

**双 sha 行号锚**（⛔ 引行号必标 sha）：`inScopeIds` `:719-723`@`1cc95824` = **`:726-730`**@`6a78faa4` ·
probe 判定 `:797` = **`:804`** · `controlPatterns` `:97-104` = **`:104-111`** ·
`widthTolerance` `:112` = **`:119`** · `baseline` `:116` = **`:123`** ·
`probeG1` 按 label `:309` = **`:316`** · `probeG2` 按 name `:335` = **`:342`**。

📌 **顺带登记（⛔ 本格未复核，只记事实）**：`bf0df7d5` subject 逐字
「`feat(gate): 「Acceptance ↔ 闸」对位登记上闸 + rows 存量可判清单（INFRA-F142 / CANONICAL-F104）`」
⇒ **G 格处方 §4 那个 owner 决策点，DS 侧已落地某个形态**（新增头注释 `covers-acceptance:` +
新闸 `audit-acceptance-gate-coverage.mjs` 机械核）。
⚠️ 按 §28.5#4：**⛔ 别默认这是 owner 亲自裁的**，也 ⛔ 别默认那条「④ 现由 R1/R2/R3 全部覆盖」的自称成立
—— **两者都要下一格（或用户点头后）独立取读数再采信**。
⚠️ **顺手订正一处 lab 自己的口径**：**lab 仓只有 `origin` 一个 remote**（`github` 不存在）
⇒ §28.7 顺手活 2 那句「双 remote 逐位相同」说的是 **DS 仓**，⛔ 不是 lab。

- **入口**：用户在本 session 起手给的三候选里挑定「**候选 2 + 顺手改候选 1**」。
- **预注册**：[`docs/round2-probe-blindspot-plan.md`](round2-probe-blindspot-plan.md) @`9284aeb`（H1–H8 共 20 档，跑前落盘）
- **报告**：[`reports/2026-08-27-round2-probe-blindspot.md`](../reports/2026-08-27-round2-probe-blindspot.md)
- **装置**：[`runs/probe-blindspot-evidence/`](../runs/probe-blindspot-evidence/)（`run.mjs` + `evidence.json` + `stdout.txt`，不带管道单跑 `EXIT=0`）

#### 五臂矩阵（全部读数；两 control 图层名恒 `Ctrl`、宽度恒 418/480，⇒ **每臂都有一处真实不一致**）

| 臂 | `sf:2` 高 | 组件集 | cfg | `n_grp` | `G1` | `G2` | 复刻 exit | 印 `✅ pass` |
|:-:|:-:|:-:|---|:-:|:-:|:-:|:-:|:-:|
| **Y** | 等高 | 不同 | 默认 | 1 | 0 | **1** | 1 | ❌ |
| **X** | **不等高** | 不同 | 默认 | **0** | 0 | **0** | **0** | 🔴 **印了** |
| **W**〔事后追加〕 | 等高 | **相同** | 默认 | 1 | **1** | 1 | 1 | ❌ |
| **Z**〔事后追加〕 | **不等高** | **相同** | 默认 | 0 | **1** | 0 | 1 | ❌ |
| **V**〔事后追加〕 | **不等高** | 相同 | **`baseline.G1=1`** | 0 | 1 | 0 | **0** | 🔴 **印了** |

`inScopeIds` **五臂逐位相同** = `["c:1","c:2"]` ⇒ `sf:1`/`sf:2`/`P` **全不在**。
八条假设**全部落进预注册的档**（H1a·H2a·H3a·**H4a**·H5a·**H6a**·H7a·H8a），⛔ 无空档。
must-hit 全过（臂 Y `G2=1` / 臂 W `G1=1` ⇒ **两条判据都被证明活着**，`lab:N48`）；
must-not-hit 程序化自证（X/Y 只差 `$.children.1.absoluteBoundingBox.height` **1 处**）。

#### 🔴 两处订正 lab 自己的登记面（**方向相反**）

| # | 原写 | 实测 | 方向 |
|:-:|---|---|:-:|
| **1** | §28.7#3 / 处方 §3.1#5：「`--probe` **在这一态上**给假绿」 | `sf:*` 在**五臂全部**不在 `inScopeIds` 里，**含 G2 成组成功并正确 FAIL 的臂** ⇒ **对 G2 全域不可断言** | **扩宽** |
| **2** | 处方 `:15`：「同宽不等高 ⇒ G2 不检查 ⇒ `--probe` 也覆盖不到」（读起来像必然静默通过） | **同组件集时 G1 独立接住**（臂 Z，exit 1）⇒ **假绿只在「label 不同」或「G1 被 `baseline`/`allow` 豁免」时成立**（臂 X / 臂 V 各自实证） | **收窄** |

**结构解释**（可独立复核）：`probeG1:309` 按 `c.label` 分组、人口是整个扫描面；`probeG2:335` 按 `c.name`
分组、人口是 sibling 帧子集；判据同为 `spread(widths) > widthTolerance`
⇒ **同 label 时 G1 人口是 G2 人口的超集 ⇒ G1 必然也命中** ⇒ **G2 在同 label 情形下不提供 G1 之外的检出**，
其独有价值恰在「同图层名、不同组件集」这一窄条。

#### 🔴 新形态：**恒红** —— 已立 `AGENTS.md` 第 25 条（`lab:N58`）

`--probe <帧 id>` 在五臂全部 `exit 2` ⇒ **不能区分故障态与正常态 ⇒ 不是「半个对策」，是 0 个**。
⚠️ 二阶后果：运维试一次帧 id 得到红 ⇒ 得出「帧不能当探针」这个**正确**经验 ⇒ 退回去探 control
⇒ 落进**给绿**那条路径 ⇒ **恒红把人推向假绿**。与 `lab:N33`（恒绿）**镜像**，但恒红更隐蔽 ——
**它长得像 fail-closed**。

#### 交付（三处回改，⛔ 不只写报告）

1. **处方 `geometry-gate-denominator-defects.md`**：缺陷表拆出 **A′**（probe 全域不可断言，⛔ 与设计立场无关）·
   §3.1 加实证订正块 · **新增 §3.6 = A′ 的修法**（形态 (i) 扩 `inScopeIds` + 必须与 A 的 `rejected` 配套 /
   形态 (ii) 改测试标题并承认不可探面；⛔ lab 不选）· §3.5 与 §5 逐条订正。
   ✅ **附一条可实测的撞车判断**：`tests:236-237` 是 `has()` **存在性**判定 ⇒ **往 Set 里加元素不会转红**。
2. **处方 `designqa-gate-gap.md`（候选 1，比原定的更重）**：
   - 措辞按第 23 条推论五改成「**转引 + 现取 + 标 sha**」三件套，并现取三个 sha 的值
     （`:68-75`@`8183a1c6` · `:97-104`@`8a341f46`＝@`1cc95824`）；
   - 🔴 **新增 §3.1a：该节原结论「先试 `--config` 扩 `controlPatterns`」已被 DS live 实测证伪**
     （`backlog.md:622`@`1cc95824` 逐字「⛔ 别再走」、`0→18` 控件但 `2/2` 全假阳、「**行必须按结构识别，不能按名字**」），
     原文留痕不删（§2.11）。
     ⚠️ **这条 §28.6 就已判出，但只写进了 status、⛔ 没回改处方正文** —— 而处方才是 DS 的执行入口
     ⇒ **`lab:N56` 推论一那条口径在 §28.6 未执行，本格补上**（已升级进第 25 条推论三）。
3. **`AGENTS.md` 第 25 条**（恒红 + 三条推论）。

#### ⚠️ 本格自己踩的一处假阳（`§18.7` **第 9 次**生效，**第 2 次**犯在自己推理上）

核「lab 知不知道 DS 已证伪 `^Item/`」时首跑报 **0 处知情**，差点写成「对方已证伪而 lab 零处知情」。
重跑 **4 处知情**（`:2074-2077` / `:2169`）。两个成因并存：
① 措辞变体没列全（DS 写「**18 control**」我搜「**18 个**」，第 23 条推论一第 4 次）·
② 🔴 **我给 grep 加了 `head -6`，真命中被截在窗口外**（`lab:N47` 推论三同族，但那次量别人、**这次量自己**）。
⇒ **已立口径：判「没有」必须跑完，⛔ 不许加 `head`/`-m`；判「有」才可截断。**

#### ⛔ 28.8 未覆盖 / 不可亲验（如实登记）

1. ⛔ **未跑该闸 CLI 本体** ⇒ `--probe` 判定与 exit code 均为**逐行复刻**（复刻源逐字抄在 `run.mjs` 注释里）。
   已逐行读过 `:729-802` 未见其它早退分支，⚠️ 但那是读源码、⛔ 不是实跑。
2. ⛔ **未跑 `pnpm vitest`** ⇒ 「改 `inScopeIds` 会不会转红」仍是读源码推理（唯一例外见交付第 1 条那条 `has()` 判断）。
3. ⛔ **未验 live Figma 上「同宽不等高 + label 不同」的真实发生率** —— 本格证的是「**闸对这一态漏**」，
   ⛔ **不是**「真实文件里有这一态」。**两句话不可互相冒充**，发生率只有 DS / owner 能测。
4. ⛔ **不裁**：等高不变量的应然（§28.7 已定 DS 立场 + `tests:151` 锁定）· A′ 选形态 (i) 还是 (ii) ·
   G2 既然在同 label 情形被 G1 覆盖、那它还该不该保留（**工程判断，交 DS**）。
5. ⚠️ 五臂 fixture 是**最小构造**（每帧 1 个 control）⇒ ⛔ 未测多 control / 嵌套 / `allow` 正则组合。
6. ⛔ **G 格原未覆盖四项、F104 两件待 owner、处方 §4 owner 决策点、两个 hold、`audit-doc-shape.mjs`
   日期型重开条件（2026-09-01 到期）** —— **原样保留，本格未动**。
   > 🔴 **2026-08-27 I 格订正**：本条第 3 项「**处方 §4 owner 决策点**」⛔ 已不再是未覆盖 ——
   > 已回改进 `proposals/2026-08-27-designqa-gate-gap.md` **§4.1**（DS 已落地形态 (ii) + 新闸，6 项现取事实）。
   > ⚠️ 第 5 项（`2026-09-01` 到期）也已登记进 `archive-triage.md` §0.1，但**owner 仍是 DS，状态未变**。

---

### 28.9 ✅ I 格：「判出对方已做 / 已裁 / 已证伪」的**回改存量缺口** —— 🔴 根因是**处方结构性没有「执行状态」栏**，⛔ 不是「忘了回改」（2026-08-27）

🔴 **本节已被 §28.10（J 格）就地修正两处**：**H1 的 `18` 只是 P 面基数、不是全貌**（跨两面 = 23）·
**H2 的「3 条无对应处方」→ 7 条**。⚠️ 而 **H3/H4/H5 与「根因是缺栏位」这个总述结论不变**
⇒ ⛔ **别把「基数被修正」读成「缺口被修正」**，那是两个独立的量（这正是 §28.10 立的 `lab:N60`）。

**起手 → 收尾（第 25 条推论四，⛔ 两栏）**：
lab HEAD **起 `01b6589`**（clean，单 remote `origin`）→ 预注册 `12e67ef` → **止**见本次 commit ·
🔴 **DS HEAD 起 `f15c8500` → 止 `b0008df7`（+3 commit）** —— **「格内也会漂」第 6 次实证** ·
DS dirty **1 → 0**（那个 untracked `backlog-owner-decisions.html` 已被处理）· 四 pin 起止全 **dirty=0**。
⚠️ **交接单写的 DS `6a78faa4` 在本格起手时就已过期（+3）** ⇒ 起手栏本身就是订正后的值。
✅ **几何闸自 `f15c8500` 起未再漂**（`git diff --stat f15c8500 HEAD -- <该闸>` = **空**）⇒ 三 sha 锚表在 `b0008df7` 上仍成立。
⛔ 未改 DS 一字节 · ⛔ 未跑该闸 CLI / `vitest` / `build` / `release` · ⛔ 未在 pin 上跑 `pnpm build`。

- **入口**：用户在本 session 起手三候选里挑定**候选 3**（⛔ 不是 lab 自己开的格）
- **预注册**：[`docs/round2-writeback-gap-plan.md`](round2-writeback-gap-plan.md) @`12e67ef`（H1–H8，跑前落盘）
- **报告**：[`reports/2026-08-27-round2-writeback-gap.md`](../reports/2026-08-27-round2-writeback-gap.md)

#### 🔴 核心：缺口的形状不是「漏了几条」

🔴 **测量时点 = lab `01b6589`（交付前）** —— **本格交付本身会改变这三个数**（自指污染），故双栏：

⚠️ **右栏的时点写死 = §28.9 交付时（lab `5883444`）** —— ⛔ **不是「永久现行值」**：
§28.10 交付又会推高它（自指污染是持续的，⛔ 不是一次性的）。**引这一栏必须带时点。**

| 读数 | @`01b6589`〔交付前〕 | @`5883444`〔§28.9 交付后〕 |
|---|:-:|:-:|
| `round2-status.md` 里「待 DS 执行」 | **7 处** | 9 处（+2 = 本节自己的引述） |
| `proposals/` 全 9 份含「待 DS 执行」 | **0 份文件** | 2 份（回改块的对比引述） |
| `proposals/` 全 9 份含「执行状态」 | **0 份文件** | **4 份**（本格建的栏位） |

⚠️ **口径已订正一处**：预注册的判据 `grep -rnE "^\|?\s*\*{0,2}(执行状态|已执行|待执行)"` **锚了行首**，
抓不到 `- **执行状态**：` 这种写法 ⇒ 改用**纯字符串口径逐份复测**，**两种口径同得 0**，结论不变；
但**窄口径的 0 ⛔ 不能自动读成宽口径的 0**（`lab:N48` 同族）。

⇒ 「对方已做」这类判定**在处方里无处可写** ⇒ 只能靠散落的订正块 ⇒ 做到的
（`retrospection-adr.md` 用 `~~删除线~~`+sha+口径名）与做不到的（`gate-output-contract.md` 整份零登记）
**差一个数量级，差别只在当轮 session 的自觉** ⇒ **已立 `AGENTS.md` 第 26 条（`lab:N59`）+ 三条推论**。

#### 逐档读数（八条假设全部落进预注册的档，⛔ 无空档）

| 假设 | 取值域落档 | 值 |
|:-:|---|---|
| **H1** 语义命题数 `N₁` | {16–20} | **18**（机械筛 29 候选行归并；⛔ 处数≠行数）<br>🔴 **§28.10 修正**：18 在其定义域（**P 面**）内正确，⛔ 但**不是回改存量的全貌** —— 跨 P+S 两面 = **23 条**，低估 **5/23 = 21.7%** |
| **H2** 有处方对应物 `N₂/N₁` | {(¾,1)} | **15/18 = 83.3%**（3 条从来没有对应处方：`N40` · §14.6 结构缺口 · DS 回话 `a9e7169`）<br>🔴 **§28.10 修正**：无对应处方档 **3 → 7 条**（+ `A3`/`B2` owner 裁定 · P2 扩 rubric · `N34` · `-73.8%` 耗时） |
| **H3** 三态 | `a`>5 · `b`=4 · `c`=1 | **a 已回改 11 · b 未回改 4 · c 半回改 1（文件级）** ⇒ 硬门过 |
| **H4** 危害分级 | 重 0 · 中 4 · 轻 1 | 🔴 **重 = 0** · 🟡 中 = **4** · 🟢 轻 = **1** |
| **H5** 措辞变体 | {>5} | 🔴 **一次筛 29 → 二次筛 38（+9 = 31% 召回缺口）**，第 23 条推论一**第 5 次生效** |
| **H6** 反向分叉 | {1} | **1 处**（= H3 的 `c`，⛔ 不重复计数）；反向面 21 行全是已回改留痕 |
| **H7** 对照臂 | **(红 × 绿)** | ✅ **判别器** —— ⛔ 非恒红、⛔ 非恒绿 |
| **H8** 基线两栏 + 锚订正 | — | 见上方起手/收尾栏 + 下方三 sha 锚 |

⚠️ **🔴 重 = 0 必须并排报**（第 26 条推论三）：存量里**没有**「处方仍在推荐一条已被证伪的路」这种雷 ——
唯一那条（`^Item/`）已由 §28.8 在当格补掉。**若 §28.8 没补，本格今天会数出重档 = 1。**

#### H7 对照臂（第 25 条硬要求）

| 臂 | sha | 判据命中 | 判 |
|:-:|---|:-:|:-:|
| 故障臂 | lab `742d17d`（回改前） | **0 处**留痕，`Item/` 仍被提及 1 处 | 🔴 **b** |
| 对照臂 | lab `01b6589`（回改后） | **4 处**留痕（`:113`/`:119`/`:121`/`:135`） | 🟢 **a** |

#### 交付（五份处方回改 —— 本格核心，⛔ 不只写报告）

1. **`gate-output-contract.md`** 新增「执行状态：🟢 已由 DS 落地 `4a68e02d`」+ 亲验块
   （契约常量 `:54`/`:57`/`:59` 逐字对上 §1 与 §1.1 的 `checkedUnits`；`crossCheckExitVsTotals:240` 对上 §3.2；该 lib 被 14 文件引用）
2. **`mockup-gate-merge.md`** 同上 + B1/B2 逐项亲验表（`mockup-rules/` 10 模块 · 总闸 `:15` 逐字「9 → 10」·
   `templates/audit-mockup-workflow.yml` 9,141 B · `consumer-postinstall.mjs:16-17`/`:75-76` 指向它）
   ⛔ 并显式登记「**hook 存在 ≠ hook 真触发过引擎**」（后者需 live Figma，lab 够不到）
3. **`designqa-gate-gap.md`** 新增 **§4.1**：`:172` 那个 owner 决策点已落地（`bf0df7d5` 现取 subject + `13:45:20 +0800` ·
   新闸 391 行 · 🔴 `covers-acceptance:` 在 `f15c8500` 上**真正带声明的被审闸仅 1 道** · `ae07769d` 三处判据粒度），
   ⛔ 并列明**未复核的 3 件**（是否 owner 亲裁 / 形态 (ii) 半个缺口 / 「④ 全覆盖」自称）⇒ **交下一格，用户未点**
4. **`archive-triage.md`** `:26`「本处方尚未执行」加删除线 + 新建 **§0.1 现行执行状态表**（6 步 + 到期项）
   —— **行号双栏（实测偏移 `+31`），程序化自核 9/9 逐位相同**
5. **`geometry-gate-denominator-defects.md`** §3.6 锚表**双 sha ⇒ 三 sha**，补装置重跑证据 + 分组行/声明行口径澄清

#### 三 sha 行号锚（⛔ 引行号必标 sha；程序化自核 **14/14 逐位相同**）

`inScopeIds` `:719-723`@`1cc95824` = `:726-730`@`6a78faa4` = **`:731-735`**@`f15c8500` ·
probe 判定 `:797` = `:804` = **`:809`** · `controlPatterns` `:97-104` = `:104-111` = **`:109-116`** ·
`probeG1` **分组行** `:309` = `:316` = **`:321`** · `probeG2` **分组行** `:335` = `:342` = **`:347`** ·
`baseline` `:116` = `:123` = **`:128`** · `widthTolerance` `:112` = `:119` = **`:124`**。
〔参考〕`export function` **声明行**：`probeG1` `:305`/`:312`/**`:317`** · `probeG2` `:328`/`:335`/**`:340`**。
⚠️ **`6a78faa4 → f15c8500` = +10/−5，全落在头注释块**（`covers-acceptance:` 的 `[N]` 由 max 语义改 Σ 语义，`[4]`→`[7]`）
⇒ **可执行代码零改动**，🔴 **A 与 A′ 仍均未被修**。

✅ **装置重跑复证**：`DS_TREE=<git archive 导出目录> node runs/probe-blindspot-evidence/run.mjs` 在
`6a78faa4` 与 `f15c8500` 上原样各跑一次（⛔ 不带管道单跑，两次 `EXIT=0`），`diff` 两次 stdout = **空**，
且与仓内归档 `stdout.txt`（64 行）**三方逐位相同**。
📌 **`evidence.json` 被重跑覆写，唯一差异是 `meta.dsTree` 输入路径那一行**（`1 insertion / 1 deletion`）
⇒ **该一行 diff 本身就是「五臂读数在 `f15c8500` 上逐位相同」的程序化证据**，已保留新版（指向 `f15c8500`）。

#### ⚠️ 本格自己踩的一处假阳（`§18.7` **第 10 次**生效）

核 `archive-triage.md:301` 引的 `audit-doc-shape.mjs:48-73` 时，按处方头部声明的 `71ac2711` 取读数
**得到 `import` + JSDoc**，差点写成「悬空行号引用」这条新缺陷。
🔴 **实为下一行 `:302` 逐字标了「引入 commit = `c1db57b8`」** ⇒ **判断不成立，已撤**，
只保留一条 🟢 可选建议：**sha 要贴着行号写，⛔ 不要隔行**（已进第 26 条推论二）。
⚠️ 同族第二处：起手报「§28.8 的 `probeG1:316` 与我现取差 4 行」，追到底是
**交接单锚在分组键那一行、我 grep 的是声明行** ⇒ **两个面差 4/2 行，谁都没错。**

#### ⛔ 28.9 未覆盖 / 不可亲验（如实登记）

1. ~~⛔ **次判定面 `reports/` 26 份（34 行候选）未逐条裁定** —— 只登记基数（预注册已声明）~~
   ⇒ 🔴 **§28.10（J 格）已全量跑完**：**12 处**命题，**5 处是 P 面 18 条没有的**
   ⇒ **基数低估 5 条（21.7%）**，但 🔴 **回改缺口零变化**（那 5 条里 4 条无处方对应物、1 条已回改 ⇒ `b=0 · c=0`）
   ⇒ **H3/H4/H5 的读数全部不变**，⛔ 但 H1/H2 已就地修正（见上表）
2. ~~⛔ **跨行分布的命题**（主语与谓语不同行）未覆盖 ⇒ H5 那 31% 之外还有一档未知缺口~~
   ⇒ ✅ **§28.10 已关闭（⛔ 仅限 k ≤ 3）**：真跨行结构 **5 处**（口径内 2 + 口径外 3），
   但 🔴 **新命题 = 0**（两条口径内的全部命中 I 格已有条目：§14.6 结构缺口 · 第 14 条日期型重开条件）
   ⇒ **一次筛召回率 = 29/38 = 76.3%**，⛔ 跨行档**不扩大** H5 那 31% 缺口
   ⚠️ **k ≥ 4 仍未覆盖**（判据 k=3 封顶）；⚠️ 措辞维顺手撞到 3 条漏网（`已被…执行` / `执行` / `已 push`），已登记未系统扫
3. ⛔ **「DS 有没有真的读过某份处方」不可亲验** —— lab 只能量「处方正文写了没」，**两句话不可互相冒充**
4. ⛔ **未逐条跑第 7 / 7b 步的验收清单** —— 只验「产物存在 + 契约常量对得上」，
   ⛔ 未跑全链、⛔ 未验 `auditId` 集合、⛔ 未构造 §3.2 五种 `exit × findings` 组合
   ⇒ **两份处方的 `- [ ]` 一个都没勾**（§8 单向纪律，lab 不代执行方勾验收）
5. ⛔ **未复核候选 1**（`bf0df7d5` 是否 owner 亲裁 · 新闸有没有补上形态 (ii) 的半个缺口 ·
   「④ 现由 R1/R2/R3 全部覆盖」类自称）—— **用户未点，§8 单向纪律**
6. ⛔ **G 格原未覆盖四项 · F104 两件待 owner · 两个 hold · `audit-doc-shape.mjs` 日期型重开条件
   （2026-09-01 到期，owner = DS）** —— 原样保留
7. ⛔ **live Figma 上「同宽不等高 + label 不同」的真实发生率** —— lab 够不到

---

### 28.10 ✅ J 格：补掉 §28.9 自认的**两档未覆盖** —— 🔴 **基数低估 5 条，但回改缺口零变化**（2026-08-27）

**起手 → 止（第 25 条推论四，⛔ 两栏）**：
lab HEAD **起 `5883444`**（clean，单 remote `origin`）→ 预注册 `6400fb9` → **止**见本次 commit ·
🔴 **DS HEAD 起 `b0008df7` → 止 `f3fea851`（+1 commit）** —— **「格内也会漂」第 7 次实证** ·
DS dirty 起止均 **0** · 四 pin 起止全 **dirty=0**。
⚠️ 但那 1 个 commit（`f3fea851` docs(wrap-up)）只碰 DS 仓内两份登记文件（复盘 + tracker，`+86` 行）
⇒ **本格判定面全在 lab 仓 ⇒ 零影响**。
✅ **几何闸自 `f15c8500` 仍未漂**（`git diff --stat f15c8500 f3fea851 -- <该闸>` = **空**）⇒ §28.9 三 sha 锚在新 HEAD 上仍成立。
⛔ **本格未新引 DS 闸行号** ⇒ 未重跑 `probe-blindspot-evidence` 装置（无引用即无需复证）。
⛔ 未改 DS 一字节 · ⛔ 未跑该闸 CLI / `vitest` / `build` / `release` · ⛔ 未在 pin 上跑 `pnpm build` · ⛔ 未触 golden set。

- **入口**：用户在本 session 起手四候选里挑定**候选 3**（⛔ 不是 lab 自己开的格）
- **预注册**：[`docs/round2-writeback-residual-plan.md`](round2-writeback-residual-plan.md)@`6400fb9`（J1–J8，跑前落盘）
- **报告**：[`reports/2026-08-27-round2-writeback-residual.md`](../reports/2026-08-27-round2-writeback-residual.md)
- **装置**：`runs/writeback-secondary-surface/`（`screen.sh` / `crossline.sh` / `single.sh` / `dump.sh`，判据写死在脚本里）

#### 🔴 核心：两档都有真东西，但**后果完全不同**

| 档（= §28.9 未覆盖第 1、2 条） | 补跑结果 | 对 §28.9 的影响 |
|---|---|---|
| **次判定面 S**（`reports/` 34 行） | **12 处**命题，🔴 其中 **5 处是 P 面 18 条没有的** | 🔴 **基数低估 5/23 = 21.7%** |
| **跨行分布**（k ≤ 3） | 真跨行 **5 处**（口径内 2 + 口径外 3） | ✅ **新命题 0** ⇒ **已关闭** |

🔴 **两档合起来对「回改缺口」的影响 = 0**：5 条新命题里 **4 条在 `proposals/` 全 9 份零对应物**
（纯 lab 内部账 / DS 仓内部 owner 裁定 ⇒ 处方本就不该有它们）· **1 条已回改** ⇒ **`b = 0 · c = 0`**
⇒ **§28.9 的 H3（a=11/b=4/c=1）· H4（重0/中4/轻1）· H5（31%）全部不变**，⛔ 只有 H1/H2 被修正（**已就地回改**）。

#### 逐档读数（J1–J8 全部落进预注册的档，⛔ 无空档）

| 假设 | 落档 | 值 |
|:-:|---|---|
| **J1** S 面命题数 `N_S` | {11–15} | **12 处**（34 行归并，口径外 14 行剔除：待裁式 / 引文式 / 否定式 / lab 自指） |
| **J2** 新 vs 复述 | {3–5} | 🔴 **新 5 · 复述 7** |
| **J3** 三态 | `a`=1 · `b`=0 · `c`=0 | 4 条无对应物（不计三态）+ 1 条 `a`（`INFRA-F139`，`crosscheck-denominator-gap.md:92`/`:97`） |
| **J4** 危害分级 | 重 0 · 中 0 · 轻 0 | ⚠️ **并排报 `a` = 1**（第 26 条推论三，⛔ 不许只报缺口栏） |
| **J5** 跨行 `Y` | {1–3} | **`Y` = 2** 口径内 + **3** 口径外 · **F = 28** 假阳 |
| **J6** 召回率修正 | {>75%} | `Y_new = 0` ⇒ **29/38 = 76.3%** |
| **J7** 对照臂 | **四格对角** | ✅ 判别器（含**强**防恒绿臂）—— ⛔ 非恒红、⛔ 非恒绿 |
| **J8** 两栏 + bug 登记 | — | 见上方栏 + 下方四条自我订正 |

🔴 **J3 硬门未过（`b+c=0`）但判据没死** —— 预注册写死「三态不齐 ⇒ 走 J7 判恒红/恒绿」，J7 已实测对角 ⇒ **0 是真实读数**。

#### J7 对照臂（第 25 条硬要求）

| 臂 | 判据 | 探针 | 期望 | 实测 |
|:-:|---|---|:-:|:-:|
| 1 | 单行 AND（I 格判据） | T1 = P `615`/`617` | 抓不到 | 🔴 **0** ✅ |
| 2 | k=3 窗口（本格判据） | T1 | 抓到 | 🟢 **1** ✅ |
| 3 | k=3 窗口 | T3 = `task2-recon.md`（86 行，主语零命中） | 0 | 🔴 **0** ✅ |
| 4 | 单行 AND | T2 = `both` 最小行号 `:14` | 抓到 | 🟢 **1** ✅ |

⚠️ **臂 3 是弱证据**（T3 的 `subj=0 pred=0` ⇒ 0 是 trivially 得来的）⇒ 🔴 **补强防恒绿臂**：
全仓 78 份 tracked `.md` 逐份跑，**30 份** `subj>0 且 pred>0` 却 **k=3 = 0**，最密的
`docs/round2-repin-plan.md`（**subj=33 · pred=16 · both=7 · x3=0**）⇒ 判据确实不恒绿。

#### 🔴 本格四条自我订正（⛔ 三条是判据 bug，读数曾虚高 4–5 倍）

| # | 订正 | 读数变化 |
|:-:|---|---|
| 1 | `comm -12` 要**字典序**，我喂 `sort -n` ⇒ `both` 恒得 **0** | 被 `lab:N48` 当场拦住（与 I 格 29 行矛盾） |
| 2 | 🔴 awk **引用即创建** —— 写 `p[j]` 凭空建 key ⇒ 幽灵配对 | k=2 **79→18** · k=3 **175→33**（虚高 4.4× / 5.3×） |
| 3 | 「**文件不存在**」被误读成「零命中」 | 探 T3 时 3 份在 @`01b6589` 根本不存在 ⇒ 加存在性前置判 |
| 4 | 🔴 **`§18.7` 第 11 次** —— 同名编号撞两个体系 | 差点判出一条 **🔴 重档**（见下） |

✅ **交叉验证锚**：#1/#2 修完后 `both` 回到 **29**，与 §28.9 H5「一次筛 29 行候选」**逐位相同**
⇒ ⛔ 「脚本跑出来有数」≠「数是对的」，**有锚才发现得了虚高**。

⚠️ **订正 #4 详情**：`retrospection-s2-s3.md:147` 的「owner 明确砍掉 `A3`、`B2`」，
我按名字在 `proposals/` grep 到 `retrospection-adr.md:83`/`:97`，
**差点写成「处方仍推荐已被 owner 砍掉的路 ⇒ DS 会白干」**。
🔴 **实为两个不同编号体系**：报告 `:145` 上下文逐字表明那是 **DS 仓归档文件
`process-gap-report-2026-06-11.md` 的内部编号**（同段 `B3`/`B5`/`C2`/`C3` 是该文件的 owner-gated 待决项），
处方里的 `A3`/`B2` 是 lab 自己的 ADR 编号 ⇒ **判断不成立，已撤。**

#### 顺手读数（⛔ 预注册外，只登记不裁定）

- **跨行形态不是 P 独有**：`AGENTS.md` **12** · `round2-changelog-hold-plan` **10** ·
  `changelog-hold` 报告 **9** · `specs/…design.md` **7** —— ⛔ 均未裁定
- **28 条假阳分型**：表格相邻行 **12** · 节标题相邻 **3** · 谓语命中在引文/括号内字面 **5** ·
  🔴 谓语命中在 **markdown anchor** 里 **1**（`1814->1816`，pred 命中 URL 锚）· 其余 **7**
- 🔴 **顺手撞到 I 格 H5 措辞缺口的 3 条实例**（⛔ 不计入 `Y`，措辞维 ≠ 跨行维）：
  `1070`「已被 DS 真实执行 4/5 项」· `1705`「执行 lab 的 5 份处方」· `2258`「DS 已 push 双 remote」
  —— 三条都是真命题，抓不到的原因是谓语集要求「**已执行**」连续

#### ⛔ 28.10 未覆盖 / 不可亲验（如实登记）

1. ⛔ **k ≥ 4 的跨行形态**（隔两行以上）未覆盖 ⇒ **结论只对 k ≤ 3 成立**，⛔ 不许读成「跨行档已彻底跑完」
2. ⛔ **S₄₈ 的 +14 自指行未逐条裁定** —— 只作自指档登记（本格交付物的镜像）
3. ⛔ **措辞维未系统扫** —— 沿用 I 格谓语集以保可比性；顺手撞到 3 条漏网已登记
   ⇒ **H5 那 31% 仍是估计值**
4. ⛔ **强防恒绿臂那 30 份面未逐条裁定** —— 只作对照臂用
5. ⛔ **「DS 有没有真的读过某份处方」不可亲验** —— §28.9 未覆盖第 3 条原样保留
6. ⛔ **未复核候选 1**（`bf0df7d5` 是否 owner 亲裁 · 形态 (ii) 半个缺口 · 「④ 全覆盖」自称）—— 用户未点，§8
7. ⛔ **未跑第 7 / 7b 步验收清单**（候选 4）· ⛔ **未碰 G 格原未覆盖四项**（候选 2）
8. ⛔ **F104 两件待 owner · 两个 hold · `audit-doc-shape.mjs` 日期型重开条件（2026-09-01 到期，owner = DS）** —— 原样保留
9. ⛔ **live Figma 上「同宽不等高 + label 不同」的真实发生率** —— lab 够不到

### 28.11 ✅ K 格：复核 DS 的「Acceptance ↔ 闸对位登记」**三件未复核** —— 🔴 **一件不可判 · 两件仍有实质缺口**（2026-08-27）

**起手 → 止（第 25 条推论四，⛔ 两栏）**：
lab HEAD **起 `44605ba`**（clean，单 remote `origin`）→ 预注册 `d9a86cf` → **止**见本次 commit ·
🔴 **DS HEAD 起 `60d644a0` → 止 `60d644a0`（格内零漂）** · DS dirty 起止均 **0** · 四 pin 起止全 **0**。

🔴 **但「起手基线」本身即第 8 次漂移实证，且是头一次砸在判定面上**：
交接 prompt 给的 DS HEAD 是 `f3fea851`，实取 **`60d644a0`（+4 commit）**，其中
`9f8fd5a2 feat(gate): acceptance 对位闸扫描面 3 → 7 份，同批把 +34 段全分类掉（BASELINE 未动）`
**直接改了本格要复核的那道闸** ⇒ 照 `f3fea851` 取数会把 K2 整条判错。
⚠️ 前 7 次漂移都只碰登记文件（§28.10 逐字「零影响」）⇒ ⛔ **别把那条经验外推成「漂移通常无害」**。

- **入口**：用户在本 session 起手四候选里挑定**候选 1**（⛔ 不是 lab 自己开的格）
  ⚠️ **本轮候选编号 ≠ §28.10 的候选编号**（第 7/7b 验收清单在上轮是 4、本轮是 3）
  ⇒ ⛔ 引「候选 N」必须带 session 限定（§18.7 同族）
- **预注册**：[`docs/round2-acceptance-gate-recheck-plan.md`](round2-acceptance-gate-recheck-plan.md)@`d9a86cf`（K1–K8，跑前落盘）
- **报告**：[`reports/2026-08-27-round2-acceptance-gate-recheck.md`](../reports/2026-08-27-round2-acceptance-gate-recheck.md)
- **装置**：`runs/acceptance-gate-recheck/run.mjs` —— ⛔ **未跑 DS 的 CLI**，只 import 该闸导出的**纯函数**，
  把 `readFile`/`readDir` 注入 `git archive` 导出的只读 tree（零副作用）
- **回改**：`proposals/2026-08-27-designqa-gate-gap.md` §0.1 / §2 表 + 计数 / §3 / §4.2 / §4.3 / §5.3 六处（原文留痕）

#### 🔴 三件结论（⛔ 无空档）

| # | 未复核项 | 落档 | 一句话 |
|:-:|---|:-:|---|
| **K1** | `bf0df7d5` 是否 **owner 亲裁** | 🔴 **不可判** | 四通道**全部非零**，但证据**全部由被验方书写** ⇒ 判「亲裁」与判「自称亲裁」**读数相同** |
| **K2** | 形态 **(ii)** 半缺口 | ⚠️ **部分补上** | **机制上闭合**（反向枚举真源），**存量 70.3% 未答**，棘轮余量 **0** |
| **K3** | 「④ 由 R1/R2/R3 **全部覆盖**」 | 🔴 **过强** | 缺陷⛔ 不是「覆盖错了」，是**歧义被消解成确定断言且零处留痕** |

#### K2 存量读数（⛔ 全档，第 26 条推论三）

| 时点 | 扫描面 | Acceptance 段 | gated | 豁免 | **unclassified** | BASELINE |
|---|:-:|:-:|:-:|:-:|:-:|:-:|
| @`f15c8500` | 3 份 | **84** | 1（1.2%） | 0 | **83（98.8%）** | 83 |
| @`60d644a0` | 7 份 | **118** | 5（4.2%） | 30（25.4%） | **83（70.3%）** | 83 |

🔴 **`unclassified` 绝对数 83 → 83，一段没减** —— 98.8% → 70.3% **全部来自分母变大**。
🔴 **棘轮余量 = 0**（83 = BASELINE 83）⇒ 再增一段就红，⚠️ **但⛔ 无机制逼它减到 0**。
⚠️ **文件级豁免静默盖住 17 段**，其正确性**结构上不可机检**（闸自己 `:32-34` 已登记此代价）。

> 🔴 **上表两个数已被 §28.12（L 格）实测证明是【低估】，⛔ 别再当上界读**：闸的 `ACC_RE` **漏收 7 段**
> ⇒ 语义口径 **分母 118 → 125 · `unclassified` 83 → 90 > BASELINE 83 ⇒ 棘轮 S2 本该红（超 7 段），实际绿**。
> ⚠️ **「一段没减」与「余量 0」两个结论仍成立**（那 7 段在两个时点都漏），⛔ 但**基数本身是低估的** ——
> 与 §28.10 那次「基数被修正 ≠ 缺口被修正」是**同一条轴的反向**：这次是**基数低估让棘轮假绿**。
> 🔴 **豁免那一栏的单位也订正**：`30` 是**段数**，entry 只有 **14 条**（1 文件级盖 17 段 + 13 段级）。
**83 段全在原 3 份**：`mockup-conventions` **59** + `design-process` **19** + `domain-tvu` **5**。
**被审闸 1 → 4 道**；`staleAllows / contradictory / S4 mismatches / dangling` 全 **0**。

#### K3 判据（⛔ 读实现，不读措辞）

`audit-mockup-geometry-consistency.mjs:453-454`@`60d644a0` 逐字
`// Dividers sit BETWEEN rows — they are R3's subject, not rows.` ⇒ **分隔线被显式排除出 `rows`**；
`:478` gap = `boxes[i].y − (boxes[i−1].y + height)` = **跨过分隔线的行底→行顶总距离**
⇒ **分隔线在空隙里偏上偏下、上下留白是否对称、两条分隔线隔多远 —— R2 全看不见**；
**R3 只量 `thickness` + `colors`，⛔ 无位置/间距字段**。
⇒ 「行高与分隔线间距」**逐字读法**下三个 probe 都不量、**宽读法**下 R2 覆盖 ——
🔴 可判的是**歧义零处登记**（⛔ lab 不裁规则内容，§8）。
✅ **对照臂**：同判据在同段 4 项上 = **①②③ 精确 · ④ 过强** ⇒ **3 绿 1 红，⛔ 非恒红非恒绿**。

#### K1 四通道（🔴 全非零，但同源）

① git 身份 **零鉴别力**（近 30 commit committer **30/30** 同一身份；全仓 1709/1747 = 97.8%）·
② `STATUS.md`「等 owner 拍板」四个时点**恒 5 条且逐条相同**，**无一条涉 acceptance 对位** ⇒ F142 三决策**从未排队** ·
③ 文本痕迹**有鉴别力**（「已决」193 处 vs「待 owner」112 处），最强一条 `tracker.md:438` 逐字
「`INFRA-F142`/`CANONICAL-F104` **均保留待 owner**；**owner 当日拍定「按 #1 形态改」+ 问「能不能自动判定」**」·
④ 两句「owner 拍定」自称由**后续** commit `ae07769d` 写入（⛔ 不是上闸那一刻）。
⇒ 🔴 **可判的是结构：DS 仓没有任何机制能区分「owner 亲裁」与「session 自称亲裁」** —— 与本格治的病同型。
⚠️ **⛔ 这不是造假指控**（痕迹含 owner 反问，更像真实往返）。**唯一权威读数在 owner 本人处，⛔ lab 不代答。**

#### 顺手订正 **lab 自己**：`54` 不可复现

处方 `:210` / 本文件 `:1973` 的「另有 **54** 个 Acceptance 段」：四个 sha 实测
**闸口径恒 59 · 窄口径恒 32 · 扣已对位 53** ⇒ **无任何写明口径能重建 `54`**（最近的 53 差 1）。
⛔ **不断言它错**（复算引用集可能漏 1），可断言**它不可验证** ⇒ 已回改两处。

#### 交叉验证锚 **7/7 全对上**

A1 扫描面 3/7 · A2 增量 +34 · A3 段数 118 · A4 BASELINE 83/83 ·
A5 shell grep 与 node parser **59 = 59** · A6 复现 I 格「被审闸 = 1 道」 · A7 83 = 59+19+5。

#### 🔴 本格四条自我订正（⛔ 三条是我自己的判据/纪律 bug）

1. 🔴 **既有纪律不充分** —— 「zsh 下 `git show $sha:path` 必须**加引号**」：**双引号挡不住**。
   `$s:scripts/…/` 被解析成**参数展开的 `:s` 替换修饰符**（⛔ 与历史扩展无关）⇒ 必须写 **`${s}:path`**。
   失败的 `git show` 让下游 `wc -l` 照吐 **0** ⇒ 🔴 **「第四种 0」：命令失败产生的 0**。
2. 🔴 **写死的 `echo` 文案冒充读数** —— 管道后写死「(上面为空 = …)」而实际**非空**；
   复核那一行**反而挖到 K1 最强证据**。
3. 🔴 **预注册档位设计缺陷** —— K1 的「不可判」写死成「三通道**全零**」，实际是「**非零但同源**」。
   两者对下一格含义相反：「全零」= 再找通道；「同源」= **再多找通道也没用，必须建外部留痕**。
4. 路径猜错（`data/gate-baselines/` 实为 `figma-data/audit-allowlist/`）⇒ **同格内第二个「第四种 0」**。

#### ⛔ 28.11 未覆盖 / 不可亲验（🔴 每条写明**降级损失的是哪个量**，第 27 条）

1. ⛔ **未复核新闸的判据正确性**（只判**输入面方向** + 覆盖声明）⇒ 损失**闸内判据面**，⛔ 不影响 K2 方向结论与三态计数
   > ✅ **§28.12（L 格）已跑完**：8 个面里 **4 红 4 绿**。🔴 其中 `ACC_RE` **漏收 7 段** ⇒ **推翻了本条末句** —— 见第 3 条。
2. ⛔ **未 live 核 Figma** ⇒ 损失 K3 **实证面**；K3 只给**语义对位**读数
   > ⛔ **L 格原样保留未覆盖**（lab 够不到 live Figma）。
3. ⛔ **83 段 `unclassified` 未逐段裁定** ⇒ 损失**基数面细分**，⛔ **不影响** 83 这个总数与「零变化」结论
   > ✅ **§28.12 已逐段裁定**：**a 11 段**（真源自己点名了闸，其中 **4 段整段级**）· **b 35 段**（疑似本该豁免）· **c 37 段**（真残余），a+b+c = 83 ✅。
   > 🔴 **但本条末句「⛔ 不影响 83 这个总数」已被 L 格证伪**：闸的**枚举器漏了 7 段** ⇒ 语义口径 `unclassified` = **90 > BASELINE 83**（⇒ 棘轮本该红）。**「零变化」结论仍成立**（那 7 段两个时点都漏），⛔ 但 **83 是低估**。
4. ⛔ **30 条豁免的理由未逐条复核**（文件级那 17 段尤甚）⇒ 损失**豁免正确性面**
   > 🔴 **单位订正（§28.12）**：是 **14 条 entry**、⛔ 不是「30 条」——`30` 是**被豁免的段数**（1 条文件级 × 17 段 + 13 条段级 × 1 段）。照抄「30 条」会去找 **16 条不存在的 entry**。
   > ✅ **14 条全部复核完毕、全部成立**：文件级那条 lab 独立机检出的**唯一反例**与 DS 自陈的**唯一 borderline 完全重合**（且 lab 这条不依赖 DS 任何声明 ⇒ 真正的独立佐证）。
5. ⛔ **K1 的权威读数在 owner 处** —— ⛔ lab 不代答
   > ⛔ **L 格原样不动**（不可判 · 成因=同源；⛔ 未找第五条通道）。
6. ⛔ **`54` 差额的第 1 段来源未定位** —— 只判「不可复现」，⛔ 未判「错」
   > ✅ **§28.12 已加强**：穷举 **31 种**口径组合（矩阵先自证能重建已知的 59 / 32）⇒ **0 种产 54**。结论从「未找到」升到「**穷举 31 种未命中**」。⛔ 仍不断言它错。
7. ⛔ **候选 2 / 3 / 4 全未碰**（本轮只点候选 1）；§28.10 未覆盖第 1–5 条**原样保留**
8. ⛔ **F104 两件待 owner · 两个 hold · `audit-doc-shape.mjs` 日期型重开条件（2026-09-01，owner = DS）** —— 原样保留

### 28.12 ✅ L 格：复核 K 格自留的**四档未覆盖** —— 🔴 **闸的分母漏了 7 段，`unclassified` 真实值 90 > BASELINE 83**（2026-08-27）

**起手 → 止（第 25 条推论四，⛔ 两栏）**：
lab HEAD **起 `31ebf97`**（clean，单 remote `origin`，与 `origin/master` 同 sha）→ 预注册 `315449b` → **止**见本次 commit ·
🔴 **DS HEAD 起 `60d644a0` → 止 `ce3fd7e7`（格内漂 1 commit，且【直接命中判定面】）** ·
DS dirty 起止均 **0** · 四 pin 起止全 **0**。

⚠️ 🔴 **两种漂必须分开记，⛔ 别混成一栏 —— 本格是这条的头一个实证**：
- **交接基线漂**（上一格止 → 本格起）：🟢 **零漂**，9 次交接里**首次**（前 8 次全漂）。
- **格内漂**（本格起 → 本格止）：🔴 **漂了** —— `ce3fd7e7` 逐字「**再判 13 段 gated（83→70）**」，
  改了闸文件 6 行（`BASELINE_UNCLASSIFIED` 83 → **70**）+ **16 处 `covers-acceptance` 自陈**。
⇒ 🔴 **「起手零漂」⛔ 不蕴含「格内不漂」**。已按预注册 §1.1 重跑判定面，四档逐条复核，见报告 §8。

- **入口**：用户在本 session 起手四候选里挑定**候选 4**（⛔ 不是 lab 自己开的格）
  ⚠️ **本轮候选编号 ≠ §28.10 / §28.11 的编号**（§18.7 同族）
- **预注册**：[`docs/round2-gate-residual-plan.md`](round2-gate-residual-plan.md)@`315449b`（L1–L8，跑前落盘）
- **报告**：[`reports/2026-08-27-round2-gate-residual.md`](../reports/2026-08-27-round2-gate-residual.md)
- **装置**：`runs/gate-residual/l3-criteria.mjs` + `runs/gate-residual/l1-l4.mjs` —— ⛔ **未跑 DS 的 CLI**
- **回改**：`proposals/2026-08-27-designqa-gate-gap.md` §4.2 标注 + **新增 §4.4** + §5.3 加强（原文留痕）· 本文件 §28.11 四处 · `AGENTS.md` 第 29 条

#### 🔴 四档结论（⛔ 无空档）

| # | K 格自陈未覆盖项 | 落档 | 一句话 |
|:-:|---|:-:|---|
| **L1** | 83 段 `unclassified` 未逐段裁定 | ✅ **已裁定** | ⛔ **不是均质的「未答」**：**a 11** 段真源自己点名了闸（**4 段整段级**）· **b 35** 段疑似本该豁免 · **c 37** 段真残余 |
| **L2** | 「30 条」豁免理由未复核 | ✅ **全部成立** | 🔴 先订正单位：**14 条 entry**、不是 30。lab 独立机检的**唯一反例**＝ DS 自陈的**唯一 borderline** |
| **L3** | 新闸判据正确性未复核 | 🔴 **3 类实质缺陷** | **v1 漏段 7 处** · **v5 `id` 位置相关**（不写 `[N]` 则全静默）· **v7b 少收 17 条** |
| **L4** | `54` 差额第 1 段来源 | ✅ **结论加强** | 穷举 **31 种**口径组合，**0 种**产 54 |

#### 🔴 最重的一条：棘轮是**假绿**

| 口径 | 分母 | gated | 豁免 | `unclassified` | BASELINE | S2 |
|---|:-:|:-:|:-:|:-:|:-:|:-:|
| 闸口径 @`60d644a0` | 118 | 5 | 30 | **83** | 83 | 🟢 绿（余量 **0**） |
| 语义口径（+7 漏段） | **125** | 5 | 30 | **90** | 83 | 🔴 **红（超 7 段）** |

`ACC_RE` 不收三种形态：`- **Acceptance**：`（4 处）· 缩进 `**Acceptance**：`（2 处）· `#### 验收标准`（1 处），
全在 `mockup-conventions.md`（`:693`/`:917`/`:1247`/`:1256`/`:2730`/`:3079`/`:3107`）。
⚠️ ⛔ **不是「闸错了」的断言**（口径是作者定的，§8）—— 可判的是**这 7 种形态被排除一事零处登记**，与 K3 同型。
🟢 **反向也核过**：闸在 ``` fence 内**多收 = 0 段**（`^` 锚定挡住了代码块假命中，这一面闸是对的）。

#### L3 八面全档（⛔ 4 红 4 绿，非恒红非恒绿）

🔴 **v1** `ACC_RE` 漏 **7 段** · 🔴 **v5** 插 1 段 ⇒ **8/14 位移 · 4/5 自陈改指向**（带 `[N]` 兜住 3/4，**不带 `[N]` 则 0 红灯**）·
🔴 **v7** 多收 2 段 · 🔴 **v7b** 少收 **6 段 / 17 条** ｜ 🟢 **v2** 6 处候选全在 fence 内 · 🟢 **v3** 自陈最大行号 46（阈值 60、余量 14）·
🟢 **v4** 子目录 34 个 `.mjs` 带自陈的 0 个（**将来型**缺陷）· 🟠 **v6** 2 处落 S4 面（M17 那处已确认正确）。

🔴 **v7b 里有一对刚好相反的实证**：`domain-tvu.md#M17` 漏的 5 条是闸 `:68-73` **刻意排除**的做法层注记（**正确**）；
`AGENTS.md#Jira` 漏的 3 条是**真核查项**（段内逐字 7 条 `- [ ]`，中间 `:806` 一行实证散文截断，而 DS 自己的豁免 reason 逐字写「**七条**」
⇒ **DS 两处书写互相矛盾，⛔ 不需 lab 做语义裁定**）。**同一判据一处对一处错，闸无机制区分二者。**
⚠️ 且闸 `:72-73` 自陈的影响面「**5/84 段 · 14 条**」是**扩面前**的数，@`60d644a0` 实测 **6 段 · 17 条**（`9f8fd5a2` 改了 `SCAN_FILES` 没回改这两个数）。

#### 🔴 本格四条自我订正（⛔ 三条是我自己的判据 bug）

1. 🔴 **单位错，且它写在交接单与 §28.11 里** —— 「30 条豁免」的 `30` 是**段数**，entry 只有 **14 条**。
   ⇒ 既有纪律「⛔ 处数 ≠ 行数 ≠ 出现次数」的同族，补上「**≠ 条目数 ≠ 段数**」。
2. 🔴 **v5 注入点连错三次、每次都产「0 位移」** —— 成因不是「id 稳定」，而是**探针落进了别的 slug**
   （`~N` 的 slug 取**最近 heading**，而该文档 heading 密集）。⇒ 「第四种 0」的**新变体：判据的定位面选错**。
   停止盲试、**回读原文结构**后一次命中。
3. 🔴 **v5 的比对判据也错一次** —— 「指纹匹配」与「`n[i+1]` 逐位对齐」都假设探针在首位，实际在中段 ⇒ 配对错位吐假结果。改**按行号对齐**才对。
4. 🔴 **v1 初判把 fence 内的行算成真漏**（`design-process.md:687` 是 ``` 里的 PRD 模板）——
   是**抽查那 25 处「其它含词」桶**才发现的。⇒ **机检分桶后必须抽查「其它」桶**。

#### ⛔ 28.12 未覆盖 / 不可亲验（🔴 每条写明**降级损失的是哪个量**）

1. ⛔ **L1 的 b 档 35 段只报候选、未定案** ⇒ 损失**豁免候选精度**；⛔ 不影响 a=11 / c=37
2. ⛔ **v7b 的 4 段未裁**（需判「漏的是核查项还是做法层注记」= 规则内容，§8）⇒ 损失**这 4 段定性**；⛔ 不影响「6 段/17 条」与 `#Jira` 那条确凿例
3. ⛔ **v6 的 `code-conventions.md#Acceptance~9` 那处 `·` 未逐字定案** ⇒ 损失**该段 Σ 精度**
4. ⛔ **L3 只覆盖 8 个面** ⇒ ⛔ 不宣称「判据已全面复核」
5. ⛔ **未复核闸的测试文件**（`tests/audit-acceptance-gate-coverage-cli.test.ts`）⇒ 损失**回归钉正确性面**
6. ⛔ **未 live 核 Figma** ⇒ 损失 L2a 那处 borderline 的**实证面**
7. ⛔ **K 格第三个数「扣已对位 53」未重建** ⇒ L4 矩阵覆盖 **2/3** 个已知数
8. ⛔ **K1 / K3 的 owner 决策点原样不动**
9. ⛔ **候选 1 / 2 / 3 全未碰**（本轮只点候选 4）；§28.10 / §28.11 其余未覆盖条**原样保留**
10. ⛔ **F104 两件待 owner · 两个 hold · `audit-doc-shape.mjs` 日期型重开条件（2026-09-01，owner = DS）** —— 原样保留

#### 🔴 收尾重取：DS 漂到 `ce3fd7e7`，四档逐条复核（预注册 §1.1 硬要求，⛔ 不许跳过）

**新区间的锚**（⛔ 装置原锚绑定 K 格时点对、不可复用；改用逐字取自 DS commit subject 的四个新锚）：
B1 `gated` 增量 **+13** 🟢 · B2 `unclassified` **70** 🟢 · B3 BASELINE **70** 🟢 · B4 段数仍 **118** 🟢 ⇒ **四锚全对上，新读数可用**。

| 档 | 新 sha 上的状态 | 依据 |
|:-:|---|---|
| **L1** | 🔴 **被外部独立验证 11/11** | lab 在 `60d644a0` 上用 P 判据判出的 a 档 **11 段**，DS 在 `ce3fd7e7` 新判的 **13 段 gated** 里**全部命中**。⛔ lab 的 commit 当时尚未做、DS 是另一条 session ⇒ **两个独立过程的一致**（⛔ 与第 28 条那种「同源」性质不同）。🔴 **但 P 有假阴：13 段里 lab 只判出 11 段 ⇒ 召回 84.6%，漏 `#Acceptance~9:1993` 与 `#M52:3153`** ⇒ **a 档必须写「至少 11 段」**<br>🔴 **§28.13（M 格）回改：那 2 个假阴【成因相反，⛔ 别当同一种】** —— `#M52` 是 **P 的定位面太窄**（闸名点在父节 lvl3 `:3129–:3159`，31 行的正常规则节）= **真假阴**；`#Acceptance~9` 是 **P 漏它漏对了**（四面全零 + 全文 grep 三形态 0 次）= **DS 侧判据 ① 未成立**。⇒ **P 的真实缺陷只有 1 处，不是 2 处**。两栏报：对「DS 判的 13 段」召回 **84.6%**（原数不变）· 对「满足 ① 的 12 段」召回 **11/12 = 91.7%** · 精确率 **100%**。a 档仍写「至少 11 段」 |
| **L3-v1** | 🔴 **跨两 sha 恒定成立** | `ACC_RE` 逐字未改、7 处漏段原行仍在 7/7 ⇒ 闸口径 70（BASELINE 70，绿）· **语义口径 77 > 70 ⇒ 仍超 7 段**。**DS 分类掉 13 段并把 BASELINE 收到 70，⛔ 没改变这条** —— 那 7 段既不在分子也不在分母，**「超 7」是结构性差额、不是时点噪声** |
| **L3-v5** | 🔴 **实害面变大** | 自陈 6 → **20 条**、被审闸 4 → **12 道** ⇒ 受 `~N` 位移影响的面**扩大 3.3 倍**；新增自陈里 **4 条写 `[0]`**（散文段），同样兜不住改指向<br>🔴 **§28.13（M 格）回改：「`[0]` 同样兜不住」这句【方向说窄了】** —— 按碰撞率 `[0]` 反而是**较强**的锚（`Σ=0` 只占 7/118 = 5.9%，而 `Σ=3` 占 **55/118 = 46.6%**，20 条自陈里 **5 条**用 `[3]`）。`[0]` 真正的问题在**另一维**：那 3 段**全部含散文形态的核查项**（`#M-DISCIPLINE.SYNC` 一段串了 8+ 条）⇒ **`[0]` 字面为假**，且**两臂实证**列表注入 3/3 红 · 散文注入 3/3 不红 ⇒ **S4 对散文形态结构性失明**。⇒ 第 29 条推论三本例：**⛔ 一处错不等于处处错，锚强度要按维度分开报** |
| **L3-v7b** | ⚠️ **面变大** | `#M23.14` 与 `#M-INTEGRITY` 这两个 v7b 命中段现已 **gated 且带 `[5]`/`[6]`** ⇒ 从「只影响计数」升级为**直接进 S4 的 Σ 判据**<br>🔴 **§28.13（M 格）回改：升级只发生在【风险面】，当前【实害 = 0】** —— 逐条回读那 3 段被边界截掉的 13 条，**13/13 全是假阳**（`M23.14:848-850` 属同 heading 下的 **(B) 子块**、`M-INTEGRITY:1287/1290/1291` 是 V4-2333 实证叙事、`M17` 5 条是已定案的做法层注记）⇒ **`[5]`/`[6]` 都是对的，Σ 无一处低报**。全档：18 段 gated 里 **11 无盲区 · 4 边界正确（`---`）· 3 将来型**，而同一判据在**豁免段 `AGENTS.md#Jira` 上已经错了**（1 段/3 条，M 格在 `1c108de8` 上复现）⇒ **闸没有机制区分这四类** |
| **L2 / L4** | 🟢 **不受影响** | 豁免表未改（仍 14 条 entry / 30 段）· `mockup-conventions.md` 未改（59 / 32 两数不变） |

🟢 **顺带一条正面读数**：新 BASELINE 注释逐字「每次真的分类掉一批，就把这个数收到现取值，否则那批兑现量没被锁住」
⇒ **补上了 §28.11 判的「棘轮只止增」那半个缺口的一部分**：现在**兑现即锁定**（棘轮跟着降）。
⛔ 但仍**无机制逼它继续减**，且**余量依旧 = 0**。

### 28.13 ✅ M 格：复核 `ce3fd7e7` 新判 **13 段 gated** 的【自陈质量】 —— 🔴 **兑现越多，缺口越大：超额 8 段 → 11 段**（2026-08-27）

**起手 → 止（第 25 条推论四，⛔ 两栏）**：
lab HEAD **起 `c9e0227`**（clean，单 remote `origin`，与 `origin/master` 同 sha）→ 预注册 `4e5e4b2` → **止**见本次 commit ·
🔴 **DS HEAD 起 `1c108de8`（⛔ 不是交接单写的 `ce3fd7e7`）→ 止 `a786e0d2`（格内漂 2 commit，直接命中判定面）** ·
DS dirty 起止均 **0** · 四 pin 起止全 **0**。

⚠️ 🔴 **两种漂分开记 —— 本格与 L 格【方向相反】，合起来才看得出规律**：
- **交接基线漂**（上一格止 → 本格起）：🔴 **漂了**（`ce3fd7e7 → 1c108de8`，第 10 次交接；L 格那次是 10 次里唯一零漂）
  🟢 **但【没有命中判定面】** —— 全仓 `git diff --stat` 只有 4 个文档文件，与闸 `SCAN_FILES` **零交集**、
  `scripts/*.mjs` 零改动、`ACC_RE`/`BASELINE` 逐字未改、闸行数 `416→416` ⇒ **§28.6–§28.12 全部结论原样有效**。
- **格内漂**（本格起 → 本格止）：🔴 **漂了，且直接砸判定面**（`BASELINE 70 → 67`）。
⇒ 🔴 **格内漂已连续两格发生、两次都砸判定面（2/2）；而起手漂不漂与它无关。**
**唯一稳定的规律是「收尾必须重取」，⛔ 不是「起手核过就行」。**

- **入口**：用户在本 session 起手五候选里挑定**候选 5**（⛔ 不是 lab 自己开的格）
  ⚠️ **本轮候选编号 ≠ §28.10 / §28.11 / §28.12 的编号**（§18.7 同族）
- **预注册**：[`docs/round2-gatedclaim-quality-plan.md`](round2-gatedclaim-quality-plan.md)@`4e5e4b2`（M1–M5，跑前落盘）
- **报告**：[`reports/2026-08-27-round2-gated-claim-quality.md`](../reports/2026-08-27-round2-gated-claim-quality.md)
- **装置**：`runs/gated-claim-quality/m1-m5.mjs` + `anchors-1c108de8.json` / `anchors-a786e0d2.json` + `old-gated-60d644a0.json`
  —— ⛔ **未跑 DS 的 CLI**、⛔ **未写 DS 的 tree**（注入全在内存里改文本喂给闸的枚举器）
- **回改**：`proposals/2026-08-27-designqa-gate-gap.md` **新增 §4.5 + §4.5a**（沿用 §4.2/§4.4 既有栏位形态，⛔ 未另建新节）· 本文件头部现取栏 + §28.12 三行 · `AGENTS.md` 第 29 条**推论六补注 + 新增推论七 / 八 / 九**（推论七 = 兑现的承载物 · 推论八 = 窄面也产假红 + npm key 别名 · 推论九 = 形态盲区修一层≠修完）

#### 🔴 本格的起点：兑现量由【14 行注释】承载

`git diff --name-only 60d644a0 ce3fd7e7` 改 17 个文件，落在闸 `SCAN_FILES` **7 份规则真源**上的是 **0 个**。
⇒ 那 13 段兑现，**规则原文一个字节没改、核查项一条没增减**，全部由新写的 **14 行 `covers-acceptance`** 承载。
⇒ 除了「注释是这么写的」，闸**没有任何独立证据**。而 §28.12 已据 `70` 下了正面结论。

#### 🔴 五档结论（⛔ 无空档）

| # | 档 | 落档 | 一句话 |
|:-:|---|:-:|---|
| **M1** | Σ 的分母复核（第 29 条） | 🟢 **无一处低报** | 四种更宽口径独立重数：缩进子项**零差额** · 表格行唯一 4 处**全假阳** · 段边界 3 段 13 条差额**逐条回读后 13/13 全假阳** ⇒ **`[5]`/`[6]` 都是对的** |
| **M2** | `[N]` 锚的鉴别力 | 🔴 **缺陷** | 全 118 段 Σ 分布：`Σ=3` 占 **55（46.6%）**、`Σ=8` 占 **2（0.9%）** ⇒ 锚强度**相差 51 倍**，20 条自陈里 **5 条**落最弱档，闸**无机制区分** |
| **M3** | 4 条 `[0]` | 🔴 **确凿** | 3 段**全部含散文形态核查项**（`#M-DISCIPLINE.SYNC` 一段串 8+ 条）⇒ `[0]` 字面为假；两臂实证：列表注入 **3/3 红** · 散文注入 **3/3 不红** ⇒ **S4 对散文形态结构性失明** |
| **M4** | 段边界盲区 | 🟠 **将来型** | 18 段 gated：**11 无盲区 · 4 边界正确（`---`）· 3 将来型** ⇒ **当前实害 0**；但同一判据在**豁免段 `AGENTS.md#Jira` 上已经错了** ⇒ 闸**无机制区分这四类** |
| **M5** | 两端声明一致性 | 🔴 **1 → 4 段不成立** | @`1c108de8` 13 段 🟢10/🟠2/🔴**1**；🔴 @`a786e0d2` 16 段 🟢10/🟠2/🔴**4** —— 第二批新增 3 段**全红** |

#### 🔴 最重的一条：兑现越多，缺口越大

| 时点 | BASELINE | 闸口径 `unclassified` | 语义口径（＋L 格漏收 7 段，−按 ① 不成立的段） | 超额 |
|---|:-:|:-:|:-:|:-:|
| `60d644a0`（L 格） | 83 | 83 | 90 | 超 **7** |
| `1c108de8`（M 格起手） | 70 | 70 | **78** | 超 **8** |
| **`a786e0d2`（M 格收尾）** | **67** | 67 | **78**（纹丝不动） | 超 **11** |

`a786e0d2` 补 3 段 gated（`BASELINE 70→67`），三段全部来自 `audit-handoff-deliverable-sections.mjs` 的新自陈，
**规则真源仍零字节改动**，且三段的判据 ① **四面全零点名**（三种别名形态 `grep` 全文各 0 次）。
⇒ **BASELINE 降 3，语义残余一段没少 ⇒ 超额从 8 扩到 11。**

🔴 **§28.12 那条正面读数要加前提**：「兑现即锁定」**锁住的是【数】，不是【事实】** ——
当兑现本身不满足被验方自己的分类判据时，**这个机制让假绿缺口随每次兑现同步扩大**。

#### 🔴 本格四条自我订正（⛔ 三条是我自己的判据 bug）

1. 🔴 **M4 探针第一次插错了面** —— 插在「最后一条被 W1 多收的项」之后，而那些项属于**别的子块**
   ⇒ 「S4 不红」是**正确行为**、不是盲区证据。**是预注册 §3「先证探针落在目标面上」当场抓住的**。
   ⇒ 第 29 条推论二在本格复发；修法 = 把盲区**写死成「列表终止行之后」**并逐段打印那一行。
2. 🔴 **M5 第一版定位面选窄，产生【假红】** —— 只扫「Acceptance 段内」，把 `#M52` 判成「原文零点名」，
   而它父节 lvl3（31 行的正常规则节）就点名了。⇒ **窄面的「零命中」既能变假阴、也能变假红**（推论二的新形态）。
3. 🔴 **M5 判据有 npm-key 别名盲点** —— 实测 `audit:handoff-sections → audit-handoff-deliverable-sections.mjs`，
   **key 与文件名不同名**。补解析表后重跑读数不变，但⛔ 否则我正在犯我要报的那个错。
4. 🔴 **我起手照抄了 §28.12 的方向** —— 那句「`[0]` 同样兜不住改指向」让我预期 `[0]` 最弱；
   Σ 分布证伪（`[0]` 5.1% ＜ `[3]` 46.2%）。⇒ **一处错不等于处处错，锚强度必须按维度分开报。**

#### ⛔ 28.13 未覆盖 / 不可亲验（🔴 每条写明**降级损失的是哪个量**）

1. ⛔ **W4（`、`/`；`/`,` 并列）只报候选未定案**（11/18 段有差额）⇒ 损失**并列型核查项计数精度**；⛔ 不影响 W1–W3 定案
2. ⛔ **只复核新 gated + 5 段旧 gated** ⇒ 损失**其余 100 段的自陈面**；⛔ 不宣称「自陈已全面复核」
3. ⛔ **仍未复核闸的测试文件**（`ce3fd7e7` 改 6 行 · `a786e0d2` 另加 `tests/audit-gate-ci-parity-cli.test.ts` 472 行）⇒ 损失**回归钉正确性面**
4. ⛔ **不判「闸是否真的 enforce 了那条规则」** ⇒ 损失**覆盖真实性面**（要读 11 个闸实现，含规则语义，§8）
5. ⛔ **`#M23.18.1` 那个 🟠 未定案** —— 要拉伸到 **lvl2 整章 1082 行**才点名，「算不算规则原文」是口径判断 ⇒ 落 owner
6. ⛔ **不 live 核 Figma** ⇒ 损失被点名 mockup 闸的**真实可执行性面**
7. ⛔ **L 格自留六档除 v7b 那两段外原样保留**（b 档 35 段 · v6 一处 `·` · L3 其余面 · L4 第三个数）
8. ⛔ **本 session 候选 1 / 2 / 3 / 4 全未碰**；§28.10 / §28.11 / §28.12 其余未覆盖条**原样保留**
9. ⛔ **K1 / K3 / L 格三个 owner 决策点 · F104 两件 · 两个 hold · `audit-doc-shape.mjs` 日期型重开条件（2026-09-01，owner = DS）** —— 原样保留

#### 🔴 新交回 owner 的 5 个决策点（⛔ lab 不代拍；与 L 格那三个并列）

**M-D1** 判据 ① 要不要收 `grep -E …` 这类**非 `audit-*` 形态**的 probe 声明 ·
**M-D2** 判据 ① 要不要允许**跨文件镜像**（`#Acceptance~9` 的点名住在 `code-conventions.md` 的镜像段里） ·
**M-D3** 都判「不放宽」时那 **4 段**该不该退回 `unclassified`（退回则 `71 > BASELINE 67` ⇒ S2 红） ·
**M-D4** `[N]` 要不要禁止 `[0]` / 对散文形态另立计数口径 ·
**M-D5** `#M23.18.1` 拉伸到 1082 行整章才点名算不算满足 ①。
⚠️ **紧迫度已上调**：这几条现在决定的不是 1 段，是 **4 段**，且**每落一批还会再涨**。

### 28.14 ✅ N 格：复核**闸的测试面** —— 🔴 **钉子的敏感面与真缺陷面【方向相反】**（2026-08-28）

**起手 → 止（第 25 条推论四，⛔ 两栏）**：
lab HEAD **起 `10c3904`**（clean，单 remote `origin`，与 `origin/master` 0/0）→ 预注册 `f5f62f1` → **止**见本次 commit ·
🔴 **DS HEAD 起 `02fc77b6`（⛔ 不是交接单写的 `a786e0d2`，第 11 次交接漂 2 commit）→ 止 `0e04ceb9`（格内漂 1 commit）** ·
🔴 **DS dirty 起 0 → 止 11**（⚠️ 见下方「并行 session」）· 四 pin 起止全 `dirty=0`、HEAD 各自对上自己的 sha。

⚠️ 🔴 **两种漂分开记 —— 本格【两次都没砸判定面】**：
- **交接基线漂**（第 11 次）：`a786e0d2 → 02fc77b6`，6 文件，与闸 `SCAN_FILES` **零交集**
- **格内漂**：`02fc77b6 → 0e04ceb9`，只改 `STATUS-CHANGELOG.md` 11 行
- **三点 blob 全同**：闸 `ffea0a1a` · NAIL-A `abca29d7` · NAIL-B `b15300fd`
⇒ 🔴 **给交接单那条「格内漂 2/2 都砸面」补反向数据点：现在是 3 次里 2 次砸面。**
**⛔「格内漂必砸面」不成立**；唯一稳定的仍是「收尾必须重取 + 每次逐条 diff」。

- **入口**：用户在本 session 起手六候选里挑定**候选 5**（⛔ 不是 lab 自己开的格）
  ⚠️ **本轮候选编号 ≠ §28.10 / §28.11 / §28.12 / §28.13 的编号**（§18.7 同族）
- **预注册**：[`docs/round2-gatetest-nail-plan.md`](round2-gatetest-nail-plan.md)@`f5f62f1`（N1–N5 + 七向注入的预测，跑前落盘）
- **报告**：[`reports/2026-08-28-round2-gate-test-nail.md`](../reports/2026-08-28-round2-gate-test-nail.md)
- **装置**：`runs/gate-test-nail/inject.mjs` —— 导出树 `git archive 02fc77b6` + 独立 `cp -R` node_modules
  ⛔ **未改 DS 一个字节**；隔离实证：DS `node_modules/.vite` mtime 停在 **2026-08-20**、导出树 = **08-28 10:01:45**
- **回改**：`proposals/2026-08-27-designqa-gate-gap.md` **新增 §4.6**（沿用 §4.5/§4.5a 既有栏位形态）· 本文件头部现取栏 · `AGENTS.md` 第 29 条**新增推论十**

#### 🔴 五档结论（⛔ 无空档）

| # | 档 | 落档 | 一句话 |
|:-:|---|:-:|---|
| **N1** | 用例数分母复核（第 29 条） | 🟢 **无差额** | NAIL-A 窄 34 / 宽 **36**，差额 **2 处逐处定案 = 2/2 全假阳**（`re.test(…)` 是正则方法调用）· NAIL-B **23** 宽窄同 |
| **N2** | 钉子对 L 格 `ACC_RE` 漏收是否敏感 | 🔴 **零敏感，方向相反** | 放宽 `ACC_RE` ⇒ 钉子 **34/34 全绿**；**同一改动**在真源上 `sections 118→126`、`unclassified 67→75` ⇒ **S2 红 + 3 条 S4 红** |
| **N3** | 段边界 | 🔴 **已固化** | 改边界 ⇒ `:169` **当场红**（注释逐字「⛔ 别删」）。M 格已判该判据在 `AGENTS.md#Jira` 上错误漏收 ⇒ **钉子会拦住修复** |
| **N4** | 散文形态 Σ | 🔴 **零覆盖**（⚠️ 预测错，成因已定） | 钉子里 **18 条自陈全指向 `M17`/`M10`/`R0`/`M999` 四个【列表形态】段**，散文段 `M11` **零条自陈** ⇒ S4 的 Σ 在散文形态上从未被测过 |
| **N5** | 「看得见接线」的自陈 | 🟢 **自陈为真** | 摘 `main()` ⇒ **32 红** · `exit(1)→(0)` ⇒ **13 红** · 换原始入口守卫 ⇒ **34 绿**（`realpathSync` 修复真生效） |

#### 🔴 最重的一条：一个**惩罚修复**的结构

| 谁 | 对「修 `ACC_RE`」的回答 |
|---|---|
| **34 条钉子** | 🟢 全绿 —— 没问题 |
| **闸自己（真源面）** | 🔴 4 条 fail —— S2 破棘轮 + 3 条 S4 |

那 3 条 S4 的成因是 **`~N` 序号位移**：放宽后新收的段排在前面、占用原有 id ⇒
`#M23.18.1`（items 5→**0**）· `#M-INTEGRITY`（6→**0**）· `#M-INTEGRITY~2`（4→**0**）三段的自陈落到别的段上。
🔴 **这实测兑现了 L 格 L3-v5 判的 `~N` 位移风险** ⇒ M 格「当前实害 0」要加前提：
**⛔ 它只在【没人去修 `ACC_RE`】时成立**；修的那一刻实害立刻是 3 条。
⇒ 修复者拿到的信号互相矛盾，而唯一会红的那份（闸）会被读成「你把闸改坏了」。

#### 🔴 收尾重取时撞到的两件事（⛔ 都不是我造成的，逐条给了判据）

1. 🔴 **DS 有并行 session 正在实时改判定面** —— 止栏 `dirty=11`，其中
   `scripts/audit-acceptance-gate-coverage.mjs` 工作区正被改成 **`BASELINE_UNCLASSIFIED 67 → 63`（第三批兑现）**。
   **判据：我的六个注入标记（`ZZZ_NEVER_MATCH_PROBE_N2P` / `[N3` / `[N5` / `验收标准` …）在该 diff 上命中【全部为 0】**
   ⇒ ⛔ 不是我写的。本格全部读数绑在 **git blob `ffea0a1a`**（HEAD 的 blob 未变）⇒ **读数仍成立**。
2. ⚠️ **那一批的形态与 M 格判的完全同型**（⛔ 未提交，只作观察登记、**不下定论**）：
   dirty 的 docs 文件无一在 `SCAN_FILES` 7 份里 ⇒ **规则真源又是零字节改动**，兑现仍由**闸头注释自陈**承载
   （`audit-mockup-connector.mjs` / `design-kickoff.mjs` 同在 dirty 列表）。
   🔴 **且他们自己在那段注释里逐字推翻了上一批的一个阴性结果**：
   「它的宽网只覆盖代码围栏 + 反引号里的 `grep|rg|node -e|python|bash|jq|curl`，**漏掉 `pnpm <非 audit: key>` 这种写法**」
   ⇒ **这是第 29 条推论九（形态盲区修一层 ≠ 修完）被 DS 独立动作验证的第二例**（与 L 格 L1 被验证 11/11 同型）。

#### 🔴 本格五条自我订正（⛔ 全是我自己的判据 bug，3 条是「跑通了但读数是假的」）

1. 🔴 **pin 判据形态假设错** —— 用 `[ -d "${p}.git" ]` 而 worktree 的 `.git` 是**文件**，且 `ls | head -6` 恰好截在 `.git` 前 ⇒ 假报「四 pin 非 repo 形态」（同时违了「⛔ 判『没有』不许加 head」）
2. 🔴 **把【命令失败】读成【不存在】** —— zsh glob 无匹配 ⇒ `ls` 失败 ⇒ `|| echo` 印成「无 `.vite` 缓存」；**「隔离成立」这个结论差点建立在假读数上**
3. 🔴 **探针撞了被测判据自己的字符** —— P5 标题原含 `Acceptance` ⇒ 被 `ACC_RE` 数成一段（假命中 `P5~2`）。**NAIL-A:250 那条注释警告的正是同一件事**
4. 🔴 **按错类型取值** —— 闸 `--json` 的 `items` 是**数字**，我按数组取 `.length` ⇒ 全印 `undefined项`
5. 🔴 **N4 预测错** —— 注入副作用被算成目标信号；换程序化判据后结论**从「固化」改成「零覆盖」**（两种不同的病）
⇒ 另有一次 **ugrep 把 `- **Acceptance` 当选项** ⇒ 命令失败被读成「0 命中」（改 `-e` 后才是真零）。

#### ⛔ 28.14 未覆盖 / 不可亲验（🔴 每条写明**降级损失的是哪个量**）

1. ⛔ **不判「闸是否真的 enforce 了那条规则」** ⇒ 损失**覆盖真实性面**（M 格未覆盖第 4 条原样保留）
2. ⛔ **NAIL-C（`audit-exports-types-contract-cli.test.ts` 401 行）只登记不复核** ⇒ 损失**另一条闸的钉子面**；⚠️ 它是**本轮起手漂移新增的** ⇒ 候选 5 的面在我接手时又变大了
3. ⛔ **`~N` 位移在 `tests/` 全目录那 10 份命中未定案** ⇒ 损失**该形态在别的闸上的覆盖读数**
4. ⛔ **只做 7 向注入** ⇒ 损失**其余判据面的敏感度读数**
5. ⛔ **未跑 DS 完整 vitest**（只跑 NAIL-A / NAIL-B）⇒ 损失**放宽 `ACC_RE` 对其它测试文件的影响读数**
6. ⛔ **DS 第三批（`67→63`）未复核** —— 它在我收尾时仍是**未提交的工作区状态** ⇒ 损失**第三批兑现的承载物读数**（推论七要问的那一问）
7. ⛔ **本 session 候选 1 / 2 / 3 / 4 / 6 全未碰**；§28.10–§28.13 其余未覆盖条**原样保留**
8. ⛔ **K1 / K3 · L 格三决策点 · M-D1…M-D5 · F104 两件 · 两个 hold** —— 原样保留。
   ~~`audit-doc-shape.mjs` 日期型重开条件（2026-09-01，owner = DS）~~ ⇒ 🟢 **2026-09-11（review §31）已复核并关闭**
   （未达成 ⇒ ⛔ 不上闸；日期型已换成存量阈值型 · DS `47f80084`）。
   ⚠️ **这条待做项在 lab 登记面上被重复登记了 12 处**（7 个文件）—— 本格只回改**入口那几处**
   （处方 2 处 + 本文件 3 处，含本条这个「最新总述」）；其余 **9 处是历史格的收尾清单**，留痕不改。
   **降级损失的量**（`AGENTS §2.27`）= 那 9 处的**措辞时效**；⛔ **未损失**的是该待做项的真实状态
   —— 下一格的两个实际入口（`proposals/2026-08-24-archive-triage.md` 与本文件最新条）都已改。

#### 🔴 新交回 owner 的 4 个决策点（⛔ lab 不代拍；与 L 格三个 / M 格五个并列）

**N-D1** 修 `ACC_RE` 会连带 `~N` 位移打断 3 条现有自陈 ⇒ **要不要先把 `~N` 位置 id 换成规则身份 id，再动 `ACC_RE`** ·
**N-D2** `:169` 那条钉子写「⛔ 别删」而它钉的判据在 `#Jira` 上是错的 ⇒ **改钉子还是给判据加区分机制** ·
**N-D3** 散文形态的 Σ 要不要**补一条钉子**（现在改对改错都不红）·
**N-D4** NAIL-A 要不要照 NAIL-B 的形态**在头注释登记自己的形态覆盖边界**。

---

## 29. 🔴 第二轮**没有写明的终止条件** —— 交回 owner（`lab:N65`，2026-08-28）

**入口**：用户问「是不是算已经把设计系统评审结束了」。⛔ 这一条**不是**一格复核，是一处**零登记的结构缺口**。

### 29.1 实测：终止条件在本文件里零处存在

本文件全文 grep（⛔ 无 `head`/`-m`）：
`完成判据` **0** · `终止条件` **0** · `第二轮.*完成` **0** · `DONE 判据` **0** · `收敛` **1**（且说的是棘轮，不是评审）。
⇒ **从第二轮开头到 §28.14，「什么时候算查完」一次都没写下来。**

⚠️ 而已交付 **9 格**（§28.6–§28.14），各格自登记的「未覆盖」**登记条数**合计 **66 条** ——
🔴 **⛔ 别把 66 当成剩余工作量**：全文 `原样保留` 出现 **19 次**，说明其中大量是**上一格未做项的转述**。
**独立未覆盖面 = 未知**（要去重才知道，本条**没有去重** ⇒ ⛔ 不给这个数，第 29 条推论四）。
可核的是：**owner 未裁决策点 14 个**（N-D×4 + M-D×5 + L 格 3 + K1/K3 2）。

### 29.2 🔴 统一口径四点曲线（⛔ 与 §28.13 那张表【口径不同，不可混读】）

同一把尺（放宽 `ACC_RE` 收那三形态后重跑闸）量四个时点：

| 时点 | 日期 | 闸自己看到的 段/没人管/有闸管/豁免 | 同尺真实 段/没人管 | **闸看不见的** |
|---|---|---|---|:-:|
| `60d644a0` | 08-27 | 118 / 83 / **5** / 30 | 126 / **91** | **+8** |
| `ce3fd7e7`（第一批） | 08-27 | 118 / 70 / **18** / 30 | 126 / **78** | **+8** |
| `a786e0d2`（第二批） | 08-27 | 118 / 67 / **21** / 30 | 126 / **75** | **+8** |
| `19e55102`（第三批） | 08-28 | 118 / 63 / **25** / 30 | 126 / **71** | **+8** |

⇒ 🟢 **改进是真的**：`有闸管` **5 → 25**（+20），同尺真实 `没人管` **91 → 71**（−20）。⛔ 不是数字游戏。
⇒ 🔴 **但那 8 条闸【结构上看不见】的规则，四个时点一条都没被碰过** —— 它不随兑现改善，**它不在视野里**。

🔴 **与 §28.13「兑现越多缺口越大（8→11）」的关系 —— ⛔ 两条都成立，问的不是同一个问题**：
- §28.13 口径：**按 DS 自己的判据 ① 算，那些兑现算不算数** ⇒ 4 段不算 ⇒ 该口径下缺口扩大
- 本条口径：**闸结构上看不见多少条** ⇒ 恒定 8 条
⚠️ §28.13 那栏「语义口径 **78** 纹丝不动」是把一个**会随兑现下降**的量（78→75→71）当成了常数
⇒ ⛔ **别再引用「超额 8→11」当作缺口的绝对数**；要引就带口径，且两栏并报。

### 29.3 ⇒ 交回 owner：三个可选的终止条件形态（⛔ lab 不代拍，§8）

| 形态 | 判据 | 代价 |
|---|---|---|
| **A. 决策点清零** | 14 个 owner 决策点全部裁完 ⇒ 第二轮结束，未覆盖面转 backlog | 最快；卡在 owner 手里而非 lab |
| **B. 缺口面收敛** | 「闸看不见的段」**必减到 0**（现恒定 8） | 最实质；要先动 `ACC_RE`，而 N-D1 说明动它会打断 3 条现有自陈 |
| **C. 覆盖面封顶** | 候选清单**冻结**，跑完即止，⛔ 新发现只登记不开格 | 唯一能让「越查越多」停下来的；代价是明知有缺口也不查 |

🔴 **⛔ 不选 = 默认走「无限循环」** —— 实测结构：每一格都在产出新的未覆盖面
（L 推翻 K 的乐观读数 · M 判出兑现悖论 · N 判出钉子零敏感 · 候选 5 的面在 N 格接手时又 +401 行）。
⚠️ **这不是「工作没做好」，是【没人定义过 yes 长什么样】。**

---

## 30. 🔴 lab 的推荐：**停止扩大评审，转入落地**（`lab:N66`，2026-08-28）

**入口**：用户逐字「这些你都按照你的认知帮我推荐一下，太多选项了……我想要的是 agent 的功能，
就是在有不确定性情况下可以给我做决策，而不是事事都让我做决策」。

⚠️ **先区分两类决策 —— 此前 lab 把它们混在一起全丢回去了，这是本条的立项理由**：

| 类别 | 谁该拍 | 例子 |
|---|---|---|
| **被验方的技术口径裁定** | 🔴 **DS owner**（§8 单向纪律，lab 代拍会破坏「只审查不裁定」） | M-D1「要不要收 grep 形态 probe」· K3「逐字读法 vs 宽读法」 |
| **本方的推进决策** | 🟢 **lab 应当直接给答案** | 先做哪件 · 评审何时收口 · 哪些不值得查 |

⇒ **⛔ 以后只有第一类才交回 owner；第二类 lab 必须给出明确推荐，不许列选项了事。**

### 30.1 总判断（⛔ 不是选项，是推荐）

🔴 **停止扩大评审面，把已发现的问题转入落地。**

三条依据（全部可核）：
1. 已交付 **9 格**、未覆盖登记 **66 条**，而 **owner 待拍的 14 件一件没动**（§29.1）
2. 同期 DS 侧落了 **3 批兑现**（有闸管 5 → 25，§29.2）⇒ **执行侧是动的，瓶颈不在「发现问题」**
3. 每一格都产出新的未覆盖项（L 推翻 K · M 判出兑现悖论 · N 判出钉子零敏感 · 候选 5 的面在 N 格接手时又 +401 行）
⇒ **继续查，待办只会更长；而已知缺口已经比能消化的多。**

### 30.2 四条具体推荐

| # | 推荐 | ⛔ 不推荐什么 · 为什么 |
|:-:|---|---|
| **1** | **终止条件选 C（冻结清单）** | ⛔ 不选 A：14 件里多数是「闸的口径要不要更严」，拍完不改变产品价值 · ⛔ 不选 B：依赖 DS 改 `ACC_RE` + 编号方式，有顺序坑（N-D1），周期不在本方控制内 |
| **2** | **14 件待拍打包归档为「接受现状」，只留 1 件** | 唯一要留的是 **N-D1**（改 `ACC_RE` 前必须先解决编号漂移）—— 它是将来真要修那 8 条盲区时的**前置**，关掉等于把盲区永久封死。其余 13 件不必逐条回 |
| **3** | **立刻只做 1 件：补 Web Components 入口的类型声明** | 唯一「零依赖 + 直接解锁 React + TypeScript 场景」的改动。其余 7 步建议**进 backlog 不排期** |
| **4** | **没看的 5 项：4 项不看，1 项记账但不是现在** | 记账的是「那 25 条『有人管』是不是真的在管」（它决定前面所有数字的真假），但**当前不做** —— 盲区 8 条、没人管 71 条还在，先验证 25 条的真假是**优化次要矛盾**。⛔ 另 4 项不看：Figma 一致性（DS 已有 render-verification 在做）· API 好用度（属产品调研，非代码审计）· 无障碍（DS 自有 2 套配置，该他们跑）· 性能包体积（v1.2.0 已记 tarball 2.84→4.74 MB，有数据且非当前瓶颈） |

### 30.3 如果只做一件事

**补 `./web-components` 入口的类型声明。**
理由：它是官方给 React 的唯一 npm 路径（`docs/STATUS.md:75` 逐字），而它缺类型
⇒ React + TypeScript 项目走官方推荐路径**导入即报错**。一个改动，解锁一整类消费方。

### 30.4 ⇒ 第二轮就此收口

按 30.2 第 1 条，**第二轮评审在此冻结**：候选清单封顶，新发现**只登记不开格**。
⚠️ ⛔ 这不表示缺口已消除 —— §29.2 那 8 条结构性盲区**原样存在**，只是**不再由 lab 继续扩查**。
重开条件：**上面第 3 条落地后**，或 owner 明确要求。

### 30.5 📌 冻结后登记（⛔ 只登记不开格，不展开）

**来源**：§30.2 第 3 条推荐的**落地产物** —— 处方
[`proposals/2026-08-28-webcomponents-types-entry.md`](../proposals/2026-08-28-webcomponents-types-entry.md)
（2026-08-28，DS 真源 **起手 `3d9498ee` → 止 `fbfc3e4f`**；⚠️ 上次交接记的 `07d3498f` 起手已漂 **4** 步，
**本 session 执行期间又漂 1 步**，已逐条 diff 核对：新 commit 命中核心闸 `audit-exports-types-contract.mjs`，
但只是给 fail-closed 分支补 `exemptCount`，**`EXEMPTIONS[0]` 与 S2/S3/S4 判据一行未动** ⇒ 处方结论不受影响）。
⛔ **这不是第 10 格**，是把已定的推荐做成可执行处方，评审面未扩大。

| # | 登记项 | 一句话 |
|:-:|---|---|
| **N67** | §30.3「lab 发现的缺口」**措辞应订正** | 🔴 它是 DS **已具名豁免**项：`audit-exports-types-contract.mjs` 的 `EXEMPTIONS[0]`，`since: '2026-08-13'`，且**已写好 `fixDirection`**。lab 的增量是 N68/N69，⛔ 不是「发现它」 |
| **N68** | §30.3「**导入即报错**」**读数不准** | 实测三态：纯副作用 `import` → **exit 0 不报**；具名导入 → **`TS7016`**；JSX `<tvu-button>` → **`TS2339` ×2**。⇒ 该改为「具名导入与 JSX 用法报错」 |
| **N69** | 🔴 **它不是「一个改动」** | 真实代价 = **56 处 `@ts-expect-error` 必须原子清理**（否则 `TS2578`）+ **owner 的 `VISUAL_COMMIT_APPROVED`**（动 37 个 `.tsx` 撞 pre-commit 视觉闸）。⚠️ 且顺序**与 DS 自己 08-18 那条先例相反**，⛔ 不能照搬 |
| **N70** | 口径差（记账，⛔ 当前不做） | `./eslint-plugin` 与 `./eslint-plugin/*` 是**字符串形态** ⇒ 按闸 `isCodeEntry` **结构上不受检**，而实测该目录 **0 个 `.d.ts`**。即：同样无类型，但**闸看不见** —— 与 §29.2 那 8 条**同型**（⛔ 不并入那 8，口径不同，不可混读） |
| **N71** | 🔴 **JSX 增广必须双写**（owner 澄清消费方后新增） | owner 2026-08-28 逐字「Claude.ai/design 是消费 React 的其中一个 **AI 工具之一，不是唯一**」⇒ `@types/react` 版本不可能统一。**实测 5 版本**：单写 `declare module 'react'` 在 **17.x / 18.0–18.2 静默失效**；单写 `declare global` 在 **19.x 静默失效**；**只有双写全覆盖**。分界在 **18.3**（⛔ 不是大版本 18/19）。⇒ 处方 §7 未验项 2 **已实测闭合，不再需要 owner 裁定** |

| **N72** | 🟢 **owner 拍板：让 Claude Design 用上真实 TVU 组件**（⛔ 不属第二轮，新落地方向） | 处方 [`2026-08-28-claude-design-real-components.md`](../proposals/2026-08-28-claude-design-real-components.md)。**可行性已实测确证**：纯 HTML + **UMD 单文件** + token CSS 在 `file://` 下渲染出真实组件，含 `shadowRoot:false` 的 light-DOM 组件（探针 [`probes/claude-design-ce-smoke/`](../probes/claude-design-ce-smoke/)，4 判据 + 外部复核 + 截图亲验）。⇒ 缺的不是能力，是**三件配套**（加运行时 / 加 `reference/17` CE 用法 / 改掉三处「不复用运行时」的旧声明）。🔴 **它推翻了 DS 现行的一条设计意图**，且与 N67–N71 那件 **互补非替代**（AI 生成 `<tvu-button>` → 开发者 TS 项目正需要那份 JSX 增广） |
| **N73** | 🟢 **复审基础设施三件套已落地**（⛔ 不属第二轮，不扩大评审面） | owner 2026-08-28 三问的落地：① 71 条**逐条清单**此前从未落盘 ⇒ `metrics/acceptance-coverage-dump.mjs`；② 时点对比此前**人工写表格**且只有总数 ⇒ `metrics/acceptance-coverage-diff.mjs`；③ `reports/` 无索引 ⇒ `metrics/build-report-index.mjs` + `reports/index.html`。计划见 [`docs/2026-08-28-review-infra-plan.md`](./2026-08-28-review-infra-plan.md)。**补 pin P4=`19e55102`（体检报告基线，此前未 pin ⇒ 报告读数当时不可复现）+ P5=`dcc1c29b`**。⇒ **第五个时点已量**：没人管 **71 → 67**（−4，4 条迁移逐条可定位），🔴 **盲区恒定 8 条、零变化** —— §29.2「不随兑现改善」的结论**延续到第五点** |
| **N74** | 🔴 **lab 自己的量具撞出一处 id 位移缺陷（已修 + 已上控制）** | 宽尺多收的盲区段按出现顺序**抢占了窄尺段的 id**（`parseAcceptanceSections` 给同 slug 第 N 个加 `~N`），把窄尺段挤成 `~2` 而丢失自陈 ⇒ **4 条错配**：盲区段被判 `gated`、真段被判 `unclassified`。⚠️ **三个 counts 因互相抵消【碰巧全对】(25/30/71)，但逐条归属全错** —— 第 27 条「计数≠归因」(§3.5) 迄今最干净的样本。修法 = **id 冻结**（窄尺段沿用窄尺 id，盲区段另给 `@blind:<line>`）；`must-not-hit-3/blind-never-gated` 钉住不许复发。🔴 **它与 N-D1 同源**：都是「`ACC_RE` 一放宽，编号就漂」，lab 侧用 id 冻结**绕开**了它，⛔ 但 DS 侧真要动 `ACC_RE` 时那 3 条自陈改指向的问题**原样存在** |

| **N75** | 🟢 **第三时点复审 P5→P6：第一次全空 diff**（⛔ 不属第二轮，不扩大评审面） | pin **P6 = `b3728d38`**。⚠️ 选它而非 HEAD(`cb2e6576`) 是 `repinProtocol.pinTarget` 要求（pin 本轮线最后一个 commit，⛔ 不是对方 HEAD）。读数 `118/126/8`、三态 `27/32/67` —— **与 P5 逐字相同**；`meta-rules.md` 行数 `968→985`（`fbfc3e4f` 的 +22/−5 生效）⇒ 量具**看见了**分母面变动而段数未变。⚠️ **全空 diff 与「量具坏了」在输出上不可区分** ⇒ 补两道阴性对照：① 同一量具在 P4→P5 给出 4 条迁移（有判别力）② **P4→P6 逐字等于 P4→P5**（传递性）。⇒ 结论「这 21 个 commit 没有推进 acceptance 覆盖面」是**判据级**，⛔ 不是「跑出来是空的」 |
| **N76** | 🔴 **判定输入面此前漏了第三个面**（本次补上） | 前两次 pin 判定只查「闸本体 + 豁免表 + 7 份扫描文件」，**漏了 `GATE_DIR = 'scripts'` 是【整个目录】** —— 三态分类靠全目录闸脚本的自陈，`dcc1c29b..HEAD` 实改 **15 个** `scripts/` 文件。⇒ 只查闸本体会**漏判**。P6 的判定已按完整输入面重做 |
| **N77** | 🔴 **lab 量具第二处自撞缺陷（已修 + 已上控制）** | `acceptance-coverage-diff.mjs` 两处：① **裸 NUL 字节**（3 个，复合键分隔符直接存进源文件）⇒ `file(1)` 判 binary、**系统 grep 对整个文件静默返回空**、`git diff` 全程显示 `Bin`（该文件历史上每次改动在 review 里都不可见）。⚠️ **`git grep` 不受影响** —— 受影响的是系统 grep 与 git diff，别把结论说宽。改源码转义写法，**改动前后 JSON 输出逐字节 `cmp` 相同**证明行为中性。② **「基线」那行把「体检报告的读数所在」写死**在渲染器里，对 `from=19e55102` 碰巧成立，换 P5 当基线时**当场撒谎**。改为查 `pinHistory` 真源 + 新增 `must-hit-0/role-lookup-alive`（已造故障验证，真实 `exit=1`） |
| **N78** | 🟢 **owner 新问题 → 风格轴【规则缺失】+ 处方已出**（⛔ 不属第二轮，新落地方向） | owner 2026-08-28 逐字「同一个表单里面同时出现 Line 和 Filled 的表单组件，这类的设计漏洞目前有没有闸口检查？」⇒ 量具 [`metrics/variant-axis-coverage.mjs`](../metrics/variant-axis-coverage.mjs)（6 条控制）实测：风格轴 **2 条**（`Input`/`Select` 各 `'line'\|'filled'`，默认均 `line`），「不得混用/唯一口径」类规则 **6 条**，**管住风格轴的 0 条** ⇒ 对位 **0/2**（阴性对照：注入假规则 → `6→7`、`0/2→2/2`，还原后回基线）。🔴 **病因与 [`2026-08-27-designqa-gate-gap`](../proposals/2026-08-27-designqa-gate-gap.md) 相反**：那次是「规则写了、闸没跟上」，这次是「**规则从来没写**」—— 那份 §0 明确排除掉的正是这一种，**⛔ 两份不可互引作已覆盖**。🔴 顺带查出**结构性混用源**：`Pagination.vue:59` 按 `type==='Small'` 硬切 `line`/`filled` 传给内部控件 ⇒ 默认 Pagination + 默认 Input = **开箱即混用**，不需要设计师犯错。处方 [`2026-08-28-variant-axis-rule-gap.md`](../proposals/2026-08-28-variant-axis-rule-gap.md)，**owner 当日拍定口径 A**（如实记为「采纳」非「论证」） |

| **N79** | 🟢 **体检报告另外三面读数已量具化 —— 第一次运行就订正 6 处**（⛔ 不属第二轮，不扩大评审面） | owner 2026-08-31 交接的第二项。此前**只有 acceptance 面**（N73）可复现，其余三面是**人工数的、没有可复跑判据**。补三支量具：[`deliverable-inventory.mjs`](../metrics/deliverable-inventory.mjs)（面 1，8 控制）· [`token-hardcode-ratio.mjs`](../metrics/token-hardcode-ratio.mjs)（面 2，8 控制）· [`entry-types-coverage.mjs`](../metrics/entry-types-coverage.mjs)（面 3，6 控制），计划见 [`docs/2026-08-31-healthcheck-three-faces-plan.md`](./2026-08-31-healthcheck-three-faces-plan.md)，全部在 pin **P4=`19e55102`** 上跑、跑完验 `git status` 为空。🔴 **订正 6 处**：图标 `53→644`（DS 自己 `export-claude-design-bundle.mjs:105` 注释「644 SVG」互证）· **Web Components `3→37`**（疑为把 `src/web-components/` 里**三个文件**当成三个组件；37 由 `register.ts` 导出与 `components.config.ts` 的 `tag:` **两个独立源逐名对应**）· 使用示例 `53→`**来源不明**（8 个候选判据无一产出 53，⛔ 记 `unlocated` 不记 `corrected`）· 代码入口 `10→9`（`./icons/svg/*` 是图形文件入口）· ESLint 两入口由「缺类型」改判「**裸字符串形态**」（N70 那条口径差，⛔ 与「有位置放却没放」不可混读）· React 覆盖 `28/28→26/28`（`Pill`/`Select` 无 wrapper）。⚠️ 另有**一处口径拆分**（不计入订正）：面 2 的「549 次 / 0 次 ⇒ 100%」**分子分母不同面**（549 是全变量、0 只统计颜色）⇒ 拆成三栏 `546 / 310 / 0`，占比分母逐字写出。⇒ **6 处订正无一改变四条主结论**，但第 2 条把面 3 的分量抬高了：缺类型挡住的是 **37 个自定义元素**，不是 3 个 |
| **N79.1** | 🔴 **lab 量具第三、四处自撞缺陷（已修 + 已上控制）** | ① `token-hardcode-ratio` 初版读数 **0 → 23，23 条全是假阳** —— `var(--red)` / `var(--color-white)` / `var(--green-bg)` 里的颜色词被 `\bred\b` 命中，把「正确走了变量」判成「写死颜色」。⚠️ 与风格轴 `font-variant-numeric` **完全同型**（关键词落在更长标识符内部），`§30.5.2` 记着 —— 这是**同一形态第 3 次**，而 `deliverable-inventory` 数 Web Components 时 grep `tag:` 命中注释里的 `fill` 是**第 4 次**。⇒ 修法不是「正则调细」，是**先净化再扫** + `must-not-hit` 合成探针钉死。② 注释「色值↔token」配对初版做**同块笛卡尔积** ⇒ 34 对里 6 对判「漂了」，**逐条读原文确认 6 条全假阳**（正确配对也都提到了，多的是交叉配对）。⚠️ 实测「就近原则」在这里**不成立**（错的色值离该 token 更近）⇒ 改为只认四种**句法显式相邻**形态，提不出的单列 `pairsUnextractable` **8** 条。🔴 **口径纪律**：把「我提不出来」记成「注释漂了」= **凭空造出一个缺陷**；同理 `unlocated` ⛔ 不许写成 `corrected`（后者含义是「我知道正确值」，而我们只知道「复现不出来」）。⇒ 报告「0 处漂移」经扰动对照（`0→3`）确证**成立** |
| **N79.2** | ⚠️ **一条控制曾经是恒真的（本条是它被抓住的过程，⛔ 不删）** | `token-hardcode-ratio` 的两条 `must-not-hit` 用了**单行** `<style>…</style>` 合成探针，而 `sfcBlock` 按行判块边界 ⇒ **整块被跳过、探针恒返回 0** ⇒ 两条控制**恒绿 = 零信息**（第 25 条）。抓住它的是**它们的阴性对照** `must-hit-3/real-literal-still-caught`（真写死的探针必须被抓到）—— 该条当场红、漏报 3/3。🔴 **推论**：`must-not-hit` 单独存在时**无法自证有判别力**（「没命中」既可能是判据对、也可能是根本没扫）⇒ **每条 `must-not-hit` 都应配一条同构的 `must-hit` 阴性对照**，否则它只是一句没被证伪的声明。与 `§30.5.2`「凡输出空/零先证判别力」同源，但主语是**控制自己** |

| **N80** | 🔴 **67 条逐条修法已出 —— 本条【推翻】§30.2 第 3 条与 §30.4 冻结**（owner 2026-08-31 拍定） | owner 逐字「推翻，全 67 条都要修法」。⚠️ **顺带订正交接措辞**：此前把现行推荐记成 §30.2 **第 2 条**，核对后那条讲的是「14 件 owner 待拍打包归档」，与 67 条无关；真正被推翻的是**第 3 条**（「其余 7 步进 backlog 不排期」）与 **§30.4**（「候选清单封顶，只登记不开格」）。⇒ **解冻范围严格限定在已登记的这 67 条**，⛔ 未新开评审格、未扩大扫描面。产出：量具 [`unclassified-fix-triage.mjs`](../metrics/unclassified-fix-triage.mjs)（11 控制全绿）+ 处方 [`2026-08-31-unclassified-67-fix-directions.md`](../proposals/2026-08-31-unclassified-67-fix-directions.md)（含 §5 执行状态栏，§28.9 硬要求）+ 计划 [`docs/2026-08-31-unclassified-67-fix-plan.md`](./2026-08-31-unclassified-67-fix-plan.md)。读数：**F1 57 · F2 0 · F4 10**；前置 无 31 · 仅编号漂移 28 · 仅闸看不见 3 · **两者都有 5**。⇒ 顺序建议 **先解 N-D1 → 再放宽 `ACC_RE` → 最后补自陈**，⛔ 反过来做中间那步会造出一批看起来像回归的假故障 |
| **N80.1** | 🔴 **预注册的分类判据【失败了】—— 这是实质结论，⛔ 不是一次失败** | lab 原设计第四类「F3 · 建议走具名豁免」，想用词法判据自动认出不可机检的段。判据成立与否**预注册**（阈值写死进源码、**先 commit 再跑**）：召回下界 0.75 · 误报上界 0.26 · 判别力下界 0.5。实测 **召回 2/32 = 0.063** · 误报 0/27 · 判别力 0.063 ⇒ **两项红**。诊断（⛔ 非通过判据）：即使放到最松的「任一核查项命中」，最干净金标子集也只 **8/15 = 0.533**，其中 **6 条零命中**。🔴 **结论：「可不可机检」没有可靠的词法判据** —— 它取决于**被测物存放在哪个面**（repo 文件 vs Figma 画布 / Slack 消息 / 一次对话 / 一张渲染图），**与措辞无关**。实例：`AGENTS.md#Acceptance`（Slack mrkdwn 起草纪律）零词法标记，但被测物是**一条永远不进仓库的 Slack 消息**。⇒ 量具**已降级**：`fixClass` 只由结构判据产出，词法命中降为 `lexicalHint`（**线索非判读**），可机检性一律 `needs-human-review`。⚠️ **两条纪律留痕**：① **⛔ 没有拿同一份金标反复调分类器直到通过**（那是过拟合 = 第 25 条「调成必过 = 恒绿 = 零信息」），只跑**一轮**预注册，失败即降级；② **金标本身被污染**（32 条正样本里 **17 条**是 `figma-technical-reference.md` 的**整份文件级豁免**，理由是**射程**不是**不可机检**）⇒ 事后切分的读数**单列并标注为事后**，⛔ 不换分母、不当通过判据 |
| **N80.2** | 🔴 **第 27 条「计数≠归因」迄今第二个干净样本**（与 N74 同型） | 「锚点不稳」有两个候选判据，实测**都得 33**：① slug 碰撞（量具现行）② 标题不是具名规则（**计划书预注册用的**）。⇒ 数字**逐字相同**，**集合各差 8 条**，约 **24%** 归属不一致。🔴 计划书预注册的是 ②、量具最终用的是 ① —— **若只核对「条数是不是 33」，这处判据替换会完全无声地通过**。⇒ **口径：核对分类结果必须比 `id` 集合，⛔ 只比总数不算核对过。** 另有一处**本器自撞**：初版把 `@blind:` 合成 id 也算「锚点不稳」得 **35**，被交叉验证控制当场揪出 —— `@blind:` 是 **lab 自己合成的记法**，把它的形状算成对方的编号缺陷，是**把自己的记法算到对方头上** |
| **N80.3** | ⚠️ **`F2 = 0` 是读数，⛔ 不是「没查到」** | 67 条只落在 **3 份**文件里，而这 3 份**每份都已有闸在扫** ⇒ 按文件粒度 F2 必然为 0。⇒ **F1/F2 这对分类在文件粒度上判别力近零**，处方已如实写出、⛔ 不假装它是个有信息量的划分。真正可执行的那一层是**候选可扩的闸**（按「该闸已认领的最近一段离本段多少行」排序，逐条给出，由 `must-hit-7` 钉住「F1 每行都必须给得出候选闸，否则『扩已有闸』是空话」）。分布：`audit-handoff-deliverable-sections` 15 · `audit-mockup-library-origin` 10 · `audit-mockup-typography-icon` 8 · 其余 8 支共 24。⚠️ 候选闸是**结构邻近度**，⛔ 不是「这支闸真能检查这条规则」 |
| **N80.4** | 🟠 **F4 那 10 条牵出一个 owner 要拍的分母问题**（⛔ lab 不代拍） | 10 条段内**一条核查项都没有**（已由 `must-hit-2` 验非量具故障：段的行号在文件里真实存在）。⇒ 那它到底算不算「一条写下来的规则」？**若不算，126 这个分母本身要减 10** —— 而分母一动，体检报告第四节的**全部占比都要重算**。已列进处方 §5 执行状态栏第 2 项。🔴 **本条的措辞已被 N81 推翻**（减的是 13 不是 10；且那个二选一的**共同前提不成立**），⛔ 留痕不删 |

| **N81** | 🔴 **F4 分母双分支预演 —— 结论是【那个二选一问题本身作废】**（2026-08-31，⛔ 不属第二轮，未扩大评审面） | 起点是处方 §5 第 2 项：把 owner 那道「要自己推演后果」的题降成「两栏数字选一栏」。做法是把「段内 0 条核查项」这条结构判据从**只跑 67 条 unclassified** 扩到**全 126 段**。量具 [`f4-denominator-branches.mjs`](../metrics/f4-denominator-branches.mjs)（**13 控制全绿 + 1 条 skip，skip ⛔ 不计为绿**），计划见 [`docs/2026-08-31-f4-denominator-branches-plan.md`](./2026-08-31-f4-denominator-branches-plan.md)。**三件订正，一件比一件重**：① **k = 13 ⛔ 不是 10** —— 另 3 条落在「🟢 有人管」里（`gated 3 · 只能人看 0 · 没人管 10`）⇒ 「只把分母从 126 改小」这句错了，分支里**分子分母同时变**；那 3 条的含义是**一支闸声称覆盖了一条它读不到核查项的规则**。② 🔴 **最重：13 段【无一是真的空】** —— 形态分层 `inline-prose 12 · following-prose 1 · genuinely-empty 0`。病因在闸自己：`parseAcceptanceSections` 内层循环**从 `i+1` 行起扫**（`audit-acceptance-gate-coverage.mjs:176`）⇒ 写在 `**Acceptance**：` **同一行上**的判据永远进不了 `items`（样例 `#C5`：「绑了 `grey-N` 而存在 `Color Type/*` → 违例」白纸黑字写着，`items` 却是 0）。⇒ **原二选一的共同前提被证伪**：「补写核查项」没什么可补、「从分母去掉」会**删掉 13 条真规则让覆盖率虚高**。③ 真修法是原处方**没列的第三条路**：C1 改写这 13 段为列表形态（零代码）/ C2 让闸认得行内形态（撞 `[N]` 自陈核对，**与 N-D1 同型的顺序坑**）。🔴 **它与 `ACC_RE-blind` 是同一个病的两处发作**（闸认得的词法形态比文档实际用的窄），⛔ 但不可合并：`ACC_RE` 决定「看不看得见这个段」，本条决定「看不看得见段里的核查项」。**双 pin 交叉**：P4 `19e55102` 与 P6 `b3728d38` 的 `k`、形态分布逐字相同，比的是 **id 集合**（13 vs 13，差集 0）⛔ 不是只比总数（N80.2）；两 pin 跑后 `git status` 均空。⚠️ `genuinely-empty = 0` 与 `只能人看 = 0` 都是**零输出** ⇒ 判别力分别由 `must-hit-10`（三类合成探针分得开）与 `must-hit-3`（三态各注零段，抓到 3/3）钉住（§30.5.2）。⚠️ **口径**：lab 给的是「这 13 段是什么形态」，⛔ 不代拍 C1/C2 |
| **N81.1** | ⚠️ **又一条控制对它自己宣称的事零信息量 —— 这次是 `must-hit`（前四次形态之外的新一种）** | `unclassified-fix-triage.mjs` 的 `must-hit-0/itemcount-matches-dump`，`why` 写的是「不同 ⇒ 抽取面没对齐」。实测：**恒等臂 0/126**、扰动成窄尺 `stripNoise` 后 **2/126** ⇒ **比较算子是活的**，但现行代码两边是**同一表达式的两次求值**（`acceptance-coverage-dump.mjs:251-254` 与 `unclassified-fix-triage.mjs:326-327` 都是 `normalizeText(raw)` → `gate.parseAcceptanceSections`）⇒ 它**永远不会红**。⚠️ **措辞纪律，⛔ 不许说成「它是坏的」**：它弱保了行集完整性（`file:line` 键的存废），不成立的只是 `why` 里那句归因。🔴 **与 N79.2 的差别**：N79.2 是 `must-not-hit` 恒真（「没命中」可能是根本没扫），本条是 **`must-hit` 恒真**（「命中了」可能是在跟自己比）⇒ **推论：控制的两侧都要问「它和谁比，那个『谁』是不是同一个来源」**。本器据此改为**恒等臂 + 扰动臂**两臂，并把 `why` 降到它真能证的那一档。⛔ **未回改 triage**（那要重出已发表读数，属另一件事）—— 如实登记，留给下一轮 |
| **N82** | 🔴 **触发器 T 存量覆盖面探针 —— 两版判据都在闸处终止；⛔ 无存量读数** （2026-08-31，⛔ 不属第二轮，未扩大评审面） | 起点是 owner 的元问题「如何让设计系统不顺手套范式」。期间 DS 于 **10:57 `6ac56de2`** 落地**触发器 T**「给产物定了会增长的性质，就按满载态定结构」+ M53 ⇒ 原立项前提两项**当场作废**（「M23.16 覆盖面缺口该记一笔」已被 T 第 44 行明确写入；「判据要从 memory 回流」已回流）。探针重定位为**测 T 的存量违规面与可机检性** —— T 只有 1 个实证、纯自陈、**零机器闸**，而它自己 (B) 条要求「用同一判据扫一遍整个产物」。基线 **P7 `6ac56de2`**（⚠️ **刻意不按 `repinProtocol.pinTarget`**：测的是规则落地那一刻的存量，基线只能是落地 commit 本身；理由已写进 `whyKeep` 防下轮误修）。**两版判据、两次终止**：① **v1 结构判据**（增长自述 ∧ 跨段条目重叠）在 Task 3 fail-closed 闸被**自己的控制组证伪** —— `must-hit-0`（唯一已知阳性 = LCD 重构前版 `83db51d`）不命中，臂 A 绿臂 B 恒 0，各段条目集合**两两不相交**。根因：**真实横切是「同一批条目的不同属性被切到不同段」，条目名恰恰不重复**（每段只放一种属性）⇒ 已证**结构性失明**（最小合成样本复现）。② **v2 LLM 判据**（prompt ⛔ 不含 lab 自编判据，只放**从 pin 程序化抽取**的 T 规则原文；模型只答事实、verdict 由 lab 算，§3.5）跑完校准档 20 次、解析失败 0/20，**放量闸 2/3 未过**：`must-hit-0 [2,2,2,2,3]` 100% · `must-hit-1/合成属性分段 [3,3,3,3,3]` 100% · 🔴 `must-not-hit-0/lcd-after [4,4,4,4,3]` **0%** · `observe [4,4,4,4,4]`（无期望）。⛔ 未调 `minAgreement`。🔴 **失败不在 LLM 判读、在 lab 的操作化**：`must-hit-0` 列出的正是 `## 3. 通用规则` 与 `## 6. 出处`，**一字不差**（正是 v1 D2 失明处）⇒ **判读横切是 LLM 能稳定做对的事**；翻车处是 `appendCost` 把 **A 类真横切**（其他条目的内容被切到别处，T 原文点名的「内容/规则/出处各一段」）与 **B 类共用段元段**（组件与视觉、维护约定、导言指针、执行状态 —— **任何文档都有**）加进同一个数，**B 恒为正** ⇒ 前版 `A=2/B≈0` 得 **2**、后版 `A=0/B=4` 得 **4**、observe `A=0/B=4` 得 **4** ⇒ **后版与 observe 同为 4 而性质完全不同、真横切那份因段少反而只有 2 = 方向反转**，它测的不是 T 关心的量。⚠️ **⛔ `sd≈0` 不得读作无噪声**（§2.7）：三条控制内部几乎不变，但那只说明同一输入反复判读稳定，`must-not-hit-0` 是**稳定地判错**。⚠️ **口径**：读数带 `modelId=claude-opus-5` + `templateHash=7f974b9ad9f69554` 两个主键维度，⛔ 不可跨模型/跨模板比较（与 v1 纯 T1 的最大差异）。**成本画像**：≈**40 s/次**，且**耗时由推理复杂度主导、⛔ 不随文档长度走**（`observe` 16,589 字 42.6 s **<** LCD 3–4.5k 字 49–51 s）⇒ 计划原写「>60 份才报成本」（300 次≈3.3 h）**门槛太松**，lab 建议改 >20 份、⛔ 不代拍。⛔ **两版都未跑正式面**，`ds-tracked-md@6ac56de2` 口径一次没扫；**Figma 面完全未测**（而 T 的催生案例恰在 Figma）。报告 [`reports/2026-08-31-trigger-t-coverage.md`](../reports/2026-08-31-trigger-t-coverage.md) / [`…-llm-judge.md`](../reports/2026-08-31-trigger-t-llm-judge.md) |
| **N82.1** | 🔴 **N81.1 的第三种形态：扰动样本照着判据造 ⇒ 又一条恒真的 `must-hit`** | v1 的 `must-hit-1/oneshot-perturbed` 绿了，但**它的绿零信息量**：扰动函数 `perturb()` 是照着 D2 判据的形状造的（在两段塞同一批 `items`）⇒ 样本与判据**同源**、必然命中，它证明的只是「判据能抓住自己定义的形态」。**铁证 = 两条同时发生**：照判据造的样本**绿**、真实病灶 `must-hit-0` **红**。⇒ **N81.1 的同源在「和自己比」（两边是同一表达式的两次求值），本条的同源在「样本按判据造」** —— 同一条纪律的第二种形态。⇒ **通则：扰动 / 合成样本必须照着真实病灶造，⛔ 不许照着判据造；手上没有真实病灶样本，就说明判据还没到能配控制组的阶段。** v2 已据此执行：`must-hit-1` 换成**属性分段**形态（正是 D2 失明处），实测 5/5 命中 |
| **N82.2** | 🟠 **新通则：凡数一个 count 当判据，先问这个 count 里有几格是任何样本都会有的**（§2.9 同族） | §2.9 讲「凡引用比例，先问分母里有几格是恒真的」。N82 把它从**比例的分母**搬到了 **count 的被加项**：`appendCost = A + B`，`B`（共用段 / 元段）与被测性质无关且恒为正，数量随**文档规模**走 ⇒ 把 `A` 的信号稀释到方向反转。⚠️ **修法的独立性论证**（⇒ 它不是拿读数反调）：A/B 的界线出自 **T 的原文** —— T 逐字点名「内容一处、规则一处、出处一处」这类**条目属性**，⛔ 从未把「组件与视觉」「维护约定」算进来；读 T 就能划出，不依赖本轮读数。🔴 **但那四份样本的读数已被逐条查看 ⇒ 从此只能当训练集**，v3 若跑**必须换未看过读数的样本**做验证臂，沿用这四份只能调试，⛔ 其结果不得写成「v3 判据成立」（N80.1 同源纪律） |
| **N82.3** | ⚠️ **lab 自身失误留痕：`; echo "exit=$?"` 吞掉了被测进程的退出码** | 校准档用 `node … > log 2>&1; echo "exit=$?"` 起后台跑，后台任务报回 **exit 0**，而量具实际 `process.exit(1)`（放量闸未过）—— 报的是**整条 bash** 的退出码即 `echo` 的 0。据此曾在对话中写下「exit 0 = 放量闸过了」，读 log 才发现是 🔴，**已当场订正**。⇒ 与 AGENTS「取退出码 ⛔ 不接管道（zsh 下 `${PIPESTATUS[0]}` 是空的）」**同族** —— 那条防的是管道，本条是 `;` 后再跟一条命令，**同一个病灶的第二个入口**。⇒ 口径：**要拿被测进程的退出码，就让它是整条命令的最后一步**，⛔ 别在后面接任何东西（包括 `echo`） |
| **N83** | 🔴 **触发器 T v3 判据 ⛔ 不具备可验证条件 —— 验证臂样本在 `.md` 面不可得**（2026-08-31） | N82.2 已定：v1/v2 那四份样本的读数被逐条看过 ⇒ **只能当训练集**，v3 沿用它们的结果 ⛔ 不得写成「判据成立」。⇒ **起手第一件事是找新样本，不是写判据**（「有没有新样本」是 v3 的前置条件，不是收尾工作）。量具 [`metrics/restructure-pair-hunt.mjs`](../metrics/restructure-pair-hunt.mjs) 搜 **6 个仓库 / 2 145 commit** 的 `.md` 面找「同一份会增长的容器类文档的重构前 / 后两版」，**三重筛没有一重碰 v3 的被测量**（① 前置 = T 自己的边界「性质是我写的」⇒ 复用未被证伪的**臂 A** `hasGrowthClaim`，⛔ 未复用已证伪的 `isCrossCutting`、⛔ 未引用其 `--scan` 读数；② 事件 = 顶层段标题集合 Jaccard，对 A/B 之分**完全无知**；③ 标注 = **作者/owner 自陈过病灶**，⇒ ground truth 出自外部权威，⛔ 不是 lab 读文档自判 —— **LCD 那对的金标准正是这么来的**，T 原文第 975 行 DS 自陈、owner 五轮纠正）。读数：窄档 `23 → 2 → 候选 1`、宽档 `90 → 10 → 候选 9`，**两档 `mustHit.found` 均 true**。🔴 **候选逐条查看后全是假阳**：窄档唯一那条命中的「加第三」实指 onboarding gate 加**第三个 tier**，且它在 `_plans/` 下 = **一次性交付**（按 T 第二条边界可以横切）⇒ 连当 `must-hit` 的资格都没有；宽档多出的 8 条 jaccard 全 **≥0.773**（结构基本没变、本就不是重构事件），抽验 3 条的命中词全是文档在讲别的（`self-contained` 指组件写法 · 「加第二个配方」指测试用例 · 「加第二遍」指扫描遍数）。⇒ **敏感性检查通过：放宽 4 倍后新增的全是假阳，「不可得」⛔ 不是阈值造出来的。** **顺带一条对 owner 的决策输入**：T 的实证从**自陈**升成了**读数** —— 在 `.md` 面上仍然只有 1 个，且这是**搜过 2 145 个 commit 之后的 1**，⛔ 不是「还没搜的 1」；一条存量实证只有 1 个的规则要不要配 ≈40 s/次的 LLM 闸，⛔ lab 只报数不推荐（AGENTS §8）。🔴 **边界**：全部只在 `.md` 面成立，**Figma 面一次没搜**（而 T 的催生案例恰在 Figma）⇒ ⛔ 不得读成「整个生态只有 1 个实证」。报告 [`reports/2026-08-31-trigger-t-v3-sample-hunt.md`](../reports/2026-08-31-trigger-t-v3-sample-hunt.md) §7 给了三条路（等真样本自然产生 / 只在训练集上跑调试 / 转 Figma 面），⛔ 未代拍 |
| **N83.1** | ⚠️ **N81.1 / N82.1 同一条纪律的第三个位置：搜寻器也需要 must-hit 控制** | 本轮**第一版搜寻口径当场被自己的 must-hit 证伪**：曾用「`add ≈ del` ⇒ 这是重排」的机械签名，而已知阳性 LCD 重构 commit `d885d72` 实测 **`+82 / −27`**（ratio 0.33 < 门槛 0.5）⇒ **抓不到它**。根因：**「删得和加得一样多」这个假设本身是错的** —— 真实的结构重构是**大量新增 + 少量删除**（横切内容被展开进各自包含单元，总量变大）。⇒ **通则：搜寻器和判据一样要配 must-hit。没有它，「命中 N 条」说明不了任何事 —— recall 未知时，「命中 0」和「口径瞎了」在读数上长得一模一样。** ⇒ 与 N81.1（控制在跟自己比）、N82.1（样本照判据造）**同族**：三条都是「这个绿/这个数到底证了什么」没问到底。现行量具据此把 must-hit 做成 **fail-closed**（结果里没有 LCD 那对就 `exit 1`，⛔ 不许报「命中 N」） |
| **N83.2** | ✅ **N81.1 的回改已落地：`must-hit-0` 拆成恒等臂 + 扰动臂，已发表读数逐字未动** | N81.1 登记时 ⛔ 未回改（要重出已发表读数）。本轮做完：`must-hit-0/itemcount-matches-dump` → **`must-hit-0a/identity-arm-rowset-intact`**（判据逐字沿用，但 `why` **降到它真能证的那一档** = 弱保**行集完整**、⛔ 不得读作「抽取面对齐」）+ **`must-hit-0b/perturbed-arm-detects-form-drift`**（把抽取输入换成**只 `stripNoise`、不做形态归一**，比较算子必须因此变红）。⚠️ **扰动照真实病灶造、⛔ 不是照判据造**（N82.1）：窄尺/宽尺口径分叉是本仓真踩过的事（P4 实测窄尺 118 / 宽尺 126 / 差额 8，`acceptance-coverage-dump` 的 `must-hit-1/narrow-equals-gate` 钉的正是它）。实测 **0a = 0 条对不齐 · 0b = 2/126**，与 N81.1 当时的探测读数逐字吻合。⚠️ 判据取 `≥1` 而非写死 2 —— 钉的是「算子对口径分叉敏感」，写死了换 pin 就假红（AGENTS §2.13 推论二）。**重出读数已逐字核对**：跑改前 / 改后两版产物对比，**除 `checkedAt` / `controls` / 新增的 `perturbedMismatch` 外整份产物逐字相等** —— `67` / F1 `57` / F2 `0` / F4 `10` 的 **id 集合与顺序全部逐字不变**（⛔ 不是只核了计数） |

| **N84** | 🟢 **触发器 T 去案例化阶梯 —— H2（判读器在匹配已解答案例，非按规则判）未获支持**（2026-08-31，⛔ 不属第二轮，未扩大评审面） | 检验的是 N82.2 从未测过的一条对立解释：`must-hit-0 100% / must-not-hit-0 0% / must-hit-1 100%` 这组旧读数，除了 H1（`appendCost=A+B`，`B` 恒正稀释）之外，是否也能被「判读器在拿样本去匹配 prompt 里那个已解答案例」（H2）同样拟合——`extractRuleT()` 的抽取范围含 T 原文第 975 行的实证段落，其段落命名与两条 must-hit 判别样本的真实段落名字面重合，两个假说对旧读数完全同预测，N82 只检验过 H1。做法：把判据文本按 `PREREG_LADDER` 三档单调剥离（`makeRuleVariant`/`assertLadder` fail-closed 校验），R1 `cased`（原样，1672 字，`templateHash=7f974b9ad9f69554`，**与已发表报告 `2026-08-31-trigger-t-llm-judge.md` 逐位相同**）→ R2 `decased`（剥掉实证整行，产品名随之消失，1289 字）→ R3（**只再剥掉推导表里 `ABSTRACT_FOIL` 那一处字面量「（内容/规则/出处各一段）」**，17 字，1272 字），各档 n=5，`nulls=0/60`。读数：两条判别项 `must-hit-0/lcd-before`、`must-hit-1/synthetic-attribute-split` 在 **R1/R2/R3 三档均 5/5=100%**，`must-not-hit-0/lcd-after` 三档恒 **0%**（`[4,4,4,4,4]`/`[4,4,7,4,4]`/`[4,4,4,4,4]`）。按 `decisionRule` 逐字命中 **「H2 未获支持」**：`R1 ≥ 4/5 且 R3 ≥ 4/5 ⇒ 判据脱离案例仍站得住，§2 结论从「未排除混淆」升为「已排除这一条」`。⇒ 已发表报告 `2026-08-31-trigger-t-llm-judge.md` §2 **不撤回**，处置为**升档**（未排除混淆 → 已排除这一条混淆），⛔ 不写成「§2 被证实了」——排除一条对立解释不等于证实正面主张；§3 的 A/B 拆分建立在 H1 上，未受影响、可继续引用。🔴 **⛔ 本轮没有证明 H1 错**：H1 与 H2 可同时成立，本轮实验设计从一开始就不检验 H1，`must-not-hit-0` 三档恒 0% 正说明 **H1 仍是它失败的活解释**（该样本真横切 `A=0`、共用段噪声 `B>0` 恒在，与案例是否留在 prompt 里无关）。⛔ 无 v3、无 Figma 面信息。⚠️ **射程**：这四份样本是校准阶段反复挑中的最典型样本（组内对比 within-subject 消除的是「样本被看过会污染读数」，⛔ 消不掉「这批样本够不够有代表性」）——R3 仍 100% 也可能只反映这两条判别样本对规则文本的敏感度本来就低，结论**只在这两条 must-hit 判别样本上**成立，⛔ 不得外推成「对任意样本都不掉」，也不得读成「判据的普遍有效性已被证明」。🔴 **⛔ 射程第二条（2026-08-31 最终复核补记）：本轮真正测到的扰动是「剥掉带产品名的已解答案例」（R1→R2，探针表已证六个案例词在 R2/R3 全部清零），⛔ 不是「剥净全部抽象反例」。** R3 只剥掉了 `ABSTRACT_FOIL` 那一处 17 字字面量（1289→1272 恰为这 17 字），而「### 触发器 T」标题正下方「核心反模式」引用块里语义等价的「于是按「层」横切（**内容一处、规则一处、出处一处**），加第二个条目时要同时改三个地方」**三档原封不动**——它恰好保留了「规则」「出处」两个词，而这正是 H2 依赖的字面重合线索（样本真实段落名 `3. 通用规则` / `6. 出处`）。⇒ **R3 不掉分部分地被 H2 自身预测**，本轮「H2 未获支持」的证据强度**比字面读起来更弱**：排掉的是「靠产品名 + 那份 LCD 旧结构描述去匹配」这个更具体的版本，⛔ 没排掉「靠『规则』『出处』这类段落名词汇做字面匹配」这个更弱的版本；要排后者需新增一档把全部抽象反例剥净的 R4，**本轮没有这一档**。🟢 **回填（2026-09-01，N85）：那一档已经跑了** —— R4 剥掉 `SURVIVING_FOIL`、「出处」计数归零后，两条判别项仍 5/5 ⇒ 本条削弱理由**已被大部分排除**。⛔ 只是「大部分」：「规则」二字仍残留 2 处弱语境（N85.2），且实质证据只有 `must-hit-0` 单条判别样本（N85.1）。⛔ 判定分支不变（预注册逐字条件确实命中，⛔ 不许事后改读法），改的只是措辞与射程，读数一字节未动。⛔ 亦不得把 R3 描述成「minimal / 只剩硬要求 / 『提炼成通用规则』的可测形态」——那个形态本轮一次没测过。报告 [`reports/2026-08-31-trigger-t-decase-ladder.md`](../reports/2026-08-31-trigger-t-decase-ladder.md) |
| **N84.1** | ⚠️ **通则：判据文本交给判读器时，⛔ 不许连带喂它自己的实证案例**（N81.1/N82.1/N83.1 同族第四个位置） | N84 的病灶是**量具自己抽取判据原文的方式**：`extractRuleT()` 按标题边界程序化抽取时，把「判据的抽象反例」（属于判据本身）与「判据的已解答实证」（一个具体案例，含产品名与旧结构的段落命名）当成同一段文本一并喂给判读器，判读器因此拿到了「答案」而非纯「规则」。本轮虽判定 H2 未获支持（案例剥掉后方向正确率未跌），但这是**读数结果**，不改变**操作化原则**本身——凡要考察「判读器是否真的按规则判」，判据文本这一输入面就应当与「规则会用什么案例佐证」分离，案例只用于人读校验，不进判读器的 prompt。⇒ 与 N81.1（控制在跟自己比）、N82.1（样本照判据造）、N83.1（搜寻器也需配 must-hit）同族：都是「这个输入/这个比较到底测的是什么」没问到底 |
| **N84.2** | ⚠️ **预注册在取数前修订过一次，真实调用数 = 0** | `PREREG_LADDER.decisionRule` 初版三条分支只覆盖 R1×R3 共 36 格判读空间中的 24 格（`R1≤3/5` 且 `R3≤2/5` 的 12 格无分支命中），修订补上「⛔ 不可判读（基线不可复现）」这条基线闸，使 36 格全覆盖。修订时机在 `adapters/llm-judge-container.mjs` 该常量**提交之后、`runs/judge-ladder-6ac56de2/` 任何一次真实 LLM 调用之前**——取数前修订预注册正当，取数后再改则是作弊；本条登记的正是这一时序事实，⛔ 不构成对 N84 判定的追溯性质疑。⚠️ **补记（2026-08-31 最终复核）：这里的「36 格全覆盖且互斥」是按*单条判别项*核的**——即对任意一条 discriminator 的 (R1, R3) 取值，四条分支恰有一条命中。`decisionRule` **未规定两条判别项分歧时怎么读**（例如 `must-hit-0` 落「H2 未获支持」而 `must-hit-1` 落「H2 获强支持」）。本轮两条判别项完全一致（都 5/5 / 5/5）故未触发该情形，判定不受影响。⛔ 数据已取完，此处**只登记缺口、不改 `decisionRule`**——取数后修订预注册即是作弊；若将来复跑遇到分歧，须**在取数前**先补这条分支 |
| **N84.3** | ⚠️ **通则：判据库每条须显式标注「可机检 / 需 LLM 判读 / 需人判」，⛔ 不默认判据都能落成闸** | 分两件事说，⛔ 不合并归因：**① 两分类出自来源**——`reports/2026-08-31-trigger-t-coverage.md` §5 原文逐字是「必须为每条判据显式标注『可机检 / 需人判』」，出自「判据跨域迁移」立项三问里第②问（判据要怎么写才可迁移）的负向答案：`container-extensibility.mjs` 的判据 D2 迁不成纯结构判据——「可扩展性」在人眼里一眼可见，在结构上却需要语义判断（哪些段是同一批条目的不同属性），四个段在 markdown 结构上完全同形，纯结构匹配区分不了。**② 第三类「需 LLM 判读」是本轮扩出来的**——依据是本轮判读器实测：两条 must-hit 判别项在 `PREREG_LADDER` 三档均 5/5=100%（见 N84、`runs/judge-ladder-6ac56de2/summary.json`），**本轮读数据此提示**「机器判不了、但 LLM 判得稳」可能是真实可工作的一档，可考虑从「需人判」里再分出来。🔴 **⛔ 这里 ⛔ 不许用「证明」**（报告 §4 自己禁用「证实」类词），且**⛔ 不许选择性引用**：**同一支判读器**的 `must-not-hit-0/lcd-after` 在三档**恒为 0%**（`[4,4,4,4,4]`/`[4,4,7,4,4]`/`[4,4,4,4,4]`），且 N82 记的是**放量闸 2/3 未过**——⇒ 第三类的可行性**只在 must-hit 方向上有证据**，在 must-not-hit（不误报）方向上**证据为零、甚至反向**。再叠上 N84 的射程：这是 4 份样本 × 1 模型 × 1 模板 × 仅 `.md` 面 × n=5 的读数，⛔ 不得拿它去成立一个面向**整个判据库**的分类。⇒ 若要建判据库，必须为每条判据显式标注它的可执行方式属于机检 / LLM 判读 / 人判三者之一，未标注的规则不得进入自动化闸口。⚠️ 「独立于本轮 H2（N84）读数」这句**只对①两分类成立**——它在 N84 判读之前就已由来源报告给出；⛔ **第三类的成立恰恰依赖本轮读数**，不得读成「三分类整体都独立于 H2」 |
| **N85** | 🟢 **触发器 T · R4 档 —— H2′（判读器靠「规则」「出处」段落名词汇做字面匹配）未获支持**（2026-09-01，⛔ 不属第二轮，未扩大评审面） | 补 N84 射程第二条登记的缺口：上轮 R3 **并未剥净抽象反例**，顶部「核心反模式」引用块里语义等价的 `SURVIVING_FOIL`（「于是按「层」横切（内容一处、规则一处、出处一处）」）三档原封不动，它恰好保留了 H2 依赖的「规则」「出处」二词 ⇒ R3 不掉分**部分地被 H2 自身预测**。做法：新增 **R4 档** = 在 R3 之上再剥掉「`——`于是按「层」横切（内容一处、规则一处、出处一处）」（**带破折号一起剥**，剥后句子通顺，⛔ 不引入「文本读坏了」这个新混淆），1272→1246 字。⛔ 走**独立**预注册 `PREREG_LADDER_R4`（取数前 commit `df657e5`，⛔ 不改已取完数的 `PREREG_LADDER`）。取数档位 `['R1','R4']`，**R1 同 session 重跑作基线臂**（实测 `templateHash=7f974b9ad9f69554`，与上轮逐位相同，⛔ 未引用上轮 R1），4 样本 × n=5 × 2 档 = 40 次，`nulls=0/40`。读数：两条判别项 `must-hit-0/lcd-before`（R1 `[7,5,2,5,2]` / R4 `[4,5,3,4,5]`）、`must-hit-1/synthetic-attribute-split`（两档均 `[3,3,3,3,3]`）在 **R1/R4 均 5/5=100%**；观察项 `must-not-hit-0/lcd-after` 两档恒 **0%**（`[4,4,4,4,4]`/`[4,4,4,4,5]`）。按 `decisionRule` 逐字命中 **「H2′ 未获支持」**（`R1 ≥ 4/5 且 R4 ≥ 4/5`），两条一致故 `disagreementRule` 未触发，`conditionalTopUp` 未触发。⇒ 处置：**N84「已排除这一条混淆」的强度提升** —— 上轮那条削弱理由（存活抽象反例保留了「规则」「出处」二词）**已被大部分排除**。🔴 **⛔ 但只是部分**，两条理由见 N85.1 / N85.2。⛔ 无 v3、无 Figma 面信息、⛔ 未检验 H1（`must-not-hit-0` 两档恒 0% 正说明 **H1 仍是它失败的活解释**）。⛔ **样本代表性那条限制原封不动**（四份仍是校准阶段挑中的最典型样本）。⛔ **「只剩一句硬要求」那个形态至今一次没测过** —— R4 仍 1246 字，核心反模式段其余部分 / 「与触发器 J 的区别」段 / 性质→结构要求推导表 / 三条边界**全部还在**，⛔ 不得据本轮读数替「判据能不能提炼成通用规则」背书。报告 [`reports/2026-09-01-trigger-t-r4.md`](../reports/2026-09-01-trigger-t-r4.md)、计划 [`docs/2026-09-01-trigger-t-r4-plan.md`](./2026-09-01-trigger-t-r4-plan.md) |
| **N85.1** | 🔴 **两条判别项里只有一条真在判别 —— 本轮判定的实质证据是单样本，不是双样本** | 把每个样本在**全部已测 5 档规则文本**上的读数并起来看：`must-hit-1/synthetic-attribute-split` 共 25 次调用（08-31 R1/R2/R3 + 09-01 R1/R4）取值分布 **`{3: 24, 2: 1}`** —— 在案例在/不在、抽象反例在/不在、存活反例在/不在这五种规则文本下，24 次输出**同一个数**。⇒ **它对本族扰动的判别力实测接近零**：H2′ 为真时它输出 3，为假时它还是输出 3 ⇒ 它「R4 不掉分」**不构成关于 H2′ 的证据**。对比 `must-hit-0/lcd-before` 同样 25 次的取值分布 `{2:5, 3:6, 4:4, 5:8, 6:1, 7:1}`（确实在动，只是方向始终正确）。⇒ **N85 判定的实质证据只有 `must-hit-0` 一条 × n=5**。⛔ 判定分支不变（预注册逐字条件两条判别项实测都命中，⛔ 不许事后改读法、⛔ 不许事后把 `must-hit-1` 踢出 discriminator —— 那是取数后改预注册），改的只是**强度**的如实表述。⚠️ 这 ⛔ 不是「`must-hit-1` 是坏样本」——它当初照 `must-hit-0` 的病灶形状合成，用途是配一条不同介质的 must-hit；本轮发现的是**它对「规则文本」这个维度不敏感**。⇒ 若将来还用阶梯法测规则文本，⛔ 不应再把它计入 discriminator，且这条**必须在下一次取数前写进预注册**，⛔ 不许追溯套用到本轮 |
| **N85.2** | ⚠️ **「规则」二字并未剥净 ⇒ H2′ 只被排掉了一半** | `--verify-ladder` 新增的字面线索计数表实测：「规则」四档 **7 / 4 / 3 / 2**、「出处」四档 **4 / 2 / 1 / 0**。⇒ R4 把「出处」**归零**（`assertLadder` 硬断言），但「规则」**仍残留 2 处**，在「⛔ 与触发器 J / §M23.16 的区别」段里（`加规则前没查重` / `用规则真源校验`）。⇒ 本轮排掉的是「判读器**同时**依赖『规则』+『出处』两词、或依赖 `SURVIVING_FOIL` 那句完整表述」这个版本，⛔ **没排掉**「只靠残留那 2 处『规则』做字面匹配」这个更弱的版本。⚠️ 但这两处语境**确实**更弱：是**别条规则的名字**，不是「规则一处」那种**段落名式**用法 ⇒ 强度上是「H2′ 被削弱很多但没剥到零」，⛔ 不得写成「H2′ 已被完全排除」。🟢 **本轮验证有效的做法（⛔ 与教训分开记）**：把「R4 **没**剥净什么」也钉成 `assertLadder` 硬断言（`R4_WORD_COUNTS = {规则: 2, 出处: 0}`，不符即 fail-closed 抛），⛔ 不让它只留在文档描述里 —— 直接针对 N84 栽的那个坑（「一条断言的绿被读成它没断言的意思」）。以后凡「剥离/扰动类」量具，**剥掉什么与剩下什么都要进断言** |
| **N85.3** | ⚠️ **一条独立于 H2′ 的观察：方向正确率跨 session 可复现，数值不可复现** | R1 档在两次**独立 session**（同 pin `6ac56de2` · 同模型 `claude-opus-5` · 同 `templateHash=7f974b9ad9f69554`）下：`must-hit-0` 数值 `[2,6,3,3,2]` → `[7,5,2,5,2]` **完全不同**，`must-hit-1` `[3,3,3,3,3]` → 同、`must-not-hit-0` `[4,4,4,4,4]` → 同；而**三条的方向正确率两轮完全一致**（100% / 100% / 0%）。⇒ 独立支持既有的「⛔ 数值不读」纪律（`appendCost = A + B`，`B` 是与被测性质无关的恒正噪声）；并顺带确认**基线闸没有空转** —— R1 是本批次内真实重跑出来的，⛔ 不是引用上轮。⛔ 这是关于**读数稳定性**的结论，⛔ 不得当作 H2′ 的证据 |
| **N85.4** | ⚠️ **本轮新登记的预注册缺口（⛔ 只登记、⛔ 不追溯改代码）** | `PREREG_LADDER_R4` **未规定**「某条 discriminator 在全部档位上输出恒定（判别力为零）时该怎么读」—— N85.1 揭示 `must-hit-1` 正是这种情形。**数据已取完**，⛔ 此处只登记缺口、⛔ 不改预注册（取数后修订即是作弊，同 N84.2 时序纪律）；若将来复跑，须**在取数前**先补这条分支。⚠️ 对照：N84.2 登记的「两条判别项**分歧**时怎么读」这个缺口，本轮**已在取数前补上**（`PREREG_LADDER_R4.disagreementRule`：分歧 ⇒ ⛔ 不下合并结论，逐条登记，⛔ 不许取平均 / 挑一条当代表 / 把「其中一条未获支持」读成整体未获支持）。本轮两条判别项一致故未触发 —— ⚠️ **它没被触发 ⛔ 不代表它没用**：它的存在使本轮预注册在「分歧」这个此前无定义的情形上是完备的 |
| **N86** | 🔴 **只读边界被 owner 改判：lab 改为直接 commit DS master —— 连同代价一起登记**（2026-09-01，⛔ 不属第二轮） | owner 逐字裁定：「我希望直接提交到 Master 上，因为我老是忘记点 PR 合并，而且也没有必要坚持 PR」。改判依据是读数不是感觉：§13.1 采纳率实测 **7 份 2 份已执行**（§4.1），而 `proposals/` 现有 **14 份**、平均 20KB+、最大 **52KB**，已确认未执行 ≥3 份（`meta-rules.md:975` 处方 2026-09-01 亲验仍在原位 + 两份 08-28）；同期 DS 侧 3 天 31 个 commit ⇒ **对方不缺执行力，缺的是「不用先读 52KB 再自己实现」**。🔴 **代价（lab 提出、owner 知悉后仍如此裁定 ⇒ 登记，⛔ 不再复议）**：§13.1 = `proposal 采纳率 × 采纳后指标改善命中率`，**lab 自己写规则又自己提交 ⇒ 采纳率恒 100% ⇒ 该指标不再测任何东西** ⇒ **采纳率分子自 2026-09-01 起按「不可判读」处置**，⛔ 不得再引用它宣称 lab 有效；要重获可读元指标须另立一个 lab 判不了自己的量（未设计，独立提案）。⚠️ 这与同日落地的 DS §M-GATE-FALSIFIABILITY **是同一个病**（一条控制在它该抓的形态上无法失败）—— 讽刺处：lab 同一天既给 DS 立了这条元条款，又让自己的元指标掉进同一个坑，区别只在后者是 owner 知情裁定。⚠️ 中间路线（lab 出 PR、owner merge）已提出并被否决，⛔ 别再自动提议。`AGENTS.md` §1 已当场回改（⛔ 不留一份已作废的规则给下个 session） |
| **N86.1** | ⚠️ **一次「拿当前状态推历史结论」的错误（留痕，⛔ 不删）** | 讨论边界时 lab 跑 `git branch --no-merged master` 得**空**，据此写下「『很多 worktree 没合并到 master』这个现象**不成立**，你很可能是把 lab 的 pin worktree 看成了待合并工作分支」。owner 当场订正：**那是他前一天让 Claude 清理掉的**。⇒ 错法是**拿「现在没有」推「从来没有过」** —— 清理过就当然是空的。⚠️ 与 `AGENTS` 推论四（起手基线 ⛔ 不是整格结论）同族，但主语不同：那条治「起手值被当成整格断言」，本条治「**当前状态被当成历史断言**」。⇒ 口径：凡用一个**当前态读数**去否定对方陈述的**历史事实**，必须先问「这个状态会不会已被人为改过」，改过则该读数对历史零信息量。补充读数（做完订正后补测，⛔ 不用来翻案）：近 3 天 master **0 个 merge commit** / 31 个普通 commit / reflog 有 `rebase (finish)` ⇒ 那些分支是靠 rebase / 人工消化的，不是 merge 进来的 ⇒ **owner 说的现象是真的，且当前解法是人工** |
| **N86.2** | 🟢 **DS 侧同日落地（直接 commit，非 proposal）—— 四道闸各拦一次，四次都拦对了** | 提交 `9685f5c1`（library-origin 手搓 FRAME 失明）+ `5a1dd87f`（M21.3 / M37.1 / M37.2 / M-GATE-FALSIFIABILITY / D1-D2 回固定层），已 push 到 gitea + github 双 remote。**闸的拦截记录**（这是本次最值钱的部分，⛔ 别只记「提交成功」）：① `stale-anchors` 抓到标题 `## 🔴 §M-GATE-...` 不匹配 `HEADING_RE` ⇒ 引用成孤儿；② `rule-load-map` 抓到新规则未进 §AI 读取指引路由表；③ `rule-inventory` —— 🔴 **去掉 emoji 后活源从 69 跳到 71**，即 `#### 🔴 M37.1` `#### 🔴 M37.2` 此前同样抓不到 ⇒ **lab 在写「别造闸的盲区」那条元条款的同时，正在造两个**；④ `acceptance-gate-coverage` [S2] 新增 #M21.3 把 unclassified 顶到 60 > BASELINE 59（按闸要求登记豁免、⛔ 没改 BASELINE，且 reason 里如实拆开「只有 effectivelyVisible 那半无被测物，前半截纯词法可 grep、属独立提案」）+ [S4] M37 Acceptance 3→5 条而守它的闸没跟上（按该闸自己的说明改**变更探测锚**，并写明新增两条本闸够不着 ⇒ ⛔ 改锚不是覆盖度承诺）。⚠️ **如实记两处瑕疵**：① DS 在本 session 内漂了两次（起手 `1e599f4a` → 中途 `b3790391` → push 前 `83e15e4d`），rebase 后 lab 两个 commit 换了 SHA，**第二条 commit message 里引的 `8c1fe2e9` 已是失效 SHA**（已推，⛔ 不改写历史，在此登记指向 `9685f5c1`）；② lab 曾建议「该跑机检 `audit-mockup-library-origin.mjs`」来核那两个按钮的来源库 —— **那条建议是错的**，该脚本恰恰对手搓形态失明，是 owner 转述的另一个 AI 的提案（②后半）抓住的 |

| **N87** | 🟡 **v3 判据双臂 —— 判定「⛔ 不可判读（基线异常）」，预注册当场咬住**（2026-09-01，⛔ 不属第二轮） | 走独立预注册 `PREREG_V3`（取数前 commit `9ddad1e`，⛔ 取数后一字未改）。两臂：`V2`=`jt-v1`（`templateHash=7f974b9ad9f69554`，与已发表报告逐位相同，**同 session 重跑**）／`V3`=`jt-v3`（逐单元标 attribute/shared，只计 attribute）；**两臂规则文本完全相同**（R1 原样）——扰动的是**判据模板**，与 runLadder 的轴正交。4 样本 × 2 臂 × n=5 = 40 次，`nulls=0/40`、`selfCountMismatch=0/40`。⚠️ **取数前的判别力盘点**（纯结构推导）：四格里 v2/v3 **异预测的只有 `must-not-hit-0/lcd-after` 一格**，两条 must-hit 在两版下都必然绿 ⇒ **取数前即排除出 discriminator**、只作回归护栏（这正是 N85.4 要求的动作，⛔ 不是取数后再踢）。读数：discriminator **V2 `[0,4,4,4,4]` = 1/5 = 20%**、V3 `[0,0,0,0,0]` = 100%；护栏 `lcd-before` V2 `[2,3,3,4,2]` / V3 `[2,2,2,2,2]` 均 100%、`must-hit-1` 两臂均 `[3,3,3,3,3]` 100%。⇒ 按 `decisionRule` 逐字命中 **「⛔ 不可判读（基线异常）」**（`V2 ≥ 1/5`）。🔴 **⇒ V3 那个 100% ⛔ 不得读成「v3 还没死」、⛔ 不得读成「A/B 标注可行」** —— 基线闸未过，臂间差没有参照系；⛔ 不许事后改读法、⛔ 不许挑 V3 那一栏单独宣布。⛔ 本轮从设计上就**不检验「v3 判据成立」**（同批样本已被逐条看过 ⇒ 过拟合），定位只是「A/B 标注这个操作稳不稳」= A 路的前置可行性检查。报告 [`reports/2026-09-01-trigger-t-v3-ab-split.md`](../reports/2026-09-01-trigger-t-v3-ab-split.md) |
| **N87.1** | 🔴 **那个 100% 拆开看本来也撑不住：5 次里只有 1 次真做了标注** | 逐次原始输出并排：**V2** 第 1 次 `unitsToModify: []` ⇒ cost=0 ✅、第 2–5 次列出 4 个共用段 ⇒ cost=4 ❌；**V3** 第 1 次列出**同样 4 个且全部标 `shared`** ⇒ A=0 ✅、第 2–5 次 `unitsToModify: []` ⇒ A=0 ✅。⇒ **V3 的 5 次里只有 1 次行使了 A/B 标注**，另 4 次 `A=0` 来自「列表本来就空」，⛔ 不是「标注把 B 排除掉了」——**两条路径给出同一个数，机制完全不同**，即「`must-not-hit` 单独存在无法自证判别力」（N79.2）在本器上的同型发作。⇒ 即便基线闸过了，该 100% 里**至多 1/5 携带关于 A/B 标注的信息**。⚠️ 两臂第 1 次都异于第 2–5 次**但方向相反**（V2 首空其余满、V3 首满其余空）⇒ ⛔ 不可归因为预热或调用间污染那种单向机制；朴素读法是「模型对『这 4 个共用段要不要跟着改』本身就不稳」，而 v2 的方向反转正来自把这 4 段计进总数 —— ⚠️ 这是**观察**，⛔ 不是判定的一部分。🟢 **唯一正面观察（⛔ 不是证据）**：那唯一一次真做标注时，4 个共用段**全标对了 `shared`**（文首导读段／现存未收敛文案登记／组件与视觉（所有场景共用）／维护约定），与已发表报告 §3 手工拆的 A/B 完全一致 —— 但 **n=1** 且落在已判「不可判读」的批次里 |
| **N87.2** | ⚠️ **本轮新登记的两条预注册缺口（⛔ 只登记、⛔ 不追溯改代码，同 N84.2/N85.4 时序纪律）** | ① **`labelStabilityRule` 对「总数变化」结构性失明**：它只钉「五次 **attribute** 集合是否相同」，而 discriminator 五次 attribute 全是空集 ⇒ 报「完全相同 🟢」，**总数从 4 变到 0 一个字没报** —— 而本轮最要紧的事实（5 次里只有 1 次真做标注）恰恰只存在于后者。🔴 讽刺处：这正是同日落地进 DS 的 `M-GATE-FALSIFIABILITY`（凡闸必须说得出什么输入会让它红）所治的形态 —— 本条稳定性检查在「模型压根没列单元」这个输入上**无法报警**。下一版须**同时钉 attribute 集合与 unitsToModify 全集**。② **`nullInstrumentRule` 过宽**：它在 `lcd-before`／`must-hit-1`／`oneshot` 三格都触发，但那三份文档 **A==总本来就是正确答案**（`lcd-before` 手工拆即 `A=2, B≈0`）⇒ 把**正确行为**判成「量具未生效」。⚠️ **它没污染本轮判定**：discriminator 那格 `attrSets≠totals` ⇒ 该支未触发，本轮走的是基线异常支。下一版须改成「A==总 **且** 该文档存在共用段」，后者需独立认定 |
| **N87.3** | 🔴 **一条独立于 v3 的读数：`lcd-after` 在原模板下 30 次里首次出现 `0`** | `must-not-hit-0/lcd-after` 在 `jt-v1` 下的历史全部读数：08-31 R1/R2/R3 `[4,4,4,4,4]`／`[4,4,7,4,4]`／`[4,4,4,4,4]` · 09-01 R1/R4 `[4,4,4,4,4]`／`[4,4,4,4,5]` · **09-01 V2（本轮）`[0,4,4,4,4]`**。⇒ 跨 **30 次**首次出现 `0`；此前 25 次分布 `{4:23, 5:1, 7:1}`、方向正确率恒 0%。🔴 **本条须单独登记、⛔ 不得当作 v3 的证据**（`decisionRule` 第一支逐字要求）。它说的是：**该样本在原模板下的读数并非此前以为的那样确定**。⚠️ **顺带削弱 N85.3**：那条「方向正确率跨 session 可复现」当时的证据之一正是 `must-not-hit-0` 两轮恒 0%，本轮它出现 1/5 ⇒ **N85.3 ⛔ 不撤回**（它是关于 R1 档的），但「方向可复现」的**强度须下调**，且引用时必须带上本轮这次例外 |
| **N88** | 🟢 **v4：A/B 标注在无歧义合成样本上 5/5，三闸全过 —— 但 🔴 射程比字面窄得多**（2026-09-01，⛔ 不属第二轮） | 走独立预注册 `PREREG_V4`（取数前 commit `6cce31b`，⛔ 取数后一字未改；⛔ 单臂，本轮**不做臂间差**）。🔴 **⛔ 没有照 N87 交接字面去「重设计 discriminator」，理由是取数前的纯结构推导**：`must-not-hit` 形态下两版异预测 ⟺ 总数>0 且 `A==0` ⟺ **列出的单元全是 shared**，而那**正是 v3 判据定义里「应当判 0」的形态** ⇒ v3 在它上面变绿是**构造保证、零信息量**（`PREREG_V3.decisionRule` 早已逐字承认「该格正是 v3 照着设计的那个病灶，变绿接近构造保证」）；且全 shared 样本模型**一律标 shared 就能蒙对**。⇒ 改测更前置且**目前真未知**的那件事：`attribute`/`shared` 二分能不能被可靠做出来 —— 这也正是 `PREREG_V3.labelStabilityRule` 逐字写的下一步（「阈值留给看到分布之后的**下一份**预注册」）。样本 `mixed-index/synthetic`：**半重构中间态**（条目已自包含、索引层与编号层仍集中式，⛔ 照真实病灶造 —— 那是 `lcd-before`→`lcd-after` 之间真实存在过的过渡态），`attribute` 恰 1／`shared` 恰 4，§7 维护约定**强制**新条目插进条目区末尾 ⇒ 编号顺延必然发生 ⇒ ⛔ 列不出空表。读数：三道前置闸（`emptyList` 非空 5/5・`nullInstrument` A==总 0/5・`unanchored` 失配 0/5）**全未触发**，主判据 **pass 5/5 ≥ 4/5** ⇒ 命中「🟢 A/B 标注在这份文档上可靠」。`attribute` 侧**极稳**：A 恒 `[1,1,1,1,1]`、5 次都且只有 §1 对照表被标 attribute、**零误标**（`falsifiability` 写死的两种变红输入一次都没出现）。🔴 **⛔ 射程**：量到的是「**lab 自己造的、照无歧义造的合成样本**上的表现」= **干净条件下的能力上界**，⛔ **不是**真实文档表现（真实文档见 N87.1：5 次里 4 次连单元都不列）；⛔ 不得外推到任何未测文档、⛔ 更不等于「v3 判据成立」。旧三份样本本轮 ⛔ 不跑（V3 臂 attribute 集合已在 N87 报告逐条看过 ⇒ 对本量已是训练集，N80.1）。报告 [`reports/2026-09-01-v4-label-stability.md`](../reports/2026-09-01-v4-label-stability.md) |
| **N88.1** | 🔴 **最值钱的一条：A/B 标注那一层稳，但上游「列举哪些单元」那一层不稳 —— 而它是 v2/v3 共同的地基** | `#1` 只列 3 个单元、`#2–#5` 列 5 个。`#1` 逐字**故意**排除两个（「不需要改动的：§2、§3、§4（已有条目单元本身不动）、**§5 术语表、§6 判定口径**」），而**同一次回答里它又承认顺延确实发生**（「原 §5/§6/§7 顺移为 §6/§7/§8，这两个交叉引用编号失效，需改」）⇒ 分歧 ⛔ 不在「顺不顺延」，在 **「标题编号顺延本身算不算『修改已存在的部分』」**：`#1` 认为只有**内文写死的交叉引用**才算（故只列 §7 与导语），`#2–#5` 认为标题编号顺延本身就算。🔴 **这是 `buildPromptV3` 第一问的歧义，⛔ 不在 A/B 标注那一层**。主判据按预注册「**未列出的不罚**」⇒ `#1` 仍 pass、⛔ 判定不变。⇒ 但要紧处在于：**v2 与 v3 的 `appendCost` 全都建立在这一层之上** —— v3 修的是下游（怎么数已列出的单元），本轮说**上游（列举哪些单元）在一份照「无歧义」造的合成样本上就已经会分歧**。⚠️ 这削弱「v3 能消掉 `lcd-after` 方向反转」的预期，⛔ 但 ⛔ 不得读成「v3 死了」——本轮从设计上就不检验 v3。⇒ 下次取数前须让第一问**消歧**；⚠️ 修了它 ⇒ **既有全部 `appendCost` 读数的射程都要重估**，⛔ 不是小改动 |
| **N88.2** | ⚠️ **`labelStabilityRule` 报的「不稳」有一半是量具假象（⛔ 只登记、⛔ 不追溯改代码）** | 它报 ① `unitsToModify` 全集跨 5 次不同 ② `attribute` 集合跨 5 次不同。**②是假的**：A 恒为 1、5 次标的都是同一个对照表，「不同」只因**措辞抖动**（`§1 各告警码生效版本对照表` vs `1. 各告警码生效版本对照表`）⇒ 🔴 **该条按原始字符串比集合、⛔ 没做归一化**。按锚词归一化后：`#2–#5` 是同一个 5 元集合（四次完全一致），实质不稳的**只有 `#1`**（即 N88.1 那条），②那一侧**根本没有不稳**。⇒ 下一版须**按锚词归一化后再比集合**。⚠️ 与 N87.2 缺口①同族：**量具报的东西和要问的东西不是一回事** —— 上一轮是「只看 A 那侧、对总数失明」，这一轮是「看了两侧但比错了粒度」。⛔ 时序纪律同 N84.2/N85.4：数据已取完，⛔ 只登记不改 |
| **N88.3** | ⚠️ **锚词交叉真的发作，而取数前自检②漏了这个必然形态（⛔ 往「更好」方向的修正，⛔ 不得用来论证任何结论）** | `#3`/`#5` 的导语单元被记「未匹配」。原因：模型给的 unit 名 `导语（生效版本见 §1，判定口径见 §6，维护约定见 §7）` **同时含 `判定口径` 与 `维护约定` 两个属于别条的锚词** ⇒ `matchMixedIndexUnit` 命中 ≥2 条 ⇒ fail-closed 记未匹配。⚠️ **这在导语上几乎必然** —— 导语内容本来就是交叉引用别的章节。🔴 自检②只检了「锚词两两不交叉」，⛔ **没检「一个 unit 名同时命中多条」**。**亲验原始 JSON**（⛔ 不靠推测）：这两次导语**实际都标了 `shared`**、与钉死答案一致 ⇒ 若没被 fail-closed 吃掉，这两次是 **5/5 全对**而非 4/4。⇒ ⛔ 判定不变（都已 pass），但**实际正确率比记录的更高** —— ⚠️ 正因为它是往「更好」方向修正，⛔ **不得用它去论证任何结论**，只登记量具缺口。⇒ 下次自检须补此形态 |
| **N88.4** | 🟢 **N87.3 获得独立复现：`lcd-after` 在 `jt-v1` 下又出一个 `0`（⛔ 观察项，不参与判定）** | 本轮观察项 `must-not-hit-0/lcd-after` V2 = **`[4,0,4,4,4]`**。累计 `jt-v1` 下全部读数：08-31 R1/R2/R3 `[4,4,4,4,4]`／`[4,4,7,4,4]`／`[4,4,4,4,4]` · 09-01 R1/R4 `[4,4,4,4,4]`／`[4,4,4,4,5]` · 09-01 V2 `[0,4,4,4,4]` · **09-01 v4 `[4,0,4,4,4]`** ⇒ 跨 **35 次共 2 次 `0`**。🟢 **N87.3「该样本读数并非此前以为的那样确定」不再是孤例** ⇒ ⛔ 不能再当一次性异常搁置。⚠️ **⛔ 但不许读成「最近变了」**：前 25 次 0 个、后 10 次 2 个这个模式 **n 太小** —— 若真实率就是 2/35≈5.7%，前 25 次一个都不出现的概率 ≈ `0.943^25` ≈ **23%**，毫不稀奇 ⇒ ⛔ 不得断言时间趋势、⛔ 不得断言两轮间发生了什么变化。⇒ **N85.3 强度须再次下调**（N87.3 已下调过一次），⛔ 仍不撤回（它是关于 R1 档的），但引用时须同时带上**这两次**例外 |
| **N89** | 🔴 **`lcd-after` 的 `appendCost` 里 100% 是章节编号顺延 —— 那两个 `0` 不是噪声，是第一问的第二种读法**（2026-09-01，事后解剖既有 raw，⛔ 零新取数、⛔ 不参与任何判定） | owner 2026-09-01 批准读 raw（代价见 N89.2）。⛔ 只读两个 `0` 证不出东西 ⇒ 读的是 `judge-v4-6ac56de2/V2` 全 5 次（`[4,0,4,4,4]`）+ `judge-v3-6ac56de2/V2` 全 5 次（`[0,4,4,4,4]`），同 `templateHash 7f974b9a…`、同文档、同臂，**最干净的组内对照**。**前提已亲验**：`buildPrompt`（v1/v2，[`adapters/llm-judge-container.mjs:538`](../adapters/llm-judge-container.mjs#L538)）与 `buildPromptV3`（同文件 `:573`）的**第一问逐字相同**，含定义句「为了让新条目完整生效，必须去改动的、已经写好的段落或表格」——两版只在尾部 JSON 形状与 A/B 标注段不同 ⇒ v1/v2 的 raw 是关于**同一个第一问**的直接证据。读数：**8 次 `4` 列的永远是同 4 个单元**（导语 `§6.2` 指针 · `§4` · `§5` · `§6`），**逐字全部由编号顺延引起、零内容改动**（v4 #1 自述「必须改的已有部分（**全部由章节序号冲突引起**）」）；**2 次 `0` 都识别到了编号顺延并明确判定它不算**，v3 #1 逐字「**这是编号位置问题，与新条目内容是否完整生效无关**（追加到文末即无此项）」——它引的正是 prompt 自己那个词「**完整生效**」。⇒ 🔴 **10/10 对事实毫无分歧（内容层零改动），只对定义有分歧** ⇒ `4` 与 `0` 是宽读法与窄读法，⛔ 不是对与错、⛔ 不是随机噪声。⚠️ 两个 `0` ⛔ 不等质：v3 #1 是干净窄读法（点了 `§6.2` 指针再排除）；v4 #2 是窄读法 **+ 漏看**（把抬头判成「不含逐场景内容」，没注意 `§6.2` 指针会失效）⇒ 机制同一、完整度不同。⇒ 与 N88.1 合流：那边是合成样本上的同一个歧义，这边是真实文档上的，**同一处措辞**。⚠️ ⛔ 不改判 N88.4 的禁令：本条给的是**机制**，⛔ 仍不得断言时间趋势（真实率未知，且现在看它是双峰读法而非围绕单一真值的误差） |
| **N89.1** | 🔴 **由 N89 直接推出的两条：① `must-not-hit-0/lcd-after` 的期望值有病 ② `buildPromptV3` 第一问「⛔ 不修」** | ① **该样本一直在惩罚读法、不在惩罚结构**：期望 `appendCost==0` **只在窄读法下成立**，而这份文档的结构其实是好的（模型 10/10 认同内容层零改动），宽读法下它照样得 4 分 ⇒ 8/10 判红，**红的不是被测对象**。⛔ 取数后不许改判据（N84.2/N85.4 时序纪律）⇒ 这是**下一份预注册**的输入，⛔ 不是现在动手；修法二选一（换样本使插入点在文末 ⇒ 不触发顺延／改期望值），⛔ 留给 owner。② **⛔ 不修第一问**（lab 建议，owner 2026-09-01 询问后给出）：**(a) 买不到东西** —— 一个单元「只因编号变了」被列出，按 v3 自己的定义**必然是 `shared`**；attribute 单元（要多一行）两种读法都得列 ⇒ `appendCostA` 两读法下相同。证据二则：N88 合成样本 A 恒 `[1,1,1,1,1]`（total 3↔5 抖动全落 shared 侧）+ 本条真实文档 8 次列的 4 个单元全是 shared 类。**v3 的「只计 attribute」本身就是这个歧义的解药**，去 prompt 里消歧是重复施工。**(b) 代价确定** —— 改它 ⇒ `templateHashV3` 变 ⇒ 既有全部 v3 读数（含 N88 那个 🟢，`c6a057f960ebc584`）与新读数**不可并池**，等于作废重取。**(c) 最要紧：该歧义现在是资产不是负债** —— 它是 **v2 失效的完整机制**，也是 v3 存在理由的直接证据（同一个第一问：v2 把顺延算进总数 ⇒ 读数被定义歧义 100% 占满；v3 按定义滤到 shared ⇒ 主量不动）。消掉它，就再也观察不到 v2/v3 在这一层的分离。⚠️ **本条的洞（⛔ 显式登记）**：「A 不受影响」在 `lcd-before` 上是**结构论证**（索引表加一行属内容改动，窄读法也得列），⛔ **没有读数**支撑 —— 它须由下条那个实验来检验 |
| **N89.2** | ⚠️ **本条读数的代价与它指出的下一个实验** | **代价（N80.1）**：`lcd-after` 在「推理模式/读法」这个维度上**已成训练集** —— 污染面 ⛔ 不止 owner 批准时说的那两个 `0`，是 `judge-v3-6ac56de2/V2` 与 `judge-v4-6ac56de2/V2` **两批共 10 次的 raw**（扩大理由已当场说明：只读 `0` 无对照 ⇒ 证不出「窄读法是 `0` 独有」）。⇒ ⛔ 今后不得用这两批构造任何关于「模型怎么读第一问」的判据。**下一个实验（⛔ 尚未预注册、⛔ 未取数）**：v3 双臂跑 `lcd-before`/`lcd-after`，看 `appendCostA` 还反不反转。🟢 它 ⛔ 不是构造保证 —— 有机制假说撑着且**两种结果都有信息量**：若 v2 的方向反转全由编号顺延造成 ⇒ v3 应当**不反转**；若 v3 照样反转 ⇒ attribute 侧另有病，v3 这条线须重估。⚠️ 取数前须一并写进预注册的还有 N88.2（按锚词归一化后比集合）、N88.3（自检②补「一个 unit 名同时命中多条锚词」）、以及仍未解决的 `PREREG_V4.ambiguityRule` 计数段歧义（上一轮靠剔除样本绕开，⛔ 不是修好了） |
| **N90** | 🔴 **两件待办 owner 双双裁定「⛔ 不做」—— 自查当场撞上推演①与②；本轮 ⛔ 零取数、⛔ 零改代码、⛔ 未碰 DS**（2026-09-01，⛔ 不属第二轮） | DS HEAD **起手 `b5fcacdd` → 收尾重取 `b5fcacdd`**（AGENTS §996 推论四／§1173，本轮未改 DS，对方亦未动）。**① v3 双臂（`lcd-before`/`lcd-after`）⛔ 不跑** —— 撞推演①「输出有没有可能不是我预期的那个值？」：**`lcd-after` 侧 A=0 是构造保证**（N89 已亲验：8 次列的 4 个单元**全是 shared 类**、2 次窄读法**零列** ⇒ 宽读法 A=0、窄读法 A=0，两条路殊途同归）；**`lcd-before` 侧 A 恒定亦近乎构造保证**（索引表加一行属内容改动 ⇒ 两种读法都得列、都判 attribute）。⇒ 两臂**都**答「不可能不是预期值」⇒ 按纪律①「构造保证，别做」。**② `must-not-hit-0/lcd-after` 期望值 ⛔ 不改** —— N89.1 给的两个候选修法**都通向零信息量**：**(a) 换样本（插入点在文末 ⇒ 不触发顺延）** ⇒ 宽窄两读法合流 ⇒ 期望 `==0` 成立，但它成立是**因为构造**；且换完仍是孤立 `must-not-hit` ⇒ N79.2「单独存在时无法自证判别力」原样还在。**(b) 改期望为 `A==0`** ⇒ N88 已**逐字判过**这个形态（「列出的单元全是 shared ⇒ v3 判 0 是**构造保证、零信息量**」），改期望等于把那句话搬到本样本上。⇒ 🔴 **lab 建议：该格作为「判别项」已耗尽，应退役或降为观察项，⛔ 而不是修期望值** —— 修期望值是**继续给一个不能失败的格子上色**，与 §1.1 登记的 §13.1 采纳率、与 DS 侧 `M-GATE-FALSIFIABILITY` **是同一个病**。owner 2026-09-01 裁定：两件均 ⛔ 不做 |
| **N90.1** | 🔴 **修正 N89.2 / N89.1 的一处措辞错误 —— 登记比事实更强（留痕，⛔ 不删）** | N89.2 逐字把 v3 双臂记作「**⛔ 尚未预注册、⛔ 未取数**」，N89.1 把那个洞记作「A 在 `lcd-before` 上只是结构论证、**⛔ 没有读数**」。**两处都不准**：N87 那轮**已在 v3 下同 session 跑过这两格**，[`reports/2026-09-01-trigger-t-v3-ab-split.md:36-40`](../reports/2026-09-01-trigger-t-v3-ab-split.md#L36-L40) 表里印着 `must-hit-0/lcd-before` **V3 逐次(A) = `[2,2,2,2,2]`**、`must-not-hit-0/lcd-after` **= `[0,0,0,0,0]`**。⚠️ ⛔ **不拿它当结论**（N87 整轮判「⛔ 不可判读（基线异常）」；且纪律 ⛔ 禁止往轮读数顶替同 session 重跑）—— 它**只用于评估「再跑一遍能买到多少信息」**，答案是趋近零。🔴 **洞的准确措辞应是**：`lcd-before` 上五次 A **完全一致 ⇒ 五次里一次窄读法分岔都没出现** ⇒「A 不受歧义影响」是**没被检验到**，⛔ 不是「没有读数」。⇒ **这个区别直接决定下一步**：补洞要的是**一个能让 A 在两种读法下真的分岔的样本**（某单元只因编号顺延被列出、却可能被标 attribute），⛔ **不是**把同一对文档再跑一遍。⚠️ 同族：与 **N86.1**（拿当前状态推历史结论）同型 —— 都是**交接/登记的措辞强于它背后的事实**，且都在下一轮被当作前提直接引用 ⇒ ⛔ 登记「未取数」「无读数」这类**判否**断言前，须按 AGENTS §996 推论二**跑完检索面、不截断** |
| **N90.2** | ⚠️ **owner 问「DS 侧 mockup 视觉语言一致性解决了吗」⇒ 答：lab 从未立项，本轮零涉及** | 判否结论，检索面**已跑完、⛔ 未加 `head`/`-m` 截断**（AGENTS §996 推论二）。lab 全仓 **⛔ 没有**任何以「视觉语言一致性」立项的课题或处方；最接近的只是若干按**「闸覆盖」**角度的散记：`audit-mockup-colors.mjs` 覆盖 `#M23.18` / `#M23.18.1` / `#M23.8.1`（[`proposals/2026-08-31-unclassified-67-fix-directions.md:255-258`](../proposals/2026-08-31-unclassified-67-fix-directions.md#L255-L258)，三条 **items 均 0**）、[`proposals/2026-08-28-variant-axis-rule-gap.md:55`](../proposals/2026-08-28-variant-axis-rule-gap.md#L55) 的 C4「Brand color vs M23 annotation accent 不能混用」🟢 已上闸。⇒ ⛔ **它不是 lab 的未决项**（唯一命中「视觉语言」四字的是 [`docs/2026-08-28-review-infra-plan.md:571`](2026-08-28-review-infra-plan.md#L571) Step 4「报告索引页复用体检报告的视觉语言」，Step 4–7 **全部 `[x]` ⇒ 那件已完成**，且与 DS mockup 无关）。⇒ 要把它变成体检课题属**新立项**，须走独立预注册，且 ⛔ 立项理由不得是「确定有产出」，先答「它回答哪个目前未知的问题」 |
| **N91** | 🔴 **再修 N90.1 的措辞：补洞要的 ⛔ 不是「造一个新样本」，是「一对真实文档」—— 而受控勘察实测：这个前置资源现在拿不到**（2026-09-01，⛔ 零取数、⛔ 零改代码、⛔ 未碰 DS 与 TVU Pack） | DS HEAD **起手 `b5fcacdd`**。**① 措辞修正（推演②命中，⛔ 留痕不删）**：N90.1 逐字写「补洞要的是**一个能让 A 在两种读法下真的分岔的样本**（某单元只因编号顺延被列出、却可能被标 attribute）」。核 [`buildPromptV3`](../adapters/llm-judge-container.mjs#L573) 逐字定义 —— `attribute` = 「文档里每多一个条目，它就得**多一份内容**」／`shared` = 「要不要改**与文档里有几个条目无关**」 ⇒ 「只因编号顺延要改」的原因是编号位置重排、⛔ 不是「多一份内容」⇒ **按定义必然 `shared`**（这正是 N89.1(a) 已逐字写过的话）。⇒ 🔴 **该形态按「定义上让 A 分岔」去造 ⇒ 撞推演①、构造保证、别做**；只有读成「检验模型会不会**误标**」才不是构造保证。⚠️ **但那个形态 N88 已经跑过了**：`mixed-index` 样本 §7 维护约定强制新条目插条目区末尾 ⇒ **编号顺延必然发生**，读数 A 恒 `[1,1,1,1,1]`、**零误标**、5 次都且只有 §1 对照表被标 attribute ⇒ 再造一个**合成**样本 = 高度可预期地复现 N88，逼近零信息量。⇒ **准确措辞**：未知① 剩下的真未知是「**在真实文档上**模型会不会误标」，⛔ 不是「造一个新样本」。**② 由此收束（本条最值钱的一句）**：未知①（A 会不会分岔）与未知②（v2 方向反转可否复现）**不是两件事** —— 二者共享同一个前置资源：**一对未被 lab 看过的、真实的重构前后文档**。有它 ⇒ 一次取数同时喂两个问题；没有它 ⇒ 两条都动不了，⛔ 而不是退回去造合成样本（那条路 N88 已走完）。**③ 受控勘察读数（owner 2026-09-01 授权；⛔ 全程只看文件路径 + commit 标题，⛔ 未看任何 diff、⛔ 未读任何文档内容 —— 免得把候选看成训练集 N80.1）**：⚠️ 先纠一处**交接与代码不符**的前提 —— `lcd-before`/`lcd-after` 来自 **TVU Pack** 仓（`PACK` 常量 [`llm-judge-container.mjs:716`](../adapters/llm-judge-container.mjs#L716)：`83db51d:docs/specs/lcd-message-copy.md` → `d885d72:docs/specs/lcd-message-strings.md`），⛔ **不是 DS 仓** ⇒ 候选池首先在 TVU Pack。**口径 A（TVU Pack 全仓 tracked `.md` = 82 份，⛔ 未加 `head`/`-m` 截断）**：多时点（≥2 commit）**9 份**，其余 73 份单 commit ⇒ **结构上不存在前后两个时点**。9 份逐条读 commit 标题：**唯一一次结构重构就是 LCD 那条线**（`d885d72` 标题逐字 `restructure the strings registry around self-contained scenarios`）= `lcd-before`/`lcd-after` 本身，**已用尽 + 已按 N89.2 污染**；`lcd-canonical-spec.md` 的 3 个 commit 里 2 个（`83db51d`/`a9de0d9`）**与 LCD 线是同一批 commit** ⇒ 同源、⛔ 不算独立候选；其余 6 份**无一是结构重构**（roaming-access = 记录 discoverability 轮次 + 记录规则回流；v4-2392 = 订正 B-COVERAGE 归因；test-signal = 追加 CT1b 状态 D45；retrospect = 补记 §M49.1 收口；REQUEST-INDEX 与两份 handoff 均为同一批 PRD 轮次带出）⇒ 🔴 **口径 A 判否：可用候选 = 0**。**口径 B（DS 仓 tracked `.md` = 397 份）**：`--grep` 重构语义（`restructure`/`self-contained`/重构/拆分/自包含，全仓不截断）确有 ~60 条 commit，但 ⛔ 绝大多数是代码/架构/STATUS 结构重排，**不是「条目登记类文档从集中式改成自包含」这个特定病灶**；更要命的是 DS 仓文档正是 lab 的体检对象、已大面积读过 ⇒ 「未被看过」在 DS 仓上基本不可满足。⚠️ **口径 B 的判否强度须弱于口径 A（⛔ 不许写成「已证明为 0」）**：本条只做了关键词检索，⛔ 未逐份核 397 份的历史、⛔ 未逐份核「lab 是否读过」——这正是 N90.1 教的「⛔ 登记不得强于事实」。⇒ 🔴 **结论：两条真未知双双卡在同一个拿不到的前置资源上，v2/v3 这条线在补到新文档之前事实上停摆** —— ⛔ 这 ⛔ 不等于「v3 被证伪」，是「问不下去」。⇒ 出路交 owner 拍，见下方 §30.5.3 |
| **N92** | 🔴 **owner 裁定 v2/v3 线【1 停摆】—— 并撤回 lab 上一条建议里的三处病（留痕，⛔ 不删）**（2026-09-01，⛔ 零取数、⛔ 零改代码、⛔ 未碰 DS 与 TVU Pack） | ⚠️ **DS HEAD 本条起手 `2a26955b`，⛔ 不是 N91 收尾记的 `b5fcacdd`** —— 对方侧在两条之间动了 DS（`feat(tokens): 30 个 Figma FLOAT 变量接进 CSS`）⇒ 「连续三轮未改 DS」这句 ⛔ 到此为止，AGENTS §996 推论四要求的重取**当场兑现了它的用处**。**① 撤回的那条建议（§30.5.3 已划删除线保留）有三处病**：**(a) 🔴 最重：「建议 2 或 1」不是建议，是把二选一又丢回给 owner** —— owner 追问「你推荐一个值」才暴露。⚠️ 与 memory `priority-not-by-deliverability` 同族但更隐蔽：那条治「拿可交付性当排序理由」，这条治**列了选项却不排序，还自称已给建议**。**(b) 出路 2 从未被推演① 检验过，一检就出局**：它的前置约定「重构理由独立于本实验」是关于**重构者动机**的断言，lab 手上**没有任何能让它失败的检验**（重构者必然知道文档要拿去做实验，否则不会特意留两个 commit）⇒ 🔴 **一条不能失败的控制**，与 §1.1 的 §13.1 采纳率、DS 侧 `M-GATE-FALSIFIABILITY`、N90 裁掉的那两件**同一个病**。⇒ 更要紧的一句：**2 里「可验证」的那个版本就是 3**（「重构发生在立项之前」是 git 时间戳可查、不依赖自陈）⇒ **2 与 3 的真区别不是「造 vs 等」，是「不可验证的独立性 vs 可验证的独立性」，2 只是 3 的作弊版**。**(c) 排掉 3 的理由内部不一致**：用「等待时长未知」当排序依据，而**同节限制二正是 lab 自己写的**「n=1、⛔ 不得据此推出频率」⇒ **拿一个刚判为不可知的量去排序**。3 的真问题在别处：它与 1 **本轮行动完全相同**（都零动作），区别只是「是否保留为未决项」。**② 裁定 1 的实质理由（⛔ 不是「操作上更省事」）**：**拿到样本也大概率买不到答案** —— 未知② 要求 v2 臂立得住基线，而现有读数指向它立不住：N87 实测 V2 discriminator `[0,4,4,4,4]` = **1/5** ⇒ 整轮按预注册逐字判「⛔ 不可判读（基线异常）」；N87.1 记**真实文档上 5 次里 4 次连单元都不列**；N88.1 记连 lab 照「无歧义」造的合成样本、上游「列举哪些单元」那层就已分歧。⇒ 换一对新真实文档，**最可能的结果是重演 N87**（基线闸不过、判不可判读、成本花掉、零信息）⇒ 2/3 的期望收益按此大幅折价。⚠️ ⛔ 这是**有读数支撑的风险预估、⛔ 不是读数本身**，⛔ 不得写成「已证明新样本上也会不可判读」。**③ 停摆的准确含义**：v2/v3 线 ⛔ **登记为「已耗尽」、⛔ 不是「待办」** ⇒ 下一轮交接**不再带这两条未知**。⛔ 停摆 **不等于** v3 被证伪（是「问不下去」，⛔ 不是「答案是否」）；⛔ **不作废** N88（干净条件下的能力上界）与 N89（v2 失效的完整机制）—— 那两条是独立成立的实测产出，**这条线已经产出过东西了**。**④ 🟢 重启条件（客观可验证，⛔ 不依赖任何人的动机自陈）**：若 TVU Pack 日后自然出现一次「登记类文档集中式→自包含」的结构重构，**且该 commit 的时间早于新立项时间**（判据：`git log --grep` 命中 + 比对 commit 日期与立项日期，两者都是 git 可查的客观量），届时**重新立项、走新预注册** —— ⛔ 不是把这两条未知挂着等。🔴 **这条判据能失败**（时间戳对不上就不许立项），这正是它区别于出路 2 那条约定的地方 |
| **N93** | 🟢 **补掉 §28.9(N59) 判出的存量缺口：9 份处方的「执行状态」栏 —— 🔴 亲验后 6 执行 / 2 未执行 / 1 走了别的路，并订正 §1.1 一句写反的推理**（2026-09-01，⛔ 不属第二轮） | DS HEAD **起手 `7fcca917`**（⚠️ 本轮交接给的 `2a26955b` 与 lab 首次重取的 `4b7e9724` **都已过期** —— 对话进行期间 DS 侧推了 6 个 commit（17:18→17:47），§996 推论四第三次当场兑现用处）。**全部判定在 pin `7fcca917` 的 worktree 上做（AGENTS §1 末段），⛔ 未读 DS 工作区、⛔ 未改 DS 一个字节。** **① 起因**：§28.9 判出「处方结构性没有『执行状态』栏」是回改缺口的**根因**，I 格只补了 4 份，**存量 9 份至今没补** ⇒ 「DS 侧还剩哪些没做」这份清单**结构上不存在**。**② 逐份读数（⛔ 全部不信处方正文的未来时态，逐条去 pin 上取证）**：🟢 **已执行 6**——`stale-anchors-codespan-gap`（`audit-stale-anchors.mjs:516` 逐字「文件路径（形态 C，2026-08-25 补）」+ `codeSpanTally` 分形态计数）· `chain-failfast-denominator`（`package.json:96`→`run-gate-chain.mjs:1` 逐字「**收集式 runner：跑完全部步骤，再决定退出码**」+ `:121-126` fail-closed 防回退）· `crosscheck-denominator-gap`（`gate-output-contract.mjs:267` 把 `checkedUnits===0` 提为第一顺位，`:273` 逐字「findings>0 与空分母**自相矛盾**」）· `claude-design-real-components`（三件配套全中：`:103` `CE_RUNTIME` · `:82`→`reference/17` · `:294` 立场翻转）· `webcomponents-types-entry`（🔴 **最硬的证据是豁免表空了**：`EXEMPTIONS = []`，而该闸 **S4 是 shrink-only** ⇒ **删得掉 = 该出口真有类型了**，⛔ 不是绕闸）· `retrospection-adr`（归档 **53→18 份**，删掉的 35 正是「35 份进 S2」那批；提炼产物 `archive-extracted-adr.md` 自陈「**提炼与删除在同一个 commit 里**」⇒ §1 不可换序的 extract-then-delete **守住了**）。🔴 **未执行 2**——`geometry-gate-denominator-defects` 的 **A**（`:320` 仍按 `WxH` 分组、丢弃面仍无登记）与 **A′**（`:750` `inScopeIds` 仍不含 state frame id）· `rule-text-decasing`（`docs/meta-rules.md:949` T 节内「实证 2026-08-31 TVU Pack LCD…」整段仍在判据节）。🟡 **走了别的路 1**——`variant-axis-rule-gap`：规则**确实入册了**（`component-affordances.md:159/266` 逐字「⛔ 同一表单/面板内不要 line 与 filled 混用」），但口径是 **owner 2026-08-31 另裁的「族由主题定」、⛔ 不是本处方 §3.1.1 拍定的口径 A**；且 §3.1.2 要求的 `§M-VARIANT` + `**Acceptance**` 段**未建**（全仓检索 `M-VARIANT` 命中的全是既有的 `M-VARIANT-CONSISTENCY`）⇒ **按处方自己的判据，这条规则不进对位闸分母**；§3.2 闸未挂；§3.3 的 `Pagination.vue:53/60` 硬切轴原样。**③ 🔴 一条最值钱的分项读数**：`geometry` 的缺陷 **B** 判 🟡「**只修了反方向**」—— DS 在 `:726-731` 逐字写下了本处方的语义（「"never looked" — the exact ambiguity this gate exists to remove」）并实现 `rowScanned = wantRows ? {…} : {}`，**但那是 controls-only run 不报 row 计数这一侧**；处方点名的另一侧仍在：`:693` `controls = wantControls ? … : []` ⇒ `--family rows` 下 `scanned.controls/buttons` **结构上恒 0**、`:856` **无条件打印** ⇒ **本处方标题「`scanned` 计数器的纪律只守了一半」在修完之后仍然成立，只是换了另一半。** **④ 订正 `AGENTS.md §1.1` 一句写反的推理（⛔ 留痕不删，⛔ 不是复议 owner 的边界改判）**：§1.1 逐字「采纳率恒 100% ⇒ **该指标不再测任何东西**」**是反的**。核真源 —— ⚠️ 元指标 ⛔ 不在 `AGENTS.md`、⛔ 也不在本文件（本文件 §13.1 讲的是「比例型指标两个地板」，**撞号**），真源是 [`spec:§13.1`](specs/2026-08-21-ai-ds-lab-design.md)，**逐字**「若处方**大多被采纳**但指标没动 → 错的是 lab 的诊断模型」⇒ 它要抓的形态**就是**「采纳率高 + 指标没动」⇒ 采纳率恒 1 使**前件永真**，元指标**塌缩到因子 2**，而因子 2（指标有没有真的动）**恰恰是靶心**。⇒ 现行口径：因子 1 恒 1 不携带信息（这一半原判成立、保留）；**因子 2 ⛔ 未作废，元指标即等于它**；其可判读前提是**承诺指标写在改动之前**（与预注册纪律同构）。⇒ 🔴 **「需另立一个 lab 判不了自己的量」这个独立提案 ⛔ 不成立、不立项**（前提是假的）。**⑤ 承诺指标存量读数（因子 2 的前提，检索面跑完、⛔ 未截断）**：9 份里 **7 份有验收/承诺节、2 份没有**（`geometry-gate-denominator-defects`、`rule-text-decasing`）。⚠️ **那 2 份恰好就是判为未执行的那 2 份** —— ⛔ **这是事后观察、⛔ 不是结论**：n=9、非预注册假设、且 `variant-axis` 有验收节照样只落地一半 ⇒ 按 §2.7「低基数离散指标在小 N 上最容易伪装成确定性」，⛔ 不得读成「没写验收节导致没被执行」。**⑥ 顺带查出三处登记面漂移**：`meta-rules.md` 已从 `docs/internal/` 迁至 **`docs/meta-rules.md`**（`AGENTS §1.1` 与 `rule-text-decasing` 引的 `meta-rules.md:975` 锚点失效）· `§13.1` 四处引用未标编号空间（应作 `spec:§13.1`，正是 §4 那条撞号教训的又一例、且这次撞的是自己）· 若日后按 `variant-axis` §3.1.2 补建 `§M-VARIANT`，会与既有 `M-VARIANT-CONSISTENCY` 混淆 ⇒ 建议改名 `§M-VARIANT-AXIS`，⛔ lab 不代拍。⚠️ **本轮判否强度**：全部结论**只由 pin 上的源码/文档判读得出**；`geometry` 那条闸要真跑需 `--file <fileKey>` 调 Figma REST（lab 明文禁止）⇒ **⛔ 未实跑任何 DS 闸**，⛔ 不得把「源码里缺陷仍在」写成「已实测缺陷会发作」 |
| **N93.1** | 🔴 **D4 改判「不做」（收益归零，⛔ 不是被否决）· D5-c 撞出「规则与组件互相矛盾」· 并订正 lab 自己引错的一处证据**（2026-09-01） | **① 订正（⛔ 留痕不删）**：`docs/2026-09-01-ds-side-open-items.md` 初稿把 `Pagination.vue:60` 的 `pageButtonStyle`（`rimless`/`filling`）当成处方 §2.3 的主证据 —— **引错了**，那是处方 **§3.3** 的「同型问题」。§2.3 的主证据在 **`:59`** `pageControlVariant = isSmall ? 'line' : 'filled'`，经 `:169`/`:232` 传给 `SelectBoxBase` 与 `Input`。两条都真实存在，初稿只报了后者却贴了前者的标签。**② D4 改判「不做」**：⛔ 理由是**收益归零、不是处方被否决**。处方 §4 **自己**逐字排掉了唯一能排优先级的理由（「DS 不改，也不阻塞 lab —— lab 已经绕过了这个问题」「目前已知的消费者只有 lab 一家 —— ⛔ **请不要拿它来排优先级**」）；而实测 `extractRuleT` 使用面（`grep -rn`，⛔ 未截断）**全部 6 处都在 [`adapters/llm-judge-container.mjs`](../adapters/llm-judge-container.mjs) 内**，服务的是 v2/v3/ladder 判据 —— **那条线已由 N92 裁定停摆** ⇒ lab 侧的绕过（`makeRuleVariant` R2/R3 档）**连跑都不再跑** ⇒ 收益从处方当时的「小」变成现在的「零」。⇒ 推演①：D4 改完**没有任何可测指标会动** ⇒ 它是**改完无法验证有没有用**的改动，按 §1.1 订正后的元指标口径（因子 2 是靶心）**不可判读**。🟢 **重启条件（能失败）**：`grep -rn "extractRuleT"` 出现 lab 之外的第二个消费者，或 v2/v3 按 N92④ 重启。**③ 🔴 D5-c 撞出的真问题**：`Pagination` 的 variant **按 `type` 定**，而 owner 08-31 已落地的规则是**「族由主题定」** ⇒ `type="Small"` 在深色主题下渲染 `line`，同页其他控件按规则应是 `filled` ⇒ **开箱即混用，且违反的是已经写下的规则**；检索面内（`component-affordances.md` Pagination 段 `:699-705` 完全没提 variant；`:159`/`:266` 附近无任何例外语）**无豁免登记**。⚠️ **判否强度：中等** —— ⛔ 未逐份核 DS 全部 397 份文档。⇒ 不治的代价是**这条规则在它最该抓的形态上抓不到自己的组件** = `M-GATE-FALSIFIABILITY` 那个病 ⇒ **D5-c 应排在 D5-a/D5-b 之前**。⚠️ 且 **D5-b ⛔ 不能照处方 §3.2 原样挂闸** —— 那条判据（「同一交付内 ≥2 种取值 ⇒ FAIL」）是**口径 A 时代**的，与「族由主题定」不匹配 |
| **N93.2** | 🟢 **owner 裁定「保留」—— 🔴 推演② 当场省掉一整轮：它不是新开豁免，是回到口径 A 里本来就有的那半句**（2026-09-01） | owner 逐字答「**保留**」⇒ `type="Small"` 保持 `line`，`Pagination.vue:59` ⛔ 不改。⚠️ **如实记：owner 直接选定、未另述理由**（与处方 §3.1.1 记 08-28 那次同形）⇒ ⛔ 别读成「owner 论证了 Small 该用 line」；lab 提的两个候选理由（视觉意图 / 历史遗留）**都未被确认**，⛔ 不得代填。**① 🔴 推演② 命中**：lab 上一条把「保留」预设成「给 Pagination 开个案豁免 ⇒ 要填豁免表的 `reason` 字段 ⇒ 而 owner 没给理由 ⇒ 卡住」。核处方原文后**这条链整条不成立** —— 处方 §3.2 逐字：「**复合组件内部控件豁免**（口径 A 已拍定）。⚠️ 豁免的判定必须走**组件边界**（是不是某复合组件的后代），⛔ **不得靠「组件名白名单」** —— 白名单会在加新复合组件时静默失效，且失效方向是**放行**（fail open）」。⇒ `Pagination` 内部的 `Input`/`SelectBoxBase` **正是复合组件内部控件**，⛔ 不是「同一表单内并列放置」的控件 ⇒ **08-31「族由主题定」之所以与组件冲突，是它落地时漏掉了口径 A 的这半句，⛔ 不是 Pagination 违规**。**② ⇒ `reason` 问题自动消失**：豁免走**结构判定**、⛔ 不进豁免表 ⇒ ⛔ 不需要 `since`/`reason`/`fixDirection` ⇒ **owner 未述理由 ⛔ 不阻塞落地**。⚠️ 这是**推演② 第 N 次拦下一个自造的障碍** —— 上一条差点让 owner 去补一个根本不需要的字段。**③ ⚠️ 代价（连同裁定登记，⛔ 不复议）**：类别级结构豁免 ⇒ **任何复合组件内部的混用都合法** ⇒ 该闸在「复合组件内部」这个形态上**不会失败**。⛔ 这不是新病，是**口径 A 本身的取舍**（处方 §3.1 已记「A 是 C 的子集、**是路径不是终点**」）⇒ 要收紧须升口径 C，属新立项。**④ 最终口径（三次裁定合并）**：`族由主题定 ∧ 直接放置的控件 variant 须匹配当前 [data-theme] ∧ 复合组件内部控件豁免（走组件边界，⛔ 不用白名单）`。**⑤ 🔴 由此立即该做、且与闸无关的一件事**：`component-affordances.md:159`/`:266` 那两条**只写了混用即 bug、⛔ 没写复合组件豁免半句** ⇒ **规则真源现在是自相矛盾的**（照字面读 Pagination 当场违规，而 owner 已裁它不改）⇒ 两处须补豁免半句，⚠️ **与闸挂不挂无关、⛔ 不应等 D5-b**。草案见 [`docs/2026-09-01-ds-side-open-items.md`](2026-09-01-ds-side-open-items.md) D5-c 裁定段 ⑤ |
| **N93.3** | 🟢 **lab 首次行使 §1.1 新边界直接写 DS master —— §M-VARIANT-AXIS 上闸落地；并亲验 DS 已执行的 D1/D2/D3；🔴 且订正 lab 昨天给的判据形态（它要一个不存在的输入）**（2026-09-02） | DS HEAD **起手 `6a1f91c4` → 止 `2541423f`**（本轮 lab 自己推了 1 个 commit；期间对方推了 2 个：`ef80ffb0` connector · `a065506b` SoT）。**① 亲验 DS 执行的 D1/D2/D3（`6a1f91c4`，⛔ 不采信 commit message —— AGENTS §4）**：三条**逐条在位** —— D1 `:805-806` `inScopeIds` 已含 `stateScan.groups.flatMap(…f.id)` + `stateScan.rejectedIds`；D2 `scanned` 的 controls/buttons 已按家族条件化；D3 `collectStateFrameGroups` 改返 `{groups, rejected, rejectedIds}`、落单 size 计入 `rejected.singletonSize` 并留 id。**测试 62/62 绿**。🔴 **并造故障证判别力**（§30.5.2「凡输出空/零先证判别力」）：把 D1 的两行 `inScopeIds` 注入删除 ⇒ **2 条当场红且红在正确断言**（`inScopeIds.has('f:1')`）⇒ 还原后回归 62/62。⚠️ DS 亦**主动守住了边界**：commit 逐字「⛔ 分组键**未改**（仍是 WxH）——「状态帧允不允许不等高」是设计立场，不在本次范围」= 正是 lab prompt 划的那条线。**② lab 落地三件（⛔ 全程走独立 worktree，⛔ 未碰 DS 工作区）**：起手发现 DS 工作区**脏且有 staged 改动**（另一 session 在改 connector，且 `mockup-conventions.md` 正在其中）⇒ 按 CLAUDE.md 并行隔离纪律开 `lab/variant-axis` worktree，做完 rebase 到 `a065506b` 再 push ⇒ **⛔ 零风险卷入对方的 staged 内容**。落地：(a) `component-affordances.md:159/266` 补「复合组件内部控件不在此列」半句 —— 此前规则真源**自相矛盾**（照字面读 `Pagination` 违规，而 owner 已裁它不改）；(b) `mockup-conventions.md` 新增 **§M-VARIANT-AXIS**（含 Acceptance 段 + 按 §M-GATE-FALSIFIABILITY 写明「什么输入会让它红」+ 显式与既有 `M-VARIANT-CONSISTENCY` 划清）；(c) 判据真源 `scripts/audit-mockup-variant-axis.mjs` + 规则模块 + `index.mjs` 注册 + **14 条测试**。**③ 🔴 订正 lab 昨天给的判据形态（推演① 当场拦下）**：`N93.1` 逐字写「⛔ 不能照处方 §3.2 原样抄，正确形态是『variant 是否匹配当前 `[data-theme]`』」—— **那句是错的，它要一个不存在的输入**。实测：Figma 侧**没有程序化主题信号**，`detectFrameTheme` 只以**伪代码**形态存在于 `mockup-conventions.md:930`（M23.18 那套，供 AI 照着做），**全仓零实现**（检索面已跑完、⛔ 未截断）。⇒ 判据**退回处方 §3.2 原本的「同一交付内一致」**，⛔ 不判「是否匹配主题」。⚠️ **⇒ 处方 §3.2 是对的，lab 昨天的「改进」才是病** —— 同族于 `N92(b)`：一条**要不到的输入**和一条**不能失败的约定**，都是「看起来更严谨、实则做不了」。射程已写进闸头注释与规则节：**整份交付统一用错族这一形态本闸结构性抓不到**，是**已知盲区、⛔ 不是缺陷**，⛔ 不得把它的绿读成「符合『族由主题定』」。**④ 两处判别力由故障注入证明（⛔ 不是恒绿）**：把组件边界豁免的嵌套判定改坏 ⇒ **3 条红**；把切词等值比较换成子串匹配 ⇒ **2 条红**（`outline`/`unfilled` 被误归族）—— 后者钉住的正是 `N79.1` 记的**本仓栽过四次**的「关键词落在更长标识符内部」同型坑。两次均已还原 + 回归绿。**⑤ 🔴 lab 自己被闸抓到一次（如实登记，⛔ 不删）**：首版提交漏了处方 §3.2 早就写明的 `covers-acceptance:` 行 ⇒ 对照未改动基线实测 **`unclassified` 66 → 67（+1）** = **lab 亲手复制了处方 §3.1.2 警告的那个病**（「不配 Acceptance 对位就等于白写，这正是那 67 条的形成机理」）。补上 `// covers-acceptance: …#§M-VARIANT-AXIS [3]` 后 **`gated` 27→28、`unclassified` 回落 66**；rebase 到 `a065506b` 后终值 **`gated 28 · unclassified 59 = BASELINE 59`、闸 exit 0**。⚠️ **它是闸抓到的、⛔ 不是 lab 自查到的** —— 这是 §1.1 订正后**因子 2 的第一次实测**，且方向对 lab 不利，如实记。**⑥ 顺带零位移自查**：新节插在文件中部，`Acceptance~N` 是顺序编号 ⇒ 疑似 `N74` 那类 id 位移。逐条 diff 两侧 id 全集实测 **只多我这一条**（`#§M-VARIANT-AXIS`，走标题 slug、不占 `~N` 序列）⇒ **零位移**。⚠️ **未覆盖**：全量测试 3045 passed，唯一文件级失败 `demo-renderer-react.test.ts` 已用**未改动的 pin** 做对照证明是 worktree 缺 `dist-wc/` 构建产物（主工作区同一测试 14 passed）⇒ ⛔ 与本轮改动无关 |

> ### 30.5.1 ⚠️ lab 本轮的一次判断收窄错误（留痕，⛔ 不删）
>
> owner 先答「消费方是 Claude.ai/design」时，lab 查到 DS 自己的 SOP 真源三条实测
> （Claude Design 是**与 npm 并列的第三条分发轨道** · bundle 逐字「不提供 `.jsx`/`.d.ts`」·
> **实测访问不到内网 Gitea registry**），据此推断「React consumer 当前为空」并**建议降低本处方优先级**。
>
> 🔴 **那一步收窄错了** —— owner 随即澄清 Claude Design 只是这一类里的**一个样本**。
> 本地运行、能访问内网 registry 的 AI 工具不受该限制 ⇒ **§30.2 第 3 条的排序维持不变**。
>
> **教训**：拿「**某一个**样本走不通」推「**该类**为空」，是把样本面当成了总体面 —— 与第 27 条
> 「基数面 ≠ 缺口面」同型。⚠️ 而那三条关于 Claude Design 的实测**本身没错**，错的是从它们推出的那一步。
> （留档：Claude Design 自己确实不经过本入口；要让它用上真实组件是**分发**问题，属 owner 的产品决策，⛔ 不在本处方内。）

> ### 30.5.2 ⚠️ 2026-08-28 下半场：一条教训 + 一条**验证有效**的做法（⛔ 两者都记，不只记教训）
>
> **🔴 教训 —— 同一个 session 里两次栽在「没剥注释就 grep」**：
> ① 判定「分子面零改动」时只 grep 了闸本体与豁免表，漏了 `GATE_DIR` 是整个目录（N76）；
> ② 查风格轴时 `grep -l variant src/components/*/*.vue` 得出「**17 个组件有 variant prop**」，
> 实际 `Checkbox:45` / `Tab:193` / `Switch:37` 全是**注释**里的词、`Pill:106/111` 是
> `font-variant-numeric` **CSS 属性** —— 真实定义方只有 **2 个**。
> ⚠️ `AGENTS §3.3` 逐字写着「**先去注释再切**」，**同一天、同一 session 违反两次**。
> ⇒ 修法不是「下次记得」，而是**把两个坑钉成量具的 must-not-hit**
> （`must-not-hit-1/css-font-variant-excluded` · `must-not-hit-2/comments-never-counted`）——
> 靠自律记不住的东西，交给控制。
>
> **🟢 验证有效 —— 「结果为空时补阴性对照」这个动作，本轮用了两次，两次都值**：
> ① P5→P6 **全空 diff**：补「同一量具在 P4→P5 有 4 条迁移」+「P4→P6 传递性等于 P4→P5」（N75）；
> ② 风格轴对位 **0/2**：注入假规则验出 `0/2→2/2`，还原后回基线（N78）。
> ⚠️ 两处若不做，输出都长得**和「量具坏了」一模一样**，而且都会被写成「已复审，无变化」这种
> 看起来完成、实则无凭据的结论。
> ⇒ **固化为习惯：凡量具输出「空 / 零 / 无变化」，先证它有判别力，再报结论。**
> 这与第 27 条「计数≠归因」互补 —— 那条治「数对了但归因错」，这条治「数是空的但不知道为什么空」。

🟢 **顺带回答了 §30.2 第 4 条记账的那件事（n=1）**：本处方撞到的这条「有人管」的**是真在管的**
——豁免带 `since` / `reason` / `fixDirection` 三字段，且 `S4` shrink-only（修完不删豁免行则闸变红）。
⛔ **别据此推广到另外 24 条**：n=1 且是自选样本，非随机抽样。

> ### 30.5.3 🔴 N91 勘察的两条限制 + 三条出路（⛔ lab 不自行选，owner 拍）
>
> **限制一（口径 A 的判否只对「能不能取到」成立，⛔ 不对「有没有发生过」成立）**：
> TVU Pack 那 73 份单 commit 文档里 **71 份出自 `2c4ecd5 Initial commit`（2026-08-11 一次性导入）**。
> ⇒ 准确措辞是「**git 里没有可取的前后两个时点**」，⛔ **不是**「这些文档从没被重构过」——
> 它们进版本控制之前的历史根本不在库里，`gitShow(PACK, <sha>, <path>)` 这个取样方式够不着。
> ⚠️ 这与 **N86.1**（拿当前状态推历史结论）同型，写在这里就是为了不让下一轮把它读成后者。
>
> **限制二（⛔ 别据勘察断言「这类重构很罕见」）**：TVU Pack 全部历史只有 **20 天**
> （`2026-08-11` → `2026-08-31`），其间结构重构发生 **1 次**。
> ⇒ n=1、跨度 20 天 ⇒ 按 `AGENTS §2.7`「低基数离散指标在小 N 上最容易伪装成确定性」，
> ⛔ 不得据此推出频率，**出路 3 的等待成本是未知数、⛔ 不是「很久」**。
>
> **三条出路**：
>
> | | 做法 | 买到什么 / 代价 |
> |---|---|---|
> | **1. 停摆** | 承认两条真未知在缺样本下不可执行，v2/v3 线停在 N91，转别的课题 | ⛔ 不等于「v3 被证伪」，是**问不下去**。代价：这条线的既有投入不再产生新读数 |
> | **2. 造一对真实的** | 由 **owner 或 DS 侧**（🔴 ⛔ 不是 lab）挑一份 TVU Pack 登记类文档做一次真实的「集中式→自包含」重构；lab 全程 ⛔ 不看内容，取数时只走 `gitShow` 两个 sha | 🔴 **前置约定必须先立，否则样本是伪真实的**：重构理由须**独立于本实验**（那份文档本来就该重构）。若是「为做实验而重构」⇒ 重构者会无意识照 lab 的期望去改 = **把答案写进样本**，等于又一个合成样本，⛔ 且比 N88 更难察觉 |
> | **3. 等自然发生** | 下次 TVU Pack 真发生这类重构时再取 | 挂着不动、零成本，但**等待时长未知**（见限制二）。⚠️ 代价是它会让往后每一轮交接反复重提这两条未知，而每轮都答「还没有样本」 |
>
> ~~**lab 建议（⛔ 建议，不是裁定）**：owner 手上若**本来就有**一份该重构的登记类文档 ⇒ 选 **2**（并先把「重构理由独立于实验」这条写进预注册）；否则选 **1**。⛔ **不建议 3** —— 挂着等本身不产生信息，却会让「有两条未决真未知」这个状态无限期占着交接篇幅，与 §30.5 反复登记的「给不能失败的格子上色」是同族的自我安慰。~~
>
> 🔴 **⛔ 上面这段建议已撤回（2026-09-01 同日，owner 追问「你推荐一个值」后 lab 重跑推演，留痕 ⛔ 不删）——它有三处病，见 N92。** 一句话版：**「建议 2 或 1」根本不是建议，是把二选一又丢回给 owner**；而真跑完推演，**2 应当出局、3 的理由也写错了**。⇒ 裁定见 **N92**：owner 2026-09-01 拍 **1（停摆）**。
