# V4-2376 / V4-2333 轮三十一 — 交付层双语样式合规（ZH opacity/字体/字号）+ 文案精简（中等档）+ 页脚版权年

> 日期：2026-08-06 · Owner：Nancy · 状态：**已执行完毕（Task 0–4）· 一项待 owner（定稿 → 完整 F1 → 发 Jira）**

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

| Task | 状态 | 说明 |
|---|---|---|
| T0 页脚版权年 | ✅ | Config-T **9/9** 帧 `© 2024`→`© 2026`，残留 0、样式未变、渲染图亲验；LCD **零对象**（显式声明）；主组件仍 `© 2025` 属库侧，已登记 |
| T1 双语样式合规 | ✅ | Config-T `21 拆段 + 48 降透明度 + 1 英文回退`；LCD `34 拆段 + 4 降透明度 + 5 回退 + 119 行距统一`；`noRule 0`；**两端回读 ZH 残留 = none**；LCD PRD 标题补 cyan meta 日期行 |
| T2 文案精简（中等档） | ✅ | 11 节点 **32 184 → 28 745 字符（-10.7%）**；卡高 Config-T UX 3557→3201 · LCD UX 3386→3138。Journey 文案与 LCD `Acceptance` 内容未改（显式声明） |
| — 顺带 4 处真缺陷 | ✅ | **PRD req 9 与 D40/D41 正面互斥** · LCD PRD 重号 13 · 两处 EN/ZH 不对齐 · Config-T `Changes` 归类错 + 孤立空行 |
| T3 §I7 实测 | ✅ | 本轮命中 1 次且**首次由「变短」触发**：UX 卡缩 356 ⇒ 与 Journey 卡 gap 61→417，Journey 上移 356 复原 61（前置断言「同 x 列」通过后才写）；两端重叠/溢出 0，帧列 21 段节奏全保 |
| T4 机检 + 回填 | ✅ | 两端 conformance **exit 0 · integrity 双 PASS**；findings 归属改为**逐子闸 stdout grep + 自验探针**（见下）；handoff **§1k-AF** · spec 顶部条目 + **D42** · 本文件 · ledger |
| 完整 F1 走查 | ⏸ **待 owner 定稿后** | 承接 §1k-AE ⑪ 第 1 条；本轮同样只做聚焦自查 |

### ⛔ 两处必须坐实的更正（都是我自己的错）

1. **本文件 Task 2 里给中等档写的「-40~50%」预算被实测推翻 —— 真值 -10.7%。** 中等档的定义（条数不减、事实全留）在结构上就限死了上限：`Data Contract` / `Acceptance` / `PRD §4` 几乎纯事实，降幅只有 2–8%；只有 `Changes` / `Interaction` 这种「事实 + 破折号 + 理由」密集的段能到 -21%。**预算不该按感觉给，应先按「可删类别在样本段里的实际字符占比」估。** 要让卡真正变短只能切激进档（合并验收条），代价与张力见 handoff §1k-AF ④。
2. **conformance `--report` 落盘的 JSON 只有 491 字节、只含子闸 exit code、无任何 node id** ⇒ **§1k-AE ⑨ 写的「按本轮节点 id 在 report JSON 内递归匹配 ⇒ 命中 = 无」当时不可能真的检出任何东西**，是一次空洞核验。本轮改为逐子闸跑 stdout + grep 节点 id，并按 §M-DISCIPLINE.SCOPE 加自验探针（已知命中 `8086:524` 必须被 grep 到 —— 实测到了）。结论：命中本轮节点的 32 条**全部**是既有 B-TYPO（注释层 15/13/11 裸 fontSize，规则本就如此 ⇒ §M49.1 deferred）+ B-SCALE（Journey 卡 padding/itemSpacing，只动过 y）；另 probe 确认注释层文本 fill **本就未绑变量**（未触碰的 REFERENCE 对照节点同样为空）⇒ `setRangeFills` 没有破坏任何 token 绑定。

### 另两处越界，我自己回退了（记下来防复发）

