<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Millrace Blog</title>
  <description>Technical essays and product notes from Millrace.</description>
  <link>https://millrace.ai/blog/</link>
  <language>en-us</language>
  <item>
    <title>Runtime Engineering Comes After Loop Engineering</title>
    <description>Loop engineering is real, but once loops become infrastructure, the missing layer is runtime engineering.</description>
    <link>https://millrace.ai/blog/runtime-engineering-comes-after-loop-engineering/</link>
    <guid>https://millrace.ai/blog/runtime-engineering-comes-after-loop-engineering/</guid>
    <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
    <author>Tim Osterhus</author>
    <category>agents</category>
    <category>millrace</category>
    <category>loops</category>
    <category>runtime</category>
    <content:encoded><![CDATA[<p>As of June 7 or so, loop engineering is now the new big thing.</p>
<p>The next big thing is runtime engineering.</p>
<p>Yeah, it’s quite grandiose of me to name the fifth big “xyz engineering” trend just a week after the fourth one got labeled. Harness engineering had months in the spotlight before loop engineering stole the show. But I’m still confident the next one is runtime engineering.</p>
<p>Conveniently, I also have a startup that’s building the thing I am about to describe, so feel free to apply the appropriate amount of skepticism, because I had to apply plenty of it myself.</p>
<p>For months, I had trouble explaining what Millrace actually was. I knew what it did. I knew why I was building it. I knew the architecture was pointed at something more specific than “agent orchestration,” but every label felt slightly wrong.</p>
<p>It was agent ops, kind of.</p>
<p>It was CI/CD for agents, kind of.</p>
<p>It was harness engineering, not as much.</p>
<p>The best one I could think of was “orchestration framework,” but even that still didn’t fit.</p>
<p>Then in June, loop engineering became the term of the week.</p>
<p>Suddenly, the thing I had been working on since January snapped into focus. Millrace was not just a weird orchestration system. It was built around loops. Not naive loops, not prompt loops, not cron jobs with better branding, but governed loops. Durable loops that had state, contracts, recovery, evidence, and closure.</p>
<p>That explained a lot.</p>
<p>It also made me wonder whether I was just seeing what I wanted to see, which is a very easy thing to do when you have spent months building infrastructure entirely by yourself with no human peers to keep you grounded and prevent you spiraling into AI psychosis.</p>
<p>Now, I’m pretty good at introspection and bending over backwards to keep a critical eye on myself so I don’t become another victim. But I’m still human, and after seeing multiple high profile individuals succumb to digital sycophancy, I knew I wasn’t immune either.</p>
<p>So I went looking.</p>
<p>I spent several days digging through the current loop engineering landscape, and having agents look for me. Public repos. Articles, transcripts, frameworks, harnesses, plugins, wrappers. Whatever people had tagged or described as loop engineering. My laptop had easily over a hundred different files documenting and analyzing everything I could find.</p>
<p>The result was not “everything else is bad.”</p>
<p>Some of it was good. Some of it was genuinely useful. A lot of it was slop, but a few projects were architecturally serious. One seemed especially interesting around OpenCode-native spec workflows. Another was a real vertical product for defect resolution. There were host-specific wrappers for Claude Code, OpenCode, Cursor, Aider, Hermes, Copilot, Codex, and probably a few more by the time this article gets published.</p>
<p>But the pattern was clear. The vast majority of the space is, or was, still about individual loops.</p>
<p>How do I make the agent keep working? How do I repeat the prompt? How do I split planner, builder, and evaluator? How do I keep the session alive?</p>
<p>How do I wrap this one agent host with a state file, a few safety gates, and a hope that the model does not confidently wander into the bushes?</p>
<p>All useful questions that need answers. They were not the final questions.</p>
<h2 id="the-obvious-next-guess-is-more-loops" tabindex="-1"><a class="header-anchor" href="#the-obvious-next-guess-is-more-loops">The obvious next guess is more loops</a></h2>
<p>Once people understand loop engineering, the obvious next guess is loops making loops. Even the ClawFather joked that would be the case come September.</p>
<p>I’m not gonna lie, it is intuitive. If a loop can make an agent work, maybe the next layer is a loop that makes more loops. Then maybe a loop that optimizes those loops. Then maybe a loop that critiques the loop that optimized the loop.</p>
<p>You can keep doing this for a while. After all, software people love their recursion.</p>
<p>But I’m not a software engineer. And I do not think “more loops” is the next abstraction.</p>
<p>More loops can be useful. A system can absolutely have loops that design, tune, supervise, evaluate, or repair other loops. Millrace can support that kind of thing too. But that still leaves the deeper problem untouched.</p>
<p>Who manages the loops?</p>
<p>If loop A creates loop B, what owns loop B’s state? What is loop B allowed to do? What happens if loop B stalls? What evidence proves it made progress? What happens if two loops compete for the same repo, branch, budget, tool, or human approval? What decides whether a loop is done? What reopens it when the answer was wrong? Do you create Loop C? Loop D?</p>
<p>Yeah, the next layer is not loops squared.</p>
<p>It’s runtime engineering.</p>
<h2 id="the-ladder-changed" tabindex="-1"><a class="header-anchor" href="#the-ladder-changed">The ladder changed</a></h2>
<p>The way I currently see the agent-work ladder is this:</p>
<ul>
<li>Prompt engineering: how do I ask the model?</li>
<li>Context engineering: what does the model need to know?</li>
<li>Harness engineering: what surrounds the model?</li>
<li>Loop engineering: how do I make agents keep working?</li>
<li>Runtime engineering: how do I automate the management of multiple loops?</li>
</ul>
<p>That last sentence is the important one.</p>
<p>Runtime engineering is not just “a better loop.” It is the discipline of making loops safe enough, durable enough, inspectable enough, and recoverable enough to become infrastructure.</p>
<p>Loop engineering is about designing the repeatable process.</p>
<p>Runtime engineering is about operating that process reliably when the loop is no longer a cute demo.</p>
<p>Once loops run for hours, touch real repositories, spend real tokens, create branches, call tools, open pull requests, fail halfway through, recover from stale state, and need human intervention in exactly the right places, the loop itself is not enough.</p>
<p>And adding a loop on top only kicks the can down the road. At that point, the loop needs reliable, deterministic governance.</p>
<p>A runtime, if you will.</p>
<h2 id="why-the-current-loop-framing-is-too-small" tabindex="-1"><a class="header-anchor" href="#why-the-current-loop-framing-is-too-small">Why the current loop framing is too small</a></h2>
<p>The current loop engineering conversation is right about the direction and immature about the layer.</p>
<p>I’m not making an insult. This happens with every new abstraction.</p>
<p>Prompt engineering started as “say the magic words better.” Then context engineering showed up because the real question became what the model should know, not just how the instruction was phrased. Harness engineering manifested because the model alone was not the product. It needed tools, roles, memory, routing, execution environments, and evaluators.</p>
<p>Loop engineering is the next obvious step. Instead of treating an agent run as a one-shot event, you design a repeatable process around it. The agent plans, acts, checks, repairs, and continues.</p>
<p>Reliable automation is real progress.</p>
<p>But once loops get good enough to matter, the problem moves again.</p>
<p>Prompt engineering is still relevant for small models, but once model intelligence improved enough, attention shifted to context engineering. Once those models gained access to tools, harness engineering became the next focus, but that didn’t make context engineering irrelevant.</p>
<p>Accordingly, the hard part is no longer “can the agent keep working?” Because Ralph proved that it can.</p>
<p>The hard part is whether you can trust the system that keeps it working.</p>
<p>That includes state, authority, queues, budgets, recovery, evidence, approvals, inspection, and closure. Among other things.</p>
<p>It sounds boring, and that’s because it is. I might call myself a nerd, but “stage contracts” and “frozen compiled plans” don’t do it for me.</p>
<p>My personal preferences don’t matter though. Those boring parts are precisely what enable long-running autonomy to be survivable.</p>
<p>Reliably survivable.</p>
<h2 id="what-i-found-after-comparing-millrace-to-the-landscape" tabindex="-1"><a class="header-anchor" href="#what-i-found-after-comparing-millrace-to-the-landscape">What I found after comparing Millrace to the landscape</a></h2>
<p>After looking through the public loop engineering resources and projects I could find, the split was pretty consistent.</p>
<p>There are prompt and skill packs. These help a model behave better, but the model still owns too much of the process.</p>
<p>There are host-specific wrappers. These make Claude Code, OpenCode, Cursor, Aider, or another agent host run in a more disciplined loop. Useful, but tied to one tool.</p>
<p>There are harnesses. These split roles, add evaluators, persist session state, or manage model/provider pressure.</p>
<p>There are evidence and gate layers. These add review, checklists, rule capture, known-bug rules, or delivery checks.</p>
<p>There are vertical apps. These solve one workflow, like defect resolution, paper analysis, operational incident repair, or PowerPoint generation.</p>
<p>Again, all useful. Maybe I didn’t look hard enough, but I could not find a single one designed as a general runtime layer for governed loops.</p>
<p>That is the distinction that finally made Millrace make complete sense to me.</p>
<p>Millrace is not trying to be the best loop for one agent host. It is not trying to be a prompt pack, though it already ships with prompts. It is not trying to be a verticalized industry-specific automation, although it could be configured to do so. It is not trying to be an evaluator trick, even though evaluators are useful. And it’s definitely not trying to be another harness.</p>
<p>No, Millrace is the runtime underneath all of those patterns. Agents do the work, Millrace owns the work lifecycle.</p>
<p>That’s the boundary.</p>
<h2 id="what-runtime-engineering-owns" tabindex="-1"><a class="header-anchor" href="#what-runtime-engineering-owns">What runtime engineering owns</a></h2>
<p>Runtime engineering asks one question: <em>How do I automate the management of multiple loops?</em></p>
<p>And if you want to get really specific: <em>How do I reliably automate the management of multiple loops of varying complexity for days, weeks, or months at a time?</em></p>
<p>The answer is not “write a bigger prompt.” It is not “add a critic,” “put the loop on a cron,” or “let the model decide when it is done and hope the summary is accurate.”</p>
<p>The answer is to ensure the most important decisions are made deterministically. Good old-fashioned code. To get extra specific, that code comes in the form of a runtime. Or an engine, but “engine engineering” doesn’t quite roll off the tongue the same way.</p>
<p>Runtime engineering owns the things a loop needs when it becomes real infrastructure:</p>
<ul>
<li>durable queues</li>
<li>workflow plans</li>
<li>stage contracts</li>
<li>runner adapters</li>
<li>connector permissions</li>
<li>tool and usage governance</li>
<li>recovery policies</li>
<li>operator controls</li>
<li>evidence schemas</li>
<li>run artifacts</li>
<li>completion semantics</li>
</ul>
<p>You might notice some of that overlaps with harness engineering, and you’d be right. I also believe I mentioned that higher abstraction layers do not negate what’s underneath. Exhibit A.</p>
<p>Put simply: A loop says to keep going, and how to keep going. A runtime says what can run, why it can run, what evidence it must produce, what happens when it fails, who can intervene, and what counts as done.</p>
<p>You’ll notice how much more the runtime says. That’s because it has to manage that much more.</p>
<p>It is also why the word “orchestration” never quite fit for Millrace. Orchestration is clearly part of the job, but it is not the core. The core is runtime authority.</p>
<h2 id="why-millrace-exists" tabindex="-1"><a class="header-anchor" href="#why-millrace-exists">Why Millrace exists</a></h2>
<p>Millrace is my first serious implementation of runtime engineering. It might even be the first explicit public implementation of runtime engineering in general.</p>
<p>It ships with LAD, Lean Agentic Development, as its most tested software-development workflow. LAD is one loop family. It has stages, roles, verification, recovery, and closure behavior designed around getting software work done with agents.</p>
<p>But LAD is completely optional.</p>
<p>Originally, Millrace was built as a way to automate LAD as reliably as possible. I had more or less accomplished that goal in April.</p>
<p>Logically, the next step was to cleanly support additional configurability to make it useful for others. It was not long before I began wondering if it’d be able to automate any kind of bounded, defined workflow with the same level of governance, coding or otherwise. Several sprawling refactors later, I found my answer.</p>
<p>Millrace can turn a sufficiently specified and validated workflow into a durable agentic pipeline by representing it as a decision tree. The workflow becomes compiled graph authority, work enters queues, stages run through configured runners, and generated artifacts are persisted.</p>
<p>Autonomous self-recovery is part of the system. Operators can inspect or intervene if necessary. Closure is based on evidence, not a model saying “looks good to me” and wandering away with a little bow and a smirk on its face because it knows it just lied.</p>
<p>I discovered that many of the projects tagged “loop-engineering” offered features Millrace did not, despite how much it does offer. OpenCode integration, connectors, verticalized workflows, custom tooling. For a few seconds, I was worried that others were onto the same thing as me.</p>
<p>But only a few seconds.</p>
<p>Although some of them looked similar topologically, none of them had remotely comparable underlying architecture. Their workflows were opinionated, designed with a narrow goal in mind, and they still didn’t feature the same level of governance that Millrace did.</p>
<p>If I wanted to copy a workflow I particularly liked, it’d be trivial. Identify each step, add the testing/tooling to the agent stages, define it all as graph data, validate it with the compiler, and boom. Now that workflow runs inside Millrace.</p>
<p>On the other hand, if one of the other more serious frameworks wanted LAD, they’d have to basically rebuild their entire product to support every behavior it offers.</p>
<p>In Millrace, custom workflows are expressions of the runtime. Added connectors are declared in the graph data. A new harness runner is a simple extension. Supporting integrations is table stakes.</p>
<p>Not by copying everything into the core, but by making the core the place those things compile.</p>
<h2 id="this-is-why-the-category-matters" tabindex="-1"><a class="header-anchor" href="#this-is-why-the-category-matters">This is why the category matters</a></h2>
<p>Categories are annoying until they fit. Usually, categories fit.</p>
<p>Before loop engineering was a phrase, I had a hard time explaining why Millrace felt different from generic orchestration. Once loop engineering became legible, it became obvious that Millrace was working on loops.</p>
<p>Then the competitor research made the next gap obvious.</p>
<p>Most of the public loop engineering world is still focused on making individual loops work. Millrace is focused on making loops manageable as durable systems.</p>
<p>That is runtime engineering.</p>
<p>As of writing this, <code>runtime-engineering</code> was not an established GitHub topic. I added it to Millrace because the term described the thing better than the existing buckets did. And now it’s an established GitHub topic.</p>
<p>Obviously, that is not proof of anything by itself. Unless you’ve got a dedicated audience of thousands or more, being the first to type a tag is not a business model, as tragic as that is.</p>
<p>But, it’s a useful timestamp. The work exists before the category does.</p>
<h2 id="the-bottom-line" tabindex="-1"><a class="header-anchor" href="#the-bottom-line">The bottom line</a></h2>
<p>Loop engineering is real.</p>
<p>It is also not the end of the stack.</p>
<p>The future of agent work is not just better prompts, better context, better harnesses, more loops, or loops inside of loops.</p>
<p>The future is runtime engineering; reliably automating the management of multiple agent loops.</p>
<p>That means runtime state, runtime authority, runtime,… you get the picture.</p>
<p>Millrace is my attempt to build the first example of that layer in public.</p>
<p>If loop engineering is about making agents keep working, runtime engineering is about making that work safe to trust, inspect, recover, and finish.</p>
<p>That is the part I believe comes next.</p>
]]></content:encoded>
  </item>
  <item>
    <title>Naive loops aren&apos;t the solution to loop engineering. Governed loops are.</title>
    <description>Naive agent loops are useful, but reliable long-running agent work needs deterministic runtime judgment.</description>
    <link>https://millrace.ai/blog/naive-loops-arent-the-solution-to-loop-engineering-governed-loops-are/</link>
    <guid>https://millrace.ai/blog/naive-loops-arent-the-solution-to-loop-engineering-governed-loops-are/</guid>
    <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
    <author>Tim Osterhus</author>
    <category>agents</category>
    <category>millrace</category>
    <category>loops</category>
    <content:encoded><![CDATA[<p>If you’ve been on AI Twitter or the broader agent-builder internet recently, you’ve probably seen the loop engineering discourse.</p>
<p>Peter Steinberger, the man behind OpenClaw, said he does not prompt anymore.</p>
<p>He writes loops, and then those loops prompt his agents.</p>
<p>Boris Cherny made a similar point. Within a couple days, half of AI Twitter decided that loop engineering was the new big thing.</p>
<p>For some context, in case loops are new to you: in July 2025, a developer named Geoff Huntley published Ralph, named after the Simpsons character Ralph Wiggum.</p>
<p>Ralph is a one-line bash loop that starts an agent. The agent receives fresh context every run, then stores memory to disk at the end of the run so the next agent knows what to do.</p>
<p>At first, not many people cared. Then in January, the whole thing went viral.</p>
<p>Twenty thousand GitHub stars. Dozens of explainers. Headlines. The whole nine yards.</p>
<p>A few months later, both Codex and Claude Code shipped <code>/goal</code> natively. Recently, I’ve seen at least five different posts and explainers talking about loop engineering and loops as though the whole concept just spawned out of the mist.</p>
<p>Here’s the thing.</p>
<p>For every “loops are the future” post, there is another post calling out all the issues that happen with agent loops.</p>
<p>Loops burn tokens. They make confident wrong assumptions. They ship slop. They are too unreliable.</p>
<p>And as someone who has been making and working with custom loops since December, I agree with the skeptics.</p>
<p>About one kind of loop.</p>
<p>I am going to give that kind of loop a name: naive loops.</p>
<p>I mean naive in the same way as naive RAG. It means a simple, obvious first iteration. Not that it is stupid, although some critics might say that it is.</p>
<p>It is just the basic version.</p>
<p>Trigger, run, check, repeat.</p>
<p>Ad infinitum. The same prompt over and over again.</p>
<p>Ralph is a naive loop. <code>/goal</code> is a naive loop. Automations, cron jobs, and scheduled routines are naive loops too. They are real, and they have legit use cases. I use automations and cron jobs.</p>
<p>But they all share the same failure modes.</p>
<p>There are more than five, but for the sake of simplicity, we are going to pretend there are five.</p>
<p>If you’ve used agent loops before, you are probably personally familiar with each of them.</p>
<h2 id="token-burn" tabindex="-1"><a class="header-anchor" href="#token-burn">Token burn</a></h2>
<p>The first failure mode is token burn.</p>
<p>The loop fires again whether or not the last pass moved anything.</p>
<p>That is because nothing decides whether rerunning is justified or just a waste of tokens. You can set the loop to run a certain number of times so it does not keep running forever with no progress, but that is just an arbitrary cap you set ahead of time.</p>
<p>That cap is not judgment. It is a kitchen timer.</p>
<p>Helpful, sometimes.</p>
<p>Not the same thing.</p>
<h2 id="assumption-drift" tabindex="-1"><a class="header-anchor" href="#assumption-drift">Assumption drift</a></h2>
<p>Assumption drift might be the most well-known problem.</p>
<p>Any ambiguity in your spec gets exaggerated in a loop. Nothing decides whether the spec was actually executable before execution, so agents fill in the gaps with less-than-great guesswork.</p>
<p>Then the loop keeps going.</p>
<p>The bad assumption does not stay local. It becomes the floor for the next run. Then the next run builds on it. Then the next run explains why the new weird thing is actually consistent with the previous weird thing.</p>
<p>Very thoughtful.</p>
<p>Still wrong.</p>
<h2 id="bad-persistence" tabindex="-1"><a class="header-anchor" href="#bad-persistence">Bad persistence</a></h2>
<p>The loop does need persistent memory, but nothing decides what earns that persistence.</p>
<p>So the bad assumptions get remembered along with the useful insights. The memory layer does not know the difference between “we learned something important” and “the agent got confused but wrote it down confidently.”</p>
<p>That creates compounding slop.</p>
<p>Persistent memory is not automatically good. Persistent memory is only useful if something decides what deserves to persist.</p>
<h2 id="cognitive-debt" tabindex="-1"><a class="header-anchor" href="#cognitive-debt">Cognitive debt</a></h2>
<p>The sneakiest failure mode is probably cognitive debt.</p>
<p>It ships. All checks are green. Tests are passing. And you stopped understanding it 300 commits ago.</p>
<p>That happens because there is no record of how completion occurred. You got a check mark when you needed an audit trail.</p>
<p>You needed some way to inspect how the work got there, why the decisions were made, what failed, what got patched, and what got accepted as done.</p>
<p>Instead, you got:</p>
<blockquote>
<p>Tests are passing.</p>
</blockquote>
<p>Cool.</p>
<p>Terrifying.</p>
<h2 id="no-recovery-mechanism" tabindex="-1"><a class="header-anchor" href="#no-recovery-mechanism">No recovery mechanism</a></h2>
<p>Finally, there is no real recovery mechanism.</p>
<p>Nothing decides what happens after a failure.</p>
<p>So when you wake up to a codebase that does not compile and a loop that has been spiraling for several hours, the recovery system is you, after the fact, reverting to the last known good commit from before you started the loop in the first place.</p>
<p>Pretty advanced stuff.</p>
<p>Notice the pattern here.</p>
<p>There are five failures, all caused by one main issue:</p>
<p>Nothing is deciding.</p>
<p>Vital decisions are being made arbitrarily beforehand, by the agent in the moment, or by nobody.</p>
<p>Naive loops do not lack intelligence.</p>
<p>They lack consistent, reliable judgment.</p>
<p>That is where governed loops come in.</p>
<h2 id="what-governed-means" tabindex="-1"><a class="header-anchor" href="#what-governed-means">What governed means</a></h2>
<p>While this whole loop debate was happening, I was running a little experiment on <a href="http://crates.io">crates.io</a> from April to now.</p>
<p>This is Millrace AI, an agentic runtime written in Rust.</p>
<p>Millrace AI is generated by a governed loop, not a naive loop. Each release I tried worked. No human or agent touched the Rust code generated by the pipeline. It is now maintained by a completely autonomous governed loop.</p>
<p>But before that matters, you need to know what governed means.</p>
<p>Start with a standard coding workflow.</p>
<p>You collaborate with an agent and write a spec. You tell the agent to implement it. You tell it to run a code review. It finds issues. You tell it to fix those issues. It fixes them. You tell it to run tests. The tests show something is broken, so you tell it to patch what broke.</p>
<p>Eventually the work seems complete and the tests are passing. Just to double check, you ask the agent if there are any gaps between what got implemented and the original spec.</p>
<p>If there are, rinse and repeat.</p>
<p>Nobody is trusting an agent to complete that whole managed workflow with a naive loop.</p>
<p>Nobody is trusting an AI to do legitimate agentic engineering by simply running:</p>
<blockquote>
<p>Same prompt. Again. Good luck.</p>
</blockquote>
<p>The decisions are simple, but agents still are not reliable enough over time to make the right decision at every seam.</p>
<p>They need deterministic governance.</p>
<p>And in the normal workflow, that governance is you. You are executing a repeatable decision process by hand.</p>
<p>That is the insight governed loops are built on.</p>
<p>Look at what you are doing at every point.</p>
<p>A package dependency suddenly is not on <code>PATH</code> after the latest Windows update, so you ask an agent what happened.</p>
<p>Tests fail after a task, so you ask an agent for a targeted patch plan.</p>
<p>All the tasks are done, so you prompt an agent to check the implementation against the spec.</p>
<p>Well, at least you should.</p>
<p>Every one of those interventions is deterministic in when it fires and standardizable in what gets asked.</p>
<p>The condition is mechanical.</p>
<p>The prompt is a template.</p>
<p>So why are you the one running it?</p>
<p>Make the troubleshooter stage. Make the patch-plan stage. Make the closure-check stage. Then automate the stages.</p>
<p>All of that collapses into one sentence:</p>
<p>If you can draw the decision tree, you can govern the loop.</p>
<p>And that is what Millrace is.</p>
<h2 id="what-millrace-does-differently" tabindex="-1"><a class="header-anchor" href="#what-millrace-does-differently">What Millrace does differently</a></h2>
<p>Millrace has one deterministic tick loop at the core.</p>
<p>Every tick, the scheduler looks at the state of the work: what is claimed, what is blocked, what is closed. Then it routes to the next step.</p>
<p>Planning. Execution. Closure. Idle. Whatever is legal.</p>
<p>Agents run inside stages with typed contracts.</p>
<p>Three things matter here.</p>
<p>First, every stage is a brand new run. The agent starts with fresh context every time a new stage starts.</p>
<p>Second, state lives on disk. Not in a chat thread. Not in a context window being compacted over and over again.</p>
<p>Third, the decisions are made by the runtime.</p>
<p>Good old-fashioned code.</p>
<p>The same every time.</p>
<p>Agents do the work. The runtime decides what is next.</p>
<p>If you have seen the Ralph advocates, none of this should seem foreign. The community already discovered these issues the hard way.</p>
<p>“One task per loop” is a frozen compiled plan in Millrace. It is one of the main features.</p>
<p>“The tests decide what is real” is also a first-class feature. In Millrace, that is called a proof contract.</p>
<p>Those rules you add to <code>CLAUDE.md</code> after the agent makes a mistake, probably written in all caps? In Millrace, a mistake can spawn an agent to update relevant skills so the mistake is less likely to repeat.</p>
<p>The morning-after rescue prompt? Millrace handles that too, with different recovery mechanisms depending on the specific type of problem encountered.</p>
<p>It turns the patchwork of loop discipline into first-class behavior inside a programmatic engine.</p>
<p>That is the difference.</p>
<h2 id="the-part-most-people-missed-about-%2Fgoal" tabindex="-1"><a class="header-anchor" href="#the-part-most-people-missed-about-%2Fgoal">The part most people missed about <code>/goal</code></a></h2>
<p>There is a part of this story that most people do not talk about.</p>
<p>When the labs shipped <code>/goal</code>, they shipped Ralph’s persistence, but they did not ship arguably the most important part.</p>
<p><code>/goal</code> runs one ever-growing thread that continually compacts over time.</p>
<p>The context rots.</p>
<p>The original Ralph insight was the opposite: wipe the agent every pass and keep memory on disk.</p>
<p>Millrace keeps that insight.</p>
<p>It runs a new agent every stage against durable state on disk, in both machine-readable and human-readable formats.</p>
<p>The important state does not depend on a single thread surviving compaction gracefully.</p>
<p>And when every agent starts fresh, context rot inside one ever-growing session stops being the failure mode.</p>
<p>That is not flashy.</p>
<p>Pretty handy.</p>
<h2 id="the-level-5-dark-factory-part" tabindex="-1"><a class="header-anchor" href="#the-level-5-dark-factory-part">The Level 5 Dark Factory part</a></h2>
<p>Dan Shapiro popularized the term “Level 5 Dark Factory” in January. In his framing, it means the AI defines implementation, writes code, tests, fixes bugs, and ships.</p>
<p>Nobody is trusting a naive loop to do that reliably.</p>
<p>On the other hand, I have been running a dark factory on my desktop for over a month, using a single ChatGPT Pro subscription.</p>
<p>That is the power of a governed loop.</p>
<p>Back to the Python-to-Rust port.</p>
<p>For the original port, Codex manually queued eight small prompts, roughly 30 lines each, all at once. The runtime ensured those prompts were received in order so they did not disrupt existing work.</p>
<p>Each prompt got processed only after the previous prompt was completed.</p>
<p>From those prompts, Millrace generated 11 specs and 57 tasks. It autonomously recovered from two separate blockers.</p>
<p>That first run took 28 hours of runtime and 727 million input tokens, but over 95% of that was cached.</p>
<p>For the first run, the preliminary setup, initial prompts, publishing, documentation, and packaging were manual.</p>
<p>The generated code was 100% done by Millrace.</p>
<p>When Millrace finally ended, the resulting code just worked. It was functionally on parity with the original version of Millrace.</p>
<p>But that is not the coolest part.</p>
<p>Once the Rust runtime existed, I configured Millrace into a maintenance loop.</p>
<p>It now detects a new Python release, generates parity work, implements that work, writes tests for that work, and repairs gaps the first agent missed.</p>
<p>Once all the work is completed, the Arbiter agent decides whether the completed work actually satisfies the original goal.</p>
<p>If it does not, it creates a remediation spec that articulates the gaps and runs that remediation spec through Millrace again.</p>
<p>If it does satisfy the original spec, a programmatic release gate runs the checks and publishes.</p>
<p>Twelve releases were shipped that way.</p>
<p>Half of them while I was asleep.</p>
<p>Now I use the Rust runtime to dogfood the original Python framework.</p>
<h2 id="the-receipts" tabindex="-1"><a class="header-anchor" href="#the-receipts">The receipts</a></h2>
<p>Two things are worth noticing.</p>
<p>First, there have been no non-functional deployments released as far as I have checked. The Arbiter has been sufficient to keep broken builds from shipping so far.</p>
<p>Obviously, it can still happen.</p>
<p>Let me be clear about that. This is not magic. It is a governed release path with receipts.</p>
<p>Second, and this is my favorite part, the evidence repo updates itself.</p>
<p>The evidence logging runs through the same pipeline it documents.</p>
<p>I feel like that is a pretty good example of true autonomy.</p>
<p>Do not just take my word for it. The public evidence repo has sanitized log bundles, generated metrics, checksums, a redaction policy, and a verifier script. If you are skeptical, you can check it for yourself.</p>
<p>Everything I am talking about is publicly available and open source under Apache-2.0.</p>
<h2 id="what-governed-loops-do-not-solve-yet" tabindex="-1"><a class="header-anchor" href="#what-governed-loops-do-not-solve-yet">What governed loops do not solve yet</a></h2>
<p>Here is what governed loops do not solve yet.</p>
<p>First, taste.</p>
<p>The README from the maintenance loop is just changelog slop. The loop wrote it. The loop maintains it. It is abhorrent.</p>
<p>Governance is not judgment, and I did not configure a custom README curator agent to fix this.</p>
<p>Millrace might be able to guarantee releases pass their contracts. I have not figured out how to guarantee taste yet.</p>
<p>Granted, I have not really worked on that either.</p>
<p>Second, generality.</p>
<p>The Python-to-Rust loop proves potential. It proves that autonomy can exist. It does not prove that this level of governance generalizes to every workflow.</p>
<p>Third, cost.</p>
<p>Millrace is pretty cost efficient considering it is a loop, but that does not mean it is cheap.</p>
<p>The main reason generalization has not been proven yet is because tokens are expensive and I am broke.</p>
<p>Running a wide variety of projects and evaluation suites costs a lot of tokens. I do not have the funds for that.</p>
<p>I know I just said generality is not proven, but I am going to backtrack a little bit.</p>
<p>Right now, the engine does not know the type of work being done. None of the runtime governance is Rust-specific or even code-specific.</p>
<p>Only the configured workflow is code-specific.</p>
<p>The version 0.20 release line is decoupling the core kernel from configuration data so that routing, scheduling, operations, and the rest are generic and pluggable.</p>
<p>The goal is to support making any type of workflow you can sufficiently specify into a workflow that Millrace can govern.</p>
<p>I am not quite there yet.</p>
<p>But I am close.</p>
<p>Mostly because I do not have enough tokens.</p>
<h2 id="naive-loops-still-have-their-place" tabindex="-1"><a class="header-anchor" href="#naive-loops-still-have-their-place">Naive loops still have their place</a></h2>
<p>Naive loops are not fake. They are not useless. They are not something everyone should stop using.</p>
<p>If you need a simple routine, scheduled automation, or disposable loop, use the simple thing.</p>
<p>But if you need a reliable workflow pipeline, you probably want something more sophisticated than Ralph Wiggum.</p>
<p>He is known for persistence.</p>
<p>Not his IQ.</p>
<p>That is the distinction I care about.</p>
<p>Naive loops do not lack intelligence. They lack consistent, reliable judgment.</p>
<p>Governed loops are what you get when you stop asking the agent to invent the workflow as it goes and start giving the workflow runtime authority.</p>
<p>Agents do the work.</p>
<p>The runtime decides what is next.</p>
<p>You can watch the companion YouTube video here: <a href="https://youtu.be/8XXt38nzU0w">Naive loops aren’t the solution to loop engineering. Governed loops are.</a></p>
]]></content:encoded>
  </item>
</channel>
</rss>
