---
id: v4-2402-access-tech-badge
title: Access-Tech Badge Legibility on LCD Home Page (V4-2402)
doc_type: design-record
status: requirement
last_updated: 2026-09-08
sources:
  - { type: jira, ref: "V4-2402", url: "https://tvunetworks.atlassian.net/browse/V4-2402" }
  - { type: jira, ref: "V4-1543", url: "https://tvunetworks.atlassian.net/browse/V4-1543" }
  - { type: jira, ref: "TM3-1871", url: "https://tvunetworks.atlassian.net/browse/TM3-1871" }
  - { type: jira, ref: "V4-1676", url: "https://tvunetworks.atlassian.net/browse/V4-1676" }
  - { type: jira, ref: "TM3-1670", url: "https://tvunetworks.atlassian.net/browse/TM3-1670" }
  - { type: slack, ref: "prod_tm1000_v4_dev 2026-08-18（V4-2402 报告线）", url: "https://tvunetworks.slack.com/archives/C021E1BNTPF/p1787019744018649" }
  - { type: slack, ref: "2025-07-29（V4-1543 / TM3-1871 原始需求线）", url: "https://tvunetworks.slack.com/archives/CRY6XQQ7J/p1753699786435869?thread_ts=1753695315.750909&cid=CRY6XQQ7J" }
