- 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)