# Objectives & acceptance

An **objective** is a persistent, multi‑run goal — a campaign AM keeps working
across scheduled runs until it's met. Where a [focus](/docs/focus) is "what to do
this run", an objective is "the goal we're driving toward".

## Set an objective

In **Repo settings → Objective**, set:

- **Objective** — the campaign goal, e.g. *"raise test coverage to 70%"*.
- **Acceptance command** (optional) — a shell command that exits `0` when the
  objective is met, e.g. `./scripts/coverage-at-least.sh 70`.

## How it completes

After each run, AM runs the acceptance command. When it passes, the objective is
marked **met** and the [scheduler](/docs/scheduling) stops working it — the
campaign is done. With no acceptance command, you mark it met manually (**Mark
met** / **Reopen**). If you use a [progress ledger](#progress-ledger-optional), the
objective also auto‑completes when every sub‑task is done.

```
objective active → run → acceptance passes (or all ledger tasks done)? → met (scheduler stops)
                          └─ no → keep working it next cycle
```

## Progress ledger (optional)

By default each run re‑attacks the whole objective from scratch. A **ledger** turns
one broad objective into an ordered checklist of small, independently verifiable
sub‑tasks that AM works through **cumulatively** — so progress builds run over run
instead of starting over.

In **Repo settings → Objective**, with an objective set, click **Decompose**. AM
makes one planning pass and breaks the objective into a handful of ordered
sub‑tasks, each with its own (optional) verify command. From then on:

- Each scheduled run picks the **next open sub‑task** as its focus (not the whole
  objective), and the gates check *that* sub‑task.
- After the run the sub‑task is marked **done** or **blocked**, and the ledger
  persists — the next run builds on the last.
- A progress bar (`done / total`) shows how far the campaign has come.
- When every sub‑task is resolved, the objective flips to **met**.

**Priority chain:** When a ledger exists with pending tasks, it overrides the repo's
focus for each run. See [Focus → Priority chain](/docs/focus#priority-chain-when-an-objective-ledger-exists)
for details.

The ledger is **opt‑in**: leave it un‑decomposed and the objective behaves exactly
as before (whole‑objective runs + acceptance command). It only applies when an
objective is set.

## Status values

| Status | Meaning |
|---|---|
| *(empty)* | No objective; runs use the repo focus |
| active | AM is driving toward it (whole‑objective, or task‑by‑task with a ledger) |
| met | Achieved (acceptance passed or all ledger tasks done) — scheduler skips this repo |

## Objective vs explore mode

- **Objective** = a *human‑set* destination AM keeps working toward.
- **[Explore mode](/docs/explore-mode)** = AM *proposes its own* bounded work when
  there's no standing objective.

A standing objective takes priority: while one is active, explore mode stands down.

## Related

- [Focus](/docs/focus) · [Scheduling](/docs/scheduling)
- [Explore mode](/docs/explore-mode)
