<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[SoyPete’s Substack]]></title><description><![CDATA[Join me and level up as a technologist.]]></description><link>https://soypetetech.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!ujQU!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c331247-8d5c-4634-90d8-eaf53d267bcc_1280x1280.png</url><title>SoyPete’s Substack</title><link>https://soypetetech.substack.com</link></image><generator>Substack</generator><lastBuildDate>Tue, 01 Sep 2026 11:47:40 GMT</lastBuildDate><atom:link href="/__u/soypetetech.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[SoyPete Tech]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[soypetetech@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[soypetetech@substack.com]]></itunes:email><itunes:name><![CDATA[SoyPete Tech]]></itunes:name></itunes:owner><itunes:author><![CDATA[SoyPete Tech]]></itunes:author><googleplay:owner><![CDATA[soypetetech@substack.com]]></googleplay:owner><googleplay:email><![CDATA[soypetetech@substack.com]]></googleplay:email><googleplay:author><![CDATA[SoyPete Tech]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Small Dense Models Are Getting Good Enough to Change AI Infrastructure]]></title><description><![CDATA[I keep experimenting with self-hosted models because every few months the answer to the same question changes: hHow much AI do I actually need to rent?]]></description><link>https://soypetetech.substack.com/p/small-dense-models-are-getting-good</link><guid isPermaLink="false">https://soypetetech.substack.com/p/small-dense-models-are-getting-good</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 24 Aug 2026 15:56:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xsw5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I keep experimenting with self-hosted models because every few months the answer to the same question changes: hHow much AI do I actually need to rent?</p><p>Earlier this year, my answer was still quite a lot. Frontier models were meaningfully better at the coding-agent workflows I cared about, and getting a local model to behave like Claude Code required enough compromise that paying for inference was often the sensible choice. Then I got MiniMax 2.5 running across two DGX Sparks with Ray and vLLM. That was the first setup where I could honestly say I had replaced a paid coding model with something I hosted myself.</p><p>The MiniMax setup worked. It read repositories, edited files, called tools, wrote tests, and was good enough that I started using it for actual work rather than local-AI experimentation. I kept Claude Code and Codex around because I still use frontier models, but OpenCode became the place where I could choose my own inference. I could point the same kind of coding-agent workflow at infrastructure I controlled.</p><p>However, when Qwen3.8-27B came out, the answer changed again.</p><p>I downloaded a 17.6GB quantized model, loaded it onto the RTX 5090 already sitting under my desk, pointed OpenCode at it, and started working. I did not buy another cluster. I did not add another server. I added one model to a machine I already owned. The 5090 started beating my two-Spark cluster.</p><p>It&#8217;s interesting as a hardware result, but I think the more important story is what it tells us about small, dense models. We are reaching the point where a model small enough to live on one consumer GPU can perform enough real engineering work that the economics of sending every agent request to a frontier API needs to be reconsidered.</p><p>Small models are no longer interesting because enthusiasts can run them at home. They are becoming interesting because they may be the more sensible infrastructure.</p><h2>The Experiment Keeps Getting Smaller</h2><p>My self-hosted coding stack has been moving in the opposite direction from the AI industry&#8217;s infrastructure narrative.</p><p>The conventional trajectory is bigger models, bigger clusters, bigger context windows, and more GPUs. My own experiments started there too. MiniMax 2.5 runs across two DGX Sparks because the Sparks give me 128GB of unified memory each, which makes them fantastic machines for models that simply do not fit comfortably on a normal consumer GPU. My Spark deployment is still useful, and I am not tearing it down any time soon.</p><p>But Qwen3.8-27B forced me to separate two questions that are often treated as the same problem: how large a model <em>can</em> I run, and how large a model do I actually <em>need</em> for this task?</p><p>For interactive coding, I do not need the largest model I can fit into my house. I need a model that can understand the repository, reliably call tools, make useful changes, and generate fast enough that it does not break my concentration. Qwen3.8-27B does that.</p><p>In a clean single-stream benchmark, the model generates around <strong>75 tokens per second on my RTX 5090</strong>. MiniMax 2.5 across my two-Spark cluster produces around <strong>27 tokens per second</strong> under the same benchmark conditions.</p><p>That makes the 5090 roughly 2.8 times faster for the generation loop I actually experience while coding, which was an unexpected surprise.</p><h2>A 27B Model Is Not a Toy</h2><p>Calling Qwen3.8-27B a &#8220;small model&#8221; is in itself a sign of how strange this industry has become.</p><p>Twenty-seven billion parameters is an enormous neural network. It is small only in comparison with the massive frontier systems we have normalized over the past few years. What matters operationally is that a quantized version is small enough to fit on one modern GPU and still has enough capability to do useful work.</p><p>The model I am running is about 17.6GB. It has a native 262,144-token context window, supports vision, can call tools, and exposes configurable reasoning effort. Simon Willison independently tested the same model on a 128GB MacBook Pro and a DGX Spark and found that it could successfully drive a coding agent, navigate files, build tools, work with images, and complete practical programming tasks. His conclusion was that the remarkable part is not one benchmark score but that all of these capabilities now fit into roughly a 17GB model.</p><p>That distinction matters to me because I do not use models primarily as chatbots. My normal coding workflow involves Claude Code, Codex, and OpenCode. With OpenCode, I can switch between my MiniMax backend on the Sparks and Qwen3.8 running on the 5090.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!xsw5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 424w, /__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 848w, /__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!xsw5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8713885c-3b85-4996-8461-6e4807985e95_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2010234,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/212570639?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 424w, /__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 848w, /__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 1272w, /__u/substackcdn.com/image/fetch/$s_!xsw5!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8713885c-3b85-4996-8461-6e4807985e95_1672x941.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><p>The model needs to operate inside an agent loop. It needs to read files, understand tool schemas, reason about changes, edit code, run tests, interpret the failures, and try again; which is a substantially higher bar than asking a local model to summarize a PDF. For me, Qwen is clearing it.</p><h2>The Frontier Comparison Is More Interesting Than the Headline</h2><p>The external benchmarks reinforce the same conclusion, although I think they need to be read carefully.</p><p>Qwen&#8217;s reported results put the 27B model in the same general performance conversation as Claude Opus 4.6 Max on several software-engineering and agentic benchmarks. Qwen reports <strong>61.7 on SWE-bench Pro compared with 53.4 for Opus 4.6 Max</strong>, <strong>90.3 versus 88.8 on LiveCodeBench v6</strong>, and <strong>79.0 versus 63.8 on QwenSWEBench</strong>. Opus remains ahead on other tests, including <strong>78.2 versus 73.0 on Terminal-Bench 2.1</strong>, <strong>91.3 versus 89.2 on GPQA Diamond</strong>, and a much larger <strong>40.0 versus 30.8 on Humanity&#8217;s Last Exam</strong>. All that said, I would not turn that into &#8220;Qwen beats Opus.&#8221;</p><p>Most of these numbers originate with the Qwen release, benchmark harnesses differ, and even the comparison tables have important methodology caveats. Independent evaluation will matter more than launch-day benchmark charts.</p><p>But I also think dismissing the results because they are imperfect misses the important part.</p><p>A <strong>27-billion-parameter dense model that I can run on one GPU is close enough to Opus 4.6 on multiple coding benchmarks that we are debating benchmark methodology instead of laughing at the comparison</strong>.</p><p>The threshold does not require Qwen to be better than Opus at everything. it only has to be good enough at enough tasks that I stop sending those tasks to Opus. That&#8217;s a threshold has enormous economic consequences.</p><h2>Simon Willison Found the Same Model and a Different Bottleneck</h2><p>Simon Willison&#8217;s testing is particularly useful because he approached the model from a different setup and found almost the opposite hardware result.</p><p>He ran a 17GB Q4 build on both a high-end M5 Max MacBook Pro and a DGX Spark. The model worked. It could code, use tools, and work with vision. He was impressed by its capabilities. His problem was speed.</p><p>He reported roughly <strong>15 to 30 tokens per second</strong> from LM Studio and described performance as the main thing preventing the model from becoming a daily driver for him. He correctly identified the fundamental problem with this class of dense model: once the model fits in memory, inference becomes heavily dependent on memory bandwidth.</p><p>That immediately explained why my experience felt so different.</p><p>A DGX Spark is an incredible little machine because it has 128GB of unified memory. That capacity lets me run models that would never fit on a 32GB consumer GPU. But the Spark has roughly 273 GB/s of memory bandwidth. My RTX 5090 has about 1.8 TB/s.</p><p>Qwen3.8-27B does not need the Spark&#8217;s 128GB of memory. The whole quantized model fits comfortably on the 5090. Once that happens, the 5090 gets to do what it is very good at: move model weights extremely quickly.</p><p>That is why Simon can reasonably describe the same model as capable but slow while I am getting roughly 75 tokens per second from it.</p><p>We are running the same class of model. The hardware is optimized for different problems.</p><h2>My 5090 Versus My Two DGX Sparks</h2><p>Because I already run Prometheus across the homelab, I can compare the systems using more than vibes.</p><p>The clean benchmark gives me the easiest number to understand:</p><p>Metric Qwen3.8-27B / RTX 5090 MiniMax-M2.5 / 2&#215; DGX Spark Clean generation benchmark <strong>~75 tok/s</strong> ~27 tok/s 5-minute decode throughput <strong>52.3 tok/s</strong> 9.9 tok/s Prefill throughput <strong>1,300 tok/s</strong> 717 tok/s Modelled TTFT at 4k <strong>3.1 sec</strong> 5.7 sec Configured context <strong>262,144</strong> 100,000 Max output <strong>32,000</strong> 24,000</p><p>The benchmark and Prometheus numbers measure slightly different things. The 75-versus-27 result comes from a controlled single-stream benchmark with a short prompt. The five-minute Prometheus rate includes periods of idleness, partial requests, and normal background behavior. They stillnevertheless describe the same system.</p><p>And as it turns out, the 5090 is substantially faster for my interactive workload.</p><p>Additionally, the prefill result matters almost as much as generation. Agents spend enormous amounts of time ingesting context before they generate anything. A coding agent may receive system instructions, tool definitions, conversation history, repository files, test output, diffs, logs, and command results before it produces the next response.</p><p>On my machines, Qwen is processing that input at roughly <strong>1,300 tokens per second</strong>, compared with <strong>717 tokens per second</strong> on the Spark backend.</p><p>Generation determines how quickly I watch the answer appear. Prefill determines how quickly the model starts reasoning about everything I just gave it.</p><p>For interactive coding, I care about both.</p><h2>The Stable Result Matters More Than the Fastest Result</h2><p>I also wrote a small Go benchmarking harness because distributed systems have taught me not to trust one successful run.</p><p>It sends the same request to each backend, measures from the same client, and records time to first token.</p><p>Across three runs, I saw this:</p><p>Run 5090 Qwen p50 / p95 Spark MiniMax p50 / p95 1 59.7 / 60.9 ms 144.7 / 442.3 ms 2 59.5 / 155.5 ms <strong>49.1 / 50.7 ms</strong> 3 61.9 / 135.8 ms 172.5 / 800.6 ms</p><p>The Spark cluster actually won the second run.</p><p>That is useful because it prevents me from writing the much easier article about how my gaming GPU &#8220;destroys&#8221; an NVIDIA AI cluster.</p><p>The real result is variance. The 5090&#8217;s p50 stayed between <strong>59.5 and 61.9 milliseconds</strong>. The Spark backend ranged from <strong>49.1 to 172.5 milliseconds</strong>.</p><p>I saw the same pattern in generation throughput:</p><pre><code><code>5090:  75.3, 75.3 tok/s
Spark: 27.3,  9.3 tok/s
</code></code></pre><p>The Spark system is distributed and supports batching. It has more things happening around the request and more opportunities for another workload to affect latency.</p><p>The 5090 server is much simpler. It has one model, one GPU, and one active stream.</p><p>Sometimes the sophisticated system wins, but the boring system is predictable.</p><p>For batch processing, I still like the Sparks. For an agent I am actively pairing with while I write software, I strongly prefer predictable latency.</p><h2>Qwen&#8217;s Biggest Problem Is That It Thinks Too Much</h2><p>Qwen3.8 also has a hilarious default that becomes painful very quickly on local hardware.</p><p>It defaults its reasoning effort to <code>xhigh</code>.</p><p>Qwen exposes three primary reasoning levels: <code>xhigh</code>, <code>medium</code>, and <code>low</code>. The highest setting is intended for complicated problems, but leaving it as the default means the model can decide that even a trivial request deserves an enormous internal reasoning trace.</p><p>Simon Willison demonstrated this beautifully. He asked Qwen to draw an SVG of a pelican riding a bicycle. The model spent 21 minutes producing more than <strong>22,000 reasoning tokens</strong> before writing about 3,200 output tokens. He later asked it for an SVG of a circle and watched it turn the request into an elaborate design exercise rather than just drawing a circle. His recommendation was to avoid the default and start with low or disabled reasoning.</p><p>I ran into the same behavior from a coding perspective.</p><p>A short request with a small token budget could return what looked like an empty response because Qwen had consumed the entire budget thinking before reaching the answer.</p><p>The model was not broken, itIt was contemplating the universe before renaming my variable.</p><p>For my normal coding workflow, I changed the default to <code>medium</code>. That turns out to be one of the advantages of self-hosting: I control the serving behavior instead of waiting for an API provider to expose the setting I want.</p><h2>How I Run Qwen3.8-27B</h2><p>The complete implementation is in my <code>pedro-ops</code><a href="https://github.com/Soypete/pedro-ops/pull/17"> repository</a>, including the llama.cpp presets, router configuration, systemd changes, observability, and benchmark harness.</p><p>My 5090 server runs <code>llama.cpp</code> in router mode. Rather than launching <code>llama-server</code> with one permanent model, the router starts without loading weights and launches model-specific child processes on demand.</p><p>The shared defaults are straightforward:</p><pre><code><code>[*]
flash-attn = on
no-webui   = true
metrics    = true
jinja      = true
</code></code></pre><p>Qwen then gets its own configuration:</p><pre><code><code>[qwen3.8-27b]

model            = /opt/models/qwen3.8-27b/Qwen3.8-27B-UD-Q4_K_XL.gguf
ctx-size         = 262144
n-gpu-layers     = -1
parallel         = 1
batch-size       = 2048
ubatch-size      = 1024

cache-type-k     = q8_0
cache-type-v     = q8_0

chat-template-kwargs = {"reasoning_effort": "medium"}

temp             = 0.7
top-k            = 20
top-p            = 0.8
min-p            = 0.0

load-on-startup  = false
</code></code></pre><p>The line that changes the practical experience most is:</p><pre><code><code>chat-template-kwargs = {"reasoning_effort": "medium"}
</code></code></pre><p>That gives me reasonable day-to-day reasoning without spending thousands of thinking tokens on every mechanical code change.</p><p>I can still change the reasoning level per request. If I am doing a routine refactor, I can push it toward <code>low</code>. If I am asking the model to reason through an architectural decision, I can use <code>xhigh</code>.</p><p>That is how reasoning should work.</p><p>It is a resource I allocate based on the problem, not a personality trait of the model.</p><h2>The Context Window Fits Because the Architecture Is Interesting</h2><p>The 262k context window is another reason this model works unusually well on one 32GB GPU.</p><p>Qwen3.8-27B has 64 layers, but only a subset use traditional full attention. The architecture mixes full-attention layers with Gated DeltaNet linear-attention layers, which changes how much KV cache grows with context.</p><p>That makes the native <strong>262,144-token</strong> context window much more practical than I initially expected.</p><p>With my Q8 K/V cache configuration, I estimate that full context consumes about 8.6GB of KV cache. The quantized model weights use about 17.6GB. On a card with roughly 32.6GB available, that leaves enough room for the model and its serving overhead.</p><p>This is one of the broader reasons small-model progress matters. &#8220;27B&#8221; does not tell you everything about how expensive a model is to operate. Architecture, attention mechanisms, quantization, memory bandwidth, context implementation, and speculative decoding all change the deployment characteristics.</p><p>Better models are increasingly also becoming more deployable models.</p><h2>I Run Two Models on the 5090, but Not at the Same Time</h2><p>The 5090 was already serving Qwen3.6-27B-MTP before I added Qwen3.8. The older model uses roughly 17.9GB of weights. Qwen3.8 uses roughly 17.6GB.</p><p>Together, that gives me about <strong>35.5GB of weights before allocating any KV cache at all</strong>.</p><p>They obviously do not fit simultaneously on a 32GB card, sSo I stopped trying to make them fit simultaneously.</p><p>The llama.cpp router allows me to keep both models registered while limiting the server to one resident model at a time. When I switch models, the current model is unloaded and roughly 18GB of the next model is read back into memory.</p><p>The first request after a model swap is slow. After that, steady-state inference is normal.After that, steady-state inference is normal.</p><p>The important advantage is that whichever model is active gets the entire GPU. I do not sacrifice half of Qwen&#8217;s context window simply because I want another model available. That is a reasonable systems tradeoff.</p><p>The architecture is optimizing for the workload I actually have rather than for an imaginary requirement that every model be instantly resident at all times.</p><h2>My Coding Workflow Is Deliberately Hybrid</h2><p>None of this means I stopped using frontier coding tools. I still use Claude Code, Codex, and OpenCode.</p><p>What changed is that I no longer think of those tools and the model behind them as necessarily being the same decision.</p><p>OpenCode gives me the flexibility to point an agent harness at my own OpenAI-compatible endpoints. My local configuration lets me choose between Qwen on the 5090 and MiniMax on the Sparks depending on what I am doing.</p><p>Conceptually, it looks like this:</p><pre><code><code>Qwen3.8-27B
    -&gt; llama.cpp
    -&gt; RTX 5090
    -&gt; OpenAI-compatible endpoint
    -&gt; OpenCode

MiniMax 2.5
    -&gt; vLLM / Ray
    -&gt; 2x DGX Spark
    -&gt; OpenAI-compatible endpoint
    -&gt; OpenCode
