<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Michael Tuszynski</title>
    <description>The latest articles on DEV Community by Michael Tuszynski (@michaeltuszynski).</description>
    <link>https://dev.to/michaeltuszynski</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1447774%2Fa99eea93-7845-4764-9fce-b1755bcfa456.png</url>
      <title>DEV Community: Michael Tuszynski</title>
      <link>https://dev.to/michaeltuszynski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/michaeltuszynski"/>
    <language>en</language>
    <item>
      <title>Context Is Four Different Words: The Window, The Corpus, The File, and The Session</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Sun, 16 Aug 2026 16:34:16 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/context-is-four-different-words-the-window-the-corpus-the-file-and-the-session-30p6</link>
      <guid>https://dev.to/michaeltuszynski/context-is-four-different-words-the-window-the-corpus-the-file-and-the-session-30p6</guid>
      <description>&lt;p&gt;Someone on your team says the agent "needs better context." Four people nod. They are agreeing about a word and disagreeing about the work, and nobody finds out until two of them have built the wrong thing.&lt;/p&gt;

&lt;p&gt;I run four systems that all get called context, and they have almost nothing in common. One is a hard capacity limit. One is a 35-million-token corpus. One is a 4.7KB file I hand-edited last week. One evaporates when the session ends. Same word, four owners, four failure modes, four different afternoons of work.&lt;/p&gt;

&lt;p&gt;Here is how I keep them apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job one: context as capacity
&lt;/h2&gt;

&lt;p&gt;This is context as a number. The window. It has a ceiling, you can exceed it, and when you do, something gets dropped or summarized whether you like it or not.&lt;/p&gt;

&lt;p&gt;Capacity is the only one of the four you can measure without judgment, which is why it dominates conversation. It is also the least interesting, because being under the limit tells you nothing about whether the right things are in there.&lt;/p&gt;

&lt;p&gt;My own number is worth stating plainly. Before I type a single word, my agent has already loaded a global instruction file, a shared cross-tool rules file, a workspace guide, a memory index, and a lessons file. Together that is about 75,000 characters, call it 19,000 tokens, spent every session on standing orders. That is my floor, not my usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job two: context as corpus
&lt;/h2&gt;

&lt;p&gt;This is context as a pile of things you &lt;em&gt;could&lt;/em&gt; retrieve. Vector store, RAG index, semantic search. It is not in the window; it is the universe you draw from to fill the window.&lt;/p&gt;

&lt;p&gt;Mine is Postgres with pgvector, embeddings served by a local model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_count&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_count&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- 35,035,979 | 159,669 | 219&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thirty-five million tokens of retrievable material against a window that holds a fraction of a percent of it. The binding constraint was never storage. It is selection.&lt;/p&gt;

&lt;p&gt;The breakdown is the part that changed how I think about this. Of those 159,669 chunks, session transcripts account for 99,259. Archived history from two prior systems adds another 51,165. The hand-curated knowledge vault — the notes I actually wrote on purpose — is &lt;strong&gt;2,515 chunks, about 1.6% of the corpus&lt;/strong&gt;. The rest is exhaust.&lt;/p&gt;

&lt;p&gt;That ratio is not a bug I am about to fix. It is what a retrieval corpus looks like after eighteen months: mostly a record of what happened, with a thin seam of what you decided.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job three: context as instruction
&lt;/h2&gt;

&lt;p&gt;This is context as a durable file you hand-author and version. &lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;, cursor rules, system prompts checked into the repo. It loads every session, it is read by a machine but written by a person, and it goes stale silently.&lt;/p&gt;

&lt;p&gt;The artifact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~/.codex/AGENTS.md
~/.codex/AGENTS.md -&amp;gt; /Users/mpt/.claude/AGENTS.core.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One 4.7KB file of rules — never commit secrets, never deploy without asking, batch privileged steps into one paste-able block — symlinked so that two different vendors' coding agents read the identical text. I edit one file; Claude Code and Codex both change behavior. That is context as configuration, and it has more in common with a dotfile than with anything in jobs one or two.&lt;/p&gt;

&lt;p&gt;Its failure mode is drift, not overflow. A stale rule is worse than a missing one, because the agent follows it confidently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job four: context as session state
&lt;/h2&gt;

&lt;p&gt;This is what is live right now: the conversation so far, what you already tried, the decision you made twenty minutes ago and have not written down. It is the only one of the four that dies on restart.&lt;/p&gt;

&lt;p&gt;Everyone underestimates this one until a session compacts mid-task and the agent cheerfully re-litigates something it settled an hour ago. The fix is unglamorous. Write state to disk on purpose, or accept that it is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two axes nobody separates
&lt;/h2&gt;

&lt;p&gt;Capacity and curation are not the same axis, and treating them as one is where the money goes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Small window&lt;/th&gt;
&lt;th&gt;Large window&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Curated input&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast, cheap, works&lt;/td&gt;
&lt;td&gt;Works, costs more than it needs to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uncurated input&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Overflows immediately&lt;/td&gt;
&lt;td&gt;Fits, and quietly degrades&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The bottom-right cell is the expensive one, because everything looks fine. It fits. Nothing errors. The output is just worse in ways that do not announce themselves.&lt;/p&gt;

&lt;p&gt;Anthropic's engineering team makes this argument &lt;a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents" rel="noopener noreferrer"&gt;in their context-engineering post&lt;/a&gt;, framing the model as having an "attention budget" and defining good practice as finding "the smallest possible set of high-signal tokens." Take the framing seriously but note the position: the company describing your window as a scarce resource also sells the window. That is a claim worth checking against someone with no such incentive.&lt;/p&gt;

&lt;p&gt;There is one. Liu et al., published in &lt;a href="https://aclanthology.org/2024.tacl-1.9/" rel="noopener noreferrer"&gt;TACL&lt;/a&gt;, tested how models actually use long inputs on multi-document QA and key-value retrieval. Performance was highest when the relevant information sat at the beginning or the end of the input and dropped when the model had to reach into the middle — and that held &lt;strong&gt;even for models explicitly built for long contexts&lt;/strong&gt;. That is peer-reviewed, it is not selling a context window, and it says position inside the window changes the answer. Capacity is not the variable. Placement is.&lt;/p&gt;

&lt;p&gt;The widely-cited &lt;a href="https://research.trychroma.com/context-rot" rel="noopener noreferrer"&gt;"context rot" work&lt;/a&gt; points the same direction, and the lab behind it sells a vector database, so "long contexts degrade, retrieve instead" is a conclusion they profit from. It survives the objection mainly because Anthropic cites it against its own product interest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this breaks
&lt;/h2&gt;

&lt;p&gt;The four-way split is vocabulary, and vocabulary has a tax. On a two-person team where the same person owns all four systems, this is overhead — go build something. The split earns its keep when the four jobs have different owners, which is exactly when the argument starts.&lt;/p&gt;

&lt;p&gt;It also breaks at the edges. Prompt caching sits across capacity and instruction. A compaction step is session state being rewritten into capacity. I am drawing lines through something continuous because the lines make meetings shorter, not because the territory has them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question I ask now
&lt;/h2&gt;

&lt;p&gt;When someone says we need better context, I ask which one before anything else: &lt;strong&gt;is this a room problem, a retrieval problem, a rules-file problem, or a state problem?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Room is a budgeting question. Retrieval is a ranking and evals question. A rules file is a twenty-minute edit. State is a persistence question. Four different afternoons, four different owners, one shared noun.&lt;/p&gt;

&lt;p&gt;I got the shape of this from Shawn Wallace, who &lt;a href="https://www.shawnewallace.com/2026-08-12-lets-talk-about-agents/" rel="noopener noreferrer"&gt;ran the same play on the word "agent"&lt;/a&gt; and found three jobs hiding under it. The form travels because the industry keeps doing this: a word gets useful, then absorbs every adjacent thing anyone shipped, then stops carrying information.&lt;/p&gt;

&lt;p&gt;Writing this post, I ran the count against my own corpus and got 159,669 active chunks. My workspace guide — the instruction file, job three, the one loaded into every session I start — said 126,000. It had been verified eight days earlier. The file whose job is to describe the corpus was wrong about the corpus, and it had been telling every agent I ran the wrong number all week.&lt;/p&gt;

&lt;p&gt;Job three going stale about job two. I had to write the taxonomy to catch it.&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>aiengineering</category>
      <category>contextengineering</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>Karpathy's LLM Wiki Works. Here's What Broke When I Ran It at Real Scale.</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Thu, 13 Aug 2026 18:38:58 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/karpathys-llm-wiki-works-heres-what-broke-when-i-ran-it-at-real-scale-28jk</link>
      <guid>https://dev.to/michaeltuszynski/karpathys-llm-wiki-works-heres-what-broke-when-i-ran-it-at-real-scale-28jk</guid>
      <description>&lt;p&gt;Andrej Karpathy's &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;LLM Wiki gist&lt;/a&gt; from April is right about the important part: for personal knowledge, a markdown wiki that Claude maintains beats a RAG pipeline. I've been running a version of this pattern in production against my own life for six months. Karpathy is right — and he stopped at exactly the point where the interesting problems start.&lt;/p&gt;

&lt;p&gt;Here's the pattern, briefly, then what actually breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The claim, in one paragraph
&lt;/h2&gt;

&lt;p&gt;You keep raw sources in one directory. You keep a wiki of markdown pages in another. A &lt;code&gt;CLAUDE.md&lt;/code&gt; file tells Claude how the wiki works: naming, folder layout, what to do on ingest, how to handle contradictions. New source comes in, Claude reads it, writes or updates concept pages, links them with &lt;code&gt;[[wikilinks]]&lt;/code&gt;, updates an index. When you ask a question, Claude reads the wiki, not the raw sources — the synthesis has already been done at ingest time. The whole thing sits under ~100k tokens, so Claude can hold the index in context and reason over it directly. No embeddings, no vector store, no infrastructure. Two clean community implementations to start from: &lt;a href="https://github.com/nvk/llm-wiki" rel="noopener noreferrer"&gt;nvk/llm-wiki&lt;/a&gt; and &lt;a href="https://github.com/Ar9av/obsidian-wiki" rel="noopener noreferrer"&gt;Ar9av/obsidian-wiki&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's the whole thing. It works. It works better than you'd expect. And every problem I've hit with it shows up in the same three places.&lt;/p&gt;

&lt;h2&gt;
  
  
  My setup, so the failure modes are grounded
&lt;/h2&gt;

&lt;p&gt;Mine is a NEXUS workspace: an Obsidian vault split into &lt;code&gt;000-inbox/&lt;/code&gt;, &lt;code&gt;200-knowledge/&lt;/code&gt;, &lt;code&gt;300-entities/&lt;/code&gt;, &lt;code&gt;400-daily/&lt;/code&gt;, plus per-domain context files under &lt;code&gt;200-knowledge/context/&lt;/code&gt; — one each for finance, health, content, jobsearch. Every domain has its own schema and its own conventions. A top-level &lt;code&gt;CLAUDE.md&lt;/code&gt; sets the operating rules; each domain file specializes them. Entities (people, companies, services, properties) are single markdown files named by their wikilink text, so &lt;code&gt;[[Janney]]&lt;/code&gt; grep-searches straight to &lt;code&gt;vault/300-entities/orgs/Janney.md&lt;/code&gt;. Daily logs at &lt;code&gt;vault/400-daily/YYYY-MM-DD.md&lt;/code&gt; are the append-only session record. A &lt;code&gt;MEMORY.md&lt;/code&gt; at the root holds hard-won lessons — 34 entries and counting.&lt;/p&gt;

&lt;p&gt;Volume: several hundred wiki pages, four active domains, daily writes going back to February. Well past Karpathy's toy scale, well under any RAG-scale problem. This is the middle band the original gist never addresses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it broke: three failure modes, all the same shape
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Drift between the "recent changes" section and the "how it works" section of the same file.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The gist assumes ingest and update. It doesn't say what happens when something you documented in April is &lt;em&gt;contradicted&lt;/em&gt; by what you did in July. In practice, Claude appends a new dated entry to a changelog at the top of the file, feels done, and leaves the reference section below still describing the dead system as current. A reader — human or agent — trusts the reference section for "how does this work today," and it's wrong. Writing a dated log entry &lt;em&gt;feels&lt;/em&gt; like recording the change, so the present-tense prose that people actually read for "how does this work now" never gets revisited. The rule I now enforce: a migration isn't done when the changelog says so; it's done when the reference sections match.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Silent contradictions between pages.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two entity cards for the same account — one calls the institution "Janney," the other calls it "Janney Montgomery Scott LLC" — and a downstream aggregation double-counts because the dedup key is the name. RAG failures are silent because retrieval quietly misses a chunk. Wiki failures are silent for a different reason: two pages both exist, both are internally consistent, and neither knows about the other. Claude doesn't spontaneously notice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Orphan pages and dead wikilinks accumulate faster than lint catches them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Karpathy's original suggests running lint occasionally. At three hundred pages, "occasionally" is not a frequency — it's a hope. Weekly lint recovers most of it. Nothing recovers a stale page that nobody links to and nobody re-reads.&lt;/p&gt;

