# 协作复盘 — V4-1646 第三轮（D23 推翻 D17）

> 面向 UX 团队 / PM 内部分享。记的是**人与 AI 协作过程**里哪里顺、哪里绕了弯，不是设计结论（结论在
> [design-record](specs/2026-09-10-v4-1646-lcd-wifi-other-design-record.md) 与 [handoff](handoffs/2026-09-10-v4-1646-lcd-wifi-other-handoff.md)）。
> 日期：2026-09-11 · Session：单次（接第二轮收尾）· 交付：W3
> 前一轮复盘：[2026-09-10](2026-09-10-v4-1646-lcd-wifi-other-mockup-retrospect-internal-share.md)

---

## 1. TL;DR

- **交付**：D23 落地 —— `Security` 字段整个取消，加密类型改为在密码步骤前置告知；Figma 收成 8 帧 + 3 卡 + 9 连线；DS 回流 7 条已提交；Jira 已交付并转单。
- **核心 process gap 数**：5 条（1 条是**上一轮同一病灶的第二次发作**，2 条是 scope 没取全集，1 条是我自己造的伤，1 条是沟通格式）。
- **关键 insight**：owner 这轮用五个字（「不是可编辑的」）推翻了一整个模块，而**正解在另一个端的设计稿里躺了十个月** —— Config-T `4900:61500` 那一轮（2025-11-06）的页面标题逐字就是 `Change the WiFi security value from WPA-PSK to WPA2-PSK`，它做的正是「把 `Security:` 行设为不可见、把加密类型折进标题句」。我在 D17 那轮查了两级先例（本页 → 本产品同类页），**唯独没查对端同一个功能怎么演进的**。

## 2. Session 概览

| 项 | 内容 |
|---|---|
| 起点 | 接第二轮收尾，三件挂在 owner：面板行高 44px · 失败文案 WPA3 误导 · 回流七条 |
| 中途转折 | owner 答第二问时顺手给出 Config-T 参考链接 + 一句「只有 WPA2、不可编辑」⇒ **D17 作废** |
| 最终落地 | 删 C2/C3 两帧 + 3 条连线（14 节点）· C/F/H 三帧隐两行 · E 帧加内联提示 · 补「无密码」分支 · 三卡 11 个文字节点同步 · 文案真源新增 §4.5 |
| process artifacts | plan §1b-4（D23 落地表 + 三个机检盲区）· handoff §4.9/§4.10（机器输出 + 两个 surface 的扫描）· 两份走查报告加 D23 订正块 |
| 提交 | TVU Pack `6c53a4e` + `0d9311d` · DS `07f1f673` + `ab33c1fc`，均已 push |

## 3. 主要迭代

| # | 触发 | owner feedback 逐字 | 改动量 |
|---|---|---|---|
| 1 | 我自发起手复验 | —（无 feedback）| 复验第二轮 D17–D22 全部仍成立；订正 4 处文档 drift（US 档位写错 · 失效文案串 · Stage 2 表过时 · Section 尺寸旧值）|
| 2 | 我问三件待拍 | 「目前只有 WPA2 这种类型，而且不是可编辑的，直接在输入密码的时候提醒是 WPA2，参考这里的文案：<Config-T 链接>」| 🔴 D17 作废 |
| 3 | 我摆出「两句都是你说的」的冲突 + 前提差异 | 「无密码根本不会弹出输入密码框；有密码时就是 WPA2的」| 新流程形状定案（分支在后端不在 UI）|
| 4 | 我问 44/46 还执行吗 | 「跟着 Security 定调走」| 面板已删 ⇒ P18 消解，不动行高 |
| 5 | 我列「R8 待拍板」只给了代号 | 「R8是什么规则？下次有类似的，除了代号，也需要告诉我具体是什么规则我才好判断」| 已存 memory；本文件与 plan §9a 都改成「代号 + 规则本体 + 实证」|

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

### G1 🔴 没查「对端同功能的演进史」——上一轮那条 gap 的第二次发作

- **实证**：D17（09-10）我按 §M21.4 查了两级先例：本页 → 本产品同类页。两级都没有「只读值行」先例，于是我把它判成真·新值并自立方案（二选一枚举 + canonical 选项面板）。而 Config-T 同一个功能在 2025-11-06 就已经收敛过：`892:5319`（487×310，有 `Security:` 行）→ `4900:61500`（487×**254**，矮一行，该行 `effVisible:false`，加密类型折进标题句）。
- **返工成本**：两帧建了又删（含 canonical 面板 + 6 点阶梯绿框 VECTOR）· 3 条连线 12 个部件 · 三卡 11 个文字节点 · 文案真源两次订正 · 两份走查报告各加一个订正块。**约等于第二轮一半的工作量。**
- **和上一轮的关系**：第二轮复盘的头号 gap 是「给方案推荐前没先查既有设计稿」（那次是 LCD 自己的 V4-1535 里 `Other` 行早就画过且就是参与翻页）。**同一个病灶，搜索面从「本产品历史」扩到「对端历史」，我只补了前一半。**
- **回流候选（新）**：§M21.4 的两级先例搜索，对**「四面一致」类需求**（同一 feature 在 LCD / Config-T / WebR / phone 多端都有）不够 —— 要加一级「**对端同功能的演进史**」，且判据是「查该功能在对端的**最近一次改版**做了什么」，不是「对端现在长什么样」。⚠️ 本轮真正给出答案的不是 Config-T 的现状，而是它**改版那一轮的标题**。

