写在前面
不知道你有没有遇到过这样的情况,脑子里有个模糊的想法,打开 AI 编程助手,噼里啪啦一顿输出,然后代码生成了,但完全不是你要的东西。改了一轮又一轮,最后发现:问题不在代码上,是你一开始就没想清楚自己要什么。
Matt Pocock 把这叫做 Misalignment(对齐失败) ,AI Agent 编程最常见的失败模式,没有之一。
Matt 是 TypeScript 圈最有影响力的教育者之一,Total TypeScript 创始人,Newsletter 近 6 万订阅者。他开源了一套叫 mattpocock/skills 的 AI 编程 Agent 技能集,目前在 GitHub 已经斩获 176k 的 star,核心理念就是:AI 编程的最大瓶颈不是代码生成能力,而是工程纪律的缺失。

其中最值得先聊的,就是grill-me。
grill-me 是什么
grill-me,直译"拷问我"。它的 SKILL.md 是这么写的:
A relentless interview to sharpen a plan or design.
做的事很简单:在你动手写代码之前,AI 对你发起一场"无情的审问",把你脑子里那个模糊的想法一个一个问清楚。不是 AI 替你想,而是 AI 问你。你是决策者,AI 是那个不放过任何细节的产品经理。
它底层调用了另一个技能 grilling,四条核心规则:
- 逐个问,别轰炸。 一次一个问题,等你回答再继续。
- 每个问题带推荐答案。 不是干巴巴地问"你想用什么数据库?",而是"根据你的场景我建议 PostgreSQL,你觉得呢?"你只需要说行或不行。
- 能自己查的别问你。 文件系统、代码库里能找到的答案,AI 自己查。它只问你那些只有你才能回答的决策问题。
- 不到共识不动手。 达成"共享理解"之前,不写一行代码。
附上 grilling 的原文:
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.
Ask the questions one at a time, waiting for feedback on each question before continuing. Asking multiple questions at once is bewildering.
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.
Do not act on it until I confirm we have reached a shared understanding.
翻译过来就是:沿着决策树的每个分支逐个问我,每个问题带上你的推荐答案。一次只问一个,等我回答。能自己查到的事实别问我,但决策权是我的。达成共识之前,别动手。
什么时候用
任何时候你准备让 AI 写代码,但需求还停留在"我大概想要......"的阶段。
比如这些场景:
- 新功能只有一句话描述,细节全靠猜
- 想重构一块代码,但改到哪算停心里没数
- 几个技术方案各有优劣,不知道选哪个
- 拿到一份需求文档,读完发现到处是模糊地带
- 想做个 side project,但第一版到底做哪些功能还没想好
反过来,如果需求已经非常明确,那就不需要用 grill-me,直接让 AI 动手就好。
举个栗子
假设你说:"我想给卡片加一个保存功能。"
没有 grill-me,AI 可能直接开始写代码了。有了 grill-me,它会反过来问你:
Q1:你说的"卡片"是指哪种卡片? 我看代码里有两种:
NoteCard(笔记卡片)和TaskCard(任务卡片)。我建议两种都支持保存,你觉得呢?
你说:"只做 NoteCard。"
Q2:保存到哪里? 目前项目用的是 localStorage,我建议保持一致存本地。不过如果后续有多端同步需求,也可以直接接后端 API。你倾向哪个?
你说:"先存本地。"
Q3:保存的触发方式? 我建议卡片右上角加一个收藏图标,点击切换保存/取消。还是说你想要别的交互方式?
你说:"图标就行。"
Q4:保存后的卡片需要特殊标记吗? 比如角标变灰、或者在单独的"已保存"列表里展示。我建议先只做图标状态切换(实心/空心),不做独立列表。
你说:"好,就实心空心切换。"
Q5:需要持久化已保存卡片的 ID 列表吗? 我建议用一个
savedNoteIds: string[]存在 localStorage 里,key 用app:saved-notes。
你说:"可以。"
达成共识: 给 NoteCard 右上角加收藏图标,点击切换保存状态,已保存的图标变实心,状态存在 localStorage 的
savedNoteIds数组里。不涉及 TaskCard,不做独立列表。确认?
你看,五轮对话下来,你脑子里那个"给卡片加个保存功能"已经变成了一个边界清晰、可以直接动手的小需求。这就是 grill-me 的价值------它不替你思考,但它逼你把模糊的想法变成具体的决策。
一个真实的感受
实际用下来,你会发现一个有意思的现象:大部分问题你其实直接采纳了 AI 的推荐答案,只有少数几个你按自己的想法改了。整个过程看起来像是 AI 在做决策,你只是在"审批"。
但这恰恰是价值所在。
你不是在被动接受 AI 的方案,而是在 AI 提出方案的过程中,一步步看清了整个需求的全貌。每个问题都在帮你补全一个你没想到的细节,每个推荐答案都在帮你验证"这样做合不合理"。
几轮下来,你对这个需求该怎么实现、有哪些边界、要注意什么,心里已经有数了。
换句话说,grill-me 的真正价值不是"AI帮你做了决定",而是"通过 AI 的提问,你自己把这个需求想透了"。
哪怕你全选了 AI 的推荐,经过这一轮之后,你对需求的理解深度也完全不一样。
怎么用
安装有两种方式,看你的风格:
方式一:skills.sh CLI(可编辑版)
把技能复制到你的项目里,你可以随意改:
bash
npx skills.sh install mattpocock/skills
然后在项目里跑一次 /setup-matt-pocock-skills 完成初始化。
方式二:Claude Code 插件(免维护版)
bash
# 在 Claude Code 里
/plugin marketplace add mattpocock/skills
/plugin install mattpocock-skills@mattpocock
# 或者在终端
claude plugin marketplace add mattpocock/skills
claude plugin install mattpocock-skills@mattpocock
安装完之后,输入 /grill-me 触发。

注意,grill-me 是 User-invoked 类型------AI 不会自动触发,只有你主动输入才启动。这是刻意的设计:Matt 把技能分成两类,User-invoked 是编排(人决定"什么时候做什么"),Model-invoked 是执行纪律(AI 决定"怎么做")。原则是:人类负责编排,Agent 负责执行。
启动后的体验:你说出想法 → AI 逐个提问(带推荐答案)→ 沿决策树逐个解析 → 达成共识 → 可以用 /to-spec 把共识转化成结构化 spec。
grill-me 在整条管线中的位置
grill-me 不是孤立的,它是 Matt 设计的完整工作流管线的入口:
css
/grill-me → /to-spec → /to-tickets → /implement → /code-review
[对齐] [Issue追踪器] [阻塞的工单] [内部 /tdd] [双轴审查]
对齐 (grill-me)→ 规格化 (to-spec 把共识变成结构化 spec,发布到 Issue 追踪器)→ 拆解 (to-tickets 拆成 tracer-bullet 垂直切片,每个工单从 schema 到 API 到 UI 到测试完整贯穿)→ 构建 (implement 驱动 TDD 红-绿-重构)→ 审查(code-review 起两个并行子 Agent,一个查 Standards,一个查 Spec 忠实度,独立报告不合并)。
没有对齐,后面所有步骤都建在不稳固的基础上。
写在最后
装完之后,先只用 /grill-me,不要一上来跑整条管线。下次有模糊想法,让 AI 写代码之前先 /grill-me。你会发现经过 grill 之后,你对自己要做什么的理解清晰很多------很多时候你以为自己想清楚了,其实没有。
用熟了再逐步引入后续技能,找到适合你的组合就好。