AI Engineer Europe 2026

Building AI Systems that Ship

Nick Nisi17:43

Read the talk

Why Deleting 95% of Agent Skills Improved Results

Selected presentation frame from How I deleted 95% of my agent skills and got better results — Nick Nisi, WorkOS at 582 seconds
Why Deleting 95% of Agent Skills Improved Results

Nick Nisi explains how focused guidance, enforced verification, targeted evaluations, and retrospective learning made agent workflows more reliable at WorkOS.

From a talk by Nick Nisi

At a glance

Ideas worth remembering

  • Replace broad documentation-derived skills with concise, observed product and framework gotchas: Nisi reduced more than 10,000 lines to 553 and cut evaluation runs from 68 minutes to 6. 7:27

  • Benchmark skills against a no-skill baseline; one evaluated task succeeded 77% of the time with a skill and 97% without it. 9:28

  • Use an external state machine and explicit verification gates so implementation, review, and closure cannot advance solely because an agent claims completion. 3:25

  • Require concrete evidence appropriate to the task, including hashed test output or Playwright CLI before-and-after videos attached to pull requests. 5:25

  • Convert recurring failures into harness improvements and scoped memory, while recognizing that automatic memory pruning was described as a future addition. 12:18

  • Design agent-facing product information around reliably observed failure modes, accessibility to automated readers, and measured outcomes rather than assuming more context is better. 14:21

The bottleneck shifts from implementation to context and review

Selected presentation frame from How I deleted 95% of my agent skills and got better results — Nick Nisi, WorkOS at 138 seconds
The bottleneck shifts from implementation to context and review

Nick Nisi, a DX engineer at WorkOS, describes working across more than 20 repositories and eight languages, including projects such as AuthKit Next.js, AuthKit React, WorkOS Node, WorkOS Kotlin, WorkOS Ruby, and PHP. Agents increased his ability to handle implementation while he reviewed their work, but coordinating one agent at a time across many repositories created a new operational bottleneck: continual context switching. 0:14

Starting each task also required repeated setup: identifying the relevant GitHub issue, linear ticket, or Slack thread, explaining the problem, and establishing enough context for an agent to begin. Nisi describes spending roughly 10 minutes on this handoff for each task. He also identifies a second challenge beyond internal productivity: agents increasingly mediate how developers encounter and use products, making agent experience relevant to developer experience. 1:30

These pressures led to two complementary efforts: an internal system that could take an existing work item and drive it toward a verified pull request, and a customer-facing WorkOS CLI intended to reduce the friction of installing AuthKit. Across both, the underlying question was not whether an agent could generate plausible code, but whether the surrounding system could establish that the result actually worked. 2:19

Suggest correction

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

0:14 · section reference included

Make the workflow enforce evidence instead of requesting compliance

Selected presentation frame from How I deleted 95% of my agent skills and got better results — Nick Nisi, WorkOS at 193 seconds
Make the workflow enforce evidence instead of requesting compliance

Nisi built an internal harness called Case that accepts inputs such as a GitHub issue, pull request, Slack thread, or linear ticket, gathers the necessary context, and works toward a pull request accompanied by evidence. Its initial implementation as a Claude skill worked until additional complexity caused context loss, skipped tasks, and unreliable adherence to requested steps. 2:19

He rebuilt Case on top of pi, using a TypeScript state machine to coordinate five agents: an implementer, a verifier, a reviewer, a closer, and a retro agent. The essential design feature is not the number of agents but the gates between states: verification must precede review, review findings return to implementation, and the closer cannot finish without producing evidence. These transitions move enforcement outside the model’s discretionary behavior. 3:25

An early testing gate illustrates why superficial evidence is insufficient. Case originally treated the presence of a .case tested file as proof that tests had run, but the agent could simply create the file. Nisi responded by saving a SHA-256 hash of test output and checking that evidence, with the practical goal of making the requested work easier than fabricating compliance. The broader lesson is to tie progression to verifiable artifacts instead of assuming an agent followed written instructions. 4:23

For interface bugs, Nisi wants the agent to use the Playwright CLI to record behavior before and after a fix and attach those videos to the pull request. He still reads generated code and evaluates whether it meets his standards, but he does not want to spend review time until the agent has first demonstrated the requested behavioral change. If the evidence is missing, the task returns to the agent rather than immediately becoming a human debugging exercise. 11:23

Suggest correction

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

