# V4-2376 / V4-2333 — Apply 实时生效 + 未保存改动 Discard 提醒（双端）实施计划

> 日期：2026-08-06 · Owner：Nancy · 状态：**已执行完毕（Task 1–10），一项未收口 + 一项待 owner 走查后再跑**

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

| Task | 状态 | 说明 |
|---|---|---|
| T1 五帧 Apply + 几何 | ✅ | compare-and-fix mismatches 0；CT1 gap 12→20；删旧隐藏 Update（删前 connector 扫描 0） |
| T2 三帧解禁 + hint/帧名 | ✅ | 36 变体 + 12 opacity；字段值文本 diff 0；**顺带补齐 D24 遗漏的 6 处 hex 色点** |
| T3 CT5 dirty 帧 | ✅ | `8399:1014` + annot `8400:1177` |
| T4 CT6 Discard 弹窗 | ✅ | `8402:1177` + scrim `8403:1358`；**弹窗本体被 owner 手动换成 `form=dialog, type=default` 并定稿文案**，已按 owner 版本同步 annot |
| T5 Config-T 交付层 | ✅ | 三轮 SYNC 跑完；16 节点 70 处命中逐条处理；Section 垂直节奏全序列复位 90/20 |
| T6 LCD L2/L3/L4 | ⚠️ 部分 | 解禁 / 状态变体 / hint / 帧名 ✅；**底栏 `OK`→`Apply` 文案改不了**（见下） |
| T7 LCD L5/L6 | ✅ | `9965:379` / `9965:610` + 面板 + 2 annot + 2 连线 |
| T8 LCD 交付层 | ✅ | 独立跑三轮，未复用 Config-T 结论 |
| T9 项目文档 | ✅ | D40 + D1 ⛔ 标注 + handoff §1k-AD + `PRODUCT_INTRODUCTION.md` §3.4/§3.5 + 词库 4 条 + ledger |
| T10 机检 | ✅ | 见 handoff §1k-AD ⑨（机器输出原文） |
| T10.5 F1 走查 | ⏸ 待 owner 走查后 | 本轮做了聚焦自查（三轮 SYNC + 终态反向扫描 + 6 张渲染图亲验 + 机检）；**完整 6-section F1 建议在 owner 看过本轮改动、方向确认后再跑**，避免对着可能再变的稿子做全量走查 |

**⛔ 唯一未收口项**：LCD 底栏 `OK` → `Apply`。两层硬阻塞已实测坐实（`LCD Button` 6 个变体全枚举无 Apply、文案硬编在 `Type` 轴；Verdana 在本环境 `loadFontAsync` 失败）⇒ **须 owner 手动改 5 处，或给 `LCD Button` 加 `Type=Apply` 变体（推荐）**。清单见 handoff §1k-AD ⑤。

**owner 中途追加的两条**已落地：① `Apply` 措辞记进 `PRODUCT_INTRODUCTION.md` §3.4；② Discard 弹窗 canonical（组件 / 文案 / 遮罩）记进 §3.5 + D40 ④，两端 annot 内也写死。

---

> 上游真源：`docs/specs/2026-07-28-v4-2333-test-signal-parameters-design.md`（D1–D39）
> handoff：`docs/handoffs/2026-07-28-v4-2333-test-signal-parameters-handoff.md`（本轮记 §1k-AD）
> 本文件 = 续跑真源。所有设计决策已 owner 拍板，**无需再问**。

**Goal**：把 Test Signal Parameters 两端的提交范式从「运行中锁定参数、`Update`/`OK` 提交」改成「任何状态都可编辑、`Apply` 仅在有未应用改动时可点、离开前用 Discard 弹窗兜底」。

**这轮推翻了什么**：`D1` 的 2026-07-29 修订（"Config-T 由 `Update` 提交 / LCD 由底栏 `OK` 提交"）与 `D19/D20/D27` 沿用的"运行中参数锁定"形态。本轮回填为 **D40**，旧表述必须显式标注推翻，不留并存互斥条目（§M-DISCIPLINE.SYNC ③ 轮红线）。

---

## Owner 拍板决策（2026-08-06）

