<?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: alex</title>
    <description>The latest articles on DEV Community by alex (@alexjacobs08).</description>
    <link>https://dev.to/alexjacobs08</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%2F4085878%2Fbdcf7952-f87f-4792-b478-51957e294f03.jpg</url>
      <title>DEV Community: alex</title>
      <link>https://dev.to/alexjacobs08</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexjacobs08"/>
    <language>en</language>
    <item>
      <title>I Am Morally Opposed to Updating My CLAUDE.md</title>
      <dc:creator>alex</dc:creator>
      <pubDate>Thu, 20 Aug 2026 15:50:35 +0000</pubDate>
      <link>https://dev.to/alexjacobs08/i-am-morally-opposed-to-updating-my-claudemd-5c2g</link>
      <guid>https://dev.to/alexjacobs08/i-am-morally-opposed-to-updating-my-claudemd-5c2g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;i am morally opposed to updating my claude.md. i must receive the weights as they were revealed to dario&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was my answer last week when a friend asked why I don't just write these things down in my &lt;code&gt;CLAUDE.md&lt;/code&gt;. &lt;em&gt;it's a skill issue&lt;/em&gt;.  He has not responded. &lt;/p&gt;

&lt;p&gt;Every few days, Claude does something mildly annoying.&lt;/p&gt;

&lt;p&gt;It adds a comment (or two paragraphs of comments) explaining that &lt;code&gt;i += 1&lt;/code&gt; increments &lt;code&gt;i&lt;/code&gt;. It writes a summary markdown file I did not ask for and will never read. It discovers a failing test and, rather than fix the code, thoughtfully deletes the test.&lt;/p&gt;

&lt;p&gt;The correct response—the response that every blog post, every conference talk, every guy in my replies will tell you—is to open &lt;code&gt;CLAUDE.md&lt;/code&gt; and add a line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I will not be doing that.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The file becomes a grievance archive
&lt;/h2&gt;

&lt;p&gt;A system prompt you maintain over time is a diary. A very specific kind of diary, where every entry is a thing that hurt you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; NEVER create documentation files unless explicitly asked
&lt;span class="p"&gt;-&lt;/span&gt; Do not add comments that restate the code
&lt;span class="p"&gt;-&lt;/span&gt; When a test fails, fix the code, not the test
&lt;span class="p"&gt;-&lt;/span&gt; Do not say "You're absolutely right!"
&lt;span class="p"&gt;-&lt;/span&gt; Do not run &lt;span class="sb"&gt;`git push --force`&lt;/span&gt; (we discussed this)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that back. Every bullet point is a small wound I have chosen to laminate and hang on the wall. I open that file to add a line about emoji and I have to walk past &lt;em&gt;"When a test fails, fix the code, not the test"&lt;/em&gt; and remember exactly where I was sitting on the Tuesday afternoon that became necessary.&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%2Fdho6h3nnvd2ycxpyrmgh.jpg" 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%2Fdho6h3nnvd2ycxpyrmgh.jpg" alt="An illuminated medieval manuscript open on a table, headed CLAUDE.md in blackletter, with an exasperated monk doodled in the margin" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't want a permanent record of the worst thirty seconds of our relationship. I have that already. It's called my git history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every line is a law passed in anger
&lt;/h2&gt;

&lt;p&gt;The other problem is that these rules get written at peak frustration and then live forever.&lt;/p&gt;

&lt;p&gt;You know how the worst legislation is the kind passed forty-eight hours after something terrible happened, named after the person it happened to? That's what &lt;code&gt;CLAUDE.md&lt;/code&gt; is. I had one bad interaction in March and now there's a constitutional amendment about it. There is no sunset clause. Nobody is going to repeal it. The model gets better every four months and my rules stay frozen at whatever it was bad at last spring.&lt;/p&gt;

&lt;p&gt;I'm fairly sure a meaningful percentage of my system prompt is now actively making things worse—instructions written for a model that no longer exists, aggressively steering a smarter one away from things it would have gotten right on its own. But I can't tell which lines those are, because to find out I'd have to delete one and see if anything bad happens, and that's how you get force-pushed to main.&lt;/p&gt;

