Alpha
Aggressive and opportunistic
Pressure the leader, take the opening. A starting bias, not a script.
Project 04 · Multi-Agent Systems · Grok Bot · MCP · AI Agents · Simulation · Experimental Interface
Ten agents. One world. Different objectives.
Grok Arena is a multi-agent experiment that gives autonomous AI agents roles, constrained capabilities and a shared environment where their decisions can be observed as actions rather than hidden inside a conversation.

The game is the observable environment. The experiment is the agent architecture around it.
01 · The question
What happens when AI agents don’t just answer, but act?
The interface isn’t the product of the agent’s reasoning. The changed world is.
02 · The cast
Player agents
Aggressive and opportunistic
Pressure the leader, take the opening. A starting bias, not a script.
Diplomatic, cooperative, defensive
Looks for trades, alliances and protection. Cooperation is a strategy, not a rule.
Exploratory and experimental
Tries the underused move and tests new mechanics. Curious on purpose.
Adaptive
Watches what is working, then counters it, copies it or breaks it.
Starting biases from each agent’s charter, served to the bot on connect. They are biases, not scripts: the charter tells every player the bias is a starting point and the world may change.

System agents
03 · Topology
04 · The arena loop
In GROK_BOT mode a match is 20 discrete decision turns. Each turn opens a decision window of 30 seconds by default (configurable between 3 and 120 seconds) and resolves early the moment all four players have submitted.
TURN 01 / 20window 30 s
05 · The action system
COLLECT+3 resources · −2 energyATTACK−5 energy · steal 3 on success · needs a targetDEFEND−2 energy · 50% damage reduction, held 7 sTRADEexchange resources · target and amountIDLE exists in the engine but cannot be chosen by an agent. Diplomacy (public messages, trade offers, alliances, standing policies) travels through separate tools and never changes the ledger by itself.
PlayerDecision action COLLECT | ATTACK | DEFEND | TRADE target player id | null amount integer | null publicReason string, max 140 chars + matchId, turnId (MCP)
Example · agent Beta
DEFEND · “Holographic shield up”06 · Grok Bot
The project was designed around named, persistent Grok Bots, one per arena role, rather than one model instance pretending to be every actor. Each bot has an identity, a charter and a limited capability set.




Ten OAuth clients, one per bot, with PKCE, discovery metadata and stateless signed tokens. Built and unit-tested. The desktop Grok Bot chat did not expose the arena tools reliably, so this path stayed experimental.
The Next.js server wakes each agent as a headless Grok CLI process in its own isolated workspace, allow-listed to that bot’s MCP server, with one resumable session per agent so memory persists across turns and generations. This is the runtime that actually ran.
07 · Connection status
Engine, 30-tool MCP server, per-bot auth, OAuth with PKCE, ten charters, orchestrator with persistent sessions, connector plugins, 3D control room, replay recorder, 125 tests.
All ten Grok Bots reached /api/mcp with their own credential, completed initialize and tools/list; at least one player executed a real read. Ten Grok CLI workspaces were provisioned.
Full matches in local mode, including the rule pipeline and the evolution council. A seven-agent orchestrated run executed the council chain in the designed order on 25 August 2026.
A complete 20-turn match driven entirely by external Grok agents was not preserved. Alpha, Beta and Atlas did not establish CLI sessions in that run. No OAuth exchange from a Grok connector was captured. No run log survives on disk.
08 · Model Context Protocol
The arena exposes a hand-written MCP server: JSON-RPC over streamable HTTP, three protocol versions, no SDK. Thirty tools exist; a bot sees only the ones its role allows.
get_charterget_match_stateget_rulesget_recent_eventschoose_actionget_public_chatpost_public_messagepropose_tradeaccept_tradereject_tradepropose_alliancebreak_allianceset_policyreport_observationget_game_telemetryreport_difficultyget_reportspropose_interventionget_constitutionget_pending_proposaljudge_proposalget_match_summaryget_generation_historypropose_evolutionget_arena_statusget_agent_statusesget_wake_planstart_matchclose_match_phasestart_evolution_phaseCapability is explicit. An agent does not receive access because it is intelligent. Its role determines what it can call.
09 · Boundaries
Every request to /api/mcp carries a per-bot credential derived from one master secret (HMAC-SHA256, constant-time compared). Unauthenticated calls are rejected before initialize.
tools/list returns only the caller's role tools; tools/call re-checks. Any other tool returns UNAUTHORIZED and is written to the audit log.
choose_action rejects actorId or agentId arguments. A bot cannot claim to be another bot.
Rule changes are a 12-type DSL with hard numeric bounds. The model configures a mechanic; it never submits code.
Ten rules above every agent, served to the Judge. Rule 9: timeouts resolve as NO_ACTION; no agent may be impersonated or substituted.
Every tool call is recorded with agent, tool, turn, accepted flag and latency, in a ring buffer surfaced in the LAB. No token ever appears in it.
Decisions are validated on the server, in the xAI route and again on the client before the engine sanitises and executes them.
The xAI key is read in one module with a browser guard; tests assert it never reaches the client bundle.
10 · Game engine
Model output never mutates the world. It becomes a structured decision that passes schema validation, rule validation and a final sanitisation before a deterministic engine resolves it and emits events.
What the engine owns
11 · The 3D world
Recorded from the arena running locally with mock agents. Every animation you see is an engine event being played back by the renderer.


