Skip to content

Run long-horizon goals

Beta

A goal is a standing objective the agent keeps making progress on across idle periods, instead of stopping once the current message is answered.

/goal Migrate the internal API client from v1 to v2 across all call sites
/goal edit # adjust the current goal's objective
/goal pause # stop idle continuation without losing the goal
/goal resume # pick the continuation loop back up
/goal clear # drop the current goal
/goal replace # force-replace a goal that isn't finished (a finished one: just /goal <new objective>)

When a session goes idle with an active goal, octo continues working toward it on its own — the same machinery behind /loop, applied to a single durable objective instead of a recurring prompt. The underlying tools (get_goal, create_goal, update_goal) are also available to the model directly, so a goal can be created or refined mid-conversation, not just via the slash command.

Each of those self-started turns announces itself in the transcript — Goal starts for a new objective, Goal continues for each turn after — and so does every status change: Goal complete with the final usage, Goal blocked, Goal budget reached, Goal usage limited. The prompt that drives a continuation turn stays hidden, so the line is what tells you the output came from the goal rather than from something you asked. The TUI prints these to its scrollback and the Web UI renders them inline in the conversation; the /goal reply itself lands the same way. IM channels are quieter by design — a chat gets the /goal reply and the notices that end or stall a goal, not a line per continuation turn.

Goals are opt-in per session and can be disabled entirely:

~/.octo/config.yml
goal:
enabled: false

With goals disabled, /goal reports itself as unavailable rather than silently no-op-ing.

Next: goals compose with channels — start one from your phone, let it run, and check back later. For a recurring prompt rather than a single durable objective, see /loop.