Skip to main content

tazuna

PyPI Python

Define project policy once. Render it into every agent harness. Route work across providers. Get auditable results.

Tazuna (手綱) is Japanese for the reins: one pair of hands steering several horses. Versions up to 0.2.0 were published as agentplane; see the changelog for the rename.

tazuna is a small, provider-neutral control plane for teams that use more than one AI coding agent (Claude Code, Codex, Cursor, Gemini CLI, local models, or anything with a headless CLI). It does four things and nothing else:

What Command
1 One policy, many harnesses. PROJECT.md is the single source; CLAUDE.md, AGENTS.md, .cursor/rules/project.mdc (and more) are generated from it and guarded against hand edits. tazuna render
2 Understandable routing. A role is a named row in tazuna.toml: provider, model, effort, timeout, read-only, fallback. Nothing is chosen by heuristics at runtime. tazuna routes
3 Auditable execution. Every delegated task ends in a HANDOFF.md built from measured facts (git diff, exit code, duration, effective model), a typed status, and a JSONL ledger. tazuna run
4 Reproducible evals and diagnostics. Fixture directories run through the same path and are graded deterministically; doctor says what is broken vs. merely optional. tazuna eval, tazuna doctor

It is not a skill library, an agent framework, or a swarm runtime. It sits under those and gives them one policy file, one routing table, and one result contract.

Install

Python 3.11+ and git. No other runtime dependencies.

tazuna is published on PyPI. Install the CLI into its own environment with pipx:

pipx install tazuna
tazuna --version

If you do not use pipx, pip works too (inside a virtual environment):

python -m pip install tazuna

uv tool install tazuna is equivalent to the pipx command. Release artifacts on PyPI are uploaded from GitHub Actions through trusted publishing and carry provenance attestations. To work on tazuna itself, install from a checkout as described in CONTRIBUTING.md.

Provider CLIs are optional. Install whichever you use (claude, codex, cursor-agent, gemini, ollama); tazuna detects them and works offline with a built-in mock provider when none is present.

Use it with whatever plan you have

tazuna never talks to a model API itself. It launches the provider CLIs you already have, under the login and billing you already use, so pick the setup that matches your contract:

You have Use Notes
A subscription that includes a CLI (Claude Pro/Max → claude, ChatGPT Plus/Pro → codex, Cursor → cursor-agent, Google AI → gemini) roles on that provider the CLI's own login is used; no API key is needed or forwarded
API keys instead of a subscription the same CLIs configured for API billing, per each vendor's docs keys stay in the CLI's own config; tazuna's environment allowlist does not forward them
Several of the above one role per provider, fallback between them routes shows which provider each role bills
No paid plan, or private data ollama with a local model, read_only offline, nothing leaves the machine
Nothing yet the mock provider (--role dry) exercises the whole pipeline without a model

The model ids written by tazuna init are examples. Replace them with the ids your plan actually enables (each CLI can list its models), keep personal choices in ~/.config/tazuna/config.toml, and check the resolved command with tazuna run --role X --dry-run before spending quota.

Quickstart (5 minutes)

cd your-project
tazuna init                  # writes tazuna.toml + PROJECT.md, roles for the CLIs it finds
$EDITOR PROJECT.md           # describe the project once: purpose, stack, commands, quality gate, do-nots
tazuna render                # -> CLAUDE.md, AGENTS.md, .cursor/rules/project.mdc
tazuna routes                # what each role resolves to, and whether its provider is installed
tazuna doctor                # OK / WARN / NOTE; exit 1 only on real problems

Delegate a task and read the result:

tazuna run --role dry "Summarize the repo layout in five bullets"      # offline mock, always works
tazuna run --role review --read-only "Review src/ for missing error handling"
tazuna run --role impl --task-file PLAN.md --timeout 1200
cat HANDOFF.md               # status, changed files, verification facts, provider output tail
tazuna runs                  # ledger of every run

Keep generated files honest in CI:

tazuna render --check        # exit 1 on drift
tazuna doctor                # exit 1 on WARN

Run the bundled offline eval suite:

tazuna eval run evals/suites/smoke --role dry

How it fits together

PROJECT.md ──render──▶ CLAUDE.md / AGENTS.md / .cursor/rules/project.mdc / GEMINI.md / …
     ▲                      (generated marker; `guard` and `render --check` protect them)
     │
tazuna.toml ── roles ──▶ run --role X ──▶ provider CLI (env allowlist, timeout, sandbox flags)
     │                                            │
     └── providers (built-in + packs + user)      ▼
                                       HANDOFF.md + runs.jsonl + log   ←── evals grade these
  • Policy layer: PROJECT.md (+ optional per-target appendices in .tazuna/appendix/). Model aliases {{model:NAME}} expand from [models].
  • Routing layer: [roles.*] in tazuna.toml; personal provider choices go in ~/.config/tazuna/config.toml and never into the repo.
  • Execution layer: run launches the provider headless with an allowlisted environment, a timeout, and the provider's own sandbox flags; it never passes flags that disable a harness's approvals.
  • Result contract: exit code 0 done · 1 failed · 2 usage · 3 safety boundary · 4 empty output · 124 timeout · 130/143 cancelled, plus the provider's typed self-report (DONE, DONE_WITH_CONCERNS, BLOCKED, NEEDS_CONTEXT) read only from its last line.
  • Extension: packs (pack.toml) add providers, targets, roles, and appendices. See packs/.

Full docs: docs/quickstart.md · docs/configuration.md · docs/routing.md · docs/handoff.md · docs/evals.md · docs/packs.md · docs/architecture.md · docs/security.md

Status

0.3.0, alpha. The Claude Code, Codex, and Cursor provider definitions mirror flags used in production; Gemini CLI is marked experimental. Provider CLIs change their flags; if one breaks, override the provider table in your user config and open an issue.

License

MIT — see LICENSE.

Release files for tazuna 0.3.0

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

Source distribution (sdist)

Source distribution for tazuna 0.3.0
File Size Uploaded
tazuna-0.3.0.tar.gz 98.9 kB Details

Built distribution (wheel)

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

Total release size: 156.9 kB

Release files / tazuna-0.3.0.tar.gz

Download URL tazuna-0.3.0.tar.gz
Size 98.9 kB
Tags Source
SHA-256 checksum
How to use checksums
1e1b8c6d4e82adf3b168e4cb51a3d3052a284f173b4417becc7397c12f648b59
BLAKE2b-256 checksum
How to use checksums
5e46b122f20f6142c4e0ed18084a0ca0d2d11bde9ff354ccaaa1d9cc7144d559
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 Sep 26, 2026.

Transparency log

Release files / tazuna-0.3.0-py3-none-any.whl

Download URL tazuna-0.3.0-py3-none-any.whl
Size 57.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f3db4e5aa043fac657a6aa6e81fd3eb6314c145149dd1d96e85bcc3ba2d3b993
BLAKE2b-256 checksum
How to use checksums
1b088f6fa26bf3d6cfd512e74c109cb77c0ec1ff50c6af5c0e51b569b2811d68
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 Sep 26, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.0

2 release files

This release

0.3.0 This release

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