&lt;p&gt;All three are the same shape: &lt;strong&gt;the wiki has no immune system against its own past.&lt;/strong&gt; It compounds knowledge, but it also compounds staleness, and it needs help distinguishing the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things I bolted on
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A drift linter that fails the build.&lt;/strong&gt; A Python check that walks the vault, cross-references any "retired" or "decommissioned" term against every file, and flags live mentions of dead systems in the canonical docs. It runs pre-commit and on a scheduled cron. When Ghost got replaced by an Astro static site, the linter caught nine files still describing the Ghost publish path as current — including the top-level project README. Without it, a reader would have reached for dead credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-domain sub-schemas, not one giant &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/strong&gt; The gist treats the schema as one file. That doesn't survive the second domain. Finance and health have almost no overlap in vocabulary, conventions, or what a "page" is. My top-level &lt;code&gt;CLAUDE.md&lt;/code&gt; sets universal rules (voice, safety, wikilink format, verification protocol). Each domain has its own &lt;code&gt;&amp;lt;domain&amp;gt;-context.md&lt;/code&gt; that specializes them. A session working on finance loads the domain file; a session working on content loads a different one. Same architecture as scoped CSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A vector index alongside the wiki, not replacing it.&lt;/strong&gt; Once I passed roughly 100k tokens of wiki content plus 100k tokens of session logs plus tens of thousands of legacy conversations, Claude couldn't hold the index in context anymore. The gist's answer to this is "at that point, use RAG." My answer is: keep the wiki as the authored, curated layer, and add a pgvector index over the whole corpus — vault plus session history plus legacy archives — for recall. Around 126k chunks on Postgres 17 with &lt;code&gt;mxbai-embed-large&lt;/code&gt; embeddings running on a Mac mini. Not a replacement for the wiki; a way to find the right wiki page when your brain forgot which slug you wrote it under two months ago. The RAG layer is a retrieval tool for me and my agents. The wiki is still the canonical knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the pattern still wins
&lt;/h2&gt;

&lt;p&gt;For synthesis, entity resolution, and the "how do these three things I noticed relate" question, nothing else comes close. RAG genuinely doesn't do it — the &lt;a href="https://medium.com/@koriigami/build-a-personal-knowledge-base-with-claude-code-25d215b61822" rel="noopener noreferrer"&gt;structural argument&lt;/a&gt; about retrieval having no accumulation is correct. When I ask "what's the through-line across the last month of daily logs on finance," the answer draws on synthesis pages that were written when each log came in. The work happened once, at ingest.&lt;/p&gt;

&lt;p&gt;Entity cards are the other win. A single file per person or company, named by its wikilink text, becomes the source of truth. Everything else references it. When a fact about an entity changes, you change one file. This is the boring pattern that pays for itself every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stops — the honest edge cases
&lt;/h2&gt;

&lt;p&gt;The wiki pattern breaks when any of these are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-actor writes.&lt;/strong&gt; If two agents write to the same wiki page concurrently, there is no lock. Mine is single-writer by convention. If you fan out coding agents that all edit &lt;code&gt;SESSION-STATE.md&lt;/code&gt;, you need a lockfile — the gist has nothing to say about this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall across the boundary of a Claude session.&lt;/strong&gt; A wiki isn't memory. Claude reads it fresh each session. Cross-session memory ("what did we decide last Tuesday") needs a separate store, which is what daily logs plus the vector index are for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything past ~100k tokens of hot wiki content.&lt;/strong&gt; &lt;a href="https://www.mindstudio.ai/blog/llm-wiki-vs-rag-markdown-knowledge-base-comparison" rel="noopener noreferrer"&gt;The load-bearing assumption&lt;/a&gt; is that the index fits in context. When it doesn't, either you shard by domain (my approach), add a retrieval layer, or accept degraded answers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anything anyone else needs to read without Claude in the loop.&lt;/strong&gt; A markdown wiki is legible to humans. A markdown wiki &lt;em&gt;written by Claude, for Claude, over months&lt;/em&gt; has enough house-style shorthand that a new reader without the schema will miss context. The wiki is legible; the accumulated conventions are not.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to actually do
&lt;/h2&gt;

&lt;p&gt;Start where Karpathy says. One folder, one schema, five sources, in one domain you're actively thinking about. Do it for two weeks before adjusting anything.&lt;/p&gt;

&lt;p&gt;At the point it starts feeling like it's working — around thirty or forty pages — put three things in before you regret not having them: a drift check that flags dead terms in live docs, one lint pass a week that actually runs, and a rule that any migration updates the reference section, not just a changelog. That's the operating discipline the pattern needs and doesn't ship with.&lt;/p&gt;

&lt;p&gt;Add a vector index only when the wiki genuinely stops fitting. Not before. Karpathy is right about that too — most people reach for RAG when they should have written a schema.&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>knowledgemanagement</category>
      <category>aiengineering</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>Your $40K GPU Runs 6 Hours a Day: The Utilization Number Every Local-LLM TCO Omits</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Mon, 10 Aug 2026 15:55:49 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/your-40k-gpu-runs-6-hours-a-day-the-utilization-number-every-local-llm-tco-omits-o6b</link>
      <guid>https://dev.to/michaeltuszynski/your-40k-gpu-runs-6-hours-a-day-the-utilization-number-every-local-llm-tco-omits-o6b</guid>
      <description>&lt;p&gt;Nobody buys a $40,000 GPU and then asks how many hours a day it's actually computing. They ask how many tokens per second it can do at peak, divide the purchase price by a made-up annual token volume, compare that to an API price sheet, and put the winning number on a slide.&lt;/p&gt;

&lt;p&gt;The number on that slide is wrong by roughly an order of magnitude. Not because the arithmetic is bad — because it's missing a term.&lt;/p&gt;

&lt;h2&gt;
  
  
  The term everyone omits
&lt;/h2&gt;

&lt;p&gt;Per-token pricing and per-hour ownership are different units. An API bills you for work performed. A GPU bills you for time elapsed, whether work happens or not. To compare them you need a conversion factor, and that factor is utilization.&lt;/p&gt;

&lt;p&gt;Utilization isn't one number, it's two multiplied together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duty cycle&lt;/strong&gt; — what fraction of wall-clock hours the box has any inference in flight. A GPU serving an internal dev team runs during business hours in one timezone. Call it 6 hours a day, five days a week. That's 30 hours out of 168. Duty cycle: 18%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saturation&lt;/strong&gt; — during those busy hours, what fraction of peak throughput you actually sustain. This is where the damage is. An H100 running a 70B-class model with continuous batching wants 25 to 40 concurrent requests to hit its throughput ceiling. Interactive users generate three or four. You're running at maybe 20% of what the silicon can do, while paying for 100% of it.&lt;/p&gt;

&lt;p&gt;Multiply them. 18% × 20% = &lt;strong&gt;3.6% effective utilization&lt;/strong&gt;. That's the conversion factor between your capex and your token bill, and virtually no procurement model contains it.&lt;/p&gt;

&lt;p&gt;I've measured this before on much smaller hardware — a Mac mini doing local inference for a real workload sat busy 1.7% of the time over three weeks. The absolute number scales with the box. The shape doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the math both ways
&lt;/h2&gt;

&lt;p&gt;Take a single-GPU node, honestly costed. $40K for the card, three-year straight-line depreciation: $13,333/year. Power at a 1.4 kW node draw and $0.15/kWh commercial rate: about $1,840/year running flat out. Rack and connectivity in a colo: $2,400. Ten percent of one platform engineer to own the thing — patching, driver hell, model upgrades, on-call: $18,000 at a fully loaded $180K.&lt;/p&gt;

&lt;p&gt;Annual owned cost: &lt;strong&gt;~$35,500&lt;/strong&gt;. The staffing line is the biggest single item and it's the one most spreadsheets leave blank. The &lt;a href="https://machine-learning-made-simple.medium.com/the-costly-open-source-llm-lie-f83fdc5d5701" rel="noopener noreferrer"&gt;operational bleed&lt;/a&gt; around open-weight deployment is not the GPU. It's everything attached to it.&lt;/p&gt;

&lt;p&gt;Now throughput. Assume that node sustains 2,000 output tokens/second aggregate under healthy batching. At 100% utilization that's 63 billion tokens a year.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Effective utilization&lt;/th&gt;
&lt;th&gt;Tokens/year&lt;/th&gt;
&lt;th&gt;Cost per M tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;63B&lt;/td&gt;
&lt;td&gt;$0.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;15.8B&lt;/td&gt;
&lt;td&gt;$2.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;6.3B&lt;/td&gt;
&lt;td&gt;$5.63&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;td&gt;2.3B&lt;/td&gt;
&lt;td&gt;$15.65&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At full tilt the box is spectacular — half a dollar per million tokens beats every commercial endpoint on the market. At the utilization your team will actually produce, it costs more than Claude Sonnet. Same hardware. Same model. Same electricity bill. The only variable that moved was the one nobody modeled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put a percentage on the slide, not a payback date
&lt;/h2&gt;

&lt;p&gt;Here's the reframe I'd argue for, and it fits in one line of a deck.&lt;/p&gt;

&lt;p&gt;Stop computing break-even as a token volume. Compute it as a &lt;strong&gt;break-even utilization&lt;/strong&gt; — the fraction of peak throughput you must sustain for the owned box to beat the API you'd otherwise call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;U* = annual_owned_cost / (api_price_per_Mtok × peak_Mtok_per_year)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the node above, against a $3/M blended API price: $35,500 / (3 × 63,000) = &lt;strong&gt;18.8%&lt;/strong&gt;. You need to hold nearly a fifth of peak throughput, all year, to win.&lt;/p&gt;

&lt;p&gt;Against a $0.60/M hosted open-weights endpoint, the same node needs 94% utilization. That's not a hard target. That's a physically unreachable one for anything but a batch queue.&lt;/p&gt;

&lt;p&gt;U* is better than a payback date for three reasons that matter to the person approving the purchase: it's a single number, it's measurable &lt;em&gt;before&lt;/em&gt; you buy, and it's falsifiable. "We break even in 14 months" can't be checked until month 14. "We need 19% sustained utilization" can be checked next Tuesday against a week of Prometheus data.&lt;/p&gt;

&lt;p&gt;If you're already serving inference somewhere, you can measure both terms today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# duty cycle — fraction of the last 7d with inference in flight
avg_over_time((DCGM_FI_DEV_GPU_UTIL &amp;gt; bool 5)[7d:1m])

# saturation — how full the batch actually runs (vLLM)
avg_over_time(vllm:num_requests_running[7d]) / &amp;lt;max_num_seqs&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Multiply. That's your real conversion factor. Divide your annual owned cost by it. Then compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  The denominator keeps moving
&lt;/h2&gt;

&lt;p&gt;There's a second problem, and it's worse than the first. U* isn't a constant. It rises over the life of the asset, because the API price in the denominator keeps falling.&lt;/p&gt;

&lt;p&gt;Epoch AI's analysis of inference pricing found that the cost of reaching a fixed capability level has been dropping &lt;a href="https://epoch.ai/data-insights/llm-inference-price-trends" rel="noopener noreferrer"&gt;between 9x and 900x per year&lt;/a&gt; depending on the task. Take the conservative end. A 9x annual decline means the $3/M endpoint you benchmarked against is a $0.33/M endpoint a year later.&lt;/p&gt;

&lt;p&gt;Your break-even utilization went from 19% to 171%. In year one. Your depreciation schedule did not move.&lt;/p&gt;

&lt;p&gt;That's the structural problem with capitalizing inference hardware: you're making a three-year fixed commitment against a price curve that resets quarterly. The &lt;a href="https://arxiv.org/html/2509.18101v1" rel="noopener noreferrer"&gt;academic cost-benefit work on on-prem deployment&lt;/a&gt; generally models break-even against &lt;em&gt;today's&lt;/em&gt; commercial prices. Fine as a snapshot. Dangerous as a purchase justification, because it treats the comparison baseline as static when it's the fastest-moving number in the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd actually do
&lt;/h2&gt;

