# LCD 提示文案总表（Message / Toast strings · TVU Pack 设备端）

> **本文件是取值真源**（文案串 · 节点 id · 出处）。做法 / 判据类内容的落点见 §2 与 §9.2。
> **Figma 孪生** = Touch Screen 文件 `0054ib0nLmt27bC3QlGDl7` 的常驻页 **`LCD Message & Toast Strings 20260831`**（page `10166:2`，Section `10167:2`）——两边同源，改一处必同步另一处。
>
> 命名用 `Strings` 不用 `Copy`：`copy` 在 UX 行业虽指「文案」，但在 Figma 语境里极易被读成「副本」（Figma 复制页面即 `Copy of X`）。
>
> **为什么单开一页/一档**：此前 LCD 的提示文案没有交付层，文案只留在 Slack thread 与 Jira 评论里，三个月后开发与测试都找不到。本页 = 跨需求的常驻登记处，不属于任何单个 Jira 需求。

**适用文件**：Touch Screen v7.7/8.0 `0054ib0nLmt27bC3QlGDl7`（TM1100 / TM1000 V4 等 pack 机身屏）。
**产品 UI 语言**：设备语言单语（EN）。本页的中文列是注释层译文，**不进产品界面**（DS `mockup-conventions.md` §M33）。

---

## 1. 结构与扩展方式（先读这节再加内容）

本页会持续增长，结构按**「加一类场景 = 追加一个自包含单元，不动任何已有单元」**设计：

```
① 这页放什么 / 怎么加        ← 极少动
② 全局规则                   ← 只放对所有提示都成立的少数几条
③ 场景 · <场景名>            ← 每类一个，自包含四段
④ 场景 · <下一类>
⑤ …
⑨ 现存未收敛文案登记          ← 尾部
```

**每个场景单元固定四段，照填即可**：

| 段 | 内容 | 说明 |
|---|---|---|
| ① 本类规则 | 只管这一类的判据 | 跨所有场景成立的不写这里，提到 §2 |
| ② 文案表 | EN 文案 + 中文对照 | EN = 产品 UI，中文 = 注释层 |
| ③ 渲染示例 | 一个 `Message` instance | **每类一个，不逐条铺**（owner 2026-08-31 拍板）——同类共用同一组件与渲染表现，逐条配只撑长页面不增信息 |
| ④ 出处 | Slack / Jira 链接 | **跟着场景走**，不集中放页尾；否则半年后查不到某条文案是哪个需求定的 |

场景单元还需在标题下写一行 **`Trigger:`**，标明触发族——这决定它适用哪套规则（触发族二分的判据真源 = DS §M53）：

| 触发族 | 含义 | 该说什么 |
|---|---|---|
| `user-initiated` 用户操作触发 | 用户改了某个控件（切源、改设置） | 报**用户刚动的那个控件**的新值 |
| `system-initiated` 系统主动触发 | 用户没动任何控件（温度过高、信号丢失、电池低） | 报**发生了什么 + 要不要处理**；「刚动的控件」在这里不存在，别套用 user-initiated 的规则 |

## 2. 全局规则（对本页所有提示成立）

1. **只用设备语言**。产品界面不出现双语，本文件的中文是注释层（DS §M33）。
2. **用界面上的标签原文**，含大小写。
3. **说发生了什么变化** —— 而不是复述用户已经看得见的东西。
4. **一条提示只说一件事。**

> ✅ **已回流设计系统**（owner 2026-08-31 拍板）。做法 / 判据真源 = DS [`mockup-conventions.md` §M53](../../../tvu-design-system/docs/internal/mockup-conventions.md)「Feedback Message Copy：先定触发族，再定这条提示该说什么」。
> 本节保留摘要供快查，**判据冲突时以 DS 为准**；本文件只管**取值**（文案串 / 节点 id / 出处）。

### 2.5 落位通则（owner 2026-09-10 拍定 · **2026-09-11 收窄，判定顺序见 §2.5.1**）

> **提示条上缘 = 「承载『我在哪』的顶部区域」下沿 + 8px。** 水平居中，宽度 HUG 内容。

