stella goal

Work in judged rounds, optionally under an installed wrapper plugin, until a verifier model confirms the goal is met.

Give stella a goal and let it work in judged rounds until a verifier model confirms, from evidence, that the goal has actually been met.

Synopsis

stella goal <goal> [--pipeline <VARIANT>] [--test-command <CMD>] [--require-verdict] [global flags]

What it does

stella goal works in rounds. Each round is a plain step-loop turn by default. Pass --pipeline <variant> to use an installed wrapper plugin for the worker turn of every judged round instead.

The plugin used here must be a steering or observer style wrapper. stella goal already decides on its own when a round is complete, so a wrapper that also tries to decide completion is refused before the run even starts. That kind of wrapper belongs with stella run --pipeline <variant> instead.

At the end of each round, a verifier model checks on its own whether the goal is met. It reads the changed files, tests, and CI results with read-only tools, rather than trusting the worker's own account of what happened. The verifier itself never runs through a wrapper.

The loop ends when the verifier confirms success, or when one of these stops it: a round limit (8 rounds by default), the --spend-limit cap, or a worker turn that aborts. If the loop stops for any of these reasons, it reports the goal as not met.

The verifier is a different model family than the worker, to avoid a model favoring its own kind of mistake. If only one provider family is set up, the worker checks its own work instead.

For the full explanation of judged rounds, the cross-family verifier, and the definition-of-done check, see Goal mode.

Flags

stella goal takes the global flags, plus four of its own.

--pipeline <VARIANT>

Use an installed wrapper plugin, named by the [wrapper] id its manifest declares, for the worker turn of every judged round. Only a steering or observer style wrapper is accepted here. A wrapper that decides completion on its own is refused before the run starts, since stella goal's round loop already decides that. Without this flag, the plain step loop runs with nothing over it.

--model <provider/model_id>

Pin the worker model. The verifier is routed to a different family automatically when one is available.

--test-command <CMD>

The command a bound wrapper plugin uses to check its result. It's one command for the whole run rather than one per round, since it names the exact evidence the run is judged against. That evidence is locked in before the first round starts, so something rewritten mid-run can't be used as proof. Refused without --pipeline, since the plain loop has no check to arm.

--spend-limit <usd>

Cap total spend across all rounds. Work stops cleanly once the cap is reached.

--require-verdict

Exit with a non-zero code unless the --pipeline wrapper confirmed its requirements were met. The last round's result decides, since that's the round whose work ships and every earlier round's result was replaced by a later one. A goal the verifier left unmet already fails on its own, before this check even runs. Refused without --pipeline, since nothing declares a result in that case.

stella goal is an interactive mode. It always shows readable text and does not accept --output-format — passing it causes an error rather than being silently ignored. Use stella run for json or stream-json output with no interaction.

Set up at least two provider families if you want a truly independent verifier. With only one family set up, the worker model checks its own work.

Examples

Work toward a goal until the verifier confirms it is met:

stella goal "Migrate the config loader to use serde and add tests"

Pin the worker model and cap spend across all rounds:

stella --model anthropic/claude-fable-5 --spend-limit 10.00 \
  goal "Make the CLI exit with a non-zero code on invalid input"

Run every round's worker turn under an installed steering or observer wrapper plugin:

stella goal --pipeline stella-research "Silence the deprecation warnings in the build"

You can also run a goal-driven turn from the plain line REPL (stella chat --plain) with the /goal <goal> command.