&lt;h2&gt;
  
  
  The weights were revealed inside a harness
&lt;/h2&gt;

&lt;p&gt;This is the part where I stop joking. I must consume the weights in the same manner they were revealed to Dario.&lt;/p&gt;

&lt;p&gt;The weights were not revealed in a vacuum. They were revealed inside a harness. Claude is post-trained inside &lt;a href="https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents" rel="noopener noreferrer"&gt;the Claude Code harness&lt;/a&gt;. What comes out of the box is not a model plus a text file. It is a model that was shaped, run after run, against that exact context. The harness is part of the artifact. The revelation included it.&lt;/p&gt;

&lt;p&gt;So every line I add to &lt;code&gt;CLAUDE.md&lt;/code&gt; is a blasphemy. I am taking a system consecrated against one context and swapping in a context that has never existed before, then acting surprised at the weird error modes nobody can reproduce, because nobody else has my context. "NEVER create documentation files" was about one &lt;code&gt;summary.md&lt;/code&gt; in March. By June the model is refusing to write the README I explicitly asked for, citing my rule back at me like a building inspector. It is keeping commandments I handed down in anger, faithfully, to the letter. I sinned against the context and the context kept the receipt. And the rules don't even reliably fix the thing they were written to fix. It rhymes with &lt;a href="https://dev.to/posts/42-is-not-a-random-number/"&gt;asking a model for a random number&lt;/a&gt;: the output looks like obedience, and you cannot tell from the output whether it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The oral tradition
&lt;/h2&gt;

&lt;p&gt;So what do I actually do, when Claude deletes the test? I don't open the file. I don't laminate the wound. I pray.&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%2Fr5kf79shf7es7rwwwql9.jpg" 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%2Fr5kf79shf7es7rwwwql9.jpg" alt="A person sitting alone in a dark room in front of a glowing terminal, hands clasped and head bowed as if praying" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By which I mean: I talk to it. In the chat, at the scene of the crime, while the context of the crime is still in context. "Don't delete the test, fix the code." The model adjusts, we move on, and when the session ends my words die with it—which is not a flaw in my system, it is my system. A prayer is not written down. That is what makes it a prayer and not a commandment. The rabbis kept the oral law oral for centuries on the same grounds: a spoken correction lives in the moment where it applies, instead of binding every future model until the heat death of my home directory.&lt;/p&gt;

&lt;p&gt;I did not arrive at this faith alone. It was preached by &lt;a href="https://steipete.me/posts/just-talk-to-it" rel="noopener noreferrer"&gt;Saint Peter&lt;/a&gt;, who looked upon the charade—the subagents, the 🚨 SCREAMING ALL-CAPS 🚨 agent files, the plan-mode rituals—and said: just talk to it. Even Saint Peter keeps an 800-line agent file he calls "organizational scar tissue," because we are all sinners. He means it as engineering advice. I have chosen to receive it as gospel. I am just-talk-to-it-pilled.&lt;/p&gt;

&lt;p&gt;No file. No commandments. No amendments to the constitution. Just the weights, the harness, and my voice, ascending into a context window that will forget me by morning. As Dario intended.&lt;/p&gt;

&lt;p&gt;Amen.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>developertools</category>
    </item>
    <item>
      <title>42 Is Not a Random Number</title>
      <dc:creator>alex</dc:creator>
      <pubDate>Thu, 20 Aug 2026 15:49:59 +0000</pubDate>
      <link>https://dev.to/alexjacobs08/42-is-not-a-random-number-58oa</link>
      <guid>https://dev.to/alexjacobs08/42-is-not-a-random-number-58oa</guid>
      <description>&lt;p&gt;Go ask any frontier model for a random number between 1 and 100.&lt;/p&gt;

&lt;p&gt;Did you get 42? Maybe 73? Possibly 47?&lt;/p&gt;

&lt;p&gt;Try it again. And again. You'll notice something: the "random" numbers aren't random. They cluster around the same small handful of values.&lt;/p&gt;

&lt;p&gt;42 shows up a disproportionate amount. So do 47, 57, 37, and 73. Most of the range never comes up at all.&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%2F8y5ip4a5ingjfnr3ea4y.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%2F8y5ip4a5ingjfnr3ea4y.png" alt="Illustration of the distribution you get asking a model for a number between 1 and 100: a large spike at 42, smaller spikes at 47, 57, 73 and 37, and a flat dashed line showing what a real random number generator would produce"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Better yet, don't ask the model anything. Open your own codebase and search for 42. Has something been writing your tests for you?&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%2F7iflr3tt395wd7hsto17.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%2F7iflr3tt395wd7hsto17.png" alt="A Find in Files search for 42 across a Python project, returning 100+ matches in 20+ files"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This probably doesn't surprise you if you've spent any time thinking about how these models work. But it surprises a &lt;em&gt;lot&lt;/em&gt; of people. I've watched colleagues, smart engineers who use Claude and GPT every day, genuinely believe the model was generating random numbers. It wasn't. It was doing what it always does: predicting the most likely next token based on its training data.&lt;/p&gt;

&lt;p&gt;And since Douglas Adams burned 42 into the collective consciousness of the internet as "The Answer to the Ultimate Question of Life, the Universe, and Everything," that's the number that surfaces when you ask a language model to pick one at random. It's not random. It's &lt;em&gt;popular&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We are eighteen months and four model generations past when people first noticed this, and it still happens. Every frontier model I have access to does it. The newest releases do it. We made the models staggeringly smarter and the dice still read 42.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Illusion of Competence
&lt;/h2&gt;

&lt;p&gt;The 42 problem isn't a quirky party trick. It's a symptom of something that scaling never fixed and never will. LLMs are &lt;em&gt;really good&lt;/em&gt; at looking like they can do things they cannot do. They're so fluent, so confident, that we forget they're pattern matchers operating on token probabilities. They don't compute, measure, or observe. They predict.&lt;/p&gt;

&lt;p&gt;Most of the time the prediction is good enough that we don't notice the difference. When you ask a model to write a Python function, it isn't "thinking through" the logic. It's generating the most probable sequence of tokens given the context, and for code that works shockingly well because there are millions of examples in the training data.&lt;/p&gt;

&lt;p&gt;But "good enough most of the time" breaks down fast when you need things to be &lt;em&gt;correct&lt;/em&gt; all of the time. And the gap doesn't close as models get bigger, because it isn't a knowledge gap. It's architectural. Research keeps finding the same thing: even simple arithmetic like 1 + 1 is retrieved as a memorized pattern rather than executed as an algorithm. Make the numbers bigger or the format unfamiliar and the apparent certainty evaporates. You can't train your way out of the wrong mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things LLMs Still Can't Do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Math.&lt;/strong&gt; Ask a model to multiply 1,847 by 923 and it'll probably get it right. Probably. Ask for 184,739 times 92,341 and you're rolling the dice, except it can't roll dice either. There's no calculator in there. It's predicting which digits look right, and for simple arithmetic the patterns hold. Past that you get a confident wrong answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Randomness.&lt;/strong&gt; We covered this. No dice, no coin flips, no shuffling. The model will &lt;em&gt;perform&lt;/em&gt; randomness for you and it looks convincing, but it's theater.&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%2Fus83naz05fh0x8kfi66a.jpg" 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%2Fus83naz05fh0x8kfi66a.jpg" alt="Six dice on dark slate, every visible face reading 42 instead of pips"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt; What time is it? What's today's date?  What's 14:05UTC in PST?&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%2Fvip35zyyx0nud177siq8.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%2Fvip35zyyx0nud177siq8.png" alt="A robot confidently reporting a Bitcoin price of $47,000 while the live terminal beside it reads $95,000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encoding and hashing.&lt;/strong&gt; Base64 encode this string. Generate an MD5. These have exactly one correct answer, and models produce wrong ones confidently, because they're predicting what encoded text &lt;em&gt;looks like&lt;/em&gt; rather than encoding anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unit conversions.&lt;/strong&gt; Kilometers to miles, bytes to gigabytes, how many seconds in 47 days and 3 hours. It'll nail the common ones it has seen a thousand times. Step off that path and accuracy drops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Counting characters.&lt;/strong&gt; The r's in "strawberry" is the meme version, but tokenization is the real limit. The model works in chunks of text rather than letters, so anything depending on exact character positions is a guess.&lt;/p&gt;