| 宿主帧族 | 顶部结构 | 定值 | 依据 |
|---|---|---|---|
| **B · 设置页 / 子页，且导航条下面**不是**状态控件行** | `Frame 1984` 型导航条 **46 高** + ≥18px 标题，其下首个区块是普通内容（说明文字 / 列表 / 表单标题等）| **`y = 54`**（46 + 8）| 导航标题是「我在哪」的唯一凭据。F2 persona 实证：远程支持的标准话术就是「你屏幕最上面写的是什么」，标题被盖 = 远程定位失效。⚠️ **本档已于 2026-09-11 收窄** —— 原文无「下面不是状态控件行」这个前提，见下方 C 档 |
| **A · 首页 / 视频页** | `Header` / `Live header band` **32 高**，只有状态图标、**无标题** | **`y = 8`**（0 + 8）| 无标题可丢；沿用本文件 **8 处**既有先例 |
| **C · 设置页 + 导航下紧接状态控件行**（2026-09-11 立，**同日 owner 看 mockup 后改定**）| 导航条 **46** + 紧随其后的**状态控件行**（如 V4-2318 Hotspot 页的 `Mode row` 46..98）| **回落 A 档 `y = 8`** —— 盖导航标题，保状态控件行 | 该行正是这条提示的**论据**（「模式仍为 WiFi」靠 Mode pills 证明）。⇒ 两害相权：**宁可盖掉「我在哪」，不能盖掉「凭什么这么说」** |

**`54` 和 `8` 不是两个任意数字**，是同一个 8px 间距在「有 / 无导航标题」两种顶部结构上的推导。⚠️ 上表三行是**分类说明**，实际判定**请走 §2.5.1 的顺序**（表格容易被当成并列三选一，其实是有优先级的）。

**C 档的判据（三条，顺序即优先级）**：

1. **不压这条提示所指代的状态控件**（pills 是论据，必须可见）；
2. **不切任何文字** —— 宁可完整覆盖一整行，也不横切半截（同本节否决 24px 的理由）；
3. 满足前两条的落点里**取最靠上的**。

> 🔴 **C 档终值 = `y=8`，⛔ 此前写的 `y=118` 已作废**（owner 2026-09-11 看 mockup 后拍定「错误的提示应该在顶部，当前的位置不对」）。
>
> **`y=118` 错在哪**：它满足了上面三条判据，却漏了一个判据之外的前提 —— **提示条本来就该在顶部**。三条判据是用来在「顶部区域内部」选落点的，不是用来把提示一路往下推的。按它推下去，提示落到了内容区中段，读起来不像浮层、像一句正文。⇒ **判据能算出一个合法值，不等于那个值是对的**；判据没覆盖的前提，得靠看渲染图补。
>
> **`y=54` 也不行**（本轮实测，不是推断）：45 高提示占 54..99，把 Mode row（46..98）整条盖住，且因居中后宽 439 < 456，**左右各露 8.5px，把 `Mode` 的 "M" 切成半截** —— 直接违反判据 2。
>
> **`y=8` 逐字形复核**（`10464:357`，机器输出）：唯一被覆盖的字形 = 导航标题 `Hotspot`（11..35，**整体覆盖不切半**）；`Mode`（63..82）· `Disable`/`Hotspot`/`WiFi` pills（64..81）· 正文（145..162）· `Connect to WiFi`（195..212）· `Home`（288..306）**全部可见**。

### 2.5.1 判定顺序（2026-09-11 owner 拍定收窄后的完整口径）

拿到一个宿主帧，**按这个顺序问，第一个命中的就是答案**：

```
① 导航条上有标题吗？
   没有  → y = 8                      （首页 / 视频页族）
   有    → 继续问 ②
② 导航条正下方那一块，是不是「这条提示所指代的状态控件行」？
   是    → y = 8   盖标题、保控件      （本页正是此例）
   不是  → y = 54  盖不到标题          （设置页默认）
```

**② 的判据是「这条提示指代它吗」，不是「那里有没有控件」**。同一个控件行，对 A 提示是论据、对 B 提示可能无关；无关时仍走 `y=54`。判法：把提示文案念一遍，问「用户要验证这句话，得看屏上哪块？」——那块就是论据。

**取舍原则一句话**：**宁可盖掉「我在哪」，不能盖掉「凭什么这么说」。**
标题丢了用户还能退出重进；论据丢了这条提示就自证不了，而提示是转瞬即逝的（`size=L` 点击关闭），标题在它关掉之后立刻回来。

**先例实测（2026-09-10 全文件扫，`relY` 相对 480×320 宿主帧）**：

