# 处方 — 建议把触发器 T 的实证案例移出判据节（下游程序化抽取会连案例一起吃）

- 日期：2026-08-31
- 目标 sha：**`0b51f217`**（DS 真源 `master`，取自本处方写作时刻 `git rev-parse --short HEAD`；
  DS 侧有并行 session 在高频提交，本 session 内已观察到从 `4769a5e3` 漂到 `260b8f79` 再到 `0b51f217`。
  ⚠️ **DS 侧执行时请按当时 HEAD 重核本文引用的所有行号，⛔ 不要照抄本处方里的行号**）
- 执行方：**DS 侧 session 在真源执行。lab 只出处方（`AGENTS.md` §8 只读边界），⛔ 未改 DS 任何字节，⛔ 未 `git add` DS 任何东西**
- **执行状态**：🟢 **已执行 —— 但执行者是 lab 自己，⛔ 不是 DS**（2026-09-11，DS `469ab4c4`，已推 master）。
  按 `AGENTS §1.1` 直接写 DS master；⇒ 按 `AGENTS §2.6`：`spec:§13.1` 的因子 1 自 2026-09-01 起恒 1、**不携带信息** ⇒ ⛔ 这一条不得读成「DS 采纳了本处方」。
  - **落地内容**：删掉判据节里那条 `**实证 2026-08-31 TVU Pack LCD 提示文案总表**：…` 整行，紧随其后的判据行 `⇒ 只要动手前问一句…` **留在原处**（处方逐字要求），实证按既有三列格式改写成文末附录「本规则的实证沉淀（避免重犯）」表的一行。
  - **定位**：靠行首标记 `**实证 2026-08-31`（实测唯一），⛔ 未照抄本处方给的行号。
  - 🟢 **决定性验证**：拿 lab 自己的 `extractRuleT()` 抽两侧判据节，原文施以本处方逐字给的剥离正则 `/^\*\*实证[^\n]*\n/m` 得 **R2 档 = 1289 字**，与落地后现行判据节**逐字节相同** ⇒ **判据节形态就是本处方 R2 档实测过的那一份**，本处方的读数对它成立。
  - 判据骨架 `加一个条目 = 追加一个单元、不动任何已有单元` 仍在；案例专属词在判据节内**全部归零**（`TVU Pack` / `LCD` / `文案一张卡` / `交付卡` / `mockup-conventions` / `五轮` 各 0 处）⇒ 它们搬进了附录，**内容未丢**（产品名 / 文档形态 / 段落命名 / §M53 交叉引用 / 纠正轮次逐项保留）。
  - 闸：触发块机械算出 3 个，逐条单跑读 `$?` 全 **0**（`stale-anchors` / `rule-inventory` / `acceptance-gate-coverage`）；另跑 `doc-shape` = 0。
- ~~**执行状态**：🔴 **未执行**~~ ⇒ 🔴 **已被上方那行取代（2026-09-11 落地）**，以下为**历史读数，留痕不删**：🔴 **未执行** —— 亲验 pin **`7fcca917`**（2026-09-01，`lab:N93`）。⚠️ 先记一处**路径漂移**：`meta-rules.md` 已从 `docs/internal/` 迁到 **`docs/meta-rules.md`**（本处方及 `AGENTS.md §1.1` 引的 `meta-rules.md:975` 那个锚点因此失效，⛔ 别照抄行号）。现址 `docs/meta-rules.md:949` 起的「### 触发器 T」节内：**「实证 2026-08-31 TVU Pack LCD 提示文案总表」整段仍在判据节里**（含产品名 TVU Pack / LCD、含「文案一张卡、规则一张卡、出处一张卡」、含 owner 五轮纠正的叙述）；顶部「核心反模式」引用块里的「于是按「层」横切（**内容一处、规则一处、出处一处**）」亦原样未动 —— 后者正是 `N84`/`N85` 记的 `SURVIVING_FOIL`。⇒ **下游程序化抽取（`extractRuleT()`）仍会把实证案例一起吃进判据文本**，本处方 §1 的结构问题原样存在
- **执行状态重取（本次落地前的现取，⛔ 留痕不删）**：@`d07be8e9`（2026-09-11 §30 全量重取）—— 🔴 **当时仍未执行**，并**订正本栏自己的一处引用形态**：
  - 现取：那条实证行在 **`docs/meta-rules.md:1010`**@`d07be8e9`，逐字 `**实证 2026-08-31 TVU Pack LCD 提示文案总表**：…`；「触发器 T」节起于 `docs/meta-rules.md:984` ⇒ **它仍在判据节内 ⇒ 处方要删的那一行一个字没动。**
  - 🔴 **本栏原写 `meta-rules.md:975` 有两处错**：① **缺 `docs/` 前缀** ⇒ 量具在 DS 仓解析为 `missing`；② 行号已漂 **+35**（`docs/meta-rules.md:975` → `docs/meta-rules.md:1010`）。
    ⇒ 按 `AGENTS §2.4 推论二`：**引行号必须带 sha**，且⛔ 不许只把行号改新（本行已带 pin）。
