Repo automation¶
Everything here runs on GitHub's free tier. No paid API key is required.
| Workflow / bot | What it does | Cost | Needs a key? |
|---|---|---|---|
CI (ci.yml) |
ruff + black + mypy + pytest on 3.11/3.12, eval-coverage gate, packaging build | free Actions | no |
Release (release.yml) |
build + GitHub release + PyPI publish on tags | free | PyPI trusted publishing (no secret) |
| Dependabot | weekly pip + actions dependency PRs | free | no |
| CodeQL | security scanning | free | no |
| PR Labeler | labels PRs by touched paths | free | no |
| Stale triage | flags/closes inactive issues & PRs | free | no |
PR review (free) (pr-review-free.yml) |
AI review of each PR diff via GitHub Models | free (built-in GITHUB_TOKEN, rate-limited) |
no |
Claude review (claude-review.yml) |
fork-safe Claude review of the diff; sets claude-approved / claude-changes-requested |
paid | ANTHROPIC_API_KEY secret |
Auto-merge (auto-merge.yml) |
squash-merges Dependabot on green, and Claude-approved PRs that touch no CI/packaging/deps path | free | no |
Free LLM for maintenance¶
The default AI reviewer uses GitHub Models:
GitHub Actions can call hosted models (e.g. openai/gpt-4o-mini) for free using
the built-in GITHUB_TOKEN and a models: read permission — no secret, no
billing, on the free tier for public repos (subject to rate limits). It posts a
concise review comment on every PR and degrades gracefully (skips, never fails
the PR) if the rate limit is hit.
The paid Claude review is an optional upgrade: add an ANTHROPIC_API_KEY
secret (Settings → Secrets → Actions) and it activates; without it, it simply
skips and the free reviewer handles PRs. So you can run the whole project's
maintenance at zero LLM cost.
Contribution pipeline & key safety¶
When ANTHROPIC_API_KEY is set, incoming PRs flow through:
- CI (
ci.yml) runs ruff/black/mypy/pytest on 3.11 + 3.12. These three checks (test (3.11),test (3.12),build) are required by branch protection onmain, so nothing merges without them green. - Claude review reads the diff and posts findings, labelling the PR
claude-approvedorclaude-changes-requested. - Auto-merge enables GitHub squash auto-merge (which waits for the required
checks) for Dependabot, and for Claude-approved PRs that don't touch
sensitive paths. PRs changing
.github/**,pyproject.toml,setup.*, lockfiles, orMANIFEST.ingetneeds-maintainerand wait for a human.
Why the key can't leak or be misused:
- It lives only as an encrypted GitHub Actions secret, never in the repo
(
.env.secretis git-ignored) and never in arun:argument. GitHub also auto-redacts it from all logs. claude-review.ymlruns onpull_request_target(so the secret is available for fork PRs) but never checks out or executes PR-authored code — it only fetches the diff text viagh pr diffand sends it to the API. A malicious fork has no code-execution surface in the job that holds the key.- There is deliberately no agentic path (e.g.
claude-code-actionrunning a fork's build/tests) that could execute untrusted code with the key. - Auto-merge never merges PRs that touch CI/packaging/dependency files, so the supply-chain and secret-config surfaces always require a human.
- The LLM review is advisory, not a security boundary; CI and the sensitive-path block are the enforced gates.