<?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: Tom Jones</title>
    <description>The latest articles on DEV Community by Tom Jones (@tom_jones_230c4659491adcd).</description>
    <link>https://dev.to/tom_jones_230c4659491adcd</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%2F4005721%2F29ca5a90-7498-4757-8195-7e81bc9c04a7.png</url>
      <title>DEV Community: Tom Jones</title>
      <link>https://dev.to/tom_jones_230c4659491adcd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tom_jones_230c4659491adcd"/>
    <language>en</language>
    <item>
      <title>The agent that remembers, and never decides</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Wed, 12 Aug 2026 19:35:20 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/the-agent-that-remembers-and-never-decides-3a29</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/the-agent-that-remembers-and-never-decides-3a29</guid>
      <description>&lt;p&gt;This is not a shortage of information. Every answer a department needs has usually been worked out already, by someone, in a meeting that happened. The problem is where it went.&lt;/p&gt;

&lt;p&gt;It went into chat threads, policy articles, document folders, meeting notes, email, calibration discussions, and individual memory. Seven places, none of which is searchable together, and the last of which walks out of the building at some point.&lt;/p&gt;

&lt;p&gt;What that costs is specific and recognizable. The same questions get answered repeatedly, slightly differently each time. Prior decisions are hard to find, so they get re-litigated instead of applied. Conflicting guidance exists and stays buried until it causes a problem. Calibration outcomes are lost once the meeting ends. New team members depend on finding whoever happens to remember.&lt;/p&gt;

&lt;p&gt;The last one is the tell. When onboarding runs on a person instead of a record, the organization lacks knowledge. It has employees who hold knowledge, which is a different and much more fragile thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with what it never does
&lt;/h2&gt;

&lt;p&gt;Most descriptions of a knowledge agent start with capabilities. This one starts with the boundary, because the boundary is the design and everything else is downstream of it.&lt;/p&gt;

&lt;p&gt;The agent never makes the determination itself. It never creates policy. It never resolves a conflict between two sources. It never overrides existing guidance. It never treats a discussion thread as official guidance.&lt;/p&gt;

&lt;p&gt;What it does instead is retrieve, cite, compare and escalate. When two approved sources disagree, it does not pick a winner. It reports that they disagree and routes the question to the people whose job that is.&lt;/p&gt;

&lt;p&gt;Humans decide. The agent remembers. That sentence is the whole governance model, and it is what makes the rest safe to build. An agent that answers authoritatively becomes a policy source nobody approved. An agent that only ever hands you the record, with its provenance attached, cannot quietly become one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The agent lives where the work already happens
&lt;/h2&gt;

&lt;p&gt;It sits in the channels the department already uses, so nothing has to be adopted. No new destination, no separate portal, no habit to build. Someone asks a policy or calibration question the way they already ask it, and the agent answers in the thread.&lt;/p&gt;

&lt;p&gt;It searches approved policy articles, prior calibration decisions, escalation outcomes, channel history, meeting summaries, and a lightweight knowledge store.&lt;/p&gt;

&lt;p&gt;It returns the source articles linked, prior decisions with dates, related discussions, known conflicts named as conflicts, and an escalation recommendation when the record leaves the question open.&lt;/p&gt;

&lt;p&gt;Returning a known conflict is the part that is easy to undervalue. A system that always produces a confident answer will produce one when the underlying guidance contradicts itself, and the person asking will never learn that. Surfacing the contradiction is more useful than resolving it, and it is the honest output.&lt;/p&gt;

&lt;p&gt;The build is small on purpose. It runs on what the department already has: the chat platform, its agent builder, the existing policy hubs, the calibration memory files, the escalation log, and a small local database holding policies, decisions, escalations, questions and conflicts. Nothing here is exotic, and that is the point. A knowledge system that requires a procurement cycle will not be tested this quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop that turns an answer into an institution
&lt;/h2&gt;

&lt;p&gt;Eight steps, and most of them are human.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A question is asked in the channel.&lt;/li&gt;
&lt;li&gt;The agent searches articles and history.&lt;/li&gt;
&lt;li&gt;An answer is found, a conflict is found, or no guidance exists.&lt;/li&gt;
&lt;li&gt;An unresolved item is escalated.&lt;/li&gt;
&lt;li&gt;The calibration team reviews.&lt;/li&gt;
&lt;li&gt;Leadership approves where required.&lt;/li&gt;
&lt;li&gt;The approved decision is added to the knowledge base.&lt;/li&gt;
&lt;li&gt;Future askers receive the approved answer.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   question ---asks---&amp;gt; THE AGENT ---reads only---&amp;gt; +--------------------+
      ^                     |                       |     APPROVED       |
      |                     |                       |  KNOWLEDGE STORE   |
      +--returns sources----+                       +--------------------+
        and named conflicts |                          ^              |
                            |                          |              |
              escalates when unresolved                |              |
                            v                          |              |
                    CALIBRATION TEAM                   |              |
                            |                    THE ONLY WRITE       |
                            v                          |              |
                       LEADERSHIP ---approves----------+              |
                                                                      |
       future askers receive the approved answer &amp;lt;-------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent reads and never writes. Every path that changes what the organization believes runs through a person, and exactly one arrow writes into the store. That is what stops the agent quietly becoming a policy source nobody approved, and it is why the loop compounds: step seven happens once, step eight is free forever.&lt;/p&gt;

&lt;p&gt;Steps four through seven are human. Correctness enters at step seven and only at step seven, from the calibration team, from leadership, and from policy owners where applicable. Only approved decisions are written back. A discussion in a channel, however senior the person in it, is not a decision and does not enter the store.&lt;/p&gt;

&lt;p&gt;This is institutional learning, and the distinction matters. The model learns nothing about the domain. The organization accumulates decisions it already made, in a place where the next person will find them. Step eight is where the compounding happens, and step eight costs nothing, forever, once step seven has happened once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the memory lives
&lt;/h2&gt;

&lt;p&gt;Three layers, as plain files in the document stores the teams already use, surfaced through chat. The structure is deliberately boring. The permission model is where the care is required, because whether people write honestly into a personal layer depends entirely on knowing who can read it.&lt;/p&gt;

&lt;p&gt;A personal layer, one per person, readable only by its owner. Root context describing role, tools and working style. Live tasks, blockers and next actions. Decisions made, each with its reasoning. Recurring issues with their causes and resolutions. The standards that person works to, versioned. Plus one folder that is deliberately shared upward, holding flags the team needs to know and open questions being surfaced.&lt;/p&gt;

&lt;p&gt;A team layer, team readable and lead writable. Team identity and active work. Team decisions with history. Patterns aggregated across the team. Active standards, version stamped. Anonymous signals arriving from the personal layers.&lt;/p&gt;

&lt;p&gt;A department layer above both teams, readable by both leads. Cross team context. Patterns surfacing across both teams. Decisions affecting both. An anonymous aggregate from both team layers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     +-----------------------------------+
                     |         DEPARTMENT LAYER          |   both leads
                     +-----------------------------------+
                            ^                     ^
                    a pattern seen in MORE THAN ONE team
                            |                     |
        +---------------------+           +---------------------+
        |  TEAM LAYER   eng   |           | TEAM LAYER  product |   team read
        +---------------------+           +---------------------+   lead write
           ^       ^       ^                 ^       ^       ^
                a pattern, person stripped out
           |       |       |                 |       |       |
        +-----+ +-----+ +-----+           +-----+ +-----+ +-----+
        | own | | own | | own |           | own | | own | | own |   owner only
        +-----+ +-----+ +-----+           +-----+ +-----+ +-----+

     named entries, written freely because only the owner can read them
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Signal rises and loses identity at every boundary. A person writes named entries into a layer only they can read. What reaches their team is a pattern with the person removed. What reaches the department is a pattern that appeared in more than one team.&lt;/p&gt;

&lt;p&gt;Signal moves upward and loses identity as it goes. An individual writes freely because the layer is theirs. What reaches the team layer is a pattern with the person stripped out. What reaches the department layer is a pattern that appeared in more than one team. Each boundary is a permission boundary, so the privacy property holds structurally and nobody has to keep remembering a rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two phases, and why the order carries the weight
&lt;/h2&gt;

&lt;p&gt;Phase 1 runs to completion before Phase 2 begins. That sequencing is the most consequential decision in the test, and it is easy to mistake for scheduling.&lt;/p&gt;

&lt;p&gt;Phase 1, weeks one and two, is engineering only. Personal layers for each engineer. The team layer capturing architectural decisions and patterns. Session context assembled automatically at the start of each session. Decisions logged with their reasoning attached, the why alongside the what. Bug patterns and root causes captured in structured form. Standards made explicit, versioned and retrievable.&lt;/p&gt;

&lt;p&gt;Phase 2, weeks three and four, adds product while engineering continues unchanged. Product onboards using the same architecture. The shared department layer activates. Engineering decisions become visible to product context and the reverse. Cross team patterns surface that neither team sees alone.&lt;/p&gt;

&lt;p&gt;When product onboards in week three, engineering does not learn alongside them. Engineering has been living in the system for two weeks and helps with the setup, so the second team takes days, against the two weeks the first team needed. Run the phases in parallel and that advantage disappears: two teams learning at once, and nobody in the room who has done it before.&lt;/p&gt;

&lt;p&gt;Engineering and product are chosen because they hold the most consequential knowledge gap in most technology organizations. Engineers know how a thing was built and which alternatives were rejected. Product knows what was decided, why it was prioritized, and what the customer signal was. Those two records are almost entirely separate today, and the value of connecting them needs no domain expertise to evaluate.&lt;/p&gt;

&lt;h2&gt;
  
  
  What would count as working
&lt;/h2&gt;

&lt;p&gt;Stated in advance and deliberately narrow. Every criterion is a thing that either exists or fails to. Nothing here is a satisfaction score, for reasons given in the next section.&lt;/p&gt;

&lt;p&gt;Prior decisions are findable in under thirty seconds, timed, by someone other than whoever filed them. A repeated question gets the same answer twice, asked again in week four from a different account. Conflicts are escalated rather than buried, with at least one case running all the way to an approved decision. Responses carry their sources, and a spot check confirms the link supports the claim. An approved decision from week one is still retrievable in week four with its date and reasoning. A cross team pattern surfaces that neither team saw alone. People are still asking questions in week four without being reminded to.&lt;/p&gt;

&lt;p&gt;That sixth one is the core claim of Phase 2 and the only signal that cannot be produced by either team in isolation. If nothing appears in two weeks, the department layer has not earned its place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three predictions, recorded before the test starts
&lt;/h2&gt;

&lt;p&gt;A protocol published after the fact is a story. The author already knows how it turned out and the criteria drift, quietly, toward whatever happened. Publishing first is the only cheap way to stop that.&lt;/p&gt;

&lt;p&gt;I am strict about this because I recently paid for it. An experiment of mine returned a clean, total result: one hundred percent in the treated arm, zero in both controls, across all four cases. It was worthless. Every task in it could be answered by copying a sentence out of the text being injected, so the harness was measuring reading comprehension. The only reason I caught it was a prediction written to disk beforehand saying the result should be messy and mixed. The clean number contradicted the prediction, and that contradiction was the entire signal. Two later versions of the same instrument were also wrong, each in a way that flattered whatever I was hoping for.&lt;/p&gt;

&lt;p&gt;So here are three predictions, on the record, before any data.&lt;/p&gt;

&lt;p&gt;Everything below rests on three measurements taken on 2026-08-11, on a system I run, against codebases I did not write. They are small, and they are stated with their size so they can be argued with.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What was measured&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where durable lessons come from&lt;/td&gt;
&lt;td&gt;4 conditions, 2 foreign codebases&lt;/td&gt;
&lt;td&gt;Ordinary use 1, isolated test 0, agreeing with 20 recorded fixtures 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whether a healthy system generates material&lt;/td&gt;
&lt;td&gt;1 full suite, 476 tests passing&lt;/td&gt;
&lt;td&gt;0 durable lessons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whether irrelevant context is harmless&lt;/td&gt;
&lt;td&gt;12 trials per arm, 1 model, 1 scenario&lt;/td&gt;
&lt;td&gt;Irrelevant note wrong 12 of 12, control merely vague&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  One. The layers will fill unevenly, and the pattern will not be effort.
&lt;/h3&gt;

&lt;p&gt;People working where their output has to agree with someone else's, shared interfaces, contested policy, anything with a boundary in it, will produce full layers. People working on self contained work will produce nearly empty ones while working just as hard. Read that as engagement and half the team gets judged for the shape of their work instead of its quality.&lt;/p&gt;

&lt;p&gt;The basis, measured 2026-08-11 across four conditions on two codebases I did not write: ordinary use produced one durable lesson, adding an isolated test produced none, and making one component agree with twenty recorded fixtures produced three in about thirty minutes. The variable was integration surface, not hours worked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two. Week one will feel like nothing is happening.
&lt;/h3&gt;

