初始化提交:contentm_agent 工作区全量快照

内容分四块:
1、产品规划产出 —— MCN 短视频整合营销工作台的①段五份(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)、②段两份(2a 功能/2b 布局)、③段界面(DESIGN.md 契约与令牌表 + mcn-workbench.html 原型 + 实测/会诊/审查三份 + 23 张闸门截图)。
2、开源竞品调研 —— 5 个内容工作台项目的取证原始件与 1b 系列分析文档。
3、参考资料 —— 竞品视频抽帧 1145 张 + 2 个源视频 + 功能点截图。
4、机制侧 —— 协作脚本与状态台账、工作区记忆日志、抽帧/OCR 脚本。

.gitignore 只排运行时日志、脚本备份副本与一次性探针输出,其余按原样入库。
This commit is contained in:
WorkBuddy committed 2026-10-08 08:13:02 +08:00
commit df56c2c137
1773 files changed
+205840

No files matched your search

@@ -0,0 +1,247 @@
---
name: product-planning
description: 产品规划总入口(唯一入口),四段式调度:① 产品需求 ② 产品功能 ③ 界面交互 ④ 原型说明文档。四段以 references/stage-* 承载,本文件是总调度与约束。可整段跑也可只调一段。当用户要做产品规划、从零做新产品、只做某一阶段、或不知道从哪开始时调用。
---
# 产品规划总入口
> 本 skill 由模型按需自动加载,没有斜杠命令。对话里还没定出对象时,先按「项目与路径约定」定出 `<项目>`;定不出来就停下问用户,不要自行假设。
## 用途
用户丢来一句模糊想法(例如「我要做一个 AI 短剧分镜画布」)时,本 skill 判断该走哪一段,只做那一段的最小必要工作,产出可交付物,再推进到下一段。
本文件管调度与约束。各段怎么做,写在 `references/stage-*` 各自的文件里。
## 四段结构(可整段跑,也可只调一段)
| 段 | 回答的问题 | 子步 | 调用 | 产出物 |
|---|---|---|---|---|
| **① 产品需求** | 要做的东西凭什么成立:什么问题、为谁、为什么值得做 | 1a 需求文档(grill 压测)/ 1b 竞品分析 / 1c 用户画像 / 1d 产品策略 / 1e 使用场景 | `stage-discovery` | `docs/pm/<项目>/research/*`。其中 1b 交两种体例:`research/1b-竞品分析.md`(汇总对比)+ `research/1b-独立分析/<竞品名>.md`(独立分析) |
| **② 产品功能** | 要做哪些功能、什么不做、长成什么骨架 | 2a 产品功能 / 2b 界面布局 | `stage-requirements` | `docs/pm/<项目>/prd/2a-产品功能.md` 与 `prd/2b-界面布局.md`(两份) |
| **③ 界面交互** | 长什么样、怎么操作 | 3a 视觉规范 / 3b 原型 / 3c GPT会诊 / 3d 审查打磨 | `stage-delivery` | `docs/pm/<项目>/DESIGN.md`、`designs/<项目>/*.html`、`designs/<项目>/3c-GPT会诊.md` |
| **④ 原型说明文档** | 每个状态有哪些场景、每步做什么、边界在哪、坏了怎样 | 4a 场景盘点 / 4b 说明区 / 4c 演示引导 | `stage-proto-doc` | 同一份原型 HTML 里的说明区与演示引导 |
四段只通过落盘文件耦合。段间交接口如下,这是唯一的契约,越界即失效:
| 交接 | 由谁给 | 给什么 | 给到哪为止 |
|---|---|---|---|
| ① → ② | ① | 问题定义、需求澄清决策表(含 grill 压测的 B 节:做成什么样 / 哪些情况不成立 / 状态怎么流转)、取证结论(1b 汇总对比体 + 1b 独立分析体、1c 用户画像)、产品定位、《使用场景》=用户故事(②段功能的直接推导依据) | 功能清单归②段产出,1a 写到需求与形态为止 |
| ② → ③ | ② | 功能清单(每条带优先级 + 状态流转)、界面布局(有哪几页 / 每页几个板块 / 板块怎么排 / 跨页关系)、每页主操作、信息承载分档(主屏常驻 / 可点入) | 视觉归③段。骨架必须给全,骨架不给全,③段就一版一个样 |
| ③ → ④ | ③ | 已跑通的单文件原型 HTML | 说明区与演示引导归④段 |
> 口径:②段钉骨架,③段做皮肉。用户原话:「3 是负责设计和交互,页面关系和布局必须在第二步确认清楚,不然第三步没有方向 一会一个样子」。②段要给全的是有哪几页、每页几个板块、板块怎么排、跨页关系;③段不许增删移动板块,缺板块回②段改。配色 / 字体 / 间距 / 组件样式 / 动效,以及每个板块的视觉与交互实现,都归③段。
> ②→③ 最容易搞坏。旧病灶:②段说「必须能读到」,③段读成「必须常驻主屏」,五类信息就全铺一屏成了信息墙。分档表把「读到」明确成「一次点击内可达」,防的就是这句歧义。骨架是灰块(有哪些块、什么顺序),③段给的是视觉与交互实现(排版、点哪有什么反馈、空态、响应式)。两件事各管一维,③段不会退化成照抄。
> 四段各占一个词,互不共用(2026-10-02 定):产品 / 功能 / 界面 / 说明。改段名前先对照这张表;两个段名里出现同一个词,边界一定在漂。旧名「调研与方案 / 需求与结构」都含「需求」,③段旧名里的「交付」是三段共有的属性,都属名实不符,已改。
> ①叫「产品需求」不叫「需求调研」:该段产出 `research/1a-需求文档.md`、`1b-竞品分析.md`、`1c-用户画像.md`,也产出 `1d-产品策略.md`、`1e-使用场景.md`,「调研」二字盖不住后半截。
> ⭐ 1b 是①段唯一交两种体例的子步(2026-10-07 用户定案「竞品分析 有独立分析也有汇总分析 都应该要用上」):独立分析体 `research/1b-独立分析/<竞品名>.md`(竞品池每一个一份),汇总对比体 `research/1b-竞品分析.md`(恒一份)。职责边界见 `references/stage-discovery/references/competitor-analysis.md` §0.4。
⭐ `grill-me` 全场只有①段一份(2026-10-06 用户定案):用户原话「grill 也应该拿到第一步了,第二部就是细化功能」。①段那份按 A / B 两节提问:A 节问「要做什么、为谁、边界在哪」,B 节问「做成什么样、哪些情况不成立、状态怎么流转」,B 节结论落进 `research/1a-需求文档.md`。
⭐ ②段产出两份(2026-10-06 收窄,2026-10-07 定为两份):用户原话「不需要 就用使用场景,其余6分都不需要了」「2 产品功能 和 界面布局不就是两个文档嘛」。`prd/2a-产品功能.md`(功能清单:做哪些 / 不做哪些 / 每条带优先级 + 状态流转)与 `prd/2b-界面布局.md`(页面关系 + 页面内板块布局)。
(交接口反转前的口径、②段收窄前的产出清单与去向 → `references/_留痕/③段与总入口-旧口径.md`)
⚠️ ①段功能按「使用场景」组织(一条场景可跨多个页面),不按页面组织。
段内的子步顺序、方法论文档、硬约束、完成标准,都在各段自己的 `SKILL.md` 与 `references/` 里。
①段 1a 需求文档:全程最先做,且只做一次。用 grill-me 与用户互动,产出 `docs/pm/<项目>/research/1a-需求文档.md`(开头写清做什么 / 为谁 / 不做什么,往下是决策表)。
## 项目与路径约定(单一真源)
> 四段全部遵守本节。各段 `SKILL.md` 与 `references/` 里出现 `docs/pm/...` 时,`<项目>` 一律指本节定义的 slug。
### `<项目>` 是什么
项目 slug 用小写字母、数字、连字符(例 `my-tool`、`video-canvas`)。它同时是 `docs/pm/<项目>/` 与 `designs/<项目>/` 的目录名,两处必须同名,一个字都不能差。
### slug 怎么定(按序取第一个成立的)
| 序 | 条件 | 取值 |
|---|---|---|
| 1 | 用户在当前会话里明确说了项目名 | 该名字 slug 化 |
| 2 | `.registry/current-project` 存在且非空 | 其内容 |
| 3 | `docs/pm/` 下恰有一个非 `_` 开头的目录 | 该目录名 |
| 4 | 以上都不成立 | 停下问用户 |
写任何文件之前先核对:目标路径里的 `<项目>` 段与按上表得出的 slug 是否一致。不一致就停下说明,不要「先写了再说」——猜错会把产物写进别的项目,事后极难拆干净。
### 产物落哪
| 段 | 路径 |
|---|---|
| ① 产品需求 | `docs/pm/<项目>/research/` |
| ② | `docs/pm/<项目>/prd/`、`docs/pm/<项目>/ux/`、`docs/pm/<项目>/ux/diagrams/` |
| ③ | `docs/pm/<项目>/DESIGN.md`、`designs/<项目>/*.html`、`designs/<项目>/3c-GPT会诊.md` |
| ④ | 写进原型 HTML 自身(`designs/<项目>/*.html`),不额外落 md |
### DESIGN.md 为什么在项目目录、不在仓库根
`DESIGN.md` 是③段的绑定视觉规范,一个项目一份,③段按当前项目的 slug 去读它。仓库根只能放一份,多项目会互相覆盖,所以一律放 `docs/pm/<项目>/DESIGN.md`。
推论(硬规则):读 `DESIGN.md` 时,路径必须由本节定义的 `<项目>` slug 拼出,不许用「当前工作目录碰巧有 DESIGN.md」这类推断。仓库根不放任何项目的 `DESIGN.md`。
## 工具选择规则(防止选错,最重要的一节)
> 下表是选型总则。这些工具都已封装在对应段内,本文件只负责让你不选错;具体调用路径见各段 `SKILL.md`。
| 要什么 | 用谁 | 别用 |
|---|---|---|
| 页面设计全链(规范 → 原型 → 审查) | ③段 `stage-delivery` 自己的 D0→D5 流水线 | 另找风格库,或自己手搓一套 token 与门禁 |
| 评审用的可点原型 / 生产级前端页面 | ③段 3b(按 D2 构建,单文件 HTML 交付)。先判页型:营销页取 `open-design` 技能的 `design-templates/web-prototype/`,工具型页面取③段 `references/layouts-tooling.md` | 不判页型就套 `web-prototype` 种子——那是营销落地页骨架,会把后台做成营销页 |
| 设计规范文件 | ③段 3a 生成 `DESIGN.md`(令牌表由 `open-design` 技能选定套的 `tokens.css` 产出,加该项目②段的界面需求) | 凭空编一套 token |
| 架构图 / 流程图 / 时序图 | `diagram-design` | 手写 Mermaid |
| 状态迁移的守卫、副作用、并发 | `state-machine` | 指望 diagram-design 覆盖这些 |
| 审美方向 / 风格定调 | `open-design` 技能里选一套(读候选套 `DESIGN.md` 第 1 章,按页面类型挑) | 「米白+衬线+陶土色」这类默认审美,或凭感觉编 |
| 多方向比选 / 独立评审打分 | `oil-ui-pro` 技能(方向探索 `design-direction.md`,对比页 `style-explorer.md`,评审协议 `visual-review.md`) | 拿它的评分循环替代本段 Gate-1/2/3 |
③段的页面设计供给来自两个独立技能(2026-10-05 定),都装在 `.workbuddy/skills/` 技能仓库,都可脱离本段单独使用。`open-design` 是判据供给库:`design-systems/`(153 套,定调只从这里选)、`craft/`(13 份工艺判据:状态穷举 / 字阶 / 配色 / 动效 / 反 AI 味 / 无障碍)、`design-templates/web-prototype/`(版式骨架种子,营销页向)。`oil-ui-pro` 是界面设计方法论:五步流程(探索方向 → 建结构 → 取实证 → 独立评审打分 → 验证交付),加风格对比页与截图工具;它自带联网版本检查与自动更新,是用户明确要求全量搬入的例外项(既有纪律是「依赖外部服务一律不收」),已记录在案,不扩散。
两者平行同层级,不缝成一条流水线:多数页面走 `open-design` 主线;需要「先拉开方向让用户挑」或「独立评审打分」时,取 `oil-ui-pro`。
四样东西两个技能都没有对应,由 `stage-delivery` 自己扛:设计契约十二字段、结构骨架、交互清单、工具型版式库。
页型分流(2026-10-05 新增):`web-prototype` 的种子与 8 个骨架全是营销落地页结构(hero / features / stats / quote / CTA),自带 `.eyebrow`(眉标)与 `.lead`(副标题)。工具型页面(后台 / 控制台 / 列表 / 详情)照它做会长出「标题上下各一行小字」的三段式。本项目实测踩过这个坑,结构判据全绿也拦不住。所以③段 D0 必须先判页型,工具型页面零 `.eyebrow`、零 `.lead`、零 `.hero`,版式走③段 `references/layouts-tooling.md`。
只读一处来源:同一条判据若在 `stage-delivery` 与 `craft` 各有一份且口径不同,以本项目追加条为准,并在 runbook §3.4 显式标注「本项目追加」。
DESIGN.md 说明:`@google/design.md` 提供 `lint` / `diff` / `export` / `spec` 四个子命令,目前是 alpha(v0.4.0)。非 TTY 的管道里可能不回显输出,需在真实终端里确认。本机实测该命令完全不可用,不要拿它当校验关卡;改由 D3 收口与 D5 终检按真实像素人工复测对比度(判据见 `open-design` 技能的 `craft/color.md`)。原两把门禁脚本(静态文案检查 / 渲染机检)已随旧主干从磁盘移除,当前没有机器复现,结论只能记「人工判定」,不得写成「脚本已通过」。
## 可调用工具(自然语言触发)
> 两个随段携带的独立工具,装在③段 `references/stage-delivery/assets/` 下,按用户说法直接触发,产物落项目目录。它们都挂在③段下,不单独成段。
| 用户说 | 触发工具 | 做什么 | 产物 |
|---|---|---|---|
| 「分析 XXX 视频」「把这个视频抽帧」「拆一下这条视频的画面」 | `stage-delivery/assets/video-capture/` | 取视频(本地文件 / 直链 URL)+ 抽帧(双因素 + 首尾 + 补帧) | 关键帧 `frames/` + `frame_times.json`(供①竞品分析、③视觉参考) |
| 「获取 XXX 网站的设计风格」「抓这个网站的风格/组件/配色」 | `stage-delivery/assets/design-capture/` | 抓网页设计系统(色彩 / 排版 / 组件),生成样式模板 | 一套 `design-system-<名>/`(与 `design-system-tiaoyue` 同构,可直接被③段 D1 选用) |
两者都独立可单跑:`video-capture` 只依赖 `ffmpeg`;`design-capture` 只依赖本机 Chrome(CDP)+ `vendor/` 里搬运的抽取脚本,不需要 open-design daemon 在场。用法与边界见各自 `SKILL.md`,来源与署名见各自 `ATTRIBUTION.md`。
触发时机:①②段拆竞品视频用 `video-capture`;③段要新建样式或拆参考站用 `design-capture`。
两个工具都只做合规最小集:不抓平台页内视频,不调付费接口;抽取结果须先目视比对再采用。
## 进入方式
| 你说什么 | 模式 | 从哪开始 |
|---|---|---|
| 「规划 XX」「从零做 XX」 | 全流程(自动处理) | `stage-discovery` → `stage-requirements` → `stage-delivery` → `stage-proto-doc`,一路跑完,段间不停下来问(含①段末) |
| 「先确认方案」「跑完方案停下等我」「规划 XX,先给方案」 | 方案确认 | 同一套四段,唯一差别是①段末停下等你确认方案,确认后才进②③④ |
| 「只做产品需求」「只做产品功能」「只做界面交互」「只做原型说明文档」 | 单段 | 只调对应那一个 stage skill,不展开其他段 |
| 已有②段,要出原型 | 单段 | 直接调 `stage-delivery`,从它的 3a 起 |
| 已有原型,要补说明 | 单段 | 直接调 `stage-proto-doc`,从它的 4a 起 |
| 只问某个单点 | 单段 | 不跑任何段,在对应 stage skill 内点名子步,或直接说要看哪份方法论 |
「只调一段」成立的原因:四段之间只通过落盘文件耦合,没有隐式状态。
- ②只读 `docs/pm/<项目>/research/*` 与 `docs/pm/<项目>/strategy/*`;缺失时标注 `【假设】`继续,不催促回补①
- ③只读 `docs/pm/<项目>/prd/*` 与 `docs/pm/<项目>/ux/state-machine.md`;缺失时同样标 `【假设】`继续
- ④只读 `designs/<项目>/*.html`,另按需读 `docs/pm/<项目>/prd/*` 与 `docs/pm/<项目>/ux/state-machine.md` 校准术语;缺失时标 `【假设】`继续
## 执行规则
只有三种模式,没有第四种:
| 模式 | 段之间 | 段之内 |
|---|---|---|
| 全流程(自动处理) | 一路跑完,段间不停下来问(含①段末)。每段结束按「标准收尾格式」输出一段报告,输出完即刻进下一段 | 子步之间不反问,做完直接进下一个子步 |
| 方案确认 | 与全流程完全相同,只有一处不同:①段末停下等你确认方案;确认后②③④一路跑完、段间不停 | 同上 |
| 单段 | 不涉及 | 不越界,不催促回补前段 |
这两条是全流程模式下的两个独立分支,不要混:全流程(自动处理)没有①段末的强制停;「停下等确认方案」只在「方案确认」模式下发生。二选一由用户定(界面里点【生成原型和文档】时选「自动处理」或「先确认方案」,或在会话里直接说明);用户没明说时按自动处理走,不要在自动处理模式下自作主张停下来问。
「停下」指什么,不要读成「每一步都要反问用户」。只有这四种情况才停:
1. 信息不足且查不到,必须用户给(如「项目与路径约定」slug 第 4 条)——停下问
2. 破坏性 / 不可逆动作——二次确认
3. 用户显式要求某个子步做完停下
4. ①段末的方案确认(仅「方案确认」模式)——把方案摆给用户:做什么 / 不做什么 / MVP 边界 / 未复核的 `【假设】`,明说「等你确认方案,确认前不进②段」
段末报告:全流程(自动处理)模式下,所有段(含①)都只输出报告,不提问、不等回答;方案确认模式下①段是唯一例外,其余段同样只输出报告。
①段末的确认是回环,不是一次问答(仅「方案确认」模式):用户看到方案后可以提问题要求改,可能多轮,每轮的「问题+怎么改的」都要留痕、不得覆盖上一轮;改完由用户显式说「确认方案」才算过闸门。该模式下,没拿到用户确认的方案不得当成既定事实带进②段——这是实测踩过的坑:②段拿着未经确认的方案往下跑,把用户已拍板的需求裁掉了。
其余规则:
- 声明制(全段适用,不止③段):开工前、每进一个子段或子步、每处偏离,都要声明三件事——当前在哪、依据哪个文件的哪一节、产出落哪;偏离当场写明原因与影响,段末附偏离单。不许静默偏离。实测踩过的坑:③段 3b 交付了原型却没走当时声明的主流程、没读依据文件,也没当场说,用户追问「基于哪个 skill」才知道。
- 不做八股:不介绍方法论来源,不列人名,不复述框架历史,直接给结论。
- ⭐ 内容准则:一切落盘文字都要先过「说人话」这一关(2026-10-07 用户定案,同日扩大到规则文件)。用户原话:「当作第一步 和 第二步 生成文档时 必须遵循的内容准则」「不管是写规则 还是 写文档 都要严格按照说人话的技能去执行」。
- 适用面两类都算,只改产出不改规则等于半改。一是产出文档:`research/1a-需求文档.md` 到 `1e-使用场景.md`(5 份)、`research/1b-独立分析/`(独立分析体)、`prd/2a-产品功能.md` 与 `prd/2b-界面布局.md`(2 份)。二是规则本身:本技能包内的一切落盘文字,`SKILL.md`、`references/**`、模板与清单。
- 判据来源(单一可信源,本文件不复述模式清单):`humanizer`(55 条模式、5 种口吻档 casual / professional / technical / warm / blunt),`humanizer-zh`(24 条模式、快速检查清单、50 分制评分)。两份技能都在 `E:/ProgramData/.workbuddy/skills/`,完整判据以源技能正文为准。
- 门槛:按 `humanizer-zh` 五维评分(直接性 / 节奏 / 信任度 / 真实性 / 精炼度)≥45 / 50 才准落盘;低于 45 回炉重写。
- 五条核心原则(源技能《核心规则速查》摘引):删填充短语(开场白、强调性拐杖词);打破公式结构(二元对比、戏剧性分段、修辞性设置);变化节奏(长短交错,两项优于三项,段尾多样);信任读者(直接陈述事实,跳过软化、辩解、手把手引导);删金句(读起来像可引用的话,就重写它)。
- 交付留证:产出文档在段末报告里写明「已过内容准则,评分 X/50」;改规则文件时,在当日 memory 里记下这一关过了。
- 只调一段时不越界:用户说「只做第 N 段」,就跑该段,不展开其他段,也不用「你还没做调研」去催促。
- 提问上限 3 个:其余用合理假设,并在文档里标注 `【假设】`。例外是 `grill-me` 提问模式,不受此限(①段的「需求澄清」与②段的「需求压测」各一次),该模式的价值就是穷尽提问;此时须先声明「将连续多轮提问」,退出后恢复本约束。
- 反问优先,允许自动补全:`grill-me` 的默认动作是把问题抛给用户并附推荐答案。用户说「你定」、连续两轮不回应、或属事实类问题时,模型自行给答案并标 `【假设】`,换来「不卡住」;但每轮结束要汇出待复核清单,未经复核的 `【假设】` 不得在下游当事实用。
- MVP 边界优先:任何阶段都先回答「第一版做什么、不做什么」。
- 必须落盘:产出写入文件,不要只在对话里输出。
- 无来源就标注:任何查不到来源的数据都标为「估算」并写明口径,不编造数字当事实。
- 禁止长文:单份产出物默认一页纸(≤120 行),超长必须拆分。
## 每段的标准收尾格式
```
## 本段结论
- (3-5 条,可直接决策的话)
## 已落盘
- ...
## 待确认(最多 3 条)
## 建议下一步
→ 用 <skill-name> 完成 <具体事>
```
## 反面清单
- 为一个小功能跑完整调研
- 输出长文却给不出一个结论
- 跳过「不做什么」
- 用户只问单点,却强行拉进全链路
- 把估算数据写成确凿事实
- 跳过③段 D0 的 Gate-1(未定死令牌表与设计契约)就开写页面代码
- 在 `grill-me` 提问模式下仍套用「提问上限 3 个」,把提问做成走过场
- 只跑一次 `grill-me`:①没定义需求就去取证,或②拿①段的需求定义代替功能压测直接写②段
- 把自动补全当默认动作:用户没说话就替用户拍板,还没标 `【假设】`、没进待复核清单
- 把④的说明区写进产品功能范围,或让③顺手把说明文档一起写了(该调 `stage-proto-doc` 就调)
- 手写 Mermaid 代替 diagram-design,手写 token 表代替 DESIGN.md
- 绕过四段自己手搓,或重写它们的内容(该调 `stage-*` 就调)
- 把两个页面设计技能(`open-design` / `oil-ui-pro`)的内部路径按本 skill 目录去拼,或改它们的正文(它们是技能仓库里的供给技能,改动只写 `stage-delivery` 自己的 `SKILL.md` / `references/`;两个技能平行同层级,不缝成一条流水线,也不把 `oil-ui-pro` 的评分循环当成本段 Gate 的替代)
- 猜 `<项目>`:定不出来还硬写,把产物落到别的项目目录下
- 把 `DESIGN.md` 写到仓库根:多项目会互相覆盖
- 段间停下来问「要不要继续」:全流程(自动处理)模式下直接进下一段,只在段末输出报告
- 把两种模式混用:在自动处理模式下自作主张停下问方案,或在「方案确认」模式下确认前就开跑②③④
- 在「方案确认」模式下把①段的方案当成已确认就往下跑:该模式下①段末必须停下等用户确认(含「不做什么」)
- 下游擅自裁剪上游已拍板项:②③④发现要砍①段或决策表里已拍板的东西时,不许自行裁掉或改口径,必须列成「与已定决策的差异」交用户显式确认
- 把模式当成段:模式是「要不要在①段末停」的开关,不是第五个段,别为它单独造段或造产物
- 跑了却不说:没声明当前段 / 子步与依据文件,或偏离了被调 skill 的主流程却不声明、不记偏离单(应为:开工先声明、每个子步再声明、偏离当场声明)
## 改名 / 改供给后的自检
```bash
python scripts/check_naming.py --ws <工作区>
```
它查四段段名与子步名在「总入口 ↔ 各段 `SKILL.md` ↔ 各段 `references/`」之间有没有漂,包括 H1 与子步表是否一致、总入口子步列有没有漏项、runbook 必读表有没有引用已移除的资产、两份副本是否一致。纯静态比对,不需要渲染,不需要外部依赖。
为什么必须有它:实测当天漏过两次,当时没有任何门禁会报错。
第一次(2026-10-02):改段名时 `SKILL.md` 改了,但 `references/stage-discovery/references/grill-me.md` 的 H1 仍写「需求澄清(grill-me · 调研段)」;`references/stage-requirements/SKILL.md` 子步表写「2b 功能流转」而正文 H2 写「## 2b 状态机」;总入口④段子步列只写「4a 说明区 / 演示引导」漏了 4b / 4c。三处都只能靠回读发现。
第二次(2026-10-06):②段收窄为「只细化功能」(7 份产出变 1 份)后,各段 `SKILL.md` 都改了,但总入口的三处仍写着旧结构——四段表的②段子步列仍是「2a 功能定义与压测 / 2b 功能流转 / 2c 功能图示」,四段表的①段子步列「1c 产品定位与商业设计」未随段内改名(段内已改称「产品定位与场景」),正文仍写「①与②各跑一次 `grill-me`」并指向两份同名文档,实际全场只有①段一份。闸门当场报 6 个 FAIL,根因是「改了承载段、忘了总入口」。
由此立一条硬纪律,与「换供给不能只改承载段」同型:凡改子步结构 / 段内产出清单 / 段间交接口,必须连带改总入口 `product-planning/SKILL.md` 的「四段结构」表与「交接口」表,不改就是半改状态。
改了段名 / 子步名 / 判据供给源之后必须跑一次,并把结果记进当日 memory。改完不校验,下次读契约的人拿到的是错的配方。
本脚本只查文本一致性(H1 ↔ 子步表 ↔ 总入口 ↔ 副本),查不出「判据口径是否自相矛盾」。例如「②段到底该不该给页面结构」这种反转,闸门一个字都报不出来。口径类改动要靠人工回读,且必须把反转理由与用户原话写进文档留痕。
脚本输出里的 `[提示]` 项(旧名出现)不计入失败,但要人工看一眼是不是落在「废止理由块」里——落在里面是正当留痕,散落在正文里就是真残留。
2026-10-07 起本技能只在全局一份:`E:/ProgramData/.workbuddy/skills/product-planning/`。它就是本体,不再有「主 / 副 / 装入」三副本,也不再需要「三处 md5 复核」(那只在有副本时才有意义)。改完只跑一次 `check_naming.py --ws <工作区>`。用户原话:「把产品规划复制到 workbuddy 全局skills中 后续维护和使用全局技能」。工作区原先那三份已归档到 `归档/技能迁全局-20261007/`(未直删,可随时取回)。
@@ -0,0 +1,376 @@
---
name: stage-delivery
description: 产品规划第③段,界面交互。设计工程供给来自 open-design(设计系统定调 + 工艺规约给数值判据 + 原型模板给版式):先落设计契约与令牌表(Gate-1 硬闸),再构建页面,再收口/动效/终检(Gate-2/3),中途加一轮 GPT 独立会诊。判据结构为「正向目标为主、禁令只留最关键三条」。当用户要做 UI 规范、设计系统、页面原型、交互动效、界面审查、视觉打磨,或说"只做界面交互"时调用。
---
# ③ 界面交互
回答两个问题:长什么样、怎么操作。产出 `docs/pm/<项目>/DESIGN.md` 与 `designs/<项目>/*.html`。
> 段名为什么是「界面交互」(2026-10-02 定):
> 删「交付」:①②③都产出落盘文件,「交付」是三段共有的属性,不是③的专属;④段也在交付(原型的说明区),留着会让人以为③管完就结束了。
> 补「交互」:本段原先只讲「长什么样」,可 3b 原型硬要求每个按钮、每个跳转都真能走(`:236`),3c 会诊专查空态 / 加载 / 错误 / 反馈(`:148`、`:150`)。交互判据一直在做,却没有名字,补上才与本段实际职责相符。
> 与④段的界:③造物(界面与交互本身),④描述物(说明区与演示引导)。
> `<项目>` 按 `product-planning` 的「项目与路径约定」定;定不出来就停下问用户,不许猜。`DESIGN.md` 放项目目录,不放仓库根,避免多项目互相覆盖。
本段的页面设计供给来自两个独立技能,都装在 `.workbuddy/skills/` 技能仓库里,都可脱离本段单独使用:
| 技能 | 它是什么 | 本段取它什么 |
|---|---|---|
| `open-design`(⚠️ 工作区级,全局没有) | 网页 App 设计判据供给库:153 套设计系统(定调与令牌)+ 13 份工艺判据 + 35 个版式骨架 | 定调 + 数值判据 + 版式骨架(本段默认主线) |
| `oil-ui-pro`(✅ 全局级) | 界面设计方法论:五步流程(探索方向 → 建结构 → 取实证 → 独立评审打分 → 验证交付)+ 风格对比页与截图工具 | 方向探索 + 对比页 + 独立评审打分(做多方向比选或要独立评审时;`open-design` 缺位时也由它顶) |
| 本段自带样式库(✅ 随段携带) | `assets/design-systems/<选定一套>/` —— 样式风格库,可续加;当前 1 套:`design-system-tiaoyue`(跳跃视界规范 + 277 个自有组件族) | 定调 + 令牌 + 组件形态,与 `open-design` 那 153 套同权;⛔ 二者每次只选一套 |
> ⭐ 两个技能平行同层级,可分别独立使用。本段按任务取用,不把它们缝成一条流水线:多数页面走 `open-design` 主线(快、判据硬);需要「先拉开几个方向让用户挑」或「要一个没看过制作过程的评审打分」时,取 `oil-ui-pro` 的方法与工具。
> ⛔ 判据正文仍只在本段(`references/execution-runbook.md` 与 `references/layouts-tooling.md`)。两个技能都只是素材与方法,不是规范权威。同一条判据两处都有且口径不同时,以本段为准,并在 runbook §3.4 标注「本项目追加」。
> ⛔ 不许把 `oil-ui-pro` 的评分循环当成 D 阶段的替代:它是评审方法,本段的 Gate-1/2/3 该过还得过。
> ⚠️ `oil-ui-pro` 自带联网版本检查与自动更新(每次使用会连 `ui.oiloil.org`,发现新版用 `npx` 覆盖自身目录)。这是本项目收录时用户明确要求全量搬入的例外项,与「依赖外部服务一律不收」的既有纪律冲突,记录在案,不扩散到其他技能。想关掉设环境变量 `OIL_NO_UPDATE_CHECK=1`。
`open-design` 的三处供给各管一件事:
| 供给 | 路径(技能内) | 管什么 | 在哪一环用 |
|---|---|---|---|
| 设计系统(正向目标 · 调性) | `open-design/design-systems/<选定一套>/` | `DESIGN.md` 定调性 + `tokens.css` 给全套数值(圆角与阴影在这里)+ `components.html` 给组件形态 | 3a 定调、落令牌表 |
| 工艺规约(正向判据 · 数值) | `open-design/craft/` | 字号刻度 / 配色配额 / 状态齐备 / 动效纪律 / 反 AI 味 / 无障碍 | 3a 判据、3d 终检 |
| 原型模板(正向形态 · 版式) | `open-design/design-templates/web-prototype/` | 种子 `assets/template.html` + 8 个版式骨架 + 自查清单 | 3b 构建 |
本段自带样式库那一套(`design-system-tiaoyue`)怎么读(⚠️ 套内命名与 open-design 不同形,别按 `DESIGN.md` 去找):
| 要什么 | 套内路径 |
|---|---|
| 入口(规范总纲、生成时的参考范围) | `assets/design-systems/design-system-tiaoyue/SKILL.md` |
| 令牌(含暗色一套) | 同目录 `assets/tokens.css` + `assets/tokens-dark.css`(色值原始记录 `assets/brand.json`) |
| 组件形态 | 同目录 `references/components.md` + `references/design-system.html`(组件族清单 `references/library.json`) |
| 已知冲突 / 取舍记录 | 同目录 `references/known-conflicts.md` + `references/capture-notes.md` |
> ⚠️ 路径怎么找(2026-10-07 更新):一律按技能名引用(宿主按名加载,与物理位置无关),⛔ 不按相对路径爬,⛔ 不写死 `../` 层数。
> 2026-10-07 起两个技能不再同处:本技能在全局技能根(`E:/ProgramData/.workbuddy/skills/`);`open-design` 现在只装在工作区(`<工作区>/.workbuddy/skills/open-design/`),全局里没有;`oil-ui-pro` 在全局。更没得爬,只能按名找。
>
> 🔴 `open-design` 不可得时的回落(2026-10-07 用户定案「先用 oil-ui-pro 试试效果」):用 `oil-ui-pro` 顶「方向探索 / 对比页 / 独立评审打分」三块。但它顶不了 `open-design` 独有的 153 套设计系统(定调与令牌)与 13 份工艺判据(字号刻度 / 配色配额 / 状态齐备 / 动效纪律 / 反 AI 味 / 无障碍)。
> 缺这块时只有两条路:① 把 `open-design` 装回来(它是可得的技能,只是现在装在工作区级);② 明说「本次定调与工艺数值判据无供给来源」。⛔ 不许凭感觉编一套顶上,那正是本项目反复踩的坑。
两者都不依赖付费云 / MCP / API Key 才能用于设计:`open-design` 去掉那些之后剩下的全是静态 md / css / html;`oil-ui-pro` 的设计方法宿主中立、离线可用(联网仅用于版本检查)。`open-design` 的 daemon、云模型服务、`packages/components` 的 tsx 未收录。
冲突处以本段为准。两个技能都只是供给,不是规范权威。它们与本项目既有纪律冲突时,以本段与 `DESIGN.md` 为准。它们的价值在给正向目标、给方法,不在「给最后一句话」。
> 为什么换掉原来的主干(2026-10-02 用户定案):原主干 `ui-page-design` 已从磁盘移除,③段只剩规则壳,壳里又全是减法型判据,机检能判「不违规」却判不出「好看」,18 轮回改把页面越推越白。换供给的同时必须换判据结构:正向目标为主,禁令只留最关键的。
> ⭐⭐ 本段在②段给定的骨架里做视觉与交互(2026-10-06 用户定案)。
>
> 口径:②段钉骨架,③段做皮肉。
>
> | 归②段(本段⛔ 不许动) | 归本段(②段⛔ 不许写) |
> |---|---|
> | 有哪几页 | 配色 / 字体 / 间距 / 组件样式 / 动效 |
> | 每页几个板块、板块怎么排 | 每个板块的视觉实现(怎么好看、怎么对齐、什么层次) |
> | 跨页关系(怎么跳转) | 每个板块的交互行为(点哪、什么反馈、何时不可点) |
> | 每页主操作 | 状态与空态的具体呈现 |
> | 每条信息在哪一档(主屏常驻 / 可点入) | 响应式怎么变 |
>
> 用户原话:「3 是负责设计和交互,页面关系和布局必须在第二步确认清楚,不然第三步没有方向 一会一个样子」。
>
> 🔴 旧口径站不住的地方:它把「有哪几页」留在本段,于是本段做一版一个样,②段手里没有任何东西能判断本段改得对不对。用户看到的现象就是「一会一个样子」。
> ⭐ 本段拿到的骨架是冻结的:⛔ 不许新增 / 移动 / 删除板块。缺板块要回②段改②段(见「硬约束」的对应禁令)。
>
> 仍在本段手里的两个字段(它们在给定骨架之内决定怎么摆得好看):
> - `必要内容`(减法):⚠️ 口径已调整。它不再决定哪些内容上屏(那是②段分档表的活),而是核对②段给的信息是否都在骨架里有落点;⛔ 本段不得以它为由增删信息档位。
> - `结构骨架`(加法):⚠️ 口径已调整。它不再独立决定几个区块,而是把②段给的板块清单翻译成具体的骨架档 / 列宽 / 密度目标(骨架档选哪个、密度多少,仍是本段的活)。
>
> ⛔ 本段不许回头改②段的骨架(那是②段);⛔ 也不许无视②段骨架自己另起一套。判据:D0 里的页面清单与每页板块,必须与②段《界面布局》逐条对得上;对不上就停下来问②段要哪一版。
顺序 3a → 3b → 3c → 3d。先有规范再出原型,不许反过来;原型能点通后先会诊,再收口打磨。
> 照 `references/execution-runbook.md` 逐步走。那是本段的固化执行手册:按 D 阶段排的必读表、每步验收判据、脚本跑法、偏离单格式、完成标准清单都在里面。本文件写规则,手册写顺序与验收。
> 开工前先声明、每进一个子步再声明、偏离当场声明(三字段:当前子步 / 依据文件 + 小节号 / 产出落点)。这条不可商量。
## 子步与产物
| ③段子步 | 做什么 | 产物 | 闸 |
|---|---|---|---|
| 3a 视觉规范 | 定契约(减法 + 加法)→ 定调(选定设计系统)→ 落令牌表〔多方向比选时取 `oil-ui-pro` 的方向探索与对比页〕 | 设计契约 + 令牌表 → `DESIGN.md` | Gate-1 方向门 |
| 3b 原型 | 按模板种子 + 版式骨架构建 | `designs/<项目>/<原型>.html` | — |
| 3c GPT 会诊 | 外部独立视角(本段特有,两个设计技能都不覆盖) | `3c-GPT会诊.md` | — |
| 3d 审查与打磨 | 收口 → 动效 → 终检〔要独立评审打分时取 `oil-ui-pro` 的评审协议〕 | file:line 清单 + `3d-审查报告.md` | Gate-2 / Gate-3 |
挡位开工前定一次,默认标准:纯原型可降快速(定契约 → 定调 → 构建 → 终检);常规页面走标准(全跑);对外页面走严格(三闸全开 + 中间产物落盘)。
`Gate-1` 与 `Gate-3` 是硬闸,任何挡位都不可跳,哪怕只做原型,也要打开看一眼。
## 三条铁律(只留不可省略的)
| # | 铁律 | 违反后果 |
|---|---|---|
| 1 | 先定死,再写码。未产出设计契约与令牌表前,禁止写任何组件代码;禁止边写边调样式。 | 返工、风格漂移 |
| 2 | 状态穷举。`loading / empty / error / success / disabled / 无权限` 逐项给结论(判据见 `craft/state-coverage.md`)。 | 上线即翻车(最高频漏项) |
| 3 | 不渲染不算完。交付前必须在真实环境渲染一次并肉眼确认。 | 裁切/重叠/失效控件逃过检查 |
> 禁令就这三条,其余一律去供给源查:反 AI 味 → `craft/anti-ai-slop.md`|字号与层级 → `craft/typography.md` / `typography-hierarchy.md`|配色配额 → `craft/color.md`|动效 → `craft/animation-discipline.md`|无障碍 → `craft/accessibility-baseline.md`|表单校验 → `craft/form-validation.md`。
> ⛔ 不在本文件里抄写禁令清单。抄了就变两份,两份必然漂;更要紧的是,抄禁令会把正向目标挤出视野,这正是改版前③段只剩「不要什么」、页面越改越白的根因。
> 一条例外(本项目特有,craft 里没有):结构性容器靠底色差 + 阴影分层,不挂围合边框(来源:本项目 E-62 / E-63 实测)。当选定设计系统写「卡片描边」时,以本条为准。
> 限载:同一时刻只读 1~2 份供给原文,用完释放。这条不再单列铁律,但仍是硬约束(`design-systems/` 有 153 套、`craft/` 有 13 份,全读必然互相稀释)。
## 必读(限载:一次只读 1~2 份,用完释放)
| 环节 | 读什么 |
|---|---|
| 3a 定调 | `open-design/design-systems/<选定一套>/DESIGN.md` + 同目录 `tokens.css`;`components.html` 按需 |
| 3a 判据 | `open-design/craft/typography.md` + `craft/color.md`(其余一次一份,按需) |
| 3a 多方向比选(按需) | 需要「拉开几个方向让用户挑」时,取 `oil-ui-pro` 的 `references/design-direction.md` + `references/style-explorer.md`(对比页模板与生成器) |
| 3b 构建 | `open-design/design-templates/web-prototype/SKILL.md` + 同目录 `references/layouts.md`(⚠️ 不在本技能 `references/` 下,该目录只有 execution-runbook.md);工具型页面另读两份:本技能 `references/layouts-tooling.md`(HTML 骨架与落地自检)+ `open-design/design-templates/web-prototype/references/tooling.md`(四形态判定句与通用红线纲要) |
| 3d 独立评审(按需) | 要「一个没看过制作过程的评审打分」时,取 `oil-ui-pro` 的 `references/visual-review.md`(协议)+ `references/tools.md`(截图与对比取证) |
| 3d 终检 | `open-design/design-templates/web-prototype/references/checklist.md` + `craft/state-coverage.md` |
> 定调来源唯一,每次只选一套。可选套来自两处,⛔ 每次设计只选其中一套、不许混用两套(混用 = 没有调性):
> ① `open-design/design-systems/`(⚠️ 工作区级,153 套);
> ② 🔴 本段自带样式库 `assets/design-systems/`(✅ 随段携带、可续加;当前 1 套:`design-system-tiaoyue`)。
> 套名与选择理由写进 `DESIGN.md`。既有项目中凡引用旧风格来源(`minimalist-ui` / 皮肤族 / `ui-ux-pro-max` 检索结果)的 `DESIGN.md` 行,重跑 3a 时一律改写为选定套 + 留痕对照。
> 本段 `references/` 只放流程规则,⛔ 不放风格;随段携带的样式风格一律放 `assets/design-systems/<套>/`(🔴 2026-10-07 用户令两条:「把 `design-system-tiaoyue` 整合到 `product-planning` 作为一种样式风格」+「后续可以添加多种风格,每次只能选择一种进行设计」⇒ 只把「不放风格」这条放宽到 `assets/`,`references/` 仍不放)。
> ⚠️ 续加新风格时的硬要求:目录名与 open-design 同形(`assets/design-systems/<套名>/`),套内自带入口文件(`SKILL.md` 或 `DESIGN.md`);⛔ 不许改已入套的文件内容,原样搬入、只在本文件登记去向。
## 3a 视觉规范(定契约 + 定调 + Gate-1)
第 0 步 · 供给核对(每轮必做,防漂移):确认技能仓库里的供给仍在位(`open-design/` 下 `design-systems/<选定套>/` 存在、`craft/` 存在、`design-templates/web-prototype/` 存在;`oil-ui-pro/` 入口 `SKILL.md` 存在;🔴 若上轮选的是自带库那套,另核 `assets/design-systems/<套>/SKILL.md` 仍在位),并把选定套名与 `DESIGN.md` 里记录的上次套名比对。
- 一致 → 直接定契约。
- 不一致或供给缺失 → 先停下报告,⛔ 不许拿别的套顶上,也不许凭记忆写风格。把差异列成「供给变更清单」,在会话里向用户呈现并确认后,再改 `DESIGN.md`,把新套名与清单写进修订记录。
- 本步存在的理由:`DESIGN.md` 是上一次供给状态下产出的。供给换了却没核对,就会长期拿着旧调性当准绳。
D0 锚需求:按 `references/execution-runbook.md` 里的契约模板产出设计契约(十二个字段)——页面职责(谁 + 多久 + 干什么)、主用户、主操作(全页唯一)、必要内容(减法)、重复项的信息量(行式列表 / 卡片网格逐条列次级信息)、结构骨架(加法:骨架档 + 区块划分 + 密度目标)、交互清单(加法,见下)、状态覆盖六项逐条、组件来源(优先沿用)、响应式行为(写布局怎么变,不写「自适应」)、明确拒绝的模式、验收标准(可观察可判定)。
> ⭐⭐ 第十二字段「交互清单」是 2026-10-02 新增,段名改名的直接后果(段名从「界面与交付」改成「界面交互」,但「交互」在流程里此前没有落点:可点通在 3b、查反馈在 3c、动效在 3d,三处各判一部分,谁也不负责整体)。
> 它写什么:逐个可点元素一行,四列——元素(哪个)|触发(点了/输了/滚到哪,发生什么)|反馈(状态怎么变、给什么提示、多久消失)|何时不可点(哪些条件下 `:disabled`,条件是什么)。
> 它不写:动效参数(归 3d 按 `craft/animation-discipline.md`)、视觉样式(归令牌表)、状态六项的有无判定(归下一字段 `状态覆盖`,本字段只写「这个元素可点时点了会怎样」)。
> 为什么是契约字段而不是新子步:交互一旦单独成文,就会与 `必要内容`、`状态覆盖` 三处互相矛盾——这正是记忆里「同一事实多处落点必然打架」的病。收进契约 = 一个字段、一处裁决、一个门禁。
> 判定「漏没漏」:页面里每一个能点的东西都必须在这张表里出现。表里没有 ⇒ 它不该可点(改成静态文本,或回 D0 补进 `必要内容` 再点)。
D1 定调:从 `open-design/design-systems/` 或本段自带 `assets/design-systems/` 里选一套(⛔ 每次只选一套),不凭感觉编,也不全读:
- 怎么选:按本项目的页面类型挑。读候选套 `DESIGN.md` 的第 1 章 `Visual Theme & Atmosphere`,认准写明该类的那一句(工具型数据密集界面 ⇒ 认 `data-dense, enterprise` 这类描述)。153 套分两代模板(A 组 / B 组章节名不同),按自己那套的章节读,不必统一。
- ⚠️ 选了自带库那套(`design-system-tiaoyue`)时:套内没有 `DESIGN.md` ⇒ 读它自己的 `SKILL.md`(规范总纲 + 生成时的参考范围)+ `references/known-conflicts.md`(已知取舍);入口 / 令牌 / 组件形态按上面那张「怎么读」表取,⛔ 别按 open-design 的三件套去找。
- 选定后读三件:`DESIGN.md`(调性 + 色值 + 字号刻度 + 间距刻度 + 动效基调)→ `tokens.css`(圆角与阴影只有这里)→ `components.html`(组件实际长相)。
- 要换风格 ⇒ 下一轮重跑 D1 重选一套,旧套留痕(用户 2026-10-07:「后续可以添加多种风格,每次只能选择一种进行设计」)。
- 没找到匹配的套 ⇒ 换一个类型词再挑一次;仍不行就直说「未找到匹配」,不许拿泛化结果当结论落盘。
- ⚠️ 工具型页面的版式不在模板里:`web-prototype/references/layouts.md` 那 8 个骨架是落地页 / 营销页向(hero / features / stats / quote / cta / log / pricing)。工具型页面只适用其中 Layout 7 日志列表与 Layout 8 对比表,其余套上去会把后台做成营销页。工具型页面的版式由 D0 的 `结构骨架` 字段决定,不从模板抄。
- 产出令牌表:色值 / 字体(标题字体是关键项)/ 间距两档(主刻度 `4/8/16/24/32/64` 供布局 + 控件层微网格 `2/4/6/8/12` 仅供按钮内衬、徽章内衬、图标间隙、开关与进度轨微几何)/ 圆角 / 字阶定值表(七档各一个 px,不是区间)/ 高度层级(每层都有多层叠层值)/ 布局脚手架(骨架档落到具体列宽 + 窄屏变化)/ 组件规格(按钮三档 + 卡片两档 + 输入框 + 徽章的具体高度与内衬;实底底色 ≥2 种)/ 动效基调——全部为具体值,禁止「待定」,每档只许一个定值
落盘 `docs/pm/<项目>/DESIGN.md`:令牌表内容并入本项目既有的三层 token 结构(primitive → semantic → component;组件只引语义层、语义层只引 primitive),设计契约作首节。`DESIGN.md` 是原型的绑定规范,原型只许引它的 token。
Gate-1 方向门(硬闸,不可跳)——按本表逐项自检(字段定义与填写位见 `references/execution-runbook.md` §2.1;⛔ craft 无对应,十二字段只能在此判):
| 检查项 | 通过条件 |
|---|---|
| 设计契约 | 十二个字段全部填写,无一为空或「待定」;有重复项时重复项的信息量已逐条列出次级信息 |
| 页型判定(2026-10-05 新增) | 已写出「营销页还是工具型页面」+ 依据;工具型页面的 D0 里零 `.eyebrow` / 零 `.lead` / 零 `.hero` |
| 结构骨架(加法面) | 骨架档 / 区块划分 / 密度目标三者已写;区块 ≥2 个且每个有文字标题;`必要内容` 每条都有归属区块 |
| 交互清单(加法面,2026-10-02 新增) | 页面上每一个可点元素都在表里(元素 / 触发 / 反馈 / 何时不可点 四列齐全);表里没有的可点元素为 0 |
| 状态覆盖 | 六个状态逐项有结论(勾选,或「不适用 + 理由」) |
| 令牌表 | 色值 / 字体 / 间距两档且适用面已分开写 / 圆角 / 阴影全为具体值 |
| 字阶定值表 | 七档每档一个 px 定值(不是区间);相邻档差 ≥2px;每档只许一个定值 |
| 高度层级 | 每层都有多层叠层值;同层级同值 |
| 布局脚手架 | 骨架档已落到具体列宽;窄屏变化写具体 |
| 组件规格 | 按钮三档 + 卡片两档 + 输入框 + 徽章均为具体值;同一父区块内主档 ≤1;实底底色 ≥2 种 |
| 供给核对(本项目附加) | 三处供给已确认在位;选定套名与 `DESIGN.md` 记录一致;不一致则变更清单已确认并写入修订记录 |
| 反 slop | 无紫→粉渐变、标题未用禁用字体、强调色已写明允许位置 |
| 拒绝清单 | ≥3 条,且每条可判定 |
| token 引用完整性(本项目附加) | 语义层只引 primitive、组件层只引语义层、无孤立 token |
任一项不过 → 停在 3a 补齐,不进 3b。
> 对比度门槛按 `open-design/craft/color.md`(正文 4.5:1 / 大字 3:1 / UI 组件 3:1),由终检阶段按真实像素复测(静态算不准 CSS 变量叠加后的结果)。
> 已知环境问题:`npx @google/design.md lint` 在本机完全不可用(alpha + clack 交互库,非 TTY 管道下静默且 exit 0)。不要拿它当校验关卡,也不要因它无输出就认为通过。
## 3b 原型(构建)
> ⛔ 开工前先判页型(2026-10-05 新增,硬前置):写下「本页是营销页还是工具型页面,依据是什么」。
> 两种页型的目的不同,骨架不能通用:营销页目的是说服(主张 → 论据 → CTA),工具型页面目的是完成一件工作(数据 + 操作)。
> 判别口径:要用户「下决心去做某事」⇒ 营销页;要用户「把这件事做完」⇒ 工具型页面。⚠️ 判不准时按工具型处理(默认取严)。
> 判不出来不许进 3b,停下来回改 D0 的 `结构骨架`。
> 🔴 为什么这条是硬前置:`open-design` 的种子 `assets/template.html` 是营销落地页骨架,自带 `.eyebrow`(眉标)与 `.lead`(副标题)。不判页型就照种子做,会得到「标题上方一行小字 + 大标题 + 下方一行灰色小字」的三段式——那是 2026-10-05 用户实测指出「像实习生画的」的唯一根因,而且结构判据全绿(判据判类名合法性,判不出「这不是工具界面的排版」)。页型不判,后面换什么设计系统都救不回来。
按 `open-design/design-templates/web-prototype/SKILL.md` 的六步走:读种子 → 把 `assets/template.html` 复制成 `index.html` 并替换 `:root` 令牌 → 先定版式节奏再粘骨架 → 填充 → 自查 P0/P1/P2 → 落盘。它的路线是「先选定一个明确的美学方向再写码」,与铁律 1 同向。
- ⭐ 工具型页面先判形态,再挑骨架(2026-10-02 新增):读 `references/layouts-tooling.md`。本项目是工具型数据密集界面,而 `web-prototype/references/layouts.md` 那 8 个骨架是落地页 / 营销页向(hero / features / stats / quote / cta / log / pricing),只有 Layout 7 日志列表与 Layout 8 对比表沾得上。
⚠️ 两份工具型文件的分工(2026-10-05 补):`open-design/.../web-prototype/references/tooling.md` 给四形态判定句 + 通用红线纲要;本技能 `references/layouts-tooling.md` 给可粘贴 HTML 骨架 + 逐条判据正文(§5.5)。⛔ 判据只在后者展开,前者只指路,两处展开必然漂。
形态判定一句话:页面上能数出「并列的同类记录」⇒ 列表型(工具型默认首选);数不出、页面围绕单个对象展开 ⇒ 详情型;主操作要在两个工作面之间来回 ⇒ 侧区型。
⛔ 不许拿营销页骨架顶替工具型,那是「没做形态判定」的默认行为,等于退回 18 轮前的病根。判不出形态就去改 D0 的 `结构骨架` 字段,⛔ 不许随手挑一个。
- 不许从零手写 `<section>`:先挑最接近的骨架粘进去再改。`open-design/design-templates/web-prototype/references/layouts.md` 开头的类清单(`section` / `container` / `card` / `btn-primary` / `grid-3` …)必须在种子 `template.html` 的 `<style>` 里存在;缺哪个就补进 `<style>`,⛔ 不许在标签上内联一堆临时样式。
- 输出形态:单文件 HTML、自包含、双击可开(与 `web-prototype` 的产出契约一致:只有 `index.html` 一个文件),含全部适用状态,不许有死按钮。
重大改版必须复制副本再改(`X.html` → `X v2.html`),不许覆盖旧版,旧版留在磁盘上以便对比。这是本项目的附加纪律(版本管理主线需要可追溯),open-design 未涉及。
交付前必须实测(本步硬关卡):用 `browser-harness` skill 按清单逐个真点,以 D0 契约的「交互清单」为唯一清单(⛔ 不用自己临场编的顺序):每行按「触发 → 反馈」实跑一遍,四态(空 / 加载 / 错误 / 失败重试)都要走到;回报控制台报错原文与「点了没反应」的元素清单。
> 交互清单在这一步才第一次被验证:Gate-1 只判「表写全了没」,判不了「真能跑」。清单与实现对不上,就是清单错了或实现错了,二者必居其一,都要在 `3d-审查报告.md` 里留痕,不许静默改表。
> 脚本查不出死按钮(即便脚本在位,它也只判溢出 / 对比度 / 状态可见性 / 点击目标尺寸,判不了「元素没绑事件」)。未跑实测不得进 3c,也不得报完成。
> 实测一律走 `browser-harness`(浏览器入口 9333),禁用 Trae 自带浏览器工具。
## 3c GPT 会诊(必做)
触发点:原型初稿出完、3b 的浏览器实测过了,立刻做本步;做完才许进 3d。
做什么:用 `browser-harness` skill 打开 `chatgpt.com`,把原型交给 GPT 做一轮独立审查,专挑设计与交互的毛病,把回答取回来逐条处置。③段前三步全是本地确定性检查,没有外部视角,这一步补的正是它补不了的那块。
执行步骤:
1. 沿用用户已登录的浏览器会话打开 `chatgpt.com`。不要新建账号、不要代填密码、不要碰设置页。
2. 用附件上传原型 HTML 文件(`designs/<项目>/<原型>.html`)。不要把上万字符的代码粘进输入框,会被截断或打字超时,且拿不回完整上下文。
3. 随附件发这段提问模板:
```
这是一个可交互原型(单文件 HTML,含内联样式与脚本)。请以资深产品设计师的视角审查,
只提可落地的改进项,按下面五类逐条给:
1) 交互与状态:空态 / 加载 / 错误 / 失败重试 四处有没有缺口或死路
2) 布局与层级:信息密度、对齐、视觉动线、主次是否清楚
3) 反馈:每个可点元素点击后有没有可见反馈;列出"点了没动静"的元素
4) 可访问性:焦点管理与顺序、键盘可达、对比度、语义标签
5) 文案:是否有歧义、术语不一致、把机器结论说成人已认可的地方
每条格式:问题 / 位置(选择器或组件名)/ 改法 / 优先级(高/中/低)
不要重写整个文件,只出清单。
```
4. 等回答出完再取(停止生成按钮消失或出现复制按钮),把回答原文取回,不要读一半就走。
5. 落盘 `designs/<项目>/3c-GPT会诊.md`,三段式:提问原文(含附件文件名)→ 模型回答原文 → 处置表。
处置表固定四列:
| # | 模型建议(原文摘句) | 判定 | 理由 | 落地位置 |
|---|---|---|---|---|
| 1 | ... | 采纳 / 不采纳 / 待议 | 对照 `DESIGN.md` 与②段说清 | 文件 + 选择器 |
功能作用:引入一个不在本项目上下文里的外部视角,补自己看不见的盲区。
输入边界:只传原型 HTML 与必要的产品背景;不传密钥、真实用户数据、内网地址、`.env`。代码里若有 token 或接口地址,先替换成占位符再上传。一次只审一份原型。
异常情况:登录失效 / 人机验证 / 网络不通 / 回答被截断时,不要假装跑过。退路是把提问模板和原型文件路径交给用户,由用户在自己浏览器里问,再把回答粘回来落盘。仍然取不到时,在 `3c-GPT会诊.md` 里写明「本轮未取得外部审查」,并在本段收尾时明示,未取得不等于已通过。
处置纪律:模型建议不是命令。采纳要给理由,与 `DESIGN.md` 或②段冲突的写清为什么不采纳。采纳项在 3d 之前改完,并回到 3b 的实测清单把这些改动再点一遍。
## 3d 审查与打磨(收口 + 动效 + 终检 + Gate-2/3)
### 收口(管「写得对不对」)
对照 `open-design/design-templates/web-prototype/references/checklist.md`(P0 / P1 / P2 三级)+ `craft/` 的四份数值判据(`typography.md` / `color.md` / `state-coverage.md` / `animation-discipline.md`)逐条过。先机器、后人工:
> ⚠️ 本段收口一律人工过(2026-10-02 用户定案「不重要的相关内容都删」):checklist 人工过 + 渲染截图 + DOM 取值,三项缺一不可。
> ⛔ 判据来源:`craft/checklist.md` + `craft/anti-ai-slop.md` + `craft/accessibility-baseline.md` + `craft/color.md`(对比度),本项目追加条见 runbook §3.4。
> ⛔ 结论只能写「人工判定」,⛔ 不许写「已通过」(人工过就是人工过,不借机升格)。要指向交付的单文件,不要指向多文件开发目录。
### 动效(可跳过)
按 `open-design/craft/animation-discipline.md` 先答动效三问:① 它传达什么信息?② 删掉会丢失什么?③ 是不是为了「看起来高级」?答不出就不加。
- 工具型页面(仪表盘 / 后台 / 编辑器 / 工作台)禁止入场编排,用户一天开几十次,每次播一遍是折磨。本项目的版本管理界面属工具型;判不准时按工具型处理
- 弹簧用 Damping / Response 二参数(Damping 保持 0.8–1.0、Response 0.3–0.4s;低于 0.7 会明显「蹦」)
- CSS 无法用真弹簧时用 `cubic-bezier(0.32, 0.72, 0, 1)`,不得用 `linear` / `ease` / `ease-in-out` 做过渡曲线
- 交互过渡禁 `@keyframes animation`(不可中断,反向操作会跳帧),用 `transition` 或 WAAPI
- 只动 `transform` / `opacity`,不动 `width`/`height`/`top`/`left`;禁止 `scale(0)` 起手(用 `scale(0.95)` + opacity)
- 退出比进入快(进 300ms / 出 200ms);同屏动效元素 ≤3 个且有 30–50ms 错峰
- `prefers-reduced-motion` 必须处理
### 终检(管「能不能交」)
过 checklist 的 P0/P1 + `craft/state-coverage.md`(状态穷举)+ `craft/anti-ai-slop.md`(反 AI 味,⛔ 不在本文件抄清单)+ 动效三问 + 交互清单逐行复测(表里每一行的「触发」与「反馈」都要真发生过,且与实现一致),并真渲染一次:
```bash
# 本机 Chrome 无头截图(2026-10-02 实测可用;门禁脚本补上后仍以脚本为准)
"/c/Program Files/Google/Chrome/Application/chrome.exe" --headless=new --no-sandbox --disable-gpu \
--hide-scrollbars --window-size=1440,900 --virtual-time-budget=3000 \
--screenshot="<Windows 绝对路径>/P1.png" \
"file:///<原型绝对路径,中文需 URL 编码>#/p/xxx"
```
- ⚠️ 两条坑:`--screenshot` 必须给 Windows 绝对路径(给相对路径会写进 Chrome 安装目录,回来找不到);中文文件名要 URL 编码
- 在 `1440x900` 与 `390x844` 两个视口各截一张;对外评审 / 交付留档只用视口帧,整页长图仅自检。⛔ 混用会出事:实测把长图交出去,移动端是 1:7.1 的长条,外部评估只能按长条理解布局,「首屏有没有主次」「坐得下几行」根本没被评审到
- 结构与排版仍要量(字号档数与相邻档差 / 正文档承载占比 / 标题大纲 / 按钮高度与实底分档 / 列对齐 / 对齐锚点 / 浮层可见关闭出口唯一):脚本缺失期间靠 DOM 取值人工量,结果直接抄进 `3d-审查报告.md` 的结构核对表。⛔ 不许目测截图下结论
- 「无法判定」一律按未通过对待(「判不了」≠「没问题」):浮层类在未打开态必然判不了,必须按 Gate-3 的打开态复测口径,手工打开每个浮层再数一遍并留痕
- 本项目的状态由路由与演示开关驱动,不用 `?state=`;状态可见性由 `browser-harness` 实测承担
### Gate-2 完成门
全部 `阻断` 项清零,`建议` 项逐条有结论:修掉,或显式写「已知不修 + 原因」。不接受「基本没问题」「应该差不多」「剩余都是小问题」。每条要么修,要么留痕。
### Gate-3 交付门(硬闸,任何挡位不可跳)
真实渲染后(浏览器打开,非只看代码)肉眼过八项:裁切 / 重叠 / 失真 / 失效控件 / 缺状态 / 响应式破损 / 控制台报错 / 字体回退异常。渲染截图已代劳其中的溢出与响应式破损,其余仍需人眼(截图查不出「点了没反应」)。
### 审计报告落盘
`designs/<项目>/3d-审查报告.md`,固定七节:范围 + 挡位 + 阻断项表 + 建议项表 + 状态覆盖核对表 + 结构核对表 + Gate 结论(含「本轮是否跑了脚本」一句)。
## 硬约束
- ⭐⭐ 骨架冻结,不许动板块(2026-10-06 用户定案):页面清单、每页板块、板块排列、跨页关系由②段《界面布局》定死。
⛔ 本段不许新增 / 移动 / 删除 / 合并板块。做不下来 / 觉得缺板块 ⇒ 回②段改《界面布局》,⛔ 不许就地加一块,就地加会让②段与原型不一致,下一个读原型的人拿到的是错的骨架。
可动的是板块内的视觉与交互实现(怎么排版好看、点哪有什么反馈、空态怎么呈现、响应式怎么变)。
⛔ 不许无视②段骨架另起一套。D0 的页面清单与每页板块必须与②段《界面布局》逐条对得上;对不上就停下来问②段要哪一版。
- 声明制:开工前、每进一个子步、每处偏离,都要声明(当前子步 / 依据文件 + 小节号 / 产出落点)。不许静默偏离。段末必须附偏离单,没有偏离单不得报完成。
- 设计工程供给默认是 `open-design`(三处:设计系统 / 工艺规约 / 原型模板,按需取用);冲突处以本段与 `DESIGN.md` 为准。不许跳过 Gate-1 或 Gate-3。
⚠️ `open-design` 不可得时(它只在工作区级,别的工作区可能没有)⇒ 见上方「不可得时的回落」:由 `oil-ui-pro` 顶方向探索与评审,但定调与工艺数值判据会没有来源,⛔ 不许凭感觉编。
- 页型先判再动手(2026-10-05 新增):3a 的 D0 必须写出「营销页 / 工具型页面 + 依据」。工具型页面零 `.eyebrow` / 零 `.lead` / 零 `.hero`,三者已从种子删除或降级为 `body.is-marketing` 专用。⛔ 判不出页型不许进 3b。
- `open-design` 的 `web-prototype` 种子是营销落地页骨架:⛔ 工具型页面不许直接套用其版式节奏与标题区结构;版式走本技能 `references/layouts-tooling.md`。这是一处「照供给做反而错」的例外,必须显式绕开。
- 先定死,再写码:设计契约与令牌表未落笔,不许写任何组件代码。
- 限载:一次只读 1~2 份供给原文,用完释放(`design-systems/` 153 套、`craft/` 13 份,全读必然互相稀释)。
- 不许覆盖旧版:重大改版先复制副本再改(`X.html` → `X v2.html`),旧版留在磁盘上以便对比。
- 3a 必须在 3b 之前,规范是原型的输入。
- 门禁脚本只作校验,不是原型生成工具。出原型只用 3b(脚本当前缺失,见 3d 的「门禁脚本现状」)。
- 原型必须可点通:每个按钮、每个跳转都真能走,不许留死链。可点通的清单就是 D0 契约的「交互清单」,清单之外的可点元素 = 未登记元素,必须回 D0 补登记或改成静态,⛔ 不许「清单没写但先做着」。
- 交互清单是唯一交互真相源(2026-10-02 新增):段名已改为「界面交互」,故交互判据只许写在契约第十二字段里。3b 实测、3c 会诊、3d 终检都引用同一张表,⛔ 任何一处另立一份交互清单(另建文档、另写章节、另做交互规范)都算第二真相源,这正是记忆里「同一事实多处落点必然打架」的成因。
- 3b 交付前必须用 `browser-harness` 跑实测;脚本查不出死按钮,未跑实测不得进 3c,不得报完成。
- 3c GPT 会诊必做:原型初稿 + 实测过后立刻做,不许用「我觉得没问题」代替。回答原文必须落盘,不得伪造或转述失真;未取得外部审查时要在 `3c-GPT会诊.md` 与收尾里明示,未取得不等于已通过。上传前先脱敏。
- Gate-2 / Gate-3 不许口头通过:阻断项要么修完,要么留痕;「未取得审查」不等于已通过。
- 原型的说明区与演示引导不是本段的事:各状态下的「场景 / 从左到右流程图 / 步骤说明 / 演示引导」由第④段 `stage-proto-doc` 负责。3d 完就交付原型本身。
- `DESIGN.md` 落 `docs/pm/<项目>/`,不放仓库根。
- 段内子步之间不反问,做完直接进下一个子步。只有三种情况停:信息不足且查不到、破坏性/不可逆动作、用户显式要求。
- `<项目>` 按 `product-planning` 的「项目与路径约定」定;定不出来就停下问用户,不许猜。
## 完成标准
- 声明制走完:开工、每个子步、每处偏离都有声明;偏离单已附,无静默偏离
- 挡位已声明(快速 / 标准 / 严格)
- 页型已判(营销页 / 工具型页面 + 依据);工具型页面零 `.eyebrow` / 零 `.lead` / 零 `.hero`,且 `layouts-tooling.md` §5.5 五条逐条过完(含「标题区零从属小字」的 DOM 取值核对)
- `docs/pm/<项目>/DESIGN.md` 存在,含设计契约(十二个字段,含结构骨架、交互清单与重复项的信息量)与令牌表(三层 token 结构,含组件规格、容器与对齐锚点、浮层只许一个可见关闭出口,全为具体值),且 Gate-1 全部自检项结果写在文件末尾
- 原型 HTML 单文件自包含、双击可开,含全部适用状态(状态穷举六项逐条有结论)
- 原型经真实渲染验证过,控制台无报错
- 每个按钮都经 `browser-harness` 真点过,有实测回报(含控制台报错原文与死按钮清单)
- 静态收口已过(脚本在位 ⇒ 已跑且阻断清零、有输出留档;脚本缺失 ⇒ 已按 checklist 人工过,并在报告中写明「未跑脚本 + 原因」)
- 渲染终检已过(溢出 0 / 对比度按真实像素达标 / 结构与排版量测无阻断且无「无法判定」项 / 两个视口的截图都存进 `_gate_shots/`),或已写明为何不适用。量测数字以 DOM 取值与脚本输出为准,不得用「目测」代替
- 每个浮层都手工打开数过可见关闭出口(`== 1`),`Esc`/点遮罩能关、焦点锁在层内且关闭后回到触发按钮,结论连同触发路径写进 `3d-审查报告.md`。「代码里看着只有一个」不算
- 对外提交/交付留档的截图只用视口帧(`_gate_shots/<视口>.png`);`_full/` 下的长图不得作为评审输入
- `designs/<项目>/3c-GPT会诊.md` 存在,含提问原文、模型回答原文与逐条处置(采纳项已改完并复测);未取到外部审查的已明示
- `designs/<项目>/3d-审查报告.md` 存在,含阻断/建议两张表 + 状态覆盖核对 + Gate-2/3 结论
- Gate-2 与 Gate-3 均已通过(书面结论,非口头)
- 重大改版:旧版文件仍在磁盘上,且收尾给出新旧差异(改了什么 / 为什么 / 代价)
## 反面清单
- ⛔ 就地增删板块(2026-10-06 新增):觉得骨架不合适就自己加一块 / 挪一块 / 删一块。骨架归②段,要改回②段改,本段只能动板块内的视觉与交互实现;就地改会让②段与原型不一致
- ⛔ 无视②段骨架另起一套(2026-10-06 新增):D0 的页面清单与每页板块必须与②段《界面布局》逐条对得上
- 先出原型再补规范(违反铁律 1)
- 违反限载:一次把全部 `design-systems/` 或 `craft/` 原文读进上下文(一次只许 1~2 份)
- 不判页型就照 `web-prototype` 种子做,会把后台做成营销页(标题上下各一行小字);或拿 `layouts.md` 的营销骨架顶替工具型版式
- 只画了 success 态就当状态齐了(违反铁律 3)
- 跳过 Gate-1 或 Gate-3;或拿「我觉得还行」当 Gate-2 结论
- 在无脚本时把「没跑」写成「已过」;或从零手写 `<section>` 不套骨架、把临时样式内联在标签上
- 覆盖旧版:重大改版直接改原文件,把可对比的旧版弄丢
- 把 `DESIGN.md` 写到仓库根(多项目会互相覆盖)
- 原型里有死按钮或空链接;只用脚本判过就当实测过(脚本查不出死按钮)
- 拿默认配色和系统字体糊一个「能看」的界面交差
- 跳过 3c GPT 会诊直接进 3d,或只把代码片段贴进对话框、回答没出完就取走当完整建议
- 把模型建议当命令照抄,改坏与 `DESIGN.md` 的一致性;或伪造「GPT 说……」却拿不出回答原文
- 把「未取得外部审查」当已通过
- 工具型页面做入场编排;用 `linear`/`ease` 做过渡曲线;用 `@keyframes` 做交互过渡
- 越界回头改②段的功能取舍(那是第②段)——⚠️ 但「骨架缺板块」是例外:必须回②段改,⛔ 不许就地在原型里加
- 顺手把原型说明文档 / 演示引导写了(那是第④段 `stage-proto-doc`)
## 待补(2026-10-02 登记 · 2026-10-06 更新)
- ~~`execution-runbook.md` 的必读表全部指向已不存在的文件~~:已于 2026-10-02 修复(用户定案「第三部分用 open-design」后执行)。原 D0/D3/D4/D5 四行引用的 `ui-page-design/references/0X_*.md` 与 `vendor/*` 已全部重接:`D0 → runbook §2.1`(十二字段留在本项目)|`D0 判据 → craft/state-coverage.md`|`D1 → open-design/design-systems/ 选套`|`D2 → design-templates/web-prototype/`|`D3 → craft/typography.md` + `typography-hierarchy.md`|`D4 → craft/animation-discipline.md`|`D5 → checklist.md` + `craft/anti-ai-slop.md` + `craft/accessibility-baseline.md`。
同时做了一次能力去向盘点(判据逐条归属,不做适配搬运):craft 接住 6 类(状态穷举 / 字阶 / 配色 / 动效 / 反 AI 味 / 无障碍与表单校验);接不住 3 项,必须留在本项目 —— 设计契约十二字段 / 结构骨架 / 交互清单;5 份 vendor(`ui-ux-pro-max`/`frontend-design`/`apple-design`/`anti-ui-slop`/`web-design-guidelines`)无需保留。
⛔ 修复后的纪律:判据来源必须单一可查。某条判据若在 runbook 与 craft 各有一份且口径不同,以本项目追加条为准,并在 §3.4 显式标注「本项目追加」。
- ~~工具型页面的版式库~~:已于 2026-10-02 补齐。新建 `references/layouts-tooling.md`,四类形态各给一份可判定骨架:行式列表 / 表格式清单 / 详情面板 / 主从侧区。每类带形态判定句(判不出形态就去改 D0 `结构骨架`)+ 可机械核对的判定要点(如「一屏可见行数 ≥6」「数字列右对齐」「表头必须写判据来源」「未跑必须能作为取值存在」)。已接进三处:3b 正文(形态判定先行)|runbook §1 必读表 D2 行(工具型另读)|runbook「⛔ 四样 craft 接不住」表(第四行)。
⭐ 红线:⛔ 不许拿营销页骨架顶替工具型,那是「没做形态判定」的默认行为,等于退回 18 轮前的病根。
- ~~①②段的同型改造~~:已于 2026-10-02 完成。四段已改名为「①产品需求 / ②产品功能 / ③界面交互 / ④原型说明文档」,并各自重划了子步职责(见 `product-planning` 的四段表与交接口表)。
- ⛔ 骨架归属已于 2026-10-06 反转:本节原口径是「页面结构归本段,唯一落点是 D0」;用户定案改为「②段钉骨架,③段做皮肉」(原话:页面关系和布局必须在第二步确认清楚,不然第三步没有方向 一会一个样子)。⇒ `必要内容` / `结构骨架` 两个字段口径已调整,从「本段独立裁决」改为「在②段给定骨架之内决定视觉与交互实现」。详见本文件开头「⭐⭐ 页面骨架不归本段了」块。
⚠️ 待核:`references/execution-runbook.md` 的 D0 段仍写着旧口径(「独立推导几个页面」),需同步改。另,`gate-<段号>-<段名>.md` 本项目从未建立,属存量缺口。
@@ -0,0 +1,392 @@
# ③段执行手册(固化流程)
`SKILL.md` 写规则,本文件写照着走的顺序与验收。跑③段时按本文件逐步走;任何一步偏离,必须当场声明并记入第 6 节偏离单。
> 本手册为什么存在:③段 3b 交付了原型,却走了别的主流程、没读依据文件、执行时也没声明,用户直到追问「基于哪个 skill」才知道。所以第一条是声明制,第二条是逐步写明依据哪个文件的哪一节。
> ③段的设计工程供给是 `open-design` 技能,按技能名引用,不写死相对路径(技能位置一变就失效且不报错)。流程规则与契约字段留在本手册与 `SKILL.md`。两者分工见第 1 节末的「⛔ 四样必须留在本项目」。
---
## 0. 声明制(核心,唯一不可商量的一条)
开工前先输出一段流程声明,四个字段:
| 字段 | 内容 |
|---|---|
| 当前段与子步 | 例:③段 / 3b 原型(D2 构建) |
| 主干与挡位 | 例:供给 `open-design` / 挡位「标准」(或「快速」) |
| 依据文件 | 本步照的是哪个文件的哪一节,写精确路径 + 小节号 |
| 产出落点 | 本步会写哪个文件 |
每进一个子步重发一次这四行(子步之间不反问,但必须声明)。
偏离时当场声明:
```
偏离:<原要求> → <实际做法>;原因:…;影响:…
```
并记入第 6 节。不许静默偏离,不许事后补说。
---
## 1. 必须加载的文件(按阶段加载,用完释放)
> ⚠️ 2026-10-02 已重接必读源。原必读表指向 `ui-page-design/references/02_~05_*.md` 与 `vendor/*`,该目录实测已不在磁盘上(工作区与全局技能根两处都查过),照旧表走 D0 读不到任何一份必读文档。现改为直接引 `open-design` 技能(按技能名引用,不写死相对路径)。
> 改动原则:判据类全部交出去,只保留 craft 没有对应的东西。
开工前必读两个页面设计技能的位置与分工:`open-design/craft/README.md`(读一份就知道有哪些规约、怎么按需取),以及本段 `SKILL.md` 的两技能分工表。
其余不许一次全读。同一时刻只读 1~2 份,用完释放;`design-systems/` 153 套、`craft/` 13 份全读必然互相稀释。
| 阶段 | 读什么 | 为什么 |
|---|---|---|
| D0 | 本文件 §2.1(设计契约十二字段) | craft 无对应 —— 字段清单是本项目的东西,只在这里 |
| D0 判据 | `craft/state-coverage.md` | 状态六项的逐项判据 |
| D0 页型(2026-10-05 新增) | 本文件 §2.1 步 6(先判页型:营销页 / 工具型) | 挑版式骨架之前必须先判。判错页型 = 拿营销骨架做后台,是「标题上下两行小字」的唯一根因 |
| D1 | 选定套 `DESIGN.md` + `tokens.css` + `components.html`;可选 `craft/color.md` | 定调来自选套,不来自检索脚本 |
| D1 多方向比选(按需) | `oil-ui-pro` 的 `references/design-direction.md` + `references/style-explorer.md` | 要「拉开几个方向让用户挑」时的方向卡与对比页(另一技能,平行取用) |
| D2 | `open-design/design-templates/web-prototype/SKILL.md` + 同目录 `references/layouts.md`(营销页)/工具型页面另读两份:本技能 `references/layouts-tooling.md`(HTML 骨架与落地自检)+ `open-design/design-templates/web-prototype/references/tooling.md`(四形态判定句与通用红线纲要) | 「先选定美学方向再写码」+ 版式骨架。⭐ 落地页那 8 个骨架不适用于工具型(hero/features/stats/quote/cta/log/pricing),工具型版式只在本项目那份里,不许拿营销页顶替。⚠️ 两份工具型文件是「骨架 vs 纲要」分工,判据不重写(判据正文在 `layouts-tooling.md`) |
| D3 | `craft/typography.md` + `typography-hierarchy.md`(+ 按需 `color.md`) | 字阶定值表与层级判据(取代原 `03_视觉与骨架规则.md`) |
| D4 | `craft/animation-discipline.md` | 动效三问、弹簧二参数(取代原 `04_动效与手势规则.md`) |
| D5 | `design-templates/web-prototype/references/checklist.md` + `craft/anti-ai-slop.md` + `craft/accessibility-baseline.md` | 终检清单、反 AI 味、无障碍底线(取代原 `05_审计门禁与输出格式.md`)。⚠️ 工具型页面必须过 checklist 的 `P0-A 标题区纪律`(2026-10-05 新增,五条) |
| D5 独立评审(按需) | `oil-ui-pro` 的 `references/visual-review.md` + `references/tools.md` | 要「没看过制作过程的评审打分」时的协议与截图取证(不替代本段 Gate) |
| 每步 | `docs/pm/<项目>/DESIGN.md` | 本项目绑定规范;原型只许引它的 token |
⛔ 四样东西 craft 没有对应,必须留在本项目(本文件 / `SKILL.md` / `references/layouts-tooling.md` 里):
| 留什么 | 为什么 craft 接不住 |
|---|---|
| 设计契约十二字段 | craft 是通用工艺,不定义字段清单;D0 字段是本项目的产物 |
| 结构骨架(骨架档 / 区块划分 / 密度目标) | 实测 grep 全部 craft 只有零散的 layout 提及,无成体系的骨架规则 |
| 交互清单(契约第十二字段) | 同上 —— 交互的判据在 craft 里只散见于 `state-coverage` 与表单章,不构成一份逐元素清单 |
| 工具型版式库(行式列表 / 表格式清单 / 详情面板 / 主从侧区) | `web-prototype/references/layouts.md` 的 8 个骨架是落地页/营销页向;craft 里零散提及不成体系。工具型数据密集界面的版式无任何现成来源 ⇒ 本项目自建 `references/layouts-tooling.md` |
定调来源唯一:从 `open-design/design-systems/` 选一套(153 套),按候选套 `DESIGN.md` 第 1 章 `Visual Theme & Atmosphere` 认准类型词。
本 skill 的 `references/` 只放流程规则(契约字段 + 执行顺序 + 门禁),不放任何风格底子。既有项目 `DESIGN.md` 里凡引用旧风格来源(`ui-ux-pro-max` / `minimalist-ui` / 皮肤族)的行,重跑 3a 时一律改写为「选定套名 + 留痕对照」。
已整体移除的 vendor,不必再找:`ui-ux-pro-max`(被 153 套设计系统取代)、`frontend-design`(D1 已改选设计系统)、`apple-design`(动效已由 `craft/animation-discipline.md` 覆盖)、`anti-ui-slop`(按本项目收录标准「依赖外部服务」整体移除,判据由 `craft/anti-ai-slop.md` 接管)、`web-design-guidelines`。
⚠️ 判据一旦落进本项目的条款,就不再依赖原出处的存续。上面五份的可执行内容已在 `SKILL.md` 铁律、`craft/` 与本文件里,删掉原出处不影响执行。
---
## 2. 3a 视觉规范(D0 锚需求 + D1 定调 + Gate-1)
### 2.0 供给核对(步 −1,每轮必做)
`open-design` 是外部供给,会被上游更新,而本项目的 `DESIGN.md` 是上一次供给状态下产出的。不核对就长期拿旧调性当准绳:换套后门禁判不过,却不知道哪条变了。
| 步 | 动作 | 验收判据 |
|---|---|---|
| −1 | 确认三处供给仍在位:`design-systems/`(并记录本项目选定套名)、`craft/`、`design-templates/web-prototype/` 都存在 | 三处都在位;`DESIGN.md` 记录的上次套名已找到 |
| −1b | 套名一致 → 直接进 D0 | 开工声明里写一句「选定套 `<套名>`,与项目记录一致」 |
| −1c | 套名不一致或供给缺失 → 停下报告,不许拿别的套顶上,也不许凭记忆写风格 | 产出供给变更清单(逐条:变了什么 → 本项目现状 → 要改什么),在会话里呈现并获用户确认后才改 `DESIGN.md` |
> 不要静默跳过:一致也要在开工声明里写一句套名;不一致必须停下,这是硬闸。
### 2.1 D0 锚需求 → 设计契约
> ⭐⭐ 口径(2026-10-06 用户定案):骨架归②段,本段做皮肉。
> ②段《界面布局》里的页面清单、每页板块、板块排列、跨页关系就是骨架定稿。本段不许增删移动板块,要改回②段改。本段在给定骨架内决定视觉与交互实现。
> 理由(用户原话):「页面关系和布局必须在第二步确认清楚,不然第三步没有方向 一会一个样子」。
> ⛔ 仍归本段的:配色 / 字体 / 间距 / 组件样式 / 动效 / 板块内的排版与交互行为 / 响应式。
读②段时取四样:骨架(页面清单 + 每页板块 + 排列 + 跨页关系)、必须在界面上发生什么、红线、禁用条件与状态流转。
骨架是冻结输入,其余三样是功能约束。
按本节清单产出设计契约,十二个字段:页面职责(「让<谁>在<多久>内<完成什么>」)、主用户、主操作(全页唯一,写了两个就该拆页)、必要内容(核对面)、重复项的信息量(行式列表 / 卡片网格时逐条列出:每个重复项除「主标识 + 动作」外必须带 ≥1 条次级信息)、结构骨架(翻译面:把②段板块清单翻成骨架档 + 列宽 + 密度目标)、交互清单(2026-10-02 新增:逐个可点元素一行,四列「元素 / 触发 / 反馈 / 何时不可点」;动效参数归 3d、视觉样式归令牌表、「这个状态有没有」归下一字段状态覆盖)、状态覆盖六项逐条、组件来源(优先沿用既有)、响应式行为(写布局怎么变,不写「自适应」)、明确拒绝的模式(≥3 条可判定)、验收标准(可观察可判定)。
两个字段的分工(2026-10-06 调整):`必要内容` 是核对面,`结构骨架` 是翻译面。
> `结构骨架`(翻译面)怎么落(规则留在本手册,craft 无对应:实测 `craft/` 只有零散 layout 提及,不构成骨架规则):
> ⭐ 输入是②段的板块清单,本字段做的是翻译,不是发明。
> ① 骨架档:单列 / 主区+侧区 / 主区+侧区+辅助区,选一档并写清理由。有 ≥3 个并列目的地且宽屏 ≥1024 时优先侧栏,但侧栏是项目级取舍,不许写死成「必须没有」。
> ② 板块落位:把②段给的板块按顺序放进骨架档,每块给一个文字标题(页面 ≥2 个带文字标题的板块)。
> ③ 密度目标:宽松(24–96)/ 标准(16–64)/ 密集(8–32),同一页面不得混用两档。
> ⛔ 不许在②段板块清单之外加块,缺板块回②段改。
> 板块先分、内容后放,顺序反了就只能得到一张平铺的长条。
> `必要内容`(核对面)的判据不变,但用途变了。
> 判定标准仍是模板里那句「只留缺了就做不成事的」。
> 逐条问:这条内容删掉,主操作还做得成吗?做得成,它就不该主屏常驻(②段分档表已定档位)。
> ⚠️ 本段不得以 `必要内容` 为由增删②段已定的信息档位。档位归②段,本段只做落位核对。
> 本段该做的是:核对②段的「主屏常驻 / 可点入」分档,在本段自己的视觉与交互实现里兑现它(常驻的零点击可见、可点入的一次点击可达)。
> 危险信号:`必要内容` 与②段分档表逐条对不上(条数差很多、档位被改)→ 停下来说明,不自行改档。
> 反面样例(本项目真实踩过):版本列表的 `必要内容` 只该有「`vN` + 语义名 + `第 N/5 步` + 状态徽章 + 时间戳 + 行尾当前动作」,实际却把每行那句解释性长文案(「目录建好了,还没有登记原始需求。」)也当成必备内容渲染上去,于是每行多出一整句、页面变成信息墙。
| 步 | 动作 | 验收判据 |
|---|---|---|
| 0 | 读②段《界面布局》,把骨架当冻结输入取走 | 页面清单与每页板块逐条抄进契约,未增删移动 |
| 1 | 产出设计契约 | 十二个字段全填,无空、无「待定」;有重复项时「重复项的信息量」已逐条列出次级信息;交互清单覆盖页面上每一个可点元素 |
| 2 | 状态覆盖逐项给结论 | 六项要么勾选,要么写「不适用 + 理由」 |
| 3 | 核对②段分档表:每条信息的「主屏常驻 / 可点入」 | 与②段分档表逐条对得上;档位未被本段改动(要改回②段) |
| 4 | 落 `结构骨架`:把②段板块清单翻成骨架档 + 列宽 + 密度目标 | 骨架档给了理由;板块 ≥2 个且每个有文字标题;板块清单来自②段、未新增;密度目标只取一档 |
| 5 | 自检块间距 ≥ 块内间距的 2 倍 | 块间 32/64、块内 8/12/16,比值 ≥2(写进令牌表) |
| 6 | 判页型(2026-10-05 新增,D2 之前必做):写一句「本页是营销页还是工具型页面,依据是什么」 | 结论明确且给了依据。判不出来不许进 D2,停下来回改 `结构骨架` |
> ⭐⭐ 步 6「判页型」是 2026-10-05 新增,补的是一处从未有过落点的缺口。
> 病灶实测:本项目原型长出「标题上方一行小字眉标 → 大标题 → 下方一行灰色副标题」的三段式。
> 根因不在③段执行:`open-design` 的种子 `assets/template.html` 是营销落地页骨架,CSS 里自带 `.eyebrow`(眉标)与 `.lead`(副标题),`layouts.md` 的 8 个骨架里有 6 个在用,而当时的 checklist 甚至明令保留(「Lead text under 56 ch … don't override」)。
> 于是照种子做 = 结构全绿 + 排版难看:判据判的是「类名合法」,判不出「这不是工具界面的排版」。页型不判,后面用什么设计系统、怎么打磨都救不回来。
>
> 两个页型的目的不同,骨架因此不能通用:
> - 营销页(落地页 / 首页 / 定价页):目的是说服,走「主张 → 论据 → CTA」,可用 hero / eyebrow / lead。
> - 工具型页面(后台 / 控制台 / 列表 / 详情 / 看板 / 表单):目的是完成一件工作,走「数据 + 操作」,零 `.eyebrow`、零 `.lead`、零 `.hero`(三者已在种子中删除或降级为 `body.is-marketing` 专用)。
>
> 判别口径:页面要用户「下决心去做某事」是营销页;要用户「把这件事做完」是工具型页面。
> ⚠️ 判不准时按工具型处理(默认取严)。
### 2.2 D1 定调 → 令牌表
从 `open-design/design-systems/`(153 套)选一套,不凭感觉编、不全读:
| 步 | 动作 | 验收判据 |
|---|---|---|
| 1 | 按本项目的页面类型挑候选(工具型数据密集界面 ⇒ 认 `data-dense, enterprise` 这类描述) | 已列出 2~3 个候选套名 |
| 2 | 读候选套 `DESIGN.md` 第 1 章 `Visual Theme & Atmosphere`,认准写明该类的那一句 | 选定一个套名,理由写进会话声明 |
| 3 | 选定后读三件:`DESIGN.md`(调性 / 色值 / 字号刻度 / 间距刻度 / 动效基调)→ `tokens.css`(圆角与阴影只有这里)→ `components.html`(组件实际长相) | 三件读过,数值来源可指认 |
| 4 | 没找到匹配的套 ⇒ 换一个类型词再挑一次;仍不行就直说「未找到匹配」 | 不许把泛化结果当结论落盘 |
> ⚠️ 153 套分两代模板(A 组 / B 组章节名不同),按自己那套的章节读,不必统一。
> ⚠️ 工具型页面的版式不在模板里:`web-prototype/references/layouts.md` 那 8 个骨架是落地页 / 营销页向,工具型页面只适用 Layout 7 日志列表与 Layout 8 对比表;其余套上去会把后台做成营销页。工具型版式由 D0 的 `结构骨架` 决定,不从模板抄。
产出令牌表:风格名、来源(选定套名 + 套的章节)、浅深色色值、字体(标题字体是关键项)、间距两档(主刻度 `4/8/16/24/32/64` 供布局,控件层微网格 `2/4/6/8/12` 仅供按钮内衬、徽章内衬、图标间隙、开关与进度轨微几何)、圆角(按组件类各一个值)、字阶定值表(七档各一个 px,不是区间)、高度层级(每层都有多层叠层值)、布局脚手架(骨架档落到具体列宽 + 窄屏变化)、组件规格(按钮三档 + 卡片两档 + 输入框 + 徽章的具体高度 / 内衬 / 字号)、动效基调。全部为具体值,禁止「待定」;每档只许一个定值。
> 数值判据来自 `craft`:`typography.md`(刻度)、`typography-hierarchy.md`(层级行为)、`color.md`(配额与对比度,正文 4.5:1 / 大字 3:1 / UI 组件 3:1)。这三条定「怎么定」,选定套的 `tokens.css` 定「定成多少」。
> 字阶必须是定值表,不是区间。实测病灶:令牌表写「标签 12–13px」,代码落到 12.5px —— 既不在刻度上,又与正文档(14px)只差 1.5px,两档合计承载 68% 文字却拉不开层次。相邻档差 ≥2px,且每一档要承载 ≥40% 文字节点,否则等于没有分档。
> 间距为什么要有第二档:实测某页 55% 的 padding 落在 `3/5/9px`,全是按钮内衬与徽章内衬;只有一套主刻度时,例外会变成主路径。微网格取偶数,`3px` / `5px` 等于没有网格。
> 组件规格是「草稿感」的分水岭。同一屏里按钮高度不一、内衬不一、字号不一,观感立刻散。分档靠填充色 + 高度,不靠字号;同一父区块内主档 ≤1 个(多步流程每步 ≤1 个);实底按钮底色至少 2 种(全是同一个实底色,等于没有分档);卡片内衬只许两档(密卡 / 宽松卡),同层级卡片圆角与内衬必须同值。
### 2.3 落盘 `docs/pm/<项目>/DESIGN.md`
令牌表内容并入本项目既有的三层 token 结构:`primitive → semantic → component`。组件层只引语义层,语义层只引 primitive,无孤立 token。设计契约作首节。
`DESIGN.md` 是原型的绑定规范,原型只许引用它的 token。放项目目录、不放仓库根。
### 2.4 Gate-1 方向门(硬闸,任何挡位不可跳)
按 `SKILL.md` 的 Gate-1 自检表逐项自检,并把结果写在 `DESIGN.md` 末尾:
| # | 检查项 | 通过条件 |
|---|---|---|
| 1 | 设计契约 | 十二个字段全部填写,无一为空或「待定」;有重复项时「重复项的信息量」逐条列出次级信息;交互清单四列齐全,且表外的可点元素为 0 |
| 1b | 页型判定(本项目附加,2026-10-05 新增) | 已写出「营销页 / 工具型页面 + 依据」;工具型页面的 D0 里零 `.eyebrow` / 零 `.lead` / 零 `.hero` |
| 2 | 结构骨架(翻译面,2026-10-06 口径调整) | 骨架档 / 板块落位 / 密度目标三者已写;板块 ≥2 个且每个有文字标题;板块清单来自②段、逐条对得上、未新增;②段分档表的每条信息都有落位 |
| 2b | 骨架未漂(本项目附加,2026-10-06 新增) | D0 的页面清单与每页板块与②段《界面布局》逐条对得上;本段未增删移动任何板块 |
| 3 | 状态覆盖 | 六个状态逐项有结论(勾选,或「不适用 + 理由」) |
| 4 | 令牌表 | 色值 / 字体 / 间距两档且适用面已分开写 / 圆角 / 阴影全为具体值 |
| 4b | 字阶定值表 | 七档每档一个 px 定值(不是区间);相邻档差 ≥2px;每档只许一个定值 |
| 4c | 高度层级 | 每层都有多层叠层值;同层级同值 |
| 4d | 布局脚手架 | 骨架档已落到具体列宽;窄屏变化写具体 |
| 5 | 组件规格 | 按钮三档 + 卡片两档 + 输入框 + 徽章均为具体值;同一父区块内主档 ≤1;实底底色 ≥2 种 |
| 6 | 反 slop | 无紫→粉渐变、标题未用禁用字体、强调色已写明允许位置 |
| 7 | 拒绝清单 | ≥3 条,且每条可判定 |
| 8 | token 引用完整性(本项目附加) | 语义层只引 primitive、组件层只引语义层、无孤立 token |
| 9 | 分档兑现(本项目附加,2026-10-06 口径调整) | ②段分档表每条信息的「主屏常驻 / 可点入」在实现里兑现(常驻零点击可见、可点入一次点击可达);档位未被本段改动(要改回②段) |
| 10 | 供给核对(本项目附加) | 三处供给已确认在位;选定套名与 `DESIGN.md` 记录一致;不一致时供给变更清单已获用户确认并写入修订记录 |
任一项不过 → 停在 3a 补齐,不进 3b。
> 对比度怎么算:静态按 CSS 变量叠加后的计算值不可靠,须在 D5 渲染阶段按真实像素复测(判据见 `craft/color.md`:正文 4.5:1 / 大字 3:1 / UI 组件 3:1)。
> 不许拿 `npx @google/design.md lint` 当关卡(本机实测完全不可用:alpha + clack 交互库,非 TTY 管道下静默且 exit 0,见 `SKILL.md`)。也不要因它无输出就认为通过。
---
## 3. 3b 原型(D2 构建)
### 3.1 读谁、照什么走
读 `open-design/design-templates/web-prototype/SKILL.md`,按它「先选定一个明确的美学方向(允许极端,但必须自洽)再写码」的路线构建。方向定死在 `DESIGN.md` 的令牌表里,不许边写边调样式(铁律 1)。
### 3.2 工作形态 vs 交付形态(本项目已知偏离,每次都要声明)
- `web-prototype` 的默认产出是单文件 HTML、自包含、双击可开。这也是交付形态,最终必须满足
- 本项目的原型用 React + Babel 多文件开发(`index.html` + 若干 `.jsx`),经 HTTP 服务预览(`file://` 下 Babel 取不到外部 `.jsx`,会静默失败)
- 编排:开发期按多文件走 + HTTP 预览,3b 收尾时内联成单文件交付
- 无宿主工具可代劳,内联必须手工做:把 React / ReactDOM / Babel 用本仓本地副本内联(保离线),把每个 `<script type="text/babel" src="…">` 换成内联 `<script type="text/babel" data-presets="react">`,并去掉所有 unpkg CDN 引用。这是一处持续偏离,每次都要声明。
内联后必须自检三条:无 `unpkg` 残留、无 `src="v2/`(外部 jsx 引用)残留、根部挂载点仍在。任一不满足即构建失败。
### 3.3 输出红线(命中即返工)
来源:数值判据取 `craft/`(`typography.md` + `color.md` + `accessibility-baseline.md`),反 AI 味取 `craft/anti-ai-slop.md`,版式自查取 `web-prototype/references/checklist.md`。下列判据不在 craft 里重复抄写,只写本项目追加的那几条。
- 间距只用令牌表登记的刻度值;确需中间值(如紧凑表格行高)在令牌表登记,不许临时拍。刻度外值混用是「廉价感」的主要来源(判据见 `craft/typography.md`)
- 数字列用 `font-variant-numeric: tabular-nums`(否则刷新时宽度跳动,表格跟着抖)
- 禁单层死黑重阴影,用多层叠层 + 1px 半透明边框。层级按内容需要,不设人为上限;判的是「同层级是否同值」,不是「层级总数是否超标」
- 强调色全屏面积 ≤5%(判据见 `craft/color.md`);状态色只用红绿黄三系,不做装饰
- 标题禁用 Inter / Roboto / Arial / `system-ui`(正文可用);中文字重别超 600(`craft/typography.md`)
- ⭐ 结构四条(本项目追加,craft 无对应):① 区块 ≥2 个且每个有文字标题(图标 / 徽章 / 分组容器不替代标题),标题不跳级;② 实际在用字号档 ≥3 档且相邻档差 ≥2px,正文档落在 14–16;③ 块间距 ≥ 块内间距的 2 倍;④ 按钮有主次分档且同屏主档 ≤1(多步流程每步 ≤1),分档靠填充色 + 高度
- 反 AI 味逐条过 → `craft/anti-ai-slop.md`。⚠️ 「卡片墙」判的是「同一圆角 + 同一阴影 + 所有模块视觉权重完全相同」的等权卡片墙,不是「用了卡片」。有主次、有分组、层级不同的卡片是合法结构手段,别把卡片当禁区整片封掉
- 状态穷举六项 → `craft/state-coverage.md`(loading / empty / error / success / disabled / 无权限,逐项判据在那份)
- 布局 Grid 管栅格、Flex 管行内对齐;移动优先,断点 `<640` / `640–1024` / `>1024`
- 防溢出三件套:grid 写 `minmax(0,1fr)`(不是 `1fr`)、flex 子项加 `min-width:0`、表格 / 代码块外层 `overflow-x:auto`
- 交互态齐全:`hover` / `active` / `focus-visible` 三态都要写,焦点环不许被 `outline:none` 抹掉(`craft/accessibility-baseline.md`)
- 规范 HTML:非空元素显式闭合、属性双引号
- 文件名要有描述性;集中放 `designs/<项目>/`,不散落仓库根
### 3.4 本项目附加纪律(`open-design` 未涉及)
- 重大改版必须复制副本再改(`X.html` → `X v2.html`),不许覆盖旧版。旧版留在磁盘上以便对比(版本管理主线需要可追溯)
- 原型里的状态由路由 + 演示开关驱动,不是 `?state=` URL 参数;实测时按这个来
### 3.5 实测硬关卡(未过不得进 3c)
用 `browser-harness` skill,以 D0 契约的「交互清单」为唯一清单逐个真点:每行按「触发 → 反馈」实跑;空 / 加载 / 错误 / 失败重试四态都要走到;回报控制台报错原文与「点了没反应」的元素清单。
- ⛔ 本步是唯一的可点通过道。不许因「没有自动机检」就跳过或降级;实测不过就不许进 3c
- 实测一律走 `browser-harness`(浏览器入口 9333),禁用 Trae 自带浏览器工具
- React 受控输入用 `fill_input(selector, text)` 填,不要用 `type_text()`(后者绕过框架监听器,提交按钮会一直是禁用态)
- 测前禁缓存(`Network.setCacheDisabled`),否则会读旧 `.jsx`
- 顺序也是关卡:3a 未过 Gate-1 不进 3b;未跑实测不得进 3c
---
## 4. 3c GPT 会诊(必做,顺序在 3d 之前)
触发点:3b 原型初稿和实测都过了,立刻做。步骤、提问模板、四列处置表、输入边界、异常情况见 `SKILL.md` §3c,不在此重复。
为什么必须有这一步:3a / 3b 全是本地确定性检查,没有外部视角,这一步补的正是它补不了的那块。
三道不可松的口子:① 用附件上传原型 HTML,不许把上万字符代码粘进输入框;② 等回答出完再取原文,不许读一半;③ 上传前脱敏(密钥、真实数据、内网地址换占位符)。
取不到时:不许假装跑过。落盘写明「本轮未取得外部审查」,并在段末明示 —— 未取得不等于已通过。
处置:采纳要给理由,与 `DESIGN.md` 或②段冲突的写清为什么不采纳。采纳项在 3d 之前改完,并回到 3b 的实测清单把这些改动再点一遍。
---
## 5. 3d 审查与打磨(D3 收口 + D4 动效 + D5 终检 + Gate-2/3)
### 5.1 D3 收口(管"写得对不对")
对照 `open-design/design-templates/web-prototype/references/checklist.md` + `craft/typography.md` / `typography-hierarchy.md` / `color.md` / `accessibility-baseline.md` 逐条过。
> 🔴 本步一律人工过(2026-10-02 用户定案:不重要的相关内容一律删,不建替代脚本)。判据有三处来源,不许跳过任一处:
> ① `SKILL.md` 的 Gate-1 自检表 | ② `craft/` 四份规约 | ③ 下列本项目追加判据。
本项目追加判据(craft 无对应,必须留在这里):
- 结构四条:① 区块 ≥2 个且每个有文字标题,标题不跳级 | ② 实际在用字号档 ≥3 档、相邻档差 ≥2px、正文档落在 14–16 | ③ 块间距 ≥ 块内间距的 2 倍 | ④ 按钮有主次分档且同屏主档 ≤1
- ⭐ 工具型页面五条(本项目追加,2026-10-05):标题区零从属小字 | 导航带标签 | 并列卡有主次 | 分组不靠边框 | 无假控件。逐条判据与机械核对法在 `references/layouts-tooling.md` §5.5,不在此重复展开
⚠️ 其中「标题区零从属小字」与 `web-prototype/references/checklist.md` 的 `P0-A` 是同一判据的两处落点:checklist 管「怎么写」,本节管「怎么量」,口径一致,判据正文只在 `layouts-tooling.md` §5.5.1
- 间距只用令牌表登记的刻度值,确需中间值先登记
- 数字列用 `font-variant-numeric: tabular-nums`(否则刷新时宽度跳动)
- 禁单层死黑重阴影,用多层叠层;层级按内容需要,判的是「同层级是否同值」,不是「层级总数超标」
- 防溢出三件套:grid 写 `minmax(0,1fr)`、flex 子项加 `min-width:0`、表格 / 代码块外层 `overflow-x:auto`
- 交互态齐全:`hover` / `active` / `focus-visible` 三态都写,焦点环不许被 `outline:none` 抹掉
> ⚠️ 判据以「内联后的交付单文件」为准。扫多文件开发目录会出幻影阻断(片段文件里当然找不到 CSS 里才有的规则)。本地曾实测整目录扫出 9 条幻影阻断。
### 5.2 D4 动效(可跳过)
按 `craft/animation-discipline.md` 先答动效三问:① 它传达什么信息?② 删掉会丢失什么?③ 是不是为了「看起来高级」?答不出就不加。
- 工具型页面(仪表盘 / 后台 / 编辑器 / 工作台)禁止入场编排:用户一天开几十次,每次播一遍是折磨。本项目的版本管理界面属工具型;判不准时按工具型处理
- 弹簧用 Damping / Response 二参数(Damping 保持 0.8–1.0、Response 0.3–0.4s;低于 0.7 会明显「蹦」)
- CSS 无法用真弹簧时用 `cubic-bezier(0.32, 0.72, 0, 1)`;过渡曲线不得用 `linear` / `ease` / `ease-in-out`
- 交互过渡禁 `@keyframes animation`(不可中断,反向操作会跳帧),用 `transition` 或 WAAPI
- 只动 `transform` / `opacity`,不动 `width` / `height` / `top` / `left`;禁止 `scale(0)` 起手(用 `scale(0.95)` + opacity)
- 退出比进入快(进 300ms / 出 200ms);同屏动效元素 ≤3 个且有 30–50ms 错峰
- `prefers-reduced-motion` 必须处理
### 5.3 D5 终检(管"能不能交")
过 `craft/state-coverage.md`(状态穷举)+ `craft/anti-ai-slop.md`(反 AI 味)+ `web-prototype/references/checklist.md`(P0/P1)+ 动效三问 + 交互清单逐行复测,并真渲染一次。
> 🔴 渲染复测用本机 Chrome 无头截图(2026-10-02 实测可用):
>
> ```bash
> "/c/Program Files/Google/Chrome/Application/chrome.exe" --headless=new --no-sandbox --disable-gpu \
> --hide-scrollbars --window-size=1440,900 --virtual-time-budget=3000 \
> --screenshot="<Windows 绝对路径>/P1.png" \
> "file:///<原型绝对路径,中文需 URL 编码>#/p/xxx"
> ```
> ⚠️ 两条坑:`--screenshot` 必须给 Windows 绝对路径(给相对路径会写进 Chrome 安装目录,回来找不到);中文文件名要 URL 编码。
> ⛔ 脚本缺失期间,截图只替代「看得见的」那部分:溢出与响应式破损能看出来,对比度 / 状态可见性 / 点击目标尺寸 / 死按钮判不了,那些仍按 5.1 的人工判据 + 3b 的 `browser-harness` 实测走。
> 截图两种形状,用途不许混:
>
> | 形状 | 尺寸 | 用途 |
> |---|---|---|
> | 视口帧 | 1440×900 / 390×844 | 对外评审、提交外部评估、交付留档一律用这张 |
> | 整页长图 | 视口宽 × 整页高 | 仅自检「整页有没有塌」,不对外 |
>
> ⚠️ 混用会出事(本项目实测踩过):把长图当参考图交出去,移动端是 1:7.1 的长条、桌面端 1440×1429,「首屏」这个信息整个丢失。外部评估只能按长条理解布局,「首屏有没有主次」「坐得下几行」根本没被评审到。
>
> 两个视口都要截(`1440x900` 与 `390x844`),只截桌面端等于没测响应式。
>
> 结构与排版仍要量(脚本缺失期间靠 DOM 取值人工量):字号档数与相邻档差 / 正文档承载占比 / 标题大纲 / 按钮高度与实底分档 / 列对齐 / 对齐锚点 / 浮层可见关闭出口唯一。⛔ 不许目测截图下结论,取值结果直接抄进 `3d-审查报告.md` 的结构核对表。
>
> 本项目是 hash 驱动路由,hash 接在文件名后(`<原型>.html#/p/xxx`);不接就渲染到空壳视图,截图与数字全是假的。
>
> 「无法判定」一律按未通过对待(「判不了」≠「没问题」):浮层类在未打开态必然判不了,必须按 Gate-3 的打开态复测口径,用 `browser-harness`(复用同一页签)逐个打开浮层再数可见关闭出口,与 `Esc` / 点遮罩 / 焦点锁三条一起留痕。
契约里写了数字的,逐条取值回填(`05` §二 第 11 项,阻断级)
脚本不认识项目自定义选择器(`.ver-row` 之类),所以契约里的数字 —— 首屏条数、单条行高、承载占比、面积占比、对比度比值 —— 没有任何一道机检会替你核。它们是全篇最像「已经验过」的一类内容。
- 用 `browser-harness` 或 DOM 取值,按契约声明的视口量(本项目是 `1440×900` 与 `390×844`);`browser-harness` 必须复用同一个页签(`list_tabs()` → `switch_tab()` → `goto_url()`,不要 `new_tab()`)
- 回填的是实测值,不是复述契约值;把「契约值 / 实测值」并排列进 `3d-审查报告.md` 的结构核对表
- 不得目测,不得沿用上一版数字
- 契约没声明判据的档位(例如本项目窄屏的行高)如实记为证据缺口,不要临时编一个阈值凑上
- 反面案例(`DESIGN` §8.10 E-18):某轮契约写「单个版本行高 ≤96px / 1440×900 首屏 ≥5 行」,是凭印象写的,真渲染才发现是 118px / 3 行,两个数字同时不达标,而当时没有任何门禁会报它
### 5.4 Gate-2 完成门
全部 `阻断` 项清零,`建议` 项逐条有结论:修掉,或显式写「已知不修 + 原因」。
不接受「基本没问题」「应该差不多」「剩余都是小问题」。每条要么修,要么留痕。
### 5.5 Gate-3 交付门(硬闸,任何挡位不可跳)
真实渲染后(浏览器打开,非只看代码)肉眼过八项:裁切 / 重叠 / 失真 / 失效控件 / 缺状态 / 响应式破损 / 控制台报错 / 字体回退异常。
无头截图已代劳其中的溢出与响应式破损,其余仍需人眼(截图查不出「点了没反应」,那靠 3b 的 `browser-harness` 实测)。
落盘 `designs/<项目>/3d-审查报告.md`,按 `05` §五的模板:范围 + 挡位 + 阻断项表 + 建议项表 + 状态覆盖核对表 + Gate 结论。
---
## 6. 偏离单(本段收尾必须附)
| # | 原要求(文件:小节) | 实际做法 | 原因 | 影响 | 处置 |
|---|---|---|---|---|---|
| | | | | | 已修 / 持续偏离 / 待用户裁定 |
本项目长期挂账的偏离(每次执行都要重新声明状态):
| # | 项 | 状态 |
|---|---|---|
| A1 | `web-prototype` 默认产出单文件 HTML;本项目开发期用 React+Babel 多文件,交付时手工内联成单文件(无宿主工具可代劳:`super_inline_html` / `present_fs_item_for_download` 在 Trae 都不存在) | 持续偏离,3b 收尾做内联并自检三条 |
| A2 | 宿主下载 / 预览工具不存在(`SendUserFile` / Claude Preview MCP) | 按 `SKILL.md` 适配注记:改 Write 落盘 + `browser-harness` 实测 |
| A3 | 实测必须用 `browser-harness`(浏览器入口 9333),禁用 Trae 自带浏览器工具 | 项目既定约束,优先级高于手册的通用说法 |
| A4 | 预览服务端口用 4311(`python -m http.server 4311 --directory designs`) | 与 9333 不冲突:4311 是服务,9333 是自动化浏览器入口 |
没有偏离单就不得报完成。
---
## 7. 完成标准(逐条可核对)
- [ ] 声明制走完:开工、每个子步、每处偏离都有声明;挡位已声明(快速 / 标准 / 严格)
- [ ] 第 1 节必读表已按阶段取用;同一时刻只读 1~2 份,未一次性全读(限载)
- [ ] 供给核对做过:三处供给在位、选定套名与 `DESIGN.md` 记录一致;不一致时供给变更清单已获用户确认并写入修订记录
- [ ] `docs/pm/<项目>/DESIGN.md` 存在,含设计契约(十二个字段,含结构骨架、交互清单与重复项的信息量)与令牌表(三层 token 结构,含组件规格 + 字阶定值表 + 高度层级 + 布局脚手架(含容器与对齐锚点)+ 浮层只许一个可见关闭出口,全为具体值)
- [ ] 骨架未漂(2026-10-06 口径调整):D0 的页面清单与每页板块与②段《界面布局》逐条对得上;本段未增删移动任何板块
- [ ] 分档已兑现:②段分档表每条信息的「主屏常驻 / 可点入」在实现里兑现;档位未被本段改动
- [ ] `结构骨架` 已落:骨架档给了理由;板块 ≥2 个且每个有文字标题;板块清单来自②段;密度目标只取一档
- [ ] 页型已判(营销页 / 工具型,给了依据);工具型页面零 `.eyebrow` / 零 `.lead` / 零 `.hero`,且 `layouts-tooling.md` §5.5 五条逐条过完(含「标题区零从属小字」的 DOM 取值)
- [ ] Gate-1 全部自检项结果写在 `DESIGN.md` 末尾,无一项不过
- [ ] 原型 HTML 单文件自包含、双击可开,内联自检三条通过(无 unpkg / 无外部 jsx 引用 / 挂载点在)
- [ ] 状态穷举六项逐条有结论(`05` §三第 1 项)
- [ ] 每个按钮、每个跳转都用 `browser-harness` 真点过,含空 / 加载 / 错误 / 失败重试四态,并回报控制台报错原文与「点了没反应」清单
- [ ] `designs/<项目>/3c-GPT会诊.md` 存在,含提问原文、模型回答原文、四列处置表;未取到已明示
- [ ] D3 收口已按 5.1 三处判据人工过完:Gate-1 自检表 + `craft/` 四份规约 + 本项目追加判据,阻断项清零(取值结果已抄进报告)
- [ ] D5 终检已真渲染:`1440x900` 与 `390x844` 两个视口各截一张,视口帧已留档;横向溢出 0 / 对比度不达标 0 / 结构与排版阻断 0,且无「无法判定」项(DOM 取值已抄进报告)
- [ ] 每个浮层都手工打开数过可见关闭出口(`== 1`)+ `Esc` / 点遮罩能关、焦点锁在层内且关闭后回到触发按钮;结论与触发路径已写进 `3d-审查报告.md`
- [ ] 对外提交 / 交付留档的截图只用视口帧;`_full/` 长图未作为评审输入
- [ ] 契约里每个写出来的数字都已实测回填(首屏条数 / 行高 / 承载占比 / 面积占比 / 对比度比值),「契约值 / 实测值」并排列出;未回填即阻断;契约未声明判据的档位已记为证据缺口
- [ ] `designs/<项目>/3d-审查报告.md` 存在,含阻断 / 建议两张表 + 状态覆盖核对 + 结构核对(数字抄自脚本输出,非「目测」)+ Gate-2/3 结论
- [ ] Gate-2 与 Gate-3 均已通过(书面结论,非口头)
- [ ] 重大改版:旧版文件仍在磁盘上,且收尾给出新旧差异(改了什么 / 为什么 / 代价)
- [ ] 偏离单已附,且无静默偏离