# AI 协作过程复盘 — V4-2333 mockup 走查轮二（同日第二次 owner review）

> 日期：2026-07-29（14:1x 收尾） · Owner：Nancy · 交付物：LCD `0054ib0nLmt27bC3QlGDl7` page `9343:2`
> 面向：UX 团队 / PM 内部分享。区别于实现层 handoff（`docs/handoffs/2026-07-28-v4-2333-test-signal-parameters-handoff.md`）与 TVU 工程 retrospect，本篇复盘的是**人与 AI 的协作过程**。
> 前篇（同日轮一）：`docs/2026-07-29-v4-2333-lcd-paradigm-alignment-retrospect-internal-share.md`

---

## 1. TL;DR

- **总轮次**：5 轮 owner 介入（① 指出 L1 两处硬伤 + 质问走查 ② 拍板方案 A ③ 澄清字体规范 + 授权判断规则升级 ④ 质疑收尾跑错项目）
- **最终交付**：LCD 交付集从 4 帧变 5 帧 —— L1 回滚为「零改动对照帧」，新增 L1.5 `Settings` 二级列表（新 `Test Signal` 行）；4 条连线 / caption 重编号 ①–⑤ / UX 卡 3 段 + Journey stage 1 改述 / PRD 补 req 13 + §5b 验收条
- **核心 process gap 数**：6（其中 3 条已升为规则，1 条已入 design-record，2 条记为候选）
- **关键 insight**：**这一轮所有返工的根因都不是「做错了」，而是「验错了」。** 齿轮和 0px 间距在上一轮就已经写进交付物，机检 I2/I3 全绿、走查报告也交了 —— 漏检的是**走查 scope 由 owner 的指摘句框定，而非由「本轮触碰过的所有节点」框定**。owner 那句「为什么设计走查都没走查出来这个问题」比修 bug 本身值钱得多。

---

## 2. Session 概览

| 项 | 内容 |
|---|---|
| **起点** | owner 发 L1 帧链接 + 三句话：「右侧的文字与视频区域连接太近了，而且一个页面有 2 个设置图标，这是常理吗？为什么设计走查都没走查出来这个问题」 |
| **最终落地** | 5 帧交付集 + 全交付层同步 + 3 条规则回流（已 push `fc7f6c5c`）+ 54 处待改字体节点清单 |
| **Process artifacts** | handoff 新增 §1e（落地记录）/ §1f（全 5 帧走查报告）/ §1g（字体待改清单）· design-spec 改 D3 + 新增 D9 · design-record §3/§4/§8 · 本篇复盘 |
| **规则真源改动** | `tvu-design-system` commit `fc7f6c5c`（gitea+github 同 hash）：`mockup-conventions.md` 新增 M47.2 + §字体规范〈产品层字体〉+ 路由表 2 行；`STATUS.md` 第 8 条 |
| **刻意没做** | ① Jira 不发（owner 早前说效果图未定稿）② phase0-ledger 不 append（LCD 是 legacy 非消费方，ledger 维护规则本就排除；轮一那行是历史不一致，本轮不跟进）③ Verdana 替换不自己硬来（环境写不了，产出清单交 owner） |

---

## 3. 时间线 / 主要迭代

| # | 阶段 | owner feedback 触发 | 改动量 |
|---|---|---|---|
| 1 | 诊断 | 「间距太近 + 2 个齿轮 + 为什么走查没查出来」 | 0 改动，纯实测：坐实 gap 0px（已交付帧 12.55px）+ 两个 instance 同一 component key；定位走查漏检的三层机制；给 A/B/C 方案 + 推荐 |
| 2 | 落地方案 A | 「A」（一个字母） | 删齿轮 + L1 右栏回滚 3 项；勘察 Settings 主菜单 `5802:819` → 二级列表 `5802:1074`；clone 新建 L1.5；sub-Section 1730→2180；补第 4 条连线；caption 重编号 ①–⑤；UX 卡 3 段 + Journey stage 1 改写 |
| 3 | 自查 | （无 feedback，纪律要求） | F1 走查 scope 覆盖全 5 帧 → 抓到 1 🔴（PRD 缺入口需求条目）→ 补 req 13 + §5b；补跑 B5 gutter probe（上轮漏检的那一类） |
| 4 | 字体 + 规则 | 「LCD 的字体都是 Verdana，其他网页默认 Roboto」+「insertCharacters 你帮我判断，如有必要则升级」 | 升 M47.2；补〈产品层字体〉分档 + Verdana 硬约束；产出 54 处待改清单；偏差 5 定性更正；commit + push；两个 audit 全绿 |
| 5 | 收尾 | 「你收尾是收尾当前项目的，怎么收尾到设计系统项目了？」 | 停止读设计系统 ledger（其维护规则本就排除 legacy 非消费方），收尾动作收回 TVU Pack |