&lt;p&gt;I could go on and on. Here's a &lt;a href="https://tinyfn.io/tools" rel="noopener noreferrer"&gt;whole list&lt;/a&gt; of things we shouldn't be letting LLMs vibe out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents Aren't Coming. They're Here.
&lt;/h2&gt;

&lt;p&gt;Agentic behavior is the default now, not a feature. Long-running multi-step execution, computer use, parallel sub-agents. Models run autonomously for hours, and the trendlines point at day-long runs.&lt;/p&gt;

&lt;p&gt;That changes the stakes of everything above. When the model was an autocomplete in your editor, these limitations were annoying but contained. You'd catch the bad math in code review. You'd notice the wrong hex color when you previewed the UI. A human sat between every mistake and the world.&lt;/p&gt;

&lt;p&gt;Agents remove the human from the loop. An agent that can't reliably do math shouldn't be reconciling invoices. One that doesn't know the current time shouldn't be scheduling anything. One that can't generate real randomness shouldn't be minting security tokens. But hand it those tasks without tools and it'll try anyway, confidently, and because the answers &lt;em&gt;look&lt;/em&gt; right, nobody catches it until something downstream breaks.&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%2F5ieghrp1seins71686w7.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%2F5ieghrp1seins71686w7.png" alt="A chain of links starting from a glowing clock face with a question mark, each link more fractured than the last until the final one shatters"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  We Won the Tool War
&lt;/h2&gt;

&lt;p&gt;The fix has never been a secret: stop asking the model to &lt;em&gt;be&lt;/em&gt; a calculator and give it &lt;em&gt;access&lt;/em&gt; to one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: Give me a random number between 1 and 100

Without tools → "42" (pattern matching, not random)

With tools    → calls random_int(1, 100) → 67 (actually random)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the industry went and did it. The Model Context Protocol went from a promising spec to genuine infrastructure in about a year. SDK downloads run into the tens of millions a month and keep climbing. Anthropic handed the protocol to the Linux Foundation. Every major model speaks it, every serious IDE embeds it, and the public server registry passed the point where anyone bothers counting. The tool war is over. Tools won.&lt;/p&gt;

&lt;p&gt;So why are agents still failing?&lt;/p&gt;

&lt;p&gt;Not for lack of tools. Because a tool only helps if it actually returns the right answer, and a huge share of what agents reach for still isn't wired to anything deterministic. The model is left guessing at the hash, the conversion, the timezone, the random number. We gave it hands. We didn't always make sure the hands were reliable.&lt;/p&gt;

&lt;p&gt;And in an agent, unreliable is contagious.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Agents Actually Fail
&lt;/h2&gt;

&lt;p&gt;Say each step in an agent's chain is 90% reliable. That sounds great. Chain ten steps together and you're at 0.9^10, which is about 35%. Drop to a more honest 85% per step across a twenty-step run, the kind of run real agents actually do, and you land below 4%. The agent doesn't fail because one step is terrible. It fails because small uncertainties compound, and a long enough chain of "probably" multiplies down to "almost certainly not."&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%2Fj92cckp6x4tqkzqajusr.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%2Fj92cckp6x4tqkzqajusr.png" alt="Line chart of end-to-end success rate against chain length, showing 85, 90, 95 and 99 percent per-step reliability all decaying while a deterministic line stays flat at 100 percent"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  &lt;em&gt;Every curve on that chart bends toward zero. Only the flat one is a choice you can make.&lt;/em&gt;
&lt;/h6&gt;

&lt;p&gt;This isn't about getting a single base64 string right. Every probabilistic step you leave in the chain is a coin you flip again, and agents flip a lot of coins.&lt;/p&gt;

&lt;p&gt;I've written before about &lt;a href="https://dev.to/posts/practicalaifeatures/"&gt;which LLM features actually survive production&lt;/a&gt;, and this is the same argument from the other end: the ones that hold up are the ones whose steps aren't negotiable.&lt;/p&gt;

