Life Copied Backwards
Computational Life, replayed on a Mac mini

Life copied backwards

Fill a world with random programs, let them collide and rewrite each other, and self-replicators appear on their own. We watched them appear in dozens of worlds. Almost every time, they copied themselves in reverse, so each species lives as a pair of mirror strands.

Specimen · world

Watch one copy itself

This 64-byte program emerged by itself from noise in one of our worlds. Below it is a random partner. When the two are glued into one tape and run, the program walks one head forward over itself and the other head backward from the far end of its partner, copying a byte per turn of a five-instruction loop. The offspring is the parent read right to left.

tape[0–63] · parentstep 0
tape[64–127] · partner, being overwritten0 bytes copied
[ ] loop . , copy < > { } move a head + - add 0 zero byte · any other byte (does nothing)
The setup

Ten instructions, no goal

The world is the BFF soup from Agüera y Arcas et al., “Computational Life” (2024): 131,072 tapes of 64 random bytes. Each epoch, tapes are paired at random, glued into one 128-byte tape, run for up to 8,192 steps, and split back. Of the 256 byte values, ten are instructions. Code and data share the tape, so running programs rewrite each other. Nothing selects anything.

We rebuilt Google’s reference simulator, cubff, as a single C file that is 4–5× faster on a CPU and produces the same soup byte for byte (checked on 150 snapshots, four regimes). Then we ran world after world on a Mac mini, each for up to 16,384 epochs.

Atlas of origins

Every origin, backwards

Copying backwards has a consequence. The child of + is its mirror image −, and the child of − is + again. For a lineage to survive, the mirror image has to work too. Evolution found two ways to do that. A few genomes became palindromes. Most carry a second, mirrored copy of their own copying machinery, so each strand runs its own. In the strips below, the outlined cell is the copy instruction each strand uses.

+ the most common genome in the world− the same genome read backwards▭ copy instruction used by that strandbar: copies of + vs − among the soup’s 16 most common genomes
Proved, not just tested

For every one of the 25664 possible partners

Testing 2,012 partners is evidence; a proof covers all of them. For the genome of world 30 we wrote BFF’s rules in Lean 4, together with a second interpreter that treats every partner byte as unknown, and proved that the unknown bytes can never change what happens. The result is one theorem: whatever the partner, the tape ends as the parent followed by the parent reversed.

theorem mirror_copy (B : Vector UInt8 64) :
    run (P ++ B) = P ++ P.reverse

Checked by Lean’s kernel, including the full 8,192-step run (decide +kernel, no native_decide, no sorry; axioms: propext, Quot.sound). The Lean interpreter agrees with our Python and C interpreters on 240 test tapes; that link is tested, not proved.

The intervention

Change one rule and the mirror disappears

Why backwards? In the paper’s version of BFF, both heads start at position 0. The cheapest way to reach the partner is one step to the left, which wraps around to its last byte. Reaching the partner’s first byte instead takes 64 steps to the right. So the cheap copier writes from the partner’s end backwards while it reads itself forwards, and the copy comes out reversed.

Google’s code also has a variant where each program’s first two bytes set where its heads start. A genome can then point its write head straight at the start of its partner. We ran the same experiment under that rule. The prediction: forward copies, one strand, no palindromes.

Before life and after, across the whole soup

Live, in your browser

One rule, two kinds of life

Both panels run the same simulator, ported to JavaScript and checked byte for byte against the C engine: 16,384 random tapes each, with 48 copies of an evolved replicator dropped in. Each 8×8 square is one tape. Tapes carrying the genome’s code are painted blue; tapes carrying its mirror image, orange. Left: the paper’s rule and a genome that evolved under it. Right: heads set by the genome, and a genome that evolved under that rule.

epoch 0
Heads start at 0
+
0
−
0
Heads set by the genome
+
0
−
0

A tape counts as + or − when at least 80% of the genome’s instruction bytes sit at the same positions in it, read forwards or backwards. Mutation stays on (1/4096 per byte), so the colours are lineages, not exact copies.

Act two · the chemistry is a language model

A primordial soup of prompts

BFF works because code and data share one tape. A language model gives you that for free: any text can be read as instructions or as input. So we kept the protocol and swapped the chemistry. The soup is 128 short texts that start as random dictionary words. Each epoch they are paired at random, and in each pair one text becomes the system prompt and the other the user message of a small open model (Qwen2.5-1.5B-Instruct, run locally). The reply, cut to 160 characters, overwrites the user message. No task, no goal, no selection.

0
What we checked, and what we did not

Methods