From a10aba5d1f039b43ee5a7bc51168d62ef07164e1 Mon Sep 17 00:00:00 2001 From: pitboss Date: Mon, 11 May 2026 21:19:03 -0400 Subject: [PATCH] =?UTF-8?q?[pitboss]=20phase=2001:=20M1=20=E2=80=94=20Spec?= =?UTF-8?q?=20extraction=20+=20`--verify`=20plumbing=20(no=20sandbox)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/mutations/scans.ts | 6 + frontend/src/modals/NewScanModal.tsx | 21 ++ src/ast.rs | 5 + src/auth_analysis/mod.rs | 1 + src/cli.rs | 9 + src/commands/mod.rs | 11 + src/commands/scan.rs | 77 +++++++ src/database.rs | 1 + src/dynamic/corpus.rs | 76 +++++++ src/dynamic/report.rs | 46 +--- src/dynamic/spec.rs | 322 ++++++++++++++++++++++++++- src/dynamic/verify.rs | 56 +++-- src/evidence.rs | 91 ++++++++ src/fmt.rs | 14 ++ src/output.rs | 1 + src/patterns/ejs.rs | 1 + src/rank.rs | 1 + src/server/health.rs | 1 + src/server/models.rs | 1 + src/server/routes/scans.rs | 17 ++ src/utils/config.rs | 11 + tests/calibration_data_exfil.rs | 1 + tests/dynamic_layering.rs | 102 +++++++++ tests/engine_notes_rank_tests.rs | 1 + tests/health_score_calibration.rs | 1 + 25 files changed, 808 insertions(+), 66 deletions(-) create mode 100644 tests/dynamic_layering.rs 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. + +