---
marp: true
theme: tvu-dark
paginate: true
size: 16:9
header: 'RPSV3-134 Power Control 复盘 · 2026-08-31'
footer: 'NancyZeng0210 × Claude Opus 5 · 内部分享'
---

<!-- _class: lead -->
<!-- _paginate: false -->

# RPSV3-134 · Power Control
## 复盘：AI × UX 协作真实过程

**Nancy Zeng** · UX Designer
**Claude Opus 5 (1M context)** · AI 协作伙伴

2026-08-31

---

## TL;DR

- **总轮次**：6 轮用户输入 · 约 39 次 `use_figma` · 14 张渲染核图 · 4 轮机械总闸
- **最终交付**：5 张 1920×900 全景态 + BEFORE 对照 + 5 状态标签 + PRD / UX / Journey 三卡 + Jira 组件 + REFERENCE Section
- **Process gap**：6 个 —— 1 个由用户纠正，5 个由机检 / 自查抓出
- **规则回流**：DS catalog 2 处（`db7a5cee`，双 remote 已 push）

> **两次我把「我的检查通过了」当成「规则满足了」——而两次的判据都不是同一个东西。**

---

## 1 · Session 概览

**起点**：用户给三样东西 + 一句话

- 一条 Slack thread（Kalpesh 提「新版 RPS 设置界面没有 Reboot」）
- 一张 Config T 效果图（参考）
- 一个要改的 Figma 帧（基线）
- 「重启和关机都需要」

**落地**：走完 8 步 Jira gate，M50 kickoff packet `--check` exit 0，机检逐条核归属后交付

---

## 交付物一览

| 交付物 | node |
|---|---|
| 交付 Section（11000×3223） | `6554:1028` |
| 5 张全景态 | Default / 2×confirm / 2×in-progress |
| BEFORE 对照帧（Section 外） | `6564:608` |
| PRD / UX / Journey 三卡（统一 680 宽） | `6566` / `6568` / `6570` |
| REFERENCE Section（参考图 + 去向卡） | `6573:715` |

---

## 2 · 时间线（前半）

| # | 触发 | 发生了什么 |
|---|---|---|
| 1 | 初始需求 | 解码 Slack + Jira；**发现项目 handoff 有一条相反警示**，判定不冲突后向用户明说 |
| 2 | **MCP 全断** | 三个 connector 全掉，我停在半空 —— **用户先问「出问题了？」我才说明** |
| 3 | 用户拍板 ×2 | 页内 Power 分区 + 三档状态 → 定 5 帧范围 |
| 4 | 用户拍板 ×4 | **图标那问推翻了我的结论** |

---

## 2 · 时间线（后半）

| # | 触发 | 发生了什么 |
|---|---|---|
| 5 | 枚举 644 icon + 渲染 | 发现 reboot 其实有；standby 是月亮 |
| 6 | Gate A → 「可以」 | 开建，约 200+ 节点 |
| 7 | 机检 1451 findings | 逐条核归属：绝大多数在 clone 的库组件内部 |
| 8 | 机检抓 89 条 `Inter` | 第一次修**无效**，第二次才对（91 → 2） |
| 9 | 「提交 / 收尾」 | `db7a5cee` + push + 本复盘 |

---

<!-- _class: lead -->

# Gap ①
## 拿「搜索 miss」当「库里没有」

**唯一一个由用户纠正的 gap**

---

## Gap ① · 发生了什么

我查了四个同义词，全部 miss：

```
search_design_system "power off icon"                → miss
search_design_system "reboot icon"                   → miss
search_design_system "restart refresh circular arrow"→ miss
search_design_system "shutdown device"               → miss
```

于是我写下：**「TVU UX Design System 新库里没有 power / reboot / shutdown 图标」**

用户答：**「从 DS 库中选取对应的图标」**

---

## Gap ① · 真相

**库里 reboot 语义是有的** —— 只是叫 `icon/load/refresh`，归在 `load` 命名空间。

关键词搜不到，是因为**库不用 power/reboot 这些词命名**。

### 反向同源的坑

`icon/Setting/standby` —— 名字最像电源开关

**渲染出来是 🌙 + Z（睡眠）**

⇒ 「名字像」和「搜不到」是同一个坑的两个方向

---

## Gap ① · 唯一可靠的判据

| ❌ 不是判据 | ✅ 是判据 |
|---|---|
| 关键词语义搜索 miss | 枚举**发布目录全集**（644 icon） |
| 名字看起来对 | **渲染核形状** |

**返工成本**：1 轮用户纠正 + 结论推翻 + 3 次额外 probe

**已回流**：DS `figma-component-catalog.md` §已确认缺失的 icon 语义

---

<!-- _class: lead -->

# Gap ②
## 探针对着自己的实现设计
## 而不是闸的判据

---

## Gap ② · 89 条假绿

修完注释层字体后，我自己扫了一遍：

```js
getStyledTextSegments(['fontName'])
→ remainingNonCompliant: 0    ✅ 我认为合规了
```

重跑闸：

```
typography-icon FONT — annotation-font-roboto-noto (89)
  e.g. ... fonts=Inter
```

---

## Gap ② · 根因

