Skip to main content
The local loop is where a suite gets written. It runs against credentials on your machine, against databases your machine can reach, and it is the fastest way to iterate.

The three commands

run-check

Stage one only: counts and checksums. One query per side.

run-drill

Stage two only: locate the differences. Assumes you already know there are some.

run --auto-drill

Stage one, then stage two on whatever mismatched. The everyday command.
Reconciliation names are selected with --include and --exclude, both repeatable — not positionally. run-drill suite.yaml orders is rejected with accepts 1 arg(s), received 2.

Selecting and parameterising a run

--concurrency fans reconciliations onto their connections; each connection additionally caps its own parallel queries with parallelism: (default 8), so raising concurrency does not stampede a single warehouse. Every flag on every command is in the CLI reference, which is generated from the binary — this page covers the ones with a decision attached.

Reading the output

Set -o explicitly whenever something is going to parse the output. The default is table for a human terminal, but it switches to toon when the CLI detects an AI-agent environment. An agent that assumed table — or json — gets neither.
Three more things to know before you pipe anything:
Redirect with 2>/dev/null. Never 2>&1 — that merges log lines into the document you are trying to parse.
-o json, and a text report for every other value. The output-shaping flags — --jq, --columns, --no-headers, --wide — do not apply to them; pipe their -o json through jq yourself.The workspace commands (suite, deployment, runs, audit-logs, connections, auth) do honour all six formats and all four flags.
It emits the quick-check document, a plain-text banner, then one drill document per drilled reconciliation. To parse results, run the two stages separately — each is one valid document:
Useful one-liners:

Exit codes

Locally, 1 does not distinguish “found a difference” from “could not run”. If you need that distinction — in CI, say — either read -o json or use a backend run with --wait, whose codes are data-driven. See CI/CD and automation.

Audit logs

--audit-log writes the full record of a run: every query as executed, every count, checksum, timing, resolved variable, cutoff watermark and mismatch leaf.
An audit log is what recheck and drill-deeper replay, and its shape is published as the audit-log schema. Some paths worth knowing:
Two traps in that file, both of which return null rather than an error if you get them wrong:
  • Casing differs by source. A local --audit-log file is snake_case (bisection_result, mismatch_leaves). The same log fetched from the workspace with audit-logs get <invocation-id> -o json is camelCase (bisectionResult, mismatchLeaves).
  • Counts and checksums are strings. They are 64-bit integers, which the audit log encodes as quoted strings ("source_count": "10") — unlike run-check -o json, where they are numbers. Compare with tonumber.

What a run costs

Reconciliation runs real queries against real warehouses. On a consumption-priced platform those queries cost money, so it is worth knowing which commands spend before you put one in a loop. Where the engine reports them, a run prints its own statistics — including a rough BigQuery cost estimate:
BigQuery and Snowflake report bytes; ClickHouse and PostgreSQL report planner rows; DuckDB, Athena and Databricks report nothing, so the block is simply absent. The cost figure is derived from a public list price that varies by region and edition — treat it as an order of magnitude, not an invoice.

Gate a large run before it happens

These make the run estimate each reconciliation’s scan before executing it — a dry run or EXPLAIN, not a scan — and warn when an estimate exceeds the threshold. Both default to 0 (off), so an automated run incurs no extra queries unless you ask for the gate. Platforms that advertise no estimate support simply produce no warnings, so a gate is never a false sense of security. It is a guard against the accidental full-table drill, not a hard limit.

Standalone and air-gapped runs

By default, a locally executed run reports its audit log to Coalesce Quality whenever it can resolve a credential, so local results appear in the workspace next to backend runs. It says so at INFO, naming the endpoint. This happens even when every database in the suite is local.
--no-report — or RECON_NO_REPORT in the environment — resolves no credential and opens no connection to us at all. The terminal and the audit-log file are the only outputs.
This is a fully supported way to operate, not a debugging flag. Combined with the default privacy level, it means: only counts and checksums leave the database, and even those never leave the machine. For a regulated environment where a comparison must not cross a boundary, this is the mode to use — and the audit log is a self-contained, schema-validated record you can hand to a reviewer.
Reporting also needs the SCOPE_RECON_EDIT permission. A credential without it produces one warning naming the remedy; the comparison has already happened and its result is unaffected.

Local-only conveniences

Two features exist in the CLI and deliberately nowhere else:
  • Pre-flight table analysis. check-config --db reports size, keys, indexes and a suggested key column. See validate before you spend a query.
  • Environment overrides. --environment <name> / --env-file <path> apply a named set of overrides at load time — most usefully pointing a suite at a dev copy of a schema while you author against it.
Environments are local only. They are applied by the CLI as it loads a suite; the workspace does not apply them. A suite uploaded with upload-config and run with run-remote, or promoted, sees no overrides. Use them for local authoring, not to model dev and prod in the platform — that is what Development and Production are for.

Next

Investigating results

Reading a segment tree, and following a finding to the rows.

Workspace suites

Save the suite, run it on our backend, put it on a schedule.

CLI reference

Every command and flag, generated from the binary.

Agent workflow

The same loop, written as an operating procedure for an agent.