> ## Documentation Index
> Fetch the complete documentation index at: https://docs.soterislabs.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Exception paths

> Rejections, loop-backs, interruptions, and stopped engagements, each labeled live or contract preview.

A real engagement can be blocked, sent back, interrupted, or stopped. This page names those paths so a partner system can model each one as a state, without encoding the trigger criteria.

State meanings are defined in [Public states](/workflow/public-states); the forward path each exception branches from is in [Lifecycle overview](/workflow/lifecycle-overview).

Every row carries a status:

* **Live.** The path is a code-backed part of the current system.
* **Contract preview.** The state names are part of the published contract vocabulary, but the transition is not yet wired as a live path. Model it; do not depend on observing it yet.
* **Live as an outcome record.** The value is code-backed, recorded as an outcome record adjacent to the lifecycle rather than as a lifecycle state.

## Loop-backs

A loop-back returns an engagement to an earlier point without ending it. It is the normal exception case, not a failure.

| From                      | To                        | Trigger                                  | Authority                | Status             |
| ------------------------- | ------------------------- | ---------------------------------------- | ------------------------ | ------------------ |
| `document_gate_open`      | `document_gate_blocked`   | Inputs evaluated as insufficient         | Soteris backend          | `Contract preview` |
| `document_gate_blocked`   | `document_gate_open`      | Additional inputs requested and received | Client / partner input   | `Contract preview` |
| `agent_running`           | `clarification_requested` | Clarification needed to continue         | Agent runtime / operator | `Contract preview` |
| `clarification_requested` | `soteris_review`          | Clarification resolved                   | Soteris backend          | `Contract preview` |
| `soteris_review`          | `clarification_requested` | Follow-up needed from client or partner  | Reviewer                 | `Contract preview` |
| `cpa_gate`                | `soteris_review`          | Rework requested                         | Reviewer                 | `Contract preview` |
| `deliverable_review`      | `soteris_review`          | Revision requested                       | Reviewer                 | `Contract preview` |

<Card title="Loop-backs">
  <img className="block dark:hidden" src="https://mintcdn.com/soterislabs-32/r2dzmWujqARqVkNU/images/diagrams/loop-backs-light.png?fit=max&auto=format&n=r2dzmWujqARqVkNU&q=85&s=27c1fc23cf17ff5084339019b202a793" alt="Loop-back transitions against the forward path" width="3600" height="2025" data-path="images/diagrams/loop-backs-light.png" />

  <img className="hidden dark:block" src="https://mintcdn.com/soterislabs-32/r2dzmWujqARqVkNU/images/diagrams/loop-backs-dark.png?fit=max&auto=format&n=r2dzmWujqARqVkNU&q=85&s=21508e6f3ea7418c66acad8eadab38ac" alt="Loop-back transitions against the forward path" width="3600" height="2025" data-path="images/diagrams/loop-backs-dark.png" />

  The seven loop-back edges, drawn against the forward path they return to. Every loop-back in this figure is contract preview.
</Card>

## Review gate outcomes

The review gate concludes in one of a small set of outcomes. The gate stays opaque: the outcome is visible, the evaluation is not.

| Outcome    | Meaning                                                                 | Status                      |
| ---------- | ----------------------------------------------------------------------- | --------------------------- |
| `approved` | The engagement proceeds to deliverable review.                          | `Live`                      |
| `rejected` | The gate did not approve. The engagement does not proceed on this path. | `Live as an outcome record` |
| `waived`   | The gate was waived by review authority.                                | `Live as an outcome record` |

<Info>
  `rejected` and `waived` are recorded as gate outcome records adjacent to the lifecycle, not as lifecycle states. The lifecycle state remains opaque while an outcome is being decided.
</Info>

## Stopped before the engagement exists

A proposal can end without ever becoming an engagement. These outcomes occur before `proposal_accepted_paid`, so no engagement record is created.

| Phase           | Possible outcomes               | Status             |
| --------------- | ------------------------------- | ------------------ |
| Proposal        | `declined`, `expired`, `paused` | `Contract preview` |
| Signature       | `declined`, `expired`, `voided` | `Contract preview` |
| Initial payment | `failed`, `refunded`, `voided`  | `Contract preview` |

## Interrupted preparation

An automated preparation run can end without producing artifacts: `failed`, `paused`, or `cancelled`. These are runtime statuses, not lifecycle transitions. The engagement stays in its current lifecycle state, and preparation can be re-run under the same authority rules.

## Termination and withdrawal

There is no `terminated` or `withdrawn` lifecycle state today. Do not model mid-engagement termination as an observable state. If an engagement stops, it stops through one of the outcomes above or by remaining in a non-terminal state. A formal termination path is a roadmap item. When it ships, it will be added to the [Lifecycle enum](/reference/lifecycle-enum) first.

## Terminal states

`archived` is the only terminal lifecycle state. The outcome statuses that stop progress without a lifecycle transition are `declined`, `expired`, `voided`, `refunded`, `failed`, and `cancelled`. The complete outcome-status vocabulary is the outcome table in the [Lifecycle enum](/reference/lifecycle-enum).

<Info>
  This page names states, directions, triggers, and authorities. It does not describe the deciding criteria: what makes inputs insufficient, what a gate evaluates, or when review authority requests rework. See the [Disclosure boundary](/start/disclosure-boundary).
</Info>
