<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[DiffLoop]]></title><description><![CDATA[Insights on AI-native code review, autonomous merging, and building developer tools that let AI agents ship code safely. From the team building DiffLoop.]]></description><link>https://blog.diffloop.com</link><image><url>https://cdn.hashnode.com/uploads/logos/6a918046f4c3b95e1b192631/d23b4602-8198-4b20-af3d-4bad1d3a32c9.png</url><title>DiffLoop</title><link>https://blog.diffloop.com</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 12:23:31 GMT</lastBuildDate><atom:link href="https://blog.diffloop.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[The Infrastructure Under Your Code: How GitHub, GitLab, and Cursor's Continuity Store Git at Scale]]></title><description><![CDATA[Every time you run git push, you think about your code. You should also think about what happens to it on the other side. The systems that receive your push, replicate it, and serve it back to your te]]></description><link>https://blog.diffloop.com/the-infrastructure-under-your-code-how-github-gitlab-and-cursor-s-continuity-store-git-at-scale</link><guid isPermaLink="true">https://blog.diffloop.com/the-infrastructure-under-your-code-how-github-gitlab-and-cursor-s-continuity-store-git-at-scale</guid><dc:creator><![CDATA[Kaishu Sahu]]></dc:creator><pubDate>Sun, 06 Sep 2026 09:39:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a918046f4c3b95e1b192631/fd089125-eaf1-440a-acc9-1cc7e3583bba.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every time you run <code>git push</code>, you think about your code. You should also think about what happens to it on the other side. The systems that receive your push, replicate it, and serve it back to your team are some of the most quietly impressive pieces of infrastructure in modern software. And they are all hitting the same wall at the same time.</p>
<p>That wall has a name: the agent era.</p>
<hr />
<h2>The problem with storing git at scale</h2>
<p>Git was designed as a local tool. Linus Torvalds built it in 2005 to manage the Linux kernel — a single repository, on a single machine, with a single set of developers who knew what they were doing. It was brilliant for that purpose.</p>
<p>Hosting git for 100 million developers is a different problem entirely.</p>
<p>The core challenge is this: git stores data as a directed acyclic graph of objects — commits, trees, blobs, refs. Reading that graph requires following pointers. Following pointers across a network is slow. Replicating that graph across multiple servers for durability requires coordination. Coordination has overhead. The more you scale, the more overhead compounds.</p>
<p>Every major git hosting company has had to solve this problem from scratch. Their solutions reveal a lot about where the industry is going.</p>
<hr />
<h2>GitHub: Spokes and the three-phase commit</h2>
<p>GitHub's storage system is called Spokes, originally launched under the name DGit (Distributed Git) around 2013. Before Spokes, GitHub stored repositories on single file servers. Losing a server meant losing repositories. That was obviously not acceptable at scale.</p>
<p>Spokes solved this with a straightforward principle: store every repository on three independent servers, separated at the physical rack level. If one rack fails, two others remain. The key insight was that git itself is already a distributed system — every clone contains the complete history. So instead of building a complex distributed file system, GitHub just ran three independent git servers and kept them in sync.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a918046f4c3b95e1b192631/e203de4a-4c7d-4b0b-b1e4-3bc9c0b721e3.png" alt="" style="display:block;margin:0 auto" />

<p>The coordination mechanism is three-phase commit (3PC). When you push to GitHub:</p>
<p><strong>Phase 1 — Prepare:</strong> The orchestrator asks all three replicas: can you accept this update? Each replica checks if it is ready.</p>
<p><strong>Phase 2 — Lock:</strong> If all three vote yes, the orchestrator says: get ready to commit. Each replica locks the resource.</p>
<p><strong>Phase 3 — Commit:</strong> Orchestrator says: commit now. All three apply the change simultaneously.</p>
<p>If any replica fails at any phase, the whole transaction rolls back. Your push is rejected. This guarantees that when a push succeeds, the data exists in at least two independent locations. Durability before acknowledgment.</p>
<p>This worked extremely well for a decade. Three replicas per repository was the sweet spot — enough redundancy, enough headroom.</p>
<p>The problem that emerged is what Cursor described precisely in their engineering blog: <strong>3PC has constrained horizontal scalability.</strong> The more replicas you add, the slower every push gets. You are only as fast as your slowest replica. Adding a fourth or fifth replica for a particularly busy monorepo means four or five round trips before every push is acknowledged. Latency compounds.</p>
<p>For repositories with thousands of pushes per day — large monorepos, active open source projects — this ceiling became real. And with AI agents that push code continuously rather than humans who push a few times a day, the ceiling gets hit much faster.</p>
<hr />
<h2>GitLab: Gitaly and the separation of concerns</h2>
<p>GitLab approached the same problem differently. Instead of building a replication system on top of git servers, they first abstracted the git layer itself.</p>
<p>The result is called Gitaly — a gRPC service written in Go that handles every git operation GitLab needs. Clone, push, fetch, log, blame, diff — instead of these operations happening inside the main Rails application with direct disk access, they all go through Gitaly's remote procedure call interface.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a918046f4c3b95e1b192631/53065472-507f-41e0-808e-86b983355bb8.png" alt="" style="display:block;margin:0 auto" />