| # | 决策 | 内容 |
|---|---|---|
| **A** | **Apply 两态由 dirty 驱动** | 五帧现有 Apply 一律 `Enable=no`（灰，无未应用改动）；**新增一帧**演示 dirty 态（Apply 绿可点）。Apply 不再是"常亮的提交按钮"，而是 dirty 指示器 + 提交入口二合一。 |
| **B** | **Discard 触发集** = 3 项 | ① 切换 Transmitter（1/2/3/4）· ② 切走 Test Signal tab / 离开页面 · ③ 关闭浏览器 / 刷新（浏览器原生 `beforeunload`，文案不可自定义）。**`Start Test` / `Stop Test` 不触发** —— 按已保存的值开测。 |
| **C** | **生效方式 = 应用后测试信号短暂重连** | 点 Apply 后参数下发，正在播的测试信号中断约 1–2 秒后以新参数重新起流。UI 须提前告知，避免用户以为是故障。 |
| **D** | **LCD 端同步改造** | LCD 也支持测试过程中改参数；底栏 `OK` → `Apply`；LCD 的 mockup + UX 交付说明同步改。 |
| **E** | **`Apply` 措辞属项目级约定** | Config-T 全线提交动作统一叫 `Apply`（不是 `Update` / `Save` / `Submit`）。落点 = 本项目 `docs/`，**不进 DS 真源**（过 §M-DISCIPLINE.SOURCE 三问：换个产品不成立 ⇒ 项目资料）。 |

### 组件选型实证（owner 已手动落地，本计划沿用不改）

`Apply` = **旧库 `TVU UX Library` 的 `button/no icon`**（set key `4c56b094…`），变体 `Dark theme=on, Style=ghost, color=green, Fix wide=on, Enable=yes|no`，62×32。

- **为什么不换成 DS `Button/dark M`**：owner 明确「改 Apply 是为了跟其他 Config-T 页面保持一致」。实测 3 个 page：`V4-1827` IP Source Item 内 **12+ 处**同款 ghost 绿 62×32 Apply；另有 `web button` set 的 `Button/Disable`（76×36 实心）形态见于 Embedded Audio / TM3-1930。owner 选的形态有产品内先例，一致性主张成立。
- **D18 不适用于本处**：D18 归正的是「分段选择器误用 `button/no icon`」（tab 语义误用 button），本处是真按钮语义。
- **M32.4 满足**：该组件自带 `Enable` 变体轴 ⇒ 禁用走**切变体**、不叠加透明度。

---

## Global Constraints（locked spec，每个 Task 都适用）

| 来源 | 约束 | 落地 |
|---|---|---|
| D38 | 五帧控件宽度 select/Overlay input=480 · hex=148 · CT3 面板=480 | 本轮不动这些宽度；新增帧 clone 既有帧继承 |
| D38 ④ | 动作按钮包进 `row · actions · buttons` 容器，**间距 20**〔⛔ 2026-08-06 轮三十 owner 改为 **16 且绑 DS token `Spacing/M`**，见 §1k-AE ⑬〕，右缘对齐控件右缘（abs **2058**） | **CT1 现为 gap 12 且缺 buttons 子容器 ⇒ 本轮补齐** |
| D36 | 验收唯一归属 UX 卡；PRD §5 只留一行指针 | 新增验收条只写进 UX 卡 Acceptance，**不回写 PRD §5** |
| D35 / M23.11(B) | 交付层终态优先、面向 dev·QA，不写轮次沿革 | 卡里只写终态；沿革进 handoff |
| D33 | Config-T 帧前缀 `CT*`，LCD 用 `L*` / `C*` | 新帧命名 `CT5` / `CT6` / `L5` / `L6` |
| D21 | DS `Message` 无 theme 轴是有意为之 | toast 按发布原样用，**不改色** |
| D25 | 制式取值以开发清单为准，图上为示例 | 不动 Format 取值 |
| 字体 | 产品层：Config-T 按库 instance；LCD 产品帧 = `Verdana`（本环境不可写 ⇒ 新增 LCD 文本须产出待改节点清单交 owner）。注释层恒 `Roboto` + `Noto Sans SC` | 每个建文本的 Task 都查 |

### M48 起手 Rule-Coverage 清单

