Skip to main content

Certo

The coding agent that doesn't take its own word for it.

PyPI License: MIT Python 3.12+ Built on OpenHands SDK

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

pip install certo
certo init
cd certo-workspace
certo tasks/wordle.md --project wordle

certo init asks which provider you use (OpenAI, Anthropic, Gemini, a local Ollama, or any LiteLLM model), takes your API key at a hidden prompt, saves the settings, and makes one real call to check the model works. It also leaves two sample tasks in tasks/: a terminal Wordle in Python and a browser Asteroids game (which needs Node 18+). With a cloud model a run uses your credits, and Certo prints the cost at the end.

Or work on one project at a time, new or existing:

cd any-project && certo "Add a --verbose flag, with a test"

This works in any folder when certo init saved your settings for "all projects on this computer", its default.

The generated project lands in projects/wordle. The last line of output is the verdict:

Verification: verified

certo check shows where each setting comes from and re-runs the model check. Before the agent edits a folder that already has files, Certo prints a one-line warning if it has uncommitted git changes, or isn't a git repository.

Without certo init

Set two variables instead, in your shell, in a .env in the folder you run certo from, or in ~/.config/certo/.env for every folder (details):

export CERTO_LLM_MODEL=anthropic/claude-sonnet-5-5   # or openai/..., gemini/..., deepseek/...
export CERTO_LLM_API_KEY=sk-...

certo "Build a CLI todo app in Python, with tests" --project todo

With a local model (no API key):

ollama pull qwen3-coder:30b
export CERTO_LLM_MODEL=ollama/qwen3-coder:30b
export CERTO_LLM_BASE_URL=http://localhost:11434

qwen3-coder:30b needs roughly 20 GB of GPU or unified memory. With less, pull a smaller coder model such as qwen2.5-coder:7b and set CERTO_LLM_MODEL=ollama/qwen2.5-coder:7b. Expect weaker results on multi-step tasks.

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. Every state and its exit code: Verdicts.

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. Each Python project gets its own virtual environment, used by both the agent and the checks.
  • Verify without an agent. certo verify [PATH] runs the same checks on any project, with no model needed.
  • 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.yaml and 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 docker to run the agent in a container.
  • Server mode. REST, WebSocket streaming, and an OpenAI-compatible /v1/chat/completions endpoint.
  • Run records. Full transcript, token counts and cost per run, plus a log of which model was picked and why.
  • A benchmark. certo bench compares models on bundled tasks graded by hidden tests the agent never sees, and counts how often Certo itself was fooled. See Benchmark models and strategies.
  • 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

# Check a project with Certo's verification only: no agent, no model
certo verify ./projects/my-api

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 documentation.

Documentation

  • Documentation home: guides, reference and concepts, organised by what you want to do
  • Getting started: install, certo init, your first task, and reading the verdict
  • Troubleshooting: the problems people actually hit, with their fix
  • Why agents lie: the real cases of agents claiming "done", and how Certo catches each one
  • ROADMAP.md: status, backlog, and design decisions

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.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for certo 0.1.6
File Size Uploaded
certo-0.1.6.tar.gz 262.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for certo 0.1.6
File Interpreter ABI Platform
certo-0.1.6-py3-none-any.whl Python 3 none any Details

Total release size: 450.3 kB

Release files / certo-0.1.6.tar.gz

Download URL certo-0.1.6.tar.gz
Size 262.0 kB
Tags Source
SHA-256 checksum
How to use checksums
52c7f77cc4aabdfca8fdd8430bd8c43846f5a5f4acb694b19df9569971ae7632
BLAKE2b-256 checksum
How to use checksums
51a3b869c880eea15eb72aeaa9755e6411770f37e0ba4d78eec0b7559581244f
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 16, 2026.

Transparency log

Release files / certo-0.1.6-py3-none-any.whl

Download URL certo-0.1.6-py3-none-any.whl
Size 188.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
78ba9ae9b804532290917b52cc6663277ef0a4c850b18c497f99404061858f51
BLAKE2b-256 checksum
How to use checksums
1c92ccce4e8521111aff4c124bfa00be5931c4ad8eef0d9db1e248dde52ee838
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 16, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.8

2 release files

This release

0.1.6 This release

2 release files

0.1.3

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page