flowchart TD
A[new fast source] -->|ship behind flag| B{parity check}
B -->|counts match| C[default: fast]
B -->|any gap| D[default: verified]
A parity check caught it before collectors did
Monday night we switched Binderdex imports to a quicker way of reading a collector’s public showcase. Same cards, less waiting, and the tests all passed. By Tuesday morning a parity check told a different story.
The routine compares what the new source counts against what the trusted one counts. On a real, live showcase they disagreed: the quick source came back short. Not on a synthetic fixture, on someone’s actual collection. We still don’t know exactly why it drops items, and until we do, the argument for speed doesn’t matter. When two sources disagree and you can’t explain the gap, the new one loses by default.
So we flipped the default back within hours. You should see complete showcases on import again; nothing changed on your side except the speed we’d borrowed got returned. The quick path stays in the codebase as an explicit opt-in while we hunt the undercount.
The takeaway: trust is a flag you flip last
The pattern we’ll reuse (and the one I’d hand any team adding a second data source): keep the verified-but-slow path as the default, ship the fast path behind a flag, and promote it only after a parity check passes on real data, repeatedly. The check is cheap. The bug it catches is the kind users find for you, which is the worst way to find out.