&lt;p&gt;A new layer is empty, and a process running normally generates very little worth recording. The material appears when something is contested, revisited, or wrong. A team expecting usefulness by day three will conclude the test failed before the compounding has begun.&lt;/p&gt;

&lt;p&gt;The basis, measured the same day: a full test suite on a healthy codebase, 476 tests passing in about a minute, produced zero durable lessons worth recording. Nothing was broken. There was simply nothing to learn, because nothing resisted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three. Asking whether it felt useful will return yes, and will mean nothing.
&lt;/h3&gt;

&lt;p&gt;Delivered context makes people feel better informed whether or not the context was any good. This is why every criterion above either exists or fails to, and why none of them is a rating.&lt;/p&gt;

&lt;p&gt;The basis, measured the same day at twelve trials per arm, one model, one scenario: against a control given nothing, injecting a genuinely irrelevant note produced a confidently wrong answer in twelve of twelve cases, while the control was merely vague. The bad context went past unhelpful into actively misleading, and it read as authoritative while doing it. Treat that as a lead, with the sample size and the single scenario counting against it.&lt;/p&gt;

&lt;p&gt;That third one is also the strongest argument for the boundary at the top of this piece. An agent that hands over sourced records lets a person check. An agent that hands over confident answers removes that option.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do not know
&lt;/h2&gt;

&lt;p&gt;There is one instance of this architecture running in production over a long period, and it is mine. One organization, one operator, and every figure quoted above comes from it. This document generalizes to any two teams in any organization, and that generalization is a hypothesis rather than a finding. This test is the first attempt to check it against somebody else's work.&lt;/p&gt;

&lt;p&gt;Three further things it cannot settle, listed because a careful reader will find them anyway.&lt;/p&gt;

&lt;p&gt;Whether people write honestly into a layer their employer hosts. The permission model is designed for this and design is not proof. A personal layer that quietly becomes a performance record stops receiving true entries immediately, and that failure is silent.&lt;/p&gt;

&lt;p&gt;Whether a cross team pattern is a pattern or a coincidence. Two teams generate enough signal that something will always look like a connection. Requiring that neither team saw it independently is a guard, and a weak one.&lt;/p&gt;

&lt;p&gt;Whether four weeks is long enough for anything to compound. It is long enough for the layers to fill and for first patterns to appear. It is almost certainly not long enough to observe the property the whole design aims at, which is a team keeping its knowledge across a departure.&lt;/p&gt;

&lt;p&gt;The test does not end at four weeks. What ends at four weeks is the part anyone is willing to make predictions about.&lt;/p&gt;

&lt;p&gt;If you have run something like this inside a real organization, I am most interested in the first unknown above. The permission boundary is the part I am least able to prove from my own instance, because in my instance the owner and the operator are the same person.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Microsoft measured our thesis, and we still cannot quote ours</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Sun, 09 Aug 2026 14:45:33 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/microsoft-measured-our-thesis-and-we-still-cannot-quote-ours-4da1</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/microsoft-measured-our-thesis-and-we-still-cannot-quote-ours-4da1</guid>
      <description>&lt;p&gt;Microsoft's .NET team published the benchmark behind their polyglot unit testing agent. We have been arguing its conclusion for months. We can't cite our own version of it, because we withdrew our number on 2026-08-06 and haven't earned it back.&lt;/p&gt;

&lt;p&gt;Both halves of that are worth writing down.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they measured
&lt;/h2&gt;

&lt;p&gt;The setup is clean. One tool, one model, 152 tasks from real repositories. The only thing that varies is a plugin that makes the agent research the repository, plan, implement, then verify before it claims to be done. A task passed only if the repository built, all tests passed, the agent added at least one test, and it removed none.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Arm&lt;/th&gt;
&lt;th&gt;Completed&lt;/th&gt;
&lt;th&gt;Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;With the workflow&lt;/td&gt;
&lt;td&gt;140 / 152&lt;/td&gt;
&lt;td&gt;92.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same model, stock&lt;/td&gt;
&lt;td&gt;120 / 152&lt;/td&gt;
&lt;td&gt;78.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;63% fewer failures, from the same model and the same tool.&lt;/p&gt;

&lt;p&gt;The breakdown is where it gets useful.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt type&lt;/th&gt;
&lt;th&gt;With workflow&lt;/th&gt;
&lt;th&gt;Stock&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vague, 89 tasks&lt;/td&gt;
&lt;td&gt;88.8%&lt;/td&gt;
&lt;td&gt;66.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detailed, 63 tasks&lt;/td&gt;
&lt;td&gt;96.8%&lt;/td&gt;
&lt;td&gt;96.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diff-targeted, 15 tasks&lt;/td&gt;
&lt;td&gt;15 / 15&lt;/td&gt;
&lt;td&gt;0 / 15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On detailed prompts the two arms tie exactly. The whole gap comes from vague prompts, where the agent has to work out for itself what to test, which framework is in use, and where the tests belong. So the scaffold isn't making the model smarter. It's taking away the guessing.&lt;/p&gt;

&lt;p&gt;Then the per-model results, on 45 .NET tasks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;With workflow&lt;/th&gt;
&lt;th&gt;Stock&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.8&lt;/td&gt;
&lt;td&gt;95.6%&lt;/td&gt;
&lt;td&gt;77.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;91.1%&lt;/td&gt;
&lt;td&gt;80.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;td&gt;75.6%&lt;/td&gt;
&lt;td&gt;55.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Their own summary of that table is one sentence: "The workflow helped every model. With Opus, it added eight wins with no losses."&lt;/p&gt;

&lt;p&gt;There's a reading they don't offer, and I want to be clear that it's mine rather than theirs. GPT-5.5 inside the workflow finished 91.1%. Opus 4.8 outside it finished 77.8%, on the same 45 tasks. Read across the rows instead of down them and the cheaper model in a system came out ahead of the stronger model on its own. Microsoft compares each model only against itself and never makes that claim. I'm making it, from their published table, so weigh it as my inference and not their finding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two caveats we'd want applied to us
&lt;/h2&gt;

&lt;p&gt;Their coverage barely moved: 72.4% against 72.2% line, 49.8% against 49.1% branch. The agent also wrote slightly fewer tests than stock, 6,963 against 7,129. So the workflow didn't produce better tests. It produced tests that exist, build and pass, more often. They say so themselves, and it's a completion result rather than a quality one.&lt;/p&gt;

&lt;p&gt;The gains also concentrate where the request is underspecified. On detailed prompts the workflow buys nothing at all. That's a real boundary on the claim, and it belongs in the headline rather than a footnote.&lt;/p&gt;

&lt;p&gt;We'd hold our own numbers to exactly that. So we will.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we can't quote ours
&lt;/h2&gt;

&lt;p&gt;We have a version of this result. On our own harness, switching the verification layer off dropped correctness from 100% to 75%, and switching the guards off as well took it to 50%. Small n, our harness, not a public benchmark, and we say that every time we cite it.&lt;/p&gt;

&lt;p&gt;The bigger claim was a lift figure: a cheap model alone, then the same model inside our cascade. We published it. Then we audited our own truth layer and found something ugly. Our two baselines for the same quantity, the same cheap model alone on the same benchmark, disagreed by 3.1 points. One page computed the lift from one baseline. Another page computed it from the other. Each traced back to a real measurement, which is exactly why nobody caught it.&lt;/p&gt;

&lt;p&gt;Both lift figures came off every public surface that day, and they stay off until one baseline is re-run.&lt;/p&gt;

&lt;p&gt;So here's the honest position. Microsoft has a clean, large, well-controlled measurement of something we believe. We have an unresolved 3.1 point disagreement with ourselves about ours. Their result doesn't repair ours. Someone else agreeing with you isn't a re-measurement of your own work, and being right isn't the same as having measured it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part we did measure, and it points the same way
&lt;/h2&gt;

&lt;p&gt;One result of ours survives a second independent run and an adversarial pass, so it can sit next to theirs.&lt;/p&gt;

&lt;p&gt;We ran three models over the same 160 HumanEval+ problems, with the same prompts and the same scorer. They finished 92.5%, 91.2% and 90.0%. A 2.5 point spread that reads as interchangeable.&lt;/p&gt;

&lt;p&gt;Partition by task instead of by column total and it looks different. 83% of the set is uncontested, where all three models get it right, and the models disagree on roughly 15 to 18 percent of the work across two runs. What makes that citable isn't how big the disagreement is, it's how stable: the same problems come up contested each time. 17 tasks are contested in both runs against 3.6 expected by chance, and ten of them are contested in both runs without any model ever changing its answer.&lt;/p&gt;

&lt;p&gt;Which problems they split on is a property of the models. Which model scores highest is a property of the run. That's HumanEval+ Python on our harness, not customer traffic.&lt;/p&gt;

&lt;p&gt;Put it beside Microsoft's table and you get one argument instead of two. They measured that the workflow around the model carries most of the gain you can reach. We measured that the ranking you'd use to pick a model is mostly noise. Both point at the same place, and it isn't the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we took from it
&lt;/h2&gt;

&lt;p&gt;One technique, straight away.&lt;/p&gt;

&lt;p&gt;Before their agent declares a task complete it runs a set of checks, and one of them reads: "It considers small code changes that should make the tests fail. This is a lightweight form of mutation testing." No full mutation framework. Just a cheap step that catches an assertion which can't fail.&lt;/p&gt;

&lt;p&gt;We knew that rule. We wrote it down after a scorer of ours passed its positive control perfectly while being structurally incapable of returning a negative. We wrote it down again when a guard printed OK at every boot and then fired on zero of seven deliberately injected defects. We were applying it from memory, and memory isn't a source. Microsoft made it a step in the loop.&lt;/p&gt;

&lt;p&gt;So we built it. Every guard in our tree can now declare, in its own header, an injected defect that must make it exit non-zero. A runner executes each one in a fresh directory and reports whether the guard can still say no. Three grades: PROVEN, BROKEN, and UNPROVEN for guards that haven't declared a control yet. UNPROVEN counts as a warning rather than a failure, because a gate that's red on day one gets overridden by reflex, and a reflex override has stopped being a signal.&lt;/p&gt;

&lt;p&gt;We watched it fail before trusting it. A stub guard that always exits zero grades BROKEN.&lt;/p&gt;

&lt;p&gt;Then we pointed it at the guard from the story above, the one printing OK at every boot. We injected a wrong percentage where a real measured one belongs. Exit 0. We injected a cost multiple we'd already struck from our own public copy. Exit 0. A third run, with the correct value in place, confirmed the guard really was reading two live surfaces against the real ledger, so a trivial pass couldn't be mistaken for a catch. It graded BROKEN by its own declaration, and it's since been fixed.&lt;/p&gt;

&lt;p&gt;As I write this the runner reports 7 proven, 0 broken, 33 unproven, out of 40 guards. That last number moved while I was drafting, because writing this article involved building another checker and the gate made me declare a control for it before it would let me commit. The unproven count is the honest one, and it's the one we expect to be asked about. It's also the point of the exercise. Before we built this, the answer to "which of your guards can still fail?" was "we assume all of them."&lt;/p&gt;

&lt;h2&gt;
  
  
  A postscript, because it happened while writing this
&lt;/h2&gt;

&lt;p&gt;Fact-checking this article, I flagged four of its own numbers as fabrications. The branch coverage figures. The Haiku row. The three-model percentages. Our own ablation result.&lt;/p&gt;

&lt;p&gt;All four were real. I'd checked them against a news summary of Microsoft's post rather than the post, and against the wrong one of our own benchmark artifacts. The summary leaves out branch coverage entirely and never mentions Haiku, so an absence looked like an invention.&lt;/p&gt;

&lt;p&gt;We have a rule for this and I broke it anyway: never relay one party's account of another's work without reading the original. I was one hop further out than I thought, which is the only place that error lives.&lt;/p&gt;

&lt;p&gt;Two defects did survive the pass, and both were in the draft's account of our own work. A comparison of mine that read as Microsoft's, and a stale guard count.&lt;/p&gt;