<p>Replication is handled by a separate component called Praefect. Praefect sits in front of multiple Gitaly nodes as a router and transaction manager. It knows which Gitaly node is the primary for each repository, routes reads to any available replica, and broadcasts writes to all replicas.</p>
<p>The key architectural difference from GitHub's Spokes is how Praefect handles consistency. Where Spokes uses strong consistency — a push is only acknowledged when a majority of replicas have applied it — Praefect uses a primary-first model. The push succeeds when the primary Gitaly node acknowledges it. Replication to secondary nodes happens asynchronously afterwards.</p>
<p>This makes GitLab's write path faster at the cost of a small eventual consistency window. If the primary node fails immediately after acknowledging your push but before replicating to secondaries, you could theoretically lose that push. In practice this window is milliseconds and Praefect has recovery mechanisms. For most use cases it is an acceptable trade.</p>
<p><strong>What GitLab got right:</strong> Gitaly's separation of the git layer into a standalone service is genuinely elegant. It moved git operations from being an internal implementation detail of the Rails monolith to an explicitly defined interface. This made it possible to scale git storage independently from the rest of GitLab — add more Gitaly nodes without touching the application tier. It also made the system observable. Every git operation becomes a gRPC call you can trace, rate limit, and monitor.</p>
<p><strong>What GitLab gave up:</strong> Gitaly is still fundamentally git-on-disk. JGit underneath, packfiles on NVMe, familiar git data structures. The abstraction is at the service boundary, not the storage format. This means GitLab inherits the same fundamental constraints as GitHub when it comes to the kinds of workloads that break disk-based git storage.</p>
<hr />
<h2>Cursor: Continuity and the S3 rethink</h2>
<p>Cursor's engineering team published a detailed analysis of both GitHub and GitLab's approaches and concluded that the fundamental issue is the same in both cases: storing git repositories as packfiles on local disks is the wrong primitive for the agent era.</p>
<p>Their solution, called Continuity, makes a different bet: <strong>S3 is the source of truth.</strong></p>
<p>Instead of storing git repositories as files on NVMe drives and then replicating those files across servers, Continuity stores git objects directly in S3. The local NVMe disk becomes a cache, not the primary store. Any server that needs to serve a clone or accept a push reads from and writes to S3.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a918046f4c3b95e1b192631/eb94bebb-960b-4a42-acd9-89fd9bb9647f.png" alt="" style="display:block;margin:0 auto" />