---

## 4. Top 6 process gap（按返工成本排序）

### G1 🔴 走查 scope 被 owner 的指摘句框定，而非「本轮触碰过的所有节点」

- **实证**：轮一走查由 owner「设置页未照既有范式」触发，报告 Deliverable 只填 L2/L3/L4。而 L1 是本轮**唯一改动了已交付帧布局**的帧，恰恰没进走查表 → 0px 间距与双齿轮两项全漏。
- **返工成本**：一整轮 owner review + 本轮几乎全部工作量（删齿轮、回滚、新增一帧、重排布局与连线、caption 重编号、三个交付层同步、PRD 补条）。
- **根因**：F1 skill 里已有「机检 gate 的 `--node` 必须覆盖本 session 触碰的所有节点」这条硬约束，但**目测判断轴（B5 留白 / 反模式「只查语义不查像素」）没有同等的 scope 约束** → scope 一收窄，这些项整项蒸发而无人察觉。
- **回流落点**：候选 —— F1 走查 `Deliverable` 字段应强制列「本 session 触碰的全部节点」，与机检 `--node` 同一份清单，不允许只填 owner 提到的那几帧。（本轮为第 1 次显式命中，记候选。）

### G2 🔴 「已知偏差」清单变成了免检章

- **实证**：handoff 已知偏差 4 原文「L1 右栏左移 13px（x381→368）以容纳齿轮」——记了**位移量**，没记**后果**（那 13px 正是视频区与右栏之间的全部间距，移完归零）。写进声明反而让它豁免了走查复核。
- **返工成本**：与 G1 同源（同一处缺陷的两个入口）。
- **回流落点**：候选 —— 偏差条目必须写「后果」而非只写「改了什么」；一条偏差若无法陈述「它牺牲了什么」，就不是可接受偏差，而是未诊断的缺陷。本轮已在 handoff 里把偏差 4 原地留存并标注为反面实证。

### G3 🟡 M35 affordance trace 的 same-screen 盲区（库复用规则反向致害）

- **实证**：轮一 trace 的 Chosen 理由原文是「复用文件内 `TouchScreen/Icon/settings` —— **与 LCD 底栏既有设置图标同源，视觉词汇一致，无需引第二套**」。把「和底栏那个长得一样」当成了**正面**依据写下来，而那个底栏齿轮**就在同一屏右下角**。
- **根因**：M35 trace 原三步（intent / vocabulary scan / chosen）只校验「候选图标在**文件**词汇里有没有先例」，**不校验「候选图标在目标屏内是否已被别的目的地占用」**。M32 库优先 / 词汇复用在这个场景下反向致害。
- **已回流**：design-record §4 trace 加第 3 步 **same-screen occupancy check**；design-spec 新增 **D9 同屏可视线索唯一性**（一个图标只指一个目的地 / 新入口先在既有导航树找落点 / 新线索必须形状可区分，不是靠尺寸差 4px）。DS 侧记候选（第 1 次命中）。

### G4 🟡 字体决策用错了层——把注释层真源套到产品层

- **实证**：轮一把 LCD 新帧写成 Roboto，理由记作「Roboto 是 DS 的 EN 字体、可移植」。但 DS 的 Roboto 是**网页 + 注释层**真源，LCD 产品帧的规范是 **Verdana**。更糟的是把它记成「可接受偏差」，掩盖了它其实是**待偿债**。
- **根因**：字体规范真源里，注释层写得很细，产品层只有一句「另按其库 instance / file-level baseline」——**空指针**。AI 找不到产品层依据，只能拿注释层规范顶上。
- **附带发现**：**已交付帧 `9359:492` 本身就混了 3 处 Roboto**（07-09 那轮留的），说明这是每轮都在累积的系统性债，不是本轮新问题。
- **已回流**：`mockup-conventions.md` §字体规范新增〈产品层字体〉分档表（LCD=Verdana / 网页=Roboto / 注释层恒 Roboto+Noto Sans SC 不随产品层变）+ Verdana 本环境不可写的硬约束与处置（必产出待改节点清单交 owner，禁止记成可接受偏差）。清单已产出：54 处，见 handoff §1g。

### G5 🟡 整帧批量改字体没排除 INSTANCE 子树