- 关联：
  [`reports/2026-08-31-trigger-t-decase-ladder.md`](../reports/2026-08-31-trigger-t-decase-ladder.md)（本处方的读数来源，H2 检验）、
  [`reports/2026-08-31-trigger-t-llm-judge.md`](../reports/2026-08-31-trigger-t-llm-judge.md)（已发表基线读数）、
  [`adapters/llm-judge-container.mjs`](../adapters/llm-judge-container.mjs)（`extractRuleT` / `makeRuleVariant` / `PREREG_LADDER`）
- 验证物：`runs/judge-ladder-6ac56de2/summary.json` + 60 份逐次 JSON（pin `6ac56de2`、model `claude-opus-5`、
  promptTemplate `jt-v1`、n=5 × 3 档 × 4 样本，`nulls=0/60`）

---

## 0. 一句话

**这不是「判据有缺陷，必须改」**——本轮读数明确显示 **H2 未获支持**：把触发器 T 判据文本里的具体
案例连同产品名整段剥掉，判读器在两条判别样本上的方向正确率**没有下降**（R1/R3 均 5/5 = 100%）。

主张因此降档为：

> 把**实证案例**从判据节移到 DS `docs/meta-rules.md` 已有的文末附录「本规则的实证沉淀」，
> 是一项**可读性 / 可消费性改进**——在**本轮实测的两条判别样本上未观察到**方向正确率下降，
> 而改了能让下游程序化抽取判据文本的消费者不再被迫连带吃进一条与产品名、文档形态强绑定的具体案例。

⚠️ **⛔ 这里此前写的是「零风险」，已撤回。** 「零风险」是**全称断言**，而本处方背后的证据只有
**4 份样本 × 1 个模型（`claude-opus-5`）× 1 个 prompt 模板（`jt-v1`）× 仅 `.md` 面 × n=5**。
射程限定见下方 §2.5（整段搬自读数报告 §3.2，⛔ 不许只留在 lab 侧文档里）。

⛔ 改不改由 DS 拍。lab 已在自己的判读器里做了这条剥离（见 §4），**DS 不改也不阻塞 lab**。

---

## 1. 问题在哪（结构问题，独立于判据准不准）

DS `docs/meta-rules.md` 第 949–983 行「触发器 T」这一节，把**判据本身**与**一条已解答的具体实证案例**
写在同一节里，中间没有可供程序化区分的边界：

- 第 956–962 行：机械触发三行块（产物性质 / 结构要求 / 满载态）
- 第 964–971 行：性质 → 结构要求推导表
- **第 975 行**（实证，**独占一行**）：`**实证 2026-08-31 TVU Pack LCD 提示文案总表**：……` ——
  逐字写着产品名（`TVU Pack`）、文档形态（`LCD`）、旧结构的段落命名（「文案一张卡、规则一张卡、
  出处一张卡」）、交叉引用来源（`mockup-conventions.md` §M53）、纠正轮次（「连续五轮」）。
  **⇒ 只有这一行是本处方要动的。**
- 🔴 **第 976 行**：`⇒ 只要动手前问一句「第 3、第 5 类场景加进来长什么样」，问题当场暴露。**讽刺处**：……`
  —— **这是判据内容，⛔ 不在本处方范围内，⛔ 不要搬。**
