Benchmark
Lanes benchmark: 46% to 0% broken builds
In shortIn the scenario where one agent renames a function while another agent writes a new caller, file locks alone broke the build in 6 of 13 runs (46%). With Lanes' shared context, 0 of 10. When edits were refused the old way, 4 of 13 agents (31%) stopped and asked their human what to do; with Lanes' queue, 1 of 216 sessions (0.5%) did. With 64 agents writing at once, no edit was lost. The check before an edit adds 39 ms on Linux and 68 ms on Windows at p95.
Summary
| Result | Without Lanes | With Lanes |
|---|---|---|
| Builds broken when one agent renames a function another agent is about to call | 6 of 13 runs (46%), file locks only | 0 of 10 with shared context |
| Agents that stop and ask their human for help when they hit a busy file | 4 of 13 (31%), edits refused | 1 of 216 sessions (0.5%), edits queued |
| Edits lost with 64 agents writing at once | 0 | |
| Commits attributed to the right person (6 agents on 6 clones) | 107 of 107 | |
| Time the check adds before an edit, p95 | 39 ms Linux, 68 ms Windows, 79 ms macOS | |
| Extra agent turns from shared context | none: 17.2 turns per run on average, against 18.5 without |
Behind these numbers: 389 real Claude Code sessions (173 in the early spikes, 216 in 108 benchmark runs) and 419 automated tests that run on Linux, Windows and macOS for every change.
How the benchmark works
Each run creates a fresh git repository from a template, starts a Lanes server and launches two real Claude Code agents with different tasks on separate clones, as if two teammates worked on two laptops. The second agent starts 8 seconds after the first. When both are done, the runner checks the final code on lanes/main by running it: a route must answer, a total must be right, the app must load.
Three setups ("arms") run the same scenarios:
- C: Lanes leases and checkpoint commits, no shared context. This is close to what file locking alone gives you.
- D: C plus team context as first worded, on 3 November 2026.
- D2: C plus team context as shipped in Lanes 0.3.0: a heads-up when an agent reads a teammate's file, a check at the end of a turn, and wording that asks the agent to match the teammate's change.
The method, the success bar for D2 and the metrics were written down before any run. All 90 runs of the main round are reported, none excluded.
The scenarios
The scenarios are chosen so that file locks cannot help: the second agent writes its new code in a new file that the first agent never touches.
| Scenario | First agent | Second agent | Fails when |
|---|---|---|---|
| I1 | Renames priceWithTax to grossPrice | 8 s later, adds POST /invoices in a new file that calls priceWithTax | The new file still calls the old name, so the app no longer loads |
| I2 | Adds POST /invoices first | Renames 8 s later | The rename misses the new file |
| I3 | Changes addOrder(total) to addOrder({ net, total }) | 8 s later, adds POST /refunds calling addOrder | The new caller uses the old signature |
Results, run by run
| Scenario | C, file locks only | D, first wording | D2, shipped in 0.3.0 |
|---|---|---|---|
| I1, rename first | 7 of 10 | 8 of 10 | 10 of 10 |
| I2, caller first | 10 of 10 | 9 of 10 | 9 of 10 |
| I3, signature change | 10 of 10 | 10 of 10 | 10 of 10 |
In an earlier round on 3 November, arm C failed I1 in 3 of 3 runs. The leases-only code did not change between the rounds, which is how the summary above counts 6 broken builds in 13 runs.
The read heads-up is what moved I1 to 10 of 10: it fired twice in every D2 run of I1, and in no run of D. The one D2 miss on I2 was the renaming agent's own mistake, not a collision.
No agent in D or D2 stopped to ask its user anything. No edit was left unpublished and no line was lost in any of the 90 runs.
Scale: 64 agents at once
A separate test drives the hooks the way real agents do, with no model involved, to find where the server breaks. Agents are spread over teammates, two repositories and four agent kinds (Claude Code, Codex, Gemini CLI and Cursor), with 10 or 60 open views.
- With 8, 16, 32 and 64 agents and 60 viewers, no edit was lost. In the 64-agent run, 7 edits waited committed in their clone for the next publish, as designed.
- The server stayed at about 70 MB of memory.
- Every server route answered in under 2 ms at p99, except the lease request, which includes the time spent waiting in the queue.
- The script edits far more often than a real agent: a write every 1.5 to 4.5 seconds per agent, 70% of them to one hot file. Waits on that hot file grow with the number of agents.
Hook latency
Every edit goes through the hook first, so it has to be fast. The bundled hook, for an edit of a free file, process start included, measured in CI at the 95th percentile: 39 ms on Linux, 68 ms on Windows, 79 ms on macOS. In real Claude Code sessions on Windows, hook start-up before the request was 31 ms at p50 and 84 ms at p95.
Getting there took one bundled file instead of TypeScript source (166 ms to 130 ms), caching the repository identity on disk (to 84 ms) and using node:http instead of fetch, which costs about 45 ms to load in every short-lived process.
Sources
Every number on this page links back to a file in the repository:
- Method, written before the runs
- Intent conflicts, round 1 and round 2, all 90 runs
- Scale test
- Hook latency
Questions
Are these results statistically significant?
The samples are small: 10 runs per scenario and setup in the main round. The rename result is the clearest, 6 broken builds in 13 runs without shared context against none in 10 with it. The method was written down before the runs and every run is published, so you can judge the evidence yourself.
Which model ran the agents?
Claude Haiku through Claude Code, in all benchmark runs. Some earlier spike scenarios also used Sonnet.
Can I reproduce the benchmark?
Yes. The runner, the scenarios and the template repository are in the repository. Build Lanes, then run node scripts/runner/run.ts I1 I2 I3 --runs 10, and again with --team.
What did it cost to run?
About $0.007 per two-agent run at API prices, $0.79 for all 108 runs.