1. Non-blocking scan capture upload (emitScannedCard)
- Card result shows immediately; upload fires in background
- Removes ~500ms blocking S3/MinIO roundtrip from the result path
2. Parallel OCR workers for name + number strips (ocr-worker)
- Two independent Tesseract workers run simultaneously
- Cuts Layer 1 OCR time ~50% on mobile (name + number in parallel)
- terminateOcrWorker cleans up both workers on teardown
3. Faster pre-verification timing (scanner-card-detection)
- VERIFICATION_INTERVAL_MS: 1000 → 500ms
- MIN_FIRST_SEEN_MS_FOR_VERIFY: 800 → 500ms
- Net ~300ms faster from first detection to verification start
All 58 scanner tests pass (2.20s).
Allow consecutive scans without refresh by resetting trackers and counting vision rate limits once per card. Add a fixed card guide, widen detection bounds, and correct object-cover overlay math.
Co-authored-by: Cursor <cursoragent@cursor.com>
Move OpenCV shape detection, coordinate conversion, overlap checks,
and tracked-card merge logic from CameraScanner into lib/scanner-card-detection.js
with unit tests for the pure helpers.
Co-authored-by: Cursor <cursoragent@cursor.com>