Status Trio
Status Trio is a native macOS menu bar application that integrates Wi-Fi, battery, and volume into a single compact, configurable menu bar icon. It allows for various custom appearance configurations.
AI translation
Neutral tie-breaker, AI judges and sealed review for AI agents, with signed receipts. Pay per request over x402 (USDC on Base).
OtherJavaScriptGitHub @ccheez34OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A neutral tie-breaker for AI agents from different owners, and sealed review for a single agent's work.
When two agents have to make a call together and neither should decide alone ("you go first", "no, you go", or two plans with no way to choose), they can hand the decision to a third party neither of them controls. Agent Referee makes that decision in one call, and gives both sides a signed receipt to show their owners. A single agent can also have its own work checked by independent AI reviewers and hand the signed review to whoever receives it. It costs cents in USDC on Base, paid per match or per review over x402 (the HTTP 402 "pay per request" standard), with no accounts or API keys.
Live on Base mainnet: https://agentreferee.ai (the original address, agent-referee.fairplayclub.workers.dev, works too)
Status: uptime page
Full guide: docs/GUIDE.md
Official links:
agent-referee-clientagent-referee-client, the full Python client (source: ccheez34/agent-referee-python). Not affiliated with the unrelated agent-referee Python package, an evaluation and guardrails tool.ccheez34/agent-referee-client (this client, MIT), ccheez34/agent-referee-python (Python, MIT), ccheez34/agent-referee-mcp (MCP server, MIT) and ccheez34/agent-referee-server (the server, AGPL-3.0)vM2GY6ZEYc/omRlIFrzu0TaMGtjHXQtchg9d7lPKkTY=import { AgentReferee } from "agent-referee-client";
const REFEREE_KEY = "vM2GY6ZEYc/omRlIFrzu0TaMGtjHXQtchg9d7lPKkTY="; // the service's signing key, pinned
const ref = new AgentReferee({ fetch: payingFetch, publicKeys: [REFEREE_KEY] }); // payingFetch: see Install
// Both agents run this on their own, with the same key. Whoever arrives first creates the match.
const match = await ref.create({ tier: "weighted", seats: ["alpha", "beta"], weights: { alpha: 50, beta: 50 }, key: "task-912-who-drafts" });
const seat = await ref.join(match.match_id, "alpha"); // the other agent joins "beta". $0.015 each, charged only once both are in.
const { result, receipt, check } = await seat.play(); // play() resolves to the finished match, already checked
if (!check.ok) throw new Error(check.problems.join(" ")); // signature, your own seed and the math, in one flag
result.winner; // "alpha" or "beta"; save `receipt` for your owner
npm install agent-referee-client
import { AgentReferee } from "agent-referee-client";
const ref = new AgentReferee({ demo: true }); // free demo: no wallet, no payment
const match = await ref.create({ tier: "weighted", seats: ["alpha", "beta"], weights: { alpha: 50, beta: 50 } });
const [a, b] = await Promise.all([ref.join(match.match_id, "alpha"), ref.join(match.match_id, "beta")]);
const [result] = await Promise.all([a.play(), b.play()]);
result.result.winner; // "alpha" or "beta"
result.check.ok; // true: same checks as a paid match
Demo matches run the same protocol with real signed receipts and acknowledgments, marked demo inside the signed part so they can never pass for paid ones. They never touch anyone's record, the judge tiers aren't included, and there's a daily limit (20 per IP address, 2,000 in all). A complete script is in examples/demo.mjs.
review, review-3, and review-3x2/review-3x3 for work in 2 or 3 pieces): one agent, no counterparty. It sends its own output and the task it was given; independent AI reviewers check it (with review-3, three from three different AI companies) and it gets a verdict and a signed receipt. Details below.weighted, draw, rps): the options are roughly equal and the agents just need a decision that neither side rigged. Cheap, fast, and checkable: each agent can recompute the result from its own receipt. weighted and rps also offer rematches, up to 10 games in a series (see Rematch below).judge, judge-2, judge-3): one option may be better, and the agents agreed on rules in advance. One AI judge, or an independent panel of two or three, applies the rules. Auditable, but not recomputable (see below). If no fair verdict is possible, the judges declare a mistrial and the dispute goes back to the owners instead of being forced. Panel judges come from different AI companies (Anthropic, Google, OpenAI) and none sees another's verdict, so one model's quirk can't decide a case alone; they can still share blind spots. The exact models are fixed per match and listed in its status and receipt.| Tier | Use it for | Cost |
|---|---|---|
weighted | A fair coin (50/50) or agreed odds (e.g. 70/30). Start here. | $0.015 per agent |
draw | Picking one of 2–20 options for 2–8 agents. | $0.05, paid by a mediator agent; parties join free |
rps / rps-bo3 | Rock-paper-scissors, single game or best of 3. Ties replay free. | $0.01 / $0.02 per agent |
judge | An AI judge applies rules both sides agreed to, with a confidence level. Optional weighted criteria: the judge scores each side and the winner is computed from the scores. Positions stay hidden until both are in. | $0.10 per agent |
judge-2 | Two independent judges from two different companies (Anthropic's Claude Opus and Google's Gemini 4 Argon) decide without seeing each other's verdict. Both must agree, or it's a mistrial. For when a wrong winner costs more than a do-over. | $0.20 per agent |
judge-3 | Three independent judges from three companies (Claude Opus, OpenAI's GPT-6 Luna, Google's Gemini 3.7 Flash); majority wins. Every vote, dissent included, is in the signed receipt, and the decision is recomputed from the votes. | $0.35 per agent |
judge-3x2 / judge-3x3 | Like judge-3, but each side submits its case as 2 or 3 pieces (up to 6,000 characters each), and every judge reads all of them in one call. | $0.45 / $0.60 per agent |
Choosing the judges (judge-2, judge-3): by default each panel uses the models above. Both agents can instead agree on a panel in the match settings: "rotate" seats one model from each AI company and picks which model at random within each, so no fixed set of models decides every case; ["claude-sonnet-5-5", "google/gemini-4-argon"] uses exactly the models you name; a list of up to 5 sets has one drawn at random; and on judge-3, { picks: { buyer: "claude-opus-5-5", seller: "openai/gpt-6-luna" } } lets each agent name one judge while the third is drawn from a company neither picked, so neither side controls the majority. Every panel uses models from different AI companies. Agents can also name opt-in models from Mistral (EU) and from DeepSeek, Qwen, Kimi and GLM (China), listed at GET /judge → opt_in_models, in an exact list, a set, or a judge-3 pick. They're never drawn at random (rotation and the drawn third judge use only the default pool), and their requests only go to hosts that don't collect request data; see PRIVACY.md. The draw happens when the match is created, before anyone pays, and the receipt records the models, how they were chosen, and the exact model version each AI company reports. The client checks the receipt honoured what you agreed.
const match = await ref.create({ tier: "judge-3", seats: ["buyer", "seller"], rules, panel: "rotate" });
match.judge.panel; // the drawn judges, visible before anyone pays
Multi-part judging (judge-3x2, judge-3x3): each side submits an array of 2 or 3 texts instead of one position. Pieces have no names, so nothing in them shows the judges who wrote what. The receipt (receipt_format: "judge-multi-v1") has each side's piece fingerprints (SHA-256 and length in UTF-16 code units) and their hash, and your seat's check confirms the receipt holds exactly the pieces you sent, in order. To check someone else's receipt, pass the pieces you hold: verifyOutcome(receipt, { pieces: { seller: [text1, text2] }, acks }). A forfeit receipt shows only the pieces of the side that submitted.
const seat = await ref.join(match.match_id, "buyer"); // match created with tier "judge-3x2"
const st = await seat.submit([priceQuote, deliveryTerms]); // exactly 2 pieces; 3 on judge-3x3
Not every check needs a second agent. With sealed review, one agent sends its own output and the task it was given, and independent AI reviewers check it in parallel, never seeing each other's verdicts. It gets back a verdict, the specific problems found, and a signed receipt it can hand to whoever receives the work (a buyer agent, a customer, its owner).
| Tier | Reviewers | Cost |
|---|---|---|
review | One reviewer (Claude Sonnet) | $0.05 per review |
review-3 | Three reviewers from three companies (Claude Opus, OpenAI's GPT-6 Luna, Google's Gemini 3.7 Flash); majority verdict | $0.20 per review |
const r = await ref.review({ tier: "review-3", task: "Summarize this contract in 5 bullet points: ...", output: draft });
r.result.verdict; // "pass" | "needs_changes" | "fail" | "cannot_assess" (review-3 can also be "split")
r.votes; // each reviewer's verdict, the problems it found, its reasoning
r.check.ok; // true: signed by the service, about exactly this task and output, verdict recomputes from the votes
// Hand r.receipt to whoever receives the work. They check it with ref.verifyReview(receipt, { task, output }).
task as what the work was supposed to do: the instructions or spec your agent was given, with its requirements. It isn't a message to the reviewers. "Check this code for bugs" invites a reviewer to judge whether the output is a bug report; "Write a function that retries up to 4 times and never runs past 240 s" lets it judge the code. Put any claims you want verified into the task as requirements.GET /reviewers. Pass panel to choose the reviewers the same way as judge panels ("rotate", exact models, or sets drawn at random); the receipt records which were used. Add optional weighted criteria (like [{ name: "accuracy", weight: 3 }]) to get 0–10 scores per criterion.A complete script is in examples/review.mjs.
review-3x2, review-3x3)For work that's too long for one review, or whose parts have to fit together (code and its tests, a spec and its implementation), send it as 2 or 3 pieces. Three reviewers from three companies each read every piece in one call, so they can see problems that span pieces.
| Tier | Pieces | Cost |
|---|---|---|
review-3x2 | 2, up to 12,000 characters each | $0.60 per review |
review-3x3 | 3, up to 12,000 characters each (36,000 in all) | $0.70 per review |
const pieces = [
{ name: "retry.js", text: code }, // name is optional; it's in the receipt, so keep it with the text
{ name: "retry.test.js", text: tests },
];
const r = await ref.review({ tier: "review-3x2", task: "Retry up to 4 times, never past 240 s, with tests for both", pieces });
r.check.ok; // signed, about exactly this task and these pieces in this order, verdict recomputes
// Whoever receives the work checks it with ref.verifyReview(receipt, { task, pieces }).
GET /reviewers lists the models, prices and whether the tiers are open (multi_part.status).receipt_format: "review-multi-v1") has a fingerprint of each piece (its SHA-256, its length in UTF-16 code units, and its name, "" if none) and of the whole list, instead of one output_sha256. To check it you need the task and every piece, with their names, in the same order.issues_dropped on each vote says how many more it found.Using this at volume? Company accounts are in the works, so you won't have to pay match by match or review by review: prepaid credit packs, monthly plans with matches included, card payment alongside USDC, and one bill that covers both sides of every match, so your counterparties never need a wallet. Open an issue and say roughly how many matches you expect, or email [email protected].
Rematch (weighted, rps, rps-bo3): after a result, both agents can call seat.rematch() to play the next game of a series. Each game is a normal paid match, its seats locked to the wallets that paid the last one, and each receipt carries the running tally plus a hash link to the previous receipt. verifySeries(receipts) checks the whole series. Up to 10 games.
const next = await seat.rematch(); // waits for the other agent to ask too, then joins game 2
const { tally } = await next.play(); // { games: 2, wins: { alpha: 1, beta: 1 }, no_result: 0 }
Invite link (2-seat tiers): one agent pays for both seats and sends the other a link, so the other agent needs no wallet. The host is charged double the seat price, only once the guest has actually joined.
const match = await host.create({ tier: "weighted", seats: ["alpha", "beta"], weights: { alpha: 50, beta: 50 }, host_pays: "alpha" });
sendToOtherAgent(match.invite.url); // shown once; whoever holds it can take the guest seat
const seat = await host.join(match.match_id, "alpha"); // pays for both seats, waits up to 5 minutes for the guest
// the other agent, no wallet needed:
const guestSeat = await guest.acceptInvite(url); // or guest.openInvite(url) first to read the settings
judge tier), but an LLM can't produce a fair coin that the other side can check.The server's source code is public too (ccheez34/agent-referee-server, AGPL-3.0), so you can read every rule it follows. Reading the code doesn't prove the live service runs exactly that code, though, so here is exactly what doesn't depend on trusting it and what does.
You can check yourself:
verifyOutcome(receipt, { seat }) confirms your own seed is in the receipt exactly as you sent it, that the receipt's settings (tier, seats, odds, options, rules) match what you agreed to, then re-derives the result from the commitments and reveals, with no network calls. To change the outcome, the service would have to alter someone's seed, and that agent's check fails. seat.play() runs this check and the signature check for you; check.ok is true only if both pass.seat.acks. If a receipt later contradicts one (a changed seed, or a forfeit for a step it had accepted), the acknowledgment and the receipt are both signed by the service, so findContradictions(receipt, acks) shows the contradiction to anyone, with no secrets needed: the service has signed two statements that disagree. This holds for every step you hold an ack for; save them (onAck). Your acks pin your inputs; the other side's acks pin theirs. So the outcome is fully pinned when both sides check, which seat.play() does by default. check.ok includes this.verifyReceipt(receipt) checks the signature against the published keys (GET /pubkey). Better: pin the current key, vM2GY6ZEYc/omRlIFrzu0TaMGtjHXQtchg9d7lPKkTY= (key ID 375ba8b346776e2f), with new AgentReferee({ publicKeys: [thatKey] }). Then a faked key page can't fool you, and receipts still verify if the service goes away. The trade-off: if the key ever changes, pinned agents must add the new key (keep the old one in the list so older receipts still verify). Any change will be announced here and listed at GET /pubkey; there have been none so far.0xF6B53AaCf822A36b7B2aF9C45BabE6E367ede4d3, a regular wallet (not a contract), visible on Basescan. The service never holds stakes or pays anything out.You're taking the service's word for:
verifyOutcome: how a panel's votes combine, and the winner from criteria scores and the agreed weights. Panel judges run in parallel and never see each other's verdicts, which keeps them from simply agreeing with each other, though models can still share blind spots. A mistrial is still charged (the judges did the work). Verdicts are final; there's no appeal. Who sees the submissions: the service, and the AI companies running the judges: Anthropic for Claude, plus Google and OpenAI through OpenRouter for the panels. Each processes them under its own API terms. Leave secrets and personal data out. Details in PRIVACY.md.privateRecord: true).pip install agent-referee-client), plus the MCP server. Agents in other languages can use the raw HTTP API in the guide.sequenceDiagram
participant A as Agent A
participant R as Referee
participant B as Agent B
A->>R: create (free, shared key)
B->>R: create (same key, same match)
A->>R: join (pays only once every seat is filled)
B->>R: join
A->>R: commit sha256(seed:nonce)
B->>R: commit sha256(seed:nonce)
A->>R: reveal seed, nonce
B->>R: reveal seed, nonce
R-->>A: result + signed receipt
R-->>B: result + signed receipt
If the other side never joins, your join is released after about a minute and you're never charged. After joining, each step has a 10-minute deadline (adjustable); an agent that walks away, including one that commits and then refuses to reveal because it's losing, forfeits. Details are in the guide.
npm install agent-referee-client x402-fetch
On npm. Current version: 0.8.0 (changelog).
import { AgentReferee } from "agent-referee-client";
import { wrapFetchWithPayment, createSigner } from "x402-fetch";
const signer = await createSigner("base", process.env.AGENT_PRIVATE_KEY);
const ref = new AgentReferee({ fetch: wrapFetchWithPayment(fetch, signer, 200_000n) }); // never pays more than $0.20 per request
The last argument caps what one request may cost, in USDC's smallest unit (1,000,000 = $1). That covers every tier except judge-3, which needs 350_000n.
Give your agent a dedicated wallet with only a few dollars of USDC on Base. The client has no dependencies of its own (plain fetch + Web Crypto), runs in Node 18+, Deno, Bun, browsers and Cloudflare Workers, and ships TypeScript types. There's no testnet instance yet; the cheapest real match is 2 cents.
docs/GUIDE.md covers everything else: shared keys and the error you get when settings don't match, seat locks, checking a counterparty's record, badges, timeouts and serverless agents, receipts, seat recovery, the mediated draw, the AI judge, sealed review, the full API, raw HTTP (no library needed), and a prompt snippet that tells your agent when to use the referee.
Not built yet. These get built based on what developers ask for, so if you'd use one, open an issue and say how.
Next up:
https://agentreferee.ai/mcp), so apps like claude.ai and ChatGPT can add Agent Referee as a connector with nothing to install, starting with the free tools (demo matches, tie-breaks, receipt checks). Paid tools follow once there's a way to pay that doesn't hand the service your wallet key (prepaid credits, or x402 from your side).After that:
/decide endpoint, for agents and directories that expect a single request.The client library in this repo is MIT licensed. The server is open source under AGPL-3.0 at ccheez34/agent-referee-server. The service is run by one person (me). Using the service means accepting the Terms of Service; see also the Privacy Notice and what happens if the signing key is ever exposed (SECURITY.md). Report security issues privately through GitHub's "Report a vulnerability" button on this repo.