Cross-Scanner Compliance Evidence and Waiver Normalisation in GitHub Actions

2026-03-22 · governance-policy security-risk tools-infrastructure regulatory-compliance · medium · source → · wiki →
key claims
  1. Confidence: high. An organization should treat SARIF as the shared interchange backbone for multi-scanner compliance evidence because OASIS designed it for cross-tool aggregation and GitHub already ingests SARIF 2.1.0 into code scanning without requiring a custom user interface. Sources: https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html ; https://docs.github.com/en/code-security/reference/code-scanning/sarif-files/sarif-support-for-code-scanning
  2. Confidence: high. A single normalized severity field is the wrong abstraction for a heterogeneous scanner estate, because GitHub code scanning uses `Error` or `Warning` or `Note`, Spectral uses lint severities, Checkov uses thresholdable policy severities, and GraphQL Inspector signals breaking-change impact instead of security risk. Sources: https://docs.github.com/en/code-security/concepts/code-scanning/about-code-scanning-alerts ; https://docs.stoplight.io/docs/spectral/branches/develop/9ffa04e052cc1-spectral-cli ; https://www.checkov.io/2.Basics/CLI%20Command%20Reference.html ; https://the-guild.dev/graphql/inspector/docs/products/action
  3. Confidence: high. The minimum viable normalized evidence record should preserve stable rule identity, artifact location, fingerprint, presentation level, business severity, workflow category, and policy version, because those are the fields that enable deduplication, routing, auditability, and user interface placement across scanner boundaries. Sources: https://docs.github.com/en/code-security/reference/code-scanning/sarif-files/sarif-support-for-code-scanning ; https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html ; https://semgrep.dev/docs/semgrep-appsec-platform/json-and-sarif
  4. Confidence: high. Waivers should be keyed to the normalized finding identity in a central registry with approver, justification, expiry, and policy-version metadata, because scanner-native suppressions such as `nosemgrep`, `checkov:skip`, and `noqa` are useful locally but do not provide a uniform audit contract. Sources: https://semgrep.dev/docs/ignoring-files-folders-code ; https://www.checkov.io/2.Basics/Suppressing%20and%20Skipping%20Policies.html ; https://docs.sqlfluff.com/en/latest/configuration/ignoring_configuration.html ; https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html
  5. Confidence: high. CodeQL, Semgrep, Checkov, and Spectral findings that already fit SARIF should be uploaded into GitHub code scanning under distinct categories, because GitHub otherwise treats same-tool same-category uploads as replacements and because location-aware alerts benefit from the native security tab and pull request surfaces. Sources: https://docs.github.com/en/code-security/how-tos/scan-code-for-vulnerabilities/integrate-with-existing-tools/uploading-a-sarif-file-to-github ; https://www.checkov.io/8.Outputs/SARIF.html ; https://semgrep.dev/docs/semgrep-appsec-platform/json-and-sarif ; https://docs.stoplight.io/docs/spectral/branches/develop/9ffa04e052cc1-spectral-cli
  6. Confidence: medium. GraphQL Inspector should remain a check-and-annotation adapter instead of being forced into the same alert channel as every other tool, because its documented model is schema-diff feedback with `fail-on-breaking` and label-based approval rather than SARIF-based persistent alert lifecycle. Source: https://the-guild.dev/graphql/inspector/docs/products/action
  7. Confidence: medium. SQLFluff should start as a check-run or job-summary signal until the team proves that a maintained converter is worth the effort, because the retrieved official SQLFluff documentation emphasizes rule selection and `noqa` suppression rather than native SARIF output. Sources: https://docs.sqlfluff.com/en/latest/configuration/ignoring_configuration.html ; https://docs.sqlfluff.com/en/stable/reference/cli.html
  8. Confidence: high. The safest rollout sequence is normalize first, observe duplicate and category stability second, centralize waivers third, and enforce blocking policy last, because fingerprint churn or weak mappings create developer distrust when they are introduced directly as hard merge gates. Sources: https://docs.github.com/en/code-security/reference/code-scanning/sarif-files/sarif-support-for-code-scanning ; https://github.com/davidamitchell/Research/blob/main/Research/completed/2026-03-22-compliance-scanning-gh-actions.md

