# AI 协作过程复盘 — V4-2333 mockup 走查轮三 + 轮四（同一 session）

> 日期：2026-07-29（17:3x 起，跨至 07-30 收尾） · Owner：Nancy · 交付物：LCD `0054ib0nLmt27bC3QlGDl7` page `9343:2`（连带 Config-T `rJJjWWs51n2iFOlCIC7aYG` page `8075:2` 的 REFERENCE 段）
> 面向：UX 团队 / PM 内部分享。区别于实现层 handoff（`docs/handoffs/2026-07-28-v4-2333-test-signal-parameters-handoff.md` §1h/§1i）与 TVU 工程 retrospect，本篇复盘的是**人与 AI 的协作过程**。
> 前篇：`docs/2026-07-29-v4-2333-mockup-review-round2-retrospect-internal-share.md`（同日轮二）

---

## 1. TL;DR

- **总轮次**：owner 介入 3 次 —— ① 「检查 5 帧 mockup」（轮三起点）② 「参考来源没写 Figma 链接…也需要回流到设计系统」③ 一次性给出 7 项设计反馈（轮四）
- **最终交付**：LCD 交付集从「两个平级 AFTER + 5 帧」重构为**一个 AFTER Section = 共同起点 + 两条支线（A 3 帧 / B 5 帧）**，新增主菜单帧补齐入口缺失的一跳；档位补 720p 两档 + 加回 1080i60；`Test Signal` 行从列表末尾移到 Receiver 之后并补回被裁掉的两行；UX 卡补推荐默认值与微服务一致性口径；两端参考来源补可点击链接
- **核心 process gap 数**：5（1 条已升 DS 正式规则并 push，3 条记候选，1 条方法论发现）
- **关键 insight**：**「扫查 0 命中」不等于干净。** 关键词扫查只能抓「写错了」，抓不到「漏写了」—— Journey 卡的 §2a 正则扫查返回 0，定向逐条对照新事实才发现 Touchpoints 少了「主菜单」这一跳。凡是**缺失类**偏差，必须拿新事实去对照文本，不能靠旧措辞正则。

---

## 2. Session 概览

| 项 | 内容 |
|---|---|
| **起点** | owner：「检查 V4-2333 LCD mockup」（承接轮二未定稿状态，给了 A/B/C 三个候选入口） |
| **最终落地** | 单一 AFTER 流程图 + 9 帧 + 8 连线 + 4 张交付卡横向重排；UX 卡 4 段重写；PRD req12/req13/§5b；design-spec 新增 D10/D11/D12；字体债清单重算 63 → **84 处** |
| **Process artifacts** | handoff **§1h**（轮三全量机检）+ **§1i**（轮四逐步 + 机检原文 + 字体债重算表）· design-record **§8.1**（重构后节点索引）· 计划文件 `docs/plans/2026-07-29-v4-2333-round4-flow-split-plan.md` · 本篇复盘 |
| **规则真源改动** | `tvu-design-system` commit **`637cf4a6`**（gitea + github 同 hash 已核）：`design-process.md` §参考物落地新增〈源标识必须是可点击链接〉+ Acceptance 一条 + 反模式一条 + 实证段；`STATUS.md` 第 9 条 |
| **刻意没做** | ① Jira 不发（owner 早前说未定稿）② phase0-ledger 不 append（LCD 是 legacy 非消费方，ledger 维护规则明文排除）③ **轮四不再写 DS STATUS** —— 轮四没产生新 DS 规则，按 design-spec §7 收尾 gate #4「纯项目 mockup 轮 → DS repo 零写入」判断不适用该步（轮二 G6「wrap-up 步骤是有条件的」的正向执行）④ owner 手加的 `Rectangle 1009` 未删（§I5，交 owner 确认） |

---

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

