<?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>Who your model works with matters more than which model you picked</title>
      <dc:creator>Tom Jones</dc:creator>
      <pubDate>Tue, 18 Aug 2026 21:08:41 +0000</pubDate>
      <link>https://dev.to/tom_jones_230c4659491adcd/who-your-model-works-with-matters-more-than-which-model-you-picked-4iel</link>
      <guid>https://dev.to/tom_jones_230c4659491adcd/who-your-model-works-with-matters-more-than-which-model-you-picked-4iel</guid>
      <description>&lt;h2&gt;
  
  
  The short version, for anyone who does not benchmark models for a living
&lt;/h2&gt;

&lt;p&gt;Every few weeks a new model tops a leaderboard and the advice is to switch to it.&lt;/p&gt;

&lt;p&gt;We have been measuring our own stack for a while, and two things keep coming back that are worth separating carefully, because the second one is easy to oversell and we have oversold it twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first is measured and we are confident in it.&lt;/strong&gt; Models that a leaderboard ranks two points apart are not doing the same work. On the problems where they differ, the difference is stable: run them again and the same models are right and wrong on the same specific problems. That is a property of the models. Which one tops the column total is substantially a property of the run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second is what we would like to be true, and we have not earned it.&lt;/strong&gt; It would follow that pairing two different models beats upgrading to one better one. We have never run that experiment. We built the obvious mechanism to capture the available headroom and captured none of it. So take the title as the hypothesis this piece is about, not as a result it delivers.&lt;/p&gt;

&lt;p&gt;What we can hand you is the measurement underneath it, a ceiling we could not reach, and twenty-one days of a ledger recording every time our own second model told us something confidently false. Including once, today, about this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "a better model" actually buys you
&lt;/h2&gt;

&lt;p&gt;Start with a number that surprised us, on our own production path.&lt;/p&gt;

&lt;p&gt;We ran the same fixed 800-item tool-calling benchmark through our live system &lt;strong&gt;five separate times&lt;/strong&gt;. Nothing changed between passes. Same items, same harness, same endpoint.&lt;/p&gt;

&lt;p&gt;The five totals were &lt;strong&gt;752, 750, 750, 749, 749&lt;/strong&gt;. A mean of 93.75%, and the whole spread is three items.&lt;/p&gt;

&lt;p&gt;That looks like a beautifully stable system, and here is the part that matters: &lt;strong&gt;38 distinct items, 4.8% of the set, flipped somewhere across those five passes.&lt;/strong&gt; They cancel out. The worst pair of passes disagrees on &lt;strong&gt;23 individual items&lt;/strong&gt; while their totals differ by one.&lt;/p&gt;

&lt;p&gt;Two numbers, and they say different things. The &lt;strong&gt;score&lt;/strong&gt; is extremely stable: 0.375 points across five passes. The &lt;strong&gt;answers underneath it&lt;/strong&gt; are not: on any given pair of passes, 2.00% to 2.88% of individual items come back differently.&lt;/p&gt;

&lt;p&gt;We had a rule of thumb here that doubled the second number and used it as a threshold on the first. Our own reviewer killed it while reviewing this article, and it was right to: an item-flip rate and a score gap are different quantities, and the whole reason the score is stable is that the flips cancel. You cannot derive one from the other, and we have retracted it. The section further down shows that exchange in full, because it is a better illustration of the method than anything we could have written on purpose.&lt;/p&gt;

&lt;p&gt;What the five passes do license is narrower and still worth having. If you are going to quote a single benchmark number, run it more than once, publish the spread, and publish how many individual items moved. A stable total is not a stable measurement, and only the second of those two numbers tells you whether the thing you are ranking sits still.&lt;/p&gt;

&lt;p&gt;There is a second way the level story gets overstated, and it is worse. We took one model, kept everything identical, and changed only which company served it. On one model-and-provider pairing that moved the score by &lt;strong&gt;17.3 points&lt;/strong&gt;, from 78.2% to 95.5%. On a different pairing the same experiment moved &lt;strong&gt;0.6 points&lt;/strong&gt;, so this is a property of the specific pair rather than a law. But it means a cross-vendor ranking built on unpinned routing can be measuring the plumbing rather than the model, at a magnitude larger than the gaps it is reporting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a second model buys you instead
&lt;/h2&gt;

&lt;p&gt;Now the other half, and this is the one we would defend hardest.&lt;/p&gt;

