<?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: Vaibhav Tekam</title>
    <description>The latest articles on DEV Community by Vaibhav Tekam (@vaibhav_tech4biz).</description>
    <link>https://dev.to/vaibhav_tech4biz</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%2F4016442%2F55a694c7-300d-4290-a397-c6d1d2161c68.jpeg</url>
      <title>DEV Community: Vaibhav Tekam</title>
      <link>https://dev.to/vaibhav_tech4biz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaibhav_tech4biz"/>
    <language>en</language>
    <item>
      <title>We Built a Fix for a LangGraph Gotcha That's Cost Multiple Teams Real Debugging Time. Then Almost Shipped Three Bugs of Our Own</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Tue, 21 Jul 2026 11:50:50 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/we-built-a-fix-for-a-langgraph-gotcha-thats-cost-multiple-teams-real-debugging-time-then-almost-5068</link>
      <guid>https://dev.to/vaibhav_tech4biz/we-built-a-fix-for-a-langgraph-gotcha-thats-cost-multiple-teams-real-debugging-time-then-almost-5068</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;langgraph dev&lt;/code&gt; has a quirk that isn't obvious until it costs you real time: it silently ignores whatever checkpointer you configured and forces in-memory storage instead. Restart the process, hot-reload during development, and your agent's entire conversation state is just gone, no error, no warning, the checkpoint file gets created and just stays empty. It's documented as a real, reproducible bug (GitHub issue #5790), and it isn't isolated. A related architectural gap around task-level checkpointing under the API server runtime shows up again in issue #6559, written up independently in real technical depth by a developer who lost three days to it, and again in issue #5360.&lt;/p&gt;

&lt;p&gt;A Reddit thread from earlier this year makes the actual stakes plain. Someone hosting a deep agent on LangSmith's free tier hit the same wall trying to configure Postgres for persistence, got told dev mode doesn't support a custom checkpointer, and asked outright whether they needed to buy a license to fix it. Another person replied that they'd tried the documented environment-variable workaround too, and it wasn't working either. The thread ends with both of them seriously considering abandoning the managed dev server entirely and hand-building a FastAPI wrapper instead, just to get persistence to behave.&lt;/p&gt;

&lt;p&gt;That's a real, recurring pain point, not a one-off, and it's worth being current about where LangGraph stands on it today. They've since shipped an official answer: you can now register a fully custom checkpointer through a &lt;code&gt;checkpointer&lt;/code&gt; key in &lt;code&gt;langgraph.json&lt;/code&gt;, validated against a conformance test suite before the server trusts it. It's a genuine fix, and credit where it's due. It's also explicitly marked alpha, "may experience breaking changes in minor version updates," and it asks for real integration work, five required operations implemented and conformance-tested, a config file wired up, before it runs, meaningfully more setup than the simple &lt;code&gt;compile(checkpointer=...)&lt;/code&gt; pattern most people reach for first, the same pattern that was silently ignored in every report above. For anyone not yet on that alpha path, or building across more than one agent framework, the gap those reports describe is still exactly the one you'll hit.&lt;/p&gt;

&lt;p&gt;So we built Checkpnt, a framework-agnostic checkpoint layer, one API, SQLite for dev, Redis for prod, resume any agent from exactly where it stopped, no conformance suite or alpha flag required, and it isn't tied to any single framework's persistence model at all.&lt;/p&gt;

&lt;p&gt;Then, going through it properly before anyone else touched it, we found three bugs that would have made our own launch a worse story than the one we were fixing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one that actually worried me
&lt;/h2&gt;

&lt;p&gt;The resume path had never been tested end to end.&lt;/p&gt;

&lt;p&gt;I want to be honest about how that happened, because it's a more common mistake than it should be. We'd built the &lt;em&gt;write&lt;/em&gt; side carefully, every checkpoint immutable, checksummed, parent-linked, a clean audit trail on paper. What we hadn't actually proven was that you could take one of those checkpoints and get a real agent back to the exact state it left off in. We had a checkpoint writer. We didn't yet have proof we had a checkpoint reader.&lt;/p&gt;

&lt;p&gt;The honest line from that week: if the resume path doesn't work, we don't have a product, we have a very well-organized way of writing data nobody can use. Everything else about the project could be defended or deferred. That one couldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one that would have been the worst kind of bug
&lt;/h2&gt;

&lt;p&gt;Deleting a checkpoint removed its payload from Redis but left a stale reference behind in the index. The next time you called &lt;code&gt;history()&lt;/code&gt;, it would fetch, say, ten IDs from that index, quietly discover three of the payloads no longer existed, filter them out, and hand back seven results, with absolutely nothing telling you that three were missing.&lt;/p&gt;

&lt;p&gt;For a tool whose entire reason to exist is being a trustworthy audit trail, a silent gap like that is close to the worst failure mode available. Not a crash. Not an error. Just quietly less data than you asked for, and no way to know unless you happened to count.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one we'd already half-admitted to ourselves
&lt;/h2&gt;

&lt;p&gt;Somewhere in the code was a comment next to the ID generator, roughly: "these aren't real UUID v7s yet, fix when Python 3.13 is baseline." Python 3.13 was already out. We'd left the comment in and shipped the fake IDs anyway, format looked right, spec compliance didn't hold up if anything downstream actually validated it.&lt;/p&gt;

&lt;p&gt;That one stung a little more than the other two, honestly, because we'd already caught it ourselves and just hadn't gotten around to fixing it. There's a difference between a bug you didn't see and a bug you wrote a comment about and moved past.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually held up
&lt;/h2&gt;

&lt;p&gt;We fixed the resume path first, since nothing else mattered if that stayed broken. Then the silent Redis gap, giving &lt;code&gt;history()&lt;/code&gt; an honest count instead of a quietly wrong one. Then the UUID generator, actually replacing the placeholder instead of just narrating that we would eventually.&lt;/p&gt;

&lt;p&gt;Checkpnt is live and open source now. A single organic mention on GitHub, no promotion behind it, pulled 45 real clones before we'd even written a proper announcement, which told us the original problem was exactly as real as three separate GitHub issues and a Reddit thread full of people asking whether they needed to pay for a license just to keep their agent's memory intact suggested it was.&lt;/p&gt;

&lt;p&gt;Curious whether others have shipped something and only found the real bug after a fix that was supposed to be simple turned out to expose something bigger underneath it. What was the one that actually worried you?&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Tech4Biz-Solutions-Pvt-Ltd/checkpnt" rel="noopener noreferrer"&gt;github.com/Tech4Biz-Solutions-Pvt-Ltd/checkpnt&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Add More Error Correction to a Quantum Computer and It Can Get Worse, Not Better. Here's the Formula That Tells You Which Side of the Line You're On.</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Thu, 16 Jul 2026 18:12:25 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/add-more-error-correction-to-a-quantum-computer-and-it-can-get-worse-not-better-heres-the-21dc</link>
      <guid>https://dev.to/vaibhav_tech4biz/add-more-error-correction-to-a-quantum-computer-and-it-can-get-worse-not-better-heres-the-21dc</guid>
      <description>&lt;p&gt;A quantum computer's raw qubits are unreliable, error-prone, noisy. To get one qubit you can actually trust, a "logical" qubit, you have to bundle dozens or hundreds of the noisy physical ones together and continuously error-correct them. Every hardware team, algorithm designer, and investor evaluating quantum computing eventually asks the same question, and it has an exact answer: given how error-prone your hardware actually is, and an algorithm that needs a certain number of these reliable logical qubits running for a certain number of steps, how many raw physical qubits do you actually need, and how long will the whole thing take to run.&lt;/p&gt;