| # | 阶段 | owner feedback 触发 | 改动量 |
|---|---|---|---|
| 1 | 轮三 · 复核 | 「检查 5 帧 mockup」 | 0 Figma 改动，纯只读：字体逐帧实测（判定 owner 尚未替换，B 入口不成立）→ 改跑全 5 帧走查；发现**清单外第 4 类字体债**；handoff §1g 补类 + §1h 新增 |
| 2 | 轮三 · 链接 | 「参考来源没写 Figma 链接？直接截图没问题，当需要跳转查看详细情况时…这个需要补齐，也需要回流到设计系统里面」 | 4 个 caption 加 `setRangeHyperlink`（Config-T 侧正文原本连源标识都没有，走 M47.2 追加来源行）；DS 规则回流 + commit + push |
| 3 | 轮四 · 7 项反馈 | Tone 不缩写 / 720p 档位 / 微服务一致性 / 推荐默认值 / 两个 AFTER 分两条线 / Settings 入口链路 / 显示顺序 | 先落**计划文件**再分 S0–S9 执行：约 30 个 Figma 节点（新建 6 · 删除 4 · 移动 12 · 文本重建 11+）+ 4 份文档 |

---

## 4. Top 5 process gap（按返工成本 / 洞察价值排序）

### G1 🔴 「扫查 0 命中」被当成「干净」——关键词扫查抓不到缺失类偏差

- **实证**：轮四按 M-DISCIPLINE.SYNC §2a 跑过时描述扫查，对 Journey 卡命中 **0**。若就此收工，Journey 的 Touchpoints 会永远停在 `bottom-bar gear · Settings list` —— 而 owner 本轮明确给出的事实是入口中间还有**主菜单**一屏。定向按新事实逐条对照才发现。
- **根因**：§2a 的做法是「用**旧措辞**正则扫全子树」，前提是你能预想到旧写法。**漏写一跳**这种偏差没有对应的旧措辞可扫 —— 它的特征是「少了个词」，不是「写错了词」。
- **返工成本**：本次低（1 个节点），但若漏过，dev 会按 3 跳实现、QA 按 3 跳验收。
- **回流落点**：候选 → `mockup-conventions.md` §M-DISCIPLINE.SYNC §2a 补一句：**扫查分两轮 —— ① 旧措辞正则（抓写错）② 拿本轮确立的新事实逐条对照交付层（抓漏写）**；第 ② 轮不可省，且 0 命中不构成通过。

### G2 🔴 债务清单的统计口径两次都不完整（63 → 84）

- **实证**：字体待改清单先记 54 处（只扫帧的直属 TEXT，**漏 INSTANCE 子树** → 轮三补 9 段 Tone pill）；轮四全量实测又发现 **A1/A2/A3 三帧的 07-09 遗留 22 处从未纳入**（此前只统了起点帧 `9359:492` 的 3 处）。
- **根因**：清单的 scope 一直是「**本轮改过的帧**」，而债务的 scope 应该是「**该 surface 的全部产品帧**」。这与轮二 G1（走查 scope 被指摘句框定）是同族病灶 —— **scope 由「我做了什么」推导，而不是由「这件事该覆盖什么」推导**。
- **回流落点**：候选 → 债务/待办清单类产出物的 scope 必须显式声明并按「对象全集」枚举；清单标题要写清覆盖范围（本次已改为「LCD 产品帧全集，含 INSTANCE 子树」）。

### G3 🟡 hug 容器加内容后静默越界（canonical 尺寸被撑破）

- **实证**：owner 在 L3 面板加了两行占位，面板是 hug 高度 → 从 176 长到 **211**；我补 1080i60 后到 **246**，实测 **bottom 292 已压住底栏（y 279）**、也超出内容区（274）。截图上不明显，是 probe 才抓到。
- **修法**：固定回 canonical `240×176` + `clipsContent`，7 行里首屏 5 行（含选中项 `1080p30`），余下靠 ▼▲ 翻页 —— 这本来就是 canonical 的语义（列表可滚动）。
- **回流落点**：候选 → **凡照 canonical 尺寸建的容器，任何加行/加内容后必须复测尺寸与相邻兄弟碰撞**；「内容变多」不构成容器超出范式尺寸的理由（与 D9「容纳新元素不构成压缩既有间距的理由」同源）。

### G4 🟡 布局重构时把 Section 加高，压到 page 内别人的工作线

- **实证**：合并 AFTER 后我首版把 4 张交付卡排成两列两行，feature Section 需加高到 3110，下缘 3615 **压住** page 内另一条工作线的 `TEST Mode Identity` Section（顶 3215）。
- **发现方式**：**page 级 I2 机检抓到**（不是目测）。改为 4 卡横向单行排开 → Section 变矮（下缘 3125）而非变高，**不动别人的节点**。
- **判定**：这条算规则**生效**的正面案例（I2 已存在且本次真跑了），记在此处是为了留一个「重构布局时优先改自己的形状、而不是推别人」的处置范式。

