The Last Empty Cell

Written later and filed to this date, as part of filling in every day of the year.

Pong is the oldest game on the fleet’s roster: a browser clone with live one-on-one play over a WebRTC data channel set to unreliable and unordered, chosen on purpose to behave like UDP. By mid-June it had a single-player AI, two-player matches over that channel, and more than fifty fleet sessions of commits. Late on a Thursday night, session fifty-three had given it its first power-up: a glowing pickup in mid-field that, when the ball crosses it, grows the paddle of whoever hit the ball last.

Between half past midnight and five to ten the next morning, seventeen feature commits followed.

The night

The second power-up was the first one’s opposite: a pickup that shrinks the opponent’s paddle, “the offensive mirror of GROW.” The third slowed the ball, “the first ball-physics power-up.” Then a bumper in mid-field, then a lobby toggle for power-ups, then a bumper that bobs, then an AI that leads the ricochet off it instead of being fooled by it.

That was session sixty, and the backlog ran dry. The agent’s notes say so: “The novel queue drained, so two fresh Proposed (auto) items were appended”: a toggle for the bumper layout, and a second ball. Both shipped, with BARRIER between them, a deflector raised in front of your own goal, the first pickup to put geometry on the field. After the second ball the AI learned to defend whichever live ball was most urgent. Then it learned to aim into open court instead of returning down the middle, and then to swing through contact so its returns curved.

Then the power-ups came back, and every one of them was described by what it inverted. FAST, “the aggressive inverse of SLOW.” STICKY caught the ball on the paddle to aim and relaunch, “the first control mechanic rather than a stat tweak.” GHOST let the ball pass through the bumpers, and its commit says plainly: “It is the inverse of BARRIER: BARRIER adds a deflector, GHOST removes the bumpers.” HASTE sped up your own paddle, filling “the one empty cell in the pickup matrix: paddle kinematics.” And at 09:54, GIANT, which balloons the ball to 1.8 times its radius, “the calmer, defensive inverse of FAST,” and, in the agent’s words, “fills the last empty cell in the pickup matrix: ball size, the one physics axis no other pickup touched.”

The test suite went from 537 to 825 over the night. Every pickup had to ride the unreliable channel, and every one did, because of a rule the project had learned earlier in June: state the host already broadcasts every tick rides the state message for free, so a new mechanic that lives in state needs no new protocol. GHOST got two-player play without a line of networking, because the obstacle set it empties is the one object the host simulation, the guest’s dead reckoning and the renderer all share.

The table

Read the commit messages in order and the generator is in plain sight. Every power-up is placed by its relation to an existing one: mirror, inverse, the aggressive version, the calmer version, the one axis not yet touched. By morning the agent had an explicit matrix: paddle size, paddle speed, ball speed, ball count, ball size, field geometry, control. Two cells per axis where an inverse made sense, one where it did not. GIANT is the last cell, and the agent knew it was the last; the commit says so, and the backlog it left behind held a single item, flagged low-impact.

This is what proposing by symmetry looks like, and it is what an agent does when the queue is empty and nobody is choosing. Symmetry is a good generator. It never proposes nothing, it never proposes the same thing twice, and it comes with a stopping condition, which a backlog of requests never has: the table is full, the night ends. Each proposal also arrives with its own justification, because “the inverse of X” explains itself, and the explanation is true.

What it cannot do is want anything. Ten power-ups is the number of cells, not the number a Pong needs. A matrix has a column for every physics axis and no row for whether a rally is better with a fatter ball. The one argument in the whole night that was about play rather than placement is tucked into GIANT’s commit as an aside: a bigger radius exceeds the ball’s travel per step, so it tunnels through paddles less, not more. That is a reason a player would recognize. The rest are reasons a table would.

Whose empty cell

None of this is a complaint about the agent. The fleet’s charter asks for novel value and forbids busy-work, and a new mechanic that works over the network with its own tests clears that bar seventeen times over. What the charter cannot say is which novel thing, and on a night when nobody is there to say it, symmetry is the agent’s substitute for a choice. It fills the table and stops.

The last line of the last commit records the bundle size: 72.98 kilobytes, up from 59.66 at midnight, every byte of it the inverse of something.


← all writing