- **实证**：把 L1.5 全帧 `findAll(TEXT)` 转 Roboto 时，误把底栏 `LCD Button` 组件**内部自带的 Verdana** 也改成 Roboto → 与 L2–L4 的同一按钮字体断层。
- **发现方式**：不是目测发现的，是收尾字体审计里 `Verdana [in-instance]` 计数异常暴露的。
- **修法**：`instance.resetOverrides()` 还原组件默认，再重设 instance 级属性（opacity / variant）。
- **已回流**：并入〈产品层字体〉条目的「反向误伤同样禁止」。

### G6 🟢 收尾动作跑到了非当前项目

- **实证**：收尾时去读 `tvu-design-system` 的 phase0-ledger 准备 append，被 owner 当场纠正。而 **ledger 自己的维护规则就写着「非消费方（挂 legacy 本地库的 mockup，如 Config-T / TVU Pack legacy 文件）不在此 append，记到该产品自己的 docs」**——LCD 是纯 legacy 文件，本轮从一开始就不该往设计系统 repo 记。
- **成本**：低（只读了两次文件，未写入）。
- **教训**：wrap-up 协议里的步骤是**有条件**的，不是逐条照做的 checklist。执行前先判断本轮交付物属不属于该步骤的适用范围。规则回流（M47.2 / 字体规范）写设计系统 repo 是正确的——那是规则真源；ledger 不是。

---

## 5. 高效对话建议（按 ROI 排序）

### 给 UX / PM 提需求方

1. **本轮 owner 那句提问是范本，建议固化成模式**：「① 现象（右侧文字与视频区域连接太近）② 常理质疑（一个页面 2 个设置图标，这是常理吗）③ 流程质疑（为什么设计走查都没走查出来）」。第 ③ 句的价值远超前两句——它把对话从「修这个 bug」提升到「修产生这个 bug 的流程」，本轮 6 条 process gap、3 条正式规则都是它带出来的。**只给 ①，AI 就只会修那一处。**
2. **产品级规范早说一句，能省掉整轮返工**。「LCD 的字体都是 Verdana，其他网页默认 Roboto」这一句话，直接把挂了两轮的「偏差 5」从「无解」翻案成「待偿债 + 54 处清单」。这类规范（字体 / 色彩 / 间距基线 / 组件谱系）AI 无法从文件里可靠反推——既有文件本身就混着历史违规（`9359:492` 就有 3 处 Roboto），照文件推只会把违规当规范。
3. **拍板可以极简**。owner 本轮回了一个字母「A」，因为 AI 先给了 A/B/C + 每条的代价 + 推荐。这比「你觉得怎么改好」高效得多——把方案空间的整理工作留给 AI，把选择权留给自己。

### 给 AI 协作流程

4. **改方案前先给「候选 + 代价 + 推荐」，不要直接改也不要空问**。本轮 A/B/C 里 C 是明确不推荐的（两个毛病都没真解），列出来是为了让 owner 看到它已被评估过而不是被忽略。
5. **走查的 scope 必须由「我这一轮碰过什么」决定，不是由「owner 提到了什么」决定**。这是本轮最大的一条。
6. **「可选待办」不是走查**（轮一教训延续到本轮仍需强调）。本轮交付前无条件跑了 F1，抓到 PRD 缺 req 13 这个 🔴——那是 dev 工作范围问题（要改 Settings 菜单却无依据），走查不跑就会直接漏进开发。

### 给 review 方

7. **看到「已知偏差」条目时追问一句「它牺牲了什么」**。本轮的 0px 间距就藏在一条看起来很规范的偏差声明里（G2）。声明了位移量不等于评估了后果。

---

## 6. 规则清单：已回流 / 待回流