&lt;p&gt;Measure before you buy. One week of duty-cycle and saturation data from a rented instance running your real traffic costs a few hundred dollars and answers the question the spreadsheet is guessing at. Rent the exact GPU for a month first. Every cloud has them by the hour.&lt;/p&gt;

&lt;p&gt;If your measured U is below 40%, don't buy the box for cost reasons. There aren't any. Route the interactive traffic to an API and keep looking.&lt;/p&gt;

&lt;p&gt;If you have batch work — nightly document extraction, embedding regeneration, eval suites, synthetic data generation — that's the workload that fills the trough. Owned hardware pays off when you can schedule against it, because scheduled work is the only kind that saturates. A queue that runs 2am to 6am at full batch depth does more for U* than doubling your user count.&lt;/p&gt;

&lt;p&gt;And if the real driver is data residency, a contractual requirement, or a latency floor you can't hit over the public internet — buy it. Those are good reasons. Just price the utilization gap and call it what it is: a control premium, with a dollar figure next to it. That's a defensible line item. "We'll save money on tokens" is not, and it falls apart the first time someone opens Grafana.&lt;/p&gt;

&lt;p&gt;The finance team will accept a premium they can see. What they won't forgive is a payback model that assumed 63 billion tokens and delivered 2.3 billion.&lt;/p&gt;

</description>
      <category>aiinfrastructure</category>
      <category>gpueconomics</category>
      <category>aiengineering</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>Local LLM vs Cloud API at 12 Months: The 3 Line Items Every Per-Token Comparison Omits</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Mon, 10 Aug 2026 00:49:28 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/local-llm-vs-cloud-api-at-12-months-the-3-line-items-every-per-token-comparison-omits-228l</link>
      <guid>https://dev.to/michaeltuszynski/local-llm-vs-cloud-api-at-12-months-the-3-line-items-every-per-token-comparison-omits-228l</guid>
      <description>&lt;p&gt;I run a dedicated local inference host. A Mac mini M4 Pro, 14-core CPU, 20-core GPU, 64GB of unified memory, bought open-box for $3,349. It serves embeddings for a retrieval system, a fallback chat model, and a classifier for inbound notes. It has eight models resident, about 140GB on disk.&lt;/p&gt;

&lt;p&gt;Over the past three weeks it has been busy &lt;strong&gt;1.7% of the time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That number comes from its own request log: the summed wall-clock duration of every generate, chat, and embed call, divided by the day. On the heaviest day in the window it hit 3.45%. On several days it did no inference at all. The daily request count looks healthy at roughly 1,440, until you notice that 1,440 is exactly one request per minute: an uptime monitor polling &lt;code&gt;/api/version&lt;/code&gt;. The machine's most reliable customer is a health check.&lt;/p&gt;

&lt;p&gt;I would still buy it again. But it broke my own cost model, and the way it broke is the part worth writing down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The month-0 spreadsheet is not the month-12 bill
&lt;/h2&gt;

&lt;p&gt;Almost every local-versus-cloud comparison, including &lt;a href="https://www.mpt.solutions/the-hidden-infrastructure-cost-of-running-local-llms-vs-cloud-apis-a-real-world-tco-analysis-for-enterprise-deployments/" rel="noopener noreferrer"&gt;the one I wrote last year&lt;/a&gt;, is a snapshot. You price the hardware, price the tokens, divide, and find a break-even volume. That math is fine on the day you run it. It quietly assumes three things that stop being true somewhere around month four.&lt;/p&gt;

&lt;p&gt;The gap is not small. McKinsey's July 2026 survey found &lt;a href="https://www.mckinsey.com/featured-insights/charts/burning-through-the-ai-budget" rel="noopener noreferrer"&gt;93% of respondents exceeding their AI budgets&lt;/a&gt; while 62% had moved past experimentation into active deployment. McKinsey puts 20 to 30% of that spend within reach of better accounting. That is a survey of self-reported budgets, so treat the precise figure as directional. The direction is the interesting part: the overruns arrive after deployment, not during the pilot. These are the three line items that show up in that window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Line item 1: the capacity you bought, not the capacity you used
&lt;/h2&gt;

&lt;p&gt;Cloud inference bills you for work performed. Hardware bills you for work &lt;em&gt;available&lt;/em&gt;. At 1.7% utilization those are different products wearing the same label.&lt;/p&gt;

&lt;p&gt;Run my numbers forward. Roughly 0.4 busy hours a day is about 146 hours of actual inference a year. Amortize the $3,349 over a single year and each hour of real work costs $22.90. Stretch it across three years, which is fairer to the hardware, and it is still about $7.60 per busy hour. Electricity barely registers. The mini idles near 7W and peaks around 45W under load, so 8,600 idle hours plus 146 busy ones comes to roughly 67 kWh, about $23 a year at California rates.&lt;/p&gt;

&lt;p&gt;That last figure is worth pausing on, because my earlier post led with cooling and power draw. At rack scale, with 700W GPUs, that emphasis is right. At the scale most teams actually start at, one box serving one team, power is a rounding error and &lt;strong&gt;utilization is the entire story&lt;/strong&gt;. The line item that matters flipped when the deployment got smaller.&lt;/p&gt;

&lt;p&gt;The honest version of the local-inference pitch is not "tokens are cheaper." It is "I am buying a fixed monthly cost and a latency floor, and I will pay it whether or not anyone sends a request."&lt;/p&gt;

&lt;h2&gt;
  
  
  Line item 2: the cloud price is a moving target and your hardware is not
&lt;/h2&gt;

&lt;p&gt;You commit to hardware at a fixed price. The alternative you rejected keeps getting cheaper underneath you, and not evenly.&lt;/p&gt;

&lt;p&gt;Epoch AI's analysis of inference pricing found that &lt;a href="https://epoch.ai/data-insights/llm-inference-price-trends" rel="noopener noreferrer"&gt;prices to reach a fixed performance level have fallen between 9x and 900x per year&lt;/a&gt;, depending on which capability you are buying. Matching GPT-4's performance on PhD-level science questions got about 40x cheaper per year. General-knowledge performance fell more slowly, in the 9x-to-40x band. Epoch adds a caveat most people quoting these curves skip: the fastest declines happened in the most recent period, so there is no guarantee they persist.&lt;/p&gt;

&lt;p&gt;Two consequences for a 12-month decision. The break-even volume you computed in month 0 moves against local hardware every month you own it, because your capex is sunk while the rented alternative reprices. And the &lt;em&gt;rate&lt;/em&gt; it moves depends on your workload, because the decline is task-dependent. A team doing hard reasoning has seen its cloud alternative collapse in price. A team doing bulk classification has seen a gentler slope, and their local box holds its case longer.&lt;/p&gt;

&lt;p&gt;Nobody's model has a row for this. Build one: re-run the comparison quarterly with current API pricing rather than the pricing you started with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Line item 3: you pay per token and you bank per accepted answer
&lt;/h2&gt;

&lt;p&gt;The third omission is the denominator. Both sides of this comparison are usually priced per million tokens, which measures what the model emitted, not what a human kept.&lt;/p&gt;

&lt;p&gt;I made &lt;a href="https://www.mpt.solutions/your-local-llm-bill-is-per-token-your-real-cost-is-per-accepted-answer/" rel="noopener noreferrer"&gt;this argument in isolation two weeks ago&lt;/a&gt; and it landed flat, because an argument without a table is just an assertion. Here is the table. A smaller local model that needs two attempts where a frontier API needs one has doubled its effective token cost, and it has spent your reviewer's attention twice. Reviewer attention is the expensive input here, not the tokens. Tracking &lt;a href="https://www.mpt.solutions/where-your-20k-in-tokens-actually-goes/" rel="noopener noreferrer"&gt;where the token spend actually goes&lt;/a&gt; is the prerequisite; the acceptance rate is what turns that into a cost.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line item&lt;/th&gt;
&lt;th&gt;Cloud API&lt;/th&gt;
&lt;th&gt;Local hardware&lt;/th&gt;
&lt;th&gt;How to measure it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Idle capacity&lt;/td&gt;
&lt;td&gt;~$0 when idle&lt;/td&gt;
&lt;td&gt;Full cost regardless of use&lt;/td&gt;
&lt;td&gt;Busy-seconds ÷ elapsed, from your server log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price decay&lt;/td&gt;
&lt;td&gt;Falls 9x–900x/yr, task-dependent&lt;/td&gt;
&lt;td&gt;Fixed at purchase; capex is sunk&lt;/td&gt;
&lt;td&gt;Re-price the API side quarterly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rework&lt;/td&gt;
&lt;td&gt;Per token, retries billed&lt;/td&gt;
&lt;td&gt;Per token, retries billed in idle capacity too&lt;/td&gt;
&lt;td&gt;Accepted outputs ÷ total generations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three rows, all measurable from data you already have. None of them appear in a per-token comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this breaks
&lt;/h2&gt;

&lt;p&gt;My 1.7% is a single-operator homelab, and it is the weakest possible case for owned hardware. A shared inference cluster behind a real queue, serving fifty engineers across time zones, lands far higher. Above roughly 40% sustained utilization the capacity argument inverts and hardware wins on cost alone. If your box is genuinely saturated, line item 1 is not your problem.&lt;/p&gt;

&lt;p&gt;Two other cases where none of this decides anything. Data residency and compliance can make local inference the only lawful option, at which point the cost comparison is a formality. And batch or overnight work reshapes the math, because idle hours you can schedule into are not idle.&lt;/p&gt;

&lt;p&gt;There is also a cost to my own advice. Measuring utilization honestly makes the case against a machine I own and use daily. I kept it, for reasons that never appear in a TCO model: no rate limits, no per-request thinking, models that stay put, and a place to run things I would not send to an API. Those are real. They are just not "cheaper," and calling them cheaper is how a $3,349 box turns into a line item somebody has to defend at renewal.&lt;/p&gt;

&lt;p&gt;Go pull your own number first. If you run Ollama, your utilization is sitting in &lt;code&gt;~/.ollama/logs/server.log&lt;/code&gt; right now, and it takes one &lt;code&gt;awk&lt;/code&gt; to find out whether you bought a workhorse or a very expensive uptime-monitor endpoint.&lt;/p&gt;

</description>
      <category>aiinfrastructure</category>
      <category>localllm</category>
      <category>cloudcomputing</category>
      <category>aiengineering</category>
    </item>
    <item>
      <title>Your Local LLM Bill Is Per Token. Your Real Cost Is Per Accepted Answer.</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Wed, 05 Aug 2026 20:26:19 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/your-local-llm-bill-is-per-token-your-real-cost-is-per-accepted-answer-1lp6</link>
      <guid>https://dev.to/michaeltuszynski/your-local-llm-bill-is-per-token-your-real-cost-is-per-accepted-answer-1lp6</guid>
      <description>&lt;p&gt;Finance will hand you a per-token comparison. Local inference at some fraction of a cent per thousand tokens, the frontier API at some multiple of that, and a delta that looks like a budget line worth defending. The arithmetic is fine. The denominator is wrong.&lt;/p&gt;

&lt;p&gt;Tokens are a throughput unit. Nobody buys tokens. You buy answers a human is willing to ship, and the ratio between those two things is not a constant — it moves with model size, task class, and how many attempts it takes to land one. The moment you divide by accepted answers instead of tokens, most local-versus-cloud spreadsheets stop saying what they said.&lt;/p&gt;

&lt;p&gt;I priced the numerator side of this last year — &lt;a href="https://www.mpt.solutions/the-hidden-infrastructure-cost-of-running-local-llms-vs-cloud-apis-a-real-world-tco-analysis-for-enterprise-deployments/" rel="noopener noreferrer"&gt;datacenter GPUs, power, cooling, and the DevOps tax of running your own inference&lt;/a&gt;. That post assumed the denominator. This one goes after it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five things the per-token quote silently drops
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Retries.&lt;/strong&gt; A 32B model that gets it right 70% of the time on the first pass costs you 1.43 generations per accepted answer, not 1. Every failed attempt burns the same tokens as a successful one and produces nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalation.&lt;/strong&gt; Some fraction of tasks the local model cannot finish at all. Those tasks pay the local cost &lt;em&gt;and&lt;/em&gt; the frontier cost. If you don't measure that rate, you're carrying it as an invisible surcharge on the cheap path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The review pass.&lt;/strong&gt; This is the big one and it never appears in a token quote. A weaker model shifts work onto a person, and a person costs three to four orders of magnitude more per minute than the accelerator does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idle time.&lt;/strong&gt; Utilization, not throughput, sets unit cost on owned hardware. The box depreciates whether or not anything is in the queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amortization and refresh.&lt;/strong&gt; Per-token framing treats hardware as free after purchase. It isn't. It's a fixed cost divided by however many tokens you actually generate before you replace it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What my own box costs, and how I got there
&lt;/h2&gt;

