# Q1 · B2 余 33 段 —— 存量筛选读数（⛔ 只量，本轮零上闸）

> **为什么要这份文件**：本轮连着量了三段（§M23.8.1 第 5 款 · §M45+§M45.1 · §M-FONT），
> 三段全都落不了地，而**三段撞的是同两堵墙**。
> ⇒ 那不是「这三段运气不好」，是 B2 余 33 段的**结构性约束**，必须落盘，
> 否则下一轮又会挑一段、量一遍、再撞同一堵墙。

---

## 0 两堵结构性的墙（⛔ 挑下一段之前先拿这两条过一遍）

### 墙 1 · payload 未进 git ⇒ **有存量的段一律落不了**

`.gitignore:29` 排掉 `figma-data/mockup/`，`git ls-files` 为空 ⇒ 那 4 份快照（1.1 GB）
只在开发者主工作树。后果是**棘轮这条路整体不可用**：

- 具名集合棘轮要能从仓内核对集合，而集合在一份不进 git 的文件里；
- 设计师的正常改动就会让「集合成员消失 ⇒ 报 FAIL」误报。

⚠️ 这与 `#M-DISCIPLINE.SOURCE` **根本不同** —— 那条的判定面是 4 份**进 git** 的 md。
⇒ **推论**：P 类判定面的段，只有**今日存量 ≈ 0** 的才落得了。
已落地那 4 段全都符合：`` #`Jira `` 违例 **0** · `#M23.8.1` **7**（小到直接登记）·
`#M41`+`#M12` **3**。⇒ 这不是巧合，是这堵墙筛出来的。

### 墙 2 · product / annotation 区分不可靠 ⇒ **依赖它的射程会两头出错**

仓里唯一的区分是 `audit-mockup-typography-icon.mjs:161` 的 `ANNOTATION_RE`（按**图层名**判）。
本轮在两个不同的段上各测了一次，**两次都坏**：

| 用在哪 | 怎么坏的 |
|---|---|
| §M23.8.1 第 5 款 | 假阳只砍掉一半（annotation 区第 1 条逐字 `Anti-pattern: … Merge All IP Source toggle` —— **annotation 在描述产品文案**），而 11 个真溯源标记里 **6 个落在 product 区** ⇒ 真阳漏掉过半 |
| §M-FONT | 「product 区」off-grid 抽样的头几条是 `What goes here — every toast / message string shown on the L` —— **那是说明文字**，只因图层名不含 `ANNOTATION_RE` 的任何词就被算成产品层 |

⇒ 根因：`ANNOTATION_RE` 靠**图层名**判，而说明性内容的图层名经常就是它的正文首句。
⛔ 别再假设「加一个 product/annotation AND 就能收窄射程」。

---

## 1 本轮量过的三段，逐段结论

### 1.1 §M23.8.1 第 5 款「出处本身必须可点」 ⇒ **不上闸**

读数与重开条件独立落盘在
[`2026-09-09-q1-m23-8-1-clause5-denominator-readings.md`](2026-09-09-q1-m23-8-1-clause5-denominator-readings.md)。
一句话：**296 不是分母**（`Source` 在 TVU 是产品第一术语），真违例 0，形态与语种都切不开。
⇒ 已落地 DS `d9cd4aa5`（改掉那个生出假抓手的读数，⛔ 零判据变化）。

### 1.2 §M45 + §M45.1（page 命名） ⇒ **不上闸**，三条各自独立的理由

裁定表把它们记作第 40 / 41 行（`#M45` / `#M45~2`）。
🔴 **先更正裁定表一处**：`#M45~2` 不是「M45 的第二段」，它是 **§M45.1**（新需求 → 新建独立 Page）。
而 M45.1 的 Acceptance [3] 逐字「page 命名符合 §M45（无 Jira 用 `<Title EN> YYYYMMDD`）」
⇒ **它确实与 M45 [1] 是同一条判据的两个分支**（有 Jira 三段式 / 无 Jira 两段式）。
⇒ 「一条判据解掉两段」这个判断**是对的**，落不了的原因在别处：

| # | 挡路的 | 现取证据 |
|---|---|---|
| 1 | **射程自指** | §M45 射程逐字是「任何与 **Jira 需求关联**的 mockup page」。怎么判一个 page 关不关联 Jira？——**看它有没有 FB-id**，而那正是断言本身 ⇒ 判据退化成「有 FB-id 的 page 必须有 FB-id」= 恒真 |
| 2 | **射程时序** | 触发逐字是「**新建** page…」+「**修改既有 page 的内容** to host 新需求 ⇒ 必须 rename」⇒ 射程是那一刻，而 payload 只给当前状态。真面里有一个分隔 page 逐字叫 `----------- Before 20190524 ----------` ⇒ 存量老 page 本就不在射程内 |
| 3 | **88% 假阳，且排除形态不在规则里** | 129 个 page：三段式 34 · 两段式 69 · 不合规 **26**。那 26 个里 **23 个是假阳** —— 20 个装饰性分隔 page（`-------------- To be confirmed  ----------------`）· `Description of this Figma file` · `Symbols` · 等。真违例约 **3**（`< FB-7010 > Rename the RVF separately from the Receiver name` 缺日期 · `Basic and Temp Feature` · `Copy Device`） |

🔴 **顺带量出一处规则字面与真面的差异（值得单独记）**：
规则 §M45.1 逐字把阶段分隔 page 写成 `To be designed >>` / `To be confirmed >>`（带 `>>`），
而真面上**一个 `>>` 都没有**，实际形态是破折号包围：`-------------- To be confirmed  ----------------`。
⚠️ 这**不是**真源冲突（C3）—— 真面那个字符串**包含**规则给的那四个具名词，多出来的只是装饰。
⇒ 若日后要落，分隔符识别应当用规则给的**那四个词**（逐字取自活源），
⛔ 不要用「破折号」这个形态（那是发明格式，Q1-e 那个陷阱）。
⚠️ 但即便如此仍排不干净 —— 真面还有 `------ V4 (V8.0+) ------` / `----- undo -----` /
`--- Config T ( Local UI ) v7.7+&v8.0+ 20240220) ---` 这类**不含那四个词**的分隔 page。

### 1.3 §M-FONT（fontSize 不可 off-grid） ⇒ **不上闸**（存量太大）

判据零件其实**全在活源里**，这一条是本轮三段里最接近能落的：

- 闭集 `[10,11,13,15,17,19,21]` **逐字**在 Acceptance 的算法里
  （`frame.findAll(n => n.type === 'TEXT' && [...].includes(n.fontSize))`，命中数应 = 0）
- 射程「**M-FONT grid 约束的是产品层 TEXT**」**逐字**在 `mockup-conventions.md:945`
  （2026-07-27 补的那条与注释层的优先级裁定）
- 且实测**确是真缺口**：`typography-icon` 的两个 probe，FONT 只罚 annotation 区（判**字体家族**）、
  GLYPH 只罚 product 区（判 Unicode 图标）⇒ **fontSize 这一维两边都没判**
  （与裁定表 §7 第 3 条那次「已覆盖」印象被推翻一致）

**挡路的是存量**（现取，4 份 payload / 305,222 节点）：

| 区 | 带 fontSize 的 TEXT | on-grid | ⛔ off-grid | 其余 |
|---|---:|---:|---:|---:|
| product | 44,455 | 40,012 | **3,971（8.9%）** | 472 |
| annotation | 13,930 | 10,844 | 2,672 | 414 |

product 区 off-grid 字号分布：`10px×1180 · 11px×1154 · 13px×995 · 15px×496 · 17px×145`。

⇒ 直接上闸一次红 **3,971** 条；而收存量要棘轮，**棘轮撞墙 1**。
⚠️ 且那 3,971 里有多少是**墙 2** 带来的假阳（说明文字被算成产品层）**未量** ——
⛔ 别把 3,971 当成「真违例 3,971」。

---

## 2 一次遍历量出的 6 段存量 —— ⚠️ 只有 2 行是可用读数

⛔ **这些形态抄自裁定表第 6 章的「会让它判红的具体输入」列，不是活源判据** ——
只用来筛「今日存量 ≈ 0」，真落地时**必须回活源核判据串**（裁定表的「档」列与形态列
本轮已第 N 次被证明会错，见 §1.2 那处更正）。

| 段 | 分母 | 存量违例 | 比例 | 判 |
|---|---:|---:|---:|---|
| **`#M38`** selected 行 rail `strokeLeftWeight ∉ {4}` | 377 | **0** | 0.0% | ✅ **零存量 ⇒ 不需棘轮，下一批首选** |
| **`#M32.4`** `Status=Disabled` 变体 + 祖先 `opacity<1` | 13 | **0** | 0.0% | ✅ 零存量，⚠️ 但分母只有 13 |
| `#M33` product frame 内 `Noto Sans SC` | 2,736 | 2 | 0.1% | ⚠️ 那 2 条抽样逐字是中文说明（`S3 / S3b 状态下，用户点 [−]…`）落在 `S3` 开头的帧内 ⇒ **假阳**（墙 2）。存量真值可能是 0 |
| `#M23.12` UX/PRD 卡 `primaryAxisSizingMode !== 'AUTO'` | 176 | 164 | 93.2% | ⛔ **探针没接上** —— 抽样里那个字段**全是 `undefined`**。⛔ 别把 164 当读数 |
| `#M31` product frame 内 `layoutMode === 'NONE'` | 3,336 | 460 | 13.8% | ⛔ **探针不准** —— 规则的三类排除（顶层 viewport / overlay-annotation / library instance 内部）没实现，抽样全是 `Header` / `Value` / `Mask` / `Content` 这类组件内部结构 |
| `#M47.2~2` 有 `fontFamily` 却无 `textStyleId` | 58,385 | 45,023 | 77.1% | ⛔ **判法存疑** —— `styles.text` / `textStyleId` 两个取法都没核过活源；77% 这种数更像判法错、不像真存量 |

