「grill」在这里是「追着你面试、把模糊想法一点点问清楚」的意思。当你的计划还很糊、想被问清楚了再动手时,就会用到这一组 skill:
grilling 装着面试规则的全文(AI 可以自己加载它);
grill-me 和 grill-with-docs 是给你按的入口,正文各只有一行,区别只有一个——聊完要不要把术语和决策写进仓库。
一个 skill 跑完会在仓库或工单系统里改动什么,这件事本课程叫它的副作用(side effects)。
学完这节课,你要能背出面试的几条规矩、三个 skill 各自的副作用、谁在调用谁,以及想改行为时去改哪个文件的哪一段。
假设你想给这套系统加一个「面试我」的功能。光看功能,好像一个 /grill 命令就够了,
实际却拆成了三个文件。这不是作者喜欢多建文件夹,而是被一条硬规则逼出来的。
0001 讲过这条规则,原文在
.agents/invocation.md:
每个 skill 的文件头部有一块配置区(frontmatter),写着谁能启动它——
要么只能人手动启动(user-invoked),要么人和 AI 都能启动(model-invoked);
而「只能人启动」的 skill,别的 skill 一律不许调用它。
| Skill | 谁能启动 | 文件里怎么认(frontmatter / Codex 配置) | 正文多长 | 它是干什么的 |
|---|---|---|---|---|
| grilling | Model | 没有 disable-model-invocation 字段;description 里写着 “Use when…” 说明使用场景,AI 碰到合适场景会自己加载 |
大约 8 行规则 | 可复用的面试基本功(英文叫 primitive,原语);别的 skill 可以在正文里用一句话调用它 |
| grill-me | User | disable-model-invocation: true(Claude 侧)+ policy.allow_implicit_invocation: false(Codex 侧的 agents/openai.yaml) |
只有一行:Run /grilling |
给人按的入口:没有代码库、或只想在对话里把想法聊清楚时用 |
| grill-with-docs | User | 和 grill-me 一样,只能人手动启动 | 只有一行:Run /grilling + /domain-modeling |
给人按的入口:主流程的第一步;聊完会把术语和决策写进仓库留底 |
grill-with-docs 的正文写的是
「Run a /grilling session, using the /domain-modeling skill」,
而不能写「Run /grill-me,然后再写点文档」——grill-me 是人工入口,AI 根本启动不了它。
反过来,如果把面试规则写死在 grill-me 里、删掉独立的 grilling,
那么 triage、wayfinder、improve-codebase-architecture 这些 skill 就再也没法合法复用同一套面试规则了。
这里出现两个本课会反复用的说法。prose 调用:在正文里写一句自然语言
「Run the /xxx skill」就算完成调用,不是代码层面的 import(0001 讲过)。
薄 wrapper(薄外壳):grill-me 这种正文只有一行、自己不装任何规则、
只把真正的 skill 包一层给人用的入口。「入口薄、规则厚」是这套系统的固定拆法。
依赖的表达方式:用自然语言的 /skill 调用,禁止用 ../ 路径跨目录直接链接别的 skill 的正文来复用逻辑
(invocation.md 的 Dependencies 一节)。
你按的入口(User) 被复用的基本功(Model)
───────────────── ───────────────────────
/grill-me → /grilling
/grill-with-docs → /grilling + /domain-modeling
别的完整流程(也是人启动)也直接调用基本功,而不是再包一层入口:
/triage (需要时) → /grilling + /domain-modeling
/wayfinder → /grilling + /domain-modeling (画地图和拿不准的决策都用它)
/improve-codebase-architecture (选定候选后) → /grilling;写文件交给 /domain-modeling
skills/productivity/grilling/SKILL.md 短得出奇——这是故意的:
整套系统里关于「怎么面试」的规则只写在这一个地方(single source of truth,唯一说了算的原文),
别处需要就调用它,不各自抄一份。下面逐条拆读;解释对照 docs 和原文,不发明新规则。
Interview me relentlessly about every aspect of this until we reach a shared understanding. Walk down each branch of the decision tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.
面试的终点不是「问完 N 个问题」,而是达成 shared understanding(互相理解: 你和 AI 对同一份计划有了共识)。docs 给的心智模型是:一份计划就是一棵决策树—— 一个决定会牵出下一个问题,像树一样分叉;提问要按依赖顺序一个节点一个节点往下走, 因为先回答的父决策会改变后面该问什么。整棵树走完,你脑子里没说出口的假设也就被摆到明面上了。
Ask the questions one at a time, waiting for feedback on each question before continuing. Asking multiple questions at once is bewildering.
「一次只问一题」不是礼貌,是让讨论能收敛的机制:如果一次性甩出一张问卷让你全答, 问题之间的依赖关系就丢了——你的前一个答案本来会改变后面的问题,现在改不了了。 典型的搞砸方式见 第 11 节。
grilling 的 description 是写给 AI 看的:
“Grill the user… Use when the user wants to stress-test… or uses any 'grill' trigger phrases.”
所以 AI 碰到合适场景会自己加载它;你也可以手动输入 /grilling。
不过 docs 的原话是 usually invoke through wrappers——日常更多是从两个人工入口进来,而不是直接调它。
If a fact can be found by exploring the environment (filesystem, tools, etc.), look it up rather than asking me. The decisions, though, are mine — put each one to me and wait for my answer.
| 类型 | 例子(教学用) | AI 该做什么 |
|---|---|---|
| Fact(事实) | 仓库里是否已经有取消订单的代码路径;某条 ADR(决策记录,放在 docs/adr/ 下,一条难回头的决策记一个文件)是否已经存在 |
自己去读代码、读文件、跑工具查清楚,别拿面试来问你——浪费你的时间 |
| Decision(决策) | 要不要支持部分取消订单;默认的重试策略选哪种 | 出题 + 附上它的推荐答案,等你拍板 |
这条和 domain-modeling 的「拿你说的话对照代码找矛盾」正好互补:
事实层面先去环境里查清楚,决策层面再坐下来谈取舍(trade-off:有得必有失、需要权衡的选择)。
原文:For each question, provide your recommended answer。 docs(grill-me 篇)解释了为什么:有推荐答案时,你是在对一个提案做反应—— 说「行」「不行」「改成 X」就行——而不是对着一个空白问题从零开始想。 推荐答案可以被否决,但它先给了你一个默认起点,省掉冷启动的负担。
Do not act on it until I confirm we have reached a shared understanding.
这里的「act(动手)」指的是开始实施计划:写实现代码、改动业务行为之类。
为了查事实而读文件不算「动手」,一直是允许的。
它和 to-spec 的分工是:grilling 负责把人对齐;
to-spec 明确写着 Do NOT interview(禁止再面试)——只综合已经谈过的内容。
如果没有真正对齐就跑去 to-spec,写出来的需求文档就是一份「假共识」——看着像对齐了,其实没有。
grilling 本身不改任何文件(0001 的全表给过这笔账):它只是一套对话规则。
写 CONTEXT.md(项目术语表)或 ADR 不是 grilling 的职责——那是
domain-modeling 的职责(当它经 grill-with-docs 或其它流程被一并调用时)。
假设你还没有代码库,只是在琢磨一个点子,想被 AI 追着问清楚——这就是 grill-me 的位置。
它的 SKILL.md 正文(除了头部的 frontmatter 配置)实际上只有一行:
Run a `/grilling` session.
| 维度 | 内容(来自原文) |
|---|---|
| 谁能启动 | 只有你手动输入 /grill-me;AI 永远不会自己启动它 |
| 行为 | 和完整跑一遍 grilling 完全一样:一次一题、每题附推荐答案、事实自己查、决策问你、确认前不动手 |
| 留不留文件 | stateless(不留任何文件):不写本地文件,不建 CONTEXT.md |
| 使用场景(ask-matt 的指路) | 没有代码库时,在对话里打磨任意计划或设计;它是 standalone(独立工具),不在主流程的默认步骤里 |
| 产物 | 只在这次会话里留下一个被问清楚的理解;会话关掉就没了(docs 特意拿它和「留下书面记录」的那个版本做对比) |
grill-me/SKILL.md · docs/productivity/grill-me.md · ask-matt 的 Standalone 一节
再假设你已经有代码库了,脑子里一个 feature 还很糊。你想被问清楚,而且希望讨论出的术语和决策留在仓库里, 以后任何人(包括下一个 AI 会话)都能查到。这就是主流程的第一步。它的完整正文同样只有一行:
Run a `/grilling` session, using the `/domain-modeling` skill.
提问的部分还是 grilling 那套,一字不改;区别在答案落到哪里(docs/grill-with-docs):
讨论清楚的术语当场写进术语表(glossary,也就是 CONTEXT.md),
难回头的决策逐条记成 ADR。
这样即使会话关了,对齐出来的结论也还在仓库里活着。
| 维度 | 内容(来自原文) |
|---|---|
| 谁能启动 | 只有你手动输入 /grill-with-docs |
| 行为 | grilling 全套规则 + domain-modeling 主动维护领域模型(下一节讲它干什么) |
| 留不留文件 | stateful(会写仓库):目录用到才建,不会提前建空目录 |
| 使用场景(ask-matt 的指路) | 主流程第 1 步:有代码库时把想法问清楚,并留下书面记录(paper trail) |
| 前提条件 | docs:要在「写这些文件是安全的」的位置运行;不必提前搭好目录——出现第一个术语才建 CONTEXT.md,出现第一个真正的取舍才建 docs/adr/ |
| 怎么判断它在正常工作 | 一次只问一题;术语一确定立刻写进 CONTEXT.md;能读代码的地方就去读代码;ADR 写得很少 |
它在主流程上的位置(docs):
grill-with-docs → to-spec → to-tickets → implement → code-review
ask-matt 补充的分支:对齐之后,如果有问题必须「看见东西跑起来」才答得了,就走
/handoff → /prototype → /handoff 带回答案再继续主线;
一个会话做不完 → to-spec → to-tickets → 每张票新开一个干净会话 implement;
一个会话能装下 → 在同一个会话里直接 implement。
grill-with-docs 名字里的「docs」不是另外一套写文件的指令,而是挂上一个现成的、
人和 AI 都能启动的技能:
domain-modeling。
这节课只讲「它对 grill 意味着什么」;术语管理的完整细节在 0004。
invocation.md 和 domain-modeling 正文划了一条线:
只是读一下 CONTEXT.md、借用里面的术语,是任何 skill 都可以顺手做的习惯,
不算在用 domain-modeling。
这个技能指的是动手改模型:挑战模糊用词、追问边角场景、写术语表、写决策记录。
| 写 ADR 的三个条件(缺一都不写) | 是什么意思 |
|---|---|
| Hard to reverse(难回头) | 以后改主意的成本很高 |
| Surprising without context(不知道背景会觉得奇怪) | 后来的人会问「当初为什么这么做」 |
| Result of a real trade-off(真正权衡过的结果) | 确实有别的选项,而且因为特定理由选了这一个 |
CONTEXT.md;决策放 docs/adr/NNNN-slug.md(编号加短名的格式)CONTEXT-MAP.md 当总目录,指向各区域自己的 CONTEXT.md 和各区域的 ADR 分册(按区域分开存放的决策记录);全系统级的决策可以放在根目录的 docs/adr/CONTEXT-FORMAT.md / ADR-FORMAT.md(ADR 可以短到只有一段)| 你现在的情境 | 优先入口 | 为什么(依据原文) |
|---|---|---|
| 有代码库,想法还很糊,开工前想对齐并留下术语和决策记录 | /grill-with-docs |
ask-matt 主流程的第 1 步;会在仓库留下书面记录 |
| 没有代码库,或计划不落在这个仓库里 | /grill-me |
独立工具,不留文件;背后是同一个面试基本功 |
| 只要面试、不要文档流程(且你接受直接调用 AI 可启动的 skill) | /grilling |
docs:这是两个入口之外的直接调法 |
| 计划已经清楚,只想把术语定下来、记几条决策 | /domain-modeling |
grill-with-docs 的 docs:不需要整场面试时走它 |
| 一个会话装不下、方向也看不清(全新项目或超大 feature) | /wayfinder |
ask-matt:它比 grill-with-docs 更上游——先画出一张决策地图(把要回答的问题列成一张张工作票),疑问清空后再并回 to-spec |
| 别人提的 issue / PR 需要处理 | /triage(它内部可以调面试) |
它不是主流程的 grill 入口;按需调用 grilling + domain-modeling |
| 已经在架构体检里选定一个改进候选 | improve 流程内部的 grill 环节 | 体检(survey)在 improve-codebase-architecture 里做;聊出的想法可以再进主流程的 grill-with-docs |
| research 报告已经写好 | 带着报告进 /grill-with-docs |
ask-matt:研究报告是给你思考用的输入,不代替面试本身 |
/grill-with-docs 开始;没有代码库 → /grill-me。/grilling 基本功;只有 with-docs 会在仓库里留下书面记录。/to-spec,不要默认直接 implement。指路原文: ask-matt/SKILL.md (main flow · standalone · vocabulary · research · improve 各节)
「会改什么」只认各 SKILL.md 和 docs 白纸黑字的承诺;不脑补它会去写工单系统或改业务代码。
| Skill | 启动 | 在对话里做什么 | 在仓库 / 外部系统留下什么 | 明确不做什么 |
|---|---|---|---|---|
| grilling | M | 按决策树面试你;事实类问题自己去环境里查 | 什么都不改——纯对话规则 | 你确认「互相理解了」之前,不开始实施计划 |
| grill-me | U | 同上(它把活全部交给 grilling) | 什么都不改——stateless,不建 CONTEXT.md | 不写 ADR、不建术语表;也代替不了 wayfinder 画决策地图 |
| grill-with-docs | U | 面试同上,另外会拿术语表对照你的用词、用具体场景逼问边界 | 通过 domain-modeling 写:CONTEXT.md(大仓库按区域拆成多份);三个条件凑齐时写 docs/adr/ 下的决策记录;目录用到才建 |
CONTEXT.md 只当术语表用,不塞需求、草稿、实现笔记;不够格的决策不写 ADR |
| domain-modeling (对照行) |
M | 挑战模糊用词、用场景逼边界、拿口述和代码对照 | 写文件的规则和上面 grill-with-docs 那行相同 | 只是读一下 CONTEXT.md 借术语,不算在用它 |
to-spec 的活;拆成一张张工作票是 to-tickets 的活。
grill 只负责达成互相理解(外加可选的术语表和决策记录)。
| 你刚跑完 | 如果… | 推荐下一步(依据原文) |
|---|---|---|
grill-with-docs |
还有问题必须「看见东西跑起来」才答得了(状态机手感、UI 形态之类) | /handoff 移交出去 → 新会话里 /prototype 做一次性原型 → /handoff 带答案回主线,主线引用原型得出的结论 |
| 东西大到要多个会话才做得完 | /to-spec(这一步禁止再面试,只综合已有结论)→ /to-tickets → 每张票开一个干净会话 /implement |
|
| 一个会话就能做完 | 同一个会话里直接 /implement(内部用 tdd 写,收尾跑 code-review,然后提交) |
|
| 会话逼近 smart zone(大约 120k token,超过这个量 AI 的推理质量开始下滑) | /handoff 移交到新会话,别在质量已经下降的窗口里硬撑 |
|
grill-me |
聊完的结果要变成能开工的需求文档(已经有、或即将有代码库) | docs:可以接 /to-spec;有库又想要留底时,更常见的做法是用 grill-with-docs 重跑一遍,或补调 domain-modeling |
| 只是把自己的想法聊清楚,没有要交付的东西 | 停在这里就好。stateless 意味着聊完就是终点;想自己记笔记可以,但那不归这个 skill 管 | |
grilling(被别的 skill 调用) |
调用它的那个流程还没走完 | 回到调用它的流程继续:triage 接着写处理意见(brief)和标签;wayfinder 把答案记到票上;improve-codebase-architecture 继续设计、提议 ADR |
上下文卫生(context hygiene,0001 讲过的省上下文规矩,出自 ask-matt): 第 1–3 步(grill → spec → 拆票)尽量不换会话、一气呵成; 每次 implement 都新开会话,只带那一张票进去。
在已发布的 skill 里,除了两个人工入口,至少还有三处在正文里 prose 调用
/grilling。注意:它们调的都是 AI 也能启动的 /grilling,
没有一处去调 grill-me / grill-with-docs——人工入口别的 skill 根本调不动。
in-progress 目录里的草稿不在本课范围。
| 谁在调 | 什么时候调 | 正文里怎么写的 | 顺手还做什么 |
|---|---|---|---|
| triage | 核实完 issue 的声称(verify the claim)之后,这个请求还需要补充细节(fleshing out) | run /grilling and /domain-modeling together(正文原话) |
问出的结论写进 needs-info 的「目前确定了什么」(established so far)里,别丢掉;信息齐了、可以交付时写一份给实现 agent 看的处理意见(agent brief)。如果维护者直接下命令改状态(比如「把 #42 移到 ready-for-agent」),triage 会跳过面试直接执行(原文写明 Skip grilling) |
| wayfinder | 画地图(Chart)阶段的「说出目的地」(Name the destination)那一步;做票(Work)阶段的默认票型、或拿不准时 | /grilling + /domain-modeling |
票型 wayfinder:grilling 标成 HITL(human in the loop,必须真人来答):一次一题,agent 不许自问自答 |
| improve-codebase-architecture | 你从它生成的 HTML 体检报告里选定一个改进候选之后 | run the /grilling skill…;写文件的事 run /domain-modeling |
面试要逐个问清:约束条件、依赖关系、模块加深(deepen,接口做得更小、实现做得更厚)后的形状、什么东西藏在测试接缝(seam,方便替换实现来写测试的边界)后面、哪些测试能活下来;之后还可以再用 codebase-design |
triage/SKILL.md 的 Grill 一节 · wayfinder/SKILL.md 的 Ticket Types / Chart / Work 各节 · improve-codebase-architecture/SKILL.md 的 Grilling loop 一节
| 你想改的行为 | 改这个文件 | 不要先改 |
|---|---|---|
| 嫌它一次问好几题、不给推荐答案、没确认就动手、连自己能查的事实也来问你 | skills/productivity/grilling/SKILL.md |
grill-me / grill-with-docs 那一行正文——它们只是入口,规则不在里面 |
| 术语没写进 CONTEXT.md、ADR 乱写或该写的不写 | domain-modeling/SKILL.md 加上 CONTEXT-FORMAT.md / ADR-FORMAT.md 两个格式文件 |
grilling 正文——写文件不归它管 |
| 有代码库时却常走错入口、用了不留记录的 grill-me(这是指路策略问题) | ask-matt 的指路文案;或两个人工入口的 description(人看得到的摘要) | 在 grill-me 里偷偷加写文件的行为——那会破坏它 stateless(不留文件)的承诺 |
| AI 自动加载 grilling 太积极或太迟钝 | grilling 的 description 里写给 AI 看的触发语(“Use when…” 那一段) | 两个人工入口——它们本来就禁止 AI 自动启动,改了也没用 |
| Codex 那边允不允许隐式调用某个 skill | 该 skill 的 agents/openai.yaml 里的 policy,并和 Claude 侧的 frontmatter 对齐 |
只改一边——两边不一致会出怪行为 |
/grill-me:AI 根本启动不了它,这条路走不通;应该写 Run /grilling。docs/adr/ 污染成流水账。先别往回翻表,凭记忆答。选项字数刻意对齐,不会从长度泄题。
本课的主要一手材料(请打开原文读,不要只背本页摘要):
skills/productivity/grilling/SKILL.md
—— 面试规则全文
skills/productivity/grill-me/SKILL.md
—— 只有一行的入口
skills/engineering/grill-with-docs/SKILL.md
—— 面试 + 写记录
skills/engineering/domain-modeling/SKILL.md
—— 「写记录」这件事的权威原文(附 CONTEXT / ADR 的格式文件)
skills/engineering/ask-matt/SKILL.md
—— 主流程和独立工具的指路原文
.agents/invocation.md
—— 「user 不能调 user」和 prose 调用的规则原文
课程位置: 0001 系统地图 → 0002 setup(配置层:给每个仓库写一次配置)→ 本课 0003:grill 家族怎么配合 → 0004 domain-modeling / codebase-design(术语与模块词汇的深课)。
SKILL.md 原文,不临场发挥。
做完自测后可以回复:练习得分 / 还没搞懂的点 / 开始 0004。