Solution — match (binary)
uv run mercury match <customers.json> <banks.json>The solution the interview prompt asks for: for each link, emit either Match or Mismatch.
Decision rule
verdict = Match if total >= MATCH_THRESHOLD
Mismatch otherwise
MATCH_THRESHOLD = 2.5 (inclusive). See scoring-combiner for how total is constructed.
Output format
Total matches: X
Total mismatches: Y
Link 1: Match
Link 2: Mismatch
...
Ground-truth verdicts on the 9-link fixture
| Link | Fraud-team comment (paraphrased) | Verdict |
|---|---|---|
| 1 | Name + company + phone match | Match |
| 2 | Phone matches, no other connection; calling customer | Mismatch |
| 3 | Name + phone match | Match |
| 4 | No connection, possible fraud? | Mismatch |
| 5 | Business name + user-as-business + email match | Match |
| 6 | Cy ↔ Cyril, last names match (nickname) | Match |
| 7 | Direct name match + phone | Match |
| 8 | Phone + first-name Cyril | Match |
| 9 | Doesn’t seem to match at all | Mismatch |
Totals: 6 Match, 3 Mismatch. Verified by tests/test_solution_match.py::test_match_full_output.
Caveat — inferred verdicts
Three of the nine verdicts (links 2, 6, 8) are inferred from hedged fraud-team language (“probably good”, “going to call”). The binary output forces those into Match or Mismatch, but the fraud team was arguably not deciding. solution-triage exposes that ambiguity directly.