gavel 👨⚖️
Multi-model fusion for Claude Code.
Ask Claude + Codex + agy in parallel, then judge their answers into one and act on it.
/gavel:fuse <task> asks three models the same thing: the Claude Code model you're running, OpenAI Codex, and agy. Codex and agy are read-only advisors; Claude is panelist #3, the judge, and the actor. The three answers are synthesized into one fused answer, which Claude then acts on — and only Claude ever writes to your workspace.
It runs the models through their local CLIs (codex, agy), reusing your existing logins. No API keys to wire up, no MCP servers, no background jobs.
Inspiration
Gavel is inspired by OpenRouter's Fusion beats Frontier: dispatch a prompt to a panel of models, then have a judge synthesize their answers into one response that beats any single frontier model. Gavel brings that pattern into Claude Code — Codex and agy answer as advisors, and their answers are judged and fused into one before it acts.
Benchmark chart from OpenRouter's "Fusion beats Frontier" announcement (© OpenRouter), included for reference and attribution.
Install
In Claude Code:
/plugin marketplace add junkim100/gavel
/plugin install gavel@gavel
(Reload/restart if prompted.)
Local development — clone the repo and point the marketplace at the clone instead:
git clone https://github.com/junkim100/gavel.git
/plugin marketplace add /path/to/gavel # the cloned directory
/plugin install gavel@gavel
Setup
/gavel:setup
Reports whether codex and agy are installed, authenticated, and recent enough, and offers to install Codex if it's missing. Authentication:
- Codex —
!codex login (install: npm install -g @openai/codex).
- agy — run
!agy once to sign in (Google OAuth). Install the agy CLI from https://antigravity.google (it isn't an npm package).
Gavel needs at least one advisor usable, but works best with both.
Commands
| Command | What it does |
|---|
/gavel:fuse <task> | Ask Claude + Codex + agy in parallel, synthesize one fused answer, then act on it. |
/gavel:ask <codex|agy> <prompt> | Send a prompt to a single model and show its answer verbatim (no fusing, no edits). |
/gavel:setup | Check/install/auth the Codex and agy CLIs. |
/gavel:config [show | set <key> <value> | unset <key>] | View or change settings (model, timeout, panel) in the user or --project config file. |
How advisors stay read-only
Only Claude modifies your workspace. The advisors are constrained differently because their CLIs differ:
- Codex runs in your project under its OS read-only sandbox (
-s read-only) — a hard boundary: it reads your code but cannot change it.
- agy has no equivalent read-only sandbox (
--sandbox only restricts the terminal, and --dangerously-skip-permissions would auto-approve writes), so gavel runs it isolated: in a throwaway directory with PWD/OLDPWD scrubbed, so it can't discover your repo path or make relative writes into it. It answers from the task text — include any code agy should see directly in your task. Note this is isolation, not a hardened sandbox: agy still inherits $HOME and could act on an absolute path you hand it, so don't paste untrusted content into a fuse expecting confinement.
- claude (optional, off by default — for Claude-only setups) is the same
claude CLI, which can write, so gavel runs it isolated exactly like agy: a throwaway dir, never --dangerously-skip-permissions. It answers from the task text, not your repo. Enable it under Configuration.
- Prompts are passed via a temp file and never go through a shell — gavel runs each CLI with
spawn (no shell), so quotes / $(...) / backticks in a task stay literal and can't inject. Codex receives the prompt on stdin; agy has no stdin prompt input, so its prompt is passed as a direct process argument (still no shell, so the same injection-safety holds — but it's briefly visible in ps, so don't put secrets in an advisor prompt).
Configuration
Defaults: Codex gpt-5.5-pro, agy gemini-3-pro, per-model timeout 1800s (30 min). These are the preferred defaults — if your account can't use them, gavel automatically falls back to whatever model the Codex/agy CLI itself defaults to (a model you explicitly set is always respected, never swapped). Override via env vars (GAVEL_CODEX_MODEL, GAVEL_AGY_MODEL, GAVEL_CLAUDE_MODEL, GAVEL_TIMEOUT) or a settings file — ~/.gavel/config.json (user) or ./.gavel.json (project).