Lesson 0003 · 一组配合使用的 skill · 主流程入口

grilling 与两个薄入口

「grill」在这里是「追着你面试、把模糊想法一点点问清楚」的意思。当你的计划还很糊、想被问清楚了再动手时,就会用到这一组 skill: grilling 装着面试规则的全文(AI 可以自己加载它); grill-megrill-with-docs 是给你按的入口,正文各只有一行,区别只有一个——聊完要不要把术语和决策写进仓库。 一个 skill 跑完会在仓库或工单系统里改动什么,这件事本课程叫它的副作用(side effects)。 学完这节课,你要能背出面试的几条规矩、三个 skill 各自的副作用、谁在调用谁,以及想改行为时去改哪个文件的哪一段。

1. 为什么一个 grill 要拆成三个 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 给人按的入口:主流程的第一步;聊完会把术语和决策写进仓库留底
硬规则(invocation.md) 只能人启动的 skill,可以在正文里调用「人和 AI 都能启动」的 skill; 但绝不能调用另一个「只能人启动」的 skill。 所以 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

2. grilling:面试规则的全文在这里

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——日常更多是从两个人工入口进来,而不是直接调它。

3. 三条具体规矩:事实自己查 · 每题给建议 · 没对齐不动手

3.1 事实自己查,决策才问你

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:有得必有失、需要权衡的选择)。

3.2 每个问题都附上推荐答案

原文:For each question, provide your recommended answer。 docs(grill-me 篇)解释了为什么:有推荐答案时,你是在对一个提案做反应—— 说「行」「不行」「改成 X」就行——而不是对着一个空白问题从零开始想。 推荐答案可以被否决,但它先给了你一个默认起点,省掉冷启动的负担。

3.3 没确认互相理解之前,不许动手

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 或其它流程被一并调用时)。

4. grill-me:只有一行的入口

假设你还没有代码库,只是在琢磨一个点子,想被 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 一节

5. grill-with-docs:面试之外,顺手把结论写进仓库

再假设你已经有代码库了,脑子里一个 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。

6. 写记录这件事是谁干的:domain-modeling

grill-with-docs 名字里的「docs」不是另外一套写文件的指令,而是挂上一个现成的、 人和 AI 都能启动的技能: domain-modeling。 这节课只讲「它对 grill 意味着什么」;术语管理的完整细节在 0004。

6.1 主动改模型 vs 只是读一下

invocation.md 和 domain-modeling 正文划了一条线: 只是一下 CONTEXT.md、借用里面的术语,是任何 skill 都可以顺手做的习惯, 不算在用 domain-modeling。 这个技能指的是动手改模型:挑战模糊用词、追问边角场景、写术语表、写决策记录。

6.2 会话里它具体做什么(摘要)

写 ADR 的三个条件(缺一都不写) 是什么意思
Hard to reverse(难回头) 以后改主意的成本很高
Surprising without context(不知道背景会觉得奇怪) 后来的人会问「当初为什么这么做」
Result of a real trade-off(真正权衡过的结果) 确实有别的选项,而且因为特定理由选了这一个

6.3 写到仓库的哪个位置

两个技能叠在一起,各管什么 grilling 管「问什么、什么时候才能动手」;domain-modeling 管「对齐出来的术语和难回头的决策写到哪」。 不带 domain-modeling 的 grill(grill-me 或直接用 grilling)可以同样犀利,但不会在仓库里留下任何记录

7. 三个入口怎么选 · ask-matt 怎么指路

7.1 按情境查这张表

你现在的情境 优先入口 为什么(依据原文)
有代码库,想法还很糊,开工前想对齐并留下术语和决策记录 /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:研究报告是给你思考用的输入,不代替面试本身

7.2 ask-matt 的指路原文(压缩版)

指路原文: ask-matt/SKILL.md (main flow · standalone · vocabulary · research · improve 各节)

8. 总表:谁会动你仓库里的什么

「会改什么」只认各 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 借术语,不算在用它
常见误读 「grill-with-docs 会把需求写好、把票开好」——不会。 把需求写进工单系统是 to-spec 的活;拆成一张张工作票是 to-tickets 的活。 grill 只负责达成互相理解(外加可选的术语表和决策记录)。

9. 面试完了,下一步接什么

你刚跑完 如果… 推荐下一步(依据原文)
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 都新开会话,只带那一张票进去。

10. 还有谁在调用 grilling

在已发布的 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 一节

为什么要这样复用 docs/grilling 说得明白:把面试这套做法抽成独立的基本功,就是为了让两个入口和 triage、improve 这些流程 不各自发明一套面试规则。哪天想改「一次一题」,只改 grilling 一个文件,整张图都跟着受益。

11. 想调行为去哪改 · 常见搞砸方式

11.1 去哪改

你想改的行为 改这个文件 不要先改
嫌它一次问好几题、不给推荐答案、没确认就动手、连自己能查的事实也来问你 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 对齐 只改一边——两边不一致会出怪行为

11.2 常见搞砸方式(对照原文)

12. 检索练习

先别往回翻表,凭记忆答。选项字数刻意对齐,不会从长度泄题。

自测(立即反馈)

1. grill-with-docs 的 SKILL 正文合法调用是哪一种?
2. 关于持久副作用,下列哪项正确?
3. ask-matt 默认:有代码库要对齐 idea 时,主 flow 第一步是?
4. agent 一次抛出五个决策题让你全选——主要违反了哪条?
5. triage 在什么情况下应 Run grilling + domain-modeling?
6. 想改「未确认 shared understanding 就开写实现」——应优先编辑?
7. wayfinder 的 grilling 票被标成 HITL,正确含义是?
额外提取(无选项) 合上本页,凭记忆默写: (1) grilling 的四条规矩(一次一题 / 每题附推荐答案 / 事实自己查、决策问你 / 确认前不动手); (2) 两个人工入口各自的正文(各只有一行); (3) 三个 skill 各自的副作用(grilling / grill-me / grill-with-docs 各一行)。 写完对照第 2–5 节、第 8 节。

13. 原始材料 · 课程位置

本课的主要一手材料(请打开原文读,不要只背本页摘要):

课程位置: 0001 系统地图 → 0002 setup(配置层:给每个仓库写一次配置)→ 本课 0003:grill 家族怎么配合 → 0004 domain-modeling / codebase-design(术语与模块词汇的深课)。

老师就在这个会话里。 对「某个调用方是不是真在正文里调用了 grilling」「某个例子算不算满足 ADR 三个条件」有疑问,直接问; 回答会指回对应的 SKILL.md 原文,不临场发挥。 做完自测后可以回复:练习得分 / 还没搞懂的点 / 开始 0004。