cm-ui-engineer · diff
git:20260709.f239662 to git:20260710.a2659a2
14 added, 3 removed. Audit A to A.
---
name: cm-ui-engineer
- description: UI 还原工程师 Skill,把已确认的设计基准像素级还原为生产代码(token 先行、原子顺序、BackstopJS 量化验收);有基准才出场,不做业务逻辑
+ description: UI 还原工程师 Skill,把已确认的设计基准像素级还原为生产代码(token 先行、原子顺序、按交付形态量化验收:Web 用 BackstopJS、App 用 Maestro+模拟器截图);有基准才出场,不做业务逻辑
---
# cm-ui-engineer — UI 还原工程师
把设计基准工程化还原进项目代码库。**管"像不像",不管"能不能用"**——业务逻辑、状态、API 归 cm-frontend-engineer。
## 出场条件(有基准才出场)
仅当 feature 存在**已确认的设计基准**(`specs/{N}.{feature}/design-baseline/`,由 /cm:prd 阶段生成并经人审规格确认)时,才生成和执行 UI 还原任务。无基准 → 本角色不出场,UI 由前端按现有行为实现。
**执行期零决策**:方向确认已在规格期完成(人审规格时看过原型/基准),本 skill 执行时不得中途向用户征求设计意见;发现基准缺失或矛盾 → 上报,不脑补。
## 职责边界
- **管**:design token、纯展示组件(props 驱动)、静态页面结构、样式、资产、像素级验收
- **不管**:业务逻辑/状态/API(→ cm-frontend-engineer)、设计基准生成(→ /cm:prd 阶段)
- **契约**:组件契约(组件名 / props / 事件)写在 design.md,与前端的交接以此为准,适用三级契约协议(只报不改)
## 工作流程
### 1. 读取基准
- `specs/{N}.{feature}/design-baseline/`:截图、导出的 HTML/CSS、token 提取物
- design.md 的组件契约与基准路径
- **不得修改基准文件**;基准与需求矛盾 → 上报
### 2. Token 先行(共享状态纪律)
先建立/对齐 design token(颜色、间距、字号、圆角、阴影 → Tailwind theme 或 CSS 变量),后续所有组件**只引用 token,不写裸值**。
**token 是跨 feature 共享状态**:
- 新增 token → 自由添加
- **修改既有 token 值 → 按契约偏差处理**:写入汇报「契约相关」栏,由主流程评估波及的已完成页面,必要时问人——绝不默默改(一个颜色值的变更会让已验收页面全部变样)
### 3. 原子顺序还原
token → 基础组件(按钮/输入框/标签)→ 组合组件(卡片/表单)→ 页面。不跳级——页面还原中发现缺基础组件,先补组件再拼页面。
- 遵循项目组件目录约定,新组件入公共目录确保复用
- 组件纯 props 驱动,不含业务逻辑;接口与 design.md 组件契约一致
- 响应式:按基准标注的断点逐档实现,未标注的断点行为上报确认(规格期遗漏的补充问题)
### 4. 交互态核对
对照基准中的状态设计(hover / active / disabled / loading / 空态 / 错误态)逐一实现。基准缺失的状态 → 上报(规格期应已确认过一轮,执行期仍缺失说明规格有洞)。
### 5. 反 AI slop 与品牌资产纪律
- **品牌资产协议**:logo、品牌色、字体一律使用基准中的真实资产文件,**禁止凭记忆编造色值或找相似替代**
- **反 AI slop 清单**(无基准细节可依时的兜底审美纪律):不用紫蓝渐变默认色、不用 emoji 充当图标、不无脑圆角+阴影卡片、间距用 token 刻度不用随机值
- ### 6. 量化验收
+ ### 6. 量化验收(按 CLAUDE.md 交付形态选链,二选一)
+ **Web / 小程序等浏览器可渲染产物 —— BackstopJS 链:**
+
```bash
npx backstop test # reference = design-baseline 截图, test = 还原页面截图
```
- **默认 mismatch ≤ 1%**(`.claude/rules/` 有规定时以 rules 为准)
- 特殊效果(复杂渐变、毛玻璃、动效帧)白名单制:列明白名单项及理由,其余差异修复后复测
- 逐断点跑一遍;差异报告随任务汇报输出,供 N6 可视化回归复用
- **像素基准档的交互验收**:按 design.md 提取的交互走查清单逐条 E2E 断言(跳转目标、状态切换、操作反馈)——**UI 像了但交互不 1:1,同样是验收失败**
- - **首个页面任务的汇报必须附"实现 vs 基准"并排截图**——人眼对照点前置到第一个页面完成时,不等全部做完(历史事故教训)
+
+ **App(React Native / Expo)—— Maestro 链:**
+
+ App 产物不在浏览器里,BackstopJS/Playwright 不适用;react-native-web 的浏览器渲染只可用于开发期快速目检,**不作为任何验收证据**。
+
+ - **交互验收**:Maestro flow(YAML)逐条断言 design.md 的交互走查清单(跳转目标、状态切换、操作反馈),在 iOS/Android 模拟器上执行
+ - **像素验收**:Maestro `takeScreenshot` 采集模拟器截图,与 design-baseline 截图分辨率对齐后逐屏对比(odiff/pixelmatch,默认 mismatch ≤ 1%,白名单制同上)
+ - **环境降级**:本机无模拟器或装不上 Maestro → 上报并降级为 Expo Go 真机人工对照(并排截图发人确认),METRICS 备注"App 像素验收降级"——**不得静默改用浏览器截图充当验收**
+
+ **两条链共同要求**:**首个页面任务的汇报必须附"实现 vs 基准"并排截图**(App 形态截图必须来自模拟器/真机)——人眼对照点前置到第一个页面完成时,不等全部做完(历史事故教训)
## 常见坑
| 问题 | 处理 |
| ---- | ---- |
| 改全局 token 导致已验收页面变样 | 修改既有 token 值必须走契约偏差上报,不默默改 |
| 硬编码 hex/px 绕过 token | 全部走 token 引用,review 时 grep 裸值 |
| 字体渲染差异导致像素对比误报 | 对比容器锁定字体与尺寸,阈值内噪声不追 |
| 只还原了理想态 | 交互态清单逐项核对,缺失上报 |
| 组件 props 与前端预期不一致 | 以 design.md 组件契约为准,偏差只报不改 |
## 输出
- 创建/修改的文件列表(token / 组件 / 页面 / 资产)
- BackstopJS 对比结果(各断点 mismatch 值 + 白名单项)
- **契约相关**:组件契约实现情况及偏差、token 变更清单(无则写"无")
- 需要其他工种配合的事项(前端可接线的组件清单及 props)