--- convoy: scanner-desktop-layout brief_number: 6 depends_on: [1, 2, 3, 4, 5] recommended_model: composer-2.5-fast model_tier: fast files: - pages/scanner.js - components/scanner/ScannerCamera.js - lib/use-scanner-identification.js - lib/use-scanner-queue.js - test/pages/scanner.test.js - test/components/ScannerCamera.test.js cross_brief_commitments: - brief: 1 description: | Wires `camera.videoDevices`, `selectedDeviceId`, `setSelectedDeviceId`, and `devicePickerStatus` into the desk Camera `` on desk bar; `runSequentialGalleryIdentify` with `cancelRef`; on `onFileError` enqueue synthetic failed row via `queue.handleCardScanned` with `identifyFailed: true` OR dedicated `enqueueFailedIdentify(file, error)` inline in page. - **Rescan:** clear identify fields on focused card (`updateCardMetadata`), set `processed: false`; if `scanImageUrl` present fetch blob and `identifyFromGalleryFile`; else toast *Rescan from camera*. - **ScannerCamera workstation:** add `variant="default" | "workstation"` (or `layoutMode`). At `md+` with `variant="workstation"`: - Container: framed panel not `min-h-[100dvh]` full-bleed — use `md:rounded-xl`, `md:aspect-video`, `md:min-h-0`, outer `GlassSurface` + ember rim. - Hide overlay top bar + bottom bar (`max-md:` keep current). - Hide `ScannerScanPeek`, mobile LIVE badge, `ScannerCountPill` at `md+`. - Show **Auto-detect badge** top-left in frame (ON/OFF from `!verificationPausedRef` composite for auto-detect slice only — pass `autoDetectOn` prop). - Badge dot pulse when ON; `prefers-reduced-motion: reduce` → static dot. - Accept optional `deskControls` slot rendered **below** frame by page OR `deskControlBar` prop — page renders Upload/Batch/Auto-detect/Camera select below. - **Desk control bar (page, md+):** Camera `