1. Generate the workflow
Requires: Docker, and nothing else. Run this inside the repository you want audited:--pull=always matters: v1 is a moving tag, and docker run reuses whatever
it already has on disk rather than checking whether the tag now points somewhere
else. Without it you keep running the version you first pulled..github/workflows/contract-audit.yml.
Commit that file and you are done.
Every value in that file was worked out by reading your repository, and each one
has a comment next to it saying where it came from, so you can check the working:
The middleware row is the one that saves you reading an unfamiliar codebase.
Most projects register two APIs in the same place: the one outside developers
hold a key for, and the one a dashboard talks to with a session token. Their
paths look alike, so what separates them is which guard they sit behind.
init refuses to overwrite a workflow that already exists. Pass --force to
replace it, --stdout to print it instead, or --json to see what was detected
without writing anything.Without Docker
Coming soon. Anyone with the codebase checked out already has one of these installed, so it will be the shortest way in:
Until then the image above needs only Docker.
2. What runs on GitHub
Once the workflow is committed, every pull request into one of your shared branches is audited, and so is the merged result on those branches. One pull request can add a route while another edits the spec, so each one is audited against its own merge preview, not against whatever they both eventually land on. Each run leaves:- A comment on the pull request, edited in place on each run so you get one comment and not a thread. It gives counts by severity and by what disagrees. It does not list the endpoint paths: a route that is registered but undocumented is usually undocumented on purpose, and listing them would publish an inventory to everyone who can see the pull request.
- A fix brief, uploaded as an artifact and linked from that comment. It has every finding, the evidence, and the test that proved it, written so you can paste it straight into Cursor, Codex or Claude Code.
If that file ever needs editing, it should only be to delete lines you do not
want.
Where each credential comes from, and setting it →
Full input reference and troubleshooting →
3. Running it locally
Only needed to work on the auditor itself, or to audit a repository without putting anything in CI.
No
pip install, no Docker, no database.
Audit a repository directly
Reproduce the evaluation
1
Build the 16 evaluation cases
2
Test the deterministic tools
3
Confirm the scorer is sound
4
Score the no-model layer
5
Add a key and run the full auditor
OPENROUTER_BASE_URL to redirect.make clean.
Reset with make clean.