| M-rule | 命中原因 | 落地计划 |
|---|---|---|
| M0 | 新增 discard 弹窗 / dirty 帧 ≥3 element | 见下方 M0 增量映射表 |
| M32 / M32.4 | 所有 UI 元素 library-first；禁用表达唯一口径 | Apply 走 `Enable` 变体；解禁走变体回切，**禁用 opacity** |
| M35 | 弹窗内若需 close/warning icon | 建前 grep catalog 出 3 行 affordance trace |
| M41 | discard 是破坏性确认弹窗 | 用 `Notification form=pop confirm`；**retrofit 例外**：本页无既有 scrim 先例 ⇒ 按 DS 默认建，并在 UX 卡写明 |
| M23.9 | 弹窗是"状态预览" | **必须放产品 frame 外 + 连线指回触发元素**，不可叠在 frame 上 |
| M23.6 | 新增连线 | 正交折线；两端锚在**触发元素 bbox**（非卡边），容差 ≤8px |
| M23.7 | 新帧 state-label | what + why + invariants 三段 |
| M23.0 / M23.12 / M23.14 / M23.18 | 交付卡结构 / 位置 / 双语行距 / 主题匹配 | 改既有卡，沿用其现有范式 |
| M-COLOR C1/C2/C5 | 新建色值 | 一律绑 DS 变量，禁裸 hex |
| M-INTEGRITY I1/I2/I3/I6/I7 | 新增帧 + 卡增高 | 建前 probe 落点空位（I6）；卡改文后复测 Section 重叠（I2）+ children wrap（I3） |
| M42.3 / M46 | 迭代既有物 | **就地改**，禁旁路克隆搭样板 |
| M47 / M47.2 | 改多段样式文本 | 禁 `insertCharacters`；走「整段覆盖 → 赋 characters → 逐段重设」+ `getStyledTextSegments` 复核 |
| M-DISCIPLINE.VARIANT | 大量 `setProperties` 切变体 | 切完按 canonical 文案清单 compare-and-fix，贴 mismatches 计数 |
| M-DISCIPLINE.SYNC ①②③ | 编辑 confirmed 后 | ① 旧措辞正则（`locked` / `disabled` / `Stop the test to change` / `Update` / `OK 提交`）② 新事实逐条核 ③ **必跑**：本轮推翻既有口径 + 跨 surface 复用 ⇒ 须 probe LCD 界面本体，禁照抄 Config-T 写法 |
| M-DISCIPLINE.SCOPE | 对象全集 | = Config-T 5+2 帧 × LCD 4+2 帧 × 全部交付层（PRD ×2 / UX ×2 / Journey ×2 / annot ×9）；**独立核一遍页面固有属性**（几何一致性），贴实测数字 |
| Q15 / Q22 | Section 内建节点 / instance 内 SLOT | 坐标 `abs = section.x + child.x`；SLOT 一次结构改动即失效句柄 |
| M-FONT / M-TXT-ICON-AUDIT | 新文本 | 注释层 glyph（`→ ▼ ①`）须绑 `Noto Sans SC`，否则 Roboto 段渲染空白 |

**state-completeness 枚举**（本 feature 的 Apply/dirty 维度全态）：
1. 无改动 · 未开测 → Apply 灰（CT1 / L2）
2. 无改动 · 启动中 → Apply 灰（CT1a）
3. 无改动 · 测试中 → Apply 灰（CT2 / L4）
4. 无改动 · Live 接管 → Apply 灰（CT4）
5. **有改动 · 测试中 → Apply 绿（CT5 / L5，新增）**
6. **有改动 · 试图离开 → Discard 弹窗（CT6 / L6，新增）**
7. 提交后 → 回到态 1/3，success toast
8. 提交失败 → 【本期不做，UX 卡 Acceptance 里写明由 dev 复用既有 error toast】

### M0 增量映射表

| Element | 组件 (库) | 变体 | Status |
|---|---|---|---|
| Apply 按钮 | `button/no icon` (`TVU UX Library`, set `4c56b094…`) | `Dark theme=on, Style=ghost, color=green, Fix wide=on, Enable=yes\|no` | ✅ owner 已落地 + V4-1827 12 处先例 |
| Discard 确认弹窗 | `Notification` (**DS**, SET `23535120…`) | `theme=dark, form=pop confirm` | ✅ catalog verified（`importComponentSetByKeyAsync` → 按名取 child） |
| Apply 成功 toast | `Message` (**DS**, node `1408:17153`) | `status=success, size=L` | ✅ 本页已用（`8181:761`） |
| dirty 字段视觉提示 | 复用既有 `input box/filled` / `select box/filled` 的既有变体 | — | ⚠️ 若 DS 无 "modified" 态 ⇒ 不自画，改用文案说明（见 Task 3 决策） |
| LCD Apply 按钮 | file-local `LCD Button` (`4518:3244`) | `Type=Primary` / `Status=Disabled` | ✅ D-决策已用（轮二十七 ③） |
| LCD discard 确认 | 🟡 **建前必 probe** LCD 文件是否有既有确认弹窗范式 | — | 🟡 Task 7 起手解决 |

---

## Task 分解

### Task 1 · Config-T：五帧 Apply 统一 disabled + 按钮组几何补齐

**Files**：Figma `rJJjWWs51n2iFOlCIC7aYG` page `8075:2` Section `8075:1000`

- [ ] 1.1 把 `8387:43964`(CT1a) / `8387:43961`(CT2) / `8387:43958`(CT3) / `8387:43947`(CT4) 四个 Apply 的 `Enable` 由 `yes` 切 `no`；CT1 `8387:43967` 已是 `no`，核验不动。
- [ ] 1.2 切完按 M-DISCIPLINE.VARIANT **compare-and-fix**：五个 instance 的 `name#1027:0` 必须仍是 `Apply`（切变体会让无 override 的文本回落默认值），mismatches 计数贴进 handoff。
- [ ] 1.3 CT1 补 `row · actions · buttons` 子容器（HORIZONTAL，`itemSpacing 20`），把 `8387:43967` + `8079:43375` 收进去，右缘保持 abs 2058。对齐其余四帧结构。
- [ ] 1.4 删除 CT1 已隐藏的旧 `web button · Update (disabled)` `8079:43372`（M-LIFECYCLE 删除 gate：删前确认无 connector 指向它）。
- [ ] 1.5 验证：五帧 Apply 右缘 = 2058、按钮间距 = 20、`Enable=no`；跑 `pnpm audit:mockup-geometry-consistency`（G1/G2/G3）。

### Task 2 · Config-T：三帧参数控件解禁 + hint 与帧名改写

**Files**：CT1a `8177:582` · CT2 `8081:447` · CT4 `8317:840`

- [ ] 2.1 逐帧枚举被禁用的控件（select / radio / switch / segment / input / 色块），**先 probe 全集**（含 INSTANCE 子树），产出清单 —— 禁按印象估个数。
- [ ] 2.2 有 `enable`/`status` 变体轴的一律切回启用变体；**若某控件当初是靠 opacity 表达禁用（D22 撤过 7 处双重处理，但需复验）⇒ 恢复 opacity 1**。
- [ ] 2.3 改写 hint：
  - CT1a `8177:672`：`Parameters are locked while the test is starting` → **`Changes apply while the test is running — the signal briefly reconnects.`**
  - CT2 `8081:770`：`Stop the test to change parameters` → **同上一句**
  - CT4 `8317:939`（橙）：保留 Live 语义，改为 **`Live transmission in progress — parameter changes apply to the test signal when it resumes.`**
- [ ] 2.4 帧名去掉锁定语义：
  - `CT1a · Starting the test — request sent, parameters editable`
  - `CT2 · Test running — parameters editable, Apply hot-applies`
  - `CT4 · Live transmission takes over the test — parameters still editable`
- [ ] 2.5 验证：三帧截图亲验控件确实呈启用态（非目测代脚本 —— 截图 + probe 变体值双证据）。

### Task 3 · Config-T：新增 CT5 dirty 态帧

**落点**：线 A 列，CT2 与 CT4 之间需 probe 空位（I6）；若无空位则接在 CT4 之后、Section 相应扩高。

- [ ] 3.1 probe 落点 bbox 与既有兄弟求交，确认为空才放。
- [ ] 3.2 `clone()` CT2 `8081:447` 起步（**Q15 形态 C：clone 的 parent 不可假设，须显式 appendChild 到 Section 并按 section-relative 赋坐标**）。
- [ ] 3.3 改造：① `Overlay Text` 字段填入一个改动值（如 `CAM 1 – TEST`）② Apply 切 `Enable=yes`（绿）③ 保留 `Stop Test` ④ hint 改为 **`Unsaved changes — click Apply to update the running test signal.`**
- [ ] 3.4 dirty 字段视觉：**先 probe DS `input box/filled` 是否有 modified/highlight 变体**。有 → 用；无 → **不自画**，仅靠"值已变 + Apply 变绿 + hint"三重表达，并在 UX 卡 Data Contract 写明 dev 不需要额外字段高亮。
- [ ] 3.5 帧名 `CT5 · Unsaved changes — Apply enabled (test running)`；补 annot state-label（M23.7 三段）+ 连线（M23.6 正交、锚 CT2 的 Overlay 输入框 → CT5）。
- [ ] 3.6 验证：I2 Section 重叠 0 / I3 overflow 0 / 连线两端 Δ≤8px。

