# V4-2376 / V4-2333 轮三十 — 措辞按端统一（Config-T `Apply` / LCD `OK`）+ Apply 结果提醒双态 + LCD 撤 discard

> 日期：2026-08-06 · Owner：Nancy · 状态：**已执行完毕（Task 1–5 + 6.1–6.4）· 一项待 owner**

## 执行结果（2026-08-06 收尾）

| Task | 状态 | 说明 |
|---|---|---|
| T1 LCD 措辞刷新 | ✅ | 2 hint + 6 图层名/帧名 + 4 条 annot **22 处**；保段替换、零 `insertCharacters`；残留 `Apply`/`discard`/`B7` 引用 = **0** |
| T2 LCD 交付层 SYNC | ✅ | 8 节点 · 0 条规则失配 · **补上轮真漏的 `blocked while running`** · PRD 终态 3 处 `Apply` 逐一核过（2 处按端句 + 1 处动词，有意保留） |
| T3 LCD 结果提醒双态 | ✅ | L6 `9965:610` 就地改造为 success · **新增 L7 `9988:647`** error · B7 重写 + B8 `9989:459` 新建 · 连线 `9988:731`（Δ3px）· 三级容器扩高 + sibling 下移 |
| T4 Config-T CT7 + CT8 | ✅ | **补两帧而非一帧**（更正：既有 success toast 是「Test signal started」= 开测成功，非 Apply 成功）· 90/20 节奏 · 10 节点下移 SHIFT 2594 · Section 10747→13341 · 交付层 5 节点 |
| T5 项目文档回填 | ✅ | D41 + D40 三处 ⛔/✅ 标注 · handoff **§1k-AE** · design-record（Canonical Terms + 节点索引 + 遗留）· `PRODUCT_INTRODUCTION.md` **§3.4 改按端 + 新增 §3.4.1 + §3.5 加 LCD 作废标注** · 词库 4 条（含去重 1 条）· ledger |
| T6.1–6.4 机检 | ✅ | 两端 conformance（integrity/overlap/connector PASS）+ 几何闸 G1=0 G2=0 G3=0 exit 0（69/12）+ **findings 程序化归属核验：本轮节点命中 = 无** + 4 张渲染图亲验 |
| T6.5 完整 F1 走查 | ⏸ **待 owner 走查定稿后** | 与轮二十九同一处置：本轮只做聚焦自查，完整 6-section F1 待 owner 确认方向后跑，避免对着可能再变的稿子做全量走查 |

### owner 同日两处走查补正（均已落地）

| # | owner 原话 | 病灶 / 落地 |
|---|---|---|
| **补正 1** | 「这个错误示例不合理，没改变都不能点击 OK 按钮，发生应用失败应该是其他的原因」 | 失败 toast 初版 `— test signal unchanged.` 把「**设备侧未改变**」与「**没有待应用改动**」混成一句 ⇒ 与 dirty 规则下「提交键可点」**正面矛盾**，且没给原因也没给下一步。归正为 **`Couldn't apply parameters — please try again.`**（只说失败 + 下一步，不编原因）；两端 toast + 两条 annot + 两端 Data Contract 同步；**真实失败原因枚举列入 Open scope 待 dev 定**（同 D25 处理方式）。见 §1k-AE ⑫ |
| **补正 2** | 「config-T 页面中 Apply 与 Start Test 这类两个按钮之间的间距调整为 token 变量值为 16px Token 变量」 | **推翻 D38 ④ 的写死 20**。九处按钮组容器 `itemSpacing` 绑 DS 语义 token **`Spacing/M`**（=16，本文件已在用、非新引入；Dark/Light 均 alias 到 `Basic Size/#16` ⇒ 绑语义不绑原始值）。**建前 probe 出本页有两种容器结构**（`row · actions` 直挂 vs `row · actions · buttons`），脚本内置「children 必须恰为 2 个 INSTANCE」前置断言防绑错层（父层管的是 hint↔按钮组间距）。**右缘不变量守住：九处第二按钮右缘全 = 2058**，几何闸复跑 G1/G2/G3 全 0。见 §1k-AE ⑬ |

