ADR-071: A failing check reaches an agent as a summary made by fixed rules, the full log stays on disk
Status: Accepted (2026-10-28, spec 108)
Amends: spec 100 (AC-100.12: the failure output of cplat quiet), spec 102 (AC-102.9/AC-102.10: where the normalized message and
the snapshot excerpt come from)
Context
Section titled “Context”A fix round hands a failure to an agent. Until now that was the last 40 lines of a cplat quiet log, or the last 60 lines of each
failed CI job, and the agent instructions said to read the log. Agents read whole logs, with progress bars, passing tests, library stack
frames and repeated warnings, in every round. The parts a fix needs (which check, which test or file:line, the error, a few lines
around it) can be read out of the tools’ output by fixed rules. Spec 102 already normalizes errors to detect repeated failures, but from
the raw tail, so two runs that fail the same way but print different noise look different.
Decision
Section titled “Decision”- One summarizer,
scripts/cplat/failsum/, no model. Every place that hands a failure to an agent (cplat quiet,cplat validate run, thedevbox run cibefore a ship push, the red checks ofcplat component ship land,cplat pr waitand the product ship’s gitops PRs) renders the failure through it. It has one parser per tool output format, a fixed render with fixed limits (20 entries per check, 10 excerpt lines per entry, 80 lines in total, excerpts shortened before entries, a failing check never dropped) and is deterministic: the same log gives the same bytes. - Unknown output falls back to today. A check no parser reads is shown as
format: unknownwith its last 40 lines. Supporting a new tool is adding a parser; nothing else changes. - The log stays local and is opened on demand. Every summary names the log path (a CI check’s log is saved next to the
cplat quietlogs first). Instructions tell agents to open it only when the summary is not enough. Neither summary nor log goes to the run store. - The summary is the failure of record. Spec 102’s no-progress signature is computed from the summary’s normalized messages, and the
recovery snapshot’s excerpt is the summary.
cplat quietleaves the summary next to the log (<log>.summary.json) socplat budget attempt --error-file <log>uses the same text. - On by default, off per project or per call.
failure_summary: offin.platform-settings.yml, orcplat quiet --raw, restore the old output and say so.
Consequences
Section titled “Consequences”- Fix rounds read a few dozen lines instead of whole logs; the benchmark task of spec 108 measures it against the old output.
- Equivalent failures are detected on what failed, not on the noise around it, so the no-progress stop sees through changing output.
- Each template tool format is code to maintain: a tool upgrade that changes its output degrades that check to
format: unknown(today’s output), never to a silent omission. Parser tests carry sample logs of each format. - A tool’s output in a new shape needs a parser before its summaries are useful; until then it behaves as before.
Not included
Section titled “Not included”- Summaries of successful output (spec 100 keeps one line), summaries made by a model, or dropping a failing check to save lines.
- Deploy-phase CI on main (
ship.run_logs): not a fix round; it keeps its log tails.