| type | Phoenix Skill |
| name | phoenix-goal |
| description | Turn ONE high-level, possibly-vague goal into a runnable, objective acceptance check and a verifiable backlog, then drive it to completion. The critical step is FORMALIZE — deriving an executable done-check before any code, because a goal with no objective acceptance criterion has no honest termination. This is the DEFAULT entry for any hands-off "just go and finish it" request. Use at the start of an open-ended ask, when the user says /phoenix-goal, "achieve", "build me", "get this working end to end", "go", "go autonomous", "let's go", "just do it", "run it to done", or gives a goal without a spec. Hands off to phoenix-ralph for the loop. Not for an already-scoped backlog (use phoenix-ralph) or a single known fix (use phoenix-build). |
| license | MIT |
phoenix-goal — from a fuzzy goal to a demonstrated outcome
Goal-oriented autonomous execution (BabyAGI, ReAct, Anthropic's evaluator-optimizer) all share one
fatal weakness: without an executable acceptance criterion there is no reliable "done". Naive
agents loop forever generating busywork, or hallucinate completion. phoenix-goal fixes this by making
the first deliverable an objective done-check, not code.
The most expensive bug is building the wrong thing correctly. The second most expensive is never
knowing you're finished. phoenix-goal closes both by formalizing intent into a check that can fail.
The flow
fuzzy goal ("just go and finish it" — or any goal handed over without a spec yet)
│
▼ FRAME + confirm ── name the entry, the goal, and the done-check; invite correction before any edit
│
▼ phoenix-think ── deep interview + research ──▶ Intent Contract
│ whose DELIVERABLE is one runnable
│ acceptance check (a real command_exit)
▼ write .phoenix-ralph/done-check.json (MUST start RED — prove it fails today)
│
▼ phoenix-plan ── decompose ──▶ backlog.json (each item carries its OWN objective check)
│
▼ hand off to phoenix-ralph (the loop) ──▶ driver proves done-check failure-first ──▶ DONE
The difference from phoenix-ralph: ralph takes a backlog you already have; goal derives the backlog
and the acceptance check from a single goal first. Goal is the on-ramp; ralph is the engine.
Steps
-
FRAME the run — the handshake (always first, before any phoenix-think or edit). The failure this
step exists to prevent is silently "operating in the spirit of" a request and wandering off. So open
with a short, explicit frame and wait for a go:
- Entry: Phoenix's autonomous skills are
phoenix-goal, phoenix-auto (its autopilot), and
phoenix-ralph (the persistence loop). If the user arrived via an alias from another harness that maps
to none of them, orient in one line — "its autonomous entry is phoenix-goal, so I'll run it that
way" — no lecture.
- Goal heard: restate the goal in one sentence, as you understood it.
- Done-check: name the objective acceptance check you're about to FORMALIZE (a real test/build that
exercises the goal, which must start RED). This is what "done" will mean.
- Shape + control: one line on how it runs (formalize → decompose → loop; completion proven from the
trace) and how to steer or stop it.
- Invite correction before the first edit, then proceed to FORMALIZE.
Keep it to a few lines. The point: the user always knows the goal, the finish line, and how to drive it
before anything changes on disk.
-
FORMALIZE (the hard, non-skippable part). Run phoenix-think: interview the user / research the
codebase until the goal is unambiguous, then write the acceptance check to
.phoenix-ralph/done-check.json. It must be a real command_exit — a test or build that actually
exercises the goal — and it must be RED right now. If you cannot write a check that fails today,
the goal is still too vague: keep interviewing. No code until this exists.
-
DECOMPOSE. Run phoenix-plan: break the goal into small, independently-verifiable items in
.phoenix-ralph/backlog.json. Each item gets its own objective check. Order by dependency so the
build stays green between items.
-
SCAFFOLD the loop state: PROMPT.md (from dist/ralph/PROMPT.template.md), progress.md.
-
HAND OFF to phoenix-ralph: run dist/ralph/phoenix-ralph.ps1. The driver proves the
done-check failure-first on an intact trace before it stops.
-
REPORT with the proof: .phoenix-ralph/completed.json + the trace head + the git tag.
Who writes the checks (and why it matters)
The acceptance check is authored during FORMALIZE and frozen before implementation. The
implementing loop must satisfy the check, not weaken it. If a check genuinely needs to change,
that is a re-scope: stop, return to phoenix-think, re-baseline (watch the new check fail), and only
then continue. This separation — author the gate, then satisfy it — is what stops a system from
"optimizing the check instead of the goal".
Common Rationalizations
| Rationalization | Reality |
|---|
| "They said 'just go' / 'go autonomous' — I'll start building." | First FRAME the run: name the entry, restate the goal and the done-check you'll formalize, and get a go. Editing before the user has seen the finish line is the wander this skill exists to prevent. |
| "The goal is clear enough, I'll start coding." | If you can't write a check that fails today, it isn't clear enough. Formalize first. |
"I'll use test -f output as the acceptance check." | That's vacuous — it can't meaningfully fail. The done-check must exercise the actual behavior (a real test/build). |
| "I'll let the loop figure out what done means." | A loop with no objective termination runs forever or fakes done. Define the check up front. |
| "The goal shifted, I'll just relax the check." | Relaxing the gate to pass is optimizing the check, not the goal. Re-scope through phoenix-think and re-baseline. |
| "Decomposition is overhead, I'll one-shot it." | For anything multi-step, an un-decomposed goal can't keep the build green between changes. Plan into verifiable slices. |
Red Flags — stop
- You started FORMALIZE or editing without first restating the goal + done-check to the user and getting a go. → Stop; do the FRAME handshake first.
- You're about to write code and
done-check.json doesn't exist yet. → Formalize first.
- Your done-check passes on an untouched repo. → It's vacuous; re-target it at the unmet behavior.
- The backlog items have prose acceptance ("works well") instead of an objective
check. → Rewrite each as a runnable check.
- You weakened the acceptance check to make the loop finish. → That's not done; re-scope honestly.
Relationship to the other skills
phoenix-goal = FORMALIZE + DECOMPOSE, then it delegates the persistent execution to
phoenix-ralph. It leans on phoenix-think (to derive the check) and phoenix-plan (to derive
the backlog). It is the Phoenix realization of the Intent-to-Outcome loop's "intent → verifiable
acceptance criteria" step (see docs/intent-to-outcome.md).