**§I7 本 session 共命中 3 次**（179px 重叠 / annot→帧间距压到 2 / 卡列 gap 掉到 3），量级与方向各不相同 —— 连同轮二十七的 162px、轮二十六的 23px，「改内容后必实测、禁按内容增减预判」已有 5 次独立实证。

**⛔ 唯一阻塞项**：owner 走查轮二十七～三十改动 → 定稿 → 跑完整 F1 → 通过才发 Jira。


---
> 上游真源：`docs/specs/2026-07-28-v4-2333-test-signal-parameters-design.md`（D1–D40，本轮回填 **D41**）
> 前一轮：handoff `§1k-AD`（轮二十九）· 本轮记 **`§1k-AE`**
> 前置计划：`2026-08-06-v4-2376-apply-realtime-discard-plan.md`（轮二十九，已收口）

---

## 本轮起因（owner 会话中三条拍板）

| # | owner 原话 | 落地 |
|---|---|---|
| A | 「我已改完：已手动改完 LCD 底栏 OK→Apply」 | 已核实（见下方「已核实事实」1） |
| B | 「**LCD 端的 discard 弹窗不做**，只是点击 Apply 按钮后需要给**成功和失败的提醒**」 | LCD 撤 discard + 新增结果提醒双态；Config-T 保留 discard 并补失败态 |
| C | 「LCD 触摸屏上面好像全是 OK 按钮，要不然 **LCD 端统一措辞，Config-T 统一措辞**？我再把 LCD 上面的按钮改回 OK」→ 追问实测后重申：「**我刚刚已经全部改回 OK 了，就用这个措辞**」 | **D41 ①**：措辞按端统一 —— Config-T = `Apply`，LCD = `OK`。**推翻 D40 (d) 的「LCD 底栏 OK → Apply」** |

### ⚠️ C 条的实测反证（已提请 owner、owner 重申后按 owner 决定执行）

按「owner 的一致性主张先实测再采信」纪律扫了 LCD 文件 6 个页（对象全集 = 短提交类 label 全枚举 15 个候选词，含 INSTANCE 子树）：

| 页 | `Apply` | `OK` | 其它底栏高频 | `LCD Button` instance label |
|---|---|---|---|---|
| `1077:2` Touch Screen 主页 | — | — | — | 0 → **分类分隔页、空壳，探针无效**（显式声明） |
| `8895:2` V4-1864 Modem Status | 0 | 0 | Back ×2 | 0（纯状态页无提交键） |
| **`5356:4429` V4-1542 LAN IP 配置** | **7**（Verdana） | **0** | — | **`Apply` ×4** |
| `5315:9602` V4-1535 WiFi 密码键盘 | 0 | 1 | Cancel ×19 · Home ×17 | 0 |
| `8476:2` V4-2318 Internal WiFi Mode | 0 | 0 | Home ×6 · Cancel ×1 | Home ×6 · Scan ×2 |
| `4682:2710` V4-1495 HDMI 分辨率 | 0 | 1 | Start ×4 · Cancel ×3 | Stop ×1 |

⇒ **「LCD 全是 OK」在 Figma 设计真源里不成立**：`OK` 在非本 feature 的 5 页共出现 2 次且均非表单提交底栏；`Apply` 出现 7 次且**全部集中在 LCD 上唯一的同类表单配置页 V4-1542**，其中 4 处是同一个 file-local `LCD Button` instance。LCD 底栏真正高频的 `Home`/`Cancel`/`Back`/`Start`/`Stop` 属导航与运行控制，非提交。

**处置**：证据已完整呈报，owner 重申以实机为准选 `OK` ⇒ 按 owner 决定执行，并把「与 V4-1542 的 `Apply` ×7 留跨页不一致」**显式登记为已知偏差**（handoff §1k-AE + D41 ①），不静默通过。

---

## 已核实事实（本轮起手 probe，机器输出）

