# 第 11 步执行计划（分档开）

> 用户 2026-08-25 16:0x 授权：**② 第 11 步（分档开）** + **现在扫第三家厂商（零成本只读）**。
> 排除的选项：① 铺 GT-002/GT-003 到 N=5（92 M 点估计）· ③ 加大 GT-001 的 N · ④ 只写给 DS 的回话。
> ⛔ 这份是计划 + 口径裁决记录，**不是报告**。落地读数进 `reports/2026-08-25-round2-step11.md`。

---

## 0. 为什么要分档 —— 三格的阻塞完全不同

spec §14 第 11 步写的是「开启 `first-shot` / `convergence` / `actionability`」一句话，
但三个指标的前置差了两个数量级。**照字面「开启」会同时撞上三堵不同的墙**：

| 格 | spec §7.2 定义 | 要不要新生成 run | 本轮判定 |
|---|---|---|---|
| `first-shot` | 单次产出、无人纠正下的合规比例 | **不要** —— 5 份既有产物 + 6′ 的 MDE 都在盘上 | ✅ **本轮交付** |
| `convergence` | 同任务 N 次之间组件选择/结构的差异 | **不要**（算点估计） | ⚠️ **只交付口径裁决 + 点估计**，⛔ 不出改善判定 |
| `actionability` | gate 失败后 AI 无额外提示的一次修复成功率 | **要**（4/5 个 run 闸失败 ⇒ 4 个修复 run） | ⛔ **不开** —— 卡 §6.1 铁律 1 |

---

## 1. 档 A：`first-shot` —— 本轮交付

### 1.1 要产出什么

不是「一个 first-shot 数字」，是**四个口径各自的地板表 + 哪个能用于验收的裁决**。
理由：6′ §2.4 已经证明「闸口径判不出改善」，但那只报了 MDE/mean。
**本档要回答的是「为什么」以及「换哪个口径」** —— 而这需要把「噪声地板」之外的
第二种地板显式立出来（见 §1.2）。

### 1.2 本档要立的新概念：**分辨率地板**（与噪声地板正交）

6′ 只量了噪声地板（重复测量方差）。但一个比例型指标还有第二个下界：

> **分辨率地板 = 1 / 分母。** 分母有几格，指标就只能表示几档。
> 这个地板 **N 加到多大都不动** —— 它不是抽样误差，是量化误差。

⇒ 两个地板要**并排报**，有效地板 = `max(分辨率地板, 噪声地板)`。
⛔ 只报 MDE 会让读者以为「加大 N 就能用」——对分辨率地板不成立。

### 1.3 四个口径（分母必须带口径名，AGENTS §2.4）

| # | 口径 | 分母 | 备注 |
|---|---|---|---|
| ① | **闸口径**（run 级二值 pass/fail） | N = 5 run | ⛔ Bernoulli，**不得按 2σ 出 MDE**（AGENTS §2.7）⇒ 走二项区间 |
| ② | **规则口径 · 全分母** | 5 条规则（3 error + 2 warn，从 pin 上 grader 真源解析） | — |
| ②' | **规则口径 · 有效分母** | **曾命中过的规则数** | 见 §1.4 —— 这才是真分辨率 |
| ③ | **格口径**（run × rule pooled） | N × K 格 | = 6′ §2.4「出路 3」，那份报告说「本量具目前不出」⇒ **本档建出来** |
| ④ | **逃逸口径**（连续） | `varUsages`（246–384/run） | 引 6′ 已有的 MDE |

### 1.4 本档预期会撞出的第二条新发现：**恒真分母稀释**

5 条规则里，5 个 run 一共只命中过 **1 条**（`popupbox-for-confirm`）；
另 4 条（`unconstrained-svg` / `handrolled-nav` / `hardcoded-color` / `alert-confirmText`）**一次没响**。
⇒ 「合规规则比例」的分母里有 4/5 是**恒真项**：它们对任何改善都不动，
只把合规率系统性抬高、把分辨率稀释掉。

⇒ 与 **E33**（`archive-triage` 换分母变恒真）**同族但不同形态**：
E33 是**整条判据**恒真；这条是**分母里部分恒真项**把分辨率稀释。⇒ 应登记为新勘误。