- 给 `Acceptance` 的 23 个 `☐` 与 `Data Contract` 的 `⚠` 改绑了 Noto Sans SC ——**DS 的「Roboto 缺 glyph 清单」只列 `→ ▼ ▲ ①②③`，不含 `☐`/`⚠`**。属自造判据，且会让字形与文件其余处（含 LCD 端）不一致。已全部回退 Roboto，并把 glyph 集收回 DS 清单。
- 样式通扫的分类器初版把 `·` 和 `—` 当成中文标点 ⇒ ZH run 从这两个符号起头**再贪婪吃掉后面整串英文**（dry-run 显示 `label A` 把 89 字符英文判成中文）。**幸好先跑了 dry-run 才没写进去** —— 改为「ZH run 必须锚定真汉字、只在汉字之间桥接非中文」。另「EN 落进 Noto Sans SC」这条判据也是误判：中文行内的拉丁片段（`JIRA — V4-2376`）本来就该跟中文行同档，真缺陷只有「整行纯英文却用中文字体」。

### `bilingual-spacing` 唯一 FAIL = 闸的假阳性（不改设计迎合坏闸）

闸报两端 `State coverage` 行距比 1.16 / 1.0 FAIL，但 live 逐行实测正文对全部 EN `lh22` / ZH `lh14` = **1.57 ≥ 1.3 合规**。决定性证据：**两个文件里唯一含非 BMP 字符（`🟡` 各 2 处）的注释层节点，正是闸唯一命中的那个**（其余 24 个被扫节点零命中）—— 闸的 `charStyle()` 用 UTF-16 码元下标索引 REST `characterStyleOverrides`，遇 surrogate pair 即错位。已列 DS backlog，见 handoff §1k-AF ⑧ 第 2 条。

---

> 上游真源：`docs/specs/2026-07-28-v4-2333-test-signal-parameters-design.md`（D1–D41，本轮回填 **D42**）
> 前一轮：handoff `§1k-AE`（轮三十）· 本轮记 **`§1k-AF`**
> 前置计划：`2026-08-06-v4-2376-round30-per-surface-wording-apply-result-plan.md`

---

## 本轮起因（owner 三条）

| # | owner 原话 | 落地 |
|---|---|---|
| A | 「PRD、UX 状态和 UX 交付说明的**双语样式没有完全使用设计系统里面的**来，**中文应该有个透明度**」 | Task 1 —— 按 M23.14 (B) 逐角色重设，两端全域 |
| B | 「说明文字**太复杂了，一点不精简，人工可读性不强，看起来是给 AI 用的**」 | Task 2 —— 中等档精简（owner 经 AskUserQuestion 选定：条数不减、每条只留事实） |
| C | 「底部的『© 2024 TVU NETWORKS.』中的 2024 改成 2026 年，也就是当天的年份」 | ✅ **已完成**（见 Task 0） |

**⚠️ B 是回归、不是新问题**：轮二十六 owner 已提过同一句（「现在的文案看起来像是 AI 读的，开发和测试来读的话显得内容太多了」），当时回流为 DS 规则 **M23.11 (B) 终态优先**。轮二十七～三十逐轮追加新事实 ⇒ Config-T UX 卡 h **3259 → 3499 → 3557** 净增长，观感回归。**本轮除了改稿，还要在 handoff 坐实「按轮追加必然把卡撑回去」这条机制性病根**。

---

## Task 0 · 页脚版权年（✅ 已完成并亲验）

