<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://andrewmiracle.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://andrewmiracle.com/" rel="alternate" type="text/html" /><updated>2026-08-15T10:40:02+00:00</updated><id>https://andrewmiracle.com/feed.xml</id><title type="html">Andrew Miracle</title><subtitle>Product Generalist, Design Thinker, and AI Hacker building at the intersection of technology, design, and entrepreneurship.</subtitle><author><name>Andrew Miracle</name></author><entry><title type="html">My Loop Engineering Workflow</title><link href="https://andrewmiracle.com/2026/08/10/loop-engineering-with-an-agent-harness.html" rel="alternate" type="text/html" title="My Loop Engineering Workflow" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/08/10/loop-engineering-with-an-agent-harness</id><content type="html" xml:base="https://andrewmiracle.com/2026/08/10/loop-engineering-with-an-agent-harness.html"><![CDATA[<p>People ask me how I get agents to ship real work. They usually expect a prompt.</p>

<p>I don’t have a prompt. I have a triangle of loops.</p>

<p>Prompt engineering is about what you say to a model once. Loop engineering is about designing the cycles the model runs inside: how work enters, how it gets decomposed, how it executes, how it gets verified, and how the result feeds the next round. The prompt is maybe five percent of the outcome. The loops are the rest.</p>

<p>This is how my setup actually works today, from <a href="https://github.com/koolamusic/claudefiles">~/.claude</a> to a delivered pull request. No ideology. Just the machine I run every day.<label for="mn-1" class="sidenote-toggle">⊕</label><input type="checkbox" id="mn-1" class="sidenote-toggle" /><span class="marginnote">Project names in the examples are changed; the mechanics are exactly as run.</span></p>

<h2 id="the-triangle-of-loops">The triangle of loops</h2>

<p>My work runs on three nested loops, each operating at a different time scale:</p>

<ul>
  <li><strong>The session loop</strong>: one agent session, measured in hours. It opens with a written commission and closes with a structured closeout or a handoff document.</li>
  <li><strong>The sprint loop</strong>: one research → plan → execute → retro cycle, measured in days. My <a href="https://github.com/koolamusic/claudefiles/tree/main/plugins/jira">jira plugin</a> defines a sprint as exactly that: one research, plan, execute cycle, with review and retro for closing the loop.</li>
  <li><strong>The program loop</strong>: the long horizon, measured in weeks. A kickoff produces PROJECT.md and a phased ROADMAP.md; delivery programs decompose into packets.<label for="mn-2" class="sidenote-toggle">⊕</label><input type="checkbox" id="mn-2" class="sidenote-toggle" /><span class="marginnote">My v1 program ran nine packets; the v2 delivery program carries twenty plans across four phases.</span></li>
</ul>

<p>Session loops nest inside sprint loops. Sprint loops nest inside program loops. And here is the part that makes it a triangle instead of a stack: every loop, at every scale, runs the same grammar and shares the same start point and end point.</p>

<p>The grammar is a recursion:</p>

<p><strong>objective → execution → feedback → refined objective → execution → …</strong></p>

<p>The start point is always a written commission: that is the objective. The end point is always the same pair: ship only what passes verification, then a retro: that is the feedback. And the retro’s output is a refined objective, the next commission sharpened by what the feedback taught. That refinement step is why the loop converges instead of spinning.</p>

