ADR 0018 — Output truncation detection and host recovery policies¶
Status: Accepted (detect + report/halt + surfaces; continue deferred)
Context¶
When a provider stops for length / max tokens, partial text was deposited as if
complete. Gates and parse: list saw silently cut-off content.
Decision¶
- Detect always.
Produced.truncated+finish_reason(provider-normalized). - Trace always. Step records
truncated: true(+finish_reasonwhen known). Fan-out parent steps get the same when any branch truncated. - Live events.
state-doneevents carrytruncated/finish_reason. - Recovery host policy, default
report: report— annotate and continue.halt—state-error: output-truncated.continue— deferred (stitch N pieces under cost budget; never default).- Surfaces.
engine.run(..., on_truncate=…), CLI--on-truncate, MCPon_truncate, consoleConsoleTools.on_truncate, scripttestrun: { on_truncate: halt }. parse: list. Truncated produce →state-error: parse-list-truncated(clearer than a generic JSON parse failure). Underhalt,output-truncatedwins first.
Checklist¶
| Item | Status |
|---|---|
| Detect + trace + events | done |
report / halt policies |
done |
| CLI / MCP / console / scripttest parity | done |
| Unit tests (mock produce) | done |
| Adapter unit tests with fake responses | done (Anthropic + OpenAI-compat) |
continue stitching |
deferred |
Consequences¶
- Observability improves with zero
.mkchanges. - Auto-continue stays out so token budgets and traces stay honest.