AI Engineer World's Fair 2026
How Software Factories Improve Themselves — Suraj Gupta, Warp
Read the talk
How Software Factories Improve Themselves
Suraj Gupta explains how Warp improves recurring agent work through human-reviewed skill changes, reusable memories, and model routing informed by task-specific evaluations.
From a talk by Suraj Gupta
At a glance
Ideas worth remembering
Separate the agent doing recurring work from the agent improving its procedure. Propose skill changes through pull requests so humans can review them and Git can preserve their history.
Retain investigation facts for later runs, and keep memories editable and traceable so a mistaken or narrowly useful conclusion does not become permanent guidance.
Improve model routing with comparisons on your task classes. Warp’s internal UI-task finding illustrates this approach; customer-facing evaluations were still planned at the time of the talk.
The factory needs its own improvement loop
A coding agent can finish an assignment while leaving the next run no better prepared. That becomes a maintenance problem when agents repeatedly handle work from issue triage through production. Suraj Gupta, who leads harness development at Warp, frames the next engineering responsibility as building and maintaining these software factories—and improving how the factory works over time. 0:12
Warp began with a modern terminal and an agentic development environment; the work described here extends into a cloud agent platform for teams running factories. Three mechanisms organize the talk: skills retain procedures, persistent memory retains facts from previous work, and model routing changes which model handles a task. Each gives the factory something it can carry forward into later runs.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Turn triage feedback into a reviewed skill change
A skill gives an agent procedural memory: instructions for a task it will perform repeatedly. A triage skill might explain how to reproduce an issue. But the procedure can become dated as agents discover useful approaches and humans correct their decisions. Unless that experience changes the skill, later runs keep starting from the old instructions. 2:06
Warp separates execution from improvement. The inner-loop agent applies the skill and does the triage. An outer-loop agent examines those runs, looks for mistakes, and collects human feedback. Its output is a proposed change to the procedure that future triage runs will use.
The demonstration uses the triage workflow in Warp’s open-source client repository. A newly submitted GitHub issue triggers the agent. It identifies missing information that would help decide whether the request should become new work, be deduplicated against an existing issue, or receive another disposition. The outer loop then examines those decisions alongside feedback from the issue thread.
- Reactions: Thumbs-up and thumbs-down provide feedback signals on the issue.
- User comments: Follow-up discussion supplies additional feedback about the triage.
- Employee comments: Warp employees can directly correct or guide the agent’s work.
How does feedback become a change without immediately rewriting the running agent’s behavior? The loop below puts a pull request between the outer-loop proposal and the skill used in subsequent runs. Git records how the procedure changes, and a human reviews the update before accepting it. That review matters because an improvement agent can also make a mistake and produce a worse triage procedure.
Procedure used for recurring issue triage.
Execution produces evidence; the outer loop proposes a procedural change. Human review separates that proposal from its adoption.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Let the next investigation use what the last one learned
Procedures do not capture everything worth remembering. Consider a Sentry agent that investigates an issue, gathers context, finds the root cause, and fixes it. When a similar issue appears later, a fresh run may fail to find the same cause. Even if it succeeds, it spends tokens gathering context the factory already gathered once. 5:39
Persistent memory carries that investigation forward. Gupta describes it as a fact store scoped to an agent. An outer-loop agent extracts facts, learnings, and outcomes from the inner-loop run, making them available to future runs. The retained material answers what previous work discovered; the skill still describes how to do the work.
In Oz, Warp’s cloud agent platform, the Sentry agent has accumulated memories from earlier root-cause analyses. Reuse also creates a curation problem: an agent can retain an unimportant observation or a conclusion that worked locally but should not guide future work. Oz exposes versioning and human controls to create, edit, or delete memories, along with links to their source runs. Opening a source run fails during this demonstration; Gupta suspects that changing IP addresses and staging IP restrictions explain the failure. That provenance navigation is described rather than completed on screen. Its practical purpose is clear: a questionable memory can be examined in the context that produced it and removed if it should not persist.
The Sentry example then develops into a visible record of reuse. A later run performs another investigation and reports which memories it used—five in the demonstrated store. Gupta attributes faster work to that reuse. The concrete change is that earlier investigation results now participate in a later run; the demonstration does not quantify the speed or token savings.
The memory layer is presented as working across harnesses running in Oz. Automatic memory creation therefore belongs to the platform’s surrounding workflow, while humans retain the ability to review, version, delete, and edit what it remembers. Changing the harness need not mean giving up this shared mechanism for retaining previous work.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Choose models for recurring classes of work
A factory multiplies the cost of a model choice across recurring work. Using Opus for every triage task or simple CI fix can become prohibitively expensive. Model routing makes that choice depend on the task, so relatively simple work does not automatically inherit the cost of the model selected for harder work. 8:46
Warp offers two ways to make that decision:
- Auto models: Warp maintains routers and evaluates new models for Pareto efficiency—the tradeoff between useful performance and cost, rather than assuming one model should handle everything. Gupta recommends this as a starting point over pinning every task to Opus or Haiku.
- Custom routing rules: A configuration assigns classes of tasks to models. The demonstration includes database migrations assigned to GLM, plus a separate assignment for runbooks and API documentation. These rules express the operator’s judgment about which model suits each kind of work.
Custom rules alone leave the choice “more of an art than a science.” The next step described in the talk is customer-facing evaluation: define what matters in your workflow, vary routing choices, and compare models on a specific class of issues. A generic benchmark cannot settle whether Haiku, GLM, or Opus handles your particular work best. At the time of the recording, these customer-facing evaluation tools are planned work.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Use evaluations to improve the routing rules
Warp already uses an internal evaluation sidecar alongside its routing rules. A prompt is run through multiple agents in Oz using different models, and the comparisons help determine which models work better for which tasks. This supplies the missing improvement mechanism. Routing rules begin as choices; repeated comparisons give the team evidence for changing those choices. 11:42
What relationship does this evaluation make visible? The diagram separates the rules used to choose a model from the comparisons used to inform those rules. The useful output is knowledge about a task class, which can guide later routing rather than remaining an isolated result from one run.
One internal finding changes a concrete routing decision: Gupta reports that GLM handles UI tasks well enough that Warp can use it more efficiently than Opus for that work. The talk supplies no quantitative scores, scoring procedure, or task distribution, so this supports Warp’s reported routing choice rather than a general ranking of the models. The closing product direction is to bring these evaluations into customers’ own workflows, allowing each factory to improve its routing with evidence from the work it actually performs.
Work submitted for an agent to perform.
The internal sidecar compares agents using different models on a prompt. Task-specific findings inform model choices; customer-facing evaluations are the proposed next step.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
From the talk
- WarpReference
The development environment and cloud agent platform used in the demonstrations of triage skills, persistent memory, and model routing.
Read the complete timestamped transcript
- 0:12
Um my name is Siraj Gupta. I lead
- 0:14
Harness development at Warp. Um in case
- 0:16
you haven't heard of Warp before, um we
- 0:18
started off by building a
- 0:20
state-of-the-art agentic development
- 0:22
environment. Um we have about a million
- 0:24
active users that use that. Um it was
- 0:26
born out of a modern-day terminal.
- 0:28
Um and nowadays we're building a um
- 0:31
cloud agent platform to enable teams to
- 0:33
build software factories.
- 0:35
Um today I'm going to talk about um
- 0:38
self-improving software factories, which
- 0:40
I know might sound kind of buzzy, um
- 0:43
but I'm going to break it down and
- 0:44
hopefully you can walk out of here with
- 0:45
something concrete that you can
- 0:46
implement yourselves.
- 0:48
Um you've probably heard of both of
- 0:50
these terms, self-improvement and
- 0:52
software factories, used throughout this
- 0:53
conference, but I'm sure you've heard of
- 0:55
them independently.
- 0:57
Um
- 0:57
you've heard about how
- 0:59
self-improvement is about agents being
- 1:01
able to
- 1:02
um
- 1:03
improve over time and agents and models
- 1:06
um
- 1:06
and, you know, phasing out humans from
- 1:08
that loop, so that way the the
- 1:10
improvement loop can be automatic. Um
- 1:13
and I'm sure you've heard about software
- 1:14
factories being
- 1:16
um the way that like the software
- 1:18
development paradigm is shifting from
- 1:20
individual coding agents to building out
- 1:22
automations that take work from triage
- 1:25
up until production. Um but less has
- 1:27
been said about how software factories
- 1:30
themselves can self-improve over time,
- 1:32
so that the the factory can get better,
- 1:34
more efficient, faster. Um and I think
- 1:37
this is going to become an extremely
- 1:38
important part of our jobs as software
- 1:40
engineers as we transition from building
- 1:43
products to building factories and and
- 1:45
maintaining them.
- 1:46
Um so let's dive in. Um
- 1:49
self-improvement is a pretty broad
- 1:50
umbrella, but I'm going to focus on
- 1:52
three concrete ways that agents can
- 1:54
improve over time, agent factories can
- 1:57
improve over time. I'm going to start
- 1:58
with um skills, then we'll talk about
- 2:00
persistent memory, and then I'll finish
- 2:02
off by talking about model routing.
- 2:04
Um so
- 2:06
skills are a great way to give your
- 2:07
agents procedural memory. I don't think
- 2:09
I have to kind of spell that out for
- 2:10
you. You describe a a procedure to your
- 2:13
agent that you expect it to have to do a
- 2:15
task over and over. Um for example,
- 2:18
let's say you're building a triage
- 2:19
agent, which is a pretty common thing
- 2:20
you might build in a software factory.
- 2:23
Um
- 2:24
and you give it a skill on how you want
- 2:26
it to go about reproducing issues. Um
- 2:28
those skills get stale over time. Um
- 2:30
humans give feedback to the agents.
- 2:32
Agents learn things in their own um runs
- 2:35
and trajectories.
- 2:36
Um and
- 2:38
the like the skill that you previously
- 2:40
gave it becomes dated. So, how do we fix
- 2:42
this and let the agent improve over time
- 2:44
using that skill?
- 2:45
Well, one way to do it is to deploy an
- 2:47
outer loop agent. Um and this is what
- 2:49
we've done in our own internal software
- 2:51
factory that's been really productive.
- 2:53
The idea is that your um
- 2:56
your inner loop agent is the thing
- 2:58
that's actually applying the skill. It's
- 3:00
like doing the triage. And then you have
- 3:02
this other outer loop agent that is
- 3:03
observing your inner loop agent's runs
- 3:06
and improving its skill over time by
- 3:08
looking for
- 3:09
um
- 3:10
for mistakes it made or looking at
- 3:12
feedback that the human has given it.
- 3:14
Um so, I'm going to show an example of
- 3:15
that.
- 3:16
Um let me swap here. Cool. Um so, this
- 3:20
is actually a skill that we've used
- 3:22
internally at Warp. We've open-sourced
- 3:24
our client repository and it's fully run
- 3:26
as as a factory. And so, this is an
- 3:28
example of an of a
- 3:31
of a skill that's that's backing a
- 3:32
triage agent that we have today.
- 3:34
The idea is that um
- 3:37
you you get an issue that comes in on
- 3:39
GitHub, and you want to automatically
- 3:41
run an agent to figure out like what
- 3:43
sorts of um
- 3:44
like it what sort of information did the
- 3:46
user not provide that is going to help
- 3:48
us figure out if this is something that
- 3:49
we should build, an existing issue that
- 3:51
we might actually just want to dedupe
- 3:52
against or something else.
- 3:54
Um
- 3:55
and then we have a Sorry, let me just
- 3:57
switch over here.
- 3:59
And then we have a workflow that
- 4:01
actually like runs that that triage um
- 4:05
agent.
- 4:06
Um this is a pretty simple workflow. It
- 4:07
just Every time an an an issue gets
- 4:10
submitted on the repo, this
- 4:11
um this workflow runs. And then here's
- 4:14
the actual outer loop agent, which is
- 4:15
about looking at the the work that the
- 4:18
triage agent has done and improving it
- 4:19
over time. So, the idea is that the
- 4:22
agent looks at the decisions that the
- 4:24
triage the inner loop triage agent made,
- 4:26
and it um collects feedback signals,
- 4:28
which might be uh you know, thumbs up or
- 4:30
thumbs down on the issues. Um it might
- 4:33
be users commenting on the issue. It
- 4:35
might be someone from Warp um an
- 4:37
employee of Warp commenting on the
- 4:38
issue, uh giving the agent feedback on
- 4:40
what it did.
- 4:42
Um and then ultimately that leads to
- 4:44
like some synthesis of of the of that um
- 4:48
iteration. And so, we we end up
- 4:50
basically updating our inner loop skill
- 4:53
with this outer loop agents. Um and
- 4:55
that's what leads to this
- 4:56
self-improvement loop with skills.
- 4:58
What's really nice about this is that um
- 5:00
the
- 5:01
So, in step four, you'll see we we added
- 5:03
the triage skill, and then we open a
- 5:04
pull request. So, that means that um all
- 5:06
of the improvements to the inner loop
- 5:08
skill are going to be tracked through
- 5:10
get. So, you get like full observability
- 5:12
into like how that skill is transformed
- 5:14
over time. And that it also means that
- 5:16
um
- 5:17
a human is actually going to review
- 5:18
those updates to the skill. So, that
- 5:20
way, you know, this this outer loop
- 5:21
agent doesn't make a mistake and
- 5:23
ultimately cause your triage agent to to
- 5:24
actually perform worse.
- 5:26
Um
- 5:27
yeah, so that's that's kind of what what
- 5:29
I want to talk about for skills. Um
- 5:32
let me talk about persistent memory now.
- 5:35
So, I'm going to go back to my deck.
- 5:37
Um
- 5:39
cool. So, skills are great for
- 5:41
remembering procedures, but what about
- 5:42
everything else? So, like what what
- 5:44
happens when your Sentry agent
- 5:46
um looks for
- 5:48
an issue and
- 5:50
and finds an issue, does some work to
- 5:52
like gather context about it, and fixes
- 5:55
it, but then now you have you encounter
- 5:57
a similar issue in the future.
- 6:00
Your century your agent might get lucky
- 6:02
and like be able to figure out the same
- 6:05
root cause that it did the first time
- 6:06
around, but that's not guaranteed. And
- 6:08
and even if it does, you're you've
- 6:10
probably wasted a lot of tokens
- 6:11
re-gathering context on an issue that
- 6:13
you've already fixed before. So, that's
- 6:15
where
- 6:16
something like persistent memory comes
- 6:17
in.
- 6:18
You can think of this as a fact store
- 6:20
scoped to an agent. Your agent runs and
- 6:23
similar to the skill improvement loop,
- 6:24
you have an outer loop agent that's
- 6:26
going to extract facts, learnings,
- 6:27
outcomes
- 6:28
from your from your inner loop agent.
- 6:30
So, that way future runs of the agent
- 6:32
can lean on what's already been done in
- 6:33
the past.
- 6:35
So, I'm going to show an example of
- 6:36
this. Come back to the deck here.
- 6:39
So, in warp or in Oz rather, like I
- 6:42
mentioned, we built out a a cloud agent
- 6:43
platform where you can run agents in the
- 6:45
cloud. And
- 6:48
for all for all these agents, you can
- 6:49
attach memory stores to them. Again, a
- 6:51
memory a memory store is a collection of
- 6:53
facts. In this case, I have a century
- 6:55
agent that
- 6:57
has collected some memories over time
- 7:00
about root cause analysis that it's done
- 7:02
in the past. What's cool is like you can
- 7:04
actually version this memory, you can
- 7:05
update it as a human, create new
- 7:07
memories or delete them yourselves,
- 7:09
but primarily this this memory creation
- 7:11
loop is driven by agents. You can also
- 7:14
see where these memories were sourced
- 7:16
from. So,
- 7:17
I can actually like open up the run here
- 7:19
to see
- 7:20
Oh, well.
- 7:22
I think this my IP address here keeps
- 7:24
changing and this my our staging
- 7:25
platform is gated to an IP address, but
- 7:28
anyways,
- 7:29
you should like
- 7:30
you can see where those memories were
- 7:32
sourced from. So, that way you can be
- 7:34
like, oh, like maybe that wasn't
- 7:35
actually an important memory or that was
- 7:36
kind of like a local maxima that I don't
- 7:38
want to include in my memory store. Um
- 7:41
and then when your agents continue to
- 7:43
run, so in this case I have the sentry
- 7:45
agent that's
- 7:46
um that's done a bunch of runs after
- 7:48
it's created those memories, it actually
- 7:49
can lean on those memories in the future
- 7:51
um when it's making um
- 7:53
when it's triaging new issues. So in
- 7:55
this case, you'll notice that um
- 7:57
this agent ran, it did a bunch of work
- 7:59
to do some root cause analysis, and then
- 8:01
it ultimately reported back on which
- 8:02
memories it used
- 8:04
um
- 8:05
uh in this case it it it it was able to
- 8:07
use those um five memories that I had in
- 8:09
that memory sort to to speed up the work
- 8:11
that I did this time around.
- 8:13
Um,
- 8:15
cool. Uh
- 8:16
let me go back to the deck.
- 8:20
So,
- 8:21
what's cool in Oz is that persistent
- 8:23
memory works across all harnesses, so
- 8:25
Warp Zone, proprietary harness, plot
- 8:27
code, Kodak, it doesn't really matter
- 8:28
what you're running on Oz, um memories
- 8:30
will automatically be created for you.
- 8:32
Um, but you also have the control to to
- 8:35
review those memories, version them,
- 8:37
delete them, or edit them as you please.
- 8:39
Um, all that being fully traceable.
- 8:42
Um, cool. That's what I wanted to say
- 8:44
about memory. Um,
- 8:46
last thing I want to talk about here is
- 8:48
model routing. So, um you may be
- 8:50
wondering how this plays into
- 8:51
self-improvement loops for um factories.
- 8:54
Well, first I want to touch on why model
- 8:55
routing is important in a factory in the
- 8:56
first place.
- 8:57
Um, it can become prohibitively
- 8:59
expensive to run all of your agents that
- 9:01
are doing simple things like triage or
- 9:03
fixing simple CI failures with Opus.
- 9:05
That's just like going to be really
- 9:07
expensive over time, and I'm sure some
- 9:08
of you have maybe been burnt by this or
- 9:10
have heard stories of of or
- 9:12
organizations being burnt by this. Um,
- 9:14
so model like choosing which models you
- 9:16
use for which tasks that is actually
- 9:18
very important um and something that
- 9:19
we're we've been working on at work.
- 9:21
Um, so in Warp, you can actually use uh
- 9:24
our out-of-the-box model routers, we
- 9:25
call them our auto models. Um, over like
- 9:28
as new models come out, we're all we're
- 9:29
always evaluating like what are the best
- 9:31
models when it comes to Pareto
- 9:32
efficiency. And so, like if you're a new
- 9:35
user and you just want to get started,
- 9:36
it's much better than like pinning your
- 9:38
model to like Opus or or or Haiku, for
- 9:41
example. Um
- 9:44
let me show you all um that experience
- 9:46
in Warp.
- 9:47
So, let me go here.
- 9:53
Give me 1 sec.
- 9:54
Got to drag this over here.
- 9:56
So, here I have my Warp desktop um and
- 9:59
you can see that um alongside being able
- 10:01
to define models um
- 10:04
being able to use Warp's auto models is
- 10:06
one option, like these models here, but
- 10:08
you can also define your own model
- 10:10
routed um
- 10:12
uh models, which uh basically boil down
- 10:15
to like a set of rules that you can give
- 10:16
um to us and we will like make decisions
- 10:19
about model routing based on those
- 10:20
rules. So, here I have an example of a
- 10:23
configuration file that I've defined um
- 10:25
where I've defined a few different rules
- 10:26
about like I want database migrations
- 10:29
done with with GLM fire with GLM or I
- 10:31
want um you know, uh runbooks and API
- 10:34
documentation done with Quen. Um
- 10:38
So, this really allows you to like like
- 10:39
to define classes of tasks and be able
- 10:42
to say, "Okay, I want this this class of
- 10:44
task done by this model because that's
- 10:46
kind of what you've seen."
- 10:47
At this point though, that's kind of
- 10:49
more of an art than a science um and so
- 10:52
uh what we're working on next is being
- 10:53
able to define evals for um
- 10:56
customer-facing evals where you can
- 10:58
actually define what sorts of things you
- 11:00
care about and what knobs you want to
- 11:02
turn on these configurations and
- 11:04
actually see, "Okay, is is Haiku better
- 11:07
than fi- than GLM than Opus in a
- 11:10
specific class of issues?" That's like
- 11:11
specific to your workflows and not just
- 11:13
some like generic benchmark that um that
- 11:16
someone posted online.
- 11:19
Um let me go back here. Give me a sec.
- 11:24
Cool.
- 11:30
Cool. Um
- 11:33
and yeah, so let me uh I'm in my
- 11:35
slideshow.
- 11:42
So, here is kind of like a a high-level
- 11:44
overview of how this works in Warp
- 11:46
today. So, um internally we have our
- 11:48
model routing rules, um but then we have
- 11:51
like an eval sidecar that's determining
- 11:53
um what sorts of tasks are actually
- 11:55
better with which models. And we do this
- 11:56
with a simple like best-at-k um approach
- 11:59
where when you type a prompt, we run a
- 12:01
bunch of agents in Oz uh across a
- 12:03
different set of models. Um and we found
- 12:05
success in like being able to determine,
- 12:06
"Oh, like UI tasks are really well done
- 12:09
with GLM. Um we don't really need to run
- 12:11
those with Opus. It's much more
- 12:12
efficient to run those with GLM."
- 12:14
Um so, that's how we've been using it,
- 12:15
but um sooner enough we're going to be
- 12:16
building this into our product so that
- 12:18
way our our customers can actually use
- 12:20
it in their own workflows. Um
- 12:23
Yeah, that's uh that's mostly what I had
- 12:25
today. Um
- 12:26
we're around in a booth around that
- 12:28
side. So, if you're interested in this
- 12:29
kind of stuff, come talk to me. I'm
- 12:31
always down to talk about this kind of
- 12:32
stuff. But yeah, thanks for your time
- 12:34
today. That's all I had.
- 12:49
>> [music]