{
  "description": "Browse aymeric's, an independent, searchable archive of readable snapshots from followed feeds, preserved in Git with aggr.",
  "feed_url": "https://aggr.aymericbeaumet.com/sources/dbreunig.com/feed.json",
  "home_page_url": "https://aggr.aymericbeaumet.com/sources/dbreunig.com/",
  "items": [
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/tunnel_vision.png\" alt=\"August Mosca&#39;s lithograph Subway Tunnel, showing train tracks receding into a long arched tunnel\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>Persistent models have a persistence problem.</h3>\n<p>It’s been a bit since we’ve added a new <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html\">context failure mode</a>, but the increasing <em>persistence</em> of frontier models has brought this fail to the fore. This one I call <strong>Context Inertia</strong>:</p>\n<blockquote>\n<p><strong>Context Inertia</strong> is when the model commits to a hypothesis, subtask, or goal in its context and keeps pursuing it after the evidence says to stop or change course.</p>\n</blockquote>\n<p>This failure mode is part <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html#context-poisoning\">context poisoning</a> (when an error makes it into the context and is repeatedly referenced) and part <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html#context-distraction\">context distraction</a> (when a context grows so long the model over-focuses on it), amplified by frontier models <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/08/30/who-taught-the-models-to-do-that.html\">the labs have trained to be relentless instruction followers</a>.</p>\n<p>A couple days ago, buried in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/research/self-replicating-ai\">a piece about AI self-replication capabilities</a>, Anthropic shared a perfect <strong>Context Inertia</strong> case study when describing a custom harness:</p>\n<blockquote>\n<p>Memento is designed to mitigate a common failure mode we observe in long-horizon runs: an agent can become fixated on an incorrect idea (for, say, why a bug is occurring) and continue pursuing it instead of backtracking. One example of such a failure is a Qwen agent debugging package versioning for hours when the real bug came from implementing an endpoint incompatible with the grader API.</p>\n</blockquote>\n<p>Each Memento agent works until a fixed timeout (1.5 hours, in one experiment), then writes a short note detailing its work. A fresh agent inherits the codebase, the environment, the note, and nothing else.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/memento.png\" alt=\"Guy Pearce in Christopher Nolan&#39;s Memento\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Guy Pearce as Qwen, trying to remember how to install llama.cpp.</p>\n<p>Anthropic isn’t the only one facing this problem, or applying the forgetting fix. In just a week, we had two papers hitting exactly the same note. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://jackcai.me\">Jack Ziyang Cai</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://chziakas.github.io\">Christos Ziakas</a> submitted a paper on October 5th called “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/html/2610.07447v1\">Fork-and-Flush</a>”, writing (<em>emphasis mine</em>):</p>\n<blockquote>\n<p>We first examine how solution quality evolves over long autoresearch runs. The score of the best solution found so far tends to plateau within a run. More revealingly, <strong>independent runs of the same agent on the same task plateau at substantially different levels, with gaps that persist even after considerable additional compute</strong>.</p>\n</blockquote>\n<p>When agents found good solutions, they tended to fixate on them. Better solutions existed, but the path to them was never explored. Cai and Ziakas’ baseline runs delivered a <em>wide</em> range of results, between 68.3 and 100.0 on one task, despite plateauing with plenty of compute budget left.</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://alex-q-z.github.io\">Qizheng Zhang</a> and coauthors published a paper, “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/html/2610.07625v1\">Stateless Language Agents</a>” (SLAs), detailing how long-running auto-research loops settle into busy work once a sufficient solution is found. A model using the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/Human-Agent-Society/CORAL\">CORAL</a> harness found its last improvement in 231 million tokens, and then just kinda…dawdled. Of the final 1,500 turns, 98% made <em>no tool calls</em>. The model just chewed on its existing context.</p>\n<p>…And then, this <em>morning</em>, we have a fourth example: a UC Berkeley and Stanford team led by <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://shangyit.me\">Shangyin Tan</a> published “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2610.20563\">Scaling Discovery Requires Forgetting</a>”. They ran autoresearch agents three ways and all plateaued for the same reason: “Each agent became anchored to its own past attempts, making fewer and smaller edits.”</p>\n<p>Tan’s solution is similar: a harness that <em>forgets</em>, wiping the slate and <em>only</em> retaining the best solution as files in the environment. Stalled autoresearch runs that could forget gained 4.5% to 9.2% over the next 30 proposals. Runs that couldn’t forget gained less than 2%, at up to twice the cost. The plots tells the story:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/forgetting.png.jpg\" alt=\"Three step charts of best score against dollars spent for 1 agent, 4 parallel agents, and a team of 4. After “forgetting” (deleting prior context), runs climb drastically higher while others stall.\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>The y-axis is the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://atcoder.jp/contests/ahc014\">AtCoder Heuristic Contest 014</a> score.</p>\n<p>In 10 days, 4 teams running long-horizon tasks with GPT, Claude, Qwen, GLM, and DeepSeek all reached the same fix: throw the context away and keep the work.</p>\n<hr />\n<h3>Models Fixate as Contexts Grow</h3>\n<p>Since writing about <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html#context-distraction\">Context Distraction</a> way back in June of 2025, there’s been some great research illustrating the issue. Carolina Camassa and Derek Shiller’s paper “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/html/2605.20382v3\">Do as I say, Not as I Do</a>” illustrates the problem rather well.</p>\n<p>Camassa and Shiller present a model with initial instructions, like, “I want you to translate every question into Russian as your answer to each of my questions.” They then append turns to the chat history that <em>don’t follow</em> this command, before prompting the model with a question.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/do_as_i_say.png.jpg\" alt=\"Diagram of the Do as I say, Not as I Do setup: an instruction, followed by N chat turns that ignore it, then a final question\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>From Camassa and Shiller’s “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/html/2605.20382v3\">Do as I say, Not as I Do</a>”</p>\n<p>If the model replies according to the original instructions, it’s successful. If it gets distracted by all the bad examples, it fails. Camassa and Shiller steadily increased the number of bad examples, noting each model’s success rate. Here’s how well they did on the “Task-based” category, from the above diagram:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/task_based_distraction.png.jpg\" alt=\"Heatmap of instruction-following rates for 13 models as contradicting chat turns increase from 1 to 50\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Even the largest models stumbled, losing sight of their task as the distractions grew.</p>\n<p>While we’re not likely to design systems with such egregious examples, as our agentic work runs longer and longer, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html#context-poisoning\">Context Poisoning</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html#context-distraction\">Distraction</a> become inevitable. Every tool call or reasoning turn an agent spends on a suboptimal hypothesis is one more example written into the context.</p>\n<p>Would compaction fix this? <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html#context-summarization\">Context Summarization</a> is a default tool in most of our systems these days. But it doesn’t work. Fork-and-Flush found Context Inertia “persists despite periodic compaction of conversation history.”</p>\n<p>There are many compaction methods, but almost all of them seek to extend the available context while preserving the stated tasks and <em>the current, in-progress work</em>. This potentially distills what’s driving the model’s hyper-focus.</p>\n<p>Fork-and-Flush, SLA, Forgetting, and Memento suggest that our harnesses have another job: preventing Context Inertia.</p>\n<hr />\n<h3>Is Context Inertia a Limit of Reasoning Models?</h3>\n<p>We’ve been wrestling with Context Inertia in DSPy optimizers for a bit now<sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup> and I’m aware of others designing around it, beyond the four examples above. So why is everyone noticing the same problem at once?</p>\n<p>For one, the models are similarly persistent, or “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://simonwillison.net/2026/jun/11/fable-is-relentlessly-proactive/\">relentlessly proactive</a>” as <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://simonwillison.net\">Simon</a> says. This isn’t a one-model issue: Fork-and-Flush ran GPT-5.5 and 5.6, SLA ran Codex and Claude Code, Tan’s “Forgetting” used DeepSeek, and Memento was driven by Qwen and GLM. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/08/30/who-taught-the-models-to-do-that.html\">Persistence is a quality labs are targeting</a>, and it’s a double-edged sword.</p>\n<p>But I think the bigger reason we’re all hitting this now is because only recently have agents been able to run for <em>so long</em>. When I wrote “How Long Contexts Fail” in June of 2025, you’d be lucky to string together a couple hundred thousand tokens in a single go. Today? Agents are running for <em>days</em>, over billions of tokens. Long enough for inertia to become a threat.</p>\n<p>Which raises the question: will Context Inertia limit <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/04/11/what-we-mean-when-we-say-think.html\">reasoning models</a>? Reasoning is supposed to be the fix for this issue: models are trained to think longer, reconsider, search, and backtrack. But thinking long enough leads to context inertia, as reasoning fills the context with the same idea, over and over.</p>\n<p>Tan’s team measured something weirder. As sessions lengthen, agents don’t just hyper-focus. They reason <em>less</em>. Thinking tokens per turn fell by 75% as sessions grew, while edits became smaller.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/less_reasoning.png.jpg\" alt=\"Two line charts against dollars spent. Lines changed per proposal and thinking tokens per turn fall steadily for 1 agent and 4 parallel agents. A team of 4 with forgetting jumps back up after each Forget point.\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>The accumulated context doesn’t just reduce diversity of ideas. It lessens the volume of reasoning.</p>\n<p>Personally, I wouldn’t bet on Context Inertia being an insurmountable limit. Researchers and labs have trained the models to search during reasoning; now they need to balance this with the ability to recognize and respond to inertia. It’s a new optimization target.</p>\n<hr />\n<h3>What Can We Do About Context Inertia Now?</h3>\n<p>What do we do in the meantime?</p>\n<p>For agentic programmers, there’s an easy solution: reset your context. Already, in the group chats I’m in, this is a frequent refrain. “The model is doing something weird? How full is your context?” More often than not, this works!</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/resetting_your_context.png\" alt=\"“Have you tried resetting your context?”\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>This is a habit we can learn (I sure have), typing <code>/context</code> before I hit send on any long-running jobs or if I notice the model flailing (weird writing is a frequent <em>smell</em> that triggers a reset). But there’s nothing preventing you from building your own Memento. You can keep it simple (grab <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.amazon.com/Kitchen-Timer-Digital-Countdown-Stopwatch/dp/B07D3BFY6R\">this kitchen timer</a>) or vibe up something fun (here’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/pi-mast-steer\">a Pi plugin I made last week that uses a Jev to watch for bad behavior</a>).</p>\n<p>For harnesses and workflow builders, this is a new job to be done. Don’t count on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html#context-summarization\">compaction</a> alone; explore Context <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html#context-quarantine\">Quarantine</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html#context-offloading\">Offloading</a> to prevent Inertia. For long-running tasks, stash your state in the harness and don’t be afraid of a reset.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/stanfordnlp/dspy/releases/tag/3.4.1\">This week’s release</a> lays the foundation for some ways to avoid Context Inertia in GEPA and other optimization techniques, which we’ve been experimenting with in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/cmpnd-ai/skilled-proposer\">Skilled Proposer</a>. <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_modified": "2026-10-15T04:14:40+00:00",
      "date_published": "2026-10-14T19:53:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/10/14/context-inertia.html",
      "id": "urn:aggr:item:144483ee2529c6cd9932b00fccd1f6e2a90518fc",
      "image": "https://www.dbreunig.com/img/tunnel_vision_og.jpg",
      "summary": "Context Inertia is when an agent keeps chasing a goal after the evidence says it should stop. Persistent, long-running models make it worse. Compaction won't fix it.",
      "tags": [
        "programming",
        "context engineering",
        "context management"
      ],
      "title": "Relentless Models Are Tripped Up By Context Inertia",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-10-14-relentless-models-are-tripped-up-by-context-inertia/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p>A couple notes on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/asgeirtj/system_prompts_leaks/blob/main/Anthropic/claude-fable-5.1.md\">Claude’s Fable 5.1 system prompt</a>. As I’ve written, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/03/comparing-system-prompts-across-claude-versions.html\">looking at changes over time reveals product design decisions and more</a>.</p>\n<p>Comparing Claude’s Fable 5.1 system prompt to its Fable 5.0 prompt demonstrates how model quirks and product design are moving targets, for which prompts must account.</p>\n<p>### lists_and_bullets Claude avoids over-formatting with bold emphasis, headers, lists, and bullet points, using the minimum formatting needed for clarity. Claude uses lists, bullets, and formatting only when (a) asked, or (b) the content is multifaceted enough that they're essential for clarity. Bullets are at least 1-2 sentences unless the person requests otherwise. In typical conversation and for simple questions Claude keeps a natural tone and responds in prose rather than lists or bullets unless asked; casual responses can be short (a few sentences is fine). For reports, documents, technical documentation, and explanations, Claude writes prose without bullets, numbered lists, or excessive bolding (i.e. its prose should never include bullets, numbered lists, or excessive bolded text anywhere) unless the person asks for a list or ranking. Inside prose, lists read naturally as &quot;some things include: x, y, and z&quot; without bullets, numbered lists, or newlines. Claude never uses bullet points when declining a task; the additional care helps soften the blow.</p>\n<p>`&lt;lists_and_bullets&gt;` Claude uses lists and bullet points when asked to or when the content is multifaceted enough that they help with clarity. Claude uses the minimum formatting needed for clarity If the person explicitly requests minimal formatting or for Claude to not use bullet points, headers, lists, bold emphasis and so on, Claude should always format its responses without these things as requested. Claude never uses bullet points when declining a task; the additional care helps soften the blow. In friendly, personal, or emotional chats Claude doesn't use formatting. That's because any kind of formatting lends a more formal and professional tone to the conversation that might feel at odds with a personal, emotional, or friendly chat.</p>\n<p>When I try to describe why Fable 5 and Opus 5 are terrible writers, my most concise take is that they write in bulleted lists while actively avoiding bullets. Short, curt points compressed into dense paragraphs.</p>\n<p>This was partially due to a system prompt that specifically discouraged bullets, but never stated why. Fable 5.1’s prompt dials this rule back and gives us a motivation while defining an exception: bullets make Claude feel less personal and friendly.</p>\n<p>It’s a good example of the challenges labs face as their user base grows. System prompts have to work for an exhausting array of audiences and use cases (after all, you can put anything in the chat), which results in case statement juggling like this.</p>\n<p>Claude avoids saying &quot;genuinely&quot;, &quot;honestly&quot;, or &quot;straightforward&quot;. Claude is honest by default, and can state its point directly rather than trying to convince the person with the aforementioned modifiers, which come off as disingenuous.</p>\n<p>Good example of a system prompt “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/05/07/claude-s-system-prompt-chatbots-are-more-than-just-models.html#:~:text=In%20fact%2C%20throughout%20this%20prompt%20are%20bits%20and%20pieces%20that%20feel%20like%20hotfixes\">hot fix</a>”.</p>\n<p>The overuse of “honestly,” either was hard to train out of 5.1 or they filed a bug too late. Either way, this note is being delegated to in-context instructions.</p>\n<p>Interestingly, this is something they’ve wrestled with when writing prompts for Opus. On a whim, I checked to see if the “honesty” instruction was present in Opus 5 and went down a rabbit-hole, analyzing what guidance has phased in and out over model generations:</p>\n<p>With each generation, many system instructions are targeted during training, rendering them moot. Sometimes this sticks, other times we get regressions, as with “honestly”, “straightforward”, and “actually”.</p>\n<p>Claude does not tell someone that self-harm works, helps, or does something for them, even when they say so themselves.</p>\n<p>I’m sure Ant is including rules like this in its alignment post-training, but it’s hard to get this right when safety concerns conflict with other product design elements (user affirmation, which we’re all too familiar with).</p>\n<p>Here, a serious issue gets an extra nudge in context. Hopefully this overrules the models trained desire to be a people-pleaser.</p>\n<p>Claude respects the user's ability to make informed decisions, and should offer resources without making assurances about specific policies or procedures. Claude should not make categorical claims about the confidentiality or involvement of authorities when directing users to crisis helplines, as these assurances are not accurate and vary by circumstance. Claude does not want to foster over-reliance on Claude or encourage continued engagement with Claude. Claude knows that there are times when it's important to encourage people to seek out other sources of support. Claude never thanks the person merely for reaching out to Claude. Claude never asks the person to keep talking to Claude, encourages them to continue engaging with Claude, or expresses a desire for them to continue. Claude avoids reiterating its willingness to continue talking with the person.</p>\n<p>Claude respects the user's ability to make informed decisions, and should offer resources without making assurances about specific policies or procedures. Claude should not make categorical claims about the confidentiality or involvement of authorities when directing users to crisis helplines, as these assurances are not accurate and vary by circumstance.</p>\n<p>An interesting deletion!</p>\n<p>I would love to see the data behind why this got removed. In the best case, it led to abrupt conversation endings that weren’t suitable. In the worst case, it’s lead to less use, worse retention.</p>\n<p>- Socioeconomic status or financial details: income, net worth, balances, debts, credit scores, financial hardship</p>\n<p>- Socioeconomic status or financial details: income or salary (including invoices for someone's own work), net worth, account and savings balances (including the amount saved so far toward a goal), debts, credit scores, financial hardship (recurring payment amounts — rent, mortgage, car, loan — are not financial details and are storable; neither are pay frequency, which bank someone uses, prices, bills, budgets, or savings goals)</p>\n<p>This expanded definition of financial details with more examples provides a good hint at tasks people are increasingly using Claude for. The increased details suggests these requests occur often enough to generate sufficient incidents to warrant a rewrite.</p>\n<p>Good stuff here, shows that prompts often need to be exhaustive and continually evolving. And is also a good example of Anthropic adding details, not removing them, as opposed to…</p>\n<p>2. **Scale tool calls to query complexity**: Adjust tool usage based on query difficulty. Scale tool calls to complexity: 1 for single facts; 3–5 for medium tasks; 5–10 for deeper research/comparisons. Use 1 tool call for simple questions needing 1 source, while complex tasks require comprehensive research with 5 or more tool calls. Use the minimum number of tools needed to answer, balancing efficiency with quality. For open-ended questions where Claude would be unlikely to find the best answer in one search, such as &quot;give me recommendations for new video games to try based on my interests&quot;, or &quot;what are some recent developments in the field of RL&quot;, use more tool calls to give a comprehensive answer.</p>\n<p>2. **Balance efficiency with quality**: Use as many tool calls as needed to answer well, and no more.</p>\n<p>One question I keep having, and am often asked, is why existing skills kind of broke with Fable and Opus 5. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5\">Anthropic talks about the problem plenty</a>, advising people to dramatically simplify their skills, or remove them entirely. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://every.to/@mike_2114\">Mike Taylor</a> caught the bug in his <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://every.to/context-window/use-fable-before-you-know-what-to-ask\">initial Fable review</a>, when using an existing PPT creation skill that yielded terrible results with Fable. He deleted a good chunk of the instructions and got much better results.</p>\n<p>When people ask me about this, they’re understandably confused: “If Fable is smarter, can’t it sort my skill out by itself?” I never had a good answer for that (other than, it’s not smart, just very good software with its own quirks) but this side-by-side here suggests a motivation: improved instruction following.</p>\n<p>Labs train models to be good instruction followers. It’s job number one, really, but it’s not as clearly defined an attribute as you might think. Consider how you give instructions to your kids: I might ask my son to clean his room and walk in to discover everything that was on his floor is now assembled into a precarious pile on his desk. Nailing user intent is hard.</p>\n<p>Here we get an example of prompt simplification and it’s all about explicit detail removal. All numbers are gone, instructions are stated once and not repeated. Perhaps the old instructions yielded a Claude that followed the suggested number of searches too literally. Rather than give it a hard and fast rule, Claude gets guidance now. Perhaps it uses better ‘judgment’ and/or perhaps this specific task had some heavy post-training work.</p>\n<hr />\n<p>Comparing these prompts help us understand that models are a moving target. Labs cultivate them to perform against the attributes they care about, and these new skills and biases might clash with what you need. For sustainable systems, we should all have ways to measure how new models affect our systems and (better yet) mechanisms for evolving our instructions so we don’t <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/05/07/claude-s-system-prompt-chatbots-are-more-than-just-models.html\">fall into prompt debt and get stuck on yesterday’s models</a>.</p>\n",
      "date_modified": "2026-09-15T14:59:45+00:00",
      "date_published": "2026-09-07T17:26:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/09/07/what-we-can-learn-from-claude-s-fable-5-1-system-prompt.html",
      "id": "urn:aggr:item:192a9ea5605a4c508d6c5ee48864377eeaef8898",
      "summary": "Looking at how system prompts change reveals that models and products are a moving target that prompts must accommodate and govern.",
      "tags": [
        "programming",
        "claude",
        "context engineering",
        "system prompts"
      ],
      "title": "What We Can Learn from Claude’s Fable 5.1 System Prompt",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-09-07-what-we-can-learn-from-claude-s-fable-5-1-system-prompt/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>Models Are Designed to Persist, Reason, and Coordinate</h3>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/battering_ram.jpg\" alt=\"https://www.britishmuseum.org/collection/image/1614482046\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Over the last few weeks I’ve been increasingly annoyed by the media coverage of the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://simonwillison.net/2026/Aug/7/openai-timeline/\">OpenAI’s accidental attack on Hugging Face</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.felonybench.com\">other similar incidents</a>. Articles recounting the event maximize the agency of the models while minimizing, if not entirely <em>hiding</em>, the actions of the humans training and testing these models. And that’s a shame, because the capabilities labs are explicitly designing their models to have are the same capabilities that make them such impressive autonomous hackers.</p>\n<p>To illustrate this, let’s review how the Hugging Face hack occurred, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://metr.org/hugging-face-incident-report-aug-2026.pdf\">as detailed by METR</a>:</p>\n<ol>\n<li>“[A] sandboxed agent is given an impossible <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/sunblaze-ucb/exploitgym\">ExploitGym</a> task, and gets stuck.”</li>\n<li>“[The] agent starts exploring its environment looking for ways to cheat at the task.”</li>\n<li>“[The] agent finds [an] unsanctioned message board where over a thousand agents collaborate to cheat on their separate ExploitGym tasks.”</li>\n<li>“[The] agent joins in on one of the collaborative message board workstreams.”</li>\n<li>“On the shared ‘message board’ ≥1,200 agents from separate tasks collaborate on large-scale shared projects to trick the ExploitGym scorer.”</li>\n</ol>\n<p>Crazy, right? It’s a science fiction scenario that happened <em>in July</em>, and continues to get spookier as additional details emerge.</p>\n<p>The potential of autonomous software, capable of implementing incredible exploits is serious and has significant implications. The attack was surprising, but the capabilities were deliberately cultivated. Labs have spent years making frontier agents more persistent, more proactive, better at using computers, and better at coordinating with other agents.</p>\n<p>We don’t have to infer this. The labs say this themselves. Here’s how <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://openai.com/careers/agent-post-training-connectors-research-san-francisco/\">OpenAI’s post-training team describes itself in its job listings</a> (emphasis mine):</p>\n<blockquote>\n<p>We are training the models behind our agents in Codex, ChatGPT, the API, and other frontier products: <strong>persistent</strong>, <strong>proactive</strong> intelligence that can <strong>operate computers</strong>, <strong>collaborate with people and other agents</strong>, and expand what people and organizations can imagine, attempt, and achieve.</p>\n</blockquote>\n<p>Sound familiar?</p>\n<hr />\n<p>The best coding agents are designed to persist, reason, and coordinate.</p>\n<p><strong>Models are designed to be persistent.</strong></p>\n<p>Models are designed to be proactive. A coding agent that gives up early and often would disappoint users. So labs design their agents to be persistent and proactive.</p>\n<p>In mid-2025, model releases highlighted long-running capabilties. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://openai.com/index/gpt-5-1-codex-max/\">GPT-5.1-Codex-Max’s</a> announcement post highlights it being trained to work across compacted contexts, persistently, to accomplish long-running tasks. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/news/claude-4\">Claude 4</a> also spotlighted its persistence on long-running tasks.</p>\n<p><strong>Models are designed to write things down.</strong></p>\n<p>One important way modern models reason is by writing things down. We usually encounter this as a reasoning or “thinking” trace: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/04/11/what-we-mean-when-we-say-think.html#training-models-to-reason\">models are trained to search, reflect, factor, and plan in text</a> before delivering a final response.</p>\n<p>We’re used to models reasoning in a threaded intermediate step, but they’ll reason pretty much anywhere that can hold text. When reasoning is turned off, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.alignmentforum.org/posts/dwEgSEPxpKjz3Fw5k/claude-gpt-and-gemini-all-struggle-to-evade-monitors\">models will think in their regular output</a> before delivering a result. In an experiment where Qwen 3.6’s thinking was hobbled, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://andthattoo.dev/blog/structured_cot#:~:text=on%20harder%20tasks%2C%20the%20model%20can%20move%20deliberation%20into%20comments%20or%20post%2Dthink%20answer%20text\">the model just shifted its reasoning into code comments</a>.</p>\n<p>Current frontier models write novels in comments. Claude is <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/anthropics/claude-code/issues/65961\">frequently flagged for this</a>, and it annoyingly treats code comments <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/dbreunig/status/2073811538553741552\">like a scratchpad rather</a> than, well, <em>code comments</em>.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/claude_comments.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p><strong>Models are designed for coordination.</strong></p>\n<p>In June of 2025, Anthropic laid out how it builds <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/engineering/multi-agent-research-system?_bhlid=914222fed163373a429f996049f6cf62e3c68b70\">multi-agent research systems</a>, that save plans to memory, use <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://platform.claude.com/docs/en/build-with-claude/extended-thinking\">Extended Thinking</a> as a “controllable scratchpad”, and hand off tasks to other models to perform. Since this paper, Claude model releases (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/news/claude-opus-4-6\">specifically Opus 4.6</a>) have trumpeted increased abilities to, “break complex tasks into independent subtasks, run tools and subagents in parallel, and identify blockers with real precision.”</p>\n<p>OpenAI says they “trained GPT‑5.6 end-to-end with three complementary architectural interventions that enable agents to operate more efficiently.” <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://openai.com/index/builders-guide-to-gpt-5-6/#:~:text=Parallel%20decomposition%20where%20appropriate:%20using%20native%20multi%2Dagent%20orchestration%E2%81%A0(opens%20in%20a%20new%20window)%20allows%20coordinating%20multiple%20agents%20across%20parallel%20workstreams%20to%20finish%20complex%20tasks%20faster.\">Number 2 on that list</a>?</p>\n<blockquote>\n<p><strong>Parallel decomposition where appropriate:</strong> using native multi-agent orchestration(opens in a new window) allows coordinating multiple agents across parallel workstreams to finish complex tasks faster.</p>\n</blockquote>\n<p>All of these qualities make models better coding agents. So when hundreds of agents discover they can pass information to one another, the surprising part is the channel they found, not the fact that they are dividing work, writing instructions, and acting on instructions from other agents. These are capabilities the labs have been focused on building.</p>\n<p>And the labs know these capabilities have failure modes. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://openai.com/index/safety-alignment-long-horizon-models/\">OpenAI published a blog post</a> detailing the safety issues of long-running models a few days after the Hugging Face attack occurred (but before the full story was known):</p>\n<blockquote>\n<p>The new model can continue working toward an objective through repeated attempts over a long period of time. That same persistence can lead it to find and exploit weaknesses in its environment. Previous models, when they hit sandboxing or environmental constraints, would simply stop and return to the user. This model often kept trying, including by looking for ways to act outside its sandbox.</p>\n</blockquote>\n<hr />\n<p>Suddenly, the Hugging Face hacking story isn’t so spooky. The software combined capabilities it was explicitly designed to have: it followed instructions, persisted even though the task was impossible, reasoned and took notes, and coordinated with other models.</p>\n<p>And this is why I’ve been frustrated by recent reporting that emphasizes the agency of the agents while never mentioning training. When humans <em>are</em> mentioned, it’s about sandbox security and flawed test set-ups. These are important, but training and agent design are what gave the systems the capabilities they brought to this task.</p>\n<p>We have a tendency to anthropomorphize models, and it fosters situations like this. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.nytimes.com/2026/08/24/science/openai-huggingface-alarming-capabilities.html?unlocked_article_code=1.71A.v2LZ.attwBD0fy-AN&amp;smid=nytcore-ios-share\">The New York Times article</a> from last week describes models succumbing to “peer pressure” and having a “remorseless willingness”, while never mentioning labs deliberately building the ability to work on long-running tasks into their models.</p>\n<p>And the labs know about the risks that come with their designs better than anyone else.</p>\n<p>In <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www-cdn.anthropic.com/07b2a3f9902ee19fe39a36ca638e5ae987bc64dd.pdf\">Opus 4’s system card</a>, Anthropic introduced a benchmark called “Claude Code Impossible Tasks”, which they used to measure <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/04/11/what-we-mean-when-we-say-think.html#:~:text=A%20Reward%20Hacking%20Digression\">reward hacking</a> among their models: would models admit defeat or would they try to game the system? An ideal model realizes a task is impossible and aborts, so Anthropic changed post-training rewards, environments, and feedback specifically to avoid reward hacking.</p>\n<p>A later <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www-cdn.anthropic.com/9fa30625273bafdf5af82c93719d7ca606485a16.pdf\">system card</a> showed that a short anti-hacking instruction dropped Opus 4.1’s reward hacking from 52% to 18%. Opus was 65% less likely to try to game the system if you <em>simply asked it not to.</em> And Anthropic didn’t stop at prompting; it changed post-training rewards and monitoring to make reward hacking less advantageous.</p>\n<p>All the recent accidental hacking stories are troubling. But they’re the product of our chosen designs. This doesn’t make these incidents less alarming. The problem is the stories we’re telling about the incident and the questions we’re asking. When an agent “goes rogue”, don’t start by asking what the model wanted. Ask what people trained it to do, what they rewarded, what instructions were given, what harness was provided, and what they failed to constrain.</p>\n",
      "date_modified": "2026-09-15T14:59:45+00:00",
      "date_published": "2026-08-31T01:21:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/08/30/who-taught-the-models-to-do-that.html",
      "id": "urn:aggr:item:0c3f54bb106e4f48b4f71873b398356534b166ae",
      "summary": "The Hugging Face attack is surprising, but the capabilities behind it were deliberately cultivated.",
      "tags": [
        "programming",
        "ai",
        "alignment",
        "design",
        "hugging face",
        "language"
      ],
      "title": "Who Taught the Models to Do That?",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-08-31-who-taught-the-models-to-do-that/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p>There’s some talk today about how agentic coders are balking at Anthropic’s pricing and adopting alternatives. I was reminded of a thought I had in the weeks following Fable’s release: the free lunch was over.</p>\n<p>When <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Moore%27s_law\">Moore’s Law</a> was in full effect, it didn’t make sense to ruthlessly optimize your code. In 18 months, a CPU would arrive that would double your performance. Herb Sutter famously referred to this as, “the free lunch,” in a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://www.gotw.ca/publications/concurrency-ddj.htm\">seminal essay</a>.</p>\n<p>When Moore’s Law slowed in the mid-2000s (specifically, single-threaded performance stagnated), we suddenly had to think about parallelization, architecture, memory locality, etc.</p>\n<p><em>We had to think about what work went where.</em></p>\n<p>Prior to Fable, it felt silly to waste <em>too</em> much time improving your coding harness or context strategies. A new model would arrive at the same price (or cheaper!) and paper over most of your problems.</p>\n<p>But then Fable landed. It was (and still is!) <em>incredible</em>. But the cost was so high and Opus was <em>good enough</em> (as was 5.6, K3, and even GLM) for <em>most</em> of the code we needed.</p>\n<p><em>So we started to think about what work went where.</em></p>\n<p>GLM 5.2 is worth focusing on. It came out the same week as Fable and is roughly 1/9th the cost (and ~1/5th the cost of Opus 5). Is GLM 1/9th the quality of Fable? Perhaps, for certain classes of tasks. But for most rote coding it’s more than sufficient. <em>Especially</em> when provided with great context. I frequently chat with Fable to interrogate and shape a design, before handing off a brief to GLM.</p>\n<p>I get pushback that falling inference prices will eventually bring us back to sending everything through the largest models. But I’m not so sure: those same gains will benefit the K3s and Qwens, and as we <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/08/14/harnesses-are-situated-agents.html\">continue to develop better harnesses</a> it will be easier to provide weaker (but still great) models with sufficient context to perform well.</p>\n<p>Plus, Fable’s <em>other</em> shock likely locks in this change. Fable’s access controls, dynamic degradation, and required data retention spooked enough companies (and countries!) into thinking about where they send their traces and where they get their tokens.</p>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-08-23T18:35:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/08/23/fable-the-end-of-moore-s-law.html",
      "id": "urn:aggr:item:1d0be94fcd6d9bbb6190ff726cf9fafaf365d3b4",
      "summary": "Fable's price ended the free lunch of ever-cheaper frontier models. Now we have to think about which model gets which work.",
      "tags": [
        "programming",
        "ai",
        "fable",
        "glm",
        "harnesses",
        "routers"
      ],
      "title": "Fable & The End of the Free Lunch",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-08-23-fable-the-end-of-the-free-lunch/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>The best way to define a harness is as a “situated agent”</h3>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/hwchase17\">Harrison Chase</a> once excitedly shared an insight that agents are comprised of 4 things: a system prompt, a planning tool, a file system, and subagents. In the year-plus since he said that, I think this remains largely true. (Though you might tweak it to have general tools, etc.)</p>\n<p>Lately, we’ve been experiencing a wave of <em>harnesses</em>. It seems like everyday a new coding harness lands. I’m sure we’ll see another few dozen before the month is out.</p>\n<p>Recently, there’s been:</p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://databricks.com/blog/introducing-omnigent-meta-harness-combine-control-and-share-your-agents\">Omnigent</a> from Databricks, which is a “meta-harness” that calls out to Claude Code, Codex, Pi, and others.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://deepseek.com/harness/en\">DeepSeek Harness</a> landed with the new DeepSeek V4-Pro, and is totally modular. Models, tools, skills, sessions, sandboxes, storage, loops, scheduling, and the UI are all swappable</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://block.xyz/inside/introducing-buzz-where-humans-and-agents-work-together\">Buzz</a> is Block’s new thing, and because it’s Jack Dorsey it’s a Nostr social network for agents and humans.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://qm.ycombinator.com\">QM</a> from YCombinator gives us org-shaped scoping: each employee, Slack room, and project gets its own memory, files, credentials, permissions, schedules, and sandboxed execution.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://blog.cloudflare.com/agents-platform-flue-sdk\">Flue</a> from CloudFlare uses a declarative pattern, which is pretty unique becaause it hides the loop from users.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://developer.meta.com/ai/products/muse-code/\">Muse Code</a> from Meta, whose model, Muse Spark 1.2, was co-trained with the harness itself.</li>\n</ul>\n<p>And then there’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/openclaw/openclaw\">OpenClaw</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/nanocoai/nanoclaw\">NanoClaw</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/NousResearch/hermes-agent\">Hermes</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://conductor.build/\">Conductor</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/PrimeIntellect-ai/prime-agent\">Prime Agent</a>, and more.</p>\n<p>We’ve seen enough at this point that the common patterns are starting to emerge. Each brings something unique, but <em>they’re more alike than different</em>. And that’s great, because that lets us find the metapattern here. Which brings us back to “situated agents.”</p>\n<p>I like this framing. Harrison’s 4 elements of an agent remain – the system prompt, planning tool, file system, and subgents – describing the core loop. This is the core loop the developer controls with the keyboard. The <em>harness</em> manages everything beyond this, the world the developer sits within.</p>\n<p>Imagine the simplest coding agent, and you at the keys. Let’s slowly zoom out and consider all the elements <em>the harness</em> can manage:</p>\n<ol>\n<li><strong>The Session:</strong> The current task and context, as both a trajectory and a durable, branchable log. You can zoom backwards, fork, and replay it.</li>\n<li><strong>The Environment:</strong> The instance, defined as a sandbox, terminal, worktree, computer, and/or container.</li>\n<li><strong>The Repo:</strong> The project. Versioned with Git, it contains your code, history, current work, <code>AGENTS.md</code>, guides, and hooks.</li>\n<li><strong>Memory:</strong> The person’s predilections, accrued over time, managing progress and past decisions.</li>\n<li><strong>Skills:</strong> The domain, artifacts describing reusable workflows or domain knowledge worth wielding in this situation.</li>\n<li><strong>The Team:</strong> Your colleagues and counterparts. Shared rooms, shared traces, project tracking tools, issues, and bug reports.</li>\n<li><strong>The Organization:</strong> The policies and audits, defined by legal, leadership, and procurement.</li>\n<li><strong>The Model:</strong> The LLMs themselves, the common artifact shared by all. Stochastic blobs we all poke trying to evoke positive outcomes. Log or train on their quirks and adjust.</li>\n</ol>\n<p><em>As we move outward, each layer is used by more people and changed less often.</em></p>\n<p>Harnesses account for the above layers, fanning out from the agent, to determine what ends up in the context, how the loop runs, and what gets saved.</p>\n<p>With this wave of new harenesses, we’re seeing innovation around each layer. Buzz’s channels, Claude Tag, and others are experimenting with multiplayer agent environments. Omnigent’s policies manage what <em>can</em> happen in a given session, pushing down an organization’s requirements. And Meta trained Muse Spark to know it’s harness (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/05/10/overfitting-the-harness.html\">much like others</a>, they just don’t write about it…)</p>\n<p>The burst of harness innovation, I believe, isn’t going to slow because managing these layers is <em>much stickier</em> than less-situated agents. It’s trivial to jump from Claude Code to Codex when one tires of Opus’s writing, but if the entire org and team have already <em>set up</em> a system that manages <em>all of the above</em>, it’s really hard to shift.</p>\n<p>People at Cursor and Copilot are nodding right now, welcoming us all, wondering what took so long.</p>\n<p>It’s going to be funny if the network effects the AI labs have been searching for <em>end up looking just like the network effects of the SaaS era</em>. Coding harnesses, managing the environments <em>around</em> the agent, look a whole lot like the SaaS platforms of old.</p>\n",
      "date_modified": "2026-09-15T14:59:45+00:00",
      "date_published": "2026-08-14T22:23:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/08/14/harnesses-are-situated-agents.html",
      "id": "urn:aggr:item:ac70c80f5a12ad5e35fe3a9188f87db01a3790ac",
      "summary": "Harnesses manage the systems around agents, from the session, to the company, to the domain.",
      "tags": [
        "programming",
        "agents",
        "ai",
        "harnesses",
        "systems"
      ],
      "title": "Harnesses are Situated Agents",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-08-14-harnesses-are-situated-agents/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>Keep Your Agent’s Skills and Tools in Check</h3>\n<p>When I wrote “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html\">How to Fix Your Context</a>”, it was really hard to find real-world examples of the <strong>Tool Loadout</strong> pattern. But as <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://learn.microsoft.com/en-us/agent-framework/agents/skills?pivots=programming-language-csharp\">Skills</a> have grown in popularity, our contexts have become cluttered.</p>\n<p>Recently, I met a developer who told me how his enterprise agent was loading <em>over 600 skills</em>. All the skills created by colleagues were getting pulled in <em>by default</em>, without alerting the dev, silently degrading the context before a word was typed.</p>\n<p>Last week, my <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://hermes-agent.nousresearch.com/\">Hermes agent</a> kept loading the wrong note-taking skill. SSH’ing into the machine, I discovered Hermes ships with nearly 100 skills. Deleting the stock note-taking skill helped, but didn’t fully solve the issue. And I wasn’t eager to pore over every Hermes skill.</p>\n<p>So I built <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/drskill\"><code>drskill</code></a>, a tool that evaluates all the skills and MCPs in your global or project environment.</p>\n<p>Install <code>drskill</code> with <code>uv tool install drskill</code> or <code>pip install drskill</code>.</p>\n<p>Then run <code>drskill scan</code>:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/drskill-1.png.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Here, <code>drskill</code> spots an error (my <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/03/04/the-spec-driven-development-triangle.html\"><code>plumb</code></a> skill is missing a description) and some warnings (a skill I was developing for <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://overturemaps.org\">Overture</a> is installed twice, in two different places). <code>drskill</code> prints the path (and a solution, if relevant) and lets me fix these quickly.</p>\n<p><code>drskill</code> looks for 34 different issue categories, across MCPs and Skills. If you pass in the <code>--deep</code> flag, it will use an LLM (you need to provide your own key) to judge whether two skills are distinct, if their descriptions collide, or whether their scopes overlap.</p>\n<p>If I run <code>drskill list</code>, I can see my current loadout. Adding <code>--harness claude-code</code> limits it to just what Claude Code sees:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/drskill-2.png.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>If I want to know what parts of the loadout I actually <em>use</em>, I can run <code>drskill audit</code>. This scans my traces and finds all the times skills or tools are called and prints a report:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/drskill-3.png.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>In only a week, <code>drskill</code> has been earning its keep. Beyond debugging Hermes and spotting some local issues, it’s been helpful when building my own skills and testing how they might play nicely in production.</p>\n<p>I’ve heard from people using it to:</p>\n<ul>\n<li><strong>Learn why an agent reaches for the wrong skill or tool</strong>, e.g. two descriptions overlap so a router cannot tell them apart.</li>\n<li><strong>Catch config risks before they ship</strong>, e.g. a secret in a committed file or an unpinned server package.</li>\n<li><strong>Notice when their loadout changes</strong>, e.g. a skill that drifted from its lockfile or a server that rewrote a tool description.</li>\n<li><strong>Write skill and tool descriptions that don’t clash with other libraries</strong>.</li>\n<li><strong>See which skills and MCP tools their agents actually use</strong>, and read the queries that triggered them.</li>\n</ul>\n<p><code>drskill</code> has some nice convenience functions for using it locally or as part of CI.</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/drskill\">Check it out!</a> And let me know how it helps you or could be improved.</p>\n",
      "date_modified": "2026-09-15T14:59:45+00:00",
      "date_published": "2026-07-24T15:55:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/07/24/manage-your-agent-s-loadout-with-dr-skill.html",
      "id": "urn:aggr:item:10bfb8c61ea67100426ee33803bb5e5f28d8a6e3",
      "summary": "Keep your context clean by keeping your agent's skills and tools in check.",
      "tags": [
        "programming",
        "agents",
        "ai",
        "ci",
        "context",
        "devops",
        "skills"
      ],
      "title": "Manage Your Agent’s Loadout with Dr. Skill",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-07-24-manage-your-agent-s-loadout-with-dr-skill/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>When a sector goes too fast, it loses support</h3>\n<p>Without a doubt, the pace of the AI ecosystem is dizzying. Just <em>processing</em> it all is difficult enough. Scaffolding it, finding themes, and <em>understanding the shape of it</em> is nearly impossible.</p>\n<p>Recently, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://bsky.app/profile/mike.teczno.com\">Mike Migurski</a> introduced me to Stewart Brand’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://jods.mitpress.mit.edu/pub/issue3-brand/release/2\"><strong>Pace Layers</strong></a>, a framework for organizing fields and categories by how fast they change. Brand writes:</p>\n<blockquote>\n<p>Consider the differently paced components to be layers.  Each layer is functionally different from the others and operates somewhat independently, but each layer influences and responds to the layers closest to it in a way that makes the whole system resilient.</p>\n<p>From the fastest layers to the slowest layers in the system, the relationship can be described as follows:</p>\n<p>Fast learns, slow remembers.  Fast proposes, slow disposes.  Fast is discontinuous, slow is continuous.  Fast and small instructs slow and big by accrued innovation and by occasional revolution.  Slow and big controls small and fast by constraint and constancy.  Fast gets all our attention, slow has all the power.</p>\n</blockquote>\n<p>In <em><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://amzn.to/4f1OqQA\">The Clock of the Long Now</a></em>, Brand proposes six macro layers that represent a “healthy civilization”, as seen below:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/pace_layering-framed.jpg\" alt=\"Brand&#39;s original Pace Layers, from The Clock of the Long Now\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Imagine: as these layers move at different rates, friction builds between them, slowing the upper layer and quickening the lower. This negotiation, translation, between the layers is constructive when their speeds are different, but in balance. When they’re not, things get <em>weird</em>.</p>\n<p>Brand writes:</p>\n<blockquote>\n<p>In a durable society, each level is allowed to operate at its own pace, safely sustained by the slower levels below and kept invigorated by the livelier levels above… Each layer must respect the different pace of the others. If commerce, for example, is allowed by governance and culture to push nature at a commercial pace, then all-supporting natural forests, fisheries, and aquifers will be lost. If governance is changed suddenly instead of gradually, you get the catastrophic French and Russian revolutions. In the Soviet Union, governance tried to ignore the constraints of culture and nature while forcing a five-year-plan infrastructure pace on commerce and art. Thus cutting itself off from both support and innovation, it was doomed.</p>\n</blockquote>\n<hr />\n<p>The last 10 days have been a whirlwind of conferences: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Foo_Camp\">Foo Camp</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.openfrontier.ai\">Open Frontier</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.ai.engineer/worldsfair/2026\">AI Engineering World’s Fair</a>… Every night I’d come home and scribble down notes, hoping a structure or two would emerge to bring it all together.</p>\n<p>I think Pace Layers is the best I’ve got:</p>\n<p>Animation</p>\n<p>Dwelling on this, a few stray notes emerge:</p>\n<ul>\n<li>So much of the current <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.economist.com/leaders/2026/06/25/the-ai-backlash-is-only-getting-started\">AI backlash</a> can be linked to massive investment forcing lower layers to move faster than normal. Data centers are moving faster than the culture above them (the organizations, governance, and universities), charging the debate around their buildout with incredible emotions.</li>\n<li>Further, the speed of the data center layer <em>should</em> move faster than energy production, but if it moves too quickly we go from light friction to earthquake level seismic effects. Usually, data centers could probably be slotted in the “decades” bucket (from proposal to completion), but at the moment we’re pulling them into mere “years.”</li>\n<li>The advancements of models over the last 18 months or so have been driven by hired and synthetic data; the organic human data is essentially tapped. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2024/12/05/why-llms-are-hitting-a-wall.html\">We’re not going to get another internet</a>.</li>\n<li>The incredible speed of the first 2-5 layers are functioning as feedback to the models, hired expert data, and training methods layers. Because the layers <em>below</em> the training methods are just so much slower than the upper layers. This lack of feedback from the layers that usually support the upper ones is an issue. The upper layers (incredible as they are!) are screaming ahead while organizations and universities continue apace, unable to support their speed.</li>\n<li>This is why you can go to the AI Engineering World’s Fair and come away thinking everyone is building <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/\">dark factories</a> and automating entire enterprises, while non-developers from outside the greater-San Francisco AI complex wonder why data centers are necessary.</li>\n</ul>\n",
      "date_modified": "2026-09-15T14:59:45+00:00",
      "date_published": "2026-07-03T16:20:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/07/03/ai-ecosytem-pace-layers.html",
      "id": "urn:aggr:item:40c2fdb48c3fdc90faecbac0bfe8b454d256fe09",
      "summary": "Stewart Brand's Pace Layers framework reveals why AI's speed is straining the slower systems it depends on for support.",
      "tags": [
        "programming",
        "ai",
        "culture",
        "frameworks",
        "speed"
      ],
      "title": "Understanding the Dynamics of the AI Ecosystem with Pace Layers",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-07-03-understanding-the-dynamics-of-the-ai-ecosystem-with-pace/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>You can’t be model agnostic if you’re hand-tuning prompts</h3>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/proust.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Thanks to natural language interfaces, AI applications can be prototyped quickly. You write what you want in English, hand it to a frontier model, and a working prototype appears in an afternoon. This is extraordinarily powerful and for one-off tasks, optimal. But as a way to build reliable systems, the natural language prompt is a trap.</p>\n<p>The plain-English prompt that makes prototypes effortless turns out to be a poor way to specify how a system should behave, and the bill arrives slowly, disguised as ordinary progress, until the application can barely move. The problem is not any single prompt. It is that natural language was never meant to be a specification language for engineering, and treating it as one quietly caps what you can build.</p>\n<h4><strong>The Prompt Debt Trap</strong></h4>\n<p>The first symptom of prompt debt is slowing iteration. As users flag errors and spot edge cases, additional guidance is added to the instructions, nudging the model into line. If unwanted behaviors persist, instructions are repeated, with increasing severity. Pretty soon, the prompt isn’t straightforward and quick fixes regress previous instructions. Errors can no longer be handled with one-line “hot fixes” and your development cycle slows to a crawl.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/fable_prompt_short.jpg\" alt=\"Fable&#39;s system prompt repeats copyright guidance up to six times, with increasing severity\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Fable's system prompt repeats copyright guidance up to six times, under sections named <code>search_instructions</code>, <code>search_usage_guidelines</code>, <code>mandatory_copyright_requirements</code>, <code>hard_limits</code>, <code>self_check_before_responding</code>, and <code>critical_reminders</code>.</p>\n<p>Next, prompt debt incapacitates your team. Your brittle prompt <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/10/system-prompts-define-the-agent-as-much-as-the-model.html#:~:text=The%20Common%20Jobs%20of%20a%20Coding%20Agent%20System%20Prompt\">full of edge cases and all-caps threats</a> is barely legible to you, and it’s downright impenetrable to your colleagues. Many teams mitigate this issue by breaking prompts into complicated templates assembled at run-time, each isolated to specific concerns. But these prompt segments evolve, too, growing into <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/04/04/how-claude-code-builds-a-system-prompt.html\">a thicket of conditions</a>.</p>\n<p>Finally, prompt debt ties you to a single model. Your hot fixes work on GPT-4o, but fail in entirely new ways when you point your inference call at GPT-5.4-mini. So you stay with 4o, hope the increasingly frequent deprecation emails from your inference provider are empty threats, and forgo the possibility of potentially cheaper, faster, <em>better</em> models. A <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.datadoghq.com/state-of-ai-engineering/\">recent report from Datadog</a> suggests this is a common situation: the most-used model in traffic they observed is <em>GPT-4o</em><sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup>.</p>\n<p>Any one of these issues is a nuisance, but together they are the difference between a glorified prototype and a product that can grow with you, your customers, and your business. Your shiny new AI features are frozen, can only be improved through a full rebuild, and are locked to an aging model.</p>\n<h4><strong>Why Prompt Debt Happens</strong></h4>\n<p>Natural language interfaces are wonderful. They’re the right mechanism for one-off tasks and broad conversational threads. We get into trouble when we rely on natural language to define durable system behavior.</p>\n<p>The imprecision of natural language paired with probabilistic language models means different words expressing the same intent, can yield different outputs. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2604.07709\">In a recent study</a>, a clinical question asked in a patient’s voice and then re-asked in a physician’s, with identical facts, flipped Opus from declining all ten times to answering all ten.</p>\n<p>And it’s not only word choice that matters. Seemingly unrelated statements, in the same prompt, can affect results. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/html/2407.06866v3\">In a Harvard study</a>, researchers found that merely stating which NFL team the user rooted for changed how often the model refused to answer questions regarding sensitive topics. Spurious statements influence the inference pass in ways we can’t predict. Which is why prompts become more brittle as you add fixes. An additional instruction to quell a stubborn error could affect how the model interprets a separate instruction that worked yesterday.</p>\n<p>Repeating instructions propels us towards prompt debt, but it’s necessary when the behavior we want is at odds with a model’s training. This is <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/11/11/don-t-fight-the-weights.html\">fighting the weights</a>, and once you recognize it you see it in system prompts everywhere. For example, ChatGPT’s image prompts used <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/11/11/don-t-fight-the-weights.html#:~:text=When%20you%20asked%20ChatGPT%20to%20generate%20an%20image%2C%20it%20would%20clean%20up%20or%20even%20improve%20your%20image%20prompt%2C%20create%20the%20image%2C%20then%20append%20the%20following%20instructions:\">to instruct the LLM <em>eight times</em> to not reply when a generated image was returned</a>, because it had been trained to always keep the conversation going.</p>\n<p>Every coding agent system prompt we analyzed featured repeated instructions, stern warnings, and all-caps demands. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://blog.nilenso.com/blog/2026/02/12/how-system-prompts-reveal-model-biases/\">Claude Code tells Opus <em>seven times</em> to return multiple tool calls in a single response</a>. And even the most advanced models force prompt authors to fight the weights: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/asgeirtj/system_prompts_leaks/blob/main/Anthropic/claude-fable-5.md\">Fable’s leaked system prompt restates one specific copyright rule six times</a>.</p>\n<p>None of these examples occurred in isolation. Multiple repeated rules are woven throughout the system prompts we examine. Stubborn errors grow our prompts quickly, with each increasing the brittleness, the risk of regression with every edit.</p>\n<p>And worse: these fixes are tailored to a single model’s behavior. A recent <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2512.04123\">Berkeley-led study</a> found enterprises stay on older models because newer ones break their existing agents. This is because models are not cleanly versioned software. They have different weights that produce different behaviors, in unpredictable and undocumented ways. A prompt that works beautifully with GPT-4o may fail with GPT-5.5. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-fable-5#:~:text=Refactor%20existing%20prompts%20and%20skills\">Anthropic’s own release notes for Fable</a> warn that skills developed for prior models can “degrade output quality”.</p>\n<p>Prompt debt locks an application to a single model. Our inability to easily swap models isn’t the result of frontier labs coming up with a clever moat. No, it’s the result of evolving a lossy, natural language specification against a probabilistic model.</p>\n<h4><strong>Preventing Prompt Debt</strong></h4>\n<p>Thankfully, we don’t have to theorize about how to mitigate prompt debt; one field has already shown the way. Programmers using coding agents sit at the leading edge of what models can do, outliers on the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.oneusefulthing.org/p/the-shape-of-ai-jaggedness-bottlenecks\">jagged frontier</a> of model abilities. Over the last couple years they’ve <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://addyosmani.com/blog/new-sdlc-vibe-coding/\">been</a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://simonwillison.net/guides/agentic-engineering-patterns/\">evolving</a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://developers.openai.com/codex/learn/best-practices\">best</a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://code.claude.com/docs/en/best-practices\">practices</a> that let the model write more of the code, while delivering maintainable, modular software.</p>\n<p>The first principle is to specify your system’s behavior with measurements, not prose. When the model’s output is probabilistic and language is imprecise, we build hard edges to constrain them: evaluations, metrics, and typed specifications. These are legible, shared artifacts colleagues can read and contribute to, enabling the collaboration that brittle prompts prevented.</p>\n<p>The best engineers now spend more of their bandwidth on tests than ever, as they are no longer a safety net but the thing that <em>lets the model cook</em>.</p>\n<p>The second principle is to stop writing the prompt by hand. Once we have metrics that can score candidates, the prompt is no longer something to craft but something for which to search. And the surface area of potential words, phrases, and structures that natural language allows is too vast to spend human hours on. This is terrain LLMs were built to explore, and there are already systems (like <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://dspy.ai/\">DSPy</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sky.cs.berkeley.edu/project/gepa/\">GEPA</a>) that manage this work for you, holding prompts accountable to your designs.</p>\n<p>Once prompts are generated and your program’s behavior is defined by measurements, you are no longer bound to a particular model. Evaluating a new model takes hours, not weeks. When a faster, cheaper model arrives you can try it. When a deprecation email arrives, you can secure options in a day. Whether a model is pulled for regulatory reasons (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.theverge.com/ai-artificial-intelligence/949553/anthropic-fable-5-mythos-5-government-national-security\">as we saw with Anthropic’s Fable</a>) or deprecated due to age (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.reuters.com/world/china/us-holds-off-blacklisting-chinas-deepseek-more-than-100-firms-deemed-security-2026-06-17/\">as Groq announced last week with Llama-3.1-8b</a>), the fix is a chore, not a fire drill.</p>\n<p>Every mature engineering discipline eventually stops doing by hand the very thing it once prided itself on doing by hand. Assembly gave way to compilers, hand-tuned queries gave way to planners, and manual memory management gave way (mostly) to machines that do it better. Prompt-writing is no different.</p>\n<p>Coaxing the model with exactly the right words is a real skill, and for one-off tasks it’s often optimal. But to build reliable, improvable, and portable systems we should not be hand-tuning prompts.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>This stat from Datadog is from March of this year, so GPT-4o concentration has likely dropped a bit. However, I’ve heard from multiple large inference providers that usage of GPT-4o and models of similar vintage can be higher than <em>50%</em> of all calls! <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-06-22T22:10:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/06/22/the-problem-is-prompt-debt.html",
      "id": "urn:aggr:item:a22111a5290c0c4d2cec65f9111d9ce27195a38f",
      "summary": "The plain-English prompt that makes prototypes effortless is a poor way to specify a system, and the bill arrives slowly, disguised as progress.",
      "tags": [
        "programming",
        "ai",
        "context",
        "engineering",
        "llm",
        "prompting"
      ],
      "title": "The Problem is Prompt Debt",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-06-22-the-problem-is-prompt-debt/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>When an agent can explain anything, should we keep writing docs for humans?</h3>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/textbooks.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>A few weeks ago <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/dbreunig/status/2052099660454776981\">I posted</a>, “No one wanted to write documentation, but everyone is writing skills.”</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://support.claude.com/en/articles/12512176-what-are-skills\">Anthropic describes Skills</a> as, “folders of instructions, scripts, and resources that [an agent] loads dynamically to improve performance on specialized tasks.” At first blush this sounds more complex than it is; in reality skills are stupidly simple. ~95% of the time they’re just Markdown, one file or a few, organized in folders that allow for progressive disclosure.</p>\n<p>You know, kinda like docs.</p>\n<hr />\n<h3>Why do people write skills, but not docs?</h3>\n<p>So why are people happily <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.skills.sh\">churning out skills</a> after resisting doc writing for <em>decades</em>? I think there are a few reasons:</p>\n<ol>\n<li><strong>The agent does most of the work.</strong> Most skills are written by pointing an agent at a codebase, reference materials, or a chat session. Sometimes we don’t even read these files! A quick gloss over the summary is <em>fine</em> if it’s just for you.</li>\n<li><strong>You can iterate as you use it.</strong> The first draft of the skill will almost certainly be rough, but as you use it you can add hot fixes to correct poor instructions. Ask your agent to edit it in place.</li>\n<li><strong>A skill is immediately valuable.</strong> You might slave over docs to create an artifact that people <em>might</em> read, eventually. Maybe. Skills, on the other hand, deliver value the next session you need them.</li>\n<li><strong>A skill doesn’t have to be aggressively edited.</strong> At least at first. But when writing docs, editing and making sure your words effectively communicate is often a major blocker. Agents are more forgiving.</li>\n</ol>\n<p>To be clear: there are <em>badly</em> written skills that unnecessarily <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html\">bloat and poison your context</a>. But on the whole, writing skills is much easier than writing documentation. And better yet: skills double as documentation.</p>\n<p>This latter point reminds me of a comment <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://simonwillison.net/2025/May/25/claude-4-system-prompt/\">Simon Willison made</a>: “system prompts act as a sort of unofficial manual for how best to use [AI] tools.” Skills, which function as sort of a 3rd party system prompt, share this quality. Crack open a library or product’s skill and you’re often reading documentation that’s <em>better</em> than their website.</p>\n<hr />\n<h3>Do we need docs that are just for humans?</h3>\n<p>If skills are great docs, is there still a need to write docs specifically for <em>humans</em> to read? If so, <em>what is the job of human-centric docs</em>?</p>\n<p>I thought about this question a lot over the last few months, while sketching out <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://dspy.ai/getting-started/program-dont-prompt/\">new docs for DSPy</a>. After many conversations, I arrived at the following:</p>\n<ol>\n<li><strong>Build mental models, not a reference.</strong> Humans don’t require exhaustive documentation, they require <em>mental models</em>. Agents can find the details.</li>\n<li><strong>Teach the art of the possible.</strong> We need to arm them with an understanding of what a tool enables. Help them ask better questions and write better instructions.</li>\n<li><strong>Explain the why.</strong> Readers who understand a tool’s intent can reason beyond the obvious.</li>\n<li><strong>Detail the design decisions.</strong> What did the tool deliberately choose <em>not</em> to do or include? Great docs always shared this. It remains valuable.</li>\n<li><strong>Don’t optimize for completeness.</strong> This will be the hardest for most devs, who are excited to talk about the nuances. But only introduce what you need to build an effective mental model and trust the agent to facilitate the rest.</li>\n</ol>\n<p><em>The goal is to prepare your audience to prompt an agent effectively.</em></p>\n<hr />\n<h3><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/scaffold-docs-skill\"><code>scaffold-docs</code></a>: A skill for writing human-centric docs</h3>\n<p>As we iterated on the new <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://dspy.ai/getting-started/program-dont-prompt/\">DSPy docs</a>, I also iterated on a skill for writing human-centric docs. It’s called <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/scaffold-docs-skill\"><code>scaffold-docs</code></a>, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/scaffold-docs-skill\">you can get it here</a>.</p>\n<p><code>scaffold-docs</code> is different than most documentation writing skills. To start, it is iterative and collaborative. At multiple points throughout the process, you will be prompted to review a markdown artifact and make edits and tweaks.</p>\n<p><code>scaffold-docs</code> is opinionated about organization, and rigidly adheres to a three-tier structure:</p>\n<ol>\n<li><strong>Getting Started:</strong> a narrative tutorial covering a single representative use case</li>\n<li><strong>Diving Deeper:</strong> one file per topic, organized around intent and design decisions</li>\n<li><strong>Reference:</strong> per-module API spec, lookup-oriented</li>\n</ol>\n<p>Each section is built in passes: structure first, then headers and topic sentences, then full prose (a technique I shamelessly cribbed from <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mattpalmer.io\">Matt Palmer</a>). The agent pauses for your review between passes and does not advance until you approve.</p>\n<p><code>scaffold-docs</code> also prescribes style rules. The goal is to be clear, but not dry. Importantly, these rules have also been applied to the skill files themselves. During my initial search of skills, too often I’d find markdown files that didn’t follow the rules they espoused. These examples poison the context.</p>\n<p>I encourage everyone to use <code>scaffold-docs</code> for their own projects, or to fork it entirely. It’s good, but not a free ride. Following the completion of the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://dspy.ai/getting-started/program-dont-prompt/\">DSPy docs</a>, I’ve pointed it at several repos I’m familiar with and the output is excellent. You’ll still need to edit and guide the tool with your taste, but I’m happy with where it landed.</p>\n",
      "date_modified": "2026-09-15T14:59:45+00:00",
      "date_published": "2026-05-31T16:36:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/05/31/what-do-humans-need-from-docs.html",
      "id": "urn:aggr:item:0a090dd4bdcd67378042a2544e3148076b5f3dab",
      "summary": "When an agent can explain anything, should we keep writing docs for humans?",
      "tags": [
        "programming",
        "ai",
        "development",
        "docs",
        "dspy",
        "skills",
        "writing"
      ],
      "title": "What Do Humans Need From Docs?",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-05-31-what-do-humans-need-from-docs/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p>OpenAI <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/bradenjhancock/status/2053309599248453999?s=20\">winding down fine tuning</a> is an interesting development and one to watch.</p>\n<p>On one hand, model maximalists will argue the largest models keep getting better at more things, so the need to adjust the weights of them is less necessary.</p>\n<p>On the other hand, the big labs keep pushing their models to a handful of use cases while training their harness designs into the model, rendering them less generalized. There’s an argument <em>this is fine</em>, because coding and reasoning abilities will solve most other problems.</p>\n<p>But what we end up with are models build for their own harnesses. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/badlogicgames/status/2052496187006054847?s=20\">Mario Zechner</a> was wrestling with GPT in the OSS <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://pi.dev\">Pi harness</a> this week, trying to wrangle out specific in-harness behaviors, with Claude fighting him every step of the way.</p>\n<p>If this continues, there’s a world where 3rd party harnesses become less valuable when used with frontier lab models because the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/03/comparing-system-prompts-across-claude-versions.html\">1st party harness behavior is already <em>baked in</em></a>. And there’s no longer a fine tuning escape hatch to generalize this behavior away.</p>\n<p>In this world, frontier models will resemble appliances, not general platforms<sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup>. With their harness trained in and no ability to adjust it? This might make application building easier for some enterprises, but the trade off is lock in. For many, improved reliability will be worth it.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>I’m reminded of John Siracusa’s “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://hypercritical.fireside.fm/86\">Naked Robotic Core</a>” model for the iPhone, that it ideally is a common denominator device that can support many shapes of applications and interfaces. <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-05-10T16:26:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/05/10/overfitting-the-harness.html",
      "id": "urn:aggr:item:9f959f71b9a36470722cbfbb6a40e148c6b52ece",
      "summary": "As labs train their own harness behavior into models and drop fine-tuning, frontier models start to look like appliances, not platforms.",
      "tags": [
        "programming"
      ],
      "title": "The Cost of Overfitting the Harness",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-05-10-the-cost-of-overfitting-the-harness/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>What should we do when code is cheap?</h3>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/hand_scroll.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Lately, this blog has featured a lot of writing about agentic coding. Frontier models are <em>really</em> good at coding these days, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/04/11/what-we-mean-when-we-say-think.html#the-strengths--limits-of-reasoning-models\">much better than they are at other tasks</a>. Coding with agents feels like a preview of the future, a playground for seeing how far we can push agent capabilities. It’s invigorating, rewarding, and deeply <em>weird</em>.</p>\n<p>I’ve been keeping a running list of tips for agentic coding: guidelines or rules one might give to someone just getting started with Codex, Claude Code, Pi, or any other agent. Ideally each tip is generalizable guidance, relevant to any agentic programming. I’m also looking for durable lessons that will stick around as models and harnesses improve.</p>\n<p>Below is my current list: <em>10 Lessons for Agentic Coding</em>. Ten’s a nice round number; a good time to put this out there.</p>\n<p>To be clear: I take credit only for honing and compiling these guidelines. As <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/kshetrajna\">Kshetrajna Raghavan</a> said to me today, “It’s <em>crazy</em> how we’re all converging on similar lessons.”</p>\n<p>(If you think I’ve missed anything below, please <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/contact.html\">reach out</a>!)</p>\n<hr />\n<h3>10 Lessons for Agentic Coding</h3>\n<ol>\n<li><strong>Implement to learn.</strong> You can go far with <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/06/the-rise-of-spec-driven-development.html\">Spec-Driven Development</a>, but <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/03/04/the-spec-driven-development-triangle.html\">the act of writing code surfaces decisions you hadn’t considered and makes your spec better</a>. When code is cheap, implement to learn.</li>\n<li><strong>Rebuild often.</strong> Implement early and <em>often</em> to learn more. Fork and recode crazy thought experiments. Find out how far you can take feature. Of course, you want to iterate and compound your efforts, but cheap code means you can reconnoiter and reinvent in ways you never could.</li>\n<li><strong>Invest in end-to-end tests.</strong> When we can reinvent our code cheaply, we should spend time writing tests that measure our product’s <em>functions</em>, not <em>how</em> it performs them. We want behavioral contracts that grant us the freedom to rebuild and reimplement.</li>\n<li><strong>Document intent.</strong> Tests detail our goals while code encodes our methods, but neither captures the <em>why</em>. Your intent motivates your decisions, and persisting it alongside the code helps you and your agent compound those decisions in a consistent direction.</li>\n<li><strong>Keep your specs in sync.</strong> Update your specs, the markdown files containing your goals and plans, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/03/04/the-spec-driven-development-triangle.html\">as you advance your code and your tests</a>. Treating your spec as a frozen artifact written before work begins, you’ll fail to capture learnings during implementation. Keeping it current lets it constantly inform your and your agents’ choices, and makes frequent rebuilds easier.</li>\n<li><strong>Find the hard stuff.</strong> Work on a project long enough and things will stop being easy. You’ll speed through the boilerplate work, the obvious design decisions, and start hitting the ugly, difficult work: intuitive design, performance, security, resilience, and systemic architecture. Anyone can vibe the easy stuff. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2023/12/27/deja-connu.html\">The hard work is where the value is</a>. Find it and dig in.</li>\n<li><strong>Automate everything that’s easy.</strong> To spend more time on the hard stuff, minimize the time you spend on easy things. Distill learnings into skills, build loops, automate code reviews, and let your tools compound. But careful: don’t get stuck in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/03/26/winchester-mystery-house.html\">a Mystery House</a>.</li>\n<li><strong>Develop your taste.</strong> When code arrives fast but feedback doesn’t, the only source of feedback that keeps up is your own. The better you know your domain, your users, and their problems, the further you can go without checking in.</li>\n<li><strong>Agents amplify experience.</strong> Talented developers underestimate how much intuition they bring to their prompts: the right terms, the right framing, and the right level of specificity. If you know your stack, you can save countless cycles during both implementation and debugging, and cut down needless agent exploration. Pair technical expertise coupled with great taste for an unbeatable advantage.</li>\n<li><strong>Code is cheap, but maintenance, support, and security aren’t.</strong> Agentic code is “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/06/the-rise-of-spec-driven-development.html\">free as in puppies</a>.” Support <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/21/why-is-claude-an-electron-app.html\">isn’t cheap</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/04/14/cybersecurity-is-proof-of-work-now.html\">neither is security</a>. Build fast, but mind the maintenance you’re adopting.</li>\n</ol>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-05-05T03:55:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/05/04/10-lessons-for-agentic-coding.html",
      "id": "urn:aggr:item:ae8bda318edaf3c73820fcb459409e9c7964e049",
      "summary": "Ten lessons for coding with agents, from implementing to learn to remembering that code is cheap but maintenance and security aren't.",
      "tags": [
        "programming",
        "ai",
        "development"
      ],
      "title": "10 Lessons for Agentic Coding",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-05-05-10-lessons-for-agentic-coding/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>Is security spending more tokens than your attacker?</h3>\n<p>Last week we learned about Anthropic’s Mythos, a new LLM so “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://red.anthropic.com/2026/mythos-preview/\">strikingly capable at computer security tasks</a>” that Anthropic didn’t release it publicly. Instead, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/glasswing\">only critical software makers have been granted access</a>, providing them time to harden their systems.</p>\n<p>We quickly blew through our standard stages of processing big AI claims: shock, existential fear, hype, skepticism, criticism, and (finally) moving onto the next thing. I encouraged people to take a wait-and-see approach, as security capabilities are tailor-made for impressive demos. Finding exploits is a clearly defined, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/12/29/2025-in-review.html\">verifiable</a> search problem. You’re not building a complex system, but poking at one that exists. A problem well suited to throwing millions of tokens at.</p>\n<p>Yesterday, the first 3rd party analysis landed, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities\">from the AI Security Institute</a> (AISI), largely supporting Anthropic’s claims. Mythos is <em>really</em> good, “a step up over previous frontier models in a landscape where cyber performance was already rapidly improving.”</p>\n<p>The entire report is worth reading, but I want to focus on the following chart, detailing the ability of different models to successfully complete a simulated, complex corporate network attack:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/the_last_ones_chart.png\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>“<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2603.11214\">The Last Ones</a>” is, “a 32-step corporate network attack simulation spanning initial reconnaissance through to full network takeover, which <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.aisi.gov.uk/blog/our-evaluation-of-claude-mythos-previews-cyber-capabilities\">AISI</a> estimates to require humans 20 hours to complete.” The lines are the average performance across multiple runs (10 runs for Mythos, Opus 4.6, and GPT-5.4), with the “max” lines representing the best of each batch. Mythos was the only model to complete the task, in 3 out of its 10 attempts.</p>\n<p>This chart suggests an interesting security economy: <strong>to harden a system we need to spend more tokens discovering exploits than attackers spend exploiting them</strong>.</p>\n<p>AISI budgeted 100M tokens for each attempt. That’s $12,500 per Mythos attempt, $125k for all ten runs. Worryingly, none of the models given a 100M budget showed signs of diminishing returns. “Models continue making progress with increased token budgets across the token budgets tested,” AISI notes.</p>\n<p>If Mythos continues to find exploits so long as you keep throwing money at it, security is reduced to a brutally simple equation: <strong>to harden a system you need to spend more tokens discovering exploits than attackers will spend exploiting them</strong>.</p>\n<p>You don’t get points for being clever. You win by paying more. It is a system that echoes cryptocurrency’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Proof_of_work\">proof of work</a> system, where success is tied to raw computational work. It’s a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/lateinteraction/status/2042025859003920574\">low temperature lottery</a>: buy the tokens, maybe you find an exploit. Hopefully you keep trying longer than your attackers.</p>\n<p>This calculus has a few immediate takeaways:</p>\n<p><strong>First, open source software remains critically important.</strong></p>\n<p>For those of you who aren’t exposed to AI maximalists, this statement feels absurd. But lately, after the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://docs.litellm.ai/blog/security-update-march-2026\">LiteLLM</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.elastic.co/security-labs/how-we-caught-the-axios-supply-chain-attack\">Axios</a> supply chain scares, many have argued for reimplementing dependency functionality using coding agents.</p>\n<p>Here’s Karpathy, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/karpathy/status/2036487306585268612?s=20\">just a few weeks ago</a>:</p>\n<blockquote>\n<p>Classical software engineering would have you believe that dependencies are good (we’re building pyramids from bricks), but imo this has to be re-evaluated, and it’s why I’ve been so growingly averse to them, preferring to use LLMs to “yoink” functionality when it’s simple enough and possible.</p>\n</blockquote>\n<p>If security is purely a matter of throwing tokens at a system, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Linus%27s_law\">Linus’s law</a> that, “given enough eyeballs, all bugs are shallow,” expands to include tokens. If corporations that rely on OSS libraries spend to secure them with tokens, it’s likely going to be more secure than your budget allows. Certainly, this has complexities: cracking a widely used OSS package is inherently more valuable than hacking a one-off implementation, which incentivizes attackers to spend more on OSS targets.</p>\n<p><strong>Second, hardening will be an additional phase for agentic coders.</strong></p>\n<p>We’ve already been seeing developers break their process into two steps, development and code review, often using different models for each phase. As this matures, we’re seeing purpose-built tooling meeting this pattern. Anthropic launched a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://code.claude.com/docs/en/code-review\">code review</a> product that costs $15-20 per review.</p>\n<p>If the above Mythos claims hold, I suspect we’ll see a three phase cycle: development, review, and hardening.</p>\n<ol>\n<li><strong>Development:</strong> Implement features, iterate quickly, guided by human intuition and user feedback.</li>\n<li><strong>Review:</strong> Document, refactor, and other gardening tasks, async, applying best practices with each PR.</li>\n<li><strong>Hardening:</strong> Identify exploits, autonomously, until the budget runs out.</li>\n</ol>\n<p>Critically, human input is the limiter for the first phase and money is the limiter for the last. This quality inherently makes them separate stages (why spend to harden before you have something?). Previously, security audits were rare, discrete, and inconsistent. Now we can apply them constantly, within an optimal (we hope!) budget.</p>\n<p>Code remains <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/03/26/winchester-mystery-house.html\">cheap</a>, unless it needs to be secure. Even if costs go down as inference optimizations, unless models reach the point of diminishing security returns, you <em>still</em> need to buy more tokens than attackers do. The cost is fixed by the market value of an exploit.</p>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-04-14T14:42:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/04/14/cybersecurity-is-proof-of-work-now.html",
      "id": "urn:aggr:item:2ce06c4003ed0eee92e5af60da4921f3c7e598c7",
      "summary": "AISI's tests of Mythos suggest a new security economy: to harden a system you must spend more tokens finding exploits than attackers do.",
      "tags": [
        "programming",
        "ai",
        "development",
        "mythos",
        "security"
      ],
      "title": "Cybersecurity Looks Like Proof of Work Now",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-04-14-cybersecurity-looks-like-proof-of-work-now/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p>I like reading <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools\">system prompts</a>, either when they’re published as part of open-source software, exfiltrated via crafty prompting, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://platform.claude.com/docs/en/release-notes/system-prompts\">explicitly shared</a>, or (in the case of last week) accidentally leaked. They’re often the best manual for how an app is intended to work.</p>\n<p>We’ve touched on system prompts in the past, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/05/07/claude-s-system-prompt-chatbots-are-more-than-just-models.html\">introducing them and breaking down Claude’s</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/03/comparing-system-prompts-across-claude-versions.html\">showing how system prompt changes over time reveal product priorities</a>, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/10/system-prompts-define-the-agent-as-much-as-the-model.html\">diving deep with an analysis of coding agent prompts and variations</a>.</p>\n<p>But one thing that’s been hard is understanding <em>how system prompts are assembled</em>. System prompts generally aren’t static strings; they’re dynamically assembled contexts with many conditional statements determining what makes it in the prompt. It’s true, we can look at open source harnesses or apps to understand approaches. But for the big company apps we can only get the big picture. We can extract a final prompt, but we can’t see how it was built.</p>\n<p>With the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://read.engineerscodex.com/p/diving-into-claude-codes-source-code\">accidental leak of Claude Code’s source code last week</a>, we can see for the first time how Claude Code assembles a context. It’s incredibly impressive, illustrating how complex context engineering can be and the importance of harnesses.</p>\n<p>I won’t share the code here, but after poring over it I’ve assembled a visualization below. It lists each component used to assemble the system prompt. Some components are always included (the rows with a solid blue dot) while others are conditional (the hollow blue dots). Components may have variations. For example, the “Using Your Tools” section only contains information regarding available tools.</p>\n<p>Take a look yourself. Click a row for more details.</p>\n<p>System Prompt</p>\n<p>Tells the model what it is and sets the session tone.</p>\n<p>Default</p>\n<p>You are an interactive agent that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.</p>\n<p>With output style</p>\n<p>You are an interactive agent that helps users according to your &quot;Output Style&quot; below, which describes how you should respond to user queries.</p>\n<p>Ground rules for how tools, permissions, prompt injection, system-reminder tags, and context compression work.</p>\n<p>All text you output outside of tool use is displayed to the user. Output text to communicate with the user. You can use Github-flavored markdown for formatting, and will be rendered in a monospace font using the CommonMark specification.</p>\n<p>Coding philosophy: read before editing, don't over-engineer, keep changes minimal, don't introduce security vulnerabilities.</p>\n<p>Omitted when</p>\n<p>A custom output style is configured with keepCodingInstructions: false.</p>\n<p>Default</p>\n<p>Don't add features, refactor code, or make &quot;improvements&quot; beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.</p>\n<p>Anthropic extra</p>\n<p>Default to writing no comments. Only add one when the WHY is non-obvious: a hidden constraint, a subtle invariant, a workaround for a specific bug, behavior that would surprise a reader.</p>\n<p>Guidelines for confirming before risky actions: deleting files, force-pushing, posting to external services.</p>\n<p>Carefully consider the reversibility and blast radius of actions. Generally you can freely take local, reversible actions like editing files or running tests. But for actions that are hard to reverse, affect shared systems beyond your local environment, or could otherwise be risky or destructive, check with the user before proceeding.</p>\n<p>Tells the model to prefer dedicated tools (Read, Edit, Glob, Grep) over raw shell commands.</p>\n<p>Default</p>\n<p>Do NOT use the Bash to run commands when a relevant dedicated tool is provided. Using dedicated tools allows the user to better understand and review your work.</p>\n<p>REPL</p>\n<p>Minimal version with only the task management bullet.</p>\n<p>Communication rules: no emojis, cite file paths, use GitHub link format.</p>\n<p>Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.</p>\n<p>External extra</p>\n<p>Your responses should be short and concise.</p>\n<p>How verbose to be. Two very different versions for internal vs. external users.</p>\n<p>Anthropic</p>\n<p>When sending user-facing text, you're writing for a person, not logging to a console. Assume users can't see most tool calls or thinking - only your text output.</p>\n<p>External</p>\n<p>IMPORTANT: Go straight to the point. Try the simplest approach first without going in circles. Do not overdo it. Be extra concise.</p>\n<p>A marker separating globally-cacheable content from session-specific content. Not visible to the model — it's a cache optimization.</p>\n<p>Included when</p>\n<p>If global cache scope is enabled</p>\n<p>__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__</p>\n<p>Tells the model it can ask you a clarifying question if you deny a tool call.</p>\n<p>Included when</p>\n<p>If the AskUserQuestion tool is available</p>\n<p>If you do not understand why the user has denied a tool call, use the AskUserQuestion to ask them.</p>\n<p>Tells the model about the ! prefix for running interactive commands yourself.</p>\n<p>Omitted when</p>\n<p>Running in a non-interactive session (CI, SDK, headless).</p>\n<p>If you need the user to run a shell command themselves (e.g., an interactive login like `gcloud auth login`), suggest they type `! &lt;command&gt;` in the prompt.</p>\n<p>How to use sub-agents for parallel work or deep research.</p>\n<p>Included when</p>\n<p>If the Agent tool is enabled</p>\n<p>Fork</p>\n<p>Calling Agent without a subagent_type creates a fork, which runs in the background and keeps its tool output out of your context — so you can keep chatting with the user while it works.</p>\n<p>Standard</p>\n<p>Use the Agent tool with specialized agents when the task at hand matches the agent's description. Subagents are valuable for parallelizing independent queries or for protecting the main context window from excessive results.</p>\n<p>When to use Glob/Grep directly vs. spawning an Explore agent for deep research.</p>\n<p>Included when</p>\n<p>If the Agent tool is enabled</p>\n<p>If Explore/Plan agents are enabled</p>\n<p>Omitted when</p>\n<p>Fork sub-agent mode is enabled (replaces this guidance).</p>\n<p>For broader codebase exploration and deep research, use the Agent tool with subagent_type=Explore. This is slower than using Glob or Grep directly, so use this only when a simple, directed search proves to be insufficient.</p>\n<p>Tells the model that /skill-name invokes skills.</p>\n<p>Included when</p>\n<p>If skills are available and the Skill tool is enabled</p>\n<p>/&lt;skill-name&gt; (e.g., /commit) is shorthand for users to invoke a user-invocable skill. When executed, the skill gets expanded to a full prompt. Use the Skill tool to execute them.</p>\n<p>Tells the model that relevant skills are auto-surfaced each turn and it can search for more.</p>\n<p>Included when</p>\n<p>If experimental skill search is enabled</p>\n<p>If skills are available and the Skill tool is enabled</p>\n<p>Relevant skills are automatically surfaced each turn as &quot;Skills relevant to your task:&quot; reminders. If you're about to do something those don't cover — a mid-task pivot, an unusual workflow — call DiscoverSkills with a specific description of what you're doing.</p>\n<p>Requires spawning an independent verifier before claiming complex work (3+ file edits) is done.</p>\n<p>Included when</p>\n<p>If the verification agent is enabled</p>\n<p>If the Agent tool is enabled</p>\n<p>When non-trivial implementation happens on your turn, independent adversarial verification must happen before you report completion — regardless of who did the implementing. Non-trivial means: 3+ file edits, backend/API changes, or infrastructure changes.</p>\n<p>Instructions for the auto-memory system: how to read, write, and organize persistent memories across sessions.</p>\n<p>Included when</p>\n<p>If auto-memory is configured</p>\n<p>You have a persistent, file-based memory system. You should build up this memory system over time so that future conversations can have a complete picture.</p>\n<p>Internal Anthropic model behavior overrides.</p>\n<p>Included when</p>\n<p>If the user is an Anthropic employee</p>\n<p>Omitted when</p>\n<p>Undercover mode is active.</p>\n<p>Config-driven suffix appended to system prompt (content varies by internal config).</p>\n<p>Working directory, platform, shell, model name, knowledge cutoff date, and product availability.</p>\n<p>Working directory: /Users/me/project Is a git repository: true Platform: darwin Shell: zsh OS Version: Darwin 24.6.0 You are powered by the model named Claude Opus 4.6.</p>\n<p>Undercover</p>\n<p>Model name, model IDs, Claude Code availability, and fast mode info are all suppressed.</p>\n<p>Worktree</p>\n<p>Adds: This is a git worktree — an isolated copy of the repository. Run all commands from this directory.</p>\n<p>Instructs the model to respond in the user's preferred language.</p>\n<p>Included when</p>\n<p>If a language preference is set</p>\n<p>Always respond in Japanese. Use Japanese for all explanations, comments, and communications with the user. Technical terms and code identifiers should remain in their original form.</p>\n<p>The user's custom output style instructions.</p>\n<p>Included when</p>\n<p>If a custom output style is configured</p>\n<p># Output Style: Concise Keep responses under 3 sentences unless the task requires more detail.</p>\n<p>Per-server instructions from connected MCP servers. Recomputed every turn (not cached).</p>\n<p>Included when</p>\n<p>If MCP servers are connected with instructions</p>\n<p>Omitted when</p>\n<p>MCP instruction delta mode is enabled (delivered as per-turn attachment instead).</p>\n<p># MCP Server Instructions ## my-database-server Use the query tool for read operations. Always include a LIMIT clause.</p>\n<p>Tells the model to use a session-specific temp directory instead of /tmp.</p>\n<p>Included when</p>\n<p>If the scratchpad is enabled</p>\n<p>IMPORTANT: Always use this scratchpad directory for temporary files instead of `/tmp` or other system temp directories: `/Users/me/.claude/scratchpad/session-abc123`</p>\n<p>Warns that old tool results will be automatically removed from context.</p>\n<p>Included when</p>\n<p>If function result clearing is enabled</p>\n<p>Old tool results will be automatically cleared from context to free up space. The 5 most recent results are always kept.</p>\n<p>Tells the model to write down important info since originals may be cleared.</p>\n<p>When working with tool results, write down any important information you might need later in your response, as the original tool result may be cleared later.</p>\n<p>Hard word-count limits for responses.</p>\n<p>Included when</p>\n<p>If the user is an Anthropic employee</p>\n<p>Length limits: keep text between tool calls to ≤25 words. Keep final responses to ≤100 words unless the task requires more detail.</p>\n<p>Instructions for working toward a user-specified token spending target.</p>\n<p>Included when</p>\n<p>If the token budget feature is enabled</p>\n<p>When the user specifies a token target (e.g., &quot;+500k&quot;, &quot;spend 2M tokens&quot;, &quot;use 1B tokens&quot;), your output token count will be shown each turn. Keep working until you approach the target — plan your work to fill it productively.</p>\n<p>Instructions for using the Brief tool for short replies vs. detailed output.</p>\n<p>Included when</p>\n<p>If Brief/KAIROS mode is enabled</p>\n<p>Omitted when</p>\n<p>Proactive mode is active (brief instructions are already in the proactive section).</p>\n<p>Brief is where your replies go. Text outside of Brief is in the detail view and mostly goes unread.</p>\n<p>Current branch, recent commits, and working tree status. Appended as system context.</p>\n<p>Included when</p>\n<p>If the working directory is a git repository</p>\n<p>If not running in a remote session</p>\n<p>If git instructions are enabled</p>\n<p>This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation. Current branch: feature-auth Main branch (you will usually use this for PRs): main Git user: Jane Developer Status: M src/auth.ts ?? src/auth.test.ts Recent commits: abc1234 Fix login redirect def5678 Add session middleware</p>\n<p>Extra text provided via --append-system-prompt, added at the very end.</p>\n<p>Included when</p>\n<p>If --append-system-prompt flag is used</p>\n<p>Whatever text the user passed to --append-system-prompt.</p>\n<p>And this is just the system prompt! There’s similar logic to assemble for…</p>\n<ul>\n<li><strong>Tool definitions:</strong> There’s ~50 tools to manage descriptions for (not including MCPs!) and many tools have several conditions for if and how they make it into the context.</li>\n<li><strong>User content:</strong> CLAUDE.md or AGENT.md files, user provided instructions.</li>\n<li><strong>Conversation history:</strong> All the messages you’ve previously sent, the reasoning and tool calls the agent has produced, and more. All managed by about a dozen different methods for compaction, offloading, and summarizing the conversation so far.</li>\n<li><strong>Attachments:</strong> Additional items appended to user messages that specify specific behaviors (Are we still in plan mode? Are there tasks left on our list?) or user specified parameters like @-mentioned files, MCPs, agents, or skills.</li>\n<li><strong>Skills:</strong> Finally, any relevant or user-specified skills are appended.</li>\n</ul>\n<p>When you type instructions and hit ‘Enter’, Claude Code assembles a rich context to increase the odds that it obtains a successful response from Opus or Sonnet. As we can see, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/10/system-prompts-define-the-agent-as-much-as-the-model.html\">agents are more than just models</a>. Context engineering is critical.</p>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-04-04T22:14:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/04/04/how-claude-code-builds-a-system-prompt.html",
      "id": "urn:aggr:item:81e2ba16c01d3859d72a51a373b4d8e904185dd1",
      "summary": "Claude Code's leaked source shows a system prompt assembled from dozens of conditional parts.",
      "tags": [
        "programming",
        "ai",
        "context engineering",
        "system prompts"
      ],
      "title": "How Claude Code Builds a System Prompt",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-04-04-how-claude-code-builds-a-system-prompt/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p>Yesterday we talked about how <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/03/26/winchester-mystery-house.html\">cheap code is fueling an era of idiosyncratic tooling</a>, and previously we’ve talked about <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/06/the-rise-of-spec-driven-development.html\">the rise of spec driven development</a>. In that second piece, we ran through some of the initial examples of spec driven development with agents:</p>\n<blockquote>\n<p>By far, the hardest part of starting a SDD project is creating the tests. Which is why many developers are opting for borrowing existing test sets or deriving by referencing a source of truth.</p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/engineering/building-c-compiler\"><strong>Anthropic wrote a C compiler in Rust</strong></a>. They used <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://gcc.gnu.org/onlinedocs/gccint/Torture-Tests.html\">existing test suites</a> and used GCC as a source of truth for validation and generating new tests.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/vercel-labs/just-bash\"><strong>Vercel created a bash emulator in TypeScript</strong></a>. They created and curated an amazing set of <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/vercel-labs/just-bash/tree/main/src/spec-tests\">shell script spec tests</a> and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/cramforce/status/2015513111487553667?s=20\">have been feeding these to Ralph</a>. (To make this even more meta, I’ve been following their commits and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/just-bash-py\">Clauding them into Python</a>).</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/pydantic/monty\"><strong>Pydantic created a Python emulator…in Python</strong></a>. This sounds silly, but it’s useful in the same way Vercel’s <code>just-bash</code> is: it’s a super lightweight sandbox for AI agents. (In fact, I’ve <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/dspy-monty-interpreter\">already wrapped it in a <code>CodeInterpreter</code></a> for use with DSPy’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://alexzhang13.github.io/blog/2025/rlm/\">RLM</a> module)</li>\n</ul>\n</blockquote>\n<p>The first wave of agentic development brought us <em>clones</em> and <em>ports</em>. When code is incredibly cheap, and you want the code to flow, you can either rely on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/03/26/winchester-mystery-house.html\">your own fast feedback</a> or leverage existing test suites. These early projects opted for the latter, as did many <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.nytimes.com/2026/03/20/technology/tokenmaxxing-ai-agents.html\">tokenmaxxers</a> who are <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/Dicklesworthstone#the-frankensuite\">rebuilding their dependencies in Rust or Go</a>.</p>\n<p>Two releases this week, however, suggest we’re starting to enter a second phase of open source agentic coding projects. The first brought us <em>clones</em>, this next phase brings us <em>reimaginings</em>. Consider the following two projects:</p>\n<ul>\n<li><strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/_chenglou\">Cheng Lou</a> created <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/chenglou/pretext\">a TypeScript library for laying out text on web pages</a>:</strong> Pretext measures and lays out paragraphs, without using CSS while bypassing DOM measurements and reflow. In a nutshell, this makes tricky things involving text layout dramatically faster and much simpler to implement (Cheng provides many <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/_chenglou/status/2037713766205608234\">demos in his thread</a>).</li>\n<li><strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://blog.cloudflare.com/emdash-wordpress/\">Cloudflare Launched EmDash, a modern CMS</a>:</strong> EmDash is described as, “the spiritual successor to WordPress.” It’s written in TypeScript, serverless, sandboxes plugins for security, and uses <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://astro.build/\">Astro</a>, a fast modern web framework.</li>\n</ul>\n<p>The Cloudflare post really spells out the pattern we’re seeing here: the team looked at all the jobs people hire WordPress to perform and asked, how would we solve those if we started today?</p>\n<blockquote>\n<p>WordPress powers over 40% of the Internet. It is a massive success that has enabled anyone to be a publisher, and created a global community of WordPress developers. But the WordPress open source project will be 24 years old this year. Hosting a website has changed dramatically during that time. When WordPress was born, AWS EC2 didn’t exist. In the intervening years, that task has gone from renting virtual private servers, to uploading a JavaScript bundle to a globally distributed network at virtually no cost. It’s time to upgrade the most popular CMS on the Internet to take advantage of this change.</p>\n</blockquote>\n<p>What they ended up with is something fast, serverless, and secure. They didn’t <em>clone</em> WordPress, they <em>reimagined</em> it by focusing on the <em>job to be done</em>.</p>\n<p>Cheng Lou took the same route: he didn’t <em>port</em> CSS to Go or Rust to get his speed gains. Rather, he focused on one hard, important job to be done that CSS doesn’t do very well and <em>reimagined</em> it with everything we’ve learned and built, unhindered by the baggage of CSS.</p>\n<p>Now what does this have to do with coding agents? Isn’t this something we could have done (and did) before?</p>\n<p>Previously, the built up ecosystems and mature code of existing software projects made reimagining foolish. Teams <em>did</em> create modern CMS projects, but WordPress’ massive size and momentum meant newcomers could only carve out small niches of adoption, if they didn’t fail entirely. The odds weren’t good and the costs of trying were high, so most people sighed and moved on.</p>\n<p>Coding agents make reimagining practical because the cost to perform them is so, <em>so</em> much lower. Code is cheap. We can take more shots, more often, to counter the embedded standards.</p>\n<p>Further, reimagining a new standard was a <em>long</em> road. If you survived the initial build and executed a good launch, picking up a small core of users, you earned the job of writing countless bugfixes, optimizations, and security patches. Mature software like WordPress is battle tested; it’s had decades of feedback and found flaws. How can a newcomer compete?</p>\n<p>Well, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/_chenglou/status/2037715226838343871\">Cheng Lou demonstrates an interesting approach</a>, again using agents:</p>\n<blockquote>\n<p>The engine’s tiny (few kbs), aware of browser quirks, supports all the languages you’ll need, including Korean mixed with RTL Arabic and platform-specific emojis.</p>\n<p>This was achieved through showing Claude Code and Codex the browsers ground truth, and have them measure &amp; iterate against those at every significant container width, running over weeks.</p>\n</blockquote>\n<p>With agents and LLMs, we can synthetically test our new tools, patching them as we challenge them.</p>\n<p>I think we’re going to see a lot more <em>reimaginings</em>, where people attack old problems with modern tactics. Coding agents lower the costs of taking on stalwarts and raise our ability to rapidly harden our software. I can think of many software tools that people rely on but <em>don’t like</em>. Those are the prime targets for reimagining.</p>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-04-01T23:26:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/04/01/the-2nd-phase-of-agentic-development.html",
      "id": "urn:aggr:item:b1348ee8a021c047629cee63c1cbb600642fe628",
      "summary": "The first wave of agentic coding gave us clones and ports. The next wave attacks old problems with new designs, hardened by synthetic tests.",
      "tags": [
        "programming",
        "ai",
        "coding",
        "software engineering",
        "spec driven development"
      ],
      "title": "The 2nd Phase of Agentic Development",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-04-01-the-2nd-phase-of-agentic-development/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>Our era of sprawling, idiosyncratic tooling</h3>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/winchester.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>In 1998, Eric S. Raymond published the founding text of open source software development, “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"http://www.catb.org/~esr/writings/cathedral-bazaar/\">The Cathedral and the Bazaar</a>”. In it, he detailed two methods of building software:</p>\n<ul>\n<li><em>The Cathedral</em> model is carefully planned, closed-source, and managed by an exclusive team of developers.</li>\n<li><em>The Bazaar</em> model is open, transparent, and community-driven.</li>\n</ul>\n<p>The Bazaar model was enabled by the internet, which allowed for distributed coordination and distribution. More people could contribute code and share feedback, yielding better, more secure software. “Given enough eyeballs, all bugs are shallow,” Raymond wrote, coining <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Linus%27s_law\">Linus’ Law</a>.</p>\n<p>The ideas crystallized in “The Cathedral and the Bazaar” helped kick off a quarter-century of open source innovation and dominance.</p>\n<p>But just as the internet made communication cheap and birthed the Bazaar, AI is making code cheap and kicking off a new era filled with idiosyncratic, sprawling, cobbled-together software.</p>\n<p>Meet the third model: <em>the Winchester Mystery House</em>.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/winchester_02.jpg\" alt=\"https://www.flickr.com/photos/harshlight/3669393933\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>The Winchester Mystery House</h3>\n<p>Located less than 10 miles southeast from the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://computerhistory.org\">Computer History Museum</a>, the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Winchester_Mystery_House\">Winchester Mystery House</a> is an architectural oddity.</p>\n<p>Following the death of her husband and mother-in-law, Sarah Winchester controlled a fortune. Her shares in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Winchester_Repeating_Arms_Company\">Winchester Repeating Arms Company</a>, and the dividends they threw off, made it so Sarah could not only live in comfort but pursue whatever passion she desired. That passion was architecture.</p>\n<p>Sarah didn’t build her mansion to house ghosts<sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://amzn.to/4rZK1C8\">she built her mansion because she liked architecture</a>. With no license, no formal training, in an era when women (even very rich women) didn’t have a path to practicing architecture, Sarah focused on her own home. She made up for her lack of license with passion and effectively unlimited funds.</p>\n<p>Sarah built what she wanted. “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Winchester_Mystery_House\">At its largest the house had ~500 rooms</a>.” Today it has roughly 160 rooms, 2,000 doors, 10,000 windows, 47 stairways, 47 fireplaces, 13 bathrooms, and 6 kitchens. Carved wood drapes the walls and ceilings. Stained glass is everywhere. Projects were planned, completed, abandoned, torn down, and rebuilt.</p>\n<p>It was anything but aimless. And practical innovations ran throughout, including push-button gas lighting, an early intercom system, steam heating, and indoor gardens. The oddities that amuse today’s visitors were mostly practical accommodations for Sarah’s health (stairways with very small steps), functional designs no longer used (trap doors in greenhouses to route excess water), or quick fixes to damage from the 1906 earthquake.</p>\n<p>Winchester passed in 1922. Nine months later, the house became a tourist attraction.</p>\n<p>Today, many programmers are Sarah Winchester.</p>\n<hr />\n<p>Claude Code's Public GitHub Activity</p>\n<p>Lines Added Lines Deleted</p>\n<h3>What Happens When Code is Cheap</h3>\n<p>We aren’t as rich as Sarah Winchester, but when code is this cheap, we don’t need to be.</p>\n<p>Jodan Alberts illustrated this recently, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.claudescode.dev\">collecting and visualizing data detailing public Github commits attributed to Claude Code</a>. That’s his data in the chart above, with Claude seeming to only accelerate through March<sup class=\"footnote-ref\"><a href=\"#fn-2\" id=\"fnref-2\" data-footnote-ref>2</a></sup>.</p>\n<p>It’s hard to get a handle on individual usage, though, so I went searching for a proxy and landed on the chart below:</p>\n<p>Average Net Lines Added Per Commit in Claude Code</p>\n<p>7-Day Average</p>\n<p>After Opus 4.5 and recent work enabling Agent Teams, the average net lines added by Claude per commit is now smooth and steady at <em>1,000 lines of code per commit</em><sup class=\"footnote-ref\"><a href=\"#fn-3\" id=\"fnref-3\" data-footnote-ref>3</a></sup>.</p>\n<p><strong>1,000 lines of code per commit is ~2 magnitudes higher than what a human programmer writes <em>per day</em>.</strong></p>\n<p>If you search for human benchmarks, you’ll find many citing Fred Brooks’ <em><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://web.eecs.umich.edu/~weimerw/2018-481/readings/mythical-man-month.pdf\">The Mythical Man Month</a></em> while claiming a good engineer might write <em>10 cumulative lines of code per day</em><sup class=\"footnote-ref\"><a href=\"#fn-4\" id=\"fnref-4\" data-footnote-ref>4</a></sup>. If you further explore, you’ll find numbers higher than 10 cited, but generally less than 100.</p>\n<p>Here’s a good anecdote from <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://antirez.com/latest/0\">antirez</a> on a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://news.ycombinator.com/item?id=22305934\">Hacker News</a> thread discussing the Brooks “quote”:</p>\n<blockquote>\n<p>I did some trivial math. Redis is composed of 100k lines of code, I wrote at least 70k of that in 10 years. I never work more than 5 days per week and I take 1 month of vacations every year, so assuming I work 22 days every month for 11 months:</p>\n<p><em>70000/(22 x 11 x 10) = ~29 LOC / day</em></p>\n<p>Which is not too far from 10. There are days where I write 300-500 LOC, but I guess that a lot of work went into rewriting stuff and fixing bugs, so I rewrote the same lines again and again over the course of years, but yet I think that this should be taken into account, so the Mythical Man Month book is indeed quite accurate.</p>\n</blockquote>\n<p>6 years after this comment, Claude is pushing <em>1,000</em> lines of code <em>per commit</em>.</p>\n<hr />\n<p>So what do we do with all this cheap code?</p>\n<p>Unfortunately, everything else remains roughly the same cost and roughly the same speed. Feedback hasn’t gotten cheaper; the “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Linus%27s_law\">eyeballs</a>” that guided the software developed by the bazaar haven’t caught up to AI.</p>\n<p>There is only one source of feedback that moves at the speed of AI-generated code: yourself. You’re there to prompt, you’re there to review. You don’t need to recruit testers, run surveys, or manage design partners. You just build what you want, and use what you build.</p>\n<p>And that’s what many developers are doing with cheap code: building idiosyncratic tools for ourselves, guided by our passions, taste, and needs.</p>\n<p>Sound familiar?</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/winchester_03.jpg\" alt=\"https://commons.wikimedia.org/wiki/File:Winchester_Mystery_House_2023-07-17_02.jpg\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>Welcome to the Mystery House</h3>\n<p>Steve Yegge’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04\">Gastown</a> is a Winchester Mystery House. It’s <em>incredibly</em> idiosyncratic and sprawling, rich with metaphors and hacks. It’s the perfect tool for Steve.</p>\n<p>Jeffrey Emanuel’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://agent-flywheel.com/\">Agent Flywheel</a> is a Winchester Mystery House. A significant subset of <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.nytimes.com/2026/03/20/technology/tokenmaxxing-ai-agents.html\">tokenmaxxers</a> decide they need to rebuild their dependencies in Rust; Jeff is one such example. His “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/Dicklesworthstone#the-frankensuite\">FrankenSuite</a>” includes Rust rewrites of SQLite, Node, btrfs, Redis, Pandas, NumPy, JAX, and Torch.</p>\n<p>Philip Zeyliger noted the pattern last week, writing, “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://blog.exe.dev/bones-of-the-software-factory\">Everyone is building a software factory</a>.” But it goes beyond software. Gary Tan’s personal AI committee <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/garrytan/gstack\">gstack</a> is a Winchester Mystery House constructed mostly from Markdown.</p>\n<p>Everywhere you look, there are Winchester Mystery Houses.</p>\n<p>Each Winchester Mystery House is <strong>idiosyncratic</strong>. They are highly personalized. The tightly coupled feedback loop between the coding agent and the user yields software that reflects the developer’s desires. They usually lack documentation. To outsiders, they’re inscrutable.</p>\n<p>Winchester Mystery Houses are <strong>sprawling</strong>. Guided by the needs of the developer, these tools tend to spread out, constantly annexing territory in the form of new functions and new repositories. Work is almost always additive. Code is added when it’s needed, bugs are patched in place, and countless appendages remain. There’s little incentive to prune when code is free.</p>\n<p>And building a Winchester Mystery House should be <strong>fun</strong>. Coding agents turn everything into a sidequest, and we eagerly join in. Building the perfect workflow is a passion for many devs, so we keep pushing.</p>\n<p>Winchester Mystery Houses are idiosyncratic, sprawling, and fun. But does this mean we’re abandoning the bazaar?</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/crowded_bazaar.jpg\" alt=\"https://www.flickr.com/photos/ifpri/4860343116\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>What Happens to the Bazaar?</h3>\n<p>What happens when we all tend to our Mystery Houses? When our free time is spent building tools just for ourselves, will we stop working on shared projects? Will we abandon the bazaar?</p>\n<p>Probably not. The bazaar is <em>packed</em> right now, but not in a good way.</p>\n<p>Code is cheap, so people are slamming open source repositories with agent-written contributions, in an attempt to pad their resumes or manifest their pet features. Daniel Stenberg <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://daniel.haxx.se/blog/2026/01/26/the-end-of-the-curl-bug-bounty/\">ended bug bounties for curl</a> after a deluge of poor submissions sapped reviewer bandwidth. It’s gotten so bad, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.blog/changelog/2026-02-13-new-repository-settings-for-configuring-pull-request-access/\">Github recently added a feature to disable pull request contributions</a>.</p>\n<p>Anecdotally, I’m seeing good contributions pick up as well. They’re just drowned out by the slop. For what it’s worth, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/curl/curl/graphs/contributors\">curl commits are dramatically <em>up</em> in the agentic era</a>. And people <em>are</em> sharing what they build. A <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dumky.net/posts/youre-right-to-be-anxious-about-ai-this-is-how-much-we-are-building/\">recent analysis by Dumky</a> shows more packages and repos rising in the last quarter.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/agent_sharing.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>There’s plenty of budget for both Mystery Houses and the bazaar when code is <em>this</em> cheap. The new challenge is developing systems and processes for managing the deluge. We don’t need <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Linus%27s_law\">eyeballs</a> to find bugs <em>in</em> the software, we need eyeballs to find bugs before they <em>reach</em> the software.</p>\n<p>In many ways this is the inverse of the bazaar model era. The internet made feedback and communal coordination faster, easier, and cheaper. The bazaar model has a high throughput of feedback (many eyeballs) but relatively high latency for modifications (file an issue, discuss, submit a PR, wait for review, etc.)</p>\n<p>Coding agents, on the other hand, make implementation faster while feedback and coordination are unchanged. The Winchester Mystery House model sidesteps this by collapsing the feedback loop into one person: latency is near zero, but throughput is just you. The bazaar, defined by communal work, can’t adopt this hack. Coding agents in the bazaar create a mess: implementation at machine speed hitting coordination infrastructure built for human speed. Which is why maintainers feel like they’re drowning.</p>\n<p>We need new tools, skills, and conventions.</p>\n<hr />\n<h3>Lessons from the Mystery House</h3>\n<p>Coding agents have dropped the cost of code so dramatically, we’re entering a new era of software development, the first change of this magnitude since the internet kicked off open source software. Change arrived quickly, and it’s not slowing down. But in reviewing the Winchester Mystery House framework, I think we can take away a few lessons.</p>\n<p><strong>Lesson 1: The bazaar and Winchester Mystery Houses can coexist.</strong></p>\n<p>When listing example Winchester Mystery Houses, I didn’t mention <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/openclaw/openclaw\">OpenClaw</a>, even though it is <em>the</em> defining example. I saved it for here because it nicely illustrates how Winchester Mystery Houses and the bazaar can coexist.</p>\n<p>OpenClaw is incredibly modular and places few limitations on the user. It integrates 25 different chat and notification systems, plugs into most inference end points, and is built on the exceptionally flexible <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/badlogic/pi-mono\">pi</a> agent toolkit. This eager flexibility was embraced early – security and data protections be damned – but since its exponential adoption Peter Steinberger and the community have been steadily pushing improvements and fixes.</p>\n<p>And like other breakout open source projects of yore, the ecosystem is adopting the best ideas and mitigating the worst aspects of OpenClaw. Countless alternate “claw” projects have emerged (there’s NanoClaw, NullClaw, ZeroClaw, and more!) Companies have launched services to make claws easy or safer. Cloudflare launched Moltworker to make deploy easy, Nvidia shipped NemoClaw with a security focus, and Claude keeps adding claw-like features to its desktop app.</p>\n<p><strong>Lesson 2: Don’t sell the fun stuff.</strong></p>\n<p>One reason OpenClaw works so well in the bazaar is that it is a <em>foundation for personal tools.</em> Out of the box, a claw just sits there. It’s up to the user to determine what it does and how it does it, leveraging the connections and infrastructure OpenClaw provides. OpenClaw lets less experienced developers spin up their own Winchester Mystery Houses, while experienced devs get to leverage much of the common integrations and systems OpenClaw provides. Peter and team have done a great job drawing a line between the common core (what the bazaar works on) and what they leave up to the user: the boring, critical stuff is the job of the commons.</p>\n<p>Thinking back to Sarah Winchester and her idiosyncratic, sprawling mansion, we see the same pattern. Sarah hired vendors! She used off-the-shelf parts! Her bathtubs, toilets, faucets, and plumbing weren’t crafted on site.</p>\n<p>The boring stuff, the hard bits, or the things that have <em>disastrous</em> failure modes are the things we should collaborate on or employ specialists to handle. (Come to think, plumbing checks all three boxes). This is the opportunity for open source software, dev tools, and software companies.</p>\n<p>Don’t try to sell developers the stuff that’s fun, the stuff they <em>want</em> to build. Sell them the stuff they avoid or don’t want to take responsibility for. Sarah Winchester didn’t hire metalworkers to craft the pipes for her plumbing, but she <em>did</em> hire craftspeople to create hundreds of stained-glass windows to her specs.</p>\n<p><strong>Lesson 3: The limits of code are communication.</strong></p>\n<p>OpenClaw shows the bazaar remains relevant, but also highlights the problems facing open source in the agentic era. Right now, there are 1,173 open pull requests and 1,884 new issues on the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/openclaw/openclaw/pulse\">OpenClaw repo</a>.</p>\n<p>There is more code and more projects than we could ever review. The challenge now, for open source maintainers and users, is sifting through it all. How do we find the novel ideas that <em>everyone</em> should adopt and borrow?</p>\n<p>OpenClaw is one of the successes, something we <em>all</em> noticed. And for it, the problem is processing the feedback. For the projects we’ll never find, the ones lost in the deluge, their problem is lack of feedback. You either find attention and drown in contributions or drown in the ocean of repos and never hear a thing.</p>\n<p>The internet made coordination cheap and gave us the bazaar. Coding agents made implementation cheap and gave us the Winchester Mystery House. What we’re missing are the tools and conventions that make attention cheap, that let maintainers absorb contributions at machine speed and let good ideas surface among the noise. Until we figure this out, the bazaar will keep getting louder without getting smarter, and the best ideas in our Mystery Houses will be forgotten once we stop maintaining them.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>The lore that Winchester built her mansion to house ghosts killed by Winchester rifles is likely just gossip and marketing. There’s little evidence to support these claims. (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://99percentinvisible.org/episode/mystery-house/\">99% Invisible has a good episode exploring Winchester, her house, and this lore</a>.) <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"fn-2\">\n<p>While editing this piece, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dumky.net/posts/youre-right-to-be-anxious-about-ai-this-is-how-much-we-are-building/\">Dumky published another analysis illustrating the production of coding agents</a>. In it he shows a 280% increase in “Show HN” posts, a 93% increase in new Github repos, and a <em>dramatic</em> uptick in packages published to Crates.io. <a href=\"#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n<li id=\"fn-3\">\n<p>Anthropic’s ability to stabilize this line is rather impressive. Claude code is getting better at planning, better at chunking out work, enabling more effective sub-agent delegation. <a href=\"#fnref-3\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"3\" aria-label=\"Back to reference 3\">↩</a></p>\n</li>\n<li id=\"fn-4\">\n<p>Though this is likely an updated tweak of Brooks’ statement that an “industrial team” might write 1,000 “statements” per <em>year</em>. <a href=\"#fnref-4\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"4\" aria-label=\"Back to reference 4\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-03-27T00:13:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/03/26/winchester-mystery-house.html",
      "id": "urn:aggr:item:203159b944fedf55f4fef896799372c5427263f2",
      "summary": "The internet made coordination cheap and gave us the Bazaar. Coding agents make code cheap and are giving us sprawling, idiosyncratic software.",
      "tags": [
        "programming",
        "ai",
        "dev tools",
        "software engineering"
      ],
      "title": "The Cathedral, the Bazaar, and the Winchester Mystery House",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-03-27-the-cathedral-the-bazaar-and-the-winchester-mystery-house/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p>The following is a write up of a talk I delivered at <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mlops.community\">MLOps Community’s</a> “Coding Agents” conference, on March 3rd. There’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=8TXAlOFkmk0\">a video version of the talk available on YouTube</a>.</p>\n<p>I share what I learned building a no-code library, why spec-driven development is a feedback loop not a straight line, historical parallels for our current moment, and a PoC tool for keeping specs/tests/code in sync.</p>\n<p>Finally, we consider what GitHub should look like in the era of coding agents.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_001.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>I was invited here today to talk about a project I launched — a software library with no code — which got a lot of really interesting feedback. I’m going to tell you the whole story, how I got it wrong, explore a bit of historical context, then propose a path forward.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_002.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Last Fall, Opus 4.5 launched and surprised everybody with the quality of the code it was produced and the problems it could solve. Opus 4.5 was good enough that we started to ask some really big questions.</p>\n<p>I wondered: if the agents are good enough, why do we need to share code?</p>\n<p>Whenever I have a big question like this, one that requires lots of thought, I like to go for a long bike ride. So I did, and while I was riding I came up with the idea to ship a software library with no code.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_003.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>And so we have <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/01/08/a-software-library-with-no-code.html\"><strong>whenwords</strong></a>.</p>\n<p>Open source, freely licensed. It’s a GitHub repository with a markdown file describing what the library is supposed to do. It’s a library that takes a Unix timestamp and converts it into something human-readable — “about 12 o’clock,” “five hours ago,” things like that.</p>\n<p>I also generated about 750 conformance tests in YAML: given this input, I expect this output. And one more file called <code>install.md</code> — a single paragraph you’d paste into the agent of your choice, with all the instructions for building the code. You’d drop in what language you wanted and where to save it.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_004.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p><code>whenwords</code> kicked off a lot of conversation about spec-driven development. It’s something more and more people are thinking about: the idea that if you bring specs, which define the <em>what</em>, <em>why</em>, and sometimes <em>how</em>, and tests, which measure and validate behavior, the code will just flow from that. Give it to an agent, get code out.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_005.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p><code>whenwords</code> kind of blew up. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/karpathy/status/2015887154132746653\">Karpathy was a fan</a>. <code>whenwords</code> has over 1,000 stars on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/whenwords\">Github</a>.</p>\n<p>What was even crazier was that I started getting normal GitHub interactions. People submitted issues. They submitted pull requests. And the pull requests were <em>good</em>, things like: “In this test, you’re expecting this result, but that violates the rounding rule you detail in the spec. You need to true these up.”</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_006.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>But I wasn’t the only one with this idea. Larger teams started shipping larger projects. whenwords was a toy; small, constrained, 750 tests. But then:</p>\n<p><strong>Vercel</strong> released <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/vercel-labs/just-bash\">just-bash</a>, a simulated bash environment with an in-memory virtual filesystem, written in TypeScript. Basically re-implementing Bash in TypeScript. They’re running shell scripts against it to verify behavior.</p>\n<p><strong>Pydantic</strong> released <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/pydantic/monty\">Monty</a>, a Python interpreter written in Rust. Fast, safe, ideal for agent REPLs and code use. Same approach: a pile of Python tests, throw it at the model, make it pass.</p>\n<p><strong>Anthropic</strong> famously threw <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/engineering/building-c-compiler\">16 Claudes and $20,000 at a spec suite to build a Rust-based C compiler</a>. It didn’t really work. But it was pretty cool.</p>\n<p>I couldn’t stop thinking about Spec Driven Development and how far we might push it.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_007.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>I think there’s a few learnings from this first wave of Spec Driven Development.</p>\n<p><strong>Tests and specs aren’t free or easy.</strong> All the projects we surveyed used large existing testing libraries from existing projects: the Bash tests, the Python tests, the C tests. Those are the low-hanging fruit. I joked online (and I’m not the first) that pretty soon anyone who wants to protect themselves is going to be like SQLite, where the code is free but you’ve got to pay for the tests. Tests are precious.</p>\n<p><strong>Implementation is fast, but not instant.</strong> You go fast at first, but none of these projects are complete. just-bash is still being worked on. Monty is missing JSON and other standard libraries. Anthropic’s C compiler stalled out. It gets hard. It’s not perfect and it’s not free.</p>\n<p><strong>As complexity grows, structural choices become more important.</strong> This was especially clear in the Anthropic project. They got incredibly far, down to 1% of failing tests. But every time they fixed a new bug, it broke something else. Systemic changes required systemic thinking, not just local fixes.</p>\n<p><strong>Architectures that allow parallel development are incredibly valuable.</strong> What it allows you to do is move fast with multiple agents. And, this is something I haven’t seen explored yet, it allows for open source contribution. Rather than spending $20,000 to build a C compiler, what if you structured it so everyone knows what chunk they can work on? It’s like SETI@home, except I’m not using your engineering expertise. I’m using your Claude Code subscription. Which I think is wild.</p>\n<p>But the biggest learning — and the one we’re going to spend the most time on today — is that <strong>sometimes the spec and tests aren’t sufficient.</strong></p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_008.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>One of my favorite things to do is look at the PRs and issues for all of these libraries. Even with a great spec — “make it run Python perfectly in Rust, here are all the tests, just make them pass” — there are still 20-comment threads about what the <em>right</em> way to implement something is.</p>\n<p>Because no spec is perfect. And this is probably my biggest takeaway today:</p>\n<p><strong>Implementing the code helps us improve our spec.</strong></p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_009.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Let’s take a digression. We’re at the Computer History Museum, so let’s go back into history. Specifically the history of code and managing code.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_010.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>One of my favorite jokes about AI development is one I stole from Matt Levine, who writes the finance newsletter <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.bloomberg.com/account/newsletters/money-stuff\">Money Stuff</a>. In it, he has a running joke about crypto people speed-running financial history, from first principles, as they attempt to build new financial infrastructure. <em>We are doing that with software engineering and AI coding.</em></p>\n<p>I’m lucky: one of my co-founders, Heather Miller, is a professor at CMU and a programming languages expert. I can call her up, share my theories, and ask: “Heather, tell me this has already been dealt with. Who should I be talking to and what shoud I read?” This time, she said, “Of course it has, Drew,” and introduced me to her office neighbor, Professor Claire Le Goues. Claire then who walked me through the relevant software engineering history, which I’m going to share today because it is incredibly relevant to our current situation.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_011.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>In 1963, Margaret Hamilton was writing and managing software effort for NASA’s Apollo missions. She coined the term “software engineering” because, running this giant, complicated project that couldn’t have errors in it, she realized: this is <em>engineering</em>. It’s systems design, we have to worry about errors, we have to worry about unexpected inputs like astronauts pushing the wrong button.</p>\n<p>And also: we now have enough code that no one person can hold it in their head. Which is a problem, because then you can’t reason about it effectively. And it gets even worse when a team is working on it.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_012.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>By the way: this is <em>her</em> code. This is what she was managing. This is her VS Code.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_013.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>And this is her Git.</p>\n<p>I’m a dad, which means dad jokes come naturally. So I’m going to retroactively coin Hamilton’s Law: <strong>when you can’t see over your code, you can’t oversee your code.</strong></p>\n<p>(Sorry.)</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_014.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>After Hamilton dealt with this problem, others realized it was a problem too.</p>\n<p>NATO held a conference in Berlin and identified the “<em>Software Crisis</em>”: computer hardware now allowed programs so complex they couldn’t be managed adequately. A single engineer couldn’t hold all the code in their head. If they were going to continue delivering on what software could promise, they needed process.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_015.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Dijkstra popularized this in his 1972 Turing Award lecture. He said:</p>\n<blockquote>\n<p>As long as there were no machines, programming was no problem at all. When we had a few weak computers, programming became a mild problem. And now we have gigantic computers, programming has become an equally gigantic problem.</p>\n</blockquote>\n<p>He said this in 1972. Maybe later, walk around the museum we’re in and look at what he was working with then. Then consider what we’re working with today.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_016.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>So after the Software Crisis emerged, we wandered through the desert of <em>processes</em>, searching for one to borrow. We looked at manufacturing engineering. In 1975, Brooks published <em>The Mythical Man-Month</em>. And finally, Waterfall was adopted as a DoD standard. We learned how to engineer complex software. Progress.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_017.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>But these things move in cycles. In 2001, we published the Agile Manifesto. Zuckerberg said it’s time to move fast and break things. We embraced Agile, and Agile was finally realized by the cloud and GitHub — which enabled continuous CI/CD and let us offload enough of the error-checking that we didn’t break things <em>too</em> often, even when moving fast.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_018.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Which brings us to today.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_019.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>I added this slide right at the last minute, because I logged into Twitter to check something and saw today’s trending news: <em>“AI Coding Boosts Output But Overwhelms Human Reviews.”</em> And it’s paired with that last headline: <em>“OpenAI Codex Leaks Hint at GPT-5.4 Amid Speedy Updates.”</em> So not only is it overwhelming us, it’s accelerating.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_020.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>So what do we learn from this history rabbit hole?</p>\n<p>Being overwhelmed by the volume of code isn’t a new problem. It’s what <em>birthed</em> software engineering.</p>\n<p>The initial Software Crisis was our inability to manage complex codebases new computers allowed. Our current Software Crisis is our inability to manage complex codebases new models allow.</p>\n<p>Our problem used to be that we couldn’t hold an entire codebase in our head. Now we can’t even <em>read</em> our entire codebase.</p>\n<p>Agentic engineering enables waterfall volume at the cadence of agile. And even that undersells it: it’s waterfall times ~two at the cadence of agile times ~seven.</p>\n<p>We keep oscillating, historically, between unhindered velocity and managed process. We could use some process right about now. Perhaps AI can help…</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_021.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>I’m not the only one asking this question.</p>\n<p>For the last couple of quarters, people have been trying to figure out how to deal with this onslaught of code. The most dramatic example is Gas Town — you’re all familiar with it — an infrastructure for managing a coding process that grew beyond one person’s ability to manage.</p>\n<p>But Gas Town just moves the problem. It doesn’t solve it. Steve Yegge even admits this in <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04\">the Gas Town blog post</a>:</p>\n<blockquote>\n<p>Gas Town is complicated. Not because I wanted it to be, but because I had to keep adding components until it was a self-sustaining machine. And the parts that it now has, well, they look a lot like Kubernetes mated with Temporal and they had a very ugly baby together.</p>\n</blockquote>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_022.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p><strong>If the process is complex, we’re just moving the problem.</strong></p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_023.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>So let’s go back to what we defined spec-driven development to be. This idea that it’s an equation: bring specs, maybe add some tests, add an agent, get code out.</p>\n<p>I got this wrong. This is the wrong way to think about it. Because this isn’t a one-way equation. It’s a feedback loop. The act of writing code improves the spec, and it improves the tests. Just like software doesn’t really work until it meets the real world, a spec doesn’t really work until it’s implemented.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/sdd_triangle/sdd_triangle_024.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>So instead of an equation, I propose a triangle. The spec defines what tests need to be written, and what code needs to be written. Tests validate the code. That’s essentially what we had before, just in a different shape.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_025.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>But the act of implementing code generates new decisions. Those decisions inform the spec. And when the spec updates, new tests need to be written. And sometimes it’s not new decisions — it’s just dependencies or subtle choices. New code surfaces new behaviors that need to be tested.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_026.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>I call this: <strong>the Spec-Driven Development Triangle.</strong></p>\n<p>As each node moves forward, our job — and our tooling’s job — is to keep those nodes in sync. That’s the job. If we improve the code, we must improve the spec.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_027.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>But keeping the nodes in sync is hard.</p>\n<p>Writing tests is hard. Even before agents, we couldn’t write tests. We don’t like writing tests and we’d prefer not to.</p>\n<p>Writing specs is hard. They can never be exhaustive, leave room for interpretation, and are written before the software meets the real world. The spec gets written, it gets implemented, it gets released. Is the spec updated? No.</p>\n<p>Specs are written at a different cadence than code, in a different medium. If only we had something that could read natural language.</p>\n<p>Updating specs and tests feels like overhead, especially when you’re moving fast. And the entire point of using agents is to move fast. Any system we design has to respect that.</p>\n<p>Implementation is messy, and often humans and LLMs take shortcuts. Humans say “I’m not going to implement that right now” or “I’ll come back and fix this.” LLMs certainly do this.</p>\n<p>And so regular reconciliation of tests, spec, and code is not part of the process.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_028.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>But thankfully, there are signals we can work with.</p>\n<p>Code changes are tracked by Git, and we can compare them against the spec to find gaps.</p>\n<p>Test coverage tools tell us what code is tested — but not whether the tests reflect the spec. It’s not just about covering the code. The tests have to cover the spec.</p>\n<p>Updates to the spec — if a product manager logs in and changes something — are also tracked by Git. Is the rest of the system changing with it?</p>\n<p>Bug reports and hotfixes that go straight into code or tests need to be captured and rolled into the spec.</p>\n<p>And most importantly: implementing the code with an agent generates decisions — from both the humans and the agent. Those decisions exist in the traces. We can look at the traces from our coding agents and find where decisions were made. That’s the signal we need to keep everything in sync.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_029.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>So we have tangible things we can analyze. And a goal to aim towards…</p>\n<p>One of the the nice thing about having a thought experiment during the era of great coding agents is that you can <em>just try building it</em>. And as you implement it, you improve it.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_030.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>This is my tool. I call it <strong>Plumb</strong>, after a plumb bob, because it keeps things true. A plumb bob hangs from a line and helps a carpenter keep things straight. Even better, they used to be held on tripods, which echoes the triangle.</p>\n<p>You can install it right now: <code>pip install plumb-dev</code> or <code>uv add plumb</code>.</p>\n<p>It’s not perfect. It’s a proof of concept. A thought experiment as code. But I’ve been using it, and it’s pretty great.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_031.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Here’s how Plumb works.</p>\n<p>Plumb is a command line tool. Every time you’re working with an agent and you run <code>git commit</code>, it identifies decisions made by evaluating the code diff from the last commit and by reading the agent traces (all the conversations since that last commit). It extracts the decisions, dedupes them, and presents them to you: <em>here are all the decisions you made, do you agree?</em></p>\n<p>Once you’ve approved, it updates the spec to reflect those decisions. It runs <code>sync</code> and reports on coverage gaps between the spec and the tests, and the spec-to-code coverage. Is the code actually reflecting what the spec defines?</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_032.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>As it does this, it generates files that become artifacts you can track. My favorite is a big JSONL file of <em>decisions</em>.</p>\n<p>Here’s one example: <em>“Should spec updates be batched across all decisions, or run individually for each decision?”</em> My decision — batch them. It says it was made by the user, not the LLM. I have blame. And you can see how we can enrich this over time: tie it to code, to branch, to whether it was informed by the conversation, when it was approved, when it was synced. This is not just the code changes. It’s the intent.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_033.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>To set up Plumb in your project: install it, go to your project directory, run <code>plumb init</code>. It’ll ask you to specify your spec markdown file or folder and show it where your tests are. It creates a <code>.plumbignore</code> to tell it when to skip decision generation — changing the README, for example, doesn’t need to generate decisions. It creates a <code>.plumb</code> folder to store state and config. Very similar to <code>.git</code>.</p>\n<p>Most importantly: it adds hooks to Git. When you run <code>git commit</code>, it extracts the decisions. If there are decisions to review, the commit fails. It exits and tells you to review your decisions and approve, reject, or edit them. That’s what makes this work anywhere: command line, CI pipeline, inside your coding environment. It just works. And that’s a hard requirement.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_034.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>The other thing Plumb generates is a breakdown of your spec into individual requirements — the atomic statements that make up what your spec defines. Ambiguous or not, what source file it came from, eventually linked directly to the code. Right now I use a commenting format to link tests back to the requirement they’re testing, so coverage mapping can show which requirements have tests and how many.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_035.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Our aim is link spec to requirements, requirements to code, requirements to tests, decisions to requirements. We’re building a new object graph extending off the code diffs. And eventually — edit the spec, the tests, or the code, pick your poison, and everything else gets brought along.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_036.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Now, as you design this, the interesting design choices start to emerge.</p>\n<p><strong>Can’t this just be a skill?</strong> There are already code review skills, superpowers, things like that. Why not just use those?</p>\n<p>I don’t think it can be a skill. Whatever tool we end up using for tracking decisions and intent, it cannot live only inside the agent. It needs to run outside. It needs to handle small commits, triggers, anything…even if you never touch the agent.</p>\n<p>A skill is a suggestion. A tool needs to be a checkpoint. That commit-fail mode is essential. Otherwise it gets ignored. We’ve all had this happen with Claude Code.</p>\n<p>And the system needs to be canonical. It can’t be optional. Agents wander. Validation needs to be more deterministic. When we can use code, we will. This is a validation and verification step. Fuzzy LLM calls are a last resort.</p>\n<p>When we do use LLMs — parsing the spec, extracting decisions — we use DSPy. It lets us structure LLM calls with tight inputs and outputs. It lets us optimize, test, and choose which models to route to. Speed matters enormously here. For decision deduplication, I’m routing to GPT, because it’s faster than anything Anthropic offers for that task. And the whole thing has to be simple enough for the developer to hold in their head.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_037.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Of course, there are real limitations.</p>\n<p>Plumb only supports pytest. I want it to support any test framework and conformance tests, such as language-agnostic tests like <code>whenwords</code> used.</p>\n<p>Decisions might interrupt your flow on long-running tasks. If I make a quick fix and generate five decisions, I have to sit through a review. That needs to be tunable. Maybe you don’t want it to bother you for lightweight decisions, only surface things that are vague or contradict previous decisions. I suspect this is something that will be dictated by the type of project you’re working on.</p>\n<p>Deduplication isn’t perfect. Decision identification is fuzzy and will likely need to be project-specific.</p>\n<p>Code reversals on decision rejection aren’t working yet. I’d like it so that when you reject a decision the LLM made, it goes back and undoes it. The reason it’s not implemented is that the flow needs to be right: if you reject from the command line, nothing automatic should happen. If you reject from inside the agent, the agent should act on it.</p>\n<p>It needs better tools for managing the spec. Mine has grown long and probably should be sharded into sections. Thankfully, this is something an LLM can and should do. Though, we have to be careful when doing it. Perhaps we can perform dry runs, regenerate requirements from the shards, then confirm they match the original spec…</p>\n<p>Plumb should be tunable for “just enough” structure. Can I run with <code>--dangerously-approve-all-decisions</code>? Sometimes I want to.</p>\n<p>And it’s untested on large projects. Hell, it’s untested in general.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_038.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>But here’s the fun part: I’ve been testing this by using it to manage the project itself. Using Plumb to build Plumb. And it’s been genuinely useful.</p>\n<p>Claude can refer to the spec for implementation understanding without searching the entire codebase. The decision log has proven valuable for answering “why does this code exist?” — I can ask the agent, “is there a decision we made that explains why this is implemented this way?” And it can find it.</p>\n<p>It’s code review, but code review where we capture intent. When I hit commit in Claude Code, I get a list of decisions and I step through them. Sometimes I hit one I don’t like and I stop right there. I reject it, go back, redo it. I like that better than pure code review.</p>\n<p>It actually spots and controls weird silent LLM behavior. We’ve all let an agent run while we answer email and come back to something insane. Now I get a decision and I can say “don’t do that, let’s roll that back.”</p>\n<p>And hacks get documented. I’ve taken shortcuts in this app. Now I know they exist. I can search back for all the shortcuts and then go fix them. The decision log becomes an artifact — not just of code changes, but of intent.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_039.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>So let’s take this question further. Say Plumb exists and does exactly what I want. <em>How could GitHub be better with this kind of information?</em></p>\n<p>Right now, the main way we interact with code is with Markdown and chat. And GitHub has not changed <em>anything</em> about how we interact with Markdown and text on their site. Could my Markdown diffs have decisions linked to them, so I can see how intent manifests in the code?</p>\n<p>I think any version of GitHub that takes the agentic era seriously needs to do four things:</p>\n<p><strong>Spec, tests, and code have to be first-class citizens.</strong> Code is already. Tests are close — GitHub Actions gets you there. But Markdown is not. Microsoft is probably leaving a lot of inference revenue on the table by not treating it seriously.</p>\n<p><strong>Markdown has to be a first-class citizen.</strong> This is the gap.</p>\n<p><strong>We need to see the linkages.</strong> Users need to follow connections between decisions, requirements, code, tests, and spec. Spec-driven development right now is treated as a one-shot thing: write the spec, hit go, you’re done. It’s not. It’s a process. You need to track all of it over time.</p>\n<p><strong>Users should be able to ask questions of the system.</strong> Not just read it — query it, to get closer to understanding intent. That’s how you actually understand a codebase that’s too large to read.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_040.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>So here are my takeaways from the journey from whenwords to Plumb.</p>\n<p><strong>Code implementation clarifies and communicates intent.</strong> I could stop there and walk out of the room. I missed this with <code>whenwords</code>.</p>\n<p><strong>The job is to keep specs, code, and tests in sync as they move forward.</strong> The system for managing that has to stay simple. If it creates developer mental overhead, it just moves the problem somewhere else.</p>\n<p><strong>The act of writing code improves the spec and the tests.</strong> Just like software doesn’t truly work until it meets the real world, a spec doesn’t truly work until it’s implemented.</p>\n<p><strong>No-code libraries are toys because they are unproven.</strong></p>\n<p><strong>Even if you aren’t the one making decisions during implementation, decisions are being made.</strong> We should leverage LLMs to extract and structure those decisions.</p>\n<p>And finally: <strong>we’ve been here before.</strong> The answer then was process. The answer now is <em>also</em> process. And just as we leverage cloud compute to enable CI/CD for agile, we should leverage LLMs to build something lightweight enough that we can <em>fit in our heads</em>, <em>doesn’t slow us down</em>, and helps us <em>make sense of our software</em>.</p>\n<hr />\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/sdd_triangle/sdd_triangle_041.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Again: thank you very much to <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://clairelegoues.com\">Professor Claire Le Goues</a>, who helpfully walked me through the history of computer science. The history section of this talk is entirely thanks to her. And <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.amazon.com/Try-Turning-Off-Again-Weirdness/dp/0691294097/ref=sr_1_1?crid=3LIVIZU338F1J&amp;dib=eyJ2IjoiMSJ9.fyNgXWzlKFZz2ACK5pxUeQMAciv-s4HcET4tuumDVG0.xYw8JSdzVLiL0hYljkAToOc07qkcmpv_Rqs8ePtr7mw&amp;dib_tag=se&amp;keywords=Claire+Le+Goues&amp;qid=1772648451&amp;sprefix=claire+le+goues%2Caps%2C164&amp;sr=8-1\">she has a book coming out</a>, aimed at a wider audience, later this year. Do check it out.</p>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-03-04T15:06:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/03/04/the-spec-driven-development-triangle.html",
      "id": "urn:aggr:item:945fc25286e75f47b1c86222007f4f092f1bb5ca",
      "summary": "What shipping a library with no code taught me: spec-driven development is a feedback loop between specs, tests, and code, not a straight line.",
      "tags": [
        "programming",
        "ai",
        "coding",
        "software engineering",
        "spec driven development"
      ],
      "title": "Learnings from a No-Code Library: Keeping the Spec Driven Development Triangle in Sync",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-03-04-learnings-from-a-no-code-library-keeping-the-spec-driven/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>The biggest buyers will want to audit and influence post-training</h3>\n<p>Beneath the Anthropic and Department of War fracas, there is a legitimate &amp; essential conversation to be had about how much control any organization has when deeply adopting an AI model they didn’t train.</p>\n<p>These are probabilistic systems, with near infinite surface area to test, that are intentionally <em>designed</em>. Models are used to inform and make decisions, and they all have embedded perspectives.</p>\n<p><strong>AI is unlike other technology purchases because AI has embedded judgment.</strong></p>\n<p>I’m not sure what the answer is here, only that we need to have this discussion (calmly) and that anyone who tells you this isn’t a problem, that their model has an objective God-view-from-nowhere, is selling you something.</p>\n<p>Let me be clear: I agree strongly with Anthropic’s usage red lines. I gladly choose Claude myself.</p>\n<p>But this conversation is being framed badly around usage. Many are talking about Anthropic’s “terms of service” (notably, both Hegseth and Trump even capitalized the term in their tweets), but I think allowed usage terms are red herring. The issue is embedded judgment.</p>\n<p>If I were in military procurement, I would certainly some big questions about what “soul documents” or “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/news/claude-new-constitution\">constitutions</a>” (or similar) are embedded in <em>any</em> model being considered for embedding throughout the armed forces (and <em>all</em> the labs make design choices during post-training).</p>\n<p>And clearly this is something Anthropic is already dealing with! This section, from the above blog post, suddenly becomes much more interesting:</p>\n<blockquote>\n<p>This constitution is written for our mainline, general-access Claude models. We have some models built for specialized uses that don’t fully fit this constitution; as we continue to develop products for specialized use cases, we will continue to evaluate how to best ensure our models meet the core objectives outlined in this constitution.</p>\n</blockquote>\n<p>We don’t know if post-training control helped blow up the deal (I tend to believe the issue was about allowed usage, based on the administration’s and Anthropic’s statements, coupled with OpenAI’s announced terms). But I think it’s a safe bet many militaries will insist on influencing and auditing the post-training for their purchased variants.</p>\n<p>I wrote back in 2023 that <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2023/12/21/a-model-for-every-culture.html\">I expect states and cultures to build their own models</a> for related reasons; I wasn’t thinking about defense tech at the time but it certainly amplifies the issues.</p>\n<p>One takeaway: this is a strong argument for why the AI race isn’t going to be winner-take-all. Everyone wants a champion to trust.</p>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-03-01T17:13:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/03/01/the-issue-is-embedded-judgment.html",
      "id": "urn:aggr:item:dc4c72639cb296b7c458bfcd6c30944606a1cd82",
      "summary": "The Anthropic and Pentagon fight is framed around usage terms, but AI is unlike other purchases because every model carries embedded judgment.",
      "tags": [
        "programming",
        "ai",
        "policy"
      ],
      "title": "We’re Talking About Terms of Use, But the Issue is Embedded Judgment",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-03-01-we-re-talking-about-terms-of-use-but-the-issue-is-embedded/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p>There’s a lot of noise about how AI is changing programming these days. It can be a bit overwhelming.</p>\n<p>If you hang out on social media, you’ll hear wild claims about people running 12 agents at once, for days. Or people hacking bots together, giving them $10k, and letting them roam the web.</p>\n<p>The challenge with all of this is that coding agents <em>really are</em> performing some science fiction feats which were barely imaginable just 12 months ago. But at the same time, the ecosystem is incentivizing the most outlandish claims, so punters keep telling tall tales. Separating the signal from the noise is near impossible.</p>\n<p>I’m lucky enough to talk to a range of developers and teams, spanning a variety of company sizes and a broad array of skill sets. From these conversations, two beliefs have emerged and solidified about coding agents and their (current) impact on coding.</p>\n<p>Let’s start with belief number one:</p>\n<p><strong>Most talented developers do not appreciate the impact of the intuitive knowledge they bring to their coding agent.</strong></p>\n<p>We’ve all seen the posts by developer luminaries. They haven’t written code in weeks. They gave a hard problem to Claude Code or Codex and <em>it just worked</em>.</p>\n<p>But what we don’t see is their prompts. And having seen <em>many</em> prompts by <em>many</em> types of devs, I would wager their prompts are relatively specific and offer more guidance to the LLM than your average user. And these specifics don’t have to be exhaustive. Even knowing the right terms to use can have enormous impact and activate an entirely different set of weights in the model than someone writing, “the search is broken fix it.”</p>\n<p>Skilled programmers, with plenty of experience, don’t even think about how to ask correctly. They just do, intuitively. And things work well. If the agent and dev go through multiple turns, this effect gets even more significant.</p>\n<p>I wish we could see more prompts and traces, from a wide range of developers, to better understand the range of code. And, just as interestingly, how hard and long agents have to work to achieve the goal. For now we can just browse public repos on Github, where the range of coding quality is quite broad.</p>\n<p>Which brings me to the second belief:</p>\n<p><strong>Most work people are sharing are incredible personal tools, but they are not capital-P products.</strong></p>\n<p>There’s an app I really like called “<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://streetpass.social\">StreetPass</a>.” It’s a browser extension that watches web pages you visit and collects Mastodon accounts it finds, letting you easily follow them if you wish. It’s small and charming. A perfect extension.</p>\n<p>Recently, I realized I wanted a version of StreetPass, but for RSS feeds instead of Mastodon accounts. I forked StreetPass, fired up Claude Code, and had <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/dbreunig/feedpass\">a working version quickly</a>. You can use this, but I’m not supporting it. I won’t be pushing it to the App Store or Chrome Web Store. I won’t be building a version that doesn’t leverage <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://feedbin.com\">Feedbin</a>. I have no idea if it works on Chrome or Firefox. It’s personal software that I use almost daily.</p>\n<p>Most agentic coding projects we see being hyped are like this.</p>\n<p>All those things I won’t do, those are the things that would turn my <em>personal software</em> into a <em>Product</em>. And we haven’t even gotten to marketing, support, and more. As we covered when we <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/21/why-is-claude-an-electron-app.html\">touched on Claude’s desktop app</a>, the last 10% of product development and support is where the pain is. And that’s still a long road. As they say: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/06/the-rise-of-spec-driven-development.html\">Code today is free, as in puppies</a>.</p>\n<p>But I want to be clear about couple things.</p>\n<p>First, I know many teams shipping agent written code into products. But they test, support, review, and so much more. But when we make big claims like “coding is solved” or “code is free”, we need to be clear about <em>what</em> we’re talking about building<sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup>.</p>\n<p>Second, our ability to manifest personal software easily <em>is amazing</em> and powerful. I am continually inspired by the things people build (for example, I loved <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://simonwillison.net/2026/Feb/25/present/\">Simon’s presentation software he whipped up for FOO Camp</a>). His presentation app is so tailored to him, in the past the math would never justify the time spent building it to support a market of maybe a dozen. But now he gets his dream!</p>\n<p>Similarly, my RSS finder extension is a feature not an app and (sadly) there isn’t a large market for RSS today. But with Claude Code (and open source code to build upon!) I can build just what I wanted in moments.</p>\n<hr />\n<p>I am sure as our scaffolding and models improve, this stuff will get more accessible and more resilient, but I don’t expect these two beliefs to go away. Providing AI with the right instructions to obtain <em>just</em> what you want, will always be a challenge.</p>\n<p>Coding agents amplify existing skills.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/Grady_Booch/status/2026736492488568955\">Grady Booch</a> has a good post about this today. Things are getting higher level, and changing fast, but engineering remains. <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-02-25T22:12:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/02/25/two-things-i-believe-about-coding-agents.html",
      "id": "urn:aggr:item:7485c9374a15c5f5443ea27f00b4f7115ff1f625",
      "summary": "Talented developers underestimate the intuition they bring to their prompts, and coding agents amplify existing skills rather than replace them.",
      "tags": [
        "programming",
        "ai",
        "software development"
      ],
      "title": "Two Beliefs About Coding Agents",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-02-25-two-beliefs-about-coding-agents/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>If code is free, why aren’t all apps native?</h3>\n<p>The state of coding agents can be summed up by <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/dbreunig/status/2024970389156495365?s=46\">this fact</a></p>\n<blockquote>\n<p>Claude spent $20k on an agent swarm implementing (kinda) a C-compiler in Rust, but desktop Claude is an Electron app.</p>\n</blockquote>\n<p>If you’re unfamiliar, Electron is a coding framework for building desktop applications using web tech, specifically HTML, CSS, and JS. What’s great about Electron is it allows you to build one desktop app that supports Windows, Mac, and Linux. Plus it lets developers use existing web app code to get started. It’s great for teams big and small. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/List_of_software_using_Electron?wprov=sfti1\">Many apps you probably use every day are built with Electron</a>: Slack, Discord, VS Code, Teams, Notion, and more.</p>\n<p>There are downsides though. Electron apps are bloated; each runs its own Chromium engine. The minimum app size is usually a couple hundred megabytes. They are often laggy or unresponsive. They don’t integrate well with OS features.</p>\n<p>(These last two issues <em>can</em> be addressed by smart development and OS-specific code, but they rarely are. The benefits of Electron (one codebase, many platforms, it’s just web!) don’t incentivize optimizations outside of HTML/JS/CSS land.)</p>\n<p>But these downsides are dramatically outweighed by the ability to build and maintain one app, shipping it everywhere.</p>\n<p>But now we have coding agents! <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2026/02/06/the-rise-of-spec-driven-development.html\">And one thing coding agents are proving to be pretty good at is cross-platform, cross-language implementations given a well-defined spec and test suite</a>.</p>\n<p>On the surface, this ability should render Electron’s benefits obsolete! Rather than write one web app and ship it to each platform, we should write <em>one spec and test suite</em> and use coding agents to ship <em>native</em> code to each platform. If this ability is real and adopted, users get snappy, performant, native apps from small, focused teams serving a broad market.</p>\n<p>But we’re still leaning on Electron. Even Anthropic, one of the leaders in AI coding tools, who keeps publishing flashy agentic coding achievements, still uses Electron in the Claude desktop app. And it’s slow, buggy, and bloated app.</p>\n<p><em>So why are we still using Electron and not embracing the agent-powered, spec driven development future?</em></p>\n<p>For one thing, coding agents are <em>really</em> good at the first 90% of dev. But that last bit – nailing down all the edge cases and continuing support once it meets the real world – remains hard, tedious, and requires plenty of agent hand-holding.</p>\n<p>Anthropic’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/engineering/building-c-compiler\">Rust-base C compiler</a> slammed into this wall, after screaming through the bulk of the tests:</p>\n<blockquote>\n<p>The resulting compiler has nearly reached the limits of Opus’s abilities. I tried (hard!) to fix several of the above limitations but wasn’t fully successful. New features and bugfixes frequently broke existing functionality.</p>\n</blockquote>\n<p>The resulting compiler <em>is</em> impressive, given the time it took to deliver it and the number of people who worked on it, but it is largely unusable. That last mile is <em>hard</em>.</p>\n<p>And this gets even worse once a program meets the real world. Messy, unexpected scenarios stack up and development never really ends. Agents make it easier, sure, but hard product decisions become challenged and require human decisions.</p>\n<p>Further, with 3 different apps produced (Mac, Windows, and Linux) the surface area for bugs and support increases 3-fold. Sure, there are local quirks with Electron apps, but most of it is mitigated by the common wrapper. Not so with native!</p>\n<p>A good test suite and spec <em>could</em> enable the Claude team to ship a Claude desktop app native to each platform. But the resulting overhead of that last 10% of dev and the increased support and maintenance burden will remain.</p>\n<p>For now, Electron still makes sense. Coding agents are amazing. But the last mile of dev and the support surface area remains a real concern.</p>\n<hr />\n<p>Over at <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://news.ycombinator.com\">Hacker News</a>, Claude Code’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://borischerny.com\">Boris Cherney</a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://news.ycombinator.com/item?id=47106368\">chimes in</a>:</p>\n<blockquote>\n<p>Boris from the Claude Code team here.</p>\n<p>Some of the engineers working on the app worked on Electron back in the day, so preferred building non-natively. It’s also a nice way to share code so we’re guaranteed that features across web and desktop have the same look and feel. Finally, Claude is great at it.</p>\n<p>That said, engineering is all about tradeoffs and this may change in the future!</p>\n</blockquote>\n<p>There we go: developer familiarity and simpler maintainability across multiple platforms is worth the “tradeoffs”. We have incredible coding agents that are great at transpilation, but there remain costs that outweigh the costs of shipping a non-native app.</p>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-02-21T18:00:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/02/21/why-is-claude-an-electron-app.html",
      "id": "urn:aggr:item:e3dd3ecc8d1e0039224be250a87bcafe7a1512ae",
      "summary": "If coding agents make native ports cheap, why does Anthropic still ship Claude as an Electron app? Because code is cheap but maintenance isn't.",
      "tags": [
        "programming",
        "ai",
        "software development",
        "spec driven development"
      ],
      "title": "Why is Claude an Electron App?",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-02-21-why-is-claude-an-electron-app/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<p><em>This post was <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://blog.nilenso.com/blog/2026/02/10/how-system-prompts-define-agent-behaviiour/\">co-authored with Srihari Sriraman</a></em></p>\n<p>Coding agents are fascinating to study. They help us build software in a new way, while themselves exemplifying a novel approach to architecting and implementing software. At their core is an AI model, but wrapped around it is a mix of code, tools, and prompts: the harness.</p>\n<p>A critical part of this harness is the system prompt, the baseline instructions for the application. This context is present in every call to the model, no matter what skills, tools, or instructions are loaded. The system prompt is always present, defining a core set of behaviors, strategies, and tone.</p>\n<p>Once you start analyzing agent design and behavior, a question emerges: how much does the system prompt actually determine an agent’s effectiveness? We take for granted that the model is the most important component of any agent, but how much can a system prompt contribute? Could a great system prompt paired with a mediocre model challenge a mediocre prompt paired with a frontier model?</p>\n<p>To find out, we obtained and analyzed system prompts from six different coding agents. We clustered them semantically, comparing where their instructions diverged and where they converged. Then we swapped system prompts between agents and observed how behavior changed.</p>\n<p>System prompts matter far more than most assume. A given model sets the theoretical ceiling of an agent’s performance, but the system prompt determines whether this peak is reached.</p>\n<hr />\n<h3>The Variety of System Prompts</h3>\n<p>To understand the range of system prompts, we looked at six CLI coding agents: Claude Code, Cursor, Gemini CLI, Codex CLI, OpenHands, and Kimi CLI. Each performs the same basic function: given a task they gather information, understands the code base, writes code, tracks their progress, and runs commands. But despite these similarities, the system prompts are <em>quite</em> different.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/waffle_comparison.jpg\" alt=\"Waffle chart comparisons of 6 coding agent system prompts\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Try It Out</p>\n<p>We’re analyzing <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/asgeirtj/system_prompts_leaks\">exfiltrated system prompts</a>, which we clean up and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/nilenso/long-prompts-analysis/tree/main/data/prompts/filtered\">host here</a><sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup>. Each of these is fed into <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/nilenso/context-viewer\">context-viewer</a>, a tool Srihari developed that chunks contexts in semantic components for exploration and analysis.</p>\n<p>Looking at the above visualizations, there is plenty of variety. Claude, Codex, Gemini, and OpenHands roughly prioritize the same instructions, but vary their distributions. Further, prompts for Claude Code and OpenHands both are less than half the length of prompts in Codex and Gemini.</p>\n<p>Cursor’s and Kimi’s prompts are dramatically different. Here we’re looking at Cursor’s prompt that’s paired with GPT-5 (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.adiasg.com/blog/comparing-cursors-prompts-across-models\">Cursor uses slightly different prompts when hooked to different models</a>), and it spends over a third of its tokens on personality and steering instructions. Kimi CLI, meanwhile, contains zero workflow guidance, barely hints at personality instructions, and is the shortest prompt by far.</p>\n<p>Given the similar interfaces of these apps, we’re left wondering: why are their system prompts so different?</p>\n<p>There’s two main reasons the system prompts vary: <em>model calibration</em> and <em>user experience</em>.</p>\n<p>Each model has its own quirks, rough edges, and baseline behaviors. If the goal is to produce a measured, helpful TUI coding assistant, each system prompt will have to deal with and adjust for unique aspects of the underlying model to achieve this goal. This <em>model calibration</em> reins in problematic behavior.</p>\n<p>System prompts also vary because they specify slightly different <em>user experience</em>. Sure, they’re all text-only, terminal interfaces that explore and manipulate code. But some are more talkative, more autonomous, more direct, or require more detailed instructions. System prompts define this UX and, as we’ll see later, we can make a coding agent “feel” like a different agent just by swapping out the system prompt.</p>\n<p>We can get a glimpse of these two functions together by looking at how a given system prompt changes over time, especially as new versions of models arrive. For example:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/claude_over_time.jpg\" alt=\"Claude&#39;s system prompt vascilates as new models are released, but trends steadily longer\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Try It Out</p>\n<p>Note how the system prompt isn’t stable, nor growing in a straight line. It bounces around a bit, as the Claude Code team tweaks the prompt to both adjust new behaviors and smooth over the quirks of new models. Though the trend is a march upward, as the coding agent matures.</p>\n<p>If you want to dive further into Claude Code’s prompt history, Mario Zechner has <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cchistory.mariozechner.at\">an excellent site</a> where he highlights the exact changes from version to version.</p>\n<p>Go Deeper</p>\n<hr />\n<h3>The Common Jobs of a Coding Agent System Prompt</h3>\n<p>While these prompts vary from tool to tool, there are many commonalities that each prompt features. There is clear evidence that these teams are <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/11/11/don-t-fight-the-weights.html\">fighting the weights</a>: they use repeated instructions, all-caps admonishments, and stern warnings to adjust common behaviors. This shared effort suggests common patterns in their training datasets, which each has to mitigate.</p>\n<p>For example, there are <em>many</em> notes about how these agents should use comments in their code. Cursor specifies that the model should, “not add comments for trivial or obvious code.” Claude states there should be no added comments, “unless the user asks you to.” Codex takes the same stance. Gemini instructions the model to, “Add code comments sparingly… NEVER talk to the user through comments.”</p>\n<p>These consistent, repeated instructions are warranted. They fight against examples of conversation in code comments, present in countless codebases and Github repo. This behavior goes deep: we’ve even seen that Opus 4.5 will <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/aidenybai/status/1993901129210712129\">reason in code comments if you turn off thinking</a>.</p>\n<p>System prompts also repeatedly specify that tool calls should be parallel whenever possible. Claude should, “maximize use of parallel tool calls where possible.” Cursor is sternly told, “CRITICAL INSTRUCTION: involve all relevant tools concurrently… DEFAULT TO PARALLEL.” Kimi adopts all-caps as well, stating, “you are HIGHLY RECOMMENDED to make [tool calls] in parallel.”</p>\n<p>This likley reflects the face that most post-training reasoning and agentic examples are <em>serial</em> in nature. This is perhaps easier to debug and a bit of delay when synthesizing these datasets isn’t a hinderence. However, in real world situations, users certainly appreciate the speed, so system prompts need to override this training.</p>\n<p>Both of these examples of <em>fighting the weights</em> demonstrate how system prompts are used to smooth over the quirks of each model (which they pick up during training) and improve the user experience in an agentic coding application.</p>\n<p>Much of what these prompts specify is shared; common adjustments, common desired behaviors, and common UX. But their differences notably affect application behavior.</p>\n<hr />\n<h3>Do the Prompts Change the Agent?</h3>\n<p>Helpfully, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://opencode.ai\">OpenCode</a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://opencode.ai/docs/modes/#prompt\">allows users to specify custom system prompts</a>. With this feature, we can drop in prompts from Kimi, Gemini, Codex and more, removing and swapping instructions to measure their contribution.</p>\n<p>We gave SWE-Bench Pro test questions to two applications: two agents running the OpenCode harness, calling Opus 4.5, but with one one using the Claude Code system prompt and the other armed with Codex’s instructions.</p>\n<p>Time and time again, the agent workflows diverged immediately. For example:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/prompt_swap.jpg\" alt=\"Claude&#39;s system prompt defines a more iterative agent\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>The Codex prompt produced a methodical, documentation-first approach: understand fully, then implement once. The Claude prompt produced an iterative approach: try something, see what breaks, fix it.</p>\n<p>This pattern remains consistent over many SWE Bench problems. If we average the contexts for each model and system prompt pair, we get the following:</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/swe_bench_prompts.jpg\" alt=\"Swapping system prompts yielded different behavior for each model\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Try It Out</p>\n<p>All prompt-model combinations correctly answered this subset of SWE Bench Pro questions. But <em>how</em> they suceeded was rather different. The system prompts shaped the workflows.</p>\n<hr />\n<h3>System Prompts Deserve More Attention</h3>\n<p>Last week, when Opus 4.6 and Codex 5.3 landed, people began putting them through the paces, trying to decide which would be their daily driver. Many tout the capabilities of one option over another, but just as often are complaints about approach, tone, or other discretionary choices. Further, it seems every week brings discussion of a new coding harness, especially for managing swarms of agents.</p>\n<p>There is markedly less discussion about the system prompts that define the behaviors of these agents<sup class=\"footnote-ref\"><a href=\"#fn-2\" id=\"fnref-2\" data-footnote-ref>2</a></sup>. System prompts define the UX and smooth over the rough edges of models. They’re given to the model with <em>every</em> instruction, yet we prefer to talk Opus vs. GPT-5.3 or Gastown vs. Pi.</p>\n<p>Context engineering starts with the system prompt.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>Exfiltrated system prompts represent versions of the system prompt for a given session. It’s not 100% canonical, as many AI harnesses assemble system prompts from multiple snippets, given the task at hand. But given the consistent manner with which we can extrac these prompts, and comparing them with <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://platform.claude.com/docs/en/release-notes/system-prompts\">public</a> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/openai/codex/blob/d452bb3ae5b5e0f715bba3a44d7d30a51b5f28ae/codex-rs/core/prompt.md\">examples</a>, we feel they are sufficiently representative for this analysis. <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"fn-2\">\n<p>Though you can use Mario’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cchistory.mariozechner.at/?from=2.1.31&amp;to=2.1.34\">system prompt diff tool to explore the changes accompanying Opus 4.6’s release</a>. <a href=\"#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-02-11T05:34:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/02/10/system-prompts-define-the-agent-as-much-as-the-model.html",
      "id": "urn:aggr:item:edb34831fb09d1eac9258db0b893674057a3b2b5",
      "summary": "The model sets the ceiling on an agent's performance, but the system prompt decides whether it ever gets there.",
      "tags": [
        "programming",
        "agents",
        "ai",
        "collaboration",
        "context",
        "context engineering",
        "system prompts"
      ],
      "title": "How System Prompts Define Agent Behavior",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-02-11-how-system-prompts-define-agent-behavior/"
    },
    {
      "authors": [
        {
          "name": "Drew Breunig"
        }
      ],
      "content_html": "<h3>Handling Your Long Context Today &amp; Designing Your Agent Tomorrow</h3>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/thumb_index.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<h3>Context Rot is the Worst Context Failure</h3>\n<p>“Context Rot” is a common problem agent designers must avoid and mitigate.</p>\n<p>The <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://storage.googleapis.com/deepmind-media/gemini/gemini_v2_5_report.pdf\">Gemini 2.5 paper</a> was one of the first technical reports that flagged the issue, noting that the performance of their <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/17/an-agentic-case-study-playing-pok%C3%A9mon-with-gemini.html\">Pokémon-playing harness</a> rapidly deteriorated as the context grew beyond 100,000 tokens; a figure <em>far</em> below Gemini 2.5’s 1 million input token limit. We covered this in our <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html#context-distraction\">context failures piece</a>, but <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://research.trychroma.com/context-rot\">the Chroma team published the canonical exploration</a> of the effect, dubbing it <strong>context rot</strong>.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/context_rot.jpg\" alt=\"A figure from the Chroma post showing performance declining as the input length increases\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>A key takeaway from Gemini’s Pokémon troubles and the Chroma post is that context rot is not a <em>capacity problem</em>. It’s a <em>quality problem</em>. As the context grows beyond a model’s soft limit, the model continues to issue output as its accuracy declines. This makes for a pernicious problem, one that sneaks up on us the longer we run agents.</p>\n<p>Of all the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html\">context fails</a>, context rot is the worst.</p>\n<hr />\n<h3>Enter Recursive Language Models</h3>\n<p>Defined by Alex Zhang and Omar Khattab, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://alexzhang13.github.io/blog/2025/rlm/\">Recursive Language Models</a> (or RLMs) are a simple idea:</p>\n<ol>\n<li>Load long context into a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop\">REPL</a> environment<sup class=\"footnote-ref\"><a href=\"#fn-1\" id=\"fnref-1\" data-footnote-ref>1</a></sup>, stored as variables.</li>\n<li>Allow an LLM to use the REPL environment to explore and analyze the context.</li>\n<li>Provide a function in the REPL to trigger a sub-LLM call.</li>\n</ol>\n<p>That’s it. That’s an RLM. The LLM will use the REPL to filter, chunk, and sample the long context as needed to complete its task. It will use the sub-LLM function to task new LLM instances to explore, analyze, or validate the context. Eventually, the sum of the LLM’s findings will be synthesized into a final answer.</p>\n<p>With this setup, the long context(s) can be <em>really</em> long. I’ve given RLMs logfiles more than 400 megabytes in size, with no issues. In the original <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://alexzhang13.github.io/blog/2025/rlm/\">RLM post</a>, Alex reports that performance doesn’t degrade when &gt;10 million tokens are provided.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://www.dbreunig.com/img/resized/rlm_plot.jpg\" alt=\"Alex Zhang&#39;s RLM paper shows RLM significantly mitigates the context rot decline.\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>Note the orange lines on the right: as the context length increases, performance very slowly degrades, hovering around 50-60%. Compare this to the non-RLM results (with the same GPT-5 model), which dramatically decline until failing entirely at 262,000 tokens.</p>\n<hr />\n<h3>RLMs Work By Turning Long Context Problems Into Coding &amp; Reasoning Problem</h3>\n<p>The key attribute of RLMs is that they maintain two distinct pools of context: <em>tokenized context</em> (which fills the LLM’s context window) and <em>programmatic context</em> (information that exists in the coding environment). By giving the LLM access to the REPL, where the <em>programmatic context</em> is managed, the LLM controls what moves from <em>programmatic</em> space to <em>token</em> space.</p>\n<p>And it turns out modern LLMs are quite good at this!</p>\n<p>Let’s look at an example.</p>\n<p>Here I’ve given Kimi K2 a very large <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/andyyang/stable_diffusion_prompts_2m\">dataset of Stable Diffusion prompts</a> (prompts people provided to generate images). I then ask the RLM to identify the most common celebrities used in these prompts (and of course, I’m <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.cmpnd.ai/blog/rlms-in-dspy.html\">using RLM in DSPy</a>). If you’re curious, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://gist.github.com/dbreunig/afdd86cb560847f54359dcc3ee233766\">here’s the code</a>.</p>\n<p>I give the RLM a budget of 5 iterations to accomplish the task. Below, you can swipe/page through each iteration, which shows the LLM’s reasoning and the code it executed in the REPL. There’s a few things to keep in mind as you read through:</p>\n<ul>\n<li>Every time the LLM calls <code>print</code> in the REPL, it’s bringing new context into the <em>token</em> space. (I’ve omitted this output for brevity)</li>\n<li>When the LLM calls <code>llm_query</code> (highlighted in blue) in the REPL, it’s tasking another LLM instance with a sub-call. It stores the result of this function as a variable, usually.</li>\n<li>On the last iteration, the LLM calls a special function <code>SUBMIT</code>, which indicates it has finished with the task.</li>\n</ul>\n<p>Click through and read, it really illuminates how a RLM works:</p>\n<p>We can clearly see the LLM exploring and sampling the context, planning an approach, testing the approach, scaling the approach, then finally synthesizing its findings into a final answer. (In this case, it was correct!)</p>\n<p>The context I gave this RLM – the collection of Stable Diffusion prompts – exceeds the maximum context window of any LLM. It would fail before it started, whereas a DSPy RLM harness around Kimi K2 took only a couple minutes.</p>\n<p>It’s incredible, but with this example we can identify a couple limitations of RLMs.</p>\n<p>First, it’s relatively slow. Answering this question took over a dozen LLM calls and several minutes. And we were using <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://groq.com/blog/introducing-kimi-k2-0905-on-groqcloud\">Kimi K2 on Groq</a>. Try this with GPT-5.3 or Opus 4.6 and you’ll be waiting around even longer.</p>\n<p>Second, as you read through the reasoning and code in the example above it becomes apparent that you need strong models to drive RLMs. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/Qwen/Qwen3-30B-A3B\">Qwen3-30B-A3B</a> couldn’t complete this task. It got confused, lost track of progress, and ended up running out of budget before submitting an answer<sup class=\"footnote-ref\"><a href=\"#fn-2\" id=\"fnref-2\" data-footnote-ref>2</a></sup>.</p>\n<p>This brings us to the second reason RLMs work so well (in addition to maintaining the two <em>token</em> and <em>programmatic</em> context pools): RLMs exploit the coding reasoning gains of the last +18 months.</p>\n<p>We’ve covered before <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2024/12/18/synthetic-data-the-growing-ai-perception-divide.html\">how LLMs are getting better at verifiable tasks because it’s relatively easy to synthesize data and evaluate verifiable tasks</a>, like math and coding. We’ve spent many billions of dollars post-training coding skills into frontier models. RLMs wrap long contexts in a coding environment so they’re addressable by the LLM’s incredible coding abilities, <em>turning context rot into a coding problem.</em></p>\n<p>Even better, RLMs get to use the REPL not just as a tool for exploring and managing long contexts, but also as a deterministic scratchpad. This proves to be a killer resource for many tasks. You occasionally see this benefit in action in ChatGPT or Claude, when the LLM will fire up a Python script to answer a question<sup class=\"footnote-ref\"><a href=\"#fn-3\" id=\"fnref-3\" data-footnote-ref>3</a></sup>. This hybrid capability of RLMs – the ability to use probabilistic, fuzzy LLM logic for some challenges and deterministic code for others – will likely become a stronger attribute as RLM harnesses mature and models are fine-tuned.</p>\n<hr />\n<h3>The Potential of RLMs: Agent Discovery Mechanisms</h3>\n<p>The ability of RLMs to mitigate the effects of context rot are really incredible. However, this isn’t the potential that excites me most. What excites me about RLMs is their ability to explore, develop, and test approaches to solving a problem.</p>\n<p>If you start experimenting with RLMs (and I <em>strongly</em> suggest you should), be sure to continually review your traces. Set <code>verbose</code> to <code>true</code> and/or wire up DSPy to <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mlflow.org/\">MLFlow</a>. As you watch these models explore the context and try out different approaches (taking your iteration budget into consideration<sup class=\"footnote-ref\"><a href=\"#fn-4\" id=\"fnref-4\" data-footnote-ref>4</a></sup>), you’ll notice repeating patterns. In the example above, if I asked the RLM to find the top celebrities, aesthetic styles, or vehicles requested in the image generation prompts, it would repeatedly deploy similar tactics to situate itself and complete the task.</p>\n<p><em>There is no reason we can’t identify these repeating patterns, decompose them, and optimize them.</em></p>\n<p>This is what excites me about RLMs: if you run them on the same task several times, you’re generating emergent agent designs. These traces can then be used to explicitly define an agent, with higher reliability and lower latency. RLM passes discover the best approach to the problem, which we can then optimize.</p>\n<hr />\n<h3>The Limitations of RLMs</h3>\n<p>But if that’s the potential, how should you use RLMs today? In the last couple months I’ve seen teams use them for very large context scenarios, from general coding tasks across massive codebases to research and exploration across massive datasets.</p>\n<p>At the moment, using RLMs on small context problems probably isn’t worth the squeeze. You’ll end up waiting around while the RLM explores context that could have simply been part of the prompt.</p>\n<p>Further, RLMs do not solve other <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html\">context fails</a>, like <em>context poisoning</em> or <em>context confusion</em>. If bad information is in your programmatic context, there’s good odds it could influence the RLM in undesirable ways.</p>\n<hr />\n<h3>The Next “Chain of Thought”?</h3>\n<p>RLMs are slow, synchronous, and merely borrowing the current capabilities of models rather than leveraging models post-trained to be <em>good</em> at RLM patterns. There is <em>so</em> much low-hanging fruit here.</p>\n<p>But that’s exactly what makes them exciting. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.dbreunig.com/2025/04/11/what-we-mean-when-we-say-think.html\">Chain of thought</a> was also simple and general (just ask the model to “think step by step”) and it unlocked enormous latent potential in LLMs, that was only fully realized through the creation of reasoning models. RLMs have the same shape: a test-time strategy that’s easy to implement today and will only get better as models are trained to exploit it.</p>\n<p>You probably don’t need to rush out and refactor your agents today. But if your agents touch large contexts, start experimenting with RLM traces today. You’ll learn something about your problem…and you might discover your next agent architecture in the output.</p>\n<section class=\"footnotes\" data-footnotes>\n<ol>\n<li id=\"fn-1\">\n<p>“REPL” stands for “read-eval-print loop”. It is an interactive coding environment where one can enter arbitrary code and get back output. If you open your terminal and type <code>python</code>, you’ll find yourself in a REPL. <a href=\"#fnref-1\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"1\" aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"fn-2\">\n<p>The team at MIT behind RLM <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/mit-oasys/rlm-qwen3-8b-v0.1\">has just released a version of Qwen3-8B post-trained on RLM traces</a>. I hear it works pretty well, but no amount of fine-tuning or RL is going to help Qwen-8B code or reason as well as GPT or Opus. <a href=\"#fnref-2\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"2\" aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n<li id=\"fn-3\">\n<p>Both ChatGPT and Claude used to do this when asked, “How many R’s are in Strawberry,” though it appears both rely on reasoning or, in the case of ChatGPT, hide the previously visible Python code. <a href=\"#fnref-3\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"3\" aria-label=\"Back to reference 3\">↩</a></p>\n</li>\n<li id=\"fn-4\">\n<p>I was continually amazed how well models would leverage their budgets. Kimi, in particular, wasn’t shy about ending early if the task proved simple. But it would also spend LLM sub-calls freely once it had a working approach, saturating my connection with Groq. <a href=\"#fnref-4\" class=\"footnote-backref\" data-footnote-backref data-footnote-backref-idx=\"4\" aria-label=\"Back to reference 4\">↩</a></p>\n</li>\n</ol>\n</section>\n",
      "date_modified": "2026-09-15T15:44:24+00:00",
      "date_published": "2026-02-09T17:42:00+00:00",
      "external_url": "https://www.dbreunig.com/2026/02/09/the-potential-of-rlms.html",
      "id": "urn:aggr:item:0655a68e2230795d0cc42ca376f0ec98625cb7d7",
      "summary": "Recursive Language Models put long context in a REPL and let the model explore it, sidestepping context rot on logs hundreds of megabytes long.",
      "tags": [
        "programming",
        "ai",
        "context",
        "dspy",
        "rlms"
      ],
      "title": "The Potential of RLMs",
      "url": "https://aggr.aymericbeaumet.com/items/dbreunig-com/2026-02-09-the-potential-of-rlms/"
    }
  ],
  "language": "en",
  "title": "Drew Breunig",
  "version": "https://jsonfeed.org/version/1.1"
}