AI Engineer World's Fair 2026

How Software Factories Improve Themselves — Suraj Gupta, Warp

Suraj Gupta· Warp12:52

Slide chapters

21 slide and demo groups · Timestamps are approximate.

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

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

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

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

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

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
Raw

4:00Demo milestone

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
Raw

4:13Demo milestone

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
Top

4:22Demo milestone

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
Raw

4:35Demo milestone

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  Top

4:44Demo milestone

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

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

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

6:42Demo milestone

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

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

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

7:55Demo milestone · Completed build

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

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

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 draft

9:57Demo milestone

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 draft

10:05Demo milestone

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

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

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

Source frame: The factory needs its own improvement loopOpen full source frame
Source frame: The factory needs its own improvement loop

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.

0:12 · section reference included

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

Source frame: Turn triage feedback into a reviewed skill changeOpen full source frame
Source frame: Turn triage feedback into a reviewed skill change

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

Triage skillProcedure used for recurring issue triage.
Inner-loop agentApplies the skill to incoming GitHub issues.
Outer-loop agentExamines decisions, mistakes, reactions, and comments.
Pull request and human reviewProposed skill edits remain visible in Git.
Execution produces evidence; the outer loop proposes a procedural change. Human review separates that proposal from its adoption.
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.

2:04 · section reference included

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.

5:32 · section reference included

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

Source frame: Choose models for recurring classes of workOpen full source frame
Source frame: Choose models for recurring classes of work

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.

8:46 · section reference included

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

PromptWork submitted for an agent to perform.
Agents across modelsOz runs multiple agents using different models.
Evaluation sidecarDetermines which models work better for task classes.
Routing choicesFor example, Warp reports using GLM efficiently for UI tasks.
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.
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.