- Config-T `rJJj…` 九帧 `© 2024 TVU NETWORKS.` → **`© 2026`**：CT1 `8075:1027` · CT2 `8081:535` · CT3 `8081:624` · CT1a `8177:675` · CT4 `8317:942` · CT5 `8399:1112` · CT6 `8402:1275` · CT7 `8418:1454` · CT8 `8418:1561`（均为 instance 内 `CopyRight` 的文本 override，复合 id `I<host>;1029:126`）。
- 走 M47.2 保段替换 + 逐条回读复核：**9/9 改成，skipped 0，全 page 非-2026 残留 0**，样式全 = `Roboto/Regular/14/op1` 单段未变。
- **亲验渲染图**：CT7 页脚白字落在帧 fill `#343434` 上清晰可读。（`CopyRight` instance 自带的白 fill 实测 `visible:false`，小图看起来"白底白字"是截透明底的假象，非缺陷。）
- **LCD 端零对象**（`0054ib…` page `9343:2` 扫全 page：无页脚版权行）—— 显式声明，非漏改。
- **登记（未做、非漏做）**：这 9 处是 override，**主组件默认仍是 `© 2025`**（图层名即为证）⇒ 日后 reset/detach 会回落 2025。属**库侧** scope，建议库 owner 一并更新，不在本轮改。

---

## Task 1 · 双语样式合规（两端全域）

### 1a. Canonical 角色样式表（本轮唯一真源，两端共用；派生自 DS §M23.14 (B) + §双语 + 同文件既有正样本）

**大卡（PRD / UX Delivery / User Journey）**

| 角色 | EN | ZH |
|---|---|---|
| 卡标题 | Roboto **Bold 18** / lh 26 / `#ffffff` / op 1 | Noto Sans SC **16** / lh 19 / `#ffffff` / op **0.45** |
| meta 行（PRD/卡 title 下必带创建日期）| Roboto **Medium 12** / lh 18 / `#33a4fd` / op 1 | 同 EN 档（通常只有 EN）|
| 模块段名 | Roboto **Medium 15** / lh 24 / `#33a4fd` / op 1 | Noto Sans SC **13** / lh 16 / `#33a4fd` / op **0.45** |
| 模块小节名 ①②③ | Roboto **Medium 13** / lh 20 / `#33a4fd` / op 1（**仅 ①②③ 圈号字符**绑 Noto Sans SC，防缺 glyph）| Noto Sans SC 11 / lh 14 / `#33a4fd` / op **0.45** |
| 正文 | Roboto **Regular 13** / lh **22** / `#ffffff` / op 1 | Noto Sans SC **11** / lh **14** / `#ffffff` / op **0.45** |

**annot 小卡（state-label，400 宽）**

| 角色 | EN | ZH |
|---|---|---|
| 标题 | Roboto **Medium 13** / lh 20 / `#33a4fd` / op 1 | Noto Sans SC **11** / lh 14 / `#33a4fd` / op **0.45** |
| 正文 | Roboto **Regular 11** / lh **18** / `#ffffff` / op 1 | Noto Sans SC **10** / lh **13** / `#ffffff` / op **0.45** |

**流程分支 label chip（单行）**：EN Roboto Medium 11 / op 1 · **ZH Noto Sans SC 11 / op 0.45**（**字号不降**）。
> 判定依据：M23.14 (A) 明确「小 chip 单行无分组问题，本规则（行距三档）不适用」，且「小 2px」属 (B) 的**段名**条款、chip 非段名 ⇒ chip 只落 §双语 的**字体 + opacity** 两项。**属项目级判定，记进项目 repo，不进 DS。**

**M23.14 (A) 三档递增自检**：大卡 `ZH lh 14`（intra-pair，11×1.27）< `EN lh 22`（inter-pair，13×1.69）< `段间 itemSpacing 20`；机器闸判据 EN/ZH = **22/14 = 1.57 ≥ 1.3** ✓。annot = **18/13 = 1.38 ≥ 1.3** ✓。

### 1b. 偏差清单（probe 机器输出，77 个注释层节点 → 61 处偏差）

| # | 病灶 | 实测 | 处置 |
|---|---|---|---|
| 1 | **段名 ZH 未拆样式** | 两端 UX 卡 5 段 + Journey 卡 6 段 = 22 处 + LCD PRD §4 一处，全 = `Roboto Medium 15 / op 1` | 拆段 → ZH 档 |
| 2 | **annot 标题 ZH 未拆** | LCD 17 处 + Config-T 11 处 = `Roboto Medium 13 / op 1` | 拆段 → ZH 档 |
| 3 | **ZH 正文 opacity=1**（owner 点名的这条）| **Config-T 重灾**：PRD §4 1148c + UX Changes 1337c + Data Contract 894c + Interaction 1255c + Acceptance 1160c ≈ **5906c**；Config-T annot 9 处（CT1a/CT2/CT3/CT4/CT5/CT6/CT7/CT8 + Text Color）；**LCD 仅 3 处零星**（UX Data Contract 140c / annot L3 38c / annot s2 9c）| 一律 → op 0.45 |
| 4 | label chip ZH | 两端 6 处 `Roboto Medium 11 / op 1`（LCD 分支 B/C · Config-T label A/B ×4）| → NotoSC 11 / op 0.45 |
| 5 | **LCD PRD 卡标题**唯一未拆（`Roboto Bold 18 / AUTO / op 1` 单段含中文）**且缺 cyan meta 创建日期行** | Config-T PRD 标题 `8084:518` 为同文件正样本 | 拆三段 + 补 meta 日期行 |
| 6 | LCD 行距参差 | PRD 正文 EN 20/22 混、ZH 14/15 混；UX 卡 EN 23；Journey EN 22 | 全统一 22/14（Config-T 已是） |
| 7 | ZH 正文误用 13 号 | LCD PRD §4 50c + §5 13c · Config-T PRD §4 ~75c · Config-T UX Changes 112c（且 cyan + op1，被写成小节名档）| → 正文 ZH 档 11 |
| 8 | **EN 落进 ZH 字体/字号档** | Config-T PRD §1 `EN NotoSC 11` 21c+7c · 两端 UX Changes 模块小节名整行 `EN NotoSC 13`（LCD 115c / Config-T 92c，只有 ①②③ 该用 NotoSC）| EN → Roboto，仅圈号绑 NotoSC |
| 9 | PRD §5 指路句 EN op 0.45 | 两端一致（LCD `9345:3` / Config-T `8084:523`）| **规则无此档** ⇒ 归正 op 1；若 owner 要保留降权需另立项目级判定 |

**病根（写进 handoff）**：轮二十九～三十用 M47.2「整段覆盖 → 赋 characters → 逐段重设」重写文本时，**逐段重设只复刻了字号 / 行距，漏了 ZH 的 `opacity` 与字体降档**。现行机械闸 `audit:mockup-bilingual-spacing` **只查 EN/ZH 行距比、不查 opacity 与字体** ⇒ 一路没报。
**⇒ DS 回流候选（做法/判据层）**：给该闸补「ZH 段 `fills[0].opacity == 0.45` + ZH 段 `fontName.family == 'Noto Sans SC'`」两项检查。**待 owner 拍板**。

### 1c. 不动清单（显式声明）

- **REFERENCE 区** `9475:108`（`ZH ref · video input detected`，`NotoSC Medium 12 / op 1`）—— 参考物不动（memory `reference-material-into-figma` + 轮三十已登记该区既有 6px 重叠亦不动）。
- 产品帧内文本一律不动（本 Task 只作用于注释层）。

---

## Task 2 · 文案精简（中等档，owner 选定）

**档位定义**：条数不减、验收勾选粒度不变；每条**只留 dev·QA 要执行/验证的事实**，删四类：

| 删什么 | 判据（M23.11 (B)：删掉后 dev/QA 动作不变 ⇒ 该删）| 实例 |
|---|---|---|
| 帧编号消歧 | dev 对帧编号无动作 | 「Frames are numbered CT1 / CT1a / … (the LCD picker uses C0–C3 for different screens)」→ handoff |
| 设计动机辩护 | 无动作 | 「an unselected segment must stay distinguishable from the surface it sits on」 |
| 跨端对比 / 跨端澄清 | 无动作 | 「the same blue the LCD stop button uses」·「This applies to the Config-T web surface only — the LCD is device-drawn UI, same rule, different implementation」 |
| 卡内交叉引用 | 无动作 | 「The behaviour behind it is in Interaction」 |

