The three commands
run-check
Stage one only: the comparison of each reconciliation’s mode, with no drill-down.
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.
run-check runs the comparison of each reconciliation’s mode: the row counts in row_count mode, the row counts and checksums in row_checksum mode, and the grouped measures in aggregate mode. In aggregate mode, the comparison itself goes down the group_columns hierarchy, so run-check also does. run --auto-drill does not drill into a reconciliation with bisection.enabled: false. run-drill drills into it.
Select reconciliations by name with
--include and --exclude. You can use both more than once. Do not give a name as a positional argument. run-drill suite.yaml orders is rejected with accepts 1 arg(s), received 2.Selecting and parameterising a run
Both defaults come from the suite’s
execution block, so a suite that needs more time or more parallel reconciliations keeps these settings. A flag that you give applies before the suite. Each reconciliation that runs in parallel sends queries to both of its databases, so a higher --concurrency puts more load on them. parallelism: on a connection sets the maximum number of queries that run on that connection at the same time (default 8).
The CLI reference, generated from the binary, has every flag of every command. This page covers the flags that need a decision.
Reading the output
Logs go to stderr, results to stdout
Logs go to stderr, results to stdout
Redirect with
2>/dev/null. Never use 2>&1: it puts log lines into the document that you parse.run / run-check / run-drill render only two shapes
run / run-check / run-drill render only two shapes
-o json, and a text report for every other value. The output flags --jq, --columns, --no-headers and --wide do not apply to them. Send their -o json output through jq yourself.The workspace commands (suite, deployment, runs, audit-logs, connections, auth) do honour all six formats and all four flags.run --auto-drill is not a single JSON document
run --auto-drill is not a single JSON document
It writes the quick check document, a plain-text banner, and then one drill-down document for each reconciliation that it drills into. To parse the results, run the two stages separately. Each stage writes one valid document. In a suite with
aggregate reconciliations and other modes, the aggregate results are a separate array after the quick check document, so select one mode at a time with --include:Exit codes
“The command failed” means it stopped before it had a result: a bad flag, a config that does not load, a refused credential, an API error, or an expired
--wait-timeout. Every other command exits 0 or 3.
A local run with a difference in one reconciliation and a failure in another exits
2. So 1 always means that every reconciliation ran and some data differs. To see which reconciliation failed, read -o json or the audit log. 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.
recheck and drill-deeper replay, and its shape is published as the audit-log schema.
Some paths worth knowing:
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.
When the database reports them, a run prints its own statistics, with an approximate BigQuery cost:
Gate a large run before it happens
EXPLAIN and not with a scan. It warns when an estimate is more than the threshold. Both default to 0 (off), so an automated run incurs no extra queries unless you ask for the gate.
A platform that gives no estimate produces no warning, so a run with no warning can still be large. The gate only warns. Use it to catch an accidental full-table drill.
Standalone and air-gapped runs
By default, a local run reports its audit log to Coalesce Quality when it finds a credential, so local results show in the workspace with backend runs. This happens even when every database in the suite is local. Before the run, the CLI logs anINFO line with the endpoint that it reports to. The uploaded audit log never contains row values, also at detailed. After the upload, the CLI writes the messages that Coalesce Quality returns to stderr, for example a link to the run in the app.
--no-report, or RECON_NO_REPORT in the environment, the run reads no credential and opens no connection to Coalesce Quality. The terminal and the audit-log file are the only outputs.
Use this mode in a regulated environment where a comparison must not cross a boundary. With the default privacy level, only counts and checksums leave the database, and with
--no-report they also stay on the machine. The audit log is a complete record that validates against the schema, and you can give it to a reviewer.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 only:- Pre-flight table analysis.
check-config --dbreports size, keys, indexes and a suggested key column. See validate before you spend a query. .envloading. The CLI loads the nearest.envfile: it looks in the working directory, then in each parent directory, then in your home directory. Thus the${VAR}references in a suite or a connections file resolve without anexport. A variable that is already set in the environment applies before the file.
Next
Investigating results
Reading a segment tree, and following a finding to the rows.
Workspace suites
Save the suite, start a backend run, 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.