1. **LCD 5 处提交键已是 `OK`**，`characters` 实测：`9593:547`(L2) / `9623:219`(L3) / `9623:340`(L4) / `9965:390`(L5) / `9965:621`(L6) 内部文本全 = `OK`，**Verdana Regular 15 全保住**；变体值未动（L2/L3/L4 `Type=Primary, Status=Disabled` · L5/L6 `Type=Primary, Status=Normal`）；`opacity` 全 1（M32.4 走真变体，非降透明度）。
2. **`LCD Button` 组件集 `4518:3244` 未加变体** —— 轴仍 `Type: Back|Home|Primary` × `Status: Normal|Disabled|Live|Stop`，6 变体全枚举。`Type=Primary` 默认文案实测是 **`Start`**（**非** §1k-AD ⑤ 记的 `OK`，该处记录有误，本轮更正）；5 处均为文本覆盖。
3. **⛔ §1k-AD ④.4 记的 LCD discard 确认面板 `9965:653` 在文件里不存在** —— `getNodeByIdAsync` 返回 NOT FOUND；L6 `9965:610` 的 12 个 TEXT 与 L5 **逐字相同**，渲染图与 L5 完全一致。⇒ 上一轮「新增 L6 + 确认面板」只有帧成立、面板不成立。**正好 owner 本轮撤 LCD discard ⇒ 无需删除，但该记录须坐实更正。**
4. **DS `Message` set `9322:297`**（remote，key `e9574b39…`）status 轴 = `success | info | error | warning` × size = `M | L` ⇒ **success 与 error 变体都在，无需自画**。LCD 既有 toast 范式 = 该组件 `size=L` 直接置于产品帧内（先例 `9472:84` / `9901:778`，Roboto 14）。
5. **C0/C1/C2 三处 `OK`**（`9866:385` / `9760:318` / `9742:398`，Verdana，`Type=Back` 变体）= 「确认选中的 receiver 并返回」，与表单提交非同类 affordance ⇒ **不动**，handoff 登记为「语义不同、非漏改」。

---

## D41 待回填内容（本轮结论）

| 项 | 内容 |
|---|---|
| **① 措辞按端统一** | Config-T 全线提交动作 = `Apply`（D40 ② 不变）；**LCD 全线提交动作 = `OK`**。**推翻 D40 (d)**「LCD 底栏 `OK` → `Apply`」与 §1k-AD ⑤ 的整份待改清单（该清单已由 owner 反向执行完毕）。已知偏差：与 V4-1542 LAN IP 页的 `Apply` ×7 不一致，以实机为准。 |
| **② LCD 不做 discard 弹窗** | **推翻 D40 ⑤ 的 LCD 半边**（「L6 复用覆盖式列表范式做 confirm 面板」）。Config-T 侧 D40 ④ 的 `form=dialog` 弹窗 canonical **保留不变**。⇒ 两端形态差异从「同文案、异形态」变为「**Config-T 有 discard 兜底 / LCD 无**」，交付层须显式交代。 |
| **③ Apply 结果提醒双态（两端）** | 提交后必须给结果反馈：**成功** = `Message status=success, size=L`；**失败** = `status=error, size=L`。LCD 新建 **L6**（成功）+ **L7**（失败）；Config-T 新建 **CT7**（成功）+ **CT8**（失败）。**推翻轮二十九计划「Apply 失败态不建帧、仅 UX 卡写明」。**<br>⚠️ **执行中更正**：我给 owner 的选项原写「Config-T 既有 success toast 已在帧内、只需补失败态」，**实测该 toast（`8181:761`）文案是 `Test signal started`（开测成功）、不是 Apply 成功** ⇒ Config-T 端此前既无成功也无失败提醒，故补**两帧**。否则本轮写进 PRD 的「两端提交后都须反馈结果」在 Config-T 侧无法验收。已当场向 owner 交代。 |
| **④ 更正上一轮两处记录** | (a) `Type=Primary` 默认文案是 `Start` 非 `OK`；(b) LCD discard 面板 `9965:653` 从未存在。 |

---

## Task 分解

### Task 1 · LCD 措辞刷新（`Apply` → `OK`，SYNC ① 已扫出全集 16 处）