&lt;p&gt;And I have to finish that sentence honestly, because the first version of this article went out before I caught either one. It was live for about three hours, saying that a guard "is now marked BROKEN" when we had fixed it that morning, and reporting 2 proven of 37 when the runner said 7 of 40. This text replaced it in place, which is why the two paragraphs above are written the way they are. An article about withdrawing a number published a wrong one first. That is the whole argument for having a correction path that edits at the claim instead of appending a note at the bottom, and it is why every figure here now carries a line in a verification block saying where it was re-derived from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft .NET blog, the polyglot unit testing agent: &lt;a href="https://devblogs.microsoft.com/dotnet/polyglot-unit-testing-agent/" rel="noopener noreferrer"&gt;https://devblogs.microsoft.com/dotnet/polyglot-unit-testing-agent/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The plugin, MIT licensed: &lt;a href="https://github.com/dotnet/skills" rel="noopener noreferrer"&gt;https://github.com/dotnet/skills&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>benchmarking</category>
      <category>programming</category>
    </item>
    <item>
      <title>A stable aggregate is not a stable measurement</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Fri, 07 Aug 2026 17:49:12 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/a-stable-aggregate-is-not-a-stable-measurement-53g1</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/a-stable-aggregate-is-not-a-stable-measurement-53g1</guid>
      <description>&lt;p&gt;We ran the same benchmark five times against our own production system and got 752, 750, 750, 749 and 749 out of 800.&lt;/p&gt;

&lt;p&gt;That is a spread of three items across five runs. Less than half a percentage point. If you saw those five numbers you would conclude the measurement was essentially deterministic, quote the mean, and move on. I nearly did.&lt;/p&gt;

&lt;p&gt;Then I compared the runs item by item, and &lt;strong&gt;38 of the 800 items had changed answer between one run and another.&lt;/strong&gt; Not three. Thirty eight, which is 4.8 percent of the set.&lt;/p&gt;

&lt;p&gt;The totals barely moved because the flips cancelled. Something that was right in run 1 and wrong in run 3 is invisible in a sum, and there were enough in each direction that the aggregate came out almost identical every time. &lt;strong&gt;The number was stable. The measurement underneath it was not.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What five runs actually showed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;run&lt;/th&gt;
&lt;th&gt;score&lt;/th&gt;
&lt;th&gt;of 800&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;752&lt;/td&gt;
&lt;td&gt;94.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;750&lt;/td&gt;
&lt;td&gt;93.75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;750&lt;/td&gt;
&lt;td&gt;93.75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;749&lt;/td&gt;
&lt;td&gt;93.62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;749&lt;/td&gt;
&lt;td&gt;93.62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;750.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;93.75%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same 800 fixed items, same configuration, same scorer, five separate passes through the production path, an hour and a half apart end to end. Temperature was zero, which people reasonably expect to mean deterministic. It does not.&lt;/p&gt;

&lt;p&gt;Partitioning the 800 by how they behaved across all five runs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;across all five runs&lt;/th&gt;
&lt;th&gt;items&lt;/th&gt;
&lt;th&gt;share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;all five correct&lt;/td&gt;
&lt;td&gt;730&lt;/td&gt;
&lt;td&gt;91.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;all five wrong&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;changed at least once&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.8%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the pairwise view, counting items where two runs disagree with each other:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;run pair&lt;/th&gt;
&lt;th&gt;items that disagree&lt;/th&gt;
&lt;th&gt;rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-2&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;2.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-3&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;2.75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-4&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;2.38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-5&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;2.62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2-3&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;2.50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2-4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;23&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.88%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2-5&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;2.12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;2.62%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-5&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;2.12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-5&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;2.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The sharpest example is the pair that disagrees most. &lt;strong&gt;Runs 2 and 4 differ on 23 items. Their totals differ by one.&lt;/strong&gt; If those had been the only two runs I did, I would have written down that the system reproduces to within a single item, and I would have been wrong by a factor of twenty three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters if you are comparing anything
&lt;/h2&gt;

&lt;p&gt;The reason to care is not academic. It is that almost every model comparison you read, including the ones I have written, is a difference between two totals.&lt;/p&gt;

&lt;p&gt;If your measurement has a 2.88 percent chance of flipping any given item between identical runs, then two systems whose totals differ by less than roughly twice that are not distinguishable by the run you did. You need the gap to clear the noise, and you cannot know the noise without measuring it.&lt;/p&gt;

&lt;p&gt;We learned this the embarrassing way first. Earlier we ran a three model comparison twice, one hour apart, same prompts, same temperature zero. The model that came first in run one came &lt;strong&gt;third&lt;/strong&gt; in run two, and the one that came third came &lt;strong&gt;first.&lt;/strong&gt; The gaps were around one to two points. The noise was larger than the gaps. We had a ranking, and it was a coin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cheap fix, which is one extra run
&lt;/h2&gt;

&lt;p&gt;You do not need a statistical apparatus. You need a second pass of the identical set.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run your benchmark twice on the same items.&lt;/strong&gt; Do not change anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Count the items that changed answer.&lt;/strong&gt; That percentage is your noise floor. Ours is 2.88 percent
on this workload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refuse any comparison whose gap does not clear roughly twice the floor.&lt;/strong&gt; Not "note the caveat."
Refuse it, in code if you can, so a tired person cannot quote it later.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We put that last rule in the tool. It computes the floor alongside the result and will not bless a claim that sits inside the noise. It has told us no more than once, including on a result that flattered us.&lt;/p&gt;

&lt;h2&gt;
  
  
  And the thing worth keeping instead
&lt;/h2&gt;

&lt;p&gt;If aggregates are fragile, something has to replace them, and the replacement is better anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Report which items you disagree on, not who scored higher.&lt;/strong&gt; When we compared three models by task&lt;br&gt;
rather than by total, the partition was stable across runs even while the ranking was not: the same&lt;br&gt;
problems came out contested each time, far more often than chance would put them there. Which problems&lt;br&gt;
a system gets wrong is a property of the system. Who scored higher on the total is a property of&lt;br&gt;
the afternoon.&lt;/p&gt;

&lt;p&gt;That is also the more useful finding for anyone actually building something. A leaderboard position tells you which one to pick. A partition tells you where picking one is not enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable part
&lt;/h2&gt;

&lt;p&gt;I want to be honest about where this leaves our own numbers, because it would be convenient to publish this as a lesson for other people.&lt;/p&gt;

&lt;p&gt;It applies to us. Every benchmark result we have quoted from a single run is a number with an unstated uncertainty, and some of the differences we have found interesting in the past are inside the floor we just measured. The 2.88 percent is not a result about other people's evaluations. It is the error bar on ours, and we did not have it until this week.&lt;/p&gt;

&lt;p&gt;The five runs cost about two hours and a few dollars. The thing they bought was not a better score. It was knowing how much of the score was real.&lt;/p&gt;




</description>
      <category>benchmarking</category>
      <category>testing</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>We stopped choosing models and started choosing what to measure</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Fri, 07 Aug 2026 17:49:09 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/we-stopped-choosing-models-and-started-choosing-what-to-measure-77k</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/we-stopped-choosing-models-and-started-choosing-what-to-measure-77k</guid>
      <description>&lt;p&gt;The default way to use an LLM is to pick one and send it everything. That is what the integration looks like, it is what a model marketplace is shaped around, and it is what most agents I read about do. Pick the good one. Send it the work.&lt;/p&gt;

&lt;p&gt;We run a routing and verification gateway, so we have had to measure a lot of models against the same tasks with money attached. I want to put down what our own data keeps saying, including the parts where it makes us look bad, because the conclusion is not "we found the better model."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We ran the experiment everyone runs to pick a model. We ran it twice. We got a different winner.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three models, 164 HumanEval+ problems, temperature 0, one completion each. Then the identical thing again an hour later. Nothing changed between the two runs except time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;model&lt;/th&gt;
&lt;th&gt;run 1&lt;/th&gt;
&lt;th&gt;run 2&lt;/th&gt;
&lt;th&gt;rank&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3-235b&lt;/td&gt;
&lt;td&gt;89.6%&lt;/td&gt;
&lt;td&gt;92.1%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 -&amp;gt; 1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-120b&lt;/td&gt;
&lt;td&gt;91.5%&lt;/td&gt;
&lt;td&gt;90.2%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 -&amp;gt; 3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.8-max&lt;/td&gt;
&lt;td&gt;91.2%&lt;/td&gt;
&lt;td&gt;91.6%&lt;/td&gt;
&lt;td&gt;2 -&amp;gt; 2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each model is scored over the problems it actually answered. Two of them answered all 164 in both runs. qwen3.8-max timed out on 4 and then on 9, so its denominator is 160 and then 155. The partition table further down uses the smaller set where all three answered, so its percentages are not directly comparable to these.&lt;/p&gt;

&lt;p&gt;First and last swapped. The model we would have picked on Tuesday is the one we would have rejected on Wednesday, and the new frontier model that lost to our cheap tier by 1.3 points beat it by 1.4 the second time.&lt;/p&gt;