&lt;p&gt;I run a dedicated inference host: a 64GB M4 Pro Mac mini serving &lt;code&gt;llama3.3:70b&lt;/code&gt;, &lt;code&gt;qwen3.5:27b&lt;/code&gt;, &lt;code&gt;qwen2.5-coder:32b&lt;/code&gt;, and &lt;code&gt;deepseek-r1:32b&lt;/code&gt; through Ollama. Everything below is measured on that machine, and every assumption is on the table so you can redo it with yours.&lt;/p&gt;

&lt;p&gt;Assumptions: $2,000 acquisition, 36-month refresh window, roughly 10W idle and 45W under sustained generation at the wall, about 8 output tokens per second on the 70B at 4-bit quantization. Electricity at $0.31/kWh — that's the rate used in &lt;a href="https://towardsdatascience.com/how-much-does-a-local-llm-actually-cost-to-run-i-measured-every-watt-on-apple-silicon/" rel="noopener noreferrer"&gt;a good watt-by-watt measurement of Apple silicon inference&lt;/a&gt;, which also priced per million &lt;em&gt;output&lt;/em&gt; tokens and then re-ran the numbers against 30 days of real traffic rather than benchmark loops. Substitute your utility rate.&lt;/p&gt;

&lt;p&gt;At my actual duty cycle — about 90 minutes a day of real generation, 45 hours a month:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amortization: $2,000 ÷ 36 = &lt;strong&gt;$55.56/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Power: 2.03 kWh generating + 6.75 kWh idling = 8.78 kWh = &lt;strong&gt;$2.72/month&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Output: 45h × 3600s × 8 tok/s = &lt;strong&gt;1.296M tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;≈ $45 per million output tokens&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now saturate the same box. 24/7 generation, 720 hours, 20.7M tokens, $10.04 of electricity. Same amortization, same tokens per second, same model weights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;≈ $3.17 per million output tokens.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fourteen-fold swing in unit cost with zero change in hardware or performance. The variable was utilization. This is why an H100 cluster and a Mac mini can both be "cheap per token" on a slide and neither number survives contact with a real request pattern — the cluster amortizes a far larger fixed cost and needs far higher sustained load to get there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The formula to bring to the meeting
&lt;/h2&gt;

&lt;p&gt;Cost per accepted answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPAA = (A × t_l × c_l) + (e × t_f × c_f) + (m ÷ 60 × W)

A   = attempts per accepted answer (1 ÷ first-pass acceptance rate)
t_l = output tokens per local attempt
c_l = your local cost per token (amortization + power ÷ tokens actually generated)
e   = escalation rate to a frontier model
t_f = output tokens on the escalated call
c_f = frontier rate per token (your rate card)
m   = human review minutes per accepted answer
W   = loaded hourly cost of the reviewer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worked, with my $45/M and plausible task numbers. A = 1.4, t_l = 900 tokens, e = 0.15, m = 4 minutes, W = $120/hour loaded. For c_f I'll use a $15/M output placeholder — plug in whatever your contract says.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local tokens: 1.4 × 900 × $0.000045 = &lt;strong&gt;$0.057&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Escalation: 0.15 × 900 × $0.000015 = &lt;strong&gt;$0.002&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Human review: 4 ÷ 60 × $120 = &lt;strong&gt;$8.00&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;$8.06 per accepted answer.&lt;/strong&gt; The token lines are 0.7% of it.&lt;/p&gt;

&lt;p&gt;Run the same task class entirely on the frontier model. Acceptance goes up, so A drops to 1.15, e goes to zero, and review drops to 2.5 minutes: $0.016 in tokens plus $5.00 in review. &lt;strong&gt;$5.02.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The local box wins the token comparison by about six cents and loses the decision by three dollars. Ninety seconds of extra review per answer is worth roughly fifty times the entire per-token delta at my volumes.&lt;/p&gt;

&lt;p&gt;The honest counterargument: &lt;code&gt;m&lt;/code&gt; is not fixed. On narrow, well-bounded work — commit message drafting, log triage, structured extraction against a fixed schema — a 32B coder model produces output a reviewer skims rather than audits, and &lt;code&gt;m&lt;/code&gt; is identical on both paths. When that's true the local box wins outright and the math is not close. My point isn't that local always loses. It's that the term deciding the outcome is one nobody measures, and the term everybody argues about rounds to noise.&lt;/p&gt;

&lt;p&gt;Measure &lt;code&gt;m&lt;/code&gt;. Measure &lt;code&gt;A&lt;/code&gt;. Measure &lt;code&gt;e&lt;/code&gt;. Then argue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep escalation a config line, not a rewrite
&lt;/h2&gt;

&lt;p&gt;None of this is measurable if the model choice is compiled into your application. You need the router in front, and the routing decision has to be data.&lt;/p&gt;

&lt;p&gt;That's the pattern in &lt;a href="https://github.com/michaeltuszynski/inference-router" rel="noopener noreferrer"&gt;inference-router&lt;/a&gt; — an OpenAI-compatible layer that sits between the app and both backends, so which model serves which task class is a config change and every escalation is a countable event. Point the app at one endpoint. Move a task class from &lt;code&gt;qwen2.5-coder:32b&lt;/code&gt; to a frontier model by editing a file, watch CPAA, move it back if the review time didn't drop.&lt;/p&gt;

&lt;p&gt;Without that, &lt;code&gt;e&lt;/code&gt; is unknowable and you're arguing from vibes. With it, escalation rate is a metric you can put on a dashboard next to acceptance rate, and the local-versus-cloud question becomes a per-task-class answer instead of a religious one.&lt;/p&gt;

&lt;p&gt;While you're in there, cap output length. &lt;a href="https://pub.towardsai.net/how-i-cut-my-llm-costs-by-80-without-sacrificing-quality-85f8505eec96" rel="noopener noreferrer"&gt;One team traced a large share of their bill to uncontrolled, conversational output tokens&lt;/a&gt; — verbose responses cost the same whether the extra tokens help or not, and on owned hardware they cost you queue time too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buy local for the reasons that hold up
&lt;/h2&gt;

&lt;p&gt;There are three defensible reasons to run inference on hardware you own: you need the data to never leave your boundary, you need latency a network round trip can't give you, or you need to keep serving when a vendor changes a model version out from under you. All three are real, and none of them require the token math to work out in your favor.&lt;/p&gt;

&lt;p&gt;"It's cheaper per token" is not on that list. It's the claim finance will test first and the one most likely to fall apart, because it's the only one that depends on a denominator nobody is tracking.&lt;/p&gt;

&lt;p&gt;My mini pays for itself on data residency. At $45 per million output tokens and a 4% duty cycle, it does not pay for itself on price, and I'd rather say that out loud than have someone else find it in a spreadsheet.&lt;/p&gt;

</description>
      <category>aiengineering</category>
      <category>llminfrastructure</category>
      <category>costoptimization</category>
      <category>platformengineering</category>
    </item>
    <item>
      <title>The 26% Who Never Rolled Back an Agent Aren't Winning</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Wed, 29 Jul 2026 00:00:48 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/the-26-who-never-rolled-back-an-agent-arent-winning-2dj1</link>
      <guid>https://dev.to/michaeltuszynski/the-26-who-never-rolled-back-an-agent-arent-winning-2dj1</guid>
      <description>&lt;p&gt;Somewhere right now there's a slide in a board deck claiming a clean record: zero agent rollbacks since launch. It reads like a win. It's closer to a smoke detector with the battery pulled out.&lt;/p&gt;

&lt;p&gt;New survey data from Sinch puts the number at &lt;a href="https://sinch.com/news/sinch-releases-ai-production-paradox/" rel="noopener noreferrer"&gt;74% of enterprises that have rolled back a deployed AI agent&lt;/a&gt; after it went live — customer-communications agents specifically, pulled over governance failures. That figure got picked up everywhere as an indictment — three out of four agent deployments blowing up in production. But the interesting number is the one underneath it. Among organizations with the most mature guardrails, the rollback rate goes &lt;strong&gt;up&lt;/strong&gt;, to 81%.&lt;/p&gt;

&lt;p&gt;Read that again. Better safety infrastructure correlates with &lt;em&gt;more&lt;/em&gt; rollbacks, not fewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rollback rate measures your eyes, not your agent
&lt;/h2&gt;

&lt;p&gt;There's only one clean way to explain that inversion. The teams with better instrumentation aren't shipping worse agents. They're catching things the other teams are shipping past.&lt;/p&gt;

&lt;p&gt;Every agent in production is doing something wrong at some rate. Hallucinated policy details, tool calls against stale records, a tone that drifts on the eighth turn of an angry conversation, a refusal loop that pushes a customer to a human queue that's already 40 deep. The question was never whether the failure exists. It's whether anything in your stack notices it before your customer does.&lt;/p&gt;

&lt;p&gt;So the 26% split into two very different groups. A small number genuinely nailed scope — narrow task, tight tool surface, a human approving anything consequential. The rest have no detector. Their agent is failing at whatever the base rate is, silently, and the absence of a rollback is being reported upward as quality.&lt;/p&gt;

&lt;p&gt;SRE teams learned this lesson two decades ago and it stuck: an incident count is a function of your monitoring, not your reliability. A team that goes from 3 incidents a quarter to 30 after installing real alerting did not get 10x worse. They got 10x more honest. It's the same principle the write-ups on this data keep circling — &lt;a href="https://medium.com/@ripenapps-technologies/why-74-of-enterprises-are-rolling-back-ai-agents-after-launch-738b15a213a3" rel="noopener noreferrer"&gt;the model rarely breaks, the infrastructure around it buckles&lt;/a&gt;. Which means model choice isn't what separates the 26% from everyone else.&lt;/p&gt;

&lt;p&gt;Treating rollback rate as a failure metric creates the exact incentive you don't want. A VP who gets graded on rollbacks will not build better agents. They'll build quieter ones — loosen the eval thresholds, downgrade the alert to a weekly digest, route the complaint channel to a shared inbox nobody owns. The metric improves. The agent doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The guardrail tax nobody budgeted for
&lt;/h2&gt;

&lt;p&gt;The second number in that survey is the one that should reset your staffing plan. &lt;a href="https://sinch.com/news/sinch-releases-ai-production-paradox/" rel="noopener noreferrer"&gt;84% of AI engineering teams spend at least half their time on safety infrastructure&lt;/a&gt; rather than on the agent itself. And enterprise investment now skews toward trust, security, and compliance (76%) over AI development proper (63%).&lt;/p&gt;

&lt;p&gt;That's not overhead creeping in at the edges. That's the majority of the work.&lt;/p&gt;

&lt;p&gt;It also matches what production looks like. The agent is a prompt, a model call, and a tool list — a week of work for a competent engineer. The other eleven weeks go to the eval set, the PII redaction layer, the escalation path, the audit log that survives a compliance review, the shadow-mode comparison, the per-version rollback switch, and the on-call rotation that owns all of it at 2 a.m.&lt;/p&gt;

&lt;p&gt;Microsoft's 2026 Work Trend Index frames the organizational side of this as a capacity question — &lt;a href="https://www.microsoft.com/en-us/worklab/work-trend-index/agents-human-agency-and-the-opportunity-for-every-organization" rel="noopener noreferrer"&gt;whether organizations are built to capture&lt;/a&gt; the agency that agents free up. Most aren't, and the guardrail tax is a good part of why. The headcount that was supposed to move up the value chain is instead maintaining the machinery that keeps the agent honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who paid for this, and what it actually covers
&lt;/h2&gt;

&lt;p&gt;Now the part the LinkedIn reposts skipped.&lt;/p&gt;

&lt;p&gt;Sinch is a CPaaS vendor. They sell customer-communications infrastructure. A survey they sponsored concluding that &lt;em&gt;infrastructure quality predicts agent success&lt;/em&gt; is a survey concluding that you should buy more of what Sinch sells. That doesn't make the data wrong, but it does mean the framing was chosen before the responses came in.&lt;/p&gt;

&lt;p&gt;The scope is narrower than the headline suggests, too. This is customer-communications agents — support, messaging, conversational flows. Not coding agents, not internal RAG assistants, not the finance-ops bot reconciling invoices. A customer-facing agent has an unusually loud failure mode: the customer complains, and the complaint is logged in a system somebody already reads. Detection is close to free. In a domain where the agent's mistakes land quietly in a document nobody re-reads for six weeks, the 26% number would almost certainly be higher — and mean even less.&lt;/p&gt;

