Certo
The coding agent that doesn't take its own word for it.
Give Certo a task. An agent plans, edits files and runs commands until it says it's done. Then Certo re-runs your project's real tests and build itself, with no LLM involved, and tells you whether the work is actually verified. Any model, local or cloud. Certo is Italian for "sure".
Why
Coding agents are confident, and often wrong about being finished. One example from building this tool: an agent wrote a Tower of Hanoi game, every unit test passed, and the program crashed the moment a user picked "solve". The agent had reported success, and so had pytest.
Certo exists to catch that. When the agent finishes, the harness checks the result independently, sends real failures back for another attempt, and stops when a fix attempt changes nothing.
Quickstart
With a local model (no API key):
pip install certo
ollama pull qwen2.5-coder
export LLM_MODEL=ollama/qwen2.5-coder
export LLM_BASE_URL=http://localhost:11434
certo "Build a CLI todo app in Python, with tests" --project todo
With a cloud model, change two lines:
export LLM_MODEL=anthropic/claude-sonnet-4-5-20250929 # or openai/..., gemini/..., deepseek/...
export LLM_API_KEY=sk-...
The generated project lands in ./projects/todo. The last line of output is the verdict:
Verification: verified
What the verdict means
| State | Meaning |
|---|---|
verified |
The project's own tests or build ran and passed. |
inconclusive |
Nothing could be checked (no tests yet, unknown project type, missing toolchain). |
retry_exhausted |
A check kept failing after the automatic fix attempts. |
no_progress |
A fix attempt changed nothing in the failing output, so Certo stopped early. |
incomplete |
The agent left items on its own to-do list unfinished. |
budget_exhausted |
The task ran out of its time budget. |
The exit code is nonzero for every failure state, so Certo works in scripts and CI. Add --require-verification to make inconclusive fail too. The full list of states is in the manual.
Features
- Independent verification. Re-runs the project's real test, build, lint and typecheck commands after the agent finishes. It never invents a command the project doesn't configure.
- Works across languages. Detects and verifies Python, Node/JS/TS, Go, Rust and Java (Maven/Gradle) projects.
- Any model, one setting. Ollama, Anthropic, OpenAI, Gemini, DeepSeek or Moonshot. Switching is one environment variable.
- Picks the best model per task. List your models with cost and quality ratings in
models.yamland Certo routes each task to the best fit, with fallback when a provider fails. No extra LLM call to decide. Add--auto-model. - Hard limits. An iteration cap, a wall-clock budget across all retries, and an optional approve-every-action mode.
- Sandboxed runs. Add
--execution dockerto run the agent in a container. - Server mode. REST, WebSocket streaming, and an OpenAI-compatible
/v1/chat/completionsendpoint. - Run records. Full transcript, token counts and cost per run, plus a log of which model was picked and why.
- Skills and custom tools. Add project conventions or new tools by dropping files in a folder.
More ways to run it
# Work inside a sandbox
certo "Add a /version endpoint" --project my-api --execution docker
# Let Certo choose the model for the task
certo "Fix the failing test in payments.py" --project my-api --auto-model
# Take the task from a file or URL
certo ./tasks/spec.md --project my-api
# Pause and ask you questions instead of guessing
certo "Scaffold a FastAPI service" --project my-api --interactive
How it works
Certo is built on the OpenHands Software Agent SDK, which runs the agent loop and tools. Certo adds the parts the SDK leaves open: what counts as verified, which model runs and when to fall back, the budgets, and the CLI and server you talk to.
Known limits
- Server mode has no authentication. Run it on localhost or behind your own gateway.
- Java projects are detected, but verification needs Maven or Gradle installed.
- Under Docker, automatic model selection makes the initial pick but does not fall back mid-task.
- Small local models can struggle with multi-step tool use. A coder-tuned model gives the best results.
The full list is in the manual.
Documentation
- MANUAL.md: configuration, CLI flags, server API, skills, custom tools
- ROADMAP.md: status, backlog, and the log of every agent failure that shaped the design
Contributing
Issues and pull requests are welcome. Issues labelled good first issue are a good place to start. To work on the code:
git clone https://github.com/alessioricco/certo.git
cd certo
uv pip install -e ".[dev]"
uv run pytest -q # no API key needed
License
MIT. Built by Alessio Ricco.
Metadata
Release files for certo 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| certo-0.1.0.tar.gz | 216.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| certo-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 330.7 kB
Release files / certo-0.1.0.tar.gz
| Download URL | certo-0.1.0.tar.gz |
|---|---|
| Size | 216.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
98bacb0d38bd31dfe39d869bc9368652ea513f19db45f347b01e5db181e7d5fc
|
|
BLAKE2b-256 checksum How to use checksums |
2276c425c4bc7175304d2cf1d3d09401bb68820ec7d6386d8dd3c174a542cbfe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / certo-0.1.0-py3-none-any.whl
| Download URL | certo-0.1.0-py3-none-any.whl |
|---|---|
| Size | 114.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9cfa23fccd860268686cd5cf79de6f4258f8f3657871c3284238bc091302accc
|
|
BLAKE2b-256 checksum How to use checksums |
b195e789e9124ff3f3c5e30ff4ffb06af1f7735f737e6208012798b84e4003ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency log