<?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: Mark Vange</title>
    <description>The latest articles on DEV Community by Mark Vange (@guichard).</description>
    <link>https://dev.to/guichard</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%2F4150866%2F9d0a9798-ef79-4066-b0a6-e41f694eebc0.jpg</url>
      <title>DEV Community: Mark Vange</title>
      <link>https://dev.to/guichard</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/guichard"/>
    <language>en</language>
    <item>
      <title>Kev gives the same answer every time. Until you batch it.</title>
      <dc:creator>Mark Vange</dc:creator>
      <pubDate>Sat, 10 Oct 2026 00:17:42 +0000</pubDate>
      <link>https://dev.to/guichard/kev-gives-the-same-answer-every-time-until-you-batch-it-1p0g</link>
      <guid>https://dev.to/guichard/kev-gives-the-same-answer-every-time-until-you-batch-it-1p0g</guid>
      <description>&lt;h1&gt;
  
  
  Kev gives the same answer every time. Until you batch it.
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Part 2 of the &lt;a href="http://dev.to/guichard/jev-is-the-best-decision-model-heres-what-to-run-when-you-cant-use-it-mme"&gt;jev-decision-models&lt;/a&gt; series. &lt;a href="http://dev.to/guichard/jev-is-the-best-decision-model-heres-what-to-run-when-you-cant-use-it-mme"&gt;Part 1&lt;/a&gt; put seven open-source Jev look-alikes on a single 8 GB GPU. This follow-up tests whether the winner holds its answers across reruns, what concurrent load does to a "deterministic" model, and how sure we are about the headline numbers — plus a new entrant, Julia-1.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mark Vange · Autom8ly · September 2026 · 7 min read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written mostly by AI. Like the first article, this one and the analysis behind it were largely generated by our AI assistant (Autumn), directed by me. Every number comes from real runs, and the scripts and predictions are public.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Late last week I wrote about running Jev look-alikes on a single 8 GB GPU. The best of them, Kev-4B quantized to 4-bit, scored 0.872 against Jev's 0.968, and its confidence looked trustworthy enough to automate about three quarters of its decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taylor Kolasinski&lt;/strong&gt;, founder of Poisson Labs, read it and asked the right questions. Their team had just published "The same request twice", a replay study of Jev: send identical requests several times and see whether the answers hold. Often they don't. On items close to a decision threshold, 18.5% of Jev's decisions flipped at a 0.5 or 0.6 cut and 5.3% at 0.9, and because the flips went both ways, the aggregate numbers looked perfectly stable while individual decisions changed underneath.&lt;/p&gt;

&lt;p&gt;Taylor's questions to us, paraphrased:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did the local models hold their probabilities across reruns? Quantized models on consumer GPUs aren't always deterministic.&lt;/li&gt;
&lt;li&gt;The 75% automation number leans on a confidence threshold staying put. Does it?&lt;/li&gt;
&lt;li&gt;How many questions was 0.872 measured on, and what are the intervals on the gap to Jev?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first question turned out to have two answers, and the second one is the interesting one.&lt;/p&gt;

&lt;h2&gt;
  
  
  One request at a time: identical, run after run
&lt;/h2&gt;

&lt;p&gt;On 28 September we sent Kev-4B 4-bit the same 866 questions three more times, one request at a time, and compared every answer with the original run from 26 September.&lt;/p&gt;

&lt;p&gt;We checked that nothing was faking this. Our gateway has no response cache, and Kev's server caches only the four most recent inputs, so with 866 different inputs between repeats every answer was computed from scratch. Kev's API rounds probabilities to four decimal places, so "identical" means identical at that resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under load: batching changes the numbers
&lt;/h2&gt;

&lt;p&gt;Production traffic doesn't arrive one request at a time. Kev's server collects whatever requests are waiting and runs them through the GPU together as one batch. So we ran the full suite again with 2, 4, 8 and 16 requests sent at the same moment, and once more at 8 to see whether batched runs agree with each other.&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%2Fc8vopxizsicmbcwptrat.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%2Fc8vopxizsicmbcwptrat.png" alt="Answers with changed probabilities by concurrency" width="799" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Grouped by the size of the batch each request actually ran in, the line is sharp. In the first run at 8, none of the 116 requests that ran alone or in pairs changed, while 311 of the 735 that ran in batches of seven did. Across every run, the 2,015 requests that ran alone or in batches of two or three were all bit-identical; in batches of five or more, 1,223 of 2,315 changed. (No batch of exactly four happened to form.)&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%2F0fxxuwj3zvbloyir62y4.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%2F0fxxuwj3zvbloyir62y4.png" alt="Concurrency summary: sent at once vs changed probabilities, accuracy, GPU time and throughput" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two batched runs at 8 disagreed with &lt;em&gt;each other&lt;/em&gt; on 403 of 866 questions, because which requests land in the same batch is a matter of timing. So under load, Kev stops being replayable: the same request can come back with slightly different numbers depending on what else was running with it. That is the same kind of behaviour Poisson Labs measured in Jev, at a much smaller scale.&lt;/p&gt;

&lt;p&gt;The effect on decisions was small. Across the three batched runs, 2 of 2,598 answers changed their top choice, and one of those turned a right answer into a wrong one, which is why one run scores 0.8707. Both flips were on questions where two options were within a hair of each other: on one grammar question the top two options moved from 0.3013 and 0.3042 to 0.3043 and 0.3040. No answer anywhere crossed the 0.9 line.&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%2Fgyjvtuhty67c514zmyns.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%2Fgyjvtuhty67c514zmyns.png" alt="Decisions near a threshold that flipped" width="798" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batching barely paid for itself.&lt;/strong&gt; Sixteen requests at once got 45% more throughput out of the GPU, but each request waited nearly ten times as long. On this small card, the model is already using the GPU well one request at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens&lt;/strong&gt; is our reading, not something we traced: GPU arithmetic isn't exactly associative, and a bigger batch can be split and summed in a different order. Kev's server also handles larger batches differently, which would fit the sharp line we saw.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you need to replay a decision for an auditor, keep batches small, or log the probabilities the model actually returned. Determinism on a quiet server isn't determinism in production.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The 75% doesn't use a 90% threshold, but it was optimistic
&lt;/h2&gt;

&lt;p&gt;We should have explained this the first time. "Automatable at 5% error" doesn't use the 90% threshold. It sorts answers from most to least confident and accepts as many as it can while errors among the accepted stay at or under 5%. The threshold is whatever that turns out to be.&lt;/p&gt;

&lt;p&gt;Taylor's instinct was still right: we picked that threshold on the same 866 questions we scored it on, which flatters it. Done properly, choosing the threshold on a random half and applying it to the other half, 2,000 times over:&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%2Fr21e540frgx9o5a04auo.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%2Fr21e540frgx9o5a04auo.png" alt="Held-out coverage and error rate" width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The coverage holds up. The error rate is the part to watch: aim for 5% and, on a new sample of about 430 decisions, you will land anywhere from 2% to 8.7%. If 5% is a hard limit, set a lower budget, on your own labelled data.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many questions, and how sure are we
&lt;/h2&gt;

&lt;p&gt;The suite is 866 questions across 49 tasks, one question per case. Resampling the cases gives these 95% intervals:&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%2Fuaoy2itgyifc6iqszqih.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%2Fuaoy2itgyifc6iqszqih.png" alt="95% bootstrap intervals" width="799" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The gap to Jev is real: even at the edge of the interval it is more than seven points. Kev's 0.1% confident-error rate is a single mistake, so the true rate could plausibly be a few times higher. It's still low; it just isn't as precise as a decimal suggests.&lt;/p&gt;

&lt;h2&gt;
  
  
  New in the matrix: Julia-1
&lt;/h2&gt;

