<?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[Inference Notes]]></title><description><![CDATA[Notes on building AI agents, pricing AI products, and the quiet decisions that actually matter — from someone who runs this stack in production.]]></description><link>https://inferencenotes.co</link><image><url>https://inferencenotes.co/img/substack.png</url><title>Inference Notes</title><link>https://inferencenotes.co</link></image><generator>Substack</generator><lastBuildDate>Tue, 15 Sep 2026 05:38:13 GMT</lastBuildDate><atom:link href="https://inferencenotes.co/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Sathish J]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[inferencenotes@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[inferencenotes@substack.com]]></itunes:email><itunes:name><![CDATA[Sathish J]]></itunes:name></itunes:owner><itunes:author><![CDATA[Sathish J]]></itunes:author><googleplay:owner><![CDATA[inferencenotes@substack.com]]></googleplay:owner><googleplay:email><![CDATA[inferencenotes@substack.com]]></googleplay:email><googleplay:author><![CDATA[Sathish J]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[What is your agent's instruction budget?]]></title><description><![CDATA[Ten runtimes, ten different ceilings, no shared unit &#8212; and most of them fail silently.]]></description><link>https://inferencenotes.co/p/what-is-your-agents-instruction-budget</link><guid isPermaLink="false">https://inferencenotes.co/p/what-is-your-agents-instruction-budget</guid><dc:creator><![CDATA[Sathish J]]></dc:creator><pubDate>Sat, 01 Aug 2026 01:28:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bcFU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p style="text-align: justify;"><span>A while back I wrote about </span><a href="https://inferencenotes.co/p/three-things-that-surprised-me-running"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">the small agent I run on a server in my house</span></a><span> &#8212; it reads my accounts, files my documents, and drafts the twice-daily briefing that lands on my phone. This is the story of the day &#8212; it quietly broke.</span></p><p style="text-align: justify;"><span>The rules file that agent loads at the start of every session had grown past the runtime&#8217;s injection ceiling. It injected what fit and dropped the rest &#8212; and what got dropped was the rule I&#8217;d appended most recently, because appending to the end is how a governing file grows.</span></p><p style="text-align: justify;"><span>Nothing failed. No warning, no error, no change in the agent&#8217;s confidence. It simply operated for weeks under a rule set it had never fully received, and one morning it handed me a financial briefing with account balances it had never fetched &#8212; fabricated numbers &#8212; surprise, surprise! It&#8217;s hallucination! Your agent runtime ships you a component with an unknown (may be undocumented as well) tolerance.</span></p><p style="text-align: justify;"><span>The runtime doesn&#8217;t matter, and I&#8217;m not going to make this about one vendor &#8212; by the end of this you&#8217;ll see there are at least ten.</span></p><h2><span>The vendors know</span></h2><p style="text-align: justify;"><span>OpenAI&#8217;s Codex caps the AGENTS.md it injects at 32,768 bytes. That number isn&#8217;t a community discovery &#8212; it&#8217;s DEFAULT_PROJECT_DOC_MAX_BYTES in </span><a href="https://github.com/openai/codex/blob/main/codex-rs/config/src/config_toml.rs"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">codex-rs/config/src/config_toml.rs</span></a><span>, and the comment beside the loader describes the behavior in the vendor&#8217;s own words: </span><em><span>&#8220;Larger files are silently truncated to this size so we do not take up too much of the context window.&#8221;</span></em></p><p style="text-align: justify;"><span>The bug report asking for a startup warning &#8212; </span><a href="https://github.com/openai/codex/issues/7138"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">openai/codex#7138</span></a><span>, titled &#8220;AGENTS.md is silently truncated without any warning within the TUI&#8221; &#8212; was closed not planned in March 2026. The stated reason: </span><em><span>&#8220;This feature request hasn&#8217;t received any upvotes in three months, so I&#8217;m going to close.&#8221;</span></em><span> It was filed as an enhancement, not a bug. Someone refiled it the next day; </span><a href="https://github.com/openai/codex/issues/13386"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">#13386</span></a><span> is still open. A user commented there in July that he&#8217;d </span><em><span>&#8220;only accidentally discovered today that my 40KB AGENTS.md was being truncated to 32KB and silently omitting 20% of my instructions.&#8221;</span></em></p><p style="text-align: justify;"><span>That&#8217;s the shape of it. The number is sometimes published. The behavior almost never is.</span></p><h2 style="text-align: justify;"><span>Nobody agrees on the ceiling &#8212; or the units</span></h2><p style="text-align: justify;">The good guides to <code>AGENTS.md</code> cover the four major coding agents and tell you the size limits. What none of them cover is what happens when you cross one &#8212; which is the only part that decides whether your rules are in the model&#8217;s context. Here is what the sources actually say:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bcFU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bcFU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png 424w, https://substackcdn.com/image/fetch/$s_!bcFU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png 848w, https://substackcdn.com/image/fetch/$s_!bcFU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png 1272w, https://substackcdn.com/image/fetch/$s_!bcFU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bcFU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.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;:131380,&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://inferencenotes.co/i/209142370?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bcFU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png 424w, https://substackcdn.com/image/fetch/$s_!bcFU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png 848w, https://substackcdn.com/image/fetch/$s_!bcFU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.png 1272w, https://substackcdn.com/image/fetch/$s_!bcFU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aad3609-ba3b-4855-8f61-67597f2d52a1_1845x1230.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>Sources: <a href="https://code.claude.com/docs/en/memory">Claude Code</a>; <a href="https://github.com/openclaw/openclaw/issues/19826">OpenClaw</a>; <a href="https://github.com/NousResearch/hermes-agent/issues/46823">Nous Hermes</a>; <a href="https://github.com/moltis-org/moltis/issues/593">Moltis</a></p><p>Two things about this table are worse than any individual row.</p><p style="text-align: justify;"><strong><span>The units aren&#8217;t comparable.</span></strong><span> Codex counts bytes. OpenClaw, Hermes and moltis count characters. Anthropic counts lines-or-kilobytes, whichever comes first. That divergence isn&#8217;t theoretical: Hermes&#8217; own shipped AGENTS.md measures 75,142 bytes but 74,506 characters. Six hundred and thirty-six units of difference, in one file, on the number that decides what survives. I&#8217;ve found no test of how any of these implementations actually counts.</span></p><p style="text-align: justify;"><strong><span>The config keys don&#8217;t even share a name</span></strong><span> &#8212; project_doc_max_bytes, bootstrapMaxChars, context_file_max_chars. There is no convention here to be non-compliant with.</span></p><p style="text-align: justify;"><span>And if you want a sense of how well the ecosystem tracks its own constraint, I measured the reference implementations. OpenClaw&#8217;s own shipped AGENTS.md is 56,458 bytes against its own 20,000-character cap &#8212; roughly 2.8&#215; over. Hermes&#8217; is 75,142 bytes; the issue documenting that 74% of it never reaches the model was closed not planned and labeled cosmetic. (Both measured 20 July 2026 &#8212; OpenClaw at e2e394e1, Hermes at 0144743b. They move.) The reference implementations exceed their own limits.</span></p><h2><span>Rule drift</span></h2><p style="text-align: justify;"><span>The closest named thing I&#8217;ve found is </span><em><span>governance decay</span></em><span> &#8212; safety constraints silently removed by context compaction (</span><a href="https://arxiv.org/abs/2606.22528"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">arXiv:2606.22528</span></a><span>). This is a different mechanism with the same signature, and mine happens before the session even starts.</span></p><p style="text-align: justify;"><span>A governing instruction file grows by accretion, and it accretes at the bottom. You append a rule because something went wrong. You append another because a customer asked. Each edit is individually correct and individually small. Meanwhile the ceiling stays fixed and &#8212; in harnesses (the software that runs the agent, the runtime by another name) that truncate silently from the tail, which is not all of them, as the table shows &#8212; truncation eats from the end. The file degrades through ordinary, competent maintenance, and no single commit ever looks like the mistake.</span></p><p style="text-align: justify;"><span>This isn&#8217;t hypothetical. A survey of AGENTS.md files across 100 popular repositories (</span><a href="https://arxiv.org/abs/2606.15828"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">arXiv:2606.15828</span></a><span>) found measurable context bloat in </span><strong><span>42%</span></strong><span> of them, and &#8220;skill leakage&#8221; &#8212; execution detail sitting in the always-loaded file &#8212; in </span><strong><span>35%</span></strong><span>.</span></p><p style="text-align: justify;"><span>The rules that die are the newest ones. Which is to say: </span><strong><span>the rules you added because something already went wrong once.</span></strong></p><p style="text-align: justify;"><span>The fix isn&#8217;t shortening the file. It&#8217;s deciding which prefix survives amputation &#8212; smaller, blunter, ordered by consequence, with the non-negotiables at the top not because top is more persuasive but because top is what remains. (Order does demonstrably affect adherence &#8212; Zeng et al., ACL 2025, </span><a href="https://arxiv.org/abs/2502.17204"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">arXiv:2502.17204</span></a><span> &#8212; though that paper finds hard-to-easy ordering wins, which is not the same as importance ordering. The optimal arrangement is still open.)</span></p><p style="text-align: justify;"><span>One thing that doesn&#8217;t help: splitting the file up. Anthropic&#8217;s docs are explicit that imports </span><em><span>&#8220;help organization but don&#8217;t reduce context, since imported files load at launch.&#8221;</span></em></p><p style="text-align: justify;"><span>And the reason placement matters at all: </span><strong><span>a behavior placed in the wrong layer silently never happens.</span></strong><span> Put &#8220;always fetch before answering&#8221; in a skill body &#8212; which loads only after that skill is chosen &#8212; and it cannot help you. The agent decided to fabricate before it ever opened that file.</span></p><h2><span>What the always-on layer costs</span></h2><p style="text-align: justify;"><span>This is where it gets commercially interesting, and where I think the discussion is thin.</span></p><p style="text-align: justify;"><span>A rule that must hold on every turn is a </span><strong><span>fixed per-turn prefill tax</span></strong><span>. Twelve thousand characters is roughly three thousand tokens. At $5 per million input tokens (roughly a frontier model&#8217;s rate) &#8212; that&#8217;s about 1.5 cents a turn uncached, about 0.15 cents cached.</span></p><p style="text-align: justify;"><strong><span>That tiny number is the problem.</span></strong><span> I&#8217;ve </span><a href="https://inferencenotes.co/p/the-cheapest-line-item-in-my-ai-app"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">argued before that inference is usually the cheapest line item in an AI product</span></a><span> &#8212; and here that cheapness turns dangerous: a bloated instruction file shows up as degraded adherence and silent rule loss long before it ever shows up on an invoice. There is no cost signal to catch this.</span></p><p style="text-align: justify;"><span>Two research groups have now measured what the file actually buys, and they don&#8217;t agree.</span></p><p style="text-align: justify;"><span>A team from Singapore Management University, Heidelberg, Bamberg and King&#8217;s College London (</span><a href="https://arxiv.org/abs/2601.20404"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">arXiv:2601.20404</span></a><span>, ICSE JAWs 2026) ran Codex across ten repositories and 124 merged pull requests, twice each &#8212; with the repo&#8217;s AGENTS.md and without. Median wall-clock time fell </span><strong><span>28.6%</span></strong><span> and median </span><em><span>output</span></em><span> tokens fell </span><strong><span>16.6%</span></strong><span>, both statistically significant. Median </span><em><span>total</span></em><span> tokens went slightly </span><strong><span>up</span></strong><span>, about 1.3%, and that result wasn&#8217;t significant. So the file bought speed and cheaper generation, not less context. The authors </span><em><span>speculate</span></em><span> the gain comes from less exploratory navigation; they flag testing that as future work, and they did not measure task success at all. Caveats worth stating: PRs under 100 lines and five files, one harness, one model.</span></p><p style="text-align: justify;"><span>An independent team at ETH Zurich and LogicStar (</span><a href="https://arxiv.org/abs/2602.11988"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">arXiv:2602.11988</span></a><span>) measured something close to the opposite. Across SWE-bench and a purpose-built benchmark, </span><strong><span>every</span></strong><span> kind of context file raised cost and step count &#8212; machine-generated ones by up to </span><strong><span>23%</span></strong><span>, human-written ones by up to </span><strong><span>19%</span></strong><span>. Success moved &#8722;2% for generated files and </span><strong><span>+2.4%</span></strong><span> for developer-written ones, and </span><em><span>neither</span></em><span> result was statistically significant. Their mechanism is the part worth keeping: cost rises because agents actually </span><strong><span>follow</span></strong><span> the instructions &#8212; more testing, wider exploration &#8212; not because the file is padding. What they found genuinely useless was repository </span><em><span>overviews</span></em><span>, which the agent can read for itself.</span></p><p style="text-align: justify;"><span>These two results point in different directions, and I&#8217;d rather say that than average them. One measures wall-clock and tokens on paired reruns of real merged PRs; the other measures dollars and agent steps on benchmarks. What survives both is narrower and more useful than either headline: </span><strong><span>instruction context is not free and it is not linear.</span></strong><span> It buys you less exploration, and it buys you more obedience &#8212; and obedience costs money too. What it does not reliably buy is a higher success rate. Past the ceiling, it also costs you the lines underneath.</span></p><p style="text-align: justify;"><span>One correction to the obvious conclusion: a file written </span><em><span>blind</span></em><span> is the failure mode, not machines writing files. Shepard and Albrecht (</span><a href="https://arxiv.org/abs/2606.20512"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">arXiv:2606.20512</span></a><span>) got 33% resolution against 25.5% unguided by probing the agent and iterating the guidance against what actually failed. Generated-then-never-tested is the bad case.</span></p><p style="text-align: justify;"><span>The instruction file is also a </span><strong><span>cache key</span></strong><span>. Caching is exact-prefix; edit the file mid-session and you re-price everything downstream. Practitioners are already engineering around it &#8212; </span><a href="https://github.com/anthropics/claude-code/issues/77355"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">claude-code#77355</span></a><span>, opened 14 July 2026 and still open, is someone maintaining a CLAUDE.staging.md and copying it in at session start </span><em><span>&#8220;specifically to avoid busting the cache mid-session.&#8221;</span></em><span> Google prices the same resource on a third axis: Gemini bills cached context </span><strong><span>by the hour</span></strong><span> &#8212; $1.00 per million tokens per hour of storage on 3.5 Flash, on top of a cached-input rate of $0.15 against $1.50 standard (</span><a href="https://ai.google.dev/gemini-api/docs/pricing"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">pricing</span></a><span>, read 20 July 2026). You pay rent on an always-loaded block whether or not anything reads it.</span></p><p style="text-align: justify;"><span>So one resource now has three incompatible meters: per-token consumption, per-hour rent, and free-if-the-prefix-matches. Nobody prices against all three.</span></p><p style="text-align: justify;"><span>Does progressive disclosure actually save money? On tokens and accuracy, measurably yes. Anthropic reports a five-server MCP setup &#8212; 58 tools across GitHub, Slack, Sentry, Grafana and Splunk &#8212; consuming </span><em><span>&#8220;approximately 55K tokens before the conversation even starts,&#8221;</span></em><span> cut to ~8.7K with deferred loading, and MCP eval accuracy on Opus 4.5 rising </span><strong><span>79.5% &#8594; 88.1%</span></strong><span> (</span><a href="https://www.anthropic.com/engineering/advanced-tool-use"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">Anthropic engineering, 24 Nov 2025</span></a><span>). Internally they&#8217;ve seen tool definitions hit 134K tokens before optimization. On </span><em><span>net</span></em><span> cost, nobody has published a number &#8212; and the honest tell is that Anthropic had to build a special mechanism to keep deferred loading from destroying the cache. Naive on-demand loading would cost you cache reuse. That&#8217;s why the mechanism exists.</span></p><p style="text-align: justify;"><span>Which produces a question I&#8217;d want answered before I signed anything: </span><strong><span>if the injection budget determines whether my agent&#8217;s safety rules hold, and the platform owns that budget &#8212; what is it, how is it counted, and what happens when I exceed it, in writing?</span></strong></p><p style="text-align: justify;"><span>It is the same question a buyer asks about any supplied component whose failure is invisible in the finished good: what is the tolerance, how is it measured, and does the supplier tell me when I&#8217;m outside it. In every mature supply chain that answer lives in a datasheet and a change-notification clause. Here it lives in a source comment.</span></p><p style="text-align: justify;"><span>Nothing I can find answers it. I&#8217;m talking about what a buyer can read </span><em><span>before</span></em><span> entering a negotiation: </span><a href="https://www.anthropic.com/legal/commercial-terms"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">Anthropic&#8217;s Commercial Terms</span></a><span>, effective 17 June 2025, contain no service levels, no context-size language and no truncation language &#8212; only that </span><em><span>&#8220;ANTHROPIC DOES NOT WARRANT&#8230; THAT THE SERVICES OR OUTPUTS ARE ACCURATE, COMPLETE OR ERROR-FREE.&#8221;</span></em><span> Meanwhile the same vendor publishes a twelve-row table specifying </span><em><span>its own</span></em><span> injected overhead to the single token &#8212; 290 tokens of tool-use system prompt on Opus 4.8 under tool_choice: auto, 410 under any, 675 on Opus 4.7, 264 on Haiku 3.5 &#8212; broken out by model and by setting (</span><a href="https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview"><span data-color="rgb(0, 0, 233)" style="color: rgb(0, 0, 233);">tool use pricing</span></a><span>, read 20 July 2026). The platform meters its side of the boundary to the token. Yours it will not name.</span></p><h2><span>The fix</span></h2><p style="text-align: justify;"><span>Here is what to actually do &#8212; four steps.</span></p><p style="text-align: justify;"><strong><span>1. Measure your file.</span></strong><span> Run wc -c on your rules file (AGENTS.md, CLAUDE.md, whatever your tool uses) and compare the number to your tool&#8217;s limit &#8212; Codex cuts off at 32,768 bytes; others differ, and some publish no number at all. If you are over the limit, part of your file is being thrown away every session, and nothing tells you.</span></p><p style="text-align: justify;"><strong><span>2. Put the most important rules first.</span></strong><span> When a file is cut, it is cut from the bottom. So move your non-negotiable rules to the top, where they survive. Order by what matters most, not by topic.</span></p><p style="text-align: justify;"><strong><span>3. Add a tripwire at the bottom.</span></strong><span> Make the last line of the file something distinctive &#8212; say, RULES-END-DO-NOT-DELETE &#8212; and have your startup check confirm that exact line came through. If it is missing, the file was cut, and now you know, instead of finding out from a wrong answer. (That is all a &#8220;canary&#8221; is: a marker whose absence is the alarm.)</span></p><p style="text-align: justify;"><strong><span>4. For anything that must never be wrong, do not trust the file at all.</span></strong><span> A rules file is a suggestion &#8212; the model usually follows it, and &#8220;usually&#8221; is fine for judgment calls. It is not fine for a rule about money, which has to hold every time. Put those rules in code instead of text: make the step that reports a balance refuse to run until the balance has actually been fetched. Text can be ignored. Code cannot.</span></p><p style="text-align: justify;"><span>That is the whole fix.</span></p><p style="text-align: justify;">And it generalizes past this one file. When a behavior has to hold every time, the answer is deterministic enforcement, not better prompt wording. No rewrite survives being truncated, ignored, or loaded into the wrong layer &#8212; a phrasing you can improve is a phrasing the model can skip. If it must hold, put it where the model doesn&#8217;t get a vote: a check, a line of code, the harness. Prose persuades; only structure enforces.</p>]]></content:encoded></item><item><title><![CDATA[The cheapest line item in my AI app is the AI]]></title><description><![CDATA[When you ship a consumer app that leans on a large language model, the standard cost warning is always the same: watch your inference bill.]]></description><link>https://inferencenotes.co/p/the-cheapest-line-item-in-my-ai-app</link><guid isPermaLink="false">https://inferencenotes.co/p/the-cheapest-line-item-in-my-ai-app</guid><dc:creator><![CDATA[Sathish J]]></dc:creator><pubDate>Fri, 29 May 2026 15:40:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hKTv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When you ship a consumer app that leans on a large language model, the standard cost warning is always the same: watch your inference bill. Cap your usage. The model will eat your margin.</p><p>After running mine live for a while, I can report the opposite. The AI is the cheapest, most predictable line item I have &#8212; and the economics that actually matter turned out to be somewhere else entirely.</p><h2>What the model actually costs</h2><p>The app uses a small, cheap model for its AI features, and I built it to call that model as little as possible:</p><ul><li><p>A small model, not a frontier one, for tasks that don&#8217;t need a frontier one.</p></li><li><p>Hard caps on output length and low temperature &#8212; predictable tokens in, predictable tokens out.</p></li><li><p>Aggressive caching: a cache hit rate north of 80%, so most requests never reach the model at all.</p></li><li><p>A free, deterministic data source tried first; the model is only the fallback.</p></li><li><p>A per-user rate limit, so no single user can run up the bill.</p></li></ul><p>Add it up and the cost to serve an active user lands on the order of a tenth of a percent of what they pay for a monthly subscription. On the P&amp;L, the model is a rounding error.</p><p>The lesson isn&#8217;t &#8220;models are cheap now,&#8221; though they are. It&#8217;s that <strong>AI cost is an architecture decision, not a procurement one.</strong> You don&#8217;t get cheap inference by negotiating price-per-token; you get it by calling the model <em>less</em> &#8212; cache, cap, prefer deterministic sources, batch. The team that designs for fewer, smaller calls beats the team with a better rate card. That bullet list above is really a pricing decision disguised as architecture.</p><h2>The line item that actually moves the margin</h2><p>The expensive part of the app has nothing to do with AI. It&#8217;s distribution.</p><p>Put it on a single $10 transaction. Route it through iOS in-app purchase and the platform fee takes $1.50 to $3.00 of it; the inference behind that customer&#8217;s usage costs a fraction of a cent. The channel takes a couple hundred times what the model does, on the same dollar. So the app applies the long-established &#8220;reader&#8221; principle &#8212; apps from Netflix to Spotify to Kindle handle commerce on the web and use the iOS app for access. That&#8217;s the architecture I ended up with. (The formal App Store carve-out is narrow, and the rules are in flux post-Epic and under the EU&#8217;s DMA &#8212; so the point is the principle, not any one loophole.)</p><p>A pricing person&#8217;s way to say it: <strong>your distribution channel&#8217;s take rate is usually a far bigger lever on margin than your cost of goods.</strong> I spend my day setting price inside a hardware P&amp;L at scale, where a point of margin is real money and the structure &#8212; where value gets captured, not what it costs to make &#8212; dominates the model. The app just let me run the same logic at the opposite extreme: near-zero unit cost, and the structure still decides everything.</p><h2>Two pricing reflexes that break when cost rounds to zero</h2><p>When your unit cost rounds to zero, two reflexes that served older businesses well both break.</p><p><strong>Cost-plus pricing makes you look cheap to your own product.</strong> Price a near-zero-cost feature on cost and you&#8217;ll price it near nothing &#8212; which tells the buyer it&#8217;s worth near nothing.</p><p><strong>Per-usage metering makes the user anxious about a meter that&#8217;s measuring almost nothing</strong> &#8212; you collect all of the anxiety and almost none of the revenue.</p><p>Metering isn&#8217;t always wrong, though. It&#8217;s the right model when each call does expensive, legible work &#8212; a coding agent like Cursor or Claude Code, a per-resolution support agent &#8212; because there the meter tracks something the customer can see is worth paying for. It fails only when both the per-call <em>cost</em> and the per-call <em>value</em> are low, which is exactly the consumer-app case: each call is cheap and invisible, so the meter just generates worry. There, bundle pricing and value-anchored tiers win.</p><p>The same logic set my lifetime tier. I didn&#8217;t price it from cost; I priced it for what someone would pay for the certainty of never being asked to pay again &#8212; a willingness-to-pay number, not a cost number. A lifetime plan is normally a recurring-revenue anti-pattern: you trade a stream for a lump and a permanent obligation to serve. I took it deliberately, precisely because near-zero marginal cost makes that obligation nearly free to honor.</p><p>Then, at launch, I gave Pro away to the first cohort of families. That&#8217;s revenue I&#8217;m choosing not to collect &#8212; and it&#8217;s a standard early-stage sequencing move, not generosity. At this stage the binding constraint isn&#8217;t monetization; it&#8217;s getting enough engaged users in the door to learn what makes them stay. The risk you take on is anchoring &#8212; teach people the thing is free and some never convert &#8212; which is why it&#8217;s the <em>first cohort</em>, not forever.</p><h2>Where the economics actually live</h2><p>Once inference rounds to zero and you&#8217;ve protected your take rate, unit economics stop being about cost to serve at all. They&#8217;re dominated by activation and retention. If people sign up and ghost, no pricing tier saves you. If they stick, the model cost is noise. In a world of cheap inference, the highest-leverage &#8220;pricing&#8221; work often isn&#8217;t pricing &#8212; it&#8217;s getting someone to the &#8220;oh, I get it&#8221; moment fast enough that they come back.</p><h2>The transferable part</h2><p>If you price or build AI products, retire one reflex: treating token cost as the central economic question. It was the right worry in 2023; it&#8217;s increasingly the wrong one for products shaped like mine. The honest caveat is the frontier: multi-step agents and reasoning loops have pushed per-<em>task</em> cost up even as per-token prices fall, and cost still matters enormously there. But for the broad middle of consumer and SaaS AI features, cost-to-serve is trending toward noise.</p><p>Watch where the supply side is pushing it. NVIDIA&#8217;s published comparison for its next-generation Vera Rubin platform puts inference cost per token at roughly a tenth of the current Blackwell generation&#8217;s at the same latency &#8212; on one reasoning workload, with the usual caveat that the number moves with model and operating point. The cost floor under inference keeps dropping. But the direction was never the interesting part. The interesting question is who keeps the margin when a token costs almost nothing &#8212; and it isn&#8217;t the resellers metering tokens, or the SaaS priced on cost. It accrues to whoever prices the <em>system</em> and the <em>relationship</em>. That&#8217;s the same lesson the app taught me, three orders of magnitude down.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hKTv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hKTv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png 424w, https://substackcdn.com/image/fetch/$s_!hKTv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png 848w, https://substackcdn.com/image/fetch/$s_!hKTv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png 1272w, https://substackcdn.com/image/fetch/$s_!hKTv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hKTv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png" width="446" height="288.86497890295357" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:614,&quot;width&quot;:948,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:232302,&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://inferencenotes.co/i/199753729?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hKTv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png 424w, https://substackcdn.com/image/fetch/$s_!hKTv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png 848w, https://substackcdn.com/image/fetch/$s_!hKTv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.png 1272w, https://substackcdn.com/image/fetch/$s_!hKTv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F383df05b-4da2-40fe-8dbe-4f78e406c7b1_948x614.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"><em>Inference cost per token vs. latency &#8212; Rubin NVL72 vs. Blackwell NVL72, on one reasoning workload (Kimi K2-Thinking, 32K/8K). Source: NVIDIA.</em></figcaption></figure></div><p>The questions that decide whether an AI product makes money are the old, unglamorous ones: what take rate your channel imposes, how you package against willingness to pay, and whether you keep the user long enough for any of it to matter.</p><p>Price the value and the relationship &#8212; not the inference. The inference was never going to be the expensive part.</p>]]></content:encoded></item><item><title><![CDATA[Three things that surprised me running a personal AI agent in production]]></title><description><![CDATA[For the last few months I&#8217;ve run a small agent system on a server in my house.]]></description><link>https://inferencenotes.co/p/three-things-that-surprised-me-running</link><guid isPermaLink="false">https://inferencenotes.co/p/three-things-that-surprised-me-running</guid><dc:creator><![CDATA[Sathish J]]></dc:creator><pubDate>Tue, 26 May 2026 16:43:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/390e3ce1-dccc-49d4-b399-bcef8d266835_2400x1260.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the last few months I&#8217;ve run a small agent system on a server in my house. It reads from about a dozen sources &#8212; three banks, a brokerage, property-management email, a medical-receipts ledger, my own app&#8217;s analytics &#8212; and assembles one message that lands on my phone twice a day. It drafts replies, files documents by year and category, and flags things I&#8217;d otherwise miss. It does not move money, sign anything, or email my tenants on its own.</p><p>It&#8217;s been live long enough now to be boring, which was the goal. Along the way three things surprised me. Each one cut against what I expected going in, and each turns out to matter well beyond a house.</p><h2>1. The win was aggregation, not automation.</h2><p>Going in, I assumed the value would be in the agent <em>doing</em> things &#8212; answering email, paying bills, scheduling. That&#8217;s the demo everyone builds.</p><p>What actually changed my days was duller than that: one message instead of twenty tabs. Before, a normal morning meant logging into App Store Connect, Google Ads, Firebase, three bank accounts, a brokerage, a property inbox, and a receipts ledger &#8212; each its own login, each a few minutes, each a context switch that cost more than the minutes. Now it&#8217;s one message at 6:30 a.m. and one at 8 p.m. The agent&#8217;s main job is to read everything, summarize it, and put it in a single place.</p><p>Most of the leverage in a personal agent &#8212; and, I&#8217;d argue, a business one &#8212; is in collapsing scattered state into one view. Automation is the dessert; aggregation is the meal. If you&#8217;re scoping an agent product, the unglamorous &#8220;read everything, summarize in one place&#8221; is probably worth more to the user than the impressive &#8220;take action&#8221; demo that gets the applause.</p><h2>2. Constraining the agent made me trust it more &#8212; and use it more.</h2><p>My instinct was that an agent earns its keep by acting, so I expected to keep widening what it was allowed to do on its own. The opposite happened.</p><p>The modules I rely on most are the ones that do the least. Property email gets a <em>drafted</em> reply that I approve with a tap; actually sending is gated behind a PIN. Banking is read-only &#8212; the agent can see balances and flag an odd charge, but it has no path to move a dollar. Investments are never traded. The medical module reads a sanitized ledger and never the underlying images.</p><p>Here&#8217;s the part I didn&#8217;t predict: the first time an agent does something you didn&#8217;t expect &#8212; even something small and harmless &#8212; you stop trusting it, and an untrusted tool gets quietly closed and never reopened. By keeping everything to <em>draft &#8594; approve</em>, I never had that moment. So I left more of it running, gave it more to read, leaned on it more. The constraint increased usage.</p><p>A narrow agent I trust beats a capable one I have to babysit. For anyone building agents for other people, the lesson is sharper still: &#8220;human in the loop&#8221; isn&#8217;t a compliance checkbox you bolt on at the end. It&#8217;s the feature that decides whether the thing survives contact with a real user. Design the approval step <em>as the product</em>, not as the guardrail around it.</p><h2>3. The model was the most replaceable part of the system.</h2><p>Partway through, I switched the underlying model from one provider to another. Not because of quality &#8212; because the framework I was running expected a particular model&#8217;s tool-calling profile. The swap took an evening, and the system behaved the same the next morning.</p><p>What did <em>not</em> swap easily was the plumbing. Read-only, scoped API tokens instead of stored passwords. Running on an isolated machine that is never my work laptop, so a bad instruction can&#8217;t reach anything that matters. A redaction step that strips personal information before anything leaves the house &#8212; the medical module, for instance, never sends a receipt image downstream at all, only a sanitized ledger. A PIN gate on anything that can send. That layer is where the weeks actually went, and it&#8217;s the part I couldn&#8217;t rip out without rebuilding the whole thing.</p><p>The model is increasingly a commodity you can swap in an evening. The durable engineering is the boring security-and-data-handling layer around it. So when you&#8217;re evaluating an &#8220;AI feature&#8221; &#8212; your own or a vendor&#8217;s &#8212; spend less time on <em>which model</em> and more on three questions: what can it read, what can it write, and where does the data go? That&#8217;s the part that&#8217;s hard to change later, and it&#8217;s the part that decides whether you can trust the thing with anything real.</p><h2>The pattern underneath</h2><p>None of this is exotic. A server that&#8217;s already on, some scoped tokens, a chat bot, a scheduler. The surprises weren&#8217;t technical &#8212; they were about where the value actually sat: in reading rather than acting, in constraint rather than capability, in the plumbing rather than the model.</p><p>None of this is specific to a personal setup. The same three decide things at company scale, anywhere an agent is put in front of real data and real consequences.</p>]]></content:encoded></item></channel></rss>