- 第 978–983 行：三条边界

**按标题 / 分隔线定抽取边界**的下游消费者（即：靠「下一个 2–4 级标题或水平分隔线」——第 984 行的
`---`，往下接 `## 7. 元说明`——判断节的终点），会**连第 975 行的实证一起吃进去**，因为它在结构上
和判据骨架处于同一节、同一缩进层级。

lab 的判读器 `adapters/llm-judge-container.mjs` 的 `extractRuleT()` 正是这样一个消费者，
它实际抽到的判据文本里逐字含着这条案例。这条与判读器输出准不准**无关**——即使案例文字对
判读结果毫无影响，只要节的物理边界不区分「判据」和「实证」，采用同一种边界定义的消费者就会
遇到同一个问题。

⚠️ **⛔ 这不是所有消费者都会遇到的问题**：按 `**实证` 这类**行首标记**切就不会——lab 自己在
`makeRuleVariant()` 里正是这么干的（正则 `/^\*\*实证[^\n]*\n/m`，只删 975 那一行）。
⇒ 本处方的收益范围是「按标题 / 分隔线定边界的消费者」，⛔ 不是「所有消费者」。

DS 文件本身已经预留了解法：第 994 行 `## 附录：本规则的实证沉淀（避免重犯）` 是一个专门收纳
「实例 / 违反的反模式 / 正解」三列表格的既有附录，第 267 行的规则也写明"每次发现反模式，
强制写进该附录表格"——第 **975** 行这条实证目前没有走这条既定路径，而是留在了判据节本身。
（⛔ 再次提醒：**只有 975 那一行**；紧邻的 976 行是判据内容，⛔ 不在本处方范围内。）

---

## 2. 这不是文风建议，是可测的（附三档读数）

判定依据：`PREREG_LADDER.decisionRule`（`adapters/llm-judge-container.mjs:77`，逐字见下），
读数详见 [`reports/2026-08-31-trigger-t-decase-ladder.md`](../reports/2026-08-31-trigger-t-decase-ladder.md)。

**三档定义**（对同一份 T 原文单调剥离，字数严格递减）：

| 档 | 定义 | 字数 |
|---|---|---:|
| R1 `cased` | 原样：具体案例（第 975 行）+ 抽象反例（第 968 行）+ 硬要求 | 1672 |
| R2 `decased` | 剥掉第 975 行整段实证（产品名等随之消失），留抽象反例 + 硬要求 | 1289 |
| R3 | 在 R2 之上，**只再剥掉推导表里那一处字面量**「（内容 / 规则 / 出处各一段）」（17 字）。⛔ **不是「只剩硬要求」** | 1272 |

🔴 **⛔ R3 ≠「抽象反例已剥净」**：`--verify-ladder` 的探针表末排显示，「核心反模式」引用块里语义
等价的「于是按「层」横切（内容一处、规则一处、出处一处）」**三档全在**（`Y Y Y`）。**本处方要求
DS 做的是 R1→R2 这一步**（把带产品名的已解答案例移出判据节），而这一步恰恰是**本轮程序化证过**
的那一档（探针表：六个案例词在 R2/R3 全部清零）。⇒ 处方开的药与 lab 实测的扰动**逐字一致**。

**两条判别项的方向正确率**（`must-hit-0/lcd-before`、`must-hit-1/synthetic-attribute-split`，n=5）：

| 判别项 | R1 | R2 | R3 |
|---|:-:|:-:|:-:|
| `must-hit-0/lcd-before` | 5/5 = 100% | 5/5 = 100% | 5/5 = 100% |
| `must-hit-1/synthetic-attribute-split` | 5/5 = 100% | 5/5 = 100% | 5/5 = 100% |

R1（现状，含案例）与 R3（案例已剥掉、`ABSTRACT_FOIL` 那处字面量也剥掉）在两条判别项上**完全持平**，
`R1 ≥ 4/5 且 R3 ≥ 4/5` 命中 `PREREG_LADDER.decisionRule` 的 **「H2 未获支持」** 分支：

> `判据脱离案例仍站得住，§2 结论从「未排除混淆」升为「已排除这一条」`