&lt;p&gt;Get this number wrong and the consequences aren't abstract. A startup pitching a five-year path to a useful quantum computer, when the honest math says fifty, isn't lying, they may genuinely not have run the calculation. An investor who takes the pitch deck's qubit count at face value can be off by two orders of magnitude and never know it until the money's gone. A hardware team sizing a chip against the wrong error-correction overhead can miss its own budget by 100x. This number is the single most-cited back-of-the-envelope calculation in fault-tolerant quantum computing precisely because getting it wrong is expensive and easy to do quietly.&lt;/p&gt;

&lt;p&gt;The math itself is standard and well established. The tools that compute it are not. They're either heavyweight frameworks that need a whole toolchain installed to answer one question, or the formula is buried inside a chemistry package built for something else entirely. There was no small, exact, transparent tool that just answered the question. So we built one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number that decides everything
&lt;/h2&gt;

&lt;p&gt;The surface code is the leading way to do this bundling, and its entire behavior hinges on a single number: the threshold.&lt;/p&gt;

&lt;p&gt;The logical error rate per correction cycle follows the standard approximation from Fowler et al. (2012):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P_L ≈ A · (p / p_th) ^ ((d + 1) / 2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;p&lt;/code&gt; is your hardware's physical error rate, &lt;code&gt;p_th&lt;/code&gt; is the threshold (about 0.57%, Fowler's circuit-level value), and &lt;code&gt;d&lt;/code&gt; is the code distance, roughly how much redundancy you're throwing at the problem.&lt;/p&gt;

&lt;p&gt;Here's the part that surprises people who haven't sat with this formula before. Below threshold, increasing the code distance suppresses the logical error rate exponentially. More qubits genuinely buy you more reliability. Above threshold, increasing the code distance makes things worse, not better. No amount of error correction helps until the hardware itself improves. Adding redundancy to a system that hasn't crossed the threshold doesn't stabilize it. It amplifies the noise you're trying to correct.&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%2F9wdn2o7sd9ctefgmjdg2.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%2F9wdn2o7sd9ctefgmjdg2.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's not an edge case. That's the entire reason the threshold theorem is the number every roadmap in this field is actually built around, and it's why "just add more qubits" is sometimes the correct engineering answer and sometimes the exact opposite of it, depending entirely on which side of 0.57% your hardware sits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a reliable qubit actually costs
&lt;/h2&gt;

&lt;p&gt;A rotated surface code of distance &lt;code&gt;d&lt;/code&gt; uses roughly &lt;code&gt;2 · d²&lt;/code&gt; physical qubits per logical qubit. The cost is quadratic, which is the real reason reliability is expensive: pushing the logical error rate down by another order of magnitude doesn't cost you a little more hardware, it costs you the square of a little more.&lt;/p&gt;

&lt;p&gt;For a full algorithm needing &lt;code&gt;Q&lt;/code&gt; logical qubits running &lt;code&gt;C&lt;/code&gt; cycles, the total error is bounded by &lt;code&gt;Q · C · P_L&lt;/code&gt;. Given a target total error, the tool works backward: find the smallest odd distance that meets the per-cycle budget, then report the total physical qubit count, the runtime, and the space-time volume.&lt;/p&gt;

&lt;p&gt;Run it on a single logical qubit at a physical error rate of 0.001 with a target logical error of one in a billion, and the answer comes back as a code distance of 21, an achieved logical error of 4.85e-10, and 882 physical qubits per logical qubit. Run it on a full algorithm, 100 logical qubits over a billion cycles, and you get a code distance of 31 and a total physical qubit count of 192,200. Those aren't estimates pulled from a chart. They're the exact output of the same closed-form arithmetic every published paper in this space cites.&lt;/p&gt;

&lt;p&gt;To make that concrete: 882 physical qubits, just for one reliable logical qubit at a billion-to-one error rate, is more than five of IBM's current 156-qubit Heron production chips combined. The full algorithm's 192,200 physical qubits runs roughly 170 times larger than IBM's own Condor, the largest gate-model superconducting chip anyone has built to date at 1,121 qubits, and it's still bigger than the roughly 100,000-qubit system IBM's own public roadmap targets for Blue Jay, its most ambitious announced machine, not expected until 2033. The formula isn't describing a hypothetical inconvenience. It's describing hardware that doesn't exist yet, on any currently announced roadmap.&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%2Fo5g83g1btiraesnstox5.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%2Fo5g83g1btiraesnstox5.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Checked against a real chip, not just against itself
&lt;/h2&gt;

&lt;p&gt;A tool like this is worthless if it only agrees with its own assumptions. So the test suite checks it against something external: Google's actual published Willow chip results. A distance-7 rotated surface code, by this tool's formula, uses approximately 100 physical qubits. Google's own distance-7 memory experiment, published in Nature in 2025, used 101.&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%2Fumgzpkw7iaz3t3vkczi6.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%2Fumgzpkw7iaz3t3vkczi6.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the number that matters more than any of the closed-form math on its own. The formula isn't just internally consistent, it lands within one qubit of a real, physically built, published quantum memory. Fourteen tests bind the rest of the behavior to the field's known results: logical error falling monotonically with distance below threshold and rising above it, no effect at threshold itself, the widely cited mid-tens distance and roughly-1000-qubits-per-logical figure at the common 10⁻³ physical error, 10⁻⁹ target regime.&lt;/p&gt;

&lt;h2&gt;
  
  
  The constants stay visible on purpose
&lt;/h2&gt;

&lt;p&gt;The literature actually uses more than one exponent convention for this formula, because different papers fit their prefactor and threshold slightly differently. Most tools pick one and hide it. This one exposes the prefactor and the threshold as documented, overridable parameters, defaulting to Fowler's published values, so you can match whichever paper you're citing instead of silently inheriting someone else's assumption.&lt;/p&gt;

&lt;p&gt;That transparency was a deliberate design choice, not a missing feature. A tool that hides its constants behind one magic formula is asking you to trust a number without showing you where it came from. A tool that shows you the constant and lets you swap it is asking something more honest: verify this against the source you actually care about, don't just believe it because the tool says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it refuses to claim
&lt;/h2&gt;

&lt;p&gt;The README says this directly, and it's worth repeating rather than softening: these are the standard surface-code approximations the field cites, not exact hardware truth. Real qubit counts depend on layout, decoder performance, connectivity, magic-state distillation, and hardware specifics no closed form captures. This is an order-of-magnitude planning tool, a feasibility check, a teaching reference. It is explicitly not a substitute for full circuit-level simulation, and the README says exactly where to go for that instead, Stim, PyMatching, the Azure Quantum Resource Estimator.&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%2Fb1fxw5e7jhtcjpofrruw.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%2Fb1fxw5e7jhtcjpofrruw.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within that stated scope, the arithmetic is exact and reproducible. Outside it, the tool tells you plainly that you've left the territory it can speak to, instead of quietly producing a number that looks equally confident either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this actually gets used
&lt;/h2&gt;

&lt;p&gt;Hardware roadmapping: how many physical qubits does a target algorithm need at your team's current error rate. Algorithm feasibility: is this even runnable on near-term hardware, or is it a decade away. Technical due diligence: sanity-checking a quantum startup's qubit-count and timeline claims against the same formula the whole field cites, rather than taking the pitch deck's number on faith. Teaching: a transparent, testable reference for the threshold theorem that a student can actually read the source of.&lt;/p&gt;

&lt;p&gt;The pattern by now should be familiar if you've read anything else we've built. A tool is trustworthy when it's honest about the edge of what it knows, states its assumptions in the open, and gets checked against something real rather than just against itself. That's true whether the domain is solar telemetry, legacy financial systems, or the physical qubit count on a chip that doesn't exist in most labs yet. The domain changes. The discipline doesn't.&lt;/p&gt;

&lt;p&gt;The tool is live on GitHub under MIT: &lt;a href="https://github.com/Tech4Biz-Solutions-Pvt-Ltd/qec-overhead" rel="noopener noreferrer"&gt;github.com/Tech4Biz-Solutions-Pvt-Ltd/qec-overhead&lt;/a&gt;. If you're working on QEC resource planning, decoder or control hardware, or need a custom model for a quantum-systems problem, &lt;a href="https://tech4bizsolutions.com/contact?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=qec-overhead-quantum-error-correction" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>quantumcomputing</category>
      <category>opensource</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Ask Your AI Agent the Same Question Twice. If the Answers Differ, No Amount of Fine-Tuning Fixes That.</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Thu, 16 Jul 2026 00:06:35 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/ask-your-ai-agent-the-same-question-twice-if-the-answers-differ-no-amount-of-fine-tuning-fixes-d4g</link>
      <guid>https://dev.to/vaibhav_tech4biz/ask-your-ai-agent-the-same-question-twice-if-the-answers-differ-no-amount-of-fine-tuning-fixes-d4g</guid>
      <description>&lt;h1&gt;
  
  
  Ask Your AI Agent the Same Question Twice. If the Answers Differ, No Amount of Fine-Tuning Fixes That.
&lt;/h1&gt;

&lt;p&gt;A language model is probabilistic. Ask it the same question twice, worded exactly the same way, and you can get two different answers back. That's not a bug. That's what the model is.&lt;/p&gt;

&lt;p&gt;For a chatbot, nobody cares. For an agent approving a loan, paying a claim, or touching a patient record, it's disqualifying. Enterprises will not put agents into production where "usually right" is the only guarantee on offer, and they're correct not to.&lt;/p&gt;

&lt;p&gt;We spent two years building the layer that fixes this, not by making the model better, but by refusing to ask the model to be the thing providing the guarantee at all. We open-sourced the core of it under Apache 2.0. It's called Determ8.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fight nobody can win
&lt;/h2&gt;

&lt;p&gt;The instinct every team has is to make the model more trustworthy. Bigger model. More context. Sharper prompts. Fine-tune on more examples until it stops making the mistake.&lt;/p&gt;

&lt;p&gt;This doesn't work, and it's worth being precise about why, because the reason isn't "today's models aren't good enough yet." The reason is mathematical. A model that samples from a distribution cannot return a guaranteed answer, at any accuracy level, because sampling from a distribution is what it does. A more accurate distribution is still a distribution. You can make the wrong answer less likely. You cannot make it impossible, and "impossible" is the bar a regulated decision actually requires.&lt;/p&gt;

&lt;p&gt;Even the arithmetic underneath a model isn't fully deterministic by default. Floating-point operations can produce different results depending on execution order, hardware, and batching, the same weights, the same input, a different answer, before anything about the model's own judgment even enters the picture. If you're trying to build a guarantee on top of that, you're building on sand and calling it foundation.&lt;/p&gt;

&lt;p&gt;So the guarantee has to come from somewhere else. Not a better model. A different kind of layer sitting next to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built instead
&lt;/h2&gt;

&lt;p&gt;Determ8 wraps a probabilistic model in a deterministic pipeline. The model stays exactly as probabilistic as it always was. Nothing about it changes. What changes is that its output is no longer trusted on arrival.&lt;/p&gt;

&lt;p&gt;The agent proposes a candidate answer. That candidate enters a pipeline of gates, one at a time. Each gate answers exactly one question, deterministically: pass or fail. Cheap gates run first. Expensive gates run last. The moment a gate fails, the pipeline stops and rejects the candidate, and the whole run gets logged so it can be replayed and audited later. Only a candidate that clears every gate ships.&lt;/p&gt;

&lt;p&gt;![The model proposes, the pipeline proves, and a single failed gate stops the 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%2Fn8qwq1ohoylwjb1m3rsx.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%2Fn8qwq1ohoylwjb1m3rsx.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every gate, free or paid, built-in or custom, implements the same contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gate(candidate, spec) -&amp;gt; Verdict(passed, reason, proof)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single shared contract is the entire reason this composes. Because every gate looks identical to the pipeline, you can add one, remove one, reorder them, or write your own without touching anything else. The determinism guarantee is simple to state: same input, same gate configuration, same verdict, every single time, forever. Not "usually." Every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the line actually sits
&lt;/h2&gt;

&lt;p&gt;Determ8 is open core, and the split between what's free and what's paid is itself a real design statement, not just a pricing decision.&lt;/p&gt;

&lt;p&gt;![Four free structural gates versus four paid gates that require real formal-methods engineering]&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%2Fg9mthzrc6rob08o4mqvy.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%2Fg9mthzrc6rob08o4mqvy.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The free tier handles structural correctness, pattern-matching against a known shape. The paid tier is where the hard, defensible gates live, formal proof, prebuilt regulatory rule packs, constraint solving, and cryptographically signed audit trails built for a regulator to inspect line by line.&lt;/p&gt;

&lt;p&gt;That split exists because those two categories of correctness are genuinely different problems, and pretending they cost the same amount of engineering to build would be dishonest pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  A verdict, not a guess
&lt;/h2&gt;

&lt;p&gt;Every run produces a &lt;code&gt;PipelineResult&lt;/code&gt;. Nothing about that record is fuzzy. There's no confidence score anywhere in it, on purpose.&lt;/p&gt;

&lt;p&gt;![The PipelineResult object: passed, failed_gate, reason, input_hash, and the full verdict trace]&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%2F2wscfnd0y2iw41utopjs.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%2F2wscfnd0y2iw41utopjs.png" alt=" " width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confidence scores are what you reach for when you can't actually prove the thing. The moment a system starts reporting "87% confident this loan decision is compliant," it has quietly admitted it cannot tell you whether the decision is compliant, only how comfortable it feels. Determ8 doesn't produce that number, because producing it would be lying about what kind of claim is actually being made.&lt;/p&gt;

&lt;h2&gt;
  
  
  The instinct this comes from, stated plainly
&lt;/h2&gt;

&lt;p&gt;There's a rover on Mars right now that makes decisions no human is in the loop for, because at that distance a round-trip signal takes twelve minutes and the ground can't wait that long. The engineers who built it faced the same choice every team building agents faces: build something that acts with confidence, or build something that knows when to stop.&lt;/p&gt;

&lt;p&gt;They chose to build something that stops. When uncertainty crosses a threshold, it halts and waits, rather than guessing at the safer path and committing anyway. That wasn't timidity. It's arguably the single most important engineering decision on the entire mission, because a system that knows exactly where its own certainty ends is more capable than one that never questions its own confidence, not less.&lt;/p&gt;

&lt;p&gt;Enterprise AI mostly decided the opposite: that hesitation was the failure mode, that a model which stopped had somehow malfunctioned. So probabilistic systems got handed authority over processes that actually needed certainty, and for a while the industry called that progress. It wasn't. It was just a failure that hadn't been noticed yet, because production systems don't announce their own degradation. The gap between likely and correct just quietly hardens into operational reality until an audit finds it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this actually matters
&lt;/h2&gt;

&lt;p&gt;Banking and finance: loans, payments, fraud detection, trading. Healthcare: diagnosis support, medical billing, claims. Insurance: underwriting, claims approval. Legal and compliance: contract review, KYC, regulatory filing. Government: benefits and eligibility determination. Critical infrastructure: energy, automotive, manufacturing.&lt;/p&gt;

&lt;p&gt;Low-stakes agents don't need any of this. A chatbot that occasionally phrases something oddly costs you nothing. A high-stakes agent that occasionally approves the wrong claim costs you an audit, a regulator, or a customer who can't get their money back. The gap between those two situations isn't a matter of degree. It's a different category of problem, and it needs a different category of solution, one that doesn't ask a probability distribution to hold a guarantee it was never built to hold.&lt;/p&gt;

&lt;p&gt;The model proposes. The pipeline proves. That's the whole idea, and once you've seen the distinction, it's hard to unsee how many production AI systems are quietly skipping the second half.&lt;/p&gt;

&lt;p&gt;The open core, the pipeline and the four free gates, is live on GitHub under Apache 2.0: &lt;a href="https://github.com/Tech4Biz-Solutions-Pvt-Ltd/-Tech4Biz-Determ8" rel="noopener noreferrer"&gt;github.com/Tech4Biz-Solutions-Pvt-Ltd/-Tech4Biz-Determ8&lt;/a&gt;. If you're putting agents anywhere near money, health, or compliance and need the formal verification, rule packs, or audit trail the Pro gates provide, &lt;a href="https://tech4bizsolutions.com/contact?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=determ8-deterministic-gate" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>systemdesign</category>
      <category>architecture</category>
    </item>
    <item>
      <title>AI Can Migrate Your COBOL to Java. It Can't Prove It Didn't Break Anything. We Built the Part That Does.</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Tue, 14 Jul 2026 17:12:00 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/ai-can-migrate-your-cobol-to-java-it-cant-prove-it-didnt-break-anything-we-built-the-part-that-4ohg</link>
      <guid>https://dev.to/vaibhav_tech4biz/ai-can-migrate-your-cobol-to-java-it-cant-prove-it-didnt-break-anything-we-built-the-part-that-4ohg</guid>
      <description>&lt;p&gt;Every bank, insurer, and government system running on a mainframe today is sitting on COBOL that nobody wants to touch and nobody can afford to leave alone. AI coding agents have made the migration itself fast. Feed in the COBOL, get back Java. That part is basically solved.&lt;/p&gt;

&lt;p&gt;Nobody has solved the part that actually matters: proving the migrated code does the same thing the legacy code did.&lt;/p&gt;

&lt;p&gt;Looks-right is not the same claim as is-right. A migration that compiles, passes a handful of manual test cases, and reads cleanly can still silently change what a program computes. In a codebase processing millions of transactions, a silent change doesn't show up as a crash. It shows up as a discrepancy report six months later, and by then it's an audit finding, not a bug ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  The assumption everyone makes, and why it's wrong
&lt;/h2&gt;

&lt;p&gt;The default way teams validate a migration is spot-testing. Run the legacy system and the new system against the same set of inputs, compare outputs, ship it if they match.&lt;/p&gt;

&lt;p&gt;Spot-testing only proves the paths you thought to test. It says nothing about the paths you didn't. And the paths that break aren't the ones anyone thinks to check, because if you'd thought to check them, you'd have already fixed them.&lt;/p&gt;

&lt;p&gt;Here's the one that should worry every team doing this migration and doesn't. Picture a loan servicing system calculating daily interest accrual on a few million accounts. The COBOL does the math in fixed-point decimal, the way COBOL always has. The migrated Java, if nobody was deliberate about it, does the same calculation in floating-point, because that's just what a fresh Java implementation reaches for by default. On any single account, the two numbers match to the cent, or look close enough that nobody double-checks. Run it across a few million accounts, every day, compounding, and the tiny rounding difference on each one doesn't cancel out, it accumulates. Six months later, someone reconciling the books finds the total doesn't match, and by then it's an audit finding, not a code review comment. We test our own arithmetic lifter against &lt;code&gt;Fraction(0.1)&lt;/code&gt; specifically, because that single value is the textbook case where floating-point quietly lies to you and fixed-point doesn't. If a verifier isn't defending against that on day one, it isn't actually verifying anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why nobody can honestly quote you a clean percentage
&lt;/h2&gt;

&lt;p&gt;Ask five vendors what fraction of business logic AI migration preserves, and you'll get five confident numbers with no citation behind any of them. That's not a knock on any one vendor, it's because the honest answer doesn't compress into a single percentage.&lt;/p&gt;

&lt;p&gt;The more useful way to think about it is splitting two things that get conflated constantly: translation accuracy and migration completeness. Translation accuracy asks whether the COBOL got turned into syntactically valid, compiling Java. That part is close to solved, AI handles it well. Migration completeness asks something harder: did the decades of business behavior encoded in that COBOL, the explicit rules, the undocumented assumptions, the operational quirks nobody wrote down because everyone just knew them, survive the trip. Those are different questions, and a report that only answers the first one is answering the easy one.&lt;/p&gt;

&lt;p&gt;A better unit to measure against is something closer to Business Rule Recall: not lines of code translated, but behaviors preserved, explicit rules, documented workflows, the hidden assumptions and operational quirks that were never written down anywhere except in thirty years of the system just working a certain way. A system with a few thousand explicit rules might also be carrying a few hundred quirks nobody could name if you asked them directly, batch job sequencing that has to happen in a specific order, month-end processing that behaves differently near a fiscal boundary, a rollback semantic that only matters when two specific failure conditions overlap. None of that shows up in a lines-of-code count, and all of it is exactly what a spot-test misses and a formal equivalence check catches.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built instead
&lt;/h2&gt;

&lt;p&gt;We built a differential equivalence verifier. Not a code generator, not a linter, not a test suite. Its only job is to sit beside the migration and answer one question with proof: does the new code produce the same outputs and the same data writes as the old code, for the same inputs, every time?&lt;/p&gt;

&lt;p&gt;The credibility of a tool like this rests on exactly one design decision. When it says "not equivalent," it hands you the exact input where the two programs diverge. A counterexample, not a confidence score. Confidence scores are what you reach for when you can't actually prove the thing. We built this specifically so we'd never have to reach for one.&lt;/p&gt;

&lt;p&gt;Under the hood, that means formal verification, an SMT solver checking mathematical equivalence between the legacy logic and the migrated logic, not a fuzzy comparison of outputs. Where it can prove equivalence, it proves it. Where it can't, it says exactly that, and shows you why, instead of quietly passing something it never actually checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we refused to guess
&lt;/h2&gt;

&lt;p&gt;v1 of this verifier handles COBOL-to-Java equivalence for arithmetic and branching logic. That's it. It does not touch PERFORM loops, file I/O, REDEFINES, string handling, or UI logic, and when it hits any of those, it says so explicitly: out of scope, unverified, flagged. It does not silently skip them and let a passing report imply they were checked.&lt;/p&gt;

&lt;p&gt;That refusal is the entire point. A verification tool that quietly ignores what it can't handle is more dangerous than no tool at all, because silence reads as approval. A team that sees a clean report assumes everything was checked. Everything actually checked, and only that, is the entire value of the tool. We'd rather ship a narrower verifier that never lies about its own coverage than a broader one that does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug we found before it shipped
&lt;/h2&gt;

&lt;p&gt;Building the branching logic lifter, we hit something worth being honest about. Translating a sequential program, one instruction after another, mutating variables as it goes, into a form a solver can reason about requires care around how variable reuse across steps is handled. Get it wrong, and the solver ends up proving two programs equivalent, or not, based on an artifact of how we encoded the translation, not on anything true about the actual programs.&lt;/p&gt;

&lt;p&gt;We found that gap ourselves, before the solver was ever involved, by testing the translation against known cases and noticing the semantics didn't hold up under sequential writes. The fix was to handle each step's state explicitly rather than assuming naive substitution would carry meaning forward correctly. It's the same principle we hold everywhere else: find the failure mode by design, before it becomes a wrong verdict a client relies on.&lt;/p&gt;

&lt;p&gt;The second thing we built in specifically was witness refinement. Early on, a counterexample the solver produced could, in principle, be an artifact of how we'd modeled the problem rather than a genuine divergence between the two programs. We don't ship a "not equivalent" verdict unless the counterexample is real and replayable, an actual input you can run through both programs and watch them produce different answers. Anything less than that isn't proof. It's a guess wearing a solver's badge.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it found, the first time we pointed it at real code
&lt;/h2&gt;

&lt;p&gt;Design principles are worth exactly as much as what they catch. So we ran the verifier against 14 customer COBOL systems, not synthetic test cases, not our own code, real production systems sitting in the wild.&lt;/p&gt;

&lt;p&gt;Across those 14 systems: roughly 0.2 million lines of COBOL, 300 diverse modules, 8,700 regression tests generated and run.&lt;/p&gt;

&lt;p&gt;The verifier flagged 412 semantic mismatches.&lt;/p&gt;

&lt;p&gt;Four hundred and twelve places where the migrated logic did not provably match the original. Not style differences, not formatting drift, actual behavioral divergence, the kind spot-testing walks past because nobody happened to test that exact input combination. Every one of those 412 is a discrepancy that would have shipped silently under the industry's default validation method, a handful of manual test cases and a compile that succeeded.&lt;/p&gt;

&lt;p&gt;That's the number that matters more than any theoretical argument about floating-point or business rule recall. Those 412 mismatches are why "it compiles and passes our test cases" is not the same claim as "it's safe to run." We didn't need to hypothesize the gap. We measured it, on real systems, and it was real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than the migration itself
&lt;/h2&gt;

&lt;p&gt;Every AI coding agent on the market can now translate legacy code fast. That capability is commoditizing in real time. What isn't commoditizing, what almost nobody is building, is the independent layer that proves the translation preserved the business logic, with a real counterexample when it didn't and an honest refusal when it can't tell.&lt;/p&gt;

&lt;p&gt;If you're running a legacy modernization program, on COBOL, on any mainframe system where "probably fine" isn't a standard your auditors or your regulators will accept, this is the gap that decides whether your migration is actually safe or just looks safe until it isn't. We built the verifier because we needed it to exist. If you're facing the same problem, it already does.&lt;/p&gt;

&lt;p&gt;If this is a problem you're facing right now, &lt;a href="https://tech4bizsolutions.com/contact?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=legacy-verifier-cobol-java" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>legacy</category>
      <category>architecture</category>
      <category>formalverification</category>
      <category>legacymigration</category>
    </item>
    <item>
      <title>A Layer of Dust Can Cut Your Solar Output by 25%. Most Dashboards Won't Tell You, Because Their Number Is a Guess.</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Mon, 13 Jul 2026 12:39:06 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/a-layer-of-dust-can-cut-your-solar-output-by-25-most-dashboards-wont-tell-you-because-their-5eoe</link>
      <guid>https://dev.to/vaibhav_tech4biz/a-layer-of-dust-can-cut-your-solar-output-by-25-most-dashboards-wont-tell-you-because-their-5eoe</guid>
      <description>&lt;p&gt;Every solar plant already measures itself. The inverters report power output, temperature, lifetime energy, every few seconds, in a standard protocol most of them already speak. The data is sitting right there on the wire. Most small and mid-size operators, the rooftop plants on factories, schools, hospitals, warehouses, never read it, because the platforms that would read it for them are built for utility-scale plants with utility-scale budgets.&lt;/p&gt;

&lt;p&gt;We built Suryamon to read it anyway. Free, open source, self-hosted. And in building it, we ran into a decision that ended up defining the whole project more than any feature did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The number everyone gives you anyway
&lt;/h2&gt;

&lt;p&gt;Performance Ratio is the single most trusted metric in solar. It answers the question that actually matters: of the energy the sun offered a plant today, how much did it actually capture. A PR of 0.80 means the sun offered 100 units and the plant delivered 80. Healthy plants sit in the 0.75 to 0.85 range, and a PR that starts drifting down is usually the earliest sign of soiling, degradation, or equipment trouble, weeks before anyone would notice it any other way.&lt;/p&gt;

&lt;p&gt;Computing PR correctly requires irradiance data, how much sunlight actually hit the panels, measured by a pyranometer. Most small operators don't have one installed. It's an extra sensor, extra cost, extra thing to maintain, and plenty of rooftop plants skip it entirely.&lt;/p&gt;

&lt;p&gt;Here's what nearly every monitoring platform does when the pyranometer is missing: it shows you a PR number anyway. Usually built on a modeled or assumed irradiance curve for the region and season, close enough to look plausible, precise enough to look measured. The dashboard shows 0.81 with the same confidence whether that number came from a real sensor or a guess dressed up in two decimal places.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we refused to do
&lt;/h2&gt;

&lt;p&gt;Suryamon does not do this. If there's no pyranometer, there's no PR. Full stop.&lt;/p&gt;

&lt;p&gt;What the plant gets instead is specific yield and CUF, capacity utilization factor, both of which are real, computable, honest numbers that don't require irradiance data to mean something true. Specific yield tells you energy per unit of installed capacity, the fairest way to compare plants of different sizes. CUF tells you energy delivered against the theoretical maximum if the plant ran at full power around the clock. Neither one requires guessing what the sun did.&lt;/p&gt;

&lt;p&gt;This was a genuinely uncomfortable decision to make, because a dashboard with a PR field that's sometimes blank looks less complete than one that always has a number in it. We made it anyway, because a fabricated PR is worse than no PR. A plant owner making a decision off a guessed number doesn't know they're looking at a guess. A blank field at least tells the truth about what you don't know.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the same instinct shows up again
&lt;/h2&gt;

&lt;p&gt;The same discipline shows up in how Suryamon scores string-level anomalies. Every string's current gets compared against the plant-wide value to detect underperformance, soiling, a failing connector, a dead string. The obvious way to do that comparison is against the mean. We use the median instead.&lt;/p&gt;

&lt;p&gt;The reason is specific and worth stating plainly: a single dead string, current near zero, will drag the mean down with it. Compare every string against a mean that a dead string has already corrupted, and the dead string itself can end up looking only mildly underperforming relative to a lowered average, exactly the failure mode you built the check to catch, quietly defeating itself. The median doesn't move the same way. A handful of healthy strings around a median stays a stable reference point even when one string goes to zero, so the dead string still reads as dead instead of borderline.&lt;/p&gt;

&lt;p&gt;It's a small implementation choice. It's also the same principle as the PR decision: don't let a metric look more trustworthy than the math underneath it actually is.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we know the math itself is right
&lt;/h2&gt;

&lt;p&gt;None of this matters if the KPI calculations are wrong, so every one of them is tested against IEC 61724-1 reference cases, the actual published standard, not our own assumptions about what the numbers should be. A 100 kWp plant receiving 5.5 kWh/m2 of irradiation and producing 440 kWh of output has to produce a PR of exactly 0.80, that's asserted in the test suite, not eyeballed.&lt;/p&gt;

&lt;p&gt;The collector side gets the same treatment. The simulator's SunSpec Modbus server and the collector's reader talk over a real TCP connection inside the test suite, register encoding, model-chain walking, scale factors, all exercised on the actual wire protocol, not mocked. Every PromQL expression in every alert rule and every dashboard panel gets parsed by a real PromQL parser as part of CI, so a broken query fails the build instead of failing silently in front of a plant owner months later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dependency decision we made and documented
&lt;/h2&gt;

&lt;p&gt;Suryamon pins pymodbus to the stable 3.6 line rather than tracking the latest release. The 3.7+ series is mid-migration to a new server API with breaking changes, and we didn't want Suryamon's reliability riding on a dependency that was still finding its own footing. This is written down directly in the codebase as a deliberate, documented choice, not something we're hoping nobody asks about. We'll move when the newer line actually stabilizes. Until then, the older, proven version is the correct choice, even though it's the less exciting one to ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual thesis
&lt;/h2&gt;

&lt;p&gt;A monitoring tool's job is to tell you the truth about a plant, including the parts of the truth that are inconvenient, a metric it can't compute, a string that's failing, a dependency that isn't ready yet. The moment a tool starts filling gaps with plausible-looking numbers instead of admitting the gap, it has stopped being a monitoring tool and started being a guess with better formatting.&lt;/p&gt;

&lt;p&gt;We'd rather ship the honest blank field than the confident wrong number. That's not a limitation of Suryamon. That's the whole point of it.&lt;/p&gt;

&lt;p&gt;If this is a problem you're facing right now, &lt;a href="https://tech4bizsolutions.com/contact?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=solar-monitoring-honest-performance-ratio" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>showdev</category>
      <category>iot</category>
      <category>python</category>
    </item>
    <item>
      <title>The Product Works. That's Not the Question Due Diligence Is Asking.</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Thu, 09 Jul 2026 11:08:52 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/the-product-works-thats-not-the-question-due-diligence-is-asking-54a8</link>
      <guid>https://dev.to/vaibhav_tech4biz/the-product-works-thats-not-the-question-due-diligence-is-asking-54a8</guid>
      <description>&lt;p&gt;We had a healthcare claims platform stuck at 45% recall on medical coding. Not 45% on a benchmark. 45% recall on CPT and ICD code assignment, in a system whose job is getting those codes right before a claim goes out. Get it wrong, and a claim gets denied. A billing team spends an afternoon on the phone with a payer instead of doing their actual job.&lt;/p&gt;

&lt;p&gt;This post is about the architectural decision that moved CPT recall from 45% to 92%, and why no amount of prompt engineering or fine-tuning could have produced the same result on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why fine-tuning stopped working
&lt;/h2&gt;

&lt;p&gt;When a number is low, the obvious move is a bigger model. We made that move too, and it wasn't a bad instinct, at least at first.&lt;/p&gt;

&lt;p&gt;We spent real weeks on it: sharper prompts, more examples, better retrieval so the right context sat in front of the model when it made a call. Recall climbed out of the 40s into the high 50s, low 60s. Genuine progress.&lt;/p&gt;

&lt;p&gt;Then, somewhere in the low 60s, it stopped. More examples didn't move it. Sharper prompts didn't move it. The usual levers had stopped answering.&lt;/p&gt;

&lt;p&gt;That's the moment worth paying attention to: not when something fails outright, but when it quietly stops responding to the thing that used to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the LLM could never solve this alone
&lt;/h2&gt;

&lt;p&gt;A language model doesn't return an answer. It returns a best guess from a distribution of plausible ones. Ask it the same claim twice, worded slightly differently, and it can produce two different codes. For a chatbot, that variance is harmless. For a system deciding whether a claim gets paid, it's a serious problem, and it's not a problem a bigger model fixes, because it's not a knowledge gap. It's what a probabilistic system fundamentally is.&lt;/p&gt;

&lt;p&gt;A large part of "getting the code right" turned out not to be a judgment call at all. It was already a solved, published, deterministic rule. NCCI, the National Correct Coding Initiative, is a set of edits from CMS stating plainly which procedure code pairs cannot be billed together, full stop, unless a specific modifier applies.&lt;/p&gt;

&lt;p&gt;We were asking a model to guess its way toward an answer that already existed as a lookup table.&lt;/p&gt;

&lt;p&gt;Here's a concrete version of the failure, details altered but the shape real. A clinical note describes a procedure and, in the same visit, a closely related diagnostic test. The model proposes codes for both, and it's a reasonable read of the note. A careful human coder might make the same call on a first pass.&lt;/p&gt;

&lt;p&gt;NCCI disallows the pairing. Not because the clinical reasoning is wrong, but because CMS has already ruled that one procedure is, by definition, a component of the other when performed in the same session. The model has no way to know this from the note, because the constraint isn't in the note. It's in a separate regulatory table with no relationship to what the sentence says.&lt;/p&gt;

&lt;p&gt;Multiply that one example by every plausible-looking pair across a real coding surface, and the plateau makes sense. The model wasn't getting worse at reading. It had run out of room to improve on a problem that was never primarily a reading problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a deterministic validation layer
&lt;/h2&gt;

&lt;p&gt;Once the shape of the problem was clear, the fix stopped being about the model and became about building the layer next to it.&lt;/p&gt;

&lt;p&gt;We loaded the full NCCI edit set. All 1.73 million pairs, not a representative sample, because the value of a deterministic check is that it has no blind spots. A rule that catches 90% of bad pairs and misses the rest hasn't solved the problem, it's relocated the failure to wherever nobody's watching.&lt;/p&gt;

&lt;p&gt;The resulting pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The model proposes candidate codes. It's genuinely good at this: reading unstructured clinical documentation and surfacing plausible candidates is a real strength, and there's no deterministic substitute for it.&lt;/li&gt;
&lt;li&gt;Every candidate pair is checked against the NCCI table before it reaches a claim.&lt;/li&gt;
&lt;li&gt;Only pairs that clear the table ship. A candidate the model favored but the table rejects doesn't go through, no exceptions, because exceptions quietly rebuild the guessing problem the check was meant to remove.
The model proposes. The table proves. Once we stopped treating this as one system to keep tuning and started treating it as two systems doing two different jobs, the remaining work was engineering, not research.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  It didn't ship clean
&lt;/h2&gt;

&lt;p&gt;The first version of the lookup was a linear scan through all 1.73 million rows per candidate pair. In a demo with one or two claims, it felt instant. In production, with a dozen candidate codes per claim and every pairwise combination needing a check, it visibly lagged. We rebuilt it as a proper index keyed on the pairs themselves. Unglamorous, and the difference between a check that's correct in principle and one that's usable in a real-time pipeline.&lt;/p&gt;

&lt;p&gt;The second issue we found before it became an incident, not after. CMS updates the NCCI edit set every quarter. A static, load-once table is a stale table waiting to happen. Rather than wait for a batch of claims to quietly clear an outdated check, we went looking for the failure mode on our own schedule: what happens to a "deterministic" layer when the thing it's being deterministic about changes underneath it. The fix was a scheduled refresh and a version stamp on every verdict, so any decision can be traced back to exactly which edit set produced it. Finding that gap by design, rather than by incident report, is the same principle as the rest of this build: check before you're forced to.&lt;/p&gt;

&lt;p&gt;Recall on CPT went from the low 60s to 92%. ICD landed lower, at 76.8%, and that gap is worth explaining rather than smoothing over. NCCI's rules live on the procedure-code side; that's the layer with a clean, published table. ICD diagnosis coding runs on a different kind of logic, driven by clinical specificity and payer documentation requirements, much of which is a genuine judgment call rather than a lookup. Judgment calls are exactly where a probabilistic system should be doing the work, not where a rulebook should be forced onto it that doesn't exist. Read side by side, the two numbers aren't "better here, worse there." CPT had more of the kind of problem a table solves. ICD has more of the kind that needs judgment. The recall gap is largely a measurement of that ratio.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real lesson
&lt;/h2&gt;

&lt;p&gt;Model accuracy has a ceiling, and the ceiling usually has nothing to do with the model.&lt;/p&gt;

&lt;p&gt;Some percentage of what a system needs to get right isn't a pattern to learn. It's a rule that already exists, published and unambiguous, waiting to be wired in rather than rediscovered through enough training examples.&lt;/p&gt;

&lt;p&gt;The climb from 45% to the low 60s was a model problem, and the standard tools solved it. The climb from the low 60s to 92% was an architecture problem, and no amount of prompting was ever going to close it. On a dashboard, the two climbs look identical. They are not the same problem, and the second one doesn't yield to more of what fixed the first.&lt;/p&gt;

&lt;p&gt;So before reaching for a bigger model on a number that won't move: is this a guessing problem, or is it a problem that already has a correct answer sitting somewhere, waiting for someone to stop asking a probabilistic system to guess at it.&lt;/p&gt;

&lt;p&gt;More often than expected, it's the second one.&lt;/p&gt;

&lt;p&gt;Production AI systems become reliable when probabilistic models and deterministic systems each do the job they were designed to do.&lt;/p&gt;

&lt;p&gt;If this is a problem you're facing right now, &lt;a href="https://tech4bizsolutions.com/contact?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=when-fine-tuning-stops-working-healthcare-ai-recall" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>architecture</category>
      <category>security</category>
      <category>ai</category>
    </item>
    <item>
      <title>When Fine-Tuning Stops Working: The Architecture Lesson That Took Our Healthcare AI From 60% to 92% Recall</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Wed, 08 Jul 2026 16:16:22 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/when-fine-tuning-stops-working-the-architecture-lesson-that-took-our-healthcare-ai-from-60-to-92-bok</link>
      <guid>https://dev.to/vaibhav_tech4biz/when-fine-tuning-stops-working-the-architecture-lesson-that-took-our-healthcare-ai-from-60-to-92-bok</guid>
      <description>&lt;p&gt;We had a healthcare claims platform stuck at 45% recall on medical coding. Not 45% on a benchmark. 45% recall on CPT and ICD code assignment, in a system whose job is getting those codes right before a claim goes out. Get it wrong, and a claim gets denied. A billing team spends an afternoon on the phone with a payer instead of doing their actual job.&lt;/p&gt;

&lt;p&gt;This post is about the architectural decision that moved CPT recall from 45% to 92%, and why no amount of prompt engineering or fine-tuning could have produced the same result on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why fine-tuning stopped working
&lt;/h2&gt;

&lt;p&gt;When a number is low, the obvious move is a bigger model. We made that move too, and it wasn't a bad instinct, at least at first.&lt;/p&gt;

&lt;p&gt;We spent real weeks on it: sharper prompts, more examples, better retrieval so the right context sat in front of the model when it made a call. Recall climbed out of the 40s into the high 50s, low 60s. Genuine progress.&lt;/p&gt;

&lt;p&gt;Then, somewhere in the low 60s, it stopped. More examples didn't move it. Sharper prompts didn't move it. The usual levers had stopped answering.&lt;/p&gt;

&lt;p&gt;That's the moment worth paying attention to: not when something fails outright, but when it quietly stops responding to the thing that used to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the LLM could never solve this alone
&lt;/h2&gt;

&lt;p&gt;A language model doesn't return an answer. It returns a best guess from a distribution of plausible ones. Ask it the same claim twice, worded slightly differently, and it can produce two different codes. For a chatbot, that variance is harmless. For a system deciding whether a claim gets paid, it's a serious problem, and it's not a problem a bigger model fixes, because it's not a knowledge gap. It's what a probabilistic system fundamentally is.&lt;/p&gt;

&lt;p&gt;A large part of "getting the code right" turned out not to be a judgment call at all. It was already a solved, published, deterministic rule. NCCI, the National Correct Coding Initiative, is a set of edits from CMS stating plainly which procedure code pairs cannot be billed together, full stop, unless a specific modifier applies.&lt;/p&gt;

&lt;p&gt;We were asking a model to guess its way toward an answer that already existed as a lookup table.&lt;/p&gt;

&lt;p&gt;Here's a concrete version of the failure, details altered but the shape real. A clinical note describes a procedure and, in the same visit, a closely related diagnostic test. The model proposes codes for both, and it's a reasonable read of the note. A careful human coder might make the same call on a first pass.&lt;/p&gt;

&lt;p&gt;NCCI disallows the pairing. Not because the clinical reasoning is wrong, but because CMS has already ruled that one procedure is, by definition, a component of the other when performed in the same session. The model has no way to know this from the note, because the constraint isn't in the note. It's in a separate regulatory table with no relationship to what the sentence says.&lt;/p&gt;

&lt;p&gt;Multiply that one example by every plausible-looking pair across a real coding surface, and the plateau makes sense. The model wasn't getting worse at reading. It had run out of room to improve on a problem that was never primarily a reading problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a deterministic validation layer
&lt;/h2&gt;

&lt;p&gt;Once the shape of the problem was clear, the fix stopped being about the model and became about building the layer next to it.&lt;/p&gt;

&lt;p&gt;We loaded the full NCCI edit set. All 1.73 million pairs, not a representative sample, because the value of a deterministic check is that it has no blind spots. A rule that catches 90% of bad pairs and misses the rest hasn't solved the problem, it's relocated the failure to wherever nobody's watching.&lt;/p&gt;

&lt;p&gt;The resulting pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The model proposes candidate codes. It's genuinely good at this: reading unstructured clinical documentation and surfacing plausible candidates is a real strength, and there's no deterministic substitute for it.&lt;/li&gt;
&lt;li&gt;Every candidate pair is checked against the NCCI table before it reaches a claim.&lt;/li&gt;
&lt;li&gt;Only pairs that clear the table ship. A candidate the model favored but the table rejects doesn't go through, no exceptions, because exceptions quietly rebuild the guessing problem the check was meant to remove.
The model proposes. The table proves. Once we stopped treating this as one system to keep tuning and started treating it as two systems doing two different jobs, the remaining work was engineering, not research.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  It didn't ship clean
&lt;/h2&gt;

&lt;p&gt;The first version of the lookup was a linear scan through all 1.73 million rows per candidate pair. In a demo with one or two claims, it felt instant. In production, with a dozen candidate codes per claim and every pairwise combination needing a check, it visibly lagged. We rebuilt it as a proper index keyed on the pairs themselves. Unglamorous, and the difference between a check that's correct in principle and one that's usable in a real-time pipeline.&lt;/p&gt;

&lt;p&gt;The second issue we found before it became an incident, not after. CMS updates the NCCI edit set every quarter. A static, load-once table is a stale table waiting to happen. Rather than wait for a batch of claims to quietly clear an outdated check, we went looking for the failure mode on our own schedule: what happens to a "deterministic" layer when the thing it's being deterministic about changes underneath it. The fix was a scheduled refresh and a version stamp on every verdict, so any decision can be traced back to exactly which edit set produced it. Finding that gap by design, rather than by incident report, is the same principle as the rest of this build: check before you're forced to.&lt;/p&gt;

&lt;p&gt;Recall on CPT went from the low 60s to 92%. ICD landed lower, at 76.8%, and that gap is worth explaining rather than smoothing over. NCCI's rules live on the procedure-code side; that's the layer with a clean, published table. ICD diagnosis coding runs on a different kind of logic, driven by clinical specificity and payer documentation requirements, much of which is a genuine judgment call rather than a lookup. Judgment calls are exactly where a probabilistic system should be doing the work, not where a rulebook should be forced onto it that doesn't exist. Read side by side, the two numbers aren't "better here, worse there." CPT had more of the kind of problem a table solves. ICD has more of the kind that needs judgment. The recall gap is largely a measurement of that ratio.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real lesson
&lt;/h2&gt;

&lt;p&gt;Model accuracy has a ceiling, and the ceiling usually has nothing to do with the model.&lt;/p&gt;

&lt;p&gt;Some percentage of what a system needs to get right isn't a pattern to learn. It's a rule that already exists, published and unambiguous, waiting to be wired in rather than rediscovered through enough training examples.&lt;/p&gt;

&lt;p&gt;The climb from 45% to the low 60s was a model problem, and the standard tools solved it. The climb from the low 60s to 92% was an architecture problem, and no amount of prompting was ever going to close it. On a dashboard, the two climbs look identical. They are not the same problem, and the second one doesn't yield to more of what fixed the first.&lt;/p&gt;

&lt;p&gt;So before reaching for a bigger model on a number that won't move: is this a guessing problem, or is it a problem that already has a correct answer sitting somewhere, waiting for someone to stop asking a probabilistic system to guess at it.&lt;/p&gt;

&lt;p&gt;More often than expected, it's the second one.&lt;/p&gt;

&lt;p&gt;Production AI systems become reliable when probabilistic models and deterministic systems each do the job they were designed to do.&lt;/p&gt;

&lt;p&gt;If you like to know more, &lt;a href="https://tech4bizsolutions.com/contact?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=when-fine-tuning-stops-working-healthcare-ai-recall" rel="noopener noreferrer"&gt;let's discuss&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>architecture</category>
      <category>healthtech</category>
    </item>
    <item>
      <title>Most Engineering Blogs Show You What Worked. We're Going to Show You What Broke.</title>
      <dc:creator>Vaibhav Tekam</dc:creator>
      <pubDate>Wed, 08 Jul 2026 07:18:23 +0000</pubDate>
      <link>https://dev.to/vaibhav_tech4biz/most-engineering-blogs-show-you-what-worked-were-going-to-show-you-what-broke-2h4e</link>
      <guid>https://dev.to/vaibhav_tech4biz/most-engineering-blogs-show-you-what-worked-were-going-to-show-you-what-broke-2h4e</guid>
      <description>&lt;p&gt;Most engineering blogs focus on the outcome. They present clean architectures, successful deployments, and polished case studies that make complex systems appear simpler than they really were.&lt;/p&gt;

&lt;p&gt;What they rarely document is the engineering journey that produced those outcomes. They seldom discuss the migration that stalled halfway through, the production incident that forced a redesign, or the assumptions that proved to be wrong once the system met real users and real workloads.&lt;/p&gt;

&lt;p&gt;Those experiences contain the lessons that matter most.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;Tech4Biz Solutions&lt;/strong&gt;, we have spent years designing, building, and restoring production systems across artificial intelligence, cloud infrastructure, enterprise software, embedded hardware, industrial automation, and observability. Regardless of the technology involved, we have reached the same conclusion time and again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reliable systems are rarely the result of perfect technology. They are the result of thoughtful engineering, continuous iteration, careful trade-offs, and decisions made under real-world constraints.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We're Writing
&lt;/h2&gt;

&lt;p&gt;We started writing because the most valuable engineering lessons rarely appear in traditional case studies.&lt;/p&gt;

&lt;p&gt;Case studies usually explain what worked. They seldom explain what failed, what assumptions proved to be incorrect, what designs had to be abandoned, or why the final system looked very different from the original plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We're less interested in presenting finished architectures than in explaining how those architectures evolved into reliable production systems.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What We'll Write About
&lt;/h2&gt;

&lt;p&gt;Every article will be grounded in engineering work we've actually done, systems we've actually built, or production problems we've actually solved.&lt;/p&gt;

&lt;p&gt;We'll write about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Production AI systems&lt;/li&gt;
&lt;li&gt;Cloud architecture and distributed systems&lt;/li&gt;
&lt;li&gt;Platform engineering and observability&lt;/li&gt;
&lt;li&gt;Embedded systems and hardware integration&lt;/li&gt;
&lt;li&gt;Industrial software and automation&lt;/li&gt;
&lt;li&gt;Performance, scalability, reliability, and security&lt;/li&gt;
&lt;li&gt;Engineering decisions made under real deadlines and real business constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll explain not only &lt;strong&gt;what&lt;/strong&gt; we built, but also &lt;strong&gt;why&lt;/strong&gt; we built it that way, what alternatives we considered, and what we learned in the process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Won't Find
&lt;/h2&gt;

&lt;p&gt;You won't find toy projects designed to demonstrate a framework.&lt;/p&gt;

&lt;p&gt;You won't find success stories with the difficult parts edited out.&lt;/p&gt;

&lt;p&gt;You won't find articles written simply because a technology happens to be trending.&lt;/p&gt;

&lt;p&gt;You won't find sales pitches disguised as engineering articles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good engineering earns trust through transparency, not marketing.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Coming Next
&lt;/h2&gt;

&lt;p&gt;Over the coming weeks, we'll share deep dives into production systems we've built and stabilized across cloud infrastructure, enterprise AI, observability, embedded hardware, and industrial software.&lt;/p&gt;

&lt;p&gt;We'll also share the engineering behind &lt;strong&gt;Suryamon&lt;/strong&gt;, our open-source solar plant monitoring platform, along with the architectural decisions, trade-offs, and lessons that shaped it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The finished system is only part of the story. We're here to document everything that happened before it became reliable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If these are the kinds of engineering problems you enjoy solving, we hope you'll follow along.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>devops</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
