# INFRA-F149 ② 取证 Stage 1 读数 —— 17 个真实产品文件的结构清点

> **预注册** = [`2026-09-15-f149-product-frame-evidence-preregistration.md`](./2026-09-15-f149-product-frame-evidence-preregistration.md)（`90a48751`，**取数前 commit**）。
> 本文件只报 §2 钉死的描述性读数。⛔ **不评价任何候选约定、⛔ 不给 N、⛔ 不宣布任何形态「可行」** —— 那些属 Stage 2 且需 owner 单独拍。
>
> 取数 **REST 现取** 2026-09-15，17/17 个文件全部 `200`。⛔ 未用 `figma-data/mockup/` 离线缓存。

## 0 · 先说结论能用来干什么

一句话：**B 路线（DS 规定显式标记、闸只认标记）在现有命名里挑不出一个能当产品帧标志的现成形态 —— 标记得新立。**

~~且改造面比预想大一个量级~~ 🔴 **这半句是错的，已在 §6.0 订正** ——
「未标记 ⇒ 不判」意味着**存量一个都不用改**，成本不在批量编辑，而在 §6.1 那三条。
owner 2026-09-15 当场指出该错并据此重拍了路线（先拍「降 L1」→ 订正后改为「走 B，只对新交付生效」）。

**顺带推翻了两条此前写在真源里的说法**（§4、§5），都是本轮实测撞出来的，⛔ 不是推理。

## 1 · 自证（⛔ 不过就整批作废）

量具在取任何 Stage 1 读数之前跑了 **16/16 条已知向量，全过**，`EXIT=0`（⛔ 未 pipe 到 `head`）。

| 向量 | 结果 |
|---|---|
| **V3/V4** 7 页三分计数 + 违例数 | 逐页逐位重现：product `565/327/547/300/242/635/45` · 违例 `4/9/0/2/9/0/42` · reference `4/0/3/0/0/54/0` |
| **V4-total** | 违例合计 **66** ✓ |
| **V3-total** | reference 合计 **61** ✓ |
| **V4-id** | 点名的 3 个 id `7909:840` / `10180:41` / `10476:59` 均在违例集合中 ✓ |
| **V1** | `8589:1377` `BEFORE · Config-T Modem settings (baseline · no roaming status)` **1280×1438** ✓ · `6974:719` `BEFORE · Config-T Network (baseline · …) — SIM Locked` **1017×902** ✓ |
| **V2** | `7687:1203` `name === "ZH ref caption"` ✓ |
| **NEG** | `classifyRegion` 阴性对照 4 形态各归各位（三档都出现 ⇒ ⛔ 不是恒 product） ✓ |

**66 个违例 id 的完整集合已落盘**（`selfcheck.json` 的 `allViolationIds`）—— 此前真源里只记了 3 个，下一轮可直接当已知向量用。

### 🔴 1.1 自证在**同一轮内**红了一次 —— 活树当场被编辑，⛔ 不是量具不稳

把复跑命令写进 README 后**逐字跑了一遍验证**（纪律：写进文档的命令先跑一遍），结果 **2/16 不过**：

```
✗ V3/V4: 0054ib0n… 10166:2 product=54(期望 45) viol=51(期望 42)
✗ V4-total: 违例合计 75，期望 66
```

**查清了，是真实编辑，⛔ 不是随机性**：LCD 文件 `lastModified` 在两次运行之间从
`2026-09-15T09:26:26Z` 走到 `09:32:10Z`（第一次自证 ≈ `09:25Z`，复跑 ≈ `09:36Z`）
⇒ 有人当时正在编辑该文件，那一页新增了 9 个含中文的 product 区 TEXT（45→54 / 42→51，两边都 +9）。

⛔ **没有把期望值改到能过** —— 那会把唯一能发现「树变了」的装置废掉。

**同时量了一次结构稳定性对照**（同一文件，间隔约 8 分钟，中间隔着那次编辑）：

| 量 | 17:28 取数 | 编辑后 |
|---|--:|--:|
| CANVAS | 68 | **68** |
| SECTION | 48 | **48** |
| topFrame | 525 | **525** |

🔴 **⇒ 由此暴露出本量具的一个设计问题，如实登记**：自证向量（V3/V4）绑在 **TEXT 内容层**，
而 Stage 1 的读数单位是**结构层**。⇒ 现在的自证让 Stage 1 的有效性**挂在一个它根本不使用的层上** ——
任何一次无关的文案编辑都会让整批读数「作废」，而结构读数其实完好。

