- web/src/pages/ScanPage.tsx: camera QR scanner with volt reticle overlay
- extractHWID() parses both URL format and bare HW-XXXXX patterns
- rear camera preference (back/rear/environment label matching)
- debounce via lastScanned state prevents duplicate navigation
- graceful camera permission denied error state
- web/src/router.tsx: lazy-loads ScanPage with Suspense fallback spinner
- web/src/lib/api.ts: typed fetch wrappers (fetchInventory, fetchInventoryItem)
- web/src/components/layout/AppShell.tsx: minimal page wrapper (stub for plan 03-03)
- useIntakeStore: step tracking, photos (max 3), aiResult, editedName, error
- submitIntake(): multipart FormData POST /api/intake with IntakeResponse type
- DropZone: react-dropzone with camera capture, volt hover state, slot counter
- PhotoPreview: thumbnail grid with X remove button per photo