### G2 🟡 改一处忘了同族其它帧（F / H 两帧漏改）

- **实证**：D17 当初是给 **C / F / H 三帧**都加了 Security 行；我改 D23 时按「表单页」这个心智模型只找了 C。靠按对象全集扫（`findAll` 全部 `Field row /` + 逐帧 `effVisible`）才发现 F/H 还是可见的。
- **性质**：规则已有（§M-DISCIPLINE.SCOPE「scope 由对象全集推导，不由我做了什么推导」）⇒ 这是**执行没落地**，不是缺规则。差点交付出「同一个表单在三帧里长得不一样」的自相矛盾稿。

### G3 🟡 上一轮「零残留」的结论 scope 不全

- **实证**：第二轮的旧措辞扫描只扫了 feature Section `10343:4`，没扫文案常驻页 `10167:2` ⇒ 常驻页卡里还留着 D21 已作废的「8px from the frame top」。同一页还被机检抓出 `Jira V4-1646` 是纯文本没超链接（违反 §M23.8.1）—— 而第二轮 handoff 记的是「`--node 10167:2` 三条规则全过」。
- **教训**：**「零残留」是一个带 scope 的断言**，写结论时必须把扫描面一起写出来；只写结论会让下一轮误以为整件事都查过了。

### G4 🟡 等长替换也会毁样式（我自己造的伤 = R8）

- **规则本体**：`node.characters = 新文本` 会让整串**继承第 0 个字符**的 `hyperlink` / `textDecoration`；而「逐段回贴样式」的标准写法**只加不减**，继承来的链接没人清。⇒ 必须先 `setRangeHyperlink(0, len, null)` + `setRangeTextDecoration(0, len, 'NONE')` 全清，再逐处加。
- **实证**：改日期戳 `2026-09-10`→`11`（**等长**替换，理论上最安全的改法），UX 卡与 Journey 卡的整条 meta 行变成超链接。PRD 卡同样操作没事 —— 只因它第 0 字符是 `P`（`PRD · `）本来没链接。⇒ **「有个节点没出事」不能反推安全。**
- **为什么现有规则没拦住**：§M47.2 覆盖的是 `fontName / fontSize / fills / lineHeight` 这类**每段都有值**的属性；`hyperlink` / `textDecoration` 是**稀疏属性**（多数段没有），逐段重设对它们天然漏底。

### G5 🟢 提代号不提内容，等于把判断成本推回给 owner

- **实证**：见 §3 第 5 行。已存 memory `name-the-rule-not-just-the-code`（最小格式：代号 + 一句规则本体 + 一句实证 + 建议落点）。
- **边界**：这条和「跟用户汇报要精简」不冲突 —— 精简指去掉过程细节，**不是把判断依据一起去掉**；对外 Jira 评论要极简，对 owner 要「判断所需信息完整」。

## 5. 高效对话建议

**给 UX / PM（提需求方）**

1. **否决时点出「哪条前提不成立」，比点出「结论错在哪」省一整轮。** owner 这次说的是「不是可编辑的」（前提），不是「二选一不好」（结论）—— 我立刻知道要改的是字段性质，而不是面板的视觉。
2. **答问题时顺手贴一个参考链接，ROI 最高。** 那一条 Config-T node 链接把我从「设计一个方案」变成「照一个已定范式收敛」，本轮最有价值的单次输入。
3. 反过来说：**如果这个 feature 在别的端已经做过，开工时就说一句「Config-T 那边是这么做的」**，能直接省掉 D17 整轮。

**给 AI 协作流程**

4. 起手 probe 清单里加一条硬问题：**「这个 feature 在别的端有没有实现？它最近一次改版改了什么？」**
5. 写「零残留 / 全部通过」这类断言时，**把扫描面连同结论一起写**（G3）。

**给 review 方**

6. owner 这轮在我贴出「两句都是你说的 + 前提差异」之后才给第二句话定案 —— **把冲突摆出来让他裁，比我自己挑一种解释执行要快**，前提是我得先把两种读法的代价都算出来。

## 6. 回流规则清单