**File**：`0054ib0nLmt27bC3QlGDl7` page `9343:2`

产品层 hint（Roboto，可写）：
- [x] 1.1 `9594:287` L4 hint → `OK updates the running test signal — it reconnects briefly.`
- [x] 1.2 `9965:392` L5 hint → `Unsaved changes — press OK to update the running test signal.`
- [x] 1.3 `9965:623` L6 hint → 随 Task 3 改造一并处理

图层名 / 帧名（不受字体限制）：
- [x] 1.4 5 处 `LCD Button · submit — label must become "Apply" (Verdana not writable here)` → **`LCD Button · submit (OK)`**（标注方向已反，必须纠正，否则误导 owner 与 dev）
- [x] 1.5 `9594:287` 图层名 `hint · apply hot-updates running test` → `hint · OK hot-updates running test`
- [x] 1.6 `9965:379` 帧名 `L5 - Test running · unsaved changes (Apply enabled)` → `(OK enabled)`

annot（M47.2：整段覆盖 → 赋 characters → 逐段重设，禁 `insertCharacters`）：
- [x] 1.7 `9595:215` B3 · 2 处 `Apply` → `OK`；**删掉「若有未应用改动会先询问（B7）」**（LCD 撤 discard）
- [x] 1.8 `9595:216` B4 · 1 处
- [x] 1.9 `9595:217` B5 · 3 处（含引号内 hint 原文，须与 1.1 逐字一致）
- [x] 1.10 `9971:403` B6 · 5+ 处
- [x] 1.11 `9971:404` B7 · **整段重写** —— 原文是 discard 确认面板说明，改为 Apply 结果提醒说明（随 Task 3）

### Task 2 · LCD 交付层同步（SYNC 三轮，LCD 独立跑）

**Files**：PRD `9345:2` · UX 卡 `9597:217/218/219/220` · Journey `9598:218/220/221`

- [x] 2.1 ① 旧措辞正则轮：`/Apply|discard|unsaved|blocked while running|锁定|丢弃/i` 逐条判定。**注意 `9598:221` State coverage 实测仍含 `blocked while running`（D40 已推翻「运行中锁定」）⇒ 轮二十九的 LCD 扫查漏了这一处，本轮补并在 handoff 坐实。**
- [x] 2.2 ② 新事实逐条核轮（5 条）：(a) LCD 提交键 = `OK` (b) LCD **无** discard 兜底 (c) Apply/OK 后有成功 toast (d) 失败有 error toast (e) Config-T 仍有 discard —— 两端差异句
- [x] 2.3 ③ 互斥对照轮（**必跑**：本轮推翻既有口径 + 跨 surface）：同文件（UX 卡 Interaction ↔ Acceptance 的 discard 条）· 跨文件（D40 ⑤ ↔ D41 ②）· **跨 surface**（LCD 文字 ↔ Config-T 界面本体，禁照抄）
- [x] 2.4 验收条只进 UX 卡 Acceptance（D36），PRD §5 保持一行指针

### Task 3 · LCD 新增结果提醒双态（L6 改造 + L7 新建）

- [x] 3.1 **L6 `9965:610` 就地改造**（M42.3 就地改优先）为 `L6 - OK applied · success toast`：帧内置 `Message status=success, size=L`；参数值保持 L5 的改动后值（Pattern=Ramp）；hint 改为已应用语义；提交键切回 `Status=Disabled`（已提交 ⇒ 无未应用改动）—— **`Status` 是变体轴，我可切；`characters` 已是 `OK` 无需写字体**
- [x] 3.2 **新建 L7** `L7 - OK failed · error toast`：clone L6 → `Message status=error, size=L`；提交键保持 `Status=Normal`（改动仍在、可重试）
- [x] 3.3 **落点 probe（I6）**：B 线 x=3040，步长 450，现 L6 y=3460 ⇒ L7 y=3910。**须先 probe AFTER Section 下界与下方 sibling Section `TEST Mode Identity`（§1k-AD ④.6 记其 y=3971）是否相撞**，必要时三级容器扩高 + sibling 下移
- [x] 3.4 toast 文案（对齐 LCD 既有范式：句子 + em dash + 句点）
  - 成功：`Parameters applied — test signal reconnected.`
  - 失败：`Couldn't apply parameters — test signal unchanged.`
  - 词库回流两条
