Skip to content

docs(security): document two-person control on alert dismissals#800

Merged
anandray merged 6 commits into
developfrom
docs/security-alert-dismissal-policy
May 10, 2026
Merged

docs(security): document two-person control on alert dismissals#800
anandray merged 6 commits into
developfrom
docs/security-alert-dismissal-policy

Conversation

@anandray
Copy link
Copy Markdown
Contributor

@anandray anandray commented May 8, 2026

Summary

Adds a Vulnerability & Alert Triage section to SECURITY.md that codifies the alert-dismissal flow we already operate under (and that GitHub's Delegated Alert Dismissal enforces at the org level). Documentation-only change — no code impact.

The new section covers:

  • Two-person control on code scanning alert dismissals: request → approval (by a different admin) → auto-dismissal
  • Triage dispositions (Fix / Mitigated / False positive / Won't fix) and the evidence each requires
  • Secret Scanning Push Protection bypass logging
  • Dependabot dismissal owner + comment requirement

Why

This is a SOC2 CC8 (change-management) and CC7.1 (vulnerability management) artifact. The policy in the file maps 1:1 to the system-of-record GitHub already preserves on each alert (request comment → approver → dismissal timestamp), giving an auditor a single document to compare against the alert metadata.

Audit traceability (for the auditor's records — not in the file itself)

The two-person flow was verified end-to-end on Scorecard alert #565:

  • Request: anandray submitted dismissal as "Mitigated" with documented compensating controls (PR fix(security): explicit branch check on nightly workflow_run trigger #771 fix in flight, branch protection prevents direct push, etc.)
  • Approval: kwit75 approved as the second admin principal
  • Result: GitHub auto-applied the dismissal; full request → approval → dismissal trail visible on the alert page

Org-level controls in place that back this policy:

  • ✅ "Prevent direct alert dismissals" — confirmed enabled
  • ✅ Secret Scanning Push Protection — enabled org-wide on all 4 public repos
  • ✅ CodeQL Default Setup — confirmed (PR ci: remove CodeQL advanced setup, switch to default setup #768, C++ autobuild verified)
  • ✅ Dependabot alerts + security updates — enabled on all 4 public repos

Test plan

  • Render check: SECURITY.md renders correctly on the GitHub web UI (table formatting, anchor links)
  • Anchor: [What to Expect](#what-to-expect) link in the new section resolves to the existing ### What to Expect heading

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation
    • Added a "Vulnerability & Alert Triage" policy: documents GitHub-native scanning and a delegated two-person alert-dismissal workflow requiring a request, recorded justification, and separate approver; defines allowed dispositions (Fix, Mitigated, False positive, Won’t fix); mandates push-time secret-scanning rules and recorded bypass justification; requires dismissal-comment details/SLA-exception recording for dependency alerts; removed prior security best-practices/closing text.

Adds a "Vulnerability & Alert Triage" section to SECURITY.md that codifies
the dismissal flow we already operate under and that GitHub's delegated
alert dismissal enforces:

- Request (any write maintainer, with justification)
- Approval (different admin maintainer; no self-approval)
- GitHub auto-applies dismissal after approval

Also documents:
- The four valid triage dispositions (Fix / Mitigated / False positive /
  Won't fix) and the evidence each requires
- Secret Scanning Push Protection bypass logging
- Dependabot dismissal owner + comment requirement

The flow was verified end-to-end on Scorecard alert #565 (anandray
requested with documented compensating controls, kwit75 approved as
second principal). This commit captures the policy that maps to that
audit trail; it's a documentation-only change with no code impact.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 8, 2026

Review Change Stack
No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 2e524bca-216c-4765-baae-2003cdb106d3

📥 Commits

Reviewing files that changed from the base of the PR and between 6ecddef and 22b1baa.

📒 Files selected for processing (1)
  • SECURITY.md

📝 Walkthrough

Walkthrough

This PR updates SECURITY.md to document GitHub-native security scanning and a Vulnerability & Alert Triage workflow on develop, adding a delegated two-person dismissal process, triage dispositions, and handling rules for Secret Scanning push protection and Dependabot alerts.

Changes

Security Triage Workflow Documentation

Layer / File(s) Summary
Vulnerability Triage Policy
SECURITY.md
New "Vulnerability & Alert Triage" section added documenting GitHub scanning on develop, two-person alert dismissal workflow (request/approval/auto-dismissal with justification), triage dispositions (Fix, Mitigated, False positive, Won't fix), and handling rules for Secret Scanning push protection and Dependabot alerts.
Documentation Cleanup
SECURITY.md
Removed the prior bottom-of-document "Security Best Practices" / "Security Features" sections and closing thank-you text.

Possibly related issues

  • #763: Documents vulnerability triage, tooling, and handling workflows in SECURITY.md, including triage dispositions and dismissal procedures.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 I hopped through docs with careful bite,

I wrote the rules to keep alerts in sight,
Two paws ask why, two ears approve,
Each dismissal keeps the record smooth and bright,
🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: documentation of two-person control on alert dismissals in the SECURITY.md file, which is the core objective of this PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/security-alert-dismissal-policy

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 8, 2026

No description provided.

@github-actions github-actions Bot added the docs Documentation label May 8, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@SECURITY.md`:
- Around line 49-53: Update the Approval wording in the "Approval — must be
given by a *different* maintainer with admin permissions on the repository"
sentence to reflect GitHub's delegated alert dismissal model: replace "admin
permissions on the repository" with the correct organization-level roles (e.g.,
"organization owners, security managers, or other org-level roles explicitly
granted dismissal authority") and note that repository admin rights do not
confer approval authority; preserve the requirement that the approver must be
different from the requester and keep the rest of the flow unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: aeab359b-4ad4-42ce-801b-6af400cfe049

📥 Commits

Reviewing files that changed from the base of the PR and between c4c8b42 and 928117e.

📒 Files selected for processing (1)
  • SECURITY.md

Comment thread SECURITY.md
CodeRabbit flagged that the policy text said "admin permissions on the
repository" for the second-principal approver, which is the wrong
authorization scope. GitHub Delegated Alert Dismissal is an org-level
control: only organization owners, security managers, or holders of
explicitly delegated custom roles can approve dismissal requests.
Repo-admin alone is not sufficient.

This matches what actually worked for alert #565: kwit75 approved as a
rocketride-org owner, not via repo-admin.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@SECURITY.md`:
- Line 71: The sentence in SECURITY.md that currently reads "Dependabot alerts
are dismissed only by repository admins..." is inaccurate when
organization-level Delegated Alert Dismissal is enabled; update that sentence to
list the broader set of roles that may dismiss alerts: organization owners,
security managers, and any custom organization roles granted dismissal
permission, and retain that dismissal reason and SLA exceptions must be recorded
in the dismissal comment and fixes tracked via Dependabot security update PRs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 89da0ad4-0604-499a-9503-1027d5084821

📥 Commits

Reviewing files that changed from the base of the PR and between 928117e and a42cf81.

📒 Files selected for processing (1)
  • SECURITY.md

Comment thread SECURITY.md Outdated
…missal model

Same fix as a42cf81 but for the Dependabot bullet on line 71.
CodeRabbit caught that "repository admins" was wrong for the same
reason: GitHub Delegated Alert Dismissal is an org-level control,
authorized by organization owners, security managers, or holders of
explicitly delegated custom roles — not repo-admin alone. The new
wording also explicitly points at the two-person request → approval
flow defined earlier in the section.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@anandray anandray enabled auto-merge (squash) May 9, 2026 00:02
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@SECURITY.md`:
- Line 45: Update the SECURITY.md sentence that lists scanning tools: either
remove "Scorecard" from the listed tools or add a clarifying sentence about how
Scorecard findings are handled differently — e.g., "Scorecard produces an
overall security posture score and recommendations which are reviewed and
addressed in aggregate rather than dismissed as individual alerts," and
reference "Scorecard" and the existing "findings are triaged against the SLAs in
[What to Expect]" wording so reviewers can find and update the same line.
- Around line 68-72: Update the "Secret Scanning & Dependabot" section to
explicitly state that Secret Scanning alerts (for secrets already present in the
repo) follow the same two-person Delegated Alert Dismissal workflow as
Dependabot alerts; mention that any dismissal requires request by a write-access
maintainer, approval by a different organization owner/security manager or
delegated role, and that dismissal reasons and any SLA exceptions must be
recorded in the dismissal comment, with fixes tracked via Secret Scanning
remediation PRs under the same SLAs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9e5ad205-1ebd-47d1-93d7-cfc32780257e

📥 Commits

Reviewing files that changed from the base of the PR and between a42cf81 and ed511da.

📒 Files selected for processing (1)
  • SECURITY.md

Comment thread SECURITY.md Outdated
Comment thread SECURITY.md
anandray and others added 2 commits May 8, 2026 17:09
…push protection

CodeRabbit caught that the previous bullet only documented Push
Protection (blocks new secrets at push time) and missed the separate
flow for Secret Scanning *alerts* — i.e., secrets already detected in
the repository. Those follow the same two-person Delegated Alert
Dismissal flow as Code Scanning and Dependabot alerts. Adds a bullet
noting the parity so the policy covers all three GitHub alert types
the org has enabled.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…lerts

CodeRabbit flagged that Scorecard appeared in the scanning-tools list
but wasn't covered explicitly by any dismissal-flow section. In our
setup, Scorecard publishes SARIF that surfaces as code scanning alerts
in GitHub's UI (that's the channel by which alert #565 — Scorecard
DangerousWorkflowID — was dismissed via the two-person flow). Adds an
intro sentence making this coverage explicit so an auditor reading the
doc doesn't have to infer it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@SECURITY.md`:
- Line 47: Update the markdown heading "Two-Person Control on Code Scanning
Alert Dismissals" to a broader title that covers all alert types (e.g.,
"Two-Person Control on Alert Dismissals" or "Two-Person Control on Alert
Dismissals (Code Scanning, Secret Scanning, Dependabot)") so the heading aligns
with the content that extends the Delegated Alert Dismissal flow to Secret
Scanning and Dependabot alerts; replace the exact heading text at the section
title to reflect the expanded scope.
- Line 71: Replace the generic phrase "authorized reviewer" in the "Secret
Scanning alerts" sentence with the exact role enumeration used elsewhere:
"organization owner, security manager, or explicitly delegated custom role" so
the line matches the precise terminology on lines 52 and 72 and maintains audit
documentation consistency.
- Line 72: The Dependabot alerts bullet is a single dense sentence; split it
into multiple focused bullets mirroring the Secret Scanning pattern: one bullet
stating who may request dismissal (any write-access maintainer), another stating
who must approve the dismissal (a different organization owner, security
manager, or holder of a delegated custom role), one bullet requiring that the
dismissal comment record the dismissal reason and any SLA exception, and a final
bullet noting that fixes are tracked via Dependabot security update PRs against
the SLA; update the "Dependabot alerts" heading/bullet label accordingly so each
responsibility is a separate, clear line.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: ca45827f-64b0-4c3e-9974-5c5b2ecb56b2

📥 Commits

Reviewing files that changed from the base of the PR and between ed511da and 6ecddef.

📒 Files selected for processing (1)
  • SECURITY.md

Comment thread SECURITY.md Outdated
Comment thread SECURITY.md Outdated
Comment thread SECURITY.md Outdated
…ependabot

Three small fixes from CodeRabbit's third pass:

1. Heading "Two-Person Control on Code Scanning Alert Dismissals" was
   misleading — the same flow applies to Secret Scanning and Dependabot
   alerts (called out below). Renamed to "Two-Person Control on Alert
   Dismissals" to reflect the actual scope.

2. Secret Scanning alert bullet used the shorthand "authorized reviewer"
   while lines 52 and 72 used the full role enumeration. Replaced with
   the full enumeration for audit consistency.

3. Dependabot bullet packed request/approval/documentation/fix-tracking
   into one dense sentence. Restructured as sub-bullets matching the
   focused-bullet pattern Secret Scanning uses, so an audit reviewer
   can verify each clause individually.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@anandray anandray merged commit 33f3c9b into develop May 10, 2026
26 of 27 checks passed
@anandray anandray deleted the docs/security-alert-dismissal-policy branch May 10, 2026 21:51
anandray added a commit that referenced this pull request May 11, 2026
Resolves merge conflict with develop (where PR #800 landed the
"Vulnerability & Alert Triage" section with the two-person Delegated
Alert Dismissal flow). This commit replays #762's original intent on
top of current develop and integrates with what merged:

Additions on top of develop's current SECURITY.md:
- Scanning Tools and Coverage subsection — lists CodeQL (Python,
  JS/TS, C/C++ via Default Setup), Scorecard, Trivy, Dependabot,
  Secret Scanning + Push Protection. Defers to .github/workflows
  and repo settings as source of truth.
- Branch Protection (`develop`) section — code-owner approval,
  required checks, force-push/branch-deletion disallowed, linear
  history, stale reviews dismissed, admin bypass disabled.
- Access Reviews section — quarterly review of org members,
  outside collaborators, owners, and 2FA compliance.
- Public Vulnerability Disclosure section — advisory publication
  policy.
- Triage and Remediation SLA table — business days for triage,
  calendar days for remediation; replaces the prose SLA list.
- "Critical-severity issues in unsupported versions evaluated
  case-by-case" note on Supported Versions.

Adjustments to existing develop content:
- Triage Disposition naming: "Fix" → "Fixed", "Won't fix" →
  "Accepted risk" (the latter now requires named approver,
  rationale, AND a re-evaluation date — the additional SOC2
  hygiene #762 introduced).
- "Initial Assessment: within 5 business days" prose dropped —
  the new SLA table covers triage timing more rigorously.

Reporting email stays `security@rocketride.ai` (mailbox now exists,
per the SOC2 follow-up).

Refs #760

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
anandray added a commit that referenced this pull request May 11, 2026
Resolves merge conflict with develop (where PR #800 landed the
"Vulnerability & Alert Triage" section with the two-person Delegated
Alert Dismissal flow). This commit replays #762's original intent on
top of current develop and integrates with what merged:

Additions on top of develop's current SECURITY.md:
- Scanning Tools and Coverage subsection — lists CodeQL (Python,
  JS/TS, C/C++ via Default Setup), Scorecard, Trivy, Dependabot,
  Secret Scanning + Push Protection. Defers to .github/workflows
  and repo settings as source of truth.
- Branch Protection (`develop`) section — code-owner approval,
  required checks, force-push/branch-deletion disallowed, linear
  history, stale reviews dismissed, admin bypass disabled.
- Access Reviews section — quarterly review of org members,
  outside collaborators, owners, and 2FA compliance.
- Public Vulnerability Disclosure section — advisory publication
  policy.
- Triage and Remediation SLA table — business days for triage,
  calendar days for remediation; replaces the prose SLA list.
- "Critical-severity issues in unsupported versions evaluated
  case-by-case" note on Supported Versions.

Adjustments to existing develop content:
- Triage Disposition naming: "Fix" → "Fixed", "Won't fix" →
  "Accepted risk" (the latter now requires named approver,
  rationale, AND a re-evaluation date — the additional SOC2
  hygiene #762 introduced).
- "Initial Assessment: within 5 business days" prose dropped —
  the new SLA table covers triage timing more rigorously.

Reporting email stays `security@rocketride.ai` (mailbox now exists,
per the SOC2 follow-up).

Refs #760
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants