Agents pushing to their own branches create a different workload from agents updating the same branch. A server may accept thousands of pushes, but changes based on one old commit cannot all become the next value of the same reference.
GitHub's November 5 Rubicon post reports an internal test with 5,000 concurrent agents and 7,200 pushes per second. Checked November 8, these are company measurements, not an independent benchmark or a guarantee for every repository.
Agreement belongs to the small pointer
In the published design, Azure Blob Storage holds packs; Ref-CAS holds references and the pack manifest. Virtual replicas cache state. A write uploads its pack before committing the reference transaction, with reference compare-and-swap confirmed by a quorum. The architecture and write-path discussion informs this original conceptual redraw; it is not a deployment topology or protocol specification.
Git push
│
▼
Virtual replica ── upload pack ──▶ Blob Storage
│ │
│ after objects are durable │ immutable objects
▼ │
Ref-CAS: check expected ref + update manifest/references
│
▼
Clients reading the new reference
There are two costs here. Storing and transferring bytes depends on data volume. Deciding the next reference value depends on which writes touch the same state. Counting workers alone hides that distinction.
Reject an update when its expected value is stale
Git's update-ref accepts an expected old object ID alongside the new value. This command pattern illustrates two writers starting from one known value in a disposable repository.
# Illustrative pattern. OIDs must identify real commits in that repository.
git update-ref refs/heads/demo "$writer_a_oid" "$base_oid"
git update-ref refs/heads/demo "$writer_b_oid" "$base_oid"
Once the first update succeeds, the reference no longer equals base_oid. Rejecting the second prevents a silent overwrite. The comparison does not determine whether file changes can merge; it decides whether the reference still matches the writer's expectation.
We checked this with Node.js 18 or later and local Git: create a temporary empty repository, make three commits from an empty tree, accept A, reject B's stale update, and assert that the reference still points to A. Actual output:
writer A: accepted; writer B with stale base: rejected; ref still A
Local Git semantics only; not Rubicon or a throughput test.
Run the retained experiment from this project's root:
node docs/editorial/2026-11-08/evidence/ref-race.mjs
No remote repository or user branch was changed. This sequential demonstration checks stale-write rejection, not distributed races or Rubicon performance.
Separate branches move the integration problem
Separate branches can reduce reference contention. Changes to the same files, APIs or schemas still need integration later. That work lies beyond the storage layer.
| Delay to record | Start and end | What it helps distinguish |
|---|---|---|
| Push processing | Request → server acceptance | Transfer and storage cost |
| Reference retry | Rejection → successful update from a new base | Same-reference contention |
| CI queue | Enqueued → execution begins | Execution capacity |
| Integration checks | Candidate ready → regression checks complete | Semantic conflicts |
| Human review | Review requested → decision | Review capacity |
This is a proposed operations ledger, not a set of GitHub test results. Record the intervals before increasing worker counts; otherwise a slow merge may be misdiagnosed as a storage problem.
Throughput does not establish productivity
We have not established that the test's repository size, push distribution or branch concentration matches a particular team's workload. Dividing a team's work by 7,200 would not produce a valid capacity plan. Our local example also says nothing about long-term garbage collection or user experience with large changes.
The useful design lesson is to separate large immutable data from small coordinated state. For a team, observe reference contention separately from integration validation. As a server accepts more writes, the next constraint may become the order in which reviewable changes can be safely combined.