CI / Check (push) Skipped
CI / Check (pull_request) Successful in 5m54s
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
semgrep emits metadata.cwe as a LIST (e.g. "CWE-798: Use of Hard-coded Credentials"), but the extractor called v.as_str() on it -> always None, so SAST findings never carried a CWE at all (silently breaking control mapping AND the CWE-based dedup). Handle list + bare-string forms and normalise to the CWE-NNN id. Found by the live control-triage end-to-end test. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>