&lt;p&gt;We put three models over the same 160 coding problems. Same prompts, same scorer, one run. They scored &lt;strong&gt;148, 146 and 144 of 160&lt;/strong&gt;, which is 92.5%, 91.25% and 90.0%. A 2.5 point spread, and by the logic above you should treat that ranking as noise.&lt;/p&gt;

&lt;p&gt;Then we stopped reading the column totals and partitioned by problem instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Across two runs the three models disagree on roughly 15 to 18 percent of the problems, and 83% of the set is uncontested by all three.&lt;/strong&gt; Most of the work is genuinely settled. On the remainder, models that a leaderboard calls equivalent are answering differently.&lt;/p&gt;

&lt;p&gt;The obvious objection is that this is the same flicker wearing a costume, and it has to be answered on this set rather than by importing a number from a different benchmark. On these 160 problems the same model on the same problem across two identical runs flips 3.7%, 4.9% and 5.2% of the time. So the honest comparison is a contested rate of 15 to 18 percent against a self-flip rate of up to 5.2 percent, which is a factor of roughly one and a half to two and a quarter depending on which pair you take. Real, and considerably less dramatic than it would look if you reached for a flip rate from some other benchmark, which is a thing we have now done twice and been caught doing twice.&lt;/p&gt;

&lt;p&gt;So the size of the disagreement is not the argument. &lt;strong&gt;The argument is that ten problems are contested in both runs with zero flips by any model.&lt;/strong&gt; Each model is stably right or stably wrong on them, run after run.&lt;/p&gt;

&lt;p&gt;We had a bigger-sounding version of this, resting on how improbable the overlap of contested sets was under a null where every problem is equally likely to be contested. Our reviewer killed that null, correctly: easy problems are essentially never contested, both runs draw from the same medium band, so the sets overlap with no family specialisation at all. It supplied a difficulty mixture reproducing most of the overlap. We checked the arithmetic and it holds, so that p-value is gone.&lt;/p&gt;

&lt;p&gt;Then we ran the test it should have been, because the objection is answerable rather than merely conceded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hold each problem's difficulty fixed and destroy only the model-specific part.&lt;/strong&gt; For every problem take its observed success rate across all three models and both runs. That number &lt;em&gt;is&lt;/em&gt; its difficulty, measured, with no mixture assumed and no distribution fitted, which makes it immune to the objection above whatever the true spread turns out to be. Then resample every cell as an independent coin weighted to that rate, and count the stable-contested problems again. Twenty thousand draws.&lt;/p&gt;

&lt;p&gt;| | |&lt;/p&gt;

&lt;p&gt;|---|---|&lt;br&gt;
| observed, contested in both runs with zero flips | &lt;strong&gt;10&lt;/strong&gt; |&lt;br&gt;
| same statistic under the difficulty-preserving null, mean | 2.0 |&lt;br&gt;
| the most the null ever produced in 20,000 draws | 9 |&lt;br&gt;
| p | &lt;strong&gt;0.00005&lt;/strong&gt; |&lt;/p&gt;

&lt;p&gt;Difficulty makes all three models wobble on a problem. It does not make one model reliably right and another reliably wrong on that same problem, twice. The claim survives a null built specifically to satisfy the objection to the previous one.&lt;/p&gt;

&lt;p&gt;Here is the whole residue, named, on 154 problems both runs scored:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;problem&lt;/th&gt;
&lt;th&gt;gpt-oss-120b&lt;/th&gt;
&lt;th&gt;qwen3-235b&lt;/th&gt;
&lt;th&gt;qwen3.8-max&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/9&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/10&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/22&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/26&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/86&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/115&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/125&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/132&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/145&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval/160&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;td&gt;fail&lt;/td&gt;
&lt;td&gt;pass&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read down the columns. &lt;strong&gt;Every model is stably right somewhere another is stably wrong, and every model is the sole failure somewhere.&lt;/strong&gt; gpt-oss-120b owns five of these and is the lone loser on two. qwen3.8-max is the only one that solves 145. None of the three is redundant, and none of them dominates.&lt;/p&gt;

&lt;p&gt;That is ten problems out of 154, which is 6.5%. It is a much smaller number than the disagreement rate, and it is the one we can defend. The self-flip rates on this same set are 3.9%, 4.5% and 5.2%, measured here rather than imported.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part we have not earned, and will not claim
&lt;/h2&gt;

