Catenna
Catenna is a deterministic multi-agent pipeline orchestrator. It drives
coding-agent CLIs (codex, claude, agy/Antigravity) through a fixed,
auditable workflow - spec, independent audit, implementation, independent
review, deterministic accept/reject - against a driven project: any
other repository you point it at. It exists so that agentic coding work
gets planned and checked the way a human team would, instead of one agent
improvising an entire feature in a single unsupervised shot.
Catenna is not itself the driven project. It's a standalone tool you
install once and reuse across as many projects as you like, each keeping
its own task data under a gitignored .agent-pipeline/ directory.
The pipeline: 9 stages, one gate
Every task moves through the same numbered stages, each producing one
artifact file under .agent-pipeline/tasks/<task>/:
| Stage | Artifact | What it does | Default agent |
|---|---|---|---|
00 |
00_original_request.md |
The raw task ask, seeded by a human or an overseer. | - |
01 |
01_requirements_packet.md |
Requirements/design packet: objective, current vs. desired behavior, constraints, acceptance criteria. | - |
02 |
02_technical_spec.md |
A technical specification for the change. | codex |
03 |
03_audit.md |
An independent audit of stage 02's spec. | codex |
04 |
04_final_codex_brief.md |
The final implementation brief. | codex |
04_gate |
04_final_brief_audit.md |
A gate check on the brief, by an agent guaranteed not to be the one that wrote it - rejects and loops stage 04 back with the rejection reason inlined if the brief isn't implementable as written. | claude |
05 |
05_codex_implementation_report.md |
The actual code change, applied to your working tree. | codex |
06 |
06_manual_test_notes.md |
Manual test evidence, written by a human or auto-written by the controller when real build/test verification qualifies. | - |
07 |
07_diff_review.md |
An independent review of the real git diff, by an agent guaranteed not to be stage 05's implementer. |
claude |
08 |
08_decision.md |
Deterministic accept / reject / needs-followup synthesis - no agent call, just a "worst wins" rule over stages 06 and 07. | - |
Stage 04_gate is the one built-in loop: a rejected brief gets sent back
to stage 04 with the rejection feedback inlined into the retry prompt,
up to a configured number of passes, before the whole thing is treated as
blocked.
All of this is configurable per stage - which agent is primary, which
agents are fallbacks, and (since v3) per-stage model/effort overrides -
in .agent-pipeline/config/orchestrator.json. See "Configuration" below.
Install
pip install catenna
Or, to work on Catenna itself (editable install from source):
git clone git@github.com:Dino-Yoshi/Catenna.git && cd Catenna
pip install -e .
Either way this installs the catenna console script (pyproject.toml);
the underlying package is agent_pipeline, invocable identically as
python3 -m agent_pipeline.cli if you ever need that form instead (some
internal verification checks shell out to it that way).
Quick start
From the driven project's repository (not this one, unless you're using Catenna to work on itself):
catenna init --codex-model <model>
This scaffolds .agent-pipeline/tasks/, .agent-pipeline/usage/, and
.agent-pipeline/config/orchestrator.json with defaults from
agent_pipeline/config.py.
- Set a model for codex. Codex has no default model
(
agents.codex.modelisnullout of the box) - leave it unset and codex invocations run without a--modelflag at all. Claude and agy also default tonull, but codex is the primary agent for the most invoked stages (02,03,04,05,overseer), so this is the one worth setting deliberately rather than leaving implicit.--codex-modelwrites it straight into the scaffolded config; without it, editagents.codex.modelinorchestrator.jsonby hand afterward. Either way,pricing.codexstill needs its own rates configured separately if you want real cost accounting, not just usage counts. - Set
verification.driven_project_commandsif you want Stage 6 to ever auto-verify (build/test commands run against your project, not Catenna's own). - Anything else - per-stage model/effort overrides, cost-control downgrade eligibility, turn budgets - can stay at defaults for a first run.
Plan before you run
Before pointing Catenna at real implementation work, plan it out the same
way you'd plan work for a human team: figure out the actual scope and
divide it into tasks, so the codebase scales with real requirements
instead of one task attempting to build everything at once, randomly or
obtusely. Concretely, that means writing real 00_original_request.md /
01_requirements_packet.md content per task - objective, current vs.
desired behavior, constraints, acceptance criteria - not a one-line ask.
This is true whether you're seeding tasks by hand or having an overseer
pass do it: requirements and design come before implementation tasks are
handed to stage 02, every time.
Running a task
catenna use my-task # or: select / set
catenna run --background # or: --bg
catenna tail
catenna use sets the current-task pointer so subsequent commands can
omit the task argument. Run in the background from the start - it frees
your shell immediately rather than blocking on however long stages 02-05
take. catenna tail is an overseer's main tool for watching a background
run live from the same terminal.
For a more human-friendly, truncated view instead of a live stream, use:
catenna status my-task
catenna report my-task
status shows current state at a glance; report synthesizes stage
status, the Stage 8 decision, verification results, usage, and captured
reasoning traces into one readable document.
Unblocking a stuck task
awaiting_retry_approval: an expensive retry needs a human nod. Read why viacatenna status/catenna report, thencatenna approve-retry --approval-id <id>if it's warranted.- A stale lock: confirm via
status/reportthat it's actually stale, thencatenna unlock <task> --reason <reason>. - Turn or attempt budget exhausted on a non-code problem (a session
limit, a flaky/stale review, not an actual bug): bump
turn_budgets.<stage>orstage_attempt_budgetin.agent-pipeline/config/orchestrator.json, rerun, then revert the bump back once the task clears it.catenna runis always safe to rerun - it resumes from whateverreconcile_artifactsfinds valid on disk, so there's no special "resume" command.
Configuration
Everything above is driven by .agent-pipeline/config/orchestrator.json,
merged over agent_pipeline/config.py's DEFAULT_CONFIG. This covers the
common knobs; it is not the full reference.
Documentation
This README covers first-run setup and the everyday commands. For anything not covered here - the full config field reference, state machine and troubleshooting table, cost-control/downgrade behavior, the self-hosting overseer workflow, and architecture/module internals - see:
- docs/USAGE.md - operator guide: full command table, state troubleshooting, complete config reference, self-hosting workflow.
- docs/OVERVIEW.md - architecture, module-by-module internals, and the project's changelog.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file catenna-1.0.0.tar.gz.
File metadata
- Download URL: catenna-1.0.0.tar.gz
- Upload date:
- Size: 133.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
084752d94b1a6758d10c5d30a57eeb74dac5d616c7f9c99772cfe685794de0a5
|
|
| MD5 |
4876770d6b9be52e69d55e51e578a192
|
|
| BLAKE2b-256 |
6cd7856f450453825b7e1ab2ab7d70127659fd174f47f3b105a42e116a655a64
|
File details
Details for the file catenna-1.0.0-py3-none-any.whl.
File metadata
- Download URL: catenna-1.0.0-py3-none-any.whl
- Upload date:
- Size: 152.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6d22357e5ef5002311d20e6e281d9fac340fc08ef59505ac1a194724954c2cd
|
|
| MD5 |
06556fb57b1c0fe0d7edda28a059a652
|
|
| BLAKE2b-256 |
4b7e03c29dd38ae21315c98121589d66896f5e2d7f23066b3180b430c36d0746
|