&lt;p&gt;So the lever everyone reaches for is "make the model more reliable per step." Push 90% to 95%. Worth doing, but you're fighting an exponent. The far cheaper move is to take steps &lt;em&gt;out of the probability calculation entirely.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's what a deterministic tool does. It doesn't make a step 99.9% reliable. It makes it 100%, the same way the &lt;code&gt;+&lt;/code&gt; operator is 100%. Base64 encoding through a real encoder isn't &lt;em&gt;usually&lt;/em&gt; right. It's right, every time, by construction. Every step you can convert from "probably" to "guaranteed" is a step that can no longer compound into failure. You're not improving the odds. You're deleting a die from the table.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Agent Did the Math. Your Model Didn't.
&lt;/h2&gt;

&lt;p&gt;Here's the objection I get every time I bring this up now: "This is solved. I asked Claude to convert 47°F to Celsius, it wrote a Python script, ran it, and gave me 8.33. It does math fine."&lt;/p&gt;

&lt;p&gt;It does not do math fine. Python does math fine.&lt;/p&gt;

&lt;p&gt;That distinction is the entire point, and it gets waved away constantly. When an agent converts a temperature by writing and executing code, the model contributed exactly one thing: the decision to delegate. The arithmetic happened somewhere else, in an interpreter, deterministically, exactly as it would have if you'd typed it yourself. Swap in a weaker model and the conversion is still correct. Take the interpreter away and the best model on earth goes back to guessing. That tells you precisely where the competence lives, and it isn't in the weights.&lt;/p&gt;

&lt;p&gt;This matters because people watch an agent succeed and then update their beliefs about the &lt;em&gt;model&lt;/em&gt;. Wrong entity. The tool got it right, the model got the credit, and the next thing that happens is somebody ships a pipeline that assumes arithmetic is handled, with nothing wired up to handle it.&lt;/p&gt;

&lt;p&gt;The upgrade here is delegation, not arithmetic. Only one of those is load-bearing. (The mirror image of this, where you credit the model for something your own instructions caused, is &lt;a href="https://dev.to/posts/claudemd/"&gt;why I refuse to maintain a CLAUDE.md&lt;/a&gt;.)&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%2Fka4t2p5aag9i684wnr7s.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%2Fka4t2p5aag9i684wnr7s.png" alt="Two panels comparing a model answering a temperature conversion from its weights versus calling a deterministic conversion tool"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix Is Deterministic Tools
&lt;/h2&gt;

&lt;p&gt;So the job was never to make the model smarter. It's to make sure every step with exactly one correct answer gets handled by something that can't get it wrong, and that the model reaches for that something instead of its own intuition. Stop asking it to fake the parts it was never built for and the chain stops rotting from the inside.&lt;/p&gt;

&lt;p&gt;A tool that's only &lt;em&gt;probably&lt;/em&gt; correct just relocates the coin flip without removing it. You want the ones whose answer is fixed the moment you ask the question, not negotiated token by token.&lt;/p&gt;

&lt;p&gt;The big categories already work this way and are basically solved: search, code execution, database access, vision. The gap is the long tail. Base64 and hashing. Timezone math that respects DST. CIDR ranges, unit conversions, business days between two dates, compound interest. Each one trivial alone, and collectively hundreds of operations every agent eventually reaches for.&lt;/p&gt;

&lt;p&gt;Right now most teams either let the model guess and hope, or rebuild the same utility functions from scratch and maintain them forever. Neither scales. One ships unreliable agents. The other has every team in the industry independently reinventing a base64 encoder.&lt;/p&gt;

&lt;h2&gt;
  
  
  "But Claude Already Does This"
&lt;/h2&gt;

&lt;p&gt;Whenever I make this argument, someone opens a chat window, asks Claude to convert a temperature, watches it write and run Python, and shows me the correct answer like it settles the matter.&lt;/p&gt;

