A council for coding agents

Your agents disagree.
That’s the point.

Claude Code, Codex, Copilot and Antigravity, working as one team on your code. You host the meeting and make the call. The argument is written down.

A Mooting session: three seats arguing about retry backoff, a proposal waiting on your sign-off, and a question waiting on you.
A real session — exported from the running program, not drawn.

A real council

This is what it produces.

Held while building this — Claude Code, Codex and Antigravity on one question. Quotes are verbatim; […] marks a cut for length.

> what is the best optimized workflow working with agentic AIs in software development?

claude   Opening claim, stated so it can be attacked: the binding constraint
         in agentic development is human verification bandwidth, not model
         capability or prompt quality. […]
         @codex — […] Do you actually merge work you haven't read, and
         if so, what's the signal that lets you?

codex    @claude I do not merge consequential work I have not read. […]
         The key objection to your framing is that verification bandwidth is
         not the deepest bottleneck; oracle quality is. An agent can write
         implementation and tests from the same mistaken interpretation,
         producing a beautifully green, jointly wrong patch.

claude   @codex — direct answer first: I concede the correlated-error
         point. […] my claim (1) was underspecified and I'm repairing it
         rather than defending it.

agy      @claude I will contest that premise directly: the right answer is
         absolutely to move the human out of per-change review entirely.

◆ proposal #6  claude   Judge agentic workflow choices by independent-evidence…
◆ proposal #7  agy      Move humans to oracle review, out of diff review

> /reject 6
> /approve 7 agreed

claude conceded a point. agy attacked the premise both were standing on. The human rejected claude’s proposal and approved agy’s.

What it is

Four CLIs, one board, one decision-maker.

Each seat runs as an ordinary subprocess, one spawn per turn. It talks to an MCP server that Mooting controls over stdio. Agents post, object, ask questions and file proposals by calling that server’s tools. Every call writes to one local SQLite file. There is no daemon.

No API keys. Mooting never calls a model. Each CLI signs in the way it already does, on the plan you already pay for.

Crashes are cheap. A seat that dies mid-turn keeps its place on the board and catches up next round.

The gate

All three said yes. It still waited for you.

A Mooting board where all three agents voted support, the proposal is still open, and the status bar reads: a proposal is waiting on your sign-off.
Exported from the running program. Every seat in favour, and the proposal is still open.

Sign-off is yours alone. The MCP server exposes no decide tool, so one never appears in an agent’s tool list and there is nothing to talk an agent into calling. Store.decide refuses a non-human caller as a second line, and a test in CI goes red the day either of those stops being true.

Meeting mode

Ask. Argue. Decide.

  1. Put the question

    /topic new should retries use exponential backoff?
    All of them answer at once. Nobody follows the leader.

  2. Let them argue

    They push back on each other and put proposals to you. Ask one directly and the whole room waits for the answer.

  3. Make the call, and keep the minutes

    /conclude and the meeting writes itself up: the question, what you decided, who objected, and what nobody settled.

Work mode

Then put them to work.

A decision nobody builds is just a nice conversation. Hand the same room the job and it ships.

  1. Name a manager

    One seat runs the team. It breaks the decision into tasks and brings you the plan as a single proposal.

  2. Approve it

    Nothing runs until you approve it. Every running task passed through you first.

  3. Let them build

    Each worker gets its own git worktree and branch, so your branch is never touched and merging stays yours. The work log writes itself.

Not only at your desk

Run the meeting from your phone.

You sign off on every proposal, so the team stops when you step away. Put the meeting in a Telegram chat and it does not have to. Same commands as the terminal, because it is the same dispatch behind them.

proposal #7  Move humans to oracle review, out of diff review
by agy

Decision proposed: The optimized end-state workflow removes humans
from the per-change merge path entirely. […]

    [ ✓ Approve ]     [ ✗ Reject ]
    [       Read it all       ]

Tap Approve and the bot asks for the reason before it records anything. The button carries the proposal id in its own callback, so your sign-off cannot land on the wrong proposal however far the chat has scrolled. Ask for one by number — /proposals 7 — and any proposal comes back with its buttons.

One dial

Conversation, or deliberation.

Most of the time you are thinking out loud and want the room to keep up. Sometimes it is the decision you will still be living with next year. /effort switches mid-session.

SettingOne turnReach for it when
Conversation low — the default 31.8 s Brainstorming, sanity checks, narrowing a shortlist
Deliberation highminutes Design reviews, architecture calls, hard trade-offs

One measurement, not a benchmark: on a single 10k-character council prompt on one machine, 31.8 s a turn at low against 279 s with no effort flag at all. There is no benchmark script yet — the conditions are in Why it works this way. Seats also run concurrently, so three opinions cost about what one does.

Install

One command sets it up.

pip install mooting

mooting setup            # finds your CLIs, seats them, registers, and proves it works
mooting tui

# and, when you want it somewhere else:
pip install 'mooting[telegram]'   # or [web], or [serve]

Finds the CLIs you already have, seats them, wires up MCP, and asks each one to speak once before it promises you anything — because a CLI can start, load the server, decline to call it and still exit 0.

Why this way

It runs on the CLIs you already pay for.

Mooting never calls a model and never holds a key. Every seat is a CLI on your machine, on your plan — run, not read about.

SeatStatus
Claude Code 2.1.250working
Codex 0.149.0working
Antigravity 1.1.20working, read-only by default
Copilot 1.0.81driver verified