🔴 **⛔ 后四行一个数都不许拿去做决策** —— 它们是探针的读数，不是判据的读数。
本仓已登记「验读数之前先验量具」，这四行正是量具没验过的样子；
把它们写进表里而不是删掉，是因为**「哪些探针坏了」本身是下一轮要用的信息**。

---

## 3 ⇒ 下一批的抓手（⛔ 这次带着证据，不是印象）

> 🔴 **2026-09-15 订正（本节整节的结论已被推翻，⛔ 原文留痕不删）** ——
> 三件前置**做完了**，做完之后**这三条理由一条都不剩**：
> ① 那个 `strokeLeftWeight` 串在 462,618 个节点里 **0 命中**（Plugin API 名 ≠ REST dump 的
> `individualStrokeWeights.left`）⇒ 照字面写判据是**恒零命中的假绿**；
> ② 「377 / 0」**不可复现** —— 仅三份 09-09 之后一个字节没动的 payload 就已命中 **409 > 377**；
> ③ 「零存量」是**口径造出来的** —— 换成设计系统原生的 `State=Selected|Active` 射程，
> **分母 2 · 违例 2 · 合规 0%**（`MicroApp PlanB Sidebar Item` 的两个 `State=Active` 变体，2px 左 rail）。
> ⇒ **⛔ 别再把 `#M38` 当下一批抓手开工。** 三条出路 + 一条推荐在
> [`reports/2026-09-15-l15-m38-three-layer-denominators.md`](../reports/2026-09-15-l15-m38-three-layer-denominators.md) §6，
> 清单侧已挪进 `frozen-worklist.md` §1.3 **B9**（等 owner 拍）。
> 量具：`metrics/m38-three-layer-denominators.mjs`（`--self-check` EXIT=0 · 26 项断言全绿）。

**`#M38`**，理由三条：

1. **零存量**（377 / 0）⇒ 过墙 1，不需棘轮
2. **不依赖 product/annotation 区分** ⇒ 过墙 2（射程是「selected 列表项」，靠组件名/变体判）
3. **判据逐字在规则里** —— Acceptance 第 2 条逐字「rail 宽度**必从 Spacing token 取** ——
   mockup 端用 `strokeLeftWeight = 4` 对齐 `--sp-xxs`；任何 off-token 数值（**3 / 5 / 6** 等）视为违规」

⚠️ **动手前必做的三件**（⛔ 别照本文件的字面直接写判据）：

1. **回活源核 §M38 的判据串**（本文件第 2 章那个 `/selected/i.test(name)` 是**探针**形态，
   规则原文说的是「selected 列表项」+「**3 层全齐**」⇒ 真判据的射程要从原文取）
2. **先量「3 层」那两层的分母** —— Acceptance 逐字要求三层齐（left accent 4px BRAND +
   Layer_3 bg + selection-driven chrome），本轮只量了 rail 那一层。⛔ 别把「rail 合规」
   说成「M38 合规」，那会是又一个部分覆盖却写成全覆盖的自陈
3. **违例 0 ⇒ 今日是零信息的绿**（前向 fail-closed）。仓内已有先例（`` #`Jira `` 上闸时
   违例也是 0），⇒ 可以落，但**自陈与报文里必须写明**，⛔ 不许读成「M38 已守住」

---

## 4 ⛔ 这份文件不能说的话

- ⛔ 不许说「B2 余 33 段都落不了」—— 本轮只量了 3 段 + 粗筛 6 段，其余 **24 段一个字没读**。
- ⛔ 不许把第 2 章后四行的数当读数（§2 已逐行标了为什么）。
- ⛔ 不许说「§M-FONT 有 3,971 处违例」—— 那是探针在**未验过的射程**上的命中数，
  含墙 2 带来的假阳，量级未知。
- ⛔ 不许说「page 命名合规率 80%」—— 那个 80% 的分母含 20 个装饰性分隔 page。
- ⛔ 不许说「`#M38` 已确认可落」—— ~~§3 那三件前置一件都还没做。~~
  ⇒ 🔴 **2026-09-15 更新：三件前置已做完，结论是反的 —— `#M38` 确认【落不了】**（见 §3 订正块）。
  这句禁令**仍然有效**，只是理由从「还没验」变成「验过了，不成立」。