**复核方式**（可直接跑）：

```
runs/judge-ladder-6ac56de2/summary.json   # pin=6ac56de2, model=claude-opus-5, n=5×3档×4样本, nulls=0/60
node adapters/llm-judge-container.mjs --verify-ladder --pin ~/.ai-ds-lab/pins/tvu-ds-6ac56de2
```

**同一批读数里也要如实带上的限制**（不因为支持本处方就选择性引用）：

- `must-not-hit-0/lcd-after`（观察项）三档恒为 **0%**（未获改善也未变差）——这是判读器度量
  `appendCost = A + B` 本身混了两类量的独立缺陷（见已发表报告
  [`2026-08-31-trigger-t-llm-judge.md` §3](../reports/2026-08-31-trigger-t-llm-judge.md#3-为什么闸还是没过-appendcost-混了两类量)），
  **与要不要移出实证是两件独立的事**，不构成反对本处方，但也不是本处方能解决的。
- n=5 × 4 样本，样本量小；样本本身在 N82.2 之后已被逐条看过，只能当训练集（见 lab 侧
  `docs/round2-status.md` N82.2，非 DS 文件）——是否需要用未看过读数的新样本复核，留给 DS 判断。
- 本轮读数只在 `.md` 面上，触发器 T 的催生案例恰在 Figma，Figma 面未测。

---

## 2.5 ⛔ 这条读数的射程（整段搬自读数报告 §3.2，⛔ DS 侧读本处方时不得跳过）

**为什么本轮仍然可判（组内对比 / within-subject）**：三档比较的是**同一批样本、同一个模型、同一个
n**，档与档之间只变动了一个变量——喂给判读器的规则文本。读的不是「三档各自的绝对准确率」，而是
**每份样本自己在 R1→R2→R3 上的差值**。组内比较把「哪份样本进哪一档」这类跨臂选择偏差也消掉了。
⇒ 「这四份样本已被逐条看过、只能当训练集」这条限制，动摇的是**能不能拿它们的结果去调判据参数**，
⛔ 不动摇本轮组内对比的**内部有效性**。

**⛔ 限制一：这批样本本身够不够有代表性，本轮挡不住。** 这四份样本**恰恰是因为「够典型、够明显」
才被反复挑中做校准的**——`must-hit-0/lcd-before` 是唯一已知的真实重构阳性对照，
`must-hit-1/synthetic-attribute-split` 是照着它的病灶形状特意合成出来配它的。R3 上这两条仍然
100%，完全可能反映的是**「这两份样本对规则文本本身的敏感度本来就低」**——无论判据写得多抽象，
模型都能单靠文档结构本身（真横切 vs 已重构）读出该不该判「命中」。组内对比消除的是「样本被看过
会不会污染读数」这层顾虑，⛔ 消除不了「这批样本本身够不够有代表性」这层顾虑。

**⛔ 限制二：R3 不掉分，部分地被对立假说 H2 自身预测。** H2 的机制是「样本的真实段落名与规则文本
里的措辞**字面重合**」——`must-hit-0/lcd-before` 的真实段落名是 `3. 通用规则`、`6. 出处`。而 R3 档里
活下来的那句抽象反例逐字是「于是按「层」横切（**内容一处、规则一处、出处一处**）」，**恰好保留了
「规则」「出处」这两个词**。⇒ 一个纯字面匹配、完全没读懂抽象规则的判读器，在 R3 上**仍有可攀附的
线索**。本轮排掉的是「靠**产品名 + 那份 LCD 文档的旧结构描述**去匹配」这个更具体的版本，
⛔ **没有排掉**「靠『规则』『出处』这类段落名词汇做字面匹配」这个更弱的版本。

⇒ **射程写死**：本处方只能说——

> 在**这两条 must-hit 判别样本**上，把**带产品名的已解答案例**从判据文本里剥光**不掉方向正确率**。
> ⛔ 不得外推成「对任意样本都不掉」，也 ⛔ 不得读成「判据的普遍有效性已被证明」，
> 也 ⛔ 不得读成「把抽象反例剥净后仍不掉」——**那一档本轮没测过**。

⇒ 因此本处方 §0 ⛔ **不主张「零风险」**，只主张「在本轮实测的两条判别样本上未观察到方向正确率下降」。

---

## 3. 建议改法（逐条）

判据节（第 949–983 行）只保留：

1. 第 956–962 行：机械触发三行块，不动
2. 第 964–971 行：性质 → 结构要求推导表，不动
3. 第 978–983 行：三条边界，不动

**可执行指令（逐字，⛔ 只有这一条）**：

> **只把第 975 那一行**——以 `**实证 2026-08-31 TVU Pack LCD 提示文案总表**：` 开头、
> **独占一整行**的那段实证——**搬到**第 994 行既有附录「本规则的实证沉淀（避免重犯）」的表格里。
> 🔴 **第 976 行（`⇒ 只要动手前问一句「第 3、第 5 类场景加进来长什么样」，问题当场暴露。**讽刺处**：……`）
> 是判据内容，⛔ 留在原处、⛔ 不要跟着搬走。**

搬过去时按该表已有的三列格式（实例 / 违反的反模式 / 正解）改写为一行，内容不丢——产品名、文档形态、
段落命名、交叉引用来源、纠正轮次这些细节原样保留，只是换了列的位置，不是删减。

⚠️ **与 lab 实测的扰动逐字一致**：lab 的 `makeRuleVariant()` 用正则 `/^\*\*实证[^\n]*\n/m` 做这条剥离，
**它只删 975 那一行**（正则以 `**实证` 行首锚定、`[^\n]*\n` 到行尾为止）。本处方给出的指令与它
逐字对齐 ⇒ DS 照做之后，判据节的形态就是本轮 R2 档实测过的那一份。⛔ 若把 976 行也搬走，DS 侧得到
的就是**一份 lab 从未测过**的判据文本，本处方的读数对它不成立。

⚠️ **DS 侧执行时行号必漂，请以当时 HEAD 重新 `grep -n "触发器 T\|实证 2026-08-31\|本规则的实证沉淀"
docs/meta-rules.md` 定位，⛔ 不要照抄本处方给出的行号。**定位靠的是 `**实证` 这个**行首标记**（唯一），
不是行号。

---

## 4. lab 不裁定

改不改、什么时候改，由 DS 侧拍板（`AGENTS.md` §8：本仓只审查、不裁定）。

lab 侧已经在自己的判读器里做了这条剥离——本 session 新增的 `makeRuleVariant(text, rung)`
（`adapters/llm-judge-container.mjs`）在读数产出前，把从 `extractRuleT()` 抽到的判据文本
按 R1/R2/R3 三档程序化剥离，其中 R2/R3 档已经不含实证案例。

⇒ **DS 不改，也不阻塞 lab**——lab 已经绕过了这个问题。
⇒ **DS 改了**，任何未来采用**同一抽取边界**（按标题 / 分隔线定节边界）的程序化消费者都不必各自
实现一遍剥离逻辑。⚠️ **目前已知的消费者只有 lab 一家**——⛔ 本处方 ⛔ 不主张「所有其他下游消费者
都受益」，那句话既是全称词，又预设了其他消费者的存在；⛔ 请不要拿它来排优先级。

---

## 5. 不在本处方范围内的事

- 不主张改判读器本身的度量口径（`appendCost = A + B` 的 A/B 拆分是独立议题，见已发表报告 §3）。
- 不主张这条改法对触发器 T 以外的其他触发器同构成立——本处方只测了触发器 T，「同构的其他触发器」
  是否有同样问题需要各自验证，本处方不代为断言。
- 不主张 R3 是应该固化的最终判据形态——本处方只主张「移出实证案例」（对应 **R1→R2** 这一步）。
  R3 只是本轮读数里用来**再多剥一处** `ABSTRACT_FOIL` 字面量的探测档，⛔ 不是本处方要求 DS 采纳
  的目标形态，⛔ 也 ⛔ 不是「只剩硬要求」（见 §2 的红字与 §2.5 限制二：核心反模式段里那句语义等价
  的抽象反例，三档都还在）。
- ⛔ **不主张「判据可以抽象到只剩一句硬要求」** —— 那个形态**本轮一次没测过**，本处方不为它背书。
