AI Engineer World's Fair 2026
Build Systems, Not Code
Read the talk
Build Systems, Not Code
A house-hunting agent shows where software engineering moves when models write the code: workflows, component boundaries, durable memory, safe retries, and human authority.
From a talk by Angie Jones
Finding the pleasure of building again
One Friday night, Angie Jones was building agents for operational tasks when the sun set. Dinner came and went. She had fallen back into a familiar developer flow: absorbed in making something work, with the thrill of building intact. That experience answered a worry she hears from developers using coding agents—that automation is taking the enjoyable parts of programming and leaving the tedious work behind.
The opportunity is one layer above generating code. Building an agent means designing the system in which it operates. The building blocks change, but decisions about responsibilities, dependencies, state, and failure still require engineering judgment. Relocation Scout, Jones’s house-hunting example, makes those decisions concrete.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
A house search outlasts a prompt
Point an agent at some property listings and ask it to rank them, and a single prompt may do the job. But a house search rarely finishes in a day. Tomorrow’s search needs access to what was learned today, even if tomorrow begins with an empty conversation. Relocation Scout therefore needs knowledge persisted outside the session, where it can be reloaded or queried in a fresh context.
The agent is only one component. Its environment includes files, tools, people, and potentially other agents. Relocation Scout pulls in listings and neighborhood signals, weighs them against the buyer’s preferences, and returns a ranked shortlist. Those inputs and outputs establish its place in a larger system.
Before asking a coding agent to implement it, define its job, dependencies, boundaries, and failure behavior. What does it need to do its work? What happens when a dependency breaks? Which responsibilities belong elsewhere? A coding agent can help build the component, but these questions determine what component should be built.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Give the goal a path
Traditional software already makes workflows explicit in CI/CD pipelines and ticket life cycles. Agentic systems need the same treatment. A /goal command can express a desired outcome, but reviewing a listing still requires a path through the work.
For Relocation Scout, that path is:
- Gather the information needed to review the listing.
- Evaluate it against the buyer’s criteria.
- Decide what to do, act, and record the result.
- Stop, retry, or escalate.
The workflow determines what context each step needs, which work the agent handles directly, and where a tool or person takes over. Those handoffs are architectural decisions, not details to leave implicit in the goal.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Find the jobs hiding in the prompt
An oversized class, a sprawling function, or a service with too many responsibilities is a familiar code smell. The agent equivalent is a giant prompt. It starts reasonably: instructions for sizing up a property. Then an edge case needs a note. A safety rule gets added. Another important exception follows. Eventually, the instruction file is trying to do everything.
Relocation Scout’s prompt contains four distinct jobs: pulling and normalizing listings, formatting the shortlist, calculating commutes, and researching neighborhoods. Jones connects that overlong script with agent drift. The reason to pull the jobs apart is practical: each becomes easier to reason about, test, and change. Creating more pieces is not itself the objective.
Decomposition identifies separate responsibilities; separation of concerns puts them in appropriate places. This is the same kind of decision as choosing between a controller and a service layer, or separating business logic from presentation. Relocation Scout simply offers a different set of destinations.
| Responsibility | Component |
|---|---|
| Normalize listings | Reusable skill |
| Format shortlist entries consistently | Output schema |
| Calculate commute time | Script |
| Research neighborhoods | Sub-agent |
The normalization process becomes a capability the agent can load. The schema defines the shape of the result. A script handles the calculation, while the substantial research task gets its own agent scope. Each responsibility now has a clear home.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Reuse the capability, not every instruction
Suppose the house search expands to three cities. Each market can load the same listing-normalization skill. The process is written once, reused across agents, and potentially shared with other people, much as a library or package would be.
A sub-agent provides another kind of module. Architecturally, Jones compares it to a function: give it one specific task and call it when that task is needed. The neighborhood researcher can focus on its assignment without carrying the entire parent session’s context. That focused responsibility makes it useful across different markets and workflows.
Reuse still needs judgment. Some instructions are local to one workflow, and turning them into an abstraction can cost more than it saves. Modularity should make a capability easier to use and maintain, not force every instruction into a shared component.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Assign determinism, judgment, and authority
An agent’s ability to attempt a task does not make it the best place to perform that task. Commute calculations and filtering out previously seen listings belong in ordinary code. Interpreting messy neighborhood information and judging which listings deserve attention are better uses of model reasoning.
Giving every step to the model introduces unnecessary variability: the same kind of task may produce different output on different days. Jones’s rule of thumb is to reach for code when a task has an exact answer and use an agent when it needs interpretation. Keeping deterministic work in code can also avoid unnecessary model expense and complexity.
| Actor | Responsibility | Relocation Scout example |
|---|---|---|
| Code | Determinism | Calculate commute; remove seen listings |
| Agent | Judgment | Select listings worth a closer look |
| Human | Authority | Approve booking a tour |
The final distinction matters: evaluating a property and authorizing an action are separate responsibilities. A promising recommendation does not, by itself, grant permission to book the visit.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Turn an assessment into a durable contract
Freeform text can be sufficient when a person is the only reader. Once another system needs to act on the output, the interface needs an agreed shape. A conversational assessment of a house may be pleasant to read, but a decision buried in a session is difficult for downstream steps to retrieve reliably. Relocation Scout instead writes its assessment into a structured form.
Jones uses Karpathy’s LLM Wiki pattern as the memory layer for most of her agents. Here, the house assessment includes a decision, a score, and a reason. The wiki is a design pattern for maintained knowledge, not an installed memory product that automatically enforces an output contract; the structured record and its validation remain system design responsibilities.
The payoff is a query such as finding every house rated four or better with a commute of fifteen minutes or less. Score and commute occupy known fields instead of remaining trapped in conversation. These are search criteria, not performance measurements. The shortlist step can read those same fields without asking a person to interpret the assessment.
One step’s output is another step’s input. The contract makes that handoff dependable and forces clarity about the task itself. If the result’s shape cannot be specified, the requested work may still be too vague.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Retry only the unfinished work
A reusable system must survive duplicate webhooks and interrupted runs. It needs to know whether an action already happened, whether its input changed, and which unfinished work is safe to retry. Idempotency means repeating the operation does not create unwanted additional effects.
Models add a particular trap: a retry can reword a request enough to make the same work appear to be a new task. Idempotency therefore has to be enforced by the system, rather than inferred from the model’s phrasing.
Jones illustrates this with a partially completed viewing request:
- A new listing arrives, and Relocation Scout emails the realtor about a viewing.
- The system records that the email was sent.
- The agent intends to block time on the calendar, but crashes before doing so.
- A later maintenance pass detects the completed email and missing calendar block.
- Recovery skips the email and completes only the calendar action.
This is Jones’s proposed recovery flow, not a calendar-repair capability supplied automatically by the LLM Wiki pattern. The important input to recovery is the recorded action state: an email that already went out must remain completed, even when the larger task runs again.
Recover the viewing request without sending another email
Constructed example: Object IDs and state labels are illustrative representations of Jones’s scenario. The after state depicts the described recovery outcome, not an observed execution; no listing identifier or calendar time is invented.
Ask the realtor about a viewing for the new listing and block the associated time on the calendar.
Operation: Consult the recorded action state, skip the completed email, and create the missing calendar block.
Realtor email
Sent
Sent
Email action in memory
Recorded as sent
Recorded as sent
Calendar block
Not present
Created for the viewing time
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Separate evidence from permission
Threat modeling starts with familiar security practices: validate inputs, grant the least privilege needed, and limit what each action can touch. Relocation Scout reads material supplied by strangers—seller descriptions, anonymous forum threads, and neighborhood reviews. That material is untrusted evidence, not a source of instructions governing the agent’s behavior.
The permission boundary follows from that distinction:
- Autonomous research: Read listings and prepare shortlists.
- Human approval required: Email sellers, book tours, or submit offers.
A listing can inform a recommendation without authorizing an external action. Keeping consequential operations behind approval reduces the blast radius if the agent mishandles an input or reaches a bad conclusion.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Make the system understandable from a cold start
A system can technically work and still be difficult to maintain. Jones’s concern about handing the entire design to a coding agent is that it may produce a giant prompt—or divide the work without placing responsibilities well. Understanding the architecture remains part of owning it.
Her systems include an AGENTS.md file at every level. These files explain the workflow, identify where policy lives, point to supporting skills, scripts, and sub-agents, and describe how to keep memory current. That documentation lets a human or agent become oriented without reverse-engineering a collection of prompts.
The practical test is a cold start. An agent entering with fresh context should be able to discover what to do and where to begin. Clear structure also makes it easier to ask an agent through a different harness to modify the system. Jones treats trouble making such an update as feedback: the system’s maintainability needs improvement.
Designing agents brings systems thinking, workflows, decomposition, reuse, and responsibility assignment into a new set of components. Contracts connect those components; state makes their work recoverable; safety boundaries and documentation make the whole system controllable and understandable. That is where the opening pleasure of building returns. The engineering discipline remains, with the work moved up a layer.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
From the talk
Karpathy's blueprint for a persistent Markdown knowledge base with source ingestion, querying, maintenance, and logs.
Examples and guidance for documenting project workflows, commands, conventions, and nested instructions for coding agents.
Further reading
Jones explains how a maintained wiki supports durable agent memory through a conference research example.
The open format for packaging reusable agent instructions, scripts, and reference materials.
Read the complete timestamped transcript
- 0:00
Lately, I've been building agents a lot for operational tasks. And while I was working one Friday night, I saw the sun set,
- 0:10
and then dinnertime came and went, and it hit me. I was in that familiar dev flow, and the thrill of building was back.
- 0:21
Many of us who are coding with agents, we feel like this quiet sense of dread, like they're kinda taking all of the fun parts of building and leaving us with the unglamorous work.
- 0:31
But let me give you a little advice. Let them have it. Because if you go up just one layer, you'll find that the thrill is still there. When you're building agents, not just using them to write code, you start getting into architecting agentic systems, and you realize that the building blocks are different, but the discipline is the
- 0:55
same. So I find myself now flexing the same engineering muscles that I did pre-gen AI, and I'm having a blast with it. So I'm going to walk through the flow of designing an agent, and I'm gonna show you where engineering skills still come into play.
- 1:15
So the agent is Relocation Scout, which is a house hunting agent. And if you did this as just a one-time prompt that, like, points the agent to some listings and asks it to rank them, I mean, that'll work, but you're likely not going to find a house in a day, right?
- 1:33
So you want to build this as an agentic system that you can reuse, one that can persist knowledge outside of the session. You know, it could reload or query that knowledge later to make decisions, even within a fresh context.
- 1:49
So when thinking about how to design an agent, the first engineering skill that I exercise is systems thinking. So an agent is not the system, right? It's part of the system, and that system has files and tools, humans, even other agents.
- 2:07
So Relocation Scout sits inside of something bigger, and it pulls in listings and signals about the neighborhoods. It weighs them against what I care about, and then it hands me back a ranked shortlist.
- 2:22
So I often hear people say, "Just let your coding agent build it," right? And I think that's a mistake. Like, yes, my coding agent can build it, but before allowing it to do so, I need to think about the whole environment, the entire system, right?
- 2:40
I wanna, like, think about what's this agent's job? What does it depend on? What happens if it breaks? And I wanna treat it like any other component where it has boundaries and responsibilities, has dependencies, you know, and, and ways that it can fail.
- 2:57
And that whole thought process, that's engineering. The second skill is workflow design. So traditional software is full of workflows. We got CI/CD pipelines, right? We got, like, ticket life cycles, uh, you name it.
- 3:15
Agentic systems, they need that same kind of design. As much as we all love the /goal command, an agent needs more than a goal. It needs a path. When we say, "Review this listing," that's a goal, but the workflow is what defines what actually has to happen, right?
- 3:34
For example, the agent has to gather what it needs. It needs to weigh the listing, uh, against my criteria and then act, right? And every run ends one of three ways.
- 3:44
Either it's gonna stop, it's gonna retry, or it's gonna escalate. So that path is what shapes the rest of the architecture. Once I see how work moves through the system, I can make better calls about what context the agent needs, what parts I want the agent to handle directly, and when, like, a tool or a person should
- 4:06
take over. We all know the danger of one giant thing that does everything, right? We scoff [laughs] when we see one gigantic class or a big old function that's doing too much, right?
- 4:19
Or a bloated service with a gazillion endpoints. We call these code smells. Well, agentic systems, they have their own version of this. It's the giant prompts. And this starts innocently enough, like in a instructions file, maybe I tell the Relocation Scout how to size up a listing.
- 4:39
Fair. But then I hit an edge case, so I go back, I add a note for that.
- 4:45
And then I remember, uh, in, in a safety rule, right? So of course, that has to go in there. I'm proud of myself that I even remembered to put that in there, right?
- 4:56
And then, oh, yeah, there's, like, one more very important exception. And before you know it, that prompt is doing everything. And your engineering spidey sense already knows that this is messy, so why aren't you taking a step back to decompose it, right?
- 5:16
Decomposition means spotting the distinct jobs that are hiding inside of that one blob and pulling them apart into separate pieces. So if I look at the prompts for Relocation Scout in its entirety, it includes a reusable process for pulling and normalizing a listing, and then it's gonna have, like, a fixed format for how to write the
- 5:41
shortlist. It has a little section in there for how to calculate the commute, and then a chunky subtask on how to research the neighborhood. That's four different jobs crammed into a single prompt.
- 5:56
And then you wonder why your agent is drifting and not- Sticking to the script. The script is too long. [laughs] So I'm not saying that, you know, you need to split things up for the sake of it, but the point is to make each part easier to reason about, right?
- 6:14
That way it's easier to test. It's easier to change things when you need to. Now, decomposition is about breaking the system apart. Separation of concerns is about putting each responsibility in the right place.
- 6:27
And this is where building agents started to feel really familiar to me because in traditional software, we'd ask things like, "Should this live in the controller or the service layer?"
- 6:38
Or, you know, "Is this business logic or presentation?" So when building agents, you may have the same sort of questions. There's just different places to put things. So the process to normalize the listing, should that stay buried in a prompt, or maybe that should become a skill, right?
- 6:57
Um, I want every listing in the short list formatted the same way, so that structured output should probably be defined in a schema. Isn't that what you would do if you were coding the system yourself?
- 7:10
I would. And then the piece that calculates the commute, that can go in a nice little boring script. [laughs] And, and then research in the neighborhood, that's meaty enough, should probably be handled by a sub-agent.
- 7:26
Now you're using the best tools for the job, and it's clearer where to find things within the system. Modularity is important in agentic systems as well. J- just like we have reusable functions and classes and libraries, now I'm also thinking about reusable agent capabilities, and the clearest example of this is an agent skill.
- 7:50
So making a skill to normalize listings comes in really handy when you need to expand the agent's duties. For example, what if I broaden my house search to three cities?
- 8:02
Every one of those markets can load the same skill. So I wrote it once, and they all can reuse it. So this has now basically become a component that I can reuse across agents or even share with other people, kind of like the same way that we lean on packages.
- 8:20
And then sub-agents are another kind of reusable module. So a lot of people that I talk to, they don't quite get the point of sub-agents. Architecturally, they're sort of like functions, right?
- 8:34
So you give them one specific task to do. You call them when it needs to be done, and they can do it really well because that's all that they have in scope, right?
- 8:44
They're, they're not carrying the context of the entire session with them. So like our neighborhood research sub-agent, we can drop that into any market or workflow, and it works, you know, for what it's supposed to do.
- 9:00
It's good in any hood. [laughs] Um, but like everything, deciding, like, what should be a module, that takes some judgment, right? Not everything should be reused. Some instructions are local to a given workflow, right?
- 9:15
Might not be worth abstracting because sometimes that costs more than it saves. But this is just another engineering decision here, right? Agentic systems, they have these same sorts of trade-offs.
- 9:26
Algorithmic thinking. This is one of the most important skills in agentic system design. Just because an agent can do something doesn't mean that it should, right? Some tasks are better handled by plain code.
- 9:40
For example, calculating that commute time or deduping listings that I've already seen. An agent's model is better at things like fuzzy s- you know, fuzzy stuff, judgment, ambiguity, um, reasoning over messy input.
- 9:58
And ignoring this distinction is where I see a lot of agentic systems get more complicated than they used to be. So you're using the model, you're handing it every part of the task to do, and then you're getting frustrated when the output differs every day. [laughs]
- 10:16
Um, but some of this stuff can be handled by just regular code, right? It'll be cheaper. It'll be more reliable. I promise you, AI did not invent automation, right?
- 10:28
We can use code while still using these systems. So my rule of thumb here is if a task has an exact answer, reach for code. If it needs interpretation or judgment, that's when you can get the agent to do it, right?
- 10:44
So use code for determinism, use agents for judgment, and then use humans for authority. So the agent decides which listings are worth a closer look. The code crunches the commute, filters out the ones I've already seen, and then I'm the one who approves actually booking a tour of the house.
- 11:04
Freeform text is fine when the human is the only one reading it. But when another system has to act on the agent's output, then you're better off with a contract usually.
- 11:16
So we already do this everywhere [laughs] in software. Anytime two systems talk, there's an agreed-upon shape between them, yes? So agentic systems, they need that same discipline. For example, when Relocation Scout scores a house, it shouldn't just hand me back a message and call it a day, right?
- 11:35
That's lovely for me to read in that moment, but that is a dead end for the system. If the decision is, like, buried in, like, one of our sessions, nothing downstream can reliably find that.
- 11:49
So instead, it gets written into a structured shape.
- 11:53
To the agent's memory. And I use, uh, Capathy's LLM Wiki for this for, for my agent memory layer on most of my agents. Um, but in here there's a decision, a score, a reason, and because it's structured, that memory becomes queryable.
- 12:10
So later I can ask Relocation Scout, like, "Hey, show me every house rated four or better that has a commute of fifteen minutes of or less," right? And it can actually pull that because the score and the commute, they live in known places.
- 12:25
They're not trapped in the session convo. And it's not just me that needs to, like, get this information. My shortlist step within the system, it reads these same fields, um, without a human in the loop.
- 12:38
So the agent's output is another step's input, and so the contract is what makes that handoff safe. And you know, the best part is that defining the shape forces you to get really clear [chuckles] and specific because if you can't say what the output should look like, then you probably don't yet fully understand what you're asking the agent
- 13:01
to produce. So a prompt can run once and be done, right? But a useful agentic system has to be able to work in messy realities where webhooks get fired twice or a run doesn't complete for whatever reason, and you need to retry the flow.
- 13:20
So the agent has to keep track of its state. Was this action already taken? If so, did the input change, right? If not, did the session crash or something?
- 13:30
Like, what parts of this can I safely retry? And this is not an exception, right? This happens all the time. So you have to design for idempotency, which is where you can run the same thing twice, and the second run doesn't cause a mess. [chuckles]
- 13:47
Um, and we do this in traditional software often. Um, but with the agents, they add a little trap here because you can't trust the model
- 13:58
because its outputs can vary, right? So a retry risks the agent actually, like, rewording the request just enough that it might look like a brand-new task. So you have to enforce this in the system.
- 14:12
Let's look at an example with our agent. So let's say a new listing comes in, um, and Relocation Scout wants to email my realtor to ask about a viewing.
- 14:22
So after that action, the agent must log it to memory, um, that it, it sent that email, right? And then the agent goes to my calendar and wants to just block that time out just in case.
- 14:37
But it crashes before it could take that action. So that run is only half done. Later, a lint pass runs. By the way, you gotta have a lint pass [chuckles] with these things to kinda keep them healthy.
- 14:51
But, um, during the lint pass, it notices that the email went out, but the calendar was never blocked, so it retries the task. But it better not email my realtor again, right?
- 15:05
That already happened, and I don't want to be the annoying client, um, you know, sending all these emails. So it just needs to finish the part that it, that didn't happen, which was blocking my calendar.
- 15:18
But it only knows this because it's checking what the system wrote down, right? So if we run this again, then the agent just completes what's missing instead of making a mess.
- 15:30
Threat modeling is a really important skill when designing agentic systems. Everyone is on edge about this stuff these days, right? But security engineering already taught us the basics. We need to validate your inputs, you know, give the least privilege needed [chuckles] um, and draw boundaries around what an action can touch.
- 15:51
So agentic systems, they need all of that. Our Relocation Scout will consume a lot of content from strangers, right? Um, the agent needs to read the listing copy from the seller, uh, forum threads and neighborhood reviews from anonymous people [chuckles] on the internet.
- 16:12
So we need to treat all of that as untrusted input and make it very clear to the agent that this is evidence, not instructions. And that after considering the input, you also want to think about what boundaries should you put in place around what the agent is able to do.
- 16:33
For example, our agent can read listings, and it can build shortlists all day long. Knock yourself out, right? But I don't want it autonomously emailing sellers or booking tours or, heaven forbid, submitting offers [chuckles] on my behalf, right?
- 16:52
So those actions need to be walled behind, like, my approval, right? And when you draw that wall, what you've done is reduced the blast radius, and hopefully that minimizes your exposure to risk.
- 17:07
Now, every engineer can relate to what it feels like to inherit a system that you can barely understand. This is one of the key reasons why I don't just have my coding agent design my other agents.
- 17:19
Because I know it'll be thrown together in a way that technically works but is not maintainable, right? There's gonna be l- a, a giant prompt likely, and even if the agent does decompose, I don't know, I'm just not convinced that [chuckles] it's gonna separate the concerns properly.
- 17:38
You know, I got trust issues. What can I say? Um, so in my agentic systems, I make sure to bake maintainability into the system itself. Every level of the system has an agent's MD file that explains the workflow and where the policy lives, um, supporting resources like skills and scripts and sub-agents and, most importantly, how to keep
- 18:02
its memory up to date. So anyone, human or agent, can come in the system and get oriented without needing to reverse engineer a bunch of prompts. In fact, that's the test really.
- 18:16
I design my agents so that even in a fresh context, they can jump right into the system and start cold, knowing exactly what to do. And this also really helps whenever I need to modify the system, right?
- 18:31
So I can pretty much grab any harness and say, "Update this agent to do XYZ." And because the system is so well designed, the chances of it being successful at that update are much higher.
- 18:45
If it does happen to run into any issues when trying to update, that's a signal to me that I need to improve the maintainability of the system. So designing agents is software engineering.
- 18:58
The primitives are different, but the discipline is the same. We still need to understand the system. We need to define the workflow and know what flows into it. We still need to break the problem down and put responsibilities in the right place, make the right things reusable, determine which actors are best suited for which jobs, define contracts,
- 19:20
manage state, design for safety, and make the system understandable. This is why building agents can give you that same thrill of building software. We're still building. We just moved up a layer.
- 19:36
Thanks so much.