quorum
Orchestrate long-running coding tasks with the harness you already use —
supervised by that same harness. Point quorum at your repos, queue tasks
in plain English, and let your coding agent CLI — claude, codex,
opencode, anything that takes a prompt — do the work in isolated git
worktrees. The supervisor is an agent too: quorum's manager periodically
hands your harness a digest of everything happening (every task's status,
output, and liveness, plus its own past actions and their outcomes) and lets
it decide — launch, nudge, relaunch, spin up follow-up work, or escalate to
you. Supervision policy is a prompt you can edit, not code. One process, no
root, no cron, no database; everything is a plain file you can cat.
quorum task add my-api "add rate limiting to the public endpoints, then open a PR"
│
┌─ quorum up ─────────────────────────────────────────────────────┐
│ manager your harness, reading the whole situation and │
│ acting: launch, nudge, relaunch, task add, │
│ escalate — every action journaled and auditable │
│ │
│ task runs your harness (claude/codex/opencode/...) working │
│ in worktrees/<task>/, reporting progress back │
│ through `quorum task report` and reading guidance │
│ from `quorum task inbox` │
└──────────────────── all state in ~/.quorum ─────────────────────┘
▲ ▲ ▲
quorum status quorum tui quorum web
quorum manager tell (steer with `n`) (localhost only)
Install
Needs Python 3.11+.
uv tool install quorum-orchestrator # includes the TUI dashboard
uv tool install "quorum-orchestrator[web]" # + the localhost web dashboard
uvx --from quorum-orchestrator quorum --help # zero-install trial run
(or pip install "quorum-orchestrator[web]" if you don't use uv.)
The PyPI distribution is quorum-orchestrator; the command it installs is
plain quorum (and the import name is quorum too).
From a checkout: uv sync --all-extras, then prefix commands with uv run.
Five minutes to a running task
quorum init # scaffold ~/.quorum
Tell quorum how to invoke your harness: the scaffolded
~/.quorum/config.toml ships ready-to-uncomment blocks for claude, codex,
and opencode, plus a template for any custom agentic binary — uncomment one
and set default_harness. (Runs are unattended, so the harness needs
permission to act without asking; the shipped blocks use a scoped tool
allowlist, not a blanket bypass.)
Register a repo and queue work:
quorum doctor # verify the setup end to end
quorum project add ~/work/my-api
quorum task add my-api "fix the flaky auth tests and open a PR"
quorum up --detach # supervisor in the background (`quorum down` stops it)
(quorum up without --detach runs it in the foreground — Ctrl-C stops.)
Then:
quorum status # supervisor, agents, tasks, deadlines
quorum task tail a3f2k9 -f # live harness transcript
quorum task nudge a3f2k9 "prefer the retry approach over sleeps"
quorum manager tell "the api task is urgent; park everything else"
quorum manager journal # what the manager did, and why
quorum tui # dashboard; select a task, press n to steer
quorum web # http://127.0.0.1:8787
What it looks like
Adopt a live session
The work is already underway in an interactive session? Don't re-queue it — adopt it:
quorum integration install codex # once per harness (also: opencode, claude-code)
quorum task adopt "refactoring the auth flow" # from the session's directory
The session becomes an attached task: the manager observes it (liveness,
git state, reports) but never runs it — your nudges and the manager's pokes
are delivered inside the live session by the harness's hook the next time
it stops. quorum task detach hands it back to the headless runner. See
docs/guide.md#adopting-a-live-session
and the per-harness adapters under
integrations/.
How it works
- A task is a sequence of harness runs. Each run executes in the task's
own git worktree (
~/.quorum/worktrees/<id>), so parallel tasks on one repo never collide and your checkout stays clean. Session ids are captured from the harness's output so follow-up runs can--resume. - Status is the harness's own words. The run prompt teaches a simple
protocol — report progress with
quorum task report, check guidance withquorum task inbox— and the conventional flow isplanning → executing → reviewing → pr → done. Quorum records what the harness says; it never enforces a state machine. - The manager is an agent, not a ruleset. Each cycle it compiles a
situation digest — including its own recent actions and whether they
changed anything — and your harness decides what to do, with real
authority:
task run,task nudge,task add,task cancel, escalate. Every action is auto-journaled (quorum manager journal); the journal feeds back into the next digest so the manager never loops on an intervention that isn't working. Steer it withquorum manager tell. - Guidance is a message, not a keystroke. Your nudges and the manager's pokes travel the same file-based inbox; the next run starts with them in its prompt, and a cooperative harness picks them up mid-run.
- Failure is loud and recovery is automatic. If your LLM service goes down, every harness-driven tick fails visibly — and keeps being scheduled, so the first tick after service returns reads the world from files and relaunches whatever died. No degraded fallback mode to babysit.
- All state is files under
QUORUM_HOME(default~/.quorum): task records, transcripts, a message board, inboxes — written with atomic tmp+rename. The TUI and web dashboard are pure readers and work even when the supervisor is down. Copy the directory and your whole setup moves.
Supervision policy is a prompt
~/.quorum/prompts/manager.md is the manager's constitution: how patient it
is, when it escalates, how it words its pokes, when creating follow-up work
is warranted. Edit it to retune your manager; delete it to restore the
default. (An optional [llm] section separately gives plugin agents a
small-completion client — the manager and tasks run your full harness
directly.)
Optional sandbox
Quorum pairs naturally with nono
(kernel-enforced sandboxing via Landlock/Seatbelt): wrap the whole thing with
nono run --profile quorum -- quorum up, or set [sandbox] use_nono = true
to confine each task run to its worktree plus QUORUM_HOME. Fails closed:
if sandboxing was requested and nono-py is missing, nothing runs unsandboxed.
See docs/guide.md.
Customizing
- Configure harnesses, schedules, and the manager's action budget in
config.toml— quorum never rewrites that file. - Retune the task preamble and the manager's policy by editing
~/.quorum/prompts/*.md; delete a file to restore the default. - Extend with your own agents: drop a ~20-line Python file into
~/.quorum/plugins/— examples/steward.py is a complete worked example (a rule-based file organizer with undo).
Everything above, in depth: docs/guide.md. Design record: docs/architecture.md.
Development
uv sync --all-extras
uv run pytest
uv run ruff check .
Repo conventions and the layer-by-layer map live in CLAUDE.md.
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 quorum_orchestrator-0.1.0.tar.gz.
File metadata
- Download URL: quorum_orchestrator-0.1.0.tar.gz
- Upload date:
- Size: 454.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4c8a17904e97a452daaa723bf72ac20a4dd7936948b7045c737cf70eb1de9ad
|
|
| MD5 |
216a6c313257e81c0a214514e324909e
|
|
| BLAKE2b-256 |
a537af0e75a0a069fc4d00e31ed89bf0ab5fd9af772864fcc3b5f5b16b4f4d87
|
Provenance
The following attestation bundles were made for quorum_orchestrator-0.1.0.tar.gz:
Publisher:
release.yml on kvndhrty/quorum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quorum_orchestrator-0.1.0.tar.gz -
Subject digest:
b4c8a17904e97a452daaa723bf72ac20a4dd7936948b7045c737cf70eb1de9ad - Sigstore transparency entry: 2644042423
- Sigstore integration time:
-
Permalink:
kvndhrty/quorum@89a8a172afc9fa440d112f0a1cf8807cbfc7a05c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kvndhrty
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@89a8a172afc9fa440d112f0a1cf8807cbfc7a05c -
Trigger Event:
push
-
Statement type:
File details
Details for the file quorum_orchestrator-0.1.0-py3-none-any.whl.
File metadata
- Download URL: quorum_orchestrator-0.1.0-py3-none-any.whl
- Upload date:
- Size: 99.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fbdae81d0fbde14c7ed99b938cec1f9efbd6674f82a00eb228408bf6bab72b7
|
|
| MD5 |
2b39b153717e6000fe7cec569e8f9936
|
|
| BLAKE2b-256 |
b63d9b0db1366233fa6fa39aff61c542b15b1a8eaeeda20715e98aed85a7edc0
|
Provenance
The following attestation bundles were made for quorum_orchestrator-0.1.0-py3-none-any.whl:
Publisher:
release.yml on kvndhrty/quorum
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
quorum_orchestrator-0.1.0-py3-none-any.whl -
Subject digest:
8fbdae81d0fbde14c7ed99b938cec1f9efbd6674f82a00eb228408bf6bab72b7 - Sigstore transparency entry: 2644042451
- Sigstore integration time:
-
Permalink:
kvndhrty/quorum@89a8a172afc9fa440d112f0a1cf8807cbfc7a05c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/kvndhrty
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@89a8a172afc9fa440d112f0a1cf8807cbfc7a05c -
Trigger Event:
push
-
Statement type: