# 触发器 T 判读器 · R4 档（剥掉存活抽象反例）—— 实施计划

> **For agentic workers:** 步骤用 `- [ ]` 勾选。
> ⛔ **本计划含新预注册常量 `PREREG_LADDER_R4`，必须「先 commit 再跑」**（N80.1 / N84.2 时序纪律）。
> ⛔ **扰动 must-hit 不全绿，不许发任何真实调用**（fail closed）。
> ⛔ **不改 `PREREG_LADDER`** —— 那是上轮已取完数的预注册，取数后修订即是作弊（N84.2）。

**Goal:** 补上 [`reports/2026-08-31-trigger-t-decase-ladder.md`](../reports/2026-08-31-trigger-t-decase-ladder.md)
§3.2 / §5 / §6 明确登记的那个缺口 —— 上轮 R3 **并未剥净抽象反例**，顶部「核心反模式」引用块里
语义等价的 `SURVIVING_FOIL` 三档原封不动，它恰好保留了 H2 所依赖的「规则」「出处」两个字面线索
⇒ **R3 不掉分部分地被 H2 自身预测**。本档把该句剥掉，检验 H2 的**更弱版本**。

**Architecture:** 不新建量具。在 [`adapters/llm-judge-container.mjs`](../adapters/llm-judge-container.mjs)
上给 `makeRuleVariant` 增一档 `R4`，`assertLadder` 扩到四档，新增独立预注册 `PREREG_LADDER_R4`
与取数档位 `LADDER_R4_RUNGS = ['R1','R4']`。

**Tech Stack:** 纯 Node ESM、零依赖（D4）。只读 DS pin `tvu-ds-6ac56de2`（⛔ 与上轮同 pin，换 pin 即换量）。

---

## 0. 这个计划要回答的那个问题

上轮判定「H2 未获支持」，但报告 §3.2 自己写死了它的强度限制：

> 本轮排掉的是「判读器靠**产品名 + 那份 LCD 文档的旧结构描述**去匹配」这个更具体的版本，
> ⛔ **没有排掉**「靠『规则』『出处』这类段落名词汇做字面匹配」这个更弱的版本。
> 要排掉后者，需要一档把**全部**抽象反例（含核心反模式段那句）都剥掉的 R4，**本轮没有这一档**。

本计划就是那一档。⛔ **它检验的是 H2′（更弱版本），不是重跑 H2。**

### 0.1 R4 剥什么 —— 逐字钉死

剥离串（**带破折号一起剥**，⛔ 不许只剥括号部分）：

```
——于是按「层」横切（内容一处、规则一处、出处一处）
```

剥前（R3）：`…转头却拿**它此刻只有一条内容的形态**去定结构——于是按「层」横切（内容一处、规则一处、出处一处），加第二个条目时要同时改三个地方。`

剥后（R4）：`…转头却拿**它此刻只有一条内容的形态**去定结构，加第二个条目时要同时改三个地方。`

⚠️ **为什么带破折号**：只剥括号部分会留下 `去定结构——，加第二个条目` 这样的破损句，
于是「R4 掉分」将无法区分是「字面线索没了」还是「规则文本读起来坏了」——那是一个**新引入的混淆**。
带破折号剥完句子通顺、语义仍完整（后果「加第二个条目时要同时改三个地方」保留，只是不再点名是哪三个地方）。

### 0.2 ⛔ 剥完之后**没有**剥净什么（预先写死，⛔ 不许在报告里声称剥净）

本地探测实测（零 LLM 调用）：

| 词 | R3 | R4 | 说明 |
|---|:-:|:-:|---|
| **出处** | 1 | **0** | ✅ H2 依赖的两个线索之一**彻底剥净**（R3 里仅有的那 1 处就在 `SURVIVING_FOIL` 内） |
| **规则** | 3 | **2** | 🔴 **残留 2 处**，都在「⛔ 与触发器 J / §M23.16 的区别」段（`加规则前没查重` / `用规则真源校验`）——**是别条规则的名字，不是段落名式用法**，与样本真实段落名 `3. 通用规则` 的字面重合弱于 `SURVIVING_FOIL`，⛔ 但不为零 |
| 内容 | 2 | 1 | 「只有一条内容的形态」——样本段落名是 `文案` 不是 `内容`，本就不是线索 |
| 横切 / 层 | 4 / 4 | 3 / 3 | 判据自身语汇，⛔ 不剥 |

⇒ **R4 ⛔ 不得被描述成「字面线索已剥净」或「只剩一句硬要求」。**
逐字射程：**R4 = 「『出处』线索归零、『规则』线索由 3 处降到 2 处弱语境」的那一档。**
这条要进断言（`assertLadder` 显式断言 R4 里「出处」恰 0 处、「规则」恰 2 处），
⛔ 不许只写在文档里 —— 上轮栽的正是「断言的绿被读成它没断言的意思」。

---

## Global Constraints

- **lab 只审查、不裁定**（`AGENTS.md` §8）⇒ 出读数，⛔ 不代 DS 拍板改不改 `meta-rules.md`。
- **预注册先行**：`PREREG_LADDER_R4` 写死进源码，**先 commit 再跑**；⛔ 不许跑完调。
- **⛔ 不改 `PREREG_LADDER`**（上轮已取完数）。R4 走**独立**常量，两份预注册并存。
- **⛔ R1 必须同 session 重跑，不得引用上轮 `runs/judge-ladder-6ac56de2/R1/` 顶替。**
  理由沿用上轮 Global Constraints：`templateHash = sha256(TEMPLATE_VERSION + ruleText)`，
  且基线闸（`R1 ≤ 3/5 ⇒ 不可判读`）要求 R1 是**本批次内**读数，否则闸空转。
  ⇒ 取数档位 = `['R1','R4']`，4 样本 × n=5 × 2 档 = **40 次调用**。
- **扰动算子自己要配 must-hit**（N83.1）：四档文本全部构造 + `assertLadder` 断言，
  ⛔ 即便 R2/R3 本轮不取数，它们的文本与断言仍必须在（单调链 R1 ⊃ R2 ⊃ R3 ⊃ R4 是 R4 定义的一部分）。
- **⛔ 事先不知道的量不设期望值**：R4 的绝对命中率 lab 事先不知道 ⇒ 预注册的是**判读规则**。

---

## 1. 预注册 `PREREG_LADDER_R4`（⛔ commit 前定稿，取数后一字不改）

```
n: 5
rungs（取数）: ['R1', 'R4']
discriminator: ['must-hit-0/lcd-before', 'must-hit-1/synthetic-attribute-split']
observeOnly:   ['must-not-hit-0/lcd-after', 'observe/oneshot-plan']
```

### 1.1 decisionRule（按**单条** discriminator 的 `(R1, R4)` 取值四选一）

| 分支 | 条件 | 读法 |
|---|---|---|
| **⛔ 不可判读（基线不可复现）** | `R1 ≤ 3/5` | 原样规则文本这一档都没能复现方向正确率 ⇒ 档间差失去参照，H2′ ⛔ 不可判读。⚠️ 此时另有一条独立发现：上轮同 pin 同模型的 R1 读数未能复现 —— 那是关于**读数稳定性**的结论，⛔ 不得当作 H2′ 的证据 |
| **H2′ 获强支持** | `R1 ≥ 4/5 且 R4 ≤ 2/5` | 命中依赖「规则 / 出处」这类段落名词汇的字面重合 ⇒ **上轮 N84「H2 未获支持」的射程要再收**，报告 §4 的「升档」处置需重新评估 |
| **H2′ 未获支持** | `R1 ≥ 4/5 且 R4 ≥ 4/5` | 把 `出处` 线索剥净、`规则` 线索降到 2 处弱语境后方向正确率仍不掉 ⇒ N84 的「已排除这一条混淆」**强度提升**（⛔ 仍不得读成「判据的普遍有效性已被证明」，样本代表性那条限制不受影响） |
| **不下结论** | `R1 ≥ 4/5 且 R4 == 3/5` | N 不足 ⇒ 触发 §1.3 条件补跑，⛔ 不许在 n=5 上硬读 |

**36 格覆盖自检**（`R1 ∈ 0..5` × `R4 ∈ 0..5`）：
`R1≤3` → 4×6 = **24** 格 ｜ `R1≥4 且 R4≤2` → 2×3 = **6** 格 ｜ `R1≥4 且 R4==3` → 2×1 = **2** 格 ｜
`R1≥4 且 R4≥4` → 2×2 = **4** 格。合计 24+6+2+4 = **36 ✅ 全覆盖且互斥。**

### 1.2 🔴 两条 discriminator **分歧**时怎么读（补上 N84.2 登记的缺口）

> N84.2 逐字：「若将来复跑遇到分歧，须**在取数前**先补这条分支。」本节即是在取数前补的。

- 两条 discriminator **各自**按 §1.1 得出分支。
- **一致** ⇒ 该分支即整体判定。
- **分歧** ⇒ 预注册读法：**⛔ 不下合并结论。** 整体只能报告为
  「**分歧：H2′ 在两条判别样本上表现不一致**」，并逐条登记各自落哪一支。
  ⛔ 不许取平均、⛔ 不许挑一条当代表、⛔ 不许把「其中一条未获支持」读成整体未获支持。
  ⚠️ 分歧本身是信息（提示两条样本对规则文本的敏感度不同），如实登记，⛔ 不当作噪声抹掉。

### 1.3 conditionalTopUp

- **when**：基线成立（`R1 ≥ 4/5`）且任一 discriminator 在 R4 落进中间带 `3/5`
- **then**：该样本 `R1` 与 `R4` 两档各补跑至 `n=10`，⛔ 只补这两档、⛔ 不改 `decisionRule`
- **ifBaselineFails**：⛔ 基线闸未过时不补跑 —— 补跑解决不了「参照系本身没立住」

---

## 2. 任务清单

- [x] **Task 1 · 量具改动**（⛔ 纯文本层，零调用）
  - [x] `RUNGS` 扩为 `['R1','R2','R3','R4']`；新增 `LADDER_R4_RUNGS = ['R1','R4']`（取数档位）
  - [x] 新增 `SURVIVING_FOIL_STRIP`（带破折号的剥离串），`SURVIVING_FOIL` 保留原值供探针表用
  - [x] `makeRuleVariant` 增 R4 分支（在 R3 之上剥 `SURVIVING_FOIL_STRIP`，fail-closed 找不到即抛）
  - [x] `RUNG_WHY.R4` 逐字写 §0.2 的射程（含「⛔ 不是『只剩硬要求』」「『规则』残留 2 处」）
  - [x] `assertLadder` 扩四档：骨架四档全在 ｜ 案例词 R2/R3/R4 全零 ｜ `SURVIVING_FOIL` R1/R2/R3 在、R4 不在 ｜
        **R4 里「出处」恰 0 处、「规则」恰 2 处**（🔴 新断言，钉死 §0.2 的射程）｜ 四档长度严格递减
  - [x] `--verify-ladder` 探针表打四档
  - [x] `--ladder-r4` 入口：走 `LADDER_R4_RUNGS` + `PREREG_LADDER_R4`
- [x] **Task 2 · fail-closed 验证**（⛔ 零调用）
  - [x] `--verify-ladder` 四档全绿，逐行核对探针表
  - [x] `--ladder-r4 --dry-run` 确认「合计 40 次调用」
- [x] **Task 3 · ⛔ commit 预注册**（🔴 **此步之前 ⛔ 不许发任何真实调用**）
- [x] **Task 4 · 取数** `--ladder-r4 --pin … --model claude-opus-5 --n 5 --out runs/judge-r4-6ac56de2`
- [x] **Task 5 · 报告** `reports/2026-09-01-trigger-t-r4.md` —— 逐字照 `decisionRule` 判定，
      ⛔ 不自创第五种读法；射程整段照 §0.2 写，⛔ 不许声称「剥净」
- [x] **Task 6 · status 登记** `docs/round2-status.md` §30.5 新增 N85

---

## 3. ⛔ 本计划**不会**产出什么（预先写死，防事后放大）

- **⛔ 不产出 v3 判据** —— 本档只检验 H2′ 这一条对立解释。
- **⛔ 不检验 H1** —— H1（`appendCost = A + B`）与 H2/H2′ 可同时成立，本设计不触及它。
  `must-not-hit-0` 大概率仍是 0%（H1 预测如此），⛔ 那不是本档的失败。
- **⛔ 不产出 Figma 面任何信息** —— 全部读数仍只在 `.md` 面。
- **⛔ 不动摇「样本代表性」那条限制** —— 四份样本仍是校准阶段挑中的最典型样本，
  组内对比消不掉这层顾虑（上轮 §3.2），R4 同样消不掉。
- **⛔ 不测「只剩一句硬要求」那个形态** —— 那需要再剥掉核心反模式引用块 + 触发器 J 区别段（R5），
  本计划**不含该档**（owner 2026-09-01 拍板：只做 R4 单档）。
