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.

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

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

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

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

2:27Completed build

Show 2 builds
  1. 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. 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

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

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

3:33Completed build

Show 2 builds
  1. 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
  2. 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

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

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

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
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

6:44Completed build

Show 2 builds
  1. 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
  2. 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

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

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

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

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

11:11Completed build

Show 2 builds
  1. 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
  2. 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

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

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

// 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

13:17Completed build

Show 2 builds
  1. 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
  2. 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

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 — ✓ 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

14:48Completed build

Show 2 builds
  1. 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
  2. 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

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
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:56Completed build

Show 2 builds
  1. 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
  2. 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

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

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

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

18:06Completed build

Show 2 builds
  1. 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
  2. 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

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
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:50Completed build

Show 2 builds
  1. 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
  2. 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

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?

The slide describes testing likely futures in parallel and predicting breaks before they land, illustrating how SubmitQueue can evaluate candidate states before changes reach trunk.Open full source frame
The slide describes testing likely futures in parallel and predicting breaks before they land, illustrating how SubmitQueue can evaluate candidate states before changes reach trunk.

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.

0:000:30
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:00 · section reference included

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.
3:003:30
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

3:00 · section reference included

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.
7:107:40
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

7:10 · section reference included

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.

9:4010:10
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

9:40 · section reference included

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.

10:4011:10
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

10:40 · section reference included

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.

12:4213:12
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

12:42 · section reference included

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.

The policy routes routine dependency and documentation changes to automatic approval, while payments changes and author self-approval trigger named-approver review.Open full source frame
The policy routes routine dependency and documentation changes to automatic approval, while payments changes and author self-approval trigger named-approver review.
13:4114:11
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

13:41 · section reference included

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.

15:0315:33
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

15:03 · section reference included

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.

16:5317:23
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

16:53 · section reference included

Resources

Read the complete timestamped transcript

17 slide groups. Extracted from the recording; expand builds to follow changes. Timestamps are approximate.

  1. 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
  2. 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

  3. 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

  4. 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
  5. 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

  6. 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

    1:06

    Show 2 builds
    1. 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. 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
  7. 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

  8. 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

  9. 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

  10. 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

    2:51

    Show 2 builds
    1. 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
    2. 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
  11. 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

  12. 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.

  13. 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
  14. 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,

  15. 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

  16. 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
  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

  18. 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

  19. 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

    5:26

    Show 2 builds
    1. 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
    2. 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
  20. 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,

  21. 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.

  22. 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.

  23. 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
  24. 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

  25. 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

  26. 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
  27. 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

  28. 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,

  29. 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.

  30. 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

  31. 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

  32. 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

  33. 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

    10:42

    Show 2 builds
    1. 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
    2. 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
  34. 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

  35. 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
  36. 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,

  37. 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.

  38. 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

    12:40

    Show 2 builds
    1. 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
    2. 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
  39. 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,

  40. 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,

  41. 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

    13:28

    Show 2 builds
    1. 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
    2. 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
  42. 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

  43. 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

  44. 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.

  45. 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

    15:00

    Show 2 builds
    1. 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
    2. 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
  46. 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

  47. 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

  48. 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

  49. 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
  50. 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.

  51. 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

    16:51

    Show 2 builds
    1. 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
    2. 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
  52. 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

  53. 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

  54. 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

  55. 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

    18:10

    Show 2 builds
    1. 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
    2. 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
  56. 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,

  57. 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.