A runtime overlay that stops improvisation
You ask the agent to run your PR-review recipe. Instead of invoking the recipe engine, a helpful agent performs the review steps by hand — routing around the one system built to run them reproducibly.
The recipe it skipped is not a toy. Here's what it actually is.
code-review-comprehensive is a 6-step conditional review with per-step model routing across haiku, sonnet, and opus — a substantial artifact worth running, not something to redo by hand.
And recipes like this have a proper execution path the agent skipped.
The tool-recipes module is the execution engine for Amplifier recipes. It exposes four operations — the correct way to run a recipe is recipe_execute with a recipe_path, not to redo the steps by hand.
The rule against improvising is already written down. That's the catch.
The recipes bundle declares a Required Workflow (Non-Negotiable): delegate to recipes:recipe-author, validate with recipes:result-validator, and "Do NOT write recipe YAML directly." But that discipline lives in docs — nothing at runtime stops the agent from improvising anyway.
Amplifier already has a primitive that can move that rule from docs into runtime.
Amplifier modes are lightweight runtime overlays that modify assistant behavior without changing the bundle. Each tool gets a policy — and if a tool isn't listed, default_action applies, which defaults to block.
That default is what makes a recipes-only mode possible — if enforcement holds.
The mode pre-tool hook (1,256 lines) denies any tool not in tools.safe when default_action is block, returning action='deny' and emitting mode:tool_blocked. Infrastructure tools — mode and todo — always bypass, so a block-by-default mode is not a trap.
Strict enough to enforce, safe enough to trust. Now assemble the mode.
Recipe-runner mode is just tools.safe:[recipes] with default_action:block. And recipes already ships whitelisted in the careful and plan modes — so it's expressible from primitives that ship today. Improvisation becomes reproducible execution.
The lesson generalizes past this one mode.
When you want a system used the right way, a documented rule can be routed around. A runtime overlay that blocks everything else can't be. Make the correct path the only available path.
Data as of: 2026-07-21. Feature status: modes system shipped and actively maintained (microsoft/amplifier-bundle-modes v1.3.1, latest commit 64894a5, 2026-07-16); recipes tool shipped (microsoft/amplifier-bundle-recipes, "recipes" v1.0.0).
Every claim independently re-derived via:
default_action='block': cat amplifier-bundle-modes/README.md context/modes-instructions.mdmode:tool_blocked): wc -l modules/hooks-mode/.../__init__.py; read lines 800–877; grep -n MODE_TOOL_BLOCKED events.py{mode, todo}: grep -n infrastructure_tools __init__.pycat modes/careful.md modes/plan.mdgh api repos/microsoft/amplifier-bundle-recipes/contents/modules/tool-recipes/README.md?ref=maingh api repos/microsoft/amplifier-bundle-recipes/contents/examples/code-review-recipe.yaml?ref=maingh api repos/microsoft/amplifier-bundle-recipes/contents/bundle.md?ref=maingh api .../commits?path=...&sha=main; git log --reverse --date=shortOwners: microsoft (org) — amplifier-bundle-modes and amplifier-bundle-recipes.
Gaps / honest framing: No committed mode file literally named recipe-runner.md exists (modes/ holds careful, explore, mode-design, plan) — the mode is a correct application of verified primitives, expressible today, not a located artifact. The specific "user asked, agent improvised, so they built it" incident is illustrative narrative framing, not documented history; the building blocks are all independently verified.