# 处方 — 67 条「没人管」的 Acceptance 段：逐条修法方向

- **执行状态**：⏳ **未重取** —— 本格（2026-09-11 §30）只补栏位。
  - ⚠️ 本处方是**一份分类读数 + 修法方向**，⛔ 不是单一动作 ⇒ 它的「执行」= 那 67 条各自被处理掉。已有进展的对账面在 [`docs/decision-queue.md`](../docs/decision-queue.md) 的棘轮表（现值 **35**，⛔ 不是本处方立项时的 67）。
  - ⚠️ **降级损失的是【67 条逐条的现状】，⛔ 不是【棘轮总数】**（`AGENTS §2.27`）—— 棘轮数由 DS 的闸自印、随时可取；逐条归属要重跑量具 `metrics/unclassified-fix-triage.mjs`，本格未做。

**日期**：2026-08-31 · **被验对象 pin**：`b3728d38`（P6）
**量具**：[`metrics/unclassified-fix-triage.mjs`](../metrics/unclassified-fix-triage.mjs)（11 条内建控制，全绿）
**逐条清单**：[`reports/unclassified-fix-triage-b3728d38.md`](../reports/unclassified-fix-triage-b3728d38.md)
**读数落盘**：[`subjects/tvu-ds/inventory/unclassified-fix-triage-b3728d38.json`](../subjects/tvu-ds/inventory/unclassified-fix-triage-b3728d38.json)
**计划**：[`docs/2026-08-31-unclassified-67-fix-plan.md`](../docs/2026-08-31-unclassified-67-fix-plan.md)

```bash
node metrics/unclassified-fix-triage.mjs \
  --pin ~/.ai-ds-lab/pins/tvu-ds-b3728d38 \
  --dump subjects/tvu-ds/inventory/acceptance-coverage-b3728d38.json --self-check
```

---

## 0. 一句话

**67 条里 57 条能靠「扩一支同文件已有的闸 + 补一行自陈」解决，10 条得先补写核查项；
但每一条动手前都还有一个问题必须人来答 —— 这条规则的被测物到底存放在哪个面。**

🔴 lab 原本想把最后这个问题也自动化（第四类「F3 · 建议走具名豁免」），
**预注册的金标对照当场判它不成立**（召回 2/32，下界 0.75）⇒ 已撤下，理由见 §2.4。

---

## ⛔ 0.1 本处方**不覆盖**什么（这是边界，不是 TODO）

1. **⛔ lab 不裁定 DS 的技术口径**（`AGENTS.md` §8）。下面每条给的是**可选修法方向**，
   带判据与置信度，**DS owner 保留否决与改判的权力**。
2. **⛔ 不判「这条规则本身该不该存在」。** 只判「它现在没人管，可以怎么让它有人管」。
3. **⛔ 不验「已 gated 的那 27 条是不是真在管」。** 本处方只把它们当**金标负样本**与
   **候选闸来源**用。⚠️ 若那 27 条的自陈是假的（体检报告第四节问题 2 正是这条），
   候选闸的指向就带噪。**已知边界，如实登记。**
4. **⛔ 不解 N-D1（编号漂移）。** 那是 DS 侧的前置，本处方只把它标成 `blockers`。
5. **⛔ 不改 DS 真源一个字节**，不改闸。产出是这份处方。
6. **只在 P6 = `b3728d38` 上成立。** 67 这个数与 P6 同源，换时点要重跑。

---

## 🔴 0.2 立项依据：本处方**推翻**了 lab 自己的一条现行推荐

**owner 2026-08-31 拍定：推翻 §30.4 冻结，全 67 条都要修法。**

| 被推翻的 | 原文 |
|---|---|
| `round2-status.md` §30.2 第 3 条 | 「立刻只做 1 件（补 WC 类型声明）；其余 7 步建议**进 backlog 不排期**」—— 67 条属其中第 2–4 步 |
| `round2-status.md` §30.4 | 「候选清单封顶，新发现**只登记不开格**」 |

⚠️ **顺带订正一处交接措辞**：此前把「现行推荐」记成 §30.2 **第 2 条**。核对后 ——
第 2 条讲的是「**14 件 owner 待拍**打包归档为接受现状」，与这 67 条无关。

⇒ **解冻范围严格限定在「已登记的这 67 条」**。本处方未新开评审格、未扩大扫描面、未查新问题。

---

## 1. 事实读数

| 读数 | 值 |
|---|---:|
| 「没人管」的段 | **67** |
| 分布：`mockup-conventions.md` / `design-process.md` / `domain-tvu.md` | 48 / 14 / 5 |
| **F1** · 同文件已有闸在扫 | **57** |
| **F2** · 同文件无闸在扫 | **0** |
| **F4** · 段内 0 条核查项 | **10** ⚠️ 全 126 段上实为 **13**（另 3 条在「有人管」里）；且 13 条**无一是真的空**，见 §2.6.1 |
| 前置：无阻塞 | 31 |
| 前置：仅编号漂移（N-D1） | 28 |
| 前置：仅闸看不见（`ACC_RE`） | 3 |
| 前置：**两者都有** | 5 |
| 带「不可机检」词法线索的段（⛔ 线索非判读） | 9 |

⚠️ **`67` 不是 `71`。** 71 是 P4 时点的数，P5 起已降到 67（`round2-status.md` N73 逐条可定位）。

---

## 2. 三类修法

### 2.1 F1 · 扩一支同文件已有的闸 + 补一行自陈（**57 条**）

