# Q1 · B3 那 4 段的**分母 / 落点读数**（⛔ 本轮只量，不写闸）

> B3 那一档的定义逐字就是「要**先量分母**才能定判据（⛔ 不许先写闸后量）」。
> 本文件是那次测量的落盘物。⇒ 四段量完的结论：**没有一段能照裁定表的字面直接上闸** ——
> 两段的判定面根本不落盘、一段的形态有 37% 假阳、一段的前件够不着。
>
> ⛔ 本文件**不是**「B3 做完了」。它把 4 段各自卡在哪写清楚，并把其中 3 段该问 owner 的
> 部分整理成**两条一次能拍完的队列条目**。

---

## 0 一张表看四段

| # | 段 | 裁定表原写的红输入 | 本轮量出 | 结论 |
|---|---|---|---|---|
| 3 | `#Canonical` | 存在名为 `Canonical Terms` 的表而**行数 < 3** ⇒ 红 〔⚠️ 先量前件〕 | **前件够不着**：4 份 payload 里 `Canonical Terms` **零命中**、表头列名（`EN canonical`/`ZH canonical`/`不准用的同义词`）**零命中**、handoff 模板**无此段** | ⇒ 上闸**恒绿、零信息**。分支 `nmc`（⚠️ 登记属 C4 ⇒ owner） |
| 20 | `#M23.18` | M48 self-check 清单里缺「画布主题探测结果」那一行 ⇒ 红 · 判定面 **H** 〔⚠️ 先量落点〕 | 🔴 **判定面是 X（不落盘），⛔ 裁定表写的 H 是错的** | ⇒ 分支 `nmc`（⚠️ 登记属 C4 ⇒ owner） |
| 47 | `#M-DISCIPLINE.SOURCE` | 正文出现裸 node id（`\d+:\d+`）/ file key / 像素取值表 / 人名，而所在段无「为什么跨产品通用」说明 ⇒ 红 〔⚠️ 存量要棘轮〕 | 形态**假阳率 ≈ 37%**；去污后真存量 ≈ **19**（单文件） | ⇒ **⛔ 不需要 owner**：收窄形态 + 棘轮即可 ⇒ **降 B 档**，下一批可落 |
| 48 | `#M-DISCIPLINE.SCOPE` | 审计报告 md 的标题或首行无显式 scope 声明 ⇒ 红 〔⚠️ 先量「哪些算审计报告」〕 | 🔴 **前件不存在**：仓里没有「哪些算清单 / 审计报告」的定义 | ⇒ **与 Q1-b（`#M40`）结构同型**：上闸前 owner 需先在规则正文定对象集 ⇒ owner |

⇒ **4 段里只有 1 段（第 47）真归 agent。** §1.1 的自查我逐条过了，理由在各节末尾。

---

## 1 第 20 条 `#M23.18` —— 判定面是 **X**，⛔ 不是 H

Acceptance 逐字（`mockup-conventions.md:987`，散文一行、Σ=0）：
> 起手 **M48 self-check 清单**必含一行"本任务 PRD/UX/Journey 卡画布主题探测结果 =
> light/dark/unknown → 采用 M23.18/navy"，不得凭印象跳过探测直接选样式。

⇒ 判定对象是「M48 self-check 清单」。**那份清单在 DS 仓里没有落点** —— 三条读数：

| # | 读数（⛔ 本轮亲跑，非转述） |
|---|---|
| **A** | `docs/internal/backlog.md:203` 逐字：「**① 仍开着 · 剩 2 条**：R0 / Phase 0 元素→组件映射 · **M48** 起手 Rule-Coverage Self-Check（两条产物**落 Figma 侧或对话侧**，`audit-deliverable-open-questions.mjs` 头部逐字声明「Figma frame 内文字不可达 = 天生在 gate 视野外」）」 |
| **B** | 亲跑该 entry 自己给的判据（`:207`）：`grep -rniE "M48 Rule-Coverage\|Rule-Coverage Self-Check" scripts .husky .gitea` ⇒ **EXIT=1**（零命中）。**阳性对照**同语法查 `handoff-deliverable-sections` ⇒ **EXIT=0** ⇒ ⛔ 不是路径打错 |
| **C** | `grep -rn '画布主题探测结果' --include='*.md' .` ⇒ **只命中规则自己那一行**（`mockup-conventions.md:987`）⇒ 没有任何清单 / 模板 / handoff 段承载它 |

⚠️ **⛔ 别提「那就往 handoff 模板加一段承载它」** —— `backlog.md:194` 逐字禁掉了这条路：
「这些 L1 重灾区规则的**正文自己就指定了一份可落盘产物** …… ⛔ **别为它们发明新的产物格式**」。
而 M48 的正文指定的产物格式（`design-process.md:339` 起那张三列表）落点就是**起手对话/Figma**。
⇒ 给它另造一个 `.md` 落点 = 发明新产物格式，且那是 owner 的措辞决定。