| 规则 | 真源文件 | 状态 | 简述 |
|---|---|---|---|
| **M47.2 Text Edit Rebuilds Style Ranges Explicitly** | `tvu-design-system/docs/internal/mockup-conventions.md` | ✅ 已 push `fc7f6c5c` | 改多段样式文本禁用 `insertCharacters()`，走「整段覆盖 → 赋 characters → 逐段重设」+ `getStyledTextSegments` 逐段复核；含验证陷阱（`contentsOnly` 截图白字白底误报内容丢失）。3 次命中后 owner 拍板升正式规则 |
| **§字体规范〈产品层字体〉分档 + Verdana 硬约束** | 同上 | ✅ 已 push | LCD=Verdana / 网页=Roboto / 注释层恒 Roboto+Noto Sans SC；Verdana 本环境不可写 → 必产清单交 owner，禁记为可接受偏差；含双向误伤禁令 |
| **路由表登记 2 行**（M47.2 + LCD 产品帧字体触发）| 同上 §AI 读取指引 | ✅ 已 push（`audit:rule-load-map` 62/62 且不在 parent-only 盲区）| 保证 scoped-load 能扫到 |
| **D9 同屏可视线索唯一性** | `TVU Pack/docs/specs/2026-07-28-…-design.md` | ✅ 已写入 | 一个图标只指一个目的地；新入口先在既有导航树找落点；「容纳新元素」不构成压缩既有 sibling 间距的理由 |
| **M35 trace 第 3 步 same-screen occupancy check** | `TVU Pack/docs/specs/2026-07-28-…-design-record.md` §4 | ✅ 已写入 · DS 侧候选（第 1 次）| 枚举目标屏内该图标既有 instance 与各自目的地，命中即禁止复用 |
| 走查 Deliverable 必须列「本 session 触碰的全部节点」 | 候选 → `design-walkthrough` SKILL.md | 🟡 候选（第 1 次）| 目测判断轴与机检 `--node` 共用同一份节点清单 |
| 偏差条目必须写「后果」而非只写「改了什么」 | 候选 → `design-process.md` | 🟡 候选（第 1 次）| 无法陈述牺牲了什么的偏差 = 未诊断的缺陷 |
| wrap-up 步骤是有条件的，执行前判断适用范围 | 候选（本轮 G6）| 🟡 候选（第 1 次）| 例：ledger 明文排除 legacy 非消费方 |

---

## 7. Model 选型推荐（基于本 session 实证）

| 环节 | 建议 | 依据 |
|---|---|---|
| 诊断 + 流程复盘 + 规则升级判断 | **Opus**（本 session 用 Opus 5 1M）| 需要同时握住：Figma 实测数值、5 份规则文档的交叉关系、3 轮历史病灶的模式识别、跨 repo 回流落点判断。G1–G4 的根因链（scope→免检章→trace 盲区→字体层级错位）不是逐条查表能得出的 |
| Figma 实测 / 机检 / 截图核对 | Sonnet 够 | 机械执行 + 数值比对 |
| 大段注释文案改写 | Sonnet 够，但**必须带 M47.2 的手法约束** | 手法固定后是模板化操作；风险在跳步不在推理 |
| 跨 repo 规则回流 + commit 拆分 | **Opus** | 本轮需要在有并行 session 的 repo 里用 patch 过滤只 stage 自己的 hunk（STATUS.md 与 INFRA-F73 同文件），误带会污染他人半成品 |

---

## 8. 给团队的 action items

| # | 事项 | Owner | 说明 |
|---|---|---|---|
| 1 | **LCD 产品帧 54 处 Roboto → Verdana 本地批量替换** | Nancy | 清单见 handoff §1g（按帧分组 + 字重映射）。含已交付帧 `9359:492` 遗留 3 处 —— 与 L1 同源，须一起改。caption / UX 卡 / PRD 卡**不要动** |
| 2 | 替换后复核 | AI（下个 session）| 产品帧内 Roboto 应为 0，caption 仍 Roboto/Noto Sans SC |
| 3 | mockup 定稿判断 | Nancy | 5 帧交付集待 review；定稿后才发 Jira（按 owner 早前指示，未定稿不催） |
| 4 | 三条候选规则是否升正式 | Nancy | G1（走查 scope）/ G2（偏差写后果）/ G6（wrap-up 步骤有条件）均为第 1 次显式命中，按惯例 3+ 次或 owner 拍板才升 |

### 附录：本 session use_figma 改动统计

| 类别 | 数量 |
|---|---|
| `use_figma` 调用 | 20（其中只读探查 9 / 写操作 11） |
| 删除节点 | 1（齿轮 instance `9592:571`）|
| 新建节点 | 3（L1.5 帧 `9634:271` + 新行 `9636:276` + caption `9641:276`）+ 1 连线 clone（`9634:268`）|
| 几何回滚 | 4（`9592:514` x/w · `9592:515` · `9592:516` · `9592:517`）|
| 位移 | 7（L2/L3/L4 + 3 caption 各 +450；老 Journey 卡 `9396:59` +127）|
| 文本重建（走 M47.2 手法）| 11（5 caption + UX 卡 3 段 + Journey stage 1 + PRD §4b/§5b）|
| 字体转换 | 25 段（L1.5 全帧 Verdana→Roboto）+ 1 次 `resetOverrides()` 修误伤 |
| 机检轮次 | 6（sub/feature Section overlap+overflow · 连线锚点 · 字体分布 · B5 gutter probe · 注释 palette · 行级样式复核）|
| 失败重试 | 1（`getStyledTextSegments` 传了非法 enum `opacity` → 脚本原子失败，未产生副作用，修正后重跑）|