&lt;p&gt;Hold the core finding anyway. The correlation between guardrail maturity and rollback frequency is directionally strong enough to survive the sponsorship discount, because it points the &lt;em&gt;opposite&lt;/em&gt; direction from the sponsor's simplest sales pitch. "Buy our stuff and you'll roll back more often" isn't a slogan anyone reverse-engineers into a survey.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instrument the rollback, then go trigger one
&lt;/h2&gt;

&lt;p&gt;Stop reporting rollback count. Start reporting rollback &lt;em&gt;provenance&lt;/em&gt;. One row per deployed agent version, and the field that matters is who noticed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;release_id&lt;/span&gt;      &lt;span class="err"&gt;agent-support-v14&lt;/span&gt;
&lt;span class="err"&gt;model&lt;/span&gt;           &lt;span class="err"&gt;claude-sonnet-5&lt;/span&gt;
&lt;span class="err"&gt;prompt_sha&lt;/span&gt;      &lt;span class="err"&gt;a91f3c2&lt;/span&gt;
&lt;span class="err"&gt;tools_sha&lt;/span&gt;       &lt;span class="err"&gt;7de0b41&lt;/span&gt;
&lt;span class="err"&gt;deployed_at&lt;/span&gt;     &lt;span class="py"&gt;2026-07-14T09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;12Z&lt;/span&gt;
&lt;span class="err"&gt;rolled_back_at&lt;/span&gt;  &lt;span class="py"&gt;2026-07-16T23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;41Z&lt;/span&gt;
&lt;span class="err"&gt;detector&lt;/span&gt;        &lt;span class="err"&gt;eval_regression&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;slo_breach&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;abuse_signal&lt;/span&gt;
                &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;agent_self_report&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;human_complaint&lt;/span&gt;
&lt;span class="err"&gt;time_to_detect&lt;/span&gt;  &lt;span class="err"&gt;3410&lt;/span&gt; &lt;span class="err"&gt;minutes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now run the distribution on &lt;code&gt;detector&lt;/code&gt;. If 80% of your rollbacks say &lt;code&gt;human_complaint&lt;/code&gt;, your detection layer is your customers, and your &lt;code&gt;time_to_detect&lt;/code&gt; is however long it takes an annoyed person to find the contact form. Whatever that interval turns out to be in your own data, multiply it by your conversation volume — that's how many exchanges you can't un-send.&lt;/p&gt;

&lt;p&gt;Three things follow from that ledger.&lt;/p&gt;

&lt;p&gt;Set a target on time-to-detect, not on rollback count. An hour is achievable with automated eval replay on a sampled slice of live traffic. Days is what you get when complaint volume is the detector.&lt;/p&gt;

&lt;p&gt;If you've never rolled back, go cause one. Inject a deliberately degraded prompt into a canary slice — drop a rule from the system prompt, or point a tool at a stale index — and time how long your stack takes to flag it. A rollback path that has never been exercised is a hypothesis, not a control. Same logic as restoring from backup: nobody has a backup, they have a restore they've tested or a file they hope is fine.&lt;/p&gt;

&lt;p&gt;And when a vendor pitches you an agent, ask how many times they've rolled back their own. A confident zero means they aren't looking. The right answer sounds like "four times last quarter, median detection 22 minutes, here's the ledger."&lt;/p&gt;

&lt;p&gt;The 81% cohort isn't failing more often. They're the only ones who can prove what their agent did last Tuesday at 3 a.m.&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>aiengineering</category>
      <category>observability</category>
      <category>enterpriseai</category>
    </item>
    <item>
      <title>AI Use Is a 50/50 Coin Flip. Coding Already Tipped 61% Autonomous.</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Thu, 23 Jul 2026 20:08:27 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/ai-use-is-a-5050-coin-flip-coding-already-tipped-61-autonomous-525h</link>
      <guid>https://dev.to/michaeltuszynski/ai-use-is-a-5050-coin-flip-coding-already-tipped-61-autonomous-525h</guid>
      <description>&lt;h2&gt;
  
  
  The Copilot Framing Is Already the Minority Report
&lt;/h2&gt;

&lt;p&gt;Every vendor deck for a coding tool sells you the same picture: a developer in the driver's seat, the AI riding shotgun, a human hand on every merge. Copilot. Human-in-the-loop. Pair programming with a machine. It's the comfortable frame because it keeps the person central and the tool subordinate.&lt;/p&gt;

&lt;p&gt;For software development, that frame already describes the smaller half of what's actually happening.&lt;/p&gt;

&lt;p&gt;Anthropic's &lt;a href="https://www.anthropic.com/economic-index" rel="noopener noreferrer"&gt;Economic Index&lt;/a&gt; publishes real data on how people use Claude, and it tags every conversation one of two ways. Augmentation means the person stays actively in the loop — back and forth, iterating, learning, steering each step. Automation means the person hands off a task and directs Claude to complete it. Across everything, it's nearly a coin flip: 51 percent augmentation, 49 percent automation globally, and a clean 50/50 in the US.&lt;/p&gt;

&lt;p&gt;Narrow to software development tasks and the coin lands differently. 39 percent augmentation, 61 percent automation. The pattern everyone quotes in their pitch is the one coding has already moved past.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Split Actually Measures
&lt;/h2&gt;

&lt;p&gt;Read the label carefully, because it's easy to turn this into something it isn't. Augmentation versus automation is a &lt;strong&gt;conversation style&lt;/strong&gt;, not a jobs claim. It says nothing about displacement, headcount, or whether a role survives. It measures one thing: in a given exchange, is the human collaborating turn by turn, or delegating the whole task?&lt;/p&gt;

&lt;p&gt;That distinction matters because the two styles want different products underneath them. An augmentation session is a dialogue — the tool's job is to be responsive, explain itself, and stay legible while a person drives. An automation session is a delegation — the tool's job is to run to completion and come back with something you can check.&lt;/p&gt;

&lt;p&gt;Most coding tools are still built for the first job. The interface assumes you're watching, approving diffs one at a time, keeping a hand on the wheel. When 61 percent of the actual work is delegation, that assumption is backwards for the majority of what your developers are doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Number That Keeps This Honest
&lt;/h2&gt;

&lt;p&gt;Here's the counter-weight, and it's in the same dataset. Software development is only about 11.5 percent of global Claude requests, and 8.1 percent in the US. Coding is not the center of gravity for how people use these models. It's a slice.&lt;/p&gt;

&lt;p&gt;That cuts against the temptation to read "61 percent automation in coding" as "AI is taking over programming." It isn't taking over anything. It's one task category, and inside that category the delegation style leads. Both things are true, and the small share is the part that keeps the big number from getting oversold.&lt;/p&gt;

&lt;p&gt;One more caveat worth stating plainly: this is a single snapshot from May 2026. No trend line, no trajectory, no "up 12 points from last quarter." One reading. The 61/39 split is a photograph, not a movie. I'd bet the direction of travel is toward more automation as tools get better at running unattended — but that's my read, not something the data shows. Treat it as a fixed point, not a slope.&lt;/p&gt;

&lt;p&gt;And note the seam in the categories: Anthropic reports "Computer and Mathematical" as the number one task category overall, yet software development specifically sits at 11.5 percent. Those aren't in conflict — the top category is broad and covers a lot more than writing application code. But if you conflate them, you'll overstate how much of AI usage is engineers shipping features. Most of it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Buyer Should Do With This
&lt;/h2&gt;

&lt;p&gt;If you're choosing or building a coding agent, design for the automation majority. That's the whole recommendation, and it changes what "good" looks like.&lt;/p&gt;

&lt;p&gt;The copilot default optimizes for a person watching every step. The automation pattern optimizes for a person checking the result. Those need different architecture. I've written before that a &lt;a href="https://www.mpt.solutions/the-coding-agent-stack-has-two-layers/" rel="noopener noreferrer"&gt;coding agent stack has two layers&lt;/a&gt; — the model and the scaffolding around it — and that &lt;a href="https://www.mpt.solutions/the-model-doesnt-matter-the-harness-does/" rel="noopener noreferrer"&gt;the scaffolding decides the outcome&lt;/a&gt; more than the model choice does. This data is why. When 61 percent of real coding work is delegation, the layer that runs the agent unattended and catches its mistakes is doing the heavy lifting, not the chat window.&lt;/p&gt;

&lt;p&gt;Concretely, designing for automation means:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autonomous execution with verification gates, not approval-per-diff.&lt;/strong&gt; The agent should run the task end to end, then hand you a result gated by checks it had to pass — tests green, types clean, lint quiet, a diff that touches only what it claimed. You review the outcome and the evidence, not every keystroke. A human approving line-by-line is the augmentation product, and it doesn't scale to 61 percent of your work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real gates, not vibes.&lt;/strong&gt; The gates are the whole safety story once the human steps back from each step. That means a test suite the agent can't skip, a build it can't merge past when red, and provenance on what changed. If you can't articulate what has to be true before an agent's output reaches main, you haven't built for automation — you've built a faster way to generate unreviewed code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legibility at the boundary, not throughout.&lt;/strong&gt; Augmentation needs the tool legible at every turn. Automation needs it legible at one point: the handoff. Invest your explanation budget there — what did it do, what did it check, what should you look at first.&lt;/p&gt;

&lt;p&gt;The tools that ship copilot-by-default are optimizing for the 39 percent. That's a real 39 percent, and for exploratory work, learning a new codebase, or high-stakes changes where you genuinely want to drive, augmentation is the right mode. Don't rip it out. But if your default interaction model assumes a human hand on every commit, you've built the minority product and called it the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Frame Is Behind the Practice
&lt;/h2&gt;

&lt;p&gt;The interesting gap here isn't between humans and machines. It's between how the industry talks about coding agents and how people actually use them. The marketing still runs on the copilot metaphor — reassuring, human-centered, a decade old. The usage data says developers crossed over to delegation a while ago and mostly stopped narrating it.&lt;/p&gt;

&lt;p&gt;61 percent. That's the number to bring to your next tool evaluation. Ask the vendor what happens after the human stops watching — what runs, what gets checked, what stops a bad change cold. If the answer is "well, you approve each diff," they built for the half that's shrinking.&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>softwaredevelopment</category>
      <category>aiautomation</category>
      <category>developertools</category>
    </item>
    <item>
      <title>The Meter Is Always Running</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Tue, 21 Jul 2026 14:02:11 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/the-meter-is-always-running-1poi</link>
      <guid>https://dev.to/michaeltuszynski/the-meter-is-always-running-1poi</guid>
      <description>&lt;h1&gt;
  
  
  The Meter Is Always Running
&lt;/h1&gt;

&lt;p&gt;For forty years, enterprise software rested on a comfortable assumption: that it was a fixed cost. You paid a license, amortized it over a depreciation schedule, and every unit of value you squeezed out afterward felt like it was approaching free. Seats, not usage. Capex, not cost of goods. A CFO could draw a straight line from spend to return and sleep at night.&lt;/p&gt;

&lt;p&gt;AI breaks that line. Most organizations adopted it without noticing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing that actually changed
&lt;/h2&gt;

&lt;p&gt;The interesting shift in enterprise AI is not cloud versus on-premises. That is a deployment question, and deployment questions are the kind of thing infrastructure teams have solved a hundred times. The deeper shift is quieter: software stopped being a fixed cost and became a variable one.&lt;/p&gt;

&lt;p&gt;A large language model does not bill like a license. It bills like a taxi. The meter runs on every token, upstream and downstream, and &lt;a href="https://www.silicondata.com/blog/llm-cost-per-token" rel="noopener noreferrer"&gt;input and output are priced per million tokens&lt;/a&gt; at rates that differ by model and by direction. The fare depends on how long the conversation ran, how much reasoning it demanded, how many times a user hit retry. Two customers doing the "same" task can cost 10x different amounts because one of them pasted a novel into the prompt. There is no seat count that caps it. There is no version you buy once and freeze. The cost scales with success: the more people use the feature, the more it costs you to have built it.&lt;/p&gt;

&lt;p&gt;That is a new financial object, and the mental model most companies applied to it, SaaS licensing or depreciable capital, is the wrong shape. You cannot amortize a variable cost. You can only manage it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The on-prem mirage
&lt;/h2&gt;

&lt;p&gt;The popular rebuttal goes like this: just run it yourself. Buy the hardware once, own it forever, and your marginal cost per query approaches zero. Convert the scary variable cost back into a familiar fixed one.&lt;/p&gt;