**修法（Stage 2 前应做，⛔ 本轮未做）**：把向量拆成两档 ——
- **结构档**（V1 的帧尺寸 / topFrame 计数 / SECTION 计数）：对内容编辑免疫，是 Stage 1 该挂的那一档；
- **内容档**（V3/V4 的三分计数与违例 id）：**快照性质**，红了的正确反应是**回去核实改了什么**，
  ⛔ 不是改期望值，也 ⛔ 不应连坐结构档。

⚠️ **本报告的读数取自自证全过的那一次**（17:25 自证 16/16 → 17:25–17:28 Stage 1 取数），
且每个文件的 `lastModified` 已随读数落盘 ⇒ 读数是**逐文件各自的快照**，⛔ 不是一个全局一致时刻。
LCD 在 Stage 1 取数当时的 `lastModified` 就已是 `09:26:26Z`（即当日已被编辑过一次），该值如实记在 `stage1-derived.json`。

**复跑命令**（量具在 scratchpad，⛔ 未进本仓 `scripts/`）：

```
TOKEN=$(node -e "import('./scripts/lib/figma-env.mjs').then(m=>process.stdout.write(m.requireFigmaToken()))")
FIGMA_PERSONAL_ACCESS_TOKEN="$TOKEN" node <scratchpad>/selfcheck.mjs <worktree-root> <outdir>
FIGMA_PERSONAL_ACCESS_TOKEN="$TOKEN" node <scratchpad>/stage1.mjs   <worktree-root> <outdir>
```

## 2 · 单位定义与它的有效性核验

- **topFrame** = `type==='FRAME'` 且父节点 `type` ∈ {`CANVAS`, `SECTION`}（允许挂 SECTION 下，理由见预注册 §2）。
- 🔴 **一条开工时没料到的结构事实：上一轮那 7 个「交付页」是 `CANVAS`（Figma 页面），⛔ 不是 frame。**
  ⇒ 一次交付 = 一个 Figma 页面，设备屏幕 / 注释卡 / 标签**平铺在同一层**。
- ✅ **单位有效性已核**：V1 认定的两个真设备屏幕帧 `8589:1377` / `6974:719` **都在 topFrame 层**
  ⇒ 要判的东西确实落在这个单位上，⛔ 不是量在了错误的层级。

**同一个 CANVAS 上三类东西平铺的实例**（`< V4-1864 + V4-1360 > Modem Status …`，逐字）：

| 挂载 | 尺寸 | name | 实际是什么 |
|---|--:|---|---|
| SECTION | 1017×902 | `AFTER · Config-T Network — Roaming + Access Tech` | 设备屏幕 |
| SECTION | 1000×1254 | `PRD · V4-1864 + V4-1360 — Per-SIM Roaming…` | 注释卡 |
| SECTION | 1000×1888 | `UX Delivery · V4-1864 + V4-1360 — …` | 注释卡 |
| SECTION | 440×68 | `_state-label tooltip-trigger` | 标签 |
| SECTION | 1280×1488 | `AFTER · Config-T Modem settings — Current Roaming Status` | 设备屏幕 |
| CANVAS | 1017×902 | `BEFORE · Config-T Network (baseline · …) — SIM Locked` | 设备屏幕 |
| CANVAS | 427×44 | `_before-label` | 标签 |
| CANVAS | 1280×1438 | `BEFORE · Config-T Modem settings (baseline · …)` | 设备屏幕 |
| CANVAS | 487×44 | `_before-label · modem settings` | 标签 |

## 3 · S1-c 总体结构（17 文件，⛔ 分层不并池）