11:19 · section reference included

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.

  1. 0:12

    Um my name is Siraj Gupta. I lead

  2. 0:14

    Harness development at Warp. Um in case

  3. 0:16

    you haven't heard of Warp before, um we

  4. 0:18

    started off by building a

  5. 0:20

    state-of-the-art agentic development

  6. 0:22

    environment. Um we have about a million

  7. 0:24

    active users that use that. Um it was

  8. 0:26

    born out of a modern-day terminal.

  9. 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
  10. 0:28

    Um and nowadays we're building a um

  11. 0:31

    cloud agent platform to enable teams to

  12. 0:33

    build software factories.

  13. 0:35

    Um today I'm going to talk about um

  14. 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
  15. 0:38

    self-improving software factories, which

  16. 0:40

    I know might sound kind of buzzy, um

  17. 0:43

    but I'm going to break it down and

  18. 0:44

    hopefully you can walk out of here with

  19. 0:45

    something concrete that you can

  20. 0:46

    implement yourselves.

  21. 0:48

    Um you've probably heard of both of

  22. 0:50

    these terms, self-improvement and

  23. 0:52

    software factories, used throughout this

  24. 0:53

    conference, but I'm sure you've heard of

  25. 0:55

    them independently.

  26. 0:57

    Um

  27. 0:57

    you've heard about how

  28. 0:59

    self-improvement is about agents being

  29. 1:01

    able to

  30. 1:02

    um

  31. 1:03

    improve over time and agents and models

  32. 1:06

    um

  33. 1:06

    and, you know, phasing out humans from

  34. 1:08

    that loop, so that way the the

  35. 1:10

    improvement loop can be automatic. Um

  36. 1:13

    and I'm sure you've heard about software

  37. 1:14

    factories being

  38. 1:16

    um the way that like the software

  39. 1:18

    development paradigm is shifting from

  40. 1:20

    individual coding agents to building out

  41. 1:22

    automations that take work from triage

  42. 1:25

    up until production. Um but less has

  43. 1:27

    been said about how software factories

  44. 1:30

    themselves can self-improve over time,

  45. 1:32

    so that the the factory can get better,

  46. 1:34

    more efficient, faster. Um and I think

  47. 1:37

    this is going to become an extremely

  48. 1:38

    important part of our jobs as software

  49. 1:40

    engineers as we transition from building

  50. 1:43

    products to building factories and and

  51. 1:45

    maintaining them.

  52. 1:46

    Um so let's dive in. Um

  53. 1:49

    self-improvement is a pretty broad

  54. 1:50

    umbrella, but I'm going to focus on

  55. 1:52

    three concrete ways that agents can

  56. 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
  57. 1:54

    improve over time, agent factories can

  58. 1:57

    improve over time. I'm going to start

  59. 1:58

    with um skills, then we'll talk about

  60. 2:00

    persistent memory, and then I'll finish

  61. 2:02

    off by talking about model routing.

  62. 2:04

    Um so

  63. 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...
  64. 2:06

    skills are a great way to give your

  65. 2:07

    agents procedural memory. I don't think

  66. 2:09

    I have to kind of spell that out for

  67. 2:10

    you. You describe a a procedure to your

  68. 2:13

    agent that you expect it to have to do a

  69. 2:15

    task over and over. Um for example,

  70. 2:18

    let's say you're building a triage

  71. 2:19

    agent, which is a pretty common thing

  72. 2:20

    you might build in a software factory.

  73. 2:23

    Um

  74. 2:24

    and you give it a skill on how you want

  75. 2:26

    it to go about reproducing issues. Um

  76. 2:28

    those skills get stale over time. Um

  77. 2:30

    humans give feedback to the agents.

  78. 2:32

    Agents learn things in their own um runs

  79. 2:35

    and trajectories.

  80. 2:36

    Um and

  81. 2:38

    the like the skill that you previously

  82. 2:40

    gave it becomes dated. So, how do we fix

  83. 2:42

    this and let the agent improve over time

  84. 2:44

    using that skill?

  85. 2:45

    Well, one way to do it is to deploy an

  86. 2:47

    outer loop agent. Um and this is what

  87. 2:49

    we've done in our own internal software

  88. 2:51

    factory that's been really productive.

  89. 2:53

    The idea is that your um

  90. 2:56

    your inner loop agent is the thing

  91. 2:58

    that's actually applying the skill. It's

  92. 3:00

    like doing the triage. And then you have

  93. 3:02

    this other outer loop agent that is

  94. 3:03

    observing your inner loop agent's runs

  95. 3:06

    and improving its skill over time by

  96. 3:08

    looking for

  97. 3:09

    um

  98. 3:10

    for mistakes it made or looking at

  99. 3:12

    feedback that the human has given it.

  100. 3:14

    Um so, I'm going to show an example of

  101. 3:15

    that.

  102. 3:16

    Um let me swap here. Cool. Um so, this

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

  104. 3:20

    is actually a skill that we've used

  105. 3:22

    internally at Warp. We've open-sourced

  106. 3:24

    our client repository and it's fully run

  107. 3:26

    as as a factory. And so, this is an

  108. 3:28

    example of an of a

  109. 3:31

    of a skill that's that's backing a

  110. 3:32

    triage agent that we have today.

  111. 3:34

    The idea is that um

  112. 3:37

    you you get an issue that comes in on

  113. 3:39

    GitHub, and you want to automatically

  114. 3:41

    run an agent to figure out like what

  115. 3:43

    sorts of um

  116. 3:44

    like it what sort of information did the

  117. 3:46

    user not provide that is going to help

  118. 3:48

    us figure out if this is something that

  119. 3:49

    we should build, an existing issue that

  120. 3:51

    we might actually just want to dedupe

  121. 3:52

    against or something else.

  122. 3:54

    Um

  123. 3:55

    and then we have a Sorry, let me just

  124. 3:57

    switch over here.

  125. 3:59

    And then we have a workflow that

  126. 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
    Raw

    4:00Demo milestone

  127. 4:01

    actually like runs that that triage um

  128. 4:05

    agent.

  129. 4:06

    Um this is a pretty simple workflow. It

  130. 4:07

    just Every time an an an issue gets

  131. 4:10

    submitted on the repo, this

  132. 4:11

    um this workflow runs. And then here's

  133. 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
    Raw

    4:13Demo milestone

  134. 4:14

    the actual outer loop agent, which is

  135. 4:15

    about looking at the the work that the

  136. 4:18

    triage agent has done and improving it

  137. 4:19

    over time. So, the idea is that the

  138. 4:22

    agent looks at the decisions that the

  139. 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
    Top

    4:22Demo milestone

  140. 4:24

    triage the inner loop triage agent made,

  141. 4:26

    and it um collects feedback signals,

  142. 4:28

    which might be uh you know, thumbs up or

  143. 4:30

    thumbs down on the issues. Um it might

  144. 4:33

    be users commenting on the issue. It

  145. 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
    Raw

    4:35Demo milestone

  146. 4:35

    might be someone from Warp um an

  147. 4:37

    employee of Warp commenting on the

  148. 4:38

    issue, uh giving the agent feedback on

  149. 4:40

    what it did.

  150. 4:42

    Um and then ultimately that leads to

  151. 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  Top

    4:44Demo milestone

  152. 4:44

    like some synthesis of of the of that um

  153. 4:48

    iteration. And so, we we end up

  154. 4:50

    basically updating our inner loop skill

  155. 4:53

    with this outer loop agents. Um and

  156. 4:55

    that's what leads to this

  157. 4:56

    self-improvement loop with skills.

  158. 4:58

    What's really nice about this is that um

  159. 5:00

    the

  160. 5:01

    So, in step four, you'll see we we added

  161. 5:03

    the triage skill, and then we open a

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

  163. 5:04

    pull request. So, that means that um all

  164. 5:06

    of the improvements to the inner loop

  165. 5:08

    skill are going to be tracked through

  166. 5:10

    get. So, you get like full observability

  167. 5:12

    into like how that skill is transformed

  168. 5:14

    over time. And that it also means that

  169. 5:16

    um

  170. 5:17

    a human is actually going to review

  171. 5:18

    those updates to the skill. So, that

  172. 5:20

    way, you know, this this outer loop

  173. 5:21

    agent doesn't make a mistake and

  174. 5:23

    ultimately cause your triage agent to to

  175. 5:24

    actually perform worse.

  176. 5:26

    Um

  177. 5:27

    yeah, so that's that's kind of what what

  178. 5:29

    I want to talk about for skills. Um

  179. 5:32

    let me talk about persistent memory now.

  180. 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...
  181. 5:35

    So, I'm going to go back to my deck.

  182. 5:37

    Um

  183. 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
  184. 5:39

    cool. So, skills are great for

  185. 5:41

    remembering procedures, but what about

  186. 5:42

    everything else? So, like what what

  187. 5:44

    happens when your Sentry agent

  188. 5:46

    um looks for

  189. 5:48

    an issue and

  190. 5:50

    and finds an issue, does some work to

  191. 5:52

    like gather context about it, and fixes

  192. 5:55

    it, but then now you have you encounter

  193. 5:57

    a similar issue in the future.

  194. 6:00

    Your century your agent might get lucky

  195. 6:02

    and like be able to figure out the same

  196. 6:05

    root cause that it did the first time

  197. 6:06

    around, but that's not guaranteed. And

  198. 6:08

    and even if it does, you're you've

  199. 6:10

    probably wasted a lot of tokens

  200. 6:11

    re-gathering context on an issue that

  201. 6:13

    you've already fixed before. So, that's

  202. 6:15

    where

  203. 6:16

    something like persistent memory comes

  204. 6:17

    in.

  205. 6:18

    You can think of this as a fact store

  206. 6:20

    scoped to an agent. Your agent runs and

  207. 6:23

    similar to the skill improvement loop,

  208. 6:24

    you have an outer loop agent that's

  209. 6:26

    going to extract facts, learnings,

  210. 6:27

    outcomes

  211. 6:28

    from your from your inner loop agent.

  212. 6:30

    So, that way future runs of the agent

  213. 6:32

    can lean on what's already been done in

  214. 6:33

    the past.

  215. 6:35

    So, I'm going to show an example of

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

  217. 6:36

    this. Come back to the deck here.

  218. 6:39

    So, in warp or in Oz rather, like I

  219. 6:42

    mentioned, we built out a a cloud agent

  220. 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-0b23dbbb709d

    6:42Demo milestone

  221. 6:43

    platform where you can run agents in the

  222. 6:45

    cloud. And

  223. 6:48

    for all for all these agents, you can

  224. 6:49

    attach memory stores to them. Again, a

  225. 6:51

    memory a memory store is a collection of

  226. 6:53

    facts. In this case, I have a century

  227. 6:55

    agent that

  228. 6:57

    has collected some memories over time

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

  230. 7:00

    about root cause analysis that it's done

  231. 7:02

    in the past. What's cool is like you can

  232. 7:04

    actually version this memory, you can

  233. 7:05

    update it as a human, create new

  234. 7:07

    memories or delete them yourselves,

  235. 7:09

    but primarily this this memory creation

  236. 7:11

    loop is driven by agents. You can also

  237. 7:14

    see where these memories were sourced

  238. 7:16

    from. So,

  239. 7:17

    I can actually like open up the run here

  240. 7:19

    to see

  241. 7:20

    Oh, well.

  242. 7:22

    I think this my IP address here keeps

  243. 7:24

    changing and this my our staging

  244. 7:25

    platform is gated to an IP address, but

  245. 7:28

    anyways,

  246. 7:29

    you should like

  247. 7:30

    you can see where those memories were

  248. 7:32

    sourced from. So, that way you can be

  249. 7:34

    like, oh, like maybe that wasn't

  250. 7:35

    actually an important memory or that was

  251. 7:36

    kind of like a local maxima that I don't

  252. 7:38

    want to include in my memory store. Um

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

  254. 7:41

    and then when your agents continue to

  255. 7:43

    run, so in this case I have the sentry

  256. 7:45

    agent that's

  257. 7:46

    um that's done a bunch of runs after

  258. 7:48

    it's created those memories, it actually

  259. 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-e72af0d4ec7b

    7:48Demo milestone

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

    can lean on those memories in the future

  261. 7:51

    um when it's making um

  262. 7:53

    when it's triaging new issues. So in

  263. 7:55

    this case, you'll notice that um

  264. 7:57

    this agent ran, it did a bunch of work

  265. 7:59

    to do some root cause analysis, and then

  266. 8:01

    it ultimately reported back on which

  267. 8:02

    memories it used

  268. 8:04

    um

  269. 8:05

    uh in this case it it it it was able to

  270. 8:07

    use those um five memories that I had in

  271. 8:09

    that memory sort to to speed up the work

  272. 8:11

    that I did this time around.

  273. 8:13

    Um,

  274. 8:15

    cool. Uh

  275. 8:16

    let me go back to the deck.

  276. 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
  277. 8:20

    So,

  278. 8:21

    what's cool in Oz is that persistent

  279. 8:23

    memory works across all harnesses, so

  280. 8:25

    Warp Zone, proprietary harness, plot

  281. 8:27

    code, Kodak, it doesn't really matter

  282. 8:28

    what you're running on Oz, um memories

  283. 8:30

    will automatically be created for you.

  284. 8:32

    Um, but you also have the control to to

  285. 8:35

    review those memories, version them,

  286. 8:37

    delete them, or edit them as you please.

  287. 8:39

    Um, all that being fully traceable.

  288. 8:42

    Um, cool. That's what I wanted to say

  289. 8:44

    about memory. Um,

  290. 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
  291. 8:46

    last thing I want to talk about here is

  292. 8:48

    model routing. So, um you may be

  293. 8:50

    wondering how this plays into

  294. 8:51

    self-improvement loops for um factories.

  295. 8:54

    Well, first I want to touch on why model

  296. 8:55

    routing is important in a factory in the

  297. 8:56

    first place.

  298. 8:57

    Um, it can become prohibitively

  299. 8:59

    expensive to run all of your agents that

  300. 9:01

    are doing simple things like triage or

  301. 9:03

    fixing simple CI failures with Opus.

  302. 9:05

    That's just like going to be really

  303. 9:07

    expensive over time, and I'm sure some

  304. 9:08

    of you have maybe been burnt by this or

  305. 9:10

    have heard stories of of or

  306. 9:12

    organizations being burnt by this. Um,

  307. 9:14

    so model like choosing which models you

  308. 9:16

    use for which tasks that is actually

  309. 9:18

    very important um and something that

  310. 9:19

    we're we've been working on at work.

  311. 9:21

    Um, so in Warp, you can actually use uh

  312. 9:24

    our out-of-the-box model routers, we

  313. 9:25

    call them our auto models. Um, over like

  314. 9:28

    as new models come out, we're all we're

  315. 9:29

    always evaluating like what are the best

  316. 9:31

    models when it comes to Pareto

  317. 9:32

    efficiency. And so, like if you're a new

  318. 9:35

    user and you just want to get started,

  319. 9:36

    it's much better than like pinning your

  320. 9:38

    model to like Opus or or or Haiku, for

  321. 9:41

    example. Um

  322. 9:44

    let me show you all um that experience

  323. 9:46

    in Warp.

  324. 9:47

    So, let me go here.

  325. 9:53

    Give me 1 sec.

  326. 9:54

    Got to drag this over here.

  327. 9:56

    So, here I have my Warp desktop um and

  328. 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 draft

    9:57Demo milestone

  329. 9:59

    you can see that um alongside being able

  330. 10:01

    to define models um

  331. 10:04

    being able to use Warp's auto models is

  332. 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 draft

    10:05Demo milestone

  333. 10:06

    one option, like these models here, but

  334. 10:08

    you can also define your own model

  335. 10:10

    routed um

  336. 10:12

    uh models, which uh basically boil down

  337. 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 draft

    10:13Demo milestone

  338. 10:15

    to like a set of rules that you can give

  339. 10:16

    um to us and we will like make decisions

  340. 10:19

    about model routing based on those

  341. 10:20

    rules. So, here I have an example of a

  342. 10:23

    configuration file that I've defined um

  343. 10:25

    where I've defined a few different rules

  344. 10:26

    about like I want database migrations

  345. 10:29

    done with with GLM fire with GLM or I

  346. 10:31

    want um you know, uh runbooks and API

  347. 10:34

    documentation done with Quen. Um

  348. 10:38

    So, this really allows you to like like

  349. 10:39

    to define classes of tasks and be able

  350. 10:42

    to say, "Okay, I want this this class of

  351. 10:44

    task done by this model because that's

  352. 10:46

    kind of what you've seen."

  353. 10:47

    At this point though, that's kind of

  354. 10:49

    more of an art than a science um and so

  355. 10:52

    uh what we're working on next is being

  356. 10:53

    able to define evals for um

  357. 10:56

    customer-facing evals where you can

  358. 10:58

    actually define what sorts of things you

  359. 11:00

    care about and what knobs you want to

  360. 11:02

    turn on these configurations and

  361. 11:04

    actually see, "Okay, is is Haiku better

  362. 11:07

    than fi- than GLM than Opus in a

  363. 11:10

    specific class of issues?" That's like

  364. 11:11

    specific to your workflows and not just

  365. 11:13

    some like generic benchmark that um that

  366. 11:16

    someone posted online.

  367. 11:19

    Um let me go back here. Give me a sec.

  368. 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-e72af0d4ec7b

    11:24Demo milestone

  369. 11:24

    Cool.

  370. 11:30

    Cool. Um

  371. 11:33

    and yeah, so let me uh I'm in my

  372. 11:35

    slideshow.

  373. 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
  374. 11:42

    So, here is kind of like a a high-level

  375. 11:44

    overview of how this works in Warp

  376. 11:46

    today. So, um internally we have our

  377. 11:48

    model routing rules, um but then we have

  378. 11:51

    like an eval sidecar that's determining

  379. 11:53

    um what sorts of tasks are actually

  380. 11:55

    better with which models. And we do this

  381. 11:56

    with a simple like best-at-k um approach

  382. 11:59

    where when you type a prompt, we run a

  383. 12:01

    bunch of agents in Oz uh across a

  384. 12:03

    different set of models. Um and we found

  385. 12:05

    success in like being able to determine,

  386. 12:06

    "Oh, like UI tasks are really well done

  387. 12:09

    with GLM. Um we don't really need to run

  388. 12:11

    those with Opus. It's much more

  389. 12:12

    efficient to run those with GLM."

  390. 12:14

    Um so, that's how we've been using it,

  391. 12:15

    but um sooner enough we're going to be

  392. 12:16

    building this into our product so that

  393. 12:18

    way our our customers can actually use

  394. 12:20

    it in their own workflows. Um

  395. 12:23

    Yeah, that's uh that's mostly what I had

  396. 12:25

    today. Um

  397. 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
  398. 12:26

    we're around in a booth around that

  399. 12:28

    side. So, if you're interested in this

  400. 12:29

    kind of stuff, come talk to me. I'm

  401. 12:31

    always down to talk about this kind of

  402. 12:32

    stuff. But yeah, thanks for your time

  403. 12:34

    today. That's all I had.

  404. 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
  405. 12:49

    >> [music]