&lt;p&gt;It is a seductive move, and it is mostly wrong.&lt;/p&gt;

&lt;p&gt;The "own it forever" asset is not the GPU. It is the model, and the model is spoiling in real time. The cluster you justified this year runs a frontier model that will be mid-tier in twelve months. The hardware ages too: how long an AI accelerator stays economically useful &lt;a href="https://www.cnbc.com/2025/11/14/ai-gpu-depreciation-coreweave-nvidia-michael-burry.html" rel="noopener noreferrer"&gt;is now an open argument on Wall Street&lt;/a&gt;, with investors questioning whether the six-year depreciation schedules on the books match a reality where a new generation lands every eighteen months. You did not buy a depreciable asset amortized over seven years. You bought a seat on a refresh treadmill, plus a standing bill for power, cooling, and the engineers who keep it fed.&lt;/p&gt;

&lt;p&gt;And unlike the cloud meter, that silicon costs the same whether it runs at 90% load or 5%. Idle capacity is the norm, not the exception: it is common for &lt;a href="https://www.devzero.io/blog/why-your-gpu-cluster-is-idle" rel="noopener noreferrer"&gt;GPU clusters to sit 70 to 80% idle&lt;/a&gt; between bursts of real work. You did not eliminate the variable cost. You traded a usage-based meter for a utilization risk, and for most enterprises, whose demand is spiky rather than steady, that is the worse trade.&lt;/p&gt;

&lt;p&gt;Marginal-cost-to-zero is real, but only at high, sustained load on a model you are content to keep running. That describes a narrow band of workloads. It does not describe "our AI strategy."&lt;/p&gt;

&lt;h2&gt;
  
  
  Inference is cost of goods, not capex
&lt;/h2&gt;

&lt;p&gt;Here is the reframe that survives contact with a spreadsheet: inference is cost of goods sold.&lt;/p&gt;

&lt;p&gt;Not a license you buy. Not a machine you depreciate. It is a per-transaction input cost, like the cloud compute behind a web request or the fee on a card payment. Companies already know how to run a business where serving each customer costs money. They have gross-margin discipline, unit economics, dashboards that flag when a product line goes underwater. They simply never had to apply that discipline to &lt;em&gt;software features&lt;/em&gt; before, because software features used to be free to serve once written.&lt;/p&gt;

&lt;p&gt;File inference under cost of goods instead of "IT capex," and the right behaviors fall out on their own. You start asking the questions a margin-conscious operator always asks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that discipline looks like
&lt;/h2&gt;

&lt;p&gt;Know your unit cost per feature. If you cannot say what a single run costs, you are blind on the one number that decides whether the feature is a business or a liability. Instrument tokens the way you already instrument latency.&lt;/p&gt;

&lt;p&gt;Then route by need. Most requests do not warrant a frontier model; send the cheap, frequent, predictable work to smaller or local models and reserve the expensive reasoning for the calls that actually earn it. A good router is worth more than a bigger model.&lt;/p&gt;

&lt;p&gt;Cache aggressively. Repeated system prompts, retrieved context, common answers: every hit is a fare you skip. Anthropic reports that &lt;a href="https://www.anthropic.com/news/prompt-caching" rel="noopener noreferrer"&gt;prompt caching can cut input costs by up to 90%&lt;/a&gt; and latency along with it. Caching is not a nice-to-have optimization here. It is margin.&lt;/p&gt;

&lt;p&gt;Put a ceiling on it. Variable cost without guardrails is how one looping agent turns into a five-figure surprise. Budget caps, rate limits, and per-tenant quotas are the circuit breaker. Build them before the invoice, not after.&lt;/p&gt;

&lt;p&gt;And decide placement per workload, not per company. Some things belong on a local model you own; some belong on a metered API. "Cloud-first" and "on-prem-first" are both the wrong altitude. The unit is the workload, and the answer is a portfolio.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reckoning is real. It is not the one on the thumbnail.
&lt;/h2&gt;

&lt;p&gt;A reckoning is coming for a lot of AI initiatives, but it will not arrive as the dramatic collapse of anyone's cloud strategy. It will arrive as a quiet quarterly review where someone finally divides the AI line item by the number of customers it served and does not like the answer. The projects that survive that meeting will not be the ones that picked the right deployment location. They will be the ones that treated inference as what it is, a variable operating cost with no natural ceiling, and built the discipline to manage it from the first day.&lt;/p&gt;

&lt;p&gt;The meter was always running. The only question is whether you were watching it.&lt;/p&gt;

</description>
      <category>aieconomics</category>
      <category>enterpriseai</category>
      <category>cloudstrategy</category>
      <category>aiinfrastructure</category>
    </item>
    <item>
      <title>Your AI Coding Pilot Cost $80K and Shipped 9% Faster. Here's the Line Item Finance Missed.</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Mon, 20 Jul 2026 14:07:50 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/your-ai-coding-pilot-cost-80k-and-shipped-9-faster-heres-the-line-item-finance-missed-4hlb</link>
      <guid>https://dev.to/michaeltuszynski/your-ai-coding-pilot-cost-80k-and-shipped-9-faster-heres-the-line-item-finance-missed-4hlb</guid>
      <description>&lt;p&gt;The slide always looks the same. Pilot spend: $80K. Velocity: up 9%. Recommendation: expand to the full org. I have sat through enough of these readouts, on both sides of the table, to recite the speaker notes from memory. The room approves it, because $80K buying a 9% faster engineering org of any size is obviously a deal.&lt;/p&gt;

&lt;p&gt;The math on the slide is fine. The problem is a line item that never made it onto the slide, and it is the most expensive input in the building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the $80K Went
&lt;/h2&gt;

&lt;p&gt;Run the composite pilot. Fifty seats of an AI coding assistant at roughly $20 a head is about $12K a year. Agent and API tokens for the teams that went past autocomplete, call it $3K a month once real workloads land — &lt;a href="https://www.mpt.solutions/what-my-ai-workflow-actually-costs-per-month/" rel="noopener noreferrer"&gt;I've published my own bill, so I know what this curve looks like&lt;/a&gt;. Add the integration sprint, the eval work, and the enablement time nobody bills to the pilot, and $80K is a fair all-in number for a mid-size org's first serious year.&lt;/p&gt;

&lt;p&gt;Every dollar of that is metered, invoiced, and visible. Seats show up on a purchase order. Tokens show up on a usage dashboard. Finance can read the pilot's cost to the penny, which is exactly why the readout feels rigorous.&lt;/p&gt;

&lt;p&gt;Now the return side. A 9% velocity gain across a 12-engineer group is roughly one extra engineer's worth of throughput, and &lt;a href="https://www.mpt.solutions/an-engineer-costs-250k-their-tokens-cost-20k-that-math-is-a-trap/" rel="noopener noreferrer"&gt;a loaded engineer runs $250K, which is the number that dwarfs every token bill in sight&lt;/a&gt;. So the slide implies $80K bought about $270K of capacity. A 3.4x return, approved before the coffee gets cold.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Line Item That Never Shows Up
&lt;/h2&gt;

&lt;p&gt;Here is what the slide does not carry: the review and verification attention the pilot consumed, priced at senior-engineer rates.&lt;/p&gt;

&lt;p&gt;AI-assisted pull requests change shape. Diffs get bigger. Volume goes up. And the failure mode shifts from obviously-broken to plausible-but-wrong, which is the expensive kind, because &lt;a href="https://www.mpt.solutions/babysitter-auditor-prayer-or-tests/" rel="noopener noreferrer"&gt;plausible-but-wrong has to be caught by a human who understands the system&lt;/a&gt;. Suppose each engineer ships five AI-assisted PRs a week and each one takes a reviewer just twenty extra minutes. Across 12 engineers that is 20 hours a week of review time, half a full-time engineer, roughly $125K a year. And it does not land evenly: it lands on the two or three senior people qualified to catch the plausible-but-wrong category, &lt;a href="https://www.mpt.solutions/attention-is-the-new-bottleneck-engineer-it-like-one/" rel="noopener noreferrer"&gt;the same scarce attention that was already the bottleneck&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Take the $270K gain, subtract $80K in tool spend and $125K in unpriced senior attention, and the triumphant 3.4x collapses to about 1.2x, before counting rework. That might still be worth doing. But nobody in the room approved &lt;em&gt;that&lt;/em&gt; deal, because nobody saw it.&lt;/p&gt;

&lt;p&gt;The reason nobody saw it is structural, and it is worth saying plainly: &lt;strong&gt;finance manages what is metered.&lt;/strong&gt; Seats and tokens arrive as invoices. Attention arrives as nothing at all. It is smeared invisibly across a salary line that looks identical whether your seniors spent the quarter building or spent it correcting a machine's confident guesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Evidence Says the Slide Flatters Itself
&lt;/h2&gt;

&lt;p&gt;The 9% is usually self-reported or lightly measured, and self-report runs hot. In &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;METR's randomized study of experienced open-source developers&lt;/a&gt;, participants estimated AI made them 20% faster while the measured result was 19% &lt;em&gt;slower&lt;/em&gt;. The perception gap is the mechanism that hides the missing line item: the tool feels fast because typing is fast, while the slow part — verifying, correcting, re-prompting — doesn't register as "using the tool."&lt;/p&gt;

&lt;p&gt;The vendor numbers run hotter still. &lt;a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/" rel="noopener noreferrer"&gt;GitHub's own study reported 55% faster task completion&lt;/a&gt;, a first-party figure measured on a greenfield toy task, and it should be discounted accordingly. Meanwhile &lt;a href="https://dora.dev/ai/gen-ai-report/" rel="noopener noreferrer"&gt;DORA's research keeps finding the bill on the other side of the ledger: as AI adoption rises, software delivery stability dips&lt;/a&gt;. Faster generation, wobblier delivery. That wobble is rework, and rework is more senior attention, unpriced.&lt;/p&gt;

&lt;p&gt;To be fair to the other side of the argument: METR's result is one population on one kind of task, not a universal law, and pilots built on scoped tasks with an explicit verification budget genuinely do clear the honest bar. The point is narrower and harder to dodge. A pilot that measured only what was invoiced has not measured its return. It has measured its receipts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five-Line Version
&lt;/h2&gt;

&lt;p&gt;The fix costs nothing but honesty. Here is the pilot P&amp;amp;L with all the lines on it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI coding pilot P&amp;amp;L

+ Velocity delta
    measured (cycle time,
    merged scope), never
    surveyed
- Seats + tokens
    the invoice (the only
    line the readout had)
- Review-hours delta
    PR review time before
    vs. during, x reviewer
    cost
- Rework delta
    change-failure/rollback
    rate, before vs. during
- Comprehension debt
    merged code nobody on
    the team can explain, %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first two lines exist in every pilot. The last three exist in almost none, and they are all measurable with tooling you already run: your git host timestamps every review, your incident tracker already counts rollbacks, and the comprehension question takes one uncomfortable team meeting.&lt;/p&gt;

&lt;p&gt;If the pilot still clears the bar with five lines on the page, expand it with confidence — mine does, and that's precisely why &lt;a href="https://www.mpt.solutions/where-your-20k-in-tokens-actually-goes/" rel="noopener noreferrer"&gt;I keep publishing the full bill instead of the flattering half&lt;/a&gt;. A tool that survives honest accounting is a tool worth scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask for the Line
&lt;/h2&gt;

&lt;p&gt;The 9% on the slide is neither a lie nor a result. It is an unfinished calculation, presented with the confidence of a finished one, to a room that is being asked to multiply it by the whole org.&lt;/p&gt;

&lt;p&gt;So ask the one question that finishes it: show me the review-hours delta. If the answer is a number, you are looking at a rare, well-run pilot, and you should probably fund it. If the answer is a pause, then the 9% was never a measurement. It was a survey wearing one, and the most expensive people in the building are quietly paying the difference.&lt;/p&gt;

</description>
      <category>aiengineering</category>
      <category>engineeringleadership</category>
      <category>developerproductivity</category>
      <category>softwaredelivery</category>
    </item>
    <item>
      <title>The Bubble Popper and the Payoff Are the Same Thing</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Thu, 16 Jul 2026 23:59:00 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/the-bubble-popper-and-the-payoff-are-the-same-thing-fk5</link>
      <guid>https://dev.to/michaeltuszynski/the-bubble-popper-and-the-payoff-are-the-same-thing-fk5</guid>
      <description>&lt;p&gt;Cory Doctorow thinks AI is a bubble, and he argues it better than almost anyone who cheers him on. In &lt;a href="https://pluralistic.net/2025/12/05/pop-that-bubble/" rel="noopener noreferrer"&gt;his December speech at the University of Washington&lt;/a&gt;, the case runs like this: the tech giants stopped growing years ago, and a company priced as a growth stock faces catastrophe the moment the market stops believing. So they pump whatever keeps the multiple alive. Pivot to video, crypto, NFTs, Metaverse, now AI, each pitched with the same conviction, each abandoned when the next vehicle arrives. "Superintelligence" is the pitch this cycle because science fiction makes a better P/E story than enterprise software ever did.&lt;/p&gt;