| 层 | 文件 | CANVAS | SECTION | topFrame | 挂 SECTION | 挂 CANVAS |
|---|---|--:|--:|--:|--:|--:|
| L1 | Micro-Apps-20250923 | 18 | 39 | 377 | 353 | 24 |
| L1 | Config-T (20240220) | 69 | 41 | 394 | 184 | 210 |
| L1 | LCD | 68 | 48 | 525 | 283 | 242 |
| L1 | PP-2025-2026 | 45 | 3 | 448 | 66 | 382 |
| L1 | MH-2026 | 48 | 16 | 294 | 64 | 230 |
| L1 | Media Service UR | 21 | 2 | 266 | 6 | 260 |
| L2 | TPC 20220519 | 43 | 12 | 230 | 69 | 161 |
| L3 | Config T (20210909) | 76 | 6 | 492 | 0 | 492 |
| L3 | MH-Lora | 13 | 2 | 335 | 6 | 329 |
| L3 | PP-Lora | 34 | 5 | 716 | 100 | 616 |
| L3 | Sandra-TVU One | 10 | **0** | 506 | 0 | 506 |
| L3 | PL_3 | 44 | 2 | 1793 | 1 | 1792 |
| L3 | Producer Admin | 9 | **0** | 35 | 0 | 35 |
| L3 | Producer 2.0 | 47 | 2 | 510 | 3 | 507 |
| L3 | TVU Drive | 7 | **0** | 41 | 0 | 41 |
| L4 | NOC 20240511 | 21 | 4 | 263 | 3 | 260 |
| L4 | TVU RPS 20220302 | 29 | 8 | 202 | 67 | 135 |
| | **合计** | **602** | **190** | **7427** | **1205** | **6222** |

**S1-f SECTION 使用率按层坍塌**：

| 层 | 文件数 | topFrame | 挂 SECTION | 占比 |
|---|--:|--:|--:|--:|
| L1（登记测量目标） | 6 | 2304 | 956 | **41.5%** |
| L2（+ 实际采集过） | 1 | 230 | 69 | 30.0% |
| L3（owner 标为产品自有稿） | 8 | 4428 | 110 | **2.5%** |
| L4（仓内引用 ∧ Figma 存在） | 2 | 465 | 70 | 15.1% |

⇒ **SECTION 是 DS 时代的习惯**，老文件基本没有；3 个文件 SECTION 数为 **0**。

## 4 · 🔴 S1-b 命名：§M33 那句判据的两半都不成立，但**方向和真源写的不一样**

`INFRA-F149` ② 与闸头注释都写着「§M33 举的 `S<N>` / `M<N>` 在本仓真实命名里**并不存在**」。
本轮实测 `\b[SM]\d+\b` 在 topFrame 名字上命中 **97 处**，逐处读原文（⛔ 不抽样）后结论分两半：

### ① `S<N>` **存在**，但**不区分产品与注释** ⇒ 原说法这一半要订正

它在活树里是**状态枚举器**，真实出现在设备屏幕帧上：

- LCD `S0 · Normal (<78°C) — no notification` **480×320**（LCD 设备屏幕尺寸）
- Config-T `S0 · Normal (<78°C) — no notification` **1017×902**（与 V1 那个 baseline 设备帧同尺寸）
- MicroApps `S1 — Baseline (no license, default)` **920×758**
- Sandra-TVU One `S1. select a story` **480×320**

**但同一个 token 也长在注释标签上**：`state-label · S1` **920×92** · `label S1` **286×41** · `label S0` **189×41**。
⇒ 拿 `S<N>` 当产品帧正向识别判据，**会把 state-label 一起认成产品帧**。

### ② `M<N>` 的命中 **100% 是规则编号引用**，⇒ 它比「不存在」更糟

逐处读原文，`M<N>` 一处设备 mockup 都没有，全部是注释卡名字里引用 §M23 系列规则号：

- `PRD card · V4-1865 (M23 canonical)` **1560×619**
- `UX delivery · WiFi section (M23 canonical)` **1280×791**
- `annot · UPDATE 2026-08-26 — A8 target deleted (M23.17)` **680×903**
- `Extended Info detail — hover preview (M23.9)` **460×280**

⇒ 若按 §M33 逐字把 `M<N>` 当产品帧标志，**会把注释卡整棵认成产品帧** —— 那正是本闸 66/66 假阳性要修的病，
只是换了个入口。**⛔ 这一半不是「缺判据」，是「判据方向反了」。**

### ③ 命名整体没有可依的规律

| 量 | 值 |
|---|--:|
| topFrame 合计 | 7427 |
| 不同名字种数 | **3784** |
| Figma 默认名（`Frame N` / `画板` / 空 / 纯数字） | **1285（17.3%）** |
| 最高频单个名字 | `" "`（一个空格）**201 次** |

**S1-e 现有命名约定在 topFrame 层的覆盖率**：

