From auto
Author a new auto recipe (a named workflow topology) from a plain-language description, or reverse-derive one from a completed run. Use when the user says "save this workflow as a recipe", "I want an auto recipe that does X", "make a recipe for ...", or wants to turn a workflow they run by hand into a reusable auto recipe. The user describes how they want the workflow to run; this skill compiles that into a validated recipe JSON file (workspace or global tier) — the user never writes JSON. Also handles "save the topology of the run that just finished" by reading its ledger.
How this skill is triggered — by the user, by Claude, or both
Slash command
/auto:auto-author-recipeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A **recipe** is a named JSON declaration of a workflow topology — the initial
A recipe is a named JSON declaration of a workflow topology — the initial
ledger /auto builds a run from (units, their depends_on graph, the phase
each runs in, and which emitter produces work units at a phase boundary). The
user should NOT write that JSON by hand. This skill is the compiler: the user
describes the workflow in plain language, and this skill produces a validated
recipe file.
The contract is lib/recipes.py — call its validate_and_lint to gate every
write, and lib/topology-render.py::render to show the user the topology before
writing. Never invent a recipe shape that wouldn't pass validate.
Entry A — author from prose ("I want a recipe that does X"):
description)depends_on; sequential units depends_on their predecessor)depends_on them)plan-phase unit + a phase_transitions
emitter; already-written → the work-only shape, phase_order: ["work"])plan_output_to_work_units;
N competing plans + judge = judge_winner_to_work_units; two biased builders +
comparator = plan_output_to_paired_builders. (These are the only V1 emitter
names validate accepts; non-default phase_order other than ["work"] is
rejected until v0.2.1.)bash "${CLAUDE_PLUGIN_ROOT}/lib/recipes-list.sh" --render <name> is for
existing recipes; for a draft, call lib/topology-render.py::render(draft, 60)
via a short Bash python invocation and print the card. Ask "does this match?"Entry B — reverse-derive from a completed run ("save the run that just finished"):
<repo>/.claude/auto/<run-id>.json.units (id, phase, depends_on, invokes →
dispatch_context), phase_order, terminal_phase, and any
phase_transitions it carried.<repo>/.claude/auto/recipes/) or
global (personal, all repos — ~/.claude/auto/recipes/)?validate_and_lint(draft) via Bash (load lib/recipes.py
through _bootstrap.load_lib_module). HARD errors block — surface the message,
fix with the user, re-validate. LINT warnings (unreachable phase,
description-spoofing, etc.) are surfaced but don't block; let the user decide.os.rename (NOT a
plain open-write; a concurrent /auto reading mid-write must never see a torn
file). Same discipline as lib/ledger.py::_atomic_write.feedback_subagent_write_verification): read
the file back, run load_and_validate on it, and confirm it renders to the
same topology you showed. Only THEN report "saved <name> to ". If the
read-back fails validation, delete the file and report "save failed".A recipe may declare an optional iteration block to make the loop
outcomes-gated — a designated gate unit's verdict.decision drives whether
the run advances, iterates (emits another round of siblings), or exits with an
audit trail. When the user describes a workflow that should "keep going until
the judge says it's good" / "let the comparator re-spawn the pair if neither
wins" / "stop after at most N rounds," reach for iteration.
What to elicit:
iteration.gate_unit.emit_templates[<name>]
entry with {phase, invokes, id_prefix} and reference it via
iteration.emit_template = "<name>". The new units land in the template's
phase at iteration time; the engine generates ids monotonically as
id_prefix + N. If no (just re-engage the gate after a clarifying signal),
omit emit_template.iteration.bound.max_attempts is required and caps
honored iterate decisions. Optional max_wall_seconds caps cumulative
ACTIVE wall-time. Pick conservatively — the bound is engine-enforced, so a
misbehaving gate cannot loop forever.Validate as usual. validate_and_lint covers the iteration shape: gate_unit
must reference a real unit (or an emit_templates id_prefix); when
emit_template is set, emit_templates must be defined and contain that key;
bound.max_attempts must be a positive int (bool values are rejected, since
isinstance(True, int) is True in Python).
See docs/contracts/recipe-format.md §6 + §7 for the full field set and
skills/auto/SKILL.md §0.5 for the engine's routing semantics.
phase_order beyond work-only,
unregistered emitter names, a loaded python_hook) — validate rejects them
and you surface the rejection rather than working around it./auto <plan> --recipe <name>. Tell the
user that's how to use what they just saved.npx claudepluginhub shawnroos/autoGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.