Skip to main content

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.model is null out of the box) - leave it unset and codex invocations run without a --model flag at all. Claude and agy also default to null, 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-model writes it straight into the scaffolded config; without it, edit agents.codex.model in orchestrator.json by hand afterward. Either way, pricing.codex still needs its own rates configured separately if you want real cost accounting, not just usage counts.
  • Set verification.driven_project_commands if 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 via catenna status / catenna report, then catenna approve-retry --approval-id <id> if it's warranted.
  • A stale lock: confirm via status/report that it's actually stale, then catenna 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> or stage_attempt_budget in .agent-pipeline/config/orchestrator.json, rerun, then revert the bump back once the task clears it. catenna run is always safe to rerun - it resumes from whatever reconcile_artifacts finds 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

catenna-1.0.0.tar.gz (133.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

catenna-1.0.0-py3-none-any.whl (152.3 kB view details)

Uploaded Python 3

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

Hashes for catenna-1.0.0.tar.gz
Algorithm Hash digest
SHA256 084752d94b1a6758d10c5d30a57eeb74dac5d616c7f9c99772cfe685794de0a5
MD5 4876770d6b9be52e69d55e51e578a192
BLAKE2b-256 6cd7856f450453825b7e1ab2ab7d70127659fd174f47f3b105a42e116a655a64

See more details on using hashes here.

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

Hashes for catenna-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f6d22357e5ef5002311d20e6e281d9fac340fc08ef59505ac1a194724954c2cd
MD5 06556fb57b1c0fe0d7edda28a059a652
BLAKE2b-256 4b7e03c29dd38ae21315c98121589d66896f5e2d7f23066b3180b430c36d0746

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page