| page | 节点 | 尺寸 | `relY` | 宿主顶部 | 有标题？ |
|---|---|---|---|---|---|
| `< V4-2333 >` | `9472:84` | 281×45 | 8 | `Live header band` 32 | ❌ |
| `< V4-2333 >` | `9901:778` | 322×45 | 8 | `Live header band` 32 | ❌ |
| `< V4-2333 >` | `10052:645` | 375×45 | 8 | `page_bg` + `Group 5` | ❌ |
| `< V4-2333 >` | **`9988:423`** | 369×45 | **8** | **`Frame 1984` 46** | ✅ `Settings/Test Signal` |
| `< V4-2333 >` | **`9988:690`** | 363×45 | **8** | **`Frame 1984` 46** | ✅ `Settings/Test Signal` |
| `< V4-2335 >` | `9301:26` / `9304:26` / `9304:67` | 360×33 | 8 | `Header` 32 | ❌ |

- ✅ **原登记的「存量不合规 2 处」已解除**（owner 2026-09-11 拍定，从待修名单划掉）：V4-2333 的 **`9988:423`（L6，宿主帧 `9965:610`）与 `9988:690`（L7，宿主帧 `9988:647`）**，此前按「设置页一律 `y=54`」被判违规。按 §2.5.1 的新判定顺序**它们本来就对**，逐条核过：
  - 导航标题 `Settings/Test Signal`（12..35），有标题 ⇒ 进第 ② 问；
  - 导航条正下方 46..172 是**三行参数值**（`Pattern: Ramp` / `Format: 1080i59.94` / `Tone: 1 s`）；
  - 两条提示分别是 `Parameters applied — test signal reconnected.` / `Couldn't apply parameters — please try again.` —— **说的就是这三行参数**，它们即论据 ⇒ 命中「是」⇒ `y=8`；
  - 落位实测：提示 8..53 **完整覆盖**标题（12..35），首行参数文字从 **58** 起，**未被触碰、无半截字**。
  ⇒ 与本文件 §5.3 的 Hotspot 失败态帧**结构与结果逐条同形**。这两帧是该规则的先例，不是它的例外。
- ⛔ **`24px` 已作废**：实测 45 高提示在 `y=24` 时占 24..69，仍压导航条 22px，且是**唯一会把标题横切成半截**的档（半截字比整条被盖更难读），且全文件无先例。

## 3. 场景 · 信号源配置变更（Source configuration change）

**Trigger**：`user-initiated`（用户操作触发）
**触发点**：切换成功、live 起来之后。

### 3.1 本类规则

- **报用户刚动的那个控件的新值；不跳层去报上层类型。**
  - 动的是 source type radio → 报类型（§3.2）
  - 动的是 `Merge All IP Source` 开关 → 报合并状态（§3.3）
- 若选项标签本身是合并写法（如 `HDMI/SDI/USB`），照标签原文读：`Switched to HDMI/SDI/USB source.`
- **反例**：用户改的是 `Merge All IP Source` 开关，提示却说「已切换到 IP Source」—— 报的是用户没碰的那一层，用户对不上自己的操作。

### 3.2 信号源类型切换

| LCD 上选中的 source type | 提示文案（EN，产品 UI） | 中文对照（注释层） |
|---|---|---|
| `HDMI` | `Switched to HDMI source.` | 已切换到 HDMI 源 |
| `SDI` | `Switched to SDI source.` | 已切换到 SDI 源 |
| `USB` | `Switched to USB source.` | 已切换到 USB 源 |
| `NDI` | `Switched to NDI source.` | 已切换到 NDI 源 |
| `IP Source` | `Switched to IP Source.` | 已切换到 IP 源 |

- `IP Source` 那条**不写** `Switched to IP Source source.`（重复）。
- 多路形态加前缀 `Ch {n}: `，`{n}` 取界面上那一路已有的显示名/编号；**单路不加前缀**。
- 渲染示例：以 `NDI` 为例（Figma 页内）。

### 3.3 IP 源模式变更（源类型未变）

不套用 §3.2 的句式——用户没换类型，只改了合并模式。

| 变更 | 提示文案（EN） | 中文对照 |
|---|---|---|
| 多路合并 → 单路 | `Switched to single IP source.` | 已切换到单路 IP 源 |
| 单路 → 多路合并 | `Switched to merged IP source.` | 已切换到多路合并 IP 源 |