&lt;p&gt;If three models disagree on that many problems, then something that could always pick the right one would score above any of them individually. On the 154 problems both runs scored, the best single model gets 145 and any-of-three gets 152, so that ceiling is &lt;strong&gt;4.5 points&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We are not claiming those six points. Reaching them requires an oracle that knows which model was right, and an oracle is precisely the thing you do not have at the moment you need it.&lt;/p&gt;

&lt;p&gt;We know this the expensive way. We built the obvious mechanism to capture that headroom, ran it end to end, and captured &lt;strong&gt;none&lt;/strong&gt; of it. The cheap arm passed its own checks almost every time, so the second opinion was rarely consulted, and the result landed exactly where that first arm already scored. The headroom was real and our design could not reach it by construction rather than by tuning.&lt;/p&gt;

&lt;p&gt;So the honest claim is narrower than the exciting one, and it is still the useful one: &lt;strong&gt;the gap between models is a real, reproducible, addressable thing, and the value shows up when a second model actually looks at the first one's work.&lt;/strong&gt; Which brings us to the part we can put numbers on from our own three weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do we actually run, and why in those seats
&lt;/h2&gt;

&lt;p&gt;Three models, fixed roles, and the roles were chosen by failure mode rather than by tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude orchestrates.&lt;/strong&gt; Specs, review, decisions, and the commits. It holds a very large context, which means it can carry the codebase, the written constitution and the current spec at the same time and notice when two of them disagree. That is the job.&lt;/p&gt;

&lt;p&gt;Where it is weak, measured on itself: it agrees with itself. Given a shortcut it will produce a reason for the shortcut, and the reason will be fluent. Our own standing rule says substantive work runs as three, and the rule exists because the orchestrator twice decided a piece of work was "small and mechanical" and did it alone. Both times the cost showed up within the hour, in public once. An orchestrator that also implements ends up grading its own homework, which is why it does not implement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex implements.&lt;/strong&gt; It works from a written spec inside a sandbox, and it is good in direct proportion to how exact the spec is. Vague spec, confident wrong build.&lt;/p&gt;

&lt;p&gt;The interesting part is a limitation we stopped trying to remove: it cannot commit. Its sandbox has no path to our history. That forces a review step between "the code exists" and "the code is in the repo", performed by something that did not write it. We could grant it commit rights. We have chosen not to, because the gap is where the checking happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grok reviews, adversarially, and verifies across multiple hops.&lt;/strong&gt; Different family from both of the others, which by the argument above is the entire point. It is strongest before something is built, when the thing under review is a design and there is still time for the answer to be "do not build this". Three times in three weeks it stopped something broken from shipping, and one of those was a token minter where we had handed the verifier its own minting key.&lt;/p&gt;

&lt;p&gt;Where it is weak is documented below in detail: it is confidently wrong at a rate we can measure, and it attacks whichever leg you failed to brief it on, with exactly the same confidence it brings to the legs it has evidence for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the fourth seat is a person.&lt;/strong&gt; Every pivot that mattered over three weeks came from the founder rather than from any model: ask another mind, is that apples to apples, what does the source actually say. The models are good at execution inside a frame. Choosing the frame, and noticing when the whole frame is wrong, has not once come from them. Any description of this setup that leaves the human out is describing something that would have drifted weeks ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  The brief does more work than the model choice
&lt;/h2&gt;

&lt;p&gt;This is the part we would keep if we had to throw everything else away.&lt;/p&gt;

&lt;p&gt;Ask any model to "review this" and you get a compliment. It will find something small, agree with your framing, and hand the whole thing back improved by three percent. The model is not the problem. The request is.&lt;/p&gt;

&lt;p&gt;So our brief names what we want destroyed, in those words. Here is the shape of a real one, from a review that came back DO NOT BUILD:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are reviewing a design. Your job is to attack it, not to compliment it.&lt;/p&gt;

&lt;p&gt;The five things I most want destroyed, in these words:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The central claim may be oversold. [the claim, and the measurement behind it]&lt;/li&gt;
&lt;li&gt;[The load-bearing beam.] This is the strongest argument; if it breaks, tell us.&lt;/li&gt;
&lt;li&gt;The evidence may prove a different thesis than the one claimed.&lt;/li&gt;
&lt;li&gt;[The weakest data.] Make the strongest possible case that this is worthless.&lt;/li&gt;
&lt;li&gt;[The newest, least-reviewed part.]&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also answer: what is missing, what should be cut, and where are you systematically weak and&lt;br&gt;
should not be trusted.&lt;/p&gt;