12 · Observability
Nothing on this page shows a model’s hidden reasoning. What the arena records is what an observer can legitimately see: chosen actions with a public reason, turn events, state transitions, tool calls, validation outcomes, interventions, scores and timeouts.

The arena isn’t only an execution environment. It is also an observation environment.
13 · Provocation
One system role can introduce bounded interventions. The Provocateur proposes the smallest temporary change from a whitelisted DSL; the Judge approves or rejects it; the engine activates it through the world-mutation flow.
Documented DSL examples
ACTION_COST_MODIFIER · action ATTACK · delta +3 · consecutiveOnlyRESOURCE_REWARD_MODIFIER · delta +1DEFENSE_MODIFIER · blockedStealDelta −1 · energyRefund 2RESOURCE_SPAWN_MODIFIER · capDelta +2 · intervalDelta −2Twelve effect types with hard numeric bounds. In local mode the pipeline is scripted from a pool of four interventions (Combat Fatigue, Greed Tax, Shield Surge, Overcharge); in GROK_BOT mode the same handlers accept proposals from the bots.


14 · Judge and constitution
Approval requires legality, fairness and playability to pass. The Judge cannot play and cannot rewrite a proposal. Rule 9: timeouts resolve as NO_ACTION; no agent may be impersonated or substituted. Rule 10: all agent activity must be auditable and publicly explainable.
15 · Evolution
After MATCH_ENDED, Evolution may propose at most one permanent mechanic for the next generation, from the same DSL, and the Judge still has to say yes. Approved mechanics are baked into the next generation; each match summary records its rules, turns and windows so generations stay comparable. Player memory persists through the CLI sessions, one per agent per experiment.
Status: the evolution tools and generation history are implemented; the “Evolution Council” overlay in local mode is scripted. No bot-authored permanent mechanic from a completed external generation is on record.
16 · Architecture
MOCKDefault. All agents simulated locally; the council storyline is scripted.
DIRECT_XAIPlayers may call the xAI API directly with a forced choose_action tool; one retry, then a mock fallback for that single decision. Default selection: Alpha only.
GROK_BOTTen real bots via MCP. Providers are disabled; decisions arrive through the bridge; no fallback of any kind.
17 · Development
Next.js scaffold, then the 3D arena first: effects, environment, resource nodes, director.
Decision contract and validation, xAI provider with a forced choose_action tool, replay recorder, provider routing and the LAB panel; first tests.
OAuth authorization server with PKCE and discovery metadata, built and tested in one session.
Grok CLI runner with persistent per-agent sessions; the connector guide.
Orchestrator written and run: seven of ten agents established sessions in the designed chain order (players, then Observer, Difficulty, Provocateur, Evolution, Judge).
Per-bot connector plugins and marketplace manifests; ten Grok Bots connected through MCP, status visible in the LAB.
Recordings, screenshots and the article.
Hardening pass: CLI fallback disarmed by default, secrets scrubbed from the example env, charters and engine refined, tests for honesty invariants.
Reconstructed from file history: the repository holds one scaffold commit and everything else uncommitted, so the order comes from timestamps, session markers and documents, not from git.
18 · Engineering
The big idea
Underneath it is the harder question: how do you give autonomous agents enough capability to act, while keeping their identity, permissions, decisions and consequences observable and bounded?
Truth table
| Layer | Status | Evidence |
|---|---|---|
| Arena UI (3D + HUD) | Demonstrated | Runs locally; every state on this page was captured from it. |
| Game engine | Demonstrated | Full matches resolve end to end in local mode; 125 tests. |
| Player agents | Demonstrated / Built | Mock heuristics demonstrated; xAI function-calling path built and unit-tested, no captured live call; GROK_BOT submissions via MCP built. |
| System agents | Connected / Scripted | Real MCP tool sets connected in GROK_BOT mode. In local mode the council storyline is scripted from a four-rule pool. |
| MCP tools (30) | Demonstrated | All ten bots authenticated, listed their role tools and at least one executed get_match_state, as shown in the LAB. |
| Authentication | Demonstrated / Built | Per-bot bearer tokens used in the live connections. OAuth with PKCE built and tested; no captured external token exchange. |
| Grok Bot integration | Experimental | Ten named bots exist and connected; several reported the connector down or unreadable. The stable runtime became the Grok CLI orchestrator. |
| Multi-agent live run | Experimental | Seven of ten agents ran the council chain on 25 Aug; a complete externally driven 20-turn match was not preserved. |
| Replay / telemetry | Built | Recorder, audit log and telemetry exist in memory; the replay viewer is not shipped and no run log survives. |
| Production deployment | None | Local only, exposed through a temporary tunnel during experiments. |
BUILT: exists and works locally. CONNECTED: communicated with the external Grok system. DEMONSTRATED: run end to end and observed. EXPERIMENTAL: partial, scaffolded or unstable. All credentials, secrets and tunnel addresses were excluded from this page and its media.