&lt;p&gt;His sharpest tool is the reverse centaur. A centaur is a human assisted by a machine: you drive the car, the car amplifies you. A reverse centaur is a human bolted onto a machine as its peripheral, hired to absorb the failures the machine can't, at machine pace, under machine supervision. Doctorow's thesis is that the money behind AI is betting on reverse centaurs: workers demoted into error-cleanup for systems sold to their bosses as replacements.&lt;/p&gt;

&lt;p&gt;Take him seriously. The losses are real, the incentives he names are real, and I have sat through enough board-mandated AI pilots to know the reverse centaur is not a hypothetical. And then notice that his argument, stated carefully, is about two different balance sheets that the doom discourse keeps smearing into one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Balance Sheets, One Shouting Match
&lt;/h2&gt;

&lt;p&gt;Seller economics asks whether the labs make money. Company-level losses are enormous, but look at where they live: training runs, data-center capex, sales, and the free tier. The serving unit underneath is a different story. &lt;a href="https://newsletter.semianalysis.com/p/anthropic-3q26-profit-over-1b-the" rel="noopener noreferrer"&gt;SemiAnalysis puts Anthropic's gross margins in the mid-60s&lt;/a&gt; — an independent analyst number, though &lt;a href="https://www.theinformation.com/articles/anthropic-lowers-profit-margin-projection-revenue-skyrockets" rel="noopener noreferrer"&gt;The Information reported the same company projecting 40% when inference costs spiked&lt;/a&gt;, so treat the exact figure as contested. The direction is not. &lt;a href="https://www.seangoedecke.com/ai-inference-is-obviously-profitable/" rel="noopener noreferrer"&gt;Serving paid tokens is gross-margin-positive&lt;/a&gt;; what bleeds is everything wrapped around it.&lt;/p&gt;

&lt;p&gt;Even the famous counterexample proves the shape. When Sam Altman admitted &lt;a href="https://x.com/sama/status/1876104315296968813" rel="noopener noreferrer"&gt;OpenAI loses money on the $200 Pro plan&lt;/a&gt;, the reason was that heavy users outran the flat price. Sell unbounded agent workloads at a fixed monthly fee and the top of the usage tail eats you. That is a pricing-model problem, and pricing models get fixed. Physics problems don't. This one is being fixed right now, mostly at the expense of people like me: usage caps, tier splits, metered agents.&lt;/p&gt;

&lt;p&gt;Buyer economics asks a different question: does a scoped deployment pay for itself? That is where operators live, and none of the training-run losses show up on this side of the table. &lt;a href="https://www.mpt.solutions/what-my-ai-workflow-actually-costs-per-month/" rel="noopener noreferrer"&gt;I've written down what my own stack costs per month&lt;/a&gt;, and &lt;a href="https://www.mpt.solutions/an-engineer-costs-250k-their-tokens-cost-20k-that-math-is-a-trap/" rel="noopener noreferrer"&gt;why "$20K in tokens against a $250K engineer" is the wrong math even when it flatters the tools&lt;/a&gt;. A deployment either produces measured value over measured cost or it doesn't. The lab's income statement has nothing to do with it.&lt;/p&gt;

&lt;p&gt;Doctorow is right about the first balance sheet. The mistake is letting the first one answer for the second.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Question That Does All the Work
&lt;/h2&gt;

&lt;p&gt;Here is my actual thesis, earned from reps rather than from a valuation model: the economics work themselves out, but only for operators disciplined enough to ask "what problem am I solving" before pointing the tool at anything, and rigorous enough to measure the answer afterward.&lt;/p&gt;

&lt;p&gt;An efficiency you don't understand is not an efficiency. It is an unmeasured cost wearing a demo. The team that deploys a coding agent with no baseline, no success metric, and no owner has not automated anything; it has hired a very fast intern nobody supervises and booked the salary as savings. That is blind deployment, and blind deployment is exactly the reverse-centaur failure: the humans end up serving the machine's output because nobody defined what the machine was for.&lt;/p&gt;

&lt;p&gt;Which means my thesis and Doctorow's frame are the same observation read from opposite ends. Scoping rigor is what makes you a centaur instead of a reverse one. The human who decides what the machine is for stays the head. The human who cleans up after an unscoped machine becomes the peripheral.&lt;/p&gt;

&lt;p&gt;The scoping questions I use, written down (writing them down matters, and the last section says why):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. What is the problem, stated without naming a tool?
2. What does it cost today, in hours or dollars I can point at?
3. What does "working" look like, measured how, by whom?
4. What is the failure mode, and who catches it?
5. What is the kill criterion, decided before the pilot starts?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Payoff and the Pin Are the Same Force
&lt;/h2&gt;

&lt;p&gt;Now the part I have not seen anyone say plainly: the rigor that makes AI pay off is the same force that pops the bubble.&lt;/p&gt;

&lt;p&gt;Walk through what happens if scoping discipline actually spreads. Every FOMO seat license gets audited against question 2, and half of them fail. Every board-mandated pilot meets question 3 and dies for lack of a metric. The all-you-can-eat experimentation budgets get metered. A real slice of today's AI revenue is hype-spend, and disciplined buyers stop paying for hype. Revenue evaporates precisely as deployments get better.&lt;/p&gt;

&lt;p&gt;That is not bearish on AI. It is bearish on the bubble, and those are different positions. It is Doctorow's own &lt;a href="https://pluralistic.net/2025/12/05/pop-that-bubble/" rel="noopener noreferrer"&gt;"some bubbles leave behind something productive"&lt;/a&gt; scenario made concrete. He reaches for Worldcom, a fraud whose CEO died in prison while the dark fiber it buried still carries Doctorow's 2-gigabit home connection. Swap the fiber for scoped deployments quietly compounding inside businesses while the FOMO spend burns off. The economics working out and the bubble deflating are the same event, narrated by an optimist and a pessimist.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Craftsman Clause
&lt;/h2&gt;

&lt;p&gt;There is an investor-side implication buried in this that is more uncomfortable than any crash prediction.&lt;/p&gt;

&lt;p&gt;If every deployment that pays needs a human who understands both the domain and the tool's failure modes, then AI is not the frictionless labor replacement the trillion-dollar valuations are priced on. It is a power tool that still needs a craftsman. A nail gun does not fire the carpenter; it makes the carpenter's judgment the binding constraint on every house. &lt;a href="https://www.mpt.solutions/attention-is-the-new-bottleneck-engineer-it-like-one/" rel="noopener noreferrer"&gt;Attention was always the bottleneck&lt;/a&gt;; the tools just moved it.&lt;/p&gt;

&lt;p&gt;Great news for buyer ROI. Quietly fatal for the "human exits the loop" story being sold upstream, because the wholesale-replacement bet only pays if the craftsman requirement goes away, and every honest deployment I have run or reviewed says it doesn't. The augmentation bet keeps cashing small checks. The replacement bet keeps pre-spending checks nobody has figured out how to write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Half-Lives, One Fork
&lt;/h2&gt;

&lt;p&gt;So if the scarce input is the human who can scope, the personal question is what that scarcity is worth and how long it lasts.&lt;/p&gt;

&lt;p&gt;The scoping skill is teachable in principle and bottlenecked in practice, and the bottleneck is structural, not a fad. The skill is tacit. It lives on the seam between a domain and a tool, where few people sit. And organizations promote people for shipping, not for the scoping that made the shipping cheap; nobody's OKRs reward the pilot that didn't happen.&lt;/p&gt;

&lt;p&gt;But the edge has two halves with opposite half-lives, and confusing them is the trap. Tool mechanics — prompt-craft, knowing this month's model's failure modes, the tricks — depreciates fast, because every model release is the labs folding exactly that knowledge into the product. &lt;a href="https://www.mpt.solutions/how-to-run-an-agent-loop-without-burning-your-token-budget/" rel="noopener noreferrer"&gt;The agent-loop mechanics I wrote up&lt;/a&gt; are already aging out from under that post. Problem formulation — translating a business's real problem out from under its stated one — depreciates slowly, because it is organizational translation, and organizations stay human. The trap is that the fast-depreciating half is the legible, demoable half. It feels like the edge because you can show it off. The durable half looks like "just asking questions."&lt;/p&gt;

&lt;p&gt;Which leaves the fork, and I am going to leave it as a fork rather than resolve it for you. Stay the indispensable bottleneck and you extract rent: real money, now, capped at your personal throughput, gone the day the scarcity ends. Or codify the tacit half into artifacts a colleague can run without you — a written scoping method like the checklist above, reference patterns from the deployments that worked — and you dissolve your own bottleneck while capturing the value of having systematized it. Rent pays this quarter. The moat is owning the codified version when everyone else finally needs it.&lt;/p&gt;

&lt;p&gt;The bubble being real is what creates the opening; nobody pays a premium for discipline in a calm market. The economics work out for whoever is on the right side of the rent-to-moat conversion. And the thing to be dismantling, deliberately, starting now, is the bottleneck being you personally — before the labs dismantle the cheap half of your edge for free and leave you holding only the part you never bothered to write down.&lt;/p&gt;

</description>
      <category>aieconomics</category>
      <category>enterpriseai</category>
      <category>aistrategy</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Torvalds' Best Review Trick Just Stopped Working</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Thu, 16 Jul 2026 18:11:41 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/torvalds-best-review-trick-just-stopped-working-37gg</link>
      <guid>https://dev.to/michaeltuszynski/torvalds-best-review-trick-just-stopped-working-37gg</guid>
      <description>&lt;p&gt;Linus Torvalds has spent years reviewing the most consequential codebase on Earth without reading much of the code. He said so himself in &lt;a href="https://www.tag1consulting.com/blog/interview-linus-torvalds-linux-and-git" rel="noopener noreferrer"&gt;a 2020 interview with Tag1 Consulting&lt;/a&gt;: "While I still look at patches, I actually tend to look more at the explanations, and the history of how the patch came to me."&lt;/p&gt;

&lt;p&gt;That habit was never laziness. It was the sharpest quality filter in software, and it rested on an economic fact: a coherent explanation of why a change belongs in the kernel was expensive to produce. You had to understand the subsystem, the failure mode, and the design decisions that shaped the current code. Faking the explanation cost more than having the understanding. So the explanation worked as proof of understanding, and the man at the top of the review pyramid could read intent instead of implementation.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://www.zdnet.com/article/open-source-summit-linus-torvalds/" rel="noopener noreferrer"&gt;Open Source Summit India 2026 in Mumbai&lt;/a&gt; this month, Torvalds described the thing that broke that filter. He never framed it as broken. The quotes do it for him.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Explanation Was Proof of Work
&lt;/h2&gt;

&lt;p&gt;Tests can be gamed. Diffs can be pattern-matched from similar fixes without understanding either one. But for decades, a paragraph that correctly situated a change in the design history of a kernel subsystem could not be written by someone who lacked the mental model. Reviewers up and down the kernel hierarchy leaned on that correlation. Torvalds built his entire post-programming job on it.&lt;/p&gt;

&lt;p&gt;The correlation was always a proxy, though. Nobody cares about the explanation itself. They care about the understanding it demonstrates, and &lt;a href="https://www.mpt.solutions/goodharts-law-just-got-a-slash-command/" rel="noopener noreferrer"&gt;Goodhart's law&lt;/a&gt; says any proxy works right up until it becomes a target. A proxy survives on the cost of faking it. This one survived for thirty years because the fake was more work than the real thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  LLMs Made the Proxy Free
&lt;/h2&gt;

&lt;p&gt;Large language models generate code that is sometimes wrong. They generate prose about code that is nearly always fluent. The explanation, the one artifact that used to be hardest to fake, is now the cheapest part of the submission.&lt;/p&gt;

&lt;p&gt;Torvalds described what that looks like from the receiving end: bug reports that read as entirely valid and turn out to be fabricated. &lt;a href="https://linux.slashdot.org/story/26/07/12/2053201/linus-torvalds-on-ai-junk-patches-humans-and-godzilla" rel="noopener noreferrer"&gt;"It can actually be a huge drain on resources when it takes humans a lot of effort to figure out that, hey, this machine-generated report was not true,"&lt;/a&gt; he said. Note the asymmetry: the report costs nothing to generate and real investigative work to disprove. That is a filter running backwards, taxing the reviewers it used to protect.&lt;/p&gt;