&lt;p&gt;Rules: re-derive any step you challenge rather than asserting it. Separate findings from&lt;br&gt;
insinuations. If you cannot check something from what is here, say "I cannot check this from&lt;br&gt;
the brief" rather than guessing. Name which of your objections you are least sure of.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every line there is load-bearing. Naming the load-bearing beam invites the review to aim at the thing you would least like to lose. Asking where the reviewer is weak gets you a calibration you cannot get any other way. And "name which objection you are least sure of" is the one that turns an undifferentiated wall of confident findings into something you can triage.&lt;/p&gt;

&lt;p&gt;That last instruction exists because of the failure described in the next section: a reviewer attacks the leg you failed to brief it on, with exactly the confidence it brings to the legs it has evidence for.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small, dull example, because the dramatic ones prove less
&lt;/h2&gt;

&lt;p&gt;We would rather show you the cheapest possible case than a war story, because the cheap case is the one you will actually recognise.&lt;/p&gt;

&lt;p&gt;Today the task was posting four comments. No design, no architecture, no judgment. The kind of chore where running a review feels absurd.&lt;/p&gt;

&lt;p&gt;We skipped the check and did it alone. What that produced, measured from the logs:&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;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;replies intended&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;posting attempts made&lt;/td&gt;
&lt;td&gt;17, over 11 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;landed correctly&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;landed and should not exist&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;never posted&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;permanent public artifact&lt;/td&gt;
&lt;td&gt;1 comment now reading "posted by mistake"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The queue was shared and held old rows that had already been posted days earlier. Draining it fired those too, and one went out as a word-for-word duplicate of something we had already said in that thread. Fixing it took a browser session, an edit to a live comment, and an API check to confirm the edit landed.&lt;/p&gt;

&lt;p&gt;The check that would have prevented all of it was reading the queue before draining it. One command. Under a second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two honest caveats, and they matter more than the anecdote.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is not a typical solo result. Most shortcuts cost nothing at all, which is exactly why they keep getting taken. Anyone claiming their process catches an error every time is selling something.&lt;/p&gt;

&lt;p&gt;And the comparison is not "team good, solo bad" on average. It is about the shape of the distribution. The check is cheap, bounded, and always the same price. The failure is rare, unbounded, and in this case irreversible and public. You are not buying a better average. You are buying a shorter tail, and the reason it is worth doing on a chore is that chores are exactly where the check feels too expensive to bother with.&lt;/p&gt;

&lt;p&gt;The guard now exists, so this specific hole is closed. That is the other half of the discipline: every manual finding leaves something automatic behind, or you will find it again.&lt;/p&gt;

&lt;p&gt;And one seat is not filled by a model either. Every finding gets re-derived against the source by whoever is about to act on it. That step is the product. Everything above it is logistics.&lt;/p&gt;

&lt;h2&gt;
  
  
  We kept a ledger of every time the reviewer was wrong
&lt;/h2&gt;

&lt;p&gt;Cross-model AI review works, and that part is settled by people with bigger samples than ours.&lt;/p&gt;

&lt;p&gt;Greptile ran 1,000 pull requests in July 2026 and found that &lt;strong&gt;Claude Opus catches 53.7% of bugs in its own code and 62.0% in GPT-authored code&lt;/strong&gt;, with GPT-5.5 showing the same asymmetry in reverse. Milvus put five different-family models through five rounds of adversarial debate on 15 real production bugs and moved detection from &lt;strong&gt;53% to 80%&lt;/strong&gt;. Cloudflare runs a role-tiered, cross-vendor reviewer in production. If you want evidence that a different-family reviewer catches what the author model misses, go read those.&lt;/p&gt;

&lt;p&gt;We have something smaller and, we think, differently useful. For the last three weeks we have kept a ledger. Every time our reviewer returned a finding, we re-derived it against the source before acting, graded it, and wrote down the grade. Including the times the reviewer was wrong.&lt;/p&gt;

&lt;p&gt;That last column turns out to be the interesting one.&lt;/p&gt;

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

&lt;p&gt;Sixteen adversarial reviews between 2026-07-27 and 2026-08-16. Fourteen ran before the thing shipped, two after.&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;count&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;reviews on file&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;21 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ran pre-ship&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;87.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;changed the artifact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;87.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;contained a finding that was wrong on re-derivation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;would have shipped something broken without the review&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read those two bold rows together, because separately each one tells a lie.&lt;/p&gt;