⚠️ 注意这条的边界：「4 条没响」是 **GT-001 口径 · N=5**。
按 AGENTS §2.7，⛔ 不得读作「那 4 条规则是死规则」——只能读作「本 task 本 N 下未曾曝光」。

### 1.5 量具与控制

新量具 `metrics/first-shot.mjs`（纯 Node 零依赖，D4，只读除 `--out`）。

内建控制（must-hit 钉**具名事实**，⛔ 不钉「解析器跑通了没有」）：

- MH1 规则面从 pin 上 grader 真源解析，**K = 5**（3 error + 2 warn），逐条具名
- MH2 5 个 run 的 exitCode 分布 = 4 个 1 + 1 个 0（钉 6′ 实测具名读数）
- MH3 命中规则集 ≡ {`popupbox-for-confirm`}，逐 run 计数 = [1,1,4,0,2]
- MH4 §5.2 三元组主键齐全非空（AGENTS §2.1 + §3.13）
- MH5 每个口径必须同时报 `resolutionFloor` 与 `noiseFloor`，缺一即抛
- MH6 格口径的格数 ≡ N × K
- MN1 分母为 0 ⇒ 抛（⛔ 不许静默出 100% 合规）
- MN2 任何比例越界 [0,1] ⇒ 抛
- MN3 二值口径的产物里**不得出现** sd 派生的 MDE 字段（把 AGENTS §2.7 内建成控制）
- MN4 N < 5 ⇒ 拒绝输出任何区间（fail closed，与 `noise-floor.mjs` 同口径）
- MN5 解析出 0 条规则 ⇒ 抛

造故障（⛔ **一个 pin 都不许拆** ⇒ 全部在 scratchpad 建**假 pin**，不动 `~/.ai-ds-lab/pins/`）：

| # | 造什么 | 该炸哪条 |
|---|---|---|
| F-A | 假 pin 的 grader 规则表改成 4 条 | MH1 |
| F-B | 塞一个 exit=0 的假 run 进 N | MH2 |
| F-C | grader 里 `RULES` 表删掉 | MN5 |
| F-D | 只喂 4 个 run | MN4 |
| F-E | 命中规则改名 | MH3 |

---

## 2. 档 B：`convergence` —— 只交付口径裁决 + 点估计

### 2.1 为什么不硬开

`convergence` 本身就是一个**散布量**（「N 次之间的差异」）。
⇒ 要判「改善了」就得比较**两个散布估计**，而散布估计自身的抽样误差在小 N 上极大：
正态假设下 `sd` 的相对标准误 ≈ `1 / √(2(N−1))`，**N=5 ⇒ 35.4%**。

⇒ **它的地板需要嵌套设计**（K 组 × 每组 N 个 run），成本是 `K × N × 9.2 M`，
不是 6′ 那种 `N × 9.2 M`。⇒ 本轮出**点估计**，明确标「⛔ 无地板，不得用于改善判定」。

### 2.2 输入面裁决（⛔ 别踩 E32）

convergence 的输入面 = **产物**（HTML 的组件选择 / 结构），
⛔ **不是** `contextManifest`。6′ §4.6 已实测 L2 整层都是被测量
（`.md` 实读面 9/9/6/8、交集仅 5/10）⇒ 拿它做 convergence 会测到 session 噪声本身。

---

## 3. 档 C：`actionability` —— 不开，卡铁律 1

### 3.1 六层扫描结论（已跑，2026-08-25）

§6.1 铁律 1 要「三票来自不同厂商/型号的模型」。**严口径（三家不同厂商）本机不可得。**
扫描面显式声明（AGENTS §3.11 要求最少四层，本轮做到**六层**）：