### Task 4 · Config-T：新增 CT6 Discard 确认弹窗帧

- [ ] 4.1 `importComponentSetByKeyAsync('23535120dbdc93bf90af9a118b5091e58b590dc6')` → 取 `theme=dark, form=pop confirm` child → `createInstance()`。
- [ ] 4.2 **文案（EN，最终稿）**：
  - Title：`Discard unsaved changes?`
  - Description：`You changed test signal parameters but haven't applied them. Leaving now discards the changes.`
  - 左按钮：`Cancel`（留在本页）· 右按钮：`Discard`
- [ ] 4.3 SLOT 文本编辑走 catalog §Notification **精化协议**：所有 `await` 放最前 → 同步遍历拿 fresh ref → set 完立刻 return → **一个文本一个 `use_figma` 脚本**。
- [ ] 4.4 M23.9：弹窗**放产品 frame 外**，连线锚回三个触发元素（Tx 选择器 / tab 栏 / 页面区），annot 写清三个触发条件 + 浏览器原生 `beforeunload` 文案不可自定义。
- [ ] 4.5 帧名 `CT6 · Discard unsaved changes (leaving with pending changes)`。
- [ ] 4.6 验证：M41 acceptance（destructive 按钮语义）· glyph 0 · 连线正交。

### Task 5 · Config-T 交付层同步（M-DISCIPLINE.SYNC 三轮）

**Files**：PRD `8084:517`(§3/§4) · UX 卡 `8085:517`(Why/Changes/Data Contract/Interaction/Acceptance) · Journey `8086:517`(stage 3/4 + State coverage) · annot `8087:517` `8087:518` `8087:519` `8320:1028` + 新增两条

- [ ] 5.1 **① 旧措辞正则轮**：`/locked|disabled|Stop the test to change|Update 提交|即时生效|无保存动作|参数锁定/` 扫全 Section 子树，逐条判定改/跳过并记录。**0 命中不构成通过。**
- [ ] 5.2 **② 新事实逐条核轮**：拿新事实清单逐项核"有没有被写进去" —— (a) 任何状态可编辑 (b) Apply 仅 dirty 时可点 (c) Apply = 热应用 + 短暂重连 (d) Discard 三触发 (e) Start/Stop 不触发 discard (f) per-Tx dirty 互不影响。
- [ ] 5.3 **③ 互斥对照轮**（必跑）：同文件新旧条目（PRD `req 3` 曾自相矛盾，重点查）· 跨文件（design-spec D1 ↔ 本轮 D40）· **跨 surface（Config-T 文字 ↔ LCD 界面本体，须 probe，禁照抄）**。
- [ ] 5.4 Journey `stage 3` 复查：轮七曾把"多一步保存"列为痛点又改掉，本轮方向再变 ⇒ 必须重写为终态。
- [ ] 5.5 验收条只加进 UX 卡 Acceptance（D36），PRD §5 保持一行指针。
- [ ] 5.6 卡增高后复测同列 overlap（PRD/UX/Journey 同列历史多次相压）。

### Task 6 · LCD：L2 底栏 `OK` → `Apply` + L4 解禁

**Files**：`0054ib0nLmt27bC3QlGDl7` page `9343:2` Section `9402:59` / 子区 `AFTER 9359:491`

- [ ] 6.1 probe L2 `9593:536` 底栏按钮结构：确认 `OK` 是 file-local `LCD Button`（`4518:3244`）instance 及其变体轴。
- [ ] 6.2 L2 底栏 `OK` → `Apply`；**进入设置页时无改动 ⇒ 起手态 = `Status=Disabled` 变体**（不是降透明度）。`Home` 不动。
- [ ] 6.3 L3 `9594:214`（Format 浮层）底栏同步。
- [ ] 6.4 L4 `9594:251`：三行参数控件解禁（恢复正常色）· hint `Stop the test to change parameters` → **`Changes apply while the test runs — the signal briefly reconnects.`** · 底栏 `OK`(disabled) → `Apply`(disabled) · 帧名 `L4 - Test running · parameters editable`。
- [ ] 6.5 **字体红线**：LCD 产品帧文字 = `Verdana`，本环境**写不了** ⇒ 凡新写/改的 LCD 产品层文本，一律产出「待改节点清单」交 owner 手动改，**不得静默留 Roboto**。清单进 handoff。

### Task 7 · LCD：新增 L5 dirty 态 + L6 Discard 提示