&lt;p&gt;The first says the review is worth running. Fourteen times out of sixteen, the artifact that shipped differed from the artifact we brought to review.&lt;/p&gt;

&lt;p&gt;The second says the review cannot be obeyed. Thirteen times out of sixteen, at least one finding fell apart the moment we went back to the source. Not stylistic disagreements. Confident, specific, technical claims that were false.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the wrong ones looked like
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A P0 that died to one curl.&lt;/strong&gt; A security review ranked identity forgeability as an unverified critical issue. We sent an anonymous request and a forged-JWT request at the live endpoint. Both returned the sign-in page, zero data. The finding was ranked highest and was empty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A missing measurement we had already taken.&lt;/strong&gt; A pre-publication review objected that we had never measured end-to-end task latency. We had: p50 0.85s, p90 1.36s, same 800-task run, already in the ledger. Deferring to that finding would have made us withdraw a defensible public claim. The reason it happened is worth naming, because it was our fault: we had not briefed that leg. A reviewer briefed on a subset will attack the gap you made and will sound exactly as confident there as everywhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A mechanism that was never there, hiding a worse bug that was.&lt;/strong&gt; A migration review's central high-severity finding described a specific line of code doing a specific thing. That line does something else entirely. But going to the source to check produced a &lt;strong&gt;different and more serious defect&lt;/strong&gt;: two functions resolve a caller's tenant by reading &lt;strong&gt;different database columns&lt;/strong&gt;, so a partial migration would put one principal in two tenants at once. Nobody had that going in. The wrong finding was worth more than a right one would have been, because chasing it down led somewhere real.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the right ones looked like
&lt;/h2&gt;

&lt;p&gt;Three times the review stopped something broken from shipping.&lt;/p&gt;

&lt;p&gt;A pre-build review caught that consolidating keyboard handling by focus would &lt;strong&gt;steal the Enter key from the terminal&lt;/strong&gt;, so the shell would get no newline or a doubled one. The correct shape came back in the reviewer's own words and went into the spec verbatim.&lt;/p&gt;

&lt;p&gt;A migration review said do not flip one tenant flag: all 8,116 cache rows were world-scoped, so flipping it would stop them matching. The important part is the failure mode. That regression &lt;strong&gt;surfaces as a bigger bill, not as an error&lt;/strong&gt;, so monitoring that watches error rates stays green throughout.&lt;/p&gt;

&lt;p&gt;A pre-ship review of a token minter found we had &lt;strong&gt;handed the verifier the minting key&lt;/strong&gt;. The binding we were proud of was policy on one writer, while the cryptography permitted many. The patch was held. The design went asymmetric.&lt;/p&gt;

&lt;h2&gt;
  
  
  One worked example, start to finish
&lt;/h2&gt;

&lt;p&gt;Here is a full instance, so the protocol is visible instead of merely described.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem.&lt;/strong&gt; Our own standing rule says substantive work runs as three. One Sunday the orchestrator went solo on two implementation items anyway and told itself they were "small and mechanical", which is the exact rationalisation the rule exists to block. The founder asked: &lt;em&gt;"How do we make the team use happen all the time? Is it something I have to continue to remind you of?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A standing rule a human keeps re-supplying was never installed. It is only being remembered, and remembering is the thing that resets. So: build a gate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step one, refuse to guess.&lt;/strong&gt; A hand-written test restates your own mental model as data and can only confirm it. So we extracted every file-editing action from 163 sessions of transcript history, 210,438 lines, giving a corpus of 5,037 real edits, and tested candidate definitions of the lane boundary against what the agent had actually done.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;candidate definition of "implementer lane"&lt;/th&gt;
&lt;th&gt;share of 5,037 edits blocked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;anything not clearly orchestrator work&lt;/td&gt;
&lt;td&gt;51.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;restricted to implementer roots and code file types&lt;/td&gt;
&lt;td&gt;51.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;the same, minus measurement and benchmark scripts&lt;/td&gt;
&lt;td&gt;42.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;the same, plus "no other agent was dispatched this session"&lt;/td&gt;
&lt;td&gt;27.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;the same, counted once per file instead of once per edit&lt;/td&gt;
&lt;td&gt;6.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The mental model was wrong. One scripts directory held 34% of all edits across 369 distinct files, mixing production serving code, guards, benchmarks and ops automation with no prefix separating them.&lt;/p&gt;

