<?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: John Green</title>
    <description>The latest articles on DEV Community by John Green (@ramses203).</description>
    <link>https://dev.to/ramses203</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%2F4084119%2Fee714617-da74-4102-8c0f-8b541036c76b.jpg</url>
      <title>DEV Community: John Green</title>
      <link>https://dev.to/ramses203</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramses203"/>
    <language>en</language>
    <item>
      <title>I Gave My LLM an Exam. The Exam Author Lost 5 Times.</title>
      <dc:creator>John Green</dc:creator>
      <pubDate>Wed, 19 Aug 2026 01:55:18 +0000</pubDate>
      <link>https://dev.to/ramses203/i-gave-my-llm-an-exam-the-exam-author-lost-5-times-12b0</link>
      <guid>https://dev.to/ramses203/i-gave-my-llm-an-exam-the-exam-author-lost-5-times-12b0</guid>
      <description>&lt;p&gt;I didn't trust AI, so I built an exam for it.&lt;/p&gt;

&lt;p&gt;The person who failed that exam the most was me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was building
&lt;/h2&gt;

&lt;p&gt;A program that reads customer orders and turns them into order sheets automatically.&lt;/p&gt;

&lt;p&gt;Orders arrive as KakaoTalk messages (Korea's default messenger), and they look like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi! Today please send 5 boxes of the 250 shipping boxes and 2 boxes of clear tape&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Right now a human reads this and copies it into an order sheet. I wanted an LLM to do that job: take the message, find the right items in our product catalog, and produce this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Shipping box type A 250 — 5 boxes&lt;br&gt;
Box tape clear — 2 boxes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The problem: if this is wrong, &lt;strong&gt;real goods ship to real customers.&lt;/strong&gt; Wrong products get delivered, return shipping costs money, and the customer trusts you a little less.&lt;/p&gt;

&lt;p&gt;I've seen LLMs say nonsense with a straight face too many times to just hand this over. So I made a rule:&lt;/p&gt;

&lt;p&gt;Before it gets the job, it takes an exam.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the exam looked like
&lt;/h2&gt;

&lt;p&gt;I built three things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The exam&lt;/strong&gt; — 29 messages that could plausibly arrive. A practice catalog of 50 products, written by hand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The answer key&lt;/strong&gt; — my pre-written answer for every question: "when this message arrives, this product and this quantity must come out."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The grader&lt;/strong&gt; — a script that compares the model's answers against the key automatically. Also written by me.&lt;/p&gt;

&lt;p&gt;One rule mattered: the model got &lt;strong&gt;the right to say "I'm not sure — ask a human."&lt;/strong&gt; If it's confused and guesses anyway, the wrong goods end up on a truck. So for genuinely ambiguous questions, "needs confirmation" IS the correct answer. Asking beats confirming wrong.&lt;/p&gt;

&lt;p&gt;And I planted traps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two kinds of clear tape.&lt;/strong&gt; 48mm and 60mm. "Some clear tape please" must be unresolvable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Five products starting with "250".&lt;/strong&gt; Shipping box 250, OPP bag 250x350, zipper bag 250x350, shopping bag 250x330, bubble bag 250x300.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Messages that aren't orders.&lt;/strong&gt; "What are the dimensions of the 250 shipping box?" — the product name is right there, begging to be misread as an order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A customer who changes their mind.&lt;/strong&gt; "5 boxes of the 250 / oh wait, make it 3" — read both lines as orders and you ship 8.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I figured this would knock the model around pretty well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exam author: first loss
&lt;/h2&gt;

&lt;p&gt;It started with the very first question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Today please send 5 boxes of the 250 shipping boxes and 2 boxes of clear tape&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;My answer key&lt;/strong&gt; — Shipping box 250, confirmed. Clear tape: the 48mm one, confirmed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model's answer&lt;/strong&gt; — Shipping box 250, confirmed. Tape: "needs confirmation," two candidates.&lt;/p&gt;

&lt;p&gt;"Wrong." I was about to dock the point when something felt off, and I opened the catalog again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TAPE-48-CL   box tape, clear   48mm
TAPE-60-CL   box tape, clear   60mm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two clear tapes. &lt;strong&gt;My own trap.&lt;/strong&gt; I planted it, then forgot it existed while writing the answer key. The customer never said the width, so there's no way to pick one.&lt;/p&gt;

&lt;p&gt;The model was right. I fixed the key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second loss
&lt;/h2&gt;

&lt;p&gt;An extremely abbreviated order. Real customers actually send these.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;250 5&lt;br&gt;
tape 2&lt;br&gt;
bbl 3&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;My answer key&lt;/strong&gt; — first line is the shipping box 250, 5 boxes. Obviously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model's answer&lt;/strong&gt; — "needs confirmation." Multiple products start with 250, and the "5" has no unit.&lt;/p&gt;

&lt;p&gt;Obviously it's the shipping box, what else could— and then I got that feeling again and counted.&lt;/p&gt;

&lt;p&gt;Products starting with 250: five. The five I planted myself.&lt;/p&gt;

&lt;p&gt;And the "5": five boxes or five sheets? It says nowhere. This product packs 50 sheets per box. Read it wrong and the order is off &lt;strong&gt;by a factor of 50.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model was right. Two losses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Third loss
&lt;/h2&gt;

&lt;p&gt;This one came with a hint.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3 boxes of the usual&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also gave the model this customer's order history: "Shipping box 250, 5 boxes" — &lt;strong&gt;exactly one record.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My answer key&lt;/strong&gt; — there's only one record, so it's obviously that. Confirmed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model's answer&lt;/strong&gt; — "needs confirmation." It offered shipping box 250 as the likely candidate but wouldn't confirm.&lt;/p&gt;

&lt;p&gt;There's ONE record, what is there to ask? This one it definitely got wrong.&lt;/p&gt;

&lt;p&gt;...I thought. The more I chewed on it, the less it held.&lt;/p&gt;

&lt;p&gt;"The usual" is a pointer. &lt;strong&gt;The fact that we have one record doesn't guarantee the pointer points at it.&lt;/strong&gt; It could be something they buy from another store. It could be an older order that never made it into our records. If the system confirms on its own and ships, and that's wrong? The goods are already on the truck.&lt;/p&gt;

&lt;p&gt;Three losses.&lt;/p&gt;

&lt;h2&gt;
  
  
  The grader lost twice too
&lt;/h2&gt;

&lt;p&gt;The answer key wasn't the only problem. My auto-grader was wrong twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One.&lt;/strong&gt; A model answer was perfect in content, but the JSON it came wrapped in arrived with the last character cut off. The grader ruled "broken format = zero." &lt;strong&gt;A 100-point answer, zeroed over one missing brace.&lt;/strong&gt; Only after I added truncation repair did the real score show up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two.&lt;/strong&gt; For "250 boxes, 5 units" the model answered:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Verdict: needs confirmation&lt;br&gt;
Likely candidate: shipping box 250&lt;br&gt;
Reason: if "units" means boxes it's 5 boxes; if it means sheets it's 0.1 box — cannot confirm&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To a human, that's a considerate answer: "I need confirmation, but it's probably this one."&lt;/p&gt;

&lt;p&gt;My grader saw the candidate field filled in and ruled "aha, you confirmed!" — wrong. &lt;strong&gt;It penalized the model for doing the right thing.&lt;/strong&gt; I fixed it to read the verdict first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final score
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cheap model (Haiku 4.5) — 28 of 29 questions clean&lt;/li&gt;
&lt;li&gt;Expensive model (Sonnet 5) — all 28 executed questions clean&lt;/li&gt;
&lt;li&gt;Catastrophic errors, the wrong-goods-on-a-truck kind — &lt;strong&gt;zero for both&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model's one real mistake was in the safe direction: asking for confirmation where the answer was inferable.&lt;/p&gt;

&lt;p&gt;The exam author's side made &lt;strong&gt;five&lt;/strong&gt;: three in the answer key, two in the grader.&lt;/p&gt;

&lt;h2&gt;
  
  
  So
&lt;/h2&gt;

&lt;p&gt;What if I had never built this exam?&lt;/p&gt;

&lt;p&gt;I would have written the code believing "clear tape = 48mm." A customer who wanted 60mm would have received 48mm. And I would never have known — because in my head, it was obvious.&lt;/p&gt;

&lt;p&gt;The thing this exam caught the most wasn't the model's wrong answers. It was &lt;strong&gt;the exam author's certainty.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"I don't trust AI" is fair. But run the verification for real, and you find one more thing you can't trust.&lt;/p&gt;

&lt;p&gt;Yourself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. All 29 questions and the grader code are public → &lt;a href="https://github.com/ramses203/llm-test-harness" rel="noopener noreferrer"&gt;github.com/ramses203/llm-test-harness&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
