「一次性代码回答一个设计问题」的口袋版。完整教学见 Lesson 0008; 原文见 SKILL.md、 LOGIC.md、 UI.md、 docs。
Prototype = throwaway code that answers a question。问题决定形状。 不是 MVP、不是产品雏形——一开始加固(hardening)它,你就已经不是在做原型了。
| 情境 | 去哪 |
|---|---|
| 「状态机 / 数据形状 / API 手感,纸上说不清」 | prototype → LOGIC 分支 |
| 「这页面该长什么样,想看几种方案」 | prototype → UI 分支 |
| 「造好的东西坏了,想知道为什么」 | diagnosing-bugs(prototype 管「造什么」,不管「为什么坏」) |
| 「想法还模糊,需求没聊清」 | grill-with-docs |
| 「要读一手文档 / 第三方资料」 | research(读出 Markdown;prototype 跑出代码) |
| 「不知道走哪条流程」 | ask-matt |
问题关于逻辑 / 状态 / 数据形状(想按按钮看状态变)
→ LOGIC.md:终端交互小程序
问题关于「该长什么样」(想并排看几种长相)
→ UI.md:同路由多变体 + 浮动切换栏
读不出 → 看周围代码(后端模块→LOGIC;页面/组件→UI)
还模糊且联系不上用户 → 按周围代码默认,假设写在原型顶部
选错分支 = 整个原型白做
(state, action) => state / 显式 state machine / 一组纯函数 / 有清晰方法面的类反面模式:加测试 · 接真库 · 泛化「以后万一」 · 逻辑和 TUI 糊一起 · TUI 壳进生产
VariantA/B/C?variant= 渲染对应组件 + 挂 PrototypeSwitcher;
子形状 A 保留切换器之上全部已有数据获取NODE_ENV 开关)
子形状:A = 挂在已有页面(默认;真空路由里每个变体都好看,空路由藏设计问题);
B = 新开一次性路由(最后手段,路径带 prototype 字样;用 B 前先确认真的没家)。
反面模式:只换颜色文案 · 变体间共享 Layout · 接真实写操作(要改就指 stub) · 原型代码直接提升进生产(折入时正经重写)
验证过的决策 ──折进──► 真实代码(main 只留这个)
答案(结论 + 解决的问题)──写进──► Issue / commit / ADR
原型本体 ──提交──► 一次性分支(off main,never merged)
实现用的 Issue 上留指向该分支的指针
烂在 main 里的原型 = 过期负债;收在分支上的原型 = 一手材料
handoff — 双向摆渡:出主流程做原型 → 新会话;做完 → 回原线程并引用to-spec — 最常见下游:验证过的状态模型 / UI 方向成为 spec 的已确定输入domain-modeling — 不可逆决策记 ADRcodebase-design — 词汇地板:纯模块 + 薄壳 = 深模块思想的一次性应用diagnosing-bugs / research — 分工对偶(查坏 vs 探新;读 vs 跑)SKILL.md 规则 4SKILL.md「Pick a branch」LOGIC.md 第 3 步 + 反面模式UI.md 第 2 步 / Two sub-shapes / 第 4 步SKILL.md frontmatter 的 description(openai.yaml 只有展示名,不管触发)