原型
原型是 用来回答问题的临时代码。问题决定其形态。
选择分支
使用用户的提示词、周围代码,或在用户在场时询问,确定正在回答哪个问题:
- “这个逻辑 / 状态模型是否合理?” → [LOGIC.md](LOGIC.md)。构建一个单个可分享的 HTML 文件(包含自由操作按钮以及选项卡式引导演练),让状态机经历那些在纸上难以推理的用例,并且非开发人员也能操作。
- “它应该是什么样子?” → [UI.md](UI.md)。在单个路由上生成多个差异极大的 UI 变体,通过 URL 搜索参数和浮动底栏切换。
两个分支会产出非常不同的制品,因此选错会浪费整个原型。如果问题确实含糊不清且无法联系用户,默认选择更符合周围代码的分支(后端模块 → 逻辑;页面或组件 → UI),并在原型顶部说明假设。
适用于两个分支的规则
- 从第一天起就是一次性的,并明确标记为原型。 将原型代码放在它实际会被使用的位置附近(靠近它要为其做原型的模块或页面),以便上下文显而易见,但命名要让随便阅读的人也能看出它是原型,而不是生产代码。对于一次性 UI 路由,遵守项目已经使用的任何路由约定;不要发明新的顶层结构。
- 易于运行。 UI 原型通过项目任务运行器中的一条命令启动:
pnpm <name>、python <path>、bun <path>等。逻辑演示是一个用户可以双击的单个 HTML 文件。无论哪种方式,启动它都不需要思考。 - 默认不持久化。 状态保存在内存中。持久化是原型要 _检查_ 的内容,而不是它应该依赖的东西。如果问题明确涉及数据库,请连接一个临时数据库或本地文件,并使用清晰的 “PROTOTYPE, wipe me” 名称。
- 跳过打磨。 不要写测试,不要写超出使原型 _可运行_ 所需的错误处理,不要做抽象。重点是快速学习。
- 展示状态。 在每次操作(逻辑)之后或每次切换变体(UI)之后,打印或渲染完整的相关状态,让用户可以看到发生了什么变化。
- 完成时保存它。 将任何经过验证的决策并入真实代码,然后把原型本身作为 主要来源 保存:将它提交到一个一次性分支,脱离 main,并在实现 issue 上留下指向该分支的上下文指针。也要在 issue 或 commit 中保存答案(结论以及它所解决的问题)。main 分支只保留经过验证的决策。