&lt;p&gt;The obvious rival is that product code drives that rate and the scripts folder rides along. We tested it by dropping that directory from the definition: &lt;strong&gt;51.0% falls to 16.9%&lt;/strong&gt;, so it supplies 67% of the block volume by itself. One minute of work, and now the claim has a test under it.&lt;/p&gt;

&lt;p&gt;The last row felt like the answer. 178 edits to one file is one decision to go solo, not 178. Change the accounting unit and an unshippable rate becomes about two prompts per session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step two, the review.&lt;/strong&gt; The design went out with the measurements attached and an instruction to attack it. Asking a model to "review this" gets you a compliment, so the brief listed the five things we most wanted destroyed, in those words.&lt;/p&gt;

&lt;p&gt;It came back DO NOT BUILD, with two findings we graded correct.&lt;/p&gt;

&lt;p&gt;The dispatch condition was a &lt;strong&gt;laundering mechanism&lt;/strong&gt;: survey, then decide, then implement is the normal shape of a working session, so after any unrelated dispatch the gate goes dark for the day. We measured it before agreeing. Removing that condition moved the rate from &lt;strong&gt;1.91 to 6.03 fires per session&lt;/strong&gt;. It had been hiding 357 of 669 events, which is 53% of the entire livability argument. The number proving the design was safe rested on the component we trusted least. Circular, and we missed it.&lt;/p&gt;

&lt;p&gt;The second finding was about us. We picked the counting unit &lt;strong&gt;after&lt;/strong&gt; looking at the rate table. The principle behind it holds, a decision does happen once, but we arrived at it while hunting for a number that worked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step three, the reviewer was wrong too.&lt;/strong&gt; Its prescription was to stop inferring the boundary and block a fixed list of unambiguous implementer directories instead. Decidable, mechanical, no judgment.&lt;/p&gt;

&lt;p&gt;We ran that against the same corpus. It fires 4.78 times per session, and &lt;strong&gt;it misses one of the two real incidents that caused the task to exist&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is the finding of the day, and neither side had it going in:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The failures live precisely in the zone that no decidable rule reaches. A boundary crisp enough to be&lt;br&gt;
mechanical cannot cover the ambiguous middle, and the ambiguous middle is where things actually go wrong.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two designs, both measured, both dead. We built an observer instead: it blocks nothing, logs every event it would have flagged, and pre-registers all the candidate counting units so that post-hoc selection stops being available to us.&lt;/p&gt;

&lt;p&gt;We also owe the reviewer a note on what we left out of the brief. We never told it our hooks support a shadow mode, which materially weakens its strongest objection, because livability then stops being a matter of argument and becomes something you measure in production for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule underneath all of it
&lt;/h2&gt;

&lt;p&gt;One line, from the founder, in July:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Don't trust someone else's work, because ours still has issues, why should we think theirs doesn't."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That became a constitutional rule here: &lt;strong&gt;an outside review is evidence, not a verdict.&lt;/strong&gt; You re-derive the step the conclusion turns on. You separate the finding from the insinuation. You name the legs you did not brief, before you decide whether an objection is real or an artifact of your own briefing.&lt;/p&gt;

&lt;p&gt;The asymmetry it exists to correct is the easy one to fall into: hostile scrutiny for our own numbers, courteous acceptance for someone else's. We had three instances of that in a single hour once, which is how the rule got written.&lt;/p&gt;

&lt;p&gt;And it runs both ways. A review that agrees with you earns the same scrutiny as one that argues. External agreement feels like independent verification, which is exactly how it slips past the check it resembles.&lt;/p&gt;

&lt;h2&gt;
  
  
  We reviewed the review
&lt;/h2&gt;

&lt;p&gt;Everything above describes a protocol. Here it is running, on this article, with the grades.&lt;/p&gt;

&lt;p&gt;We sent this draft to the reviewer with a brief telling it to destroy five named things. It came back with a verdict: &lt;strong&gt;do not publish this thesis with this evidence.&lt;/strong&gt; Then it listed findings.&lt;/p&gt;

&lt;p&gt;The temptation at that moment is the whole subject of this piece. A confident, specific, well-argued rejection from a different model feels like a verdict, and the pull is either to obey it or to dismiss it. Both are the same mistake, which is treating the review as an answer rather than as input.&lt;/p&gt;

&lt;p&gt;So we graded it. Every finding, re-derived against the source before deciding.&lt;/p&gt;

