Execution governor for AI-generated code — Guard, Run, and Repair in one package
Project description
Saturnday
AI-specific governance for code generated by Claude, Cursor, Copilot, and other AI coding tools.
Your team already uses AI coding tools. Saturnday makes sure what they produce is safe to ship.
What it does
Saturnday runs 18+ automated checks on every PR, catching the things AI gets wrong that humans miss:
- Hallucinated imports — packages that don't exist on npm or PyPI
- Fake tests —
assert True, empty test bodies, tests that test nothing - Leaked secrets — API keys, passwords, tokens hardcoded in generated code
- Syntax errors — code that won't parse (Python and TypeScript/JavaScript)
- Placeholder code — TODO stubs,
pass-only functions,NotImplementedErrorbodies - Typosquat dependencies — suspicious package names that look like popular libraries
- Prompt injection — system prompt leakage in generated code
- Security vulnerabilities — via Bandit static analysis
- Shell script issues — via ShellCheck integration
- API version mismatches — calling methods that don't exist on the installed library version
Install
pip install saturnday
Usage
Check a PR diff
saturnday check --repo . --diff HEAD~1..HEAD
Scan an OpenClaw skill
saturnday scan --skill ./skills/my-skill/ --output ./results
Scan an entire skills corpus
saturnday scan --openclaw ./openclaw-skills/ --output ./results --format json
Run — governed execution
Turn a brief into governed tickets and execute them with your AI coder.
saturnday plan --brief "Build a calculator skill" --repo . --backend codex-cli
saturnday run --plan plan.json --repo . --backend codex-cli
saturnday resume --plan plan.json --repo . --backend codex-cli
Repair — fix findings automatically
Scan, generate repair tickets, and execute fixes.
saturnday repair --skill . --dry-run
saturnday repair --skill . --backend codex-cli
GitHub Action
Add this to .github/workflows/saturnday.yml in your repo:
name: Saturnday Governance
on:
pull_request:
branches: [main]
permissions:
contents: read
pull-requests: write
jobs:
governance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: honouralexwill/saturnday/.github/actions/saturnday-check@master
Every PR gets scanned. Findings are posted as a PR comment. The check fails if the disposition is FAIL.
Policy configuration
Create a saturnday-policy.yaml in your repo root to customise check severity:
schema_version: "1.0.0"
checks:
secrets: error
hallucinated_imports: error
fake_tests: warning
placeholders: info
syntax: error
scope:
denied_paths:
- "vendor/**"
- "node_modules/**"
How it works
Saturnday treats AI-generated code as untrusted input. Every diff goes through deterministic verification — no LLM calls in the governance pipeline. The checks are fast, reproducible, and auditable.
Results are written to structured evidence packs that can be stored for compliance and audit purposes.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file saturnday-0.3.0.tar.gz.
File metadata
- Download URL: saturnday-0.3.0.tar.gz
- Upload date:
- Size: 271.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5130733ed5d00727695a5797eea97a54fa14c7216bc9c462c64462e749fda0bf
|
|
| MD5 |
95af73987f5c18e7686792aa81dd14bb
|
|
| BLAKE2b-256 |
332d5421bfa5b39674ce70b83ece9c4ee791ccc7c77433ecd5b1563ff814e90d
|
File details
Details for the file saturnday-0.3.0-py3-none-any.whl.
File metadata
- Download URL: saturnday-0.3.0-py3-none-any.whl
- Upload date:
- Size: 184.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fb367072be0ce53c3b16343dde4034f6a79bb07699d07145da4eca4487ebb6f
|
|
| MD5 |
bf95ec8d0e07693899a513bdc2026089
|
|
| BLAKE2b-256 |
7a8df27462a05df4d1f9da81d3308cde266f960993cd6cd6a1844253d693222d
|