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
...
LinkFraud-team comment (paraphrased)Verdict
1Name + company + phone matchMatch
2Phone matches, no other connection; calling customerMismatch
3Name + phone matchMatch
4No connection, possible fraud?Mismatch
5Business name + user-as-business + email matchMatch
6Cy ↔ Cyril, last names match (nickname)Match
7Direct name match + phoneMatch
8Phone + first-name CyrilMatch
9Doesn’t seem to match at allMismatch

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.