| 栏 | 内容 |
|---|---|
| **判据** | 结构判据：该段所在文件里，**已有闸通过 `// covers-acceptance:` 认领了别的段** |
| **修法动作** | ① 人工判这条的被测物在哪个面（见 §2.3）；② 若可机检 —— 在**候选闸**里扩判据；③ 在该闸头部加一行 `// covers-acceptance: <id>` |
| **代价** | 57 条 × （1 次人工判读 + 1 处判据扩写 + 1 行自陈）。⚠️ 判据扩写的工作量**逐条差别很大**，本处方**不估**——估不出来的东西不写成数字 |
| **前置依赖** | 其中 **33 条**被 `N-D1-anchor` 阻塞（见 §2.5）。⛔ 不解前置就补自陈，将来插一条同名段，这些自陈会**整片指错** |

**候选闸的分布**（按「它已认领的最近一段离本段多少行」取最近的一支）：

| 候选闸 | 条数 |
|---|---:|
| `audit-handoff-deliverable-sections.mjs` | 15 |
| `audit-mockup-library-origin.mjs` | 10 |
| `audit-mockup-typography-icon.mjs` | 8 |
| `audit-mockup-bilingual-spacing.mjs` | 7 |
| `audit-mockup-colors.mjs` | 5 |
| `audit-mockup-integrity.mjs` | 5 |
| `audit-mockup-geometry-consistency.mjs` | 5 |
| `design-kickoff.mjs` | 5 |
| `audit-commit-affordance-trace.mjs` | 3 |
| `audit-mockup-handoff-evidence.mjs` | 3 |
| `audit-mockup-binding-fidelity.mjs` | 1 |

> 🔴 **候选闸是「结构邻近度」，⛔ 不是「这支闸真能检查这条规则」的判断。**
> 它只回答「离得最近的那支闸是哪个」，省掉翻真源找候选的那一步。**topical 合不合适要人看。**

### 2.2 F2 · 需新写一支闸（**0 条**）

🔴 **这一类是空的，而这本身是个读数，⛔ 不是「没查到」。**

67 条只落在 **3 份**文件里，而这 3 份**每一份都已有闸在扫** ⇒ 按文件粒度，F2 必然为 0。

⚠️ **⇒ F1/F2 这对分类在文件粒度上判别力近零。** 真正可执行的那一层是 §2.1 那张**候选闸**表。
本处方把这条如实写出来，⛔ 不假装 F1/F2 是个有信息量的划分。

### 2.3 🔴 每条动手前都要人答的那个问题

金标失败后（§2.4），**唯一剩下的可靠问法**只有一句：

> **这条规则的被测物，存放在哪个面？**
> · 落在 **repo 文件**里（handoff doc / PR / commit / 源码 / 配置）⇒ **可机检**，按 F1 修
> · 落在 **Figma 画布 / Slack 消息 / 一次对话 / 一张渲染图**上 ⇒ **不可机检**，走具名豁免

逐条清单已把**核查项正文原文**铺出来（按词法线索强度排序，前 20 条在 Markdown 里，
全部 67 条在 JSON 的 `rows[].items`），判读时**不必再翻真源**。

### 2.4 🔴 为什么原设计的第四类被撤下（**预注册判据失败的完整留痕**）

lab 原本设计了第四类「**F3 · 建议走具名豁免**」，打算用词法判据自动认出不可机检的段。
判据的成立与否**预注册**在源码里（阈值先 commit、再跑）：

| 读数 | 实测 | 预注册阈值 | 结果 |
|---|---:|---:|:-:|
| 召回（DS 已判「不可机检」的 32 段被认出的比例） | **2/32 = 0.063** | ≥ 0.75 | ✗ |
| 误报（DS 已判「可机检」的 27 段被误认的比例） | 0/27 = 0.000 | ≤ 0.26 | ✓ |
| 判别力（召回 − 误报） | **0.063** | ≥ 0.50 | ✗ |

**诊断**（⛔ 非通过判据，只用来说明原因）：即使把聚合规则放到最松的「任一核查项命中」，
最干净的金标子集也只到 **8/15 = 0.533**，且其中 **6 条零命中**。

⇒ 🔴 **结论：「可不可机检」没有可靠的词法判据 —— 这是一条实质结论，不是一次失败。**
原因是结构性的：可机检性取决于**被测物存放在哪个面**，**与措辞无关**。
实例：`AGENTS.md#Acceptance`（Slack mrkdwn 起草纪律）**零个**词法标记，
但它不可机检的理由很清楚 —— 被测物是一条**永远不会进仓库的 Slack 消息**。

⚠️ **两条纪律留痕**：
1. **⛔ 没有拿同一份金标反复调分类器直到通过** —— 那是过拟合，也正是「把判据调成必过 = 恒绿 = 零信息」。只跑了**一轮**预注册，失败即降级。
2. **金标本身是被污染的，如实登记、⛔ 不偷偷换分母**：32 条正样本里 **17 条**来自 `figma-technical-reference.md` 的**整份文件级豁免**，其理由是**射程**（「这份文件是 use_figma 的 Figma …」），⛔ 不是「不可机检」。事后切分（只算段级 15 条）的读数**单列并标注为事后**，⛔ 不作为通过判据。

### 2.5 前置阻塞（🔴 与上面的分类**正交**，⛔ 不可相加）

| 前置 | 条数 | 不解会怎样 |
|---|---:|---|
| 无 | 31 | 可直接动手 |
| 仅 **N-D1-anchor**（编号漂移） | 28 | 该段的 id 靠 `~N` 序号（同 slug 多段）⇒ 中间插一条同名段，序号全挪，现存自陈**整片指错** |
| 仅 **ACC_RE-blind**（闸看不见） | 3 | 闸连「这里有一条规则」都不知道 ⇒ 补了自陈也不会被读到 |
| **两者都有** | 5 | 🔴 **顺序坑**：先放宽 `ACC_RE` 会让现存自陈指到别的规则上，看起来像把系统改坏了（体检报告第五节第 1 条 / N74 同源） |

