<?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: Daniel Baden</title>
    <description>The latest articles on DEV Community by Daniel Baden (@knopfdruck).</description>
    <link>https://dev.to/knopfdruck</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%2F4131892%2Ffa6c6a12-d87d-4b4f-967e-5a703669e84a.png</url>
      <title>DEV Community: Daniel Baden</title>
      <link>https://dev.to/knopfdruck</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/knopfdruck"/>
    <language>en</language>
    <item>
      <title>Jev is the if statement of AI</title>
      <dc:creator>Daniel Baden</dc:creator>
      <pubDate>Fri, 02 Oct 2026 08:35:11 +0000</pubDate>
      <link>https://dev.to/knopfdruck/jev-is-the-if-statement-of-ai-4dif</link>
      <guid>https://dev.to/knopfdruck/jev-is-the-if-statement-of-ai-4dif</guid>
      <description>&lt;p&gt;You would never call an LLM to compare two numbers. Yet that is roughly what we all do with AI right now: we hand a model that could draft a legal opinion a question with two possible answers, and we pay it to write a paragraph. Recently, a model arrived that is built for exactly that question. It is called Jev, and to us it is the if statement of AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The branch you can't write down
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Does this really need an LLM?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every AI feature is full of branches. Is this email a complaint or a change request? Is this inquiry for a catalog part or a custom build? Does this change request mean the drawing has to be released again? Does this invoice match the purchase order?&lt;/p&gt;

&lt;p&gt;An if needs a condition you can write down. A comparison you can write down. "The customer sounds annoyed" you can't. So the condition moves into a prompt, and the if turns into a call to an LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that call really costs
&lt;/h2&gt;

&lt;p&gt;The LLM answers in prose: "This is most likely a complaint, since the customer…". You parse it, and tomorrow the wording shifts. Or you force structured output, and the model still generates your one-word label token by token. Either way you run a generative model to produce a label. Ask it how sure it is, and it writes you a number that nobody computed.&lt;/p&gt;

&lt;p&gt;For a yes or no, that is the most expensive if you can buy.&lt;/p&gt;

&lt;p&gt;We do it ourselves. When a file lands in the inbox folder of our repo, an LLM reads it and writes a paragraph about where it belongs. This is the actual table it chooses from:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Where it goes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brand-wide asset (logo, scene, wave)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;brand/assets/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Study, reference, mood sample&lt;/td&gt;
&lt;td&gt;&lt;code&gt;brand/assets/referenzen/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image for one piece of content&lt;/td&gt;
&lt;td&gt;&lt;code&gt;content/&amp;lt;piece&amp;gt;/images/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legal text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;legal/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Research, channel or SEO material&lt;/td&gt;
&lt;td&gt;&lt;code&gt;strategy/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw material for a story&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;strategy/story-series/&lt;/code&gt; if it belongs to the series, else the matching &lt;code&gt;content/stories/&lt;/code&gt; folder, as input for the draft&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Six destinations. A choice, dressed up as a conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Jev does differently
&lt;/h2&gt;

&lt;p&gt;Jev, from TypeSafe AI, generates no text. You give it unstructured input and the set of answers you allow, and it returns one of them with a calibrated probability. The maker's own summary: "unstructured state in, typed probabilistic decisions out". An answer outside your schema can't happen, the maker says. The class name, System One model, borrows the split between fast, intuitive System 1 thinking and slow, deliberate System 2.&lt;/p&gt;

&lt;p&gt;By the maker's numbers, Jev is about 194 times faster and 445 times cheaper than an LLM on this kind of task. Its example: 0.11 seconds against 8.6. Alex Xu of ByteByteGo puts it as 1,500 emails for about three cents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The else belongs to a person
&lt;/h2&gt;

&lt;p&gt;A probability gives the branch a real else. Above your threshold, the email goes straight to quality assurance. Below it, someone in customer service reads it first. You set the threshold, not Jev. ByteByteGo calls this a confidence gate.&lt;/p&gt;

&lt;p&gt;That is the part we like most. An AI that tells you when it isn't sure is something we have wanted for a long time. A calibrated probability is only as good as its calibration, though. Until you have checked it against your own data, your threshold is a guess, so that check comes first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it can't do
&lt;/h2&gt;

&lt;p&gt;Jev writes no reply to the customer and gives no reason for its choice. It can still be wrong, just within your list. And for now it is only available in early access, through a waitlist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our bet
&lt;/h2&gt;

&lt;p&gt;Alex Xu splits the work like this: the LLM for generation, Jev for the decisions around it. We go one step further. A year from now, hardly any AI feature will let an LLM make its decisions. The LLM will only write.&lt;/p&gt;