**保留**：组件来源 / token 名 / 具体取值 / 状态转移 / 数据契约 / dev 实现指示（如「success Message 无深色轴，按发布原样用、代码里不要改色」）。

**顺带修一处真缺陷**：Config-T UX 卡 `8085:520` 的 **`Commit result / 提交结果` 整条被挂在 ⑤ Component sources 段末**（轮三十追加时归类错），前面还带一个**孤立空行** ⇒ 移回 **③ Footer & states**、删空行。（该条的 ZH 也正是病灶 #7 那 112c。）

**量化目标**（预算，非硬承诺；实测数字回填 handoff）：

| 对象 | 现状字符 | 目标 |
|---|---|---|
| Config-T UX 卡四段（Changes/DC/Interaction/Acceptance）| 15 770 | ~8 500 |
| Config-T PRD §4 Requirements | 4 730 | ~2 800 |
| LCD UX 卡四段 | 10 332 | ~6 000 |
| LCD PRD §4 Requirements | 4 259 | ~2 600 |
| 两端 annot（LCD 17 + Config-T 11）| — | 逐条去理由留事实 |

**Journey 卡**：owner 未点名且各段仅 165–387 ZH 字符（非膨胀源）⇒ **只做 Task 1 样式合规，文案不动**（显式声明）。

---

## Task 3 · 改后必量（§I7，本 session 前序已命中 3 次、量级方向各不相同）

文案变短 ⇒ 卡高必然缩，**禁按"变短所以不会撞"预判**，逐项实测：

- [ ] 两端 UX 卡 / PRD 卡 / Journey 卡 hug 后新高度
- [ ] 文档列卡间 gap（Config-T 基线 61 · LCD 按实测基线）
- [ ] annot → 帧节奏（Config-T 21 段：annot→帧 20 / 帧→annot 90）
- [ ] 三级容器高（LCD AFTER Section `9359:491` / 外层 `9402:59` / sibling `TEST Mode Identity` `9530:140`；Config-T Section `8075:1000`）
- [ ] annot 变短后连线两端 Δ ≤ 8px（LCD B7→B8 `9988:731` 等）

---

## Task 4 · 机检 + 文档回填

- [ ] 两端 `pnpm audit:mockup-conformance --file <key> --node <本轮全部触碰节点> --non-blocking --report …`
- [ ] `pnpm audit:mockup-bilingual-spacing` 两端（本轮的正主）
- [ ] findings **程序化归属核验**（按本轮节点 id 在 report JSON 内递归匹配，不靠目测）
- [ ] 逐卡渲染图亲验（样式改动属视觉元素 ⇒ 必须看图）
- [ ] design-spec 回填 **D42** + handoff **§1k-AF** + design-record + ledger + 词库（若有新术语）
- [ ] **修正上一轮文档错位**：handoff `⑫`（失败文案补正）/ `⑬`（按钮间距 token 化）被误插进 **§1k-N（走查轮十三，行 1874–1915）**，应移入 **§1k-AE** 并重编号；同时 §1k-AE `⑤.4` 仍记着**旧**失败文案 `— test signal unchanged.`（已被 ⑫ 归正为 `— please try again.`），须加指针或改写，否则下轮读成终态。

---

## 不做（显式声明）

- **Jira 仍不发** —— owner 未定稿（memory `no-nagging-before-final`）。定稿范围 = 轮二十七～**三十一**。
- **完整 F1 design-walkthrough 仍待定稿后跑** —— 承接 §1k-AE ⑪ 第 1 条；本轮同样只做聚焦自查 + 机检。
- **Journey 卡文案不动**（只改样式）。
- **REFERENCE 区不动**；**产品帧内文本不动**（除 Task 0 页脚年份）。
- **主组件 `© 2025` 不改**（库侧 scope）。
- **不把本轮任何取值 / 帧 id / 样式规格写进 DS 真源** —— §M-DISCIPLINE.SOURCE 三问 ⇒ 项目资料档；唯一 DS 档候选 = Task 1b 末尾那条**机械闸补检查**（做法/判据层，待 owner 拍板）。
- **九处 `row · actions` 父层 itemSpacing token 化**（承接 §1k-AE ⑬「未做、非漏做」）—— 本轮仍不做，7 处独立小改动、零视觉变化，可与下轮合并。