&lt;p&gt;The patches carry the same signature. He called many of them "mindless band-aid kind of patches... they may fix the immediate problem, but the kind of bug remains, and it just is waiting in the hallway to hit you in another place." A band-aid patch in 2019 usually arrived with a thin, awkward description, and the description gave it away. The same patch in 2026 arrives wrapped in a confident, well-structured explanation of a root cause the author never found. The tell is gone. Prose quality no longer predicts anything about the understanding behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix He Announced Is a Provenance Requirement
&lt;/h2&gt;

&lt;p&gt;Buried in the Mumbai remarks is the actual news, and it got almost no coverage: "If you find a bug with an LLM, it's not enough to just ask the LLM to make a bug report and then throw it over the fence to us. We want to see a suggested patch; we want to see the human who ran the LLM act as a kind of back-and-forth."&lt;/p&gt;

&lt;p&gt;Read that as a submission requirement, not a complaint. He is no longer asking the explanation to prove anything. He is asking for evidence of the process: show me the dialogue, show me where you pushed back, show me what the model got wrong before you fixed it. The unit of review is shifting from the artifact to its provenance. For decades the kernel asked whether the description demonstrated understanding. The new question is whether the human can show their working relationship with the tool that produced it.&lt;/p&gt;

&lt;p&gt;That is a bigger change than it sounds. The transcript of the back-and-forth, not the polished description sitting on top of it, is becoming the thing a maintainer actually wants to see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nobody's Tooling Captures This Yet
&lt;/h2&gt;

&lt;p&gt;PR templates ask what changed and why. CI gates check tests, coverage, lint. None of them ask the question Torvalds is now asking: how do you know? The description field is where the fluent fake lives. The evidence of a genuine back-and-forth lives in session logs most teams throw away.&lt;/p&gt;

&lt;p&gt;Closing that gap does not need a platform. A template section does most of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Provenance&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Generated with: &lt;span class="nt"&gt;&amp;lt;tool&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;or&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;by&lt;/span&gt; &lt;span class="na"&gt;hand&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; First-pass mistake I caught: &lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;pushed&lt;/span&gt; &lt;span class="na"&gt;back&lt;/span&gt; &lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; What I checked myself: &lt;span class="nt"&gt;&amp;lt;command&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;ran&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;output&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The middle field is the tell. A developer who worked the problem with a model fills it in ten seconds, because every real session has one. A developer who piped output over the fence has nothing to put there, and an empty field is a louder signal than a beautiful description.&lt;/p&gt;

&lt;p&gt;I started keeping this kind of evidence before I had a name for it. When I published &lt;a href="https://www.mpt.solutions/build-a-self-improving-agent-harness-in-an-afternoon/" rel="noopener noreferrer"&gt;a self-improving agent demo&lt;/a&gt; earlier this month, the repo shipped with the actual run logs, a 13-of-15 test pass climbing to 15-of-15 across iterations, because without the logs the claim is indistinguishable from every other AI demo on the internet. The logs are the proof the loop ran. The README is just the description.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Breaks
&lt;/h2&gt;

&lt;p&gt;The obvious objection: transcripts can be faked too. Ask the model that wrote your patch to also write a plausible back-and-forth and it will produce one, complete with staged pushback. If teams start grading transcripts, Goodhart eats the transcript next. Grading them with &lt;a href="https://www.mpt.solutions/your-llm-judge-needs-a-test-suite/" rel="noopener noreferrer"&gt;an LLM judge&lt;/a&gt; inherits the same problem one level up.&lt;/p&gt;

&lt;p&gt;The kernel's answer is already visible, and it is not paperwork. Torvalds has been blunt that &lt;a href="https://www.phoronix.com/forums/forum/software/programming-compilers/1604826-linus-torvalds-the-ai-slop-issue-is-not-going-to-be-solved-with-documentation" rel="noopener noreferrer"&gt;the AI slop problem will not be solved with documentation&lt;/a&gt;, and kernel maintainers already &lt;a href="https://techstrong.ai/articles/open-source-makes-bugs-shallow-linus-torvalds-says-ai-makes-them-public/" rel="noopener noreferrer"&gt;deprioritize drive-by reports whose submitters won't answer questions&lt;/a&gt;. The gate is not the artifact. The gate is whether you can continue the conversation. A fabricated transcript buys exactly one round; the first follow-up question a maintainer asks lands on the human, in real time, with no model in the loop to sound fluent for them.&lt;/p&gt;

&lt;p&gt;So Torvalds' test did not die in Mumbai. It moved. Reading the explanation stopped working, so he replaced it with watching you respond.&lt;/p&gt;

&lt;p&gt;The next time a pull request lands in your queue with a suspiciously fluent description, run the kernel's version of the test. Ask one follow-up question the description does not answer, and watch the clock. The answer that comes back in five minutes was always the author's. The one that takes a day was written by whatever wrote the description.&lt;/p&gt;

</description>
      <category>aiengineering</category>
      <category>opensource</category>
      <category>codereview</category>
      <category>softwarequality</category>
    </item>
    <item>
      <title>Attention Is the New Bottleneck. Engineer It Like One.</title>
      <dc:creator>Michael Tuszynski</dc:creator>
      <pubDate>Tue, 14 Jul 2026 16:43:39 +0000</pubDate>
      <link>https://dev.to/michaeltuszynski/attention-is-the-new-bottleneck-engineer-it-like-one-6fo</link>
      <guid>https://dev.to/michaeltuszynski/attention-is-the-new-bottleneck-engineer-it-like-one-6fo</guid>
      <description>&lt;h2&gt;
  
  
  The Diagnosis Is Right
&lt;/h2&gt;

&lt;p&gt;Atomic Object published a piece last month arguing that &lt;a href="https://spin.atomicobject.com/ai-agents-attention-bottleneck" rel="noopener noreferrer"&gt;with AI agents, attention is the new bottleneck&lt;/a&gt;. Agents made execution cheap. You can fire off four parallel coding agents before your coffee cools. What you can't do is review four streams of output at once, hold the context of each in your head, and catch the one that quietly wrote a migration that drops a column.&lt;/p&gt;

&lt;p&gt;The diagnosis is correct. Simon Willison described &lt;a href="https://www.youtube.com/watch?v=so9l_MwS2yg" rel="noopener noreferrer"&gt;running four parallel agents and being wiped out by 11am&lt;/a&gt; — not because the tools failed, but because he became the rate limiter. Michael Novati made the same point from a different angle: AI removed the production bottleneck and &lt;a href="https://michaelnovati.substack.com/p/the-real-bottleneck-in-the-ai-era" rel="noopener noreferrer"&gt;revealed the real one underneath — the human system that surrounds production&lt;/a&gt;. Everyone circling this problem is seeing the same thing. Execution went to zero and human attention became the scarce resource.&lt;/p&gt;

&lt;p&gt;So the diagnosis holds. The prescription is where it falls apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Type Faster" Answer
&lt;/h2&gt;

&lt;p&gt;Atomic Object's advice is all personal discipline. Automate trivial decisions. Plan for cognitive load. Take deliberate breaks. Budget your attention like a finite resource. Good advice for a person. Useless as a system.&lt;/p&gt;

&lt;p&gt;We've seen this exact move before. When execution was the bottleneck — when developers spent their day typing, compiling, catching their own syntax errors — nobody's answer was "type faster." Nobody wrote a productivity blog telling engineers to be more disciplined about their keystrokes. We built compilers so you didn't hand-check types. We built linters so nobody argued about a missing semicolon. We built CI so the machine ran the test suite at 2am and told you which commit broke it.&lt;/p&gt;

&lt;p&gt;The bottleneck moved and we answered with infrastructure, not willpower. Telling a developer in 1998 to concentrate harder on avoiding null-pointer bugs would have been absurd. Telling a developer in 2026 to budget their attention better is the same absurdity wearing new clothes.&lt;/p&gt;

&lt;p&gt;Discipline doesn't scale. Infrastructure does. If your plan for the attention bottleneck is "I'll be more focused," you've already lost, because the failure mode of human attention isn't insufficient effort — it's that there's a finite amount of it and agents produce work faster than any amount of focus can absorb.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineer the Bottleneck Instead
&lt;/h2&gt;

&lt;p&gt;Here's the reframe. Attention is a resource your system spends on your behalf. Most systems spend it wastefully — they make a human look at everything. The job is to build the parts that spend it carefully, the same way a good compiler spends your debugging time carefully by pointing at line 47 instead of making you read the whole file.&lt;/p&gt;

&lt;p&gt;Four pieces do most of the work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification gates so humans review exceptions, not everything.&lt;/strong&gt; The default agent workflow asks you to eyeball every output. That's the waste. Instead, have the agent verify its own work and only surface what it can't confirm. My content pipeline ships blog posts across five channels. After it publishes, a &lt;code&gt;verifyPublishedPost()&lt;/code&gt; step re-fetches the committed markdown and checks for the two failures that actually happened to me — a missing feature image, and a leading H1 that double-rendered the title. If it finds one, it fires a 🚨 line into my notification channel. If everything's clean, I hear nothing. I went from reading every published post to reading only the broken ones. That's not discipline. That's a gate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured escalation so one line beats a log stream.&lt;/strong&gt; Uptime monitoring is the canonical trap. You can watch a dashboard, or you can read logs, or you can have every alert route to a single channel with a single flagged line: what broke, where, since when. I don't read my nightly job logs. They write to disk. If a job fails, one message arrives. The difference between "check the logs" and "here is the one thing that needs you" is the difference between spending attention and saving it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust tiers per task class.&lt;/strong&gt; Not all work deserves the same scrutiny, and pretending it does is how you burn attention on things that don't need it. Low-stakes work ships on green checks — my content pipeline's Tier 1 curated shares go out on a passing lint gate, no human in the loop. High-stakes work queues for review. The on-demand blog publisher treats my explicit request as the approval and ships without a gate, because I asked for it. The cron pipeline that drafts on its own routes through an approval message first. Same infrastructure, different trust tier, matched to the blast radius of being wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decision logs so the same call never reaches a human twice.&lt;/strong&gt; This is the one people skip, and it's the one that compounds. Every time you make a judgment call for an agent, write it down where the agent reads it. My project instructions carry a running list of hard-won lessons — never hand-author markdown into the blog repo, opt into Instagram explicitly because the publishing API returns false-success statuses, strip any leading body H1 unconditionally. Each of those is a decision I made exactly once. The agent now makes it every time without me. A decision log is a cache for judgment. Without it, you re-answer the same question forever, which is the most expensive way there is to spend attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Objection Worth Taking Seriously
&lt;/h2&gt;

&lt;p&gt;The honest counterargument: infrastructure has a build cost, and discipline is free today. Writing a self-verification step, wiring escalation, defining trust tiers — that's real work, and for a solo developer running one agent occasionally, personal focus genuinely is cheaper. Atomic Object isn't wrong that a human should also automate their own trivial decisions and take breaks.&lt;/p&gt;

&lt;p&gt;But that's a bet on the problem staying small, and it won't. The whole premise is that agents multiply output. The developer running one agent this month runs six next quarter. Discipline that works at one stream collapses at six — that's the entire bottleneck being described. You pay the infrastructure cost once and it holds as you scale. You pay the discipline cost every single day, and it fails exactly when the load gets heavy enough to matter. Build the gate before you need it, because the moment you need it you won't have attention left to build it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Separates the Winners
&lt;/h2&gt;

&lt;p&gt;The framing that treats attention as a personal-productivity problem is going to age like every other "work smarter" answer to a structural constraint. It puts the burden on the operator to be superhuman, when the whole point of the last forty years of tooling was to stop requiring humans to be superhuman.&lt;/p&gt;

&lt;p&gt;The people who win with agents won't be the ones with the most discipline about their attention. Discipline is a fixed, small, human quantity, and the workload is about to be neither fixed nor small. The winners will be the ones whose systems spend their attention the least — whose agents verify themselves, escalate the one thing that matters, ship low-stakes work without asking, and never bring the same decision back a second time.&lt;/p&gt;

&lt;p&gt;Attention is the new bottleneck. So engineer it like one. We didn't beat the execution bottleneck by typing faster, and we won't beat this one by concentrating harder.&lt;/p&gt;

</description>
      <category>aiagents</category>
      <category>platformengineering</category>
      <category>aiengineering</category>
      <category>developerproductivity</category>
    </item>
  </channel>
</rss>
