CI / Check (push) Skipped
CI / Check (pull_request) Successful in 5m44s
CI / Detect Changes (pull_request) Skipped
CI / Deploy Agent (pull_request) Skipped
CI / Deploy Dashboard (pull_request) Skipped
CI / Deploy Docs (pull_request) Skipped
CI / Deploy MCP (pull_request) Skipped
Second slice of B (hybrid coverage): the controls violated by an *absence* (no rate limiting, no security logging, no update-signature check) have no syntactic pattern for semgrep, so we retrieve the code surface each governs and let the grounded judge decide whether the control holds. - controls/surface.rs: deterministic, bounded surface retrieval (keyword + window, capped per control) for cra-ai-6,11,24,27,28,29,30. - grounded_surface_findings(): retrieve surfaces -> GroundedControlChecker -> net-new findings, each already tagged with its control and grounded to a real snippet (ground() drops anything not quoting verbatim code). - orchestrator Stage 5d, gated on breakpilot.grounded_control_checks (BREAKPILOT_GROUNDED_CHECKS, default off) — absence detection is the least deterministic path, kept off until tuned against live scans. - LUT: the 7 controls' notes now point to the gated grounded mechanism (kept needs_tooling; coverage stays honest until live-validated). Local validation (real Qwen, temp 0), correct positive+negative discrimination: cra-ai-11 unprotected login -> violates, CWE-307, grounded; protected -> false cra-ai-24 unlogged admin del -> violates, CWE-778, grounded; logged -> false Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>