Dataset: large-corpus. Generated by reconcile eval. This file is committed and regenerated on release. Numbers come from running the matcher on seeded synthetic fixtures with planted ground truth; there is no real personal data in the fixtures.
The counts below describe the code at this file's last regeneration and predate later matcher changes; large-corpus-stage-baseline-2026-08-03.md records what the current code produces over the same seed, and the next release-time make eval-large realigns this file.
A false merge joins two different people and can corrupt a record irreversibly. A missed match leaves a duplicate, which is recoverable. The two errors are not equal, so the gated metric is the false-merge rate among auto-merged pairs, and it is reported with a Wilson confidence interval because the denominator is small.
| Metric | Value | 95% CI |
|---|---|---|
| Records | 50066 | |
| True duplicate pairs (ground truth) | 12438 | |
| Candidate pairs after blocking | 2204992 | |
| Auto-merged pairs | 11728 | |
| Pairs sent to review | 838 | |
| False-merge rate (gated) | 0.6% (74/11728) | [0.5%, 0.8%] |
| Missed-match rate | 0.0% (0/12438) | [0.0%, 0.0%] |
| Precision, auto | 99.4% | |
| Recall, auto | 93.7% | |
| Precision, auto+review coverage | 99.0% | |
| Recall, auto+review coverage | 100.0% | |
| Blocking misses (true pairs never scored) | 0 |
False-merge gate at threshold 1.0%: PASS (observed 0.6%).
Recall at the auto level is intentionally below 100%: pairs the matcher is unsure about are not auto-merged, they are sent to review. The auto+review coverage recall is the share of true duplicates the system surfaces to a human one way or another.
Wall clock: 42.1s for 50066 records (71,344 records/minute). Peak resident memory: 1,813.2 MiB. Includes corpus generation when regenerated in this process; run with a pre-generated --out-dir to time the pipeline alone.
| Class | True pairs | Auto | Auto+review | Coverage recall (95% CI) |
|---|---|---|---|---|
| anglo | 1717 | 1608 | 1717 | 100.0% [99.8%, 100.0%] |
| arabic | 1793 | 1739 | 1793 | 100.0% [99.8%, 100.0%] |
| east_asian | 1827 | 1655 | 1827 | 100.0% [99.8%, 100.0%] |
| hispanic | 1777 | 1660 | 1777 | 100.0% [99.8%, 100.0%] |
| slavic | 1749 | 1629 | 1749 | 100.0% [99.8%, 100.0%] |
| south_asian | 1780 | 1740 | 1780 | 100.0% [99.8%, 100.0%] |
| vietnamese | 1795 | 1623 | 1795 | 100.0% [99.8%, 100.0%] |
| Class | True pairs | Auto | Auto+review | Coverage recall (95% CI) |
|---|---|---|---|---|
| address_variant | 1426 | 1426 | 1426 | 100.0% [99.7%, 100.0%] |
| compound_surname | 561 | 520 | 561 | 100.0% [99.3%, 100.0%] |
| date_drift | 1781 | 1781 | 1781 | 100.0% [99.8%, 100.0%] |
| dob_typo | 1198 | 1198 | 1198 | 100.0% [99.7%, 100.0%] |
| exact | 1731 | 1731 | 1731 | 100.0% [99.8%, 100.0%] |
| nickname | 1537 | 1097 | 1537 | 100.0% [99.8%, 100.0%] |
| transliteration | 966 | 882 | 966 | 100.0% [99.6%, 100.0%] |
| typo_first | 1821 | 1702 | 1821 | 100.0% [99.8%, 100.0%] |
| typo_last | 1417 | 1317 | 1417 | 100.0% [99.7%, 100.0%] |
Name-origin classes and error channels are generator labels, not measured demographic data; see tools/corpusgen/__init__.py for what this breakdown does and does not claim.