---

## M48 起手 Rule-Coverage Self-Check（开建前逐条勾，交付前必须全绿）

| 命中规则 | 落地计划 | ✔ |
|---|---|---|
| **M23.14 (B)** 段名层级 + 双语样式表 | Task 1a 角色样式表即其落地；每处改完回读 `getStyledTextSegments` 逐段核 | ⬜ |
| **M23.14 (A)** 双语堆叠行距三档 | 大卡 14/22/itemSpacing20（1.57）· annot 13/18（1.38），改后跑 `audit:mockup-bilingual-spacing` | ⬜ |
| **M23.11 (B)** 终态优先 / scope 取舍 | Task 2 四类删除判据即其落地；Acceptance 条数不减 | ⬜ |
| **M23.10** audience-aware 白话 | 精简时不引入 code block / pseudocode；保留行内 backtick 引字段名 | ⬜ |
| **M23.0** canonical 卡结构 + 判据单一归属 | 段名 / 顺序 / 语义不动；PRD §5 保持一行指路句、不复述 UX 卡 | ⬜ |
| **M23.12** placement & sizing | 卡 hug 高度自适应；文档列三卡同宽（PRD 宽度）不变 | ⬜ |
| **M47.2** 文本改写重建样式段 | 全部改写走「读回逐段 → 整段覆盖 → 赋 characters → 按新偏移逐段重设」，**零 `insertCharacters`** | ⬜ |
| **M-TXT-ICON-AUDIT**（Roboto 缺 glyph）| `①②③ → ▼ ▲ ☐ ✅ ⚠ Δ` 等字符必须绑 `Noto Sans SC`，否则渲染空白；改后靠渲染图亲验（只有图能发现）| ⬜ |
| **§字体规范** 注释层 EN=Roboto / ZH=Noto Sans SC | 角色样式表已锁；禁 EN 落进 NotoSC 档（病灶 #8）| ⬜ |
| **M-COLOR §C1/C2/C3 + §C5** | cyan `#33A4FD` 沿用既有；不新增裸色值；能绑 token 处绑语义层 | ⬜ |
| **M-INTEGRITY §I2 / §I3 / §I7** | Task 3 逐项实测（卡高 / gap / 节奏 / 容器 / 连线），**禁按"变短不会撞"预判** | ⬜ |
| **M23.6** 连线正交 + 两端锚定 | annot 变短后复测 Δ ≤ 8px | ⬜ |
| **M23.7** state-label = what + why + invariants | annot 精简后仍须保住三要素（不能把 why/invariants 一起删光）| ⬜ |
| **M-DISCIPLINE.SCOPE** 对象全集 | scope = 全部注释层节点 × 两端（77 节点已枚举），**不是 owner 点名的三类** | ⬜ |
| **M-DISCIPLINE.SYNC** 三轮扫查 | ① 旧样式签名正则轮（按**维度全集**推导词表，不按"我预期哪个词"—— 轮三十的教训）② 新事实逐条 ③ 互斥对照（跨文件 / 同文件 / 跨 surface）| ⬜ |
| **M-DISCIPLINE.SOURCE** 三档落点 | 取值 / 帧 id / 样式表 → 项目 repo；机械闸补检查 → DS（待拍板）| ⬜ |
| **Q15**（SECTION 子节点坐标 section-relative）| 若需移动卡 / annot，赋坐标前先减 section 原点、落点必 probe `absoluteBoundingBox` | ⬜ |
| **§M49.1** file-wide owner-deferred | LCD colors / library-origin / binding-fidelity 存量债仍 deferred；**但 bilingual 维度本轮由 owner 亲自点名 ⇒ 解除 deferred，必须修** | ⬜ |
