replay --ci reads each recorded response from <data_dir>/recordings/<upstream>.ndjson and diffs it against its frozen baseline family, entirely offline. No network, no provider account, no running agent.
What it compares
Each JSON recording is matched to its(method, template, status class) family and diffed the same way live traffic is: fields added or removed, types changed, values outside the known set, a field arriving null, a status code moving within its class. Findings are deduplicated per method, template, kind, field and detail.
What it skips
- Recordings whose family is not frozen yet. They are counted as pre-warmup skipped.
- Non-JSON recordings.
- New values on fields listed in
volatile_fields. Presence, type and nullability of those fields are still checked.
Exit codes
In CI
The gate needs thedata_dir the agent wrote, or a copy of it. Ship the baselines/ and recordings/ directories as an artifact, or mount the volume read-only:
{"source":"replay-ci","records":n,"findings":[…]}. See CI integration.