<p>The implications are significant:</p>
<p><strong>Stateless compute.</strong> Any server can accept any push. There is no primary, no replica assignment, no rack separation to manage. Servers are interchangeable. Adding capacity means spinning up more compute, not provisioning more specialized storage servers.</p>
<p><strong>Infinite horizontal scale in both directions.</strong> A repository with millions of pushes per day gets more compute allocated. A repository that gets used once and never touched again costs almost nothing to store. There is no minimum replica floor.</p>
<p><strong>No 3PC overhead.</strong> Instead of coordinating three servers for every push, Continuity does a compare-and-swap operation on S3 — a single atomic write with conflict detection. If two pushes race, one wins and one retries. Much simpler coordination, much lower latency under load.</p>
<p><strong>The trade-off</strong> Cursor accepted is that S3 is not as fast as NVMe for random reads. A cache miss — reading a git object that is not on the local NVMe — incurs S3 latency. For hot repositories this rarely matters because the cache stays warm. For cold repositories accessed after long periods, the first clone is slower.</p>
<p>This trade-off is acceptable when your workload is mostly agent-driven pushes rather than developer-driven clones. Agents push far more than they pull.</p>
<hr />
<h2>What else is being researched</h2>
<p>Beyond the production systems, academic and industry research is exploring several directions:</p>
<p><strong>Blockchain-based version control</strong> — researchers have proposed combining decentralized file storage systems like IPFS with blockchain for tamper-proof, transparent tracking of software changes. The appeal is immutability and auditability without a trusted central server. The practical challenge is throughput — blockchain consensus is orders of magnitude slower than git push.</p>
<p><strong>Content-addressed object stores</strong> — git's own content-addressing (every object identified by SHA hash of its content) is a powerful primitive that has not been fully exploited by hosting systems. Research into purpose-built content-addressed stores that can serve git objects natively — not through JGit or libgit2 wrappers — could eliminate significant overhead.</p>
<p><strong>JGit DHT storage</strong> — Shawn Pearce, one of the core JGit contributors who worked at Google, experimented with a DHT (Distributed Hash Table) backend for JGit that would store git objects across a peer-to-peer network rather than on dedicated servers. The experiment showed promise for read performance but clone latency was too high for production use. The work influenced thinking at both Google and the broader JGit community.</p>
<p><strong>Research paper worth reading:</strong> "Distributed Version Control Systems: Leveraging Git for Effective Software Development" (International Journal of Science and Research, March 2024) covers the landscape of distributed VCS approaches. The key finding: git demonstrates superior efficiency in CPU and memory usage for branching operations, while Mercurial shows better storage optimization for large-scale projects with constrained storage capacity. The implications for multi-agent codebases where branching is constant are interesting.</p>
<hr />
<h2>What this means for the agent era</h2>
<p>Every one of these architectures was designed for a world where humans push code. The assumptions baked into Spokes, Gitaly, and even Continuity reflect human development patterns: pushes measured in tens per day per developer, repositories with stable histories that grow predictably, clones dominated by CI systems running builds.</p>
<p>AI agents break every one of these assumptions.</p>
<p>An agent does not push ten times a day. It pushes hundreds of times. It creates repositories, abandons them, creates branches, merges them, patches set after patch set. The ratio of pushes to meaningful changes is enormous. The commit graph grows not linearly but explosively. The storage systems designed for human-paced development are hitting their ceilings faster than their designers anticipated.</p>
<p>This is the infrastructure problem underneath the workflow problem. DiffLoop exists to solve the workflow problem — removing humans from the merge decision, making merge criteria programmatic rather than social. But the infrastructure layer is catching up to the same realization: the fundamental primitives of git hosting were built for a different world.</p>
<p>The race is not just to build better review systems. It is to rebuild the entire stack from the ground up for the pace at which agents actually work.</p>
]]></content:encoded></item><item><title><![CDATA[The PR Is Dead. We Just Haven't Admitted It Yet.]]></title><description><![CDATA[We were using Claude Code to ship features. It was incredible — faster than anything I'd seen in 10 years of building software. In one week our agent opened 47 pull requests. Nobody reviewed them. We ]]></description><link>https://blog.diffloop.com/the-pr-is-dead-we-just-haven-t-admitted-it-yet</link><guid isPermaLink="true">https://blog.diffloop.com/the-pr-is-dead-we-just-haven-t-admitted-it-yet</guid><dc:creator><![CDATA[Kaishu Sahu]]></dc:creator><pubDate>Fri, 28 Aug 2026 13:34:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a918046f4c3b95e1b192631/5626d2e9-c66d-4186-bb84-07ce9f09a589.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We were using Claude Code to ship features. It was incredible — faster than anything I'd seen in 10 years of building software. In one week our agent opened 47 pull requests. Nobody reviewed them. We shipped anyway. Three bugs made it to production.</p>
<p>That's when I realized the problem wasn't the AI. The problem was us pretending the old workflow still made sense.</p>
<hr />
<h2>The PR was designed for a different era.</h2>
<p>The pull request was invented for a world where humans write code slowly, one feature at a time, over days or weeks. A colleague reviews it, leaves comments, you iterate. The feedback loop is slow but it works because the input is slow too.</p>
<p>AI agents broke this assumption completely.</p>
<p>When your agent ships 50 changes a day, the human review queue becomes a lie you tell yourself. Nobody reads 50 PRs. Nobody can. You either review nothing and ship everything, or you become the bottleneck that defeats the entire purpose of having an AI agent in the first place.</p>
<p>There is no middle ground. The math doesn't work.</p>
<hr />
<h2>The three ways teams cope. None of them work.</h2>
<p><strong>They rubber stamp.</strong></p>
<p>Someone on the team becomes the PR approver. They click approve 40 times a day without reading anything. They trust the AI. Sometimes they're right. Sometimes a SQL injection makes it to production at 2am and they spend the weekend rolling back.</p>
<p><strong>They slow the agent down.</strong></p>
<p>They configure the agent to open fewer PRs, batch changes, wait for approval before proceeding. Now they've taken the fastest tool in their stack and deliberately made it slow. They've re-introduced the bottleneck they were trying to eliminate.</p>
<p><strong>They give up on review entirely.</strong></p>
<p>The agent pushes directly to main. No review, no gate, no safety net. This works until it doesn't. And when it doesn't, it's catastrophic — not a small bug but a fundamental trust breakdown with customers, with the team, with themselves.</p>
<hr />
<h2>The real problem is a mental model mismatch.</h2>
<p>The PR assumes a human is the judge of quality. A human reads the diff, understands the context, makes a call. That assumption made sense when humans wrote all the code.</p>
<p>But when an AI writes the code, why is a human still the judge? The human didn't write it. They don't have the context the agent had. They're reading a diff cold, often hours or days after the agent has moved on to three other tasks. They're worse at this job than the system that created the code in the first place.</p>
<p>We've kept the human in the loop not because it adds value — but because we never questioned whether it should be there at all.</p>
<hr />
<h2>What actually needs to happen.</h2>
<p>The merge decision needs to become programmatic.</p>
<p>Not "AI helps humans review faster." That's CodeRabbit. That's GitHub Copilot for PRs. That's still a human making the final call, just with AI assistance. Useful, but not the answer.</p>
<p>The answer is removing the human from the merge decision entirely — and replacing it with a set of agents that evaluate what actually matters.</p>
<p><strong>Security</strong> — does this diff introduce vulnerabilities? SQL injection, exposed secrets, insecure dependencies.</p>
<p><strong>Quality</strong> — does this code meet the standards of the codebase? Is it idiomatic, readable, maintainable?</p>
<p><strong>Tests</strong> — does this change have adequate coverage? Do existing tests still pass?</p>
<p><strong>Correctness</strong> — does this do what the commit message says it does?</p>
<p>These are answerable questions. Not perfectly — nothing in software is perfect — but answerable well enough that a machine can make the call faster, more consistently, and more thoroughly than a human scanning a diff at the end of a long day.</p>
<p>When all four pass, the code merges. When any one fails, it's blocked with a full explanation. The agent iterates. No human required.</p>
<hr />
<h2>This is not about trusting AI blindly.</h2>
<p>The argument against autonomous merging is always "but what if the AI gets it wrong?"</p>
<p>The AI gets it wrong sometimes. So do human reviewers. The difference is humans get it wrong slowly, inconsistently, and at a rate that doesn't scale. An AI gets it wrong at a known, measurable, improvable rate. You can tune it. You can audit it. You can see exactly why it approved or rejected every single diff.</p>
<p>When was the last time you could audit why your human reviewer approved something? When was the last time they could tell you, with specifics, why they clicked approve on diff 37 of 50 on a Tuesday afternoon?</p>
<p>The bar for autonomous merging is not "perfect." It's "better than what we're actually doing." And what we're actually doing is rubber stamping 47 PRs a week and hoping for the best.</p>
<hr />
<h2>The PR isn't going away tomorrow.</h2>
<p>GitHub has 100 million users. The PR workflow is deeply embedded in how teams think about code. This transition will take years, not months.</p>
<p>But the direction is clear. The teams shipping the most code with the fewest incidents in 2026 are not the ones with the most disciplined human reviewers. They're the ones who figured out how to make the merge decision programmatic — how to encode their standards into a system that can evaluate code at the speed AI can produce it.</p>
<p>The PR was a great solution to a problem that no longer exists. The problem now is different. The solution has to be too.</p>
<hr />
<h2>We're building that solution at DiffLoop.</h2>
<p>Every diff reviewed autonomously. Security, quality, tests, docs — scored automatically. Good code merges. Bad code is blocked with a full explanation. No human in the loop.</p>
<p>If this is a problem you're living with right now — <a href="https://diffloop.com">get early access at diffloop.com</a>.</p>
]]></content:encoded></item></channel></rss>