| 约定形态 | 命中 | 占比 |
|---|--:|--:|
| 注释卡族 `PRD ·` / `UX delivery ·` / `annot ·` | 41 | 0.6% |
| 下划线前缀 `_xxx` | 36 | 0.5% |
| `state-label ·` / `label ` | 41 | 0.6% |
| `BEFORE ·` / `AFTER ·` 前缀 | 49 | 0.7% |
| `demo ·` / `case ` | 6 | 0.1% |
| `ref-caption` / `param-table` / `ZH ref` | **0** | 0.0% |
| Figma 默认名 | 1285 | 17.3% |
| **以上任一命中（并集）** | **1458** | **19.6%** |
| 🔴 **一条都不命中（裸名字）** | **5969** | **80.4%** |

⚠️ **那个 `0` 的阴性对照已做**（纪律：「查 X 得 0 先问 X 本来会出现吗」）：
`ZH ref caption` **确实存在**（`7687:1203`，`type=TEXT`），但在**比 topFrame 更深的层**。
⇒ 该 0 的含义是「**不在这一层**」，⛔ 不是「不存在」。

## 5 · 🔴 S1-d `REFERENCE` 作为 section 约定，比此前认定的薄得多 ⇒ 我自己预注册里的说法要订正

预注册 §0 把 `REFERENCE — …` 写成「显式约定在本仓行得通的成功先例」，依据是上一轮「7 页合计 reference = 61，逐个落对」。
**本轮实测该说法测错了层**：

| 全 17 文件 | 值 |
|---|--:|
| 命中 `REFERENCE_SECTION_RE` / `REFERENCE_NODE_RE` 的 **SECTION** | **3** |
| 这 3 个 section 罩住的 topFrame | **4** |

逐个列全（⛔ 就这三个）：

- Config-T `REFERENCE — Test Signal Parameters（参数来源，非交付物）` → 罩住 **0** 个 topFrame
- LCD `REFERENCE — Test Signal Parameters（范式来源 + 参数面板来源）` → 罩住 **2** 个
- TVU RPS `REFERENCE · Config T (Local UI) Power section — owner-supplied` → 罩住 **2** 个

⇒ 上一轮那 **61** 个 reference 是**深层节点名前缀**命中的 TEXT 节点数，
⛔ **不是**「61 个交付页用了 REFERENCE section 约定」。**两个数不同量纲，此前被我读成了同一件事。**

🔴 **这削弱了 B 路线的立论中「本仓已有成功先例」那一条** —— 现存先例的规模是 **3 个 section / 17 个文件**，
⛔ 不足以支持「这类显式约定在本仓已被普遍遵守」。⚠️ 它仍然说明**约定被写下来时闸读得准**（61 个 reference TEXT 逐个落对），
⛔ 但「写得准」≠「铺得开」，这两件事我此前混在一起了。

## 6 · 这批读数把成本锁在哪儿（⛔ 描述性，Stage 2 才评价）

### 🔴 6.0 本节初版把成本算错了一个量级 —— owner 2026-09-15 当场指出，已订正

~~**全面改造的量级**：5969 个 topFrame（80.4%）现在没有任何可识别标记 … 改造面是**千级**~~
~~**一条现成的收窄切口** … 改造面从 7427 降到 **2304**~~

**错在哪**：初版把「有多少帧**没有标记**」当成了「有多少帧**必须改**」。
在 B 的降级档语义「**未标记 ⇒ 不判**」下，这两件事根本不是一回事 ——
注释卡 / 标签 / `demo ·` 容器 / `Frame 29` **本来就不该带标记**，它们不带正是想要的结果。
**需要标记的只有真设备屏幕帧。**

**更要紧的一层：存量一个都不用改。** 本闸的执行点是
`.claude/hooks/post-figma-write.sh`（§M-LIFECYCLE 第②时点），按 `--node <触碰节点>` 在每次
Figma 写操作后跑 ⇒ **它只看刚动过的东西**。
⇒ 老的未标记帧永远不判 ⇒ 不产生违例，也**不比今天差**（今天该闸处于隔离档，压根不跑）。

⇒ **真实改造面 = 0 个存量帧** + 「新交付时给设备屏幕帧加标记」这一个习惯。

⚠️ **这条订正翻转了一次决策的前提，留痕**：owner 先基于「改造成本比收益大几个量级」拍了
「§M33 第 1 条降 L1 人工自查」；成本前提被指出算错后**当场重拍为「改走 B，只对新交付生效」**。
⛔ 别把本文件读成只有后一个决定 —— 前一个决定真实发生过，只是前提是错的。

### 6.1 订正后 B 的真实代价（三条，都不是改存量）

1. **约定要写进 §M33 + mockup skill 起手协议** —— 规则 + 习惯的改动，⛔ 不是批量编辑。
2. **覆盖面从 0 开始**，随新交付增长 ⇒ 初期这道闸基本是空的，**拦不到任何历史稿**。
3. 🔴 **fail-open**：设计者 / agent 忘了标 ⇒ **静默不判**（假阴性）。
   ⚠️ 这与 §3 那个 `\bbaseline\b` 静默豁免 281 个真实产品 TEXT **是同一个形态**，
   区别只在这次是**有意为之**。⛔ 上闸时必须如实登记，别让它长得像"覆盖了"。

### 6.2 仍然成立的描述性读数

- 5969 个 topFrame（80.4%）不命中任何现有约定命名、1285 个是 Figma 默认名
  ⇒ 这**不是改造面**，而是「⛔ 现有命名里挑不出一个能当产品帧标志的现成形态」的证据。
- L1 六个登记交付面结构明显更好（SECTION 使用率 41.5%，section 名带完整交付语义
  如 `< V4-2376 > …` / `UX Delivery · …` / `BEFORE —` / `AFTER —`）
  ⇒ 新约定挂在**交付页这一层**比挂在帧命名上更有依托。
- **尺寸比命名更像有信号**：1920×1080 出现 **1873** 次、480×320 出现 **659** 次（= LCD 设备屏幕尺寸），
  而注释标签明显细长（920×92 / 427×44 / 189×41）。⚠️ **⛔ 这不构成候选判据** —— 注释卡同样可以很大
  （`PRD · …` 1000×1254 / `UX Delivery · …` 1000×1888），单靠尺寸分不开。记在这里是给 Stage 2 当输入。

## 7 · 边界（如实登记，⛔ 不是 TODO）

- **未做人工标注列** —— 预注册 §3 已说明：Stage 1 三问都不需要基准真值。
  topFrame 分母 **7427** ⇒ 全量人眼判不可行，抽样设计要 owner 另拍。
- **未评价任何候选约定**、**未给 N**、**未碰 §M33 / `scripts/` / 任何设计稿 / 任何 Figma 写操作**。
- **`depth=3` 的射程**：本轮只看到 CANVAS → SECTION → topFrame 三层。
  更深层的结构（设备屏幕帧内部、`ZH ref caption` 那一层）**本轮没量**，若 Stage 2 的候选约定要落在更深层，需重取。
- **L3/L4 文件的活跃度没量**：`lastModified` 已随读数落盘但本报告未分析。
  「老文件要不要一起改」这个问题的输入在那儿，⛔ 本轮没读。

## 8 · 建议的下一步（⛔ 供 owner 拍，agent 不自拍）

Stage 2 需要 owner 先拍**一件**，否则无从预注册判据：

> **约定的射程是「全部 17 个文件的存量」，还是「只对新交付 / 只对 L1 登记面」？**

两者的 Stage 2 判据形态和成本读数完全不同（7427 vs 2304），⛔ 不能一份预注册覆盖两者。

⚠️ 另需 owner 知悉 §4 那条：**§M33 逐字的 `M<N>` 若照搬进新判据会把注释卡认成产品帧** ——
改 §M33 时这半句应当删掉或改写，⛔ 别原样留着。

## 9 · 新判据两臂活树实测（Task 6，⛔ 跑一遍绿不算验证）

§M33 产品帧判据已从「非 reference、非 annotation ⇒ 就是产品区」的反向兜底，改成「帧名以
`SCREEN · ` 开头才算产品帧，其余一律不判」（Task 1）。本节验证这条新判据**是判别器**，
不是「不管输入是什么都报同一种结果」的恒定输出——本仓 `variant-axis` 已付过这笔学费：
只跑一臂绿，分不出「判别器」和「恒绿」。

**构造**：现取 `rJJjWWs51n2iFOlCIC7aYG` 的 `6907:2`（同一个 CANVAS，同一次 REST 现取），
在内存里派生两棵树（⛔ 未写 Figma）：