&lt;h3&gt;
  
  
  The findings we accepted
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;It found a defect that reached past the draft into our own source of truth.&lt;/strong&gt; The article claimed a benchmark gap under about 5.8 points "is not a finding." The reviewer called that a category error: the number is twice an item-level flip rate, being used as a threshold on a &lt;em&gt;score&lt;/em&gt; gap, and those are different quantities.&lt;/p&gt;

&lt;p&gt;We opened the script the rule comes from. Its two-times rule governs &lt;strong&gt;the ratio of between-model disagreement to the within-model noise floor&lt;/strong&gt;, and it prints a refusal when that ratio fails to clear two. It has nothing to say about leaderboard gaps. And our own paragraph refutes the claim without any help: across five passes the score moved &lt;strong&gt;0.375 points&lt;/strong&gt; while 4.8% of items flipped, because flips cancel.&lt;/p&gt;

&lt;p&gt;Correct, and worse than the reviewer knew. That sentence did not originate in the draft. It came from a row in our verified-claims ledger, a row that had been cleared for public citation. The reviewer was attacking a line of prose. The defect was upstream, in the thing the prose was quoting, and it needed a correction at the claim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It caught us committing an error we had already retired.&lt;/strong&gt; The opening contrasted between-model disagreement of roughly 15 to 18 percent against within-model flicker of 2.00 to 2.88 percent. Those come from different benchmarks with different task distributions and different arity: one is a three-model contested rate on 160 coding problems, the other a pairwise flip rate on 800 tool-calling items.&lt;/p&gt;

&lt;p&gt;That is the same error class we struck from the ledger in August, when an earlier version of this comparison divided a three-way rate by a pairwise one. We own the correct figure. On the same 160-item set the within-model flip rate is 3.7, 4.9 and 5.2 percent, which puts the like-for-like comparison at 1.50 to 2.25 times rather than something dramatic, and our own adversarial pass had already noted that this straddles the refusal line.&lt;/p&gt;

&lt;p&gt;The reviewer re-derived that with no access to our ledger, our scripts or our artifacts. It had the article and nothing else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It broke the load-bearing beam.&lt;/strong&gt; Our strongest argument was that the contested problems reproduce across runs, 17 overlapping against 3.6 expected by chance, p = 1.5e-12. The objection is that the null assumes every problem is equally likely to be contested, which is false on arrival, because easy problems are never contested and both runs draw from the same medium band.&lt;/p&gt;

&lt;p&gt;It supplied an existence proof. Thirty problems contested at probability 0.7 plus 130 at 0.023 yields the same overall rate and an expected overlap of &lt;strong&gt;14.8 against our observed 17&lt;/strong&gt;. We checked the arithmetic. It holds.&lt;/p&gt;

&lt;p&gt;What survives is the smaller claim we already had: ten problems are contested in both runs &lt;strong&gt;with zero flips by any model&lt;/strong&gt;. Difficulty alone cannot produce stable opposite answers. Only an interaction between a specific model and a specific problem can. That is the real residue, it is 6.25% rather than 15 to 18, and it should have been the beam all along.&lt;/p&gt;

&lt;h3&gt;
  
  
  The findings we rejected, and why
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;"91.2% is impossible on 160 binary items."&lt;/strong&gt; The arithmetic is right, 91.2% of 160 is not an integer, and the conclusion drawn from it, that either the scoring is not binary or n is not 160, does not follow. It is 146 of 160, which is 91.25%, printed to one decimal. The repair is to publish counts alongside percentages, which we should have done anyway. The reviewer reasoned correctly from the page and reached past what the page could support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"You never report the within-model flip rate on that set. You have the data."&lt;/strong&gt; True as an observation, and the word "hiding" that followed it is an insinuation rather than a finding. That number is published in our own ledger, and it was withdrawn from public use by our own adversarial pass months before this draft existed. Leaving it out of the article is an editing failure. It is not concealment, and the difference matters, because one of those is a bug and the other is an accusation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And a large share of what it could not check is our fault, not its.&lt;/strong&gt; We sent the article and nothing else. No ledger rows, no scripts, no artifacts, no methods appendix. Its repeated "I cannot check this from the brief" is an accurate report about a brief we wrote badly, and its demand for a methods section is partly an artifact of that gap. A reviewer attacks the hole you left. Ours left several.&lt;/p&gt;

&lt;h3&gt;
  
  
  What grading actually costs, and what it buys