&lt;p&gt;Go through your prompts and count the ones that end in "answer yes or no". How many ifs are hiding in there?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This report was written in German for decision-makers at &lt;a href="https://knopfdruck.ai/stories/jev-ist-if-statement-ki/" rel="noopener noreferrer"&gt;knopfdruck.ai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>jev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Your AI had questions. It answered them in the code.</title>
      <dc:creator>Daniel Baden</dc:creator>
      <pubDate>Tue, 22 Sep 2026 14:16:31 +0000</pubDate>
      <link>https://dev.to/knopfdruck/your-ai-had-questions-it-answered-them-in-the-code-1jo3</link>
      <guid>https://dev.to/knopfdruck/your-ai-had-questions-it-answered-them-in-the-code-1jo3</guid>
      <description>&lt;p&gt;If you build with AI every day, you know the pattern: the AI delivers, it runs, the tests pass, you nod. A few weeks in, nobody asks why it built things the way it did. With a UI you would notice, because you can see it. With logic in the background you see nothing.&lt;/p&gt;

&lt;p&gt;We caught ourselves doing it. This post is about the mechanism behind it, and what we changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A paragraph and a few samples
&lt;/h2&gt;

&lt;p&gt;Say a quote price comes together like this: material cost and setup time, plus a surcharge that depends on quantity. You write that down in one paragraph, attach a few old quotes as samples, and hand both to two people: a new colleague and an AI.&lt;/p&gt;

&lt;p&gt;The colleague comes back an hour later with questions. What about a material that appears in none of the samples? At what quantity does the surcharge kick in, and does it jump or grow? And a third one you hadn't thought of.&lt;/p&gt;

&lt;p&gt;The AI comes back a minute later with a calculation that runs and hits every sample to the cent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Looks good."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI had the same questions. It asked none of them and answered all of them, in the code, without a word.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why green tests can't see it
&lt;/h2&gt;

&lt;p&gt;A paragraph plus samples doesn't define one rule. It defines a family of rules: every rule that reproduces the sample results. A stepped surcharge and a linear one can agree on every quote you attached. So can a fallback that prices an unknown material like steel and one that throws an error.&lt;/p&gt;

&lt;p&gt;The AI has to pick one member of that family. It picks one that fits the samples, and it doesn't mention that there was a choice.&lt;/p&gt;

&lt;p&gt;Now look at where your tests come from. If they are built from the same samples, they check exactly what the AI already optimised for, and every rule in the family passes them. Green means the code fits the samples. Whether it implements the rule you meant, those tests can't say.&lt;/p&gt;

&lt;p&gt;The difference shows up with the first input that isn't like the samples: the unusual material, the odd quantity. It shows up in production, not in the test run.&lt;/p&gt;

&lt;p&gt;We saw this ourselves. When we asked the AI how exactly it calculates, its answer described a different rule from the one we meant. The tests had passed anyway, because the samples fit both rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the questions out first
&lt;/h2&gt;

&lt;p&gt;The fix isn't less AI. It's a different start: the AI has to surface its decisions before it writes any code.&lt;/p&gt;

&lt;p&gt;So before anything gets built, the AI answers in prose, with no code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how it understood the paragraph, restated in its own words&lt;/li&gt;
&lt;li&gt;which cases it sees, including the ones no sample covers&lt;/li&gt;
&lt;li&gt;where it would have to decide something by itself: a default, a threshold, a rounding step, what happens with input it doesn't know&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We answer, and it restates again. Round by round, until its restatement and our rule are the same rule. Only then does it build.&lt;/p&gt;

&lt;p&gt;That changes two things downstream.&lt;/p&gt;

&lt;p&gt;The tests come from the agreed rule, not just from the samples. Every question that came up in the rounds becomes a test case, so the suite finally holds inputs the samples never had. A passing test now confirms a rule both sides know.&lt;/p&gt;

&lt;p&gt;And we still read the code, even when it runs. The quickest thing to look for is a constant or a special case that appears in the code and nowhere in the agreed rule. Each one is a decision nobody asked for.&lt;/p&gt;

&lt;p&gt;Skip the rounds, and the decisions still get made. You've just handed them to someone who doesn't ask.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This report was written in German for decision-makers at &lt;a href="https://knopfdruck.ai/stories/beifahrer-oder-fahrer/" rel="noopener noreferrer"&gt;knopfdruck.ai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>methodology</category>
      <category>codequality</category>
    </item>
  </channel>
</rss>
