AI Engineer NYC 2026 Online Talks
Rebuilding CI for AI-Scale Commit Volume — Gautam Korlam, Sonar
Slide chapters
17 slide and demo groups · Timestamps are approximate.
Read the talk
Rebuilding CI for AI-Scale Commit Volume
Gautam Korlam follows the bottleneck from merge queues to CI repairs, review and approval—and explains why faster feedback needs a lasting record of what was tested and who accepted it.
From a talk by Gautam Korlam
At a glance
Ideas worth remembering
Merge safety depends on testing combinations of incoming changes; individually passing PRs can still break trunk together.
CI latency multiplies across repair attempts. Gitar reports reducing roughly ten-minute CI to under a minute for warmed incremental steps through reuse, less invalidation and sharding.
Risk-based approval can automate qualifying routine changes while escalating sensitive changes and preventing agents from approving their own work.
Preserve the tested commit, test report, finding resolutions, independent approval and explicit override reasons with the code that merges.
Individually green changes can still break main
Uber had “agent-scale commit volume” before coding agents: thousands of daily changes entering a giant monorepo with long builds. Gautam Korlam, formerly responsible for build and merge infrastructure at Uber and later a Gitar co-founder who joined Sonar, opens with the resulting dilemma. Serializing every merge protected the main branch, but he describes a backlog that could take twenty days to clear. Allowing everyone to merge independently made the iOS monorepo frequently red. A change could pass CI on its own and still fail when combined with another change.
SubmitQueue addressed the interaction between changes. It tested likely combinations of incoming commits in parallel, rather than waiting to test and merge each change serially. A PR implicated in a failing combination could be demoted from the queue; its author would fix it, rebase and resubmit. Changes reached trunk only after passing the relevant combination tests. The useful question for the queue illustration is therefore: which combined code state was tested before a change became eligible to merge?
This spends extra testing work to reduce waiting while protecting trunk. Testing likely combinations also matters: the account does not establish an exhaustive search over every possible subset of commits. The mechanism is speculative testing of combinations that may land, followed by admission or removal based on those results. Korlam says SubmitQueue remained in use at Uber at the time of the recording.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Agents increase arrivals faster than queues can drain
Merge queues solve a correctness problem, but their capacity still matters. CI and review systems built around human working rhythms now receive bursts of PRs from developers running agents and from background workflows. Those producers do not necessarily wait for the previous change to clear. More code enters the system while testing and review remain centralized, so work accumulates at those stages.
Korlam reports that Gitar’s own commit rate had increased almost tenfold over roughly two years with the same small team. He also describes approximately 25% month-over-month growth in the PR volume Gitar handled for review, CI fixes and related work. These are observations from his team and platform; they do not separate increased activity by existing users from customer growth, or establish a corresponding increase in delivered value.
The proposed “software factory”—agents implement specifications while humans handle specifications and review—still depends on several constrained services:
- Build and test: Compilation failures require rebuilds. Integration failures and tests that cannot be reproduced locally can demand repeated CI runs, sometimes taking hours.
- Review and approval: Without a useful automated first pass, human reviewers become the queue. Heavy volume also creates pressure to rubber-stamp changes rather than examine them.
- Decision records: Logs expire, while an approval stamp may remain without explaining what was actually checked. That makes later auditing difficult even if the change originally followed an acceptable process.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Every failure adds another trip through CI
On Gitar’s platform, at least 13% of PRs had one or more failures in required CI checks. Each affected PR needed another round trip: a developer or agent reads the logs, identifies the cause, changes the code, pushes a commit and waits for CI again. A failure percentage therefore understates the operational work if it is read merely as a count of red checks. The expensive unit is the complete repair attempt.
Review can make those delays serial. Human reviewers often wait for green CI before examining a PR, so they begin only after the initial repair work finishes. Their comments can then cause another edit that breaks CI again. Faster code generation does little to shorten that path if each correction still waits through a long build before the next decision.
Several interventions act on different parts of that cost:
- Shorten CI runs: Parallel execution, sharding and caching reduce the wait for each repair attempt. Korlam also proposes moving some expensive checks after merge; doing so speeds the merge path while leaving those checks to detect problems later.
- Return review signals sooner: Multiple review passes can give quick feedback first, with deeper scrutiny reserved for higher-risk changes. Lower-risk changes may qualify for automated approval and merge.
- Run suitable checks earlier: Moving a check into the local development process can make its results cheaper to reuse and place the failure beside the agent’s existing task context. Some regression or production checks cannot move there, so the opportunity depends on the check.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
A feature flag can pass CI and still violate an operating requirement
Korlam illustrates the limits of technical checks with an account from Uber: a feature-flag change allowed drivers onto the platform without the proper checks, contributing, in his telling, to the loss of its London operating license. The response required tracing changes that affected London and identifying the controls applied to them. He connects that process to winning the license back.
The mechanism begins with a question that compilation cannot answer: does this change affect an activity subject to a particular rule? If it does, the development process needs to apply the corresponding controls and record their enforcement. A passing build alone cannot establish that an agent followed a regulatory requirement. Policy enforcement and its evidence must accompany the code through the merge process.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Make unchanged work reusable
Gitar’s own CI initially took around ten minutes. For a team pushing more changes, that was fast enough to function and slow enough to become irritating. Its Rust build work focused first on caching outputs and reusing them, then on reducing compiler churn so that compilation results were invalidated less often. Sharding and removing other overheads contributed additional reductions.
The reported result was CI taking less than a minute for incremental steps after the cold run had warmed the system. That condition is essential: the claim concerns subsequent work that can reuse prior outputs, rather than every clean build. Caching helps when unchanged work remains reusable; reducing unnecessary invalidation preserves that advantage across edits.
Faster CI then exposes the next wait. At Uber, Korlam recalls that review accounted for the vast majority of the time in the P90 measure of PRs reaching production. Automated review still creates findings that someone must resolve. An agent can receive that context locally or repair the PR in CI, leaving humans to examine what remains after the automated first pass. Counting review comments without arranging their resolution would leave this bottleneck in place.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Parallel tests exposed a shared-database hazard
The CI optimization itself produced a useful review example. Gitar was adopting nextest to run tests in parallel. Database tests reused a shared database, avoiding the cost of setting it up repeatedly. But missing guards allowed cross-contamination when CI became busy: concurrent tests could interfere through shared database state and become flaky. The intended saving in setup work introduced a risk under increased concurrency.
What did the review catch before this reached main? Korlam reports that Gitar identified the problem on the PR, suggested a correction, committed it and added the engineer as a co-author. The account does not specify the guard or database-isolation technique, so it supports the failure mechanism and the pre-merge intervention without supplying an implementation recipe. The example makes the review’s value concrete: it caught a concurrency hazard in a change whose purpose was to make tests faster.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Route approval by risk and keep authorship separate
Approval is another place to avoid sending every change through the same scarce human queue. Gitar supports built-in criteria and additional plain-English rules that gate approval and merge. Korlam’s candidates for automation include documentation, routine dependency updates that do not break APIs, and low-risk internal tooling changes. Eligibility depends on the change meeting the policy; a dependency label alone does not establish low risk.
The approval example asks a concrete question: which branch should this PR take?
- Meets the low-risk criteria: Documentation or a qualifying dependency change can receive automated approval.
- Touches sensitive code: Changes involving payments or authentication may require an additional human approver.
- Changes beyond the criteria: A new edit that no longer qualifies must escalate to another approver.
Across those cases, the agent that authored the change must not approve its own work. Automatic approval still needs a separation between producing the change and accepting it.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Bind the decision to the code that actually merges
A branch name does not permanently identify the code that passed CI. In Korlam’s next example, CI passes, a rerun encounters a flaky failure, and a force-pushed repair moves the branch to different code. Over time, CI artifacts also expire. Without a record of the tested commit, the failure and its resolution, a later auditor cannot reconstruct what was accepted merely by looking at the branch’s current state.
Agent trajectories and outcomes after each push provide part of that history. Stored on the PR or another lasting system of record, they can preserve what happened after temporary logs disappear. The control Korlam emphasizes is independent testing and approval: the record should establish who accepted the change and that the acceptance did not come from its author.
The pipeline comparison asks why a failed run with a documented exception can be more acceptable than a passing run with an incomplete history. In the first case, an independent approver recognizes a known failure mode, records why it is acceptable and saves that decision with the change that lands. In the other, a green result lacks the recorded checks or reasoning needed to justify acceptance. This is a distinction about evidence and policy: a documented exception must explain the failure and the reason for permitting the merge.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Keep the report, the resolution and the reason for an override
The ending turns auditability into specific records a team can retain. Gitar’s examples cover several different questions:
- Origin: Which coding agent produced the PR, which session created it and who initiated it? Was the trigger an automated workflow or an engineer’s prompt?
- Test evidence: Which commit received the trusted CI result? Preserve the test report alongside the status.
- Finding resolution: Was each finding fixed, dismissed or left for follow-up?
- Approval independence: Who approved the change, and how were they separate from the authoring bot and its initiating context?
- Overrides: If a red build was accepted or a coverage check skipped, name the exception and explain why it was acceptable.
Those records must describe the commit that merges. A small edit on top of an approved version still changes the code being accepted, so Korlam calls for checks to run again on each change. Recording who prompted an agent also remains useful alongside commit authorship: the origin of the work and the identity permitted to approve it are separate facts that the system needs to retain.
The proposed software factory gains capacity at several points: faster CI shortens repair waits; suitable local checks reduce downstream test load; automated review and low-risk approval reduce the work reaching humans. After every approval and merge, the system records what happened. That history serves both accountability and future work: as more changes move through the factory, earlier failures, fixes and exceptions remain available as context rather than disappearing with the agent session or CI logs.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
Related talks
- Beating RL With Reflection: GEPA and Optimize Anything
Explains how execution traces, errors and learned repository skills can carry useful knowledge into later agent attempts, complementing this talk’s emphasis on preserving repair context.
Read the complete timestamped transcript
17 slide groups. Extracted from the recording; expand builds to follow changes. Timestamps are approximate.
Rebuilding CI for AI-scale commit volume
Widely spaced human-paced curves give way to densely packed agent-paced curves. Korlam introduces CI bottlenecks and asks how highly regulated industries and banks can move fast while staying compliant and auditable.
Text in image
Rebuilding CI for AI-scale commit volume AIE NYC 2026 — LESSONS FROM BUILD AND MERGE INFRASTRUCTURE The new bottlenecks in software factories HUMAN PACE AGENT PACE Gautam Korlam Gitar, part of Sonar Sonar · gitar
- 0:00
Hello, everyone. Uh, welcome to my talk. Uh, today we're gonna be talking about how we are rebuilding CI for AI scale commit volume. And this comes from a lot of experience from build and merge infrastructure that I have been working on for a decade plus at this point, and kind of want to walk you through all the new bottlenecks we're seeing in software factories, and also specifically for highly regulated industries and banks. How does that translate? How do we keep things more compliant and auditable
- 0:30
while being able to move fast? So let's dive in. My name is Gautam. I am a co-founder and CTO at Gitar, and recently joined Sonar as a principal engineer after the acquisition. Pre-previous to Gitar, I was at Uber for almost a decade working on build and merge infrastructure for monorepos. So everything from build, CI/CD, IDs, you name it, to make sure developers are productive. And now at Gitar as part of Sonar, I'm trying to make sure that code that's
Gautam Korlam: build and merge infrastructure
Gitar co-founder Gautam Korlam spent nine years building Uber’s build and merge infrastructure for monorepos with thousands of engineers. At Gitar, now part of Sonar, he works on code review and CI for agent-written changes.
Text in image
Gautam Korlam 01 — WHO IS TALKING Co-founder and CTO, Gitar · Principal Engineer, Sonar UBER · DEVELOPER PLATFORM 9 years Build and merge infrastructure for monorepos with thousands of engineers. GITAR, PART OF SONAR Now Code review and CI for changes written by agents. Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE AIE NYC 2026 02 / 17
- 1:00
been checked in is verified and all the code written by agents is of high quality before it goes in. So before I get started, I wanna just paint a bit of history picture. Uh, at Uber, we had agent-scale commit volume before they were agents. So what I mean by this is we had one giant monorepo, and we were doing, like, thousands of changes a day and with very long running builds. This meant that if you just kept everything serialized and merged them
Agent-scale volume before agents
At Uber, 1,000 daily changes with 30-minute builds would take 20+ days to land serially. SubmitQueue tests likely combinations in parallel, predicts collisions and lands changes only after they pass on their target trunk.
Text in image
We had agent-scale volume before agents. 02 — BEFORE AGENTS · UBER ONE MONOREPO, BEFORE THE QUEUE 1,000 changes a day, with 30 minute builds 20+ days for the last one to land, tested one at a time 52% of one week, the iOS mainline was green Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 03 / 17
Show 2 builds
- 1:06
Agent-scale volume before agents — recorded presentation, build 1
Text in image
We had agent-scale volume before agents. 02 — BEFORE AGENTS · UBER ONE MONOREPO, BEFORE THE QUEUE 1,000 changes a day, with 30 minute builds 20+ days for the last one to land, tested one at a time 52% of one week, the iOS mainline was green Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 03 / 17
- 2:27
Agent-scale volume before agents — recorded presentation, build 2
Text in image
We had agent-scale volume before agents. 02 — BEFORE AGENTS · UBER ONE MONOREPO, BEFORE THE QUEUE 1,000 changes a day, with 30 minute builds 20+ days for the last one to land, tested one at a time 52% of one week, the iOS mainline was green Test likely futures in parallel Build each predicted state of trunk at once. Land small changes first when every path agrees. −74% P95 wait Predict breaks before they land A model scores which changes will collide, so builds go where they pay off. 97% prediction accuracy Keep trunk green A change lands only after it passes on the trunk it lands on. 1.2× of ideal turnaround Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 03 / 17
- 1:06
- 1:30
one at a time, so as not to break your, uh, main branch, you would take a, a really long time, up to days, twenty days in this case, to make sure that everything was green. And if we skipped everything and just let everyone merge to main, we would see red main all the time because changes would conflict with each other. And even though the CI would be green on one of them, combined, they might actually break. So we would see, like, our iOS monorepo would be, like, red all the time, and that was not productive for our developers. To fix this, what
- 2:00
we did was we made a system called SubmitQueue, which we have a paper on, and we tested all the likely possibilities of commits that are coming in, uh, and making sure that we can, like, reduce the wait time, so we can test these things in parallel. We could also predict what could break by testing all the combinations. So once we know that a PR might break, we might demote it back from the queue and let the author know that they have to go fix it before they can push it back up after rebasing. And finally, like, to keep
- 2:30
the trunk green, only if it passes with all the combination of commits coming in, it would be let in to go directly onto the trunk. So we'd want to make sure that the overhead was worth it for keeping our trunk green. And this is still running today at Uber. I'm sure now we have, like, merge queues that GitHub came up with and all the other, uh, code hosts. But for back then, there was not a system, so we developed this. So the problem with this approach is currently all these queues that we have, so that's either CI or review
Queues built for human speed cannot keep up
At a few changes an hour, CI and review can keep up one at a time. Background agents and triggered workflows open more changes, pushing both queues over capacity.
Text in image
Queues built for human speed cannot keep up. 03 — TODAY PRESSURE CI: keeping up Review: keeping up Human pace. A few changes an hour. Testing them one at a time keeps up. Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 04 / 17
Show 2 builds
- 2:51
Queues built for human speed cannot keep up — recorded presentation, build 1
Text in image
Queues built for human speed cannot keep up. 03 — TODAY PRESSURE CI: keeping up Review: keeping up Human pace. A few changes an hour. Testing them one at a time keeps up. Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 04 / 17
- 3:33
Queues built for human speed cannot keep up — recorded presentation, build 2
Text in image
Queues built for human speed cannot keep up. 03 — TODAY background agents: nightly fixes, dependency bumps triggered workflows: alerts, tickets, schedules PRESSURE CI: over capacity Review: over capacity Software factories. Background agents and workflows open changes on their own. Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 04 / 17
- 2:51
- 3:00
on a centralized bottleneck in the SDLC. So all these queues were built for human speed, and once you build it from human speed, what happens is they are not able to keep up once you go to agents. Because humans generate changes-- used to generate changes, like, few times an hour, so we could do testing and review one at a time. Now, with agents, developers are writing, like, several PRs, uh, in many in a day, and they won't always wait for the queue. They all want to, like, come in at the same time, which means your
- 3:30
CI and review queues are piling up and having pressure. And add to that, like, the patterns of software factories and background agents triggering on, like, various workflows, suddenly you see, like, everything slowing down to a crawl because your bottlenecks are still gonna be CI and review, and they are over capacity in this case.
Agents bring volume to every team
Gitar says it now merges 10× more PRs than in its early days, with coding agents. The chart shows PRs reviewed on Gitar rising sharply from April 2025 to September 2026.
Text in image
Agents bring that volume to every team. 03 — TODAY 10× more merged PRs than in Gitar's early days, now with coding agents PRS REVIEWED ON GITAR OVER TIME Timeline: APR 2025 — SEP 2026 Interface text: AIE NYC 2026 OPENING BEFORE TODAY ENABLE RECORDS CLOSE 05 / 17
- 3:50
So what does this mean, uh, for teams today, right? So just to put things into perspective, uh, our own, uh, rate of commits has almost like tenx'd since we started Gitar, uh, about two years ago. And it's just, like, uh, unbelievable with the same size team. We are still very small. We're able to, like, uh, push so much more code. Uh, and we even see this on the industry trends on Gitar. So this graph shows you the number of PRs that we see that Gitar reviews over time. And if you look at the growth trajectory,
- 4:20
it's pretty exponential. Every month, almost, we're growing twenty-five percent month over month of just the amount of PRs we have to review, fix CI, and other things. So this is also, I think, like, corroborated by evidence that, uh, industry players like Gitar have been putting out, where they're seeing, like, uh, staggering growth in PRs. And this is now coming for every single team. Like, if our small team is seeing this, I'm sure, like, the larger teams and banks are seeing it, like, at a much higher degree, uh, as they are going through their AI adoption
Every change passed. Trunk still broke.
One PR renames fetchFare() to getFare(); another adds a call to fetchFare(). Both pass individually, but their untested combination can break trunk.
Text in image
Every change passed. Trunk still broke. 03 — TODAY A rename fetchFare() to getFare() ✓ passed B add a call to fetchFare() ✓ passed Interface text: AIE NYC 2026 OPENING BEFORE TODAY ENABLE RECORDS CLOSE 06 / 17
- 4:50
journeys. So the problem I was talking about, right? So if agents are opening PRs and if you make them, uh, check everything through the CI system, uh, individually they might pass, but once you kind of merge them back onto main, your trunk might still be broken. So how do you, like, solve for this? Like, how do you keep things green, uh, at this high rate of pace, right? So this is very important, kind of like how we solve SubmitQueue. The changes themselves are not, uh, testing against each other. So there needs to be
- 5:20
some sort of change in either the CI system as well as how we architecture code and in the queues to be smarter to be able to solve this. And the problem we're also seeing with everyone trying to adopt, like, software factories, which is having agents write all the code, uh, from the spec and then just having humans be responsible for the spec and review, is that the factory line that exists today was built for human speed, as I mentioned. Which means that as agents push more changes, uh, every part of the factory
The factory line was built for human speed
More agent changes can strain every stage: repeated builds and flaky tests consume time, reviewers become a queue, approvals get rubber-stamped, and expiring logs obscure what was checked.
Text in image
The factory line was built for human speed. 03 — TODAY 01 Build 02 Test 03 Review 04 Approve 05 Record Agents push more changes, and more revisions of each, through every station. Interface text: AIE NYC 2026 Timeline: OPENING, BEFORE, TODAY, ENABLE, RECORDS, CLOSE 07 / 17
Show 2 builds
- 5:26
The factory line was built for human speed — recorded presentation, build 1
Text in image
The factory line was built for human speed. 03 — TODAY 01 Build 02 Test 03 Review 04 Approve 05 Record Agents push more changes, and more revisions of each, through every station. Interface text: AIE NYC 2026 Timeline: OPENING, BEFORE, TODAY, ENABLE, RECORDS, CLOSE 07 / 17
- 6:44
The factory line was built for human speed — recorded presentation, build 2
Text in image
The factory line was built for human speed. 03 — TODAY 01 Build Rebuilds code that did not change, on every pass. 02 Test Flaky failures reject good changes. 03 Review Reviewers become the new queue. 04 Approve Approvals turn into rubber stamps. 05 Record A status that expires, not a record. CI breaks loudly. Review, approval and the record break quietly. Interface text: AIE NYC 2026 Timeline: OPENING, BEFORE, TODAY, ENABLE, RECORDS, CLOSE 07 / 17
- 5:26
- 5:50
line is gonna be slowing down. So for example, with build and test, you might have lots of rebuilds whenever a compilation breaks, or you might have integration tests. You might have flaky tests that are not reproducible locally, and that just slows everything down. So-- 'cause you have to retry them, and it could take hours in many cases with a complex build. Uh, add to the fact that now you have review and approval. So a lot of you probably already use like AI to review your code. Hopefully, uh, you're not doing every single review with,
- 6:20
uh, with humans. You ideally are reviewing with AI as a first pass. Now the reviewers become the queue if you don't have that system in place. And even after you review, there might be some criteria you might want additionally to make sure that it's approved fully. Because what's happening now in the industry is a lot of folks are just rubber-stamping them because they cannot keep up with the high rate of PRs. They are relying on other signals now to be able to just get through. So the process has to change. And the other problem right now we're having is, like, a lot of these checks are running.
- 6:50
There's, uh, a lot of records that we keep that are expiring. So like your old logs don't exist as they expire out. There is no stamp of, like, what was actually checked because there is, like, just an approval stamp. So there needs to be some record of these things for auditability and compliance checks to happen.
Every repair loop is another CI pass
The slide illustrates three CI passes for one change: failures and review findings prompt fixes and fresh runs. On the speaker’s platform, at least 13% of PRs had a required CI failure.
Text in image
Every repair loop is another CI pass. 03 — TODAY agent pushes a revision CI and review failure or finding agent fixes CI PASSES FOR ONE CHANGE 3 13% of PRs had a recorded CI failure Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE AIE NYC 2026 08 / 17
- 7:10
The other issue we're seeing is that as the code volume increases, the time taken for repair also is adding a ton of overhead. Uh, what we see on our platform, at least thirteen percent of PRs had a required CI failure. This is just one or more CI failures, which means in all these cases, there is a separate round trip to go either back to the developer machine or for an agent to understand the logs, root cause the failure, fix it, push another commit, and then keep iterating till it's
- 7:40
green. And this is just CI. Because most of the time, if a human reviewer wants to look at a PR, they're not gonna take a look unless CI is green because that's the first line of defense. So that also, like, slows, uh, the review process because they can't go in parallel, because usually we wanna look at something once it's finalized. And every lab is now paying for a CI review. So if your review comments come in and you're doing another pass, CI might break again, and it kind of like repeats as a cycle. So
Four things to enable
To shorten repair cycles, speed up CI and review, run checks before changes enter the queue, and use written policies to approve routine changes with a record.
Text in image
Four things to enable. 04 — ENABLE 01 Make CI fast Every repair lap costs less. build · test 02 Make review fast Use agents to review code. review 03 Move checks left Catch breaks before a change reaches the queue. test · review 04 Gate by policy Written rules approve routine changes, with a record. approve · record Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 09 / 17
- 8:10
how do we make this better? Like, what, what do we do to make this problem more manageable as agents are pushing down more code? So we have discovered this, uh, obviously back at Uber, but also in, uh, in Gitar's team right now. But the most obvious thing is ob-- of course, like make your CI really quick and fast, which means that you may want to, like, remove a lot of the expensive checks, try to offload them to like post, uh, merge even, and try to make the CI step itself really quick because your repairs will be much more efficient. So you can
- 8:40
parallelize things, you can shard, you can do, like, uh, caching. We'll talk about some of the techniques that we have used as well. You also want to make sure the review is fast. So not just like a deep review, but you also want to have maybe multiple passes that are, like, giving quicker signal to your developers, so they're able to, like, use them as a way to understand in what scenarios they may want to go deeper for higher risk changes or maybe for like lower risk ones even, like let the AI approve and merge them. And for the checks that are already running in CI,
- 9:10
if you can move them to the left, it's way cheaper to cache them. And this actually, uh, is very relevant to checks that happen even past CI. For example, you might have like expensive regression tests or like things that might fail in production. Uh, not every time it's possible to, like, move things to the left, but as much as possible, if you can move them, it means you have less bottleneck down the line. And locally, agents have done more context anyway to fix the issue that they're facing. And you also want to have policies. This is very important for regulated industries.
- 9:40
So, uh, a story we have at back at Uber is we lost, like, the license to operate in London because there was a glitch in the software that allowed drivers to get on the platform without all the proper checks, and that was because of a feature flag change. So we had to put in a process in place so that every change affecting London that was going through the SDLC would need some sort of like a, a lineage of, okay, does this change affect London? If so, what are the controls in place? And we were able to win our license back. Now, a lot of you might be
- 10:10
facing these kind of like challenges where agents just make it much harder to understand what's happening in your code base. So how do you ensure your policies are actually being respected? So you need to have a way to, like, enforce these rules beyond CI. Like, just because the code compiles doesn't mean that it's following, uh, particular specifications. It could be like HIPAA. It could be like, uh, uh, TORA. There's so many other policies that these agents are not going to be aware of unless your agents are enforcing it on the other end. And also, you wanna make sure that you
- 10:40
record that it was enforced for auditability. So just a quick story about how we made our CI faster as well. So we were at a baseline where we were, I would say like still fast, but like very annoying when you're trying to, like, push more code. Uh, we were around like ten minutes for our CI, and we wanted to, like, bring that down significantly. So we started think-- looking at how can we cache outputs. Uh, we use Rust for our build system, so we started, like, caching as much as possible and reusing them. And we also looked at ways
Making every CI pass cheaper
Initially, fresh builds set the 100% baseline. A later build shows output reuse cutting CI cost 25%, and reuse plus a debug metadata fix cutting it 50%. The speaker says further changes brought warm incremental runs to roughly a minute.
Text in image
How we made every CI pass cheaper. 04 — MAKE CI FAST Control fresh build outputs every run 100% baseline X-axis ticks: 0, 25, 50, 75, 100% Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 10 / 17
Show 2 builds
- 10:42
Making every CI pass cheaper — recorded presentation, build 1
Text in image
How we made every CI pass cheaper. 04 — MAKE CI FAST Control fresh build outputs every run 100% baseline X-axis ticks: 0, 25, 50, 75, 100% Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 10 / 17
- 11:11
Making every CI pass cheaper — recorded presentation, build 2
Text in image
How we made every CI pass cheaper. 04 — MAKE CI FAST Control fresh build outputs every run 100% baseline Retained outputs reuse build outputs across runs −25% + debug metadata fix both changes together −50% X-axis ticks: 0, 25, 50, 75, 100% Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 10 / 17
- 10:42
- 11:10
to, like, reduce churn in the compiler. So we added some more fixes to, like, ensure that the compilation part is more cacheable and is invalidated less often. And by adding more fixes on top of this, by sharding and by removing, like, these overheads, we are able to bring the time of CI almost like less than a minute for incremental steps, which means once the cold CI is warmed up, incremental builds are way, way quick, quicker, and we can push a ton more code. The other issue is also review. So just because
Review cannot become the new queue
Every agent change waits for a human, creating a review queue. The speaker proposes having agents address automated review findings first, leaving humans to review what remains.
Text in image
Review cannot become the new queue. 04 — MAKE REVIEW FAST AGENTS: Open and revise HUMANS: Everything Every agent change waits on a human. Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 11 / 17
- 11:40
the CI is green, what was funny was when we were measuring our, uh, P90 time of like PRs making it into production, the vast majority of time was spent in review back at Uber. And even today, to be honest, like most teams spend more time reviewing code and doing other kinds of testing before they are comfortable merging the code into main. So this is something that needs to be addressed on top of CI as well, because right now what's happening is agents are Of course, like,
- 12:10
gen-generating code at the same time, the AI agents are also, like, finding issues on, on your, uh, code review system. And these automated reviews are also findings that you would have to now go back and address. So either you have to pull context locally for your agent or have an agent on CI iterate and fix. And humans are able to review whatever is left after the AI took its first pass. And this needs to be part of, uh, the equation, so you're not wasting precious human cycles on more and more agent-generated PRs.
Review caught a flaky test before it reached the queue
Gitar flagged a port race that could make parallel database tests flaky on busy CI runners. It then committed a fix that retries startup with backoff, naming the engineer as co-author.
Text in image
Review caught a flaky test before it reached the queue. 04 — MOVE CHECKS LEFT “Under nextest's parallel processes, one lost port race fails this test even when the prepared-database logic is correct, so it will be flaky on busy CI runners.” Gitar review on our CI speedup PR Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 12 / 17
Show 2 builds
- 12:40
Review caught a flaky test before it reached the queue — recorded presentation, build 1
Text in image
Review caught a flaky test before it reached the queue. 04 — MOVE CHECKS LEFT “Under nextest's parallel processes, one lost port race fails this test even when the prepared-database logic is correct, so it will be flaky on busy CI runners.” Gitar review on our CI speedup PR Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 12 / 17
- 13:17
Review caught a flaky test before it reached the queue — recorded presentation, build 2
Text in image
Review caught a flaky test before it reached the queue. 04 — MOVE CHECKS LEFT “Under nextest's parallel processes, one lost port race fails this test even when the prepared-database logic is correct, so it will be flaky on busy CI runners.” Gitar review on our CI speedup PR // feature/db-test-utils/src/prepared.rs - let pg = super::try_start_once(Some(path)).await; + let mut pg = super::try_start_once(Some(path)).await; + for attempt in 1..3 { + if pg.is_ok() { break; } + tokio::time::sleep(super::backoff_delay(attempt)).await; + pg = super::try_start_once(Some(path)).await; + } ✓ fixed before merge Gitar committed the fix, with the engineer as co-author. Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 12 / 17
- 12:40
- 12:42
Uh, here's an example for us. Uh, we were refactoring our code base to have faster CI, so we were using nextest to parallelize our, uh, tests. And we had this, like, shared database that we were spinning up to make sure that we could set it up once and all our database tests would reuse it. But the problem was that there were some guards we didn't put in place, which meant that when CI gets very busy, uh, there is, like, uh, cross-contamination and tests might become flaky. Gitar actually, as a code reviewer,
- 13:12
it caught it on our PR before we merged it, so we didn't have to waste time after. And Gitar also fixed the issue for us because it suggested the fix, committed it, and added the engineer as a co-author. By doing this, we are able to, like, prevent expensive mistakes before the code made it all the way into main. The other thing that we do at Gitar, uh, interestingly, and as we see more and more of our customers start doing, is we are using policies and criteria to decide when is it appropriate to actually even, like,
Let policy approve routine changes
Three changes start waiting. Policy approves the dependency bump and docs fix once CI passes and findings are resolved; the payments edit needs a named approver other than the prompter. Each decision records its rule.
Text in image
Let policy approve the routine changes. 04 — GATE BY POLICY APPROVAL POLICY 1. Dependency bumps and docs changes are approved once CI passes and every finding is resolved. 2. Changes under payments/ need a named human approver. 3. The engineer who prompted the agent cannot approve its change. AGENT bump serde to 1.0.210 — waiting AGENT fix a typo in docs/setup.md — waiting AGENT edit payments/refund.rs — waiting In Gitar, rules and approval criteria are plain-English files in the repo. Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 13 / 17
Show 2 builds
- 13:28
Let policy approve routine changes — recorded presentation, build 1
Text in image
Let policy approve the routine changes. 04 — GATE BY POLICY APPROVAL POLICY 1. Dependency bumps and docs changes are approved once CI passes and every finding is resolved. 2. Changes under payments/ need a named human approver. 3. The engineer who prompted the agent cannot approve its change. AGENT bump serde to 1.0.210 — waiting AGENT fix a typo in docs/setup.md — waiting AGENT edit payments/refund.rs — waiting In Gitar, rules and approval criteria are plain-English files in the repo. Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 13 / 17
- 14:48
Let policy approve routine changes — recorded presentation, build 2
Text in image
Let policy approve the routine changes. 04 — GATE BY POLICY APPROVAL POLICY 1. Dependency bumps and docs changes are approved once CI passes and every finding is resolved. 2. Changes under payments/ need a named human approver. 3. The engineer who prompted the agent cannot approve its change. AGENT bump serde to 1.0.210 — ✓ approved by policy · rule 1 AGENT fix a typo in docs/setup.md — ✓ approved by policy · rule 1 AGENT edit payments/refund.rs — → named approver · rules 2, 3 Every decision is written to the record, with the rule that made it. In Gitar, rules and approval criteria are plain-English files in the repo. Interface text: AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 13 / 17
- 13:28
- 13:41
approve changes. There's a lot of changes that are, like, routine, uh, low risk, documentation, dependency bumps, of course, if they're not breaking any APIs or security patches. Uh, even things like, uh, low-risk changes for internal tooling that can potentially be auto-approved. Uh, so Gitar supports these things out of the box, and you can also add additional custom rules, which are plain English, that you can use to, like, gate the approval and merge on. And we are seeing, like, teams, uh, who are, like, very AI native starting to adopt these
- 14:11
more and more. We see, I think, on our platform, the rate at which folks are adopting, like, the auto-approval and auto-merge grow really quickly across teams, even from large teams, like hundred plus, two thousand plus developers. So here's an example of approval policies. So if it's a dependency bump and doc changes, we should be approving them. Any changes under sensitive stuff like payments or auth might need a human approver on top. And then, of course, you don't want to have the agent who made the change approve its change, because that would not
- 14:41
be, uh, zero trust. So in this case, for-- as agents are generating PRs, the PRs are getting approved. When there is a new change that doesn't meet the criteria, then we would have to escalate to another approver. And this can be done with your own agents, of course, but also Gitar supports this out of the box if you wanna try.
A pipeline status is state; an audit reads records
A passing status can become no data as logs expire. A rerun can fail or a force-push change the code, while the record still ties the tested and landed revision to saved results, a reviewer and an independent approver.
Text in image
A pipeline status is state. An audit reads records. 05 — RECORDS PIPELINE STATUS ✓ passing a41f09c RECORD tested revision a41f09c results saved test report reviewed by a named reviewer approved by someone other than the author landed a41f09c Interface text: AIE NYC 2026 OPENING BEFORE TODAY ENABLE RECORDS CLOSE 14 / 17
Show 2 builds
- 15:00
A pipeline status is state; an audit reads records — recorded presentation, build 1
Text in image
A pipeline status is state. An audit reads records. 05 — RECORDS PIPELINE STATUS ✓ passing a41f09c RECORD tested revision a41f09c results saved test report reviewed by a named reviewer approved by someone other than the author landed a41f09c Interface text: AIE NYC 2026 OPENING BEFORE TODAY ENABLE RECORDS CLOSE 14 / 17
- 15:56
A pipeline status is state; an audit reads records — recorded presentation, build 2
Text in image
A pipeline status is state. An audit reads records. 05 — RECORDS PIPELINE STATUS no data logs expired re-run a flaky test fails this time force-push the branch now points at other code months later logs and artifacts are gone RECORD — UNCHANGED tested revision a41f09c results saved test report reviewed by a named reviewer approved by someone other than the author landed a41f09c The control: a change was tested and approved by someone who did not write it, with a record that proves it. Interface text: AIE NYC 2026 OPENING BEFORE TODAY ENABLE RECORDS CLOSE 14 / 17
- 15:00
- 15:03
And the other problem with, uh, just relying on CI today is that just because CI is green, as I mentioned, doesn't mean the code is compliant in many cases. So in this case, uh, the CI is passing and there is some metadata that we have about it. On the rerun, the flaky test, uh, is gonna fail, which means that when you force push to fix that thing, now the branch is pointing at another piece of code. So the problem with this is that over time, most CI data is gonna be
- 15:33
expired. So unless you have a record of what happened and what was fixed, you will not be able to, like, be compliant or be able to audit what actually happened. Which is why I think things like agent trajectories and, like, your, uh, outcomes after each push are very, very important. So whatever information you can record on the PR or any other system of record is gonna be a source of truth as your artifacts expire. So the control here is, uh, making sure that the change was approved and tested by someone
- 16:03
who did not write it. If you don't have that information, it could be a problem. So here's an example. We have a pipeline that failed in the left and a pipeline that passed. But the difference here is that if you record properly why the failure occurred when someone else was able to approve it because it was a known failure mode, and it was saved with the change that made it in, this thing actually passes your checks versus something where you don't have a record of what happened, but you just blindly trust the agent pushing code. 'Cause it could
Which changes pass an audit?
In this example, a failed pipeline can pass an audit: its flaky test has a linked ticket, an independent approver signs off, and results are saved. The passing pipeline has no recorded approval or saved results.
Text in image
Which of these changes passes an audit? 05 — RECORDS ✕ pipeline failed override known flaky test, ticket linked approved by a named approver, not the author results saved with the change ✓ pipeline passed override none approved by none recorded results not saved Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 15 / 17
- 16:33
be a test that was actually, uh, not high quality. There was no record of all the compliance checks that were, like, recorded. So you wanna make sure that on the, uh, more sensitive, uh, industries, you want to have all of these decisions recorded as rules or compliance checks on top of your PR in addition to code review.
When an agent writes the change, the record needs more
For agent-written changes, record the agent and prompting engineer, save test results and override reasons, and merge the tested revision. A different human must approve; an agent cannot approve its own work.
Text in image
When an agent writes the change, the record needs more. 05 — RECORDS author: coding agent, with its plan and session linked [AGENT] prompted by: the engineer who started the session [AGENT] tested revision: the exact commit CI ran results: a saved test report, not just a status review: each finding and how it was resolved approver: a human who neither wrote nor prompted it [AGENT] override: named, with a reason, when a check failed landed: the same revision that was tested Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 16 / 17
Show 2 builds
- 16:51
When an agent writes the change, the record needs more — recorded presentation, build 1
Text in image
When an agent writes the change, the record needs more. 05 — RECORDS author: coding agent, with its plan and session linked [AGENT] prompted by: the engineer who started the session [AGENT] tested revision: the exact commit CI ran results: a saved test report, not just a status review: each finding and how it was resolved approver: a human who neither wrote nor prompted it [AGENT] override: named, with a reason, when a check failed landed: the same revision that was tested Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 16 / 17
- 18:06
When an agent writes the change, the record needs more — recorded presentation, build 2
Text in image
When an agent writes the change, the record needs more. 05 — RECORDS author: coding agent, with its plan and session linked [AGENT] prompted by: the engineer who started the session [AGENT] tested revision: the exact commit CI ran results: a saved test report, not just a status review: each finding and how it was resolved approver: a human who neither wrote nor prompted it [AGENT] override: named, with a reason, when a check failed landed: the same revision that was tested An agent cannot approve its own change. Neither can another agent acting for the same author. The engineer who prompted it is an author too. Someone else signs off. Interface text: AIE NYC 2026 OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 16 / 17
- 16:51
- 16:53
So the-- What are some of the kinds of records that we want to keep? So here's a few that we keep on Gitar, which I think are just examples. It could be different for folks. So for example, which coding agent made, uh, the PR? Where did the PR originate from? What was the session that originated it? And who actually started it? Could it be a trigger from an automated workflow, or could it be just an engineer doing prompting? And for each of these, like, CIs that run, what is the commit where CI
- 17:23
was trusted? And the same test report, not just the status. And making sure that each finding has, like, a record of if-- how it was resolved. Was it dismissed? Was it followed up? Was it, like, fixed on the PR? And then making sure the approver is someone apart from the bot that was prompted by the same person. And making sure that any overrides are explicitly named. So if there is a red build or, like, a controlled code coverage skipped, you wanna make sure there's a reason for when-- why that check failed and why we're okay with that
- 17:53
in that scenario. And making sure that the code that merges actually has all this and it's not, like, a small change on top that was merged. So all the checks run every single time. So in this case, we wanna make sure that agents cannot approve their own changes. Engineer who prompted it is also not an author. And if you have these practices in place, now we can actually start removing some of these bottlenecks because the CI being faster will unlock your builds, so your
A factory runs at the speed of its slowest station
The first build shows a pipeline limited by its slowest station. The next proposes fewer rebuilds, earlier checks to catch breaks and flaky tests, agent-first review, policy approvals and records for future improvement.
Text in image
A factory runs at the speed of its slowest station. 06 — CLOSE 01 Build 02 Test 03 Review 04 Approve 05 Record The line from earlier. Every station after the code was built for human speed. AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 17 / 17
Show 2 builds
- 18:10
A factory runs at the speed of its slowest station — recorded presentation, build 1
Text in image
A factory runs at the speed of its slowest station. 06 — CLOSE 01 Build 02 Test 03 Review 04 Approve 05 Record The line from earlier. Every station after the code was built for human speed. AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 17 / 17
- 18:50
A factory runs at the speed of its slowest station — recorded presentation, build 2
Text in image
A factory runs at the speed of its slowest station. 06 — CLOSE 01 Build MAKE CI FAST Stop rebuilding what did not change. 02 Test MOVE CHECKS LEFT Catch breaks and flaky tests early. 03 Review MAKE REVIEW FAST Agents review first. Humans review the rest. 04 Approve GATE BY POLICY Written rules approve the routine. 05 Record KEEP A RECORD Every decision saved for the audit. Agents made writing code cheap. Gitar keeps the line moving at agent speed. Sonar | gitar sonarsource.com/products/gitar AIE NYC 2026 Timeline: OPENING · BEFORE · TODAY · ENABLE · RECORDS · CLOSE 17 / 17
- 18:10
- 18:23
flow is much nicer. And making sure you can, like, move some checks, checks left will also make sure that your test load is gonna be reduced quite a bit on the CI side. If you can automate review for the most part and only escalate to humans for exceptional cases, and potentially even auto-approve low risk or internal changes, then you remove further bottlenecks, and then you have less, uh, that has to reach humans, uh, for a s-software factory to perform to its, uh, potential. And of course,
- 18:52
after every single approval and merge, you wanna record what happened because as factory cycle ramp up, if you don't have an idea of what happened in the past, that context is gonna be very useful on how to, like, iterate and make your software better over time. Uh, that's it from me. Uh, would love for you folks to also try out Gitar and see how you can improve your software factories. And with that, uh, thank you so much for, for your time.