ratchet propose
Create a single change headlessly from a free-text objective. propose runs
exactly one agent for a forced propose transition through the change-scoped
engine core (runChangeStep), with no batch manifest in sight. Run state is kept
change-locally under .ratchet/changes/<change>/.run/.
Synopsis
ratchet propose "<objective>" [options]
<objective> is required: the free-text description the change is created
toward.
Options
| Option | Argument | Description |
|---|---|---|
--name | <change> | Explicit change name; overrides the slug derived from the objective. |
-m, --message | <guidance> | Extra guidance for the agent. Repeatable; each value is accumulated and the values are joined into one "Additional guidance:" block. |
--agent | <agent> | Override the coding agent for this step. |
--locus | <locus> | Where the agent runs: local, docker, or remote. |
--image | <image> | Container image for --locus docker. |
--json | Output the structured step result as JSON. |
Behavior
- Change-name derivation. The change name is the explicit
--namewhen given, otherwise a kebab-case slug derived from the objective. An objective that yields no sluggable characters and no--namefails with an actionable error and no agent is spawned. - Refuse-if-exists. If
.ratchet/changes/<change>/already exists, the command fails before resolving settings or spawning —proposecreates a new change, it does not resume an existing one. Useapply/verifyto advance an existing change, or pass--name <other>. - Standalone settings. Settings resolve
flag → project config → defaultviaresolveChangeStepSettings(no manifest). An invalid--agent,--locus, or--imagevalue fails with an actionable error before any agent is spawned. A malformedagent[:model]spec (empty agent or model part, e.g.claude:,:fable; whitespace-padded likeclaude: opus,claude :m," claude"; or a model part starting with-likeclaude:-flag) is rejected with an actionable error naming the offending value before any spawn — the same shared schema (AgentSettingSchema→parseAgentSpec) that the load and write paths use, so the flag path can never diverge from what the loader accepts. - Forced propose. A
ChangeStepContextis built withbatchundefined,transition: 'propose', the joined-mguidance, and the change-local journal, then run once viaengine.runChangeStep.computeNextTransitionis never consulted — the verb name is the transition. - Result. The structured
StepResultis rendered as text, or as JSON with--json. The engine has already written the outcome journal entry under.ratchet/changes/<change>/.run/, so ablockedorawaiting-approvalstep stays resumable.
Run state
Run state for the change is written under .ratchet/changes/<change>/.run/
(journal.jsonl, state.json) — never under .ratchet/batches/. See
Run-state locus.
Help group
propose is listed under the Workflow: heading in ratchet --help, before
apply, verify, batch, and eval. See Workflow help group.