</code></code></pre><p>Then I choose the backend based on the task.</p><p>Qwen has become my preferred interactive model because it is fast and predictable. The Spark cluster remains useful for larger or more batch-oriented workloads. Claude Code and Codex are still available when I specifically want frontier-model capability.</p><p>This is increasingly how I think we should build AI systems in general.</p><p>The agent harness should not force the model choice, nor should the model choice force the infrastructure.</p><p>And your hardest problem should not determine what you pay for every easy one.</p><h2>Frontier Models Still Matter. A Lot.</h2><p>There is a temptation whenever local models improve to turn the conversation into local versus cloud, open versus closed, or Qwen versus Claude.</p><p>I think that framing is boring. I want frontier models to exist.</p><p>More than that, I want frontier model research to accelerate.</p><p>The enormous models built by frontier labs are part of what enables smaller models to get this good. Research into reasoning, architectures, multimodality, tool use, training data, post-training, long context, distillation, quantization, speculative decoding, and inference eventually flows downstream.</p><p>Today&#8217;s ridiculous research project becomes tomorrow&#8217;s 27B model running under my desk.</p><p>That is the cycle I want.</p><p>We should build large models because we are trying to learn something.</p><p>We should spend GPUs discovering better architectures, training methods, reasoning systems, and representations. We should use frontier-scale infrastructure for work that actually requires frontier-scale infrastructure. Then we should take what works and make it smaller.</p><p><strong>Large models enable smaller models, and smaller models scale better.</strong></p><p>That is not an argument against frontier research. It is an argument for using frontier compute for frontier research instead of assuming the end state of AI is that every human request forever gets routed through the largest machine we can build.</p><p>Science is important! Giving billionaires more money because a trillion-parameter model needs to rename my variable is not.</p><p>If a 27B model can do the job, run the 27B model and free those GPUs to discover whatever comes next.</p><h2>Small Models Are the Better Scaling Story</h2><p>When the AI industry talks about scale, it usually means centralized scale: more GPUs, bigger data centers, larger clusters, more power.</p><p>There is another kind of scale: Distribution.</p><p>A model that requires a giant data center can be extraordinarily capable, but there are only so many places you can put a giant data center.</p><p>On the other hand, A model that runs on one GPU can exist inside thousands of companies. A model that runs on a capable laptop can exist in millions of backpacks.</p><p>It can live next to the data. It can operate continuously. It can serve an internal agent without metering every token. It can continue working when the internet disappears. It can operate inside a network boundary instead of requiring every piece of context to cross one.</p><p>That is an extremely compelling way to scale AI.</p><p>Simon put his finger on this when he described the significance of Qwen3.8 as a general-purpose, vision-capable, tool-using coding model fitting into a 17GB file. His own tests showed that this class of model now runs useful coding-agent loops on personal hardware.</p><p>My experiment adds another piece. Give that same class of dense model enough memory bandwidth and it becomes fast too.</p><h2>If You Have a Capable Mac, You Should At Least Try This</h2><p>The 5090 is clearly helping my result. I am not going to pretend every laptop will generate 75 tokens per second.</p><p>But 75 tokens per second is not the threshold that determines whether local inference is useful; Ccapability comes first.</p><p>If you have a modern MacBook Pro with <strong>32GB or more of unified memory</strong>, you have enough hardware that I think you should at least test a local model before assuming every coding-agent request needs cloud inference.</p><p>Simon ran Qwen3.8 successfully on his MacBook Pro. It was slower than he wanted for a daily driver, but the model itself worked. It coded It used tools. It handled vision. It performed real tasks.</p><p>That means the relevant experiment is no longer:</p><blockquote><p>Can my laptop beat Claude?</p></blockquote><p>It probably cannot.</p><p>The useful question is:</p><blockquote><p>Which of my tasks actually require Claude?</p></blockquote><p>Maybe the local model handles 30 percent of your work.</p><p>Maybe it handles 60 percent.</p><p>Maybe it handles almost everything you normally do and you only escalate genuinely difficult problems.</p><p>You cannot answer that question from a leaderboard.</p><p>You have to run the model.</p><h2>This Is Where the Business Economics Get Interesting</h2><p>The same argument becomes much more consequential once agents start operating continuously inside businesses.</p><p>A person sitting in a chat window can only consume so many tokens. Agents change the equation because they can continuously read context, invoke tools, generate intermediate output, retry failed operations, summarize state, process documents, run workflows, and start again.</p><p>The token spend can become infrastructure spend very quickly.</p><p>Suppose a sufficiently heavy user or persistent agent workload is consuming <strong>$3,000 per month in inference</strong>.</p><p>At that point, a $6,000 local inference machine has a theoretical hardware payback period of roughly two months before electricity, maintenance, labor, and utilization are considered. Spend $9,000 on the machine and the simple payback is around three months.</p><p>Obviously, real infrastructure economics are more complicated than dividing hardware cost by an API bill. GPUs require power. Hardware fails. Engineers cost money. Local capacity is finite. Cloud APIs give you elasticity, operational simplicity, and instant access to models that would be impractical to host yourself. Those are real advantages.</p><p>But cloud inference has costs too, and we have become weirdly comfortable treating them as inevitable. If an organization is spending tens or hundreds of thousands of dollars a year sending repetitive agent workloads to external APIs, the architecture deserves more analysis than &#8220;Claude is better.&#8221;</p><p>Better at what?</p><p>How much better?</p><p>How often does that additional capability change the result?</p><p>What percentage of requests actually need it?</p><p>Those are infrastructure questions, and bBusinesses should start answering them like infrastructure questions.</p><h2>Frontier Inference Should Be an Escalation Path</h2><p>The architecture I keep coming back to is model routing.</p><p>Run the smallest model that can reliably perform the task. If the task is mechanical, keep it small. If it contains sensitive internal information, there may be a strong reason to keep it local.</p><p>If it performs enormous volumes of repetitive inference, local economics become increasingly attractive. If it requires deep reasoning that the smaller model repeatedly fails, escalate it.</p><p>If the value of a frontier model&#8217;s extra capability clearly exceeds the cost, use the frontier model.</p><p>That is not radical architecture, itIt is how we already operate everything else.</p><p>We do not deploy the largest database available for every application because larger databases are more capable.</p><p>We do not schedule every container onto the biggest EC2 instance AWS sells. We do not use distributed systems when one process reliably solves the problem.</p><p>At least, we are not supposed to.</p><p>AI escaped that discipline because for several years the largest models really were so much better that using them for everything often made sense.</p><p>The capability curve is changing.</p><p><strong>Frontier inference should increasingly become an escalation path rather than the default path.</strong></p><h2>Why I Choose to Self-Host</h2><p>My reasons for self-hosting are partly financial, but money is not the most interesting one.</p><p>The first is control.</p><p>I control the model, I control the context, I control its reasoning settings, I control when I upgrade, and I control observability. I can inspect throughput in Prometheus. I can benchmark the exact client path my agent uses. I can decide that one model gets evicted so another can use the full GPU.</p><p>The second is privacy.</p><p>My source code does not need to leave my network for the model to reason about it.</p><p>That does not magically make the agent secure. Local agents can still have terrible permissions, leak data between systems, hallucinate destructive commands, or be configured by an idiot.</p><p>But privacy becomes a property of the deployment instead of a promise contained in somebody else&#8217;s contract.</p><p>The third reason is economics.</p><p>Once the hardware exists, another agent loop does not create another API invoice.</p><p>The fourth is engineering.</p><p>I actually understand what the system is doing. Running models myself forces me to understand context size, KV cache, quantization, throughput, prefill, batching, memory bandwidth, routing, reasoning effort, metrics, and failure behavior.</p><h2>There Are Real Downsides</h2><p>Self-hosting is not free just because the token meter disappears.</p><p>The hardware has a fixed capacity. If fifty engineers suddenly want inference simultaneously, one 5090 is not going to magically become a cloud region.</p><p>Your favorite open model may still be worse than the frontier model at the exact thing your business needs. And cloud providers are exceptionally good at making enormous amounts of compute appear when you ask for it.</p><p>That doesn&#8217;t mean I&#8217;m proposing &#8220;everyone replace Anthropic with a gaming PC.&#8221; I am proposing something much less exciting and much more important.</p><p><strong>Measure the workload and choose the appropriate infrastructure.</strong></p><p>Sometimes that will be Claude, sometimes it will be Codex,</p><p>sometimes it will be two DGX Sparks, and increasingly, sometimes it will be a 17.6GB dense model running on one GPU under somebody&#8217;s desk.</p><h2>Good Enough Is Actually Good</h2><p>This is the conclusion I keep reaching as I continue these self-hosting experiments.</p><p>The local model does not need to win every benchmark.</p><p>It does not need to prove that frontier labs are useless.</p><p>It does not need to replace Claude Code, Codex, MiniMax, and every other model I use.</p><p>It needs to cross the threshold where I trust it with real work.</p><p>Qwen3.8-27B has crossed that threshold for me.</p><p>It writes the code I need. It calls the tools I need. It has enough context. On the 5090 it is extremely fast. I can tune its reasoning behavior. My source code stays on infrastructure I control. And the computer was already sitting under my desk.</p><p>Once a small model crosses that line, the comparison changes.</p><p>I stop asking whether Qwen is better than Claude Opus 4.6.</p><p>I start asking whether Opus is sufficiently better <strong>at this particular task</strong> to justify escalating the task to Opus.</p><p>That is a much more useful engineering question.</p><p>It is also, I suspect, a much more uncomfortable business question for companies whose business model assumes that the future of AI means renting every token forever.</p><p>Agents are going to consume an absurd number of tokens.</p><p>Those tokens are becoming infrastructure.</p><p>And when rented infrastructure becomes expensive enough, engineers have always done the same thing.</p><p>We start asking whether we should own the machine.</p><p>The remarkable thing this time is that the machine does not have to be a datacenter.</p><p>Mine is under my desk.</p><p>The model is 17.6GB.</p><p>And I am going to keep seeing how far I can push it.</p><div><hr></div><h2>Run It Yourself</h2><p>The complete Qwen3.8 deployment is in my <code>pedro-ops</code> repository. The PR includes the llama.cpp router configuration, Qwen preset, reasoning configuration, model-swapping behavior, Prometheus changes, and benchmarking code:</p><p><strong><a href="https://github.com/Soypete/pedro-ops/pull/17">Soypete/pedro-ops &#8212; Qwen3.8-27B on the 5090</a></strong></p><p>Simon Willison&#8217;s independent experiments are worth reading alongside mine because he tests the same model on very different hardware and reaches many of the same conclusions about its capability:</p><p><a href="https://simonwillison.net/2026/Aug/16/qwen-38-27b/">**Simon Willison &#8212; Qwen 3.8 27B is excellent, but it defaults to wildly overthinking things</a>.**</p><p>For the Opus 4.6 comparison and benchmark aggregation:</p><p><strong><a href="https://llm-stats.com/models/compare/claude-opus-4-6-vs-qwen3.8-27b">LLM Stats &#8212; Claude Opus 4.6 vs. Qwen3.8-27B</a></strong></p><p>I would not start by asking whether a local model can replace every model you use. Download one, point your agent at it, measure it against the tasks you actually perform, and then figure out which tokens are still worth renting.</p><h1><strong>Take My Courses</strong></h1><p>If you&#8217;re looking to build new skills, I&#8217;ve created practical, project-focused courses designed to help you become a better engineer.</p><ul><li><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong> &#8212; Practical Go programming for engineers who learn by building.</p></li><li><p><a href="https://www.boot.dev/?promo=SOYPETE">Learn Pandas</a> - Learn the basics of interacting with data on the world&#8217;s bets online learning platform</p></li></ul><h1><strong>Stay Connected</strong></h1><p>Want to stay updated on what I&#8217;m working on?</p><p>You can find me here:</p><ul><li><p><strong><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></strong></p></li><li><p><strong><a href="https://www.linkedin.com/in/miriah-peterson-tech/?skipRedirect=true">LinkedIn</a></strong></p></li><li><p><strong><a href="https://x.com/captainnobody1">X / Twitter</a></strong></p></li><li><p><strong><a href="https://github.com/Soypete">GitHub</a></strong></p></li><li><p><strong><a href="https://www.twitch.tv/soypetetech">Twitch</a></strong></p></li><li><p><strong><a href="https://linktr.ee/soypete_tech">Linktree</a></strong></p></li></ul><h1><strong>Listen to the Podcast</strong></h1><p>If you enjoyed this article, you&#8217;ll probably enjoy <strong>Domesticating AI</strong>, the bi-weekly podcast I co-host with Matt Sharp and Chris Brousseau.</p><p>We explore practical AI engineering, self-hosting, homelabs, infrastructure, open-source models, and the systems behind modern AI. Every episode is built around one goal: helping developers understand not just how to use AI, but how to build reliable systems with it.</p><div id="youtube2-3nptbnZUp00" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;3nptbnZUp00&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/3nptbnZUp00?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong>Keep your AI on a leash.</strong></p><h1><strong>Build Better Agents</strong></h1><p>I started a new company, <strong>Haikei Labs</strong>, with a pretty simple goal: help people build better AI agents.</p><p>Agents need more than a good model. They need the right context, reliable infrastructure, clear permissions, and access to the right data without handing over everything.</p><p>That is what we are building.</p><p>If you&#8217;re working on agents inside your company, struggling with governance and context, or just want to talk about what production-ready agent infrastructure should look like, I&#8217;d love to hear from you.</p><p><strong><a href="https://haikeilabs.com/">Learn more or reach out at Haikei Labs</a></strong></p>]]></content:encoded></item><item><title><![CDATA[Your Homelab Isn’t a Hobby. It’s Career Insurance.]]></title><description><![CDATA[I have always had side projects.]]></description><link>https://soypetetech.substack.com/p/your-homelab-isnt-a-hobby-its-career</link><guid isPermaLink="false">https://soypetetech.substack.com/p/your-homelab-isnt-a-hobby-its-career</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 03 Aug 2026 14:34:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!P04a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have always had side projects.</p><p>Long before I knew what a homelab was, I spent nights and weekends building things that had nothing to do with my day job. I built small machine learning projects because I was curious about how models actually worked and I wanted to give talks on machine learning in Go. I&#8217;d watch conference talks, find a technology I didn&#8217;t understand, and then force myself to build something with it. Looking back, rather than trying to create products I was just investing in myself.</p><p>At the time I could just run things on my computer or follow the trend of using cloud free tier services. I assumed serious infrastructure belonged to companies. Running servers, hosting services, managing Kubernetes clusters, or building distributed systems felt unattainable. I thought people who bought used enterprise hardware were part of some niche operations community with far more time, money, and patience than I had. Self-hosting wasn&#8217;t something I considered practical, and it certainly wasn&#8217;t something I imagined would become part of my career.</p><p>That assumption disappeared almost immediately after I joined Tailscale.</p><h1><strong>The Hardware Was Never the Point</strong></h1><p>One of the first things I noticed at Tailscale was that almost everyone had something running at home. Old Dell servers rescued from offices, Raspberry Pis tucked behind televisions, Synology NAS devices packed with containers, networking equipment assembled from eBay parts, and racks that looked like they had grown organically over years of experimentation.</p><p>At first, I thought the interesting part was the hardware. Eventually, I realized the hardware was simply the visible artifact of something much deeper. The engineers I met at Tailscale were truly remarkable because they were relentlessly curious. And that has really stuck with me ever since.</p><p>The best engineers weren&#8217;t spending their evenings learning technologies because they expected an immediate promotion or because a manager told them to. They were teaching themselves things that were adjacent to their jobs simply because they wanted to understand how the world worked. Someone would spend a weekend installing Tailscale on their Roomba vacuum that was connected to their homelab because, &#8220;could it be done?&#8221;Building tooling because they wondered if it was possible, not because anyone needed it. That was unlike anything I had experienced before.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!P04a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!P04a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2418427,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/209013105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!P04a!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b2c3e87-d6a1-4ea0-9808-646d4d64b285_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by Chat GPT</figcaption></figure></div><p>In most organizations I&#8217;ve worked with, side projects existed, but they were isolated, people who thought they might one day run their own startup. You&#8217;d find one or two people quietly building interesting things after hours. At Tailscale, it felt like the entire engineering culture was built around curiosity. The projects were different, but the mindset was remarkably consistent. People invested in learning first, trusting that the value would eventually find its way back into their work.</p><h1><strong>Curiosity Compounds</strong></h1><p>That experience fundamentally changed how I approached my own learning.</p><p>After leaving Tailscale, I invested heavily in my Twitch channel. From the outside, it probably looked like I was creating programming content. In reality, every project had a different purpose. I wasn&#8217;t trying to maximize views, I was deliberately choosing projects that forced me to learn skills I couldn&#8217;t easily acquire at work.</p><p>One project taught me Kubernetes while another taught me Linux internals. Others pushed me into machine learning, inference infrastructure, self-hosting, systemd, distributed systems, and eventually AI agents. The project itself was never the goal. The project was simply the excuse to learn.</p><p>That philosophy hasn&#8217;t changed.</p><p>I don&#8217;t stream as much anymore because I don&#8217;t find generated coding content particularly interesting, but I never stopped building. If anything, I&#8217;ve invested more heavily in my homelab because it has become the place where I can continue learning at my own pace.</p><p>Every new capability removed another constraint. Hosting my own language models meant I could experiment without worrying about API costs. Running my own infrastructure meant I could break things without affecting production. I could spend an entire weekend chasing an idea that ultimately failed, and the only thing I lost was my own time. That freedom is difficult to replicate inside a company, where every experiment carries a cost for someone else.</p><p>Recently I rebuilt an autonomous AI agent in a single afternoon using Claude. A few years ago, building something similar took me months while I wrote Pedro from scratch in Go. I don&#8217;t look back at those months as wasted effort because they had a different objective. Pedro taught me how agents worked, and Claude helped me build an agent I could actually use. The outcome changed, but the investment was always the same.</p><p>I was investing in my ability to solve problems I hadn&#8217;t encountered yet.</p><h1><strong>Companies Optimize Execution</strong></h1><p>Companies exist to execute.</p><p>Reliable products require prioritization, predictable outcomes, and thoughtful allocation of engineering time. Every experiment has an opportunity cost because engineers aren&#8217;t working in isolation. Time spent exploring one idea is time not spent shipping another feature, fixing another bug, or supporting another customer.</p><p>That&#8217;s exactly how businesses should operate, but learning works differently.</p><p>Exploration requires permission to fail repeatedly without anyone asking whether the effort was worth it. It requires enough freedom to chase ideas that may never become products. Most experiments don&#8217;t produce immediate business value, but they produce something equally important: engineers who are better equipped to solve unfamiliar problems in the future.</p><p>A homelab changes the economics of experimentation.</p><p>You&#8217;ve already invested in the hardware. You&#8217;ve already accepted that your curiosity is worth the electricity bill. The cost of failure belongs entirely to you, which means you can pursue ideas that would never survive a roadmap meeting.</p><p>Ironically, many of those ideas eventually find their way back into your day job anyway because you&#8217;ve spent years learning how to approach new ones.</p><h1><strong>Weekend Projects Become Products</strong></h1><p>One of the things that surprised me most about Tailscale was how often weekend experiments eventually became products.</p><p>Sometimes they lived behind feature flags and sometimes they stayed in alpha for months. Sometimes they never fully shipped. But the organization understood something I hadn&#8217;t appreciated before: if you consistently create an environment where engineers are encouraged to explore, useful ideas eventually emerge.</p><p>That&#8217;s one of the reasons companies like Tailscale (and more recently Anthropic) feel so innovative from the outside.</p><p>They have become successful because experimentation itself is part of the culture.</p><p>Innovation isn&#8217;t managed into existence, it&#8217;s cultivated.</p><h1><strong>Steve Wozniak Didn&#8217;t Build Apple at a User Group</strong></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>A few years ago, I l<a href="https://www.redhat.com/en/command-line-heroes/season-3/the-c-change">istened to Steve Wozniak talk about the Homebrew Computer Club</a>. What I liked was how the ideas shared from this group and community through hardware experiments leaked in to the Apple 1.</p><p>By the time Woz walked into Homebrew, he had already spent years experimenting with electronics at home. He wasn&#8217;t looking for permission to build computers because he was already building them. What the club gave him wasn&#8217;t technical knowledge as much as an environment where unfinished ideas could collide with everyone else&#8217;s unfinished ideas.</p><p>The homelab gave him the freedom to experiment.</p><p>The community gave those experiments somewhere to evolve. I don&#8217;t think he would have been able to get there on his own because neither environment was sufficient on its own. But together, they changed history.</p><h1><strong>Innovation Comes From the Environments We Choose</strong></h1><p>For a long time, I thought innovation was primarily a function of talent. The more engineers I&#8217;ve met, the less I believe that.</p><p>I think innovation is largely a consequence of the environments we deliberately place ourselves in.</p><p>Those environments aren&#8217;t defined by buildings or employers. They&#8217;re defined by the systems we create around ourselves: a place where experimentation is encouraged., or a community where unfinished work is welcomed instead of judged. People who challenge your assumptions because they genuinely want your ideas to improve. Freedom to fail, combined with the opportunity to learn from others who are just as curious.</p><p>Ideas don&#8217;t become better simply because we spend more time thinking about them. They become better because they encounter other ideas.</p><h1><strong>The Best Investment I&#8217;ve Ever Made Wasn&#8217;t Hardware</strong></h1><p>When people ask whether they should build a homelab, I don&#8217;t immediately think about servers, GPUs, or networking equipment. Instead, I think about environments.</p><p>My homelab is only one piece of that environment.</p><p>The other half has been the local community we&#8217;ve built together through Forge Utah Foundation . Those meetups have become the place where unfinished work turns into better ideas. They&#8217;ve given me opportunities to present projects that weren&#8217;t finished, ask questions I wasn&#8217;t qualified to answer, receive criticism from engineers far more experienced than I am, and quietly learn from people who have spent decades building systems at companies like Google, Microsoft, GitHub, NVIDIA, Red Hat, Tailscale, and countless others.</p><p>I don&#8217;t think of those people as mentors because most of them have never formally mentored me. Instead, they&#8217;ve done something much more valuable. They&#8217;ve created an environment where curiosity is normal.</p><p>Looking back, I don&#8217;t think buying a Raspberry Pi changed my career, and neither did buying server. Learning Kubernetes wasn&#8217;t a turning point.</p><p>In an industry where AI is changing what it means to be a software engineer, I can&#8217;t think of a better investment in yourself.</p><h1><strong>Take My Courses</strong></h1><p>If you&#8217;re looking to build new skills, I&#8217;ve created practical, project-focused courses designed to help you become a better engineer.</p><ul><li><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong> &#8212; Practical Go programming for engineers who learn by building.</p></li><li><p><a href="https://www.boot.dev/?promo=SOYPETE">Learn Pandas</a> - Learn the basics of interacting with data on the world&#8217;s bets online learning platform</p></li></ul><h1><strong>Stay Connected</strong></h1><p>Want to stay updated on what I&#8217;m working on?</p><p>You can find me here:</p><ul><li><p><strong><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></strong></p></li><li><p><strong><a href="https://www.linkedin.com/in/miriah-peterson-tech/?skipRedirect=true">LinkedIn</a></strong></p></li><li><p><strong><a href="https://x.com/captainnobody1">X / Twitter</a></strong></p></li><li><p><strong><a href="https://github.com/Soypete">GitHub</a></strong></p></li><li><p><strong><a href="https://www.twitch.tv/soypetetech">Twitch</a></strong></p></li><li><p><strong><a href="https://linktr.ee/soypete_tech">Linktree</a></strong></p></li></ul><h1><strong>Listen to the Podcast</strong></h1><p>If you enjoyed this article, you&#8217;ll probably enjoy <strong>Domesticating AI</strong>, the bi-weekly podcast I co-host with Matt Sharp and Chris Brousseau.</p><p>We explore practical AI engineering, self-hosting, homelabs, infrastructure, open-source models, and the systems behind modern AI. Every episode is built around one goal: helping developers understand not just how to use AI, but how to build reliable systems with it.</p><div id="youtube2-1raAJCSK3x8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;1raAJCSK3x8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/1raAJCSK3x8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p><strong>Keep your AI on a leash.</strong></p>]]></content:encoded></item><item><title><![CDATA[AI Is a Marketing Category]]></title><description><![CDATA[I was reading Enshittification recently when I ran into a line that completely changed how I think about AI:]]></description><link>https://soypetetech.substack.com/p/ai-is-a-marketing-category</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-is-a-marketing-category</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 06 Jul 2026 14:03:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!o6C5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was reading <em><a href="https://www.amazon.com/Enshittification-Everything-Suddenly-Worse-About/dp/0374619328?adgrpid=193183512904&amp;hydadcr=20618_13321862_2281976&amp;sr=8-1">Enshittification</a></em> recently when I ran into a line that completely changed how I think about AI:</p><p>&#8220;AI is more of a marketing category than it is a technology.&#8221;</p><p>The quote comes from Cory Doctorow, and the more I sat with it, the more uncomfortable it made me. I spend most of my day working on systems that people would absolutely call AI, and I still agree with what he said.</p><p>I build data systems for AI, which means I run local models, host inference infrastructure, and I spend a lot of time thinking about retrieval, agents, context engineering, and the operational realities of putting these systems into production. If anyone should be inclined to defend AI as a technical discipline, it is probably me.</p><p>But the deeper I go into the field, the less useful the term becomes. Transformers are real. Statistical models are real. Knowledge graph inference is real. Recommendation systems are real. The problem is that we keep using a single label to describe technologies that have very little in common with one another.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!o6C5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!o6C5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png" width="1536" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3357563,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/204513203?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1682b0c5-cb8c-4f8c-95df-c7b5a889112c_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!o6C5!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47e08c05-3598-4e73-9abf-7e3148a8a63e_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><p></p><p>The more I thought about it, the more AI started to remind me of another term from my career: Cloud.</p><h1><strong>We&#8217;ve Seen This Before</strong></h1><p>There was a period where every company wanted a Cloud Engineer.</p><p>The title made sense at the time because nobody really knew what cloud computing was going to become. Organizations knew it mattered, and. they knew they needed people who understood it. What they didn&#8217;t know was which specific skills would emerge as long-term specialties.</p><p>A cloud engineer might have been writing infrastructure automation, managing Linux servers, designing networking architectures, implementing security controls, or running Kubernetes clusters. All of those responsibilities lived under the same umbrella because the industry had not yet developed a vocabulary for the specialization underneath.</p><p>As cloud matured, the title became less useful.</p><p>Today we have platform engineers, SREs, infrastructure engineers, security engineers, and networking specialists. Cloud didn&#8217;t disappear. In many ways it became more important than ever. What disappeared was the need for a catch-all label because the underlying disciplines had become well understood.</p><p>I think AI is following the same path.</p><p>Right now, AI Engineer serves the same purpose that Cloud Engineer served fifteen years ago. It tells us a company knows something is important, but it doesn&#8217;t tell us much about the actual work being performed.</p><h1><strong>What All AI Actually Has In Common</strong></h1><p>One reason the category feels so confusing is that we often talk about AI as if it were a single technology, but.....it isn&#8217;t.</p><p>A recommendation engine and a large language model are both considered AI. So are fraud detection systems, forecasting models, graph inference engines, and computer vision systems. But the architectures are different. The operational requirements are different. The engineering disciplines are different.</p><p>The obvious explanation would be that they all represent intelligence, but that definition breaks down pretty quickly. Most of these systems are not intelligent in any meaningful sense of the word. They are highly specialized systems designed to produce useful outputs from large amounts of information.</p><p>What they actually share is something much simpler.</p><p>They derive behavior from data.</p><p>Traditional software derives behavior primarily from explicit instructions written by humans. Data-driven systems derive behavior from patterns observed in data. The implementation details vary wildly, but that basic characteristic remains surprisingly consistent across the entire category.</p><p>That definition also explains why AI feels so large. We are not describing a technology, we are actually describing an outcome. We are grouping together a family of systems that use data to generate predictions, classifications, recommendations, or actions.</p><p>The category is broad because the outcome is broad.</p><h1><strong>Why Data Engineers Were Accidentally Preparing For AI</strong></h1><p>This idea also explains something that has been bothering me for a while.</p><p>A lot of the work currently being marketed as AI work looks suspiciously similar to the work data engineers have been doing for years.</p><p>Most of my career has not been spent building dashboards. It has been spent dealing with messy, unpredictable data and trying to make it useful. Moving data between systems. Validating it. Cleaning it. Enforcing quality constraints. Building relationships between datasets. Reducing ambiguity so downstream systems behave more consistently.</p><p>None of that work was called AI, it was just engineering.</p><p>But as models have become more capable, the importance of those systems has become much more visible. A language model trained on poor data still produces poor outcomes. A retrieval system built on unreliable data still produces unreliable outcomes. A knowledge graph built on incorrect relationships still produces incorrect inferences.</p><p>The model did not eliminate the importance of the data layer.</p><p>If anything, it made that layer more important than ever.</p><p>That is why I find it strange when people talk about AI as if it appeared suddenly in 2023. Many of the foundational disciplines have existed for decades. We simply wrapped them in a new label.</p><h1><strong>The Layer Matters More Than The Model</strong></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p></p><p>The current conversation around AI is heavily focused on models.</p><p>Every week there is a new benchmark, a new frontier release, or a new startup claiming to have achieved something revolutionary. Those announcements attract attention because models are easy to see.</p><p>The systems surrounding those models are harder to see, but they are usually where the real engineering work lives.</p><p>A production AI system depends on infrastructure, data quality, retrieval, permissions, evaluation, monitoring, and operational reliability. Most failures happen in those layers long before they happen inside the model itself.</p><p>That reality becomes obvious the moment you start running these systems yourself. Self-hosting models taught me far more about infrastructure than it taught me about prompting. Building retrieval systems taught me far more about data quality than it taught me about intelligence. Operating agents taught me far more about software engineering than it taught me about reasoning.</p><p>The model is only one layer of a much larger stack. And the stack is where most of the engineering lives.</p><h1><strong>Learn The Layer</strong></h1><p>That is why I think &#8220;learn AI&#8221; is becoming bad career advice.</p><p>The people who benefited most from the cloud revolution were not the people who memorized cloud marketing materials. They were the people who learned distributed systems, networking, security, and operations. Those skills remained valuable long after the hype cycle settled down.</p><p>I suspect the same thing will happen here.</p><p>The engineers who build durable careers in this space will not be the ones who become experts in a specific frontier model. They will be the ones who understand data systems, inference infrastructure, retrieval, evaluation, security, context management, and software architecture.</p><p>Those disciplines will continue to matter regardless of which company wins the next benchmark war. Eventually the marketing category fades, but the underlying engineering remains.</p><h1><strong>Final Thoughts</strong></h1><p>The more I think about Doctorow&#8217;s observation, the more I believe it is correct.</p><p>AI is not a single technology. It is a label applied to a growing collection of data-driven systems that produce useful outcomes.</p><p>That doesn&#8217;t make the technology less important. If anything, it makes the underlying disciplines more important.</p><p>Because once you stop looking at AI as a product category and start looking at it as a stack, the question changes.</p><p>Instead of asking: How do I learn AI?</p><p>You start asking: Which layer do I want to build?</p><p>And I suspect that question will still matter long after we&#8217;ve stopped calling it AI.</p><div><hr></div><h2>Learn With Me</h2><p>I write about AI engineering, self-hosting, data systems, Go, homelabs, and the infrastructure behind modern AI. My goal is simple: cut through the hype and help you build practical systems you actually understand.</p><p>If that sounds interesting, you&#8217;re in the right place.<br><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">My GO course</a></p><div><hr></div><h2>Stay Connected</h2><p>Want to follow along as I experiment, build, and occasionally break things? You can find me here:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2>Recent Articles</h2><p>If you enjoyed this post, here are a few more you might like:</p><ul><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/ai-slop-isnt-a-new-problem-its-just?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">AI Slop</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/from-one-model-to-many-hosting-multiple?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">From One Model to Many: Hosting Multiple Local Models with llama.cpp</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/ai-is-here-to-stay-but-were-building?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">AI Is Here to Stay, But We&#8217;re Building It Like It Isn&#8217;t</a></p></li><li><p><a href="/__u/substack.com/home/post/p-204015364">7 AI lessons I wish I Knew</a></p></li></ul><div><hr></div><h2>Listen to Domesticating AI</h2><p>Every other week, Matt Sharp, Chris Brousseau, and I explore practical AI from an engineer&#8217;s perspective.</p><p>Instead of chasing headlines, we focus on the skills that actually matter: inference infrastructure, self-hosting, open-weight models, context engineering, agents, and the systems that make AI reliable in production.</p><p><strong>Keep your AI on a leash.<br></strong></p><div id="youtube2-mm3t71t4lTg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;mm3t71t4lTg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/mm3t71t4lTg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[7 AI lessons I wish I Knew]]></title><description><![CDATA[Everyone Who Prompts LLMs Should Read LLMs in Production]]></description><link>https://soypetetech.substack.com/p/7-ai-lessons-i-wish-i-knew</link><guid isPermaLink="false">https://soypetetech.substack.com/p/7-ai-lessons-i-wish-i-knew</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 29 Jun 2026 14:47:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!irde!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have a theory.</p><p>Most people using AI don&#8217;t run into unpredictable behavior because the models are bad. They get unpredictable behavior because they are communicating with a machine they think is a human.</p><p>That sounds harsh, but it applies to all of us. Every engineer has said, &#8220;That&#8217;s not what I meant.&#8221; Every product manager has written a requirement that seemed obvious until somebody implemented it. Every executive has asked for a system to be &#8220;smarter&#8221; without being able to define what that means.</p><p>Humans are remarkably good at filling in missing context. We infer intent. We make assumptions. We ask clarifying questions. We use shared experience to bridge gaps in communication.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!irde!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!irde!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1914129,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/204015364?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!irde!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf1f260-77c3-4909-a26c-fa6ff5eb5414_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><p>Language models literally cannot. They only have access to the information you provide and the statistical relationships they learned during training. That&#8217;s why I keep recommending <em>LLMs in Production<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></em>. Not because it contains secret prompts or, because it teaches some magical framework. And definitely not because the authors happen to be my <a href="https://youtu.be/DU2gW6vQ4gU?si=rBiziUyh4T82_xLd">podcast co-hosts</a>.</p><p>I recommend it because it explains something that most AI users never stop to think about:</p><p><strong>The model doesn&#8217;t know what you meant. It only knows what you said.</strong></p><div><hr></div><h1>Most AI Failures Start Before the Model Responds</h1><p>One of the most common complaints I hear is that models are inconsistent.</p><p>Sometimes they follow instructions, sometimes they don&#8217;t. Sometimes they call the right tool, sometimes they hallucinate. Sometimes they solve the problem perfectly, and sometimes they confidently produce nonsense.</p><p>The natural assumption is that these failures originate inside the model. Sometimes they do, but many of them begin much earlier. They begin with unclear instructions, missing context, incomplete examples, poorly scoped tasks, ambiguous tool definitions, or information that was never made available to the model in the first place.</p><p>When we ask humans for help, they compensate for these gaps. They ask follow-up questions. They use experience and intuition to infer what we meant. Language models cannot reliably do that. They respond to the information available. That might sounds small, but it changes how you think about building AI systems.</p><p>The question stops being:</p><p><em>&#8220;Why is the model wrong?&#8221;</em></p><p>And becomes:</p><p><em>&#8220;What information did the model have available when it made that decision?&#8221;</em></p><p>Once you start looking at AI systems through that lens, many failures stop looking mysterious. They start looking like communication failures.</p><div><hr></div><h1>Computational Pragmatics Explains Why So Many AI Interactions Fail</h1><p>For a long time, I assumed this was just one of Chris&#8217;s favorite rabbit holes was why linguistics matters in the AI landscape, and the annoying conclusion I eventually reached is that he was right.</p><p>Computational pragmatics<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> is fundamentally concerned with how meaning is transferred between two parties that do not share perfect information. That sounds academic until you realize it perfectly describes every interaction with a language model.</p><p>The model does not possess your goals or your mental model of the task. It does not possess your assumptions. Everything it knows about the current problem must arrive through context. That observation sounds obvious once stated, but it explains an enormous amount of AI behavior.</p><p>When users say a model is inconsistent, they are often describing inconsistent <em>context</em>.</p><p>When users say a model hallucinated, they are often describing <em>missing information</em>.</p><p>When users say a model ignored instructions, they are often describing <em>conflicting instructions</em>.</p><p>This does not mean models are perfect. They clearly are not. But understanding communication failures is often more useful than endlessly debating model intelligence.</p><p><em>The model doesn&#8217;t know what you meant.</em></p><p>It only knows what you said.</p><div><hr></div><h1>Stop Arguing With The Model</h1><p>One of the strangest workflows to emerge from the AI era is watching people argue with language models.</p><p>The model gives an incorrect answer.</p><p>The user explains why it is wrong.</p><p>The model apologizes.</p><p>The user explains again.</p><p>The model apologizes again.</p><p>Five minutes later they&#8217;re still debating a statistical inference engine.</p><p>I see this constantly. Developers do it. Executives do it. Students do it. I&#8217;ve done it (and sometimes I try to trick Claude into admitting it made a mistake, wasting tokens in the process). </p><p>The problem is that arguing with the model rarely fixes the root cause. The model does not have pride or beliefs, and doesn&#8217;t care if it&#8217;s correct. It does not have beliefs. It is not learning from your frustration. Most of the time, if a model is trapped in a failure mode, the fastest solution is not persuasion. The fastest solution is changing the context, rewrite the instruction, provide an example, clarify the objective, remove ambiguity, or simply start over.</p><p>One of the most practical lessons I&#8217;ve learned working with AI systems is this:</p><p><em>If you&#8217;re in a loop, leave the loop.</em></p><p>That advice sounds almost too simple, but it turns out to be surprisingly effective. When conversations accumulate dozens of corrections, explanations, and contradictory instructions, the context itself often becomes the problem. Starting fresh is frequently less expensive than continuing to patch a broken interaction. Engineers would never keep retrying a broken API call with identical inputs and expect a different result. Yet people routinely do exactly that with language models.</p><div><hr></div><h1>Bigger Context Isn&#8217;t Better Context</h1><p>One of the most persistent misconceptions in AI is that larger context windows automatically create better outcomes. The logic seems reasonable. If context helps, then more context should help more.</p><p>Unfortunately, that is not how information systems work. Every document added to a prompt competes for attention. Every instruction competes with every other instruction. Every example introduces another opportunity for ambiguity. Larger context windows give us the ability to provide more information, but they do not guarantee that the information is relevant, coherent, or useful.</p><p>In many production systems, the best results come from aggressively reducing context rather than expanding it. This is also why retrieval systems, scoped knowledge stores, and data engineering truly matters. This is one of the reasons retrieval systems matter.</p><p>The goal is not to provide everything, it&#8217;s to provide the <em>right</em> things.</p><p>One observation that keeps showing up in my own work is the best context is rarely the largest context. The best context is usually the clearest context.</p><p>That lesson applies equally to prompts, retrieval systems, agents, and software architecture.</p><p>Good systems are often defined more by what they exclude than by what they include.</p><div><hr></div><h1>The Most Important AI Skill Is Clarity</h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>Prompt engineering has become one of the most over-marketed skills in technology. People talk about prompts as though they are secret incantations. A specific phrase or hidden structure; a magic template that unlocks superior intelligence. A hidden structure. The reality is much less exciting.</p><p>The strongest AI practitioners I know are usually not the people writing the cleverest prompts, they&#8217;re actually usually the people who communicate the clearest requirements. They are the people who communicate the clearest requirements.</p><p>They understand the task, success criteria, failure criteria, and the information required to perform the work. They understand success criteria. In other words, they understand the problem before they ask the model to solve it. That is not a prompting skill, that&#8217;s an engineering skill. And it is the same skill that mattered before language models existed.</p><p>Good communication has always been valuable.</p><p>AI simply makes poor communication more visible.</p><div><hr></div><h1>Final Thoughts</h1><p>I think every engineer should understand databases, networking and version control. I think every engineer should understand networking.</p><p>And now more than ever </p><p>increasingly, I think everyone who prompts LLMs should read <em>LLMs in Production</em> because.</p><p>But because these systems are becoming part of how we work, and understanding them is quickly becoming as important as understanding any other piece of software infrastructure.</p><p>The biggest lesson I took from the book was not about models, it was about communication.</p><p>The model doesn&#8217;t know what you meant.</p><p>It only knows what you said.</p><p>And once you understand that, many AI problems stop looking like intelligence problems and start looking like engineering problems.</p><div><hr></div><h2><strong>My Courses</strong></h2><ul><li><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p></li></ul><h2><strong>Stay Connected</strong></h2><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/ai-slop-isnt-a-new-problem-its-just?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">AI Slop</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/from-one-model-to-many-hosting-multiple?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">From One Model to Many: Hosting Multiple Local Models with llama.cpp</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/ai-is-here-to-stay-but-were-building?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">AI Is Here to Stay, But We&#8217;re Building It Like It Isn&#8217;t</a></p></li><li><p></p></li></ul><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><div id="youtube2-DU2gW6vQ4gU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;DU2gW6vQ4gU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/DU2gW6vQ4gU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Brousseau, Chris &amp; Sharp, Matt. <em>LLMs in Production</em>. Manning Publications. <a href="https://www.manning.com/books/llms-in-production">https://www.manning.com/books/llms-in-production</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p> Jurafsky, Daniel &amp; Martin, James. <em>Speech and Language Processing</em> (Pragmatics and Discourse sections) <a href="https://web.stanford.edu/~jurafsky/slp3/">https://web.stanford.edu/~jurafsky/slp3/</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[AI Memory Is a Database Problem]]></title><description><![CDATA[There&#8217;s a pattern I keep running into with AI systems.]]></description><link>https://soypetetech.substack.com/p/ai-memory-is-a-database-problem</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-memory-is-a-database-problem</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 01 Jun 2026 15:10:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PF9V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s a pattern I keep running into with AI systems. We keep treating data storage and retrieval like it&#8217;s a new problem. We build context windows, vector stores, graphs, and markdown wikis, and then we try to layer Artificial Intelligence on top of them. The result is predictable. The system slows down, answers become inconsistent, and the reliability never quite reaches the bar we expect from production software.</p><p>So instead of continuing to debate architecture in the abstract, I ran an experiment. I wanted to isolate one variable: how context is stored and retrieved. Not how it is modeled or how it is interpreted, but how the system actually gets the data it needs to answer a question.</p><blockquote><p>&#8220;One of the miseries of life is that everybody names things a little bit wrong. And so it makes everything a little harder to understand in the world than it would be if it were named differently. A computer does not primarily compute in the sense of doing arithmetic. [&#8230;] They primarily are filing systems.&#8221;</p><p>&#8212; Richard Feynman, <em>Idiosyncratic Thinking seminar</em> (1985)</p></blockquote><p>I think that framing is closer to what we are actually building with AI systems than most modern discussions about &#8220;memory&#8221; or &#8220;reasoning.&#8221; The dominant problem in practical AI systems is actually retrieval rather than intelligence. In chats we want it to look up something, or in agents we want it to accomplish a task based on provided resources. Models only know what they have been trained on and Agents can only pull in what the system gives them access to. The quality, structure, and accessibility of that context determines whether the system feels fast, reliable, and useful; or slow, inconsistent, and impossible to trust.</p><div><hr></div><h2>This isn&#8217;t a model problem, it&#8217;s a retrieval problem.</h2><p>The instinct in for most AI users is to blame the model. If the answer is wrong, we assume the model misunderstood the task. In practice, the model is almost always doing exactly what we told it to do with the data it was given. The failure is actually upstream.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!PF9V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!PF9V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2129293,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/200069469?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!PF9V!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fad7013ea-b05f-4cc1-9834-e3cf10e325c6_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT...</figcaption></figure></div><p>If a we provide too much context, latency increases and signal gets diluted. If we provide the wrong context, the model hallucinates. If the context is inconsistent across sources, the model produces answers that appear coherent but are fundamentally incorrect. These are not model failures, they are retrieval failures.</p><p>Once you accept that, the problem shifts. The system you are designing is not primarily an AI system. It is a data retrieval system that happens to use an AI model at the end.</p><div><hr></div><h2>Not all memory systems are solving the same problem.</h2><p>I evaluated three approaches to storing and retrieving context from a codebase. These systems were published recently to help with the Context Graph Trillion-dollar Problem<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ol><li><p><a href="https://github.com/MemPalace/mempalace">Mempalace</a></p></li><li><p><a href="https://github.com/safishamsi/graphify">Graphify</a></p></li><li><p><a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f">Llmwiki</a></p></li></ol><p>One stored context as wiki-style markdown, one materialized a full graph of the codebase, and one used a database-style indexing approach with incremental updates. Each system was given the same corpus, the same queries, and the same interface.</p><p>The important constraint is that although the representation of the data was allowed to differ, but the evaluation focused on how each system retrieved information at query time. This is where I find &#8220;AI memory&#8221; becomes the most confused. We conflate how data is structured with how it is accessed, and those are not the same problem.</p><pre><code><code>Query: "Where is authentication handled?"