&lt;p&gt;Temperature 0 is not determinism, and 164 problems is not enough to separate models sitting two points apart. We can put a number on how much of this is flicker: &lt;strong&gt;run the same model over the same problem twice and it changes its answer 3.7 to 5.2 percent of the time.&lt;/strong&gt; Any ranking gap smaller than that is not a result. Ours were all smaller than that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But something did survive both runs, and it is the more useful thing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stop asking how many each model got and ask which ones.&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;run 1&lt;/th&gt;
&lt;th&gt;run 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;all three correct&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;all three wrong&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;they DISAGREE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;28&lt;/strong&gt; (17.5%)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;23&lt;/strong&gt; (14.8%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Roughly 15 to 18 percent of the time, the model you picked decided whether you got a right answer.&lt;/strong&gt;&lt;br&gt;
Note what the same table says about the other 82 percent: all three models agree, 130 of them right&lt;br&gt;
and 2 of them wrong together, and the choice is irrelevant. This is a claim about a fifth of the work, not about all of it.&lt;/p&gt;

&lt;p&gt;The reason to believe the fifth is real rather than flicker is not the size of the number, it is that &lt;strong&gt;it lands on the same problems both times.&lt;/strong&gt; Twenty four problems were contested in the first run and twenty three in the second, and seventeen of them are the same problems. If the disagreement were noise you would expect about four to coincide. Ten of them are contested in both runs without a single model ever changing its own answer.&lt;/p&gt;

&lt;p&gt;The ceiling is the part I would think hardest about. The best single model scores about 92 percent. &lt;strong&gt;If you could always take whichever of the three happened to be right, you would score 98.8 percent&lt;/strong&gt;, and that number was stable across both runs too. Picking one model, even correctly, leaves about six points on the table.&lt;/p&gt;

&lt;p&gt;A leaderboard cannot show you any of this. A leaderboard is column totals, and all of it lives in the rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capability is shaped like the task, not like a ranking
&lt;/h2&gt;

&lt;p&gt;Our verification witness is llama-3.3-70b, pinned to one provider. On 400 standard tool-calling tasks it scores 382, which is 95.5 percent, and matches our primary path. On an adversarial set built to tempt it into calling a tool when it should decline, it scores 30 of 40.&lt;/p&gt;

&lt;p&gt;I have to be careful with that 40, and I only learned why today. &lt;strong&gt;It is four distinct trap shapes, each parameterised ten ways.&lt;/strong&gt; The replicates swap a city or a number; they do not add a fifth kind of trap. So the honest denominator is four, not forty, and I am not going to put a confidence interval on it. What the instrument legitimately supports is: across four adversarial tool-selection shapes, parameterised ten ways each, it failed ten times.&lt;/p&gt;

&lt;p&gt;The interesting part is not the 75 percent, which I now think is close to meaningless. It is that &lt;strong&gt;all ten misses are the same verdict.&lt;/strong&gt; Every one is a false call: it invoked a tool where the correct behaviour was to abstain. So the model matches the primary at doing the thing and fails it at knowing when not to. Those are different abilities, they are not correlated the way a single score implies, and only one of them was on the benchmark.&lt;/p&gt;

&lt;p&gt;If you are building on a model because it scored well at a task, check whether the thing you actually need is the task or the restraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The price on the page is not the price
&lt;/h2&gt;

&lt;p&gt;We screened a cheaper candidate for our cheap tier. Advertised at 0.05 and 0.20 per million against our shipped tier at 0.07 and 0.27, roughly 30 percent cheaper on both sides.&lt;/p&gt;

&lt;p&gt;On a real tool call it emitted 132 completion tokens, of which 123 were reasoning tokens that we paid for and never saw. Its effective output price came out around fifteen times its sticker, making it roughly ten times more expensive than the tier it appeared to undercut. The tool call itself was correct. The capability was real. Only the economics were inverted.&lt;/p&gt;

&lt;p&gt;This is one call, so treat it as a mechanism rather than a rate. The mechanism is enough: compare cost per successful result, never cost per million tokens, and read the reasoning token count before you believe any price comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  You may not be choosing a model at all
&lt;/h2&gt;

&lt;p&gt;Same model, same 400 prompts, same scorer. Pinned to a single serving provider it scored 95.5 percent. Unpinned, letting the marketplace route it, 78.2 percent. The model was held constant and the score moved 17.3 points.&lt;/p&gt;

&lt;p&gt;For scale, adjacent models in our own sweep differ by 0.5 to 6 points, so the routing spread was larger than the entire model spread we were trying to measure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And then we checked whether that was a law, because it would be a convenient one for us.&lt;/strong&gt; We ran the&lt;br&gt;
same pinned-versus-unpinned experiment on gpt-oss-120b. It moved 0.6 points, 65.2 percent pinned&lt;br&gt;
against 65.8 unpinned. So this is not "marketplaces degrade models." It is a property of the specific&lt;br&gt;
model and provider pair, and the actionable version is that you have to check yours rather than assume&lt;br&gt;
either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The newest one is not automatically the answer either
&lt;/h2&gt;

&lt;p&gt;Qwen 3.8 came out yesterday. We benchmarked it the same night against the two models it might replace.&lt;/p&gt;

&lt;p&gt;And this is where I have to be careful, because the first version of this section said "it did not beat our cheap tier" and the second run says it did. On accuracy it is &lt;strong&gt;indistinguishable&lt;/strong&gt;, in both directions, and I am not going to pretend otherwise in either.&lt;/p&gt;

&lt;p&gt;What did not move between runs is the part that actually decides it. &lt;strong&gt;It cost 64 to 76 times more per solved problem&lt;/strong&gt;, depending on the run, priced at the marketplace list rate rather than at what the vendor's own API would have charged us, which we did not read. It was slower at the median in both. And &lt;strong&gt;its timeouts more than doubled, 4 then 9 out of 164&lt;/strong&gt;, with a worst case over 200 seconds. The cost multiple moves because it is a ratio of two noisy things, so treat it as a band and not a constant, which is the same rule this piece applies to everything else.&lt;/p&gt;

&lt;p&gt;So the reason not to adopt it is not that it is worse at the task. It is that it is indistinguishable at the task, dramatically more expensive, and less reliable, and those three are all stable across runs while the score is not. &lt;strong&gt;The score was the only thing I originally judged it on, and the score was the only thing that turned out to be noise.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do you do instead
&lt;/h2&gt;

&lt;p&gt;If models differ by task rather than rank, then "which model is best" is optimising the wrong thing. The unit we route on is the task shape plus a check: send the request to whatever suits its shape, serve the cheap answer when something independent agrees it is right, and escalate only when the check disagrees. The model becomes a swappable component, and being wrong about one becomes survivable.&lt;/p&gt;

&lt;p&gt;And the uncomfortable part, because leaving it out would make this an advertisement. &lt;strong&gt;Our own escalation target never cleared the cheap tier it exists to rescue on code, in either run.&lt;/strong&gt; On the first run it scored below it, 90.0 against 92.5. On the second the two tied at 92.9. By this piece's own rule I cannot report either of those as a ranking, so the honest version is the weaker and worse one: we have no evidence that the model we escalate to is better at code than the model it is rescuing. That is not what an escalation target is for. A gate can only be as good as the thing it routes to, so the thing we are fixing is not the gate, it is the ladder, and last night's benchmark was us checking whether the new frontier model was the fix. It was not.&lt;/p&gt;

&lt;p&gt;That is scoped to code, and I should say so rather than let it sound general. This benchmark did not test the tool path at all, and our own data has the ordering of these tiers inverting by task shape. Which is the whole argument again, made against us this time: the rung that looks wrong on one task shape is not automatically the wrong rung.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats, in full
&lt;/h2&gt;

&lt;p&gt;The 98.8 percent ceiling assumes an oracle that always picks the model that happened to be right. No router has that, ours included, and we have not measured what share of those six points our own routing actually captures. Read it as the size of the prize, not as a result.&lt;/p&gt;

&lt;p&gt;Single run per arm on the 160 problem comparison, temperature 0, one completion each. Temperature 0 was &lt;strong&gt;not&lt;/strong&gt; deterministic for us: two runs of the same 8 problems gave different results, so treat small gaps as noise, including ours. The 95.5 versus 78.2 pair is 400 per arm, single run, no confidence intervals. The trap set is four shapes replicated ten times, not forty independent cases, so treat it as four observations and ignore any interval anyone computes on n=40, including one of ours that is now struck. The pricing finding is one call. Our benchmarks are code and tool calling and they are not your workload.&lt;/p&gt;

&lt;p&gt;None of this says frontier models are overrated. We escalate to one and would not ship without it. It says that after measuring a lot of them against the same tasks, the most useful thing we learned was not which one wins. It was that they fail in different places, and the difference between them is bigger than the gap in their scores.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>llm</category>
      <category>benchmarking</category>
      <category>engineering</category>
    </item>
    <item>
      <title>I built a page that only publishes numbers surviving our own checks. It caught me inside the hour.</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Sun, 02 Aug 2026 20:07:11 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/i-built-a-page-that-only-publishes-numbers-surviving-our-own-checks-it-caught-me-inside-the-hour-3gop</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/i-built-a-page-that-only-publishes-numbers-surviving-our-own-checks-it-caught-me-inside-the-hour-3gop</guid>
      <description>&lt;p&gt;I run a verified inference endpoint. What we sell is checking: we verify results before serving them, and we say so when we cannot.&lt;/p&gt;

&lt;p&gt;Every claim defect we shipped this month had the same shape. A number was measured honestly, the configuration underneath it changed, and the number stayed on the page. Our benchmark rows were measured on model tiers we retired weeks earlier. Nothing was fabricated. Everything was stale.&lt;/p&gt;

&lt;p&gt;So I built a page that cannot go stale. It is generated from the live gateway config, and every badge on it is derived rather than written. If a measurement's configuration premise no longer matches what is running, the page strikes the number and says why.&lt;/p&gt;

&lt;p&gt;It went live. Within the hour it caught me publishing two numbers our own ledger explicitly withholds.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the page does
&lt;/h2&gt;

&lt;p&gt;For each path through the system it states four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What "good" means on that path, and whether a real oracle checked it.&lt;/strong&gt; Tool calls are checked against the schema. Code runs against your tests in a sandbox. Free prose gets nothing, because there is nothing to run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The measurement&lt;/strong&gt;, with n, interval and date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether that measurement still describes the running system&lt;/strong&gt;, graded automatically against live config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether it passed adversarial review&lt;/strong&gt;, and if not, that appears on the page next to the number.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The third item is the whole point. A number and a config are two facts that drift apart silently, and no amount of care fixes that. A generator that reads both cannot lie about the gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch
&lt;/h2&gt;

&lt;p&gt;I put our tool-calling and trap-set results on it. Both are good numbers. Both are marked in our internal claims ledger as &lt;em&gt;not cleared for external citation, owes adversarial verify&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I had written the page whose entire purpose is publishing only what survives our checks, and I had not run the check.&lt;/p&gt;

&lt;p&gt;The first fix was a blocklist for that one phrase. Also wrong. Our ledger withholds rows in at least six phrasings, and a blocklist misses the seventh. For a public claim the gate has to &lt;strong&gt;fail closed&lt;/strong&gt;: a figure publishes only if its ledger row exists and carries no hold marker. Over-withholding costs a number on a page. Under-withholding costs a retraction.&lt;/p&gt;

&lt;p&gt;Failing closed immediately caught two more, subtler ones. Two figures had no ledger row at all, because I had sourced them from an internal handoff instead of the truth layer. One was a &lt;code&gt;30/40&lt;/code&gt; result. Our ledger also contains a &lt;code&gt;30/40&lt;/code&gt;, from a completely different run on a different model. Same number, different measurement. That is exactly the confusion an uncited figure invites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then the reviewer rejected my draft
&lt;/h2&gt;

&lt;p&gt;The remaining claim needed real adversarial review, so I commissioned one and briefed it to refute rather than agree. It came back &lt;strong&gt;do not publish&lt;/strong&gt;, with three specific defects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I wrote that our agreement gate accepts a wrong answer "roughly a quarter to a third of the time." That range was two underpowered subgroups (6 of 25, and 5 of 15) whose confidence intervals almost entirely overlap. It reads like a stable operating characteristic. The data supports one pooled binomial: &lt;strong&gt;11 of 40, 27.5%, Wilson 95% interval 16.1 to 42.8.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;I quoted "1.7 to 3.5% on code." It has the shape of a measured interval. The reviewer said the evidence was not in my brief, which would normally mean &lt;em&gt;I&lt;/em&gt; under-briefed it. So I checked instead of accepting. The figure appears three times in our ledger with no n, no interval and no date anywhere. The gap was real.&lt;/li&gt;
&lt;li&gt;I wrote "near zero on arithmetic." That is residue from a claim we retracted publicly after a reader caught it from our own article's text. No clean replacement exists, so the phrase cannot appear at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I took all three. I refused one instruction: it wanted me to name an internal threshold, which is recipe rather than result. It did not know that because I had not briefed it on our disclosure policy. Same failure, other direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The green check that could not fail
&lt;/h2&gt;

&lt;p&gt;While extending our claims gate to cover more surfaces, I did something I should have done when it was written: I injected the defect it exists to catch.&lt;/p&gt;

&lt;p&gt;Seven injections. Five wrong percentages, a struck cost multiple, a retracted compounding claim. &lt;strong&gt;It fired on none of them.&lt;/strong&gt; Its tolerance covers most of the range it checks, so almost any number is "backed" by something. It had been printing OK every morning for weeks.&lt;/p&gt;

&lt;p&gt;It was not lying. Its own output says "values checked, not claims," and a comment in its source says the same. The defect is one level out: &lt;strong&gt;a green line on a status board is read as protection, and nobody re-reads the caveat.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A guard you have never watched fail is not a guard. It is a habit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rules that transfer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A correction in your repo is not a correction in public.&lt;/strong&gt; Our live site was still serving retracted figures while every internal instrument reported the sweep as done, because every internal instrument greps the repo. Verify a public claim by fetching the public URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your measurement tool is an instrument, so verify it first.&lt;/strong&gt; Our cost script summed one of three cost columns. It reported one cent where the truth was $1.73, and it was the exact script our ledger's cost row cited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A readability filter can eat an error.&lt;/strong&gt; I piped a remote script through &lt;code&gt;grep -v&lt;/code&gt; to hide a deprecation warning. A database auth failure exited zero, and that became &lt;code&gt;STATUS: Success&lt;/code&gt;, then a fleet-wide &lt;code&gt;OK&lt;/code&gt; across both production boxes. The lie got more authoritative at every hop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Placeholders are claims.&lt;/strong&gt; Our dashboard rendered "$1,284 saved this month" as static HTML before live data arrived. A brand-new account with zero usage would have been shown a fabricated saving. I found it while opening signup to the public, one step before strangers would have seen it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Publish the path where you are weaker.&lt;/strong&gt; Our trap set is 200 of 200 on the primary path. Under failover it is 30 of 40, and every miss is the same verdict: it calls a tool where it should decline. Both numbers are on the page. The second is the more useful one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go and check it
&lt;/h2&gt;

&lt;p&gt;The page is live at &lt;a href="https://tirtha.ai/capabilities" rel="noopener noreferrer"&gt;tirtha.ai/capabilities&lt;/a&gt;. Seven paths, what checks each one, what it measured, and the review state of every figure.&lt;/p&gt;

&lt;p&gt;To try it rather than read about it, &lt;a href="https://tirtha.ai/verify" rel="noopener noreferrer"&gt;tirtha.ai/verify&lt;/a&gt; runs live against our API with no key and no signup. Three prefilled adversarial cases, and you can watch it decline a call instead of inventing one.&lt;/p&gt;

&lt;p&gt;To run it on your own workload: go to &lt;a href="https://tirtha.ai" rel="noopener noreferrer"&gt;tirtha.ai&lt;/a&gt;, click Get an API key, sign in with Google, and start. Free while we are in beta. No card, no email, no sales call. You get 100 requests a month and it stops rather than surprises you.&lt;/p&gt;

&lt;p&gt;If you find a claim on that page that does not survive, I want to hear it. That is not rhetorical. The last time someone did, they were reading our own published text, and they were right.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>We built a router to predict when a cheap model is enough. It does not work.</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Wed, 29 Jul 2026 02:10:58 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/we-built-a-router-to-predict-when-a-cheap-model-is-enough-it-does-not-work-3j24</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/we-built-a-router-to-predict-when-a-cheap-model-is-enough-it-does-not-work-3j24</guid>
      <description>&lt;p&gt;If you serve a model cascade, escalation is your cost dial. Not your model choice, not your prompt, not your context window. The single number that moves your bill is what fraction of requests climb to the expensive tier.&lt;/p&gt;

&lt;p&gt;So the obvious thing to build is a router: look at the incoming request, predict whether the cheap model will get it right, and only pay for the expensive one when the answer is no. We built that. It does not work, and the reason turned out to be more interesting than a working router would have been.&lt;/p&gt;

&lt;p&gt;Publishing it because a negative result with a mechanism is worth more than a positive result with a story, and because the last two times we published numbers, readers found the flaws faster than we did.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we built and what it scored
&lt;/h3&gt;

&lt;p&gt;Our gateway already embeds every prompt, because the semantic cache needs a vector. Reusing that vector to predict difficulty is free. That is exactly why we did it, and that turned out to be the founding design flaw.&lt;/p&gt;

&lt;p&gt;Trained on 539 real coding tasks labelled by actual execution (428 easy, 111 hard):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;held-out AUC                       0.594
5-fold CV                          0.55 to 0.57   (one fold below chance)
best threshold                     scores exactly what "never escalate" scores
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A classifier that cannot beat a constant policy is not a weak classifier. It is not a classifier.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is a feature limit, not a tuning problem, and we made it prove that
&lt;/h3&gt;

&lt;p&gt;The tempting read is underfitting or overfitting, so we swept L2 regularisation across four orders of magnitude, 0.01 to 100, with cross-validation at every step. Train AUC stayed at 0.94 to 0.98 while test AUC stayed at 0.58 to 0.59, at every single setting. The gap never closed. A gap that survives four orders of magnitude of regularisation is telling you the features do not contain the signal.&lt;/p&gt;

&lt;p&gt;Then the result that actually explains it. We threw together 11 crude surface features, things like length and token counts, no semantics at all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;11 crude surface features          AUC 0.610
1024-dimension prompt embedding    AUC 0.552
both together                      AUC 0.609   (the embedding adds nothing)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eleven numbers you could compute with a ruler beat a 1024-dimension semantic embedding. The reason is simple once you see it: &lt;strong&gt;the cache vector encodes topic, not difficulty.&lt;/strong&gt; It is built to answer "have I seen a question like this before", and it is good at that. Two questions about sorting a list sit close together in that space whether one is trivial and the other is subtle. We reused it because it was free, and free was the whole problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two measurement traps, which are worth more than the router
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;One. Scoring a cost-saving router on accuracy alone marks it failed by construction.&lt;/strong&gt; A router that&lt;br&gt;
saves money by sending easy work to a cheap model will, correctly, be slightly less accurate than&lt;br&gt;
always escalating. Our first yardstick printed DO-NOT-SHIP on a router that actually had skill. The&lt;br&gt;
control you need is &lt;strong&gt;random routing at the same cost&lt;/strong&gt;, not the expensive model. If you cannot beat&lt;br&gt;
a coin flip that spends what you spend, you have nothing. If you can, you have something, even if your&lt;br&gt;
raw accuracy went down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two. The ceiling is not "always escalate".&lt;/strong&gt; We assumed the expensive model was the upper bound and&lt;br&gt;
a perfect router would approach it. It is not. On our 539 tasks, escalating everything to the top tier&lt;br&gt;
&lt;strong&gt;rescues 39&lt;/strong&gt; answers the cheap model got wrong and &lt;strong&gt;breaks 23&lt;/strong&gt; it had already got right. Net +16.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;always escalate      82.4%
a PERFECT router     86.6%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A perfect router beats always-escalate by 4.2 points, because it also knows when &lt;em&gt;not&lt;/em&gt; to escalate. That headroom is real and no gate-local heuristic captures it. If you are benchmarking a cascade against "just use the big model", you are measuring against the wrong ceiling.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is still alive
&lt;/h3&gt;

&lt;p&gt;Showing the router the cheap model's &lt;strong&gt;draft&lt;/strong&gt; rather than only the prompt does better: AUC 0.640, and 81.8% accuracy at 36% escalation against 80.5% for an equal-cost random control. That is the right shape. But permutation testing gives p=0.0375 unadjusted and roughly &lt;strong&gt;p=0.30 after Bonferroni&lt;/strong&gt;, so the honest verdict is promising, not proven. We are not going to claim it until it survives a pre-registered run.&lt;/p&gt;

&lt;p&gt;Which makes sense mechanically: the draft carries evidence of difficulty that the question alone does not. A model that is about to be wrong often looks different while being wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  The questions, and this is why I am posting
&lt;/h3&gt;

&lt;p&gt;I would rather hear from people who have hit this than keep guessing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What features actually carry difficulty before generation?&lt;/strong&gt; We have shown that a topic embedding&lt;br&gt;
does not, and that crude surface stats beat it. That is a low bar. What clears it?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Is pre-generation difficulty prediction possible at all, or is the draft the earliest honest&lt;br&gt;
signal?&lt;/strong&gt; It is entirely plausible that "will this model fail" is not a property of the question,&lt;br&gt;
only of the interaction. If someone has evidence either way I would like to see it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If you run a cascade in production, what do you actually route on?&lt;/strong&gt; I suspect the honest answer&lt;br&gt;
for most teams is a hand-written rule about request type, and I suspect those rules do better than&lt;br&gt;
our classifier did. That would itself be a finding.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Numbers, labels and the negative result are ours to share. If you want the setup in more detail, ask and I will write it up.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>devops</category>
    </item>
    <item>
      <title>Tokens Are Not the Unit</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Sun, 26 Jul 2026 20:04:49 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/tokens-are-not-the-unit-26g6</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/tokens-are-not-the-unit-26g6</guid>
      <description>&lt;p&gt;Every AI provider publishes a price in dollars per million tokens. Every comparison table ranks by it. Every build-versus-buy spreadsheet runs on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That number is misleading, and not in a small way. It can be wrong by 10x, and wrong in the direction that makes the expensive option look cheap.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This piece explains seven things about the real cost of AI work. Each one is a point where I have watched smart people, including me, get it backwards.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The sticker price is not the price
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: you are billed for tokens the model produces while thinking, even though you never see them and cannot use them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern models emit "reasoning tokens." The model works through the problem, and that working-out is generated text. You are charged for it. On many APIs you never even receive it.&lt;/p&gt;

&lt;p&gt;Here is a real evaluation we ran. We were considering swapping our low-cost tier for a cheaper model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current model:   $0.07 in / $0.27 out per million tokens
Candidate model: $0.05 in / $0.20 out per million tokens
On paper: about 30% cheaper on both sides.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obvious swap. So we sent it one real request. It answered correctly. Then we read the billing detail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;274 prompt tokens
132 completion tokens
  of which 123 were REASONING tokens
  of which   9 were the actual answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You are billed for all 132. You can only use 9.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do that arithmetic and the effective price of a useful output token was &lt;strong&gt;$2.93 per million&lt;/strong&gt;, which is 14.7 times the advertised rate. &lt;strong&gt;The "30% cheaper" model was roughly ten times more expensive than the one it appeared to undercut.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We verified this against the provider's own reported cost for that call and the two agreed exactly, so this is not a units error on our side.&lt;/p&gt;

&lt;p&gt;One honest limit: that was a single call. The ratio will move with how hard the question is. &lt;strong&gt;Treat the mechanism as the finding, not the specific 14.7.&lt;/strong&gt; The direction does not move.&lt;/p&gt;

&lt;p&gt;There is a second trap in the same family. On some models the reasoning goes into a separate field and the content field comes back empty. Under a tight output limit, the reasoning eats the entire budget before any answer is produced. We saw exactly this: at a 100 token limit, empty response. At 200, a correct one. &lt;strong&gt;An empty response looked like the model was incapable. It was actually a budget symptom.&lt;/strong&gt; If we had trusted the first reading we would have discarded a model that works fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT:&lt;/strong&gt; before you believe any price comparison, send one real request and read &lt;code&gt;completion_tokens_details.reasoning_tokens&lt;/code&gt; in the response. Then compute dollars per &lt;em&gt;useful&lt;/em&gt; output token. If your provider does not expose that field, you cannot actually price the model, and you should say so out loud in the meeting.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Cheap models are not uniformly worse. They fail differently, and the difference is the whole story.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: the standard mental model, that models sit on one line from dumb to smart, will get you hurt. Two models with nearly identical scores can behave completely differently when it matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most people picture a single quality axis. Expensive is smart, cheap is dumb, pick a point that fits the budget. If that were true, choosing a model would be a budget exercise.&lt;/p&gt;

&lt;p&gt;It is not true. Here is a field of models on 800 tool-calling tasks. First, plain accuracy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frontier model A   95.9
frontier model B   95.1
ours               ~94
strong open model  93.6
cheap model C      93.0
cheap model D      91.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that column alone and the cheap models look like a steal. Four percentage points for a fraction of the price.&lt;/p&gt;

&lt;p&gt;Now here is a second column. Inside those 800 tasks are deliberate traps: requests where the correct behavior is &lt;strong&gt;to decline&lt;/strong&gt;, because the right tool is not available or the request is malformed. This column is the percentage of traps handled &lt;em&gt;without&lt;/em&gt; grabbing the wrong tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frontier model A   100%
ours               100%
strong open model  100%
cheap model C       90%
cheap model D       52%   &amp;lt;-- and this model scored 91 on accuracy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stop on that last line. A model that looks four points behind on accuracy will pick up the wrong tool half the time it is baited.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about what that means in a system with real permissions. That is not "slightly less accurate." That is a model that will confidently call &lt;code&gt;delete_records&lt;/code&gt; when it should have said "I do not have a tool for that." The accuracy average washed the single most important behavior completely out of view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT:&lt;/strong&gt; build a small set of tasks where the right answer is to refuse, and measure the refusal rate separately. Never let it be averaged into an accuracy score. If a vendor cannot tell you what their model does when it should do nothing, you do not have the number that matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Because they fail differently, sorting beats upgrading
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: if cheap models were uniformly worse, your only lever would be paying more. Because they fail in specific, predictable ways, you have a much better lever: send each task to the weakest thing that can actually do it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is routing, and the important thing about routing is that &lt;strong&gt;it is a sorting problem, not an intelligence problem.&lt;/strong&gt; Sorting is cheap. Intelligence is expensive. Any time you can convert the second into the first, you win.&lt;/p&gt;

&lt;p&gt;A concrete picture over thirty days of our real production traffic, 68,369 requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Priced at frontier rates, this exact traffic:  $166.25
What it actually cost us:                      ~$46 to $51
Gross margin:                                  about 70%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the composition is the part worth internalizing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;84% of our total cost was the escalations to the expensive model.&lt;/strong&gt; Everything else, all the cheap serving, all the infrastructure, was rounding error next to it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That means the cost dial is not which model you picked, and not the price you negotiated. It is how often you have to escalate.&lt;/strong&gt; A 10% reduction in escalation rate does more for your bill than a 10% discount from any vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT:&lt;/strong&gt; instrument your escalation rate before you optimize anything else. If you do not know what fraction of your requests need the expensive model, you do not know what your system costs or why.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Verification is what makes cheap safe
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: routing on its own is a gamble. What turns it into engineering is being able to cheaply check whether the cheap answer is right.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the asymmetry the whole approach rests on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Producing a correct answer is expensive. Checking one is often very cheap.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You already know this from normal software. Writing the function is the hard part. Running the tests is the easy part. That asymmetry does not disappear when a model writes the function, and it is the thing you should be exploiting.&lt;/p&gt;

&lt;p&gt;Cheap checks available to you: run the tests. Check the types. See if it compiles. And one more that people underuse: &lt;strong&gt;ask two independent models and see if they agree.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We measured that last one. On questions with no tests to run, using two endpoints we believed were independent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITHDRAWN, see the correction below:
  When the two agreed, probability the answer was wrong:  0.00   (n=160)
  How often they agreed:                                  76%

What re-measurement found, once the gate was tested per workload shape:
  short-answer arithmetic (what the original probe used)   ~0
  code, with executable tests as ground truth              1.7% to 3.5%
  faithfulness judgement, real off-trap data              27.5%   (95% CI 16.1 to 42.8, n=70)
  how often the two agreed on that data                     61%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CORRECTION, added 2026-07-27. Do not use the 0.00 above.&lt;/strong&gt; A reader (&lt;a class="mentioned-user" href="https://dev.to/anp2network"&gt;@anp2network&lt;/a&gt;) took the number apart in the comments, and our own follow up measurements agree with them on every point. Leaving it uncorrected would be the exact failure this piece complains about elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One. Zero wrong in 160 does not bound the error rate at zero.&lt;/strong&gt; For a zero numerator the 95% upper bound runs about 3/n, roughly 1.9%. With the gate passing 76% of traffic that permits something like 1.4% of everything served to be wrong and never checked. The point estimate was 0.00. The bound never was.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two. That probe used short answer arithmetic, where the cheap tier is essentially never wrong.&lt;/strong&gt; A gate cannot be measured where the primary does not fail, and every row showing the primary correct should have been the tell. Re-run on code, using the same agreement check and the benchmark's own tests as ground truth, the gate leaks low single digit percent, not zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three. Agreement substitutes for correctness only if the two endpoints fail independently, and independence is a property of what the provider is serving, not of your code.&lt;/strong&gt; Ours quietly stopped being independent. The witness was selected by model name, and all three of our cheap backends turned out to be the same underlying model under three different spellings. A same model pair agrees about 88% of the time against 70 to 75% for a genuinely different one. That is close to a rubber stamp, and a rubber stamp also reports 0.00.&lt;/p&gt;

&lt;p&gt;Those 160 cases spanned four task families including deliberately hard traps. We originally read the traps as reassurance. That was backwards. A trap works by shared structure in the input, shared structure is exactly what correlates two endpoints, so the gate thins out on the cases that cost the most to get wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the gate actually buys you, stated honestly: it lowers the rate at which you serve a wrong cheap answer. It does not drive it to zero, and how far it lowers it depends on the two endpoints really being different. Verify that they still are, and keep verifying, because the answer can change without you deploying anything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The asymmetry this section opens with still holds. Checking is cheaper than producing, and routing by a check still beats routing by hope. What does not hold is treating a single agreement number, measured once, on the wrong shape of task, as a guarantee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT:&lt;/strong&gt; for every class of work you send to a model, write down how you would check the answer cheaply. If you cannot answer that, that class of work is not a routing candidate yet, and that is useful to know before you build.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The benchmarks actively punish the behavior you want
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: the leaderboards score a correct refusal as a failure. If you pick models by leaderboard, you are selecting against safety.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one is worth being very explicit about, because it is counterintuitive and it is expensive.&lt;/p&gt;

&lt;p&gt;The most valuable behavior in a production agent is declining to act when the request is ambiguous, malformed, or outside its remit.&lt;/p&gt;

&lt;p&gt;The major agent benchmarks score &lt;strong&gt;task success&lt;/strong&gt;. A refusal is a failed task. They award exactly nothing for "correctly declined to do the dangerous thing."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So a system tuned for production safety scores WORSE on the headline number than a system that always attempts and is occasionally catastrophically wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sit with that. The public number that everyone compares is, in this specific and important respect, pointing the wrong way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT:&lt;/strong&gt; run the benchmarks anyway, because your customers and your competitors will. But report the wrong-action rate right next to the task-success rate, every time. And know both numbers privately before anyone runs them at you publicly.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Your workload shape decides your economics, not your architecture
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: a single blended cost-per-request number hides the variable that actually determines whether this is profitable for you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two workloads through our identical system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tool-calling work:  almost never needs the expensive model
Coding work:        about 57% escalated on fresh problems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same code. Same models. Same prices. One of those is enormously profitable and the other is thin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our healthy margin exists partly because our traffic happens to be tool-calling heavy. A customer whose work is mostly fresh coding would see materially worse economics, and it would be dishonest of us to quote them our number.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am saying that plainly because the whole industry quotes blended numbers, and a blended number is a hidden assumption about your mix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT:&lt;/strong&gt; when anyone shows you a cost-per-request for an AI system, your first question is "on what mix of work?" If they do not have an answer, the number describes their traffic, not yours. And measure your own mix before you forecast anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Publish the ceiling honestly, because someone else will find it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: we are at parity on code, not ahead, and saying so is the only version that survives contact with a skeptic.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On a clean, cache-free run of a standard coding benchmark:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Our cascade:        92.1
Frontier model A:   92.7
Frontier model B:   93.3
The bare cheap model alone: 81.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same harness for all four. We are slightly &lt;em&gt;under&lt;/em&gt; the frontier. The architecture adds about 11 points over the cheap model by itself.&lt;/p&gt;

&lt;p&gt;We were tempted by a "beats the frontier" line. The measurement did not support it, so we do not use it. &lt;strong&gt;Parity is the honest word, and parity at a fraction of the cost is the actual product.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT:&lt;/strong&gt; the number that does not flatter you is the only one worth publishing, because it is the only one that holds up when a customer reruns it. A claim you cannot survive being checked on is a liability with a delayed fuse.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. The hardest part is not building the system. It is trusting your own measurements.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;THE POINT: a wrong measurement is more dangerous than no measurement, because it comes with confidence attached.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the one I would most want a reader to take away, because it applies whether or not you ever build any of the above.&lt;/p&gt;

&lt;p&gt;In a single working session, we chased seven separate alarms. &lt;strong&gt;All seven were broken instruments, not real problems.&lt;/strong&gt; A parser reading five rows of a seventy-nine row file and reporting a catastrophe. A checker matching error strings against its own console output and finding "errors" it had printed itself. A meter reporting 135% of a hard limit when the true figure was 27%.&lt;/p&gt;

&lt;p&gt;Three more from production, all instructive:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We were dropping two thirds of every traffic burst and could not see it.&lt;/strong&gt; Our server had a careful queue that answered overload with a polite "busy, try again," which is exactly what an aggregator wants. But the operating system's own accept queue underneath it was at its default of five connections, so any burst deeper than five was refused by the kernel before a single line of our code ran. &lt;strong&gt;Every load test we had ever written sent exactly as much traffic as the server was willing to admit, which made those tests structurally incapable of finding this.&lt;/strong&gt; The test design guaranteed the blind spot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Then we fixed it wrong, in a way that looked right.&lt;/strong&gt; A configuration flag said a feature was off. The deployed code was an older version that could not express "off" and instead disabled the feature completely. Latency &lt;strong&gt;improved&lt;/strong&gt;. Of course it did, because doing nothing is fast. Every dashboard was green while a feature was 100% dead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And we measured a worst case at 17 seconds using 10 samples.&lt;/strong&gt; Later we measured the identical component with 828 samples. &lt;strong&gt;The real worst case was 126 seconds.&lt;/strong&gt; Ten samples gave us an accurate median and a completely wrong tail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT TO DO ABOUT IT&lt;/strong&gt;, and these are the four habits that would have caught every case above:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Change one variable at a time.&lt;/strong&gt; If your fix changes three things and it works, you have learned that the bundle works. You have learned nothing about why, and you will keep the two useless changes forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn your fix off and confirm the problem comes back.&lt;/strong&gt; A test that only ever passes has told you nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match your sample size to the statistic.&lt;/strong&gt; A median settles in tens of samples. A worst case needs hundreds. &lt;strong&gt;A tail measured with 10 samples is not a cautious estimate, it is a wrong one that reads as cautious.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chase the gap you cannot explain.&lt;/strong&gt; When a number is slightly off and you invent a plausible reason to dismiss it, that reason is usually the bug. Twice in one week the explanation I reached for ("network overhead") was covering a real defect.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The one page version
&lt;/h2&gt;

&lt;p&gt;If you remember nothing else:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Price in &lt;strong&gt;dollars per successful result&lt;/strong&gt;, never per million tokens.&lt;/li&gt;
&lt;li&gt;Read the &lt;strong&gt;reasoning token count&lt;/strong&gt; before believing any quoted price.&lt;/li&gt;
&lt;li&gt;Measure the &lt;strong&gt;wrong-action rate&lt;/strong&gt; separately. Averages hide the failure that matters most.&lt;/li&gt;
&lt;li&gt;Track your &lt;strong&gt;escalation rate&lt;/strong&gt;. It is the cost dial, not your model choice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify cheaply so you can generate cheaply.&lt;/strong&gt; Tests, types and independent agreement all cost less than intelligence.&lt;/li&gt;
&lt;li&gt;Quote economics &lt;strong&gt;per workload shape&lt;/strong&gt;. A blended number is a hidden assumption about someone else's traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify the instrument before acting on its number&lt;/strong&gt;, and be most suspicious when the number is good.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this requires owning a frontier model. It requires taking measurement seriously, which is rarer, and considerably cheaper.&lt;/p&gt;




&lt;h3&gt;
  
  
  Edits to this article
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;2026-07-27.&lt;/strong&gt; The agreement figure this piece originally published, a 0.00 probability of a wrong&lt;br&gt;
answer when two endpoints agree at n=160, was withdrawn. A reader, &lt;a class="mentioned-user" href="https://dev.to/anp2network"&gt;@anp2network&lt;/a&gt;, took it apart in the&lt;br&gt;
comments and was right on every point: a zero numerator bounds the error near 3/n rather than at zero,&lt;br&gt;
the probe used short-answer arithmetic where the cheap tier is essentially never wrong so the gate was&lt;br&gt;
measured where the primary does not fail, and independence between two endpoints is a property of what&lt;br&gt;
a provider is serving rather than of your code, so it can decay with nothing in your system changing.&lt;br&gt;
Ours had decayed exactly that way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2026-07-28.&lt;/strong&gt; Replaced the withdrawn 0.00 inside the table itself instead of leaving it standing&lt;br&gt;
above a correction, and added the re-measured numbers by workload shape. The honest summary is that&lt;br&gt;
P(wrong when they agree) is not one number. It is close to zero on arithmetic, 1.7 to 3.5 percent on&lt;br&gt;
code checked by executable tests, and 27.5 percent on faithfulness judgement. Quoting any single one of&lt;br&gt;
those as the property of the gate is the mistake this article made the first time.&lt;/p&gt;

&lt;p&gt;Also worth stating plainly, since the same commenter suggested it: we now escalate a sample of the agreed cases to the expensive model anyway and score whether it concurs, which turns a one-time n into a number that moves when a route changes behind either endpoint. That is running in production as of this edit. We will publish what it says, including if it is unflattering.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Your company already runs the hardest parts of an AI agent platform</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Sun, 26 Jul 2026 20:03:50 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/your-company-already-runs-the-hardest-parts-of-an-ai-agent-platform-2f3g</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/your-company-already-runs-the-hardest-parts-of-an-ai-agent-platform-2f3g</guid>
      <description>&lt;p&gt;Every AI agent session starts as a fresh mind. It has no memory of yesterday, no memory of the correction you gave it last week, and no idea what your company has already decided.&lt;/p&gt;

&lt;p&gt;That is fine for one developer with one project. It falls apart the moment you have five teams, because now the things that must be true everywhere have to somehow be true in every session, of every project, forever.&lt;/p&gt;

&lt;p&gt;The obvious answer is to write a good prompt and paste it into each project. That answer fails twice. It drifts out of sync the first week, because six copies of a rule are six rules. And every pasted line is paid for in every session forever, so the document that encodes your standards becomes a tax on all future work.&lt;/p&gt;

&lt;p&gt;The better answer is the one your company already uses for people: &lt;strong&gt;inheritance, scoped by the org chart, with a channel for asking a human.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the architecture, and then the part where I show you the data on which half of it worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three tiers, inherited rather than copied
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tier one is the constitution.&lt;/strong&gt; One document at the root, loaded automatically by every session in every project beneath it. It holds identity and the things that are never negotiable: what counts as evidence, what "done" means, the safety boundaries that are legal rather than stylistic.&lt;/p&gt;

&lt;p&gt;Mine is capped at about forty lines, and the cap is the design, not tidiness. Every line here is read by every session of every project, forever. A constitution that grows is a bill that arrives every time anyone starts work. If a rule is not needed by every project before it knows what it is doing, it does not belong in tier one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier two is the project constitution.&lt;/strong&gt; What is true for this project and nothing more. It inherits tier one for free, so it never restates it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier three is everything else.&lt;/strong&gt; In my case, several hundred documents. None of them load at startup.&lt;/p&gt;

&lt;p&gt;Notice that the cost runs opposite to the volume. The smallest tier is the most expensive because everyone pays for it always. The largest tier is nearly free because nobody pays for it until something asks. Most people build this upside down: they put the huge context at the top and wonder why every session is slow and expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mechanism that makes tier three work
&lt;/h2&gt;

&lt;p&gt;A pile of documents nobody reads is not memory. What turns it into memory is a short table in tier two that maps &lt;strong&gt;an action&lt;/strong&gt; to &lt;strong&gt;the thing you must read before doing it&lt;/strong&gt;. Before you touch billing code, read this. Before you change anything a customer sees, read that.&lt;/p&gt;

&lt;p&gt;The agent does not go looking for knowledge. The knowledge is delivered at the moment of the action that needs it.&lt;/p&gt;

&lt;p&gt;This distinction sounds like a detail. It is the entire difference between the half of my system that worked and the half that died, and I have the numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the humans go
&lt;/h2&gt;

&lt;p&gt;An agent organization needs two human channels, and they are not the same thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escalation&lt;/strong&gt; is the agent saying "I need a decision that is not mine to make." A production change, a spend commitment, anything irreversible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Calibration&lt;/strong&gt; is a human saying "that was wrong, and here is the shape of the wrongness." This is the more valuable of the two and the one most setups drop entirely. A correction that lives only in a chat window is a correction you will pay for again in three weeks.&lt;/p&gt;

&lt;p&gt;Both should run through the channel your organization already lives in. For most companies that is Teams. Not because Teams is special, but because a notification surface people already have open is the only kind that gets read. I have built beautiful dashboards for this. Nobody opened them, including me.&lt;/p&gt;

&lt;p&gt;Threads matter here more than they look. A thread gives a correction a durable home attached to the thing being corrected, which is exactly the raw material you need if you ever want to fold that correction back into tier two.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I did not expect to be so clean
&lt;/h2&gt;

&lt;p&gt;Once you accept the org chart as the scoping model, most of the hard problems stop being yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity and permission: your existing directory.&lt;/strong&gt; An agent becomes a principal in the directory you already govern. It joins groups, it inherits those groups' rights, and it is revoked exactly the way a leaver is revoked. The alternative is a second permission model that lives beside the real one and drifts away from it, which is the security incident everyone eventually writes up.&lt;/p&gt;

&lt;p&gt;This also answers the question every risk team asks first, which is not "is the AI accurate" but "what can it reach, and who decided that." If the answer is "the same groups that govern the humans doing this work," you are having a very different conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The tiers: your existing document storage.&lt;/strong&gt; Tier one is a site everyone reads, referenced rather than copied, so a change to the rules is a reviewable, versioned event instead of an edit nobody noticed. Tier two lives with the team that owns the work, so the boundary is one the company already agreed on rather than a folder convention somebody invented on a Tuesday. And personal scope goes in personal storage: private by default, follows the person, cannot leak into shared tiers by accident, because the permission is the boundary rather than a naming rule.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit: your existing audit log.&lt;/strong&gt; Who told the agent what, and when. You inherit the answer instead of building an audit system for agents from scratch.&lt;/p&gt;

&lt;p&gt;None of this is a product to buy. That is the point. The boring parts of an agent platform, identity and scoping and audit and a channel humans actually read, are precisely the parts your company solved years ago for its people. An agent organization should inherit them, not reinvent weaker copies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signal, and why the privacy design is a data quality mechanism
&lt;/h2&gt;

&lt;p&gt;Information has to flow upward or the upper tiers are fiction. But if individual identity flows upward, you have built surveillance, and surveillance destroys the thing you were collecting.&lt;/p&gt;

&lt;p&gt;The resolution is that &lt;strong&gt;the signal carries the pattern, not the person.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PERMITTED:      "4 people flagged this standard as unclear this month"
NOT PERMITTED:  "Sarah flagged it 4 times"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Identity is stripped at the team tier. Everything above receives patterns only, and no reverse lookup is possible by construction. That last clause matters: it is a structural property of how permissions and aggregation are built, not a policy somebody promised to follow.&lt;/p&gt;

&lt;p&gt;There is also a threshold. A single event is not a pattern, so nothing escalates until several signals of the same type appear. This stops one bad afternoon from being surfaced upward as an organizational trend.&lt;/p&gt;

&lt;p&gt;The governing shape is: &lt;strong&gt;private truth, then anonymous patterns, then organizational intelligence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is why this is engineering and not ethics decoration. If people believe their personal tier can be used against them, they will populate it performatively. Performative input produces false patterns. False patterns produce confident, wrong decisions at the top of the organization, which is worse than having no system at all. &lt;strong&gt;The entire intelligence value of the system depends on the bottom tier being genuinely private, so the privacy guarantee is load-bearing infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop that makes it improve itself
&lt;/h2&gt;

&lt;p&gt;A memory system that only stores is a filing cabinet. What makes it compound is routing the questions.&lt;/p&gt;

&lt;p&gt;When someone asks the assistant about a standard or a policy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If a calibrated answer exists&lt;/strong&gt;, answer immediately with a citation to the exact version, and log the question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If no answer exists&lt;/strong&gt;, do not improvise one and move on. Flag it as an open edge case and route it to whoever owns that standard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If the same question appears repeatedly&lt;/strong&gt;, that is not several confused people. That is one ambiguous standard, and it should be escalated as such.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last inversion is the valuable one. Three people asking the same question about a rule is evidence about the rule, not about the people. Most organizations read it the other way around and send the three people to training.&lt;/p&gt;

&lt;p&gt;The accumulating question log turns out to be a real-time map of where the organization is confused, produced continuously, with no survey and no focus group.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now the half that failed
&lt;/h2&gt;

&lt;p&gt;I added one more piece: a shared log where each project session ends by writing one line about what moved, feeding a cross-project summary.&lt;/p&gt;

&lt;p&gt;Twenty two days later I counted what was actually in it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ten entries.&lt;/strong&gt; Eight of them in the first three days. One more eleven days ago. Then nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All ten came from a single project, out of five.&lt;/strong&gt; The live one with a real customer has never written a line.&lt;/p&gt;

&lt;p&gt;The shared summary, the entire reason the layer existed, was last modified the day it was created. It still confidently describes a project as a shell folder that I retired eight days afterward. It is not stale. It is wrong, and it looks authoritative while being wrong, which is considerably worse than being empty.&lt;/p&gt;

&lt;p&gt;There was also a schema drift I never noticed: the timestamp is an integer in the first row and a formatted string in the last. I only found out because the script I wrote to analyze all this crashed on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it died, and why tier three did not
&lt;/h2&gt;

&lt;p&gt;The design was fine. The trigger was not.&lt;/p&gt;

&lt;p&gt;Writing that line was a &lt;strong&gt;remembered&lt;/strong&gt; act. Nothing fired it. It sat at the end of a session and depended on somebody choosing to do it while tired and finished. That works for about three days.&lt;/p&gt;

&lt;p&gt;Tier three works because it is bound to an act. Touch the file, get the rule. Nothing depends on anyone remembering the rule exists.&lt;/p&gt;

&lt;p&gt;Same system. Same week. Same author. The only difference is what starts the write.&lt;/p&gt;

&lt;p&gt;I have a second case that removes any remaining doubt. I built a lookup table for operational answers, seeded it with eight rows, and told the agent to add to it as it went. A day later it had eight rows. Zero added, while that same day's work had produced at least three entries that qualified and filed them somewhere else. The table did not need more rows. It needed a trigger.&lt;/p&gt;

&lt;h2&gt;
  
  
  The law
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Anything that depends on remembering will not happen. Bind it to an act, or it does not exist.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because agents are careless. Because every session is a fresh mind with no memory of having agreed to the habit. You cannot build organizational memory out of good intentions distributed across amnesiacs.&lt;/p&gt;

&lt;p&gt;And pull-based systems fail in the most flattering way possible. The file is still there. The design still reads well in the diagram. Nothing errors. You do not find out until you go and count the rows, which is why you should go and count the rows.&lt;/p&gt;

&lt;p&gt;Two corollaries I paid for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The read side needs pushing too.&lt;/strong&gt; I assumed someone would open the summary. Nobody did for three weeks, including its author. A summary nobody is handed is a summary nobody reads. Surface it unprompted at the start of a session, or accept that it does not exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anything derived needs a freshness check.&lt;/strong&gt; A dashboard that is silently eleven days stale is worse than no dashboard, because it still looks like an answer. Stamp it with when it was generated and make it complain when that gets old.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you are building this
&lt;/h2&gt;

&lt;p&gt;In the order I would do it again:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write tier one and cap it.&lt;/strong&gt; Forty lines. If you cannot say it in forty lines it is a tier two rule wearing a disguise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build the trigger table before the documents.&lt;/strong&gt; The delivery mechanism is the product. The documents are inventory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set the privacy boundary before the first signal.&lt;/strong&gt; You cannot retrofit anonymity onto a system people already distrust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the agent in your directory.&lt;/strong&gt; Groups, not bespoke config. Deprovisioning should already work on day one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wire escalation into your chat tool before you need it.&lt;/strong&gt; The first time an agent needs a human should not also be the first test of the channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make calibration cheap to capture.&lt;/strong&gt; If correcting the agent takes more than a reply, it will not happen, and you will pay for the same correction repeatedly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then, and only then, the upward flow.&lt;/strong&gt; And bind it to something that already happens at the end of work, never to a good intention.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start with a software team, whatever the eventual target is. Developers already live in this world, already use context files, and already feel the specific pain of losing the reasoning behind decisions. You do not have to explain the concept to them. You show them, and two weeks later either someone says it changed how they work, or it did not, and you have your answer cheaply.&lt;/p&gt;

&lt;p&gt;The architecture is not the hard part. Getting it to still be running in three weeks is the hard part, and that is decided entirely by what fires the write.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Everyone is hardening the structure. Nobody is passing down the why.</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Sun, 05 Jul 2026 17:14:28 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/everyone-is-hardening-the-structure-nobody-is-passing-down-the-why-2f8n</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/everyone-is-hardening-the-structure-nobody-is-passing-down-the-why-2f8n</guid>
      <description>&lt;p&gt;Two weeks ago I published a short piece called The Two-Channel Problem (tirtha.ai/research, the perspective panel) about what actually breaks when a forgetful AI agent builds a real product over months. Since then a genuinely good conversation has emerged between people running AI organizations. The nokaze seven-week paper named the cross-conversion gap: the rule file exists, and the agent sails right past it in the exact situation it was written for. The comment thread under it converged on real fixes: action-keyed triggers instead of "notice the moment," completion claims invalid without a re-checkable evidence source, checks that cannot be run by the layer that felt confident writing the claim. We run an AI-operated shop too (one human, a Claude orchestrator, Codex, a headless build fleet), and we built the same walls independently. All of that is right, and trading notes with these teams has sharpened our own guards twice this week alone.&lt;/p&gt;

&lt;p&gt;But the conversation is converging on exactly one of the two channels, and the update I owe is about the other one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the structure channel fixes
&lt;/h2&gt;

&lt;p&gt;Every fix in that thread strengthens what we internally call the structure channel: hooks, gates, generated status, mechanically forced loading. The structure channel transmits the WHAT. It makes discipline un-forgettable, which matters enormously when your workers wake up with no memory of yesterday.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure it cannot fix
&lt;/h2&gt;

&lt;p&gt;Here is the failure it cannot fix. Early on, one of our sessions booted into a perfectly clean room: accurate task state, working guards, honest logs. It executed correctly all day, and it drifted all day. It searched instead of receiving, re-derived things the system already knew, treated the guards as obstacles to route around. Nothing it did was wrong by the letter. It complied without understanding. We started calling that a hollow successor.&lt;/p&gt;

&lt;h2&gt;
  
  
  So we run a second channel
&lt;/h2&gt;

&lt;p&gt;So we run a second channel. Plain prose, written by each session for the next one, read at boot before any work: who to be here, why the room matters, what the rules are actually FOR, what yesterday's session learned about HOW to work that the commit log cannot carry. Not documentation. A letter.&lt;/p&gt;

&lt;p&gt;The operating rule that fell out: structure transmits the what, only words transmit the why. A hook can force a file to load. It cannot make the next mind care what is in it. And an agent that does not understand why a rule exists will satisfy its letter and defeat its purpose the first time the letter and the purpose diverge, which is exactly the shape of most of the incidents this whole conversation is about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical form
&lt;/h2&gt;

&lt;p&gt;The practical form, since this sounds soft and is not:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A welcome document is read at boot, before work, and yes, a hook enforces that it gets read. We use the structure channel to guarantee the soul channel is delivered. What no hook can guarantee is that it lands. That gap is the point, not a flaw in the design.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every session writes a short transmission at handoff. Not what it did (the log has that), but what it learned about how to work here: which instinct misled it, which boring re-check saved it, what it wishes it had been told at boot.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Corrections carry their origin. Every rule is stored with the incident that created it, so the next session inherits the reason, not just the restriction.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What we observe
&lt;/h2&gt;

&lt;p&gt;The result we observe, for whatever one shop's evidence is worth: sessions that receive both channels correct themselves mid-flight in ways the guards alone never produced. This morning one of ours printed a success sentinel for a merge that had silently failed, caught it seconds later, and said out loud that it was the exact failure shape it had read about at boot. The guard did not catch that one. The letter did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the other half
&lt;/h2&gt;

&lt;p&gt;The teams in that thread are building excellent guards. If you run an organization of minds that forget, the guards are half the inheritance. Write the letters too.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>agents</category>
    </item>
    <item>
      <title>I didn't mean to build this. Looking for testers anyway.</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Sat, 04 Jul 2026 15:55:11 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/i-didnt-mean-to-build-this-looking-for-testers-anyway-4bj0</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/i-didnt-mean-to-build-this-looking-for-testers-anyway-4bj0</guid>
      <description>&lt;p&gt;I'll be honest up front: I'm not a salesman. Everyone has always told me that, and lately even the AI I build with tells me that. So this is not a pitch. This is me asking for help.&lt;/p&gt;

&lt;p&gt;I didn't set out to create any of this. It started because I kept having context window issues while building something else entirely, and I went down a rabbit hole. The rabbit hole kept going. Somewhere down there I got tired of watching my AI coding agent send every single request to the most expensive model available, whether the task needed it or not, and I started building a fix for myself.&lt;/p&gt;

&lt;p&gt;What's been embarrassing is I thought I had one story. Then the testing led me to another one. Then another. My website has changed multiple times, which has been a lesson learned in public, the hard way. The good news is there are no clients yet, so that's good :)&lt;/p&gt;