Research Question

How should an organisation running multiple compliance scanners in GitHub Actions normalise evidence, severity, waiver handling, and developer-facing output so that heterogeneous tools behave like one coherent compliance system rather than a collection of unrelated failing checks?

Findings

Executive Summary

Key Findings

  1. [inference] Confidence: high. An organization should treat SARIF as the shared interchange backbone for multi-scanner compliance evidence because OASIS designed it for cross-tool aggregation and GitHub already ingests SARIF 2.1.0 into code scanning without requiring a custom user interface. Sources: Organization for the Advancement of Structured Information Standards (OASIS) SARIF 2.1.0 specification ; GitHub Docs — SARIF support for code scanning
  2. [inference] Confidence: high. A single normalized severity field is the wrong abstraction for a heterogeneous scanner estate, because GitHub code scanning uses Error or Warning or Note, Spectral uses lint severities, Checkov uses thresholdable policy severities, and GraphQL Inspector signals breaking-change impact instead of security risk. Sources: GitHub Docs — About code scanning alerts ; Spectral docs — CLI ; Checkov docs — Command Line Interface (CLI) reference ; GraphQL Inspector docs — GitHub Action
  3. [inference] Confidence: high. The minimum viable normalized evidence record should preserve stable rule identity, artifact location, fingerprint, presentation level, business severity, workflow category, and policy version, because those are the fields that enable deduplication, routing, auditability, and user interface placement across scanner boundaries. Sources: GitHub Docs — SARIF support for code scanning ; Organization for the Advancement of Structured Information Standards (OASIS) SARIF 2.1.0 specification ; Semgrep docs — JavaScript Object Notation (JSON) and SARIF fields
  4. [inference] Confidence: high. Waivers should be keyed to the normalized finding identity in a central registry with approver, justification, expiry, and policy-version metadata, because scanner-native suppressions such as nosemgrep, checkov:skip, and noqa are useful locally but do not provide a uniform audit contract. Sources: Semgrep docs — Ignoring files, folders, and code ; Checkov docs — Suppressing and Skipping Policies ; SQLFluff docs — Ignoring Errors and Files ; Organization for the Advancement of Structured Information Standards (OASIS) SARIF 2.1.0 specification
  5. [inference] Confidence: high. CodeQL, Semgrep, Checkov, and Spectral findings that already fit SARIF should be uploaded into GitHub code scanning under distinct categories, because GitHub otherwise treats same-tool same-category uploads as replacements and because location-aware alerts benefit from the native security tab and pull request surfaces. Sources: GitHub Docs — Uploading a SARIF file to GitHub ; Checkov docs — SARIF output ; Semgrep docs — JavaScript Object Notation (JSON) and SARIF fields ; Spectral docs — CLI
  6. [inference] Confidence: medium. GraphQL Inspector should remain a check-and-annotation adapter instead of being forced into the same alert channel as every other tool, because its documented model is schema-diff feedback with fail-on-breaking and label-based approval rather than SARIF-based persistent alert lifecycle. Source: GraphQL Inspector docs — GitHub Action
  7. [inference] Confidence: medium. SQLFluff should start as a check-run or job-summary signal until the team proves that a maintained converter is worth the effort, because the retrieved official SQLFluff documentation emphasizes rule selection and noqa suppression rather than native SARIF output. Sources: SQLFluff docs — Ignoring Errors and Files ; SQLFluff docs — CLI reference
  8. [inference] Confidence: high. The safest rollout sequence is normalize first, observe duplicate and category stability second, centralize waivers third, and enforce blocking policy last, because fingerprint churn or weak mappings create developer distrust when they are introduced directly as hard merge gates. Sources: GitHub Docs — SARIF support for code scanning ; Prior related item — `Research/completed/2026-03-22-compliance-scanning-gh-actions.md`

Assumptions

Analysis

Risks, Gaps, and Uncertainties

Open Questions

Output

sources


Connected items

Loading…

View full knowledge graph →