bugbout
Which coding agent actually fixes bugs in your codebase?
Public benchmarks tell you how coding agents do on someone else's code. bugbout tells you how they do on yours. It replays real bugs from your project's own history, lets agents race to fix them, and scores every patch with the tests your maintainers wrote alongside the real fix - tests no agent ever gets to see.
Why
- Your code, not a leaderboard's. An agent that tops a benchmark can still stumble on your conventions, your framework and your test suite. Measure it where you will use it.
- Scored by your own tests. Every task is a fix your team already shipped with a new test, and that test decides whether an agent's patch really fixes the bug.
- Bring any agent. Codex, Claude Code, Gemini CLI and mini-swe-agent work out of the box, and any other agent with a command line takes a few lines of config - so you can also compare models, including local ones.
- Cross-examination. Agents' tests are run against each other's patches, so you also learn whether an "agent jury" could pick, or gate, a patch on its own before you trust one in your workflow.
- Safe to run. Agents work in history-free checkouts, inside an OS sandbox, with web access switched off.
Quickstart
You need macOS or Linux (on Windows, use WSL2), Python 3.12+, git, uv, and at least one coding agent CLI installed and logged in.
pip install bugbout # or: uv tool install bugbout
cd your-project
bugbout init # writes bugbout.toml from your layout and the agents you have
bugbout doctor # checks everything before any agent spends quota
bugbout run # mines tasks, races the agents, judges and scores
bugbout report --format markdown
A bout is resumable: stop it at any point and run it again to carry on. Add an agent later and only that agent runs.
How it works
- Mine. Fixes in your git history that name an issue and add a test become tasks.
- Ground truth. The maintainers' tests run before and after their fix; the tests that flip from failing to passing define what "fixed" means.
- Race. Each agent gets the issue and a checkout of the code before the fix - no git history, none of the fix's tests - and works inside a sandbox.
- Cross-examine. Every test the agents wrote runs against every patch.
- Judge and score. A policy picks one patch per bug from the executed evidence, then the hidden tests score every patch and every pick.
More in How it works.
Configuration
bugbout init writes a commented bugbout.toml. A minimal one looks like this:
[project]
source = "src/mypkg"
tests = "tests"
[[contestants]]
agent = "codex"
[[contestants]]
agent = "claude-code"
model = "sonnet"
Every setting is described in Configuration; the built-in agents, sandboxing and adding your own agent are covered in Agents.
From Python
from bugbout import Bout, render_markdown
report = Bout.load(".").run()
print(render_markdown(report))
From your coding agent
bugbout ships an Agent Skill that teaches coding agents to set up a bout, run it and explain the report. Install it in Claude Code (2.1.275 or later):
/plugin install bugbout --marketplace Keerthirajan58/bugbout
On older versions, run /plugin marketplace add Keerthirajan58/bugbout and then
/plugin install bugbout@bugbout. For Codex, Cursor, Copilot, Gemini CLI and other agents:
npx skills add Keerthirajan58/bugbout
Or copy the skills/bugbout folder into your agent's skills folder, such as
~/.claude/skills/ or ~/.agents/skills/.
License
Metadata
Release files for bugbout 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| bugbout-0.1.1.tar.gz | 98.0 kB | Without provenance | Details for bugbout-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| bugbout-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for bugbout-0.1.1-py3-none-any.whl |
Total release size: 186.5 kB
Release files / bugbout-0.1.1.tar.gz
| Download URL | bugbout-0.1.1.tar.gz |
|---|---|
| Size | 98.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f8eca3e0f663d5d454f0b1bfddea28fec55d667c3f7fa806523465f440d97b89
|
|
BLAKE2b-256 checksum How to use checksums |
64d6b4461ce7144888ab9e5164928152fb91fda4e8fa15faa147e8ef4c2b7320
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / bugbout-0.1.1-py3-none-any.whl
| Download URL | bugbout-0.1.1-py3-none-any.whl |
|---|---|
| Size | 88.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ec594eccae99d4cdf17528969d2731f80dc9c6c4121d8dd16cab646922bda9f1
|
|
BLAKE2b-256 checksum How to use checksums |
28d040561707cf6eabb105b965146f15c595285f5fb8b502a848e3bf54561eed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for bugbout 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.