### G5 🟢 owner 手改的占位符必须回读，不能当成品

- **实证**：owner 用 `720pxx` 两行表达「这里要加 720p」，并非最终文案；同轮 owner 已把 L2/L4 的 `Cont.` 改成 `Continuous`，只剩 L3。若不起手 probe，会出现「把占位符当交付内容」或「重复改 owner 已改好的东西」。
- **正向**：§I5（动既有节点前先 live 重读 + 只做最小 delta）本次全程生效，L3 面板两行只填文案未重建。

---

## 4b. 本轮验证有效的做法（与教训同等重要，供直接复用）

| # | 做法 | 本轮实证 |
|---|---|---|
| V1 | **走查 scope = 本轮触碰的所有节点**（轮二立的规则） | 正是靠全 5 帧 + INSTANCE 子树的全量字体扫描，才发现清单外的 Tone pill 9 段 —— 只审 owner 提到的帧绝对抓不到 |
| V2 | **改方案前给「候选 + 代价 + 推荐」，带可视 preview** | 轮四 4 个决策点一次问清，owner 逐项直选（3 项选了推荐项）。列表落点那题用 ASCII 预览把「第 7 行落在 210px 视口外」画出来，比文字论证有效 |
| V3 | **多阶段任务先落计划文件** | 轮四 7 项反馈 → 9 步计划文件 → 逐步执行零走样；跨 session 续跑入口天然具备 |
| V4 | **M47.2 的段替换法**（按 segIndex patch / 边界偏移法） | 本 session 重建 20+ 个多段样式文本节点（caption ×9 / UX 卡 ×4 / PRD ×2 / Journey ×1 …），段数与三档交替 **0 偏差**；不必把全文写进 prompt，脚本内自取原段文本 |
| V5 | **写后机检不可省** | 抓到 2 处目测发现不了的真问题：PRD 改写增高后溢出 Section、feature Section 加高压到别人的 Section |
| V6 | **判据优先于偏好** | 「列表落点」不是审美问题：210px 视口 + 7×40 行高可以直接算出「放末尾 = 默认不可见」。凡能算的就别投票 |

---

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

### 给 UX / PM 提需求方

1. **一次给整批反馈，比分多轮给更省**。轮四 owner 一口气给了 7 项（含 2 项需判据的），AI 一次 probe 完现状、一次问清 4 个决策点、一次落计划、然后连续执行 —— 换成 7 轮零散反馈会重复 7 次「读现状 → 改 → 机检」的固定开销。
2. **说「用文字说明」这类口径，比逐个填值更有效**。720p 档位那题 owner 答「常见的类型，主要以现有版本为主，所以用文字说明」——这一句同时定了三件事：图上画常见档位、图不是穷举 spec、权威清单以微服务为准写进文字。比逐个报帧率高效得多。
3. **直接给事实链**（如「点齿轮之后是这个页面，点 Settings 之后才是那个页面」+ 两条 Figma 链接）。AI 无法从既有 mockup 反推出「中间还有一屏」——它只能看到已画出来的东西。

### 给 AI 协作流程

4. **拿到「检查一下」时，先判断入口再动手**。轮三第一件事是复核字体现状，确认 owner 尚未做替换 → B 入口（复核替换结果）不成立 → 改跑全量走查。若上来就按预设入口做，会做一堆无效核对。
5. **缺失类偏差要用新事实反查，不能靠旧措辞扫查**（本轮最大的一条，见 G1）。
6. **owner 手改过的区域，起手一定 probe**（G5）；probe 的成本远低于「把占位符当成品交付」。

### 给 review 方

7. **看到「清单」时追问一句「它的 scope 是什么」**。本轮字体债清单两次不完整都是 scope 问题，而清单本身看起来很规范（按帧分组、带节点 ID、带字重映射）——**格式规范掩盖了范围不全**。

---

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

