Skills v1.2: /wait-what, Codex metadata, and a Claude Code plugin
v1.2 of Matt Pocock's AI coding skills ships as a Claude Code plugin and gains a documentation site at aihero.dev/skills. Each SKILL.md now has an agents/openai.yaml sidecar carrying Codex UI metadata; policy.allow_implicit_invocation: false mirrors disable-model-invocation so user-invoked skills stay out of the agent context until explicitly typed. New additions include /wait-what, a one-word corrective that re-pitches without dropping content, /wizard, which produces deterministic bash scripts for human-only steps, and /to-questionnaire, which turns an unanswerable decision into an async Markdown questionnaire. The /wayfinder router gains explicit phase boundaries, /handoff is narrowed to travel-only cases, and /compact becomes the default context action. /write-for-agents is renamed /docs-for-agents while six skills are absorbed or removed. Worth reading for engineers maintaining skills in Claude Code or Codex who care about cross-harness metadata and context engineering.
Version 1.2 of my skills is out. It ships the skills as a Claude Code plugin, adds Codex metadata to every skill, and puts the whole set behind a documentation site at aihero.dev/skills. Three skills are new to the plugin, one is renamed, and six are gone.
The full changeset is in the v1.2.0 release. This page covers what changes for you.
我的技能集 1.2 版本发布了。现在它以 Claude Code 插件的形式交付,为每个技能添加了 Codex 元数据,并把整套内容放在 aihero.dev/skills 文档站点后面。插件新增了三个技能、重命名了一个,还移除了六个。
完整变更集见 v1.2.0 发布说明。 本页介绍对你而言有哪些变化。
Each SKILL.md now has an agents/openai.yaml beside it. The sidecar carries the Codex UI metadata (interface.display_name, interface.short_description), so the set works in both harnesses without generated copies.
The important line in that file is policy.allow_implicit_invocation: false. It is the Codex analog of disable-model-invocation: true. Every user-invoked skill now carries it, so Codex keeps that skill out of the agent's context until you type $skill. Before this release, the user-invoked / model-invoked split held in Claude Code but not in Codex.
AGENTS.md is a symlink to CLAUDE.md, so Codex reads the same repo instructions.
每个 SKILL.md 旁边现在都有一个 agents/openai.yaml。这个 sidecar 文件携带 Codex 界面元数据(interface.display_name、interface.short_description),因此整套技能在两个工具中都能使用,无需生成副本。
该文件中的重要一行是 policy.allow_implicit_invocation: false。它是 disable-model-invocation: true 在 Codex 中的对应项。每个由用户调用的技能现在都带上了它,于是 Codex 会将该技能排除在 agent 上下文之外,直到你输入 $skill。此前,用户调用/模型调用的区分只在 Claude Code 中成立,在 Codex 中并没有。
Start at /skills and read the groupings. The main flow runs /grill-with-docs → /to-spec → /to-tickets → /implement → /code-review. The left panel is a full reference of every skill.
Each page holds a Common questions section, sourced from the wiki of questions people actually ask me, and an It's working if section. First use of a term links to the AI Coding Dictionary, the ticket link, for example, goes to my definition of a ticket. You can read the docs to learn the skills, or to learn how AI coding works.
从 /skills 开始阅读各个分组。主线流程为 /grill-with-docs → /to-spec → /to-tickets → /implement → /code-review。左侧面板是每个技能的完整参考。
每个页面都包含“常见问题”板块,内容来自人们实际向我提问的 wiki,以及“它生效的标志”板块。术语首次出现时会链接到 AI 编码词典,例如 ticket 一词会链接到我对 ticket 的定义。你既可以阅读文档来学习技能,也可以从中了解 AI 编码的运作方式。
Reinstall under the new name. There is no alias, and the old name is gone.
The rename follows the scope. The reference now covers any document an agent consumes, skills, AGENTS.md, CLAUDE.md, and docs reached by a pointer, not just skills. Use it to pull an overloaded AGENTS.md apart into skills, which stops the front-loading.
Three structural changes come with it:
GLOSSARY.md is merged into SKILL.md. One authoritative treatment per term.
The skill-only mechanics (frontmatter, model- vs user-invoked, router skills, the invocation cut) move to SKILL-MECHANICS.md.
The skill is model-invoked. It fires when you create or edit a skill, or modify AGENTS.md / CLAUDE.md.
请用新名称重新安装。没有提供别名,旧名称已经移除。
这次改名与它的范围一致。该参考现在覆盖 agent 会消费的任何文档:技能、AGENTS.md、CLAUDE.md,以及通过指针到达的文档,而不只是技能本身。可以用它把一个臃肿的 AGENTS.md 拆解成多个技能,从而避免前置加载。
随之而来有三项结构性变化:
GLOSSARY.md 并入 SKILL.md,每个术语只保留一份权威解释。
仅与技能相关的机制(frontmatter、模型调用与用户调用、路由技能、调用截断)移到 SKILL-MECHANICS.md。
The pruning section gains one new term, cache. The environment is a source of truth: package.json scripts, config files, the directory layout, --help output. A document that restates them is a cache of a lookup, and it earns its load only when the lookup is expensive. Cache what the agent cannot find by looking, the unwritten convention, the reason behind a choice, the edge case no config confesses. Leave the one-file, one-command lookups to the environment, where they cannot go stale.
修剪(pruning)章节新增了一个术语:缓存(cache)。环境才是事实来源:package.json 脚本、配置文件、目录结构、--help 输出。一份复述这些内容的文档,本质上是查表的缓存;只有当查表成本高时,它才值得被加载。要缓存的是 agent 靠“看”找不到的东西:未写下来的约定、某个选择背后的原因、没有任何配置会坦白的边界情况。而单文件、单命令就能查到的东西,留给环境本身,它们在那里不会过期。
A one-word corrective for model verbosity. Type it the moment a message fails to land. The agent re-pitches: a little context, ASD-STE100 Simplified Technical English, and the ubiquitous language from your CONTEXT.md. User-invoked, three lines long.
The mechanism is the name. Concision skills fail by growing — a 400-line skill still leaves the model verbose — so this one is a single precise leading word and nothing else. Names that describe the output (/tldr, /no-fluff) make the model clip words and lose you further. Naming the listener's state asks for both halves at once: fewer words, and the context you were missing.
It repairs one message. It does not prevent the next one. The cure for jargon is a shared language built upfront with /grill-with-docs. Reach for /wait-what when you do not have one yet.
这是一个用于纠正模型啰嗦的单词指令。当消息没被理解时,立即输入它。agent 会重新表述:补充一点上下文,使用 ASD-STE100 简化技术英语,以及 CONTEXT.md 中的通用语言(ubiquitous language)。该技能由用户调用,只有三行。
机制就在于这个名字。追求简洁的技能往往会越长越臃肿——400 行的技能依然会让模型啰嗦——所以这个技能只用一个精确的引导词,别无其他。那些描述输出形态的名字(/tldr、/no-fluff)会让模型删词,反而让你更难懂。命名听者所处状态,则同时要求两件事:更少的词,以及你缺失的上下文。
它修复的是当前这条消息,并不能预防下一条。治疗行话的良药,是先用 /grill-with-docs 建立起共享语言。当你还没有这种语言时,才用 /wait-what。
/wizard graduates out of in-progress/ into the Engineering bucket, and is model-invoked.
It generates an interactive bash script that walks a human through a manual procedure, third-party setup, a one-off migration, an A→B state transition. The script opens each URL, says what to click, captures the values you paste in, and writes them into .env files and GitHub Actions secrets. It is a deterministic script, so no secret you type reaches an agent.
The UX is pre-solved by the bundled template.sh: progress with time remaining, confirmation gates, cross-platform URL opening (including WSL), hidden secret entry, idempotent .env upserts, gh secret / gh variable writes with graceful degradation, and a closing skip summary. Everything above the STAGES marker is a fixed library and is never hand-edited. The skill's job is to scope the procedure and author its stages.
Model-invocation means the agent reaches for /wizard the moment it hits a step only a human can perform, instead of dumping numbered instructions into the chat. Typing /wizard works exactly as before. The description names four trigger branches (provisioning infrastructure, setting up credentials or CI secrets, walking an unfamiliar third-party dashboard, a one-off migration or cutover) and one explicit non-trigger: do not invoke it for steps the agent can perform itself. Work an agent can do, an agent should do. /wizard is for the clicks, approvals and dashboard trips you would not hand to one.
/wizard 从 in-progress/ 毕业,进入 Engineering 分类,并由模型调用。
它会生成一个交互式 bash 脚本,引导人类完成手动流程、第三方配置、一次性迁移或 A→B 状态转换。脚本会打开每个 URL、说明该点击哪里、捕获你粘贴的值,并写入 .env 文件和 GitHub Actions secrets。这是一个确定性脚本,因此你输入的密钥不会到达任何 agent。
用户体验已由随附的 template.sh 预先解决:带剩余时间的进度显示、确认门、跨平台 URL 打开(包括 WSL)、隐藏的密钥输入、幂等的 .env 写入、带优雅降级的 gh secret / gh variable 写入,以及收尾的跳过摘要。STAGES 标记之上的所有内容都是固定库,绝不手工编辑。该技能的职责是界定流程范围,并编写各个阶段。
模型调用意味着,agent 一旦遇到只有人类才能执行的步骤,就会使用 /wizard,而不是在聊天里甩出一堆编号指令。手动输入 /wizard 的效果与之前完全一样。描述中列出了四个触发分支(配置基础设施、设置凭据或 CI secrets、走查陌生的第三方仪表盘、一次性迁移或切换)以及一个明确的非触发条件:agent 自己能完成的步骤不要调用它。agent 能做的活,就该让 agent 做。/wizard 是为那些你不会交给 agent 的点击、审批和仪表盘操作准备的。
/to-questionnaire graduates out of in-progress/ into the Productivity bucket.
It turns a decision you cannot answer alone into a Markdown questionnaire for the one person who can. Fill it in async, or work through it together in a meeting. I built it during a /wayfinder session on a garden office: the agent was grilling me, but the person to ask was my wife. The questionnaire went into a Google Doc, we worked through it, and the answers came back to the agent.
Its defining move is that it grills you about the send, not the subject. A normal grilling session interrogates the topic, which is exactly what you cannot answer here. So the interview asks only who the questionnaire goes to and what you need back, then aims every question at the gap between the two.
/ask-matt frames it as the inverse of /grill-me: mine someone else, not yourself.
/to-questionnaire 从 in-progress/ 毕业,进入 Productivity 分类。
它把你自己无法单独回答的决定,变成一个 Markdown 问卷,交给唯一能回答的那个人。对方可以异步填写,也可以在一次会议中一起过一遍。我是在一次关于花园办公室的 /wayfinder 会话中构建它的:当时 agent 在盘问我,但真正该问的人是我妻子。问卷放进 Google Doc,我们共同填写,答案最终回到了 agent 那里。
它的标志性做法是:盘问的是“发送”而非“主题”。普通的盘问会话会追问主题,而这恰恰是你在这里无法回答的东西。所以访谈只问两件事:问卷发给谁、你需要拿回什么。然后让每一个问题都瞄准这两者之间的空隙。
/ask-matt 把它框定为 /grill-me 的反向操作:挖掘别人,而不是挖掘自己。
/grilling moves from one question at a time to round by round. The same 13 questions land in about 3 rounds instead of 13 turns.
The skill maps the work as a design tree: every decision branches into the decisions that hang off it. The frontier is every decision whose prerequisites are already settled, the questions it can ask now without guessing at answers it has not heard. It asks the whole frontier as one numbered round, then recomputes the frontier from your answers and asks the next round. A question whose answer depends on another question still open belongs to a later round. The session ends when the frontier is empty.
Facts the environment can answer go to sub-agents, so research never blocks a round. A running exploration is an unsettled prerequisite: only the questions downstream of it wait, and the rest of the frontier is asked now. The decisions stay yours.
Every question in a round uses one fixed shape:
❓ Q1 - <question title>: <question body, might be multiple paragraphs, including multiple choices>
➡️ <your recommended answer>
A round reads as a scannable numbered list, with each recommendation separated from its question. You answer by number ("Q1 agree, Q2 agree, Q3 change this"), which suits dictation.
/grill-me, /grill-with-docs and /triage run the frontier a round at a time too. The opt-out for one question at a time is unchanged: add a line to your global CLAUDE.md.
/grilling is also reworded for general use. "This plan" becomes "this", "enact the plan" becomes "act on it", and "exploring the codebase" becomes "exploring the environment". The technique is unchanged. It now reads as a stress-test of any plan, decision, or idea.
/grilling 从一次一个问题改为按轮提问。同样的 13 个问题,现在大约 3 轮就能问完,而不是 13 轮。
该技能把工作映射成一棵设计树:每个决策都会分出挂在它下面的子决策。前沿(frontier)是所有前置条件已经确定的决策,也就是它现在就能问的问题,而不必去猜还没听到的答案。它把整个前沿作为一轮编号问题抛出,然后根据你的回答重新计算前沿,再问下一轮。一个问题的答案依赖于另一个尚未解决的问题时,它属于更后面的一轮。当前沿为空时,会话结束。
环境能回答的事实会交给子 agent 处理,因此研究永远不会阻塞一轮提问。进行中的探索是一个未解决的前置条件:只有它下游的问题需要等待,其余前沿问题现在就可以问。决策权始终在你手中。
每一轮中的每个问题都使用一种固定格式:
❓ Q1 - <问题标题>:<问题正文,可以是多段,包含多个选项>
➡️ <你的推荐答案>
一轮读起来像一份可扫读的编号列表,每条推荐与对应问题分开。你可以按编号回答(“Q1 同意,Q2 同意,Q3 这条改一下”),这很适合口述。
/grill-me、/grill-with-docs 和 /triage 也按一轮一轮的方式运行前沿。放弃一次一个问题的退出机制没有变:在全局 CLAUDE.md 中加一行即可。
/grilling 也改写了措辞,使其更通用。“This plan” 变成 “this”,“enact the plan” 变成 “act on it”,“exploring the codebase” 变成 “exploring the environment”。技术本身没有变。现在它读起来像是对任何计划、决策或想法的压力测试。
The logic branch now produces a single self-contained file, plain HTML, CSS and JS, no build and no server, instead of a terminal app. A non-developer opens it by double-click and drives it in their own domain language: a labelled state panel, free-play buttons that are always available, and tabbed guided walkthroughs, each a scenario with its ordered buttons underneath. The portable pure-logic module still lifts into the real code. The HTML shell is the throwaway.
Throwaway no longer means deleted. The /prototype output is captured as runnable evidence on a prototype/<name> branch off main, with a context pointer to it on the implementation issue. Main keeps only the validated decision, and the exploration stays findable. The answer (verdict plus question) is still captured in an issue, ADR or commit.
People read a /wayfinder ticket as an ordinary implementation ticket, a slice of a build to execute. /wayfinder uses them as decision tickets: questions whose resolution is a decision. The skill description, its opening line, the README blurbs and the docs page all introduce the term now. "Ticket" stays the everyday word once the term is established, and CONTEXT.md records Decision ticket as a domain term.
Research tickets are no longer parked for a separate session. Research stays a real ticket type, because it is a genuine shared blocker that downstream decisions hang on. What changes is how it resolves. Research is AFK, so charting does not stop to read it: after creating the tickets, the charting session fires a /research subagent for each research ticket and burns them down in parallel, capturing findings on a research/<name> branch with a context pointer. Research tickets are the one exception to one ticket per session.
逻辑分支现在会生成一个自包含的单一文件:纯 HTML、CSS 和 JS,无需构建、无需服务器,而不是一个终端应用。非开发者双击打开后,就能用自己的领域语言操作它:带标签的状态面板、随时可用的自由操作按钮,以及分标签的引导式演练,每个演练场景下方都按顺序排列着对应按钮。可移植的纯逻辑模块仍然可以提升到真实代码中。HTML 外壳是一次性的。
“一次性”不再意味着删除。/prototype 的输出会作为可运行证据,保存在 main 之外的 prototype/<name> 分支上,并在实施 issue 上附上指向它的上下文指针。main 只保留已验证的决策,探索过程仍然可查。答案(结论加问题)仍然记录在 issue、ADR 或 commit 中。
人们会把 /wayfinder 的 ticket 读成普通的实施 ticket——一段待执行的工作。而 /wayfinder 把它们当作决策 ticket:其解决方案就是一个决策。技能描述、开场白、README 简介和文档页面现在都引入了这个词。一旦术语确立,“ticket”仍是日常用语,CONTEXT.md 会把 Decision ticket 记为领域术语。
研究 ticket 不再被搁置到单独的会话。研究仍然是一种真正的 ticket 类型,因为它是下游决策依赖的真正共享阻塞项。变化的是它的解决方式。研究是 AFK 的,所以 wayfinding 会话不会停下来读它:创建 ticket 后,wayfinding 会话会为每个研究 ticket 启动一个 /research 子 agent,并行地逐个完成,并把发现记录在 research/<name> 分支上,附上上下文指针。研究 ticket 是“一个会话一个 ticket”的唯一例外。
The router gains phase boundaries. A phase is a chunk of work inside a session (the grilling, the implementation, the QA), and the boundary between two of them is where you decide what to do with the context you built. The old two-bullet section is now a decision tree with all five options in order: continue, /clear, /handoff, subagent, /compact. The reasoning is disclosed in PHASE-BOUNDARIES.md. Three fixes come with it:
/handoff was oversold. It is narrow. You need it only when something has to travel, a new harness, a new directory, a colleague, or a side task forked mid-phase.
/compact is the default, not the first reach. It sits at the bottom of the tree. Starting there gives you a session that is confidently wrong about whatever the summary flattened.
Two branches were missing. Rule out continue first, it is the only move that keeps the conversation as a primary source rather than a summary of one. A subagent handles anything scoped tightly enough to run AFK.
Context hygiene's escape hatch now says /compact rather than /handoff, and the smart zone figure moves from ~120k to ~150k tokens.
/wayfinder routing fixes the two mistakes people make most with the heaviest flow. Over-reaching for it: /wayfinder is slower and denser than a single grill, so it is reserved for the idea that genuinely will not fit one session. A well-scoped feature belongs on /grill-with-docs. Losing the way at the handoff: when the map clears, /wayfinder hands off, it does not build. Merge onto the main flow at /to-spec, which collapses the map's linked decisions into a buildable plan. Go straight to /implement only when the effort turned out genuinely small.
/grilling and /resolving-merge-conflicts were absent from the router and are now in it. /grill-me splits from /grill-with-docs on whether you are in a working directory.
路由器新增了阶段边界。阶段(phase)是会话中的一块工作(盘问、实施、QA),两个阶段之间的边界,正是你决定如何处理已构建上下文的地方。原来的两行要点现在变成一棵包含全部五个选项的决策树,按顺序为:continue、/clear、/handoff、subagent、/compact。推理过程在 PHASE-BOUNDARIES.md 中公开。随之而来有三处修复:
/handoff 之前被过度推销了。它其实很狭窄。只有当某些东西需要“转移”时才需要它:新的工具链、新目录、同事,或阶段中途分出的一个副任务。
/compact 才是默认项,不是首选。它排在树的底部。从它开始,你会得到一个对摘要压平的一切都“自信地错着”的会话。
之前缺了两条分支。先排除 continue,它是唯一能让对话保持为原始来源、而不是摘要来源的动作。任何范围足够紧凑、可以 AFK 运行的事情,交给子 agent。
上下文卫生的逃生舱现在写的是 /compact,而不是 /handoff;智能区间的数字也从约 12 万 token 移到约 15 万 token。
/wayfinder 的路由修正解决了人们在使用这条最重流程时最常犯的两个错误。一是过度使用:/wayfinder 比单次盘问更慢、更密集,所以它只留给真正无法在一次会话中完成的想法。范围清晰的特性应该用 /grill-with-docs。二是在交接时迷路:当地图清空时,/wayfinder 负责交接,而不是继续构建。在 /to-spec 处并入主线流程,它会把地图上的关联决策折叠成一个可执行的计划。只有当工作量确实很小时,才直接跳到 /implement。
/grilling 和 /resolving-merge-conflicts 之前不在路由器中,现在已经加入。/grill-me 与 /grill-with-docs 的分工取决于你当前是否在某个工作目录中。
/improve-codebase-architecture gains a YAGNI scoping filter on its Explore step. It no longer scans the repo evenly. Name a direction and it takes it; otherwise it reads the last ~20 commit messages and biases exploration toward actively-developed paths. A deepening opportunity in code nobody touches is a refactor you never cash in, so the report stops tidying dormant corners.
/setup-matt-pocock-skills is friendlier. Triage labels are asked about only when /triage is installed, and then as one recommended-yes question. External PRs as a request surface is no longer a question, the flag ships defaulted off. Domain docs default to single-context unless the repo shows monorepo signals. Local-markdown tickets are one file per ticket under .scratch/<feature>/issues/<NN>-<slug>.md, and the spec file is spec.md.
The /to-prd → /to-spec rename is finished. "Spec" is the only term in the shipped text. /to-spec drops the "you may know this as a PRD" opener, /code-review talks about the originating issue/spec, and the GitHub and GitLab tracker templates stop writing "PRDs" into every repo they touch.
None of the six was in the Claude Code plugin, but all six were installable through skills.sh, which serves every skill in the repo. Four are absorbed by a skill that does the job better:
/ubiquitous-language → /domain-modeling, which maintains the whole domain model rather than dumping a glossary from one conversation.
/design-an-interface → /codebase-design. Nothing is lost: the design-it-twice technique ships inside that skill as DESIGN-IT-TWICE.md.
/qa → /triage and /to-tickets.
/request-refactor-plan → /to-spec and /improve-codebase-architecture.
Two were only ever mine, tied to my own machine. The personal/ bucket goes with them: /edit-article and /obsidian-vault.
skills/deprecated/ stays as an empty bucket. skills/in-progress/ is unchanged, and is now described for what it is: a beta channel, published on purpose, installable one skill at a time through skills.sh.
/improve-codebase-architecture 在 Explore 步骤中新增了 YAGNI 范围过滤器。它不再均匀地扫描整个仓库。你指定方向,它就沿着那个方向走;否则它会读取最近约 20 条 commit message,把探索偏向正在活跃开发的路径。在没人碰的代码里发现一个深化机会,等于一次永远兑现不了的重构,所以报告不再收拾沉睡的角落。
/setup-matt-pocock-skills 更友好了。只有当 /triage 已安装时,才会询问 triage 标签,而且是一个默认推荐“是”的问题。外部 PR 作为请求渠道不再是一个问题,该标志默认关闭。除非仓库显示出 monorepo 信号,领域文档默认是单上下文。本地 markdown ticket 在 .scratch/<feature>/issues/<NN>-<slug>.md 下每个 ticket 一个文件,spec 文件是 spec.md。
/to-prd → /to-spec 的改名已经完成。“Spec”是发布文本中唯一的术语。/to-spec 去掉了“你可能知道这叫 PRD”的开场白,/code-review 谈论的是来源 issue/spec,GitHub 和 GitLab 的 tracker 模板也不再向每个仓库写入 “PRD”。
被移除的六个技能都不在 Claude Code 插件中,但它们都可以通过 skills.sh 安装——它服务于仓库中的每个技能。其中四个被更能胜任的技能吸收:
/ubiquitous-language → /domain-modeling,后者维护整个领域模型,而不是从一次对话中倒出一份术语表。
/design-an-interface → /codebase-design。没有任何损失:design-it-twice 技术以 DESIGN-IT-TWICE.md 的形式沉淀在该技能内部。
/qa → /triage 和 /to-tickets。
/request-refactor-plan → /to-spec 和 /improve-codebase-architecture。
另外两个从来只属于我自己,绑定在我自己的机器上。personal/ 分类也随它们而去:/edit-article 和 /obsidian-vault。
skills/deprecated/ 仍然是一个空分类。skills/in-progress/ 没有变化,但现在的描述更符合它的本质:一个 beta 渠道,有意发布,可以通过 skills.sh 逐个安装。