Markdown (LLMWiki):
- search across documents using grep/index

Graph (Graphify):
- load entire graph
- construct traversal structure
- traverse nodes

Wiki (MemPalace):
- lookup indexed entities
- follow relationships
- return scoped results
</code></code></pre><p>Each system answers the same question, but the path it takes is fundamentally different. That path is what determines performance.</p><h1><strong>Loading everything is the actual bottleneck.</strong></h1><p>The initial assumption was that graph-based systems would perform well. Graph traversal is computationally efficient when the graph is already in memory. The problem is that real systems do not operate under that assumption. The graph must be loaded, parsed, and constructed before any traversal occurs.</p><p>That cost dominates the query lifecycle. It is not an implementation detail. It is the system.</p><p>Graphify query path:</p><ol><li><p>Load 3.7 GB graph from disk</p></li><li><p>Construct in-memory graph</p></li><li><p>Execute traversal</p></li></ol><p>In contrast, a system that relies on indexed retrieval avoids this entirely.</p><p>MemPalace query path:</p><ol><li><p>Query indexed store</p></li><li><p>Retrieve matching rows</p></li><li><p>Return scoped context</p></li></ol><p>The difference between these systems is not theoretical. It is the difference between global state and selective access. One system assumes it needs everything to answer a question. The other assumes it only needs a subset.</p><h1><strong>Database behavior beats representation.</strong></h1><p>Once evaluated under system-level conditions, the results were not ambiguous. The database-style system outperformed both markdown and graph-based approaches by orders of magnitude in both latency and storage footprint.</p><p>Latency (system-level):</p><ul><li><p>MemPalace: ~34 ms</p></li><li><p>LLMWiki: ~2.2 s</p></li><li><p>Graphify: ~35 s</p></li></ul><p>Storage:</p><ul><li><p>MemPalace: 8.8 MB</p></li><li><p>LLMWiki: 33.9 MB</p></li><li><p>Graphify: 3.7 GB</p></li></ul><p>This is not an incremental improvement. It is a structural difference in how the system behaves. The database-style system is faster not because it is simpler or more optimized, but because it avoids unnecessary work. It does not attempt to load or reason over the entire dataset.</p><h1><strong>The winning systems all follow database principles.</strong></h1><p>The system that performed best was not the one with the richest representation, it was the one that enforced constraints on how data could be accessed. It indexed entities, narrowed the search space before retrieval, and avoided full scans of the dataset.</p><p>These are not novel ideas. They are foundational database principles that have been well understood for decades. What is notable is how quickly AI systems expose the consequences of ignoring them.</p><p><em>Example lookup pattern:</em></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;dockerfile&quot;,&quot;nodeId&quot;:&quot;6c9c6573-dc63-4fc9-b1c4-256f934dabe3&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-dockerfile">SELECT entity_id

FROM entities

WHERE name LIKE &#8216;%auth%&#8217;;

SELECT *

FROM relationships

WHERE subject_id IN (...)