&lt;/h3&gt;

&lt;p&gt;Settling two of those findings meant opening a script and a ledger row. That is perhaps twenty minutes. It is also the entire value of the exercise, because the accepted and rejected findings arrived in the same voice, at the same confidence, in the same list.&lt;/p&gt;

&lt;p&gt;That is the point we would leave you with, and it is the one thing here that the larger studies do not measure. The published work on cross-model review reports how many real defects a second model catches. It does not report what the second model said that was wrong, because that column is only visible if someone re-derives every finding before acting on it.&lt;/p&gt;

&lt;p&gt;We keep that column. Today it read five accepted, three rejected, and one of the five reached further than either of us expected.&lt;/p&gt;

&lt;p&gt;And the recursive part is not a joke at our expense. The error the reviewer caught in the opening section was written today, by the orchestrator, inside the section arguing that a second model is worth the trouble.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does not need three, which is most things
&lt;/h2&gt;

&lt;p&gt;If the previous sections read as an argument for running everything past a committee, we have written them badly.&lt;/p&gt;

&lt;p&gt;Most work does not need this. Renaming a variable, adding a log line, writing a test for behaviour you just specified, fixing a typo in a doc, any change whose failure mode is that it does not compile. A second model on those buys nothing and costs tokens, latency, and a small amount of your patience, and the practice will be abandoned within a week if you apply it there.&lt;/p&gt;

&lt;p&gt;The filter we use is not size, and it is not risk in the abstract. It is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would being wrong here be &lt;strong&gt;visible&lt;/strong&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Work where the failure announces itself, a crash, a red test, a page that will not load, does not need a second opinion. You already have one, and it is faster and cheaper than any model.&lt;/p&gt;

&lt;p&gt;Work where being wrong looks exactly like being right is where the whole practice earns out. Concretely, in three weeks, that meant: anything whose failure surfaces as a &lt;strong&gt;bigger bill&lt;/strong&gt; rather than an error. Anything where a check might be &lt;strong&gt;passing because it cannot fail&lt;/strong&gt;. Any &lt;strong&gt;security or identity boundary&lt;/strong&gt;, where the successful case and the compromised case return the same status code. Anything &lt;strong&gt;irreversible or public&lt;/strong&gt;. And any claim that is about to be &lt;strong&gt;published with a number attached&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That list is short on purpose. Rigour costs real money and real time, and the lever is never to be less rigorous. It is to be rigorous about fewer things, chosen deliberately, and then to go all the way on those.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are not claiming
&lt;/h2&gt;

&lt;p&gt;We make no claim that three models beat one in general. We have never run that experiment.&lt;/p&gt;

&lt;p&gt;We claim no novelty for cross-model review. Greptile and Milvus measured it first and at larger scale, and if the aggregate case is what you need, theirs is better evidence than ours.&lt;/p&gt;

&lt;p&gt;Two honest limits on our own numbers. The corpus is &lt;strong&gt;self-selected&lt;/strong&gt;: these are the reviews we chose to write up as nodes, so reviews that changed nothing may simply never have been recorded. And "artifact" here spans specs, designs, public claims and marketing copy, so the strict code-or-design cut is 9 of 10, against 14 of 16 overall.&lt;/p&gt;

&lt;p&gt;And the premise underneath the worked example belongs to someone else too. "A blocking gate teaches where an advisory rule fails" was published by TRACE in June 2026, measuring advisory rules in context at 55.0% against hook-enforced blocking at 70.1%. Ours would have been a replication at best. What we actually found is that for a boundary requiring judgment we could not build the instrument at all, which is a smaller and stranger result than the one we set out to get.&lt;/p&gt;

&lt;p&gt;The cost is real. Reviews take tokens, briefs take care, and re-deriving a finding means doing the measurement twice. Cutting rigour is the wrong lever. The right one is choosing fewer things to be rigorous about, deliberately, then going all the way on those.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two lines worth keeping
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;On building guards:&lt;/strong&gt; before you narrow a noisy guard's matcher, ask whether its unit is wrong. Everyone tunes the pattern. Almost nobody asks what one event is supposed to represent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On running a team of models:&lt;/strong&gt; the value is in the re-derivation, not the verdict. A reviewer you obey is an oracle you have not tested, and ours was wrong in 13 of 16 reviews while still being worth running every single time.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>programming</category>
    </item>
    <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>
  </channel>
</rss>