- [x] 3.5 两条 annot（M23.7 what+why+invariants）+ 连线（M23.6 正交、clone `9671:257` 范式、两端 Δ≤8px）
- [x] 3.6 **Verdana 红线**：新帧内凡新写产品层文本 → Roboto 不可静默留，须出待改清单交 owner（toast 文案在 DS `Message` instance 内，实测既有先例 `9472:84` 就是 Roboto 14 ⇒ 沿用先例，不属新增债，须在 handoff 声明依据）

### Task 4 · Config-T 新增 CT7 失败态帧

**File**：`rJJjWWs51n2iFOlCIC7aYG` page `8075:2` Section `8075:1000`

- [x] 4.1 落点 probe（I6）；clone CT5 `8399:1014`（dirty 态）起步（Q15 形态 C：clone 的 parent 不可假设）
- [x] 4.2 置 `Message status=error, size=L`（复用本页既有 toast 落位范式 `8181:761`）；Apply 保持 `Enable=yes`（可重试）
- [x] 4.3 帧名 `CT7 · Apply failed — parameters unchanged, retry available`
- [x] 4.4 annot（M23.7）+ 连线 + Section 垂直节奏**上 90 / 下 20**（§I7：改内容后必量，禁按内容增减预判）
- [x] 4.5 Config-T 交付层同步：UX 卡 Acceptance 把「失败态由 dev 复用既有 error toast」改为已建帧；Journey State coverage 补 apply-failed

### Task 5 · 项目文档回填

- [x] 5.1 design-spec：顶部加轮三十条目 + 回填 **D41**；**D40 (d) / ⑤ LCD 半边 / ⑥ 加 ⛔ 推翻标注**（不删原文）
- [x] 5.2 handoff 新增 **§1k-AE**（含 6 页措辞实测表 + 机检机器输出原文 + 三处更正）
- [x] 5.3 design-record 同步
- [x] 5.4 `PRODUCT_INTRODUCTION.md` §3.4 改为「**Config-T = `Apply` / LCD = `OK`，措辞按端统一**」（原文只写了 Config-T 统一 Apply）
- [x] 5.5 词库：`Apply` 条补「LCD 端用 OK」；新增两条 toast 文案
- [x] 5.6 ledger 追加本轮行

### Task 6 · 机检 + 走查

- [x] 6.1 两端 `pnpm audit:mockup-conformance --node <本轮全部触碰节点> --non-blocking --report …`
- [x] 6.2 `pnpm audit:mockup-geometry-consistency`（Config-T；LCD 无对象须显式声明，D39 ④）
- [x] 6.3 连线正交 + 两端锚定 probe
- [x] 6.4 逐帧渲染图亲验（SYNC 第 4 条：视觉元素在不在必须看图）
- [ ] 6.5 **完整 F1 design-walkthrough**（6-section，双端）—— 不可再列为「可选待办」
- [x] 6.6 机器输出贴进 handoff `Rule checklist:` 块

---

## 不做（显式声明）

- **Jira 不发** —— owner 未定稿（memory `no-nagging-before-final`）。定稿范围 = 轮二十七 + 二十八 + 二十九 + 三十。
- **C0/C1/C2 三处 `OK` 不动** —— 确认返回语义，非表单提交（依据见「已核实事实」5）。
- **Config-T discard 弹窗不动** —— D40 ④ canonical 保留。
- **不给 `LCD Button` 加变体** —— 措辞既已定为 `OK`，`Type=Primary` 默认 `Start` + 文本覆盖是本文件既有形态（C 线同样做法）。
- **不动** Format 取值（D25/D31）· 控件宽度（D38）· `Message` 组件色（D21）。
- **不把本轮任何取值 / 帧 id / 措辞规格写进 DS 真源**（§M-DISCIPLINE.SOURCE 三问 ⇒ 项目资料档）。
