Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
6bf1660
feat(audit): weekly CodeRabbit Deep Scan audit that files findings as…
don-petry Oct 30, 2026
8a3e82b
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Oct 31, 2026
f4f83ab
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Oct 31, 2026
bc78c8c
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 1, 2026
2ae32c3
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 1, 2026
8edfe19
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 2, 2026
bfe2ccf
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 2, 2026
d443e6a
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 2, 2026
6fd7f3c
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
48bc52e
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
f880641
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
39554cb
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
a6b3dd6
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
5b17b3d
fix(reviews): dedupe findings, fail closed on truncated index, drop -…
don-petry Nov 3, 2026
72007a8
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
08a12c7
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
590ee76
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 3, 2026
fb996f9
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 4, 2026
e252f71
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 4, 2026
52aa7a8
fix(reviews): stop gh stderr leaking workflow paths in coderabbit-audit
don-petry Nov 4, 2026
e89f52b
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 4, 2026
1ba0fc8
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 5, 2026
bf53ec5
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 5, 2026
5d1b43c
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 5, 2026
8e3017c
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 6, 2026
67ef12b
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 6, 2026
ab6a01f
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 8, 2026
6d77036
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 8, 2026
e76a74b
Merge branch 'main' into claude/inspiring-einstein-8a2600
don-petry Nov 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions .github/workflows/coderabbit-audit-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Quality gates for the CodeRabbit audit script and its tests.
#
# Gates (all must pass before merge):
# 1. shellcheck — static analysis for the audit script
# 2. bats — pure helpers (severity mapping, routing, identity validation)
# and full runs against stubbed gh/curl (no finding detail in
# public output, fail-closed reads, issue lifecycle, no dev-lead)
name: CodeRabbit Audit Tests

on:
pull_request:
paths:
- 'scripts/coderabbit-audit.sh'
- 'test/scripts/coderabbit-audit/**'
- '.github/workflows/coderabbit-audit.yml'
- '.github/workflows/coderabbit-audit-tests.yml'
push:
branches:
- main
paths:
- 'scripts/coderabbit-audit.sh'
- 'test/scripts/coderabbit-audit/**'
- '.github/workflows/coderabbit-audit.yml'
- '.github/workflows/coderabbit-audit-tests.yml'

permissions:
contents: read

concurrency:
group: coderabbit-audit-tests-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: Lint and bats
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 1
persist-credentials: false

- name: Install bats, shellcheck, and jq
run: |
set -euo pipefail
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends bats shellcheck jq

- name: shellcheck
run: |
set -euo pipefail
shellcheck --severity=warning -x scripts/coderabbit-audit.sh

- name: Run bats suite
run: bats --print-output-on-failure test/scripts/coderabbit-audit/
85 changes: 85 additions & 0 deletions .github/workflows/coderabbit-audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Weekly org-wide CodeRabbit Deep Scan audit.
#
# Reads the org's Deep Scan findings from the CodeRabbit API, routes each one to
# the repo that owns the code, and idempotently creates/updates/closes one GitHub
# issue per finding. Findings are unverified LLM output, so issues get
# needs-verification and never dev-lead; a person adds dev-lead after confirming.
#
# Runs Thursdays, after the Wednesday CodeQL audit and before the Friday
# compliance audit, so no two audits file into the same repos on the same day.
# The API only reads results: Deep Scans run on CodeRabbit's own schedule.
#
# Every org repo is public, so this run's logs, summary and artifact are too. The
# script writes only opaque ids, severities and counts to any of them.
#
# Idempotency, labeling, routing and lifecycle live in scripts/coderabbit-audit.sh.
# Standard: standards/ci-standards.md#coderabbit-audit-coderabbit-audityml
name: CodeRabbit Audit

on:
schedule:
# Minute 1 = cron_offset_minute coderabbit-audit.yml (scripts/lib/cron-timing.sh).
- cron: '1 17 * * 4' # Every Thursday at 17:01 UTC
workflow_dispatch:
inputs:
target_repo:
description: 'Limit to a specific repo (owner/name or name). Leave blank to read all.'
required: false
type: string
dry_run:
description: 'Dry run — read and report only, skip issue writes'
required: false
default: false
type: boolean

permissions: {}

concurrency:
group: coderabbit-audit
cancel-in-progress: false # let a running audit finish to avoid partial issue state

jobs:
audit:
name: CodeRabbit Audit
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
steps:
- name: Checkout .github repo
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Run CodeRabbit audit
env:
# Needs, on every org repo: Contents (read), Issues (read/write),
# Metadata (read); plus Organization metadata (read) to list repos.
GH_TOKEN: ${{ secrets.ORG_SCORECARD_TOKEN }}
# Non-agentic key with security:read.
CODERABBIT_API_KEY: ${{ secrets.CODERABBIT_API_KEY }}
ORG: ${{ github.repository_owner }}
REPORT_DIR: ${{ runner.temp }}/coderabbit-report
TARGET_REPO: ${{ inputs.target_repo || '' }}
DRY_RUN: ${{ inputs.dry_run && 'true' || 'false' }}
run: bash scripts/coderabbit-audit.sh

- name: Write step summary
if: always()
env:
SUMMARY: ${{ runner.temp }}/coderabbit-report/summary.md
run: |
if [ -f "$SUMMARY" ]; then
cat "$SUMMARY" >> "$GITHUB_STEP_SUMMARY"
else
echo "CodeRabbit audit did not produce a summary." >> "$GITHUB_STEP_SUMMARY"
fi

- name: Upload audit report
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: coderabbit-report
# Summary only: this repo is public, and the summary holds counts alone.
path: ${{ runner.temp }}/coderabbit-report/summary.md
retention-days: 90
Loading
Loading