别急着让 AI 写代码,先把项目里的词讲清楚
Matt Pocock 在一段 15 分钟的演示中解释了为什么用 /grill-with-docs 替代单纯的 /grill-me:把追问、术语表和关键决策留在仓库里,让人和 AI 使用同一套语言。

最近看了 Matt Pocock 的一段视频:I stopped using /grill-me for coding. Here’s what I use instead。视频只有 15 分钟,讲的却不是某个新模型或提示词技巧,而是一个更基础的问题:让 AI 参与一个已有代码库时,怎样避免每次都从头解释业务名词和历史决定?
Matt 之前的 /grill-me 会持续追问,把模糊的想法问到可以执行。它并没有失效;问题在于,单靠一轮轮问答,已经确认过的概念不会自动成为项目的一部分。下一次会话里,人仍可能要解释“独立视频”到底指什么、某个对象之间是一对一还是一对多、这个状态能否随意切换。
他现在在编码场景中改用 /grill-with-docs。它保留追问,但把共同语言和不容易看懂的决策写进仓库。这样,聊天记录不再是唯一的上下文。
单纯追问,为什么还不够
视频中的例子是一项新功能:在一个管理课程和视频的应用里加入 pitch。这里的 pitch 不是代码里的通用术语,而是视频的“包装”——标题、描述和对外呈现方式;团队会先想出多个 pitch,再选择其中一些制作成视频。
人一听就能根据上下文补全很多含义,AI 却没有这种默认背景。例如:
standalone video是不属于课程或课时的视频,还是“尚未关联 pitch 的视频”?- 一个 pitch 能否对应多个视频?一个 pitch 是否可以暂时没有视频?
- 删除 pitch 时,是连带删除、禁止删除,还是归档?
idle、scheduled、shipped是强制流转的状态机,还是可以手动修改的标签?
这些不是措辞洁癖。它们会影响数据库关系、删除规则、变量名、文件名、界面分组和后来的人怎样理解代码。若定义只存在于某次聊天里,之后每一次让 AI 修改相关部分,都会重新产生猜测空间。
把“共同语言”写成 context.md
/grill-with-docs 借用了领域驱动设计(DDD)中的“通用语言”思路。它会先寻找 context.md,读取其中的术语和定义;在对话中发现概念不清、用词冲突或新规则时,再要求人确认并更新这份文件。
在视频里,context.md 至少承担三件事:
- 说明这个代码库在解决什么问题;
- 定义关键实体、状态和关系,例如课程、版本、独立视频与 pitch;
- 为不熟悉项目的人和 AI 提供同一份可查阅的词汇表。
它不需要写成一份覆盖全部实现的百科全书。视频里的建议更接近 DDD 的 bounded context:一个大型 monorepo 可以有 context map 和多个上下文;如果一个仓库内大家说的是同一种业务语言,一份放在根目录的 context.md 就够用。
关键不在文件名,而在约束:产品、代码和与 AI 的对话尽量用同一个词。否则,文档里叫“已投递视频”,数据库表叫 standalone_videos,界面又叫“提案视频”,AI 很难判断它们到底是不是同一个东西。
共同语言需要在每次新需求中核对和更新;它不是一次写完就不再变化的说明书。
先核对词义,再讨论实现
/grill-with-docs 不会读完文档就直接生成代码。它会先把新需求同既有术语表对照,指出含义不清或冲突的地方,并通过具体场景把问题问出来。
视频的演示依次确认了:
- pitch 与独立视频是一对多关系;
- 有 pitch 的视频仍属于独立视频,pitch 是它的元数据,而不是另一类视频;
- pitch 允许暂时不关联任何视频;
- 状态目前可手动调整,自动流转以后再加;
- 由于作者更倾向归档而非删除,删除关系选择限制删除。
这些回答随后写回 context.md。作者也展示了一个很现实的细节:写入后产生了 pitched standalone video、unattached standalone video 之类别扭的名称。他没有假装第一版术语一定正确,而是提醒自己在“足够清楚”时停止讨论,后续需要时再重构。
这条边界很重要。共同语言的目的不是无限讨论命名,而是让接下来的实现少一点误解。
还有一类信息:为什么当时这样选
词汇表能定义“是什么”,却不总能解释“为什么”。视频把这类信息交给 ADR(Architecture Decision Record,架构决策记录)。
ADR 适合记录那些不看背景会觉得奇怪、又难以轻易撤回的选择:它面临过什么取舍、会带来什么后果。库选型这类容易替换的决定未必值得专门写 ADR;删除策略、数据关系或会影响多个模块的业务定义,通常更值得留下理由。
这也避免 AI 看到一个非直觉的实现时,自作主张把它“优化”掉。它能先读到决策背景,再判断当前需求是否真的要求改变它。
context.md 保存“是什么”,ADR 保存“为什么这样选”。
确认过的含义怎样留在项目里
Matt 的观察是:定义稳定后,AI 不必反复解释同一个概念,回复会更简洁;代码中的命名和规划文档也会更容易互相检索。这是他在工作流中的经验,而不是对所有模型和项目都成立的性能测试结果。
确认过的业务含义不必停在对话记录里。把它记录到仓库后,下一位开发者、下一次会话和后续生成的代码,都从同一份上下文开始。
从视频可以整理出一套小而可用的做法:
- 新功能开始时,只列出会影响数据、界面或规则的核心名词;
- 为每个名词写简短定义,并给一个能区分边界的例子;
- 让 AI 先检查这些词与现有代码、文档是否冲突,再进入实现;
- 把难以撤回的决定和取舍写成 ADR;
- 当名称已经能支持当前工作时继续开发,别为了完美命名无限停留。
这里的重点不是复制某个斜杠命令。即使不用这两个 skill,团队也可以建立同样的习惯:把 AI 提出的关键歧义当作待确认的产品或技术问题;确认后更新共享文档,而不是只在聊天窗口里回答一次。
/grill-me 并没有被淘汰
视频最后给出了一条很清楚的使用边界:有代码库时,优先用 /grill-with-docs;没有代码库的开放式任务,则继续用 /grill-me。作者还举了非工程场景的例子:有人用后者整理为母亲写悼词时的回忆,价值就在于耐心追问,而不是建立术语表。
项目刚开始时,作者仍倾向 /grill-with-docs,因为这恰好是最需要建立共同语言的阶段。差别不在于有没有足够多的代码,而在于这次对话是否要留下能被后续工作复用的领域知识。
让 AI 写代码之前,把项目里的词说清楚,看起来比直接输入需求慢一点。但当这些词会进入表名、组件名、接口和用户界面时,早一点确认往往比之后在许多文件里改名更便宜。
来源:Matt Pocock,I stopped using /grill-me for coding. Here’s what I use instead(2026-05-14)。本文基于该视频的英文字幕和演示整理;其中的实施步骤为对视频方法的归纳,不代表作者提供的性能保证或通用工程结论。