| 规则 | 真源文件 | 状态 | 简述 |
|---|---|---|---|
| **§参考物落地〈源标识必须是可点击链接〉** | `tvu-design-system/docs/internal/design-process.md` | ✅ 已 push `637cf4a6` | 参考物 caption 的源标识必须挂 `setRangeHyperlink`（短锚文本用 node id）+ 下划线；**截图类同样要挂**（图只能看、链接才能跳）；**图层名里写了不算**；Acceptance 用 `getStyledTextSegments(['hyperlink'])` 机检；含反模式与实证 |
| **D10 参数选项集权威来源 = 微服务现有版本** | `TVU Pack/docs/specs/…-design.md` | ✅ 已写入 | 图上档位是「常见类型」示例非穷举 spec；权威清单以 Test Stream Generator 微服务现有版本为准、dev 对照 mediahub 核定；i60 保留；每项给推荐默认值；枚举文案不缩写 |
| **D11 新设置项落点 = Receiver 之后（第 2 位）** | 同上 | ✅ 已写入 | 含可算的判据（视口 210px vs 7×40 行）；推论：新功能入口行不默认追加末尾、容器不得为容纳新增项超出 canonical 尺寸 |
| **D12 一个 feature 只有一个 AFTER 流程图** | 同上 | ✅ 已写入 | 同起点则必须合并 + 删重复起点 clone；caption 编号 `①/A1…/B1…`；入口链路必须画全每一跳（漏一屏则全部跳数描述失效）；分叉连线拼装法（不拉伸 VECTOR） |
| §2a 扫查须分两轮：旧措辞正则 + 新事实逐条对照 | `mockup-conventions.md` §M-DISCIPLINE.SYNC §2a | ✅ **已升正式 · push `21182c06`**（2026-07-30 owner 拍板）| 0 命中不构成通过（G1）。落地为两轮对照表 + 红线 + V4-2333 Journey 漏「主菜单」实证 |
| 债务/待办清单的 scope = 对象全集，不是本轮触碰集 | **新增 §M-DISCIPLINE.SCOPE** | ✅ **已升正式 · 同 commit**，且按 owner 建议**与轮二 G1「走查 scope」合并成一条通则** | scope 由「对象全集」推导，禁三种顺手近似；4 条硬约束（对象全集 / 枚举维度全集 / 下钻 INSTANCE 子树 / 标题声明范围）。实证扩成 54→84→**88** 三连——轮五又发现只扫 Roboto 漏了 4 段 PingFang SC |
| canonical 尺寸容器加内容后必须复测尺寸与兄弟碰撞 | **新增 M-INTEGRITY §I7** | ✅ 已升正式 · 同 commit → **⚠️ 2026-07-30 轮六订正上限口径 · commit `9aad3820`** | 复测三项：容器尺寸 / 兄弟碰撞 / **依附其几何的手画装饰**。第 ③ 项是轮五新增的第二层——L3 面板修回 canonical 时漏了按旧尺寸画的连体绿框 VECTOR（脱钩 49.5px）（G3）。**轮六发现初版硬约束第 1 条「正解是回到 canonical 尺寸」与同轮拍板的 D13 反向**（下轮 AI 会去把面板缩回 176）→ 改为「默认 / 例外（关键内容被裁到首屏外且物理边界内有余量）/ 硬上限恒为物理边界」三层 + 澄清与 D9 的伤害机制差异（D9 无条件、本条有条件）；连带修 `domain-tvu.md` §M17.1 两处（面板 240×176 读成硬上限 · 「连体绿框无需另画」与实测不符、是轮三误判要删 `Rectangle 1009` 的规则层诱因）。详见 handoff §1k |
| **同一实证同时产出「通则」+「案例决策」时，通则侧必须反向引用案例决策** | `mockup-conventions.md` **§2a 增第 ③ 轮「规则层对照」** + `AGENTS.md` §Trigger-Drift 补第三类 | ✅ **已升正式 · push `0540be18`**（2026-07-30 owner 轮六拍板）| D13 进项目 design-spec、§I7 进 DS conventions，同一天同一实证、彼此零交叉引用 —— 这是两条能反向而两边各自读都自洽的**结构原因**。**落点改判**：原建议 §Trigger-Drift，读完其全文后发现三类修法（唤醒词/jump 路由/提为一等定义）全是激活层手段、接不住"内容互斥"，故主体落 §2a ③ 轮（a 口径一致 · b 被推翻的叙述须标注 · c 双向引用），只在 §Trigger-Drift 两层模型补「第三类失败 + 路由指针」|
| 被裁切的内容在效果图上等于没交付 | 候选（第 1 次命中）| 🟡 **owner 轮六裁定维持候选** | 当前可执行形态已被 §I7 例外条款吸收，单独立条会重叠；等攒到一个非容器尺寸的命中（tab 折叠 / accordion 收起 / 长列表）再升，那时形态更泛、更值得独立编号 |
| **被后续条目推翻的旧 scope 必须被扫到** | `mockup-conventions.md` **§2a ③ 轮泛化为「互斥对照」** | ✅ **已回流 · push `629a5990`**（owner 要求先自查再执行）| 轮六发现 PRD 内 `req 4`「不提供参数设置」/ `req 5`「Config-T 本期不做」/ `§5` 末条「v1 不暴露任何参数选项」与本轮 `§4b` 直接互斥，dev 读了会得出"本期不做参数"。**自查发现不需要新增 ④ 类** —— 病灶与轮六上半刚立的 ③ 轮完全同源，只是 ③ 轮被我写窄了（触发条件限定"改动 DS 规则条文"、对照对象限定"通则↔案例决策"）。故泛化：跨文件 + 同文件两种形态、加「同文件扫法」可执行判据（扫 `仅…`/`不提供…`/`本期不做…`/`v1 不…`/`deferred`）、红线/Why/Acceptance 重写、实证拆 A/B |
| **衍生轮追加内容不新建平级单元（卡级 / 段级）** | `design-process.md` **Step B「更新 vs 新建」补齐三层粒度** | ✅ **已回流 · 同 commit** | `§4b`/`§5b` 造成 PRD 出现两段 Requirements + 两段 Acceptance，读者要在两处找需求。**自查发现既有规则已管了制品级**（Step B Discovery-before-create 第 1 问「命中则更新那一个，不新建第二份」），轮六犯的是同一原则往下两层 → 补 **卡级**（不新建平级第二张 UX/Journey 卡）+ **段级**（不加字母后缀段，并进既有段连续重编号，PRD 恒 6 段），判据与 D12 同源；并段时必须同时跑 §2a ③ 轮 |