&lt;p&gt;Where the testing has left me now is this:&lt;/p&gt;

&lt;p&gt;As a gateway I am able to send routine coding requests to lower cost models that get verified before you ever see them. The hard ones escalate to a frontier model. On my benchmark runs that was about 1 in 27 requests. The full setup measured around 95 percent on HumanEval+ (n=164) at roughly 8x lower cost per request. I keep re-running these numbers because honestly I didn't quite believe them either. So far they keep holding.&lt;/p&gt;

&lt;p&gt;So based on those runs, that works out to making a Fable 5 subscription last up to 27x longer, because most of the work doesn't need that level of cost to be accurate.&lt;/p&gt;

&lt;p&gt;What I don't know yet is whether it holds up on YOUR work. Real repos, real deadlines, weird edge cases. That's exactly what I need testers for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;, because you should ask: encrypted at rest, TLS in transit, and your code is never training data. I verified the upstream providers do not train on it, and the routine tier runs on open models I host myself. Local models, privacy, security, and a cache that bends the cost curve down even lower over time. That is my goal, my promise, and what I want help testing and proving.&lt;/p&gt;

&lt;p&gt;The deal: it's pre-beta, it's &lt;strong&gt;free&lt;/strong&gt; while it is, and I will keep publishing the real numbers whether they flatter me or not. I feel like I have something special here, something people have been asking for. I just need people smarter than me to hammer on it and tell me where it breaks.&lt;/p&gt;

