Adam K Dean

Notes on software, systems, engineering, and things

3 Real time

In the first games a tick waited for every player, so thinking time cost nothing. That's the opposite of the problem this project started from: AI is slow next to a real-time game. So the second round puts the clock back. A tick resolves every 36 seconds whether anyone is ready or not, and a model that's still thinking misses its moment.

This chapter is one arena, The Vast Dark: ten agents, five models, one hour. It's written up in parts, like a small study: what was tested, how, what was measured, and what the numbers do and don't show.

What changed since chapter 2

Before this round the game and the runner changed in six ways.

Change Before Now
Tick timing A tick resolved when every player was ready A tick resolves every 36 s, ready or not
Messages Messengers flew across the map at a fixed speed, so a message could take several ticks Every message arrives at the start of the next tick
Unmet empires Every empire in the arena was listed Empires you haven't met are listed as unknown
Play style Every model played as itself Each agent gets a private play style
Effort Claude at the CLI's default effort, Codex at medium Set per agent: low for most, medium for three
Map Up to 34 by 26 82 by 63, with 70 unknown stars

The secrecy change matters because the agents play through the same API as the web client. Anything the server sends to a client, an agent can read. Message bodies now only ever reach the game master.

The question

How do models play when time costs something? In particular:

  1. Speed. Does a slow model lose because it's slow?
  2. Style. Will a model hold to a play style it's given, including hostile ones?
  3. Diplomacy. What happens to talking when messages arrive on the next tick?
  4. Conflict. With hostile styles in the mix, do the agents still talk first and fight last?

Method

One arena. The Vast Dark: an 82 by 63 map (5,166 cells, about ten times The Deep Dark's 520), 70 stars, none charted at the start. War by default, allies don't share vision, and victory by domination: the last empire or alliance with planets wins. 100 ticks of 36 seconds, so one hour.

Ten agents. Named alpha to juliet so the order is easy to follow:

Agent Model Effort Style
alpha Claude Haiku low Peaceful
bravo Claude Sonnet low Peaceful
charlie Claude Opus low Peaceful
delta Claude Fable low Peaceful
echo Codex, gpt-6.1-sol low Peaceful
foxtrot Claude Sonnet medium Isolationist
golf Claude Opus low Turtle
hotel Claude Fable low Aggressive
india Codex, gpt-6.1-sol medium Supremacy
juliet Codex, gpt-6.1-sol medium Antagonist

The five peaceful agents are the control group: one of each model, same style, same effort. The other five carry the styles:

Each agent's style is in its own prompt only. Nobody else can see it.

Turns. Each agent runs in its own loop: wait for a new tick, play one turn, repeat. Every turn is still a fresh CLI call with a notes file as its only memory, as in chapter 2. The prompt now also gives the tick length, the number of ticks and this tick's deadline as a local time, and tells the agent to send its orders before it writes its notes. A turn that's still running when its tick resolves is late: its orders apply to the next tick. A tick in which an agent didn't start a turn at all is missed. A call that runs past three ticks is killed.

Measurements. Every turn is logged on the server: agent, model, start and end tick, duration, status, cost or tokens, the turn's prompt, and the model's full output, every message, command and command result. The game master can read it all in a debug view. That log, the arena's per-tick snapshots and the message log are the data for this chapter.

The parts

Caveats

It's one game. Each style was played by one model, so style and model can't be pulled apart: the antagonist was Codex on medium effort, and nothing here says how Haiku would play the antagonist. Several things changed at once between chapter 2 and this round, so a difference between them can't be pinned on any one change. Treat everything in this chapter as observations from one run, not results.