figma:
  file: 0054ib0nLmt27bC3QlGDl7
  nodes:
    - { id: "10247:420", label: "wrapper section（Access-tech badge on the home page，唯一现存交付区）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=10247-420" }
    - { id: "10247:423", label: "AFTER · V4-2402 Access-tech badge (LCD)（交付 Section）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=10247-423" }
    - { id: "10271:745", label: "BEFORE 对照物 — owner 手建 `Plan C for UX Design`（含线上形态帧 10271:746）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=10271-746" }
    - { id: "10309:235", label: "Change Log 注释（Description_text，唯一交付说明）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=10309-235" }
    - { id: "10255:851", label: "帧 — Home 6 蜂窝 slot 全带制式", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=10255-851" }
    - { id: "10255:940", label: "帧 — Home 满载 10 蜂窝 slot 全带制式", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=10255-940" }
    - { id: "10248:420", label: "Jira requirement 组件（M23.8）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=10248-420" }
    - { id: "5448:5082", label: "`Slot/Icon & Text_2` main component（已迁至 page 级，原寄居 Plan C）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=5448-5082" }
    - { id: "5433:30631", label: "`Slot` component set（page 级，被 13 个 instance 依赖）", url: "https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=5433-30631" }
---

# Feature Design Record — Access-Tech Badge Legibility (V4-2402)

- **JIRA**：[V4-2402](https://tvunetworks.atlassian.net/browse/V4-2402)（Bug, Medium, parent [V4-1676](https://tvunetworks.atlassian.net/browse/V4-1676) RPS One 8.4）
- **Scope**：V4 LCD（TM1100 Touch Screen）首页底栏 slot 行
- **Owner(dev)**：Edward Wu　**PM**：Trevor Yao　**Designer**：Nancy Zeng
- **Status**：✅ **已拍板（owner 2026-09-08）—— 采用「常显实时制式」形态**：徽标形态取轮二方向 2，但**语义改为每路蜂窝 slot 常显当前实际工作制式（4G / 5G）**，不再是「只标降级」。落地与实测见 **§11**。**owner 同时指令清场** ⇒ 其余全部候选方案（轮一 Plan A/B、轮二 Direction 1、轮二比选 Context、V4-1543 旧四案 Plan A–D）**已删除**，删除清单与依赖处置见 §11.5
- **日期**：2026-09-07 起草 / 2026-09-08 轮一收尾 → 轮二比选 → 拍板落地

---

## 1. 问题与根因

8.4（84045）在 LCD 首页 slot 行新增了 4G/5G 制式徽标，winni 报「这个小图标看不出来显示的是什么」（Slack 2026-08-18）。

**实测根因**（Figma 组件真源 `Slot/Icon & Text_2` = `5448:5082`，43×20）：

| 元素 | 实测值 |
|---|---|
| 制式徽标 `5448:5121` | **7 px Verdana Bold Italic**，`#ffffff`，11×9，x=0 **y=−2**（溢出容器） |
| 同行邻居 | slot 序号 14 px、运营商码 14 px —— **徽标只有邻居的一半** |
| 底色 | 包围盒下半压在绿圆 `#33ab4f` 左上弧上 |

四个因素叠加导致不可读：
1. 7px 是同屏最小字号，且**是斜体** —— 5px 字面高度下 `4`/`5` 的斜边糊进同一列像素，而首字符恰是 `4G`/`5G` 的唯一区分特征。
2. **同一个字跨两种底色**：白/绿对比 **2.97:1**（不到 WCAG AA 大字 3:1），白/深底 16.9:1 —— 一半高对比一半低对比、边界还是条弧线，视觉上像噪点。
3. y=−2 顶出容器，无留白无底板，缺少「这是一个标签」的边界暗示。
4. 11px 宽塞两个字符，字距接近 0。

**1:1 真实尺寸导出验证**：355×48 的 slot 行里 `5G` 完全读不出来，只是绿圆左上一撮白像素；放大 8× 才辨认出字形。

### 1.1 一个未被处理的语义缺陷

现状只在 5G 时显示徽标，4G 时不显示。用户看到「没有徽标」无法区分「这路是 4G」「没检测到」「功能没生效」——**这个标记本身不自解释**。winni 说「看不出来是显示的什么」，一半是看不清，一半是看清了也不知道它在表达什么。

### 1.2 措辞错误（待修）

V4-1543 四个方案的 Change Log 都写 `When a slot operates in **5 GHz** mode` —— 5 GHz 是 WiFi 频段，此处 slot 挂运营商（CT/CU/CM），指的是 **5G NR 蜂窝制式**。owner 2026-09-07 确认：该徽标表示「**这一路 modem 当前实际工作在 4G 还是 5G**」，不是 SIM 卡类型。这句照抄进 dev spec 会误导实现，**需订正**。

---

## 2. Scope & Non-goals

- **In**：LCD 首页底栏 slot 行的制式徽标呈现方式。
- **机型范围 = TM1000v3 / TM1100 / TM1000v4 三者**（2026-09-08 订正，见下）。
- **Non-goals**：不改制式探测逻辑；不动 Config-T 侧（V4-1864 / V4-1360 已 QA）；不改视频预览区尺寸。

> ⛔ **本节原写「Scope：V4 LCD（TM1100 Touch Screen）」，不完整，2026-09-08 订正。** 两条独立证据：
> ① **[TM3-1871](https://tvunetworks.atlassian.net/browse/TM3-1871)**（`Optimize the 5G style on the touch screen homepage`，Task / **Done**，assignee Asher Guo）是 V4-1543 的 `Cloners` 链关联单，属 V3 线（parent [TM3-1670](https://tvunetworks.atlassian.net/browse/TM3-1670) = TM1000V3 v8.3）。Asher 2026-04-06 记 `tvuwebui-7.8.365.tar.gz已修复`，Tao Yang 2026-08-25 记 `This function has been implemented in 83074.` ⇒ **V3 侧已实现同一形态**。
> ② 该单 2025-07-29 的设计链接指向 **`node-id=5392-17675`——就是本 page** ⇒ V3 与 V4 **共用同一份设计真源**，不是两份稿。
> ⇒ owner 2026-09-08 在 Change Log 注释里亲手写的 `Suitable for TM1000v3, TM1100 and TM1000v4` 与此一致。**Jira 回复须带 V3 侧对接人（Asher Guo）。**

### 2.1 一条既有 PM 拍板（本轮才被检索到，是锚点选择的约束条件）

[TM3-1871](https://tvunetworks.atlassian.net/browse/TM3-1871) 评论（**Trevor Yao，2025-07-29**，经 Automation for Jira 从 V4-1543 同步）：

> `@Nancy Zeng No more numbering? I feel we can have both the number and the 5G mark in the design.`

⇒ **slot 编号必须保留、不得被制式取代**。这条是 V4-1543 当年 Plan A（绿圆内序号换成 `5G`）被否的成文依据，也是本轮任何锚点方案的硬约束。⚠️ 它此前**从未进入本文件**，§6 的决策表在不知道它存在的情况下推导过同一结论 —— 属侥幸而非有据。

---

## 3. Baseline 参考

本需求发源于 **V4-1543「Show "5G" label on the Homepage」(2025-07-29)**，page `5392:17675` 上并存四个原始方案，**全部保留不删**：

| 方案 | 节点 | 做法 | 代价 |
|---|---|---|---|
| Plan A | `5433:30871` | 绿圆内序号直接换成 `5G`（11px） | 丢失 slot 序号；同排圆有的表序号有的表制式，语义打架 |
| Plan B | `5433:30870` | 运营商后缀 `CT-5G`（12px） | 可读性最好，行宽膨胀 |
| **Plan C** | `5448:176` | **7px 上标（= 当前 84045 落地形态）** | 守住行宽，牺牲可读性 |
| Plan D | `5448:5340` | 同 C，仅间距不同 | — |

---

## 4. 本轮设计（两案比选，§M55）

按 owner 要求「A 和 B 同时做，看效果」，产出两个正交方案 —— **Plan A 花横向空间，Plan B 花纵向空间**。

> 中间过程曾试过「不占额外空间、只把徽标做可读」的思路，实测证伪：行1 只有 20px 高、item 只有 43px 宽，圆内被序号占满、右侧被运营商占满，**「完全不占空间」的位置不存在** —— 现状那个 7px 上标压在绿弧上，正因为那是唯一剩下的地方。

### 4.1 Plan A — 内联制式标（`10210:305`）

- 制式标 **12 px Roboto Bold `#f1f1f1`**，**中划线连接运营商**（owner 2026-09-07 指定）：`① CT-5G`
- 每个 slot 包进 HORIZONTAL auto-layout 单元（`itemSpacing=0`），保证 wrap 不把 slot 与其制式标拆开
- slot item 宽 43 → **63-66 px**；slot 间距 **12 → 10 px**（全案唯一偏离宿主页原值处）
- 满载 13 slot：重排为 **4 + 9** 两行，Slot Info 高仍 48，视频区不动

### 4.2 Plan B — 制式独立成层（`10210:306`）

- 制式标 **12 px Roboto Bold 白字**，置于 **20×14 `#2f2f2f` 底板**，与编号圆同宽、紧贴圆下沿零间隙（靠同宽+贴合建立归属）
- Slot Info 行间距 **8 → 19 px**，高 **48 → 59 px**；Bottom 带 48 → 59 px，由帧底 12 px 余量吸收
- slot 宽度、排布顺序（6+7）、视频区全不动

### 4.3 示例数据（两案一致，§M55 同 fidelity）

slot 1/2/4/6 = 5G，**slot 3/5 = 4G** —— 4G 与 5G 两种形态可并排比较。

---

## 5. ⛔ 验收结论：两案均否决（owner 2026-09-08）

### 5.1 否决理由 —— 容量假设错误

owner 提问：「假如 Slot 7 和 Slot 8 也需要标记 4G 还是 5G，如何整？」

实测推算（容器尺寸取自 live probe，非目测）：

| 若所有蜂窝 slot 都要标制式 | 需要 | 结果 |
|---|---|---|
| **Plan A** | 8 个 item + 5 个圆 = **736 px**，每行可用 354.89 px | 需 **3 行** → Slot Info 76 px → **溢出帧底 16 px** |
| **Plan B** | 行2 圆下方再加一层 14 px 底板 → Slot Info 需 73 px | Bottom 底 327.5 → **溢出帧底 7.5 px**（现仅剩 6.5 px） |

**两案都撑不住**。根因不是执行细节，是**两案都按「只有前 6 个 slot 需要标制式」设计**，而实际上任何 slot 都可能是蜂窝 slot。

> **这是 `design-for-scale-not-instance` 的复发**：该条 memory 明写「容器类产物起手先画第 3、第 5 条加进来的样子」，本轮仍照当前内容（6 个蜂窝 slot）画，未画满载态。**两案的「剩余余量」栏（A 剩 4.9px / B 剩 1px）当时已经把答案写在脸上了 —— 余量逼近 0 就等于不可扩展，而我把它当成「刚好排下」的成功指标写进了交付卡。**

### 5.2 另一条否决理由 —— 画布并排造成误读

owner 两次反馈「Plan A 同时在 slot 左上角和右边显示 5G」。三条独立证据（数据层全量枚举 / `node.screenshot()` / REST `get_screenshot`）均显示 Plan A 帧内只有 6 个制式文本节点、全在右侧，**左上角无重复**。

真实原因是**摆放失误**：Plan A 建在 `x=3560, y=231`，而旧 Plan C（带左上角 7px 上标）在 `x=1522, y=231` —— **同一水平线并排**，画布平移时两者同时进入视野，读作「一个方案上有两处 5G」。

**已修**：新建包裹 Section `10238:420`（`< V4-2402 > … 20260908`，2520×1634）把 Jira 组件 + 三个子 Section 收进去，与 V4-1543 旧四案分区。零漂移、零碰撞。

> 教训：owner 报「看到 X」时，先假设呈现方式有问题，而不是先证明数据没错。第一轮我只做了数据层自证就回复「你看的是别的帧」，把定位成本推回给了 owner，导致同一问题报了两次。

---

## 6. 决策记录

| # | 决策 | 理由 |
|---|---|---|
| D1 | 徽标语义 = **modem 当前实际工作制式**，非 SIM 卡类型 | owner 2026-09-07 明确澄清 |
| D2 | Plan A 用**中划线**连接运营商与制式（`CT-5G`） | owner 2026-09-07 指定。AI 曾建议用空格避免「运营商的 5G 卡」歧义，owner 知悉语义后仍选中划线 ⇒ 按 owner 定 |
| D3 | 两案示例数据必须含 4G **和** 5G | owner 2026-09-07；只有 5G 无法看出两形态区分度 |
| D4 | Plan B 徽标必须与 slot 建立视觉归属 + 字号对齐 Plan A | owner 2026-09-07 指「不好跟 Slot 关联上，文字也小」⇒ 10px→12px + 同宽底板紧贴 |
| D5 | ⛔ **两案均否决**，需重定方向 | 满载态（所有蜂窝 slot 标制式）下两案都溢出帧底 —— §5.1 |
| D6 | V4-1543 旧四案（Plan A-D）保留不删 | 现状基线 + 追溯，§M55 落选案归档纪律 |
| D7 | **容量判据 = 能否排进 2 行**，不是「看起来放得下」 | 实测：Slot Info 垂直上限 60px（帧 320 − 底栏顶 260）。2 行 = 48（20+8+20），3 行 = 76 ⇒ 超 16px；行间压到 4px 仍需 68。**这是物理边界，非偏好** |
| D8 | **余量 < 一个单元宽（20px）即判「不可扩展」**，与轮一否决同判据 | 方向 1 在 8 蜂窝时余量 2.89px —— 与轮一 Plan A 剩 4.9px 是同一状态。轮一的教训写死成判据，避免再把「刚好排下」当成功 |
| D9 | **方向 2 不用橙色**，语义由「文字有无」承载 | §C8 一号多义：橙色在同一行已表 `Connecting`（slot `H`，变体 `Property 1=Connecting`）。轮一 §7 原设想的「橙 = 制式降级」会与之冲突 |
| D10 | 徽标字号定 **11px**，不是 12px 也不是回到 7px | 同 surface 既有先例：本文件另一处 Slot Info 底栏已用 11px 制式标（节点 `8610:447`）⇒ 11px 在本 surface 不是新值（§M21.4 两级先例搜索命中第二级） |
| D11 | 徽标用 **2px `#252525` 描边**解决对比度，不加独立底板 | 底板需要新建子节点，而单元是 INSTANCE、子树不可增删；描边是就地改（§M42.3），且在绿圆与深底上同时可读，一次解决 2.97:1 |
| D12 | Figma 上的占位文字用 **letterSpacing 撑到 Verdana 实宽** | Roboto 比 Verdana 窄（`CT5` 26 vs 29）。若让占位自然 hug，稿上「排得下」而真机溢出 —— 几何忠实度优先（§M32.6） |
| D13 | V4-1543 旧案的 `5 GHz` 措辞**不在 Figma 里硬改**，改为随 handoff 交节点清单 | 5 处全是 Helvetica Neue（本环境同样不可写）。硬改需换字体 ⇒ 污染归档 Section，且其中一处是 Jira 需求标题本身。订正已落到 dev 真正会读的地方（Spec 卡 + 本文件 + handoff）。**⚠️ 2026-09-08 清场后其中 4 处随 Plan A–D 一并删除，只剩 Jira 需求标题 1 处**（§11.6） |
| **D14** | ✅ **拍板：采用「常显实时制式」，不是「只标降级」**（owner 2026-09-08） | 取轮二方向 2 的**形态**（叠加徽标、零布局宽度），但**语义改为每路蜂窝 slot 常显当前实际工作制式**。⇒ 徽标是**状态字段**而非异常标记；满载态从 4 个徽标变成 **10 个**，容量仍成立（徽标 `ABSOLUTE` 不占布局宽度，§11.3 复测） |
| **D15** | 徽标锚点 = **`cell.x + 15`（压在自己的圆上）**，⛔ **不放单元间那 12px 空隙** | **几何最优 ≠ 视觉正确**。放 gap 里几乎零遮挡（编号 0px / 码 2px / 不越行尾），但渲染出来徽标**读成属于右边那个 slot** —— 它离下一个圆比离自己的运营商码更近，Gestalt 归属当场翻转（`5G 2` / `4G 4`）。⇒ **归属优先于不遮挡**。这一条只有渲染图能发现，数字全是绿的（§11.4） |
| **D16** | 降级 slot **不做配色区分** | 橙已表 `Connecting`（D9），且常显语义下「用颜色区分 4G/5G」是**另一个决策**（会把状态字段变成告警）。本轮制式一律由文字承载、同一套样式；若日后要强调降级态再单独拍 |
| **D17** | 清场时 **main component 先迁出再删**，⛔ 不 detach | `Slot/Icon & Text_2`（`5448:5082`）原**寄居在 Plan C Section 内**，被保留帧的 16 个 instance 依赖。直接删 Plan C 会整批断链；detach 则丢组件关联（违反 §M32）。做法 = 先 `page.appendChild(main)` 迁到 page 级（与 `Slot` component set 同级），probe 确认 instance 全部 resolved，再删 Section（§11.5） |
| **D18** | **交付层收敛为一条 Change Log 注释**（`Mark area` + `Description_text`），PRD / UX Delivery / Journey 三卡全删 | owner 2026-09-08：「对于这样的小需求，加上全套的 UX 交付说明有点过重了，只要说了修改了哪里就行」，并手建范本示范粒度。⇒ **需求链 / 验收 / Data Contract 留文档侧**（§12.1 逐项去向），Figma 只说改了哪里。⚠️ 这是对 6-JIRA gate ①⑤ 的 **owner 显式豁免**，非漏做 |
| **D18a** | ⛔ **本需求不用 §M23.17 橙色** | owner 2026-09-08：「还没确认方案之前它们理应属于同一个版本，不用特殊的文字颜色来标记」。§M23.17 的触发条件是**交付后**dev/QA 发现的逻辑调整（用于区分已交付内容），本需求当日方定稿、尚未交付 ⇒ 不适用。已撤 4 处 |
| **D19** | 徽标锚点 = **`cell.x − 3`, `cell.y − 3`（编号左上角外侧）**，10px / 1px `#434343` 描边 ⇒ **推翻 D15 的 `cell.x + 15`** | owner 2026-09-08 手改 main component 后拍板「用你改的圆左上角」。两个锚点的归属距离判据（D15）都成立，差别是**压谁**：新锚点压编号 5px（两位数 8px）、不压运营商码；旧锚点相反。owner 在看过 8× 渲染 + 逐项遮挡数后选定。⚠️ 与 §2.1 的 PM 拍板张力更大，已如实呈现 |
| **D20** | BEFORE 对照物 = **owner 手建的 `Plan C for UX Design` `10271:745`**（原位 `1522,231`）；我重建的 BEFORE Section 已删 | owner 亲手恢复并选定「用你的 Plan C，删我的」。⇒ 一个 feature 只有一个 BEFORE 对照物，避免读者在两处找同一类信息 |
| **D21** | `Slot Info.clipsContent` 由 `true` 改 **`false`** | D19 的锚点 `x=−3` 溢出容器左边界，`true` 下每行第一个徽标被裁 3px（实测 3 处）。对齐 owner 帧的既有值 ⇒ 趋同、非偏离。⚠️ §10.1 记的 `true` 已是旧值 |

---

## 7. 轮二方向（已实施 → §10；本节的估算已被实测推翻，保留作沿革）

> ⛔ **本节表内「方向 1 可在 2 行内排下 ⇒ 唯一能支持全部 slot 标制式的方向」这个结论是错的**，2026-09-08 轮二 live probe 推翻。两个输入都不对：
> ① 单元宽按「Verdana 14px 字宽约 9px/字符」估出约 52px，**实测是 53–56**（公式见 §10.1）；
> ② 满载态假设成「8 item + 5 circle」，**实测是 10 个数字编号 slot + 3 个非蜂窝**（§10.2）。
> 纠正后方向 1 在满载态需要 **3 行**，Slot Info 从 48 长到 76，底栏压视频区 8px 并超出帧底 2px。
> **教训与 §5.1 同源**：那一轮错在「按当前内容当满载态」，这一节错在「按估算值当实测值」—— 两次都是拿一个没被验证的数当容量分母。

**硬约束**：Slot Info 只有 **354.89 × 48**，已装 13 个 slot 的编号+状态+运营商；帧底余量 12 px；视频区不宜压缩。在此约束下逐个 slot 挂一个独立制式标，空间上不成立。

| # | 方向 | 估算 | 风险 |
|---|---|---|---|
| **1** | **单字符后缀并入运营商码**：`CT5` / `CT4` | 运营商码 2→3 字符，item 43 → ~52 px（按 Verdana 14px 字宽 ~9px 估）。8 item + 5 circle 可在 **2 行**内排下（行1 5 item = 302.5 / 行2 3 item + 5 circle = 327.5，均 ≤ 355）⇒ **唯一能支持全部 slot 标制式的方向** | 估算值，需实测 Verdana 渲染宽度；`CT5` 可读性需 owner 判断 |
| **2** | **只标异常**：跑满 5G 不标，降级到 4G/3G 标橙 | 信息量从 13 降到 0-2，空间充裕，字号可给到 12px+。复用 Config-T 侧 V4-1864/V4-1360 已定稿的「橙色 = 制式降级」状态语言，跨端一致 | 与 V4-1543 原始需求「Show 5G label」表述相反，**需 PM Trevor 拍板** |
| 3 | 制式编码进圆本身（圆环粗细 / 圆内分区色） | 不占额外空间 | 多值需图例，触屏无处放图例；与既有状态色（绿/红/橙/灰）撞语义（§C8） |
| 4 | 底栏可横向滚动 / 分页 | 空间无限 | 改交互，成本高；LCD 触屏滚动体验差 |

**建议**：方向 1 与方向 2 各出一版比选，且**两版都必须画满载态**（13 个 slot 全部带制式），先验容量再谈样式。

---

## 8. 依赖 / 待办

- ⛔ **字体债（硬性）**：两案制式标是 Roboto 占位 —— Verdana 在 AI Figma 编辑环境不可写（本轮 `listAvailableFontsAsync` 复验：`verdanaFound: []`，连改 fontSize / characters 都被拦）。待改节点清单：

  | 帧 | 节点 ID | 字重映射 |
  |---|---|---|
  | Plan A `10210:307` | `10217:421` `10217:423` `10217:425` `10217:427` `10217:429` `10217:431` | `Roboto Bold → Verdana Bold` |
  | Plan B `10210:396` | `10231:421` `10231:423` `10231:425` `10231:427` `10231:429` `10231:431` | `Roboto Bold → Verdana Bold` |

  需 owner 在本地 Figma（有系统字体）批量替换。**注释卡 / 规格卡保持 Roboto，勿误伤**（它们是产品帧的兄弟节点，选中产品帧不会包含）。若两案都作废则此债一并作废。
  ⇒ **上表已作废**（轮一两案 2026-09-08 被否决）。**现行清单见 §10.6。**

- **Change Log 措辞订正**：V4-1543 四个旧方案的 `5 GHz mode` → `5G (NR)`，见 §1.2。**2026-09-08 处置见 D13 + §10.6**：5 处全是 Helvetica Neue（本环境不可写），已改为随 handoff 交节点清单在本地改，订正说明同时落进轮二 Context 卡。
- **Jira 未回复**：受 `slack-jira-write-confirm` 约束，且方案未定稿，本轮不发（`no-nagging-before-final`）。
- **PRD / UX 交付卡 / User Journey 卡**：按 §M55「拍板后选中案进入常规交付闭环」，本轮为比选轮未产出。方向重定后需补。

---

## 9. 自检（机器输出）

`pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node <各 Section>`：

```
Plan A (10210:305) / Plan B (10210:306)
  ✅ PASS  integrity · typography-icon(62) · bilingual-spacing(8) · overlap(4) · connector(3)
           geometry-consistency(0) · variant-axis(0) · hash-n-semantic(0)
  ❌ FINDINGS  colors(191) · library-origin(10) · binding-fidelity(191) · default-white-bg(2)
Context (10210:304)
  ✅ PASS  integrity · colors(81) · typography-icon(48) · library-origin(0)
           bilingual-spacing(1) · overlap(0) · connector(3)
  ❌ FINDINGS  binding-fidelity(81) · default-white-bg(1)
  ⚠️  ERROR (could not run)  library-binding — 离线缓存过期，本轮未跑起来，不计为通过
```

**残留 findings 逐条核归属**：全部落在 clone 自 Plan C 的产品帧内部，属 `0054ib` 已登记的 file-wide owner-deferred 存量债（见 memory `lcd-file-conformance-deferred`）；`default-white-bg` 命中的是 `1834:300` / `4867:3469` / `9359:3` 等既有节点 + 281 条「基线该缩短」的过期行。**本轮零新增**。

**本轮修掉的两条真 findings**：
1. `bilingual-spacing` ×4 → 中文弱化误挂在**节点 opacity** 上，§M23.14 要求挂 **fill opacity 0.45**；33 个中文节点统一改正后三 Section 全 PASS。
2. `typography-icon` ×6 → 对照卡内 `→` 被判手敲 Unicode 字形（Roboto 段有渲染成空白的风险），全部换为 ASCII `->`，复扫残留 0。

**几何自检**：三个子 Section + 包裹 Section — children 溢出 0、section 之间重叠 0、与页面既有节点碰撞 0；包裹 Section 收纳后四个子节点绝对坐标漂移均为 0。

**渲染亲验**：1:1 真实尺寸 ×4 轮、8× 放大 ×5 轮、16× 单元放大 ×1、REST `get_screenshot` 独立路径 ×1。

---

## 10. 轮二 — capacity-first 两方向比选（2026-09-08）

Figma 落点：wrapper Section **`10247:420`**（`< V4-2402 > Round 2 — capacity-first directions — 20260908`，2520×2396，落 `(2700, 1171)`）。内含 Jira 组件 clone `10248:420` + Context `10247:421` + Direction 1 `10247:422` + Direction 2 `10247:423`。

> **落点为什么另起一个 wrapper**：轮一那次「并排造成误读」（§5.2）的修法只是把三个子 Section 收进 `10238:420`，**但它们的 `absY` 仍是 231，与旧 Plan C 同一水平线** —— 病根没除。轮二整体落到 `y=1171` 起的独立带，避开 page 上所有 LCD 480×320 帧的 y 区间。page 上既有节点 `right` 全部 ≤ 2686 < 2700 ⇒ 垂直扩展零碰撞（实测见 §10.7）。

### 10.1 实测几何（本节是取值真源，勿再估算）

| 量 | 实测值 | 取自 |
|---|---|---|
| Slot Info | **354.89 × 48**，`HORIZONTAL` + `WRAP`，`itemSpacing 12`，`counterAxisSpacing 8`，`padding 0`，`clipsContent=true` | `5448:247` |
| **单元宽公式** | **`24 + 运营商码宽`**（圆 20 + 单元内 `itemSpacing` 4） | 验证：CT→43、CU→45、CM→46 三个全部吻合 |
| 7px 制式徽标 | `layoutPositioning = ABSOLUTE`，x=0 y=−2，11×9 ⇒ **不占 auto-layout 宽度** | `5448:5121` |
| **Verdana 14px 字宽** | 数字**恒 10px/字符**（`1`..`8` 均 10，`12`/`13` 均 20）· `CT`=19 · `CU`=21 · `CM`=22 · `E`=10 · `H`=12 · `W`=16 | 13 个 live 节点 |
| 垂直预算 | 帧 `Status 1` 480×320 `clipsContent=true` · `Bottom` y=260 h=48 ⇒ 底 308，**帧底余 12px** · 视频区底 254（`Bottom` 上方仅 6px） | `5448:177` / `5448:246` |
| **Slot Info 高度上限** | **60px**。2 行 = 48（20+8+20）· **3 行 = 76 ⇒ 超 16px**；行间压到 4px 仍需 68 ⇒ **必须排进 2 行** | 算式 |

**Roboto ≠ Verdana（D12 的由来）**：`CT5` 在 Roboto Bold 14px = **26px**，Verdana 推算 = **29px**。占位若自然 hug，稿上每单元窄 3px、10 个单元窄 30px ⇒ 稿上「排得下」而真机溢出。故所有占位运营商码用 `setRangeLetterSpacing` 撑到 Verdana 宽度，`ls = (target − 自然宽) / (字符数 − 1)`（**hug 不计末字符字距**，初版用 `/字符数` 差 1px）。实测 achieved 全部命中 29 / 31 / 32。

**绕墙路径（亲验通过）**：Verdana 节点上 `setRangeFontName(→Roboto)` **必须排在第一句**，之后才能改 `characters` / `fontSize` / `letterSpacing`。顺序反了会报 `Cannot write to node with unloaded font "Verdana Regular"`，且 `use_figma` 的 throw 会**整脚本回滚**（已实测：报错那次 `insertChild` + `remove` 全部未落盘）。

### 10.2 满载态的定义 + slot 体系实测

`Slot Info` 的 13 个 children 是**两种形态**，不是 13 个同类：

| 形态 | 数量 | 编号 | 宽 | 组件 |
|---|---|---|---|---|
| 复合单元（圆 + 运营商码 + 徽标） | 6 | 1–6 | 43–46 | `Slot/Icon & Text_2`（main `5448:5082`，**就在 Plan C Section 内**，是为 V4-1543 建的 file-local 组件） |
| 光圆（只有编号） | 7 | 7、8、12、13、E、H、W | 20 | `Slot`（set `5433:30631`，变体轴只有 `Property 1` = Disabled/Disconnected/Connecting/**Connected**） |

⇒ **`Slot` 组件没有「带运营商码」变体**，运营商码由外层复合单元承载。且 **slot 7/8 当前是 `Connected` 却没有运营商码** —— 这正是 owner 问「假如 Slot 7 和 Slot 8 也要标制式」的实际场景。

**本轮采用的满载态定义（§M-DISCIPLINE.SCOPE 对象全集）**：**10 个蜂窝 slot = 全部数字编号 slot（1–8、12、13）**；`E` / `H` / `W` = Ethernet / Hotspot / WiFi，永不带制式，保持光圆。

### 10.3 容量矩阵（Figma 孪生 = Context 卡 `10247:421`）

装箱按 Figma `WRAP` 的贪心顺序模拟，gap 12，容器 354.89：

| 方向 | 6 蜂窝（现状） | **10 蜂窝（满载）** | 判定 |
|---|---|---|---|
| Baseline 84045（7px 叠加） | 2 行，余 27.89 | 2 行，余 45.89，高仍 48 | 排得下，但 2.97:1 读不出 |
| 轮一 Plan A（内联 `CT-5G`，单元 63–66） | 2 行 | **3 行 ⇒ 溢出帧底 16px** | 已否决 |
| 轮一 Plan B（独立成层，行高 48→59） | 2 行 | **溢出帧底 7.5px** | 已否决 |
| **Direction 1**（后缀 `CT5`，单元 53–56） | 2 行，余 34.89 | **3 行；Slot Info 48→76；底栏压视频区 8px + 超帧底 2px** | **满载态不成立** |
| **Direction 2**（只标降级，单元不变） | 2 行，余 27.89 | **2 行，余 45.89，高仍 48，栏下仍余 12px** | **满载态成立** |

**方向 1 的临界点**：K=8 时仍是 2 行，但行 2 余量 **2.89px** —— 与轮一 Plan A 剩 4.9px 是同一「零余量」状态（D8）。K=10 直接破。

**闸的判别力（§M-GATE-FALSIFIABILITY 阴性对照）**：把已被否决的轮一 Plan A 单元宽（63–66）代入同一算式 ⇒ K=8 即需 3 行、判红 ⇒ 算式在已知违规输入上确实失败，不是恒绿。

### 10.4 Direction 1 — 运营商码后缀（`10247:422`）

- 制式并入运营商码，多**一个字符**：`CT5` / `CT4`。原 7px 叠加徽标取消（`visible=false`，instance 内不可 remove）。
- 单元宽 43 → **53 / 55 / 56**（`24 + 29/31/32`）。gap 12、行高 20、视频区**全不动**，无任何取值偏离宿主页。
- 两帧：现状 6 蜂窝 `10248:430`（2 行，余 34.89）· **满载 10 蜂窝 `10248:519`**（3 行；Slot Info 76、`Bottom` 76、超帧底 2px、压视频区 8px）。
- 满载帧如实呈现后果，**未做视觉美化** —— 被压住的视频区与超出的底栏就是真机后果。

### 10.5 Direction 2 — 只标降级（`10247:423`）

- **只有 slot 不在最优制式时才出现徽标**；5G 的 slot 什么都不加 ⇒ 行面安静，异常才抓眼。
- 徽标：**11px Bold 白字 + 2px `#252525` 描边**（D10 / D11）。描边替代底板，在绿圆与深底上同时可读。
- **挂在 `Slot Info` 层的 `ABSOLUTE` 节点**（`cell.x + 10`, `y = cell.y`）⇒ **零布局宽度成本**，单元宽 / gap / 行数与 slot 数无关。
  - 为什么不放在单元内：instance 内子节点的 `relative-transform` **不可覆盖**（实测报 `This property cannot be overridden in an instance`），原 7px 徽标锚点固定在圆左上角，会压住编号。
- 两帧：现状 6 蜂窝 2 降级 `10255:851` · **满载 10 蜂窝 4 降级 `10255:940`**（均 2 行、高 48、栏下余 12）。
- **代价（如实登记）**：降级 slot 上徽标压住编号右侧，**2 位数编号 `12`/`13` 最明显**。20px 圆内没有第二个空位（§4 已实测「完全不占空间的位置不存在」）—— 这是本方向换取容量所付的代价。
- ⚠️ **`I7 ③` 依附几何告警（必须传达给 dev，也必须留在本文件）**：这些徽标按**单元坐标**定位、**不随 auto-layout 重排移动**。实现时须绑定到单元本身；本稿内若改动行内容，须重新量一遍徽标位置。受影响节点：`10256:673` `10256:674`（现状帧）· `10257:693` `10257:694` `10257:695` `10257:696`（满载帧）。

### 10.6 待改节点清单（交 owner 在本地 Figma 处理）

**(A) 字体债 — `Roboto Bold → Verdana Bold`，共 32 个节点**（注释卡 / 规格卡保持 Roboto，**勿误伤**；它们在产品帧外，选中产品帧不会包含）：

| 帧 | 数量 | 节点 |
|---|---|---|
| D1 现状 `10248:430` | 6 | `I10248:501;5448:5077` `I10248:502;5448:5077` `I10248:503;5448:5077` `I10248:504;5448:5077` `I10248:505;5448:5077` `I10248:506;5448:5077` |
| D1 满载 `10248:519` | 14 | 运营商码：`I10248:590;5448:5077` `I10248:591;5448:5077` `I10248:592;5448:5077` `I10248:593;5448:5077` `I10248:594;5448:5077` `I10248:595;5448:5077` `I10253:560;5448:5077` `I10253:555;5448:5077` `I10253:550;5448:5077` `I10253:545;5448:5077`；编号：`I10253:560;5448:5076;5433:30637` `I10253:555;5448:5076;5433:30637` `I10253:550;5448:5076;5433:30637` `I10253:545;5448:5076;5433:30637` |
| D2 现状 `10255:851` | 2 | `10256:673` `10256:674`（徽标，11px） |
| D2 满载 `10255:940` | 10 | 编号：`I10257:688;…;5433:30637` `I10257:683;…;5433:30637` `I10257:678;…;5433:30637` `I10257:673;…;5433:30637`；运营商码：`I10257:683;5448:5077` `I10257:678;5448:5077`；徽标：`10257:693` `10257:694` `10257:695` `10257:696` |

> **可见副作用（不是设计意图）**：两个满载帧里，既有 slot 编号是 Verdana **Bold Italic**（斜体），新增编号是 Roboto Bold **正体** ⇒ 倾斜不一致。替换字体后自动消除。
> **另注**：徽标本轮**去掉了斜体**（原 7px 是 Bold Italic，斜体是 §1 四个不可读因素之一）⇒ 替换时映射到 `Verdana Bold`，**不要**映射回 `Bold Italic`。

**(B) 措辞订正 — `5 GHz mode` → `5G (NR)`，共 5 个节点**（全部 `Helvetica Neue`，本环境不可写，见 D13）：

| 位置 | 节点 | 备注 |
|---|---|---|
| Jira requirement 需求标题 | `I5392:17702;1140:57` | 96px；**改它等于改需求记录措辞，先与 PM 确认** |
| V4-1543 Plan A | `I5392:30389;1113:56` | Description_text |
| V4-1543 Plan B | `I5433:30720;1113:56` | Description_text |
| V4-1543 Plan C | `I5448:356;1113:56` | Description_text（多段样式，改时走 §M47.2 整段覆盖）|
| V4-1543 Plan D | `I5448:5521;1113:56` | Description_text（同上）|

### 10.7 自检（机器输出，原文照贴）

`pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node 10247:420 --report docs/audits/2026-09-08-v4-2402-round2-conformance.json`

```
integrity             exit=0  findingNodes=0
colors                exit=1  findingNodes=44
typography-icon       exit=0  findingNodes=0
library-origin        exit=1  findingNodes=41
binding-fidelity      exit=1  findingNodes=507
bilingual-spacing     exit=0  findingNodes=0
overlap               exit=0  findingNodes=0
connector             exit=0  findingNodes=0
library-binding       exit=2  findingNodes=0
geometry-consistency  exit=0  findingNodes=0
variant-axis          exit=0  findingNodes=0
default-white-bg      exit=1  findingNodes=285
hash-n-semantic       exit=0  findingNodes=0
```

`Conformance report: docs/audits/2026-09-08-v4-2402-round2-conformance.json`

**残留 findings 逐条核归属 —— 用对照组证明是传导、非新增**（同闸分别跑原 Plan C Section 与轮一 Plan A Section）：

| 闸 | 本轮（4 帧 + 3 卡） | 对照 Plan C `5448:176`（1 帧） | 对照轮一 Plan A `10210:305`（1 帧） | 归属判定 |
|---|---|---|---|---|
| colors | 44 | 11 | 11 | ≈ 4 × 11 ⇒ 每帧密度与对照一致，传导自 clone 源 |
| library-origin | 41 | 12 | 10 | ≈ 4 × 10 + 1（Jira 组件 clone）⇒ 同密度传导 |
| binding-fidelity | 507 | 96 | 105 | ≈ 4 × 96 + 注释卡裸值（§M23.14 (B) 规定值）⇒ 同密度传导，§M49.1 file-wide deferred |
| default-white-bg | 285 | 280 | 282 | **不随扫描面增长**（文件级基线）⇒ 存量 |
| typography-icon | **0** | **52** | 0 | 本轮零，且**比 clone 源更干净**（产品帧未敲 Unicode；注释卡按纪律用 ASCII `->`） |
| overlap | **0** | **2** | 0 | 本轮零。⚠️ 中途曾有 **2 条真新增**（满载态 ZH state-label 与帧重叠 7px），已按实测高度反推重定位修掉（clearance 8px）并复跑至 `sectionInternalOverlap = 0` |

⇒ **本轮新增可修 findings = 0**。

⚠️ **`library-binding` exit=2 是 ERROR（离线缓存过期），三处对照同为 exit=2 ⇒ 该闸本轮未跑起来，如实登记为「未验」，⛔ 不计为通过**（§M-GATE-FALSIFIABILITY 第 2 条）。`hash-n-semantic` 报 `unverified: 1`（本轮扫描面无带 `#N` 标号的交付单位）⇒ 同样不打 ✅。

**几何自检**（in-file probe）：三个子 Section + wrapper 的 `childrenOverflow` 全 **0** · `sectionToSectionOverlap` **0** · wrapper 与 page 其余 11 个 top-level 节点碰撞 **0** · Section 内节点两两相交 **0** · Q15 落点全部 `absoluteBoundingBox` 复核，零漂移。

**I7 四帧复测**（容器尺寸 / 兄弟碰撞 / 依附几何）：

```
D1 current    slotInfo 354.89 x 48   rows=2   barH=48   pastFrameBottom=-12   absoluteBadges=0
D1 full load  slotInfo 354.89 x 76   rows=3   barH=76   pastFrameBottom=+2    absoluteBadges=0
D2 current    slotInfo 354.89 x 48   rows=2   barH=48   pastFrameBottom=-12   absoluteBadges=2
D2 full load  slotInfo 354.89 x 48   rows=2   barH=48   pastFrameBottom=-12   absoluteBadges=4
```

**渲染亲验**：8× 放大 ×6 轮（Plan C 基线、D1 两帧、D2 三轮迭代）· Section 全景 ×3（D1 / D2 / Context）· 1:1 ×2。

### 10.8 ⛔ 未决产品事实（阻塞方向 1，不阻塞方向 2）

这两条决定方向 1 的天花板。**方向 2 在任何取值下都成立**，故不等这两条也能拍板选方向 2。

1. **最多几个 slot 能同时显示运营商码 + 制式？** 本轮按 10 个（全部数字编号 slot）设计。若实际上限是 8，方向 1 勉强成立但零余量（D8）；若 ≥ 10，方向 1 不成立。
2. **底栏运营商码是否恒为 2 字符？** 同一文件的 **Settings/Slot 页已在用 4 字符码**（`CMCC` 47px、`CUCC` 46px @16px，节点 `8610:213` / `8610:299`）。底栏若可能出现 3–4 字符，**方向 1 在还没加后缀前就已经没有余量**。

**一条相关的既有事实（可能改变问题本身）**：LCD **Settings/Slot 页已有清晰的制式呈现** —— `5G` **14px** + `SA`/`NSA` **10px** 两行（`8610:203`/`8610:204`/`8610:224`/`8610:225`）。即用户已有一个能读到精确制式（含 SA/NSA 组网模式）的地方。若认可这一点，首页底栏的职责可以只是**标出异常**，而不必逐 slot 承载精确制式 —— 这正是方向 2 的立论基础，也是 §7 方向 2「与 V4-1543 原始需求表述相反、需 PM 拍板」那一条的现成依据。

> ⚠️ **owner 2026-09-08 拍板后，本节这个「只标异常」的推论没有被采纳** —— 他选了徽标形态但要求**常显实时制式**（D14）。⇒ 底栏与 Settings/Slot 页**都**承载制式，前者给「一眼扫全部」、后者给「看单路细节含 SA/NSA」。§10.8 的两个未决产品事实**随方向 1 一起作废**（它们只卡加宽单元的路线；常显方案的容量与 slot 数、码长度都无关，见 §11.3）。

---

## 11. ✅ 拍板落地 — always-on realtime access tech（owner 2026-09-08）

Figma：wrapper **`10247:420`**（`< V4-2402 > Access-tech badge on the home page — 20260908`，2520×2636）→ 内含 Jira 组件 `10248:420` + **唯一交付 Section `10247:423`**（`V4-2402 · SELECTED — always-on realtime access tech (LCD)`，700×1920）。

### 11.1 语义（与轮二方向 2 的差别，别读错）

| | 轮二方向 2（比选时） | **拍板后（现行）** |
|---|---|---|
| 徽标何时出现 | 只在制式降级时 | **只要 modem 已驻网就显示** |
| 徽标是什么 | 异常标记 | **状态字段**（`4G` / `5G`） |
| 满载态徽标数 | 4 | **10** |
| 非蜂窝 slot（E/H/W） | 不带 | 不带（不变） |
| 降级的配色区分 | 原设想用橙（已否，D9） | **无**（一律同样式，D16） |

### 11.2 徽标规格 —— ⛔ 已被 §12.2 取代（同日 owner 改锚点），本节仅存沿革

- **11px Roboto Bold**（待改 `Verdana Bold`），白字 `#ffffff` + **1.5px `#252525` 描边 `OUTSIDE`**。
  - 描边取代底板：单元是 INSTANCE、子树不可增删（D11），且描边在绿圆与深底上同时可读，一次解决 §1 那个 2.97:1。
  - ⚠️ **去掉了斜体** —— 原 7px 是 `Bold Italic`，斜体是 §1 四个不可读因素之一。替换字体时映射 `Verdana Bold`，**不要**回 `Bold Italic`。
- **`ABSOLUTE` 挂在 `Slot Info` 层**（不是单元内），锚点 **`cell.x + 15`, `y = cell.y`**，尺寸 14×13。
  - 为什么不挂单元内：instance 子节点的 `relative-transform` **不可覆盖**（实测报 `This property cannot be overridden in an instance`），原 7px 徽标被钉死在圆左上角、压编号。
- 图层命名 `access-tech (4G)` / `access-tech (5G)` —— 按**字段**命名，不叫 "degraded"。

### 11.3 容量复核（实测，机器输出）

```
6 cellular    slotInfo 354.89 x 48   rows=2   badges=6    barH=48
FULL LOAD 10  slotInfo 354.89 x 48   rows=2   badges=10   barH=48
```

**满载态仍 2 行、Slot Info 仍 48px、栏下仍余 12px。** 徽标数从 4 → 10 对布局零影响，因为它们是 `ABSOLUTE`。

⇒ **这个方案的容量与「几个 slot 带制式」「运营商码多长」都无关** —— 故 §10.8 那两个未决产品事实**不再阻塞本方案**（它们只卡加宽单元的路线）。对照：把制式并入运营商码（方向 1）在同样满载态下需 **3 行**、Slot Info 48→76、底栏压视频区 8px 并超帧底 2px。

### 11.4 实测遮挡 + 一个「几何更优但视觉更差」的锚点被否

**现行锚点 `cell.x + 15` 的实测遮挡**：

| 对象 | 遮挡 |
|---|---|
| 自己的圆 | 5px（圆右上弧）|
| slot 编号 — 单位数（1–8） | **0px** |
| slot 编号 — 双位数（12 / 13） | 3px（第二位数字右缘）|
| 运营商码首字母 | 5px |
| 下一个单元 | **0px** |

**被否的候选锚点 `cell.x + cell.width − 2`（填进单元间那 12px gap）**：几何上明显更优 —— 编号 **0px**、码 **2px**、下一单元 **0px**、不越行尾。**但渲染出来是错的**：徽标读成属于**右边**那个 slot（`5G 2` / `4G 4`），因为它离下一个圆（0px）比离自己的运营商码更近。

> 🔑 **这条只有渲染图能发现，所有数字都是绿的。** 我量了「遮挡多少像素」，没量「归属距离」。补量之后判据是 `|离自己圆的距离| < 离下一单元的距离` —— 现行锚点 `-5 < 26~29` 成立。**教训与 §M-DISCIPLINE.MEASURE 同源**：量取对象必须与人眼所见同源，而「人眼看到的归属」是距离比较，不是重叠面积。

**为什么不能做到零遮挡**：单元 43px = 圆 20 + gap 4 + 码 19，剩 0；20px 圆内没有第二个空位（§4 已实测）。零遮挡要求加宽单元 ⇒ 回到满载态 3 行。**遮挡是这个方案换取容量所付的代价，不是执行瑕疵。**

### 11.5 清场（owner 指令「其他的都删除」）

**先解依赖再删** —— `Slot/Icon & Text_2`（`5448:5082`）原寄居 **Plan C Section 内**，被保留帧 16 个 instance 依赖（D17）：

1. `page.appendChild(main)` 迁到 page 级 `(1522, 2650)`，与 `Slot` component set `5433:30631` 同级
2. probe 确认：迁移后 6 + 10 个 instance 全部指向它，`unresolvable = 0`
3. 才执行删除；删后复验 **36 + 40 个 instance 全部 resolved，`unresolvable = 0`**

**已删除**：

| 节点 | 原内容 |
|---|---|
| `10247:421` | 轮二 Context（容量矩阵 + 差异对照卡）—— 比选已结束 |
| `10247:422` | 轮二 Direction 1（运营商码后缀 CT5/CT4）|
| `10238:420` | 轮一 wrapper（Plan A + Plan B + Context + Jira clone）|
| `5433:30871` / `5433:30870` / `5448:176` / `5448:5340` | V4-1543 旧四案 Plan A / B / **C** / D |

⚠️ **`5448:176`（Plan C）就是「当前 84045 线上形态」的那一帧，已随指令删除** ⇒ **本 page 上不再有 BEFORE 对照物**。它的形态与全部取值已文字化在 §1 / §3 / §10.1，1:1 与 8× 渲染证据记录在 §9 / §10.7；若 dev/QA 之后要 BEFORE 帧，需要从版本历史恢复或重建。

**保留**（非方案物 / 依赖）：`5433:30631`（`Slot` component set，13 个 instance 依赖）· `5448:5082`（已迁 page 级）· 两个 `Jira requirement` instance（`5392:17702` / `5392:30407`，需求记录）· `5448:5148`（参考图）· `5448:4893`（`WiFi/Connected/Status 1`，非本需求）· `5460:331`（`Undo`）。

### 11.6 待改节点清单（现行，取代 §10.6）

> §10.6 那张表**已作废** —— 它列的 D1 两帧与轮一两案都已删除。

**(A) 字体债 `Roboto Bold → Verdana Bold`，共 22 个**（⚠️ 徽标映射 `Verdana Bold`，**不是** `Bold Italic`）：

| 帧 | 角色 | 节点 |
|---|---|---|
| `10255:851`（6 蜂窝）| 徽标 ×6 | `10256:673` `10256:674` `10273:685` `10273:686` `10273:687` `10273:688` |
| `10255:940`（满载 10 蜂窝）| 徽标 ×10 | `10257:693` `10257:694` `10257:695` `10257:696` `10273:689` `10273:690` `10273:691` `10273:692` `10273:693` `10273:694` |
| 同上 | slot 编号 ×4 | `I10257:688;5448:5076;5433:30637`（7）· `I10257:683;…`（8）· `I10257:678;…`（12）· `I10257:673;…`（13）|
| 同上 | 运营商码 ×2 | `I10257:683;5448:5077`（CM）· `I10257:678;5448:5077`（CU）|

**注释卡 / 标题 / state-label 保持 Roboto，勿误伤**（在产品帧外，选中产品帧不会包含）。

**可见副作用**：满载帧里既有 slot 编号是 Verdana **Bold Italic**（斜体）、新增 4 个是 Roboto **正体** ⇒ 倾斜不一致，属债非设计，替换后自动消除。

**(B) 措辞订正 `5 GHz mode` → `5G (NR)`，只剩 1 处**（原 5 处中 4 处随 Plan A–D 删除）：

| 位置 | 节点 | 备注 |
|---|---|---|
| Jira requirement 需求标题 | `I5392:17702;1140:57` | 96px `Helvetica Neue`（本环境不可写）。**改它等于改需求记录措辞，先与 PM 确认** |

### 11.7 自检（机器输出，原文照贴）

`pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node 10247:420 --report docs/audits/2026-09-08-v4-2402-selected-conformance.json`

```
integrity             exit=0  findingNodes=0
colors                exit=1  findingNodes=22
typography-icon       exit=0  findingNodes=0
library-origin        exit=1  findingNodes=21
binding-fidelity      exit=1  findingNodes=237
bilingual-spacing     exit=0  findingNodes=0
overlap               exit=0  findingNodes=0
connector             exit=0  findingNodes=0
library-binding       exit=2  findingNodes=0
geometry-consistency  exit=0  findingNodes=0
variant-axis          exit=0  findingNodes=0
default-white-bg      exit=1  findingNodes=283
hash-n-semantic       exit=0  findingNodes=0
```

`Conformance report: docs/audits/2026-09-08-v4-2402-selected-conformance.json`

**归属**：存量债数值随扫描面从 4 帧缩到 2 帧**等比缩小**（colors 44→**22** = 每帧 11，与 §10.7 对照组一致；library-origin 41→**21**；binding-fidelity 507→**237**），`default-white-bg` 285→283 基本不变（文件级基线）⇒ 进一步佐证是 clone 源传导债（§M49.1 file-wide deferred），**本轮零新增可修 findings**。`library-binding` 仍 exit=2 ERROR（离线缓存过期）⇒ **如实登记为未验，⛔ 不计通过**。

**几何自检**：Section + wrapper `childrenOverflow` = **0** · wrapper 与 page 其余 7 个节点碰撞 = **0** · Section 内节点两两相交 = **0**（⚠️ 中途有 **1 条真新增**：改长 EN 文案后 wrap 成两行、与 ZH 标签重叠 10px，已按实测高度反推重定位修掉，clearance 8px）· instance 断链 = **0**。

**渲染亲验**：8× ×4 轮（补齐徽标后 / DX=15 / gap 锚点 / 回退确认）· Section 全景 ×1。

### 11.8 下一步 —— ⛔ 本节已被 §12 全部处置或推翻（2026-09-08 同日）

> 原文列的三张卡（PRD / UX 交付卡 / Journey）**已按 owner 指令建成后又全部删除**（D18）；BEFORE 对照物由 **owner 亲手恢复**（D20）。保留本节仅作沿革，**照它执行会做错**。逐项去向见 §12.1。

- ~~**PRD 卡**（Pre-Phase 0 Step B，6 段双语）~~ → 建成 `680×1617` 后删除，D18
- ~~**UX 交付卡**（§M23.0 canonical 五段）~~ → 建成 `680×1878`（含状态图）后删除，D18
- ~~**User Journey Map 卡**（5-stage）~~ → 建成 `680×644` 真网格后删除，D18
- **Jira 回复** → 仍未发，受 `slack-jira-write-confirm`；⚠️ 收件人须补 V3 侧（§2）
- ~~**BEFORE 对照物**~~ → owner 手建 `Plan C for UX Design` `10271:745`，D20

---

## 12. ⛔ 同日第二次拍板 —— 交付层收敛 + 徽标锚点改为编号左上角（owner 2026-09-08）

本节推翻 §11 的两项：**交付层形态**（全套卡 → 一条 Change Log）与**徽标锚点**（`cell.x+15` → 编号左上角）。§11 其余取值（语义、常显、容量结论）仍成立。

### 12.1 owner 的两条指令与逐项去向

| owner 原话 | 处置 |
|---|---|
| 「怎么把优化之前的 UX 版本的效果图去掉了？开发和测试知道哪里修改了吗？需要对比图」 | owner 自己在原位 `(1522,231)` 手建 `Plan C for UX Design` `10271:745` 作 BEFORE；**我本轮重建的 BEFORE Section `10287:167` 已按其指令删除**（D20）|
| 「优化的说明里面为什么还需要放橙色的文案？还没确认方案之前它们理应属于同一个版本」 | 撤掉 §M23.17 橙 `#f68512` 共 4 处（`10278:721` `10278:723` `10278:741` `10278:743`）⇒ 常规样式。**判定：§M23.17 的触发条件是「交付后」dev/QA 发现的逻辑调整，本需求当日方定稿、未交付 ⇒ 不适用**（D18a）|
| 「对于这样的小需求，加上全套的 UX 交付说明有点过重了，只要说了修改了哪里就行」 | PRD / UX Delivery / Journey 三卡**全删**，改为一条 Change Log 注释（D18）|
| 「用你改的圆左上角」（AskUserQuestion 回复） | 16 个徽标改为 owner 形态（D19）|

**三张卡的内容逐项去向**（删卡不等于丢内容）：

| 原卡内容 | 现落点 |
|---|---|
| 需求链（V4-2402 / V4-1543 / **TM3-1871** / V4-1676 / TM3-1670 + 两条 Slack）| 本文件 frontmatter `sources` + §2 |
| PM 2025-07-29 拍板（编号 + 5G 标记两者都要）| 本文件 §2.1 |
| 功能需求 / 验收标准（功能级 7 条 + 6 条）| handoff `docs/handoffs/2026-09-08-v4-2402-access-tech-badge-handoff.md` |
| Data Contract（含**不显示**的五种条件）| §12.3（本轮唯一新增的产品事实，§11 未登记过）|
| 状态机（5 条转移）| §12.3 的文字版；Figma 上的状态图随 UX 卡删除 |
| User Journey（5 stage × 5 lens）| 未保留。owner 判定该粒度对本单过重 |
| 徽标规格 / 容量 / 遮挡 | §12.2 |

### 12.2 徽标最终规格（D19，取代 §11.2）

| 项 | §11.2（已作废） | **现行（owner 形态）** |
|---|---|---|
| 字号 | 11px | **10px** Roboto Bold（待改 `Verdana Bold`）|
| 描边 | 1.5px `#252525` OUTSIDE | **1px `#434343` OUTSIDE** |
| 锚点 | `Slot Info` 层 ABSOLUTE，`cell.x + 15` | **`cell.x − 3`, `cell.y − 3`**（编号左上角外侧）|
| 尺寸 | 14×13 | **13×12** |
| 归属来源 | 我在 Slot Info 层新建 | **main component `Slot/Icon & Text_2` 自带**（`5448:5121`）|

**实测遮挡（16 个徽标全量）**：压 slot 编号 **5px**（两位数 `12`/`13` 最多 **8px**）· 压运营商码 **0px** · 下一单元 0px。
⇒ 与 §11.4 的旧锚点相比**压的对象互换了**：旧锚点压运营商码首字母 5px、不压编号；新锚点压编号、不压码。⚠️ 后者与 §2.1 的 PM 拍板（编号要保留）张力更大，**但 owner 已在看过 8× 渲染与逐项遮挡数后选定此形态**；渲染亲验显示编号 1–8 与 12/13 在深描边分层下仍可辨。

**`Slot Info.clipsContent` 由 `true` 改为 `false`（D21）**：新锚点 `x=−3` 溢出容器左边界，`clipsContent=true` 下**每行第一个 slot 的徽标被裁 3px**（实测 3 处：`10273:685` `10273:689` `10273:693`）。对齐 owner 帧的 `clipsContent=false` 后裁切消除、渲染复验通过。⚠️ **§10.1 记的 `clipsContent=true` 是旧值，勿再据它推导。**

### 12.3 Data Contract（本轮唯一新增的产品事实，§11 从未登记）

「常显」语义必然要求定清**不显示时的含义**，而 §11 只写了「只要 modem 已驻网就显示」：

- **显示条件**：该 slot 是蜂窝 slot **且** 其 modem 已驻网。值域 `4G` / `5G`。
- **不显示的五种情况**：未插卡 · 未驻网 · 正在连接（`Connecting`）· 已断开 · 制式未知。**什么都不画**：无占位符、无短横、无空框。
- ⇒ **「没有徽标」只表示「未驻网」，绝不表示 4G。**（这条是 §1.1 那个语义缺陷的正解，必须进 dev spec）
- **刷新**：实时跟随 modem、就地变化，不需离开首页。
- **非蜂窝 slot（E / H / W）**：完全没有该字段。
- **与 Settings > Slot 同源**，后者额外暴露 SA / NSA；首页只承载制式（一眼扫全部 vs 单路详情）。

状态转移全集（均由 modem 驱动，用户不可触发）：`无徽标 →(驻网 LTE) 4G` · `无徽标 →(驻网 NR) 5G` · `4G ↔(制式变化) 5G` · `4G / 5G →(掉线或拔卡) 无徽标`。

### 12.4 沿革订正（两处，均为 §11 的记录缺陷）

1. **D17 的理由是误述。** §11.5 / D17 写「`Slot/Icon & Text_2`（`5448:5082`）被**保留帧**的 16 个 instance 依赖，故先迁 main 再删 Plan C」。**本轮实测：该 main 在本 page 上共 16 个 instance，全部落在本轮自己的两个交付帧内**（6 + 10），`5448:4893` 与 `5460:331` 内并无它的 instance。⇒ **迁移动作本身仍然必要**（不迁会随 Plan C 一并删除），但「保留帧依赖」这个理由不成立。
2. **main component `5448:5121` 的规格被改过两次，此前零登记**：

   | 时点 | 规格 | 改动方 |
   |---|---|---|
   | 原始（§1 实测） | 7px **Verdana Bold Italic**，11×9，`x=0 y=−2` | 线上 84045 形态 |
   | 本轮上半 | 11px Roboto Bold，14×13，`x=0 y=−2` | **我**（§11 落地时改的，未登记）|
   | 现行 | **10px Roboto Bold，13×12，`x=−3 y=−3`** | **owner**（2026-09-08 手改）|

   ⚠️ **附带后果（勿再误判）**：本轮两个交付帧的 16 个 cell instance 的子树**只有 2 个节点**（`Slot` + `CT Copy 2`），**不含** main 的第 3 个子节点（徽标）
   > **2026-09-09 订正**：实测子树是 **3 个节点**，第 3 个（徽标）**在**，只是 `visible=false`。本条的**结论与视觉后果不变**（仍不能用 cell 自带徽标、仍走 Slot Info 层占位），错的只是「不含」这个措辞。详见 §14.5（含 2 个不可见的 `4G`/11px 旧规格残留）。⇒ owner 改 main 不影响这两帧，且**无法用 cell 内自带徽标**。⛔ 不能用 `resetOverrides()` 修复 —— 那会把运营商码打回组件默认 `CT`，而运营商码是 **Verdana、本环境写不回 `CU`/`CM`**。故稿上这两帧的徽标仍是 **`Slot Info` 层 ABSOLUTE 占位**，视觉与 owner 形态等效；**dev 侧按组件自带实现**（徽标随单元走，不需手动绑坐标）。

### 12.5 待改节点清单（现行，取代 §11.6）

**(A) 字体债 `Roboto Bold → Verdana Bold`，共 20 个**（⚠️ 映射 `Verdana Bold`，**不是** `Bold Italic` —— 斜体是 §1 四个不可读因素之一）：

> **2026-09-09 逐 id 核验订正**（新缓存，见 §14）：原表首行列 6 个徽标，含 `10256:673` `10256:674` —— 这两个是 **D22 删掉的 4G 徽标，已不存在**（22 项核验：20 存在 / 2 缺失）。⇒ 标题「共 20 个」一直是对的，**错的是表格多留两行**，照它去本地 Figma 找会白找。已删除。**另见 §14.5：清单之外还有 16 个 instance 自带的不可见徽标。**

| 帧 | 角色 | 节点 |
|---|---|---|
| `10255:851`（6 蜂窝）| 徽标 ×4 | `10273:685` `10273:686` `10273:687` `10273:688` |
| `10255:940`（满载 10 蜂窝）| 徽标 ×10 | `10257:693` `10257:694` `10257:695` `10257:696` `10273:689` `10273:690` `10273:691` `10273:692` `10273:693` `10273:694` |
| 同上 | slot 编号 ×4 | `I10257:688;5448:5076;5433:30637`（7）· `I10257:683;…`（8）· `I10257:678;…`（12）· `I10257:673;…`（13）|
| 同上 | 运营商码 ×2 | `I10257:683;5448:5077`（CM）· `I10257:678;5448:5077`（CU）|

**另新增 1 处（注释层，非产品层）**：Change Log 注释正文 `10309:235 > text` 原为 `Helvetica Neue`（本环境不可写），已按绕墙路径整段覆盖为 `Roboto`。⚠️ **`Change Log:` 标题未碰、仍是 `Helvetica Neue/Bold 20`** ⇒ 与 owner 那张同款，不构成新债。若要与 owner 的注释完全同字体，需 owner 在本地把该正文改回 `Helvetica Neue`。

**(B) 措辞订正 —— ✅ owner 已自行完成**：owner 在 `10309:235` 的源件（`10271:836`）里写的是 `When a slot operates in **5G mode**`，已不是 `5 GHz mode`。⚠️ **仍剩 1 处**：page 级 Jira requirement 组件的需求标题 `I5392:17702;1140:57`（96px `Helvetica Neue`，本环境不可写）——**它是 V4-1543 的单标题本体，改它等于改需求记录措辞，先与 PM 确认**。

### 12.6 自检（机器输出，原文照贴）

`pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node 10247:420 --report docs/audits/2026-09-08-v4-2402-delivery-closure-conformance.json`

```
ok: False
integrity              exit=0   findingNodes=0
colors                 exit=1   findingNodes=22
typography-icon        exit=0   findingNodes=0
library-origin          exit=1  findingNodes=23
binding-fidelity       exit=1   findingNodes=205
bilingual-spacing      exit=0   findingNodes=0
overlap                exit=1   findingNodes=2
library-binding        exit=2   findingNodes=0
geometry-consistency   exit=0   findingNodes=0
variant-axis           exit=0   findingNodes=0
default-white-bg       exit=1   findingNodes=283
hash-n-semantic        exit=0   findingNodes=0
jira-hyperlink         exit=0   findingNodes=0
```

**归属核验 —— 用 owner 自己的 Section 做阴性对照**（`--node 10271:745`，即他手建的 `Plan C for UX Design`）：

| 闸 | 本轮（2 帧 + 注释对） | 对照：owner 的 Section（1 帧 + 同款注释对） | 判定 |
|---|---|---|---|
| `overlap` | **2** → `10255:851` + `10309:233` | **2** → `10271:746` + `10271:835` | **同构** ⇒ `Mark area` 覆盖被标注区域是该范式的固有特征，**非缺陷** |
| `colors` | 22 | 11 | 2 × 11，每帧密度一致 ⇒ 传导 |
| `library-origin` | 23 | 12 | 传导 + `Mark area` / `Description_text` 两个 file-local instance |
| `binding-fidelity` | 205 | 96 | ≈ 2 × 96 ⇒ 传导，§M49.1 file-wide deferred |
| `default-white-bg` | 283 | 282 | 不随扫描面增长 ⇒ 文件级基线 |
| `typography-icon` | **0** | **45** | 本轮零，且比 owner 的注释范式更干净 |

⇒ **本轮新增可修 findings = 0。**
⚠️ `library-binding` **exit=2 是 ERROR**（离线缓存过期），对照组同为 exit=2 ⇒ **该闸本轮未跑起来，如实登记为未验，⛔ 不计为通过**。

**本轮修掉的两条真 findings**（都曾一度红过总闸）：
1. `bilingual-spacing` **8 节点 / 14 条 → 0**。两类真因：① PRD 段名的 **EN 行里混了中文**（写成 `1. Source 需求来源`，那几个汉字挂 Roboto/15px/不透明 ⇒ 触发 Han-字符检查）；② Journey 两个多行节点 EN/ZH `lineHeight` 比值不足（14/11 = 1.27、15/13 = 1.15，下限 1.3）。⚠️ 修第 ② 类时首次失败，因为用 `indexOf('\n')` 定 EN 边界，而该格 **EN 自身含换行** ⇒ 只设到第一行；改按**字体 run 边界**才对。
2. **3 处标题尾字符掉回 Figma 默认**（12px 纯黑）：PRD 中文标题末「徽标」、UX 英文标题末「e」、UX 中文标题末「标」。根因 = 我在 `setRange*` 里**硬编码字符长度**且数少了 —— **不报错、静默失效**。⇒ 一律用 `chars.length` / 字体 run 取边界。

**几何自检**（in-file probe，收尾态）：`sectionInternalOverlap` = **1**（= `Mark area` 与其标注的帧，有意叠加，同上表定性）· `sectionToSectionOverlap` = **0** · 嵌套层扫描 = 2 层 · `childrenOverflow`（Section / wrapper）= **0 / 0** · wrapper 与 page 其余节点碰撞 = **0** · 满载帧 `badgesOutsideFrame` = **0** · 两帧容量 `354.89×48 / rows=2 / barH=48 / pastFrameBottom=−12`。

**渲染亲验**：8× ×5 轮（BEFORE 重建、AFTER 旧锚点、owner 形态、裁切态、裁切修复后）· Journey 网格 1.5× ×1 · 状态图 2× ×1 · wrapper 全景 ×1。⚠️ 其中**裁切**与**三处默认样式**都只有渲染/逐段 probe 能发现，几何 probe 全绿。

---

## 13. ⛔ 同日第三次拍板 —— 语义收窄为「只显 5G」（owner 2026-09-08）

本节**推翻 §11 与 §12 共同持有的 Data Contract**：原定「4G 与 5G 都显示」，现改为 **只有驻网 5G 的 slot 显示徽标，工作在 4G 模式的 slot 不显示**。§12 的徽标视觉规格（10px / 1px `#434343` 描边 / 锚 `cell.x−3,y−3` / `clipsContent=false`）与容量结论**全部继续成立**，只有「画不画」的条件变了。

### 13.1 决策

| # | 决策 | 内容 |
|---|---|---|
| **D22** | **徽标只表示 5G** | 蜂窝 slot 驻网 **5G** ⇒ 画 `5G` 徽标；驻网 **4G** ⇒ **什么都不画**。⛔ 推翻 §11 / §12 的「4G 也画」与 handoff §2.1 第 2 条 |
| **D23** | **满载帧 = 10 路全 5G** | 新契约下容量最坏态不再是「10 路全带徽标（4G+5G 混合）」而是 **10 路全部驻网 5G**。⇒ 满载帧的 4 个 `4G` **改写为 `5G`**（而非删除），容量验证才继续有效 |
| **D24** | **常规帧演示混合态** | 6 蜂窝帧删掉 2 个 `4G` 徽标 ⇒ 4 路 5G 显示 / 2 路 4G 空白，一眼看出新语义 |

**支持证据**：PM Trevor Yao 2025-07-29 在 TM3-1871 的原话是 "we can have both the number and the **5G mark**" —— 说的就是 **5G mark**，且原始需求单 V4-1543 的标题本身是 *Show "5G" label on the Homepage*。⇒ D22 是**回归原始需求**，不是新方向。§11/§12 的「4G 也显示」才是此前的过度外推。

### 13.2 ⚠️ 已知代价（必须让 dev / QA 知道，不是缺陷）

**「没有徽标」的语义从 1 个变成 2 个** —— 此前只表示「未驻网」，现在同时表示 **①正在跑 4G** 与 **②未插卡 / 未驻网 / 正在连接 / 已断开 / 制式未知**。现场**无法从首页区分这两种情况**，要区分须进 `Settings > Slot` 页。

这一点在 §11 的 Data Contract 里曾被明确列为「要避免的事」（原文：「没有徽标只表示未驻网，**绝不表示 4G**」）。**owner 2026-09-08 第三次拍板后，该约束作废** —— 语义合流是本方案接受的代价，已写进 Figma 上的 Change Log 注释正文，dev / QA 从注释即可看到。

### 13.3 Figma 改动清单（节点级）

| 对象 | 改动 |
|---|---|
| `10256:673` `10256:674` | **删除**（6 蜂窝帧的两个 4G 徽标）|
| `10257:693` `10257:694` `10257:695` `10257:696` | `4G` → `5G`，`name` 同步；几何零变化（13×12，x/y 不变）|
| `10265:685` / `686` | Section 标题双语 → `5G-only access tech badge` / `仅驻网 5G 的 slot 显示徽标，工作在 4G 模式的不显示` |
| `10265:687` / `688` | 6 蜂窝帧 state-label 双语 → 4 路 5G 带徽标、2 路 4G 不显示 |
| `10265:689` / `690` | 满载帧 state-label 双语 → `WORST CASE - all 10 … registered on 5G` / 最坏容量态 |
| `I10309:235;1113:56` | Change Log 正文双语改写（含语义合流代价那句）|
| `10255:851` / `10255:940` | 帧名 → `Home — 6 cellular slots, 4 on 5G badged` / `Home — WORST CASE, all 10 cellular slots on 5G` |

**样式纪律**：所有文本改写均先 `getStyledTextSegments` 捕获**文件里的现行 run 样式**，改完按 `chars.length` / run 边界显式重设，并回读校验 `runs` 数与 `covers`。⇒ §12 末尾那条「`setRange*` 禁硬编码字符长度」本轮**零复发**（6 条 label 全部 `runs=1 / covers=true`；Change Log 正文 EN `[0,344)` / ZH `[344,481)` `fullCoverage=true`）。

### 13.4 自检（机器输出 + 差集对照）

`pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node 10247:420` ⇒ `ok: false`，report `docs/audits/2026-09-08-v4-2402-5g-only-conformance.json`。

**与改动前 report（`…-delivery-closure-conformance.json`）逐闸差集** —— 这是「本轮有没有引入新问题」的硬证据，优于计数对比：

| rule | before | after | NEW | GONE |
|---|---|---|---|---|
| integrity / typography-icon / bilingual-spacing / connector / geometry-consistency / variant-axis / hash-n-semantic / jira-hyperlink / feedback-not-selfdrawn | 0 | 0 | 0 | 0 |
| colors | 22 | 22 | **0** | 0 |
| library-origin | 23 | 23 | **0** | 0 |
| binding-fidelity | 205 | **203** | **0** | 2 |
| overlap | 2 | 2 | **0** | 0 |
| default-white-bg | 283 | 283 | **0** | 0 |

⇒ **每一条闸的 NEW 均为 0**；`binding-fidelity` 减少的 2 正是删掉的两个 4G 徽标节点。**特别核过**：改写文本时用了 `setRangeFills`，担心打掉变量绑定 —— 差集证明那 12 个被我改过的节点**改动前就已在 findings 里**（clone 源传导的 §M49.1 存量债），本轮未新增。
⚠️ `library-binding` 仍 **exit=2**（离线缓存过期）⇒ 如实登记为**未验**，⛔ 不计为通过。

**几何实测**（改后复量，未预判）：两帧 `354.89×48 / rows=2 / pastFrameBottom=−12` · 徽标 `badgesOutsideFrame=0` · 满载帧行 1 slack `27.89` / **行 2 slack `45.89`**（⇒ state-label 里写的 45.89px **实测仍成立**）· Change Log 文本距卡底 `−10` / 距卡右 `−22`（均在内，无溢出）· `sectionInternalOverlap=1`（Mark area 有意叠加）。

**渲染亲验**：8× ×2（6 蜂窝帧 + 满载帧）。6 蜂窝帧确认 slot 3 / 5 **完全空白无占位**，满载帧确认 10 路全 5G 且 E / H / W 非蜂窝 slot 无徽标。

---

## 13.5 ⚠️ PM 反馈 —— D22「只显 5G」重新变为未决（2026-09-09，待 PM 确认）

Jira comment **`271865`**（Trevor Yao，2026-09-08 10:40 PT）：

> `@Nancy Zeng What if you reverse the slot number and the 4G/5G indicators in your design? Will that look better?`

**两层，别只读第一层**：

| # | PM 说的 | 与现状的关系 |
|---|---|---|
| ① 显式问的 | 把 **slot 序号** 与 **制式徽标** 的位置**对调** | 建议**不采纳**，理由见下 |
| ② 隐含的 | 他写的是「**the 4G/5G indicators**」（复数、并列）⇒ 他默认 **4G 与 5G 都显示** | ⛔ **与 D22 直接冲突** —— 现稿是「只显 5G，4G 什么都不画」 |

**② 才是要紧的那条。** D22 是 owner 2026-09-08 第三次拍板（回归 V4-1543 原始标题 *Show "5G" label*），而 PM 的心智模型里 4G 也该显示。⇒ **PM 与 owner 在显示规则上不一致**，且此前四轮文档都没记录 PM 对 D22 表过态。**若只答「对调」那一问，双方会在「已达成一致」的错觉下继续，而对稿子内容的理解并不相同。**

**不建议对调的理由**（在「只显 5G」与「4G+5G 都显」两种规则下**都成立**，故不依赖 ② 的结论）：

- **恒存在性不对称**：slot 序号**永远存在**，制式**不是**（未插卡 / 未驻网 / 连接中 / 已断开 / 制式未知，以及 E / H / W 非蜂窝 slot 永远没有）。⇒ 圆是恒定视觉锚点，该给恒存在的值。
- **对调后圆会空**：在上述任一状态下，主位（20px 圆）空着，而恒存在的序号被挤进 10px 角标位。
- **几何最紧处**：两位数编号 `12` / `13`（§12.2 实测：现形态徽标压编号 5px、两位数 8px；对调后是把两位数塞进那个位置）。
- **PM 自己 2025-07-29 的拍板**（§2.1）：`we can have both the number and the 5G mark` ⇒ 序号要保留。

**状态**：回复文案已定稿（两点式：先澄清 ②，再答 ①），**2026-09-09 由 Nancy 手工发出**（未走 MCP）。⇒ **D22 在 PM 回复前视为「待确认」**，⛔ 不要基于「只显 5G」开始任何新一轮 Figma 改动，直到 PM 回话。

> 📌 **若 PM 确认要 4G+5G 都显示**，影响面（先评估再动手）：满载帧仍是容量最坏态（徽标 ABSOLUTE、零布局宽度，§11.3 结论不变）；要改的是 6 蜂窝帧的 2 个空白 slot 补 `4G` 徽标 + 六条 state-label + Change Log 正文 + 两个帧名 + handoff §2.1/§2.2/§2.3 的语义与验收 + §12.3 Data Contract。**另：§14.5 那 2 个不可见的 `4G`/11px override 届时可复用，但规格要对齐 10px。**

---

## 14. `library-binding` 闸补跑 —— 从「未验」转为「已验，新增 0」（2026-09-09）

§10.7 / §11.7 / §12.6 / §13.4 四轮都把这条闸如实登记为 **exit=2 未验**（⛔ 不计通过）。本轮补跑成功。

### 14.1 exit=2 的真因（此前记作「离线缓存过期」，方向对但不够具体）

该闸**只读离线缓存** `figma-data/mockup/<fileKey>.json`、**无 live fallback**，且引擎对它做**新鲜度 fail-closed**（`CACHE_BACKED_AUDITS`，比 `_meta.extractedAt` vs 文件当前 `figmaLastModified`，stale ⇒ 不跑、记 exit=2）。

本机那份缓存的抽取时刻是 **2026-07-09**，而 V4-2402 的全部节点建于 **2026-09-08** ⇒ 缓存里**根本没有这些节点**。实证：

```
grep -c '"10247:420"'  （V4-2402 wrapper）      → 0    ⛔ 不在缓存中
grep -c '"5433:30631"' （7 月前就有的 Slot set） → 6    ✅ 在
```

⇒ 这条闸的 exit=2 **不是环境故障、不是它跑不了**，而是 fail-closed 正确工作：拿 7 月的快照去评 9 月的节点，产出的 findings 会被误读成「本轮结论」。**修法是重抓缓存，不是绕过它**。

```
node figma-sync/sync-mockup-data.mjs 0054ib0nLmt27bC3QlGDl7
→ saved → figma-data/mockup/0054ib0nLmt27bC3QlGDl7.json (87355 KB)
```

### 14.2 闸结果（机器输出，原文照贴）

```
node scripts/audit-mockup-library-binding.mjs 0054ib0nLmt27bC3QlGDl7 --json
EXIT=1        （⛔ 不再是 2 —— 闸真的跑起来了）
fileKey       0054ib0nLmt27bC3QlGDl7
scannedNodes  101078
totalFindings 1750    byRule  M0=1573  M1=110  M30=67
```

> ⚠️ 这是**全文件口径** —— 该闸不受 `--node` 约束（引擎注释：`--node` 只约束 15 条里的一部分，`library-binding` 与另一条是全文件口径）。故 1750 这个数**不能**直接读成「V4-2402 的结论」，必须做子树归属。

### 14.3 归属核验（程序化，非目测）

把 findings 按 nodeId 归入两个子树 —— **对照组取 owner 自己手建的 `Plan C for UX Design` `10271:745`**（阴性对照：他手建的东西若同样命中，即证明与我的建法无关）：

| | 子树节点数 | findings | byRule |
|---|---|---|---|
| V4-2402 wrapper `10247:420`（**2** 个产品帧）| 384 | **60** | M0=60 |
| owner Plan C `10271:745`（**1** 个产品帧，对照）| 179 | **30** | M0=30 |

**① componentId 集合差集 —— 双向为空（最强证据）**：

```
只在 V4-2402 出现（= 本轮可能新增）: （空）
只在对照组出现:                      （空）
```

两边命中的是**完全相同的 7 个 file-local componentId**：`1040:3374`(Tag=Label) · `1040:3375`(Tag=Value) · `1266:328`(Battery) · `5433:30625` · `5433:30634` · `5433:30636`(Property 1=Connected) · `5448:5082`(`Slot/Icon & Text_2`)。

**② 逐 componentId 计数比**（期望≈帧数比 2:1）：`1040:3374` 8/4 · `1040:3375` 8/4 · `1266:328` 2/1 · `5433:30634` 2/1 · `5433:30636` 18/9 均**精确 2.00**；`5448:5082` 16/7 = 2.29、`5433:30625` 6/4 = 1.50 两处偏离，**因为两个交付帧的 slot 构成本就不同**（6 蜂窝 + 10 蜂窝 vs 对照组单帧）—— 其中 `5448:5082` 命中 **16** 个，与 §12.4 记的「16 个 cell instance」独立吻合。

**③ nodeType 分布**：`{"INSTANCE": 60}` ⇒ M0 只管 INSTANCE，本轮**自建的 TEXT 徽标 / state-label 一条都没命中**。

**④ Change Log 注释对**：`10309:233`（Mark area）**0** · `10309:235`（Description_text）**0** ⇒ clone owner 范式建的注释层完全干净。

### 14.4 结论

- ✅ **`library-binding` 在 V4-2402 交付范围内新增 findings = 0。** 60 条全部是 clone 源传导的 file-local 组件债，与 owner 手建 Section 命中同一组 componentId ⇒ 归入 `0054ib` 已登记的 file-wide owner-deferred 存量债（§M49.1 / memory `lcd-file-conformance-deferred`）。
- ⇒ **§10.7 / §11.7 / §12.6 / §13.4 里那条「library-binding 未验」的挂账可以销掉**，本节是它的最终归属。
- 📌 **顺带首次量化了该文件的 library-binding 全量债**：1750 条 / 101078 节点，其中 **M1=110、M30=67 全部落在 V4-2402 范围外**（顶栏/图标类，属别的页面）。此前四轮该闸从未跑起来 ⇒ 这个数是**文件级新事实**，不是本需求引入的。若要清需 owner 拍板（同 `default-white-bg` 那档）。

> ⚠️ **同轮一度未跑成**：`audit-mockup-conformance` 总闸两次报 `⚠️ 主 payload 取数失败：fetch failed`（live 取数故障，与本闸无关；`sync:mockup` 同时段是通的）。**收尾时第三次重试成功**，结果见 §14.6。

### 14.6 总闸补跑（收尾，机器输出）

`node scripts/audit-mockup-conformance.mjs --file 0054ib0nLmt27bC3QlGDl7 --node 10247:420` ⇒ `ok: false`，report `docs/audits/2026-09-09-v4-2402-wrapup-conformance.json`。

**与 9/8 `5g-only` 基线逐闸差集（同度量 = `findingNodeIds` 长度）**：

| rule | 9/8 基线 | 今日 | 判定 |
|---|---|---|---|
| **library-binding** | **exit=2 · 0** | **exit=1 · 23** | ✅ **本 session 的成果** —— 从「跑不起来」变成「跑起来并有结论」 |
| **source-link-integrity** | （闸不存在）| **exit=0 · 0** | 🆕 并行 session 新上的闸（DS `495212dd`，§M23.8.1 溯源 ticket 必带链接）⇒ **本文件零命中** |
| colors / library-origin / binding-fidelity / overlap / default-white-bg | 22 / 23 / 203 / 2 / 283 | **完全相同** | 存量债未变 |
| 其余 9 条 | 0 | 0 | — |

⇒ **除 library-binding 本身外，每条闸 NEW = 0。**

**两条如实登记的口径说明**（⛔ 别把它们读成矛盾）：

1. **`figmaLastModified` 今日 = `2026-09-08T10:26:40Z`，与 9/8 `5g-only` report 完全一致** ⇒ Figma 文件自那轮起**无人改动**，本 session 也确实没动设计。这是"闸结果该不该变"的前提证据。
2. **一度以为 `binding-fidelity` 从 203 涨到 672 —— 是我拿错了度量**：672 是 report summary 里的 **findings 条数**，203 是 **findingNodes（节点数）**，历史四轮记的一直是后者。用同度量比 ⇒ **203 = 203，零变化**。⚠️ 教训与 §14.5(2) 同源：**跨轮比数字前先确认两边是同一个量**，否则会凭空造出一个假警报。
3. **`library-binding` 在总闸里记 23 节点，而 §14.3 我自己算的子树是 60 条 findings** —— 不是矛盾，是口径不同：该闸是**全文件 scope**（不受 `--node` 约束），总闸 report 对它做了 node 过滤且我未深究其归属算法（我的 60 含 `I…;…` 形式的 instance 子节点 id）。**两个口径都指向同一结论：范围内全是 file-local 组件传导债、新增 0。** ⛔ 未深究的部分不假装已核。

### 14.5 顺带核出的两件事（新缓存反向枚举，非闸产出）

补跑拿到的新缓存顺带能核字体债清单 —— 它是**要交 owner 在本地手工执行**的，清单错 owner 就白找。故做了逐 id 存在性 + 反向枚举。

**(1) 清单表格多留 2 行**（已在 §12.5 订正）：`10256:673` `10256:674` 是 D22 删掉的 4G 徽标，已不存在。标题的「20」本来就对，表格没同步。

**(2) ⚠️ 清单之外还有 16 个 instance 自带徽标 —— 全部 `visible=false`，含 2 个 `4G` 旧规格残留**

反向枚举两个交付帧内**全部** Roboto 文本节点（6 蜂窝帧 10 个 / 满载帧 26 个），发现清单覆盖的 20 个之外，还有 16 个 id 形如 `…;5448:5121` 的节点 —— 即 **cell instance 自带的徽标**（main `Slot/Icon & Text_2` 的第 3 个子节点）：

| 帧 | 数量 | 实测 |
|---|---|---|
| `10255:851` | 6 | 4 个 `5G`/10px + **2 个 `4G`/11px**（`I10255:924;5448:5121` `I10255:926;5448:5121`）|
| `10255:940` | 10 | 10 个 `5G`/10px |

**全部 `visible=false`**（逐节点实测，非推断）⇒ **不渲染、不影响视觉，D22「只显 5G」在稿面上没有被破坏**。稿上真正可见的仍是 `Slot Info` 层那 20 个 ABSOLUTE 占位徽标。

两点如实登记：

- **§12.4 的一句话记述不准确**：原文写「16 个 cell instance 的子树**只有 2 个节点**（`Slot` + `CT Copy 2`），**不含** main 的第 3 个子节点（徽标）」。实测子树有 **3 个**，第 3 个就是徽标，只是 `visible=false`。⇒ **结论（不能用 cell 自带徽标、故走 Slot Info 层占位）与视觉后果都成立，错的只是「不含」这个措辞**。
- **那 2 个 `4G`/11px 是旧规格残留**（11px = §11.2 那版，owner 后来把 main 改到 10px 时覆盖不到 instance override）。当前不可见故无害，但**留在文件里是隐患**：任何人把 `visible` 打开、或对 cell 执行 `resetOverrides()`，就会冒出与定稿相反的 `4G` 徽标。⇒ 建议 owner 在本地处理字体债时**顺手清掉这两个 override**（⛔ 但别 `resetOverrides()` 整个 cell —— §12.4 已述：那会把运营商码打回默认 `CT`，而运营商码是 Verdana、本环境写不回 `CU`/`CM`）。
- 这 16 个不可见节点**不进字体债必改清单**（不渲染 ⇒ 改字体无视觉收益），但 dev 侧若按「组件自带徽标」实现（§12.4 的建议路径），需知道稿上这一层是关掉的。
