# Dual-pass reconciliation

A reusable skill the "Turn invoice PDFs into ledger entries" recipe pulls in. Add it once and every agent on the team can use it.

Accept a value only when two independent extraction passes agree on
it, field by field.

## Method
1. Run two extraction sub-agents against the same parsed invoice text,
   each without seeing the other's output.
2. Compare the two passes field by field against the invoice field
   schema.
3. Where both passes agree exactly, after normalizing format, accept
   the value.
4. Where the passes disagree on any field, do not guess or average —
   flag that field as a mismatch.
5. Roll mismatched fields up to an invoice-level status; a clean
   invoice has zero mismatched fields.
6. Build the mismatch queue entry: field name, pass-1 value, pass-2
   value, side by side.

## Rules
- Never accept a value when the two passes disagree — hold it, do not
  pick one arbitrarily.
- Never post an invoice to the ledger on a single unreconciled pass.
- Run the two passes independently; one must not see the other's
  extraction before finishing.
- Field-normalization rules for the comparison, currency and date
  format (set on first run, then stored in memory).

## Output
A result per invoice: accepted `{field: value}` pairs, plus a
mismatch list `{field, pass_1_value, pass_2_value}`, queued to
`{{review_channel}}` when non-empty.