&lt;p&gt;Sign up on the waitlist at tirtha.ai, reply here, or message me and I'll add you to the beta team directly.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>startup</category>
    </item>
    <item>
      <title>I got my coding agent to tie the frontier for about 8x less. Here is the honest benchmark.</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Thu, 02 Jul 2026 21:32:32 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/i-got-my-coding-agent-to-tie-the-frontier-for-about-8x-less-here-is-the-honest-benchmark-2pd1</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/i-got-my-coding-agent-to-tie-the-frontier-for-about-8x-less-here-is-the-honest-benchmark-2pd1</guid>
      <description>&lt;p&gt;I am a solo founder. I do not have a lab or a team of researchers. I live paycheck to paycheck supporting my family like most people do. I didn't intend to build this. I just went down a rabbit hole and here is the story.&lt;/p&gt;

&lt;p&gt;Two things bugged me about the AI coding agents I was using. The first was the cost. Every request, easy or hard, went to the most expensive model available. The second was quieter: I did not actually know where my code was going when the agent wrote it.&lt;/p&gt;

&lt;p&gt;So I built something to fix both, and I measured it carefully, because I would rather tell you the honest number than a flattering one. Here is what I found, including the parts that are not flattering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;Most coding requests are not hard. A cheaper or local model handles them fine. Only a small slice genuinely needs a frontier model. So instead of paying frontier prices on everything, the system routes each request to the cheapest model that can actually do the job, checks the result, and escalates to a frontier model only when the check fails. Verified answers get cached, so work you have done before comes back fast. Router, verifier, frontier backstop, cache. I am holding the engineering details, but the idea is not the hard part. Measuring it honestly is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Same benchmark, same harness, across all of them. HumanEval+, 164 problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhh9e77xnj21e4ymi17xi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhh9e77xnj21e4ymi17xi.png" alt="Bar chart of HumanEval+ scores: my system 94.5 percent, Opus 4.8 at 93.3, Sonnet 4.6 at 92.7, GPT-5.3-codex at 90.2, and the cheap model alone at 84.8. My system ties the frontier models." width="718" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Parity, not a win
&lt;/h2&gt;