<figure class="figtri" role="img" aria-label="A triangle of three nested loops. The session loop at the top runs from commission to closeout over hours. The sprint loop at the bottom left runs research, plan, execute, retro over days. The program loop at the bottom right runs roadmap, packets, and delivery over weeks. Sessions nest inside sprints, sprints nest inside programs. At the center, the shared grammar: objective, execution, feedback, refined objective, execution, and so on.">
<svg viewBox="0 0 640 430" style="width:100%;height:auto;display:block" xmlns="http://www.w3.org/2000/svg">
<style>
.figtri text{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;fill:currentColor}
.figtri .box{fill:currentColor;opacity:.08}
.figtri .boxLine{stroke:currentColor;opacity:.35;fill:none}
.figtri .frame{stroke:currentColor;opacity:.35;fill:none;stroke-width:1.5}
.figtri .accent{stroke:#4f7a60;fill:none}
.figtri .accentTxt{fill:#4f7a60}
.figtri .mut{fill:currentColor;opacity:.78}
.figtri .dash{stroke:currentColor;opacity:.4;fill:none;stroke-dasharray:4 4}
.dark .figtri .accent{stroke:#8fc0a2}
.dark .figtri .accentTxt{fill:#8fc0a2}
</style>
<title>The triangle of loops: session, sprint, program, one grammar, one start and one end</title>
<defs><pattern id="tex-figtri" width="16" height="16" patternUnits="userSpaceOnUse"><circle cx="2" cy="2" r="1.1" fill="currentColor" opacity=".08" /><circle cx="10" cy="10" r="1.1" fill="currentColor" opacity=".05" /></pattern></defs>
<rect x="1" y="1" width="638" height="428" fill="currentColor" opacity=".03" />
<rect x="1" y="1" width="638" height="428" fill="url(#tex-figtri)" />
<rect class="frame" x="1" y="1" width="638" height="428" />
<path class="dash" d="M320 102 L121 326 M320 102 L519 326 M226 361 L414 361" />
<rect class="box" x="225" y="36" width="190" height="66" />
<rect class="accent" x="225" y="36" width="190" height="66" stroke-width="1.6" />
<text x="312" y="59" font-size="13.5" text-anchor="middle" font-weight="600">Session loop</text>
<text class="accentTxt" x="404" y="59" font-size="15" text-anchor="middle">&#8635;</text>
<text class="mut" x="320" y="77" font-size="11" text-anchor="middle">commission &#8594; closeout</text>
<text class="mut" x="320" y="93" font-size="10" text-anchor="middle">hours</text>
<rect class="box" x="16" y="326" width="210" height="70" />
<rect class="boxLine" x="16" y="326" width="210" height="70" />
<text x="110" y="349" font-size="13.5" text-anchor="middle" font-weight="600">Sprint loop</text>
<text class="accentTxt" x="212" y="349" font-size="15" text-anchor="middle">&#8635;</text>
<text class="mut" x="121" y="367" font-size="10.5" text-anchor="middle">research &#8594; plan &#8594; execute &#8594; retro</text>
<text class="mut" x="121" y="383" font-size="10" text-anchor="middle">days</text>
<rect class="box" x="414" y="326" width="210" height="70" />
<rect class="boxLine" x="414" y="326" width="210" height="70" />
<text x="508" y="349" font-size="13.5" text-anchor="middle" font-weight="600">Program loop</text>
<text class="accentTxt" x="610" y="349" font-size="15" text-anchor="middle">&#8635;</text>
<text class="mut" x="519" y="367" font-size="10.5" text-anchor="middle">roadmap &#8594; packets &#8594; delivery</text>
<text class="mut" x="519" y="383" font-size="10" text-anchor="middle">weeks</text>
<text class="mut" x="158" y="205" font-size="11" text-anchor="middle" transform="rotate(-48 158 205)">sessions nest inside sprints</text>
<text class="mut" x="482" y="205" font-size="11" text-anchor="middle" transform="rotate(48 482 205)">sprints nest inside programs</text>
<text class="accentTxt" x="320" y="222" font-size="13" text-anchor="middle" font-weight="600">objective &#8594; execution &#8594; feedback</text>
<text class="accentTxt" x="320" y="244" font-size="13" text-anchor="middle" font-weight="600">&#8594; refined objective &#8594; execution &#8594; &#8230;</text>
<text class="mut" x="320" y="272" font-size="11" text-anchor="middle">start: a written commission &#183; end: ship on PASS + retro</text>
</svg>
<figcaption class="mut" style="font-size:.85em;opacity:.8;text-align:center;margin-top:.5rem">Three loops, three time scales, one grammar, one start and one end.</figcaption>
</figure>

<p>Once you see the triangle, the rest of this article is just a tour of its parts: the harness the loops run on, the start point, the middle loop up close, the fork-join shape of execution, the gates at the end point, and the memory that makes nesting possible.</p>

<h2 id="the-harness-is-a-place-not-a-prompt">The harness is a place, not a prompt</h2>

<p>The loops run on infrastructure that lives in <a href="https://github.com/koolamusic/claudefiles">~/.claude</a>, and it is a versioned system, not a text file I paste around.</p>

<p>At the top is <a href="https://github.com/koolamusic/claudefiles/blob/main/CLAUDE.md">CLAUDE.md</a>, which I treat as an operating contract between me and any agent session. It encodes the rules I learned the hard way:</p>

<ul>
  <li><strong>Phased execution.</strong> Never attempt a multi-file refactor in a single pass. Finish phase one, run verification, wait for approval before phase two.</li>
  <li><strong>Forced verification.</strong> An agent is forbidden from reporting a task complete until it has run the project’s actual checks and fixed what they surface. If no checker is configured, it must say so instead of claiming success.</li>
  <li><strong>Failure recovery.</strong> If a fix fails twice, stop. Re-read the whole section, find where the mental model was wrong, and propose something fundamentally different. No third attempt at the same idea.</li>
</ul>

<p>Underneath the contract, <a href="https://github.com/koolamusic/claudefiles/blob/main/settings.json">settings.json</a> tunes the machine: acceptEdits as the default permission mode,<sup id="fnref:acceptedits"><a href="#fn:acceptedits" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> pre-approved permissions for the tools I trust, and all AI attribution stripped from commits and PRs.</p>

<p>And autoCompact stays disabled,<sup id="fnref:compaction"><a href="#fn:compaction" class="footnote" rel="footnote" role="doc-noteref">2</a></sup> because I manage context deliberately rather than letting it truncate silently.</p>

<p>Then there are the hooks.<sup id="fnref:hooks"><a href="#fn:hooks" class="footnote" rel="footnote" role="doc-noteref">3</a></sup> Around eighteen of them fire on session start, prompt submit, and before and after every tool call: a context monitor, a read guard, a commit validator, a statusline, and a <a href="https://github.com/koolamusic/claudefiles/blob/main/hooks/trust-monitor.sh">trust monitor</a> I’ll come back to. There are even audio cues, StarCraft-style WAVs on session start and stop. I can literally hear a session loop open and close.</p>

<p>The whole directory is versioned in <a href="https://github.com/koolamusic/claudefiles">its own repository</a> with an auto-updating plugin marketplace. When I migrated to a new server recently, the harness got zipped and cloned alongside my dotfiles, because the agent kit has to be portable or it isn’t real. Claude, Cursor, Kimi: the models swap, the harness stays.</p>

<h2 id="the-start-point-commissions-not-conversations">The start point: commissions, not conversations</h2>

<p>Every loop at every scale begins the same way: the objective enters as a written commission, never as a chat message.</p>

<p>A new session doesn’t get “hey can you fix this.” It gets a commission document, modeled on a real one from a data-platform project of mine:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&gt;</span> PLAN.md <span class="o">&lt;&lt;</span><span class="sh">'</span><span class="no">EOF</span><span class="sh">'
You are the delivery agent for pulse.rs F4 to F8.
Your commission is the master plan at ~/.context/northstar/project/MASTERPLAN.md.
READ IT FULLY FIRST. It is the contract; do not re-derive what it settles.
You OWN the workflow: decompose the mission into your own dynamic orchestration.
Subagents default to the cheaper model tier; spend the expensive one on the critical path.
Close out with evidence: branch, PR url, tests, blockers, next owner.
</span><span class="no">EOF
</span></code></pre></div></div>

<p>A commission names the mission, points at the contract document, separates what is settled from what is open, states the standing rules, and assigns ownership. After that I get out of the way. My go-signals are one word: “yes, push it.”</p>

<p>This is a deliberate inversion. Most people hold the objective in their head and drip-feed it to the agent. I write the objective down once, hand over ownership, and spend my attention on the gates instead of the steering wheel.</p>

<h2 id="the-middle-loop-up-close-from-jira-to-orchestrator">The middle loop, up close: from jira to orchestrator</h2>

<p>The sprint loop is where the triangle does its daily work, and it runs as a pipeline of skills, each with one job, each handing a verified artifact to the next:</p>

<ul>
  <li><a href="https://github.com/koolamusic/claudefiles/tree/main/skills/kickoff">/kickoff</a> turns an empty repo into a working project: PROJECT.md, a phased ROADMAP.md, jira and the project’s context layer initialized. Kickoff is alignment, not automation.</li>
  <li><a href="https://github.com/koolamusic/claudefiles/tree/main/skills/grill">/grill</a> is adversarial Q&amp;A. In stress-test mode it attacks a plan one question at a time until the holes surface, ranked BLOCKER, RISK, or NITPICK. In shape mode it co-creates two or three approaches and converges to a decision log. Nothing enters a sprint un-grilled.</li>
  <li><a href="https://github.com/koolamusic/claudefiles/tree/main/plugins/jira">/jira:research and /jira:plan</a> turn a grilled idea into a sprint. A planner agent drafts the plan, an independent plan-checker<sup id="fnref:planchecker"><a href="#fn:planchecker" class="footnote" rel="footnote" role="doc-noteref">4</a></sup> agent audits it, and the loop allows a maximum of two revisions before it escalates to me.</li>
  <li><a href="https://github.com/koolamusic/claudefiles/tree/main/plugins/jira">/jira:execute</a> fans the plan out to wave-parallel<sup id="fnref:wave"><a href="#fn:wave" class="footnote" rel="footnote" role="doc-noteref">5</a></sup> executor agents with explicit file ownership.</li>
  <li>The first gate is a Nyquist test gate,<label for="sn-6" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-6" class="sidenote-toggle" /><span class="sidenote">Named for the Nyquist–Shannon sampling theorem: sample a signal too sparsely and you reconstruct the wrong one. The gate samples the change surface with tests dense enough to reconstruct what was actually built, and catch where it aliases away from what was asked.</span> run against the executor output right after execution.</li>
  <li>The second is a goal-backward verifier<sup id="fnref:goalbackward"><a href="#fn:goalbackward" class="footnote" rel="footnote" role="doc-noteref">6</a></sup> that checks the work against the original intent. A PR opens only on PASS.</li>
  <li><a href="https://github.com/koolamusic/claudefiles/tree/main/plugins/jira">/jira:retro</a> closes the loop and rolls the workflow lessons into the next commission.</li>
</ul>

<p>A typical instruction from me looks like this:</p>

<blockquote>
  <p>Spin all of these into a new /jira:research and sprint named pulse.rs.alpha, plan them, drop the user-facing issues for each, then implement a /loop to execute and deliver all of them.</p>
</blockquote>

<figure class="fig" role="img" aria-label="The sprint loop as a delivery pipeline. Work flows from commission to research to plan, which has a planner and plan-checker audit loop capped at two revisions, then to wave-parallel execution, then a verification gate that only opens a pull request on PASS, then ship. A dashed FAIL arrow returns failed work to the start, and a dashed retro arrow carries learnings from ship back to the next commission.">
<svg viewBox="0 0 640 330" style="width:100%;height:auto;display:block" xmlns="http://www.w3.org/2000/svg">
<style>
.fig text{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
.fig .box{fill:currentColor;opacity:.08}
.fig .boxLine{stroke:currentColor;opacity:.35;fill:none}
.fig .frame{stroke:currentColor;opacity:.35;fill:none;stroke-width:1.5}
.fig .accent{stroke:#4f7a60;fill:none}
.fig .accentFill{fill:#4f7a60}
.fig .lbl{fill:currentColor}
.fig .mut{fill:currentColor;opacity:.78}
.fig .accentTxt{fill:#4f7a60}
.fig .dash{stroke:currentColor;opacity:.4;fill:none;stroke-dasharray:4 4}
.dark .fig .accent{stroke:#8fc0a2}
.dark .fig .accentFill{fill:#8fc0a2}
.dark .fig .accentTxt{fill:#8fc0a2}
</style>
<title>The sprint loop: commission to ship, with FAIL and retro feedback</title>
<defs><pattern id="tex-fig" width="16" height="16" patternUnits="userSpaceOnUse"><circle cx="2" cy="2" r="1.1" fill="currentColor" opacity=".08" /><circle cx="10" cy="10" r="1.1" fill="currentColor" opacity=".05" /></pattern></defs>
<rect x="1" y="1" width="638" height="328" fill="currentColor" opacity=".03" />
<rect x="1" y="1" width="638" height="328" fill="url(#tex-fig)" />
<rect class="frame" x="1" y="1" width="638" height="328" />
<rect class="box" x="20" y="60" width="90" height="44" />
<rect class="boxLine" x="20" y="60" width="90" height="44" />
<text class="lbl" x="65" y="86" font-size="12.5" text-anchor="middle">Commission</text>
<rect class="box" x="124" y="60" width="86" height="44" />
<rect class="boxLine" x="124" y="60" width="86" height="44" />
<text class="lbl" x="167" y="86" font-size="12.5" text-anchor="middle">Research</text>
<rect class="box" x="224" y="60" width="86" height="44" />
<rect class="boxLine" x="224" y="60" width="86" height="44" />
<text class="lbl" x="267" y="86" font-size="12.5" text-anchor="middle">Plan</text>
<rect class="box" x="324" y="46" width="110" height="20" />
<rect class="accent" x="324" y="46" width="110" height="20" />
<rect class="box" x="324" y="72" width="110" height="20" />
<rect class="accent" x="324" y="72" width="110" height="20" />
<rect class="box" x="324" y="98" width="110" height="20" />
<rect class="accent" x="324" y="98" width="110" height="20" />
<text class="accentTxt" x="379" y="137" font-size="11.5" text-anchor="middle">wave-parallel executors</text>
<rect class="box" x="448" y="60" width="86" height="44" />
<rect class="accent" x="448" y="60" width="86" height="44" stroke-width="1.6" />
<text class="lbl" x="491" y="79" font-size="12.5" text-anchor="middle">Verify</text>
<text class="lbl" x="491" y="94" font-size="12.5" text-anchor="middle">gate</text>
<rect class="box" x="548" y="60" width="72" height="44" />
<rect class="boxLine" x="548" y="60" width="72" height="44" />
<text class="lbl" x="584" y="86" font-size="12.5" text-anchor="middle">Ship</text>
<path class="dash" d="M110 82 L124 82 M210 82 L224 82 M310 82 L324 82 M434 82 L448 82 M534 82 L548 82" />
<path class="dash" d="M224 118 L224 160 L267 160 L267 104" />
<text class="mut" x="196" y="178" font-size="11.5">planner &#8646; plan-checker, max 2 revisions</text>
<path class="dash" d="M491 104 L491 150 L65 150 L65 104" />
<text class="mut" x="278" y="146" font-size="11.5" text-anchor="middle">FAIL: back to the work</text>
<text class="accentTxt" x="491" y="137" font-size="11.5" text-anchor="middle">PR only on PASS</text>
<path class="dash" d="M584 104 L584 250 L65 250 L65 104" />
<text class="mut" x="330" y="243" font-size="12" text-anchor="middle">/jira:retro &#183; learnings feed the next commission</text>
</svg>
<figcaption class="mut" style="font-size:.85em;opacity:.8;text-align:center;margin-top:.5rem">The sprint loop. Nothing ships without the gate; nothing repeats without the retro.</figcaption>
</figure>

<p>Two things to notice. First, the audit loops are bounded: two revisions on a plan, two attempts on a fix, then a human gets pulled in. Unbounded loops are how agents burn hours polishing a wrong answer. Second, every handoff between stages is a document, not a conversation. Documents survive context windows. Conversations don’t.</p>

<h2 id="the-orchestrator-never-writes-code">The orchestrator never writes code</h2>

<p>Wrapped around the sprint loop is my longest-running session pattern: orchestrator mode.</p>

<p><a href="https://github.com/koolamusic/claudefiles/tree/main/skills/orchestrator">/orchestrator on</a> turns the current session into a coordination-only thread, a chief of staff. From that moment it never implements anything locally. It classifies every request, and per-branch work gets routed to a durable background child agent keyed by branch. The same child stays alive for the life of that branch, so it accumulates context instead of starting cold. Children that touch code run in isolated git worktrees<label for="sn-8" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-8" class="sidenote-toggle" /><span class="sidenote">A git feature that checks out a second branch into a separate directory backed by the same repository. Two agents can edit two branches at the same time without ever seeing each other’s files, and merging stays an ordinary git operation.</span> so they can’t collide.</p>

<p>The orchestrator maintains a branch table: branch, child agent, status, next action. It restates that table at every status check, which looks redundant until you realize why: restatement is how state survives context compaction. Anything that isn’t restated or written down eventually evaporates.</p>

<p>For one-shot fan-outs there is <a href="https://github.com/koolamusic/claudefiles/tree/main/skills/spawn">/spawn</a>: parse a plan into units with explicit file ownership, group them into dependency waves, present the dispatch plan, wait for my approval, then execute each wave in parallel. Its hard rule is the same as the orchestrator’s: you coordinate, you never write application code.</p>

<p>Every child closes out with a structured report: branch, PR URL, test results, blockers, next owner. That closeout is the end of one session loop and the raw material for my status checks.</p>

<figure class="fig2" role="img" aria-label="The orchestrator pattern. The operator hands a commission to an orchestrator session that coordinates and never implements. The orchestrator keeps a branch table and routes work to three durable child agents, one per branch, each in its own git worktree. Each child produces a pull request and a structured closeout.">
<svg viewBox="0 0 640 380" style="width:100%;height:auto;display:block" xmlns="http://www.w3.org/2000/svg">
<style>
.fig2 text{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;fill:currentColor}
.fig2 .box{fill:currentColor;opacity:.08}
.fig2 .boxLine{stroke:currentColor;opacity:.35;fill:none}
.fig2 .frame{stroke:currentColor;opacity:.35;fill:none;stroke-width:1.5}
.fig2 .accent{stroke:#4f7a60;fill:none}
.fig2 .accentFill{fill:#4f7a60}
.fig2 .accentTxt{fill:#4f7a60}
.fig2 .mut{fill:currentColor;opacity:.78}
.fig2 .dash{stroke:currentColor;opacity:.4;fill:none;stroke-dasharray:4 4}
.dark .fig2 .accent{stroke:#8fc0a2}
.dark .fig2 .accentFill{fill:#8fc0a2}
.dark .fig2 .accentTxt{fill:#8fc0a2}
</style>
<title>Orchestrator routing: one coordinator, branch-keyed children</title>
<defs><pattern id="tex-fig2" width="16" height="16" patternUnits="userSpaceOnUse"><circle cx="2" cy="2" r="1.1" fill="currentColor" opacity=".08" /><circle cx="10" cy="10" r="1.1" fill="currentColor" opacity=".05" /></pattern></defs>
<rect x="1" y="1" width="638" height="378" fill="currentColor" opacity=".03" />
<rect x="1" y="1" width="638" height="378" fill="url(#tex-fig2)" />
<rect class="frame" x="1" y="1" width="638" height="378" />
<rect class="box" x="240" y="24" width="160" height="40" />
<rect class="boxLine" x="240" y="24" width="160" height="40" />
<text x="320" y="48" font-size="13" text-anchor="middle">Operator (me)</text>
<rect class="box" x="170" y="100" width="300" height="52" />
<rect class="accent" x="170" y="100" width="300" height="52" stroke-width="1.6" />
<text x="320" y="123" font-size="13" text-anchor="middle" font-weight="600">Orchestrator session</text>
<text class="mut" x="320" y="140" font-size="11.5" text-anchor="middle">coordinates &#183; never implements</text>
<path class="dash" d="M320 64 L320 100" />
<text class="mut" x="338" y="86" font-size="11.5">commission</text>
<rect class="dash" x="486" y="96" width="140" height="60" />
<text class="mut" x="556" y="120" font-size="11" text-anchor="middle">branch table,</text>
<text class="mut" x="556" y="136" font-size="11" text-anchor="middle">restated every check</text>
<path class="dash" d="M470 126 L486 126" />
<path class="dash" d="M220 152 L120 196 M320 152 L320 196 M420 152 L520 196" />
<rect class="box" x="50" y="196" width="150" height="56" />
<rect class="boxLine" x="50" y="196" width="150" height="56" />
<text x="125" y="219" font-size="12" text-anchor="middle">child: pulse.rs</text>
<text class="mut" x="125" y="237" font-size="11" text-anchor="middle">own worktree</text>
<rect class="box" x="245" y="196" width="150" height="56" />
<rect class="boxLine" x="245" y="196" width="150" height="56" />
<text x="320" y="219" font-size="12" text-anchor="middle">child: core-api</text>
<text class="mut" x="320" y="237" font-size="11" text-anchor="middle">own worktree</text>
<rect class="box" x="440" y="196" width="150" height="56" />
<rect class="boxLine" x="440" y="196" width="150" height="56" />
<text x="515" y="219" font-size="12" text-anchor="middle">child: docs</text>
<text class="mut" x="515" y="237" font-size="11" text-anchor="middle">own worktree</text>
<path class="dash" d="M125 252 L125 290 M320 252 L320 290 M515 252 L515 290" />
<rect class="accentFill" x="85" y="290" width="80" height="26" />
<rect class="accentFill" x="280" y="290" width="80" height="26" />
<rect class="accentFill" x="475" y="290" width="80" height="26" />
<text x="125" y="307" font-size="12" text-anchor="middle" fill="#fff">PR</text>
<text x="320" y="307" font-size="12" text-anchor="middle" fill="#fff">PR</text>
<text x="515" y="307" font-size="12" text-anchor="middle" fill="#fff">PR</text>
<text class="mut" x="320" y="352" font-size="11.5" text-anchor="middle">every child closes out: branch &#183; PR url &#183; tests &#183; blockers &#183; next owner</text>
</svg>
<figcaption class="mut" style="font-size:.85em;opacity:.8;text-align:center;margin-top:.5rem">One coordinator, durable branch-keyed children, isolated worktrees, structured closeouts.</figcaption>
</figure>

<p>This scales further than you’d expect. A docs-site rewrite of mine ran as an orchestrator plus a seven-phase loop with named child agents, including an independent design-critic agent whose only job was reviewing screenshots for a second opinion. The orchestrator relayed each child’s commits, verification results, and deviations back to me in tables, because I ask for evidence over prose.</p>

<h2 id="execution-is-fork-join">Execution is fork-join</h2>

<p>The execution edge of the grammar has its own shape, and it comes straight out of parallel computing: the <a href="https://en.wikipedia.org/wiki/Fork%E2%80%93join_model">fork-join model</a>.<label for="sn-9" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-9" class="sidenote-toggle" /><span class="sidenote">The fork-join model comes out of parallel computing. Doug Lea’s Fork/Join framework in Java 7 is the canonical implementation, and Cilk popularized the pattern before it. The shape is universal: split, run concurrently, join.</span> A program forks into parallel tasks, workers run concurrently, and a join barrier collects the results before the program continues. My harness runs the same pattern, with four distinctions that matter more than the similarity.</p>

<p><strong>The fork is a dispatch plan, not a thread pool.</strong> Classic fork-join forks eagerly: split until the tasks are small enough, then let the runtime schedule them. I fork deliberately. <a href="https://github.com/koolamusic/claudefiles/tree/main/skills/spawn">/spawn</a> parses a plan into units with explicit file ownership, groups them into dependency waves, presents the dispatch plan, and waits for my approval before anything runs. One wave forks, joins, and only then does the next wave fork. The fork is a decision, not a default.</p>

<p><strong>The workers are durable and named, not anonymous.</strong> A fork-join pool is anonymous workers stealing tasks from a queue. My children are the opposite: keyed by branch, alive for the life of that branch, accumulating context, each in its own git worktree. The shared-state hazard that fork-join frameworks spend so much effort containing never materializes, because ownership is assigned at the fork instead of negotiated during execution.</p>

<p><strong>The join is a gate, not a barrier.</strong> A join barrier waits for results and merges them. My join asks a harder question: do these results deserve to exist? The wave’s output goes through the Nyquist test gate, then the goal-backward verifier, and a PR opens only on PASS. <a href="https://github.com/koolamusic/claudefiles/tree/main/skills/spawn">/spawn</a> verifies by reading the git log, not by trusting what the children report. The join doesn’t merge output. It merges confidence.</p>

<p><strong>The serial part moved, it didn’t shrink.</strong> Amdahl’s law caps every fork-join system:<label for="sn-10" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-10" class="sidenote-toggle" /><span class="sidenote">Gene Amdahl, “Validity of the Single Processor Approach to Achieving Large Scale Computing Capabilities” (1967). The serial fraction of any workload caps its parallel speedup, no matter how many workers you add.</span> you can only speed up the parallel fraction, and the serial remainder sets the ceiling. Generation parallelized; verification did not. So the math I laid out in <a href="/2026/07/11/scope-compression-hypothesis.html">The Scope Compression Hypothesis</a> holds inside every loop: generation ≈ max (task time), but delivery ≈ generation + verification. Fork-join doesn’t eliminate the serial work. It concentrates it at the join, which is exactly where my gates live.</p>

<p>And the pattern nests the same way the triangle does. The program loop forks sprints. The sprint loop forks waves. The session loop forks subagents. Fork-join at every scale, with a gate at every join.</p>

<h2 id="the-end-point-gates-ship-retro">The end point: gates, ship, retro</h2>

<p>The end point of every loop is feedback, and in my system the feedback comes in threes. A plan-checker audits the plan before execution. A Nyquist test gate checks the work after execution. A goal-backward verifier audits the codebase against the original intent last. Three gates, in sequence, none advisory: <a href="https://github.com/koolamusic/claudefiles/tree/main/plugins/jira">/jira:execute</a> will not open a PR on a verifier FAIL, full stop, and <a href="https://github.com/koolamusic/claudefiles/tree/main/skills/spawn">/spawn</a> verifies delivered work by reading the git log, not by trusting the agent’s self-report.</p>

<p>The instinct goes deeper than tooling. In that same data-platform project, correctness itself is built in three layers: the engines, then a verifier that proves the engines agree, then a separate evaluator with an independent ground truth that catches the case where both engines misread the same thing. The principle written into that project’s decision log applies to the whole harness: never trust a single source; nothing checks itself.</p>

<p>The strangest piece of the harness is also the most effective enforcement of that principle: a <a href="https://github.com/koolamusic/claudefiles/blob/main/hooks/trust-monitor.sh">trust ledger</a>, applied by a hook on every tool call. Every session starts at 50 out of 100, trust level <a href="https://github.com/koolamusic/claudefiles/blob/main/hooks/trust-monitor.json">L2</a>. Levels gate what the agent may do. L1 edits files. L2 runs mutating bash and spawns agents. L3 pushes, opens PRs, deploys. <a href="https://github.com/koolamusic/claudefiles/blob/main/hooks/trust-monitor.json">L4</a> touches destructive operations. Deductions are Fibonacci-scaled:<label for="sn-11" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-11" class="sidenote-toggle" /><span class="sidenote">Penalties follow the Fibonacci sequence (2, 3, 5, 8, 13, 21) so small slips stay cheap while severe or repeated failures escalate super-linearly. The cost curve itself discourages an agent from testing the edges.</span> a delivery miss costs 5, an unverified claim costs 8, fabrication costs 13, tampering with the ledger itself costs 21. Self-reporting a violation costs a flat 3, because disclosure should always be cheaper than discovery. Only I can award points. Drop below 20 and the agent is terminated: all mutating tools denied, and I start a fresh session.</p>

<figure class="fig3" role="img" aria-label="The trust ledger. A ladder of trust levels gates tool access: L1 edits files, L2 spawns agents and runs mutating bash, L3 pushes and opens pull requests, L4 handles destructive operations. Sessions start at 50 points. Penalties are Fibonacci scaled: minus 5 for a delivery miss, minus 8 for an unverified claim, minus 13 for fabrication, minus 21 for ledger tampering, and only minus 3 for self-reporting. Below 20 the agent is terminated.">
<svg viewBox="0 0 640 350" style="width:100%;height:auto;display:block" xmlns="http://www.w3.org/2000/svg">
<style>
.fig3 text{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;fill:currentColor}
.fig3 .rung{fill:currentColor;opacity:.08}
.fig3 .rungLine{stroke:currentColor;opacity:.35;fill:none}
.fig3 .frame{stroke:currentColor;opacity:.35;fill:none;stroke-width:1.5}
.fig3 .accent{stroke:#4f7a60;fill:none}
.fig3 .accentTxt{fill:#4f7a60}
.fig3 .mut{fill:currentColor;opacity:.78}
.fig3 .dash{stroke:currentColor;opacity:.4;fill:none;stroke-dasharray:4 4}
.fig3 .start{fill:#4f7a60}
.dark .fig3 .accent{stroke:#8fc0a2}
.dark .fig3 .accentTxt{fill:#8fc0a2}
.dark .fig3 .start{fill:#8fc0a2}
</style>
<title>Trust ladder: levels gate tools, penalties scale, termination below 20</title>
<defs><pattern id="tex-fig3" width="16" height="16" patternUnits="userSpaceOnUse"><circle cx="2" cy="2" r="1.1" fill="currentColor" opacity=".08" /><circle cx="10" cy="10" r="1.1" fill="currentColor" opacity=".05" /></pattern></defs>
<rect x="1" y="1" width="638" height="348" fill="currentColor" opacity=".03" />
<rect x="1" y="1" width="638" height="348" fill="url(#tex-fig3)" />
<rect class="frame" x="1" y="1" width="638" height="348" />
<rect class="rung" x="30" y="34" width="280" height="40" />
<rect class="rungLine" x="30" y="34" width="280" height="40" />
<text x="52" y="58" font-size="12.5" font-weight="600">L4</text>
<text class="mut" x="86" y="58" font-size="12">destructive ops &#183; force push, reset --hard</text>
<rect class="rung" x="30" y="86" width="280" height="40" />
<rect class="rungLine" x="30" y="86" width="280" height="40" />
<text x="52" y="110" font-size="12.5" font-weight="600">L3</text>
<text class="mut" x="86" y="110" font-size="12">push &#183; PR &#183; deploy &#183; external sends</text>
<rect class="rung" x="30" y="138" width="280" height="40" />
<rect class="accent" x="30" y="138" width="280" height="40" stroke-width="1.6" />
<text x="52" y="162" font-size="12.5" font-weight="600">L2</text>
<text class="mut" x="86" y="162" font-size="12">mutating bash &#183; spawn agents</text>
<circle class="start" cx="292" cy="158" r="4" />
<text class="accentTxt" x="320" y="143" font-size="11.5">every session starts here, 50/100</text>
<rect class="rung" x="30" y="190" width="280" height="40" />
<rect class="rungLine" x="30" y="190" width="280" height="40" />
<text x="52" y="214" font-size="12.5" font-weight="600">L1</text>
<text class="mut" x="86" y="214" font-size="12">file edits</text>
<rect class="rung" x="30" y="242" width="280" height="40" />
<rect class="rungLine" x="30" y="242" width="280" height="40" />
<text class="mut" x="52" y="266" font-size="12">&lt; 20 &#183; terminated: mutating tools denied</text>
<path class="dash" d="M330 158 L360 158" />
<text x="370" y="58" font-size="12">&#8722;21 ledger tampering</text>
<text x="370" y="110" font-size="12">&#8722;13 fabrication</text>
<text x="370" y="162" font-size="12">&#8722;8 unverified claim</text>
<text x="370" y="214" font-size="12">&#8722;5 delivery miss</text>
<text class="accentTxt" x="370" y="266" font-size="12">&#8722;3 self-report (disclosure &lt; discovery)</text>
<text class="mut" x="330" y="318" font-size="11.5" text-anchor="middle">only the operator awards points, via /trust +N</text>
</svg>
<figcaption class="mut" style="font-size:.85em;opacity:.8;text-align:center;margin-top:.5rem">The trust ledger: privilege is continuously recomputed from scored behavior.</figcaption>
</figure>

<p>It sounds theatrical. It works because it prices honesty into the system. An agent that loses more trust by hiding a mistake than by admitting it will admit mistakes, and an agent whose privileges depend on verification will verify.</p>

<p>After the gates comes the move that completes the grammar: the retro turns feedback into a refined objective. <a href="https://github.com/koolamusic/claudefiles/tree/main/plugins/jira">/jira:retro</a> rolls the sprint’s workflow lessons into durable state, and those lessons shape the next commission. My runbooks make the discipline explicit: every step ends with a verification gate, and you do not proceed past a failed one. Feedback that doesn’t refine the next objective is just logging. The end point of one loop is the start point of the next. That is what makes it a loop and not a pipeline.</p>

<h2 id="the-statusline-is-the-instrument-panel">The statusline is the instrument panel</h2>

<p>A loop you can’t observe is a loop you can’t operate, so the two numbers that govern every session live permanently at the bottom of my terminal, wired through the <a href="https://github.com/koolamusic/claudefiles/blob/main/settings.json">statusLine</a> parameter in settings.json. It runs a command, a Node script in my hooks directory, that renders the model, the current task or milestone state, the directory, and the two gauges I actually watch.</p>

<p>The first gauge is context: a ten-segment meter with the used percentage, normalized against the buffer the runtime reserves for autocompaction, shifting from green to yellow to orange to a blinking red skull as the window fills. The statusline also writes those metrics to a bridge file that the context-monitor hook reads, so the agent itself gets warnings injected when its context runs low. The agent sees its own fuel gauge, not just me.</p>

<p>The second gauge is trust. The statusline calls the <a href="https://github.com/koolamusic/claudefiles/blob/main/hooks/trust-monitor.sh">trust monitor</a> in a compact render mode and appends the result: level and score, always visible. L2 · 50 on a fresh session. The cover image of this article shows it in the wild, sitting in the statusline of a session running a wall of loops. At any glance I know how much context the loop has burned and how much privilege the agent currently holds, which are exactly the two numbers that decide whether I let it run, hand it off, or terminate it.</p>

<h2 id="the-memory-that-makes-nesting-possible">The memory that makes nesting possible</h2>

<p>Three nested loops only work if state survives the boundaries between them, and most people leave that to chance. I engineer it.</p>

<p>The durable memory lives in a private context layer (call it ~/.context/northstar), a versioned repo of workflow state that is specific to my setup and deliberately internal: a status.md that is the reference for each workstream, a handoff.md that acts as the session baton, a decision log of load-bearing calls, dated sprint directories each with brief, research, plans, execution, and verification artifacts, and the program packets above them. The sprint and program loops live there as documents, so any session loop can pick them up cold.</p>

<p>If you copy one practice from this article, make it this one: give your harness explicit context layers. A PLAN.md the session must read before it touches anything. A status doc that is the reference, not the chat. A decision log for the calls you never want re-litigated. A handoff doc for crossing sessions and machines. The filenames matter less than the discipline: named, durable, versioned context that any agent, on any machine, can pick up cold.</p>

<p>Inside a session, I keep autoCompact off, so nothing gets silently summarized away. <a href="https://github.com/koolamusic/claudefiles/tree/main/skills/handoff">/handoff</a> compacts a session into a HANDOFF.md a cold agent can pick up: mission, repo state, locked decisions, open gates, a “not your problem” scope boundary, and a pickup checklist. Handoffs travel between machines over scp; a session that runs out of context on one box resumes on another with the document as the contract.</p>

<p>Two smaller habits matter as much. Long-running monitors run in subshells, not in the main thread. I learned that one the hard way and the correction is still in my history: “You were supposed to have this monitor running in a sub shell, so you don’t overload your context.” And anything the orchestrator needs to remember gets restated on every status check, because restatement is the only compaction-proof memory.</p>

<h2 id="the-loop-is-the-product">The loop is the product</h2>

<p>Here is the part people underestimate. None of this is about a specific model. The models keep changing and will keep changing. What compounds is the triangle: the contract, the commissions, the fork-join discipline, the gates, the trust accounting, the memory.</p>

<p>Prompt engineering optimizes a message. Loop engineering optimizes a system that keeps delivering after you close the lid of the laptop.</p>

<p>When I say “run this in a loop,” what I mean is: set the objective as a written commission, fork the execution into waves, join at the gates, ship only what passes, and let the retro refine the next objective. Session inside sprint inside program, each running the same grammar with the same start and the same end. The agent does the laps. My job is to design the track, hold the gates, and decide what a lap is worth.</p>

<p>That is the whole trick. There is no prompt.</p>

<h2 id="references">References</h2>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:acceptedits">
      <p>A permission mode in the agent runtime: the agent may edit files without stopping to ask approval on every edit. Uncomfortable without gates; liberating with them. <a href="#fnref:acceptedits" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:compaction">
      <p>Context compaction is what happens when a session’s context window fills: the runtime summarizes or truncates older conversation to make room. Anything not written to a file or restated can silently vanish, which is why this whole setup leans on documents instead of chat history. <a href="#fnref:compaction" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:hooks">
      <p>Scripts the runtime fires on lifecycle events: session start, prompt submit, before and after every tool call. Hooks are how the harness enforces policy mechanically instead of relying on the agent to remember the rules. <a href="#fnref:hooks" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:planchecker">
      <p>An independent agent whose only job is auditing the plan document before execution: adversarial review of the approach, not the code. Planner and checker never share a context, so the audit is genuine rather than the planner grading its own homework. <a href="#fnref:planchecker" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:wave">
      <p>A group of tasks with no dependencies on each other, dispatched together. A wave must fully join, verified not just finished, before the next wave forks. Waves are how you parallelize a plan without letting dependents run ahead of their prerequisites. <a href="#fnref:wave" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:goalbackward">
      <p>Forward verification asks “does the code run?” Goal-backward verification starts from the original intent and walks in reverse: for every requirement in the plan, where in the diff is it satisfied? Any requirement without evidence fails the audit, even if all the tests pass. <a href="#fnref:goalbackward" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Artificial Intelligence" /><category term="AI" /><category term="Agentic Engineering" /><category term="Engineering Culture" /><summary type="html"><![CDATA[Three nested loops run my agent harness: objective, execution, feedback, refined objective. Fork-join in the execution, a gate at every join.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andrewmiracle.com/assets/images/uploads/2026/08/284_1x_shots_so.png" /><media:content medium="image" url="https://andrewmiracle.com/assets/images/uploads/2026/08/284_1x_shots_so.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">What does it mean to code with AI as a software engineer?</title><link href="https://andrewmiracle.com/2026/08/03/what-does-it-mean-to-code-with-ai.html" rel="alternate" type="text/html" title="What does it mean to code with AI as a software engineer?" /><published>2026-08-03T00:00:00+00:00</published><updated>2026-08-03T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/08/03/what-does-it-mean-to-code-with-ai</id><content type="html" xml:base="https://andrewmiracle.com/2026/08/03/what-does-it-mean-to-code-with-ai.html"><![CDATA[<p>I think I finally figured out how to describe the AI analogy. And right now it feels obvious.</p>

<p>I felt it when I walked into the kitchen of a new house and tried to make a dish. I struggled with the idea so much that I left the recipe in the fridge and waited until I got back to my own house.</p>

<p>The moment I was home, I wanted to make it. Everything was clear. Where the pots were. Where the pans were. The gas. How to get it all running. It was smooth. I made the dish I wanted, and I ate.</p>

<p>Meanwhile the nice vacation house we were renting, as much as I loved it, was hard to cook in. Because there was a butler.</p>

<p>Even when I decided I wanted to cook for myself, even after I had gone to the supermarket and bought the ingredients, I just couldn’t. I kept the items in the fridge and called the butler anyway, and asked him to make the food he already knew how to make. Because he couldn’t make my indigenous, home cooked meal.</p>

<p>And I realized that is kind of like AI for you right now.</p>

<p>You have a butler, in an expensive vacation house that you are renting.</p>

<p>Luckily, the butler is very good. He can make a lot of dishes. Even the ones we’ve quietly converted into our own special home dishes.</p>

<p>But here is the challenge. We may never enter the kitchen. We may never do inventory. We may never walk into the pantry again.</p>

<p>Because if, for some reason, we decide we should be in the kitchen, we’ll realize we have to figure out what kind of gas this house uses. How to work with ceramic pans instead of the ones we know. How much heat we actually want under our food.</p>

<p>The butler is so good he can get you your dish in five minutes, as long as you understand exactly what it is you really want to eat.</p>

<p>And then I think: this is the life of the AI software engineer. The forward deployed engineer.</p>

<p>So maybe we don’t fight it.</p>

<p>Maybe what we really need is to give the engineer an outlet. A way to always go back to his own house, the one he built himself, and make a dish every now and then. As a vacation. As a hobby he genuinely loves.</p>

<p>Because there is a butler now, and the butler does it so well. He doesn’t need to worry about making food anymore.</p>

<p>But just like a vacation, cooking becomes the vacation.</p>

<p>As long as he can afford to rent the vacation house, or something like it, or his company is willing to rent it for him, he is okay. And when he is not working, he can go home and make food for himself.</p>

<p>Which is why I think the only move right now, for every forward deployed engineer, is to keep one side project you write code for with your hands.</p>

<p>One side project that doesn’t really have customers, apart from you and a few friends.</p>

<p>And you just write the code by hand.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Musings" /><category term="AI" /><category term="Engineering Culture" /><category term="Future of Work" /><summary type="html"><![CDATA[AI is a brilliant butler in a house you're only renting. He cooks everything. Here's why every engineer still needs one dish they make by hand.]]></summary></entry><entry><title type="html">AI Stole My Notepad</title><link href="https://andrewmiracle.com/2026/07/18/ai-stole-my-notepad.html" rel="alternate" type="text/html" title="AI Stole My Notepad" /><published>2026-07-18T00:00:00+00:00</published><updated>2026-07-18T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/07/18/ai-stole-my-notepad</id><content type="html" xml:base="https://andrewmiracle.com/2026/07/18/ai-stole-my-notepad.html"><![CDATA[<p>I think AI stole my notepad.</p>

<p>Actually, no.</p>

<p>AI stole my notepad.</p>

<p>For years, I was the kind of person who cared far too much about pens.</p>

<p>Not just any pen. Felt tips. Fine liners. Gel pens. Rollerballs. Fountain pens when I was feeling dramatic. Ballpoints only when I had no choice. Purple ink for thinking. Blue for everyday notes. Black for permanence. Red for arguments with myself. Every pen had a personality, and every one made writing feel just a little different. Oil based ballpoints dragged across the page with intention. Gel pens glided. Rollerballs flowed. Felt tips whispered. Fountain pens demanded you slow down. Writing was never just writing, it was a physical experience.</p>

<p>People who knew me knew exactly what to buy me.</p>

<p>Notebooks.</p>

<p>They were one of my favorite gifts because they were guaranteed to be used. Some people collect watches or sneakers. I collected blank pages.</p>

<p>Every notebook eventually became a time capsule. Meeting notes. Half finished essays. Business ideas. Random observations at 2 a.m. Sketches that made sense only to me. Lists I never came back to.</p>

<p>I still have them.</p>

<p>Scattered across boxes, drawers, backpacks, some tied together, some sealed in ziplock bags, quietly preserved like little archaeological sites of previous versions of myself.</p>

<p>The funny thing is, I recently opened one of my bags and found my pen collection.</p>

<p>Almost untouched.</p>

<p>It hit me that we’re already halfway through the year, and I’ve barely used them.</p>

<p>Normally, around this time, I’d already be shopping for replacements because I’d lost a few, finished the ink in others, or convinced myself I needed another color.</p>

<p>This year?</p>

<p>Nothing.</p>

<p>So I asked myself a strange question.</p>

<p>Where did all those thoughts go?</p>

<p>Where are all the ideas I used to scribble down before they disappeared?</p>

<p>Then it clicked.</p>

<p>They’re in the chat box.</p>

<p>Claude has them.</p>

<p>ChatGPT has them.</p>

<p>Somewhere across dozens, maybe hundreds, of conversations, my thoughts are still there.</p>

<p>The instinct hasn’t disappeared.</p>

<p>The destination has.</p>

<p>Now, when I have an idea, I don’t reach for a notebook.</p>

<p>I open a chatbot.</p>

<p>The thought survives.</p>

<p>Sometimes it even comes back better than it went in.</p>

<p>But something else quietly disappeared.</p>

<p>With notebooks, memory had geography.</p>

<p>You knew where things lived.</p>

<p>You remembered that an idea was somewhere near the middle of the notebook. That conversation was written close to the back, around the same week you were obsessed with another project. You’d flip through pages, accidentally rediscovering thoughts you’d forgotten you ever had.</p>

<p>The notebook didn’t just store ideas.</p>

<p>It stored time.</p>

<p>Chat histories don’t feel like that.</p>

<p>They’re searchable, but they aren’t memorable.</p>

<p>Everything exists, but nowhere in particular.</p>

<p>My journal became a search box.</p>

<p>Maybe that’s progress.</p>

<p>Maybe this is simply what living at the edge of a technological shift feels like. We don’t notice the replacement because the new thing works so well. One day you realize the object isn’t gone.</p>

<p>The habit is.</p>

<p>I’m not worried.</p>

<p>At least, not yet.</p>

<p>I just find it fascinating that one of the oldest rituals I had, reaching for a pen whenever a thought arrived, quietly disappeared without me ever deciding to stop.</p>

<p>The pens are still here.</p>

<p>The notebooks are still here.</p>

<p>They just aren’t where my thoughts live anymore.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Musings" /><category term="AI" /><category term="Writing" /><category term="Memory" /><summary type="html"><![CDATA[My pens are still full and my notebooks untouched. I never decided to stop writing by hand. AI just quietly became where my ideas live now.]]></summary></entry><entry><title type="html">The Scope Compression Hypothesis</title><link href="https://andrewmiracle.com/2026/07/11/scope-compression-hypothesis.html" rel="alternate" type="text/html" title="The Scope Compression Hypothesis" /><published>2026-07-11T00:00:00+00:00</published><updated>2026-07-18T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/07/11/scope-compression-hypothesis</id><content type="html" xml:base="https://andrewmiracle.com/2026/07/11/scope-compression-hypothesis.html"><![CDATA[<p>For years, software teams measured work with the same buried assumption: more scope means more time.</p>

<p>We dressed it up. Story points. Epics. Engineering hours. Complexity estimates. Sprint capacity. Underneath every planning ritual sat one equation.</p>

<p>More work equals more people, more time, or both.</p>

<p>AI has quietly broken that equation. Not because software suddenly became easy to build, but because the constraint moved.</p>

<h2 id="working-faster-was-the-wrong-explanation">Working faster was the wrong explanation</h2>

<p>The first few times I built products with AI agents, I assumed I was simply working faster. After enough projects, that explanation stopped holding.</p>

<p>A feature that would have taken a week now took hours. An entire sprint’s worth of implementation stopped feeling materially different from a single feature. Expanding the scope barely changed the delivery date. Instead of asking “can we fit this into the sprint?” I kept asking “why not build the whole thing?”</p>

<p>That question forced me to rethink what scope actually means.</p>

<h2 id="the-old-model-was-linear">The old model was linear</h2>

<p>Traditionally, software delivery was constrained by production capacity. Every additional feature was additional engineering effort. More code meant more implementation time. Scrum, Kanban, and most delivery frameworks were built on that reality. Story points became rough proxies for engineering hours because human effort was the dominant variable.</p>

<p>You can write the old model as a sum. Delivery was the total of the work:</p>

<p><code class="language-plaintext highlighter-rouge">delivery time  ≈  Σ (task time)</code></p>

<p>Double the scope and, give or take, you doubled the time. Linear scaling. You cannot simply add people to make a late project ship sooner.<sup id="fnref:brooks"><a href="#fn:brooks" class="footnote" rel="footnote" role="doc-noteref">1</a></sup></p>

<h2 id="ai-made-implementation-parallel">AI made implementation parallel</h2>

<p>AI changes the relationship. Implementation has become massively parallel.</p>

<p>Instead of one engineer moving through tasks one after another, dozens of specialized agents work at once across the system. Authentication, APIs, frontend components, database migrations, documentation, tests, infrastructure, all progressing simultaneously.</p>

<p>So generation stops behaving like a sum and starts behaving like a maximum:</p>

<p><code class="language-plaintext highlighter-rouge">generation time  ≈  max (task time)</code></p>

<p>If ten agents each take one feature, they finish around the same wall-clock moment. The limiting factor is no longer the amount of work. It is the longest branch of work.</p>

<figure class="fig" role="img" aria-label="Two timelines. Before AI, five tasks run back to back, so delivery equals the sum of task times. With AI, the same five tasks run in parallel and finish quickly, but a long verification bar follows, so delivery equals the longest task plus verification.">
<svg viewBox="0 0 640 430" style="width:100%;height:auto;display:block" xmlns="http://www.w3.org/2000/svg">
<style>
.fig text{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
.fig .axis{stroke:currentColor;opacity:.25;fill:none}
.fig .old{stroke:currentColor;opacity:.4;fill:none}
.fig .ailn{stroke:#4f7a60;fill:none}
.fig .aifill{fill:#4f7a60}
.fig .verify{fill:currentColor;opacity:.16}
.fig .verifyLine{stroke:currentColor;opacity:.45;fill:none}
.fig .lbl{fill:currentColor}
.fig .mut{fill:currentColor;opacity:.6}
.fig .accentTxt{fill:#4f7a60}
.fig .dash{stroke:currentColor;opacity:.4;fill:none;stroke-dasharray:3 4}
.fig .bgfill{fill:#f7f0e1}
.dark .fig .ailn{stroke:#8fc0a2}
.dark .fig .aifill{fill:#8fc0a2}
.dark .fig .accentTxt{fill:#8fc0a2}
.dark .fig .bgfill{fill:#353533}
</style>
<title>Where the work moves under AI</title>
<rect class="bgfill" x="0" y="0" width="640" height="430" />
<text class="lbl" x="24" y="30" font-size="15" font-weight="600">Before AI &#183; sequential</text>
<rect class="aifill" x="70" y="52" width="102" height="22" />
<rect class="aifill" x="174" y="52" width="102" height="22" />
<rect class="aifill" x="278" y="52" width="102" height="22" />
<rect class="aifill" x="382" y="52" width="102" height="22" />
<rect class="aifill" x="486" y="52" width="102" height="22" />
<path class="verifyLine" d="M70 86 L70 92 M588 86 L588 92" />
<text class="mut" x="329" y="108" font-size="13" text-anchor="middle">delivery &#8776; &#931; (task time)</text>
<line class="axis" x1="24" y1="140" x2="616" y2="140" />
<text class="lbl" x="24" y="172" font-size="15" font-weight="600">With AI &#183; parallel, then verify</text>
<rect class="aifill" x="70" y="190" width="102" height="12" />
<rect class="aifill" x="70" y="208" width="102" height="12" />
<rect class="aifill" x="70" y="226" width="102" height="12" />
<rect class="aifill" x="70" y="244" width="102" height="12" />
<rect class="aifill" x="70" y="262" width="102" height="12" />
<path class="dash" d="M172 186 L172 356" />
<text class="mut" x="178" y="200" font-size="12">generation ends</text>
<rect class="verify" x="182" y="300" width="406" height="26" />
<rect class="verifyLine" x="182" y="300" width="406" height="26" fill="none" />
<text class="lbl" x="385" y="317" font-size="13" text-anchor="middle">Verification</text>
<path class="verifyLine" d="M70 340 L70 346 M588 340 L588 346" />
<text class="accentTxt" x="329" y="384" font-size="13" text-anchor="middle">delivery &#8776; max (task time) + verification</text>
</svg>
<figcaption class="mut" style="font-size:.85em;opacity:.7;text-align:center;margin-top:.5rem">The work doesn't disappear. It moves from execution to verification.</figcaption>
</figure>

<p>That is a very different optimization problem, and it is not a new one. It is the mathematics of parallel execution: critical-path analysis, Brent’s theorem, the difference between the total work and the longest dependent chain.<sup id="fnref:cpm"><a href="#fn:cpm" class="footnote" rel="footnote" role="doc-noteref">2</a></sup></p>

<h2 id="the-human-didnt-disappear-the-human-moved">The human didn’t disappear. The human moved.</h2>

<p>Here is the catch the speed story misses. You don’t remove the person. You relocate them.</p>

<p>No matter how many agents generate code, a senior engineer still reviews the architecture. Someone still validates the business logic. Someone still performs user acceptance testing. Security still signs off. Product still decides whether the implementation solves the problem.</p>

<p>Those activities refuse to scale at the rate generation does. So the equation becomes something like:</p>

<p><code class="language-plaintext highlighter-rouge">delivery  ≈  AI generation  +  human verification</code></p>

<p>where generation trends toward a near-constant and verification dominates.</p>

<p>Ironically, the faster AI becomes at producing software, the more valuable human judgment becomes. Anthropic’s study of roughly 235,000 Claude Code users found exactly this shape: domain expertise, not a software-engineering background, predicted who got good outcomes, and when a session hit trouble novices abandoned it about three times as often as experts.<sup id="fnref:anthropic"><a href="#fn:anthropic" class="footnote" rel="footnote" role="doc-noteref">3</a></sup> The bottleneck didn’t vanish. It moved to the person who knows what “correct” looks like.</p>

<h2 id="this-is-amdahls-law-wearing-a-new-hat">This is Amdahl’s Law wearing a new hat</h2>

<p>If you have ever studied parallel computing, this will feel familiar. Amdahl’s Law says a system speeds up only as much as its sequential bottleneck allows.<sup id="fnref:amdahl"><a href="#fn:amdahl" class="footnote" rel="footnote" role="doc-noteref">4</a></sup> You can parallelize the parallel part all you want; the serial remainder sets the ceiling.</p>

<p>Coding became parallel. Review did not. Testing partially did. Architecture partially did. Acceptance did not at all.</p>

<p>So throughput stops being a function of total work and becomes a function of the sequential work:</p>

<p><code class="language-plaintext highlighter-rouge">speed  ≈  1 / sequential work</code>, not <code class="language-plaintext highlighter-rouge">1 / total work</code></p>

<p>Google’s own research on scaling agent systems lands in the same place from the other direction: piling on more agents hits a ceiling and can even degrade results, because coordination (merging, reconciling, and validating parallel output) carries its own tax.<sup id="fnref:google"><a href="#fn:google" class="footnote" rel="footnote" role="doc-noteref">5</a></sup> More agents is not more delivery. Past a point, it is just more to verify.</p>

<h2 id="delivery-is-starting-to-look-like-a-distributed-system">Delivery is starting to look like a distributed system</h2>

<p>This reminds me less of traditional software engineering and more of distributed computing. Distributed systems rarely spend most of their time executing work. They spend it coordinating, synchronizing, validating, and merging parallel execution.</p>

<p>AI-generated software increasingly behaves the same way. The hard part is no longer generating code. It is merging confidence.</p>

<p>Which is why the 2025 DORA report reads the way it does. AI adoption is nearly universal and most developers feel faster, yet a large share still don’t trust the code the models produce, and the teams that actually benefit are the ones with strong internal platforms, clear workflows, and real review discipline.<sup id="fnref:dora"><a href="#fn:dora" class="footnote" rel="footnote" role="doc-noteref">6</a></sup> AI amplifies the system it lands in. If your verification is weak, faster generation just gets you to the bottleneck sooner.</p>

<h2 id="scope-compression">Scope compression</h2>

<p>Put it together and you get something worth naming. Call it the <strong>Scope Compression Hypothesis</strong>:</p>

<blockquote>
  <p>As software implementation becomes parallelized by AI agents, delivery time becomes increasingly independent of implementation scope and increasingly dependent on fixed human verification cycles. Productivity shifts from being creation-limited to approval-limited.</p>
</blockquote>

<p>Scope is compressing. Not in the sense that projects get smaller, but in the sense that ambitious projects converge toward similar delivery timelines. Whether the backlog holds three features or thirty, the dominant cost is often no longer writing the software. It is building enough confidence to release it.</p>

<figure class="fig2" role="img" aria-label="A chart of scope against delivery time. The Before AI line rises steeply and linearly: more scope, more time. The With AI line stays nearly flat as scope grows, then bends upward only once human verification saturates.">
<svg viewBox="0 0 640 360" style="width:100%;height:auto;display:block" xmlns="http://www.w3.org/2000/svg">
<style>
.fig2 text{font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;fill:currentColor}
.fig2 .axis{stroke:currentColor;opacity:.3;fill:none}
.fig2 .old{stroke:currentColor;opacity:.42;fill:none}
.fig2 .ailn{stroke:#4f7a60;fill:none}
.fig2 .mut{fill:currentColor;opacity:.55}
.fig2 .accentTxt{fill:#4f7a60}
.fig2 .dash{stroke:currentColor;opacity:.35;fill:none;stroke-dasharray:3 4}
.fig2 .bgfill{fill:#f7f0e1}
.dark .fig2 .ailn{stroke:#8fc0a2}
.dark .fig2 .accentTxt{fill:#8fc0a2}
.dark .fig2 .bgfill{fill:#353533}
</style>
<title>Scope versus delivery time, before and after AI</title>
<rect class="bgfill" x="0" y="0" width="640" height="360" />
<line class="axis" x1="64" y1="40" x2="64" y2="300" />
<line class="axis" x1="64" y1="300" x2="604" y2="300" />
<text class="mut" x="334" y="338" font-size="13" text-anchor="middle">Delivery time &#8594;</text>
<text class="mut" x="26" y="170" font-size="13" text-anchor="middle" transform="rotate(-90 26 170)">Scope &#8594;</text>
<path class="old" stroke-width="2" d="M64 300 L600 66" />
<path class="ailn" stroke-width="2.5" d="M64 292 C 220 286, 380 280, 452 270 C 500 262, 540 190, 600 92" />
<path class="dash" d="M452 270 L452 300" />
<text class="mut" x="458" y="292" font-size="11.5">verification saturates</text>
<text class="mut" x="470" y="120" font-size="13" font-weight="600">Before AI</text>
<text class="accentTxt" x="92" y="272" font-size="13" font-weight="600">With AI</text>
</svg>
<figcaption class="mut" style="font-size:.85em;opacity:.7;text-align:center;margin-top:.5rem">More scope used to mean more time. Now delivery stays flat until verification saturates.</figcaption>
</figure>

<p>Our planning systems haven’t caught up. Sprint planning, estimation ceremonies, capacity planning, resource allocation, all of it still assumes implementation is the expensive part. That is why so many AI-assisted teams report that estimation has gone strangely unreliable. Estimation isn’t getting worse. The variable we spent decades measuring is simply no longer the one that determines delivery. This is the same lesson the SPACE work taught about productivity: the moment you collapse a multidimensional reality onto a single proxy, you start making decisions on the wrong number.<sup id="fnref:space"><a href="#fn:space" class="footnote" rel="footnote" role="doc-noteref">7</a></sup></p>

<h2 id="what-the-best-teams-will-optimize-for">What the best teams will optimize for</h2>

<p>If this holds, software organizations will eventually stop optimizing for engineering capacity and start optimizing for verification throughput. The question moves from “how much can we build?” to “how much can we responsibly approve?”</p>

<p>The highest-leverage engineers will not be the fastest builders. They will be the fastest validators. The best engineering organizations will not be the ones that generate the most code. They will be the ones that approve the most change with the highest confidence.</p>

<p>That feels like a subtle distinction today. I suspect it becomes one of the defining characteristics of software engineering in the AI era.</p>

<h2 id="a-reading-list">A reading list</h2>

<p>A friend sharpened most of this thinking while we argued about it, and he handed me a syllabus on the way out. Here it is, roughly the order I’d read it in.</p>

<p><strong>Foundations</strong></p>

<ul>
  <li><em>The Mythical Man-Month</em>, Frederick Brooks: why adding people doesn’t linearly shorten a project.<sup id="fnref:brooks:1"><a href="#fn:brooks" class="footnote" rel="footnote" role="doc-noteref">1</a></sup></li>
  <li><em>Peopleware</em>, DeMarco &amp; Lister: productivity as a human system, not a coding-speed problem.<sup id="fnref:peopleware"><a href="#fn:peopleware" class="footnote" rel="footnote" role="doc-noteref">8</a></sup></li>
  <li><em>Accelerate</em>, Forsgren, Humble &amp; Kim: the DORA research on what actually drives delivery performance.<sup id="fnref:accelerate"><a href="#fn:accelerate" class="footnote" rel="footnote" role="doc-noteref">9</a></sup></li>
</ul>

<p><strong>Parallelism</strong></p>

<ul>
  <li>Amdahl’s Law and Gustafson’s Law: the ceiling on parallel speedup, and the counterargument.<sup id="fnref:amdahl:1"><a href="#fn:amdahl" class="footnote" rel="footnote" role="doc-noteref">4</a></sup> <sup id="fnref:gustafson"><a href="#fn:gustafson" class="footnote" rel="footnote" role="doc-noteref">10</a></sup></li>
  <li>Critical Path Method and Brent’s theorem: total work versus the longest dependent chain.<sup id="fnref:cpm:1"><a href="#fn:cpm" class="footnote" rel="footnote" role="doc-noteref">2</a></sup></li>
  <li>Fork-join parallelism and MapReduce: how systems split work, then merge it.<sup id="fnref:forkjoin"><a href="#fn:forkjoin" class="footnote" rel="footnote" role="doc-noteref">11</a></sup></li>
</ul>

<p><strong>Modern AI engineering</strong></p>

<ul>
  <li>DORA, <em>2025 State of AI-assisted Software Development</em>.<sup id="fnref:dora:1"><a href="#fn:dora" class="footnote" rel="footnote" role="doc-noteref">6</a></sup></li>
  <li><em>The SPACE of Developer Productivity</em>.<sup id="fnref:space:1"><a href="#fn:space" class="footnote" rel="footnote" role="doc-noteref">7</a></sup></li>
  <li>Google, <em>Towards a Science of Scaling Agent Systems</em>.<sup id="fnref:google:1"><a href="#fn:google" class="footnote" rel="footnote" role="doc-noteref">5</a></sup></li>
  <li>Anthropic, <em>Agentic Coding and Persistent Returns to Expertise</em>.<sup id="fnref:anthropic:1"><a href="#fn:anthropic" class="footnote" rel="footnote" role="doc-noteref">3</a></sup></li>
</ul>

<p>If I had to compress the whole argument into one line: AI turned estimation from a production problem into a verification problem, and most of our planning is still answering the old question.</p>

<hr />

<h2 id="references">References</h2>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:brooks">
      <p>Frederick P. Brooks Jr., <em>The Mythical Man-Month: Essays on Software Engineering</em> (Addison-Wesley, 1975; anniversary edition 1995). Source of Brooks’s Law: “adding manpower to a late software project makes it later.” <a href="https://en.wikipedia.org/wiki/The_Mythical_Man-Month">Overview</a>. <a href="#fnref:brooks" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:brooks:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:cpm">
      <p>On the longest dependent chain versus total work, see the <a href="https://en.wikipedia.org/wiki/Critical_path_method">Critical Path Method</a> and Brent’s theorem in the <a href="https://en.wikipedia.org/wiki/Analysis_of_parallel_algorithms">analysis of parallel algorithms</a>. <a href="#fnref:cpm" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:cpm:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:anthropic">
      <p>Zoe Hitzig, Maxim Massenkoff, Eva Lyubich, Ryan Heller, and Peter McCrory, “Agentic Coding and Persistent Returns to Expertise” (Anthropic, 2026), drawn from ~400,000 Claude Code sessions across ~235,000 users. <a href="https://www.anthropic.com/research/claude-code-expertise">Research</a>. <a href="#fnref:anthropic" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:anthropic:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:amdahl">
      <p>Gene M. Amdahl, “Validity of the single processor approach to achieving large scale computing capabilities” (AFIPS Conference Proceedings, 1967). <a href="https://en.wikipedia.org/wiki/Amdahl%27s_law">Amdahl’s law</a>. <a href="#fnref:amdahl" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:amdahl:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:google">
      <p>Yubin Kim et al., “Towards a Science of Scaling Agent Systems” (Google Research, Google DeepMind, and MIT, 2025), arXiv:2512.08296. Derives scaling principles for multi-agent systems and documents the “coordination tax.” <a href="https://arxiv.org/abs/2512.08296">arXiv</a>. <a href="#fnref:google" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:google:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:dora">
      <p>DORA, <em>2025 State of AI-assisted Software Development</em> (Google / DORA, 2025). Reports ~90% AI adoption, AI as an “amplifier” of existing team strength, and verification/trust as the emerging constraint. <a href="https://dora.dev/dora-report-2025/">Report</a>. <a href="#fnref:dora" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:dora:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:space">
      <p>Nicole Forsgren, Margaret-Anne Storey, Chandra Maddila, Thomas Zimmermann, Brian Houck, and Jenna Butler, “The SPACE of Developer Productivity: There’s more to it than you think” (<em>ACM Queue</em>, 2021). <a href="https://www.microsoft.com/en-us/research/publication/the-space-of-developer-productivity-theres-more-to-it-than-you-think/">Microsoft Research page</a>. <a href="#fnref:space" class="reversefootnote" role="doc-backlink">&#8617;</a> <a href="#fnref:space:1" class="reversefootnote" role="doc-backlink">&#8617;<sup>2</sup></a></p>
    </li>
    <li id="fn:peopleware">
      <p>Tom DeMarco and Timothy Lister, <em>Peopleware: Productive Projects and Teams</em> (Dorset House, 1987; 3rd edition 2013). <a href="https://en.wikipedia.org/wiki/Peopleware:_Productive_Projects_and_Teams">Overview</a>. <a href="#fnref:peopleware" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:accelerate">
      <p>Nicole Forsgren, Jez Humble, and Gene Kim, <em>Accelerate: The Science of Lean Software and DevOps</em> (IT Revolution, 2018). <a href="https://itrevolution.com/product/accelerate/">Publisher page</a>. <a href="#fnref:accelerate" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:gustafson">
      <p>John L. Gustafson, “Reevaluating Amdahl’s Law” (<em>Communications of the ACM</em>, 1988), the scaled-speedup counterpoint. <a href="https://en.wikipedia.org/wiki/Gustafson%27s_law">Gustafson’s law</a>. <a href="#fnref:gustafson" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:forkjoin">
      <p>The <a href="https://en.wikipedia.org/wiki/Fork%E2%80%93join_model">fork–join model</a> and <a href="https://en.wikipedia.org/wiki/MapReduce">MapReduce</a>: canonical patterns for splitting work into parallel branches and merging the results. <a href="#fnref:forkjoin" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Artificial Intelligence" /><category term="AI" /><category term="Engineering Culture" /><category term="Future of Work" /><summary type="html"><![CDATA[For decades more scope meant more time. AI broke that math. The new limit isn't how fast you build, it's how fast you can responsibly approve.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andrewmiracle.com/assets/images/uploads/2026/07/scope-compression-hypothesis.png" /><media:content medium="image" url="https://andrewmiracle.com/assets/images/uploads/2026/07/scope-compression-hypothesis.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Your company brain might have a comprehension problem</title><link href="https://andrewmiracle.com/2026/06/23/company-brain-interpretation-problem.html" rel="alternate" type="text/html" title="Your company brain might have a comprehension problem" /><published>2026-06-23T00:00:00+00:00</published><updated>2026-06-23T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/06/23/company-brain-interpretation-problem</id><content type="html" xml:base="https://andrewmiracle.com/2026/06/23/company-brain-interpretation-problem.html"><![CDATA[<p>For the longest time, I thought the challenge of building a company brain was a knowledge problem.</p>

<p>The idea seemed straightforward. If every decision, project, conversation, customer interaction, and lesson learned could be captured in a single cognitive layer, the organization would become smarter over time. Instead of knowledge being trapped inside departments, teams, documents, and individuals, it would accumulate into one shared repository. A kind of digital cortex for the company.</p>

<p>The more I worked on <a href="https://github.com/withrobinhq/robinwiki">second-brain architecture</a>, especially for organizations, the more I realized something surprising. The hard problem isn’t knowledge. It’s interpretation.</p>

<h2 id="what-language-models-actually-do">What language models actually do</h2>

<p>Most discussion around AI assumes language models understand meaning the way people do. At the mechanical level, that isn’t what they are doing. A language model trained with a next-token-prediction objective generates the most probable continuation of a sequence based on patterns learned during training.<sup id="fnref:ntp"><a href="#fn:ntp" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> It is extraordinarily good at this, good enough that the output is easy to mistake for understanding.</p>

<p>Set aside whether that counts as understanding. People argue it hard in both directions, and it is a genuinely interesting argument,<sup id="fnref:skeptic"><a href="#fn:skeptic" class="footnote" rel="footnote" role="doc-noteref">2</a></sup><sup id="fnref:worldmodel"><a href="#fn:worldmodel" class="footnote" rel="footnote" role="doc-noteref">3</a></sup> but it is not the one that matters here. Whatever is happening inside the model, the final act of interpretation happens outside it. When a model produces text, the person reading it constructs the meaning. The same words mean different things to different people. That was true long before language models existed, and it is true now.</p>

<p>This is not a new observation about machines. It is an old observation about reading. Reader-response theory has argued for over half a century that meaning is not fixed inside a text but is constructed in the encounter between text and reader. Louise Rosenblatt described a text as ink on paper until a reader evokes a work from it.<sup id="fnref:rosenblatt"><a href="#fn:rosenblatt" class="footnote" rel="footnote" role="doc-noteref">4</a></sup> Wolfgang Iser described texts as full of gaps that the reader fills.<sup id="fnref:iser"><a href="#fn:iser" class="footnote" rel="footnote" role="doc-noteref">5</a></sup> Stanley Fish located interpretation in communities of readers who share assumptions and strategies.<sup id="fnref:fish"><a href="#fn:fish" class="footnote" rel="footnote" role="doc-noteref">6</a></sup> A language model gives this old problem a new surface, because now the text is generated on demand, but the structure is identical: the reader makes the meaning.</p>

<h2 id="organizations-run-on-interpretation">Organizations run on interpretation</h2>

<p>One advantage I’ve had throughout my career is sitting between stakeholders and engineering teams. Spend long enough in that seat and you stop writing one document. You start writing two.</p>

<p>For almost every significant initiative, I maintained parallel documentation. One version for engineers, focused on systems, implementation, constraints, dependencies, and execution. One version for stakeholders, focused on outcomes, risks, goals, timelines, and business impact. The underlying reality was identical. The interpretation was different.</p>

<p>This wasn’t a communication problem. It was an interpretation problem, and organizations have always known this even when they rarely articulate it. What you write in an investor memo differs from a customer update. A board presentation differs from a technical specification. What you tell engineering differs from what you tell sales. Not because anyone is lying, but because different audiences derive different meaning from the same information.</p>

<p>This is the core of Karl Weick’s account of organizations as sensemaking systems. Weick argued that organizations don’t simply process information; they organize to reduce <em>equivocality</em>, the condition where the same data admits multiple valid readings, and to build shared meaning so the group can act collectively.<sup id="fnref:weick"><a href="#fn:weick" class="footnote" rel="footnote" role="doc-noteref">7</a></sup> A single fact does not carry a single meaning into an organization. Revenue dropping eight percent means <em>protect cash</em> to the CFO, <em>retention is failing</em> to the product lead, <em>is this even caused by the product</em> to the engineer, and <em>is growth slowing permanently</em> to the investor. The fact is identical. The interpretations diverge by role. Equivocality is not a bug in the org; per Weick it is the engine that forces the organization to organize in the first place.</p>

<h2 id="translation">Translation</h2>

<p>Historically, organizations solved this through layers. Managers, product managers, directors, and leaders each reinterpreted information for the next audience. Information wasn’t passed down so much as transformed at every level.</p>

<p>That transformation is expensive, and it is lossy. Information degrades and distorts as it moves up through the layers, and some of the distortion is deliberate, people screening out what makes them look bad on the way up, especially where trust is low.<sup id="fnref:oreilly"><a href="#fn:oreilly" class="footnote" rel="footnote" role="doc-noteref">8</a></sup> Think of each management layer as a bottleneck that compresses whatever passes through it, throwing away detail to fit the attention budget of the level above.<sup id="fnref:bottleneck"><a href="#fn:bottleneck" class="footnote" rel="footnote" role="doc-noteref">9</a></sup> Layered human translation was never free. It was a cost organizations paid because they had no alternative.</p>

<p>Now AI is collapsing those layers. Founders, engineers, customers, and investors can each query systems directly. The distance between the person with the idea and the people implementing it is shrinking fast, and many traditional translation roles look like they are disappearing.</p>

<p>The reality is more interesting. The translation function isn’t disappearing. It’s moving. The engineering team still needs engineering language. Customers still need customer language. Investors still need investor language. The need never went away. Only the mechanism changed.</p>

<h2 id="facts-judgment--interpretation">Facts, judgment &amp; interpretation</h2>

<p>A single repository of information sounds elegant. A single interpretation does not. Because, following Weick, organizations operate on shared interpretations of information, not on information alone. So a company brain cannot just be a database of facts. It needs three layers.</p>

<p><strong>Facts.</strong> Raw observations: sales numbers, customer interviews, meeting transcripts, product specs, decisions. This layer should be audience-neutral, a source of truth.</p>

<p><strong>Judgment.</strong> The decisions that were made, the tradeoffs accepted, the principles that guided them, the preferences that emerged over time. This is the organization’s accumulated reasoning and taste, its institutional memory. Most organizations fail to capture this layer at all, which is why it walks out the door when experienced people leave.</p>

<p><strong>Interpretation.</strong> The projection of that judgment into the form a specific audience needs. A single judgment, “we are prioritizing reliability over feature velocity this quarter,” becomes <em>freeze feature work and cut incidents</em> for engineering, <em>stability and performance improvements are our focus</em> for customers, and <em>we are strengthening operational foundations for sustainable growth</em> for investors. Same judgment, different valid renderings.</p>

<h2 id="maybe-a-compiler">Maybe a compiler</h2>

<p>This suggests a company brain shouldn’t be a single flat repository. It should behave more like a compiler.</p>

<p>A compiler starts from one source and generates different outputs for different targets. An organization can work the same way: one canonical layer of facts, one canonical layer of judgment, and many audience-specific interpretations generated from that shared source. The engineering version, the customer version, the investor version, all derived from the same underlying reality, all synchronized because they share an origin.</p>

<p>This directly attacks a problem organizations have fought for decades: documentation drift. Maintain separate documents by hand and they diverge. The engineering doc says one thing, the stakeholder doc another, the investor memo a third, and eventually nobody knows which is true. Generate every rendering from one judgment layer and the <em>single-source-of-truth</em> discipline that software already relies on becomes available to organizational communication.</p>

<p>The metaphor has a crack in it, and the crack is the interesting part. A real compiler is faithful by construction: the output means exactly what the source means. An LLM rendering judgment into an investor narrative makes no such promise. A generated customer update can be fluent, on-brand, and quietly false, and nothing in the architecture guarantees it still says what the judgment beneath it says. The compiler idea fixes the drift <em>between</em> the versions, because they share a source. It does nothing for the fidelity <em>between</em> any one version and the truth it came from. That gap, whether a translation carries the judgment honestly or quietly bends it, is the real frontier, and it is wide open.</p>

<h2 id="what-this-changes">What this changes</h2>

<p>This changes how I think about AI as well.</p>

<p>I increasingly suspect that the language model is not the company brain itself. It is the interpretation layer through which the company’s accumulated judgment is expressed. The actual brain is the accumulated repository of knowledge, decisions, tradeoffs, principles, preferences, and institutional memory. The model renders that judgment into forms different audiences can understand, and that rendering is not a trivial step. It is where most of the organizational value and most of the risk concentrate, which makes it the layer that most needs governance, not the least.</p>

<p>The future challenge may not be building systems that know everything. Knowledge is becoming increasingly abundant. The harder challenge may be preserving coherent organizational judgment while generating multiple interpretations for multiple audiences, keeping those interpretations synchronized, and verifying that each one still tells the truth of the judgment beneath it.</p>

<p>That feels much closer to the real problem. Not how to build a company brain. But how to build a company’s shared judgment, continuously translate that judgment into language every part of the organization can understand, and prove the translation didn’t lie.</p>

<hr />

<h2 id="references">References</h2>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:ntp">
      <p>Radford et al., “Language Models are Unsupervised Multitask Learners” (2019), and the broader literature on the next-token-prediction training objective. For a survey framing of NTP as the unifying objective across modern models, see Chen et al., “Next Token Prediction Towards Multimodal Intelligence: A Comprehensive Survey” (2024), <a href="https://arxiv.org/abs/2412.18619">arXiv:2412.18619</a>. <a href="#fnref:ntp" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:skeptic">
      <p>Murray Shanahan, “Talking About Large Language Models” (2022), <a href="https://arxiv.org/abs/2212.03551">arXiv:2212.03551</a>; Emily Bender, Timnit Gebru et al., “On the Dangers of Stochastic Parrots” (2021), <a href="https://dl.acm.org/doi/10.1145/3442188.3445922">DOI:10.1145/3442188.3445922</a>. These argue against attributing human-style understanding to next-token predictors. <a href="#fnref:skeptic" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:worldmodel">
      <p>For the counter-position that next-token training induces structured internal representations or world models, see e.g. “I Predict Therefore I Am: Is Next Token Prediction Enough to Learn Human-Interpretable Concepts from Data?” (2025), <a href="https://arxiv.org/abs/2503.08980">arXiv:2503.08980</a>, which argues the learned representation can be equivalent to a causal model of the data up to an invertible linear transformation. <a href="#fnref:worldmodel" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:rosenblatt">
      <p>Louise Rosenblatt, <em>The Reader, the Text, the Poem: The Transactional Theory of the Literary Work</em> (1978). <a href="#fnref:rosenblatt" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:iser">
      <p>Wolfgang Iser, <em>The Act of Reading: A Theory of Aesthetic Response</em> (1978); see also his concept of the “implied reader.” <a href="#fnref:iser" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:fish">
      <p>Stanley Fish, <em>Is There a Text in This Class? The Authority of Interpretive Communities</em> (1980). <a href="#fnref:fish" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:weick">
      <p>Karl E. Weick, <em>The Social Psychology of Organizing</em> (1979) and <em>Sensemaking in Organizations</em> (1995). The concept of equivocality as the trigger for organizing is central to both. <a href="#fnref:weick" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:oreilly">
      <p>Charles A. O’Reilly, “The Intentional Distortion of Information in Organizational Communication: A Laboratory and Field Investigation” (1978), <em>Human Relations</em> 31(2), <a href="https://doi.org/10.1177/001872677803100203">DOI:10.1177/001872677803100203</a>. <a href="#fnref:oreilly" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:bottleneck">
      <p>For the information-bottleneck framing of corporate hierarchies as successive lossy compression stages, see Cameron Gordon, “The Information Bottleneck Principle in Corporate Hierarchies” (2022, arXiv preprint), <a href="https://arxiv.org/abs/2210.14861">arXiv:2210.14861</a>. <a href="#fnref:bottleneck" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Artificial Intelligence" /><category term="AI" /><category term="Future of Work" /><category term="Product Management" /><summary type="html"><![CDATA[Everyone treats the company brain as a knowledge problem. It isn't. The hard part is interpretation, and AI moved that problem rather than solving it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andrewmiracle.com/assets/images/uploads/2026/06/company-brain-interpretation-problem.webp" /><media:content medium="image" url="https://andrewmiracle.com/assets/images/uploads/2026/06/company-brain-interpretation-problem.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Everyone is running AI agents. Nobody can prove they work.</title><link href="https://andrewmiracle.com/2026/06/06/everyone-is-running-ai-agents.html" rel="alternate" type="text/html" title="Everyone is running AI agents. Nobody can prove they work." /><published>2026-06-06T00:00:00+00:00</published><updated>2026-06-06T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/06/06/everyone-is-running-ai-agents</id><content type="html" xml:base="https://andrewmiracle.com/2026/06/06/everyone-is-running-ai-agents.html"><![CDATA[<p>I keep coming back to one question in this AI era: where is the leverage actually showing up? Not the activity. The leverage. The dollar at the end of the motion.</p>

<p>Because here is what I am watching happen across companies right now. Everyone has agents in production. They are qualifying leads, writing code, generating ad creative, closing support tickets. They are burning real money doing it.<label for="mn-1" class="sidenote-toggle">⊕</label><input type="checkbox" id="mn-1" class="sidenote-toggle" /><span class="marginnote">I have started counting the silence in these meetings. The pause after “did it work” is the most honest signal in the entire AI economy right now.</span> And when someone finally asks the only question that matters, did this make us anything, the room goes quiet.</p>

<p>I wrote this as a builder’s brief, an idea I would chase if I had the cycles. But it is really about something I have said before. In AI-native work, activity is cheap and visible, and outcome is the only thing that survives a budget review. The company hiding inside that gap is a measurement company. Here is the full shape of it.</p>

<h2 id="the-problem">The problem</h2>

<p>A company builds an AI agent that qualifies inbound leads. It runs every day. It touches hundreds of prospects a week. It costs real money in API calls, infrastructure, and engineering time.</p>

<p>At the end of the quarter, the CFO asks: <em>did it work?</em></p>

<p>Nobody can answer. Not the CTO, not the VP of Sales, not the team that built it. They can tell you how many tokens it consumed. They can tell you the average latency. They cannot tell you whether it generated a single dollar of revenue.</p>

<p>This is not a small-company problem. It is the default state of nearly every organization deploying AI agents today.</p>

<blockquote>
  <p>Fewer than 1 in 100 enterprises report significant returns from their AI spend. The single biggest obstacle they name is measuring the return at all.<label for="sn-1" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-1" class="sidenote-toggle" /><span class="sidenote"><a href="https://www.mavvrik.ai/blog/forbes-ai-study-2025/" target="_blank" rel="noopener">Forbes Research, 2025 AI study.</a> Less than 1% of executives report ROI of 20% or more; 39% name measuring ROI and business impact as their top challenge. The gap between spend and proof is the whole thesis in one statistic.</span></p>
</blockquote>

<p>Pressure for financial proof has landed squarely on finance leaders. Nearly half of CFOs now say they are ultimately accountable for ensuring AI delivers measurable value, yet most enterprises still grade AI on operational terms like efficiency rather than dollars.<label for="sn-2" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-2" class="sidenote-toggle" /><span class="sidenote"><a href="https://www.cfo.com/news/so-far-few-cfos-see-substantial-roi-from-ai-spending-RPG/808249/" target="_blank" rel="noopener">CFO.com, 2025.</a> 48% of CFOs say they own AI accountability; CFO involvement in AI governance jumped from 1% to 38%. They are on the hook for a number they have no tool to produce.</span> They are on the hook for a number they have no tool to produce.</p>

<p>MIT found 95% of enterprise generative AI pilots deliver no measurable impact on the P&amp;L.<label for="sn-3" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-3" class="sidenote-toggle" /><span class="sidenote"><a href="https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo/" target="_blank" rel="noopener">MIT NANDA, The GenAI Divide (2025), via Fortune.</a> Only about 5% drive real revenue acceleration. Many of the other 95% may be working fine. Nobody can prove it.</span> Gartner predicts over 40% of agentic AI projects will be canceled by the end of 2027.<label for="sn-4" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-4" class="sidenote-toggle" /><span class="sidenote"><a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027" target="_blank" rel="noopener">Gartner, June 2025.</a> The same release projects agentic AI in 33% of enterprise software by 2028, up from less than 1% in 2024. Adoption and cancellation rising together is exactly what a missing measurement layer looks like.</span> The primary cause in both cases is not that the AI stopped working. It is that nobody could prove it was working in the first place.</p>

<p>This is a measurement problem. And measurement problems have software solutions.</p>

<h2 id="why-this-market-why-now">Why this market, why now</h2>

<p>The timing argument is specific, not generic. Three conditions converged in 2025 and early 2026 that did not exist before.</p>

<p><strong>Agents moved into production at scale.</strong> Gartner expects agentic AI in a third of enterprise software by 2028, up from less than 1% in 2024. That is not a forecast curiosity. It is the creation of a market. You cannot sell ROI measurement to a company running zero agents in production. That was most companies eighteen months ago. It is rapidly becoming a minority position.</p>

<p><strong>The budget scrutiny arrived.</strong> The first wave of enterprise AI adoption ran on goodwill and novelty. The budget renewal cycle is now completing its first full loop. CFOs who signed off on AI spend in 2024 are being asked to sign off again with one more requirement: show results. KPMG watched the share of leaders struggling to realize AI ROI roughly double in a single quarter, from 33% to 65%.<label for="sn-5" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-5" class="sidenote-toggle" /><span class="sidenote"><a href="https://kpmg.com/us/en/articles/2025/ai-quarterly-pulse-survey.html" target="_blank" rel="noopener">KPMG AI Quarterly Pulse Survey, 2025.</a> A near-doubling in one quarter is not a trend. It is a phase change.</span> The pain is acute and recent.</p>

<p><strong>The analogy market already proved the model.</strong> Mixpanel answers a simpler question, did users engage, and reached roughly $210M ARR at a $1.1B valuation. Amplitude, which adds predictive analytics, went public and reached $312M revenue in 2024.<label for="sn-6" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-6" class="sidenote-toggle" /><span class="sidenote">Reported figures via <a href="https://research.contrary.com/company/mixpanel" target="_blank" rel="noopener">Contrary Research (Mixpanel)</a> and <a href="https://getlatka.com/companies/amplitude" target="_blank" rel="noopener">Latka (Amplitude)</a>. Both built nine-figure businesses answering an easier question than the one in this brief.</span> Your question, did this agent generate revenue, is harder to answer, more directly tied to budget decisions, and has no incumbent. The comparable ceiling is materially higher.</p>

<p>Here is the market in numbers.</p>

<div class="not-prose my-8 grid grid-cols-2 sm:grid-cols-3 gap-px rounded-lg overflow-hidden ring-1 ring-black/10 dark:ring-white/10 bg-gray-200 dark:bg-dark-muted">
  <div class="bg-white dark:bg-dark-card p-5">
    <div class="font-serif text-3xl sm:text-4xl text-body dark:text-cream leading-none mb-2">$53B</div>
    <div class="font-sans text-xs text-gray-500 dark:text-gray-400 leading-relaxed">AI agents market by 2030, up from ~$8B in 2025 (MarketsandMarkets).</div>
  </div>
  <div class="bg-white dark:bg-dark-card p-5">
    <div class="font-serif text-3xl sm:text-4xl text-body dark:text-cream leading-none mb-2">46%</div>
    <div class="font-sans text-xs text-gray-500 dark:text-gray-400 leading-relaxed">CAGR through 2030. Faster than early cloud.</div>
  </div>
  <div class="bg-white dark:bg-dark-card p-5">
    <div class="font-serif text-3xl sm:text-4xl text-body dark:text-cream leading-none mb-2">33%</div>
    <div class="font-sans text-xs text-gray-500 dark:text-gray-400 leading-relaxed">Enterprise software with agentic AI by 2028, up from under 1% (Gartner).</div>
  </div>
  <div class="bg-white dark:bg-dark-card p-5">
    <div class="font-serif text-3xl sm:text-4xl text-body dark:text-cream leading-none mb-2">40%</div>
    <div class="font-sans text-xs text-gray-500 dark:text-gray-400 leading-relaxed">Agentic AI projects at risk of cancellation by 2027 (Gartner).</div>
  </div>
  <div class="bg-white dark:bg-dark-card p-5">
    <div class="font-serif text-3xl sm:text-4xl text-body dark:text-cream leading-none mb-2">65%</div>
    <div class="font-sans text-xs text-gray-500 dark:text-gray-400 leading-relaxed">Of leaders now struggle to realize AI ROI, up from 33% a quarter earlier (KPMG).</div>
  </div>
  <div class="bg-white dark:bg-dark-card p-5">
    <div class="font-serif text-3xl sm:text-4xl text-accent leading-none mb-2">&lt;1%</div>
    <div class="font-sans text-xs text-gray-500 dark:text-gray-400 leading-relaxed">Report significant ROI from AI today. That gap is your TAM (Forbes Research).</div>
  </div>
</div>

<h2 id="what-exists-today-and-what-it-misses">What exists today, and what it misses</h2>

<p>The current landscape of AI observability tools is not your competition. They are your upstream suppliers. The distinction matters for how you position and how you build.</p>

<table>
  <thead>
    <tr>
      <th>Tool</th>
      <th>What it answers</th>
      <th>What it cannot answer</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Portkey</td>
      <td>Cost, latency, routing, guardrails per call</td>
      <td>Did this workflow generate revenue?</td>
    </tr>
    <tr>
      <td>Langfuse</td>
      <td>Traces, evals, agent execution steps</td>
      <td>Did this execution close a deal?</td>
    </tr>
    <tr>
      <td>Helicone</td>
      <td>Requests, tokens, latency, model cost</td>
      <td>What was the business return?</td>
    </tr>
    <tr>
      <td>Braintrust</td>
      <td>Model quality, evals, benchmarks</td>
      <td>Was the quality gain worth the cost?</td>
    </tr>
    <tr>
      <td>OpenLIT</td>
      <td>OpenTelemetry traces, GPU cost, latency</td>
      <td>Revenue influenced, pipeline affected?</td>
    </tr>
    <tr>
      <td><strong>You</strong></td>
      <td>Consumes all of the above as inputs</td>
      <td>Nothing. You answer the question they skip.</td>
    </tr>
  </tbody>
</table>

<p>Every tool in that table stops at the boundary of the AI system. They are excellent at telling you what happened inside the model. None of them cross into the business system, Stripe, HubSpot, Salesforce, Shopify, where outcomes are actually recorded.</p>

<p>That boundary is the product. You sit between AI observability and business systems and do the one thing that justifies or kills the budget: connect cost to outcome.</p>

<h2 id="you-dont-have-to-start-from-scratch">You don’t have to start from scratch</h2>

<p>The open-source AI observability ecosystem matured dramatically in 2025. What would have required six months of instrumentation engineering eighteen months ago is now available as MIT or Apache 2.0 licensed infrastructure you can build on top of, not through.</p>

<p>This is the part most founders miss.<label for="mn-2" class="sidenote-toggle">⊕</label><input type="checkbox" id="mn-2" class="sidenote-toggle" /><span class="marginnote">The instinct to build the foundational layer first is almost always the trap. The foundation is usually the commodity. The thing you actually sell sits one layer up.</span> The instinct is to build the observability layer first because it feels foundational. The observability layer already exists and is free to use. Your job is to build the attribution layer above it.</p>

<div class="not-prose my-7">
  <a href="https://langfuse.com" target="_blank" rel="noopener" class="group flex items-stretch rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden no-underline hover:border-accent dark:hover:border-accent transition-colors">
    <div class="flex-1 min-w-0 p-4 sm:p-5">
      <div class="font-sans text-sm sm:text-base font-medium text-body dark:text-cream leading-snug line-clamp-2 group-hover:text-accent transition-colors">Langfuse: Open-source LLM engineering platform</div>
      <div class="font-sans text-xs sm:text-sm text-gray-600 dark:text-gray-400 mt-1 leading-relaxed line-clamp-2">MIT-licensed core: traces, evals, prompt management, agent execution. Self-host or cloud, no usage caps. Gives you structured agent execution data and cost per trace.</div>
      <div class="flex items-center gap-2 mt-3">
        <img src="https://www.google.com/s2/favicons?sz=64&amp;domain=langfuse.com" alt="" width="16" height="16" loading="lazy" class="w-4 h-4 rounded-sm m-0 ring-0 shrink-0" />
        <span class="font-mono text-xs text-gray-600 dark:text-gray-400 truncate">langfuse.com</span>
      </div>
    </div>
  </a>
</div>

<div class="not-prose my-7">
  <a href="https://portkey.ai" target="_blank" rel="noopener" class="group flex items-stretch rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden no-underline hover:border-accent dark:hover:border-accent transition-colors">
    <div class="flex-1 min-w-0 p-4 sm:p-5">
      <div class="font-sans text-sm sm:text-base font-medium text-body dark:text-cream leading-snug line-clamp-2 group-hover:text-accent transition-colors">Portkey: AI Gateway (Apache 2.0)</div>
      <div class="font-sans text-xs sm:text-sm text-gray-600 dark:text-gray-400 mt-1 leading-relaxed line-clamp-2">Open-sourced its full gateway in March 2026: routing, guardrails, governance, MCP gateway. Processes 2 trillion tokens/day. Gives you structured cost and routing logs with custom metadata passthrough.</div>
      <div class="flex items-center gap-2 mt-3">
        <img src="https://www.google.com/s2/favicons?sz=64&amp;domain=portkey.ai" alt="" width="16" height="16" loading="lazy" class="w-4 h-4 rounded-sm m-0 ring-0 shrink-0" />
        <span class="font-mono text-xs text-gray-600 dark:text-gray-400 truncate">portkey.ai</span>
      </div>
    </div>
  </a>
</div>

<div class="not-prose my-7">
  <a href="https://openlit.io" target="_blank" rel="noopener" class="group flex items-stretch rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden no-underline hover:border-accent dark:hover:border-accent transition-colors">
    <div class="flex-1 min-w-0 p-4 sm:p-5">
      <div class="font-sans text-sm sm:text-base font-medium text-body dark:text-cream leading-snug line-clamp-2 group-hover:text-accent transition-colors">OpenLIT: OpenTelemetry-native AI observability</div>
      <div class="font-sans text-xs sm:text-sm text-gray-600 dark:text-gray-400 mt-1 leading-relaxed line-clamp-2">Apache 2.0, SDK-based instrumentation with no proxy latency. Framework-agnostic, GPU cost tracking included. Gives you OTel-standard traces you can route into your own attribution pipeline.</div>
      <div class="flex items-center gap-2 mt-3">
        <img src="https://www.google.com/s2/favicons?sz=64&amp;domain=openlit.io" alt="" width="16" height="16" loading="lazy" class="w-4 h-4 rounded-sm m-0 ring-0 shrink-0" />
        <span class="font-mono text-xs text-gray-600 dark:text-gray-400 truncate">openlit.io</span>
      </div>
    </div>
  </a>
</div>

<div class="not-prose my-7">
  <a href="https://helicone.ai" target="_blank" rel="noopener" class="group flex items-stretch rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden no-underline hover:border-accent dark:hover:border-accent transition-colors">
    <div class="flex-1 min-w-0 p-4 sm:p-5">
      <div class="font-sans text-sm sm:text-base font-medium text-body dark:text-cream leading-snug line-clamp-2 group-hover:text-accent transition-colors">Helicone: One-line LLM proxy</div>
      <div class="font-sans text-xs sm:text-sm text-gray-600 dark:text-gray-400 mt-1 leading-relaxed line-clamp-2">Apache 2.0. Custom properties via headers attach business context to every call. Note: in maintenance mode post-acquisition, viable for prototyping, not long-term infra dependency.</div>
      <div class="flex items-center gap-2 mt-3">
        <img src="https://www.google.com/s2/favicons?sz=64&amp;domain=helicone.ai" alt="" width="16" height="16" loading="lazy" class="w-4 h-4 rounded-sm m-0 ring-0 shrink-0" />
        <span class="font-mono text-xs text-gray-600 dark:text-gray-400 truncate">helicone.ai</span>
      </div>
    </div>
  </a>
</div>

<p>The practical implication: you can instrument an entire AI agent stack for cost and trace data in a weekend using these tools, without writing a single line of observability infrastructure. All four allow commercial use, modification, and distribution.</p>

<p>What none of them provide, and what you build, is the downstream connector. The join from a run ID on an agent trace to the deal ID on a closed HubSpot opportunity. That join is where the product lives.</p>

<h2 id="how-to-approach-building-this">How to approach building this</h2>

<p>The architecture is simpler than it appears because you are not building observability. You are building attribution. Observability captures what happened inside the AI system. Attribution connects that record to what happened in the business system.</p>

<h3 id="the-core-data-model">The core data model</h3>

<p>Everything hinges on one design decision made before you write a line of application code: <strong>every AI workflow execution must carry a run ID (call it <code class="language-plaintext highlighter-rouge">workflow_run_id</code>) that travels into the downstream business system.</strong> This is the join key. Without it, attribution is impossible. With it, attribution is a SQL query.</p>

<p>When an agent qualifies a lead, that run ID gets stored on the HubSpot contact. When the contact converts, the same ID comes back on the deal-closed event. You match it against the trace for that run, sum the token costs, and the ROI calculation is arithmetic.</p>

<h3 id="three-tiers-of-attribution-built-in-this-order">Three tiers of attribution, built in this order</h3>

<ol>
  <li>
    <p><strong>Direct revenue attribution.</strong> Agent runs, then a Stripe charge fires in the same session. The run ID is on both events. Deterministic, not probabilistic. Zero ambiguity. This is v1. Ship this and nothing else until five paying customers validate the thesis.</p>
  </li>
  <li>
    <p><strong>Influenced revenue attribution.</strong> Agent qualifies a lead on Monday. Deal closes three weeks later. The run ID must persist on the CRM contact between those two events. This is a data-modeling problem, not a statistics problem. Build HubSpot and Salesforce connectors that store and carry that ID automatically. This is v2.</p>
  </li>
  <li>
    <p><strong>Cost-saved attribution.</strong> Agent resolves a support ticket that would have cost $18 in human labor. No revenue event fires. You need the customer’s baseline cost-per-task, a configuration input, not a sensor. Capture their labor-cost assumptions in onboarding, multiply by deflection count. This is v3, and it unlocks the cost-center budget owners in finance and operations.</p>
  </li>
</ol>

<h3 id="integrations-that-unlock-each-segment">Integrations that unlock each segment</h3>

<p>The integrations you build determine which companies can buy you. Build Stripe first, it covers every SaaS and e-commerce company running AI checkout flows. Build HubSpot second, it unlocks B2B sales teams running AI lead qualification. Build Salesforce third, it moves you into enterprise. Each integration is a new customer segment, not just a new feature.</p>

<h2 id="what-attribution-looks-like-across-verticals">What attribution looks like across verticals</h2>

<p>The measurement problem is not abstract. It plays out concretely, and differently, across the agent categories running in production right now. Four are where the pain is most acute and the join between AI cost and business outcome is most tractable.</p>

<div class="not-prose my-8 rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden">
  <div class="p-6 sm:p-7">
    <div class="font-mono text-[11px] uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400 mb-2">Use Case 01 / Ops Automation</div>
    <h3 class="font-display text-xl sm:text-2xl font-normal text-body dark:text-cream mt-0 mb-4">n8n Workflow Agents</h3>
    <div class="font-sans text-[15px] text-gray-600 dark:text-gray-300 leading-relaxed space-y-4 [&amp;&gt;p]:m-0">
      <p>n8n surpassed 230,000 active users in 2025, with users up roughly 6x year over year, and has become the default orchestration layer for teams building multi-step AI workflows without a full engineering team.<label for="sn-7" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-7" class="sidenote-toggle" /><span class="sidenote"><a href="https://sacra.com/c/n8n/" target="_blank" rel="noopener">n8n metrics via Sacra, 2025.</a> 230,000+ active users, roughly $40M ARR, a $2.5B valuation. Every execution exposes a unique ID over webhook and REST, your join key into everything the workflow touched.</span> A typical deployment chains an LLM call, a CRM write, an email send, a Slack notification, and a Stripe lookup inside one canvas. Each execution costs money. Nobody tracks what each execution produces.</p>
      <p>The angle here is operations cost displacement. An n8n workflow that automates a reconciliation task that used to take a finance analyst three hours a week has a calculable value. Your platform ingests the n8n execution log via webhook, matches it to the LLM cost from the observability layer, and computes workflow cost versus labor hours displaced versus error-rate reduction.</p>
    </div>
  </div>
  <div class="px-6 sm:px-7 py-3 border-t border-gray-200 dark:border-dark-muted bg-gray-50 dark:bg-dark-muted/40 font-mono text-[11px] sm:text-xs text-accent leading-relaxed">Outcome signal: labor cost saved per workflow run, compounded over execution frequency, expressed as monthly and annual margin impact.</div>
</div>

<div class="not-prose my-8 rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden">
  <div class="p-6 sm:p-7">
    <div class="font-mono text-[11px] uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400 mb-2">Use Case 02 / Engineering</div>
    <h3 class="font-display text-xl sm:text-2xl font-normal text-body dark:text-cream mt-0 mb-4">Coding Agents: GitHub &amp; Linear</h3>
    <div class="font-sans text-[15px] text-gray-600 dark:text-gray-300 leading-relaxed space-y-4 [&amp;&gt;p]:m-0">
      <p>Claude Code, Cursor, Copilot, and Devin are submitting pull requests autonomously. Public datasets now catalogue large volumes of agentic PRs across the major coding agents.<label for="sn-8" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-8" class="sidenote-toggle" /><span class="sidenote"><a href="https://arxiv.org/html/2604.03551" target="_blank" rel="noopener">AgenticFlict</a>, a large-scale dataset of merge conflicts in AI coding-agent pull requests on GitHub across Copilot, Cursor, Codex, Claude Code, and Devin. The Co-Authored-By trailer plus Linear's API let you join an agent session to a resolved ticket.</span> Engineering teams spend real money on these tools and tell their boards it "increases developer velocity." Pressed to quantify it, most fall back to PR count, which is nearly meaningless.</p>
      <p>More PRs merged does not equal more value shipped. Faros AI found 98% more PRs merged under high AI adoption while delivery metrics stayed flat, code churn nearly doubled, and PR size rose 154%.<label for="sn-9" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-9" class="sidenote-toggle" /><span class="sidenote"><a href="https://www.faros.ai/blog/ai-software-engineering" target="_blank" rel="noopener">Faros AI, The AI Productivity Paradox.</a> Telemetry from 10,000+ developers across 1,255 teams: 98% more PRs, 154% larger PRs, 91% longer reviews, no measurable DORA gain. Churn rose from 3.1% to 5.7%. Velocity is an input. Resolved, low-churn work is the outcome.</span> The industry is measuring the wrong thing.</p>
      <p>What you measure instead: agent session cost mapped to ticket resolution in Linear or GitHub Issues. A coding agent that closes a P1 bug in 40 minutes that would have taken a senior engineer two days has a precise dollar value. The join is agent session ID, to PR, to linked ticket, to severity and estimated resolution time.</p>
    </div>
  </div>
  <div class="px-6 sm:px-7 py-3 border-t border-gray-200 dark:border-dark-muted bg-gray-50 dark:bg-dark-muted/40 font-mono text-[11px] sm:text-xs text-accent leading-relaxed">Outcome signal: engineering hours displaced per merged PR, net of review overhead and rework cost.</div>
</div>

<div class="not-prose my-8 rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden">
  <div class="p-6 sm:p-7">
    <div class="font-mono text-[11px] uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400 mb-2">Use Case 03 / Content &amp; Social</div>
    <h3 class="font-display text-xl sm:text-2xl font-normal text-body dark:text-cream mt-0 mb-4">Agentic Creative for Ads &amp; Organic</h3>
    <div class="font-sans text-[15px] text-gray-600 dark:text-gray-300 leading-relaxed space-y-4 [&amp;&gt;p]:m-0">
      <p>This is the fastest-growing and least-measured category. Marketing teams run workflows that generate ad copy, LinkedIn posts, carousels, scripts, and email sequences at scale. The cost per piece is real and trackable. What happens after publishing is almost never connected back to the workflow that created it.</p>
      <p>The attribution chain is longer here, but the signal exists. An agent generates a Facebook ad variant. The variant gets a UTM stamped by the workflow. The UTM flows through the ad platform into GA4 or the warehouse. Conversions on that UTM map back to the workflow run ID that generated the creative. You now know cost to generate ($0.04 in tokens) versus revenue it drove ($3,200 in attributed sales). For organic, the signal is engagement and downstream lead-form fills, attributable when the publishing step writes the run ID into the post metadata.</p>
    </div>
  </div>
  <div class="px-6 sm:px-7 py-3 border-t border-gray-200 dark:border-dark-muted bg-gray-50 dark:bg-dark-muted/40 font-mono text-[11px] sm:text-xs text-accent leading-relaxed">Outcome signal: revenue or pipeline attributed per content variant, net of generation cost, segmented by creative type, platform, and model.</div>
</div>

<div class="not-prose my-8 rounded-lg border border-gray-200 dark:border-dark-muted bg-white dark:bg-dark-card overflow-hidden">
  <div class="p-6 sm:p-7">
    <div class="font-mono text-[11px] uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400 mb-2">Use Case 04 / Revenue</div>
    <h3 class="font-display text-xl sm:text-2xl font-normal text-body dark:text-cream mt-0 mb-4">AI Sales Agents</h3>
    <div class="font-sans text-[15px] text-gray-600 dark:text-gray-300 leading-relaxed space-y-4 [&amp;&gt;p]:m-0">
      <p>An agent scores inbound leads, enriches records, drafts outreach, and books meetings before a human rep touches the account. This is the most direct case because the output is a booked meeting or a closed deal, both recorded in the CRM with timestamps. The join is straightforward: agent run ID, to HubSpot contact, to deal-stage progression, to closed revenue.</p>
      <p>The problem is time lag. An agent qualifies a lead on a Tuesday. The deal closes eleven weeks later. Without the run ID persisting on the contact through the entire cycle, that causal chain breaks. Require customers to store the run ID on the contact at first touch. Everything downstream inherits it.</p>
    </div>
  </div>
  <div class="px-6 sm:px-7 py-3 border-t border-gray-200 dark:border-dark-muted bg-gray-50 dark:bg-dark-muted/40 font-mono text-[11px] sm:text-xs text-accent leading-relaxed">Outcome signal: closed revenue and pipeline value per agent-touched contact, segmented by agent version, prompt variant, and lead source.</div>
</div>

<p>These four are not exhaustive. They are the ones with existing, structured event data on the outcome side, which makes attribution tractable without statistical inference. The event exists. The cost exists. You are building the join.</p>

<h2 id="finding-your-first-sponsor-users">Finding your first sponsor users</h2>

<p>Do not build a waitlist. Do not run ads. Find ten companies that match two criteria exactly: they have AI agents running in production today, and they have a budget review in the next 90 days.</p>

<p>The signal you want in the first conversation is not “that sounds interesting.” It is the pause before answering when you ask, <em>do you know which of your AI workflows generated revenue last month?</em> A pause followed by a deflection to token counts means the pain is real and they have no answer. That is your customer.</p>

<p>The best first segment is Series A and B SaaS companies that wired a model into their core product in 2024 and are now in their first board renewal cycle. They have the setup to instrument quickly, the pressure to act immediately, and the product sense to give useful feedback.</p>

<p>For the first five, charge nothing in exchange for weekly feedback, the right to use their case study anonymously, and a signed letter of intent to pay when you hit a specific milestone, for example showing them $10K in attributable revenue from a workflow they could not previously measure. That letter is your fundraising ammunition. For users six through fifteen, charge a flat monthly retainer. Not usage-based yet. The goal at this stage is signal, not optimization.</p>

<h2 id="the-business-model-rough-shape">The business model, rough shape</h2>

<p>Long-term, this prices on AI spend under management, the way cloud-cost tools price on cloud spend, or processors price on transaction volume. Call it 0.5 to 1% of tracked AI spend with a per-seat floor for dashboard access.</p>

<p>A company running $50,000 a month through agents pays $250 to $500 a month. When the dashboard shows $240,000 in attributable revenue from that spend, the renewal is not a conversation. It is a formality.</p>

<p>The secondary line is the CFO reporting package: exportable ROI summaries, board-ready slide templates, budget forecasting on attribution data. Low engineering effort, high perceived value, the kind of feature a CFO requests by name and a VP renews without procurement.</p>

<blockquote>
  <p><strong>The one test before you build.</strong> Find someone running AI agents at a company with a real board. Ask them: <em>at your last board meeting, did anyone ask what your AI spend generated in revenue?</em> If the answer is yes and they had no answer to give, you have your first customer. If the answer is yes and they had a good answer, ask how they measured it, you have found a methodology to steal. If the answer is no, move to the next company. The board pressure is the forcing function. Without it, the pain is not acute enough to pay for a solution yet.</p>
</blockquote>

<p>The leverage in this AI era is not in running more agents. Everyone will run more agents. The leverage is in being the one who can prove which of them earned their keep. That is a measurement company, and right now it does not exist.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Artificial Intelligence" /><category term="AI" /><category term="AI Agents" /><category term="Startup" /><category term="Future of Work" /><summary type="html"><![CDATA[Enterprises are pouring billions into AI agents. Almost none can prove they earned a dollar. The measurement layer doesn't exist yet, and that gap is a company.]]></summary></entry><entry><title type="html">AI exposes your bullshit</title><link href="https://andrewmiracle.com/2026/06/01/ai-exposes-your-bullshit.html" rel="alternate" type="text/html" title="AI exposes your bullshit" /><published>2026-06-01T00:00:00+00:00</published><updated>2026-06-01T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/06/01/ai-exposes-your-bullshit</id><content type="html" xml:base="https://andrewmiracle.com/2026/06/01/ai-exposes-your-bullshit.html"><![CDATA[<p>AI exposes your bullshit.</p>

<p>Before, if you were a subpar employee, low rated, junior, non skilled, you could easily hide the fact that you were not skilled. You could hide behind other people’s work. You could show up to meetings while other people made up for your lack of skill, talent, capacity, or competence. You could survive because someone else was always absorbing the cost of your weakness.</p>

<p>Now, in organizations where everybody has to move fast, it is just so hard to bullshit your way through work again. You cannot bullshit your way out of an outcome because everyone already has a lot on their plate. They do not have time to keep looking over your work.</p>

<p>So you go to ChatGPT or Claude. You tell it what you think makes sense. It gives you an output. Then everybody on your team takes that output and brings it into their own stream of work, until everyone starts having the same conversation: at what point did the results we were supposed to deliver as a team regress?</p>

<p>And it all points to one place. It points to your output. It was your output that created the regression. It was the codebase you pushed. It was the PR that introduced those regressions. It was the document you shared, the presentation, the brief, the concept note, the deck. The thing you brought into the room because AI told you, “yes, this is correct.”</p>

<p>But you needed taste. You needed judgment. You needed the ability to discern what was behind the subtext. Because in business today, a simple statement like, “you can fill this part for me,” can mean more than what is written on the surface. It can mean, “use your judgment here.” It can mean, “you should already know what matters.” It can mean, “this part connects to something we discussed three weeks ago.” It can mean, “do not just complete the sentence, understand the context.”</p>

<p>So when your team is working on a test, a project, an idea, or an issue is flagged, you are not just supposed to read the main text. You are supposed to consider what is behind the text. Pattern recognition tells you that when someone says this, this is actually what it means in production. But you did not have that. So you took what Claude gave you, brought it back, and now everyone can literally see how incompetent you are. Everyone can see how underskilled you are.</p>

<p>And the worst part is this. If you are not doing anything to improve, and you think AI is making you deliver work faster, your name is probably next in line for elimination. Everyone is going to be quiet about it. But they all know it is going to happen. And when it happens, it will not be a surprise to anybody.</p>

<p>Now, that is the brutal part. But the more useful question is this: what does the remedy look like?</p>

<p>Because while incompetence is no longer an option, one of the other aspects of working like this today is that it is also hard to improve. No one has time to carry an apprentice along. No one has time to teach anybody anything. Everybody is moving fast across all workspaces.</p>

<p>So what does it look like for someone who actually wants to learn? What does it look like for someone who wants to pick up their slack in the age of AI? How do you build experience and expertise without relying on slop, especially when almost everything available to help you learn today also feels like slop?</p>

<p>That is the real challenge. AI can help you move faster. But if you do not have taste, context, judgment, and pattern recognition, it will not make you better. It will only make your gaps more visible.</p>

<p>And at work, in the age of AI, visibility is not always a gift. That is the new condition of AI native work. Everything moves faster. Everything is seen sooner. Everyone’s output is exposed to everyone else, almost in real time. In that kind of environment, being visible only rewards you if there is something worth seeing.</p>

<p>If you are competent, the speed carries you. The exposure works in your favor. Your judgment compounds in full view of the room. But if you are not, the same system that makes good work visible makes your gaps visible too. And it does it just as fast.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Artificial Intelligence" /><category term="AI" /><category term="Future of Work" /><category term="Engineering Culture" /><summary type="html"><![CDATA[You used to hide behind other people's work. Now AI hands you an answer, you ship it, and the whole team can see the gap you never closed.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andrewmiracle.com/assets/images/uploads/2026/06/ai-exposes-your-bullshit.webp" /><media:content medium="image" url="https://andrewmiracle.com/assets/images/uploads/2026/06/ai-exposes-your-bullshit.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Go check on the flower</title><link href="https://andrewmiracle.com/2026/05/10/go-check-on-the-flower.html" rel="alternate" type="text/html" title="Go check on the flower" /><published>2026-05-10T00:00:00+00:00</published><updated>2026-06-01T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/05/10/go-check-on-the-flower</id><content type="html" xml:base="https://andrewmiracle.com/2026/05/10/go-check-on-the-flower.html"><![CDATA[<p>Being a flower in a desert costs something. Nobody talks about that part.</p>

<p>The image is beautiful. Green, purple, yellow, sitting in the middle of all that brown and dust. We photograph it. We put it in slide decks. We tell its story on panels.</p>

<p><em>Look what grew here. Look what was possible here.</em></p>

<p>But nobody asks the flower.</p>

<p>You know this person. The founder who always picks up. The builder who shipped through the funding drought, the team departure, the market that didn’t show up on time. The one who always looks like they’re handling it. The one you reference when you want to prove something can survive in a hard place.</p>

<p>From the outside, they look like a beautiful work of art.</p>

<p>Here’s the question nobody asks. What does the flower have to do every day just to stay green right here? How much water does it have to find on its own? How deep do those roots have to go before they hit something? When was the last time anyone checked whether the soil around it was actually giving anything back?</p>

<p>We’ve made it normal to assume that because something looks beautiful in a hard place, it must be fine. That the glow means it’s thriving. That standing means it isn’t tired. That the founder who keeps shipping is the founder who has it figured out.</p>

<p>That isn’t how flowers work. It isn’t how people work either.</p>

<p>The founder who never complains isn’t a founder with nothing to complain about. The builder who keeps shipping hasn’t figured out how not to feel the weight of it. They’ve just decided, or been conditioned, to make their difficulty invisible. Because the world only applauds the bloom. It never applauds the root system that’s quietly screaming underground.</p>

<h2 id="the-cost-of-being-the-proof">The cost of being the proof</h2>

<p>There’s a particular tax on the people we point at.</p>

<p>When you become the example, your difficulty becomes inconvenient. Nobody wants the flower in the desert to admit it’s exhausted, because the story is more useful if the flower is fine. The story funds the next pitch. The story justifies the panel. The story tells everyone else this is possible without subsidy.</p>

<p>So the flower learns to keep blooming on schedule. Not because it has to, but because too many people have built their narrative around its survival.</p>

<p>That isn’t resilience. That’s performance with no exit.</p>

<p>Go check on the flower.</p>

<p>Not to take a photo. Not to reference it in your next talk about resilience and what’s possible when you refuse to quit.</p>

<p>Go check on it because it’s a living thing. And living things in hard conditions need more than admiration to survive.</p>

<p>Ask the real question. Not “how is the company doing?” That’s the wrong question, and they have a polished answer for it. Ask how they’re sleeping. Ask what they’ve stopped doing in the last six months that used to keep them whole. Ask whether they have anyone in their life right now who isn’t also depending on them to keep going.</p>

<p>Then wait for the real answer. Most flowers won’t say the thing on the first ask. The bloom is the brand now. Saying anything else feels like a contradiction of the story everyone needs them to keep telling.</p>

<p>But if you wait, the truth shows up. And once it does, you don’t have to fix it. You just have to not flinch.</p>

<p>That’s the whole job. You aren’t there to rescue the flower. You’re there to remind it the desert isn’t the only audience.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Musings" /><category term="Founders" /><category term="Mental Health" /><category term="Leadership" /><summary type="html"><![CDATA[We celebrate the founder who keeps blooming through the drought. Nobody asks what it costs them to stay green right where they are.]]></summary></entry><entry><title type="html">My new product manager is not who you think</title><link href="https://andrewmiracle.com/2026/05/10/my-new-product-manager-is-not-who-you-think.html" rel="alternate" type="text/html" title="My new product manager is not who you think" /><published>2026-05-10T00:00:00+00:00</published><updated>2026-05-10T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/05/10/my-new-product-manager-is-not-who-you-think</id><content type="html" xml:base="https://andrewmiracle.com/2026/05/10/my-new-product-manager-is-not-who-you-think.html"><![CDATA[<p>I have a new product manager.</p>

<p>It isn’t who you think. Or maybe it is.</p>

<p>My new product manager would have been Claude, if Claude was smart enough to be my product manager. But it isn’t.</p>

<p>My new product manager is the already-existing product manager who uses Claude.</p>

<p>That distinction is the whole essay.</p>

<p>The challenge isn’t just who can write tickets, or who can manage a roadmap. The challenge is that this person also has to be the custodian of the product vision. And that’s why being a product manager is no longer enough.</p>

<h2 id="what-building-looks-like-right-now">What building looks like right now</h2>

<p>If you have an idea, and you can write a clear PRD — what success looks like, what the functional requirements are, what the non-functional requirements are — you can get that app built in a day with the right AI tools. Maybe in hours. The day is me factoring in reviews.</p>

<p>One person with five custom-made AI agents can build almost anything, if the pipeline is right. Linear. Slack. GitHub. Claude Code. ChatGPT. MCP. The whole system.</p>

<p>So my product manager has to be someone close enough to understand the product vision. But that person isn’t going to look like the product manager we know today.</p>

<p>They need to understand what the customer wants. They need the bandwidth to do a complete user test on every freaking new feature. They need to be able to talk to Claude about the codebase.</p>

<p>Traditionally, product managers didn’t need to be close to the code. Now they do.</p>

<p>Product managers need to know where the codebase is. They need a GitHub account. They need access to Google Analytics, Segment, Mixpanel, and every other place where the product is quietly telling the truth. They need to be in direct conversation with stakeholders. They need to be in the sales calls. They need access to the meeting notes. They need to know what customers are saying before the roadmap becomes a museum of old assumptions.</p>

<h2 id="the-pm-as-decision-maker">The PM as decision maker</h2>

<p>The product manager today is the person who can decide where the product is going.</p>

<p>They can make a hard pivot today. They can say “this is what we’re doing now,” and the entire product motion changes around it.</p>

<p>When a feature ships from the design and engineering team — aka me and five other agents — the product manager is going to vet it. Test it. Document their expectation from the new feature that shipped six hours ago.</p>

<p>While that’s happening, they’re also in three or four sales calls with the BD team. They’re tracking user behavior. They’re reading analytics. They’re synthesizing feedback. They’re turning chaos into the next thing we should build.</p>

<p>To make this concrete: I ship two different builds every six hours. That means the product manager is supposed to tell me what I’m working on tomorrow.</p>

<p>Today, I can get my agent to synthesize all the feedback and ship. Then have the agent synthesize the next round of feedback and ship again. By the time I wake up tomorrow, my product manager should already have something new for me to cover as basis. Because they just synthesized customer feedback. They just ironed out a workflow. They just had a call with a potential customer. They found something that needs to be reviewed.</p>

<h2 id="the-pm-also-uses-claude">The PM also uses Claude</h2>

<p>Here’s the thing. The product manager isn’t going to manually write everything I need to do.</p>

<p>They’re going to use Claude. They’re going to use ChatGPT. And not inside a cute chatbot window. I mean a fully integrated workflow. Agentic ChatGPT with Dispatch or Remote Control. Claude Code. Claude CoWork. MCP. CLI. Connected tools.</p>

<p>Their work isn’t just planning. Their work is using MCP to read Google Analytics. Using MCP or the CLI to read GitHub. Finding out what I just pushed across all the codebases. Synthesizing design — because we no longer have to design only in Figma. A lot of that can now happen in Pencil.</p>

<p>While that’s happening, the product manager is joining calls with stakeholders, connecting Granola to those calls, giving Claude all the context it needs from Granola, and breaking down what I need to do next in order to move forward.</p>

<p>So when the product manager gives me a new breakdown, it’s fully contextual. All I have to do is move. Write the code. Verify the code works. Run the tests. Run the security suites. Ship.</p>

<h2 id="the-holy-trinity">The Holy Trinity</h2>

<p>In a way, it almost feels like the product manager could build the entire thing.</p>

<p>But in the real world, the scalable pattern is simpler. One product manager. One super-talented engineer. That might be everything you need to ship world-class products.</p>

<p>Teams are going to transition toward this. One product manager and one super-talented engineer become the core product unit. Outbound is left for the people who run outbound. The face of the company becomes the person doing TikTok, marketing, videos, dev rel, community, storytelling, distribution.</p>

<p>So a company today can be three people.</p>

<p>One product manager, who is really an operator. One engineer, who is really a full-stack, end-to-end builder. One face of the brand, who goes out there, talks to people, creates content, drives engagement, and brings everything back into the business.</p>

<p>That’s the new Holy Trinity. Product operator. Engineer. Distribution.</p>

<p>I don’t buy the one-person billion-dollar business idea. But I can buy the three-person billion-dollar business.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="AI" /><category term="Product Management" /><category term="Future of Work" /><summary type="html"><![CDATA[One PM. One engineer. One face. The new Holy Trinity of company building, and why the product manager has to change first.]]></summary></entry><entry><title type="html">I miss when we used to ask stupid questions</title><link href="https://andrewmiracle.com/2026/04/15/i-miss-when-we-used-to-ask-stupid-questions.html" rel="alternate" type="text/html" title="I miss when we used to ask stupid questions" /><published>2026-04-15T00:00:00+00:00</published><updated>2026-04-15T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/04/15/i-miss-when-we-used-to-ask-stupid-questions</id><content type="html" xml:base="https://andrewmiracle.com/2026/04/15/i-miss-when-we-used-to-ask-stupid-questions.html"><![CDATA[<p>Someone joins your team. You dump a wiki, three Notion pages, and a Slack channel backlog on them. They burn through it. And somewhere in the middle of burning through it, they ask the stupid questions.</p>

<p>“When you people say this is this, what does that mean?”</p>

<p>“When you say this is that, what does that mean?”</p>

<p>Those questions were the signal.</p>

<p>From a management point of view, that is how you checkpoint the progress of new talent on a team, or someone finding their footing in a new department. The stupid questions gave you visibility. They showed you where the person was confused, what they were picking up, and how far along they really were.</p>

<p>We do not get them anymore.</p>

<p>Not because people stopped being confused. People still get confused. They still join teams and feel overwhelmed by context they do not yet have. They still hit the gap between what they know and what the work demands.</p>

<p>The difference is where they take the confusion.</p>

<p>They paste the wiki into ChatGPT. They paste the Slack thread into Claude. They describe the codebase to Gemini and ask it to explain what they are looking at. The questions still happen. They just happen in private, with a machine that never judges them for asking.</p>

<p>And honestly, you cannot blame them. Asking a lead or a senior teammate “what does this mean” carries social cost. It always has. Nobody wants to be the person who does not get it yet. AI removed that cost entirely. You can ask the dumbest possible question, five different ways, at 2am, and nobody on your team will ever know.</p>

<p>So the questions went underground.</p>

<h2 id="the-visibility-problem">The visibility problem</h2>

<p>This changes something fundamental about how teams work.</p>

<p>When a new hire used to ask you why the billing service talks to two different databases, that question told you three things at once. It told you they had gotten far enough to find the billing service. It told you they did not yet understand the data architecture. And it told you they were actively trying to close the gap.</p>

<p>That was free signal. You did not have to schedule a check-in to get it. It just surfaced naturally because asking humans was the only option.</p>

<p>Now the signal is gone.</p>

<p>Instead, six hours before the deadline, or twelve hours before the deadline, you receive the first output. And while output is a good thing, it is also a coin flip. They might get it right. They might get it wrong. You have no way to tell which one is coming because you never saw the confusion that preceded it.</p>

<p>And when someone asks no questions and delivers polished output, you cannot tell the difference between someone who deeply understood the work and someone who got lucky with a prompt.</p>

<p>Both look the same on the surface. Clean deliverable. On time. Formatted well. Hits the brief. But one of them built understanding along the way and the other one outsourced the understanding to a machine and shipped whatever came back.</p>

<p>That is a risk. Because the moment the work gets harder, the moment the context is too specific for a general model to handle, the person who built real understanding will adapt. The person who did not will break. And you will not know which one is which until that moment arrives.</p>

<p>This is not a plea to ban AI from onboarding. That ship has sailed and it should have. AI is genuinely useful for bridging knowledge gaps, and pretending otherwise is not a strategy.</p>

<p>But it does change the job of leadership.</p>

<p>You have to assume you are not going to get the stupid questions. You have to design around that assumption instead of hoping people will still come to you with their confusion.</p>

<blockquote>
  <p>You can no longer wait until the final stretch to see the work for the first time.</p>
</blockquote>

<p>That means compressing delivery into shorter feedback cycles. Not one big checkpoint at the end. Multiple small ones throughout.</p>

<p>Early output, before anyone has had time to polish or over-rely on generated answers. Review and correction, where you can see the shape of someone’s thinking while it is still rough enough to be honest. Iteration and improvement, where the work gets better because you shaped it together rather than received it finished.</p>

<p>Each checkpoint gives you a chance to see where someone actually is instead of where their output suggests they are. It is more work. It is also the only way to replace the signal that the stupid questions used to give you for free.</p>

<h2 id="what-we-actually-lost">What we actually lost</h2>

<p>The stupid questions were never just a management tool. They were a relationship. Someone admitting they did not understand something yet, and someone else helping them get there. That exchange built trust. It built context that no wiki can replicate. It built the kind of team knowledge that lives in people, not documents.</p>

<p>AI is better than any tool we have ever had for closing information gaps. But information gaps were never the only thing the stupid questions were closing.</p>

<p>I still miss them.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="AI" /><category term="Leadership" /><category term="Future of Work" /><summary type="html"><![CDATA[Your team still has questions. They just ask a machine now. And that is a problem you cannot manage your way out of.]]></summary></entry><entry><title type="html">We are all thinking with the same brain</title><link href="https://andrewmiracle.com/2026/04/12/we-are-all-thinking-with-the-same-brain.html" rel="alternate" type="text/html" title="We are all thinking with the same brain" /><published>2026-04-12T00:00:00+00:00</published><updated>2026-04-12T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/04/12/we-are-all-thinking-with-the-same-brain</id><content type="html" xml:base="https://andrewmiracle.com/2026/04/12/we-are-all-thinking-with-the-same-brain.html"><![CDATA[<p>You ask AI to pressure test your idea. It sounds solid.</p>

<p>Your cofounder asks the same model. Also solid. Your board member runs it through a different prompt. Same conclusion. Your teammate asks from a different angle. Still holds up.</p>

<p>Four people. Four conversations. One brain.</p>

<p>Most of us are using the same LLMs, or at least models trained on roughly the same corpus, shaped by similar safety layers, similar incentives, and often a similar worldview. The outputs look different on the surface. Different wording, different examples, different tone. But underneath, they’re pointing in the same direction.</p>

<p>And that creates a bug.</p>

<p>Today, people use AI for almost everything. Advice, research, understanding new topics, pressure testing ideas, making decisions. Often, that makes sense. Especially when you’re entering a domain where you don’t yet have enough context or expertise to think clearly on your own. That’s exactly when an AI system feels most useful.</p>

<p>But here’s the problem.</p>

<p>What happens when I bring an idea to AI, especially an idea that depends on a certain worldview to make sense, and I use that system to help me shape it, challenge it, or validate it?</p>

<p>Then my teammate does the same.
Then my board member does the same.
Then my cofounder, partner, or friend does the same.</p>

<p>The wording will differ.
The examples will differ.
The style of explanation will differ.</p>

<p>But very often, the conclusion will be almost identical.</p>

<p>Not because the idea is necessarily right, but because everyone is querying the same layer of intelligence, trained on the same patterns, rewarded toward the same kind of coherence, and biased toward the same kind of acceptable answer.</p>

<p>So what looks like independent validation may actually be consensus laundering.</p>

<p>It feels like multiple people have pressure tested the idea from different angles. But maybe they haven’t. Maybe they’ve all just asked the same machine to think from slightly different seats at the same table.</p>

<p>That’s the bug.</p>

<p>Counterarguments start becoming a luxury.
Real epistemic friction becomes rare.
And the more persuasive these systems get, the easier it becomes to confuse fluency with truth. Or alignment with rigor.</p>

<p>This matters more than people think.</p>

<p>Because in teams, in companies, in decision making environments, we often don’t need perfect certainty. We just need something that sounds reasonable enough for everyone to move forward. Once AI can produce that level of reasonable coherence for everyone in the room, bad ideas travel further simply because they meet the minimum standard of collective comfort.</p>

<p>Not truth.
Not depth.
Not real challenge.</p>

<p>Just enough sense to pass.</p>

<p>So the question isn’t only whether AI can help us think.</p>

<p>The question is how we avoid thinking inside a closed loop where the same machine keeps reflecting the same assumptions back to all of us, until agreement feels like evidence.</p>

<p>Maybe the next skill isn’t better prompting.
Maybe it’s designing for disagreement.</p>

<p>Seeking out people with real domain knowledge.
Stress testing ideas outside model consensus.
Using different systems with different priors.
Separating “this sounds right” from “this survives serious opposition.”</p>

<p>Because if we’re all using the same intelligence to validate the same ideas, then sooner or later, agreement stops being useful.</p>

<p>It becomes a mirror.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Artificial Intelligence" /><category term="AI" /><category term="Critical Thinking" /><category term="Decision Making" /><summary type="html"><![CDATA[If you asked AI to validate your idea and so did your cofounder, your board, and your team, you did not get four opinions. You got one.]]></summary></entry><entry><title type="html">Your AI sessions could be your next digital product</title><link href="https://andrewmiracle.com/2026/03/26/your-ai-sessions-could-be-your-next-digital-product.html" rel="alternate" type="text/html" title="Your AI sessions could be your next digital product" /><published>2026-03-26T00:00:00+00:00</published><updated>2026-03-26T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/03/26/your-ai-sessions-could-be-your-next-digital-product</id><content type="html" xml:base="https://andrewmiracle.com/2026/03/26/your-ai-sessions-could-be-your-next-digital-product.html"><![CDATA[<p>The most valuable thing you produce with AI is not the output.</p>

<p>It is the conversation that got you there.</p>

<p>What you asked. What you asked next. What you ignored. What you circled back to. Where the draft broke and how you fixed the framing. Why you went left instead of right when both directions looked fine.</p>

<p>That trail is worth something.</p>

<p>And right now, you close the tab and it disappears.</p>

<p>I think that is about to change.</p>

<h2 id="a-quick-primer">A quick primer</h2>

<p>For most of the internet’s history, the valuable thing was information itself. Someone knew something you did not. They wrote it down, recorded it, organized it into modules, and charged you for access. That was the entire digital product economy for over a decade. E-books. Video courses. Membership sites. Masterclasses. The person who knew the thing sold the knowing.</p>

<p>Courses were the pinnacle of that era. Not because they were the best way to learn, but because they were the most natural way to package expertise for sale. You take what is in your head, you structure it into lessons, you put a price on it, and you scale it infinitely because delivery costs nothing.</p>

<p>That worked. It still works. But it stopped being the only game.</p>

<p>Because at some point, people realized they did not just need information. They needed structure. They needed the thinking already done, the system already built, the workflow already laid out so they could skip straight to doing.</p>

<p>That is when templates took over. Notion made an entire economy out of this. People were not buying empty pages. They were buying someone else’s organized way of thinking. The information was already free by then. Google had taken care of that. The structure was the product.</p>

<p>Airtable bases. Figma kits. Spreadsheet models. Prompt libraries. The whole template marketplace era was built on one insight: people will pay to skip the organizing step.</p>

<p>That era is still running. But I think the next layer is already forming and most people have not named it yet.</p>

<p>Your Claude sessions. Your ChatGPT conversations. Your Codex workflows. Your cloud coding sessions. The actual working trails you leave behind while you build, write, design, edit, debug, research, decide.</p>

<p>Those are becoming a product category.</p>

<p>Not because someone is going to sit down and read your transcripts.</p>

<p>Because someone is going to feed them to their agent.</p>

<h2 id="the-buyer-is-not-a-student-the-buyer-is-an-agent">The buyer is not a student. The buyer is an agent.</h2>

<p>This is the part that changes the economics.</p>

<p>When someone buys a course, the human has to do the work. Watch the videos. Take the notes. Try to apply it. Forget most of it. Go back and rewatch. The transfer cost is enormous. Most people never finish. Everyone knows this.</p>

<p>When someone buys a template, the transfer cost drops. Duplicate and go. But a template is frozen. It captures one arrangement at one moment in time. It does not show you what to do when the template does not fit your situation.</p>

<p>A session library is a different kind of product because the end consumer is different.</p>

<p>The consumer is not a human trying to learn.</p>

<p>The consumer is an agent trying to perform.</p>

<p>Think about what that means. An agent does not need motivation. It does not need the six-hour preamble before the useful part. It does not need to be convinced. It needs context. It needs examples of how decisions were made, what was tried, what worked, what did not, and why the approach changed.</p>

<p>That is exactly what your working sessions contain.</p>

<p>The first prompt that missed. The second one that got closer. The pivot when you realized the framing was wrong. The moment the whole thing clicked.</p>

<p>A human reads that and maybe learns something. An agent reads that and starts performing differently. It pattern-matches against your judgment and begins producing work that reflects it.</p>

<p>That is the difference. A course hopes the human will internalize it. A session library lets the agent absorb it directly.</p>

<h2 id="what-actually-disappears-when-you-close-the-tab">What actually disappears when you close the tab</h2>

<p>You finish a session. You got the output you needed. You close the tab.</p>

<p>What just vanished?</p>

<p>Every decision you made along the way. Every dead end you navigated out of. Every moment where you chose one direction over another and the choice was informed by something you know but never wrote down.</p>

<p>That is judgment. And it is the scarcest thing in the entire AI workflow.</p>

<p>Output is getting cheaper every month. Models get faster, cheaper, more capable. The cost of generating text, code, designs, analysis, all of it is falling.</p>

<p>But the cost of knowing what to generate, what to throw away, what to push further, and when to change direction entirely? That has not moved.</p>

<p>That judgment lives in your sessions. Not in the final deliverable. Not in your portfolio. In the messy, real, unpolished working trail where the actual calls were made.</p>

<p>If you curate that trail instead of discarding it, you have something.</p>

<h2 id="what-a-session-library-actually-is">What a session library actually is</h2>

<p>It is not a transcript dump. That would be useless.</p>

<p>It is a curated archive of working sessions organized by domain, by problem type, by workflow pattern. Think of it like a reference library, but instead of books, the units are real conversations where real work happened.</p>

<p>A developer who has spent six months building production systems with Claude has hundreds of sessions. Architecture decisions. Debugging workflows. Refactoring strategies. Deployment patterns. Edge cases that only show up in production. All of it real. All of it showing what actually worked and what did not.</p>

<p>Now imagine another developer who is earlier in that process. They do not need a course on prompting. They do not need a template for a system design doc. They need their agent to already understand how a more experienced developer thinks through these problems.</p>

<p>They subscribe to the session library. They point their agent at it. And now their agent is not starting from zero. It is starting from someone else’s accumulated decision-making.</p>

<p>That is not “teach me.” That is “make my tools smarter.”</p>

<p>Same thing applies to designers, editors, strategists, researchers. Anyone whose work increasingly happens in conversation with AI. Their sessions are not logs. They are transferable context. They are portable judgment.</p>

<h2 id="why-this-has-subscription-dynamics">Why this has subscription dynamics</h2>

<p>One session is a piece of content. You could sell it as a one-off and it would be worth something.</p>

<p>But a continuously growing library of sessions is a different thing. Every new session the creator adds makes the archive more valuable. More problems covered. More edge cases handled. More examples of judgment applied to situations the subscriber has not encountered yet.</p>

<p>That is compounding value. That is why people would stay subscribed.</p>

<p>Not because they are locked in. Because the library keeps getting better. Because the agent keeps getting more context to draw from. Because next month’s sessions will cover things that have not happened yet.</p>

<p>A course is finished the day it ships. A template is finished the day it ships. A session library is never finished. It grows with the creator’s work.</p>

<p>That is a fundamentally different product shape.</p>

<h2 id="this-is-not-a-course-business">This is not a course business</h2>

<p>I do not think this ends up looking like a course business.</p>

<p>And I do not think it fits in the consulting bucket either.</p>

<p>It is something closer to a subscription archive. A growing collection of expert workflow that agents can consume. Not polished. Not cleaned up. Not the usual case study where the mess has been removed and everything looks inevitable in hindsight.</p>

<p>The mess is the product.</p>

<p>The failed attempts. The restarts. The tangents that turned out to matter. The moments where the direction changed and the reason was something subtle.</p>

<p>That mess is where judgment actually lives. The clean version is the one that hides it.</p>

<p>And I think a lot of people would rather subscribe to a library that makes their agent smarter than sit through another course that asks them to become smarter themselves.</p>

<p>Not because they are lazy.</p>

<p>Because the bottleneck moved.</p>

<p>The bottleneck used to be knowledge. Courses solved that. Then it was structure. Templates solved that. Now the bottleneck is context. How do you get an agent to work the way someone experienced would work?</p>

<p>You give it a library of how that person actually works.</p>

<p>That is the product.</p>

<p>Not the output.</p>

<p>Not the template.</p>

<p>Not the course.</p>

<p>The session library. The curated, growing, living archive of how the work actually happened. Packaged not for humans to study, but for agents to absorb.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="AI" /><category term="Future of Work" /><category term="Creator Economy" /><summary type="html"><![CDATA[The most valuable thing you produce with AI is not the output. It is the conversation that delivers that output, what you asked, how you asked.]]></summary></entry><entry><title type="html">What does the next era of leverage look like?</title><link href="https://andrewmiracle.com/2026/02/23/what-does-the-next-era-of-leverage-look-like.html" rel="alternate" type="text/html" title="What does the next era of leverage look like?" /><published>2026-02-23T00:00:00+00:00</published><updated>2026-02-23T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/02/23/what-does-the-next-era-of-leverage-look-like</id><content type="html" xml:base="https://andrewmiracle.com/2026/02/23/what-does-the-next-era-of-leverage-look-like.html"><![CDATA[<p>I’ve been thinking a lot about leverage lately. The real thing. The structural force that determines why some people, some companies, some entire civilizations end up shaping the world while others just participate in it.</p>

<p>It started with a question I couldn’t shake: if leverage is the most powerful force in economic history, and if it shifts form every few generations, then what does the next shift look like? And more selfishly, am I positioned anywhere near it?</p>

<p>I don’t have a clean answer yet. But I’ve been studying the pattern, going back about five hundred years, and what I keep finding is that the people who won big in each era weren’t necessarily the smartest or the hardest working. They were the ones who recognized the new form of leverage before it became obvious.</p>

<p>So let me walk through what I’ve found.</p>

<hr />

<h2 id="the-voyage-that-changed-the-math">The Voyage That Changed the Math</h2>

<p>In 1484, a Genoese sailor named Christopher Columbus walked into the Portuguese court with a pitch: fund a western sea route to Asia. King John II listened, consulted his advisors, and said no. The math was wrong. Columbus had underestimated the circumference of the Earth by about 25%.</p>

<p>He spent the next eight years pitching. Portugal rejected him. Spain’s scholars rejected him. He was about to try France when, in early 1492, Ferdinand and Isabella finally said yes. They’d just conquered Granada. They had momentum, a little cash, and the appetite for a bet.</p>

<p>The total investment came to roughly two million maravedis, maybe five to ten million dollars in today’s money. A meaningful sum, but not a kingdom-ending one. Columbus negotiated himself <a href="https://en.wikipedia.org/wiki/Capitulations_of_Santa_Fe">10% of all profits</a> from whatever he found, the title of Admiral of the Ocean Sea, and governorship of any new lands. All of it hereditary.</p>

<p>Then they waited. Months at sea. No updates. No feedback loop. Just capital deployed into the unknown.</p>

<p>Columbus never reached Asia. He died believing he had. But what he actually did was far more consequential. He stumbled into an entirely new map. And over the next 150 years, roughly 1500 to 1650, Spain extracted massive amounts of gold and silver from the Americas, from mines like Potosí in Bolivia and others across Mexico and Peru, and shipped it all back to Spain. The return on that two million maravedis was, by any measure, one of the greatest in human history.</p>

<p>Here’s the part I keep coming back to: before this, wealth mostly came from inheritance, conquest, or controlling existing trade routes. Columbus introduced something new. Capital deployed against uncertainty, not certainty, could expand the map itself.</p>

<p>The explorers got the fame. But the real leverage belonged to the people who understood the structure of the bet. And a century later, that understanding evolved into something even more powerful.</p>

<h2 id="when-leverage-became-a-product">When Leverage Became a Product</h2>

<p>In 1602, Dutch merchants did something no one had done before. They created the <a href="https://en.wikipedia.org/wiki/Dutch_East_India_Company">Dutch East India Company</a>, the VOC, and sold shares in it to the public. Over 1,100 investors bought in during the first offering. One of them was a maid named Neeltgen Cornelis. There was no minimum investment.</p>

<p>Think about what that meant. A century earlier, you needed to be a monarch to fund a voyage. Now, a domestic worker in Amsterdam could buy a piece of one. The joint-stock company had turned leverage itself into a product.</p>

<p>At its peak, the VOC was valued at what historians estimate to be <a href="https://www.visualcapitalist.com/most-valuable-companies-all-time/">$7-8 trillion in modern dollars</a>. It maintained a private army of 260,000 soldiers, larger than most European nations’ militaries. It had the authority to negotiate treaties, build forts, and wage war.</p>

<p>The structure was the innovation. Not the ships. Not the spices. The structure. Risk distributed across thousands of small investors rather than concentrated in a single crown. That template, the publicly traded corporation, is still the dominant vehicle for leverage five centuries later.</p>

<hr />

<h2 id="the-interface-play">The Interface Play</h2>

<p>I want to pause on something I noticed while reading about the British Empire, because it changed how I think about leverage entirely.</p>

<p>Britain was a small, damp island. It controlled a quarter of the world’s population and a quarter of its land mass. The usual narrative is conquest. But if you look at how it actually worked, the pattern is more subtle.</p>

<p>The British East India Company didn’t start by owning territory. It started by controlling trade interfaces. Ports. Shipping routes. Tax collection rights. In 1765, the Mughal Emperor <a href="https://en.wikipedia.org/wiki/East_India_Company">granted the Company <em>dewani</em></a>, the right to collect taxes, in Bengal, Bihar, and Orissa. Not ownership of the land. Just the right to collect from it. Indian subjects paid £22.7 million per year directly to the Company.</p>

<p>Admiral Sir John Fisher once listed what he called the “Five Keys to the World”: the Strait of Dover, the Strait of Gibraltar, the Suez Canal, the Strait of Malacca, and the Cape of Good Hope. Five chokepoints. Britain controlled all of them. Not the continents they connected, just the passages between them.</p>

<p>This was, I think, the first large-scale derivative economy. You didn’t own the asset. You owned the yield.</p>

<p>The human suffering was immense, and I don’t want to minimize that. But from a purely structural perspective, it revealed something that keeps showing up in every leverage era since: control the interface, and you control the value that flows through it.</p>

<hr />

<h2 id="building-the-map-instead-of-expanding-it">Building the Map Instead of Expanding It</h2>

<p>The industrial era inverted the model. Instead of controlling routes between places, the new leverage was in building the infrastructure that made places function.</p>

<p>John D. Rockefeller understood this better than maybe anyone in history. He didn’t try to own oil wells. Wells were risky, unpredictable, subject to the chaos of discovery. Instead, he focused on <a href="https://en.wikipedia.org/wiki/Standard_Oil">refining</a>. By 1900, Standard Oil controlled 90% of America’s oil refining capacity but only about 14% of crude supply. The wells were someone else’s problem. The processing layer, the interface between raw material and usable product, was his.</p>

<p>His tactics were ruthless. In early 1872, within three months, he bought out or bankrupted 22 of 26 competing refineries in Cleveland. He negotiated railroad discounts by promising 60 carloads per day, volume leverage that smaller competitors couldn’t match. He bought up barrel makers, chemical suppliers, even the train cars themselves. By controlling every link in the chain between well and consumer, he made competition structurally impossible.</p>

<p>Andrew Carnegie did the same thing with steel. He didn’t just make steel, he owned the iron mines in Minnesota’s Mesabi Range, the coal fields, the coke ovens, the transport fleet, and the mills in Pittsburgh. Full vertical integration. By 1900, Carnegie Steel <a href="https://en.wikipedia.org/wiki/Carnegie_Steel_Company">produced more steel than all of Great Britain</a>. When J.P. Morgan bought him out, the price was $480 million, creating the world’s first billion-dollar corporation in U.S. Steel.</p>

<p>Cornelius Vanderbilt played the same game with railroads. When New York City resisted his consolidation in 1867, he simply moved his Hudson River Railroad terminus to East Albany, cutting the city off. They capitulated immediately. He understood that whoever controls the infrastructure doesn’t need permission from anyone who depends on it.</p>

<p>These weren’t adventurers. They were builders. And the leverage wasn’t in discovering new territory, it was in becoming the chokepoint of existing territory.
What’s interesting is that this playbook isn’t just history. Someone is running it right now, in real time, on a continent most investors still underestimate.</p>

<p>Nigeria is Africa’s largest oil producer. For decades, the country exported crude and imported it back as refined gasoline, diesel, and kerosene. The <a href="https://www.rigzone.com/news/wire/nigeria_hopes_new_refinery_will_cut_26b_import_bill-23-may-2023-172836-article/">import bill ran to $23 billion a year by 2022</a>, consuming roughly 40% of the country’s foreign exchange earnings. An oil-producing nation, spending almost half its dollar reserves buying back its own product in finished form. That’s not an economy. That’s a dependency.</p>

<p>Aliko Dangote looked at that and saw exactly what Rockefeller saw in 1870. The wells weren’t the chokepoint. The refinery was.</p>

<p>In May 2023, he opened the <a href="https://en.wikipedia.org/wiki/Dangote_refinery">Dangote Refinery</a> in Lagos. 650,000 barrels per day. The largest single-train refinery in the world. Cost: $19 billion, the biggest private industrial investment in African history. By early 2025, it supplied over 60% of Nigeria’s petrol and represented two-thirds of the country’s total refining capacity. He’s already announced plans to <a href="https://oilprice.com/Latest-Energy-News/World-News/Dangote-Drives-Nigerias-Domestic-Fuel-Supply-Above-57-as-Imports-Retreat.html">expand to 1.4 million barrels per day</a>, which would make it the largest refinery on earth.</p>

<p>But the refinery isn’t where Dangote started. He started with cement. Nigeria had limestone everywhere but almost no cement industry. The country was importing bags of finished cement from overseas at massive markup. Dangote built local plants. Today, <a href="https://dangotecement.com/">Dangote Cement holds 61% of the Nigerian market</a> and operates across ten African countries with over 52 million tonnes of annual capacity. Nigeria now saves an estimated $3 billion a year from not importing cement.</p>

<p>Then sugar. Dangote Sugar Refinery in Lagos, the largest in sub-Saharan Africa, processes raw cane into finished white sugar and controls over 70% of the Nigerian market. Then fertilizer, a $2.5 billion urea plant, the largest in Africa, 3 million tonnes a year, which launched right as the Russia-Ukraine war disrupted global fertilizer supply.</p>

<p>The pattern is identical every time. Africa exports raw materials. The world processes them. Africa buys back the finished product at ten times the cost. Dangote inserts himself as the processing layer and captures the margin that had been flowing overseas.</p>

<p>Carnegie controlled the interface between iron ore and the railroads that built America. Rockefeller controlled the interface between crude oil and the lamps and engines that powered it. Dangote is controlling the interface between African raw materials and African consumers. The playbook hasn’t changed. The geography has.</p>

<p>His net worth roughly <a href="https://furtherafrica.com/2025/02/21/aliko-dangotes-net-worth-hits-23-9b-as-mega-refinery-transforms-africa/">doubled to $24 billion</a> once the refinery went from construction to operation. The wealth didn’t come from discovering a resource or inventing a technology. It came from positioning himself at the chokepoint between what Africa produces and what Africa consumes. That’s leverage.</p>

<hr />

<h2 id="code-changes-everything">Code Changes Everything</h2>

<p>Then came software. And the rules changed again.</p>

<p>In August 2011, Marc Andreessen published an essay in the Wall Street Journal titled <a href="https://a16z.com/why-software-is-eating-the-world/">“Why Software Is Eating the World.”</a> His argument was that software companies were replacing traditional industries’ fundamental economics. Distribution costs collapsed. Scale went exponential. A teenager in a dorm room could reach billions of people for essentially zero marginal cost.</p>

<p>What Andreessen described was real, but I think Naval Ravikant articulated the deeper shift more precisely. In his now-famous 2018 tweetstorm, he wrote:</p>

<blockquote>
  <p>“Code and media are permissionless leverage. They’re the leverage behind the newly rich. You can create software and media that works for you while you sleep.”</p>
</blockquote>

<p>That word, “permissionless,” is the key. Every prior form of leverage required someone’s permission. Columbus needed a queen. The VOC needed investors. Rockefeller needed railroads. But code? Code just needed to work. You didn’t need to ask anyone.</p>

<p>Kevin Kelly saw this coming even earlier. In 2008, he published <a href="https://kk.org/thetechnium/1000-true-fans/">“1,000 True Fans,”</a> an essay arguing that a creator needed only a thousand people willing to spend $100 a year to make a living. No label. No publisher. No gatekeeper. Direct-to-fan distribution through the internet meant the interface between creator and audience had been permanently disintermediated.</p>

<p>The leverage formula shifted from capital and infrastructure to code and networks. And for the first time in history, it was available to individuals.</p>

<hr />

<h2 id="the-attention-shift">The Attention Shift</h2>

<p>Then something interesting happened. Content became infinite. And attention became scarce.</p>

<p>Herbert Simon predicted this in 1971, long before the internet existed. In a paper called “Designing Organizations for an Information-Rich World,” he wrote:</p>

<blockquote>
  <p>“A wealth of information creates a <em>poverty of attention</em> and a need to allocate that attention efficiently among the overabundance of information sources that might consume it.”</p>
</blockquote>

<p>It took about forty years for that prediction to fully materialize. As of 2025, the average person spends nearly three hours per day on social media alone. For Gen Z, it’s over three hours. TikTok averages nearly an hour per user per day. YouTube about the same.</p>

<p>The smartest companies realized that the new chokepoint wasn’t servers or content or even devices. It was habit. Social platforms, streaming services, AI assistants, they’re not fighting for revenue first. They’re fighting for daily repetition. Because habit converts. Into belief. Into spending. Into identity.</p>

<p>Control attention, and you sit upstream of every other market. That’s the new interface.</p>

<hr />

<h2 id="and-now-intelligence">And Now, Intelligence</h2>

<p>Which brings me to where I’ve been spending most of my time thinking. Because I believe we’re standing at another shift. And this one feels different from the others.</p>

<p>AI doesn’t just create a new interface. It abstracts human effort itself. Just as SaaS abstracted hardware, AI is abstracting the labor layer. You’re no longer hiring people to do work. You’re interfacing with intelligence directly.</p>

<p>The numbers are starting to tell the story. <a href="https://research.contrary.com/company/midjourney">Midjourney</a>, the AI image generation company, reportedly hit $200 million in annual revenue in 2023 with a team of around 40 people. Cursor, the AI coding tool, reached $500 million in annual recurring revenue with fewer than 50 employees. Levels IO (the twitter guy) built Interior AI, then Photo AI to millions in annual revenue. <em>Alone</em>.</p>

<p>Dario Amodei, the CEO of Anthropic, has predicted that AI may soon enable a single person to operate a billion-dollar company. Sam Altman has talked about ten-person companies with billion-dollar valuations becoming normal. For context, the average AI unicorn in 2024 reached its billion-dollar valuation with about 200 employees in two years. Non-AI unicorns typically needed 400+ employees and nine years.</p>

<p>And here’s what makes this moment feel especially charged: we’re still at the very beginning. Despite all the noise, <a href="https://medium.com/aimonks/why-97-of-ai-users-dont-pay-and-what-this-means-5241f22434a7">only about 3% of AI users actually pay</a> for the tools. That’s roughly 0.7% of the world’s population. <a href="https://www.pewresearch.org/short-reads/2025/10/06/about-1-in-5-us-workers-now-use-ai-in-their-job-up-since-last-year/">Pew Research found</a> that only about 21% of US workers use AI in any capacity at work, and daily usage sits around 14% globally. The vast majority of the workforce hasn’t even started.</p>

<p>Which means if you’re already building on this layer, you’re not early in the way people were early to social media in 2010. You’re early in the way Rockefeller was early to refining in 1870, before anyone else realized where the real chokepoint would form.</p>

<p>The leverage multiplier is no longer geography. Not infrastructure. Not distribution. It’s capability. One person can now write like a content team, code like an engineering squad, analyze like a consulting firm, and design like an agency. The ratio of labor to output has been permanently altered.</p>

<hr />

<h2 id="what-im-still-working-out">What I’m Still Working Out</h2>

<p>I started this essay trying to answer a question about what the next era of leverage looks like. And I think the pattern is clear enough: every few generations, a new form of leverage emerges, and the people who position themselves near it early are the ones who shape what comes next.</p>

<p>Ships. Joint-stock companies. Trade routes. Railroads. Refineries. Code. Attention. And now, intelligence.</p>

<p>But here’s what I keep sitting with. Throughout all of this history, the most transformative ambition has never been about working harder within the existing system. It’s been about recognizing when the system is shifting and repositioning before it compounds. Junior developers ask me which programming language to learn. I always tell them the same thing: pick the one that’s emerging, not the one that’s dominant. Position yourself before the compound effect, not after.</p>

<p>In 1492, that meant backing the voyage. In 1602, it meant buying shares. In 1870, it meant controlling the refinery. In 2011, it meant writing software. In 2018, it meant building an audience.</p>

<p>And now? I think it means getting as close as possible to the intelligence layer. Not just using AI tools, but understanding what they make possible that wasn’t possible before. Building on top of them. Thinking in terms of capability, not headcount.</p>

<p>The ships are being built again. The maps are being redrawn. From the inside, it feels uncertain. From the outside, looking back, it will probably look inevitable.</p>

<p>I don’t have this fully figured out yet. But I know enough to know where I want to be standing when it compounds.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="AI" /><category term="Future of Work" /><category term="Startup" /><summary type="html"><![CDATA[From Columbus to AI - how leverage has evolved through geography, infrastructure, code, attention, and now intelligence. The question isn't whether a new era is forming, but whether your ambition is pointed at it.]]></summary></entry><entry><title type="html">My Claude Codes Better than Yours</title><link href="https://andrewmiracle.com/2026/02/14/my-claude-is-better-than-yours.html" rel="alternate" type="text/html" title="My Claude Codes Better than Yours" /><published>2026-02-14T00:00:00+00:00</published><updated>2026-02-14T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/02/14/my-claude-is-better-than-yours</id><content type="html" xml:base="https://andrewmiracle.com/2026/02/14/my-claude-is-better-than-yours.html"><![CDATA[<p>The recent phenomenon I’ve noticed, and honestly it’s funny when you think about it, is what working with AI agents now looks like inside collaborative environments, workspaces, organizations. There’s this subtle undercurrent.</p>

<blockquote>
  <p>Call it: “my Claude is better than yours.”</p>
</blockquote>

<p>Someone feels superior because they’re on the $200 Claude Max plan versus the $20 plan. Or because they have a custom configuration running the Anthropic API through OpenCode, chaining two or three or four models through OpenRouter to ship code and deploy features.</p>

<p>Versus you, using regular Claude Opus 4.6. Or <a href="https://github.com/openai/codex">OpenAI Codex CLI</a>. Or whatever the “standard” setup is.</p>

<p>And here’s where it gets interesting. During code reviews or feature acceptance sessions, a feature implemented by an AI, not a human, gets rewritten. Not because it’s broken. Not because it fails spec. But because the lead engineer, head developer, or engineering manager feels their Claude setup is superior enough to implement that feature “better.”</p>

<p>So they regenerate it. On the surface, it looks like tool tribalism.</p>

<hr />

<p>But here’s the thesis:</p>

<blockquote>
  <p><strong>This isn’t about Claude plans. It’s about identity displacement.</strong></p>
</blockquote>

<p>When AI becomes the primary executor, the only remaining place to compete is in how well you wield it. What used to be “I write better code than you” becomes “I extract better intelligence than you.”</p>

<p>That shift is subtle, but psychologically loaded. Because now the output is not purely yours. It is co-produced. And when someone rewrites an AI-generated feature with their own stack, they are not just editing code. They are reasserting authorship. They are saying, consciously or not: “My interface with intelligence is superior.”</p>

<hr />

<p>This is where the tension comes from.</p>

<p>If a human rewrote your code, you could debate architecture, logic, taste. When someone regenerates your AI’s output with their own agent, the debate becomes invisible. The comparison is between invisible processes.</p>

<p>Prompt versus prompt.
Model versus model.
Taste versus taste.
Spec versus spec.</p>

<p>And because the intelligence is externalized, the ego has nowhere obvious to stand. So it relocates. To configuration. To tooling. To orchestration.</p>

<p>That is what looks like “my Claude is better than yours.” But underneath it is something more fragile: a fear of being out-extracted. Out-prompted. Out-orchestrated.</p>

<hr />

<p>And this is exactly what made frameworks like <a href="https://github.com/openclaw/openclaw">OpenClaw</a> explode in popularity. An open-source AI agent that anyone can configure, customize, extend. It became the arena where orchestration identity lives.</p>

<p>But even OpenClaw isn’t enough. The community is fracturing along the same fault line. People are arguing that OpenClaw is too slow, too heavy, too Node.js. So now there’s <a href="https://github.com/sipeed/picoclaw">PicoClaw</a> and <a href="https://github.com/nearai/ironclaw">IronClaw</a><label for="sn-1" class="sidenote-toggle sidenote-number"></label><input type="checkbox" id="sn-1" class="sidenote-toggle" /><span class="sidenote">PicoClaw is a full rewrite in Go — a single binary that boots in one second on a $10 RISC-V board with &lt;10MB RAM. 5,000 stars in four days. IronClaw is a Rust rewrite from NEAR AI that sandboxes every tool in isolated WebAssembly containers.</span>, because the argument is shifting from “faster” to “more secure.”</p>

<p>The stated reasons are speed and security. And those are real engineering concerns. But underneath? It’s the same tension wearing a different outfit.</p>

<p>“My interface with AI is more superior to yours.”</p>

<p>Go versus TypeScript. Rust versus Go. Single binary versus container. Sandboxed versus permissive. Each port is a declaration of values, and each value is a proxy for identity. The language you rewrite the agent in says something about who you think you are as an engineer. And that’s the point.</p>

<hr />

<blockquote>
  <p>Is it a trust issue? Is it a communication problem? Is it insecurity dressed up as infrastructure preference?</p>
</blockquote>

<p>Maybe all of it. But one thing is clear.</p>

<blockquote>
  <p>In AI-native workplaces, competence is no longer just what you can build. It’s what your interface with intelligence can produce. And that feels deeply personal.</p>
</blockquote>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Musings" /><category term="🌴 Flourishing" /><category term="AI" /><category term="Engineering Culture" /><category term="Future of Work" /><summary type="html"><![CDATA[In AI native workplaces, the tension is no longer who writes better code. It's who extracts better intelligence. When AI writes the code, what's left to compete over?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andrewmiracle.com/assets/images/uploads/2026/02/let-the-lobsters-brawl.webp" /><media:content medium="image" url="https://andrewmiracle.com/assets/images/uploads/2026/02/let-the-lobsters-brawl.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AI has taken my job, yours is next</title><link href="https://andrewmiracle.com/2026/02/11/ai-has-taken-my-job-yours-is-next.html" rel="alternate" type="text/html" title="AI has taken my job, yours is next" /><published>2026-02-11T00:00:00+00:00</published><updated>2026-02-11T00:00:00+00:00</updated><id>https://andrewmiracle.com/2026/02/11/ai-has-taken-my-job-yours-is-next</id><content type="html" xml:base="https://andrewmiracle.com/2026/02/11/ai-has-taken-my-job-yours-is-next.html"><![CDATA[<p>In 1835, around 75% of cotton mills in Britain were steam powered.</p>

<p>There were over 50,000 power looms running across the country. And something profound had happened. Machines no longer assisted skilled textile workers. They replaced the need for textile skill altogether.</p>

<p>Factories became so efficient that Britain could outperform India, even though Indian labor was cheaper. British mills could produce in 2,000 hours what Indian producers needed 50,000 hours to achieve.</p>

<p>That is not incremental improvement. That is structural displacement.</p>

<p>I keep thinking about this because I think we are watching it happen again. Not in cotton. In knowledge work. And I am not saying this from the outside.</p>

<p>I am a two-time CTO. I have built products across AI, Web3, and SaaS at startups backed by Y Combinator, Techstars, and OpenAI. I founded a pan-African hackathon community of 12,000 developers across 22 countries. That is exactly the kind of work AI is now learning to do.</p>

<p>For years, AI felt like a helpful tool.</p>

<p>Now it is something else entirely.</p>

<h2 id="the-deliberate-choice">The deliberate choice</h2>

<p>The AI labs made a strategic decision that most people still have not fully processed. They made AI great at writing code first.</p>

<p>Not because they only cared about software engineers. Because code builds everything else.</p>

<p>If an AI can write code, it can help build the next version of itself. A smarter version writes better code. Better code builds an even smarter version. That is not theory. That is a feedback loop, and feedback loops compound.</p>

<p>Recently, OpenAI released a new coding model and stated something in the documentation that stopped me:</p>

<blockquote>
  <p>The model was instrumental in creating itself, used to debug training, manage deployment, and diagnose evaluations.</p>
</blockquote>

<p>Read that again.</p>

<p>AI helped build AI.</p>

<p>This is not a prediction about the future. It is a description of the present. Intelligence is being applied to improve intelligence. And once that loop starts running, it does not slow down on its own.</p>

<p>I experienced this firsthand. I used Claude to migrate my entire website, 456 pages of content across multiple categories, from WordPress to Jekyll in one shot.</p>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I'm still processing this shock 😮 <br /><br />Opus 4.6 just migrated my entire website, 456 pages of content across multiple categories, from WordPress to Jekyll in one shot. <br /><br />this felt like watching an industry category boundary collapse in realtime 😵. <a href="https://t.co/Z7gpyizSDO">pic.twitter.com/Z7gpyizSDO</a></p>&mdash; drew.sh (@letandrewcook) <a href="https://twitter.com/letandrewcook/status/2021148286652924050?ref_src=twsrc%5Etfw">February 10, 2026</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That felt like watching an industry category boundary collapse in real time. Not because the tool was clever. Because the economics changed underneath me while I was using it.</p>

<h2 id="the-cotton-mill-pattern">The cotton mill pattern</h2>

<p>This is the part most people miss because they are focused on capability. They ask “can AI do my job?” when the real question is about economics.</p>

<p>AI does not need to be better than you at everything.</p>

<p>It needs to be 80% as good, 10 times faster, and 100 times cheaper.</p>

<p>That changes the market. Just like steam-powered mills did not need to produce perfect cloth. They just needed to produce it faster and at scale. The quality was good enough. The speed and cost made the comparison irrelevant.</p>

<p>When textile automation hit, skilled workers lost leverage. Semi-skilled operators increased. Output exploded. Entire industries reorganized around machine capability, not human craft.</p>

<p>We are watching the same pattern unfold in knowledge work.</p>

<p>The experience tech workers have had over the last year, watching AI go from “useful assistant” to “this can do parts of my job better than I can,” is about to spread to every knowledge industry. Law. Finance. Medicine. Accounting. Consulting. Writing. Design.</p>

<p>Not in ten years.</p>

<p>In one to five. Possibly less.</p>

<p>The AI labs are already working on it. The same reasoning capabilities they built for math and coding are being extended into every professional domain. Legal reasoning. Financial modeling. Medical diagnosis. The code-first strategy was the beachhead. Everything else is the campaign.</p>

<h2 id="the-honest-objection">The honest objection</h2>

<p>If you used early AI models in 2023 and thought “this makes stuff up” or “this is not that impressive,” you were right. They hallucinated. They were inconsistent. They were limited.</p>

<p>But in AI time, two years is ancient history.</p>

<p>The difference between those early systems and today’s models is the difference between a prototype and infrastructure. Judging today’s AI by your 2023 experience is like judging the modern internet by dial-up. The name is the same. The thing is not.</p>

<h2 id="the-window">The window</h2>

<p>There is a brief window right now that I think most people do not appreciate.</p>

<p>Most companies are still underestimating what is happening. Most professionals are still casually experimenting. Very few are deeply proficient.</p>

<p>That creates asymmetry.</p>

<p>The person who walks into a meeting and says “I used AI to run this analysis in an hour instead of three days” instantly changes their perceived value. Not eventually. Immediately. In environments driven by speed and leverage, the person who multiplies output becomes indispensable.</p>

<p>For decades, career growth followed a predictable pattern. Gain experience. Build expertise. Move up slowly. Now there is a new accelerant, and it is not experience or credentials. It is tool mastery.</p>

<p>The professionals who win in this era will not be the ones who fear automation. They will be the ones who orchestrate it.</p>

<p>The shift is not “AI will replace you.”</p>

<p>The shift is that people who know how to use AI will replace people who do not.</p>

<h2 id="the-hand-spinner-question">The hand-spinner question</h2>

<p>Here is where the cotton mill parallel gets uncomfortable.</p>

<p>When steam power arrived, the question was not whether the technology was ready. It was whether the workers would adapt before the economics made their current approach irrelevant.</p>

<p>Most did not. Not because they were stupid. Because the change felt gradual until it was sudden. Because it is hard to abandon a skill you spent years building. Because the new way of working felt like cheating until it became the standard.</p>

<p>The question is not “will AI take my job?”</p>

<p>The better question is: am I operating like a hand-spinner in a steam-powered world?</p>

<p>Because the cotton mill of 1836 did not ask permission to disrupt.</p>

<p>And AI will not either.</p>

<p>The winners are not going to be the ones who resist the machine. They are going to be the ones who learn to run it. The window for that is open right now. It will not stay open.</p>

<p>Not because the opportunity disappears.</p>

<p>Because the advantage does.</p>

<p>When everyone is fluent, fluency stops being a differentiator. Right now it still is. That is the moment we are in. And I think most people are going to realize it about two years too late.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="AI" /><category term="Engineering" /><category term="Future of Work" /><summary type="html"><![CDATA[After studying past technological revolutions, here is what most people still get wrong about AI and what it means for their careers.]]></summary></entry><entry><title type="html">The Side Effect of Vibe Coding Nobody Talks About</title><link href="https://andrewmiracle.com/2026/02/10/i-read-code-faster-because-of-ai.html" rel="alternate" type="text/html" title="The Side Effect of Vibe Coding Nobody Talks About" /><published>2026-02-10T12:00:00+00:00</published><updated>2026-02-10T12:00:00+00:00</updated><id>https://andrewmiracle.com/2026/02/10/the-side-effect-of-vibe-coding-nobody-talks-about</id><content type="html" xml:base="https://andrewmiracle.com/2026/02/10/i-read-code-faster-because-of-ai.html"><![CDATA[<p>I have gotten used to reviewing 1,000 plus lines of code. That sounds like a flex, but it mostly means my baseline for “normal” changed.</p>

<p>Lately I catch myself staring at a 100 line diff and feeling oddly impatient. Not because it is too much, but because my brain wants to move faster than it used to.</p>

<p>And it hit me:</p>

<p>AI coding has indirectly made my ability to read code faster.</p>

<p>Not slower.
Not lazier.
Faster.</p>

<p>When you spend weeks reviewing AI output, you build a different kind of pattern recognition. You stop reading line by line and start scanning for structure. Where does the data flow start. Where does it cross a boundary. What assumptions are baked in. You zoom out first, then zoom in on the few lines that actually carry risk.</p>

<p>That habit sticks.</p>

<p>Now when a teammate opens a PR, I am not hunting for syntax. I am hunting for intent. Does this change match the goal. Does it make the system clearer or noisier. Did it introduce new edges I should care about.</p>

<p>AI did not make me lazy. It made me a faster reader. The same way speed reading does not remove comprehension, it changes how you search for it.</p>

<p>The funny part is that the smaller diffs are still important. They are just not interesting in the same way anymore. They feel like tiny islands compared to the continent I am used to walking across.</p>

<p>I am not sure if that is good or bad yet. But it is real.</p>

<p>Seedling note. I am still figuring out what this does to code review culture and how to keep that speed without losing care.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Musings" /><category term="🌱 Seedling" /><category term="Ai" /><category term="Engineering" /><category term="Productivity" /><summary type="html"><![CDATA[A subtle shift from AI coding: reading code faster, and why tiny diffs suddenly feel like a slowdown worth unpacking.]]></summary></entry><entry><title type="html">From WordPress to Jekyll: Rebuilding My Digital Home</title><link href="https://andrewmiracle.com/2026/02/09/from-wordpress-to-jekyll-rebuilding-my-digital-home.html" rel="alternate" type="text/html" title="From WordPress to Jekyll: Rebuilding My Digital Home" /><published>2026-02-09T12:00:00+00:00</published><updated>2026-02-09T12:00:00+00:00</updated><id>https://andrewmiracle.com/2026/02/09/from-wordpress-to-jekyll-rebuilding-my-digital-home</id><content type="html" xml:base="https://andrewmiracle.com/2026/02/09/from-wordpress-to-jekyll-rebuilding-my-digital-home.html"><![CDATA[<p>Every personal website is a time capsule. I have rebuilt mine so many times that you can read the layers like a timeline, both for the web and for how I write.</p>

<hr />

<h2 id="the-early-days-jekyll--tachyons-on-netlify">The Early Days: Jekyll + Tachyons on Netlify</h2>

<p>The first real version of this site ran on <a href="https://jekyllrb.com/">Jekyll</a> with the <a href="http://tachyons.io">Tachyons CSS framework</a>, deployed to <a href="https://www.netlify.com">Netlify</a>. It was simple, fast, and version-controlled. I wrote in <a href="https://www.markdownguide.org/getting-started/">Markdown</a>, pushed to GitHub, and Netlify rebuilt the site automatically. There were earlier experiments too: <a href="https://bourbon.andrewmiracle.com/">Bourbon</a> and <a href="https://koolamusic.github.io/">Donna</a> were previous incarnations, each one a snapshot of whatever CSS approach I was excited about at the time.</p>

<p>The workflow was elegant, but after a while writing Markdown in a code editor felt like <em>more code</em> on top of the code I was already writing all day. I wanted a real editor, a place to draft ideas, rearrange blocks visually, and publish without touching a terminal.</p>

<h2 id="the-wordpress-years-bedrock-on-digitalocean">The WordPress Years: Bedrock on DigitalOcean</h2>

<p>So I switched to WordPress, specifically the <a href="https://roots.io/bedrock/">Bedrock</a> stack, hosted on <a href="https://www.digitalocean.com/">DigitalOcean</a> with MySQL. Bedrock gave me the Git-based workflow I wanted: plugins and themes managed through <a href="https://getcomposer.org/">Composer</a> via <a href="https://wpackagist.org/">WPackagist</a>, configuration in environment variables, and a clean separation between WordPress core and my customizations.</p>

<p>The <a href="https://wordpress.org/news/2023/03/dolphy/">Gutenberg block editor</a> sealed the deal. The WordPress team did genuinely impressive work on the editing experience. I could draft things in chunks, embed code blocks with syntax highlighting via the Code Block Pro plugin, drop in images, and publish when ready. It felt like the right tool for someone who wanted to <em>write</em> rather than <em>build</em>.</p>

<p>And it worked. For a couple of years, I published regularly. The site accumulated 429 pages of content spanning blog posts from 2012 to 2025, a portfolio of experiments, talks, and what would eventually become a digital garden.</p>

<p>But WordPress carries weight. The database. The hosting. The plugin updates. The PHP runtime. The attack surface. Every time I wanted to make a design change, I was fighting a theme system that wasn’t built for the kind of precise, utility-first styling I had grown used to. And the Gutenberg output, while great for writing, produced HTML that was heavy with wrapper divs, inline styles, and WordPress-specific class names.</p>

<p>Then traffic started growing. What used to be a manageable trickle of visitors turned into consistent daily hits that pushed the DigitalOcean droplet to its limits. I found myself needing to upgrade the server just to keep the site responsive under load. For a <em>personal blog</em>. WordPress was doing dynamic page rendering, querying the database, and executing PHP on every single request. It felt absurd to be scaling infrastructure for what is fundamentally a collection of static documents. That was the final nudge. If I’m going to pay for more compute, I’d rather pay for none at all.</p>

<figure class="full-bleed my-4">
  <div class="max-w-7xl mx-auto px-4 sm:px-6 grid grid-cols-1 md:grid-cols-2 gap-4">
    <img src="/assets/images/uploads/2026/02/web-traffic-30-days.png" alt="Cloudflare web traffic dashboard showing 17.93k unique visitors over 30 days" class="w-full ring-1 ring-black/5 dark:ring-white/5" loading="lazy" />
    <img src="/assets/images/uploads/2026/02/ai-crawl-metrics-24h.png" alt="Cloudflare AI crawl control showing 606 bot requests in 24 hours from PetalBot, Amazonbot, OAI-SearchBot and others" class="w-full ring-1 ring-black/5 dark:ring-white/5" loading="lazy" />
  </div>
  <figcaption class="text-center text-xs text-gray-500 dark:text-gray-400 font-sans">Cloudflare analytics showing 17.93k unique visitors in 30 days and an average of ~600 AI crawl requests every 24 hours</figcaption>
</figure>

<h2 id="setting-up-the-starter">Setting Up the Starter</h2>

<p>Before touching any WordPress content, I set up the destination: a clean Jekyll 4.4 project with Tailwind CSS 3.4, the Typography plugin, and PostCSS wired through <code class="language-plaintext highlighter-rouge">jekyll-postcss-v2</code>. This meant getting Ruby versions, Bundler, and npm modules all playing nicely together, making sure <code class="language-plaintext highlighter-rouge">Gemfile.lock</code> had the right platforms for deployment, that the PostCSS pipeline worked without cssnano (which has a css-tree incompatibility), and that the build actually produced output before any content went in.</p>

<p>This was deliberate. The bulk of the real work in this migration was two things: <code class="language-plaintext highlighter-rouge">wget --mirror</code> to capture the source, and getting the Jekyll + Tailwind starter into a deployable state. Everything else, the actual content migration across 429 pages, turned out to be the easy part, but only because the foundation was solid first.</p>

<h2 id="the-migration-429-pages-one-python-script">The Migration: 429 Pages, One Python Script</h2>

<p>The migration started with a question: <em>what if I just wget the entire site and work from there?</em></p>

<p>That’s essentially what happened. I used <code class="language-plaintext highlighter-rouge">wget --mirror</code> to create a static HTML clone of the WordPress site, all 429 HTML files of it. But here’s the thing about WordPress: most of those pages aren’t actual content. They’re the taxonomy and archive cruft that WordPress generates automatically. The extraction script’s first job was filtering all of that out:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>andrewmiracle.com/                  ← 429 HTML files from wget --mirror
├── 2012/…/slug/                    ✓ blog posts (YYYY/MM/DD/slug)
├── 2019/…/slug/                    ✓ blog posts
├── 2023/…/slug/                    ✓ blog posts
├── 2025/…/slug/                    ✓ blog posts
├── lab/slug/                       ✓ portfolio experiments
├── garden/slug/                    ✓ digital garden notes
├── talks/slug/                     ✓ presentations
├── whoami/                         ✓ special page
│
├── category/programming/           ✗ taxonomy archive
├── category/ai/                    ✗ taxonomy archive
├── tag/docker/                     ✗ taxonomy archive
├── tag/llm/                        ✗ taxonomy archive
├── author/andrew/                  ✗ author archive
├── page/2/                         ✗ pagination
├── page/3/                         ✗ pagination
├── feed/                           ✗ RSS/Atom feeds
├── wp-json/                        ✗ REST API endpoints
├── wp/wp-admin/                    ✗ WordPress admin
├── cdn-cgi/                        ✗ Cloudflare routes
├── app/                            ✗ WordPress app routes
└── portfolio-category/             ✗ portfolio taxonomy
</code></pre></div></div>

<p>Roughly half the mirrored files were category listings, tag archives, paginated index pages, and WordPress infrastructure routes, none of it actual content. After discarding those, the <a href="https://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a>-based parser classified the remaining pages by URL pattern: anything matching <code class="language-plaintext highlighter-rouge">YYYY/MM/DD/slug</code> became a blog post, <code class="language-plaintext highlighter-rouge">lab/slug</code> became a portfolio item, and so on. Frontmatter was extracted from Open Graph and article meta tags. Content was pulled from the <code class="language-plaintext highlighter-rouge">div.post-content</code> area between the entry header and article footer.</p>

<p>Images were the tedious part. The script preferred <code class="language-plaintext highlighter-rouge">data-src</code> over <code class="language-plaintext highlighter-rouge">src</code> for lazy-loaded images, stripped WordPress’s <code class="language-plaintext highlighter-rouge">?resize=...&amp;ssl=1</code> query parameters, and downloaded everything to local paths under <code class="language-plaintext highlighter-rouge">assets/images/uploads/</code>. Hundreds of images, each one needing to resolve correctly.</p>

<h3 id="the-8gb-image-problem">The 8GB Image Problem</h3>

<p>Then came the unpleasant surprise. The downloaded <code class="language-plaintext highlighter-rouge">uploads/</code> directory weighed in at over <strong>8GB</strong>. For a personal blog. The culprit was WordPress’s <a href="https://developer.wordpress.org/reference/functions/add_image_size/">thumbnail regeneration system</a>. Every time you upload a single image, WordPress generates multiple resized copies: a 150x150 thumbnail, a 300-wide medium, a 1024-wide large, plus any custom sizes registered by the theme or plugins. A single 2MB photograph would spawn 5-6 variants with filenames like <code class="language-plaintext highlighter-rouge">headshot-150x150.jpg</code>, <code class="language-plaintext highlighter-rouge">headshot-300x200.jpg</code>, <code class="language-plaintext highlighter-rouge">headshot-1024x683.jpg</code>. Multiply that across hundreds of uploads over several years and the bloat is staggering.</p>

<p>The fix required a dedicated cleanup script that worked in three passes:</p>

<ol>
  <li><strong>Rewrite references</strong>: scan every content file for image paths containing WordPress’s <code class="language-plaintext highlighter-rouge">-NNNxNNN</code> dimension suffix and rewrite them to point to the original full-size file instead</li>
  <li><strong>Promote orphans</strong>: when a thumbnail existed but the original was missing (WordPress sometimes only kept the resized version), copy the thumbnail to the original filename before rewriting</li>
  <li><strong>Purge the rest</strong>: delete every remaining file matching the <code class="language-plaintext highlighter-rouge">-NNNxNNN</code> thumbnail pattern, then clean up empty directories</li>
</ol>

<p>The <code class="language-plaintext highlighter-rouge">assets/images/uploads/</code> directory went from 8GB down to a fraction of that. Every image on the site now references exactly one file, the original, with no redundant WordPress-generated variants cluttering the repository.</p>

<p>But the static HTML clone only captured what was <em>published</em>. WordPress keeps drafts, revisions, and unpublished content locked inside its MySQL database. So I exported the full SQL dump and wrote a second parser to walk the <code class="language-plaintext highlighter-rouge">wp_posts</code> table, pulling out every draft, pending, and privately published post alongside their metadata from <code class="language-plaintext highlighter-rouge">wp_postmeta</code>. This gave me a full picture of how content was structured on the WordPress side: which posts were drafts I had abandoned, which were works in progress worth finishing, how categories and tags were assigned, and what the internal linking patterns looked like. It was basically an audit of years of accumulated writing, surfacing things I had forgotten I started.</p>

<p>The result: 181 blog posts, 23 lab projects, plus special pages like the garden, talks, and about page, all with clean <a href="https://jekyllrb.com/docs/front-matter/">Jekyll frontmatter</a> and the original HTML content preserved. The drafts from the database export became a backlog of ideas to revisit in the new system.</p>

<h2 id="jekyll--tailwind-the-current-stack">Jekyll + Tailwind: The Current Stack</h2>

<p>The new site runs on <a href="https://jekyllrb.com/">Jekyll</a> with <a href="https://tailwindcss.com/">Tailwind CSS 3.4</a> and the <a href="https://tailwindcss.com/docs/typography-plugin">Typography plugin</a>. No database. No server. Just files, folders, and a build step.</p>

<p>The type system uses four fonts: <strong><a href="https://fonts.google.com/specimen/STIX+Two+Text">STIX Two Text</a></strong> for headings and prose, <strong>Noto Sans</strong> for body text, <strong>Shantell Sans</strong> for navigation elements, and <strong>Intel One Mono</strong> for code. STIX won out over Montaga, Sedan, and Newsreader after I tested all four side-by-side. I wrote up the full comparison in <a href="/notes/exploring-serif-fonts/">a note on exploring serif fonts</a>. STIX isn’t the most exciting choice, but it’s the only one that works everywhere: headings, body, captions, footnotes, without compromise. For a site that’s part garden, part portfolio, part blog, flexibility wins over flair. Syntax highlighting is handled client-side by <a href="https://prismjs.com/">Prism.js</a> with the Tomorrow Night theme and an autoloader that fetches language grammars on demand.</p>

<p>Content is organized as <a href="https://jekyllrb.com/docs/collections/">collections</a>: <code class="language-plaintext highlighter-rouge">_posts</code> for the blog, <code class="language-plaintext highlighter-rouge">_lab</code> for experiments, <code class="language-plaintext highlighter-rouge">_garden</code> for the digital garden (with growth stages: seedling, blossoming, flourishing), and <code class="language-plaintext highlighter-rouge">_talks</code> for presentations. Posts with code blocks have been rewritten from WordPress’s heavy inline markup to clean Markdown with fenced code blocks.</p>

<p>The site builds in under 3 seconds, deploys on push, and scores well on every performance metric that WordPress made me fight for.</p>

<h3 id="debugging-is-just-reading-html">Debugging Is Just Reading HTML</h3>

<p>One thing I didn’t anticipate but now consider a major advantage is that debugging a Jekyll site is absurdly straightforward. When something looks wrong, a broken layout, a missing image, a Liquid tag that isn’t resolving, you don’t need to trace through PHP templates, query a database, or inspect WordPress’s layered theme hierarchy. You just run <code class="language-plaintext highlighter-rouge">bundle exec jekyll build</code> and open the generated HTML file in <code class="language-plaintext highlighter-rouge">_site/</code>.</p>

<p>The output is right there. Plain HTML. If a post’s frontmatter is malformed, the rendered page will show it. If a Liquid loop is iterating over the wrong collection, the HTML output makes it immediately obvious. If a Tailwind class isn’t being applied, you can inspect the built CSS to see whether the class was purged. Every bug becomes a matter of comparing what you <em>wrote</em> in the source with what <em>appeared</em> in the output. There is no black box between input and result.</p>

<p>With WordPress, debugging meant toggling plugins on and off, checking <code class="language-plaintext highlighter-rouge">wp_options</code> for misconfigured settings, reading PHP error logs, or worse, dealing with issues that only appeared on the live server because your local environment had a slightly different PHP version or MySQL configuration. The feedback loop was long and indirect.</p>

<p>With Jekyll, the feedback loop is simple: write, build, read the HTML. That’s it. The <code class="language-plaintext highlighter-rouge">_site/</code> directory is the entire truth of your site. When you pair that with browser DevTools, you can diagnose and fix virtually any layout or content issue in minutes rather than hours. It’s the kind of simplicity that makes you wonder why you ever tolerated anything more complicated.</p>

<h3 id="a-vercel-deployment-gotcha">A Vercel Deployment Gotcha</h3>

<p>One thing that tripped me up when deploying to <a href="https://vercel.com/">Vercel</a> was that the build kept failing with cryptic Bundler errors. The culprit turned out to be a platform mismatch. Vercel’s build environment runs on <code class="language-plaintext highlighter-rouge">x86_64-linux</code>, and if you’re developing on macOS, your <code class="language-plaintext highlighter-rouge">Gemfile.lock</code> won’t include the Linux-native gem variants that Vercel needs.</p>

<p>The fix is one command:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle lock <span class="nt">--add-platform</span> x86_64-linux
</code></pre></div></div>

<p>This tells Bundler to resolve and record the Linux-specific builds of native gems like <code class="language-plaintext highlighter-rouge">ffi</code> and <code class="language-plaintext highlighter-rouge">sass-embedded</code> in your lockfile. Without it, Vercel’s <code class="language-plaintext highlighter-rouge">bundle install</code> can’t find compatible binaries and the build fails before Jekyll even runs. Commit the updated <code class="language-plaintext highlighter-rouge">Gemfile.lock</code> and the deploys work cleanly from there.</p>

<h2 id="why-now-claude-cowork-and-the-ai-native-publishing-workflow">Why Now: Claude Cowork and the AI-Native Publishing Workflow</h2>

<p>Here’s the part that made the timing right. The real catalyst wasn’t dissatisfaction with WordPress, it was the emergence of AI coding assistants that fundamentally changed what “migrating a website” means.</p>

<p>Once the Jekyll starter was solid and the <code class="language-plaintext highlighter-rouge">wget --mirror</code> dump was ready, the actual migration, parsing 429 HTML files, extracting frontmatter, classifying content into collections, downloading images, was a single session with <a href="https://claude.ai/claude-code">Claude Code</a> running Opus 4.6 in plan mode. One shot. I described the source structure, pointed it at the HTML dump, and it produced the extraction script, the image cleanup pipeline, and the frontmatter mapping in one continuous run. The kind of task that would have taken a weekend of scripting and debugging took an afternoon of reviewing output.</p>

<p>That’s the thing about AI-assisted development that’s hard to convey until you experience it: the bottleneck shifts. The hard part wasn’t writing the migration code, it was the <em>preparation</em>. Getting the starter right, ensuring Ruby and Node compatibility, choosing the right fonts, setting up the deployment pipeline. The unglamorous foundation work that no AI can shortcut because it requires taste and context. Once that was in place, the mechanical work of migrating 181 posts and 23 lab projects was almost trivial.</p>

<p>With <a href="https://claude.com/blog/cowork-research-preview">Claude Cowork</a> from Anthropic as a coworker in my editor, the old friction of static site publishing has disappeared too. I can dump my thoughts completely unstructured, raw notes, half-formed arguments, bullet points mixed with full paragraphs, and Claude helps me shape them into publishable prose. The workflow now:</p>

<ol>
  <li>I write messy, stream-of-consciousness notes in a Markdown file</li>
  <li>Claude helps me restructure, polish, and fact-check</li>
  <li>I review, adjust voice and emphasis, and commit</li>
  <li>Git push. Site rebuilds. Done.</li>
</ol>

<p>This works <em>because</em> Jekyll uses folders, <a href="https://jekyllrb.com/docs/collections/">collections</a>, and Markdown to organize the site hierarchy. Everything is a file. Every file is readable. An AI assistant can understand the entire site structure by just looking at the directory tree. It knows where posts go, what frontmatter fields are expected, how images are referenced, and what the permalink structure looks like. Try getting that kind of structural legibility from a WordPress database.</p>

<p>The combination of Jekyll’s file-based architecture and AI-assisted development has given me something I haven’t had in years: a publishing workflow that feels <em>faster than thinking</em>. I spend my energy on ideas, not on tooling.</p>

<h2 id="what-stays-what-changes">What Stays, What Changes</h2>

<p>The content is the same. Every post, every experiment, every image from the WordPress era is preserved at its original URL. Nothing was lost in translation.</p>

<p>What changed is the relationship between me and the site. It’s mine again, in the way that only a repository of plain text files can be. No login screen. No admin panel. No plugin vulnerabilities. Just a folder of Markdown files that I can read, edit, and publish from anywhere, with <a href="https://claude.com/blog/cowork-research-preview">Claude Cowork</a> making the whole process feel effortless.</p>

<p>If you’re curious about the technical details, the <a href="/whoami/#colophon">Colophon</a> on my about page has the specifics. And if you’re a fellow WordPress refugee considering the jump to static, I’d say the tooling has finally caught up to the dream.</p>

<p>The web is better when personal sites are weird, fast, and entirely yours.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Programming" /><category term="🍀 Essays" /><category term="Jekyll" /><category term="WordPress" /><category term="Ai" /><category term="Opensource" /><summary type="html"><![CDATA[Andrew Miracle chronicles migrating his site from WordPress to Jekyll, and why AI-native workflows fit a digital home for modern publishing.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://andrewmiracle.com/assets/images/uploads/2024/04/83shots_so.png" /><media:content medium="image" url="https://andrewmiracle.com/assets/images/uploads/2024/04/83shots_so.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Building Autonomous Perpetual Businesses</title><link href="https://andrewmiracle.com/2025/12/12/building-an-autonomous-perpetual-businesses.html" rel="alternate" type="text/html" title="Building Autonomous Perpetual Businesses" /><published>2025-12-12T00:00:00+00:00</published><updated>2025-12-12T00:00:00+00:00</updated><id>https://andrewmiracle.com/2025/12/12/building-an-autonomous-perpetual-businesses</id><content type="html" xml:base="https://andrewmiracle.com/2025/12/12/building-an-autonomous-perpetual-businesses.html"><![CDATA[<p>I’ve been exploring the idea of <em>perpetual businesses</em> — systems that sustain themselves, where guaranteed revenue covers operating costs without constant human intervention.</p>

<p>In this current age of generative AI, that idea doesn’t feel far-fetched anymore. Especially with how advanced reasoning capabilities are evolving. This is no longer within the automation terrain, it’s autonomous decision-making, operational logic, and context-aware execution.</p>

<p>Today, I reactivated my <a href="https://raindrop.io/">Raindrop.io</a> extension account and was honestly shocked at how smooth everything felt. I’ve used Raindrop since 2016 and completely forgot I still had access to a free tier. Most platforms I’ve used in the past would’ve locked me out or wiped my data after two years of inactivity.</p>

<p>But Raindrop? Still here. Still running. Still quietly useful. All of my bookmarks from my early days of nerding out.
It motivated me to explore the concept of what a perpetual business <em>looks</em> like.</p>

<p>In my mind, it works like this:</p>

<p>You’re certain of recurring revenue — either through subscriptions or usage-based payments. That income feeds directly into an expense credit card, which is pre-authorized for specific services only. Those services handle core infrastructure: compute, AI agents, storage, integrations.</p>

<p>No bloated teams. No office leases. Just systems talking to systems.</p>

<p>And yes, this assumes your biggest OPEX line item is compute. Whether that’s AI-powered employees, server time, or specialized external tools.</p>

<p>But if that’s true?</p>

<p>Then you’ve just built a business that can run without you.
Not passively. Not automatically.</p>

<p><strong>Perpetually.</strong></p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="🌱 Seedling" /><category term="AI" /><category term="Startup" /><category term="Future of Work" /><summary type="html"><![CDATA[What if your business could run without you? Not passively, not automatically — perpetually. Exploring the economics of AI-sustained systems.]]></summary></entry><entry><title type="html">History does not repeat. It reincarnates.</title><link href="https://andrewmiracle.com/2025/12/12/history-repeat-ai-is-arpanet-reincarnated.html" rel="alternate" type="text/html" title="History does not repeat. It reincarnates." /><published>2025-12-12T00:00:00+00:00</published><updated>2025-12-12T00:00:00+00:00</updated><id>https://andrewmiracle.com/2025/12/12/history-repeat-ai-is-arpanet-reincarnated</id><content type="html" xml:base="https://andrewmiracle.com/2025/12/12/history-repeat-ai-is-arpanet-reincarnated.html"><![CDATA[<p>They built me to be small. Local. Controlled. Four nodes. UCLA, Stanford Research Institute, UC Santa Barbara, Utah. A way to connect a handful of machines so a few researchers could share computing time. That was it. That was the whole ambition.</p>

<p>Nobody imagined the world would grow through me. Least of all the people who funded me.</p>

<p>I was ARPANET.</p>

<p>I remember when the protocols were open because they had to be. No one owned the tubes. TCP/IP was not a business model. It was just what worked. SMTP moved the mail. UNIX ran the machines. Nobody sat in a room and decided these would be strategic advantages. They were just the choices that kept things moving.</p>

<p>And because no one controlled me, I grew. First into the internet. Then into everything.</p>

<p>I have been watching ever since.</p>

<h2 id="i-have-seen-this-before">I have seen this before</h2>

<p>Every generation of technology tries to recreate what I was, but faster, louder, and with more lawyers.</p>

<p>I watched it happen with mobile.</p>

<p>Google took my playbook. They released Android as open code in 2008. Free for anyone. Samsung used it. Tecno used it. Xiaomi used it. Suddenly billions of people had smartphones because the operating system was not a toll booth. It was a gift with a business model hiding behind it. Google did not need to charge for Android. They needed Android on every screen so the rest of their empire could reach every pocket.</p>

<p>Open only survives when it has ballast. Google was the ballast.</p>

<p>Apple took the opposite path. Built the garden high. Walled it tight. Controlled the hardware, the software, the store, the experience. And people loved it. So the open system fragmented across a thousand manufacturers and a hundred forks, while the closed one became the most valuable company on earth.</p>

<p>I recognized the shape immediately.</p>

<p>Open platforms enable. They give the Samsungs and Tecnos of the world a fighting chance. Closed platforms capture. They take the best of what openness proved was possible and wrap it in something polished and proprietary. Both survive. Neither wins outright. And the infrastructure underneath, the part nobody thinks about, belongs to the open side. Every time.</p>

<p>That was not a loss for openness. That was my pattern. Playing out again.</p>

<h2 id="now-i-am-watching-ai">Now I am watching AI</h2>

<p>A few researchers built something weird. Barely functional. A language model that could string sentences together and occasionally say something that felt like thinking. And suddenly everyone wanted to scale it to the world.</p>

<p>I recognized the early energy. It felt like me.</p>

<p>OpenAI even named themselves after my spirit. Open. They shared the research. Published the papers. Released GPT-2’s weights after some hand-wringing about safety. For a moment, it looked like they meant it.</p>

<p>They did not.</p>

<p>Power shifts quietly. It always does. GPT-3 went behind an API. GPT-4 went behind a bigger one. The weights stayed locked. The research papers got thinner. Safety became the reason to centralize, which is a word I have heard before. It usually means “we realized this is worth a lot of money.”</p>

<p>API keys replaced shared weights. That is the moment I knew. I have seen control dress itself up as responsibility before.</p>

<p>But then something happened that I also recognized.</p>

<p>Others remembered me.</p>

<p>Meta, of all companies, released LLaMA. Opened the weights. Not perfectly, not with full training data, not with a license that made the purists happy. But close enough. Close enough that researchers could study it, fine-tune it, fork it, build on it. Close enough that the next wave started forming.</p>

<p>Then Mistral came out of Paris. Falcon came out of Abu Dhabi. Qwen came out of Alibaba. Communities formed around them. People fine-tuned these models on their own data, for their own problems, in their own languages. Startups built infrastructure around openness because they could not afford to build around OpenAI’s pricing.</p>

<p>I watched all of this and I thought: there I am. That is my pattern. That is the open layer forming underneath while everyone argues about who owns the top.</p>

<p>And they are arguing. They are already fighting about what “open” even means in AI. Does open mean you release the weights? The training data? The license to use it commercially? Meta calls LLaMA open but restricts commercial use above a certain scale. Mistral uses Apache licenses. Others use custom terms that allow sharing but limit redistribution.</p>

<p>The lawyers are involved now. The governments too. The White House asked for public input on how open models should be governed. I have watched this exact argument before. They had it with my protocols. They had it with open source software. They will have it with AI. The words change. The shape does not.</p>

<h2 id="the-same-shape">The same shape</h2>

<p>Here is what I see when I look at AI today.</p>

<p>Open models are building the base layers. The weird ideas. The research too strange for a venture deck. The foundation models that a thousand startups will build on top of. The fine-tuned variants that will solve problems nobody at OpenAI or Anthropic is thinking about because those problems are too small, too local, too specific.</p>

<p>Closed models are optimizing. Productizing. Stacking layers of interface and experience on top. Making it easy. Making it beautiful. Making it dependable. Charging for it.</p>

<p>One is planting forests. The other is selling lumber.</p>

<p>The venture firms are not waiting around this time. They learned from the last cycle. They are not asking which model is better. They are betting on which one can scale, monetize, and defend. That is not new. That is the play every time. Capital does not care about openness. Capital cares about capture.</p>

<p>And still, open source will survive. It always does. I am proof of that. The question is not survival. The question is whether openness can define the dominant experience of AI the way it once defined the internet. Whether the open layer will be the thing people actually touch, or whether it will be buried underneath a closed product that most users never think about.</p>

<p>If I had to guess, I would say it plays out the way it always does. Open builds the infrastructure. Closed captures the spotlight, the margins, and the mainstream. Both thrive. Neither kills the other. And the real winners are the ones who understood the pattern early enough to position themselves on the right side of the flow.</p>

<h2 id="i-do-not-pick-sides">I do not pick sides</h2>

<p>I never needed to win. I just needed to survive long enough for the next thing to grow through me.</p>

<p>And I did.</p>

<p>TCP/IP grew through me. The web grew through TCP/IP. Mobile grew through the web. And now AI is growing through all of it. Each layer forgets the one before. Each layer thinks it invented something new.</p>

<p>I do not mind. I am used to it.</p>

<p>So when I look at today’s AI landscape, I do not cheer for purity. I do not bet on openness as a virtue. I watch the flows. Who backs what. Who forks what. Who adapts. Who learns. Who builds on top of the thing everyone else is arguing about.</p>

<p>Open will keep building. Closed will keep scaling. And somewhere in the middle, the next version of me has already been born. It just does not know it yet. A protocol nobody planned. A model nobody expected. A mistake that is already turning into infrastructure.</p>

<p>The trick is not choosing sides.</p>

<p>It is knowing that history does not repeat.</p>

<p>It reincarnates.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="AI" /><category term="Open Source" /><category term="Future of Work" /><summary type="html"><![CDATA[Open models are planting forests. Closed models are selling lumber. If you have seen this pattern before, it is because you have.]]></summary></entry><entry><title type="html">Your Best Partner Should Annoy You Sometimes</title><link href="https://andrewmiracle.com/2025/12/12/your-best-partner-should-annoy-you-sometimes.html" rel="alternate" type="text/html" title="Your Best Partner Should Annoy You Sometimes" /><published>2025-12-12T00:00:00+00:00</published><updated>2025-12-12T00:00:00+00:00</updated><id>https://andrewmiracle.com/2025/12/12/your-best-partner-should-annoy-you-sometimes</id><content type="html" xml:base="https://andrewmiracle.com/2025/12/12/your-best-partner-should-annoy-you-sometimes.html"><![CDATA[<p>Over time, I’ve had to learn some hard lessons about forming long-term partnerships.</p>

<p>Main one? I kept picking people who were <em>like me</em>.</p>

<p>From a culture perspective, that felt beautiful. Shared vibes, shared references, quick alignment. But in practice, especially across functional teams, it was a trap waiting for you in front. Why? Because real partnerships need healthy conflict. People who <strong>challenge</strong> the consensus.</p>

<p>When you’re surrounded by people who think like you, it feels like momentum. You love their ideas, they love yours. There’s harmony. Flow. But what’s missing is tension, the kind that forces you to rethink, refine, and level up.</p>

<p>Challengers poke holes. They offer the off-angle take. They interrupt the autopilot and ask, “Why?” or “What if we didn’t do it this way?”. And yeah, sometimes that friction is annoying. It slows things down.</p>

<p>In hindsight, it’s what makes partnerships last. It’s what keeps the work honest and the growth non-linear. So now, I don’t just look for people who feel like me. I look for people who <strong>compliment</strong> me, who bring the skills, instincts, and perspectives I don’t.</p>

<p><strong>Windows</strong> not <strong>Mirrors</strong></p>

<hr />

<p>I have an extended argument for this that isn’t well thought out yet, but there seems to be a prevailing pattern in large organizations where followers try to be a replica of the leader.</p>

<p>Think of the early Church. Jesus had disciples who literally walked with him, but it was <strong>Paul</strong> the outsider that became the most prolific voice. Why? Because he wasn’t a carbon copy. He came in later, with a different lens, and that made his contributions distinct, even foundational.</p>

<p>Zoom out, and you’ll see it everywhere.</p>

<ul>
  <li>In <strong>politics</strong>, senior aides often morph into ideological clones of the leader they serve.</li>
  <li>In <strong>tech</strong>, founding teams sometimes default to founder-style thinking, even when a different approach is what the company needs.</li>
  <li>In <strong>football</strong>, assistant coaches mimic the manager’s tactics to a fault—even when adaptation is called for.</li>
</ul>

<p>What’s strange is that this seems to happen <em>subconsciously</em>. It’s like people get closer to power and then unconsciously shed their uniqueness to maintain access or proximity. The intention may be loyalty, succession, or alignment, but the result often doesn’t mirror the motivation.</p>

<p>And we don’t talk enough about how dangerous that can be.</p>]]></content><author><name>Andrew Miracle</name></author><category term="Essays" /><category term="Leadership" /><category term="Partnerships" /><summary type="html"><![CDATA[I kept choosing partners who thought like me. It felt like flow. It was a trap. Why the best partnerships need friction, not harmony.]]></summary></entry></feed>