> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
> Use this file to discover all available pages before exploring further.

# Executing a reconciliation

> Trigger the Matcher engine from the Reconciliations screen — pick Dry run to preview or Commit to persist, then review matches, unmatched counts, and exceptions.

Use the **Run match** panel on the **Reconciliations** screen to trigger the matching engine manually for the selected context. The Console submits this action synchronously: the run completes inside the request rather than being queued. Use a dry run to evaluate rules and inspect its summary statistics without writing matching artifacts; use a commit run to persist the results.

## Accessing the Run match panel

***

Navigate to **Operate → Reconciliations** in the left sidebar. The Reconciliations screen shows the run history for the selected context, with the **Run match** panel for starting a new run. If you have not selected a context, the Console selects the first available one automatically; use the context selector to choose another. If no contexts are available, the screen shows an empty state instead of the panel.

## Run modes

***

Choose a run mode from the **Mode** dropdown before starting:

| Mode        | Description                                                                                                                                                   |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Commit**  | Persist match groups, transaction-result changes, and exceptions. This is the default mode                                                                    |
| **Dry run** | Evaluate rules and show preview statistics without persisting match groups, transaction-result changes, or exceptions. Use it to test rules before committing |

## Starting a run

***

Click **Run match**. The Console sends `mode` without `async`, so the run executes synchronously; it is not queued. Its response carries a terminal run status. Status badges can show the following states:

| Status         | Description                                                                                                                                                                         |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **QUEUED**     | Only an API caller that explicitly sends `async: true` sees this state. The run is awaiting pickup by the enabled matching worker                                                   |
| **PROCESSING** | The matching engine is actively processing the run                                                                                                                                  |
| **FINALIZING** | Match results are durable while deferred unmatched-break records are being written. An asynchronous polling client can briefly observe this non-terminal state before **COMPLETED** |
| **COMPLETED**  | The run finished successfully                                                                                                                                                       |
| **FAILED**     | The run encountered an error. The failure reason is displayed below the status badge                                                                                                |

The Console fetches the run status after every launch. Its synchronous launch reaches a terminal status on that first fetch, so it does not continue refreshing. An API run submitted with `async: true` responds **QUEUED** and needs continued polling until **COMPLETED** or **FAILED**; asynchronous submission requires the match-run worker to be enabled, otherwise the service rejects the request instead of queueing it. On the run-detail page for a non-terminal run—for example, an asynchronous run opened from run history—the Console refreshes every two seconds for up to 90 attempts (about three minutes). **Stop watching** stops only the local refresh, not the server-side run; **Recheck status** restarts the refresh.

<Note>
  The Console blocks the launch only when its pre-run check successfully returns a total of zero transactions. It then shows a warning and an **Import data** button. While that check is loading or fails, the Console does not claim that the context is empty and leaves the launch available. If a run still completes with zero candidates on both sides, the Console shows an import warning instead of the statistics or **View match groups**.
</Note>

## Reviewing results

***

For a completed, non-empty run with statistics, the panel shows a headline **Matches** figure and a breakdown of per-side statistics:

| Statistic                                                               | Description                                                                                           |
| ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| **Candidates (left)** / **Candidates (right)**                          | Transactions evaluated on each side                                                                   |
| **Auto-matched (left)** / **Auto-matched (right)**                      | Transactions matched automatically                                                                    |
| **Pending review (left)** / **Pending review (right)**                  | Transactions in matches awaiting manual review                                                        |
| **Proposed (left)** / **Proposed (right)**                              | Transactions in proposed (not yet confirmed) matches                                                  |
| **Unmatched (left)** / **Unmatched (right)** / **Unmatched (external)** | Transactions that could not be matched                                                                |
| **Exceptions raised** / **Exceptions updated**                          | Newly created exceptions / pre-existing exceptions re-touched by the run. Both are zero for a dry run |

Above the breakdown, the Console can show summary visualization for the statistics returned by the run.

## Dry-run results

***

A dry run creates and completes a persisted run record with aggregate statistics, including calculated candidate, match, and unmatched counts. Its two exception statistics are explicitly zero. It does not persist match groups or items, transaction-result changes, or exceptions, so the Console presents the run as a statistical preview rather than persisted group-by-group results. Although **View match groups** can still open the run detail, no match groups were written by a dry run. Use the statistics to adjust rules, then switch to **Commit** and run again to persist results.

## Viewing detailed results

***

After a completed **Commit** run, click **View match groups** to open the run detail and inspect the persisted groups for that run. A dry run has no persisted groups to inspect; use its summary statistics instead.