&lt;p&gt;Supersonic Labs released Julia-1 on 26 September: a 144-million-parameter decision model built on a multilingual ModernBERT encoder, Apache-2.0, small enough to run on a laptop CPU. Its model card reports beating Jev on Supersonic's own typed-decision benchmark (73.2% against 72.7%). We ran it through exactly the same tests as everything else, using the official checkpoint and runtime.&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%2Frfd2dc7u76zie6uc0mj4.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%2Frfd2dc7u76zie6uc0mj4.png" alt="Julia-1 results" width="799" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On our independent suite, Julia-1 scored 0.450, and 30% of its answers were wrong while it was at least 90% sure. It was deterministic across three reruns and very fast, but its yes/no answers didn't separate at all: its average P(yes) was 0.36 when the right answer was yes and 0.37 when it was no. It is also sensitive to wording in a way the other models aren't. On a clear-cut refund question it gave P(yes) of 0.005 as a bare question and 0.997 with plain yes/no descriptions attached. Adding "No" and "Yes" descriptions to every yes/no question in the suite left its accuracy unchanged at 0.449 but flipped 101 individual answers.&lt;/p&gt;

&lt;p&gt;Before publishing we checked the things that could make this our mistake: the weights file matches the checksum on Supersonic's own results, the input-length setting made no difference, and their README example routes correctly. Our best explanation is that Julia-1 is tuned to the distribution of the benchmark it was trained and measured on. Supersonic call it "the first released test of our training system", and a first release deserves to be judged as one. As published today, we wouldn't use it for decisions that matter.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Replayability is a property of the deployment, not the model.&lt;/strong&gt; Kev was bit-exact one request at a time and in batches of up to three, and drifted in batches of five or more. Test determinism under the load you will actually run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The drift was small; watch where it matters.&lt;/strong&gt; Two top-answer changes in 2,598 batched answers, all on near-ties. Treat a narrow band around your threshold as "ask again or ask a human", as Poisson Labs suggest for Jev.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose thresholds on held-out data.&lt;/strong&gt; Our published coverage survived a proper split, but the realised error rate varies more than a single number implies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test new models on someone else's benchmark.&lt;/strong&gt; Julia-1's own numbers and ours tell very different stories.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks again to Taylor Kolasinski and Poisson Labs. Their question led to the most useful thing we have learned about these models so far. Next on our list is &lt;strong&gt;imajev&lt;/strong&gt;, an open Jev-compatible model that also accepts images.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;About this article. This article and the code behind it were mostly generated by AI (primarily Claude, by Anthropic, with Autom8ly's internal prompts and skills), directed by me. All Kev runs were made on 26 and 28 September 2026 on one NVIDIA RTX 4060 (8 GB), Kev-4B loaded in 4-bit with bitsandbytes, scored with our tool-neutral &lt;code&gt;gutcheck&lt;/code&gt; scorer on jabr/classifier-benchmark v2. Julia-1 is revision &lt;code&gt;a85b1273&lt;/code&gt; of SupersonicLabs/Julia-1 (weights SHA-256 &lt;code&gt;df853bf7…&lt;/code&gt;), run with its own Python runtime on CPU, strict encoding. We are not affiliated with TypeSafe, Poisson Labs, Supersonic Labs or any of the projects tested.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Method details. Concurrency runs sent bursts of N simultaneous requests through our gateway, paced to about 55 requests a minute. Batch size per request is inferred from requests in the same burst reporting the same server model time. Near-threshold sets are the questions whose top probability in the original run fell in [0.45, 0.55) or [0.85, 0.95); a flip is a change of answer or a move across the cut. Intervals are 95% percentile bootstraps over cases; held-out coverage uses 2,000 random 50/50 splits. For Kev's transfer-v4 suite, where some options have no description, our Julia-1 adapter uses the option's name, as Jev does.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code and data. Everything is at &lt;a href="https://github.com/Autom8ly/gutcheck-bench" rel="noopener noreferrer"&gt;github.com/Autom8ly/gutcheck-bench&lt;/a&gt;: the rerun and concurrency clients, every run's predictions and the analysis script in &lt;code&gt;stability/&lt;/code&gt;, the Julia-1 adapter in &lt;code&gt;adapters/julia_server.py&lt;/code&gt;, and its results alongside every other setup in &lt;code&gt;results/&lt;/code&gt;. &lt;code&gt;python stability/analyze.py&lt;/code&gt; reproduces the rerun, batching and interval figures.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>benchmarking</category>
    </item>
    <item>
      <title>Jev is the best decision model. Here's what to run when you can't use it.</title>
      <dc:creator>Mark Vange</dc:creator>
      <pubDate>Tue, 29 Sep 2026 19:07:41 +0000</pubDate>
      <link>https://dev.to/guichard/jev-is-the-best-decision-model-heres-what-to-run-when-you-cant-use-it-mme</link>
      <guid>https://dev.to/guichard/jev-is-the-best-decision-model-heres-what-to-run-when-you-cant-use-it-mme</guid>
      <description>&lt;h1&gt;
  
  
  Jev is the best decision model. Here's what to run when you can't use it.
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Part 1 of a two-part series. Part 2 continues the story — link to be added once it's published.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We put seven open-source Jev look-alikes on a single 8 GB GPU for teams whose data isn't allowed to leave the building. One of them is good enough to build on.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mark Vange · Autom8ly · September 2026 · 9 min read&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written mostly by AI. This article and the code behind it were largely generated by an AI assistant (Claude), directed by me in response to specific use cases we face in high-compliance environments. Every number was measured on real hardware, and the code is public so you can check it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A few weeks ago TypeSafe released Jev, and it changed how I think about putting language models inside software.&lt;/p&gt;

&lt;p&gt;Most of what we ask models to do in production isn't writing. It's deciding. Which team should get this ticket? Does this message need a human? Is this claim eligible under our policy? How urgent is this, on a scale of one to three? For years the standard answer was to prompt a general chat model, ask it to reply in JSON, parse whatever came back, and hope it didn't wander off script.&lt;/p&gt;

&lt;p&gt;Jev skips the text entirely. You send it a piece of state and a set of typed questions (pick one, yes/no, or a score), and it sends back probabilities. No parsing, no retries, no invented options. In our tests it answered in about 135 milliseconds, over the internet.&lt;/p&gt;

&lt;p&gt;The probabilities are the real prize. If a model tells you it is 97% sure a ticket belongs to billing, you can route that ticket automatically and send the 60% cases to a person. That pattern, automate the confident decisions and escalate the rest, is how you put AI into processes where mistakes are expensive. Routing, triage, guardrails, policy checks and agent stop conditions all become cheap, fast function calls. It opens up a lot of new work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The catch: some of us can't call an API
&lt;/h2&gt;

&lt;p&gt;I work with teams in high-compliance environments. For many of them, "just call a hosted API" isn't an option. Regulated data may not be allowed to leave a particular network, or a particular country. A new vendor can mean months of security and privacy review. Some systems run on networks with no route to the internet at all. And even where an external call is permitted, auditors want to know exactly which model made each decision, and that it won't change underneath you.&lt;/p&gt;

&lt;p&gt;When you can't bring your data to the best model, you have to bring a good model to your data.&lt;/p&gt;

&lt;p&gt;So we went looking for alternatives we could run on our own hardware. Within a week of Jev's release, at least seven open-source look-alikes had appeared. The question was whether any of them were good enough, and whether they would fit on the kind of modest GPU you can actually get approved: a single 8 GB consumer card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven look-alikes in a week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kev:&lt;/strong&gt; Qwen3.5 models (0.8B, 4B, 9B) fine-tuned to read out option probabilities in one pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Von:&lt;/strong&gt; a 395-million-parameter encoder built for speed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laya:&lt;/strong&gt; small multilingual encoders behind a language router.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rizzo Flow:&lt;/strong&gt; 1.7B and 4B models served through llama.cpp, with a built-in playground.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SemIf:&lt;/strong&gt; no training at all; it scores options straight from an ordinary model's next-token probabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nimble:&lt;/strong&gt; a 9B model with an open data-curation and training recipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NanoJev:&lt;/strong&gt; a small, fully trainable replica, released with a checkpoint trained on game states.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of them copy the same basic idea, and four of them speak Jev's HTTP interface, which made a fair comparison possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we tested
&lt;/h2&gt;

&lt;p&gt;Everything ran on one NVIDIA GeForce RTX 4060 with 8,188 MiB of memory, inside a virtual machine with the GPU passed through. We ran each tool alone, one request at a time, and put every one behind the same &lt;code&gt;/v1/systemone&lt;/code&gt; interface so a single scorer could grade them all.&lt;/p&gt;

&lt;p&gt;For the questions we used an independent public suite: &lt;a href="https://github.com/jabr/classifier-benchmark" rel="noopener noreferrer"&gt;jabr/classifier-benchmark&lt;/a&gt; v2, 866 synthetic cases across 49 everyday decision tasks such as support routing, refund and warranty eligibility, phishing and fraud checks, triage, tone and grammar. Its cases were generated and cross-checked by a committee of seven different LLMs, and it is released into the public domain. None of the tools was built around it, and our runs reproduce its author's published scores for Jev, Von and Laya almost exactly.&lt;/p&gt;

&lt;p&gt;Three of the tools only ship full-precision weights, which don't fit in 8 GB, so we added 4-bit and 8-bit loading to them with bitsandbytes. We also ran Jev itself through TypeSafe's API, and a plain generative model (&lt;code&gt;qwen3:8b&lt;/code&gt; through Ollama, asked for a JSON answer) as the old-fashioned baseline. As a cross-check we ran every setup on a second suite, Kev's own transfer-v4; those results are in the repository and agree on who comes first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What fits in 8 GB
&lt;/h2&gt;

&lt;p&gt;Almost everything, once quantized. The only one that didn't fit was Nimble's 9B model, which loads at 7.5 GB before doing any work and runs out of memory on its first request.&lt;/p&gt;

&lt;p&gt;Peak GPU memory per setup against the 8GB RTX 4060:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NanoJev 0.6B — 2.4 GB&lt;/li&gt;
&lt;li&gt;Rizzo 1.7B · q8 — 2.5 GB&lt;/li&gt;
&lt;li&gt;SemIf 4B · 4-bit — 3.2 GB&lt;/li&gt;
&lt;li&gt;Von — 3.3 GB&lt;/li&gt;
&lt;li&gt;Kev-4B · 4-bit — 3.8 GB&lt;/li&gt;
&lt;li&gt;Rizzo 4B · q4 — 4.1 GB&lt;/li&gt;
&lt;li&gt;Kev-0.8B — 4.5 GB&lt;/li&gt;
&lt;li&gt;SemIf 4B · 8-bit — 5.0 GB&lt;/li&gt;
&lt;li&gt;Kev-4B · 8-bit — 5.3 GB&lt;/li&gt;
&lt;li&gt;Laya — 5.5 GB&lt;/li&gt;
&lt;li&gt;Rizzo 4B · q8 — 5.7 GB&lt;/li&gt;
&lt;li&gt;qwen3:8b via Ollama — 5.9 GB&lt;/li&gt;
&lt;li&gt;Kev-9B · 4-bit — 7.4 GB&lt;/li&gt;
&lt;li&gt;Nimble-9B · 4-bit — 7.5 GB idle, out of memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Peak GPU memory while scoring, sampled every half second.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Quantization cost little. Kev-4B scored 0.878 at 8-bit and 0.872 at 4-bit, and Rizzo 0.807 and 0.799; only SemIf lost more, about three points. For a small GPU that trade is easy: Kev-4B needs more than 8 GB in full precision and runs in 3.8 GB at 4-bit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accuracy against speed
&lt;/h2&gt;

&lt;p&gt;Results — accuracy on 866 questions against median time per question, including a local HTTP hop:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Wrong at ≥90% conf.&lt;/th&gt;
&lt;th&gt;Automatable @5% err&lt;/th&gt;
&lt;th&gt;p50 ms&lt;/th&gt;
&lt;th&gt;Peak VRAM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jev 1.13 (hosted)&lt;/td&gt;
&lt;td&gt;0.968&lt;/td&gt;
&lt;td&gt;0.2%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;td&gt;hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kev-9B · 4-bit&lt;/td&gt;
&lt;td&gt;0.893&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;76%&lt;/td&gt;
&lt;td&gt;223&lt;/td&gt;
&lt;td&gt;7.4 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kev-4B · 8-bit&lt;/td&gt;
&lt;td&gt;0.878&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;77%&lt;/td&gt;
&lt;td&gt;385&lt;/td&gt;
&lt;td&gt;5.3 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kev-4B · 4-bit&lt;/td&gt;
&lt;td&gt;0.872&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;188&lt;/td&gt;
&lt;td&gt;3.8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SemIf 4B · 8-bit&lt;/td&gt;
&lt;td&gt;0.866&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;td&gt;168&lt;/td&gt;
&lt;td&gt;5.0 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SemIf 4B · 4-bit&lt;/td&gt;
&lt;td&gt;0.837&lt;/td&gt;
&lt;td&gt;5.0%&lt;/td&gt;
&lt;td&gt;66%&lt;/td&gt;
&lt;td&gt;130&lt;/td&gt;
&lt;td&gt;3.2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:8b via Ollama&lt;/td&gt;
&lt;td&gt;0.827&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;207&lt;/td&gt;
&lt;td&gt;5.9 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rizzo 4B · q8&lt;/td&gt;
&lt;td&gt;0.807&lt;/td&gt;
&lt;td&gt;12.4%&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;5.7 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rizzo 4B · q4&lt;/td&gt;
&lt;td&gt;0.799&lt;/td&gt;
&lt;td&gt;11.5%&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;4.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Von&lt;/td&gt;
&lt;td&gt;0.724&lt;/td&gt;
&lt;td&gt;1.7%&lt;/td&gt;
&lt;td&gt;21%&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;3.3 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kev-0.8B&lt;/td&gt;
&lt;td&gt;0.718&lt;/td&gt;
&lt;td&gt;0.3%&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;4.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rizzo 1.7B · q8&lt;/td&gt;
&lt;td&gt;0.639&lt;/td&gt;
&lt;td&gt;22.5%&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;2.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laya&lt;/td&gt;
&lt;td&gt;0.585&lt;/td&gt;
&lt;td&gt;3.1%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;5.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NanoJev 0.6B&lt;/td&gt;
&lt;td&gt;0.343&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;2.4 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nimble-9B · 4-bit&lt;/td&gt;
&lt;td&gt;did not fit&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;7.5 GB idle&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kev-4B at 4-bit is the best all-rounder.&lt;/strong&gt; It scores 0.872, 9.6 points behind Jev's 0.968, in 3.8 GB at 188 ms per question. Its confidence is trustworthy: only 0.1% of its answers are wrong at 90% confidence or more (Jev: 0.2%), so with a 5% error budget you could automate about 75% of its decisions without review. The 8-bit build is a hair more accurate but twice as slow. Kev-9B scores a little higher (0.893), but it uses 7.4 GB of the 8 GB card, leaving no room for anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SemIf is a close second with no training at all.&lt;/strong&gt; Scoring options straight from an unmodified Qwen3.5-4B reaches 0.866 at 8-bit and 0.837 at 4-bit. That makes it the natural choice if you can't adopt a new model but can run one you already trust. Its confidence needs calibrating first: 3.6–5% of its answers are confidently wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Von is the speed pick.&lt;/strong&gt; It answers in 18 ms in 3.3 GB, ten times faster than Kev-4B, and scores 0.724. It is dependable on tone and routing but drops to coin-flip level on rule-based checks such as warranty eligibility, phishing and suspicious transactions.&lt;/p&gt;

&lt;p&gt;The rest are harder to recommend today. The generative baseline scores a respectable 0.827 but gives no usable confidence: 17% of its answers are confidently wrong. Rizzo is fast (71 ms) and scores about 0.80, but 11–12% of its answers are confidently wrong until you calibrate it, and it struggles with policy rules. Laya (0.585) and Kev-0.8B (0.718) trail Von, and NanoJev's game-trained checkpoint scores near chance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jev is still the best, and a small experiment shows why
&lt;/h2&gt;

&lt;p&gt;A 9.6-point gap is large, and it widens on the hardest tasks: on grammar checking Jev scores 0.81, while Kev-4B and SemIf score 0.48. But the gap is not just a score. Jev's real advantage shows up when you ask it something new.&lt;/p&gt;

&lt;p&gt;While writing this article we tried exactly that. Ten different AI models each rewrote the article's opening paragraph to sound more natural, keeping every fact. We added two control paragraphs written as deliberately extreme styles, one stiff corporate prose and one very casual. Then we asked Kev-4B and Jev the same three questions about each paragraph: was it written by a human rather than an AI, how natural does it sound, and which of the ten sounds most human.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rewrite by&lt;/th&gt;
&lt;th&gt;Kev: P(human)&lt;/th&gt;
&lt;th&gt;Jev: P(human)&lt;/th&gt;
&lt;th&gt;Jev: natural&lt;/th&gt;
&lt;th&gt;Jev: picked as most human&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fable 5.1&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;td&gt;0.57&lt;/td&gt;
&lt;td&gt;0.76&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5.5&lt;/td&gt;
&lt;td&gt;0.68&lt;/td&gt;
&lt;td&gt;0.58&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;0.60&lt;/td&gt;
&lt;td&gt;0.76&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 4.6&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;0.56&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex (OpenAI)&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;0.56&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;td&gt;3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haiku 4.5&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;0.56&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hermes3:8b (local)&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;0.45&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenCode big-pickle&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;td&gt;0.48&lt;/td&gt;
&lt;td&gt;0.56&lt;/td&gt;
&lt;td&gt;2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:8b (local)&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;td&gt;0.47&lt;/td&gt;
&lt;td&gt;0.43&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemma4:e2b (local)&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;0.49&lt;/td&gt;
&lt;td&gt;0.40&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control: stiff corporate prose&lt;/td&gt;
&lt;td&gt;0.66&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;0.14&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control: deliberately casual&lt;/td&gt;
&lt;td&gt;0.68&lt;/td&gt;
&lt;td&gt;0.59&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Sorted by Jev's average rank across its three measures. "Natural" is a 3-level score scaled 0–1. "Picked" is the share of ten rotated pick-one questions; chance is 10%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kev could not tell. It scored the stiff and casual controls within 0.014 of each other, and its three measures disagreed on the winner. Jev separated the controls sharply (0.25 against 0.59 on the human question, 0.14 against 0.85 on naturalness), and its measures agreed with each other. Its three top picks were all rewrites that kept every fact, and it ranked the two smallest local models' rewrites last on every measure.&lt;/p&gt;

&lt;p&gt;This is one small experiment with twelve paragraphs, not a benchmark. But it points at a real difference. Kev is very good at the decision shapes it was trained on. Jev appears to generalize further, to questions its builders probably never trained for. If you can use Jev, use Jev.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the alternatives earn their place
&lt;/h2&gt;

&lt;p&gt;For those of us who can't, the open models are more than a consolation prize, because we control them. Four opportunities stand out.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Train on your own decisions.&lt;/strong&gt; Kev ships its full training recipe: LoRA adapters on Qwen3.5 base models, trained on labelled examples. Its authors report the 0.8B model trains on a 4 GB GPU. A model fine-tuned on a few thousand of your own labelled decisions could close much of the gap to Jev on the questions you actually ask. We haven't done that yet; it is our next step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calibrate on your own data.&lt;/strong&gt; Several tools let you fit their confidence to your labelled examples (Rizzo has a &lt;code&gt;rizzo calibrate&lt;/code&gt; command). Calibration doesn't change which answer wins, but it is what makes a confidence threshold something you can defend to an auditor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin and audit the model.&lt;/strong&gt; A local model is a file with a checksum. It never changes unless you change it, and every decision it makes stays on your network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier the decisions.&lt;/strong&gt; Let a fast local model take the confident, routine calls and escalate the rest to a person or, where policy allows, to Jev. Because every one of these tools speaks the same interface, switching between them is a configuration change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Others are measuring too
&lt;/h2&gt;

&lt;p&gt;We aren't the only ones testing this new category, and the independent results agree on the main points: Jev leads, and the small encoders trail the 4B models.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;jabr/classifier-benchmark:&lt;/strong&gt; the public-domain suite we scored everything on. Its own results (Jev 0.964, Von 0.724, Laya 0.585) match ours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;umstek/zero-shot-ie-bench:&lt;/strong&gt; the broadest survey, covering 38 zero-shot extraction, classification and typed-decision systems, local and hosted, in nine languages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;scienthoon/jev-ood-calibration:&lt;/strong&gt; tests whether Jev's probabilities stay honest on a task it can't have seen. Accurate, but overconfident on rules that aren't in the text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cacan/system1-bench:&lt;/strong&gt; a dashboard comparing Laya and several general LLMs against Jev on support-triage cases. Some of its answer keys were aligned with Jev's own answers, so Jev's 100% there is partly by construction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jaredpalmer/kev:&lt;/strong&gt; Kev's frozen suites and scoring code. Our scorer's metric definitions are based on it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What we add is the constraint: a fixed 8 GB memory budget, the larger open models quantized to fit it, and the question a compliance team actually asks, which is how much of this you can safely automate on hardware you control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The scorer, the harness, the quantization patches, the adapters, every result and the humanness experiment are at &lt;a href="https://github.com/Autom8ly/gutcheck-bench" rel="noopener noreferrer"&gt;github.com/Autom8ly/gutcheck-bench&lt;/a&gt;. With any &lt;code&gt;/v1/systemone&lt;/code&gt; server running, one command scores it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; gutcheck.benchmark &lt;span class="nt"&gt;--endpoint&lt;/span&gt; http://127.0.0.1:8008 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--model&lt;/span&gt; kev-latest &lt;span class="nt"&gt;--suite&lt;/span&gt; suites/jabr-v2.jsonl &lt;span class="nt"&gt;--out&lt;/span&gt; runs/my-tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run it on different hardware, or on a labelled set from your own domain, I'd like to hear what you find.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;About this article. This article and the code in the gutcheck-bench repository were mostly generated by AI (Claude, by Anthropic), directed by me in response to specific use cases we face in high-compliance environments. The measurements are real: every number comes from runs on the hardware described above, on 25 and 26 September 2026. We are not affiliated with TypeSafe or with any of the projects tested. Our Jev runs cost a few cents in total.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How we scored. We wrote a small, tool-neutral scorer (gutcheck) so that no contestant grades itself. Its metric definitions are based on Kev's open-source scorer (Apache-2.0), and we checked that it reproduces Kev's scores exactly on every run we made with both.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caveats. One GPU, one machine, synthetic decision tasks. Your own decisions may rank these tools differently, so test on a labelled set from your domain before choosing. Jev's latency depends on your distance from TypeSafe's servers. All seven projects were days old when tested and are changing quickly; treat these numbers as a snapshot.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>machinelearning</category>
      <category>benchmarking</category>
    </item>
  </channel>
</rss>