| 层 | 扫描面 | 结果 |
|---|---|---|
| ① | PATH | 只有 `gh`。⚠️ `claude` / `codex` **都不在 PATH**（N41 那条仍成立） |
| ② | 包管理器全局目录（npm -g / bun / cargo / go） | npm -g 只有 `@anthropic-ai`、`@marp-team`、corepack、npm；bun 只有 bun/bunx ⇒ **0 个他厂 AI CLI** |
| ③ | brew / pipx / `/Applications` | brew 0 命中 · pipx 只有 `token-tracker` · Applications **0 个本地推理宿主** |
| ④ | 编辑器扩展捆绑二进制 | `anthropic.claude-code-*` → `claude`；`openai.chatgpt-*` → `codex` 0.149.0-alpha.4.3（已鉴权）；**`github.copilot-chat-0.48.1` 只有 wasm，无捆绑 CLI** |
| ⑤ | **模型访问权而非 CLI**（本轮新增口径） | 只有 `OPENAI_API_KEY` 有值。Google / Mistral / Groq / DeepSeek / xAI / Cohere / OpenRouter **全 unset**；`ANTHROPIC_API_KEY` 在 shell 配置里声明过但当前 unset |
| ⑥ | 登录态 / 本地推理 | `~/.ollama` `~/.gemini` `~/.config/gcloud` `~/.lmstudio` `~/.cache/huggingface` **全 absent** |

⇒ 可得厂商恰好两家：**Anthropic**（`claude` 二进制）、**OpenAI**（`codex` 二进制 + API key）。

⚠️ **层⑤ 是本轮新加的，且它改变了问题的性质**：铁律 1 要的是「不同厂商的**模型**」，
不是「不同的 **CLI**」。⇒ 一个 API key 就够，不需要装 CLI。
⇒ 这也意味着 N41/N44 那条「扫 CLI」的口径**本身就漏了一层** —— 应登记勘误。

### 3.2 GitHub Copilot 看着像第三家，两重不合格

1. **无捆绑 CLI** ⇒ 不能 headless 驱动当 juror（层④ 实测只有 tree-sitter wasm）。
2. 即便能，它路由的是 GPT / Claude / Gemini ⇒ 与已有两票**同源**，
   正是铁律 1 理由句「同构模型的三票是相关的，会系统性低估方差」要防的东西。

### 3.3 铁律 1 有两个口径，⛔ 本轮不替 spec 裁

spec §6.1 铁律 1 原文是「不同厂商**/**型号」，斜杠是「或」：

| 口径 | 读法 | 现状 |
|---|---|---|
| **严口径** | 三家**不同厂商** | ⛔ 不可得（只有 2 家）⇒ 解锁动作 = 加一个他厂 API key，零 token 成本 |
| **宽口径** | 三个**不同型号**，允许同厂商 | ✅ 可得（如 `claude-opus-5` + `gpt-5-codex` + 另一个 Anthropic 型号） |

⚠️ 宽口径下，铁律 1 的**理由句部分失效**（同厂不同型号仍有共同训练血统 ⇒ 两票相关）。

✅ **但这件事可以实测，不必辩论**：铁律 2 的「抽样 20% 重判 2 次」本来就要量评委自身方差，
**顺带就能量出同厂两票的相关性** ⇒ 把口径问题从辩论变成读数。
⇒ 写进给 DS 的回话：请 DS 裁严/宽口径；lab 可先出相关性读数供裁。

---

## 4. 顺带要修的（本轮发现）

| # | 位置 | 问题 |
|---|---|---|
| 1 | `metrics/noise-floor.mjs` 头注释覆盖边界 ① | 逐字写着「T2 通道本机不可得（7 个他厂 CLI 全 absent）」—— **已被 N41/N44 推翻**（codex 就在层④），本轮六层扫描进一步细化。**活量具头注释里的 stale 结论比报告里的更危险**（它是下一个读者的入口） |

---

## 5. 收尾清单

- [ ] `metrics/first-shot.mjs` + 11 条内建控制 + 5 次造故障（假 pin，⛔ 不拆真 pin）
- [ ] 产物 `subjects/tvu-ds/inventory/first-shot-gt001-n5-4a68e02d.json`
- [ ] convergence 点估计（口径写清「无地板」）
- [ ] 修 `noise-floor.mjs` 头注释 stale 结论
- [ ] `reports/2026-08-25-round2-step11.md`
- [ ] `docs/round2-status.md` 加 §13
- [ ] AGENTS.md 新增纪律（分辨率地板 / 恒真分母稀释 / 扫描面漏一层）
- [ ] commit + push