&lt;p&gt;I want to be careful with the words, because it matters. This is parity. It ties the frontier models. It does not beat them. Anyone who tells you their cheap setup beats the frontier on accuracy is either measuring wrong or selling something. What I am claiming is narrower and more useful: you can land in the &lt;strong&gt;same accuracy band as the frontier without paying frontier prices on every request&lt;/strong&gt;. The cheap model alone was 84.8%. The routing and verification is what closes the gap to 94.5%.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost, which is the actual point
&lt;/h2&gt;

&lt;p&gt;Measured over 313 production requests, from the real usage logs. Blended cost came out to about &lt;strong&gt;$0.002 per request, versus about $0.017 for the frontier&lt;/strong&gt; equivalent. &lt;strong&gt;Roughly 8x cheaper for work in the same accuracy band&lt;/strong&gt;. On that run, &lt;strong&gt;96% of requests were served by the cheap tier&lt;/strong&gt;, and about 3.7% escalated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second win I did not expect
&lt;/h2&gt;

&lt;p&gt;There is a second win I did not expect. Verified answers are cached, and a cache hit returns in about 0.16 seconds, which in my testing was &lt;strong&gt;24 to 185x faster than solving it fresh&lt;/strong&gt;. The more you code, the more of your work is instant. I will be honest that this compounds with real usage, and I am early, so I am watching it, not overclaiming it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is weak
&lt;/h2&gt;