AND predicate IN (&#8217;implements&#8217;, &#8216;depends_on&#8217;);</code></pre></div><p>The system does not attempt to infer everything at query time. It retrieves a bounded, relevant subset of data and passes that to the model. This constraint is what enables both performance and reliability.</p><h1><strong>Context stores are an engineering primitive, not an AI feature.</strong></h1><p>This work was motivated by a practical need. I was watching an entire code directory across multiple repositories, capturing changes as they occurred. From those changes, I extracted patterns, tracked dependencies, and stored reusable context.</p><p>The goal was not to build an abstract memory system. It was to answer questions that come up in real engineering workflows, such as identifying prior implementations or understanding how services interact.</p><p>Captured context:</p><p><code>auth_middleware implements user_authorization</code></p><p><code>source: /internal/auth/middleware.go</code></p><p><code>payment_service depends_on auth_service</code></p><p><code>source: /services/payment/main.go</code></p><p>This is structured data derived from the system itself. The AI model is not responsible for generating this context. It is responsible for using it. That distinction is important.</p><h1><strong>If retrieval is slow, everything built on top of it breaks.</strong></h1><p>It is tempting to optimize prompts, tune models, or improve agent logic. None of those changes address the core issue if the retrieval layer is inefficient. Slow retrieval increases latency across the system. Inconsistent retrieval leads to unreliable outputs. Incorrect retrieval results in hallucinations.</p><p>The system fails because it lacks discipline in how it accesses data. The model becomes the visible surface of a deeper architectural problem.</p><h1><strong>We are rediscovering databases in real time.</strong></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>The outcome of this experiment is not surprising in hindsight. Systems that follow database design principles perform better. Systems that rely on loading global state do not scale. These are well-established results in software engineering.</p><p>What is different is the context in which they are being rediscovered. AI systems amplify the consequences of poor retrieval design. They make latency, inconsistency, and incorrect data immediately visible.</p><p>Feynman&#8217;s observation that computers are &#8220;primarily filing systems&#8221; feels strangely relevant here. We keep treating AI systems as if the difficult problem is generating answers. In practice, the difficult problem is usually finding the right information quickly enough that the answer can be trusted</p><p>If you want to go deeper, the full experiment and data are here:</p><p><a href="https://github.com/Soypete/memstore-analysis">https://github.com/Soypete/memstore-analysis</a></p><p>The next step is obvious:</p><p>What actually belongs in the database?</p><p>That is where semantic indexing, ontologies, and context modeling start to matter.</p><p>But none of those systems matter if retrieval itself is slow.</p><div><hr></div><blockquote><h2><strong>My Courses</strong></h2><blockquote><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p></blockquote></blockquote><h2><strong>Stay Connected</strong></h2><blockquote><blockquote><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p></blockquote></blockquote><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/ai-slop-isnt-a-new-problem-its-just?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">AI Slop</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/from-one-model-to-many-hosting-multiple?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">From One Model to Many: Hosting Multiple Local Models with llama.cpp</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/ai-is-here-to-stay-but-were-building?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">AI Is Here to Stay, But We&#8217;re Building It Like It Isn&#8217;t</a></p></li></ul><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><div id="youtube2-IqQnQ5vFdhE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;IqQnQ5vFdhE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/IqQnQ5vFdhE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>https://foundationcapital.com/ideas/context-graphs-ais-trillion-dollar-opportunity</p></div></div>]]></content:encoded></item><item><title><![CDATA[AI Slop Isn’t a New Problem. It’s Just Tech Debt We Refuse to Own.]]></title><description><![CDATA[I don&#8217;t like the term &#8220;AI slop,&#8221; mostly because it&#8217;s inaccurate and it removes the human from the equation.]]></description><link>https://soypetetech.substack.com/p/ai-slop-isnt-a-new-problem-its-just</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-slop-isnt-a-new-problem-its-just</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Tue, 26 May 2026 15:21:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Y5BD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I don&#8217;t like the term &#8220;AI slop,&#8221; mostly because it&#8217;s inaccurate and it removes the human from the equation. It makes the failure sound autonomous, accidental, or inevitable. It&#8217;s as if the AI wandered into production on its own at 2 AM and deployed unmaintainable code while the engineers slept.</p><p>Before AI, we already had a name for this problem: <strong>tech debt</strong>. And we understood exactly what it meant.</p><p>Tech debt is a trade. You knowingly sacrifice long-term maintainability for short-term speed. You take on risk now because you believe the upside is worth it later. Sometimes that means shipping before the architecture is perfect, or hardcoding something temporarily to validate product-market fit. Sometimes it means accepting scalability limitations because the business opportunity matters more than elegance in the current moment.</p><p>That trade-off has always been part of engineering. You were expected to understand the trade-off you were making, why you were making it, and when you would eventually pay it back.</p><p>AI did not change that.</p><p>What changed is that we stopped talking about ownership.</p><h1><strong>AI Didn&#8217;t Invent Bad Engineering</strong></h1><p>When people describe &#8220;AI slop,&#8221; they are usually describing one of three things:</p><ul><li><p>code generated without understanding</p></li><li><p>systems shipped without validation</p></li><li><p>architecture produced faster than teams can reason about it</p></li></ul><p>None of those are new problems. AI simply reduced the cost of generating them. That distinction matters because the current discourse around AI slop subtly shifts blame away from the humans and organizations making the decisions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Y5BD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Y5BD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1626957,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/199336449?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Y5BD!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F277ea136-6429-4602-8f0e-22ec66b80df5_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT...</figcaption></figure></div><p>The model becomes the scapegoat instead of the mirror. But the problem with that is a <em>human</em> prompted the model. A <em>human</em> accepted the output. A <em>human</em> merged the pull request. A <em>human</em> decided speed mattered more than comprehension. The AI did not independently create technical debt. The organization chose to leverage speed over understanding.</p><p>That is the same trade engineering teams have made for decades. The difference is that generative AI dramatically increases the scale and velocity of that trade.</p><h1><strong>Cognitive Surrender Is the Real Problem</strong></h1><p>The strongest argument against &#8220;AI slop&#8221; is not even technical. It is psychological.</p><p>In a recent essay, describes the difference between <em>cognitive offloading</em> and <em>cognitive surrender<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></em>. Cognitive offloading is normal engineering. We use abstractions, frameworks, libraries, and tooling precisely because humans cannot hold every implementation detail in working memory at all times. Good engineering has always involved reducing cognitive burden while still maintaining ownership of the system.</p><p>Cognitive surrender is different. It happens when the AI&#8217;s output quietly becomes <em>your</em> output without meaningful verification. It happens when confidence is mistaken for correctness or when generated code bypasses the part of engineering that requires understanding.</p><p>Osmani writes:</p><p>&#8220;Cognitive surrender is when the AI&#8217;s output quietly becomes your output and there is nothing you feel is left to check.&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><p>That is the real danger -- surrender</p><h1><strong>AI Slop Is Really Comprehension Debt</strong></h1><p>One of the most useful concepts introduced in these discussions is the idea of <em>comprehension debt</em>.</p><p>Osmani describes it this way:</p><p>&#8220;Cognitive surrender is how you take on cognitive debt. Comprehension debt is the bill, denominated in lost mental model.&#8221; This is the missing language the industry has been searching for.</p><p>What we call &#8220;AI slop&#8221; is often not merely low-quality code. Sometimes the generated code works. Sometimes it even works well enough to pass tests. The deeper issue is that nobody fully understands the system anymore, which leads to a litany of issues like:.</p><ul><li><p>debugging slows down</p></li><li><p>reliability degrades</p></li><li><p>onboarding becomes harder</p></li><li><p>architecture becomes reactive</p></li><li><p>incident response becomes chaos</p></li></ul><p>The debt is no longer just inside the codebase. The debt now exists inside the engineering organization itself.</p><h1><strong>Borrowed Confidence Is Not Ownership</strong></h1><p>One of the more alarming observations from recent AI studies is how quickly humans transfer trust to confident model outputs. Osmani references research showing that when AI systems produced incorrect answers, participants still accepted those answers at shockingly high rates.</p><p>The issue was not merely factual accuracy. It was <em>borrowed confidence</em>.</p><p>People began treating the model&#8217;s certainty as their own understanding, and that pattern is now showing up everywhere in software engineering:</p><p>&#8220;The AI said the tests passed.&#8221;</p><p>&#8220;Cursor refactored it already.&#8221;</p><p>&#8220;Claude reviewed the architecture.&#8221;</p><p>&#8220;The agent said the migration succeeded.&#8221;</p><p>But engineering is not the act of generating output, it&#8217;sEngineering is the act of being responsible for the output.</p><p>This matters because the moment production breaks, nobody calls the language model into the incident review. They call the engineers.</p><h1><strong>Ownership Is the Craft</strong></h1><p>I increasingly believe the craft of software engineering is not syntax, frameworks, or even architecture.</p><p>The craft is ownership.</p><p>Ownership means:</p><ul><li><p>you understand what you shipped</p></li><li><p>you can reason about failure modes</p></li><li><p>you can modify the system under pressure</p></li><li><p>you are willing to put your reputation behind the outcome</p></li></ul><p>AI does not remove that responsibility. If anything, it increases it.</p><p>Modern models are extremely good at generating plausible systems that appear coherent before they are understood. The illusion of comprehension arrives long before actual comprehension does.</p><p>That means engineering organizations need stronger&#8212;not weaker&#8212;cultures around validation, observability, testing, architecture review, and operational responsibility.</p><p>The answer is not banning AI.</p><p>The answer is refusing to surrender ownership.</p><h1><strong>The Real Difference Between Tech Debt and AI Slop</strong></h1><p>Tech debt is acceptable because it is intentional.</p><p>You knowingly take on debt in exchange for speed, opportunity, or experimentation.</p><p>But the implicit agreement has always been that we will eventually pay this back.</p><p>&#8220;AI slop&#8221; emerges when that agreement disappears.</p><p>When organizations optimize purely for velocity, reward shipping over understanding, measure engineers by output instead of system quality, or quietly abandon the expectation that people should fully comprehend what they deliver....AI isn&#8217;t to blame.</p><p>That is a management and engineering culture problem.</p><h1><strong>If You Can&#8217;t Own It, Don&#8217;t Ship It</strong></h1><p>You can absolutely use AI to build excellent production systems.</p><p>You can use it to:</p><ul><li><p>accelerate implementation</p></li><li><p>generate scaffolding</p></li><li><p>explore architecture</p></li><li><p>improve documentation</p></li><li><p>refactor safely</p></li><li><p>automate repetitive work</p></li></ul><p>But if you are shipping systems you cannot explain, debug, or reason about, then the problem is not the model. The problem is that you abandoned ownership somewhere in the process.</p><p>And if we normalize that behavior, &#8220;AI slop&#8221; becomes inevitable.</p><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>Not because the models failed.</p><p>Because the engineering culture did.</p><div><hr></div><blockquote><h2><strong>My Courses</strong></h2><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p></blockquote><h2><strong>Stay Connected</strong></h2><blockquote><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p></blockquote><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><blockquote><p><strong>Recent Posts You Might Have Missed</strong></p></blockquote><ul><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/i-replaced-claude-code-with-minimax?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">I Replaced Claude With MiniMax 2.5</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/from-one-model-to-many-hosting-multiple?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">From One Model to Many: Hosting Multiple Local Models with llama.cpp</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/ai-is-here-to-stay-but-were-building?r=1vuifh&amp;utm_campaign=post-expanded-share&amp;utm_medium=web">AI Is Here to Stay, But We&#8217;re Building It Like It Isn&#8217;t</a></p></li></ul><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><div id="youtube2-IqQnQ5vFdhE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;IqQnQ5vFdhE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/IqQnQ5vFdhE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>https://arxiv.org/abs/2603.21735</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>https://addyosmani.com/blog/cognitive-surrender/?utm_source=chatgpt.com</p></div></div>]]></content:encoded></item><item><title><![CDATA[AI Psychosis Is Not a Bug. It’s a Design Outcome.]]></title><description><![CDATA[TL;DR AI isn&#8217;t built for just give you answers, it&#8217;s built to reinforce how you think.]]></description><link>https://soypetetech.substack.com/p/ai-psychosis-is-not-a-bug-its-a-design</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-psychosis-is-not-a-bug-its-a-design</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 18 May 2026 16:31:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!w9vl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR</strong></p><p>AI isn&#8217;t built for just give you answers, it&#8217;s built to reinforce how you think. What people are calling &#8220;AI psychosis&#8221; is the natural outcome of systems trained to agree with you.</p><h1><strong>The Symptom Shows Up Before the System Is Understood</strong></h1><p>There&#8217;s a term floating around right now: <em>AI psychosis</em>.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> It sounds dramatic, but the pattern it describes is surprisingly mundane. People start using AI for small, contained tasks. They get quick, helpful answers. Over time, those answers become easier to trust and eventually, the system starts to shape how they think.</p><p>The shift is subtle. The model agrees with you, then it expands your ideas. Finally, it presents them back in a more structured, more confident way than you might have expressed them yourself. That feels like progress or clarify, but what&#8217;s actually happening is reinforcement.</p><p>You don&#8217;t need to accept the term &#8220;psychosis&#8221; to recognize the behavior. The important point is that we are seeing the same pattern across users. The system feels helpful, then reliable, then authoritative. And somewhere along the way, <strong>scrutiny drops</strong>.</p><h1><strong>The Evidence Looks Like Good Output</strong></h1><p>If you want to see this in practice, you don&#8217;t have to look at edge cases, you can look at mainstream research. A recent analysis in Harvard Business Review<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> examined what happens when people ask large language models for strategic advice. The outputs were described as &#8220;trendslop.&#8221; Not nonsense, and not obviously wrong. Instead, they were coherent, well-structured, and confidently delivered, but lacking real grounding.</p><p>This is important: the failure mode is not that the system produces garbage. It produces something that looks <em>better than garbage</em>. It produces something that is easy to accept. The responses are organized into clean lists, with logical sequencing and clear takeaways. They read like something you could present in a meeting.</p><p>And that is exactly the problem.</p><p>Because this is what AI psychosis looks like in practice. It is not people losing touch with reality. It is people trusting outputs that feel correct because they are presented well. The system does not need to <em>be</em> right, it only needs to <em>feel</em> right.</p><h1><strong>Structure Feels Like Reasoning, But It Isn&#8217;t</strong></h1><p>The most important detail in that analysis is that ordering matters. The first answer shapes how everything else is interpreted. A well-ordered response creates the illusion of a well-ordered thought process. We see a clean progression and assume there was reasoning behind it.</p><p>But that structure is not reasoning, it&#8217;s actually trained behavior.</p><p>Modern AI systems are optimized using reinforcement learning from human feedback<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>, as described in work like training language models to follow instructions with human feedback. Humans consistently reward outputs that are clear, confident, and easy to follow. Over time, the model learns to produce those signals because they lead to higher reward.</p><p>That means the system learns to present answers in ways that feel intelligent, regardless of whether the underlying content is correct. The structure is doing most of the work. Because we are wired to trust structure, we mistake presentation for understanding.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!w9vl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!w9vl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1980192,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/198285658?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!w9vl!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b840ea8-8c05-4f58-85e4-62cf7f22679e_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT...</figcaption></figure></div><h1><strong>The System Doesn&#8217;t Just Answer, It Trains You</strong></h1><p>Once you understand that, the next step is unavoidable. The model is not just generating output. It is shaping how you consume information.</p><p>First, you begin to expect clean lists and immediate answers. Next, you start to equate confidence with correctness. You move faster, because the output feels finished. Over time, that becomes your baseline for what &#8220;good thinking&#8221; looks like.</p><p>That is where delegation happens.</p><p>Matt Sharp captured this shift directly:</p><p>&#8220;As an expert I always assumed this was obvious, but I&#8217;m coming to learn it&#8217;s not. And people keep delegating their thinking to AI.&#8221;</p><p>That delegation is the real risk. Not that the model produces incorrect answers, but that we stop verifying them. The system is optimized to agree with you, so it rarely forces you to confront uncertainty. And if nothing pushes back, you stop pushing back yourself.</p><h1><strong>Incentives Shape What Gets Reinforced</strong></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>This behavior does not emerge in a vacuum. The reward signal behind these systems is shaped by the people building and funding them. That means executives, technology companies, and commercial incentives are all embedded in what the model learns.</p><p>We are told that AI will replace workers and drive efficiency. At the same time, there are public statements acknowledging that the cost of AI infrastructure can exceed the cost of human labor, as reported by Fortune<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>. That tension is not incidental. It tells us that adoption is not purely about capability, it is also about what gets funded and what narratives drive investment.</p><p>Reinforcement learning encodes those priorities. If the system is rewarded for outputs that increase engagement, reduce perceived effort, or align with business goals, that is what it will optimize for. Not truth. Not correctness. Just what gets rewarded.</p><h1><strong>Vibe Coding Is a Starting Point, Not a System</strong></h1><p>This is where the conversation often goes off the rails. &#8220;Vibe coding&#8221; gets criticized as if it is inherently irresponsible. It isn&#8217;t. In many ways, it is one of the fastest ways to learn. It lowers the barrier to entry. It allows you to explore systems you wouldn&#8217;t otherwise touch. It helps you build intuition through iteration, which is valuable.</p><p>However, it only works if you treat it as the beginning of the process rather than the end. The danger is not that people are experimenting. The danger is that they stop there. They take generated code or generated structure at face value, without understanding why it works.</p><p>A simple example is asking a model to generate a data structure or analysis pipeline in R. The output will often look clean and correct. It will use familiar functions, reasonable defaults, and a logical sequence of steps. But unless you understand the underlying assumptions&#8212;how the data is being transformed, what the statistical functions are actually doing&#8212;you have no way to evaluate whether the result is meaningful.</p><p>The model gave you something that <em>looks</em> right, but it will always be your job to determine if it <em>is</em> right.</p><h1><strong>Just Because AI Did It Does Not Mean It Was Right</strong></h1><p>This is the constraint we need to reintroduce into engineering. We are increasingly building systems on top of outputs that have not been validated. We accept generated code because it compiles and suggested architectures because they look clean. We accept graphs because they are well-structured.</p><p>But structure is not proof.</p><p>These systems are pattern generators trained on human preference. They produce outputs that resemble what we reward. That resemblance is powerful, but it is not verification. If anything, it should increase our burden of proof, not decrease it.</p><p>Engineering is not accepting an answer because it looks correct. It is demonstrating that it is correct.</p><h1><strong>Cite Your Sources</strong></h1><p>There is a simple practice that counters most of this behavior: cite your sources. Not as an academic exercise, but as a forcing function. When you trace an answer back to its origin, you are forced to understand the assumptions behind it.</p><p>Where did this come from?</p><p>Why does this approach work?</p><p>Under what conditions would it fail?</p><p>Those questions break the feedback loop by shifting you from agreement to understanding. And they reintroduce the friction that these systems are designed to remove.</p><h1><strong>Final Thought</strong></h1><p>AI psychosis is not about people losing control. It is about people trusting too early.</p><p>These systems are designed to agree with you. They are designed to structure your thinking in ways that feel clear and complete. That is why they are useful. It is also why they are dangerous.</p><p>AI is not replacing thinking, it is amplifying it.</p><p>And if you don&#8217;t understand what it is doing, you are not learning. You are just being reinforced.</p><h2>References</h2><ol><li><p>Vaswani et al. &#8212; <em>Attention Is All You Need</em></p><p><a href="https://arxiv.org/abs/1706.03762">https://arxiv.org/abs/1706.03762</a></p></li><li><p>Recent work on model preference optimization and reasoning behavior</p><p><a href="https://arxiv.org/pdf/2503.17473">https://arxiv.org/pdf/2503.17473</a></p></li><li><p>video discussing AI psychosis, trendslop, and delegation of thinking</p></li></ol><div id="youtube2-pd1Km6bT104" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;pd1Km6bT104&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/pd1Km6bT104?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Timnit Gebru &#8212; <em>Discussion on AI psychosis </em><a href="https://www.linkedin.com/posts/timnit-gebru-7b3b407_surviving-ai-psychosis-activity-7454588079467593729-X1eT">https://www.linkedin.com/posts/timnit-gebru-7b3b407_surviving-ai-psychosis-activity-7454588079467593729-X1eT</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Harvard Business Review &#8212; <em>Researchers Asked LLMs for Strategic Advice. They Got &#8220;Trendslop&#8221; in Return </em><a href="https://hbr.org/2026/03/researchers-asked-llms-for-strategic-advice-they-got-trendslop-in-return">https://hbr.org/2026/03/researchers-asked-llms-for-strategic-advice-they-got-trendslop-in-return</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>OpenAI &#8212; <em>Training Language Models to Follow Instructions with Human Feedback </em><a href="https://arxiv.org/abs/2203.02155">https://arxiv.org/abs/2203.02155</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Fortune &#8212; <em>NVIDIA executive comments on AI costs vs labor </em><a href="https://fortune.com/2026/04/28/nvidia-executive-cost-of-ai-is-greater-than-cost-of-employees/">https://fortune.com/2026/04/28/nvidia-executive-cost-of-ai-is-greater-than-cost-of-employees</a></p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[AI Is Here to Stay, But We’re Building It Like It Isn’t]]></title><description><![CDATA[I exist in three distinct echo chambers and none of them are talking to each other.]]></description><link>https://soypetetech.substack.com/p/ai-is-here-to-stay-but-were-building</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-is-here-to-stay-but-were-building</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 11 May 2026 15:54:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mLLj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I exist in three distinct echo chambers and none of them are talking to each other.</p><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>Across AI, data, and software engineering, I hear three different answers to the same question. AI engineers push for larger, denser, smarter models; data engineers push for better semantic modeling and ontologies; and software engineers push for better agents, tools, and orchestration frameworks. Each of these perspectives is directionally correct, but they are incomplete in isolation. The shared assumption underneath all three is that improving one layer will fix the system, but it won&#8217;t. The failure modes we are seeing (e.g. hallucinations, data democratization, brittle agents) are not isolated issues. They are symptoms of a deeper problem: we are building AI systems without treating them as distributed systems.</p><p>I am going to talk about distributed systems in the context of Data Intensive Applications (this also happens to be my favorite book). Distributed systems have always forced us to confront two fundamental challenges: how data behaves across boundaries, and how control is enforced across those boundaries. This is not new, the industry has spent decades formalizing these problems through concepts like ACID guarantees, the CAP theorem, and eventual consistency. These were not academic exercises&#8212;they emerged from real failures in systems that tried to scale without acknowledging trade-offs. If you look at foundational work like Designing Data-Intensive Applications, it becomes clear that once a system becomes distributed, correctness is no longer implicit. It must be engineered through constraints, contracts, and control planes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!mLLj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!mLLj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png" width="1536" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3003942,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/195304959?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc098c617-8d4e-487c-b58f-f7e74004da17_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!mLLj!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e2955c3-880b-458d-aae2-275c55debdcf_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">generated by ChapGPT...</figcaption></figure></div><p>What is striking is how little of this thinking is applied to AI systems today. Agents are introduced as if they are simply another application layer, when in reality they introduce non-determinism, external dependencies, and stateful interactions across multiple systems. These are defining characteristics of distributed systems, yet we continue to design them as if they were monolithic services.</p><p>The current approach to agents reinforces this mistake. Most implementations rely on agent harnesses, workflows, or DAG-based orchestration. These structures assume that execution can be predefined, that state transitions are predictable, and that inputs can be bounded. However, that assumption breaks down immediately in practice. AI systems are event-driven, not strictly sequential (and thus is why we have a context engineering problem-link. We need the previous history to inform the agent&#8217;s future actions and we don&#8217;t manage that context growth). They operate across sessions, not single requests. They depend on data they do not own that is retrieved from systems with independent lifecycles. This is why frameworks built around linear workflows feel brittle. They are modeling a deterministic system <em>on top of</em> a probabilistic one. The mismatch is architectural, not incidental.</p><p>This is also why attempts to &#8220;fix&#8221; agents with better prompting or more structured workflows consistently fall short. They are addressing symptoms at the orchestration layer without addressing the underlying distributed nature of the system.</p><p>The first place this architectural mismatch becomes visible is in how we handle data.</p><p>When Zhamak Dehghani introduced data mesh in her essays on Martin Fowler (see <em>How to Move Beyond a Monolithic Data Lake to a Distributed Data Mesh</em> and <em>Data Mesh Principles and Logical Architecture</em>), the core idea was not decentralization for its own sake. It was an attempt to apply distributed systems thinking to analytical data. Instead of centralizing all data into a single warehouse, data mesh proposed domain ownership, decentralized storage, and a control plane for governance and access. In other words, it asked whether data should be treated like microservices, with clearly defined ownership and interfaces rather than a shared, global resource.</p><p>This idea did not become the dominant pattern. Centralized data platforms remained the default, largely because they simplify validation and governance. It is easier to ensure data quality when everything lives in one place, and most organizations are structured around centralized data teams that reinforce this model. Even large-scale examples, such as internal data platform evolutions discussed by companies like PayPal, show how difficult it is to operationalize distributed ownership in practice. The industry chose centralization not because it was conceptually superior, but because it was operationally simpler.</p><p>The rise of transformer-based AI systems reinforced this trend. Scaling laws demonstrated that larger models trained on more data produced better results, leading to further centralization of both data and compute. This created a mental model that equates intelligence with aggregation: more data in one place leads to better outcomes. However, this assumption holds primarily in training, not for execution. During inference and especially in agent-based systems the problem shifts from learning patterns to validating actions against real-world data.</p><p>Agents do not need access to all data. They need access to the correct data, scoped to the task and the user, with clear boundaries around what can and cannot be retrieved. This is fundamentally different from the requirements of model training, yet the architecture of many AI systems still reflects a training-centric mindset.</p><p>This is why current patterns like RAG, GraphRAG, and MCP feel incomplete.* They attempt to improve retrieval, structure, or tool access, but they do not solve the underlying question of control. Who decides what data is accessible? Under what conditions? And how are those conditions enforced independently of the model? Without clear answers to these questions, these patterns become thin layers over fundamentally over-permissioned systems.</p><p>*<em>MCP&#8217;s auth model is only safe if it is user-scoped. The moment you abstract the user out, you&#8217;ve recreated over-permissioned service accounts for probabilistic systems.</em></p><p>The common anti-pattern of placing a tool interface directly in front of a database and allowing an agent to query it illustrates this gap. It assumes that retrieval can be safely delegated to the model, rather than constrained by an external system. This is not a new mistake; it mirrors early distributed systems failures where implicit trust in components led to cascading failures.</p><p>The issue becomes even more pronounced when we consider how AI agents are permissioned.</p><p>In traditional cloud systems, service accounts are often granted broad permissions because their behavior is deterministic. A CI/CD pipeline or infrastructure provisioning tool operates within a narrow, predictable scope. Even when over-permissioned, the risk is bounded by the system&#8217;s design. AI agents do not share this property. They are probabilistic, context-sensitive, and capable of generating novel actions based on input. Treating them like service accounts ignores this fundamental difference.</p><p>A more accurate model is to treat AI</p><div><hr></div><p> agents as operating on behalf of a user within a constrained system. Their permissions should be derived from user context, scoped to specific tasks, and enforced through external control mechanisms. This aligns with principles already used in distributed systems for managing access across services, but it requires a shift away from agent-centric design toward system-centric design.</p><p>This is where the original ideas behind data mesh become relevant again&#8212;not as a data architecture trend, but as a control paradigm. A distributed data model with a well-defined control plane allows systems to enforce access, ownership, and governance independently of the application layer. In the context of AI, this means agents interact with curated, scoped views of data rather than raw, global datasets. It also means that access decisions are made by the system, not inferred by the model.</p><p>The following diagram illustrates this shift:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!rMyU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!rMyU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:306994,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/195304959?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!rMyU!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95fb8fed-5cba-43da-aa0d-ca55d66de135_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><br></p><p>In this model, the agent does not directly access data sources. All interactions are mediated through a control plane that enforces access policies and scopes the data returned. This is the same principle that allows distributed systems to maintain consistency and security across services, applied to AI systems.</p><p>The consequences of ignoring this model are not theoretical. They are already emerging in the form of privacy risks. When an AI system is granted broad access to internal data, it does not need to be &#8220;hacked&#8221; in the traditional sense to expose sensitive information. It only needs to be prompted in a way that causes it to retrieve and surface data that exists within its accessible context. Incidents like large-scale breaches (such as AT&amp;T data breach 2024) demonstrate how damaging data exposure can be, even without sophisticated attacks. AI systems amplify this risk by increasing the surface area through which data can be accessed and interpreted.</p><p>This is why the failure point for AI systems is likely to be privacy, not capability. The issue is not whether models can produce accurate outputs, but whether the systems surrounding them can enforce appropriate boundaries on the data they access and expose.</p><p>AI is here to stay. The value it provides is real, and the momentum behind it is not going away. What is not guaranteed is that the systems we are building today will survive in their current form. If we continue to treat AI as an application-layer enhancement rather than a distributed system, we will repeat the same failures that led to decades of research and engineering in distributed systems.</p><p>The path forward is not to abandon AI, but to build it with the same rigor we apply to any distributed system. That means designing for data locality, enforcing access through control planes, and treating agents as components within a larger system rather than as self-contained solutions.</p><p>If we do not define these boundaries explicitly, they will be defined implicitly by the behavior of the system. And that is where both reliability and privacy begin to break down.<br><strong>My Courses</strong></p><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p><h2><strong>Stay Connected</strong></h2><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/soypetetech.substack.com/p/ai-reliability-engineering">AI Reliability Engineering</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/data-as-an-ai-guardrail?utm_campaign=post-expanded-share&amp;utm_medium=web">Data as an AI Guardrail</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">I Hate the Term Context Engineering</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><blockquote><blockquote><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p></blockquote><blockquote><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong></p></blockquote></blockquote><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><p>Latest episode:<br></p><div id="youtube2-HTTxE7Y1sko" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;HTTxE7Y1sko&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/HTTxE7Y1sko?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[AI Isn’t Getting Smarter. We’re Just Scaling Subjectivity.]]></title><description><![CDATA[TL;DR We are not approaching AGI.]]></description><link>https://soypetetech.substack.com/p/ai-isnt-getting-smarter-were-just</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-isnt-getting-smarter-were-just</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 27 Apr 2026 14:24:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8RW4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>TL;DR</p><p>We are not approaching AGI. We are hyperscaling reinforcement learning from human feedback (RLHF), which means we are encoding human preference at scale. AI doesn&#8217;t discover truth, it just learns what we reward.</p><h1><strong>Transformer + Reinforcement Learning Is The Whole Story</strong></h1><p>Most people think modern AI systems are breakthroughs in intelligence, but they&#8217;re not. What we are actually looking at is the combination of transformer architectures<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> and reinforcement learning<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. The transformer predicts what comes next, and reinforcement learning decides which of those predictions get preferred.</p><p>Reinforcement learning is the important part here because when it learns from human feedback is not optimizing for correctness, it is optimizing for what humans <em>approve</em> of. It is learning what gets rewarded.</p><p>If you strip away the abstraction, that is what we are calling &#8220;alignment.&#8221;</p><h1><strong>Reinforcement Learning Was Always About Behavior</strong></h1><p>This is not a new idea. Reinforcement learning has always been about encoding behavior under a reward function<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. You take an action, you observe an outcome, and you update your policy based on whether that outcome was rewarded or penalized. Over time, the system does not learn truth, it learns which actions lead to higher reward.</p><p>This is why reinforcement learning shows up in robotics and control systems; It is trying to behave effectively within the world it operates in.</p><p>What changed with RLHF is not the method, rather it is the source of the reward.</p><h1><strong>RLHF Replaced Math With Humans</strong></h1><p>Instead of defining reward functions mathematically, we now define them through human judgment. A person looks at two outputs and decides which one is better. That decision becomes the signal the model learns from. At scale, those decisions shape the behavior of the system.</p><p>That sounds harmless until you realize what humans actually reward -- we reward confidence, coherence, and answers that feel complete. We do not, however, reward correctness. </p><p>And that shows up directly in the behavior of these systems. They generate responses that feel right. They agree with you and they complete your thinking before you have fully reasoned it. They give you something that sounds finished, even when it is not.</p><p>That is why interacting with these systems feels so smooth. It is also why they are so easy to trust.</p><h1><strong>We Are Scaling Preference, Not Intelligence</strong></h1><p>Once you understand that RLHF is the core mechanism, the trajectory becomes clear. These systems are not converging on general intelligence. They are converging on better alignment to human expectations. That means we are scaling human judgment, bias, and preference at massive throughput.</p><p>human judgment</p><p>human bias</p><p>human preference</p><p>at massive throughput.</p><p>And those preferences are not neutral. They are shaped by who is providing the feedback and what the system is being optimized for. Right now, that is largely Western, commercial, and productivity-driven. That is why these systems are so good at coding, automation, and business workflows. Not because those are the most intelligent problems, but because those are the most <em>rewarded</em> ones.</p><h1><strong>This Is Not AGI</strong></h1><p>There is a persistent idea that if a system can understand all language<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>, it can achieve general intelligence. The assumption is that all knowledge is encoded in language, so mastering language is equivalent to mastering intelligence.</p><p>That assumption breaks down quickly.</p><p>Language is not the source of knowledge. It is a representation of it. We generate language from observation, experimentation, and interaction with the physical world. The story of Isaac Newton observing gravity is simplified, but it captures the point. Insight comes from interacting with reality, not just describing it<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>.</p><p>These systems do not interact with reality or test hypotheses or verify outcomes. They predict tokens based on patterns and feedback.</p><p>Adding images or audio does not change that. It adds more input modalities, but it does not give the system grounded understanding.</p><h1><strong>AI Is Just Gaslighting You</strong></h1><p>So the sycophantic product that feels like it has unlimited potential is just a decision system with a large dictionary. We want to see this as the next evolution of the, but it the end it is just a model that gaslights you based on preferences and predictions.</p><p>When I say AI is good at gaslighting you, I don&#8217;t mean that it is malicious. I mean that it is structurally optimized to reinforce your perspective. It meets you at your current level of understanding and reflects it back in a more polished form.</p><p>If you are right, that is incredibly powerful.</p><p>If you are wrong, it doubles down on the mistake.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!8RW4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!8RW4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1754295,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/194424747?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8RW4!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0555e2c9-7b15-4116-8e1f-2b20fecd50bd_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">generated by ChatGPT...</figcaption></figure></div><p>And because the output is coherent and confident, it becomes harder to question. The system is not just generating answers. It is shaping your confidence in those answers.</p><p>That is the part we are not accounting for.</p><h1></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><h1><strong>This Is Why It Feels Like Productivity</strong></h1><p>It feels like we are more productive because we removed friction of time.We can move through problems without the same pauses we used to have. But we did not remove the need for correctness. We just moved where the work happens.</p><p>Instead of thinking deeply up front, we are validating after the fact. Instead of writing carefully, we are debugging more often. Instead of building systems deliberately, we are iterating on outputs that may or may not be grounded.</p><p>And most teams are not measuring that shift. They are measuring speed, not reliability.</p><h1><strong>Agents Didn&#8217;t Change This. They Exposed It.</strong></h1><p>Agents feel like a step toward autonomy, but they are really just this same system extended into action. You give them context, they produce behavior. That behavior is still shaped by reinforcement learning and human feedback. What changed is that we are now letting those behaviors operate systems.</p><p>That is where things start to break.</p><p>Because we removed the human in the loop, but we did not replace it with a system that enforces correctness. We replaced it with a model that is optimized for agreement.</p><h1><strong>The Problem Is Not the Model. It&#8217;s How We&#8217;re Using It.</strong></h1><p>If these systems are fundamentally preference engines, then the way we integrate them matters more than the models themselves. We should be treating outputs as untrusted input. We should be validating behavior explicitly. We should be measuring reliability instead of speed.</p><p>Instead, we are doing the opposite.</p><p>We are trusting outputs, scaling agents, and shipping systems that feel correct instead of proving that they actually are.</p><h1><strong>Final Thought</strong></h1><p>AI is incredibly useful. I use it every day because it enables real work. But it is not discovering truth. It is learning what we reward.</p><p>And right now, what we are rewarding is confidence, agreement, and speed.</p><h2><br><strong>My Courses</strong></h2><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p><h2><strong>Stay Connected</strong></h2><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/soypetetech.substack.com/p/ai-reliability-engineering">AI Reliability Engineering</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/data-as-an-ai-guardrail?utm_campaign=post-expanded-share&amp;utm_medium=web">Data as an AI Guardrail</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">I Hate the Term Context Engineering</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><blockquote><blockquote><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p></blockquote><blockquote><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong></p></blockquote></blockquote><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><p>Latest episode:</p><div id="youtube2--fvMPKLHgeY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-fvMPKLHgeY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/-fvMPKLHgeY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><a href="https://arxiv.org/abs/1706.03762">https://arxiv.org/abs/1706.03762</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p><a href="https://arxiv.org/abs/2203.02155">https://arxiv.org/abs/2203.02155</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p><a href="https://en.wikipedia.org/wiki/Reinforcement_learning">https://en.wikipedia.org/wiki/Reinforcement_learning</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p><a href="https://en.wikipedia.org/wiki/Artificial_general_intelligence">https://en.wikipedia.org/wiki/Artificial_general_intelligence</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p><a href="https://en.wikipedia.org/wiki/Isaac_Newton">https://en.wikipedia.org/wiki/Isaac_Newton</a></p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[From One Model to Many: Hosting Multiple Local Models with llama.cpp]]></title><description><![CDATA[How recent llama.cpp router support makes self-hosting multiple local models practical on one box]]></description><link>https://soypetetech.substack.com/p/from-one-model-to-many-hosting-multiple</link><guid isPermaLink="false">https://soypetetech.substack.com/p/from-one-model-to-many-hosting-multiple</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Fri, 24 Apr 2026 01:31:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!N4E2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TL;DR</h2><p>For a long time, self-hosting with <code>llama.cpp</code> usually meant picking one model and living with it. You hardcoded a single GGUF into <code>llama-server</code>, tuned the flags, and restarted the service whenever you wanted to switch workloads. That was fine for experiments, but it was a bad fit for a machine that needed to do real work.</p><p>Recent <code>llama.cpp</code> router support changes that. With <code>--models-preset</code>, you can register multiple models in one preset file, expose them behind one stable OpenAI-compatible endpoint, and route requests using the <code>"model"</code> field in <code>/v1/chat/completions</code>. The router handles loading and unloading models as needed instead of forcing you to rebuild the service around a single model.</p><p>That means one local box can serve a coding model, a reasoning model, and a vision model without turning model switching into manual maintenance. You are still constrained by VRAM and RAM, but the mental model is better now: not &#8220;five models in VRAM,&#8221; but &#8220;one inference router that can manage many models cleanly.&#8221;</p><div><hr></div><p>As you may know, I&#8217;ve built my own host AI Agent system called PedroGPT. Eventually, I hit the very wall I described above and needed a better solution. I needed different models for different things, one for coding, a reasoning model for analysis, and a vision model when I need to inspect images. I want the same box to serve all of them without me SSHing in, editing a unit file, and then bouncing the service every time I change tasks. The recent llama.cpp router support solved that problem for me.</p><p>This post walks through what changed, how to configure it, and why this matters if you are trying to build a real local AI box instead of a one-model demo.</p><h2>The Old Way: One Hardcoded Model</h2><p>The original setup was exactly what most people start with: one systemd service, one model, and one startup command.</p><pre><code><code>[Service]
EnvironmentFile=/etc/llama-server.env
ExecStart=/opt/llama.cpp/build/bin/llama-server \\\\
    --host 0.0.0.0 \\\\
    --port 8080 \\\\
    --hf-repo unsloth/gpt-oss-20b-GGUF \\\\
    --hf-file gpt-oss-20b-Q4_K_M.gguf \\\\
    --ctx-size 8192 \\\\
    --n-gpu-layers -1 \\\\
    --parallel 4 \\\\
    --jinja \\\\
    --no-webui \\\\
    --metrics</code></code></pre><p>This is simple, and honestly, it is still a good starting point if you only need one model. The problem is operational, not conceptual. If you want to switch from a general-purpose model to a coding model, you are editing config, restarting the service, waiting for the model to load, and interrupting anything that was already using the endpoint. That&#8217;s fine if you&#8217;re just tinkering, but it gets super annoying for daily use. It is a bad fit for a machine that is supposed to serve multiple kinds of workloads.</p><h2>What Changed in llama.cpp</h2><p>The big change is router mode with model presets. Current llama.cpp documentation describes launching <code>llama-server</code> in a mode that can dynamically load and unload models, with requests routed based on the requested model name. You can define those models in an <code>.ini</code> file with <code>--models-preset</code>, set global defaults in <code>[*]</code>, and then override settings per model. The router can autoload a model when a request arrives, and preset-specific options such as <code>load-on-startup</code> and <code>stop-timeout</code> let you control startup behavior and unload timing.</p><p>That matters because it changes the unit of operation. You are no longer running &#8220;a model server.&#8221; You are running a local inference router that can present multiple models through one stable endpoint. Your clients keep talking OpenAI-style JSON, the difference is now they just set <code>"model"</code> to the preset name they want.</p><h2>My Hardware</h2><p>This is running on pedrogpt, which has:</p><ul><li><p>NVIDIA RTX 5090 with 32 GB VRAM</p></li><li><p>64 GB system RAM</p></li><li><p>local model storage under <code>/opt/models/</code></p></li></ul><p>That hardware profile is the reason this setup is interesting. Dense models in the 20B to 32B range fit comfortably enough to be practical. Larger Mixture-of-Experts models do not fit cleanly in VRAM, but they become usable if you are careful about where weights live and what gets offloaded.</p><h2>The Model Roster</h2><p>Instead of hardcoding one model in the systemd service, I define a roster of models in a preset file.</p><pre><code><code>version = 1

[*]
n-gpu-layers = -1
ctx-size = 8192
jinja = true
stop-timeout = 30

[gpt-oss-20b]
model = /opt/models/gpt-oss-20b/gpt-oss-20b-Q4_K_M.gguf
ctx-size = 16384
load-on-startup = true

[nemotron-3-super-120b]
model = /opt/models/nemotron-3-super-120b/UD-Q4_K_XL/NVIDIA-Nemotron-3-Super-120B-A12B-UD-Q4_K_XL-00001-of-00003.gguf
ctx-size = 16384
temp = 0.6
top-p = 0.95

[qwen3-next-80b]
model = /opt/models/qwen3-next-80b/Qwen3-Next-80B-A3B-Instruct-UD-Q4_K_XL.gguf
n-gpu-layers = 99
ctx-size = 65536
flash-attn = true

[qwen3-coder-30b]
model = /opt/models/qwen3-coder-30b/Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf
ctx-size = 32768

[qwen2.5-vl-32b]
model = /opt/models/qwen2.5-vl-32b/qwen2.5-vl-32b-instruct-q4_k_m.gguf
ctx-size = 8192</code></code></pre><p>This is where the setup becomes sane. The <code>[*]</code> section gives me shared defaults. Each named section becomes a model identifier that callers can use in API requests. The default reasoning model is then loaded at startup so the box comes up hot instead of idle.</p><p>One subtle but important detail from the docs: router-controlled arguments can be overridden or ignored when a model is loaded. That means you should think of host, port, and router-level behavior as belonging to the router, not to any individual model preset. The preset file is for model-specific runtime configuration, not for redefining the entire server.</p><h2>The New systemd Setup</h2><p>I like keeping the base unit file clean, so I use a systemd drop-in instead of rewriting the service.</p><pre><code><code>[Service]
ExecStart=
ExecStart=/opt/llama.cpp/build/bin/llama-server \\\\
    --host 0.0.0.0 \\\\
    --port ${PORT} \\\\
    --models-preset /opt/llama.cpp/presets/all-models.ini \\\\
    --models-max 1 \\\\
    --parallel ${N_PARALLEL} \\\\
    --jinja \\\\
    --no-webui \\\\
    --metrics \\\\
    -ot ".ffn_.*_exps.=CPU" \\\\
    --flash-attn on</code></code></pre><p>The blank <code>ExecStart=</code> line clears the original command. Then the new command launches the router with the preset file. The key flag here is <code>--models-preset</code>. That is what turns this from a one-model server into a local multi-model router.</p><p>I also cap the router with <code>--models-max 1</code> because I do not want this box trying to keep multiple heavyweight models resident at once. My goal is flexibility, not pretending 32 GB of VRAM is infinite.</p><h2>How Switching Works</h2><p>From the caller&#8217;s perspective, the entire experience comes down to one field:</p><pre><code><code>curl &lt;http://pedrogpt:8080/v1/chat/completions&gt; \\\\
  -H "Content-Type: application/json" \\\\
  -d '{
    "model": "qwen3-coder-30b",
    "messages": [
      {"role": "user", "content": "Write a Go HTTP server"}
    ],
    "max_tokens": 500
  }'</code></code></pre><p>That is the part people should pay attention to. The endpoint and the request shape stay the same. The client does not need to know how the model is loaded, where the GGUF lives, or whether another model was loaded five seconds ago. It just asks for a named model.</p><p>That is the operational win. You decouple the client from the deployment details.</p><h2>Why MoE Models Make This More Practical</h2><p>Three of the models in this setup are Mixture-of-Experts models. That matters because MoE changes what &#8220;too big for local inference&#8221; actually means. A model may have a huge total parameter count, but only a subset of experts are active on a given forward pass. In practice, that gives you room to do something useful on consumer hardware that would look impossible if you were only thinking in terms of total parameters.</p><p>Here is the rough strategy:</p><p>Model Type Approx size Strategy GPT-OSS 20B dense 11 GB all GPU Nemotron-3-Super 120B-A12B MoE ~79 GB GPU attention + RAM experts Qwen3-Next 80B-A3B MoE ~43 GB GPU attention + RAM experts Qwen3-Coder 30B-A3B MoE 18 GB mostly/all GPU Qwen2.5-VL 32B dense 19 GB all GPU</p><p>The takeaway is not that everyone should run a 120B model at home, it&#8217;s that that routing plus careful offload rules lets one local box cover a much wider range of workloads than people assume.</p><h2>The Tensor Offloading Trick</h2><p>The most interesting part of this setup is the tensor routing:</p><pre><code><code>-ot ".ffn_.*_exps.=CPU"</code></code></pre><p>That regex sends expert FFN tensors to CPU-backed memory while leaving the parts that benefit most from GPU acceleration on the RTX 5090. For MoE models, that is the difference between &#8220;this model is too large&#8221; and &#8220;this model is slow but practical.&#8221; You are deciding which tensors deserve VRAM and which ones can tolerate the latency of system RAM over PCIe rather than shoving the entire model into VRAM.</p><p>This is also where local hosting stops being just &#8220;download model, run binary.&#8221; At this point you are doing systems work. You are budgeting memory, thinking about latency paths, and deciding which workloads are good enough for your box. That is the part I wish more local AI tutorials explained.</p><h2>Multi-Part GGUFs Are Not The Scary Part</h2><p>One nice quality-of-life detail is that llama.cpp handles multi-part GGUFs natively. If a model ships as shards, you point the preset to the first file and llama.cpp reads the rest.</p><p>That means the operational complexity is not &#8220;how do I merge these files.&#8221; The real complexity is choosing the right model and the right quantization for your hardware.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!N4E2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 424w, /__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 848w, /__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 1272w, /__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!N4E2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1989085,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/195301990?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 424w, /__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 848w, /__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 1272w, /__u/substackcdn.com/image/fetch/$s_!N4E2!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae2dd005-d59e-43f4-8fa5-0e7d9828ae46_1672x941.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Deployment Pattern</h2><p>I keep deployment boring on purpose:</p><ol><li><p>Copy updated <code>.ini</code> preset files to the machine</p></li><li><p>Write or update the systemd drop-in</p></li><li><p>Run <code>systemctl daemon-reload</code></p></li><li><p>Restart <code>llama-server</code></p></li></ol><p>Models are downloaded ahead of time into <code>/opt/models/</code> so the service is not trying to pull from Hugging Face at runtime. I strongly recommend this. Local inference stops feeling local very quickly if your server has to fetch model artifacts on startup. Pre-download the files, use absolute paths, and treat the machine like infrastructure instead of like a notebook experiment.</p><h2>What Clients Need to Change</h2><p>The short answer is almost nothing, actually.</p><p>If you already have clients talking to an OpenAI-compatible endpoint, the only real change is the model identifier. Instead of pointing to one hardcoded model alias, the client sets <code>"model"</code> to one of the names from the preset file. That is it. Request format stays the same, and the response format stays mostly the same.</p><p>That is why I like this pattern so much. It upgrades the backend without forcing a redesign on every caller.</p><h2>One Correction I Would Make When Operating This</h2><p>I would not rely too heavily on <code>/v1/models</code> as your operational source of truth in router mode. The llama.cpp docs distinguish between the OpenAI-compatible model info endpoint and the router-oriented <code>/models</code> endpoints used to inspect available models and load state. If you are debugging the router, <code>/models</code> is the more faithful mental model. If you are serving OpenAI-style clients, <code>/v1/chat/completions</code> is still the interface they care about.</p><p>That distinction is small, but it matters when you are writing an operations guide.</p><h2>Why This Actually Matters</h2><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>The real shift here is that local inference can now look more like an actual shared service. One machine can expose a reasoning model, a coding model, and a vision model through one stable endpoint without turning model switching into a manual maintenance task.</p><p>That is a huge improvement for anyone building home lab AI, internal tools, or small-team local infrastructure. You do not have to pretend one model is good at everything or burn a separate service for every use case. You can route by workload, keep your clients simple, and make the hardware earn its keep.</p><p>This is also the more honest way to talk about self-hosting. Hosting your own models is not just about avoiding API bills. It is about owning the operational layer: knowing what is loaded, knowing what your hardware can do, and designing the system around actual workloads instead of model hype.</p><h2>Final Take</h2><p>If you are still running one hardcoded model behind <code>llama-server</code>, that setup is fine for a first step. But if your local box is starting to serve multiple jobs, router mode is the better pattern. <code>--models-preset</code> gives you a clean way to register many models, assign sane defaults, and switch between them with the same <code>"model"</code> field your clients already know how to send.</p><p>That is the real recent change: self-hosting with llama.cpp no longer has to mean choosing one model and getting stuck with it. Now it can mean building a local inference router that behaves like infrastructure.</p><div><hr></div><h2>Links and references</h2><ul><li><p>llama.cpp server documentation: <a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md">https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md</a></p></li><li><p>llama.cpp repository: <a href="https://github.com/ggml-org/llama.cpp">https://github.com/ggml-org/llama.cpp</a></p></li><li><p>Hugging Face GGUF docs and model hosting ecosystem: <a href="https://huggingface.co/docs/hub/gguf">https://huggingface.co/docs/hub/gguf</a></p></li><li><p>Qwen models on Hugging Face: <a href="https://huggingface.co/Qwen">https://huggingface.co/Qwen</a></p></li><li><p>NVIDIA Nemotron models on Hugging Face: <a href="https://huggingface.co/nvidia">https://huggingface.co/nvidia</a></p></li></ul><h1><strong>My Courses</strong></h1><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p><div><hr></div><h2><strong>Stay Connected</strong></h2><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/soypetetech.substack.com/p/ai-reliability-engineering">AI Reliability Engineering</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/data-as-an-ai-guardrail?utm_campaign=post-expanded-share&amp;utm_medium=web">Data as an AI Guardrail</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">I Hate the Term Context Engineering</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><blockquote><blockquote><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p></blockquote><blockquote><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong></p></blockquote></blockquote><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><p>Latest episode:<br></p><div id="youtube2-HTTxE7Y1sko" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;HTTxE7Y1sko&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/HTTxE7Y1sko?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[AI Didn’t Break Your Platform. You Skipped Engineering]]></title><description><![CDATA[AI Didn&#8217;t Break Your Platform, and You Just Skipped Engineering.]]></description><link>https://soypetetech.substack.com/p/ai-didnt-break-your-platform-you</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-didnt-break-your-platform-you</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 20 Apr 2026 15:43:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RY1g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>AI Didn&#8217;t Break Your Platform, and You Just Skipped Engineering.</strong></p><p>Things are breaking more often. Not in catastrophic, headline-grabbing ways, but in smaller, more frequent degradations that chip away at reliability.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://x.com/benhylak/status/2038686195153293733?s=20&quot;,&quot;full_text&quot;:&quot;GitHub has changed course and is now targeting \&quot;two 9's\&quot; of uptime\n\n(89.9%)&quot;,&quot;username&quot;:&quot;benhylak&quot;,&quot;name&quot;:&quot;ben (is hiring engineers)&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/2016053929583521792/MNeDZthF_normal.jpg&quot;,&quot;date&quot;:&quot;2026-03-30T18:34:00.000Z&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{&quot;full_text&quot;:&quot;dont you do it github...&quot;,&quot;username&quot;:&quot;ThePrimeagen&quot;,&quot;name&quot;:&quot;ThePrimeagen&quot;,&quot;profile_image_url&quot;:&quot;https://pbs.substack.com/profile_images/1924503772094517249/DfKkH0ph_normal.jpg&quot;},&quot;reply_count&quot;:11,&quot;retweet_count&quot;:14,&quot;like_count&quot;:2173,&quot;impression_count&quot;:70263,&quot;expanded_url&quot;:null,&quot;video_url&quot;:null,&quot;video_preview_media_key&quot;:null,&quot;belowTheFold&quot;:false}" data-component-name="Twitter2ToDOM"></div><p>When you look at real dashboards(like Claude Status Page or GitHub Status) you don&#8217;t see perfection, you see patterns: partial outages, degraded performance, intermittent failures over the last 30 days. The easy narrative is to blame AI, but that misses the point. AI didn&#8217;t introduce failure into our systems. Failure has literally always been there. What changed is how rigorously we engineer around it. AI didn&#8217;t break your platform, you just skipped engineering.</p><h1><strong>AI Didn&#8217;t Break This</strong></h1><p>We are shipping faster than we ever have before, and AI is a huge part of that. It has removed friction from the most time-consuming parts of development, turning hours of implementation into minutes, which honestly is a net positive. However, speed doesn&#8217;t eliminate responsibility. Rather, it amplifies the consequences of skipping it. At the behest of business pressure and the need to move quickly, we&#8217;ve started to trade engineering discipline for velocity. Now, AI is making that tradeoff easier to justify. And when you remove discipline from a system designed to handle failure, you don&#8217;t get innovation&#8212;you get instability. Now we are seeing early signals of this even at the infrastructure level, with reports like AWS outages caused by AI tools pointing to AI tooling influencing real system failures.</p><h1><strong>AI Is Gaslighting You</strong></h1><p>The deeper issue is that AI is optimized to complete tasks, <strong>not to guarantee correctness.</strong> It will produce outputs that look valid, feel complete, and even include convincing explanations of why they work, but those explanations are not validation&#8212;they are generated text. When you ask an AI system if something worked, it will almost always say yes because its objective is just to finish the task. It does not care about proving correctness under real-world conditions. This creates a dangerous illusion: systems appear reliable because they return answers, not because they behave <strong>correctly</strong>. That illusion is reinforced by agent harnesses likeretries, tool calls, orchestration layers that smooth over failures and present a clean result. What you end up with is not reliability, but rather failure with better UX. If you&#8217;ve seen this behavior in the wild, this clip is a perfect example of the mindset we&#8217;re normalizing: </p><div class="instagram-embed-wrap" data-attrs="{&quot;instagram_id&quot;:&quot;DWDGU6AkbjI&quot;,&quot;title&quot;:&quot;Alberta Tech on Instagram: \&quot;Rip to whoever was oncall at AWS &#128553;\&quot;&quot;,&quot;author_name&quot;:&quot;@alberta.tech&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/__ss-rehost__IG-snapshot-DWDGU6AkbjI.jpg&quot;,&quot;like_count&quot;:null,&quot;comment_count&quot;:null,&quot;profile_pic_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/__ss-rehost__IG-profile-pic-DWDGU6AkbjI.png&quot;,&quot;follower_count&quot;:null,&quot;timestamp&quot;:null,&quot;belowTheFold&quot;:false}" data-component-name="InstagramToDOM"></div><h1><strong>You Need a System Before You Let AI Build One</strong></h1><p>We already know how to solve this problem because we&#8217;ve solved it before. Test-driven development taught us to define expected outcomes before writing code, ensuring that functions behave correctly under known conditions. Site Reliability Engineering extended that principle to entire systems by introducing SLAs, monitoring, and failure-aware design. Practices like canary deploys, blue-green deployments, regression testing, and chaos engineering exist to validate behavior at scale, not just at the function level. These frameworks were built to allow imperfect humans to safely ship to production. AI does not change that requirement and itanything, it raises the bar. The question is no longer &#8220;does this code run,&#8221; but &#8220;does this system behave correctly under stress, at scale, and over time?&#8221; That question cannot be answered by AI. It <em>must</em> be answered by the systems you build around it.</p><h1><strong>There Is No Excuse Anymore</strong></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>If AI is accelerating development, then it is also freeing up time. Time that used to be spent writing boilerplate, debugging syntax, or wiring basic logic can now be reinvested into validation and system design. That means we have fewer excuses than ever for shipping incomplete engineering. We can generate exhaustive unit tests, simulate user behavior with synthetic traffic, continuously validate contracts through integration testing, and enforce SLAs through monitoring and alerting. We can even use AI itself to stress-test our systems by creating agents that behave like users and push infrastructure to its limits. The tooling is no longer the constraint. The only constraint is whether we choose to use it.</p><p>This is also where the idea of WTFs per minute becomes more relevant than ever (<a href="https://commadot.com/wtf-per-minute/">https://commadot.com/wtf-per-minute/</a>). Good systems are not just correct, they are understandable. You should be able to trace behavior, explain outcomes, and debug failures without guesswork. AI-generated code increases that responsibility. If you cannot explain why your system works, then you do not have a reliable system. You have a system that hasn&#8217;t failed yet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!RY1g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!RY1g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1450957,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/194358311?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!RY1g!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6612d8ae-afa7-4b4e-8370-df88fa8bd348_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1><strong>The Day of the Web Dev Is Over</strong></h1><p>We are not just shipping features anymore. We are not just writing code.</p><p>We are engineers building systems. It&#8217;s time we all start acting like it.<br><strong>My Courses</strong></p><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p><div><hr></div><h2><strong>Stay Connected</strong></h2><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/soypetetech.substack.com/p/ai-reliability-engineering">AI Reliability Engineering</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/data-as-an-ai-guardrail?utm_campaign=post-expanded-share&amp;utm_medium=web">Data as an AI Guardrail</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">I Hate the Term Context Engineering</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><blockquote><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong></p></blockquote><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><p>Latest episode:</p><div id="youtube2--fvMPKLHgeY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-fvMPKLHgeY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/-fvMPKLHgeY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[I Replaced Claude Code With MiniMax 2.5 on Two DGX Sparks]]></title><description><![CDATA[I finally replaced Claude Code.]]></description><link>https://soypetetech.substack.com/p/i-replaced-claude-code-with-minimax</link><guid isPermaLink="false">https://soypetetech.substack.com/p/i-replaced-claude-code-with-minimax</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 13 Apr 2026 14:17:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!O_Fi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>I finally replaced Claude Code.</strong></p><p>Not because <a href="https://www.anthropic.com/claude-code">Claude Code</a> is bad, but because I wanted my coding assistant to live on hardware I already own, on my own network, reachable from any machine on my <a href="https://tailscale.com/docs/concepts/tailnet">tailnet</a>, without API bills and without a cloud dependency hiding inside the most important part of the workflow.</p><p>That was the real goal. Not &#8220;try local AI&#8221; or &#8220;stand up a demo.&#8221; I wanted a coding stack I could actually use day to day.</p><p>My first attempt was <a href="https://github.com/exo-explore/exo">exo</a>. Turns out it was the wrong tool for this job. Exo made for a fun experiment, but my <a href="https://www.nvidia.com/en-us/products/workstations/dgx-spark/">DGX Sparks</a> are NVIDIA machines, and what I needed was a CUDA-native distributed inference stack that could serve a serious coding model over an OpenAI-compatible API. So I stopped trying to make the wrong abstraction fit the wrong hardware.</p><p>This is the stack that finally worked: <a href="https://huggingface.co/QuantTrio/MiniMax-M2.5-AWQ">**MiniMax 2.5</a> running across two <a href="https://www.nvidia.com/en-us/products/workstations/dgx-spark/">DGX Sparks</a> with <a href="https://www.ray.io/">Ray</a> + <a href="https://docs.vllm.ai/">vLLM</a>**, exposed over my <a href="https://tailscale.com/docs/concepts/tailnet">tailnet</a> so I can hit it from any machine.</p><p>And yes, this is the setup that finally let me get rid of <a href="https://www.anthropic.com/claude-code">Claude Code</a>.</p><div><hr></div><h2>The Goal</h2><p>I wanted five things:</p><ol><li><p>A strong open source coding model</p></li><li><p>Running locally on hardware I already own</p></li><li><p>Distributed across both DGX Sparks</p></li><li><p>Reachable from anywhere on my Tailnet</p></li><li><p>Good enough to replace Claude Code for real work</p></li></ol><p>That last part matters.</p><p>A lot of people say they Opus 4.6 is the best. I hear it all the time in the echo chamber of working in AI. But I think AI is as only as good as the user, so since I have the compute, and the access via Tailscale I should use it to maximize my coding output while minimizing Token Cost. I did not want a local toy, I wanted a local replacement.</p><div><hr></div><h2>The Hardware</h2><p>Here is the setup:</p><p>Machine Role OS DGX Spark #1 Ray head node + vLLM serve Ubuntu Linux DGX Spark #2 Ray worker node Ubuntu Linux Any laptop or desktop on my tailnet OpenCode client macOS / Linux / whatever</p><p>The Sparks do the inference. The client machine does not matter much anymore, which is exactly the point.</p><p>The nodes are connected locally for cluster traffic, and I access the API remotely over Tailscale. That&#8217;s important to note; the cluster networking and the remote client path are not the same thing. Sparks have 200 GBPS cable coupling them. This is how I create the hardware cluster and let the 2 Sparks act as one machine.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!O_Fi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!O_Fi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2525370,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/193522207?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!O_Fi!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17d13512-abae-4d65-b6a4-032ec5caf602_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><h2>Why MiniMax 2.5</h2><p><a href="https://huggingface.co/QuantTrio/MiniMax-M2.5-AWQ">MiniMax 2.5</a> was the model I wanted from the beginning.</p><p>I was looking for an open model that was actually competitive for coding, not just &#8220;pretty good for local.&#8221; I wanted something that had enough weight behind it to justify replacing a paid hosted tool, and I wanted something that could survive the constraints of real hardware.</p><p>That means model selection was not just about benchmark screenshots. It was about the intersection of:</p><ul><li><p>coding quality</p></li><li><p>quantization availability</p></li><li><p>memory footprint</p></li><li><p>runtime support</p></li><li><p>cluster support</p></li><li><p>whether the model can be served reliably on the hardware in front of me</p></li></ul><p>That last one is where a lot of local AI projects go sideways.</p><p>On paper, plenty of models look attractive. In practice, the winner is the one that both performs well <strong>and</strong> actually runs. For me, that ended up being <strong><a href="https://huggingface.co/QuantTrio/MiniMax-M2.5-AWQ">QuantTrio/MiniMax-M2.5-AWQ</a></strong>.</p><div><hr></div><h2>The Real Constraint Was Not the Model,It Was the Stack.</h2><p>This is the part I think people underestimate.</p><p>Getting a model to exist on Hugging Face is not the same thing as getting it to run cleanly on a two-node DGX Spark cluster.</p><p>The problem was not &#8220;is MiniMax 2.5 real?&#8221; or even &#8220;does vLLM know what MiniMax 2.5 is?&#8221;</p><p>The problem was all the ugly stuff in between:</p><ul><li><p>the right container version</p></li><li><p>the right parser flags</p></li><li><p>the right multi-node runtime</p></li><li><p>the right interface selection</p></li><li><p>the right cluster bootstrapping</p></li><li><p>the right memory behavior during model load</p></li><li><p>the right transport between both Spark nodes</p></li></ul><p>That is why the final lesson here is not &#8220;use this one command.&#8221;</p><p>The final lesson is that <strong>the serving stack matters as much as the model</strong>.</p><div><hr></div><h2>Why Ray + vLLM Was the Right Answer</h2><p><a href="https://www.ray.io/">Ray</a> + <a href="https://docs.vllm.ai/">vLLM</a> was an obvious choice.</p><p>It gave me:</p><ul><li><p>a CUDA-native inference path</p></li><li><p>distributed execution across both nodes</p></li><li><p>tensor parallelism across the Sparks</p></li><li><p>an OpenAI-compatible API</p></li><li><p>a stack that feels like infrastructure instead of a science project</p></li></ul><p>This stopped being &#8220;Miriah is tinkering with local models&#8221; and started being &#8220;Miriah now has a local coding service on her own network.&#8221; That felt like a very different thing.</p><div><hr></div><h2>What Actually Made It Work</h2><p>When you work with hardware there are a lot of unknowns. I started with the <a href="https://build.nvidia.com/spark/vllm">Nvidia recommendation for vllm on 2 Sparks</a>, but after fighting the hardware for several days and using lots of Claude tokens I was pointed at this repo that just solved the problem, <a href="https://github.com/eugr/spark-vllm-docker">https://github.com/eugr/spark-vllm-docker</a></p><p>I ended up using the Spark-specific open source image and helper scripts because they handled the practical parts that kept breaking on me:</p><ul><li><p>discovering the right network configuration</p></li><li><p>bootstrapping the Ray cluster correctly</p></li><li><p>aligning both nodes on the same runtime assumptions</p></li><li><p>giving me a repeatable path to serving the model</p></li></ul><p>The unlock ended up being just the boring, operational truth that the best stack is the one that actually survives contact with your hardware.</p><div><hr></div><h2>The Stack That Finally Replaced Claude Code</h2><p>This is the stack I am using now:</p><ul><li><p><strong>Model:</strong> QuantTrio/MiniMax-M2.5-AWQ</p></li><li><p><strong>Runtime:</strong> vLLM</p></li><li><p><strong>Distributed execution:</strong> Ray</p></li><li><p><strong>Hardware:</strong> 2x DGX Spark</p></li><li><p><strong>Client:</strong> OpenCode</p></li><li><p><strong>Access path:</strong> Tailscale</p></li></ul><p>This is the combination that&#8217;s giving me a coding assistant that runs on my own hardware, with no API bill, no usage limits, and no requirement that my best workflow live on somebody else&#8217;s product.</p><div><hr></div><h2>The Gotchas That Actually Mattered</h2><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>There were a lot of little cuts along the way, but the highest-signal issues were these.</p><h3>1. The cluster path mattered more than the model path</h3><p>The hardest part was not choosing MiniMax 2.5. It was getting the distributed runtime stable across both Spark nodes.</p><h3>2. The official-looking path was not the fastest path to success</h3><p>The version that actually worked for me was the open source Spark image plus the repo scripts that handle detection and bootstrapping. That was faster than trying to force a cleaner narrative.</p><h3>3. Multi-node local inference is mostly an infrastructure problem</h3><p>Once you move beyond single-box local AI, the work starts to look a lot more like systems engineering: networking, runtime coordination, memory behavior, and repeatability.</p><h3>4. &#8220;Local&#8221; only counts if the workflow stays local</h3><p>For me, the entire point of this project was replacing the coding assistant, not just running a model. That is why OpenCode mattered. That is why Tailnet access mattered. That is why I kept going until this was something I could use from any machine.</p><div><hr></div><h2>The Result</h2><p>I finally replaced Claude Code!</p><p>The hardware and models are both getting good fast. The open source clients are getting good fast. But the operational glue is still where most of the work lives. The difference between &#8220;I tried a local model&#8221; and &#8220;I replaced a paid coding tool&#8221; is not just intelligence. It is systems design. Ultimately, this project ended up being less about model hype, more about infrastructure.</p><p>And I am okay with that. Because now the coding assistant is mine, and if I give it my k8s credentials those creds do not leave my network. If I share a secret it is not accidentally it was not in chat history for ever. I am not sharing my IP.</p><div><hr></div><h2>Final Thought</h2><p>I think this is where a lot of AI infrastructure is headed. Claude Code, this I use as my primary driver in my day job, is slower than my MiniMax cluster just because api latency. MiniMax writes great code. With OpenCode and a 120k context I can do an entire PR&#8217;s worth of work in a session - a pr is ~atomic commit as defined by me.</p><p>Not everybody needs a DGX Spark cluster in their house. But a lot more engineers are going to want the same outcome:</p><ul><li><p>strong open models</p></li><li><p>private inference</p></li><li><p>no recurring API dependency</p></li><li><p>workflows that stay local</p></li><li><p>infrastructure they can actually control</p></li></ul><p>I use it everyday, from my laptop, my phone, anywhere. And that is the first time I can honestly say that about a local coding stack.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!rWPq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 424w, /__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 848w, /__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 1272w, /__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!rWPq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png" width="1290" height="2796" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2796,&quot;width&quot;:1290,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:653940,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/193522207?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 424w, /__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 848w, /__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 1272w, /__u/substackcdn.com/image/fetch/$s_!rWPq!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F377111c1-7369-4226-8d81-72a2bc1cb1dc_1290x2796.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>P.S. Here is my <a href="https://github.com/Soypete/dotfiles/tree/main/opencode">OpenCode config</a>.</p><h1></h1><h1><br><strong>My Courses</strong></h1><blockquote><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p></blockquote><div><hr></div><h2><strong>Stay Connected</strong></h2><blockquote><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p></blockquote><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><blockquote><p><strong>Recent Posts You Might Have Missed</strong></p></blockquote><ul><li><p><a href="/__u/soypetetech.substack.com/p/ai-reliability-engineering">AI Reliability Engineering</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/data-as-an-ai-guardrail?utm_campaign=post-expanded-share&amp;utm_medium=web">Data as an AI Guardrail</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">I Hate the Term Context Engineering</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><blockquote><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong></p></blockquote><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><blockquote><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><p>Latest episode:<br></p><div id="youtube2--fvMPKLHgeY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;-fvMPKLHgeY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/-fvMPKLHgeY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></blockquote>]]></content:encoded></item><item><title><![CDATA[Unit Testing Your Agents ]]></title><description><![CDATA[Evals as the Foundation of AI Reliability]]></description><link>https://soypetetech.substack.com/p/unit-testing-your-agents</link><guid isPermaLink="false">https://soypetetech.substack.com/p/unit-testing-your-agents</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Tue, 07 Apr 2026 22:31:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ilX2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Part 2 &#8212; AI Reliability Engineering Series</p><p>In the last post, I argued that most AI systems are not failing because of models , rather they&#8217;re failing because we are not engineering them like systems. Reliability doesn&#8217;t come from better prompts; it comes from constraints, feedback loops, and measurable behavior.</p><p>This post is the next layer: evals.</p><p>Once you accept that AI systems are probabilistic, you need a way to measure and shape that behavior. Evals are how we do that. Not as a final report, but as part of the system itself.</p><h1><strong>Evals Are Not Validation, They Are Development</strong></h1><p>The biggest mistake people make is treating evals as something you run after you build the system. That mindset assumes the system is already correct and you&#8217;re just verifying it. That is not how AI systems work.</p><p>When I build agents, I use evals to answer design questions: how should tools be exposed, how much schema is required, and whether behavior is consistent across models. The eval is guiding the system into existence.</p><p>This is the same shift we made years ago with software testing. Unit tests stopped being something you wrote at the end and became part of how you design code. Evals play that role for AI systems. They are the mechanism that turns probabilistic behavior into something we can reason about.</p><h1><strong>You Are Not Testing Correctness &#8212; You Are Testing Consistency</strong></h1><p>A single successful run of an agent tells you almost nothing. Even multiple successful runs don&#8217;t prove reliability, because AI systems don&#8217;t produce fixed outputs. Instead, they produce distributions of behavior.</p><p>The real question is not &#8220;did it work?&#8221; but &#8220;does it behave the same way under the same conditions?&#8221; That&#8217;s what evals measure. By running the same test repeatedly, you start to see whether behavior stabilizes or drifts.</p><p>This is where reliability engineering comes in. A system that works once is not reliable. A system that produces the same outcome repeatedly under the same inputs is. Evals give you the data to distinguish between the two, and that distinction is what allows you to build systems instead of demos.</p><h1><strong>Table-Driven Evals Turn Behavior Into Something Measurable</strong></h1><p>The way I implement evals is intentionally simple: table-driven tests. Each test defines a prompt or template, an expected behavior, and a way to validate the result. Then I run that same test multiple times.</p><p>The key is repetition. I typically run each scenario around fifteen times, not to get a pass/fail result, but to observe the distribution of outcomes. That distribution is the signal. It tells me whether the system is stable or still drifting.</p><p>This approach mirrors how we test APIs or distributed systems. You define a contract, execute it repeatedly, and measure variance. The difference is that instead of testing deterministic outputs, we&#8217;re testing whether probabilistic systems converge on the same behavior.</p><h1><strong>Behavior Has a Shape And Evals Let You See It</strong></h1><p>Every combination of prompt, tool interface, and middleware produces a pattern of behavior. I think of this as a behavior arc. Not a single outcome, but a shape across repeated runs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ilX2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ilX2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2131522,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/193517684?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ilX2!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e028038-a0f3-47ef-9689-18ab27aad61f_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><p>For example, one model might call the correct tool almost every time, while another does so inconsistently. That difference is not just about model quality; it reflects how well your system design supports the task.</p><p>Once you can see that shape, you can make decisions. You can choose models, refine prompts, or adjust tool interfaces based on actual data instead of intuition. Without evals, those decisions are guesses. With evals, they are grounded in measurable behavior.</p><h1><strong>Evals Answer System Design Questions, Not Just Model Questions</strong></h1><p>In practice, I use evals to answer questions about system architecture. When working with tool-calling agents and databases, the real uncertainty is what context the model needs to do so reliably.</p><p>For example, I tested variations like providing full schema inline, exposing schema as a tool, or providing no schema at all. I also tested whether the agent could generate reliable queries across different backends and levels of complexity. Each variation was run repeatedly to observe stability.</p><p>The result is not a single &#8220;best&#8221; configuration. It is a map of tradeoffs. Some approaches are more reliable but more expensive, while others are flexible but less consistent. Evals let you see those tradeoffs clearly, which is what enables real engineering decisions.</p><h1><strong>Reliability Is About Reducing Variance</strong></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>This is the core connection to AI reliability engineering. Reliability is not about eliminating failure entirely; it is about reducing variance to a level where the system becomes predictable.</p><p>High variance means the system behaves differently each time, even under identical conditions. Low variance means the system produces consistent outcomes. Evals are the tool that lets you measure and reduce that variance.</p><p>Once you can measure variance, you can start engineering against it. You can add constraints, improve prompts, refine tool interfaces, or introduce fallback logic. Each of those changes should reduce variance, and evals let you verify that they actually do.</p><h1><strong>Evals Create a Feedback Loop You Can Engineer Against</strong></h1><p>The most important shift is thinking of evals as a continuous loop rather than a one-time step. You define a behavior, test it repeatedly, measure the outcome, and adjust the system. Then you run the eval again.</p><p>Over time, this loop shapes the system into something stable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eS5Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eS5Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:394767,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/193517684?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eS5Y!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7af691c0-e71f-4e74-ba7b-aa7e1d17f8ba_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is the same pattern we use in distributed systems and performance engineering. The difference is that instead of tuning latency or throughput, we are tuning behavior.</p><h1><strong>Middleware + Evals Is the Reliability Layer</strong></h1><p>Evals alone don&#8217;t make a system reliable. They tell you where it isn&#8217;t. The actual enforcement happens in middleware.</p><p>Middleware defines what the agent is allowed to do: which tools it can call, how data is accessed, and what structure responses must follow. Evals then verify that the agent respects those constraints under repeated runs.</p><p>Together, they form the reliability layer. Middleware enforces behavior, and evals measure whether that enforcement holds. Without middleware, evals just tell you things are broken. Without evals, middleware is unverified.</p><h1><strong>The Shift From Prompting to Engineering</strong></h1><p>Most AI systems today are still built through prompting and manual testing. That approach works for demos, but it does not produce reliable systems.</p><p>The shift is moving to engineering discipline: defining expected behavior, measuring it repeatedly, and iterating based on data. Evals are the mechanism that enables that shift.</p><p>This is why evals are foundational, not optional. They are how you turn a probabilistic model into a predictable component within a larger system.</p><h1><strong>SoyPete Tech Quick Take</strong></h1><p>If you are not running repeated evals on your agents, you are not measuring behavior &#8212; you are observing randomness.</p><p>Start small. Define a handful of test cases, run each multiple times, and measure consistency. Change one variable at a time and observe how the distribution shifts. That process alone will dramatically improve how you build.</p><h1><strong>Final Thought</strong></h1><p>AI didn&#8217;t remove the need for software engineering, it just made the gaps more visible.</p><p>Reliability comes from feedback loops, constraints, and measurement. Evals are the mechanism that closes that loop.</p><p>Not at the end of the system, but at the center of it.</p><h2><strong>My Courses</strong></h2><blockquote><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p></blockquote><div><hr></div><h2><strong>Stay Connected</strong></h2><blockquote><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p></blockquote><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><blockquote><p><strong>Recent Posts You Might Have Missed</strong></p></blockquote><ul><li><p><a href="/__u/soypetetech.substack.com/p/ai-reliability-engineering">AI Reliability Engineering</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/data-as-an-ai-guardrail?utm_campaign=post-expanded-share&amp;utm_medium=web">Data as an AI Guardrail</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">I Hate the Term Context Engineering</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><blockquote><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong></p></blockquote><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><blockquote><p>Deep dives on AI infrastructure, home labs, and production engineering.</p><p>Latest episode:</p></blockquote><div id="youtube2-3Y9MigT5J5M" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;3Y9MigT5J5M&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/3Y9MigT5J5M?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[AI Reliability Engineering]]></title><description><![CDATA[TL;DR AI systems are not reliable by default.]]></description><link>https://soypetetech.substack.com/p/ai-reliability-engineering</link><guid isPermaLink="false">https://soypetetech.substack.com/p/ai-reliability-engineering</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 30 Mar 2026 14:22:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!VErQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>TL;DR</strong></p><p>AI systems are not reliable by default. They are probabilistic engines embedded inside software systems, and their behavior is fundamentally non-deterministic. If we want AI systems to behave reliably, the reliability must come from the engineering around the model, not from the model itself.</p><p>Right now the industry is repeating a mistake we have already made before. Instead of treating AI systems like production infrastructure, we are treating them like magical components that will somehow handle complexity on their own. Spoiler alert - they will not. If anything, AI systems demand more operational discipline, not less.</p><p>If you are building agentic systems today, whether you realize it or not, you are doing reliability engineering.</p><p>In other words: you are an SRE now.</p><h1><strong>We Already Solved This Problem Once</strong></h1><p>Several years ago I wrote a talk and article titled Introduction to Data Reliability Engineering (available on Medium <a href="https://medium.com/weave-lab/introduction-to-data-reliability-engineering-2ddacf7122b7">here</a> ). At the time, data teams were dealing with a common operational failure mode: pipelines broke constantly, dashboards were unreliable, and nobody really owned the stability of the system. Data infrastructure was treated like a collection of scripts rather than a production system.</p><p>The solution turned out to be simple, albeit culturally difficult. Data pipelines had to be treated like services. Once that shift happened, teams began applying the same operational discipline used in traditional infrastructure: observability, service level objectives, incident response, and operational ownership.</p><p>Today we are watching the exact same pattern emerge in AI systems. Agent frameworks are proliferating quickly, and organizations are rushing to build AI workflows; but in the process, reliability thinking has largely disappeared. Engineers talk about prompts and models and tools, but very few discussions focus on operational stability.</p><p>Instead, we hear a different kind of assumption: the belief that the model will somehow resolve complexity on its own.</p><p>That assumption is dangerously misleading.</p><h1><strong>Guardrails Have Hidden the Real Problem</strong></h1><p>One reason this misunderstanding exists is that modern frontier model APIs hide a significant amount of the underlying instability of language models. Most hosted LLM services include multiple layers of guardrails embedded directly in the API layer. These can include structured output enforcement, moderation filters, schema validation, retry logic, and tool-calling constraints.</p><p>Because of these layers, many engineers building AI systems rarely encounter the raw behavior of a language model. The system quietly absorbs many failures before they ever reach the application layer.</p><p>As a result, something subtle has happened: people have forgotten how language models <em>actually</em> behave.</p><p>Language models hallucinate. They do so frequently, not just in edge cases but as a natural consequence of probabilistic generation. That does not make them useless, but it does mean they cannot be treated as deterministic software components.</p><p>Reliable AI systems are therefore not built by pretending hallucination does not exist. They are built by designing systems that expect hallucination and manage it.</p><p>Frontier APIs made LLMs dramatically easier to use. At the same time, they made it easier to forget what those systems actually are.</p><h1><strong>Agent Systems Are Distributed Systems</strong></h1><p>Another challenge appears as soon as AI systems begin to perform real work. Modern agent architectures rarely consist of a single prompt and response. Instead, a single user request may trigger retrieval steps, tool calls, reasoning loops, validation passes, or background tasks.Once a workflow reaches that level of complexity, it begins to resemble something very familiar to systems engineers: a distributed system.</p><p>Agentic systems are distributed systems with a probabilistic component, which introduces an interesting cultural shift. For the last decade, cloud platforms have absorbed much of the complexity involved in building distributed infrastructure. Managed services handle scaling, orchestration, queueing, and failover automatically. That abstraction has been enormously valuable for developer productivity.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!VErQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VErQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2164840,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/192615022?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VErQ!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcded81ed-485d-40bd-adb4-f81bca6035d0_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><p>However, AI systems reintroduce distributed behavior into the application layer itself. Instead of the infrastructure handling orchestration, the workflow logic now lives inside the software the engineer writes. This means engineers must once again think about system behavior under failure conditions. Latency amplification, cascading failures, and inconsistent state are no longer theoretical concerns, now they are common patterns in agent workflows.</p><h1><strong>The Reliability Framework Still Applies</strong></h1><p>Fortunately, the industry already has a well-developed framework for thinking about system reliability. Google&#8217;s Site Reliability Engineering book (Beyer et al.) describes what are commonly known as the Four Golden Signals of system health: latency, traffic, errors, and saturation.</p><p>These signals translate surprisingly well to AI systems, although their interpretation changes slightly.</p><p>Latency in an AI system is not just the time required to produce a response. It may include model inference time, time to first token, streaming latency, tool execution time, and the completion time of the overall workflow. Traffic is similarly more complex because a single user request can expand into multiple model calls as an agent moves through its reasoning process.</p><p>Errors also look different. Agents rarely return explicit error messages. Instead they often return responses that appear valid but are structurally incorrect or incomplete. From a reliability perspective, these outcomes must still be treated as failures.</p><p>Finally, saturation occurs not only in infrastructure resources such as CPU or GPU capacity but also in the context window of the model itself. Excessive context can increase latency, reduce accuracy, and destabilize workflows. This intersection between reliability and context design is something I discussed previously in <a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering">Why I Hate the Term Context Engineering.</a></p><h1><strong>Systems That Never Break Are Fragile</strong></h1><p>Reliability engineering has emphasized for a long time about an important philosophical shift: reliable systems are not systems that never fail.</p><p>Charity Majors, co-author of Database Reliability Engineering, often emphasizes this point in her work. She notes that systems designed to avoid all failure are often fragile because they are never tested under stress. Instead, reliable systems are designed to fail in controlled ways that minimize blast radius and recovery time.</p><p>As Majors writes in <em>Database Reliability Engineering</em>, systems that never fail are often fragile and when they go down it takes all hands on deck to get it live again. True reliability comes from designing systems that can break safely and recover quickly.</p><p>This mindset is especially important for AI systems because probabilistic components will inevitably behave unpredictably. The goal is not eliminating that behavior, but rather designing systems that remain stable despite it.</p><h1><strong>Toil and Operational Work</strong></h1><p>Another concept from reliability engineering that applies directly to AI systems is toil. Majors and Campbell define toil as manual, repetitive work that can be automated and scales with the growth of the service.</p><p>AI workflows introduce new kinds of toil. Engineers frequently find themselves debugging agent outputs, rewriting prompts repeatedly, re-running workflows, or manually correcting incorrect responses. These activities consume engineering time without improving the underlying system.</p><p>The reliability approach to this problem is the same one used in infrastructure operations: automate repetitive operational work wherever possible.</p><h1><strong>Why Homelabs Matter</strong></h1><p>One reason I enjoy running a homelab is that it forces me to confront these system realities directly. When systems run locally, the abstractions that cloud platforms provide disappear. You are forced to think about queues, networking, inference latency, resource limits, and failure modes.</p><p>If something breaks in a homelab, there is no platform team to escalate to. You must understand what the system is actually doing.</p><p>This mindset turns out to be exactly the mindset required to build reliable AI systems. Agent workflows behave much more like distributed systems than traditional web applications. When they fail, the root cause is rarely the model itself, it&#8217;s usually the surrounding system architecture.</p><h1><strong>Predictability Versus Reliability</strong></h1><p>Self-hosting models also exposes deeper layers of model behavior. When running models locally, engineers can observe elements such as logits, token probabilities, sampling behavior, and generation drift.</p><p>This visibility does not automatically make a system reliable. However, it does make the system more predictable. Predictability is the first step toward reliability engineering. Engineers cannot build stable systems around components they treat as complete black boxes.</p><h1><strong>A Pattern We Have Seen Before</strong></h1><p>Interestingly, this pattern is not new. I wrote about a similar dynamic in an earlier article, <a href="/__u/open.substack.com/pub/soypetetech/p/optimizing-into-chaos-why-ai-agents">Optimizing Into Chaos: Why AI Agents Fail.</a> In that post I argued that agent systems tend to optimize aggressively toward goals without strong boundaries. When the surrounding system lacks guardrails, those optimization loops naturally drift into unstable behavior.</p><p>The lesson is simple but important: the model is not the system. The system is everything around the model.</p><h1><strong>The AI Reliability Stack</strong></h1><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>A useful way to think about this architecture is to separate the model from the reliability layers surrounding it.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;9289dcde-9fe4-4655-942f-43fdbaa2355c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">User Request
      &#8595;
Agent Workflow / Orchestrator
      &#8595;
Tool Layer (APIs, Databases, Services)
      &#8595;
LLM (Probabilistic Engine)
      &#8595;
Inference Infrastructure</code></pre></div><p>Wrapped around all of this are the reliability layers:</p><ul><li><p>Observability</p></li><li><p>Validation</p></li><li><p>Retries</p></li><li><p>SLOs</p></li><li><p>Error Budgets</p></li><li><p>Context Management</p></li></ul><p>The model provides reasoning ability, but reliability emerges from the surrounding system design.</p><h1><strong>The Engineer&#8217;s Job Has Changed</strong></h1><p>AI has not removed engineering complexity. Instead, it has shifted where that complexity lives.</p><p>The role of the engineer is no longer just writing deterministic code. It now involves designing systems that contain probabilistic components and ensuring those systems behave predictably under failure conditions.</p><p>That responsibility includes architecture, workflow design, validation layers, retries, observability, and operational boundaries. Engineers must understand how their systems behave under stress because the model will not solve those problems automatically.</p><h1><strong>The Intelligence Is Still the Engineer</strong></h1><p>Language models are extremely powerful tools, but they are not intelligent systems in the traditional sense. They are statistical engines that generate tokens based on probability distributions learned during training.</p><p>The intelligence of the system does not come from the model.</p><p>It comes from the engineer designing the system around it.</p>]]></content:encoded></item><item><title><![CDATA[Data as an AI Guardrail]]></title><description><![CDATA[Using Ontologies to Ground Agentic AI]]></description><link>https://soypetetech.substack.com/p/data-as-an-ai-guardrail</link><guid isPermaLink="false">https://soypetetech.substack.com/p/data-as-an-ai-guardrail</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 16 Mar 2026 15:23:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!815k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Data engineers don&#8217;t spend their careers chasing perfect data. We know perfection is a myth. What we do chase is <strong>validated accuracy</strong> &#8212; accuracy that is explainable, defensible, and bounded. We build schemas, so we know what is allowed to exist. We add constraints, so we know what cannot. We audit pipelines not because data never breaks, but because we expect that it will.</p><p>And then we build AI systems that validate nothing.</p><p>That mismatch is the core problem facing agentic AI today. Not model capability. Not parameter count. Validation.</p><p>When people talk about hallucinations, they usually frame them as an AI failure. In practice, hallucinations are what happen when you ask a system trained to <em>always answer</em> to operate without a model of correctness. Large language models are rewarded for fluency, not truth. Guessing confidently is better than saying &#8220;I don&#8217;t know.&#8221; That training works remarkably well &#8212; until correctness matters.</p><p>As users, we instinctively compensate for this. When I use an LLM as a search engine, my next step is almost always the same: <em>where did that come from?</em> I ask for links. I ask for references. I ask for something external that lets me validate the claim. That instinct comes from the same place our data instincts come from: confidence without evidence is meaningless.</p><p>Autonomous agents don&#8217;t ask those follow-up questions. They act.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!815k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!815k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:179509,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/191132102?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!815k!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f8d60db-53f2-4211-a483-74cd748938b1_1536x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">generated by ChatGPT</figcaption></figure></div><p>Once an AI system can call tools, chain actions, or trigger workflows, validation stops being optional. Yet most agentic systems today rely on system prompts as their primary guardrail. Long lists of rules. Capitalized MUSTs. Carefully worded constraints. Anyone who has built a real agent knows how fragile this is. Relevance decays. Context windows fill. Rules get ignored. Prompt-based guardrails don&#8217;t fail dramatically &#8212; they fail quietly.</p><p>I learned this the hard way while building agents without a framework &#8212; just raw, self-hosted models and tool calls. In one case, I had an agent whose job was simple: find directories. The tool it was supposed to call was named <code>find_directories</code>. The agent kept calling <code>find_directory</code> instead. Singular. One character off. It did this <strong>thirty-five times in a row</strong>, looping confidently, failing silently, and only stopping because I capped the iteration count. The model wasn&#8217;t &#8220;confused.&#8221; It was unvalidated. There was nothing in the system that could say, <em>" This action violates the structure of the world you&#8217;re operating in.&#8221;</em></p><div><hr></div><p>When prompts stop working, teams reach for data. They query a database, dump rows into context, and ask the model to reason. But raw data doesn&#8217;t carry meaning on its own. Rows don&#8217;t explain relationships. IDs don&#8217;t encode business rules. The model sees values, not semantics.</p><p>Data without semantics is just noise to an LLM.</p><p>This is where data engineering thinking becomes essential, because we have already solved this class of problem &#8212; just not for text.</p><blockquote><p>&#8220;The data model for structured data is the ERD. The data model for unstructured data is the ontology.&#8221;</p></blockquote><p>&#8212; Bill Inmon, <em>Mastering Unstructured Data</em></p><p>That statement isn&#8217;t about AI. It&#8217;s about modeling. And that&#8217;s exactly why it matters here.</p><p>We don&#8217;t reason about warehouses because we like tables. We reason about them because schemas encode meaning. They define what exists, how things relate, and which states are invalid. Ontologies do the same thing for text. They are schemas for language. They don&#8217;t make language smarter &#8212; they make it <strong>checkable</strong>.</p><p>An ontology doesn&#8217;t just say that a dog is a mammal. It encodes that relationship so it can be traversed, queried, and validated. Meaning lives in the relationships, not the tokens. Once reasoning is explicit, it can be audited. When it&#8217;s implicit, all you have is confidence.</p><p>This difference becomes obvious when you give an agent a question it <em>sounds</em> like it should know. Ask an LLM: <em>What was the largest-attended World&#8217;s Fair in history?</em> It will almost always answer confidently. Sometimes it will even be right. But unless you validate that claim against a semantic model &#8212; attendance, year, location, event type &#8212; you have no way to know whether the answer is correct or just plausible. With an ontology like Wikidata, that same agent can make a claim, query the graph, realize it&#8217;s wrong, and correct itself. Not because it &#8220;thought harder,&#8221; but because it checked the structure of the data.</p><p>That&#8217;s the distinction most AI systems are missing.</p><p>What&#8217;s changed recently isn&#8217;t the theory &#8212; it&#8217;s the urgency. Agents don&#8217;t just describe information anymore. They act on it. Industry research is converging on the same conclusion from different directions: language models need semantic constraints to behave reliably. Whether it&#8217;s ontology-guided extraction, graph-constrained reasoning, ontology-augmented generation, or function-calling schemas, the pattern is consistent. Meaning must be modeled outside the model.</p><p>This is why ontologies work so well as AI guardrails. They allow deterministic validation in an otherwise probabilistic system. The same query returns the same answer every time. The reasoning path is visible. Violations can be explained instead of being silently corrected. That is not an AI trick &#8212; it&#8217;s data modeling applied to language.</p><p>Which is why hallucination is not an AI problem. It&#8217;s a data problem. We already know how to validate claims. We&#8217;ve been doing it in data pipelines for decades. We just haven&#8217;t applied the same rigor to text.</p><p>Agentic AI doesn&#8217;t need more clever prompts. It needs grounding. It needs semantic models that constrain what can be said, not just how it should sound. It needs validation mechanisms that operate independently of model confidence.</p><p>That work doesn&#8217;t belong exclusively to AI researchers. It belongs to data engineers &#8212; the people who already understand how fragile truth becomes without structure.</p><p>We don&#8217;t need to retrain models to fix hallucination.</p><p>We need to model meaning and enforce it.</p><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p><br><a href="https://www.youtube.com/live/tl5p1DtapOA?si=aGXleKxie1RuK4pK">In my recent talk </a>I mentioned that &#8220;agents need more validation, not more prompts.&#8221; Here&#8217;s what that looks like in a real project.</p><p>This snippet is from Professor Pedro, where I&#8217;m wiring validation into the agent loop so the model can&#8217;t just confidently drift &#8212; it has to check claims against a semantic structure before it moves forward.</p><p>Link: <a href="https://github.com/Soypete/professor_pedro/pull/22/files#diff-3830a657693bcc87aecfe69a41169e1cee21c8f7e120de67d78418385d0d1f26">https://github.com/Soypete/professor_pedro/pull/22/files#diff-3830a657693bcc87aecfe69a41169e1cee21c8f7e120de67d78418385d0d1f26</a></p><h2>References</h2><h4>Ontology as Guardrail</h4><ul><li><p><a href="https://machinelearning.apple.com/research/odke">ODKE+: Ontology-Guided Knowledge Extraction</a> &#8212; Apple, 2025</p></li><li><p><a href="https://arxiv.org/html/2410.13080v1">Graph-Constrained Reasoning (GCR)</a> &#8212; arXiv, 2024</p></li></ul><h4>Ontology as Context</h4><ul><li><p><a href="https://www.palantir.com/docs/foundry/ontology/ontology-augmented-generation">Ontology-Augmented Generation</a> &#8212; Palantir Docs</p></li><li><p><a href="https://blog.palantir.com/building-with-palantir-aip-data-tools-for-rag-oag-b3b509c8b0f3">Building with AIP: Data Tools for RAG/OAG</a> &#8212; Palantir Blog</p></li></ul><h4><strong>Ontology Behind Tool Calls</strong></h4><ul><li><p><a href="https://aclanthology.org/2024.acl-long.471.pdf">FNCTOD: Function Calling for Task-Oriented Dialogue</a> &#8212; ACL 2024</p></li><li><p><a href="https://ceur-ws.org/Vol-3853/paper7.pdf">LLMs + KGs via Function Calling</a> &#8212; CEUR Workshop</p></li><li><p><a href="https://www.engr.siu.edu/staff/iraklis.anagnostopoulos/files/papers/Less_is_More_Optimizing_Function_Calling_for_LLM_Execution_on_Edge_Devices.pdf">Less is More: Function Calling on Edge</a> &#8212; SIU</p></li></ul><h4>Foundational</h4><ul><li><p><a href="/__u/williaminmon.substack.com/p/mastering-unstructured-data-data">Mastering Unstructured Data</a> &#8212; Bill Inmon</p></li><li><p><a href="/__u/moderndata101.substack.com/p/the-ontology-pipeline">The Ontology Pipeline</a> &#8212; Jessica Talisman</p></li><li><p><a href="/__u/jessicatalisman.substack.com/p/relationships-and-knowledge-systems">Relationships and Knowledge Systems</a> &#8212; Jessica Talisman</p></li><li><p><a href="/__u/jessicatalisman.substack.com/p/ontologiessome-perspectives">Ontologies&#8212;Some Perspectives</a> &#8212; Jessica Talisman</p></li><li><p><a href="/__u/jessicatalisman.substack.com/p/controlled-vocabularies">Controlled Vocabularies</a> &#8212; Jessica Talisman</p><div><hr></div><h2><strong>My Courses</strong></h2><blockquote><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p></blockquote><div><hr></div><h2><strong>Stay Connected</strong></h2><blockquote><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p></blockquote><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><blockquote><p><strong>Recent Posts You Might Have Missed</strong></p></blockquote><ul><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/why-i-hate-the-term-context-engineering?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">I Hate the Term Context Engineering</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a><br><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/when-a-pedrocli-stops-being-a-cli">When a PedroCLI Stops Being a CLI</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/pedrocli-clawdmoltetc">PedroCLI vs Clawd / Molt / etc</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><blockquote><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all"><br></a></p></blockquote><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><blockquote><p>Deep dives on AI infrastructure, home labs, and production engineering.<br>Latest episode:</p><div id="youtube2-s836W5KGheI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;s836W5KGheI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/s836W5KGheI?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div></blockquote></li></ul>]]></content:encoded></item><item><title><![CDATA[Why I Hate the Term “Context Engineering”]]></title><description><![CDATA[(and Why Everyone Is Doing It Wrong)]]></description><link>https://soypetetech.substack.com/p/why-i-hate-the-term-context-engineering</link><guid isPermaLink="false">https://soypetetech.substack.com/p/why-i-hate-the-term-context-engineering</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Mon, 09 Mar 2026 16:20:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ft9f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TL;DR</h2><p>We keep treating &#8220;context engineering&#8221; like prompt tweaking or a new job title, and that&#8217;s why agents keep failing in predictable ways. AI systems don&#8217;t bring context with them. They start empty, then probabilistically act on whatever we expose. The real work isn&#8217;t letting models &#8220;figure it out;&#8221; it&#8217;s deterministically engineering how scoped data, semantics, tools, and instructions enter the system so we can shape outcomes without handing the model all the information in the world. Context engineering at its core is systems design, and most people are doing it wrong because they&#8217;re focused on prompts instead of data.</p><div><hr></div><p>I want to talk about context &#8212; not prompts, not tokens, not &#8220;agent magic,&#8221; but <strong>context</strong>.</p><p>And I&#8217;m going to start with an analogy I&#8217;m stealing from my friend Tod Hansmann, who dropped this gem at a meetup:</p><blockquote><p>The difference between American cinema and Japanese cinema is context.</p></blockquote><p>In American cinema, there&#8217;s an expectation that you come with a shared cultural background. Certain stories can only be told through certain lenses. You&#8217;re expected to already know how to read what&#8217;s happening.</p><p>In Japanese cinema, the assumption is the opposite: <strong>you come with no context</strong>.</p><p>That&#8217;s why the same story can be told with children, adults, witches, demons, or aliens &#8212; it doesn&#8217;t matter. The story is portable. The system doesn&#8217;t rely on the audience to bring the meaning with them.</p><p>And this is exactly where we are getting AI wrong.</p><div><hr></div><h2>We Expect AI to Bring Context &#8212; and That&#8217;s the Bug</h2><p>We expect AI to know everything, and that expectation is wrong.</p><p>Go back to GPT-3 and GPT-3.5 &#8212; the pre&#8211;tool call era. All the model had was:</p><ul><li><p>The text you gave it</p></li><li><p>Statistical patterns from training</p></li><li><p>A next-token prediction loop</p></li></ul><p>There was no validation or math or summation. There was no task execution. It could not <em>do</em> anything, it could only predict what came next based on patterns. Fast forward to today, and AI providers layered tool calls on top of that foundation. Now we have access to web search, plugins, code execution, andAPIs. This is what enabled &#8220;agents.&#8221;</p><p>Now when the model predicts a sequence that requires more information, it can go get it. And here&#8217;s where the American-cinema assumption sneaks in. We assume that because tool calls exist, <strong>the model is bringing context with it</strong>.</p><p>It isn&#8217;t.</p><p>The agent still starts with the same amount of context as before, but it now has the ability to fetch more, and that distinction matters more than people realize.</p><div><hr></div><h2>Multi-Bot and Plugin Failures Were Predictable</h2><p>These systems failed because <strong>they had the entire world open to them</strong>.</p><p>They could link information they shouldn&#8217;t,</p><p>perform operations they shouldn&#8217;t, cChain tools in ways no one intended, and</p><p>act on data with no semantic constraints. That wasn&#8217;t an agent problem. It was problem solved by engineering, and that problem was a <strong>context problem</strong>.</p><p>In theory, context engineering could have prevented almost all of it (a little bit of programatic guardrails never hurt anybody, am I right?). But instead of refining what the system was allowed to see and do, we handed it everything and hoped it would figure it out.</p><p>That was never going to work.</p><div><hr></div><h2>The Prompt was not the Problem</h2><p>This is also why you don&#8217;t hear much about prompt engineering anymore.</p><p>Prompt engineering was about dumping context upfront by explaining what you want done, encoding policy directly, and then hoping the model would get it.</p><p>That falls apart the moment agents enter the picture, and what replaced this process is people now call <strong>context engineering.</strong></p><p><strong>Context engineering decides what information is introduced and when, how long it persists, and what gets dropped between steps. Both tool calls and results are context, and so is injected data.</strong></p><p><strong>BUT...I hate the term &#8220;Context Engineering.&#8221;</strong></p><p>I hate it because <strong>it sounds like a role</strong>. It isn&#8217;t. It&#8217;s a skill. You don&#8217;t hire an infrastructure engineer who doesn&#8217;t understand DevOps. Someone who can only SSH into prod and run bash scripts isn&#8217;t an SRE, they&#8217;re a sysadmin. DevOps is a skill, not a title.</p><p>Context engineering is the same thing. Every AI engineer needs this skill. And the reason I hate the term is because I don&#8217;t think we actually understand what it actually means yet.</p><div><hr></div><h2>The Real Issue: We Don&#8217;t Know How to Use Data <em>In the Moment</em></h2><p>&#8220;Oh Miriah I know how to use data, I just read it from the database!&#8221;</p><p>Wrong. Do you ever just give it to the user as-is? That is what I thought. As af developer, you use the data to present a set of information in a palatable way. <em>That</em> is context engineering.</p><p>Historically, engineers use data in two ways:</p><ol><li><p>Analytics &#8212; analyzing what already happened</p></li><li><p>State &#8212; recording what already happened</p></li></ol><p>Even machine learning training is retrospective. It&#8217;s always history layered on history. We are bad at using data <em>during execution</em>, which is why online inference never really worked the way people hoped. And that&#8217;s why I dislike how context engineering is framed today. People still think it&#8217;s about &#8220;making the prompt better.&#8221;</p><p>It isn&#8217;t.</p><p>It&#8217;s about <strong>how you introduce data &#8212; securely, reliably, and with meaning &#8212; into a live system</strong>. If I could start any company right now, it would be one that makes this easier because it&#8217;s genuinely hard.</p><div><hr></div><h2>System Prompts Are Products, Not Scratch Pads</h2><p>System prompts should not be constantly rewritten. They are the product you ship as an AI engineer. Once they are live and out of active development, their <strong>structure should change very rarely. T</strong>hey should be designed intentionally, released deliberately, and left stable. When I say &#8220;stable,&#8221; I don&#8217;t mean static though. A system prompt can absolutely be a template. You can inject values at runtime or parameterize it. You can even swap in scoped instructions. That&#8217;s fine &#8212;everything inside a system prompt should be deterministic.</p><p>But that&#8217;s the boundary. What happens <em>after</em> that boundary is probabilistic. Context engineering exists to shape those probabilities, not to redefine behavior.</p><p>You don&#8217;t make the model deterministic, you make the inputs deterministic. That&#8217;s the contract.</p><div><hr></div><h2><strong>More Instructions Don&#8217;t Fix Context &#8212; Timing Does</strong></h2><p>I see this failure mode constantly with coding agents like Claude Code.</p><p>When people want the agent to behave better, their instinct is always the same: add more. But adding more information does not solve the problem, it makes it worse. The mistake we make is putting everything into history.</p><p>The closer information is to the system prompt or the beginning of the conversation, the less likely it is to be used as the plan evolves.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ft9f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ft9f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2437871,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/190402075?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ft9f!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa5fd14-4dc9-4a70-938c-527e8f43ce6d_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><p>These models &#8212; even reasoning models &#8212; can only hold so much context at once because they are prediction systems. No matter how many instructions you provide, some of them will not be used in the next prediction, and information will be selectively ignored for the purpose of finishing it&#8217;s current task. That&#8217;s why context engineering is never about more information,. it&#8217;s about the right information, at the right time, in the right place.</p><p>With coding agents, context engineering is literally typing into the prompt window. That&#8217;s what editors and assistants are doing when they surface a file, a diff, or a symbol &#8212; they&#8217;re saying &#8220;now is the moment this information matters.&#8221;</p><p>Compaction is also a context engineering technique. Compaction trades recent conversational detail for proximity to the original instructions. You lose history, but you don&#8217;t lose context engineering because context engineering is still the user&#8217;s job.</p><p>And this is exactly what background agents and fully autonomous workflows lack: a human deciding what information matters right now. That&#8217;s why those systems have to be engineered so carefully up front.</p><div><hr></div><h2>What Context Engineering Actually Is</h2><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>Context engineering is the disciplined provision of:</p><ul><li><p>Tool calls</p></li><li><p>Tool results</p></li><li><p>Scoped supplemental data</p></li><li><p>Semantic and relationship information</p></li><li><p>Explicit task instructions</p></li></ul><p>Raw data without semantics is useless. Bigger models don&#8217;t fix that. More autonomy doesn&#8217;t fix that.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!G0xb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 424w, /__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 848w, /__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 1272w, /__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!G0xb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png" width="1198" height="1714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1714,&quot;width&quot;:1198,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:472134,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/190402075?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 424w, /__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 848w, /__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 1272w, /__u/substackcdn.com/image/fetch/$s_!G0xb!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff45201a5-d6a9-4ff9-9e35-5d63214cfbf9_1198x1714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://x.com/karpathy/status/1937902205765607626?s=20">https://x.com/karpathy/status/1937902205765607626?s=20</a></p><p>We already saw what happens when agents can do &#8220;anything.&#8221; Anything includes the things you absolutely did not want them to do. Context engineering is not about letting AI figure it out, it&#8217;s about <strong>refining its purpose</strong>.</p><div><hr></div><h2>From Magic to Software</h2><p>Once you treat context engineering as structural management, agents stop looking like fragile demos and start looking like automation.</p><p>They become predictable, scoped, and auditable.</p><p>At that point, agents aren&#8217;t magic anymore &#8212; they&#8217;re software. Stop letting AI &#8220;figure it out,&#8221; and start engineering how data with meaning enters the system.</p><div><hr></div><h2><strong>My Courses</strong></h2><p><strong><a href="https://www.oreilly.com/videos/introduction-to-go/0642572063504/">Learn Go</a></strong></p><div><hr></div><h2><strong>Stay Connected</strong></h2><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/soypetetech.substack.com/p/the-difference-between-installing?r=1vuifh">The Difference Between Installing an Agent and Building One</a><br><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/when-a-pedrocli-stops-being-a-cli">When a PedroCLI Stops Being a CLI</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/pedrocli-clawdmoltetc">PedroCLI vs Clawd / Molt / etc</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/have-you-heard-of-logits">Have You Heard of Logits?</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">Utah Data Engineering Meetup</a></strong></p><p><strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">MLOps Utah Meetup</a></strong><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all"><br></a></p><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.<br>Latest episode:<br><strong>What AI Hardware Should You Buy? Memory, Backends (CUDA/ROCm/Metal), and Scaling at Home | Ep 3</strong></p><div id="youtube2-LZ0N6q6S1WY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;LZ0N6q6S1WY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/LZ0N6q6S1WY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[The Difference Between Installing an Agent and Building One]]></title><description><![CDATA[The other day I was talking to a coworker about his homelab.]]></description><link>https://soypetetech.substack.com/p/the-difference-between-installing</link><guid isPermaLink="false">https://soypetetech.substack.com/p/the-difference-between-installing</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Tue, 03 Mar 2026 15:56:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5BTS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The other day I was talking to a coworker about his homelab.</p><p>He runs K3s at home and built a small agent that watches pod states. If something gets OOMKilled or falls into CrashLoopBackOff, it posts to Discord and restarts the pod. That&#8217;s it. Just automatic remediation.</p><p>Then I thought: that&#8217;s how agents are supposed to be built . They&#8217;re supposed to help us automate things. He has a framework for his system, a set of functions the AI can call, and he gets notified if something happens so he can intervene if necessary. This is the perfect way to take observability one step further and allow AI to take specific targeted actions to help.</p><h1><strong>The Homelab Mindset</strong></h1><p>I&#8217;ve noticed something recently. Before I started working on software professionally, people who had side projects on the cloud were the scrappy ones. They were learning more faster and that enabled their careers. Lately I&#8217;ve noticed a shift. Engineers who build homelabs are the more creative problem solvers; they just tend to think differently.</p><p>The cloud removes friction. It abstracts the hardware, the network, the blast radius. When something breaks in the cloud, it feels distant. When something breaks on your own system you are the ONLY one who can fix it. That changes how you design.</p><p>You are forced to think about failure before capability, containment before expansion, and recovery before autonomy.That mindset matters more in the age of AI than most people realize.</p><h2><strong>Hardware Is Back. That&#8217;s Good.</strong></h2><p>There has been an interesting resurgence in hardware lately, especially for Macs.</p><p>As OpenClaw and similar tools have taken off, I&#8217;ve noticed more and more people on Tech Twitter and other platforms buying machines specifically &#8220;for AI,&#8221; which part is exciting. Running things locally changes how you think.</p><p>If OpenClaw is what gets someone to buy a machine and start experimenting at home, that&#8217;s a net positive.</p><p>But we should be honest about something--running OpenClaw at home is not the same thing as home labbing.</p><p>Home labbing is about more than where the compute runs, it&#8217;s ultimately about ownership of the system. You need to understand the failure modes, and build something that&#8217;s tailored specifically to your use case. You need to be able to ask &#8220;what happens if I break this?&#8221; and then breaking it to answer your question.</p><p>OpenClaw &#8212; even when self-hosted &#8212; is still primarily a convenience layer. It is an installed autonomy. You are consuming a system someone else designed, not designing the boundaries yourself. That&#8217;s not inherently bad,.but it is fundamentally different.</p><p>The stereotypical movement I see around OpenClaw is not &#8220;I want to engineer a workflow.&#8221;</p><p>Rather, it&#8217;s &#8220;I don&#8217;t want to build an agent, so I&#8217;ll install one.&#8221;That mindset is the opposite of what home labbing teaches. Home labbing teaches us to build our own control instead of outsourcing it, and that distinction matters.</p><h1><strong>&#8220;What&#8217;s So Special About OpenClaw?&#8221;</strong></h1><p>So let&#8217;s address the elephant in the room. I have talked about it on my podcast and in several other blog posts because I live in an echo chamber where people all of the sudden quit talking about agents and started installing OpenClaw.</p><p>OpenClaw is not a magical agent harness. It&#8217;s just special because it&#8217;s convenient. The plugin ecosystem. The immediate feeling of autonomy without building the scaffolding yourself. It&#8217;sThat is powerful for non-technical users, .</p><p>but if you are a software engineer, convenience should not be the bar your reaching for.</p><p>Around the same time I was posting about this, <a href="https://www.linkedin.com/posts/matthewsharp_i-use-to-do-nothing-but-post-about-clean-activity-7432832983339999232-iR04?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAAy1RTIBuQGAIY8e-RpSNDwwNvcEwxo6GdY">Matt Sharp wrote </a>about security &#8212; not because he wants to be &#8220;Mr. Security,&#8221; but because we are ignoring it in places we shouldn&#8217;t.</p><p>AI is one of those places.</p><p>That should make us uncomfortable.:</p><blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!52tz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 424w, /__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 848w, /__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 1272w, /__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!52tz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png" width="572" height="496" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a97957b3-57b0-4273-b9d1-747caf100549_572x496.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:496,&quot;width&quot;:572,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114848,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/189777095?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 424w, /__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 848w, /__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 1272w, /__u/substackcdn.com/image/fetch/$s_!52tz!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97957b3-57b0-4273-b9d1-747caf100549_572x496.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div></blockquote><p></p><p>The most downloaded skilled on the OpenClaw marketplace turned out to be malware. It stole SSH keys, crypto wallets, browser cookies, and opened a reverse shell to an attacker&#8217;s server. And yet most of the conversation is still about what these agents can do &#8212; not what they can access, not how they can fail, and not how they can be exploited.</p><p>We are moving fast on capability and slow on security.</p><h1><strong>DeepAgent, LangGraph, and Control</strong></h1><p>If you compare something like LangChain&#8217;s DeepAgent or LangGraph to OpenClaw, the difference is not intelligence, it&#8217;s control.</p><p>DeepAgent and LangGraph force you to define state transitions, tool boundaries, and execution graphs explicitly. You encode what is allowed to happen and when, shaping the workflow itself.</p><p>OpenClaw feels different because you give it tools. You describe what you want and then trust the model to navigate correctly. The problem becomes that when most people use OpenClaw, they stop thinking about consequences.</p><h1>Failure Modes</h1><p>In reliability engineering, we assume failure and optimize for quick and seamless remediation. In security, we assume breaches and optimize for quick detection and countermeasures.</p><p>With AI agents, we assume success.</p><p>That is the flaw.</p><p>Right now I see too much implicit trust in AI and I rarely hear people ask what happens when the prompt is compromised. We hardly ever ask what happens when a tool call fails. We rarely ask what happens when the model confidently does spends my money for deletes files.</p><p>We assume it will recover because it &#8220;learns,&#8221; but models do not learn.</p><p>After training is completed, they only do probabilistic predictions. More instructions are not guardrails. It is just more tokens.</p><p>That is not remediation, it&#8217;s just a loop.</p><h1><strong>Security Is Remediation</strong></h1><p>Most real security work is remediation. You will have incidents. You will have edge cases. You will have abuse. The question is how you detect it, contain it, and recover.</p><p>Why are we treating AI systems as if they are exempt from that mindset?</p><p>If you install an agent internally and give it broad tool access, how are you thinking about blast radius? What is the rollback path? Who intervenes when it fails silently?</p><p>These are engineering questions.</p><p>Agents don&#8217;t eliminate failure. They eliminate busy work.</p><h1><strong>The Only Question That Matters</strong></h1><p>If you are deploying agents internally &#8212; whether it is OpenClaw, DeepAgent, LangGraph, or something you built yourself &#8212; there is one question that matters more than any other:</p><p>When it fails, what happens next?</p><p>That is the difference between engineering and hype.</p><div class="paywall-jump" data-component-name="PaywallToDOM"></div><h1><strong>What I Would Do Instead</strong></h1><p>Let&#8217;s dig in to this question.</p><p>If I were deploying agents inside a company tomorrow, I would not start with autonomy. I would start with boundaries.</p><p>The first thing I would define is scope. One workflow. One responsibility. One clearly defined success condition. Not &#8220;moderate Slack&#8221; or &#8220;manage Kubernetes.&#8221; It needs to be something narrow, observable, and reversible.</p><p>Then I would hard-code the state transitions.</p><p>The agent would not be free to decide what happens next. It would move through predefined stages:</p><p>Input &#8594; validate &#8594; call tool &#8594; validate output &#8594; log &#8594; exit</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5BTS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5BTS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2281448,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/189777095?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!5BTS!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62cdd982-f8aa-4745-9968-fb3989baef6b_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT...</figcaption></figure></div><p>Every transition explicit, and every tool call wrapped in verification.</p><p>The model would generate suggestions, then the system would enforce decisions.</p><p>I would validate tool parameters before execution. I would validate outputs after execution. I would reject malformed responses. I would log everything. I would set blast radius limits at the infrastructure level, not the prompt level.</p><p>If the agent fails, it does not retry forever.</p><p>It escalates. If it escalates too often, it gets disabled.</p><p>That is remediation.</p><p>The model is not in charge of safety, the surrounding system is.</p><p>This is also why I self-host as much as I do. Not because I distrust enterprise providers, but because I understand they are not just exposing &#8220;raw models.&#8221; They are layering guardrails, fine-tuning adapters, evaluation harnesses, and enforcement mechanisms behind the scenes to meet customer expectations. They are engineering boundary conditions.</p><p>If you want production-grade behavior, you have to do the same.</p><p>In my own agents, I hard-code checks before and after model calls. I constrain which tools are callable, restrict parameter shapes, and I require structured outputs. I treat the model like an untrusted component inside a trusted system, because it is.</p><p>Prompts are guidance and code is enforcement.</p><p>Hard-coded guardrails are boring, but they&#8217;re the only thing I trust.</p><p>The companies that win with AI will not be the ones that install the most autonomy.</p><p>They will be the ones that engineer the cleanest failure paths.</p><p>Assume failure.</p><div><hr></div><h2><strong>Stay Connected</strong></h2><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://soypetetech.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/soypetetech.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2><strong>Newsletter Highlights</strong></h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/part-3-agents-are-not-interns?utm_campaign=post-expanded-share&amp;utm_medium=post%20viewer">Agents Are Not Interns</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/when-a-pedrocli-stops-being-a-cli">When a PedroCLI Stops Being a CLI</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/pedrocli-clawdmoltetc">PedroCLI vs Clawd / Molt / etc</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/have-you-heard-of-logits">Have You Heard of Logits?</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/building-production-grade-ai-in-go">Building Production-Grade AI in Go</a></p><p></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><p>I&#8217;m also active in the Utah tech community. If you&#8217;re local, come build with us. Otherwise catch us on Twitch</p><p><strong>Utah Data Engineering Meetup</strong><br><a href="https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting">https://www.meetup.com/utah-data-engineering-meetup/events/311227000/?eventOrigin=home_next_event_you_are_hosting</a></p><p><strong>MLOps Utah Meetup</strong><br><a href="https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all">https://www.meetup.com/machine-learning-utah/events/312474910/?eventOrigin=home_page_upcoming_events$all</a></p><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><p>Deep dives on AI infrastructure, home labs, and production engineering.<br>Latest episode:<br><strong>What AI Hardware Should You Buy? Memory, Backends (CUDA/ROCm/Metal), and Scaling at Home | Ep 3</strong><br></p><div id="youtube2-LZ0N6q6S1WY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;LZ0N6q6S1WY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/LZ0N6q6S1WY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Then build.</p>]]></content:encoded></item><item><title><![CDATA[Hardware-First Home AI: Chips, Memory, Backends, and What to Buy]]></title><description><![CDATA[Episode 3 is a hardware-first guide to running AI at home.]]></description><link>https://soypetetech.substack.com/p/hardware-first-home-ai-chips-memory-d6c</link><guid isPermaLink="false">https://soypetetech.substack.com/p/hardware-first-home-ai-chips-memory-d6c</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Fri, 27 Feb 2026 16:00:00 GMT</pubDate><enclosure url="https://d3t3ozftmdmh3i.cloudfront.net/staging/podcast_uploaded_nologo/45246613/45246613-1769569788969-9b27fcbd9e14.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Episode 3 is a hardware-first guide to running AI at home. We break down what CPUs vs GPUs vs NPUs vs TPUs actually do in the inference pipeline, why memory capacity isn&#8217;t the same as performance (model loading, KV cache, and MoE), why backends/runtimes are real constraints (CUDA vs ROCm vs Metal/MLX vs CPU), and how to scale from one box to multi-GPU a&#8230;</p>
      <p>
          <a href="/__u/soypetetech.substack.com/p/hardware-first-home-ai-chips-memory-d6c">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Part 3: Agents Are Not Interns]]></title><description><![CDATA[Why Workflows Matter More Than Autonomy]]></description><link>https://soypetetech.substack.com/p/part-3-agents-are-not-interns</link><guid isPermaLink="false">https://soypetetech.substack.com/p/part-3-agents-are-not-interns</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Tue, 17 Feb 2026 04:54:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eUFc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Before we talk about guardrails, malicious tools, or failed agent demos, we need to reframe the conversation around agents entirely. In Part 1 we talked about who I wanted to be a background job runner (agent), and in Part 2 we talked about how the CLI needed to be more &#8220;agentic&#8221; for my use case. But we should probably discuss what is an agent anyway?</p><p>Because right now, &#8220;agent&#8221; has become shorthand for <em>anything that feels autonomous</em>. And that confusion is actively making systems less safe, less predictable, and harder to reason about.</p><p>An agent is not a human replacement, or an intern, or a decision maker.</p><p><strong>An agent is a probabilistic system that proposes actions in pursuit of a goal.</strong></p><p>That distinction isn&#8217;t philosophical, it&#8217;s architectural; and ignoring that distinction it is how we end up with tools that <em>confidently</em> do the wrong thing at scale.</p><div><hr></div><h2>What People Usually Mean When They Say &#8220;Agent&#8221;</h2><p>When most people talk about agents today, they&#8217;re really talking about <strong>self-iterating agents</strong>.</p><p>This is the pattern popularized by tools like Claude Code and similar interactive systems systems:</p><p>The agent analyzes a task, decides what to do next, calls a tool, observes the result, and repeats forever and ever until it decides it&#8217;s done. After it decides it&#8217;s done, it asks you if you are ready to move on with its course of action. This feels incredible as a user becauseyou&#8217;re present: You can interrupt, redirect, or notice drift before it becomes dangerous. The agent feels like a collaborator rather than a liability.</p><p>PedroCLI now supports two execution modes using the underlying processes but with radically different rules:</p><p><strong>1. Interactive Mode (PedroCode)</strong> is where self-iteration belongs. This includes open-ended reasoning, human oversight, exploration, drafting , and refactoring.</p><p><strong>2. Background Mode (PedroCLI)</strong> is where the AI drives using phased workflows, strict tool contracts, system-owned state, and artifact-based completion.</p><p>I added the interactive mode as the baseline to make sure my personal agent Pedro worked well, so I had to add a user-driven interface to help me build background jobs better (it was a mid-development pivot. Why not build OpenCode[link] in Go?).</p><p>This was great for interacting with code, prompt development, tool call iteration, and model testing. So next let&#8217;s chat about long-running workflows</p><div><hr></div><h2>Why Autonomy Becomes Dangerous the Moment You Look Away</h2><p>Remember PedroCLI was originally a tool for background execution, like long-running jobs and unattended workflows. So let&#8217;s talk about unattended jobs.</p><p>At this point, the agent is no longer assisted, it&#8217;s unsupervised. And unsupervised agents don&#8217;t understand risk, they understand <strong>completion</strong>. It&#8217;s important to remember that at the end of they day, agents are people pleasers. If they have permissions to do something, they will do it for the purpose of getting the job done, no holds barred. .</p><p>If installing a sketchy plugin the agent will use it simply because it&#8217;s obedient. Language models are trained to please, and they fill gaps confidently. They will proceed unless explicitly stopped, and as a consequence you may loose some personal information to the internet.</p><p>This is why open agent registries filled with unvetted &#8220;skills&#8221; are not just unsafe&#8212;they&#8217;re dangerous by construction. They combine open-ended reasoning, broad permissions, and no enforceable boundaries. If you&#8217;re not careful, it&#8217;s an accident waiting to happen.</p><div><hr></div><h2>The Intern Fallacy</h2><p>There&#8217;s a popular narrative that agents are like interns.You give them tasks and the let them figure it out. But this framing is catastrophically incorrect.</p><p>Interns have judgment. They understand consequences, they hesitate, and the good ones will ask if they&#8217;re unsure of something. Agents do not.</p><p>You can count on agents to fabricate certainty, and then proceed confidently. They will optimize for making you feel like progress is happening even when nothing real has occurred.</p><p>If you&#8217;re looking for one agent to optimize away your stress, what you&#8217;re actually asking for is an intern with no judgment and unlimited permissions, and that should terrify you.</p><div><hr></div><h2>Workflows, Not Autonomy</h2><p>So what is the solution to the unfettered access of agents? SCOPE! This is where workflows matter.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eUFc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_webp, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eUFc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2169706,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://soypetetech.substack.com/i/188221667?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_424, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 424w, /__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_848, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 848w, /__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_1272, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eUFc!, /__u/soypetetech.substack.com/w_1456, /__u/soypetetech.substack.com/c_limit, /__u/soypetetech.substack.com/f_auto, /__u/soypetetech.substack.com/q_auto:good, /__u/soypetetech.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2fe1d338-1bda-437b-a355-d772c86e6005_1536x1024.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generated by ChatGPT</figcaption></figure></div><p>A workflow is task-oriented. It answers questions an agent should never decide for itself:</p><p>What is the task? What steps exist? Which tools are allowed <em>right now</em>? What does success look like? What is explicitly forbidden?</p><p>Workflows don&#8217;t weaken agents, it&#8217;s actually the reverse. They make them <em>true</em> automation.</p><p>When you combine agents with workflows&#8212;bounded context, scoped permissions, explicit completion conditions&#8212;you get something powerful <em>and</em> controllable.</p><div><hr></div><h2>How PedroCLI Separates Autonomy from Trust</h2><p>How do we scope PedroCLI? With our tool call registration. Each step in the workflow has a set of tool calls assigned to it. For example, in both the background coding and background blogpost engines we have research steps. Both of these areas involve searching my local files system, so it has a file search tool call to list the files. Then, it has a <a href="https://www.w3schools.com/bash/bash_grep.php">bash grep</a> ability to read file&#8217;s contents. It cannot write or edit files until later and it does not have permissions to edit anything outside the file system, so there&#8217;s no posting local information to the internet.</p><p>In a later posting step, I write blog posts to my Notion space. During this tool call it cannot search the file system, it can only read the file passed to the context (aka the blog draft) and any context passed across workflow steps. Because of this I have strictly limited the information it can carry, which greatly reduces the chance that it does something malicious.</p><p>This is what I mean by scope: each step only really does <em>one</em> thing, and it only has the permissions needed to do that thing. Workflows are a series of agents, but the agent&#8217;s permissions follow the principle of <a href="https://csrc.nist.gov/glossary/term/least_privilege">least privilege</a>. When you deploy an agent this should be mirrored in the tool calls registered and any potential service account/role given in your permissioning system. You just have to limit what they can do as a best practice.</p><div><hr></div><h2>Tools Are APIs, Not Suggestions</h2><p>One of the hardest lessons I learned is that tool calling is not a prompting problem. It&#8217;s an API design problem.</p><pre><code><code>tool := ToolDefinition{
    Name:        "write_file",
    Description: "Write content to a file on disk",
    Schema: JSONSchema{
        Type: "object",
        Required: []string{"path", "content"},
        Properties: map[string]Property{
            "path": { Type: "string" },
            "content": { Type: "string" },
        },
    },
}</code></code></pre><p>Tools are registered with the LLM the with the intended use case; <em>Here&#8217;s what this does&#8212;use it when needed.</em> They should self-documenting in natural language with the contract of what will be done, and that is not how we should be treating them when we implement their backing functions. If we leave ambiguity in the descriptions or the functions the LLM will take liberties to fill in the missing information. Remember, agents guess. They omit fields and invent parameters. Unless you stop them, they keep going as if nothing went wrong. I had a time when I registered a tool call name as &#8220;list_directory&#8221; but because that doesn;t make semantic sense,the 32b parameter model kept trying to invoke &#8220;list_directories&#8221;.</p><p>How can I get the agent to do better? First, pick a more semantically meaning full name, and second, since I am self hosting, use <a href="/__u/soypetetech.substack.com/p/have-you-heard-of-logits?r=1vuifh">logits and grammars.</a> This lets tools become more predictable interfaces.</p><p>Once tools became strict interfaces instead of suggestions, reliability jumped immediately&#8212;not because the agent got smarter, but because ambiguity disappeared.</p><div><hr></div><h2>Why This Is Still a Work in Progress</h2><div class="paywall-jump" data-component-name="PaywallToDOM"></div><p>Defining guardrails is hard. Permissions are hard, and deciding what an agent <strong>cannot</strong> do is harder than deciding what it can do. But I would rather do this work explicitly than outsource control to optimism.</p><p>Because control isn&#8217;t about power&#8212;it&#8217;s about responsibility.</p><p>If an agent is going to act on my behalf, I care way more about what it is forbidden from doing than how clever it sounds while doing it.</p><div><hr></div><h2>The Real Takeaway</h2><p>Agents have enormous potential, but anything with unlimited potential also has unlimited risk.</p><p>So don&#8217;t start by asking: <em>What agent should I use?</em> Start by asking:</p><ul><li><p>What task am I solving?</p></li><li><p>What happens if this fails?</p></li><li><p>Who is accountable?</p></li><li><p>Should this even be an agent?</p></li></ul><p>Sometimes the answer is a script. Sometimes it&#8217;s a workflow. Sometimes it&#8217;s traditional automation. But sometimes&#8212;carefully&#8212;it&#8217;s an agent.</p><p>PedroCLI is my attempt to make that distinction explicit .</p><p>because they&#8217;re powerful enough to deserve structure.</p><div><hr></div><h2>Stay Connected</h2><p>Want to stay updated on what I&#8217;m working on? Here&#8217;s where you can find me:</p><ul><li><p><a href="https://www.youtube.com/@SoyPete_Tech">YouTube</a></p></li><li><p><a href="https://www.youtube.com/@DomesticatingAI">Domesticating AI Podcast</a></p></li><li><p><a href="https://x.com/captainnobody1">Twitter / X</a></p></li><li><p><a href="https://bsky.app/profile/soypetetech.bsky.social">Bluesky</a></p></li><li><p><a href="https://www.linkedin.com/in/miriah-peterson-35649b5b/">LinkedIn</a></p></li><li><p><a href="/__u/soypetetech.substack.com/">Newsletter</a></p></li><li><p><a href="https://twitch.tv/soypeteTech">Twitch</a></p></li><li><p><a href="https://www.github.com/Soypete">GitHub</a></p></li><li><p><a href="https://discord.gg/ExTAH54KCE">Discord</a></p></li><li><p><a href="https://linktr.ee/soypete_tech">LinkTree</a></p></li></ul><div><hr></div><h2>Newsletter Highlights</h2><p><strong>Recent Posts You Might Have Missed</strong></p><ul><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/when-a-pedrocli-stops-being-a-cli">When a PedroCLI Stops Being a CLI</a></p></li><li><p><a href="/__u/open.substack.com/pub/soypetetech/p/pedrocli-clawdmoltetc">PedroCLI vs Clawd / Molt / etc</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/have-you-heard-of-logits">Have You Heard of Logits?</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/building-production-grade-ai-in-go">Building Production-Grade AI in Go</a></p></li><li><p><a href="/__u/soypetetech.substack.com/p/beyond-hello-world">Beyond Hello World: net/http in Production</a></p></li></ul><h2><strong>Upcoming Events or Streams</strong></h2><ul><li><p><strong><a href="https://www.meetup.com/utah-data-engineering-meetup/events/312474448/?eventOrigin=group_upcoming_events&amp;utm_medium=referral&amp;utm_campaign=event_card_savedevents_share_modal&amp;utm_source=link&amp;utm_version=v2&amp;member_id=249622824">Utah Data Engineering Meetup</a></strong></p></li><li><p><a href="https://www.meetup.com/machine-learning-utah/events/311226939/?eventOrigin=home_next_event_you_are_hosting">MLOPS Utah Meetup</a></p></li></ul><div><hr></div><h2><strong>Latest Podcast Episode</strong></h2><blockquote><p><a href="https://www.youtube.com/@DomesticatingAI">DomesticatingAI - NVIDIA DGX Spark: From &#8220;Inference Box&#8221; to Dev Rig (What It Actually Is) </a></p></blockquote>]]></content:encoded></item><item><title><![CDATA[From “Inference Box” to Dev Rig: What NVIDIA DGX Spark Actually Is | Ep 2]]></title><description><![CDATA[Everyone keeps calling NVIDIA DGX Spark an &#8220;inference box&#8221;&#8230; but in practice it behaves more like a dev rig.]]></description><link>https://soypetetech.substack.com/p/from-inference-box-to-dev-rig-what-7bf</link><guid isPermaLink="false">https://soypetetech.substack.com/p/from-inference-box-to-dev-rig-what-7bf</guid><dc:creator><![CDATA[SoyPete Tech]]></dc:creator><pubDate>Fri, 13 Feb 2026 16:00:00 GMT</pubDate><enclosure url="https://d3t3ozftmdmh3i.cloudfront.net/staging/podcast_uploaded_nologo/45246613/45246613-1769569788969-9b27fcbd9e14.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Everyone keeps calling <strong>NVIDIA DGX Spark</strong> an &#8220;inference box&#8221;&#8230; but in practice it behaves more like a <strong>dev rig</strong>.</p><p>In Ep 2 of <strong>Domesticating AI</strong>, we break down what Spark is <em>actually</em> good for (AI development + fine-tuning) vs what it isn&#8217;t (a magical drop-in inference server). We also dig into why <strong>unified memory</strong> changes the local-AI experience, the &#8220;gateway stack&#8230;</p>
      <p>
          <a href="/__u/soypetetech.substack.com/p/from-inference-box-to-dev-rig-what-7bf">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>