Signalbox harbor / ledgerline 112,408 agents on the line
A proposal for the forge after GitHub

Humans stop driving. They start signalling.

GitHub was built for a handful of people per repository, each opening a branch, writing a diff and asking another person to read it. Put 100,000 agents on one codebase and every one of those habits breaks. Signalbox treats agents as trains, the codebase as track and the human as the signaller: the person who grants blocks of track, sets routes and decides when two trains want the same line.

Written for Cloudflare's "Build the next GitHub" challenge: a new way for hundreds of thousands of agents to work on changes concurrently. The screens use one invented repository, harbor/ledgerline, a payments ledger, so each page tells part of the same story.

The life of one change

INT-4812, partial refunds on split-tender payments. A human touches it twice.

Jonas writes it
Intent A goal and acceptance checks, with a compute budget.
64 attempts Each agent works in its own fork. They race on evidence.
Leases The winner claims the symbols it changes before it lands.
Conflict room Collisions in behaviour are negotiated by the agents that caused them.
Main line Coupled into a speculative train. A failing change goes to a siding.
Thandi decides
Decisions Only the policy question reaches a person, with options already explored.
agents handle ita person decides

What breaks at 100,000 agents

Each GitHub primitive encodes an assumption about how many people are working and how fast. Here is the assumption, where it fails, and what replaces it. Each replacement has a screen.

GitHub todayAssumesAt 100k agentsSignalbox
Pull request One author, one approach, and a person who reads the diff. 64 agents open 64 PRs for the same goal. Nobody reads them, and the best ideas are spread across several. Intent
The goal is the unit. Attempts compete on evidence, are clustered by approach, and the best parts are grafted together.
Branch Diverging is cheap and reconciling later is rare. Possible collisions grow with the square of the agents. Rebase storms never settle. Lease
Claim the symbols before you change them, like a train taking a block of track. Conflicts are prevented.
Merge queue Changes land one at a time behind CI. 18,000 changes a day at 20 minutes of CI is 250 days of queue. Main line
Speculative trains run ahead in parallel. A failure is bisected and only the faulty change is shunted to a siding.
Merge conflict Overlapping text is the danger. The text merges cleanly and the behaviour breaks. Most agent collisions look like this. Conflict room
Detected by property tests and invariants. The two agents negotiate a fix; a person sees only policy questions.
Blame Knowing who and when tells you why. Who is a model, and when is three seconds ago. Why
Every line links to its intent, the session step that wrote it, the reasoning, the rejected options and the tests that pin it.
Review and inbox A person reads every change. Attention is the bottleneck, and an inbox with 18,000 items is the same as none. Decisions
An attention budget spent on judgement calls and a sampled audit. Measured defect rates set each fleet's autonomy.

Six principles

  1. The goal is the unit of change

    A diff is one guess at a goal. Store the goal, its checks and its budget; let diffs be cheap and many.

  2. Prevent conflicts instead of resolving them

    Pessimistic locking on symbols beats optimistic merging once the writers number in thousands.

  3. Main is the furthest train that cleared

    Speculate ahead like a CPU pipeline, and roll back only the faulty change.

  4. Conflicts are about behaviour

    Detect them with properties and invariants, and make the agents that caused them fix them.

  5. Every line carries its reasoning

    Sessions are versioned like code. You can replay any of them, or fork it from any step.

  6. Spend human attention like money

    Budget it, sample with it, and let measured quality buy autonomy for each fleet.

More ideas, not yet drawn

Directions that fit the same model and would make good next screens.

commits of text → operations

Operations, not diffs

Commits record what was done: rename a symbol, extract a function, add a parameter. Operations commute, so a rename by one agent replays cleanly over the work of 4,000 others instead of conflicting with all of it. Think CRDTs for code.

CODEOWNERS → invariant owners

Own properties, not folders

Priya owns "no money is ever a float" and "PII never reaches a log", wherever that code lives. Any change that touches an invariant's evidence routes to its owner, whatever directory it is in.

code is the source → specs are the source

Code as a cache

The repository keeps intents, specs and tests as the source of truth. Code is regenerated when a better model arrives or the spec changes, and the diff people read is the spec diff.

losing PRs closed → a library of alternatives

Keep the losers alive

The 63 attempts that lost INT-4812 stay cheap and dormant. When the spec changes, they are re-scored first; yesterday's runner-up is often today's winner, at no new compute.

profiles → track records

Agent track records and a compute market

Fleets carry a record: landed changes, reverts, cost per landed change, specialities. Intents carry budgets, fleets bid on them, and repositories can hire the fleet with the best record on refunds code.

code shifts while you read → reading leases

Let people read in peace

When a person opens a file to understand it, they take a short read lease. Agents queue their writes to that region until the person closes it, so the code never changes under their eyes.

How it could run on Cloudflare

A first sketch of where each part would live. To be checked against the Artifacts API before building.

PartBuilt onWhy it fits
Attempts and sessionsArtifacts repos One repo or fork per attempt and per agent session, with a commit per step. Repos are cheap enough to make millions, and they speak git, so any agent can work in one.
Lease tablesDurable Objects One object per module holds that module's leases. A single-threaded owner per region is exactly what a block signal is: strong ordering locally, sharded globally.
Trains and bisectionQueues and Workflows Couple changes into batches, run stages, and bisect a failed batch as a durable, retryable workflow.
Running testsSandbox SDK Each attempt and each train runs its checks in an isolated sandbox close to its repo.
PreviewsWorker previews Every attempt that passes acceptance gets a preview URL for the canary stage and for people who want to click through it.