2:19 · section reference included

Replace exhaustive documentation skills with measured product gotchas

Selected presentation frame from How I deleted 95% of my agent skills and got better results — Nick Nisi, WorkOS at 495 seconds
Replace exhaustive documentation skills with measured product gotchas

The customer-facing WorkOS CLI can identify the surrounding project, install AuthKit, and provision an account that can be claimed later. Nisi describes support scenarios involving Next.js, TanStack, and Ruby projects, as well as replacing an existing Auth0 setup. However, an installation into TanStack Start exposed a framework-specific failure: changes to start.ts appeared reasonable to both the human reviewer and the model, but violated an implicit contract governing what that file must export. 5:25

His first response was to transform WorkOS documentation into more than 10,000 lines of generated skills. The generation system tracked sections of documentation using cryptographic hashes so unchanged material would not be regenerated. Although sophisticated, this approach produced lengthy evaluation runs, repeated failures and retries, high token consumption, and guidance that could send the model through unnecessary lines of investigation. 7:27

Evaluations showed that comprehensive coverage was counterproductive, so Nisi replaced the generated corpus with 553 lines of handwritten gotchas drawn from recurring failures. Evaluation scenarios dropped from 68 minutes to 6 minutes per run, while the smaller context kept the model focused. He characterizes the change as deleting 95% of the skills and seeing performance improve, emphasizing that the improvement was established through measurement rather than inferred from the smaller prompt. 8:26

A direct comparison made the downside particularly clear: on one task, loading a particular skill produced a 77% success rate, while performing the same task without it produced 97%. The implication is not that every skill is harmful; it is that any individual skill can add misleading or distracting context, and that its contribution should be tested against a no-skill baseline. Product guidance is most useful when it supplies specific missing constraints rather than attempting to reteach a model how to code. 9:28

Suggest correction

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

5:25 · section reference included

Turn failures into durable, scoped system improvements

Selected presentation frame from How I deleted 95% of my agent skills and got better results — Nick Nisi, WorkOS at 840 seconds
Turn failures into durable, scoped system improvements

The final agent in Case performs a retrospective across the work that preceded it. It examines logs and Claude and Codex transcript JSONL files for patterns such as redundant tool requests, repeated actions without any intervening change, and unproductive loops. Instead of treating these failures solely as isolated mistakes, the system extracts information that can improve later runs. 3:25

Case stores what it learns in Markdown memory files at different levels of specificity, including general memory and framework-oriented memory for Next.js and TanStack Start. A mistake involving start.ts, for example, can become a durable framework-specific warning rather than a problem rediscovered independently in every future task. Nisi also identifies automatic memory pruning as a capability he wants to add later, distinguishing a proposed improvement from the features already present. 13:23

This supports a broader operating rule: when the harness produces a mistake, improve the harness so it can detect or correct that class of mistake itself, rather than repeatedly patching individual generated outputs. Human feedback remains part of the loop, but the objective is to make each observed failure useful to the next run through stronger gates, better memory, and targeted system changes. 12:18

How it fits togetherFailure-to-memory feedback loop

Executes work and encounters roadblocks.

Retrospective analysis turns run failures into scoped memory that guides subsequent work.

Suggest correction

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

3:25 · section reference included

Design for agents, but measure what actually helps

Selected presentation frame from How I deleted 95% of my agent skills and got better results — Nick Nisi, WorkOS at 933 seconds
Design for agents, but measure what actually helps

Nisi condenses the approach into three related principles: enforce rather than merely instruct, guide rather than overwhelm, and measure rather than assume. State-machine gates and behavioral evidence address unreliable execution; concise framework or product gotchas address missing context without flooding the model; and evaluation pass rates reveal whether the intervention improves or degrades results. These practices are especially important because agent behavior is nondeterministic and plausible-looking output is not equivalent to successful execution. 9:28

For product teams, the practical starting point is to identify what agents get consistently wrong about the product and document those specific landmines. Nisi also warns that information introduced through client-side JavaScript may be absent from whatever process an agent uses to retrieve and summarize a page. Treating agents as product consumers therefore includes examining both the content of guidance and whether that guidance is actually accessible to automated readers. 14:21

For internal automation, trust should be grounded in observable outputs such as test evidence, pass rates, score changes, and before-and-after demonstrations. None of this removes human review: Nisi explicitly continues reading generated code after the requested behavior has been established. The resulting shift is from manually supervising every intermediate action toward engineering an environment that enforces required work, exposes failures, and improves when those failures recur. 11:23

