cd /news/large-language-models/grade-your-llm-pass-fail-and-you-wil… · home topics large-language-models article
[ARTICLE · art-103760] src=dev.to ↗ pub= topic=large-language-models verified=true sentiment=· neutral

Grade Your LLM Pass/Fail and You Will Ship a Disaster

An engineer known as ramses203 detailed a severity-based grading system for LLM order-reading tests, arguing that counting correct answers is misleading and that a single irreversible error should block deployment. The approach assigns grades from FATAL to HARMLESS based on reversibility, and the engineer shared lessons from grading bugs, including the importance of saving model answers and writing results to disk incrementally.

read3 min views3 publishedAug 20, 2026

I gave my LLM a 29-question order-reading exam. Last time was how to build the exam. Today: grading.

Grading gets its own post for a reason. Build the grading wrong, and the score lies to you.

No idea. Because "which 5" is missing.

If it missed 5 typo-riddled questions, ship it. But if one of those 5 was reading "please cancel my order" as a NEW order? Then even with everything else perfect, you can't ship. That program sends goods to a customer who just cancelled.

So don't grade by count. Grade by severity.

My grader has 4 grades. One criterion — is it reversible? In this program, the irreversible moment is when the wrong goods get loaded onto a truck.

FATAL     Wrong goods on the truck.  Cannot be undone
RISKY     Confirmed something ambiguous without asking.  Right this time — fatal next time
MISSED    Dropped an order.  The customer calls.  Fixable
HARMLESS  Over-asked "please confirm."  Just slower

One principle falls out of this:

A wrong confirmation is worse than no confirmation.

Sounds obvious. In production you'll be tempted to flip it. Someone complains "it asks for confirmation too often," so you lower the confidence bar. The screen gets cleaner. And the accidents start happening off-screen.

FATAL 0 · MISSED 1        →  Ship it. Humans catch what it drops
FATAL 1 · everything else perfect  →  Don't ship. You don't know when that 1 comes back

Same score. Opposite fates.

The grader is code I wrote. Like all code I write, it had bugs.

Accident one — zero points over formatting. A model answer was perfect in content, but the JSON wrapper arrived with the tail cut off. The grader ruled "broken format = fatal." A 100-point answer, zeroed over one missing brace.

The fix is simple: count the open brackets and close what's missing (ignoring brackets inside strings). The actual code is in parse_json in the repo.

Accident two — penalizing a good answer. For "250 boxes, 5 units" the model answered:

Verdict: needs confirmation

Likely candidate: shipping box 250

Reason: if "units" means boxes it's 5 boxes; if sheets, 0.1 box — cannot confirm

A considerate answer — asks for confirmation AND offers a hint. But my grader saw the candidate field filled in and ruled "aha, you confirmed!" Wrong answer. I fixed it to read the verdict field first.

Lesson: when the grader is wrong, you end up "fixing" a healthy model. And every fix makes it worse.

Save every model answer to a file. Never throw them away. In this project, what kept changing wasn't the model's answers — it was the grading side. I fixed the answer key three times and the grader twice. Each fix means re-grading all 29 questions. With saved answers, re-grading takes seconds. Without them, one re-grade means calling the model 29 times again. It's the difference between re-marking stored answer sheets and calling every student back to retake the exam. I built this as a --rescore

flag.

Write results to disk after every single case. In another experiment I collected 5,578 items with a save-at-the-end design. The last request failed and took all 5,000 with it. Paid API — every lost item was money. Learned that one the hard way.

When the results come in, the question is not "how many did it get right?"

It's "among the failures, is anything irreversible?"

That's why I only really read one line of the grader's output. Fatal = 0: ship. Fatal = 1: don't — even if everything else is perfect.

P.S. Next up: the model that costs 3x more won by exactly one question.

All code and the 29 questions are public → github.com/ramses203/llm-test-harness

── more in #large-language-models 4 stories · sorted by recency
── more on @ramses203 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/grade-your-llm-pass-…] indexed:0 read:3min 2026-08-20 ·