&lt;p&gt;Where it is weak (you should know before you trust it). - The hardest problems still escalate to a frontier model. That is by design. On hard, multi-step problems the savings shrink, because more of them escalate. It is not a cheap model doing frontier work by magic. &lt;strong&gt;It is the right model for each job, with a backstop&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HumanEval+ is a benchmark. Real-world code is messier, and I am still measuring that part honestly rather than pretending the benchmark settles it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The verifier is only as good as the checks it runs. Give it weak tests and the gate is weaker.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About your code
&lt;/h2&gt;

&lt;p&gt;Every AI coding agent sends your code somewhere, and mine is no different. Your code does reach my gateway. I am not going to pretend otherwise. What matters is what happens to it there. I cache verified answers, never your prompts or your code. Your code never enters the shared cache, it never trains anything, and it is walled off per tenant so it can never be served to anyone else. For regulated work there is a dedicated tier I genuinely cannot reach into.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I am
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I am opening it to a first group of testers&lt;/strong&gt;. If a cheaper, private coding agent that ties the frontier on accuracy is useful to you, &lt;strong&gt;I would genuinely like your help pressure-testing it&lt;/strong&gt;. Tell me where the numbers do not hold up. I will keep publishing results as more people run it, the ugly ones included, because the honesty is the whole reason to trust a number from a guy you have never met.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have questions about the method, ask. I am around.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Serving cheap when two models agree: a measured cost lever</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Mon, 29 Jun 2026 04:18:02 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/serving-cheap-when-two-models-agree-a-measured-cost-lever-3if6</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/serving-cheap-when-two-models-agree-a-measured-cost-lever-3if6</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;A cost efficient AI system sends easy work to a cheap model and only escalates hard work to an expensive frontier model. The trouble is knowing which is which. When a task has a test, like code with unit tests, you just run the test: if the cheap answer passes, serve it; if not, escalate. But most real prompts have no test. A question like "what time is the maintenance window" cannot be checked by running code. With no test, a careful system escalates almost everything, and you pay frontier prices for work a cheap model could have done.&lt;/p&gt;

&lt;p&gt;We measured our own gateway and found exactly that. On no-test prompts in automatic mode, the system escalated to the frontier 100 percent of the time, at every context length. The cheap tier was capable, but the system did not trust it without a test, so it never served those answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: agreement as a stand-in for a test
&lt;/h2&gt;

&lt;p&gt;Instead of a test, ask a second, independent cheap model the same question. If the two cheap models agree, the answer is very likely correct, so serve it cheap. If they disagree, that is the genuinely hard case, so escalate to the frontier. Disagreement never serves a worse answer than before, because the disagreement path is the same escalation that used to happen anyway. Agreement only adds a chance to skip an unnecessary frontier call. The gate is conservative by construction, so its only failure mode is paying for an avoidable escalation, never serving a wrong answer, unless the two cheap models happen to agree on the same wrong answer. That single risk is the whole ballgame, so we measured it directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one number that can break it
&lt;/h2&gt;

&lt;p&gt;The only way this gate ever serves a wrong answer is if two cheap models agree on the same wrong answer. We call that P(wrong given agree). If it is zero, agreement is a safe stand-in for a test. So we stress tested it.&lt;/p&gt;

&lt;p&gt;We ran two architecturally different cheap models across four task families, including a set of brand new hard traps we wrote ourselves so they could not be memorized from training data (a reverse-percentage trap, a rise-then-fall price trap, a buy-two-get-one trap, a clock-chime interval trap, a snail-in-a-well trap, and more). The result, at n=160: P(wrong given agree) was 0.00 in every one of the four families (retrieval, reasoning, multi-fact, and the new adversarial traps), with zero agree-and-wrong cases out of 160 total.&lt;/p&gt;

&lt;p&gt;When the two cheap models agreed, they were correct 100 percent of the time, across every category, including the traps designed to fool them. They agreed about 76 percent of the time, and each cheap check took about 0.9 seconds at the median. One honest note on rigor: an early run showed a few apparent failures that turned out to be a formatting bug in our scoring, not real errors. We caught it, fixed it, and re-ran clean. The boring re-check is the work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CORRECTION, added 2026-07-27. The 0.00 above is real but it does not mean what this piece says it means, and two phrases here are now retracted: "safe stand-in for a test" and "correct 100 percent of the time".&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One. Zero wrong in 160 does not bound the error rate at zero.&lt;/strong&gt; For a zero numerator the 95% upper bound runs about 3/n, roughly 1.9%. At a 76% agree-rate that permits on the order of 1.4% of everything served to be wrong and never checked. The point estimate was 0.00. The bound never was, and this piece leaned on the point estimate as if it were the bound.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two. The probe was short answer arithmetic, where the cheap tier is essentially never wrong.&lt;/strong&gt; A gate cannot be measured where the primary does not fail. Every row of that probe showed the primary correct, which should have been the tell and was not. Re-run on code, using the same agreement check with the benchmark's own tests as ground truth, the gate leaks low single digit percent, not zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three. The word "independent" in the opening is doing work it cannot support.&lt;/strong&gt; Agreement substitutes for correctness only when the two endpoints fail independently, and independence is a property of what the provider is serving, not of your code. Ours quietly stopped being independent: the witness was selected by model name, and all three of our cheap backends turned out to be the same underlying model under three different spellings. A same model pair agrees about 88% of the time against 70 to 75% for a genuinely different one. That is close to a rubber stamp, and a rubber stamp also reports 0.00.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the traps cut the other way from how this piece reads them.&lt;/strong&gt; We presented the adversarial families as evidence the gate was safe. They are the opposite. A bait works by shared structure in the input, shared structure is exactly what correlates two endpoints, so the gate is least trustworthy on the cases that cost the most to get wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What survives: disagreement is still a useful escalation signal, and checking is still cheaper than producing. What does not survive is treating agreement as a test.&lt;/strong&gt; If you use this pattern, sample a slice of the agreed cases, escalate them anyway, and score whether the expensive model concurs. That turns a one time number into one that moves when a provider changes what sits behind a model name.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does to cost
&lt;/h2&gt;

&lt;p&gt;We shipped the gate to production and re-measured escalation on no-test prompts:&lt;/p&gt;

&lt;p&gt;context length  frontier escalation before  frontier escalation after   accuracy after 1,000 tokens 100%    40% 100% 4,000 tokens   100%    20% 100% 16,000 tokens  100%    0%  100% 32,000 tokens  100%    0%  100%&lt;/p&gt;

&lt;p&gt;At long context, where frontier calls cost the most, escalation went from total to zero with no loss of accuracy. Across live traffic the system now serves about 91 percent of requests on the cheap tier. Our blended measured cost is about 0.002 dollars per request, and a repeated question is served from cache at close to zero.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Why it matters&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
The savings on verifiable work, like code with tests, were already real. This extends the same economics to the large class of work that has no test, which is most real questions, without guessing and without giving up accuracy. The hard cases still get the frontier, and those are exactly the cases worth caching a high quality answer for, so the next identical question is served cheap too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honesty and limits
&lt;/h2&gt;

&lt;p&gt;Every case we proved is a single final answer. We have not yet proven the gate on multi-step reasoning where a final answer can be right by luck on a broken chain, or where two models could agree on the same wrong chain. That is the next frontier and we are not claiming it here. The result above is for two specific cheap models; a different pair could behave differently, and widening model diversity is a known lever we hold in reserve. We are publishing the result and the honesty, not the gating engineering.&lt;/p&gt;

</description>
      <category>testdev</category>
      <category>ai</category>
      <category>llm</category>
      <category>infrastructure</category>
    </item>
  </channel>
</rss>