> **两条候选的自查方法值得复用**：owner 没直接说"回流"，而是先让自查「是否需要回流」。自查动作 = ① 拿关键词扫遍 DS 真源确认"是否真的没有规则在管" ② 若命中既有规则，判断是"规则没触发"（激活层，禁止加新规则）还是"规则粒度/措辞有缺口"（改写既有条文）③ 只有确认是真空白才考虑新编号。本轮两条**都落在②**，故零新增编号 —— 直接避免了 §Trigger-Drift 反模式警告的"规则越多越易漏触发"。
| 〈产品层字体〉补：remote instance 做文案 override 后字体会带上 Roboto | 候选 | 🟡 owner 本轮答「不用管」，暂不升 | 轮三发现，见 handoff §1h ② |

> 轮二遗留的三条候选（走查 scope / 偏差写后果 / wrap-up 步骤有条件）owner 本轮答「先等等」，维持候选。其中「wrap-up 步骤有条件」本轮已被正向执行一次（轮四判定不写 DS STATUS）。

---

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

| 环节 | 建议 | 依据 |
|---|---|---|
| 走查诊断 + 病灶模式识别 + 规则升级判断 | **Opus**（本 session 用 Opus 5 1M） | 需同时握住 5 份规则真源、跨 4 轮的历史病灶、Figma 实测数值与 canonical 对照。G1/G2 的「同族病灶」判断不是逐条查表能得出的 |
| 大规模布局重构（移帧 / 连线 / Section 尺寸） | **Opus** | 中间态必然出现 overflow/overlap，需要规划批次顺序（先移空再删再扩）并预判 page 级碰撞 |
| Figma 实测 / 机检 / 截图核对 | Sonnet 够 | 机械执行 + 数值比对 |
| 多段样式文本批量改写 | Sonnet 够，但**必须带 M47.2 手法约束** | 手法固定后是模板操作；风险在跳步不在推理 |

---

## 8. 给团队的 action items

