第 4 章:主流程
出处
来源:to-spec · to-tickets · implement · ask-matt · 状态:已读
一句话
规格是已拍板的决定活过窗口清空;工单是一张新窗口能做完的竖切;实现驱动测试先行,收工走双轴评审。 一窗口装得下的活,跳过规格和工单,追问完直接实现。
核心概念
主链,以及何时剪枝
ask-matt 把日常工作收成:
grill-with-docs → to-spec → to-tickets → implement → code-review不是每次都走满。分支在「能不能在对话里问完」和「是不是跨会话」两处:
| 你在哪 | 走哪 |
|---|---|
| 还没决定 | 先 /grill-with-docs |
| 决定了,一窗口装得下 | /implement,跳过规格 |
| 决定了,要跨好几次会话 | /to-spec,再 /to-tickets |
| 探路图已经走清 | /to-spec #<map>,把决定收成一份可建造物 |
| 观感或状态机纸上谈不清 | /handoff 出去做原型,再带答案回来 |
1–3 步(追问、规格、工单)要留在同一扇没压缩过的窗口里,好让三份东西叠在同一场思考上。之后每次 /implement 从工单冷启动,上一张的上下文可丢。
上限是 smart zone(当前最强模型大约 15 万 token 以内还在锐利推理)。还没到 /to-tickets 就靠近这条线,不要在退化里硬撑;在最近的阶段边界 /compact,再继续。阶段边界的五种走法在 08-会话卫生。
规格是决定的记录,不是新的一场问
/to-spec 明确写:不要访谈,综合你已经知道的。到你打它的时候,拍板已经结束。规格是窗口要结束时还活着的那份记录。
它断言而你从未说过的任何一句,都是缺陷。
写正文之前,先草测试会打在哪些接缝,并跟你核对。已有接缝优先于新接缝,能打的最高接缝优先,理想数量是一。这些接缝会往下游走:tdd 只在预先约定的接缝上写测试,code-review 对照规格看 diff,没人同意过的接缝会变成评审发现。
模板块:问题(用户视角)、方案(用户视角)、尽可能长的用户故事、实现决定、测试决定、明确不做什么、其余。实现决定不要写具体文件路径或代码片段——很快过时。例外:原型里有比散文更精确的片段(状态机、reducer、schema、类型形状),裁到带决定的那几行,注明来自原型。
发布到仓库配置好的议题跟踪,打上 ready-for-agent。这个标签的意思是「不必再分拣」,不是开工令。若有无人值守的 agent 在轮询这个标签,它会试图把整份规格一次做完,而不是去拿工单切片——这是该 skill 被报告最多的毛边。缓解:在无人值守的 prompt 里排除父规格,或工单一出就摘掉标签。
规格主要给 agent 读,所以密、完整、偏参考。值得人盯的是接缝和「不做什么」:错得最便宜、发现得最贵的两处。读完整份还觉得意外,是追问太浅,不是规格太长。
规格没有同步机制。实现一开始教你新东西,它就过时。活得过它的是 CONTEXT.md 和决策记录;实现中值得留下的,写到那里,不要去改规格。
工单是穿层的示踪弹,不是按层切
/to-tickets 把规格、计划或当前对话切成工单。每张声明阻塞边:哪些必须先做完。没有阻塞的可以立刻开始。
竖切规则:
- 每刀窄,但穿过每一层(schema、API、UI、测试):竖的,不是一层一张
- 做完的一刀可以单独演示或验收
- 尺寸是一张新窗口
- 预重构先做(「先让改动变容易,再做那个容易的改动」)
横切(先做完 schema,再做 API,最后集成)是被写明要防的失败。有团队按层切出 26 张工单,每张关闭大约 20 次 agent 跑,其中约四分之三是返工。事后复盘把失败类型都追到横切,而不是实现本身。
发布前有两步:找预重构机会,排到前面;把拆法按编号摊给你问——粒度对不对、阻塞边是不是真的、要不要合并或再拆。你点头之前,什么都不进跟踪器。
测验题:这张做完我能演示什么?答不上来的,就是横切。有人给每张加一行「演示路径」,用来把模型往竖切推。
本地跟踪器:.scratch/<feature-slug>/issues/<NN>-<slug>.md,按依赖序编号,阻塞的在前。真实跟踪器:用原生阻塞 / 子议题;没有原生边才把「Blocked by」写进正文。两种形状都打 ready-for-agent。不要拿 /triage 去分拣这些工单——分拣是给别人丢过来的活。
验收标准必须在实现者起步的那个提交上能失败。三种假标准反复出现:基线提交上已经为真;只有另一张工单做的活才能满足;把请求复述一遍而不是从产物推导。竖切能挡住大半:交付以前不存在的行为,基线上天然是红的。
宽重构是竖切的例外
一次机械改动(重命名列、改共享符号的类型)的冲击面铺满仓库,一改就碎几千个调用点,没有竖切能绿着落地。这时改走 扩展–收缩:
- 扩展:新形态和旧形态并存,什么都不碎
- 迁移:按冲击面分批(每包、每目录),一批一张工单,都阻塞在扩展上。旧形态还在,所以 CI 能保持绿
- 收缩:没有调用者了,删旧形态;这张工单阻塞在每一批迁移上
连分批都不能单独保持绿,就共用一条集成分支,全部阻塞在最后一张集成并验证的工单上。绿只在那里承诺。
实现是薄驱动器
/implement 的 SKILL.md 只有几行:按规格或工单做;能用 /tdd 就用,打在预先约定的接缝上;经常跑类型检查和单文件测试,最后跑全套;做完走 /code-review;提交到当前分支。
薄是故意的。纪律在 tdd 和 code-review;实现负责把一次会话钉在一张工单上。已知缺口:它做完以后不保证关闭或勾掉工单,GitHub 和本地 markdown 都是。工单状态要人更新。
仓库要先跑过 /setup-matt-pocock-skills:选定议题跟踪(GitHub / GitLab / 本地 markdown / 其它)、分拣标签、领域文档布局。没这份配置,规格和工单会停下来让你去跑 setup。
关键洞察
- 规格和工单的寿命不同。 规格是目的地和钉住它的决定;工单是走到那里的步骤,用完可丢。方向变了:删未做完的工单,留规格。
- 接缝在规格阶段约定,不是实现阶段才找。 晚约定等于让测试去发明模块形状。
- 过拆和横切是同一 skill 的两种失败。 三行改动拆出十二张,是模型默认切到原子单元;按层切是模型不会「演示路径」。测验那一步就是为这两件事准备的,不是走过场。
个人思考
对照 Anthropic 的 Anthropic:The AI-native SDLC playbook:那里把生命周期收成可触发的工件循环。Matt 的规格和工单是循环里「计划」那一段的最小工件——而且他肯写明何时不要产工件。一窗口的活硬走规格,是多付一次综合,模型还可能在综合里漂。下一章把实现内部的那一刀拆开:测试先行、诊断、原型各修哪一种盲。