Formats
--audit is supported for json, json-stream, and ndjson, not csv or table. --deterministic only affects buffered json output. For rights multi-counterpart runs, json, json-stream, and ndjson include a per-counterpart breakdown; csv and table include only the aggregate result.
The NDJSON envelope
Every NDJSON line carries the same envelope shape:
Event names are stable and are not renamed:
run_info, index_selection, match, amount_diff, timing_diff, unmatched_left, unmatched_right, duplicate, grouped_match, grouped_amount_diff, grouped_timing_diff, many_to_many_match, many_to_many_amount_diff, many_to_many_timing_diff, ambiguous_group, source_summary, summary.
The result document
json and json-stream output share this top-level shape:
184230000 is 1,842,300.00: every monetary field is minor units.
The summary object
result_mode and run_id are omitted from this object entirely unless they apply: result_mode only appears when a run sets it explicitly (per pair, or with --result-mode), and run_id only when telemetry is active.
Similarly, grouped_matched, grouped_amount_diff, grouped_timing_diff, many_to_many_matched, many_to_many_amount_diff, many_to_many_timing_diff, ambiguous_group_count, ambiguous_amount_left, and ambiguous_amount_right only appear when the pair configures the matching passes that produce them.
All monetary fields are minor units, and are always computed from the full reconciliation, even when
result_mode suppresses item events.
run_info
Present when --audit is set, or when reconcile --auto is used:
Per-counterpart summaries
json and json-stream include a per-counterpart by_source object alongside the aggregate summary for rights runs:
ndjson emits the same breakdown as one source_summary line per counterpart, followed by the aggregate summary line:
csv and table omit the per-counterpart breakdown and include only the aggregate result.
result_mode
Set
result_mode per pair in reconify.yaml, or override at runtime with --result-mode; the flag wins. Filtering happens at the writer boundary: classification counts, monetary totals, and currency are always computed from the full reconciliation. Suppressing events never changes the numbers.
Schema identifiers
reconify schema <name> prints the published Draft 2020-12 document for each identifier (for example, reconify schema result). Versioning rule: new fields under a vN identifier are additive and safe for a consumer to ignore; a breaking change creates a new v2 identifier rather than reusing v1 for an incompatible shape.
Diagnostics
When--error-format json or --agent is set, a failed command emits this envelope to stderr:
error and code fields remain present and unchanged in meaning, for callers that only understand the original contract. diagnostic.code can be more granular. suggestions exists specifically so an agent has a next action instead of a dead end.
Exit codes
3 and 4 are not failures: the run completed and found unmatched rows or exceptions. They only fire when you’ve opted in with --fail-if-unmatched or --fail-if-exceptions.