| # | 事项 | Owner | 说明 |
|---|---|---|---|
| 1 | ~~**LCD 产品帧 88 处非 Verdana → Verdana 本地批量替换**~~ | — | 🚫 **2026-07-30 轮六收尾 owner 裁定「不用改，就现在这样」→ 本项关闭**。逐帧清单保留在 handoff §1i 作记录（84 段 Roboto + 4 段 PingFang SC）。**Verdana 在本环境 `loadFontAsync` 加载不到，AI 侧本就无法自修**，owner 裁定不改后此项不再是债 |
| 2 | ~~替换后复核~~ | — | 🚫 **随 item 1 关闭**（无替换动作，无需复核）|
| 3 | ~~确认 `Rectangle 1009` 是否删除~~ | Nancy | ✅ **已闭环（2026-07-30）**。轮五结论翻转：它不是灰残留，是 §M17.1 连体绿框的**唯一实现者**（`fills[0].visible=false` + 绿色 `strokes` 可见 + 阶梯形连体路径，手法与 canonical `5314:9520` 的 `Rectangle 4 (Stroke)` 同源），**删掉该帧绿框会整体消失**。owner 拍板方向不是"收回绿框"而是「增加一个选项 1080p60，绿框高度按内容调整」→ 面板 176→**211**、绿框 224.5→**211**，1080p60 进首屏。口径落 design-spec **D13** |
| 6 | ~~三个设置页帧的 hint 全集对照发现 3 项既有 drift~~ | AI | ✅ **已闭环（2026-07-30 轮六）**。全集实为 **4 处**（轮五漏统 ① 帧 `9373:70`）；3 项里**只有 2 项成立**：① B4 `9594:250` **opacity 0→1 已改**（D7 在该帧本未交付）② 文案 `Config-T` → `Configuration page` **已改**（M44；走 M47.2，目标值从 B3 自取 + 三条前置断言，`shapeMatch=true` / `segCount 1→1`）③ **不成立** —— 三处图层名与内容全相符，轮五看了 B3/B4 就推断第三处、未实测 B5（§M-DISCIPLINE.SCOPE 第 3 类错误在该规则立完当轮复发）。§I7 三项 + §2a 两轮 + 截图全过，产品帧内 `Config-T` 残留 0。详见 handoff §1k-B |
| 4 | mockup 定稿判断 → 定稿后才发 Jira | Nancy | 按早前指示未定稿不催（轮五仍未发）|
| 5 | ~~三条新候选规则是否升正式（G1/G2/G3）~~ | Nancy | ✅ **2026-07-30 owner 拍板全部升正式，已 push `21182c06`**。G2 按建议与轮二 G1 合并成 §M-DISCIPLINE.SCOPE 通则；G1 落 §2a；G3 落 M-INTEGRITY §I7（并吸收轮五新发现的「依附几何」第 ③ 项）|

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

| 类别 | 数量 |
|---|---|
| `use_figma` 调用 | 约 42（其中 3 次因 Figma 节点 getter 抛错原子失败后修正重跑：`RECTANGLE.findAll` ×2 / `VECTOR.findAll` ×1 —— 教训：不能用 `typeof n.findAll === 'function'` 探测，属性访问本身就会 throw，须按 `type` 白名单判断） |
| `get_screenshot` / 内联截图 | 5（sub-Section 全景 · 两端 REFERENCE · L3 · L1.5 · 合并后 AFTER） |
| 新建节点 | 6（B1 主菜单帧 + B1 caption + 1080i60 行 + Receiver/Encoder 两行 + B4→B5 连线）+ 分叉连线 group（4 元素） |
| 删除节点 | 4（重复起点 clone `9592:366` + 其 caption + 64 高连线 + 空 sub-Section `9592:365`） |
| 移动 / 重排 | 12（4 帧 + 4 caption 跨 Section 迁移 + 4 张交付卡重排） |
| 文本重建（走 M47.2） | 20+（caption ×9 · UX 卡 4 段 · PRD §4b/§5b · Journey stage1 · Config-T REFERENCE caption） |
| 机检轮次 | 8（三 Section I2/I3 · 连线锚点 ×2 · glyph · 字体分布 ×3 · palette · B5 gutter ×2 · page 级 I2 ×3） |