**如实登记「可探的那一半」**（⛔ 不许写成「完全不可机检」—— 那正是 `#M21.3` 假理由的传染方式）：
`detectFrameTheme` 那段算法（`:972-979`）本身**在 payload 侧可算**（`fills[0].color` + luma 阈值），
所以「这一帧到底是 light 还是 dark」是可机检的；⛔ **够不着的是「AI 起手有没有把探测结果写进清单」**
—— 那句声明落在对话里。⇒ 判 NMC 的理由是**声明的落点**，不是「主题探不到」。

---

## 2 第 3 条 `#Canonical` —— 前件（表存在）在可见判定面上从未满足

Acceptance 三条（`design-process.md:763`，Σ=3）：
1. `设计阶段（Phase 0，非 PRD frame），Canonical Terms 表 ≥ 3 行`
2. `所有 mockup 文本 … grep 一遍，无表外同义词`
3. `handoff doc 复用同一张表，dev 看 mockup 与 doc 术语 1:1`

**读数**（四份本机 payload 快照 + 模板）：

```
'Canonical Terms' 字面                          ⇒ 4 份全 0
表头列名 EN canonical / ZH canonical / 不准用的同义词 ⇒ 4 份全 0
名字含 canonical 的节点                          ⇒ 仅 1 个,且它是断点注释
   逐字 "1920 — canonical, full layout. 1440 — Company column hidden…"（⛔ 不是术语表）
templates/ 下 'canonical terms'                 ⇒ 0（模板无此段 ⇒ [3] 那一半也够不着）
```

⇒ 「表存在而行数 < 3」这个判据的**分母是 0 ⇒ 恒绿 ⇒ 零信息**。

⚠️ **这个读数的边界必须说清，⛔ 别推得比它宽**：
- 4 份是**本机未进 git 的 payload 快照**（`.gitignore:29`），且它们都是 **mockup 文件**；
  而规则逐字要求那张表落在「**设计阶段（Phase 0，与设计稿同处）**」⇒ 它可能压根不在这几份里。
- ⇒ 能说的只有「**在 DS 能看到的判定面上，这张表从未出现**」，
  ⛔ **不能**说「全公司从没产出过这张表」，也 ⛔ 不能说「规则没人遵守」。

**如实登记「可探的那一半」**：表**若**出现，「行数 ≥ 3」与 [2] 的「表外同义词」都**可机检**
——[2] 需要的「同义词清单」恰好就是表的第 4 列（`不准用的同义词`），
⚠️ **这一点更正裁定表**：它写「[2] 需要「同义词」这个输入，它不落盘」，而那一列**在表里**。
⇒ 真正够不着的是**表本身**，不是同义词列。

---

## 3 第 47 条 `#M-DISCIPLINE.SOURCE` —— ⛔ 不需要 owner，但形态要先收窄

Acceptance [2] 逐字：
> 真源条文里出现具体 node id / file key / 像素取值表 / 人名时，**必须能说明它为什么跨产品通用**；
> 否则改为指向项目 repo 的指针

**读数（原始形态，`\d+:\d+`）**：

| 文件 | 裸 node-id 命中 | `\d+px` | 22 位 key |
|---|---:|---:|---:|
| `mockup-conventions.md` | 30（去重 22） | 104 | 3 |
| `design-process.md` | 20 | 8 | 2 |
| `code-conventions.md` | 16 | 11 | 3 |
| `domain-tvu.md` | **0** | **0** | **0** |

🔴 **原始数是假分母 —— 逐条看完后假阳率 ≈ 37%**（30 处里 11 处根本不是 node id）：

| 假阳类型 | 实例（逐字） | 处数 |
|---|---|---:|
| **比例 / 习语** | `1:1 对应` · `1:1 对照` · `1:1 贴合` · `1:1 邮件` · `不强制 1:1` | 7 |
| **长宽比** | `Section 长宽比（≈ 2:1 / ≈ 1:2）` | 2 |
| **截断 URL 示例** | `udp://237.0...0:1234`（出现 2 处） | 2 |

⇒ 去污后真存量 ≈ **19**（`mockup-conventions.md` 单文件），另两份需同样去污。

🔴 **`\d+px` 那 104 处⛔ 不能整片算违例** —— 规则 ② 自己逐字划了界：
「取值、清单、node id、file key、人名、像素数 ⇒ 项目资料；**做法、判据、核查项类别、反模式 ⇒ 真源**」。
而本仓大量 px 出现在**判据本体**里（`blur(8px)` / 「判据：≤ 60px」/ `strokeLeftWeight ∈ {4}`）
⇒ 那些是**真源该有的**。把它们算进分母 = 又一个假分母。

### 为什么这一条 ⛔ 不需要 owner（§1.1 自查）

- **不是 C4**：不加豁免、不降判据、不扩 agent 权限 —— 相反是给自己加约束
- **不是 C2**：不需要「遇到得多不多」这个只有 owner 才有的输入 —— 存量数是量出来的
- **不是 C3**：没有两个真源在冲突
- **摩擦**：19 条存量靠**棘轮**（具名集合 + 只许缩）压到 0 ⇒ 上闸当天零摩擦。
  棘轮形态 owner 已于 Q2 拍定并逐字降为 B 档（「同类棘轮此后照此形态落，⛔ 不再问 owner」）