⇒ 🔴 **顺序建议：先解 N-D1（编号稳定化），再放宽 `ACC_RE`，最后才逐条补自陈。**
⛔ 反过来做，中间那一步会产生一批**看起来像回归**的假故障。

### 2.6 F4 · ~~先补写核查项~~（**10 条**）⛔ **本节措辞已被 §2.6.1 订正，别照下表执行**

> ⚠️ 下表**原样保留**（留痕纪律，⛔ 不删不改），它错在哪、正确读数是什么，见紧随其后的 **§2.6.1**。

| 栏 | 内容 |
|---|---|
| **判据** | 结构判据：段内 **0 条核查项**（已验非量具故障 —— 段的行号在文件里真实存在，见控制 `must-hit-2`） |
| **修法动作** | 先补写核查项。⚠️ 或者判定「这一段根本不该算一条 Acceptance」，从分母里去掉 |
| **代价** | 10 条 × 1 次规则重写 |
| **前置依赖** | 无。**这 10 条是全 67 条里最独立的一批** |

> ### 🔴 2.6.1 订正（2026-08-31，`f4-denominator-branches.mjs`）—— **上面这一栏的措辞不成立**
>
> ⛔ **别照上表执行。** 为把 §5 第 2 项的分母问题算清楚，把「段内 0 条核查项」这条判据
> 从**只跑 67 条**扩到**全 126 段**后，撞出三件事，每一件都改变结论。

**订正 ①：不是 10 条，是 13 条 —— 且其中 3 条现在被算作「🟢 有人管」。**

| 三态 | 扫描段数 | 零核查项 |
|---|---:|---:|
| 🟢 有自动检查在管 | 27 | **3** |
| 🔵 已确认只能靠人看 | 32 | **0** |
| 🟠 没有任何人管 | 67 | **10** ← 即原 F4 |

⇒ 「**分母减 10**」这句话**错在两处**：减的是 13 不是 10；且分支里**分子分母同时变**，
⛔ 不是「只把分母改小」。那 3 条的含义是：**一支闸声称覆盖了一条它读不到核查项的规则**。

> `not-machine-checkable = 0` 是**零输出** ⇒ 判别力由 `must-hit-3`（三态各注一个合成零段，
> 必须三个都抓到，实测 3/3）钉住，⛔ 不是「查了没有」就完事（§30.5.2）。

**订正 ② 🔴 最重的一条：这 13 段【没有一段】是真的空 —— 两个选项的共同前提都不成立。**

病因在闸自己：`parseAcceptanceSections` 的内层循环**从 `i + 1` 行起扫**
（pin `b3728d38` 的 `scripts/audit-acceptance-gate-coverage.mjs:176`）
⇒ 写在 `**Acceptance**：` **同一行上**的正文**永远进不了 `items`**。

| 形态 | 条数 | 含义 |
|---|---:|---|
| `inline-prose` | **12** | 判据写在 `**Acceptance**：` 那一行上 ⇒ 闸结构上读不到 |
| `following-prose` | **1** | 判据是段后的散文段落，不是列表项 |
| `genuinely-empty` | **0** | 🔴 **真的没有可检查内容的：一条都没有** |

样例（`mockup-conventions.md#C5`，现被算作「有人管」）：

> `**Acceptance**：text/icon/bg/line 角色节点绑了 `UX/Grey/grey-N`、而存在对应 `Color Type/*` 语义变量 → 违例`

判据白纸黑字写着，`items` 却是 0。

⇒ 🔴 **原表「修法动作」两个选项**都建立在「这些段没有可检查内容」上，**该前提已被证伪**：
> - ⛔ 「**先补写核查项**」——**没什么可补**，判据已经写了。
> - ⛔ 「**从 126 的分母里去掉**」—— 那会**删掉 13 条真规则**，让覆盖率**虚高**。

**订正 ③：真正的修法是第三条路（原处方没列）。**

| 选项 | 动作 | 代价 |
|---|---|---|
| **C1** | 把这 13 段的 Acceptance 正文**改写成列表形态**（`- ` 开头另起一行） | 13 处文档改写，**零代码改动** |
| **C2** | 让闸的核查项抽取**认得行内形态**（`**Acceptance**：` 同行正文） | 改 1 支闸；⚠️ 会让**所有**段的 `checkItems` 读数变动 ⇒ 撞 `[N]` 自陈核对，与 **N-D1 同型的顺序坑** |

🔴 **它与 `ACC_RE-blind` 是同一个病的两处发作**：闸认得的**词法形态比文档实际用的窄**。
⛔ 但两者**不可合并处理** —— `ACC_RE` 决定「看不看得见这个段」，本条决定「看不看得见段里的核查项」。

**⛔ lab 不代拍**：给的是「这 13 段是什么形态」，⛔ 不是「该选 C1 还是 C2」。

**分母双分支读数（供 owner 对照，⚠️ 前提已被订正 ② 证伪，仅作数量参考）：**

| 状态 | A 条数 | A 占比 | B 条数 | B 占比 |
|---|---:|---:|---:|---:|
| 🟢 有人管 | 25 | 19.8% | 22 | 19.5% |
| 🔵 只能人看 | 30 | 23.8% | 30 | 26.5% |
| 🟠 没人管 | 71 | 56.3% | 61 | 54.0% |
| **合计（分母）** | **126** | | **113** | |

> 上表在 **P4 `19e55102`**（体检报告第四节的基线）上跑。P6 `b3728d38` 上 `k` 与形态分布
> **逐字相同**，跨 pin 比的是 **id 集合**（13 vs 13，差集 0），⛔ 不是只比总数（N80.2）。
> ⚠️ 体检报告第四节「好消息」表的**前 3 个历史时点不可复现**（dump 工具晚于它们，N73）
> ⇒ 记 `unreproducible`，⛔ 不推算填数。
>
> 读数真源：[`f4-denominator-19e55102.json`](../subjects/tvu-ds/inventory/f4-denominator-19e55102.json)
> · [`f4-denominator-b3728d38.json`](../subjects/tvu-ds/inventory/f4-denominator-b3728d38.json)
> （量具 [`metrics/f4-denominator-branches.mjs`](../metrics/f4-denominator-branches.mjs)，13 控制全绿）

---

## 3. 逐条索引（67 行，⛔ 由量具 JSON 生成，非手写）

| # | id | 位置 | 类 | 核查项 | 候选可扩的闸 | 前置 | 线索 |
|:-:|---|---|:-:|---:|---|---|---|
| 1 | `mockup-conventions.md#C6` | `mockup-conventions.md:449` | **F1** | 3 | `audit-mockup-binding-fidelity.mjs`（距 18 行） | — | ⚠️ 1/3 |
| 2 | `mockup-conventions.md#C7` | `mockup-conventions.md:468` | **F1** | 3 | `audit-mockup-colors.mjs`（距 7 行） | — | — |
| 3 | `mockup-conventions.md#验收标准@blind:693` | `mockup-conventions.md:693` | **F1** | 8 | `audit-mockup-bilingual-spacing.mjs`（距 136 行） | 闸看不见 | ⚠️ 2/8 |
| 4 | `mockup-conventions.md#M23.12` | `mockup-conventions.md:780` | **F1** | 3 | `audit-mockup-bilingual-spacing.mjs`（距 49 行） | 编号漂移 | — |
| 5 | `mockup-conventions.md#M23.12~2` | `mockup-conventions.md:792` | **F1** | 2 | `audit-mockup-bilingual-spacing.mjs`（距 37 行） | 编号漂移 | — |
| 6 | `mockup-conventions.md#M23.14~2` | `mockup-conventions.md:853` | **F1** | 3 | `audit-mockup-bilingual-spacing.mjs`（距 24 行） | 编号漂移 | — |
| 7 | `mockup-conventions.md#M23.18` | `mockup-conventions.md:902` | **F4** | 0 | `audit-mockup-colors.mjs`（距 35 行） | — | — |
| 8 | `mockup-conventions.md#M23.18.1@blind:917` | `mockup-conventions.md:917` | **F4** | 0 | `audit-mockup-colors.mjs`（距 20 行） | 编号漂移 · 闸看不见 | — |
| 9 | `mockup-conventions.md#`Jira` | `mockup-conventions.md:976` | **F4** | 0 | `audit-mockup-colors.mjs`（距 39 行） | — | — |
| 10 | `mockup-conventions.md#M23.8.1` | `mockup-conventions.md:999` | **F4** | 0 | `audit-mockup-colors.mjs`（距 62 行） | — | — |
| 11 | `mockup-conventions.md#I2` | `mockup-conventions.md:1156` | **F1** | 4 | `audit-mockup-integrity.mjs`（距 81 行） | — | — |
| 12 | `mockup-conventions.md#M-INTEGRITY@blind:1247` | `mockup-conventions.md:1247` | **F4** | 0 | `audit-mockup-integrity.mjs`（距 10 行） | 编号漂移 · 闸看不见 | — |
| 13 | `mockup-conventions.md#M-INTEGRITY@blind:1256` | `mockup-conventions.md:1256` | **F4** | 0 | `audit-mockup-integrity.mjs`（距 19 行） | 编号漂移 · 闸看不见 | — |
| 14 | `mockup-conventions.md#M23.6` | `mockup-conventions.md:1448` | **F4** | 0 | `audit-mockup-integrity.mjs`（距 155 行） | — | — |
| 15 | `mockup-conventions.md#Acceptance~2` | `mockup-conventions.md:1509` | **F1** | 5 | `audit-mockup-integrity.mjs`（距 216 行） | 编号漂移 | — |
| 16 | `mockup-conventions.md#Acceptance~3` | `mockup-conventions.md:1555` | **F1** | 3 | `audit-mockup-library-origin.mjs`（距 181 行） | 编号漂移 | — |
| 17 | `mockup-conventions.md#(B)` | `mockup-conventions.md:1597` | **F1** | 3 | `audit-mockup-library-origin.mjs`（距 139 行） | — | — |
| 18 | `mockup-conventions.md#允许内容@blind:1608` | `mockup-conventions.md:1608` | **F4** | 0 | `audit-mockup-library-origin.mjs`（距 128 行） | 闸看不见 | — |
| 19 | `mockup-conventions.md#Acceptance~4` | `mockup-conventions.md:1610` | **F1** | 2 | `audit-mockup-library-origin.mjs`（距 126 行） | 编号漂移 | — |
| 20 | `mockup-conventions.md#M23.7` | `mockup-conventions.md:1640` | **F1** | 3 | `audit-mockup-library-origin.mjs`（距 96 行） | — | — |
| 21 | `mockup-conventions.md#Acceptance~5` | `mockup-conventions.md:1673` | **F1** | 3 | `audit-mockup-library-origin.mjs`（距 63 行） | 编号漂移 | — |
| 22 | `mockup-conventions.md#Acceptance~6` | `mockup-conventions.md:1723` | **F1** | 3 | `audit-mockup-library-origin.mjs`（距 13 行） | 编号漂移 | ⚠️ 1/3 |
| 23 | `mockup-conventions.md#Acceptance~7` | `mockup-conventions.md:1787` | **F1** | 4 | `audit-mockup-library-origin.mjs`（距 30 行） | 编号漂移 | — |
| 24 | `mockup-conventions.md#M32.4` | `mockup-conventions.md:1830` | **F1** | 4 | `audit-mockup-library-origin.mjs`（距 73 行） | — | — |
| 25 | `mockup-conventions.md#M32.5` | `mockup-conventions.md:1857` | **F1** | 3 | `audit-mockup-library-origin.mjs`（距 100 行） | — | — |
| 26 | `mockup-conventions.md#M32.6` | `mockup-conventions.md:1878` | **F1** | 4 | `audit-commit-affordance-trace.mjs`（距 115 行） | — | — |
| 27 | `mockup-conventions.md#Acceptance~8` | `mockup-conventions.md:1909` | **F1** | 3 | `audit-commit-affordance-trace.mjs`（距 84 行） | 编号漂移 | ⚠️ 1/3 |
| 28 | `mockup-conventions.md#M36` | `mockup-conventions.md:2028` | **F1** | 3 | `audit-commit-affordance-trace.mjs`（距 35 行） | — | — |
| 29 | `mockup-conventions.md#Acceptance~10` | `mockup-conventions.md:2073` | **F1** | 4 | `audit-handoff-deliverable-sections.mjs`（距 50 行） | 编号漂移 | — |
| 30 | `mockup-conventions.md#Acceptance~12` | `mockup-conventions.md:2167` | **F1** | 5 | `audit-mockup-typography-icon.mjs`（距 40 行） | 编号漂移 | — |
| 31 | `mockup-conventions.md#Acceptance~13` | `mockup-conventions.md:2185` | **F1** | 3 | `audit-mockup-typography-icon.mjs`（距 22 行） | 编号漂移 | — |
| 32 | `mockup-conventions.md#M39` | `mockup-conventions.md:2288` | **F1** | 4 | `audit-mockup-typography-icon.mjs`（距 81 行） | — | — |
| 33 | `mockup-conventions.md#M40` | `mockup-conventions.md:2313` | **F1** | 3 | `audit-mockup-typography-icon.mjs`（距 106 行） | — | ⚠️ 1/3 |
| 34 | `mockup-conventions.md#M41` | `mockup-conventions.md:2357` | **F1** | 4 | `audit-mockup-typography-icon.mjs`（距 150 行） | — | — |
| 35 | `mockup-conventions.md#Acceptance~15` | `mockup-conventions.md:2402` | **F1** | 3 | `audit-mockup-typography-icon.mjs`（距 195 行） | 编号漂移 | — |
| 36 | `mockup-conventions.md#Acceptance~16` | `mockup-conventions.md:2440` | **F1** | 3 | `audit-mockup-typography-icon.mjs`（距 233 行） | 编号漂移 | — |
| 37 | `mockup-conventions.md#Acceptance~17` | `mockup-conventions.md:2474` | **F1** | 3 | `audit-handoff-deliverable-sections.mjs`（距 210 行） | 编号漂移 | ⚠️ 1/3 |
| 38 | `mockup-conventions.md#Acceptance~18` | `mockup-conventions.md:2555` | **F1** | 6 | `audit-handoff-deliverable-sections.mjs`（距 129 行） | 编号漂移 | — |
| 39 | `mockup-conventions.md#M43.2` | `mockup-conventions.md:2608` | **F1** | 4 | `audit-handoff-deliverable-sections.mjs`（距 76 行） | — | ⚠️ 2/4 |
| 40 | `mockup-conventions.md#Acceptance~19` | `mockup-conventions.md:2709` | **F1** | 3 | `audit-handoff-deliverable-sections.mjs`（距 25 行） | 编号漂移 | — |
| 41 | `mockup-conventions.md#M42.3@blind:2730` | `mockup-conventions.md:2730` | **F1** | 1 | `audit-handoff-deliverable-sections.mjs`（距 46 行） | 闸看不见 | — |
| 42 | `mockup-conventions.md#Acceptance~20` | `mockup-conventions.md:2772` | **F1** | 3 | `audit-handoff-deliverable-sections.mjs`（距 88 行） | 编号漂移 | — |
| 43 | `mockup-conventions.md#Acceptance~22` | `mockup-conventions.md:2888` | **F1** | 3 | `audit-mockup-bilingual-spacing.mjs`（距 16 行） | 编号漂移 | — |
| 44 | `mockup-conventions.md#M-DISCIPLINE.SOURCE` | `mockup-conventions.md:2953` | **F1** | 3 | `audit-mockup-bilingual-spacing.mjs`（距 81 行） | — | ⚠️ 1/3 |
| 45 | `mockup-conventions.md#M-DISCIPLINE.SCOPE` | `mockup-conventions.md:2989` | **F1** | 7 | `audit-mockup-bilingual-spacing.mjs`（距 117 行） | — | — |
| 46 | `mockup-conventions.md#M-DISCIPLINE.SYNC@blind:3079` | `mockup-conventions.md:3079` | **F4** | 0 | `audit-mockup-handoff-evidence.mjs`（距 32 行） | 编号漂移 · 闸看不见 | — |
| 47 | `mockup-conventions.md#M-DISCIPLINE.SYNC@blind:3107` | `mockup-conventions.md:3107` | **F4** | 0 | `audit-mockup-handoff-evidence.mjs`（距 4 行） | 编号漂移 · 闸看不见 | — |
| 48 | `mockup-conventions.md#Acceptance~23` | `mockup-conventions.md:3113` | **F1** | 3 | `audit-mockup-handoff-evidence.mjs`（距 2 行） | 编号漂移 | ⚠️ 2/3 |
| 49 | `domain-tvu.md#M10` | `domain-tvu.md:129` | **F1** | 3 | `audit-mockup-geometry-consistency.mjs`（距 82 行） | — | — |
| 50 | `domain-tvu.md#M11` | `domain-tvu.md:154` | **F1** | 3 | `audit-mockup-geometry-consistency.mjs`（距 57 行） | — | — |
| 51 | `domain-tvu.md#M12` | `domain-tvu.md:179` | **F1** | 3 | `audit-mockup-geometry-consistency.mjs`（距 32 行） | — | — |
| 52 | `domain-tvu.md#M13` | `domain-tvu.md:194` | **F1** | 3 | `audit-mockup-geometry-consistency.mjs`（距 17 行） | — | — |
| 53 | `domain-tvu.md#M17.1` | `domain-tvu.md:253` | **F1** | 5 | `audit-mockup-geometry-consistency.mjs`（距 42 行） | — | — |
| 54 | `design-process.md#参考物落地（Reference` | `design-process.md:181` | **F1** | 5 | `audit-mockup-typography-icon.mjs`（距 150 行） | — | — |
| 55 | `design-process.md#Acceptance~5` | `design-process.md:614` | **F1** | 4 | `design-kickoff.mjs`（距 54 行） | 编号漂移 | — |
| 56 | `design-process.md#Step` | `design-process.md:669` | **F1** | 5 | `design-kickoff.mjs`（距 109 行） | — | — |
| 57 | `design-process.md#Canonical` | `design-process.md:714` | **F1** | 3 | `design-kickoff.mjs`（距 154 行） | — | — |
| 58 | `design-process.md#⚠️` | `design-process.md:833` | **F1** | 3 | `design-kickoff.mjs`（距 273 行） | — | — |
| 59 | `design-process.md#Acceptance~6` | `design-process.md:887` | **F1** | 4 | `design-kickoff.mjs`（距 327 行） | 编号漂移 | — |
| 60 | `design-process.md#M16.1` | `design-process.md:1136` | **F1** | 3 | `audit-handoff-deliverable-sections.mjs`（距 243 行） | — | — |
| 61 | `design-process.md#M21.1` | `design-process.md:1208` | **F1** | 3 | `audit-handoff-deliverable-sections.mjs`（距 171 行） | — | — |
| 62 | `design-process.md#M21.2` | `design-process.md:1264` | **F1** | 3 | `audit-handoff-deliverable-sections.mjs`（距 115 行） | — | — |
| 63 | `design-process.md#Acceptance~7` | `design-process.md:1282` | **F1** | 2 | `audit-handoff-deliverable-sections.mjs`（距 97 行） | 编号漂移 | — |
| 64 | `design-process.md#Acceptance~8` | `design-process.md:1309` | **F1** | 2 | `audit-handoff-deliverable-sections.mjs`（距 70 行） | 编号漂移 | — |
| 65 | `design-process.md#Acceptance~9` | `design-process.md:1346` | **F1** | 2 | `audit-handoff-deliverable-sections.mjs`（距 33 行） | 编号漂移 | — |
| 66 | `design-process.md#Acceptance~11` | `design-process.md:1431` | **F1** | 3 | `audit-handoff-deliverable-sections.mjs`（距 52 行） | 编号漂移 | — |
| 67 | `design-process.md#Acceptance~12` | `design-process.md:1481` | **F1** | 5 | `audit-handoff-deliverable-sections.mjs`（距 102 行） | 编号漂移 | — |
> **列的读法**：
> · **类** —— F1 扩已有闸 / F4 先补核查项（F2 为空，见 §2.2）
> · **候选可扩的闸** —— 结构邻近度（该闸已认领的最近一段离本段多少行），⛔ 非「它真能检查这条」
> · **前置** —— 与「类」**正交**，⛔ 不可相加
> · **线索** —— 该段有几条核查项带「不可机检」词法特征。🔴 **是线索不是判读**；
>   「无线索」⛔ **不代表可机检**（金标实测 15 条段级豁免里有 6 条零线索）

---

## 🔴 4. 一个「计数对、归因错」的活样本（第 27 条，⛔ 不删）

「锚点不稳」这件事有两个候选判据，实测**都得 33**：

| 判据 | 条数 |
|---|---:|
| ① **slug 碰撞**（本处方现行判据：id 会带 `~N` 序号 ⇒ 锚点会漂） | **33** |
| ② **标题不是具名规则**（计划书预注册用的定义） | **33** |

⇒ 数字**逐字相同**，但**集合不同** —— 各有 **8** 条只落在自己一边，约 **24%** 的归属不一致。

🔴 **计划书预注册的是判据 ②，本处方最终用的是判据 ①。**
若只核对「条数是不是 33」，这处判据替换会**完全无声地通过** —— 而逐条归属已经换了四分之一。

⚠️ 这与 `round2-status.md` **N74** 是同一形态（那次三个 counts 碰巧全对、逐条归属全错）。
⇒ **口径：核对分类结果必须比 `id` 集合，⛔ 只比总数不算核对过。**

（另有一处**本处方自己**的判据订正：初版把 `@blind:` 合成 id 也算作「锚点不稳」得 35，
被交叉验证控制当场揪出 —— `@blind:` 是 **lab 自己合成的记法**，把它的形状算成对方的编号缺陷，
是**把自己的记法算到对方头上**。已改为按 slug 碰撞判。）

---

## 5. 执行状态栏

> 🔴 §28.9 判出「处方结构性没有『执行状态』栏」是回改存量缺口的**根因** ⇒ 本栏不许省。
> **每次 DS 侧动了其中任何一条，回到这张表更新状态**，⛔ 别只在别处记。

| # | 条目 | 谁拍 | 状态 | 更新日期 |
|:-:|---|---|---|---|
| 1 | 是否接受「先解 N-D1 → 再放宽 `ACC_RE` → 最后补自陈」这个顺序（§2.5） | DS owner | ⬜ 待拍 | — |
| 2 | ~~F4 那 10 条：补写核查项，还是从 126 的分母里去掉~~ ⛔ **问题本身已作废**（§2.6.1 证伪了两个选项的共同前提）⇒ 改拍：**13 段行内形态的 Acceptance，走 C1 改写文档 还是 C2 改闸的抽取** | DS owner | 🟡 **仍待拍**（取舍成立）—— ⚠️ **但射程已缩：13 段 ⇒ 6 段**，见下方订正 | **2026-09-14 现取** |
| 3 | 逐条人工判读「被测物在哪个面」（§2.3），67 条 | ~~DS owner~~ ⇒ ✅ **已由 agent 做掉，⛔ 不再需要 owner** | ~~⬜ 未开始 0/67~~ ⇒ 🔴 **该栏已过期，见下方订正** | **2026-09-14 现取** |
| 4 | F1 判读为可机检的那些：扩候选闸 + 补 `covers-acceptance:` 自陈 | DS 开发 | ⬜ 未开始 | — |
| 5 | F1 判读为不可机检的那些：写豁免理由入册 | DS owner | ⬜ 未开始 | — |
| 6 | 复跑量具确认「没人管」条数下降（`--self-check` 须全绿） | lab | ⬜ 未开始 | — |

### 5.1 🔴 2026-09-14 现取订正 —— 第 2 / 第 3 行的状态都已过期

> **口径**：DS `4532f289`（起手同 sha；⚠️ 工作树脏 15 项，**⛔ 无一项属本格**，且⛔ 无一项在判定面内）。
> 读数全部现取，⛔ 不转引本处方或交接单里的任何数。

**第 3 行（67 条逐条人工判读）⇒ ✅ 不再需要 owner。** 三条独立读数：

1. **那个动作已被 agent 做掉**：`decision-queue.md` §「✅ 2026-09-04 已全量预分类」逐字
   「59 段做了**全量**预分类（⛔ 不抽样）」，并附分档表（`not-machine-checkable` 6 · `gate` 51 ·
   **`needs-owner` 2**）+ 一句对账「✅ 与闸自印 `unclassified 59` 对账一致」。
   ⚠️ 该结论还**先撤回了一个错建议** —— 原打算「抽样先判 10 段」，owner 反问「为啥要抽样」，
   逐字记着「正解不是**减少 owner 的负担**，是**减少需要 owner 的集合**」。
2. **需要 owner 的那一支已拍完**：`needs-owner` 那 2 段 = Q1-a（`#M23.10`）+ Q1-b（`#M40`），
   **两段都在 2026-09-07 拍定并落地**（Q1-b ⇒ DS `bb9146af` 上闸；Q1-a ⇒ owner 拍「不上闸」+ 登记豁免）。
3. **棘轮实测在动**：`scripts/audit-acceptance-gate-coverage.mjs` 现取 `BASELINE_UNCLASSIFIED = **35**`，
   闸头注释逐字记着完整轨迹 **62 → 59 → 53 → 52 → 51 → 48 → 46 → 41 → 40 → 38 → 37 → … → 35**，
   每一步都带归因 commit。
   ⚠️ **⛔ 但「67 → 35」⛔ 不是同一口径的减法**：**67** 出自 lab 量具 @pin `b3728d38`（2026-08-31），
   **59** 是闸自印 @2026-09-04「扫描面口径微调后的现取值」（`AGENTS §2.4`）⇒ 逐条现状仍须重跑量具，
   **那是冻结清单 L5/L6，⛔ 不是本格**。

**第 2 行（13 段行内形态）⇒ 🟡 仍待拍，但射程缩了一半。** 用**闸自己的解析器**现跑
（`collectSections()`，⚠️ 返回契约是 `{ sections, missing }` **⛔ 不是数组**；已断言 `missing = 0`，
否则 cwd 错会让文件静默落进 `missing` 而不抛 = 一条 fail-open）：

| 读数 | 立项时 @`b3728d38` | 现取 @`4532f289` |
|---|---:|---:|
| 段总数（SCAN_FILES 7 份）| — | **133** |
| `items > 0`（阳性对照：装置活着）| — | **127** |
| **`items = 0`（本行的射程）** | **13** | **6** |

现取那 6 段逐条（⛔ 不只给计数）：

| 段 id | 行 | 形态 |
|---|---:|---|
| `mockup-conventions.md#C5` | 482 | 同行正文（**处方 §2.6.1 点名的样例，实测 items 仍 = 0**）|
| `mockup-conventions.md#M23.18` | 1023 | 同行正文（`**Acceptance 新增一行**：`）|
| `mockup-conventions.md#`Jira` | 1179 | 同行正文 |
| `mockup-conventions.md#M23.8.1` | 1222 | 同行正文 |
| `mockup-conventions.md#M35` | 2305 | 标题形态 `#### Acceptance`，段内无列表项（= 原表的 `following-prose`）|
| `mockup-conventions.md#M-DISCIPLINE.SYNC` | 3804 | 同行正文（`**Acceptance（M-DISCIPLINE.SYNC）**：`）|

⇒ **C1 / C2 那个取舍本身一个字没变**（`ITEM_RE` 现取逐字 `/^- (?:\[[ xX]\]\s*)?(.+)$/` ⇒ **仍只认 `^- `**），
只是**要改的段从 13 变 6**。⛔ **lab 仍不代拍。**

⚠️ **本格量自己时踩的两个口径坑，⛔ 登记不删**：
① 起手把射程读成「`ACC_RE` 抽不到**段**」（= `lab:N62` 那个缺陷），而本行的标的是
「`ITEM_RE` 抽不到**核查项**」—— §2.6.1 与 §2.6.2 逐字已警告过「两者**不可合并处理**」⇒ **主语窄化**（`lab:E50`）。
② 自写正则只认 `**Acceptance**：`，**漏掉 2 个措辞变体**（`**Acceptance 新增一行**：` /
`**Acceptance（…）**：`）⇒ 得 3 而非 5（`AGENTS §23` 推论一：按措辞取数先列同义变体表）。
⇒ **最终采用闸自己的解析器读数（6），⛔ 不用我那个正则的读数。**

⚠️ **⛔ 未核（如实登记，⛔ 不是 TODO）**：本表**第 1 行**（「是否接受『先解 N-D1 → 再放宽 `ACC_RE` →
最后补自陈』这个顺序」，标 DS owner ⬜ 待拍）**本格未核** —— 它**不在冻结清单的 6 条 owner 项里**
⇒ 按 `AGENTS §0.1` 铁律 2，**只登记、⛔ 不排期**，已写进 `docs/frozen-worklist.md` §3。

---

## 6. 验收标准

1. `node metrics/unclassified-fix-triage.mjs --pin <新 pin> --dump <新 dump> --self-check`
   ~~**11 条控制全绿**，且 `unclassified` 条数 **< 67**。~~
   🔴 **2026-09-15 订正（原措辞与量具【结构互斥】，这条标准此前不可能达成）**：

   - **互斥在哪**：量具有 5 条控制把**当轮读数**写死在判据里（`must-hit-1` 的 67 ·
     `must-hit-2` 的 10 · `must-hit-5` 的 67 · `must-hit-6` 的 8 · `must-not-hit-2` 的 67）
     ⇒ `unclassified < 67` **一旦成立，那几条必红** ⇒ 「全绿」不可达。
     实测坐实：换 pin `19e55102`（71 条）跑 ⇒ `EXIT=1`、3 条控制 ✗、stderr 逐字
     「❌ 控制未全绿 ⇒ 本次读数不可解读」。
   - **「11 条」这个数也是错的** —— 实测量具有 **12 条**控制。
     ⇒ **⛔ 验收标准里不写死条数**（`AGENTS §2.13` 推论二：协议里写死的量会过期）。

   ⇒ **现行标准**：`--self-check` **退出码为 0**（即全部控制通过），且 `unclassified` 条数 **< 67**。

   ⚠️ **同日已修掉那个互斥**（量具侧，见 `metrics/unclassified-fix-triage.mjs` 的 `PREREGISTERED`
   表头注释）：写死的读数改成**按 pin 查预注册表的三档判据** —— 同 pin 断言写死值**且**断言一致性、
   跨 pin 只断言一致性并显式印「⚠️ 跨 pin」、dump 缺失/损坏 fail closed 抛。
   🔴 **⛔ 这不是把控制放松**，三臂实测（⛔ 不是推的）：

   | 臂 | `EXIT` | `must-hit-1` 读数 |
   |---|:-:|---|
   | 同 pin `b3728d38` + 真 dump | **0** | ✓ 外部 dump 文件 · **预注册总数 67 = true**（仍断言）|
   | 跨 pin `19e55102` + 真 dump | **0** | ✓ 外部 dump 文件 · 跨 pin ⇒ 只断言一致性 |
   | **造故障**（同一份 dump 篡改 1 个 id）| **1** | ✗ **id 集合逐字相等 = false** |

   ⇒ 三臂读数互不相同 ⇒ **判别器成立，⛔ 不是恒绿也不是恒红。**

   🔴 **同批查出并修掉一个更深的缺陷（⛔ 登记不删）**：`must-hit-1` 原本比的两个集合
   **同源** —— `rows = unclassified.map(...)` 一一对应 ⇒ `JSON.stringify` 那个比较**恒真**，
   `mine.length === 67` 是它**唯一**的信息量来源。根因是 **`--dump` 参数声明了却从没被读**
   （只进过产物的 `dumpSource` 字符串）。⇒ 已让它真读外部 dump 文件，该控制才有了真判据。
   ⚠️ 这是 `N81.1`（「控制的两侧都要问：它和谁比，那个『谁』是不是同一个来源」）的
   **第二个实例** —— 上一次只发现了 `must-hit-0`。
   ⚠️ **不给 `--dump` 那一档仍然恒真**，控制的 detail 会显式印「⚠️ 内联复算（同源 ⇒ 本判据恒真）」
   ⇒ ⛔ 别把那一档的绿读成「id 集合被外部验过了」。
2. 下降的每一条**能逐条定位**到本表里的某个 `id`，⛔ 不接受「总数少了 N 条」这种交代
   —— 那正是 §4 那条教训（计数对、归因可以全错）。
3. 每条新增的 `// covers-acceptance:` 自陈，其指向的 `id` 在**新 pin 上仍存在**
   （即 N-D1 已解或该段 slug 不碰撞）。⚠️ 不验这一条，就会重演「自陈指错」。

---

<sub>lab 只审查、不裁定（`AGENTS.md` §8）。本处方给的是**可选修法方向**，DS owner 保留否决与改判的权力。</sub>
