AI Engineer World's Fair 2026
How Software Factories Improve Themselves — Suraj Gupta, Warp
Slide chapters
21 slide and demo groups · Timestamps are approximate.
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.
A skill improves through a separate review loop
Read the diagram as text
- Triage skill. Procedure used for recurring issue triage.
- Inner-loop agent. Applies the skill to incoming GitHub issues.
- Outer-loop agent. Examines decisions, mistakes, reactions, and comments.
- Pull request and human review. Proposed skill edits remain visible in Git.
- Triage skill → Inner-loop agent: Guides execution.
- Inner-loop agent → Outer-loop agent: Runs and feedback.
- Outer-loop agent → Pull request and human review: Proposes skill update.
- Pull request and human review → Triage skill: Reviews updates before 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.
Comparing models informs future routing
Read the diagram as text
- Prompt. Work submitted for an agent to perform.
- Agents across models. Oz runs multiple agents using different models.
- Evaluation sidecar. Determines which models work better for task classes.
- Routing choices. For example, Warp reports using GLM efficiently for UI tasks.
- Prompt → Agents across models: Run across models.
- Agents across models → Evaluation sidecar: Compare task performance.
- Evaluation sidecar → Routing choices: Inform model selection.
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
8 slide groups · 13 demo milestones. Extracted from the recording; expand builds to follow changes. Timestamps are approximate.
- 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.
Suraj Gupta
Suraj Gupta leads harness development at Warp, which is building a cloud agent platform for teams to build software factories. He previously worked at Snowflake.
Text in image
Suraj Gupta AI Engineering Lead @ Warp Previously @ Snowflake Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help Untitled AI Engineer Expo Talk Audience · AI Engineer Expo Talk Growth New slide Building Self-Improving Agent Software Factories Self-improvement How do factory agents get better over time? Skills Agent Memory Design Animate 63% Slide 3 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 1 Add presenter notes... Start with a draft Share
- 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
Self-improvement
The diagram places each factory agent run inside a larger loop: agent results are consolidated and the agent configuration is updated for future runs.
Text in image
Self-improvement Consolidation of agent results Self-improvement loop New agent run started Agent completes execution Factory Agent Context surfaced New learnings / outcomes Agent config updated 4 Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help Cooking · in 28m Wed Jul 1 5:01 PM Untitled AI Engineer Expo Talk Audience · AI Engineer Expo Talk - Fi[illegible] AI Engineer Expo Talk Growth New slide Design Animate 63% Share Slide 4 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Color 2 Accent 1 Color 1 000000 100% FFFFFF 100% Add presenter notes... Start with a draft
- 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
How do factory agents get better over time?
Gupta outlines three ways agent factories can improve: skills, persistent memory, and model routing.
Text in image
How do factory agents get better over time? Skills Memory Model routing 5 Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help Cooking · in 28m Wed Jul 1 5:01 PM Untitled AI Engineer Expo Talk Growth New slide Design Animate 63% Slide 5 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Accent 1 Color 1 0B5AFF 100% FFFFFF 100% Add presenter notes... Start with a draft
- 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
Skills
A triage agent classifies new issues in the inner loop. An outer-loop agent reviews comments and creates PRs to improve the skill, drawing on feedback and observations from triage runs.
Text in image
Skills Inner loop issue-triage/SKILL.md New issues get created Triage agent classifies issues Outer loop improve-issue-triage/SKILL.md Skill updater reviews comments Agent creates PRs to improve skills 6 Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help AI Engineer Expo Talk Growth New slide Design Animate 63% Slide 6 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Color 1 000000 100% 0B5AFF 100% FFFFFF 100% Add presenter notes...
- 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
Issue-triage skill
Warp’s issue-triage skill classifies new GitHub issues, applies a matching label and requests feedback. A separate agent updates the skill’s version when it revises the instructions.
Text in image
name: triage-issue description: Triage a newly opened GitHub issue into one of three buckets (ready-to-implement, needs-info, duplicate), apply the matching label, and post a triage comment requesting feedback. Use when a new issue needs triage. version: 1 Triage Issue You are triaging a single GitHub issue. You will be given the repository and issue number. Use the gh CLI for all GitHub interactions. Skill version This skill is at version 1. Always embed the current version number in the triage comment marker (see below). This version is bumped automatically by the improve-triage-skill agent when it revises this skill. Steps 1. Read the issue. gh issue view <number> --repo <owner>/<repo> --json title,body,author,labels,createdAt Interface text: github.com/warpdotdev-demos/issue-triage-loop/blob/main/.agents/skills/triage-issue/SKILL.md warpdotdev-demos / issue-triage-loop Code Issues 5 Pull requests 1 Discussions Actions Projects Wiki Security and quality Insights Settings main issue-triage-loop / .agents / skills / triage-issue / SKILL.md zachlloyd and oz-agent Add issue triage self-improvement loop: skills, workflow, seed script 09fd53d · 3 weeks ago History Preview Code Blame 80 lines (60 loc) · 3.96 KB Raw
3:17Demo milestone
- 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
Issue-triage workflow
When an issue is opened, a GitHub Actions workflow runs the triage agent with the issue number and title, then prints its output.
Text in image
name: Triage new issues on: issues: types: [opened] jobs: triage: runs-on: ubuntu-latest permissions: contents: read issues: write steps: - uses: actions/checkout@v6 - uses: warpdotdev/oz-agent-action@v1 id: agent env: GH_TOKEN: ${{ github.token }} with: skill: 'triage-issue' prompt: | Triage issue #${{ github.event.issue.number }} in the repository ${{ github.repository }}. Issue title: ${{ github.event.issue.title }} warp_api_key: ${{ secrets.WARP_API_KEY }} - name: Print agent output env: AGENT_OUTPUT: ${{ steps.agent.outputs.agent_output }} run: printf '%s\n' "$AGENT_OUTPUT" Interface text: github.com/warpdotdev-demos/issue-triage-loop/blob/main/.github/workflows/triage-new-issues.yml Files main Go to file .agents .github/workflows triage-new-issues.yml scripts README.md issue-triage-loop / .github / workflows / triage-new-issues.yml View Runs zachlloyd and oz-agent: Print agent output via env var to avoid shell interpolation failures b9aa228 · 3 weeks ago History Code Blame 28 lines (26 loc) · 752 Bytes Raw4:00Demo milestone
- 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
Improve Triage Skill
The improvement skill reviews the triage agent’s past decisions and proposes edits in a pull request. It starts with issues updated in the last 14 days and looks for versioned triage comments.
Text in image
name: improve-triage-skill description: Observe how humans responded to past automated issue triage and propose improvements to the triage-issue skill via a pull request. Use on a schedule or on demand to evolve the triage skill from real feedback. Improve Triage Skill You are the self-improvement half of an issue-triage loop. Your job is to study how maintainers and issue authors reacted to past triage decisions made by the triage-issue skill (.agents/skills/triage-issue/SKILL.md), extract generalizable lessons, and propose edits to that skill in a pull request. Use the gh CLI for all GitHub interactions. Work in the repository this skill lives in. Step 1: Find past triage decisions Find issues updated in the last 14 days that carry a triage comment. Triage comments always begin with the marker <!-- oz-triage v: <N> -->, where <N> is the skill version that produced them. gh issue list --repo <owner>/<repo> --state all --search "updated:>=<date-14-days-ago>" \ --json number --limit 100 For each issue, fetch its comments and look for the marker: gh api repos/<owner>/<repo>/issues/<number>/comments Interface text: Chrome File Edit View History Bookmarks Profiles Tab Window Help Cooking · in 26m Wed Jul 1 5:03 PM Sentry Demo | Memories - Oz Runs - Oz Warp Ask Gemini https://github.com/warpdotdev-demos/issue-triage-loop/blob/main/.agents/skills/improve-triage-skill/SKILL.md Code Issues 5 Pull requests 1 Discussions Actions Projects Wiki Security and quality Insights Settings Files main Go to file .agents/skills improve-triage-skill SKILL.md triage-issue .github scripts README.md issue-triage-loop / .agents / skills / improve-triage-skill / SKILL.md zachlloyd and oz-agent Add issue triage self-improvement loop: skills, workflow, seed script 09fd53d · 3 weeks ago History Preview Code Blame 89 lines (61 loc) · 5.15 KB Raw4:13Demo milestone
- 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
Find Decisions and Collect Feedback
The improvement skill searches for triage decisions on issues updated in the last 14 days, then checks reactions, human replies and label changes for feedback on the bot’s choices.
Text in image
decisions made by the triage-issue skill (.agents/skills/triage-issue/SKILL.md), extract generalizable lessons, and propose edits to that skill in a pull request. Use the gh CLI for all GitHub interactions. Work in the repository this skill lives in. Step 1: Find past triage decisions Find issues updated in the last 14 days that carry a triage comment. Triage comments always begin with the marker <!-- oz-triage v: <N> -->, where <N> is the skill version that produced them. gh issue list --repo <owner>/<repo> --state all --search "updated:>=<date-14-days-ago>" \ --json number --limit 100 For each issue, fetch its comments and look for the marker: gh api repos/<owner>/<repo>/issues/<number>/comments Skip issues with no triage comment. Record for each triaged issue: the triage comment ID, the skill version from the marker, and the bucket the bot chose (from the ## Triage: heading). Step 2: Collect feedback signals For each triaged issue, gather: 1. Reactions on the triage comment — 👍 means correct, 👎 means incorrect: gh api repos/<owner>/<repo>/issues/comments/<comment-id>/reactions 2. Human replies after the triage comment — corrections ("this isn't a duplicate", "this is actually actionable"), answered follow-up questions, or complaints. Ignore other bot comments. 3. Bucket drift — compare the bucket the bot applied with the issue's current labels: [illegible] Interface text: github.com/warpdotdev-demos/issue-triage-loop/blob/main/.agents/skills/improve-triage-skill/SKILL.md issue-triage-loop / .agents / skills / improve-triage-skill / SKILL.md Files main Go to file .agents/skills improve-triage-skill SKILL.md triage-issue .github scripts README.md Preview Code Blame 89 lines (61 loc) · 5.15 KB Raw Top4:22Demo milestone
- 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
Feedback Signals and Lessons
The improvement skill compares reactions, human replies, label changes and duplicate decisions, then turns those signals into generalizable lessons for the triage skill.
Text in image
Skip issues with no triage comment. Record for each triaged issue: the triage comment ID, the skill version from the marker, and the bucket the bot chose (from the ## Triage: heading). Step 2: Collect feedback signals For each triaged issue, gather: 1. Reactions on the triage comment — 👍 means correct, 👎 means incorrect: gh api repos/<owner>/<repo>/issues/comments/<comment-id>/reactions 2. Human replies after the triage comment — corrections ("this isn't a duplicate", "this is actually actionable"), answered follow-up questions, or complaints. Ignore other bot comments. 3. Bucket drift — compare the bucket the bot applied with the issue's current labels: gh issue view <number> --repo <owner>/<repo> --json labels,state,stateReason A maintainer replacing the bot's bucket label is ground truth that the bot was wrong. 4. Duplicate accuracy — issues closed as duplicate (stateReason: "not_planned" with a duplicate reference, or maintainer comments saying so) that the bot did NOT bucket as duplicate, and issues the bot called duplicate that maintainers kept open. Step 3: Synthesize lessons Turn the signals into a small number of generalizable lessons. A good lesson describes a category of issue and the correct handling, e.g.: • "Crash reports without OS/version info were marked ready-to-implement twice and corrected to needs-info — require environment details for crash reports." • "Feature requests that name a desired UI change but no motivation were accepted by maintainers — do not demand acceptance criteria for small UI tweaks." Bad lessons are one-off fixes ("issue #14 was mislabeled") — never write those. Weight the signals: maintainer relabels and explicit correction replies are strong; reactions are moderate; absence of feedback is weak positive (silence usually means the triage was acceptable). Interface text: Chrome File Edit View History Bookmarks Profiles Tab Window Help Cooking · in 26m Wed Jul 1 5:04 PM Sentry Demo | Memories - Oz Runs - Oz Warp Ask Gemini Work github.com/warpdotdev-demos/issue-triage-loop/blob/main/.agents/skills/improve-triage-skill/SKILL.md Files main Go to file .agents/skills improve-triage-skill SKILL.md triage-issue .github scripts README.md issue-triage-loop / .agents / skills / improve-triage-skill / SKILL.md Top Preview Code Blame 89 lines (61 loc) · 5.15 KB Raw4:35Demo milestone
- 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
Synthesize Lessons and Edit the Skill
The outer-loop agent turns feedback into generalizable lessons and updates the triage skill only when a lesson is well supported. The instructions also call for incrementing the skill version.
Text in image
gh issue view <number> --repo <owner>/<repo> --json labels,state,stateReason A maintainer replacing the bot's bucket label is ground truth that the bot was wrong. 4. Duplicate accuracy — issues closed as duplicate (stateReason: "not_planned" with a duplicate reference, or maintainer comments saying so) that the bot did NOT bucket as duplicate, and issues the bot called duplicate that maintainers kept open. Step 3: Synthesize lessons Turn the signals into a small number of generalizable lessons. A good lesson describes a category of issue and the correct handling, e.g.: • "Crash reports without OS/version info were marked ready-to-implement twice and corrected to needs-info — require environment details for crash reports." • "Feature requests that name a desired UI change but no motivation were accepted by maintainers — do not demand acceptance criteria for small UI tweaks." Bad lessons are one-off fixes ("issue #14 was mislabeled") — never write those. Weight the signals: maintainer relabels and explicit correction replies are strong; reactions are moderate; absence of feedback is weak positive (silence usually means the triage was acceptable). Step 4: Edit the triage skill If (and only if) you found at least one well-supported lesson, edit .agents/skills/triage-issue/SKILL.md: • Append each lesson as a bullet under ## Learned guidelines (replace the "(None yet.)" placeholder if present). Each bullet should be a single imperative guideline, optionally with a parenthetical note of the evidence, e.g. (observed: 2 maintainer relabels). • If a lesson contradicts an existing learned guideline, revise or remove the old one rather than adding a conflicting bullet. • If a lesson warrants it, adjust the bucket definitions in the classification step directly — but keep the three buckets exactly as they are (ready-to-implement, needs-info, duplicate). • Bump the version: increment version: in the frontmatter, the "version N" text in the ## Skill version section, and the v:<N> in the comment template. Interface text: Chrome File Edit View History Bookmarks Profiles Tab Window Help Cooking · in 25m Wed Jul 1 5:04 PM Sentry Demo | Memories - Oz Runs - Oz Warp Ask Gemini https://github.com/warpdotdev-demos/issue-triage-loop/blob/main/.agents/skills/improve-triage-skill/SKILL.md Files main Go to file .agents/skills improve-triage-skill SKILL.md triage-issue .github scripts README.md issue-triage-loop / .agents / skills / improve-triage-skill / SKILL.md Preview Code Blame 89 lines (61 loc) · 5.15 KB Raw Top4:44Demo milestone
- 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
Guardrails and Pull Request
The improvement skill changes triage only when lessons are well supported, then opens a pull request so humans can review changes tracked in Git. Weak or conflicting feedback leaves the skill unchanged.
Text in image
Step 4: Edit the triage skill If (and only if) you found at least one well-supported lesson, edit .agents/skills/triage-issue/SKILL.md: • Append each lesson as a bullet under ## Learned guidelines (replace the "(None yet.)" placeholder if present). Each bullet should be a single imperative guideline, optionally with a parenthetical note of the evidence, e.g. (observed: 2 maintainer relabels). • If a lesson contradicts an existing learned guideline, revise or remove the old one rather than adding a conflicting bullet. • If a lesson warrants it, adjust the bucket definitions in the classification step directly — but keep the three buckets exactly as they are (ready-to-implement, needs-info, duplicate). • Bump the version: increment version: in the frontmatter, the "version N" text in the ## Skill version section, and the v:<N> in the comment template. Guardrails • Never change the <!-- oz-triage v:<N> --> marker convention, the feedback footer, the three bucket names, or remove the ## Learned guidelines section. • Keep ## Learned guidelines to at most 15 bullets. When at the limit, consolidate overlapping guidelines or prune the weakest-evidenced ones. • If feedback signals are weak or conflicting, make no change. An empty run is a valid outcome — report "no changes warranted" and stop without opening a PR. Step 5: Open a pull request Never commit to the default branch. Create a branch and PR: git checkout -b skill-improvement/<YYYY-MM-DD> git add .agents/skills/triage-issue/SKILL.md git commit -m "Improve triage-issue skill from feedback (v<old> -> v<new>)" git push -u origin skill-improvement/<YYYY-MM-DD> gh pr create --title "Triage skill v<new>: <one-line summary>" --body-file <tempfile> The PR body must include: Interface text: github.com/warpdotdev-demos/issue-triage-loop/blob/main/.agents/skills/improve-triage-skill/SKILL.md Files; main; Go to file .agents/skills; improve-triage-skill; SKILL.md; triage-issue; .github; scripts; README.md issue-triage-loop / .agents / skills / improve-triage-skill / SKILL.md Preview; Code; Blame; 89 lines (61 loc) · 5.15 KB; Raw; Top
5:03Demo milestone
- 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.
Skills
A triage agent classifies new issues in the inner loop. An outer-loop agent reviews comments and creates PRs to improve the skill, drawing on feedback and observations from triage runs.
Text in image
Skills Inner loop issue-triage/SKILL.md New issues get created Triage agent classifies issues Outer loop improve-issue-triage/SKILL.md Skill updater reviews comments Agent creates PRs to improve skills 6 Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help AI Engineer Expo Talk Growth New slide Design Animate 63% Slide 6 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Color 1 000000 100% 0B5AFF 100% FFFFFF 100% Add presenter notes...
- 5:35
So, I'm going to go back to my deck.
- 5:37
Um
Agent Memory
After an agent session, an outer-loop agent extracts facts and updates memory so future runs can use what earlier runs learned.
Text in image
Agent Memory Agent Session Automatic Post-Session Extraction Extract Facts Update Memories Agent Memory 7 Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help AI Engineer Expo Talk Growth New slide Design Animate 63% Slide 7 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Accent 1 Color 1 000000 100% FFFFFF 100% 085AFF 100% FFFFFF 15% Add presenter notes... Start with a draft
- 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
Guardrails and Pull Request
The improvement skill changes triage only when lessons are well supported, then opens a pull request so humans can review changes tracked in Git. Weak or conflicting feedback leaves the skill unchanged.
Text in image
Step 4: Edit the triage skill If (and only if) you found at least one well-supported lesson, edit .agents/skills/triage-issue/SKILL.md: • Append each lesson as a bullet under ## Learned guidelines (replace the "(None yet.)" placeholder if present). Each bullet should be a single imperative guideline, optionally with a parenthetical note of the evidence, e.g. (observed: 2 maintainer relabels). • If a lesson contradicts an existing learned guideline, revise or remove the old one rather than adding a conflicting bullet. • If a lesson warrants it, adjust the bucket definitions in the classification step directly — but keep the three buckets exactly as they are (ready-to-implement, needs-info, duplicate). • Bump the version: increment version: in the frontmatter, the "version N" text in the ## Skill version section, and the v:<N> in the comment template. Guardrails • Never change the <!-- oz-triage v:<N> --> marker convention, the feedback footer, the three bucket names, or remove the ## Learned guidelines section. • Keep ## Learned guidelines to at most 15 bullets. When at the limit, consolidate overlapping guidelines or prune the weakest-evidenced ones. • If feedback signals are weak or conflicting, make no change. An empty run is a valid outcome — report "no changes warranted" and stop without opening a PR. Step 5: Open a pull request Never commit to the default branch. Create a branch and PR: git checkout -b skill-improvement/<YYYY-MM-DD> git add .agents/skills/triage-issue/SKILL.md git commit -m "Improve triage-issue skill from feedback (v<old> -> v<new>)" git push -u origin skill-improvement/<YYYY-MM-DD> gh pr create --title "Triage skill v<new>: <one-line summary>" --body-file <tempfile> The PR body must include: Interface text: github.com/warpdotdev-demos/issue-triage-loop/blob/main/.agents/skills/improve-triage-skill/SKILL.md Files; main; Go to file .agents/skills; improve-triage-skill; SKILL.md; triage-issue; .github; scripts; README.md issue-triage-loop / .agents / skills / improve-triage-skill / SKILL.md Preview; Code; Blame; 89 lines (61 loc) · 5.15 KB; Raw; Top
6:36Demo milestone
- 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
Agent memory store
The Sentry demo shows a memory store attached to an agent, with saved debugging lessons and controls to create, edit, delete, and view versions of memories.
Text in image
Sentry Demo Store UID [illegible] Owner Team Created Jun 1, 2026, 11:02 AM Updated Jun 1, 2026, 11:02 AM Agents 1 total Saleor Sentry Demo Use this to save known noise patterns to skip, saleor codebase architecture notes, past fix patterns that worked, previous triage decisions and their outcomes, root cause analysis, etc. Anything that will help future triage fix runs. READ WRITE Memories 5 total New memory Memory ID [illegible] View Run Updated 28 days ago Saleor payment webhook vulnerability: _validate_transaction_action_data and _validate_transaction_session_action_data both call .get() on response_data without type-checking, causing AttributeError when webhooks return JSON arrays instead of objects. Correct defensive pattern: validate that response_data is a dict before calling .get(), then raise ValueError early for type mismatches (which callers already catch) rather than letting AttributeError propagate. This prevents unexpected exception types from bubbling up. Versions Edit Delete Memory ID [illegible] View Run Updated 28 days ago Error handling principle for React render utilities: When a utility function is called during component render and may encounter malformed data, prefer graceful degradation (log the error + skip/return safe default) over throwing exceptions. This prevents production page crashes while still capturing errors via errorTracker.captureException() for Sentry observability. Apply even when the issue appears to be a schema bug. Example: Dashboard getGiftCardsAmountUsed should never throw from within a .reduce() callback consumed by a render path—log the error and skip the problematic entry instead. Versions Edit Delete Memory ID [illegible] View Run Updated 28 days ago GraphQL null response handling: When GraphQL APIs return { ok: true, data: null }, TypeScript optional chaining must be applied at the root property level. Specifically, executePublicGraphQL can return { ok: true, data: null } at HTTP 200 status; callers must guard against null Interface text: Back Sentry Demo Delete Chrome File Edit View History Bookmarks Profiles Tab Window Help Sentry Demo | Memories - Oz Runs - Oz Warp Ask Gemini Work oz.staging.warp.dev/memory/d52f8149-93ed-4810-b48d-0b23dbbb709d6:42Demo milestone
- 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
Saved troubleshooting memories
The Sentry agent’s memory store records past root-cause findings and fix patterns. Each entry has controls to view its source run, inspect versions, edit or delete it.
Text in image
Saleor Sentry Demo Use this to save known noise patterns to skip, saleor codebase architecture notes, past fix patterns that worked, previous triage decisions and their outcomes, root cause analysis, etc. Anything that will help future triage fix runs. READ WRITE Memories 5 total New memory Memory ID [illegible] View Run Updated 28 days ago Saleor payment webhook vulnerability: _validate_transaction_action_data and _validate_transaction_session_action_data both call .get() on response_data without type-checking, causing AttributeError when webhooks return JSON arrays instead of objects. Correct defensive pattern: validate that response_data is a dict before calling .get(), then raise ValueError early for type mismatches (which callers already catch) rather than letting AttributeError propagate. This prevents unexpected exception types from bubbling up. Versions Edit Delete Memory ID [illegible] View Run Updated 28 days ago Error handling principle for React render utilities: When a utility function is called during component render and may encounter malformed data, prefer graceful degradation (log the error + skip/return safe default) over throwing exceptions. This prevents production page crashes while still capturing errors via errorTracker.captureException() for Sentry observability. Apply even when the issue appears to be a schema bug. Example: Dashboard getGiftCardsAmountUsed should never throw from within a .reduce() callback consumed by a render path—log the error and skip the problematic entry instead. Versions Edit Delete Memory ID [illegible] View Run Updated 28 days ago GraphQL null response handling: When GraphQL APIs return { ok: true, data: null }, TypeScript optional chaining must be applied at the root property level. Specifically, executePublicGraphQL can return { ok: true, data: null } at HTTP 200 status; callers must guard against null result.data with optional chaining or explicit null checks before accessing properties. Incorrect: result.data.collection?.products (crashes if result.data is null). Correct: result.data?.collection?.products (safe guard at each level). Versions Edit Delete Memory ID [illegible] View Run Updated 29 days ago Sentry error-seeding classification pattern: When seed-generated error classes (e.g., TransactionActionDataError, StorefrontDataIntegrityError) don't exist in the product codebase, this indicates the underlying code path handles that scenario gracefully via fallback. Classify such cases as noise when searching the codebase yields no results, as the absence itself proves robustness. Interface text: Chrome File Edit View History Bookmarks Profiles Tab Window Help Cooking · in 23m Wed Jul 1 5:06 PM issue-triage-loop/.agents/ski… issue-triage-loop/.github/wor… issue-triage-loop/.agents/ski… Sentry Demo | Memories - Oz Runs - Oz Warp Ask Gemini https://oz.staging.warp.dev/memory/d52f8149-93ed-4810-b48d-0b23dbbb709d Work https://oz.staging.warp.dev/runs/[illegible]6:59Demo milestone
- 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
Completed Sentry investigation
The completed Sentry run reports fixes for three issues: webhook validation, a null GraphQL response, and missing gift card balance data. It also identifies the saved memories used to guide the fixes.
Text in image
Agent finished Your agent has successfully completed your task. Investigate And Classify Sentry Issues Quick run Oz Web Investigate and fix these Sentry issues: SALEOR-DEMO-D, SALEOR-DEMO-A, and SALEOR-DEMO-7. Check memory for relevant past fixes and other information that can aid in this triage run. Any memories you use, make sure to call them out being [illegible] Show more Status Done Investigated and fixed all three Sentry issues: SALEOR-DEMO-7 (fix_now → saleor backend): AttributeError: 'list' object has no attribute 'get' — Added dict type check to _validate_transaction_action_data and _validate_transaction_session_action_data in saleor/payment/utils.py. When webhook returns a JSON array instead of object, raises ValueError early (callers already catch it). Validated with direct Python execution and ruff. New tests added. SALEOR-DEMO-A (fix_now → saleor-storefront): TypeError: Cannot read properties of null (reading 'collection') — Added optional chaining result.data?.collection in getFeaturedProducts to guard against null GraphQL response data. The page now gracefully falls back to an empty product list. SALEOR-DEMO-D (fix_now → saleor-dashboard): Error: [extractOrderGiftCardUsedAmount] Missing balance — Replaced throw with console.error() + skip in getGiftCardsAmountUsed so the OrderSummary view degrades gracefully. Updated 3 tests. All 52 tests pass. Memories used: Memory from e8b5924e (payment webhook vulnerability pattern) and df3c6489 (prior fix patterns for null collection and gift card balance). Sentry remained read-only — no writes, no events emitted, no secrets printed. Artifacts warpdotdev-demos/saleor#99 sentry/fix-transaction-action-dict-check Interface text: Chrome File Edit View History Bookmarks Profiles Tab Window Help Cooking · in 22m Wed Jul 1 5:07 PM issue-triage-loop/.agents/ski… issue-triage-loop/.github/wo… issue-triage-loop/.agents/ski… Runs - Oz Runs - Oz Warp Ask Gemini oz.staging.warp.dev/runs/019e8dd3-9baf-71fa-a374-a93443ea11a5 Warp staging.warp.dev Memory usage: 465 MB Work View session
7:40Demo milestone
- 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
Sentry triage summary
The Sentry agent reports three PRs, identifies prior fix patterns it used, and lists two candidate memories for future triage. The full backend pytest suite was skipped because Docker was unavailable.
Text in image
All three PRs created. Here is the final triage summary: Sentry sweep: • Query: is:unresolved environment:saleor-sentry-demo • Candidate count: 3 (targeted) • Scope limits: SALEOR-DEMO-D, SALEOR-DEMO-A, SALEOR-DEMO-7 • API gaps: Docker not available in sandbox; full pytest suite skipped for backend Triage decisions: • SALEOR-DEMO-7 (id=[illegible]): fix_now — saleor — Webhook returns JSON array; .get() on list raises AttributeError — PR created • SALEOR-DEMO-A (id=[illegible]): fix_now — saleor-storefront — GraphQL returns data: null with 200; accessing .collection on null crashes page — PR created • SALEOR-DEMO-D (id=[illegible]): fix_now — saleor-dashboard — Gift card event missing balance data; explicit throw crashes OrderSummary view — PR created Delegated investigations: All three investigated inline (single-agent run). Implementation: • Mode: fix-capable • SALEOR-DEMO-7: saleor / sentry/fix-transaction-action-dict-check / PR #99 • SALEOR-DEMO-A: saleor-storefront / sentry/fix-featured-products-null-data / PR #21 • SALEOR-DEMO-D: saleor-dashboard / sentry/fix-giftcard-balance-graceful / PR #90 Sentry safety: • API writes performed: none • Sentry events emitted: none • Secrets printed: none Memories used: • e8b5924e: Confirmed _validate_transaction_action_data and _validate_transaction_session_action_data vulnerability pattern and correct defensive pattern (raise ValueError early) • df3c6489: Confirmed prior fix patterns — optional chaining for SALEOR-DEMO-A, graceful error handling for gift card balance issues Memory candidates: • Storefront executePublicGraphQL can return { ok: true, data: null } when GraphQL responds with { data: null } at 200 status — callers must guard with optional chaining on result.data • Dashboard getGiftCardsAmountUsed should never throw from within a .reduce() callback consumed by a render path — log and skip instead Interface text: Completed Output final triage summary (5/5) Investigate And Classify Sentry Issues View in Oz Status: Done Agent: Saleor Sentry Demo Harness: Warp Artifacts: sentry/fix-transaction-action-dict-... saleor #99 sentry/fix-featured-products-null-d... saleor-storefront #21 sentry/fix-giftcard-balance-graceful saleor-dashboard #90 Directory: /workspace Run ID: [illegible] Credits used: 752.6 Run time: 36.6 min Created on: 10:11 AM on 6/3/2026 Environment details: Name: Saleor Sentry Triage CI ID: [illegible] Image: warpdotdev/dev-web:latest Initial query: Investigate and fix these Sentry issues: SALEOR-DEMO-D, SALEOR-DEMO-A, and SALEOR-DEMO-7. 721.6 credits Ask a follow up staging.warp.dev/conversation/00039952-7e15-45f0-978f-e72af0d4ec7b7:48Demo milestone
Show 2 builds
- 7:48
A completed agent session lists triage decisions, pull requests, memories used, and candidate memories.
Text in image
All three PRs created. Here is the final triage summary: Sentry sweep: • Query: is:unresolved environment:saleor-sentry-demo • Candidate count: 3 (targeted) • Scope limits: SALEOR-DEMO-D, SALEOR-DEMO-A, SALEOR-DEMO-7 • API gaps: Docker not available in sandbox; full pytest suite skipped for backend Triage decisions: • SALEOR-DEMO-7 (id=[illegible]): fix_now — saleor — Webhook returns JSON array; .get() on list raises AttributeError — PR created • SALEOR-DEMO-A (id=[illegible]): fix_now — saleor-storefront — GraphQL returns data: null with 200; accessing .collection on null crashes page — PR created • SALEOR-DEMO-D (id=[illegible]): fix_now — saleor-dashboard — Gift card event missing balance data; explicit throw crashes OrderSummary view — PR created Delegated investigations: All three investigated inline (single-agent run). Implementation: • Mode: fix-capable • SALEOR-DEMO-7: saleor / sentry/fix-transaction-action-dict-check / PR #99 • SALEOR-DEMO-A: saleor-storefront / sentry/fix-featured-products-null-data / PR #21 • SALEOR-DEMO-D: saleor-dashboard / sentry/fix-giftcard-balance-graceful / PR #90 Sentry safety: • API writes performed: none • Sentry events emitted: none • Secrets printed: none Memories used: • e8b5924e: Confirmed _validate_transaction_action_data and _validate_transaction_session_action_data vulnerability pattern and correct defensive pattern (raise ValueError early) • df3c6489: Confirmed prior fix patterns — optional chaining for SALEOR-DEMO-A, graceful error handling for gift card balance issues Memory candidates: • Storefront executePublicGraphQL can return { ok: true, data: null } when GraphQL responds with { data: null } at 200 status — callers must guard with optional chaining on result.data • Dashboard getGiftCardsAmountUsed should never throw from within a .reduce() callback consumed by a render path — log and skip instead Interface text: Completed Output final triage summary (5/5) Investigate And Classify Sentry Issues View in Oz Status: Done Agent: Saleor Sentry Demo Harness: Warp Artifacts: sentry/fix-transaction-action-dict-... saleor #99 sentry/fix-featured-products-null-d... saleor-storefront #21 sentry/fix-giftcard-balance-graceful saleor-dashboard #90 Directory: /workspace Run ID: [illegible] Credits used: 752.6 Run time: 36.6 min Created on: 10:11 AM on 6/3/2026 Environment details: Name: Saleor Sentry Triage CI ID: [illegible] Image: warpdotdev/dev-web:latest Initial query: Investigate and fix these Sentry issues: SALEOR-DEMO-D, SALEOR-DEMO-A, and SALEOR-DEMO-7. 721.6 credits Ask a follow up staging.warp.dev/conversation/00039952-7e15-45f0-978f-e72af0d4ec7b - 7:55
A completed agent run summarizes three issue fixes and lists memories used and proposed.
Text in image
All three PRs created. Here is the final triage summary: Sentry sweep: • Query: is:unresolved environment:saleor-sentry-demo • Candidate count: 3 (targeted) • Scope limits: SALEOR-DEMO-D, SALEOR-DEMO-A, SALEOR-DEMO-7 • API gaps: Docker not available in sandbox; full pytest suite skipped for backend Triage decisions: • SALEOR-DEMO-7 (id=[illegible]): fix_now — saleor — Webhook returns JSON array; .get() on list raises AttributeError — PR created • SALEOR-DEMO-A (id=[illegible]): fix_now — saleor-storefront — GraphQL returns data: null with 200; accessing .collection on null crashes page — PR created • SALEOR-DEMO-D (id=[illegible]): fix_now — saleor-dashboard — Gift card event missing balance data; explicit throw crashes OrderSummary view — PR created Delegated investigations: All three investigated inline (single-agent run). Implementation: • Mode: fix-capable • SALEOR-DEMO-7: saleor / sentry/fix-transaction-action-dict-check / PR #99 • SALEOR-DEMO-A: saleor-storefront / sentry/fix-featured-products-null-data / PR #21 • SALEOR-DEMO-D: saleor-dashboard / sentry/fix-giftcard-balance-graceful / PR #90 Sentry safety: • API writes performed: none • Sentry events emitted: none • Secrets printed: none Memories used: • e8b5924e: Confirmed _validate_transaction_action_data and _validate_transaction_session_action_data vulnerability pattern and correct defensive pattern (raise ValueError early) • df3c6489: Confirmed prior fix patterns — optional chaining for SALEOR-DEMO-A, graceful error handling for gift card balance issues Memory candidates: • Storefront executePublicGraphQL can return { ok: true, data: null } when GraphQL responds with { data: null } at 200 status — callers must guard with optional chaining on result.data • Dashboard getGiftCardsAmountUsed should never throw from within a .reduce() callback consumed by a render path — log and skip instead Interface text: Completed Output final triage summary (5/5) Investigate And Classify Sentry Issues View in Oz Status: Done Agent: Saleor Sentry Demo Harness: Warp Artifacts: sentry/fix-transaction-action-dict-... saleor #99 sentry/fix-featured-products-null-d... saleor-storefront #21 sentry/fix-giftcard-balance-graceful saleor-dashboard #90 Directory: /workspace Run ID: [illegible] Credits used: 752.6 Run time: 36.6 min Created on: 10:11 AM on 6/3/2026 Environment details: Name: Saleor Sentry Triage CI ID: [illegible] Image: warpdotdev/dev-web:latest Initial query: Investigate and fix these Sentry issues: SALEOR-DEMO-D, SALEOR-DEMO-A, and SALEOR-DEMO-7. 721.6 credits Ask a follow up staging.warp.dev/conversation/00039952-7e15-45f0-978f-e72af0d4ec7b
- 7:48
- 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.
Agent Memory
After an agent session, an outer-loop agent extracts facts and updates memory so future runs can use what earlier runs learned.
Text in image
Agent Memory Agent Session Automatic Post-Session Extraction Extract Facts Update Memories Agent Memory 7 Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help AI Engineer Expo Talk Growth New slide Design Animate 63% Slide 7 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Accent 1 Color 1 000000 100% FFFFFF 100% 085AFF 100% FFFFFF 15% Add presenter notes... Start with a draft
- 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,
Model routing and eval sidecar
A router selects a model for each request. An eval sidecar samples and scores outcomes, then feeds policy updates back to the router. Gupta says Warp uses this internally to compare models across tasks.
Text in image
Model Routing Incoming request Router Selected model Response Eval Sidecar Eval sampler Outcome scorer Policy update 8 Interface text: Figma AI Engineer Expo Talk New slide Building Self-Improving Agent Software Factories Suraj Gupta Self-improvement How do factory agents get better over time? Skills Memory Model routing Skills Agent Memory Design Animate 63% Slide 8 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Color 1 000000 100% FFFFFF 100% 085AFF 100% 1783FF 100% D87756 100% Add presenter notes... Start with a draft Share
- 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
Custom model routing configuration
Gupta shows a Warp configuration that routes acme-payments database migrations to GLM and API documentation to Qwen, with separate models for incident debugging and scaffolding.
Text in image
~/.warp-dev/custom_model_routers (0.062s) cat orchestrator.yaml name: Orchestrator type: prompt default: claude-4-6-sonnet-high routing: - description: writing or reviewing database migrations for the acme-payments service model: glm-5.2-fireworks - description: debugging production incidents or fixing failing CI tests model: claude-4-8-opus-high - description: scaffolding new services or boilerplate from our internal templates model: kimi-k27-code-fireworks - description: drafting release notes, runbooks, or API documentation model: qwen-3.7-plus-fireworks Interface text: WarpDev File Edit View Tab Blocks AI Drive Window Help New agent conversation Settings ESC for terminal ? for help / for commands & send task to the cloud ⌘ Y open conversation Warp anything e.g. Set up SSL certificates and configure HTTPS for my domain Default Orchestrator /remote-control Choose an agent model AI Engineer Expo Talk New slide Design Animate 63% Slide 8 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Color 1 000000 100% FFFFFF 100% 085AFF 100% 1783FF 100% D87756 100% Add presenter notes Start with a draft9:57Demo milestone
- 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
Selecting a model router
Gupta selects a custom Orchestrator alongside Warp’s automatic model options. Its configuration maps different kinds of work to specific models, giving Warp rules for routing requests.
Text in image
~/.warp-dev/custom_model_routers (0.062s) cat orchestrator.yaml routing: - description: writing or reviewing database migrations for the acme-payments service model: glm-5.2-fireworks - description: debugging production incidents or fixing failing CI tests model: claude-4-8-opus-high - description: scaffolding new services or boilerplate from our internal templates model: kimi-k27-code-fireworks - description: drafting release notes, runbooks, or API documentation model: qwen-3.7-plus-fireworks /MODEL Base Full Terminal Use Manage defaults auto (responsive) auto (cost-efficient) auto (genius) auto (open-weights) Pareto Orchestrator (selected) test claude 4.5 haiku claude 4.5 opus claude 4.5 opus (thinking) Model Specs Warp's benchmarks for how well a model performs in our harness, the rate at which it consumes credits, and task speed. Intelligence Speed Cost ↵ to select ⌘ ↵ select and save to profile ⇧ tab to cycle tabs esc to dismiss Search models Interface text: WarpDev File Edit View Tab Blocks AI Drive Window Help Cooking · in 20m Wed Jul 1 5:09 PM Untitled AI Engineer Expo Talk Audience · AI Engineer Expo Talk New agent conversation Settings ESC for terminal Default Orchestrator /remote-control AI Engineer Expo Talk Growth New slide Building Self-Improving Agent Software Factories Suraj Gupta Self-improvement How do factory agents get better over time? Skills Agent Memory Design Animate 63% Slide 8 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Color 1 000000 100% FFFFFF 100% 085AFF 100% 1783FF 100% D87756 100% Share Add presenter notes... Start with a draft10:05Demo milestone
- 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
Custom model routing configuration
Gupta shows a Warp configuration that routes acme-payments database migrations to GLM and API documentation to Qwen, with separate models for incident debugging and scaffolding.
Text in image
~/.warp-dev/custom_model_routers (0.062s) cat orchestrator.yaml name: Orchestrator type: prompt default: claude-4-6-sonnet-high routing: - description: writing or reviewing database migrations for the acme-payments service model: glm-5.2-fireworks - description: debugging production incidents or fixing failing CI tests model: claude-4-8-opus-high - description: scaffolding new services or boilerplate from our internal templates model: kimi-k27-code-fireworks - description: drafting release notes, runbooks, or API documentation model: qwen-3.7-plus-fireworks Interface text: WarpDev File Edit View Tab Blocks AI Drive Window Help New agent conversation Settings ESC for terminal ? for help / for commands & send task to the cloud ⌘ Y open conversation Warp anything e.g. Set up SSL certificates and configure HTTPS for my domain Default Orchestrator /remote-control Choose an agent model AI Engineer Expo Talk New slide Design Animate 63% Slide 8 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Color 1 000000 100% FFFFFF 100% 085AFF 100% 1783FF 100% D87756 100% Add presenter notes Start with a draft10:13Demo milestone
- 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.
Sentry triage summary
The Sentry agent reports three PRs, identifies prior fix patterns it used, and lists two candidate memories for future triage. The full backend pytest suite was skipped because Docker was unavailable.
Text in image
All three PRs created. Here is the final triage summary: Sentry sweep: • Query: is:unresolved environment:saleor-sentry-demo • Candidate count: 3 (targeted) • Scope limits: SALEOR-DEMO-D, SALEOR-DEMO-A, SALEOR-DEMO-7 • API gaps: Docker not available in sandbox; full pytest suite skipped for backend Triage decisions: • SALEOR-DEMO-7 (id=[illegible]): fix_now — saleor — Webhook returns JSON array; .get() on list raises AttributeError — PR created • SALEOR-DEMO-A (id=[illegible]): fix_now — saleor-storefront — GraphQL returns data: null with 200; accessing .collection on null crashes page — PR created • SALEOR-DEMO-D (id=[illegible]): fix_now — saleor-dashboard — Gift card event missing balance data; explicit throw crashes OrderSummary view — PR created Delegated investigations: All three investigated inline (single-agent run). Implementation: • Mode: fix-capable • SALEOR-DEMO-7: saleor / sentry/fix-transaction-action-dict-check / PR #99 • SALEOR-DEMO-A: saleor-storefront / sentry/fix-featured-products-null-data / PR #21 • SALEOR-DEMO-D: saleor-dashboard / sentry/fix-giftcard-balance-graceful / PR #90 Sentry safety: • API writes performed: none • Sentry events emitted: none • Secrets printed: none Memories used: • e8b5924e: Confirmed _validate_transaction_action_data and _validate_transaction_session_action_data vulnerability pattern and correct defensive pattern (raise ValueError early) • df3c6489: Confirmed prior fix patterns — optional chaining for SALEOR-DEMO-A, graceful error handling for gift card balance issues Memory candidates: • Storefront executePublicGraphQL can return { ok: true, data: null } when GraphQL responds with { data: null } at 200 status — callers must guard with optional chaining on result.data • Dashboard getGiftCardsAmountUsed should never throw from within a .reduce() callback consumed by a render path — log and skip instead Interface text: Completed Output final triage summary (5/5) Investigate And Classify Sentry Issues View in Oz Status: Done Agent: Saleor Sentry Demo Harness: Warp Artifacts: sentry/fix-transaction-action-dict-... saleor #99 sentry/fix-featured-products-null-d... saleor-storefront #21 sentry/fix-giftcard-balance-graceful saleor-dashboard #90 Directory: /workspace Run ID: [illegible] Credits used: 752.6 Run time: 36.6 min Created on: 10:11 AM on 6/3/2026 Environment details: Name: Saleor Sentry Triage CI ID: [illegible] Image: warpdotdev/dev-web:latest Initial query: Investigate and fix these Sentry issues: SALEOR-DEMO-D, SALEOR-DEMO-A, and SALEOR-DEMO-7. 721.6 credits Ask a follow up staging.warp.dev/conversation/00039952-7e15-45f0-978f-e72af0d4ec7b11:24Demo milestone
- 11:24
Cool.
- 11:30
Cool. Um
- 11:33
and yeah, so let me uh I'm in my
- 11:35
slideshow.
Model routing and eval sidecar
A router selects a model for each request. An eval sidecar samples and scores outcomes, then feeds policy updates back to the router. Gupta says Warp uses this internally to compare models across tasks.
Text in image
Model Routing Incoming request Router Selected model Response Eval Sidecar Eval sampler Outcome scorer Policy update 8 Interface text: Figma AI Engineer Expo Talk New slide Building Self-Improving Agent Software Factories Suraj Gupta Self-improvement How do factory agents get better over time? Skills Memory Model routing Skills Agent Memory Design Animate 63% Slide 8 Template style Custom Style Matter Background Color 1 Selection colors Color 2 Color 2 Accent 1 Color 1 000000 100% FFFFFF 100% 085AFF 100% 1783FF 100% D87756 100% Add presenter notes... Start with a draft Share
- 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
Warp Platform
Gupta invites attendees to talk at Warp’s booth, U-G20.
Text in image
warp Warp Platform | warp.dev Booth U-G20 Interface text: Figma File Edit View Object Text Arrange Plugins Widgets Window Help AI Engineer Expo Talk Growth New slide Suraj Gupta Self-improvement How do factory agents get better over time? Skills Agent Memory Design Animate 63% Slide 9 Template style Custom Style Matter Background Color 2 Selection colors Color 2 Color 1 FFFFFF 100% Linear 20% Add presenter notes... Start with a draft
- 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.
AI Engineer World's Fair
AI Engineer World's Fair logo in white on a black background, with the event website below.
Text in image
AI Engineer World’s Fair HTTPS://AI.ENGINEER
- 12:49
>> [music]