The AI that writes the code doesn't get to certify it. A different vendor does.
Rondo drives a coding AI in a scripted loop, verifies the work itself (runs the test, hashes the file — the model's "passed" is never the gate), and then convenes a cross-vendor jury: a different vendor independently reviews the result, and disagreements are surfaced as the signal.
That last part is the moat. Single-vendor tools (Claude Code, Cursor, Copilot) can all run tests — but they structurally won't have a competitor's model judge their own. Rondo will.
accept = rondo_verifies(work) AND a DIFFERENT vendor agrees
→ See it live (Claude builds, Gemini + Grok judge, a bug that passes its tests
gets caught): examples/api/controlled_review_loop.py
Turn prompts into reliable, scriptable AI workflows — multi-provider LLM dispatch (Claude, Gemini, Grok, Mistral, OpenAI, Anthropic API, Ollama) with verified execution and cross-vendor AI code review, driven from MCP, the CLI, or a Python API.
Rondo is a scripted AI prompting engine for operational work. You define prompts, routing, retry behavior, and output contracts so the same workflow can run from MCP, CLI, or Python API without re-prompting by hand.
Rondo is not a chatbot framework and not a general app orchestration SDK. It does not try to replace LangChain/DSPy graph tooling or full agent platforms. It focuses on dependable dispatch, repeatable outputs, and workflow-safe envelopes for real operator loops.
Think of Rondo as "Terraform for prompts": declarative, repeatable runs with explicit execution modes, clear result contracts, and auditable behavior.
Rondo is built for real work:
- MCP in Claude Code,
- CLI automation in shells and CI,
- Python API workflows when you need code-level control.
It gives you structured results, repeatable dispatch, routing across models/providers, and workflow patterns that scale beyond copy/paste prompting.
Most AI usage is still manual:
- ask model,
- copy output,
- ask follow-up,
- lose context, repeat.
Rondo makes that loop scriptable:
- define steps,
- run with consistent output,
- branch on JSON fields,
- compare runs,
- retry failures,
- track cost/health/history.
That is the core value: prompting as a dependable workflow surface, not one-off chat luck.
cd rondo
pip install -e .
# Real prompt run (structured JSON by default)
rondo "review this design for top 3 risks"More setup and modes: docs/GETTING-STARTED.md.
Fastest onboarding path: docs/GETTING-STARTED-WOW.md.
rondo pipeline build.yaml --plan # PROMPT CODING (REQ-114): declared steps, typed
# outputs, hard budget — plan free, then apply.
# The flagship drives CLAUDE CODE ITSELF one
# verified step at a time (docs/PROMPT-CODING.md)
rondo matrix run exp.yaml --dry-run # model × effort × context experiment grids:
# budgeted, blind-scorable, resumable (REQ-113)
rondo providers --refresh --drift # catch retired models BEFORE dispatches 404
rondo providers --scores # 7-day learned model performance (auto-tune)
rondo retryq list # self-classifying retry queue (dead-letter, aging)
rondo metrics # 7d/30d reliability scoreboard vs 95% targetModern extended-thinking models are handled automatically: adaptive thinking, effort control, output headroom, and streamed dispatch with an event watchdog — a model may think for many minutes safely. Every failure carries the provider's own explanation into the audit trail.
The documentation IS the examples: 101 real, runnable files under
examples/ (start at examples/INDEX.md; count lock-verified by
examples/generate_index.py --check), smoke-checked by
examples/verify-examples.sh, with key paths exercised in the test suite.
Use tool calls like:
rondo_runrondo_multi_reviewrondo_review_filerondo_cloudrondo_run_statusrondo_retryrondo_diff
Start here:
examples/mcp/README.md(13 MCP examples)- Full example index:
examples/INDEX.md(all 101 examples mapped by mode/provider/use case)
rondo "summarize this architecture"
rondo run examples/rounds/01-simple-review.yaml
rondo review src/rondo/mcp_dispatch.py --providers gemini,grok --tier defaultStart here:
examples/cli/README.md- Full example index:
examples/INDEX.md
from rondo.mcp_dispatch import rondo_run_file
result_json = rondo_run_file(
prompt="Return JSON: {\"summary\": \"...\"} for this module",
model="sonnet",
execution="subprocess",
dry_run=False,
)Start here:
examples/api/README.md- Full example index:
examples/INDEX.md
Rondo separates:
execution= how work runs,model= where it routes.
| You want... | Use this | You get back... |
|---|---|---|
| AI to run in your current host/session loop | execution="inline" |
A plan for YOU to execute in your current code |
| AI to run independently and return completed results | execution="subprocess" |
Completed results from a separate Rondo process |
| Host agent orchestration with explicit model | execution="agent" |
A plan for your host to spawn a Claude Agent |
| Cloud/provider adapter call (Gemini/Grok/OpenAI/Mistral/Anthropic/local) | model="provider:model" |
Completed results via the provider's HTTP API |
| Let caller defaults decide | execution="" |
MCP defaults to inline; Python/CLI defaults to subprocess |
Provider-prefixed models (for example gemini:..., anthropic:...) route HTTP adapters and bypass execution mode routing.
When Rondo returns an agent plan, the host is responsible for launching an agent with that plan payload.
import json
from rondo.mcp_dispatch import rondo_run_file
plan = json.loads(
rondo_run_file(
prompt="Review src/rondo/envelope.py and propose safer error handling.",
model="sonnet",
execution="agent",
dry_run=False,
)
)
if plan.get("kind") == "agent_dispatch_plan":
# -- Host contract: spawn an Agent using plan prompt/model/project.
host.spawn_agent(
model=plan["model"],
prompt=plan["prompt"],
working_dir=plan.get("project") or ".",
)| plan_only | execution | Result |
|---|---|---|
| false | "" |
Option C auto-execute, results |
| false | subprocess |
Subprocess results |
| false | inline |
Option C auto-execute, results |
| false | agent |
Agent plan (host spawns) |
| true | "" |
Inline plan JSON (debug) |
| true | subprocess |
Inline plan JSON (plan_only wins) |
| true | inline |
Inline plan JSON (debug) |
| true | agent |
Agent plan JSON (debug) |
- Multi-provider consensus review loops.
- Find -> fix -> verify pipelines.
- Background dispatch + polling orchestration.
- Retry/diff-based regression checking.
- Cost-aware routing and model benchmarking.
- Structured prompt scripting with predictable control flow.
See:
examples/mcp/examples/cli/examples/api/
Rondo has two ways to reach a model, and some features only exist on one (documented here on purpose — SOP-105 P1-10):
| Capability | API path (provider:model) |
Subprocess path (claude CLI) |
|---|---|---|
| Multi-provider (Gemini/OpenAI/Grok/Mistral/local) | ✓ | — (Claude only) |
| Experiment matrix cells + judge scoring | ✓ | not yet (v2 follow-up) |
| Streaming + thinking effort control + disconnect recovery | ✓ | n/a (CLI manages its own session) |
Model canary (models --verify) |
✓ | — |
| Model can use tools / read files itself | — (text in, text out) | ✓ |
Claude subscription auth (auth=max) |
— | ✓ (excluded from public builds) |
| Audit trail, retry queue, smart return, budgets, task affinity | ✓ | ✓ |
Rondo examples are intended as living usage patterns, not fake snippets.
The examples are used as test fixtures (tests/integration/test_api_examples.py and related suites), so breakage is surfaced early.
Rondo was built by Mark Hubers, who is legally blind and deaf (Usher Syndrome Type 2 — a 5-10 degree window of central vision, hearing that works in quiet rooms only). That isn't a footnote; it's the design spec.
When you can't glance at a screen to check what happened, software has to PROVE what happened:
- Terminal-first, no GUI surprises — an unexpected window is an invisible window.
- Loud
-PASS-/-ERROR-/-WARNING-prefixes, high contrast — built for narrow-field scanning, useful to everyone at 2 AM. - Audit-everything, never lose data — you can't visually re-scan a wall of scrollback; the JSONL trail has to be the memory.
- Honesty engineering — error envelopes on every failure, partial results preserved, mutation-tested tests, AIs cross-checking AIs with mechanical referees. Trust built on proof, because trust built on watching was never an option.
Accessibility constraints made the design stricter, and the strictness is what makes it dependable for everyone else.
- Prompt coding (the thesis):
docs/PROMPT-CODING.md - Quick start and core usage:
docs/GETTING-STARTED.md - Error/result envelope contract:
docs/ERROR-ENVELOPE-CONTRACT.md - Full reference:
docs/RONDO-REFERENCE.md - Fast path:
docs/GOLDEN-PATH.md - Pattern recipes:
docs/COOKBOOK.md - Try-now guide:
TRY.md - Specs:
specs/
New to Rondo? Start with the CLI golden five: docs/GOLDEN-FIVE.md —
doctor → one JSON prompt → a round file → a judged experiment → the fleet view.
Five verified commands, under 5 cents total.
Already in Claude Code (MCP)? Run these in order:
examples/mcp/01-inline-host-plan.mdexamples/mcp/03-subprocess-fresh-session.mdexamples/mcp/05-background-polling.mdexamples/mcp/06-multi-provider-review.mdexamples/mcp/11-retry-failed-dispatch.md
That sequence shows the real value curve from single prompt to resilient workflow.