- ⇒ **修法唯一** ⇒ agent 自己拍，降 **B 档**

**下一批落地要先做的两件（⛔ 别跳）**：
① 形态收窄到能排掉上表那三类假阳（比例 / 长宽比 / URL 示例），并为每一类留一条**阴性对照**；
② `\d+px` 那一支**要么不做、要么先答「怎么区分判据取值与项目取值」** ——
   ⚠️ 后者可能本身就不可机检，那就如实只做 node-id / file-key 那两支并登记边界。

---

## 4 第 48 条 `#M-DISCIPLINE.SCOPE` —— 前件不存在，与 Q1-b 结构同型

Acceptance [1] 逐字：
> 任何**清单 / 审计报告**的标题或首行含一句显式 scope 声明（覆盖哪些对象 + 是否含 instance 子树）

⇒ 判据的第一步是「**哪些文件算清单 / 审计报告**」。**这个对象集在仓里没有定义**：

```
grep -rn '算审计报告|审计报告的定义|清单类产出物|哪些算清单' --include='*.md' docs/
  ⇒ 零命中（2026-09-08 现取）
```

**我拿文件名启发式凑了一个候选集当探针**（名字含 `audit|backlog|gap|ledger|inventory|checklist|debt|coverage|report`，
排除 `_archive`）⇒ **34** 个 `.md`，其中首 4 行带 scope 声明的只有 **4** 个。
🔴 **但那个启发式自己不成立** —— 它把这些也算进来了：

| 被误收的 | 它其实是 |
|---|---|
| `docs/CONSUMER_AUDIT_SETUP.md` | **安装指南** |
| `docs/superpowers/plans/*.md`（2 个） | **计划** |
| `docs/superpowers/specs/*.md` | **设计 spec** |
| `docs/V1_RELEASE_CHECKLIST.md` | 发布检查表（在不在射程内本身就是那个待定义的问题） |

⇒ 「30 条违例」这个数**完全取决于对象集怎么定**，而定它就是**往真源里写一条新定义**。

### 为什么这必须 owner 做（与 Q1-b `#M40` 逐字同型）

按仓规「判据串必须**逐字取自活源**」（`audit-handoff-deliverable-sections.mjs` 头注释逐字
「⛔ 判据字符串逐字取自活源，**未发明任何新格式**」），而规则现在**没有**那个对象集的串
⇒ 得先改规则真源的措辞。**那是 owner 的措辞决定，⛔ agent 不能替他往真源里发明。**
这与 Q1-b 一模一样：owner 那次给了 literal（候选 2）之后，该段当场降 B 档。

**已备好的三个候选**（⏳ owner 选一个或改；⛔ agent 不替他定）：

```
候选 1（按目录，最窄）
  对象集 = docs/internal/_reports/ + docs/internal/_generated/ 下的 .md

候选 2（按产出方式，推荐）
  对象集 = 「由一次走查 / 审计 / 清点产生、且列举了具体对象的 .md」——
  判据落「文件里存在 ≥1 张列举对象的表或清单」，⇒ 安装指南 / 计划 / spec 自然落选

候选 3（按显式标记，判据最硬）
  产出物首行写一个显式标记（形如 `<!-- audit-report: scope=… -->`），闸只判该标记的存在性
  ⚠️ 代价 = 要给存量 34 个候选逐个补标记,且它是新格式（⛔ 需 owner 拍）
```

⚠️ **推荐候选 2 的理由**：它不需要新格式（判据落在「有没有列举对象的清单」这个**已有形态**上），
也不需要有人去给存量补标记；⛔ 但它仍然是一条**新写进真源的定义** ⇒ 仍归 owner。

---

## 5 ⛔ 这份读数不能说的话

- ⛔ 不许说「B3 做完了」—— 本轮**只量，零上闸**。棘轮仍是 **40**
- ⛔ 不许说「`#Canonical` 这条规则没人遵守」—— 读数只覆盖 **DS 能看到的 4 份 mockup payload
  快照（且未进 git）**，而规则要求那张表落在设计阶段文件 ⇒ 它可能压根不在这几份里
- ⛔ 不许说「`#M23.18` 主题探不到」—— `detectFrameTheme` 在 payload 侧**可算**；
  够不着的是「**那句声明有没有写进起手清单**」
- ⛔ 不许把 `\d+px` 的 104 处当成 `#M-DISCIPLINE.SOURCE` 的分母 —— 规则自己把**判据取值**归真源
- ⛔ 不许说「`#M-DISCIPLINE.SCOPE` 有 30 条违例」—— 那个数完全取决于对象集怎么定，而它未定义
- ⛔ 不许说「4 段里 3 段要 owner，所以 B3 卡住了」—— 第 47 条归 agent 且已降 B 档，下一批可落