- **对照臂**：原样不改。
- **故障臂**：把其中一个真实设备屏幕帧 `8589:1377`
  （`BEFORE · Config-T Modem settings (baseline · no roaming status)`，1280×1438，161 个 TEXT）
  的 `name` 改成 `SCREEN · Config-T Modem settings`，并往它的子树里注入一个含中文的 TEXT 节点
  （`characters: "设置已保存"`）——该页本身含中文 0 个，不注入的话故障臂会"看起来绿"，
  但那只是恰好没撞上违例，分不清"判据在判但没抓到东西"和"判据压根没在判"。

**两臂读数**（可复跑命令见下）：

| 字段 | 对照臂（不改名） | 故障臂（改名 + 注入中文） |
|---|---|---|
| `markedFrames` | 0 | 1 |
| `scannedNodes` | 0 | 162（161 原有 + 1 注入） |
| `violations` | 0 | 1（`probe: product-ui-han`，命中注入的中文 TEXT） |
| `unverified` | `{count:1, reasons:[...0 个 SCREEN · 帧...]}` | `null` |

**结论：两臂读数不同 ⇒ 新判据是判别器，⛔ 不是恒绿。** 四个字段（`markedFrames` /
`scannedNodes` / `violations` / `unverified`）逐个都变了，且变化方向与预期一致：
标记帧从 0→1、判过的 TEXT 从 0→162、违例从 0→1、`unverified`（"一个都没标"的诚实报告）
从有→`null`。

**可复跑命令**（量具在 scratchpad，⛔ 未进本仓 `scripts/`；worktree 里没有 `.env`，凭据走
`scripts/lib/figma-env.mjs` 唯一解析点显式传）：

```bash
TOKEN=$(cd /Users/nancy/Documents/AICoding/VS_Code/tvu-design-system && \
  node -e "import('./scripts/lib/figma-env.mjs').then(m=>process.stdout.write(m.requireFigmaToken()))")
FIGMA_PERSONAL_ACCESS_TOKEN="$TOKEN" node <scratchpad>/twoarm.mjs <此 worktree 根>
```

脚本对每个字段的差异做了显式断言，两臂相同即 `process.exit(1)` 并打印
`两臂读数相同 ⇒ 判据不是判别器，BLOCKED`；本轮实测 `EXIT=0`，`两臂读数不同 ⇒ 判据是判别器`。

### 9.1 自证向量拆档（Task 1 语义反转后的必然结果，⛔ 不是回归）

`findLanguageIsolationViolations` 的返回语义随 Task 1 从「三分反向兜底」改成「二分正向标记」
后，`docs/internal/_spikes/f149-evidence/selfcheck.mjs` 里绑在旧三分语义上的向量（V3/V4 的
7 页三分计数与违例 id 集合、NEG 的 `classifyRegion` 三分阴性对照）**必然全红** —— 这是本条修法
本该发生的效果，⛔ 不是量具坏了，也⛔ 不该把期望值改到能过（那会把唯一能发现"树变了"的
装置废掉）。按本报告 §1.1 已登记的修法拆两档：

- **结构档**（V1 两个 baseline 帧尺寸 1280×1438 / 1017×902 · V2 `ZH ref caption`）：
  对判据反转免疫，**保留、仍计入 pass/fail**。
- **内容档**（V3/V4 的三分计数与 66 个违例 id · NEG 的三分阴性对照）：标注
  「⚠️ 针对旧判据（反向兜底），2026-09-15 判据改向后不再适用」并**停用**（`skip()`，只记
  读数、不计入 pass/fail）；**⛔ 历史期望值未删除**（`PAGES` / `EXPECT_TOTAL_VIOL` /
  `EXPECT_TOTAL_REFERENCE` / `EXPECT_IDS_PRESENT` / `negCases` 原样留在文件里，它们是
  2026-09-15 17:25 CST 那一轮的取证事实）。

实跑结果：结构档 **3/3 过**（`EXIT=0`），内容档 16 条全部落入 `skip()`（7 页 × 1 + V4-total +
V3-total + 3 个 V4-id + 4 个 NEG = 16），如实打印「旧期望 … 不再可比」，不影响退出码。
新判据的判别力验证不再依赖 selfcheck.mjs 的固定期望值断言，改由本节的两臂活树对照承担。
