Skip to main content

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:
The legacy 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.