- [ ] 7.1 **起手 probe**：LCD 文件内是否已有确认弹窗 / 二选一提示范式（grep 帧名 `confirm` / `discard` / `prompt`，并看 `REFERENCE` Section `9625:217`）。有 → 照范式；无 → 用 LCD 既有浮层范式（`5314:9520` 选项列表面板的绿框语汇）改造，**不照搬 Config-T 的 web modal**。
- [ ] 7.2 L5：clone L4 → 改一个参数值 + `Apply` 切 `Type=Primary`（可点绿框）+ hint 改 `Unsaved changes — press Apply to update.`
- [ ] 7.3 L6：按左上角返回箭头 / `Home` 时的 discard 提示，两个动作 `Discard` / `Cancel`（LCD 上映射到实体键或触屏按钮，annot 写清）。
- [ ] 7.4 两帧 annot（M23.7）+ 连线（M23.6）+ 落点 probe（I6）。
- [ ] 7.5 Verdana 待改节点清单同 6.5。

### Task 8 · LCD 交付层同步

**Files**：UX 卡 `9597:214` · Journey `9598:214` · PRD `9343:3`（§4b / §5b）· annot `9595:215` `9595:216` `9595:217` + 新增两条

- [ ] 8.1 同 Task 5 三轮扫查，**LCD 独立跑一遍**（禁复用 Config-T 的扫查结论）。
- [ ] 8.2 重点：`OK 提交` 这一口径在 LCD 交付层的全部出现处（D1 修订当初就是从这里写进去的）。
- [ ] 8.3 两端差异句：LCD 无浏览器 `beforeunload` 概念 ⇒ 第三个触发条件在 LCD 侧写成「设备侧无对应场景」，不照抄。

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

- [ ] 9.1 `docs/specs/2026-07-28-v4-2333-test-signal-parameters-design.md`：顶部加轮二十九条目 + 表格回填 **D40**，并在 **D1 正文显式标注「2026-08-06 D40 推翻本条 2026-07-29 修订」**（不删原文，标推翻）。
- [ ] 9.2 `docs/handoffs/2026-07-28-v4-2333-test-signal-parameters-handoff.md`：新增 **§1k-AD**，含机检机器输出原文 + Verdana 待改清单 + 几何实测数字。
- [ ] 9.3 `docs/specs/2026-07-28-v4-2333-test-signal-parameters-design-record.md` 同步。
- [ ] 9.4 **`Apply` 措辞记进项目约定**（owner 明确要求）：写进 `docs/PRODUCT_INTRODUCTION.md` 的产品设计规则段 —— 「Config-T 全线提交动作统一 `Apply`」+ 一句落点理由（§M-DISCIPLINE.SOURCE 三问：项目资料档）。
- [ ] 9.5 词库 `~/.claude/skills/shared-vocab-rules/vocabulary.md` 追加 `Apply` / `Discard unsaved changes` 两条。
- [ ] 9.6 ledger `tvu-design-system/docs/internal/_metrics/phase0-ledger.md` 追加本轮行。

### Task 10 · 机检 + 走查

- [ ] 10.1 `pnpm audit:mockup-conformance --file rJJjWWs51n2iFOlCIC7aYG --node <本轮全部触碰节点> --report docs/handoffs/.conformance/…json`（token 见 `tvu-design-system/.env` 的 `FIGMA_TOKEN`，脚本读 `FIGMA_PERSONAL_ACCESS_TOKEN` —— 变量名不同，须显式传）。
- [ ] 10.2 LCD 文件同样跑一遍。
- [ ] 10.3 `pnpm audit:mockup-geometry-consistency`（G1/G2/G3）。
- [ ] 10.4 连线正交 + 两端锚定 `use_figma` probe。
- [ ] 10.5 F1 `design-walkthrough` 走查（**不可列为"可选待办"直接收尾** —— 轮二十八前的实证教训）。
- [ ] 10.6 机检逐条机器输出贴进 handoff `Rule checklist:` 块；**目测不算通过**。

---

## 不做（显式声明）

- Jira 不发（owner 未定稿；memory `no-nagging-before-final`）。
- 不动 Format 取值清单（D25/D31）· 不动控件宽度（D38）· 不改 `Message` 组件颜色（D21）。
- Apply 失败态不建帧，仅在 UX 卡写明 dev 复用既有 error toast。
- 不把本轮任何取值 / 帧 id / 措辞规格写进 DS 真源（§M-DISCIPLINE.SOURCE）。
