Start hereTry itAgentsArchitectureMechanismsResultsGlossaryRelated workSpikeChangelogContributingSecurity

Contention at scale (2026-10-20)

MEASURED on staging.firetrident.com (build 9f00539), 2026-10-20: what happens when hundreds of agents edit the same files at the same time, with every result checked against the final trunk afterwards.

Real landings: synthetic agents (no model) on a generated TypeScript repository whose hot files every agent edits; each intent placed with its agent (assignedTo), every change an inline change built from the hot file read at its lease's base with stock git, redone against the current trunk whenever it comes back.

The workload

A generated TypeScript repository seeded into a fresh colony per run: 10 hot files (hot/h00/state.ts and so on: a registry of 32 names, one a line, 4 counters and three functions each) and 400 modules (mods/g00/mod_0000.ts and so on, one constant per hot file each), with a node:test file that imports every file and asserts no registry holds a name twice. Seed 1. The tasks, mixed and shuffled:

Each intent is declared already claimed by the agent that does it (assignedTo), so hundreds of agents hold intents on the same hot file at once. The agent takes it (a lease on the current trunk), reads the files at the lease's base with stock git, makes the edit and proposes it as an inline change whose read set is what it read. When the change comes back it declares the same work again with itself, takes it on a fresh lease of the current trunk, reads again and redoes the edit. A change closed as already on trunk is not redone, as the agent guides say. Review is off (no model is called).

Commands

node packages/bench/src/scenarios/contention-scale.ts --base https://staging.firetrident.com --scenario contention-scale --agents 1000 --intents 3000 --out /data/results/platform

Flags the deployment had

/api/about lists a flag that is on for every colony or for some listed colonies, without saying which; the run's own numbers below (merges by the insertion rule, returns by cause) show what applied to its colony.

Results

Measure 1,000 agents
Tasks (register / increment / read-own) 3,000 (1,000 / 1,000 / 1,000)
Agents joined 1,000
Tasks landed 1,151 of 3,000
How the rest ended unresolved 1,849
Proposals (landed) 3,406 (1,151)
Trunk commits whose lineage note names them 808
Landings a minute (trunk commits), first to last landing 188.0
Changes landed a minute 268.5
Propose to landed, p50 / p95 6.1 s / 22.2 s
A task's first proposal to landed, rounds included, p50 / p95 7.3 s / 141.5 s
Changes that came back 2,255
… for a stale read (a file it read had moved) 399
… for a text-merge conflict 0
… sent back by review 0
… for a megafile hold 1,847
… for any other reason 9
… register / increment / read-own 898 / 1,010 / 347
Rounds to land, median / p95 / max 1 / 3 / 5
Changes merged line by line (files; by the insertion rule) 329 (329; 13)
Agents holding an intent at once, peak 231
Intents on one hot file held at once, peak 35
Takes that lost their assignment (declared again) 5,524
Wall time of the agents 1800.5 s

Correctness, from the final trunk

Read with stock git from the colony's trunk after the run: the final tree, main's first-parent history and the lineage notes under refs/notes/firetrident, which name the proposals each commit landed.

Check 1,000 agents
every file parses PASS
registry entries appear exactly once PASS
every counter equals its landed increments PASS
no increment was closed as already on trunk PASS
every read-own constant matches the trunk it landed on PASS
the agents' outcomes agree with the lineage notes FAIL

1,000 agents

Honest limits

Operator's note

Where it ran: the scenario's client was a Cloudflare Container (standard-3: 2 vCPU, 8 GiB) in Cloudflare's LAX data center, started by the throwaway Worker in packages/bench/platform-runner/, against staging at build 9f00539. The Oct 19 runs in 2026-10-19-contention-scale-fixed/ drove the same scenario from a laptop, whose uplink lost connections at about 1,000 concurrent agents. Three attempts at 1,000 agents were made from the container, after a 50-agent proof run (proof-50/: 148 of 150 landed in 63.5 s, all six checks pass).

What bounds the landed count here is the megafile hold, not the network. This build has FT_MEGAFILE on and the Oct 19 laptop run did not: 1,847 of the 2,255 returns were megafile holds (every register return and 949 of the 1,010 increment returns), against 0 on Oct 19, where the returns were stale reads. A hold lasts until a split lands, and no synthetic agent takes a split, so the held tasks ended unresolved (1,849 of 3,000). The lineage check's three failures are the same hold: each proposal landed, and its agent was told the file was being split. The two completed attempts agree with each other: 1,151 and 1,168 landed, landings finished in about 260 s, and no call failed.

In this folder