Use when the user (or the advisor) wants to design and register a NEW optional pipeline phase conversationally — "add a phase that does X". Interviews for goal-type, trigger signal, report sections, and verdict; synthesizes a phase.json + persona; registers them via `evolve phases create`; self-corrects from the command's JSON envelope. The Go binary is the single enforcement point, so this flow works from any LLM CLI.
Install
npx skillscat add mickeyyaya/evolve-loop/phase-create Install via the SkillsCat registry.
Phase Create — conversational phase registration (ADR-0038)
You turn a phase idea into a registered, advisor-selectable pipeline phase. All
validation, collision-checking, scaffolding, and index rebuilding live inevolve phases create — your job is to design a good spec, call the command,
and self-correct from its JSON envelope. Never write .evolve/phases/ oragents/ files directly; the command is the only sanctioned writer.
What a phase IS here
A phase is pure declarative config: a phase.json descriptor (the contract)
plus a persona markdown (the prompt). No executable code. User phases are
always optional:true, kind:"llm", and can never displace the
build→audit→ship spine — the same gates and policies apply to every phase.
Stage 1 — Interview (one question at a time)
Establish, in order:
- Purpose — one sentence: what does the phase produce? (becomes
description) - Archetype —
plan(decides/scopes before build) orevaluate(verifies
after build). User phases are neverbuild/control. - Goal types — which cycles is it for?
categories: subset of
bugfix | feature | refactor | security | performance | release | docs. - Trigger — the objective signal that should make the advisor SELECT it
(becomeswhen_to_use, ≤140 chars, and ideally arouting.insert_when
condition on a real signal likescout.goal_typeorbuild.diff_loc). - Report shape — 2–3 required
## sectionheadings for its report
(classify.require_sections); evaluate phases should opt into a verdict
(verdict_on_pass: "PASS") and, when they do, into the failure-signal
contract (require_failure_context: true, ADR-0039): a FAIL/WARN verdict
sentinel must then carryfailure: {class, defects[], evidence_paths[]}—
the contract gate teaches the exact line and re-dispatches on omission. - writes_source? — does it write files into the worktree? (true ⇒ sandbox
role-gate; most evaluate phases are read-only.) - Position —
afterwhich phase? (empty = the pre-audit slot.)
Skip questions the user's request already answers. Check the existing catalog
first — evolve phases list (or .evolve/phase-inventory.json) — and tell the
user when an existing phase already covers the need (SELECT over MINT applies
to humans too).
Stage 2 — Synthesize
Draft the phase.json (kebab-case name; optional:true; kind:"llm"; the
metadata trio description / when_to_use / categories; typedinputs/outputs incl. signals; classify; routing; after) and a persona
markdown. Model the persona on agents/evolve-bug-reproduction.md: frontmatter
(name/description/model/tools/output-format), pipeline-position diagram,
numbered workflow, an Output Contract section naming the required headings,
and an anti-Goodhart note. Show both to the user for approval before
registering.
Stage 3 — Register and self-correct
evolve phases create --spec - <<'SPEC'
{ ...the phase.json... }
SPECPass the persona with --persona <file> (write it to a temp file first;
only one input may use stdin). The command prints ONE JSON envelope to stdout:
{"ok":true, "artifact":…, "required_sections":[…], "emits_verdict":…, "inventory_rebuilt":true}— done. Report the derived contract to the user
and note the advisor can SELECT the phase from the next cycle start.{"ok":false, "errors":[…], "warnings":[…], "hint":…}(exit 2) — fix every
listed error in the spec and re-run. At most 3 correction passes; if
still failing, show the user the errors verbatim and stop.
Treat warnings as advice worth fixing (unknown category, missing
require_sections) but not blockers.
Mint promotion
To persist a good ephemeral mint from a routing plan, pass the mint JSON
(plus a name) instead of a spec:
evolve phases create --mint - <<'MINT'
{"name":"context-condense","prompt":"<persona>","tier":"balanced","writes_source":false}
MINTThe prompt becomes the persona body; tier becomes the model. Flesh out the
generated spec (categories, when_to_use, classify) afterwards via the normal
interview if the mint should become a first-class catalog citizen.
Plugin distribution
A phase created here lands in .evolve/phases/ (project-local). To ship
phases as a plugin bundle: put the same <name>/phase.json dirs in any
directory and add it to the colon-separated paths.phase_roots field in.evolve/policy.json. Left-most root wins on name collision; built-ins always
win. Details: docs/architecture/phase-plugin-system.md.