| 规则 | 真源 | 状态 |
|---|---|---|
| R1 `clone()` 落点不可假设 | `figma-technical-reference.md` Q15 sub-clause | ✅ `07f1f673` |
| R2 几何自检统一坐标系 + 折线按线段 | `mockup-conventions.md` §I6/§I7 sub-clause | ✅ 同上 |
| R3 `overlap` 闸 parent-scope 盲区 | 同上（并入 R2 那条） | ✅ 同上 |
| R4 变量绑错 ≠ 未绑（含「不能按同名节点 join」的量法） | `mockup-conventions.md` §M-COLOR sub-clause | ✅ 同上 |
| R5 canonical 单实例不构成排布先例 | `domain-tvu.md` §M17 通则 sub-clause ① | ✅ 同上 |
| R6 Change Log 注释分档（W1 必产 / W2 建议 / W3 免除） | `skills/tvu-design-mockup/SKILL.md` §6-JIRA.W | ✅ 同上 |
| R7 落位类取值按宿主顶部结构分族 | `domain-tvu.md` §M17 sub-clause ② + `mockup-conventions.md` §M37.3 硬约束 4 | ✅ 同上 |
| **R8** `characters` 赋值继承第 0 字符的 hyperlink/decoration ⇒ 先全清再逐处加 | `mockup-conventions.md` §M47.2 sub-clause | ✅ `e6abd3ca` |
| **新（G1）** 「四面一致」类需求的先例搜索要加一级「对端同功能的最近一次改版」 | `design-process.md` §M21.4 ③ | ✅ 同上 |

> **2026-09-11 收尾补记 —— G1 落地时发现的一个真张力**：§M21.4 原文明写「⛔ 别把搜索面扩到**别的产品**」（实证 RPSV3-134：从 Config T 整块搬 Power 模块被 owner 判「参考图是让你参考，没说照搬」）。G1 的第三级若不划边界，会与这条读成自相矛盾。落地时按**搜的是什么**分开：①② 搜**视觉取值先例**（止于产品），③ 搜**同一个功能的决策史**（同产品的另一个端）。一句话判据：**搬视觉风格 = 禁；查同一功能的决策史 = 要。**
>
> ⛔ **暂不镜像到 `code-conventions.md` R6.1**（该条与 §M21.4 是 mirror pair、原文写「改此条必同步对面」）—— 本条实证全在 mockup 侧，code 侧无同病灶。不预先镜像一条没有实证的规则，已在 mirror 声明处写明理由与解除条件（code 侧命中一次再同步）。

## 7. Model 选型

**Opus 5（1M context）** —— 这轮的价值集中在两处，都是小模型档做不了的：

1. **一句话推翻决策后自己找出全部受影响面**：D17 的痕迹散在 8 个产品帧、3 张交付卡的 11 个文字节点、2 份文案真源、2 份走查报告里。漏一处就是自相矛盾的交付物（G2 差点发生）。
2. **跨仓一致性核对**：回流七条要同时改 4 份 DS 真源，还要让 DS 自己的三个元闸（`rule-load-map` / `rule-number-collision` / `acceptance-gate-coverage`）都过 —— 其中 `acceptance-gate-coverage` 那条是**我先违反、再读闸的头注释才想明白「改自陈就是谎报」**。

⚠️ 反过来说：本轮**不该**用大模型的部分是那些纯机械核对（旧措辞正则扫描、几何两两求交），它们应该是脚本。见 §8。

## 8. Action items

| # | 事项 | 归属 |
|---|---|---|
| 1 | ~~**R8 拍板**~~ → ✅ **owner 2026-09-11 拍板升 DS 规则**，已落地 `e6abd3ca` | 已解 |
| 2 | ~~**G1 那条要不要立规则**~~ → ✅ **owner 2026-09-11 拍板立规则**，落 §M21.4 ③，已落地 `e6abd3ca` | 已解 |
| 3 | DS 仓 `docs/STATUS.md` 已在本轮收尾更新 | ✅ |
| 4 | **两条线并行同一个仓，起手开 `git worktree`** —— 本轮撞了两次 `git index.lock`、还替对面修了一处拦全仓提交的孤儿锚点。CLAUDE.md 已有这条，本轮是「明知有并行 session 却没开」的实证。**🔴 2026-09-11 收尾轮第二次发作、且形态更糟**：我据「HEAD 没动 + 脏文件是一周前的」判定「没有并行 session」而没开 worktree —— 那只是**一个时间点的快照**，不构成「接下来一小时也没有」。实际对面 session 在我工作期间 `checkout` 到了 `docs/infra-f143-b1-not-closed` 并提交两次，**我的规则回流 commit 直接落进了别人的 feature 分支**。⇒ 修法：保 patch → `reset --soft HEAD~1` + 只 `restore` 我那三个文件（不碰对面的脏文件）→ 给 `origin/master` 开 worktree（软链 `node_modules` 让闸能真跑）→ `git am` → 六闸复跑 → fast-forward 推 master → 拆 worktree。**判据要改**：「有没有并行 session」⛔ 不能靠快照判，要靠「**这个仓最近是否活跃**」——活跃就开，开 worktree 的成本远低于把 commit 从别人分支上摘回来 | 流程 |
| 5 | 旧措辞扫描 / 几何两两求交这类机械核对**应该脚本化**（每轮手写一次 use_figma 脚本，且本轮还写错了两次量法 —— 见 R2/R4 的量法补注） | 工具侧 |
| 6 | ~~V4-2333 的 `9988:423` / `9988:690` 落位不合通则，独立立项~~ → ✅ **同日关闭**：owner 判为误判，从待修名单划掉；落位通则收窄（设置页那档加「导航条正下方不是提示所指代的控件行」前提）| ✅ 已关闭 |
