# ADR 0123: Terminal output is accepted before commit and tool rounds keep causal order

> Source: https://github.com/max-listov/stitchkit/blob/master/docs/decisions/0123-agent-terminal-output-and-tool-rounds.md

---

# ADR 0123 — Terminal output is accepted before commit and tool rounds keep causal order

## Context

A provider `stop` with no content was committed as success even when the
application protocol required an answer. The only downstream remedy was to
rewrite an already terminal durable record. Separately, one persisted assistant
can contain several tool steps, but projection grouped every call before every
result. A dependent call therefore appeared parallel with the call whose result
created its input, and final text appeared before its evidence.

## Decision

- A protocol may declare `terminalAcceptance`. The built-in `require-output`
  rule accepts non-blank text, generated files, structured provider parts and
  an explicit tool-only policy stop; a callback may define another rule.
- Acceptance runs only for would-be completed outcomes and before terminal CAS.
  Interrupted, cancelled and failed records retain their actual reason.
- Canonical parts are projected in their persisted order. Adjacent assistant
  parts form one assistant message and adjacent results form one tool message;
  changing role flushes the current round.
- Tool chronology is valid only when every unique call is followed by exactly
  one result. Parallel calls before their results remain one legitimate round.

## Consequences

- Protocols that permit empty completion keep the default `allow-empty` path.
- A rejected candidate is a failed assistant and is never exposed as successful
  durable output.
- A runtime can feed its own multi-step terminal record into the next provider
  call without consumer-side history rewriting.