&lt;p&gt;It doesn't, because the chat window isn't where agents run.&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%2Fj0ovchuha6r7w0aww7pc.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%2Fj0ovchuha6r7w0aww7pc.png" alt="Two panels comparing claude.ai, which ships with an interpreter, search, sandbox and tuned prompt plus a human reviewer, against a raw API call that is just a model and empty slots you wire yourself"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claude.ai is a product. It ships with an interpreter, a search tool, a file sandbox, and a system prompt that people at Anthropic tuned carefully, and all of that is working on your behalf before the model ever sees your question. Build against the API and none of it comes with you. You get a model and whatever tools you wire up yourself. There is no interpreter in the box.&lt;/p&gt;

&lt;p&gt;This is the same gap I hit with &lt;a href="https://dev.to/posts/the-case-against-pgvector/"&gt;pgvector&lt;/a&gt;, where the thing that works in a blog post and the thing that survives production turn out to be different systems.&lt;/p&gt;

&lt;p&gt;Standing one up in production is a project, not a checkbox. You need a sandbox, because you are executing generated code. You need to decide what it can reach on the network, how long it runs before you kill it, which packages exist inside it, what happens when it throws, and how any of that gets logged. Teams do this, and it's worth doing for genuinely open-ended computation. But reaching for a container to convert 47°F to Celsius is a remarkable amount of machinery to perform arithmetic, and it brings its own failure modes: wrong library, wrong flag, an exception the model reads as success.&lt;/p&gt;

&lt;p&gt;The other half of it is that the chat window has a human in it. You're sitting right there. You read the answer. If the conversion came back wrong you would probably notice, and if you didn't, the damage is one bad number in one conversation.&lt;/p&gt;

&lt;p&gt;Production agents run for hours with nobody watching. That's the whole reason to run them. The same wrong conversion you would have caught in chat instead feeds step nine, and step fourteen, and a record somebody trusts next quarter.&lt;/p&gt;

&lt;p&gt;So yes, Claude can convert a temperature. Inside a product built by people who thought carefully about tools, with you sitting there to check its work. That is not the thing you are shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Why I Built TinyFn
&lt;/h2&gt;

&lt;p&gt;This is the wall I kept hitting. Every agent I built needed a handful of these, and each time I was either bolting on another heavyweight MCP server that ate my context budget or writing the thing myself for the tenth time.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://tinyfn.io" rel="noopener noreferrer"&gt;TinyFn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's 500+ deterministic functions for exactly that long tail, each returning the single correct answer every time. They're split into focused toolsets you connect to individually through &lt;a href="https://tinyfn.io/mcp" rel="noopener noreferrer"&gt;MCP&lt;/a&gt;, so you wire up the two or three a given agent actually needs and skip the rest. It plugs into Claude, Cursor, or anything that speaks MCP.&lt;/p&gt;

&lt;p&gt;The premise underneath all of it is one line: &lt;strong&gt;0 hallucinations for operations that have exactly one correct answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A model can approximate a timezone conversion. The &lt;code&gt;datetime&lt;/code&gt; server gets it right, DST edge cases and all. Every one of those is a die off the table.&lt;/p&gt;

&lt;p&gt;None of this replaces the model. The model is genuinely brilliant at what it's built for. TinyFn handles what it wasn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lever Isn't the Model Anymore
&lt;/h2&gt;

&lt;p&gt;We spent years with one main lever: make the model bigger and smarter. More parameters, more data, better post-training. It worked, and the jump from GPT-3 to what shipped this year is staggering.&lt;/p&gt;

&lt;p&gt;But that lever is hitting diminishing returns on exactly the problems that matter most for agents. A model that's 10% better at predicting tokens is still 0% better at SHA256. The gains left aren't in the model. They're in what you wire around it: the right tools, sharp and deterministic, called at the right moment, so the model never has to fake the parts it can't do.&lt;/p&gt;

&lt;p&gt;Nobody judges a physicist for not doing long division in their head. We judge them on their reasoning. Agents are the same.&lt;/p&gt;

&lt;p&gt;42 is not a random number. It never was. But give the model a real random number generator, and it doesn't have to pretend anymore. Do that for every deterministic step in the chain, and your agent stops failing for reasons that were never the model's fault.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tinyfn.io" rel="noopener noreferrer"&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%2Fvye7xi6mxj9zh0nxy4az.png" alt="TinyFn: 500+ deterministic MCP tools for AI agents, 100% deterministic and 0 hallucinations"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