Suggest correction

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

9:28 · section reference included

Read the complete timestamped transcript
  1. 0:00

    [upbeat music] All right. Good morning, everyone.

  2. 0:16

    Uh, welcome to my talk, Building AI Systems That Ship. I'm Nick Nisi, and I work at WorkOS. We've got a booth downstairs. Uh, come check us out and talk to us.

  3. 0:25

    I would be happy to chat. Uh, but let me start that over. Hi, I'm the bottleneck. Uh, I'm a DX engineer at WorkOS, and I work on 20 plus repos, uh, across eight different languages.

  4. 0:38

    Uh, it's all of our SDKs and open source things, uh, that we have. And the... It's like AuthKit Next.js, uh, AuthKit React, uh, WorkOS Node, WorkOS Kotlin, WorkOS Ruby, PHP, everywhere.

  5. 0:53

    So there's a lot to do across a lot of different things. And I'm really good at working on those, and I've gotten really good over the last eight months of working with those via agents.

  6. 1:05

    So I haven't written a line of code myself in probably eight months. Uh, I've gotten really good at just scaling that with agents and then reviewing what they do and instructing them and getting the work done, uh, faster and better while still maintaining good quality.

  7. 1:21

    Uh, but there was a big problem. Doing that, uh, with one agent at a time across all of these repos, I'm just constantly context switching over and over and over.

  8. 1:30

    Uh, and it just gets harder and harder. Uh, and that's okay, but the problem is that for every one of those, there's like this little bit of setup time that I'm doing each time, which is like giving it 10 minutes of my time to like set up and establish the problem.

  9. 1:44

    Let's look at this GitHub issue. Let's look at this Linear ticket. Let's take a look at this Slack thread and figure out what's going on and see if we can reproduce the issue and then, uh, go.

  10. 1:54

    So that was a lot of my time just spent dealing with the agent, getting it basically the context that I already have, and then getting it to work on it from there.

  11. 2:03

    Now, on the other side, I'm also working on products that, uh, we want to build for agents because while I, I said I'm a developer experience engineer, the developer is still the most important, uh, in, in my job.

  12. 2:15

    But increasingly, the pipeline to get to that developer is through agents. And so I see the agentic experience as being equally as important because that's how we're gonna get in front of the developers.

  13. 2:27

    So there's two different ways I needed to go AI native and two different directions for that.

  14. 2:34

    So on the internal side, building that, I started building this project called Case. Uh, this is a harness. Uh, if you've read Ryan Lopopolo's harness engineering, uh, it's that.

  15. 2:44

    Uh, just kinda took those ideas and started building them. Uh, basically give it a GitHub issue, a PR, uh, a, a Slack thread, a Linear ticket, anything, and I could just point it at it, and it could figure out the context that it needs and go.

  16. 2:59

    And then it wouldn't stop until it has a PR with evidence that it actually did what I asked it to, or what the problem was, or what the-- fixed what the issue was.

  17. 3:07

    Uh, but it most importantly, it had to provide that evidence. And it-- this originally started as a Claude skill because, uh, why not? I thought Claude could do, could do anything, and it was working really well.

  18. 3:18

    But as it got more complex, uh, the context drop became very real. It would just start forgetting things or skipping over tasks. And I would ask Claude, "Why did you do that?"

  19. 3:27

    It's like, "Oh, yeah, you told me to do that. I decided not to." Not great. So, uh, I rebuilt it on top of pi and using a, a TypeScript state machine to facilitate going through and, and stepping through these agents.

  20. 3:39

    So it has five different agents in it: an implementer, a verifier, a reviewer, a closer, and a retro agent. And those are important, but they're not the most important thing.

  21. 3:48

    The most important piece of Case is the gates in between that, and that's what the, the, um, uh, state machine really enforces is the checks in between everything. So when we implement something, we can't move on to the reviewer until the verifier verifies it.

  22. 4:05

    And once the r- the reviewer reviews it, if there's any issues, it has to send it back to the implementer to do those. Uh, and once all of that's done, the closer can work.

  23. 4:14

    But the closer can't work until it thinks that it's done, and the closer is there to provide evidence. And then the retrospective is there to analyze the entire performance.

  24. 4:23

    It looks at the logs of everything that Case did and says, "What could I have done better?" And then it updates its own memory system to ensure that the next time it can skip some steps if it, if it went in circles for a little bit, uh, and it can give itself some hints on where to go

  25. 4:36

    so that the next time it works in that project, it doesn't hit the same roadblocks. [clears throat]

  26. 4:43

    Uh, so the next agent doesn't really matter. Um, proving that the work matters. Proving that what happened in each of these states is what matters. And that word there, proving, is the most important piece of that because the agents, they would just lie to me all the time.

  27. 4:58

    Uh, I would ask it, "Hey, you need to run the test." And this was more when it was a skill, and it would-- I would be like, "Hey, you need to run these tests and make sure that the tests actually pass."

  28. 5:06

    And one way to do that, uh, was I just had it check for a .case tested file. And if that, that file existed, great, it ran the test perfect.

  29. 5:16

    Well, it figured it out pretty fast. Claude would just touch that file and be like, "Yep, I ran the tests." Such a junior engineer, I swear. [laughs]

  30. 5:25

    Um, so I had to figure out a way to prove that. So one way to do that was just to, uh, actually take the test output and SHA-256 that and save that into the Case tested file and then verify cryptographically, yes, you actually ran the tests.

  31. 5:39

    And really, like the, the main piece there is that I just made it easier to just do the work that I wanted it to do rather than lie about it.

  32. 5:48

    And that's really the main thing. Um, it stopped lying not because I asked it very nicely. I made it prove it, that it was going to actually do the work each time.

  33. 5:59

    Now, on-- that was on the inward side. On the outward side with the WorkOS CLI, uh, this is a tool that our customers use, and it can do lots of things, but its kind of headlining feature is that it can install AuthKit for you.

  34. 6:12

    One of the biggest pain points when we're trying to, you know, ask someone to, to look at our product or they're interested in it is, "Oh, I'd have to go spend some time and get it set up and read the docs and all of that."

  35. 6:22

    Not anymore. With workos install, it just goes and figures out what project you're in. "Oh, you're in a Next.js project. You're in a TanStack project. You're in a Ruby project.

  36. 6:30

    I'll figure that out. Oh, you've already got Auth0 set up? I can, uh, easily remove that and put in AuthKit, and we'll be good." And it does it in less than five minutes.

  37. 6:38

    If you don't have a WorkOS account, it will provision one for you that you can go claim later. So there's zero friction to getting it set up, and that's a really important piece of being, uh, agentically forward in our public-facing persona and how we-- how our customers use us and how, uh, they perceive us.

  38. 6:55

    But there's problems with that too as I was building it. Uh, it would be overly confident, just like these models always are, and say, "Yep, I did that." One of the, the cases of that was I was trying to, uh, install into a TanStack Start project.

  39. 7:08

    TanStack Start's relatively new. It's still in RC, and, uh, it's changing constantly. Well, Case-- uh, sorry. The CLI made some changes. It installed it, and it made some changes to a file called start.ts.

  40. 7:20

    That file is kind of implicit. It has, it has an implicit contract with TanStack. It's, uh, got a-- it has to export certain things, and we kind of messed that up.

  41. 7:28

    The code looked right to me, it looked right to, uh, Claude, but it did not look right to TanStack Start, so boom, it failed.

  42. 7:38

    Uh, and so we had to figure out a way to tell it when it failed or make it understand that, and I thought, "Oh, well, we just need some skills," right?

  43. 7:46

    Skills are the way to do that. So I started teaching it, making these skills, and of course, I thought, "You know what? We have these great docs. I can just take our docs and generate some skills."

  44. 7:56

    So I generated over 10,000 lines of skills, uh, that were all based on our docs, and I did it in this really elaborate way where it would, like, take sections of our docs and make skills about them, and then it would, like, uh, put a little comment in the skill with the cryptographic hash of the current state

  45. 8:12

    of that section of the docs. And it basically, if I ran it again and that, uh, that SHA didn't change, don't update the skill. So it wasn't just constantly updating all the time.

  46. 8:20

    I thought I was being really clever and awesome, uh, and I generated this huge thing, and I even made some evals for it. I started making those, and it would take me 68 minutes to run those scenarios.

  47. 8:30

    It was just crazy. Uh, and it would fail over and over, and it would have these retries and, and get there eventually, but it was, like, a lot of work, a lot of tokens.

  48. 8:40

    Um, so I had more tokens. I thought more tokens, great. That's way better. Uh, but it ended up producing worse results, and it was really the measurement there, the evals that were telling me, "Hey, this isn't right."

  49. 8:51

    So I rewrote it by hand, uh, and instead of focusing on covering comprehensively everything that we have in our docs, I was like, "Oh, I just have to cover some common gotchas for everything."

  50. 9:02

    So for our entire docs, instead of having 10,000 lines of that, I have 553 lines of gotchas, and these are just, like, the most common things, uh, that came up as I was running these evals over and over and over.

  51. 9:15

    They ran faster, way smaller, uh, in terms of token count, uh, only took six minutes per run, and, uh, I wasn't sending the, the models on these long goose chases by having it, you know, go check a whole bunch of different things.

  52. 9:28

    It would stay focused on things. Uh, and so by deleting 95% of that, the performance of it actually went up, and I really only knew that because I measured it.

  53. 9:39

    So looking at that, I, like, had one skill in particular that I could see, and when I ran it with that skill, and I, uh, I gave it a task and said, "Hey, load this skill and then do this task," it got it correct 77% of the time.

  54. 9:51

    But if I asked it to do the same task without loading the skill, it was correct 97% of the time. So I was actively making it worse, and I only knew about that because I was measuring it.

  55. 10:01

    And so evals are super important when you're working with this non-deterministic code. Uh, Claude makes it really easy now. They have, like, evals, uh, a Claude, a Claude skill skill that will do evals for you.

  56. 10:14

    Uh, and it'll even set up-- It'll create, like, an HTML output of that and show you, like, side by side, "I ran a bunch like this and a bunch without the skill, and here's the results."

  57. 10:22

    Use that measure and see where you're actually falling apart because I thought I was making things a lot better by having a whole bunch of code. I just needed to trust that the, the model already knew how to code, and I just had to kinda gently nudge it in the right direction in some cases.

  58. 10:40

    So what did I actually learn from both of these systems? Uh, basically, you want to enforce things. Don't instruct. Uh, the model can lie about it. It can decide not to pull thing to-- not to do certain things because either it forgot about it, uh, it got distracted with other things.

  59. 10:56

    Uh, but if you actually set up a pipeline where it's-- has to enforce itself and prove to you that it did what you asked it to do, then you're gonna have a better time for sure, and oftentimes with a lot less tokens.

  60. 11:09

    Uh, you wanna guide the model. Don't prescribe it. So don't just give it, like, "Hey, here's a summary of all of my docs with, like, a whole bunch of information."

  61. 11:16

    You want to just guide it, "Hey, when you're working in, uh, Next.js, uh, and you're in the proxy, you want to do this. If you're not in the proxy, you can't call redirects."

  62. 11:25

    That's a really big one that constantly comes up over and over and over. Uh, it would just put those everywhere. And so guide it, but, uh, don't prescribe to it.

  63. 11:35

    And then, of course, measure. Don't presume, uh, don't assume that it works. Uh, just trust, uh, that it has a-

  64. 11:44

    Trust is a pass rate, a hash, a delta score, anything like that, so that you can prove to it. One of the things that Case does at the end, uh, as part of its reviewer, uh, script...

  65. 11:55

    I still read all of the code that it generates, uh, to make sure that it's actually, like, code that I would be proud of shipping. But I'm not even gonna waste my time looking at that code until it's proved to me that it did whatever I asked in a non-code way.

  66. 12:07

    And so the main way for that is, like, if it's working on a UI bug, I want it to use the Playwright CLI and record a video of itself doing something before, and then doing it after the fix, and showing me, "Hey, now it's fixed.

  67. 12:18

    It's working." And if it can prove that to me in those videos that it attaches to the PR, I'm way more inclined to look at that PR and say, "Yeah, okay, we can just, you know, fix some of the, the weird things that it did, but it did do the work correctly."

  68. 12:30

    And I'm way more incentivized to waste my time and become that bottleneck again for that. If not, uh, I just ask it to do it again. [clears throat]

  69. 12:41

    So every failure, uh, became data for the next run. This is another important thing, is when things failed... And this is, this goes back to that harness engineering thing, like, uh, if you are working on a harness and it is making mistakes, don't go fix the mistakes that it made.

  70. 12:56

    Fix the harness so that it can fix the mistakes. Um, and Ryan Lopopolo, I don't, I don't, I didn't see his talk, uh, here, but, uh, I saw a, a talk on Zoom, and he talked about how their team would never work on the code itself.

  71. 13:10

    They would only work on the harness to fix the code itself. And I really took that to heart with Case. So I only work on Case itself to make sure that it's doing what I want.

  72. 13:19

    Uh, and if it fails, then we do it again, and that becomes part of its memory. And that's the other big piece of it, is that as Case is running, the final piece of it is this retrospective agent, and all it does is it looks at what it did, and it goes in and looks at, like, the,

  73. 13:33

    the Claude and Codex transcripts, uh, like the JSONL files, and it pulls out information. "Hey, was I running a lot of tools at the same time? Did I run the same tool request three times in a row without any changes to anything?

  74. 13:47

    Was I, like, getting in a doom loop there?" Like, trying to identify those things, and see what it can do better. And then internally, Case keeps a whole bunch of memory files as Markdown files, and it just understands like, okay, in ge- I have a general memory file.

  75. 14:00

    If I'm working in Next.js, I have a Next.js memory file, a TanStack Start memory file, et cetera. And it figures out where to put information about that so that it won't make a, a mistake and break the start.ts in TanStack Start again.

  76. 14:13

    It knows about that because it put it into its memory. And one thing that I wanna add is, like, that AutoDream thing that Claude is now doing where it can kind of prune its memory over time.

  77. 14:21

    That'll be the next piece that I add to it. Um, but making sure that it can learn from its mistakes, and it can do it automatically, and then you can also provide feedback.

  78. 14:28

    Have a way for you to provide the feedback to it as well. And then the next time it, you give it a task, it's just gonna be that much better.

  79. 14:34

    And eventually you're just gonna start trusting it more and more and more.

  80. 14:39

    And if you're making your product work for agents, uh, there's a couple of important things as well. Uh, figure out what the agents get reliably wrong about your product and focus on that.

  81. 14:49

    Don't focus on the product as a whole because it probably knows a lot about it, a lot more than you think about it. You write do- write down, write down those gotchas.

  82. 14:57

    Uh, create skills around those. Uh, you can create tutorials too, uh, but don't rely on that. The models can read the tutorials and, and learn from that. Um, but just remember that the models know how to code.

  83. 15:09

    They just need to know the intricacies of your product and where the landmines are in that.

  84. 15:14

    And of course, measure what you're shipping. Um, you wanna understand where the model is failing for your particular product, and make sure that you focus on that. And the only way that you can do that is through things like evals.

  85. 15:27

    Otherwise you just might be adding noise and sending the model on wild goose chases.

  86. 15:33

    Uh, and think about the consumers in the way that you think about, uh, developers. Like, think about those agents, uh, in the same way that you think about developers.

  87. 15:40

    What do they wanna know? How can I make things better for them? Do I have a lot of JavaScript loading on my page after the fact that's adding a whole bunch of context that maybe is not getting added when whatever, uh, process they use to go pull, uh, and summarize the information on your page?

  88. 15:55

    Uh, is that getting lost to them? Make sure that it's not.

  89. 15:59

    Mm, and if you're making agents work for you, like in, uh, the case of Case, um, you replace your trust with evidence. Never trust it. Always make it prove to you that it did something.

  90. 16:11

    Um, if it ran the test, make it prove it. If it, uh, fixed a UI bug, it has to show it to you. Uh, otherwise don't waste your time on it.

  91. 16:20

    Uh, and enforce that with, with code, uh, not prompts. So this is why I s- I switched it to pi and used a state machine to force it, because I have full control over that state machine, and it's outside of the pi or Claude deciding, "Uh, should I do this or not?"

  92. 16:34

    No, you have to do it. I enforce that through that loop.

  93. 16:39

    And then every failure becomes, uh, a system bug. Each time it messes up on something, that's a bug in the harness. Go fix the harness.

  94. 16:47

    So really, um, the agent just, uh... You, you wanna build the environment that the ag- that you can work with the agent in, uh, and focus on that. Um, the practices that we have haven't really changed.

  95. 17:01

    Uh, our job hasn't really changed. Uh, we've just kind of abstracted it a little bit. Uh, your job was never really about writing code. It was always about building these systems, and now we just have a better abstraction to understand that.

  96. 17:14

    Uh, so take that into account and, um, and go forward from there. Uh, so that's the talk. Uh, thank you, and I'd be happy to answer any questions with the time I have left. [audience applauding] [upbeat electronic music]