`createText()` 把 **Inter 记在节点基础 style** 上。

`setRangeFontName` 只**添加分段 override**，不替换基础样式。

| 我查的 | 闸查的 |
|---|---|
| 分段属性（override） | 节点基础属性 |

**两个不同的东西。** 改设节点级 `fontName` 后：**91 → 2**

> 探针要对着判据设计，不是对着自己的实现设计。

---

## Gap ③ · 工具失效没有主动播报

Figma / Slack / Atlassian 三个 connector 全断。

我停止推进 —— **直到用户问「出问题了？怎么没继续啊」**。

### 应该做的

工具失效是**阻塞事实**，应立即声明：

- 重连方式
- 断连前已拿到什么
- 期间还能推进什么

⇒ 不要让用户从沉默里推断

---

## Gap ④⑤⑥ · 三个较小但同样值得记

| # | Gap | 教训 |
|---|---|---|
| ④ | 设节点级字体**清掉了**刚给 `①-⑤` 绑好的 glyph 字体 | **顺序有依赖的修复，每步后要重验前序** |
| ⑤ | 从参考图取的 padding `20` 不在 spacing scale 上 | 「按比例算」是第一步，**「吸附 scale」是第二步** |
| ⑥ | 弹窗文案 wrap 后卡高 145→166/187，**居中失效** | 依附几何的定位要在尺寸变化后**复测** |

---

## 3 · 建议：给提需求方

1. **给参考图时说明图里是什么状态**
   本轮参考图那两个按钮是**禁用态**（`Button/Disable` + 虚线 + 灰字）。靠 probe 才发现，照抄就会把 disabled 当默认态交付。

2. **领域事实越早给越好**
   「关机需现场开机、重启不需要」直接决定两个弹窗文案**不能共用** —— 这是本轮最关键的设计输入，且只能来自你。

3. **纠正 AI 时可以只指方向**
   「从 DS 库中选取」没告诉我图标叫什么，但足以让我去枚举全集 —— 比替我找答案更省你时间。

---

## 3 · 建议：AI 协作 + review 方

### AI 协作流程

4. **让 AI 交「结论 + 判据形态」，不只交结论** —— 我说「库里没有」时若被追问「你怎么判定的」，薄弱判据当场暴露
5. **环境失效即时播报**

### 给 review 方

6. **先看 REFERENCE Section 的去向对照卡** —— 逐条写了参考图 8 个特征哪些采纳 / 改写 / 拒绝**及理由**，最容易发现「擅自偏离」或「抄了不该抄的」
7. **PRD 与 UX 卡验收段刻意不重复** —— PRD = 功能级，UX 卡 = 界面级，别当漏写

---

## 4 · 规则回流

| 规则 / 事实 | 落点 | 状态 |
|---|---|---|
| Notification 变体订正（32→36 · type 改名已落地 · pop confirm 无标题层 · 改文案会改卡高） | DS catalog | ✅ `db7a5cee` |
| 已确认缺失的 icon 语义（关键词 miss 不是判据） | DS catalog | ✅ `db7a5cee` |
| 本文件 token 映射（标题应绑 `Text_1` 而非 `Heading & Button`） | 项目 design-record | ✅ |
| **候选：探针要对着判据设计** | 待 owner 拍板是否升 `meta-rules.md` | ⏳ |
| **候选：顺序依赖修复要重验前序** | 同上 | ⏳ |

⚠️ 两条候选**未自行写进 DS 真源** —— 规则级抽象需 owner 先认定「是规则级问题、不是一次性失误」

---

## 5 · Model 选型

**本轮**：Claude Opus 5 (1M context)

- 单 session 读 3000+ 行规则真源
- 1451 条机检 finding 逐类核归属
- 未触发上下文压缩

**建议**：同类 Jira-gate mockup 继续用 Opus 5 —— 规则体量大 + 机检归属判断需跨多轮保持一致判据，小模型易在「哪条 finding 属于谁」上失准

**可下放但本轮未拆**：纯执行段（批量建节点 / 批量改属性），拆出去的协调成本高于收益

---

## 6 · Action Items

| # | 事项 | 备注 |
|---|---|---|
| 1 | **Jira / Slack 回复待发** | owner「等我看了再说」⇒ 本轮不发；发前需补 accountId |
| 2 | **提 DS backlog：电源图标入库** | Config T 双图标 promote 进 DS，设备本地 UI 普遍需要 |
| 3 | **`library-binding` 闸 exit=2** | 无离线缓存 ⇒ 既不 pass 也不 fail，需明确降级语义 |
| 4 | 重启失败反馈未覆盖 | 已在 Journey 卡 Stage 5 标 GAP，待建单 |
| 5 | `retrospects/README.md` 指向缺失文件 | 引用了不存在的 `RETROSPECT_FORMAT.md` |

---

<!-- _class: lead -->

# 一句话收尾

> **6 个 gap 里，5 个是机检和自查抓出来的，1 个是用户抓出来的。**
>
> **而那 1 个恰恰是机检抓不到的那类 ——**
> **「我用错了判据」。**

机器能查我做得对不对，
**只有人能查我判断的依据对不对。**