- 渲染示例：以「多路合并切单路」为例（Figma 页内）。

### 3.4 出处

- Slack thread：[84051 版本，NDI 切 IP Source 提示（2026-08-27）](https://tvunetworks.slack.com/archives/C021E1BNTPF/p1787823326421399)
- 文案定稿回帖：2026-08-28，同 thread（@Edward Wu / Dave Hu / winniyang）

## 4. 场景 · WiFi 隐藏网络连接（Hidden SSID connection）

**Trigger**：`user-initiated`（用户在 LCD `Other` 表单按 `OK` 提交）
**触发点**：提交之后的连接过程与结果。

### 4.1 本类规则

- **报用户刚提交的那个网络名** —— `{SSID}` 取表单 `Network name` 的输入值。
- **成功提示必须带「重启后需手动重连」**：凭据不持久化是**隐藏 SSID 专属**限制（普通 WiFi 靠 `Remember this network` 勾选才落用户配置）⇒ ⛔ 不要把这句复用到普通 WiFi 的连接提示上。
- **失败提示不给具体原因**，只说失败 + 下一步（§2 规则 3 + `PRODUCT_INTRODUCTION.md` §3.4.1）。⛔ 不许写「密码错误」「信号弱」这类推断。
- **加密类型是「前置告知」不是「事后归因」**（owner 2026-09-11 = D23）：后端只支持 WPA2，用户**不选**加密类型 ⇒ 把 `WPA2-PSK` 写在**密码输入步骤的内联提示**里（见 §4.5），而不是等失败了再在错误文案里解释。⇒ 失败文案保持不变，**不加** `security type` 一类待查项。判据：失败文案已实测 479px 逼近 480 屏宽，加词必折行，违反本节第 4 条。
- **必须单行装进 480**：屏宽 480，`Message` 宽度 HUG 内容。本类三条实测 269 / 415 / 479 px 全为单行。**新增或改写本类文案后必须实测宽度** —— 折成两行即偏离既有范式（既有 toast 全单行，见 §8）。⚠️ 实证 2026-09-10：判「装得下」只看宽度 ≤480 会漏掉折行，某候选实测 480×**66**（撑满且折两行）却仍满足宽度条件 ⇒ 判据必须同时含「高度 = 单行」。

### 4.2 文案表

| 状态 | 提示文案（EN，产品 UI） | 中文对照（注释层） | `status` | 实测宽 |
|---|---|---|---|---|
| 连接中 | `Connecting to {SSID}...` | 正在连接 {SSID}… | `info` | 269 |
| 成功 | `Connected to {SSID} — reconnect after reboot.` | 已连接 {SSID} —— 重启后需重新连接 | `success` | 415 |
| 失败 | `Couldn't connect to {SSID} — check name and password.` | 无法连接 {SSID} —— 请检查网络名与密码 | `error` | 479 |

- `{SSID}` = 用户在 `Network name` 输入的值；效果图取样值 `Guest_Hidden`。
- 三条均 `size=L`（点击关闭），落位 = 水平居中 + **上缘距导航条下沿 8px ⇒ `y=54`**（见 §2.5 通则）。已在三帧落地：`10360:831` / `10353:4826` / `10361:735`，实测三帧一致 `54..99`，与导航条（0..46）重叠 **0**，且完整落在内容区（54..274）内。
- 落位取值的演进（⛔ 别再引用中间那一档）：`8px`（原项目规则，压导航条 38px）→ `24px`（D18，**实测仍压 22px 且把标题横切成半截，已作废**）→ **`54px`（导航条 46 + 8，定稿）**。
- ⚠️ 提示条盖住内容区第一行是 hug 宽 + 顶部落位的固有结果、非施工失误：三条宽 269 / 415 / 479，后两条接近满屏宽。定稿档把被盖对象从**导航标题**换成**内容第一行** —— 前者是「我在哪」的唯一凭据、丢了要退出重进，后者还在原地。

### 4.3 渲染示例

Figma 常驻页内以「成功」为例（`status=success, size=L`）。

### 4.4 出处

- Jira：[V4-1646](https://tvunetworks.atlassian.net/browse/V4-1646)
- Slack thread（客户诉求 + 8.4 承诺）：[#tvu-support-global-requests](https://tvunetworks.slack.com/archives/C014Y5SA4VA/p1783673699149789)
- 后端约束出自同 thread 内 youngzhang 的回复（2026-07-10 13:56 / 2026-08-17 17:45 / 2026-08-21 14:03）：**只支持 WPA/WPA2（无 WPA3）** · **凭据不持久化**。
- ~~🔴 订正（owner 2026-09-10，D17）：`Security` 为二选一（`WPA2` / `None`）~~ → 🔴🔴 **已被 D23 推翻（owner 2026-09-11），⛔ 别再引用二选一**。
- 🔴 **现行口径（owner 2026-09-11 = D23）**：owner 逐字「目前只有 WPA2 这种类型，而且不是可编辑的」+「无密码根本不会弹出输入密码框；有密码时就是 WPA2的」⇒
  - **`Security` 不是用户可编辑字段** —— 表单里整个不出现（节点保留但 `visible=false`，照 Config-T `4900:61500` 的做法）。
  - **有密码 ⇒ 出现密码步骤**，步骤内联提示写明 `WPA2-PSK`（§4.5）。
  - **无密码 ⇒ 不出现密码步骤**，提交网络名后直接进 connecting。
  - ⚠️ youngzhang 原句 `we only have WPA and no password mode for hidden SSID` 的两种读法（「WPA + 无密码两种模式」vs「只有 WPA，且无密码模式」）**到 D23 才真正闭合**：两种模式都存在，但**不由用户在 UI 上选**，而是后端探测后决定要不要要密码。⇒ D17 把它做成 UI 二选一是过度外推。

### 4.5 表单内联提示（**不是 toast**，2026-09-11 新增 · D23）

⚠️ **先说 scope**：本文件标题写的是 Message / Toast，本小节是**内联提示**（常驻在内容区、不会自动消失、无 `Message` 组件、无关闭动作）。放进来的理由和本页立页理由同一条 —— 它也是「三个月后开发与测试找不到」的那类串。**⛔ 别把本节的串当 toast 去装 `Message` 组件。**

| 位置 | 提示文案（EN，产品 UI） | 中文对照（注释层） | 节点 | 实测 |
|---|---|---|---|---|
| 密码输入步骤 · 内容区第一行 | `Enter a WPA2-PSK password for "{SSID}"` | 请输入 "{SSID}" 的 WPA2-PSK 密码 | `10463:865`（容器 `Hint row / Security type` `10463:864`）| 文本宽 **342** · 容器高 **32** · 单行不折行 |

**取值来源（两级先例搜索，§M21.4）**：

- **本产品同场景最近邻** = `5325:19282`（V4-1535 WiFi 密码键盘页的句子式提示 `Enter the password for "Wifi_name_3"`）⇒ **16px · `#7ed321` · 落在内容区第一行、不在导航条里**。本节三个取值全部照它。
- **措辞来源** = Config-T `rJJjWWs51n2iFOlCIC7aYG` 的 `4900:61500`（`Enter a WPA2-PSK password for “WiFi_name_3”`，2025-11-06 那轮把 `Security:` 行设为不可见、把加密类型折进标题句）⇒ 四面一致。
- **引号用 ASCII `"` 不用中文弯引号** —— 本文件既有串与 Figma 侧已统一 ASCII（`curlyQuotes: []` 扫描为空），Config-T 那侧用的是弯引号，⛔ 照抄措辞但**不照抄引号**。
- **容器高 32 是本轮唯一新值**：内容区可用高 90 − 上下 padding 12 = 78，减去字段行 46 = **32**，零溢出（实测 `overflow: 0`）。它不是新的「行高档位」，是「说明行容器高度」，已登记进视觉契约与 handoff。
- ⚠️ **导航标题不动** —— D19 的路径式 `WiFi/Other` 保留。本提示落**内容区**而非导航条，正是因为先例 `5325:19282` 就在内容区；⛔ 别为了照 Config-T 的「标题句」把导航标题改成句子式（那会同时违反 D19 与本产品导航范式）。

## 5. 场景 · 模块 Mode 切换失败（Module mode switch failure）

**Trigger**：`user-initiated`（用户在 Mode 选择器点了另一个模式）
**触发点**：确认后进入 Switching，**切换失败或超时**之后。

### 5.1 本类规则

- **报「刚点的那个模式没生效 + 现在停在哪个模式」**，两个值都用 Mode 控件上的**标签原文**（`Disable` / `Hotspot` / `WiFi`）。
- **不给失败原因**（同 §4.1 第 3 条）。⛔ 不写「WiFi 服务未开启」「驱动未响应」这类归因 —— 原因归日志，文案只答用户此刻的疑问「我那一下生效了吗」。
- **但必须给下一步**（owner 2026-09-11 拍定 = Q1）：尾句固定 `Retry later.` / `请稍后重试。`。⛔ 这**不是**「说原因」的松口 —— 不解释为什么失败，只告诉用户这次失败可以再试。⚠️ 补上后本条才真正满足 §4.1 第 3 条「只说失败 **+ 下一步**」：**旧版缺的正是下一步**，所以这次改动是回到合规、不是新增例外。
- **尾句用 `Retry later.` 不用 `Try again later.`** —— 后者在最长参数组合下**实测折两行**（480×66，见 §5.2），违反 §4.1 第 5 条。⛔ 别按语感把它改回去，改前先量。
- **一条文案覆盖全部 6 条转换**，参数化 `{target}` / `{current}` —— 与 Figma 切换确认文案表「dev 只做一个参数化组件」同构。
- **落位走 §2.5 的 C 档**（该页导航条下紧接 `Mode row`，B 档的 54 会盖住 pills）。
- **提示与 Mode 控件必须同屏可见**：这条提示的论据就是 Mode 控件本身仍显示旧值。遮住控件 = 提示自证不了。
- **Config-T 侧共用同一条串**（同一需求两端），落位另按该端布局定：放在 **Hotspot 段标题同行**，不是页面顶部 —— 页面顶部会让提示读成 `LAN Setting` 段的错误（2026-09-11 渲染图实测发现，几何判据查不出）。

### 5.2 文案表

| 状态 | 提示文案（EN，产品 UI） | 中文对照（注释层） | `status` | 实测宽 |
|---|---|---|---|---|
| 切换失败（已回退）| `Couldn't switch to {target} — mode stays {current}. Retry later.` | 无法切换到 {目标} —— 模式仍为 {当前}。请稍后重试。 | `error` | 439 取样 / **458 最长** |

- 取样实例 `Couldn't switch to Hotspot — mode stays WiFi. Retry later.` 实测 **439×45 单行**（内部 TEXT 359×21）✓ 满足 §4.1「宽 ≤480 **且** 高 = 单行」双条件。
- **最长组合已落帧实测**（2026-09-11 补）：两端 7 字符参数（`Hotspot`/`Disable` 与 `Disable`/`Hotspot`）都是 **458×45 单行** ✓。⇒ 全部 6 条转换均满足双条件。
  - ⚠️ **顺带订正一条旧记载**：改文案前的旧串在 `Disable` 组合下实测 **388**，此前文档里写的「按字符数推算约 394」偏大 6px。**推算值不要留在文档里当结论** —— 这次是偏保守所以无害，但同样的算法在 §4.1 的 480 边界上就会误判。
- ⚠️ **`Try again later.` / `Try again soon.` 实测都装不下**：最长组合 **480×66（折两行）**，命中 §4.1 第 5 条「宽度 ≤480 但折行」那个陷阱 —— 宽度条件满足、高度条件不满足。这正是 §4.1 那条「判据必须同时含『高度 = 单行』」的第二个实证。
- **量法**：改这条串必须在 `10464:1328`（LCD Message instance）上逐候选赋值实测 `width`/`height`，⛔ 不按字符数推算。单行 = Message 高 45。

### 5.3 渲染示例

两端各一帧（同一库组件 `status=error, size=L`）：

| 端 | 宿主帧 | Message 节点 | 落位（2026-09-11 owner 改定：**两端都到顶部**）|
|---|---|---|---|
| LCD | `10464:357`（`F5 · Switch failed`）| `10464:1328` | `x=20.5, y=8`（§2.5 **A 档**）· 439×45 · 右缘 459.5 ≤ 480 |
| Config-T | `8753:1140`（`F6 · Switch failed`）| `8753:1552` | `x=420.5, y=24` · 水平居中于页面壳 `Frame 29`（中心 640 = 640 ✓）|

⛔ **两个旧值均已作废**：LCD `y=118`（见 §2.5 说明）· Config-T `y=235`（贴在 Hotspot 段标题同行，实测读成那个折叠标题的附属徽标，且压住该行的展开/收起热区）。

**Config-T `y=24` 逐字形复核**（机器输出）：完整覆盖顶栏 `Live`（587..621）· `File`（683..713）· `Router`（775..830），**无半截字**；`General`（874..942）· `Advanced`（1004..1085）· 整个 Tab 栏（`Network`/`Firmware Upgrade`/`Region` @y90）· Hotspot 分区内容**全部可见**。

⚠️ **上一轮「页面顶部会读成 LAN Setting 段的错误」那条否决意见不适用于 `y=24`**：当时的落点是 `y=155`，**紧贴第一个分区 `LAN Setting`（y≈150）上方**，所以被就近读成它的错误。`y=24` 浮在顶栏之上、不沾任何分区 ⇒ 归属歧义消失。**⇒ 「页面顶部」当时被整个否掉，其实只有「贴着第一个分区」那一档不行 —— 否决意见的射程被放大了。**

### 5.4 出处

- Slack thread：[V4 dev · hotspot 名称信息不显示（2026-09-09）](https://tvunetworks.slack.com/archives/C021E1BNTPF/p1788947469888169?thread_ts=1788937060.213829&cid=C021E1BNTPF) —— winniyang 报现象 → youngzhang 定根因 → dannerdai 问 UI 流程
- Jira：[V4-1865](https://tvunetworks.atlassian.net/browse/V4-1865)（Config-T）· [V4-2318](https://tvunetworks.atlassian.net/browse/V4-2318)（LCD）
- **回显判据属后端契约、不在本文件**：Hotspot 生效 = `hotspotgetinfo` 返回得出 `ssid` + `password`；判不出就不得把 Mode 显示成 Hotspot。规格真源见两端 design-record 的 Revision Log。

## 6. 场景 · 设备自检结果（Self-Check result）

**Trigger**：`user-initiated`（用户在 LCD `Self-Check` 页点 `Start self-check`）
**触发点**：自检跑完、结果页出现时。

### 6.1 本类规则

- **不是 toast**：这条常驻在结果页内容区、不自动消失、无 `Message` 组件，与 §4.5 同属内联提示。⛔ 别套 `Message` 组件。
- **一句话说两件事：结果 + 去哪看详情。** 模块名用结果页下方三个图标的标签原文（`Basic` / `Video` / `Network`）。
- **详情路径必须给到 tab 一级，只给页面名不够。** 路径 = 经背包热点打开配置页面 → `Advanced` → `Self-check`。owner 2026-09-15 逐字：「只写到 Configuration 页面还不容易找到」。
- **`Advanced` / `Self-check` 取 Config-T 界面标签原文**（实测该页顶栏 `Advanced` 与 tab 栏 `Self-check` 均为选中态）。
- **⛔ 文案里不出现 `Config-T`** —— 那是内部服务名（DS §M44：UI label 不暴露后端服务名）。英文写 `the configuration page`。⚠️ 也别写成 `Configuration`：界面顶栏只有 `Live` / `File` / `Router` / `General` / `Advanced`，没有这一项，写成它会被当作菜单项去找。
- **必须三行内装下。** 警告态宿主 `Frame 2004` 高 66、下方按钮在 `y=64`，第 4 行会压住按钮。实测 `for the full report`（179 字符）与 `for the report`（174）都是 4 行，只有 `for details`（171）维持 3 行。⚠️ 改这两句**必实测**，⛔ 不按字符数推算（同 §4.1 第 5 条）。
- **Config-T 端不复用这条串**：那一端自检完报告直接在页面上，不需要指路（owner 2026-09-15 拍定）。

### 6.2 文案表

| 结果 | 提示文案（EN，产品 UI） | 中文对照（注释层） | 实测 |
|---|---|---|---|
| 全部正常 | `All modules are working normally. Open the configuration page via the pack hotspot, then Advanced > Self-check for details, or contact TVU support.` | 所有模块运行正常。通过背包热点打开配置页面，进入 Advanced > Self-check 查看详情，或联系 TVU 支持。 | 147 字符 · 326×42 · 3 行 |
| 有模块异常 | `There are some issues with the video and network modules. Open the configuration page via the pack hotspot, then Advanced > Self-check for details, or contact TVU support.` | 视频与网络模块存在问题。通过背包热点打开配置页面，进入 Advanced > Self-check 查看详情，或联系 TVU 支持。 | 171 字符 · 328×42 · 3 行 |

- 异常态的模块名按实际失败模块填。
- 落帧（page `< TM3-1800 > Optimization of Self-check`）：`5478:5989`（Self-check/Success）· `5478:6026`（Self-check/Warning）。
- ⚠️ **这两个节点字体是 `Helvetica Regular 12`**（该页历史遗留，非 LCD 正字体 Verdana）。**Helvetica 与 Verdana 在 MCP 环境都加载不了 ⇒ 改这两句只能人工在 Figma 里改**，AI 侧只能出文案清单。量行数可用 `Arimo`（与 Helvetica 等宽，已校准：旧串实测 42 / 28 与线上完全吻合）。

### 6.3 渲染示例

Figma 常驻页内以「有模块异常」为例（内容区内联文字，非 `Message` 组件）。

### 6.4 出处

- Figma：[Touch Screen · < TM3-1800 > Optimization of Self-check](https://www.figma.com/design/0054ib0nLmt27bC3QlGDl7/Touch-Screen-v7.7---8.0--20240220?node-id=5478-5997) · 本轮 Change log 卡 `10520:1109`
- **被替换的旧串（2025-08-01 定）**：`You can view more details by reviewing via the pack hotspot, or contacting TVU support.` —— 只说用热点看，没说打开什么、进去看哪里。
- owner 2026-09-15 走查分三轮收敛：① 要指明去 Configuration 看报告 → ② 要带上自检页路径 → ③ Configuration 是 Config-T 服务、不是页面名，动作链是「连热点 → 打开配置页面 → Advanced > Self-check」。

## 7. 现存未收敛文案登记

| 文案（EN） | 位置 | 状态 |
|---|---|---|
| `Video input detected — now live.` | page `< V4-2333 > Transmission Test`，节点 `9472:84` | 句式与 §3.2 的 `Switched to…` 一族不一致；**未改**，登记在此让不一致可见，收敛需另起一轮并回 Slack thread 确认 |

## 8. 组件与视觉（所有场景共用）

| 项 | 值 |
|---|---|
| 组件 | 库 `Message` component set，key `e9574b39e93ac3ffe94834f05d704798ce997274` |
| 示意用变体 | `status=info, size=L`（变体 key `bd68c0f4c9d31cca1779dd7a483894a0e6be5493`） |
| 变体轴 | `status` (success / info / error / warning) × `size` (L / M)；L = 点击关闭，M = 自动消失 |
| 内部字体 | `Roboto Regular 14`（库组件自带，**不是** LCD 产品层的 Verdana 档） |
| ⛔ 硬约束 | 该组件**无 theme 轴是设计库有意为之**（owner 2026-08-03 拍板）——不要立缺口、不要提案加 dark theme、**不要在产品文件里改它的颜色**（改色即断变量绑定） |

新场景若属告警/错误性质，按语义选 `status`（error / warning），不要一律用 `info`。

## 9. 维护约定

### 9.1 加一类新场景

1. 本文件按 §1 的四段模板追加一节 `## N. 场景 · <名字>`，标明 `Trigger:` 属哪族。
2. Figma 常驻页追加一张场景卡（clone 现有场景卡改内容最省事），同样四段 + `Trigger:` meta 行。
3. **不动**已有场景单元、不动 §2 全局规则——除非新场景暴露出某条规则确实跨所有场景成立，那才提升到 §2。
4. 两边同源，改一处必同步另一处。

### 9.2 落点纪律

文案串属**取值**，留在本项目 repo；判据 / 做法过 DS §M-DISCIPLINE.SOURCE 三问后才回流 DS（§2 已标候选）。

### 9.3 改完必跑

```
pnpm audit:mockup-conformance --file 0054ib0nLmt27bC3QlGDl7 --node 10167:2
```

- 已知既有 findings（**非本页引入，勿逐条修**）：`colors` 与 `binding-fidelity` 的 `B-SCALE` 均落在 `Message` instance **内部**（库组件本体，含组件自带的 `Rectangle 1369` radius 1.2）；`B-TYPO` 为注释卡裸 fontSize，属 §M49.1 file-wide owner-deferred。
- `library-binding` 子闸**不吃 `--node`**，会扫全文件既有存量债，其输出与本页无关。
