diff --git a/frontend/src/api/mutations/scans.ts b/frontend/src/api/mutations/scans.ts index faf413ce..101605e6 100644 --- a/frontend/src/api/mutations/scans.ts +++ b/frontend/src/api/mutations/scans.ts @@ -9,6 +9,12 @@ export interface StartScanBody { scan_root?: string; mode?: ScanMode; engine_profile?: EngineProfile; + /** + * Run dynamic verification on findings after the static pass. Default false. + * Backend currently accepts the field as a no-op; verification engine lands + * in milestone M1 (see .pitboss/dynamic/context.md). + */ + verify?: boolean; } export function useStartScan() { diff --git a/frontend/src/modals/NewScanModal.tsx b/frontend/src/modals/NewScanModal.tsx index e4d822ad..d629b73c 100644 --- a/frontend/src/modals/NewScanModal.tsx +++ b/frontend/src/modals/NewScanModal.tsx @@ -38,6 +38,7 @@ export function NewScanModal({ open, onClose }: NewScanModalProps) { const [scanRoot, setScanRoot] = useState(''); const [mode, setMode] = useState('full'); const [engineProfile, setEngineProfile] = useState('balanced'); + const [verify, setVerify] = useState(false); const handleStart = async () => { const root = scanRoot.trim(); @@ -45,6 +46,7 @@ export function NewScanModal({ open, onClose }: NewScanModalProps) { if (root && root !== defaultRoot) body.scan_root = root; if (mode !== 'full') body.mode = mode; body.engine_profile = engineProfile; + if (verify) body.verify = true; const payload = Object.keys(body).length ? body : undefined; try { await startScan.mutateAsync(payload); @@ -105,6 +107,25 @@ export function NewScanModal({ open, onClose }: NewScanModalProps) { {PROFILE_HINTS[engineProfile]} +
+ +
+ setVerify(e.target.checked)} + /> + +
+ + Opt-in for now; will become the default once calibrated. Adds + wall-clock time per finding. + +