cd /news/ai-tools/i-got-tired-of-breaking-my-llm-app-w… · home › topics › ai-tools › article
[ARTICLE · art-167551] src=dev.to ↗ pub= topic=ai-tools verified=true sentiment=↑ positive

I got tired of breaking my LLM app with "one small prompt change", so I built a 450-line eval harness

An independent developer built Litmus, a single-file, stdlib-only Python eval harness that tests LLM applications against JSONL datasets and gates regressions in CI. The tool reports pass rates, failures and latency percentiles, supports a compare mode that exits non-zero when pass rates drop past a threshold, and uses deterministic contains/regex checks alongside an optional LLM-as-judge. It is sold for a one-time $12 with a field guide and CI workflow example.

by read2 min views3 publishedNov 11, 2026

Every LLM developer I know has the same workflow: tweak the prompt, eyeball three outputs, ship it. Then a user reports that the refund flow has been answering wrong for two days.

The fix is evals, but the popular options all asked for more than I wanted to give: a SaaS account, a framework dependency, a YAML religion. I wanted pytest energy: one file, run it, exit code.

So I wrote Litmus: a single Python file, stdlib only, that evals an LLM app against a JSONL dataset and gates regressions in CI.

{"id": "refund-q", "input": "How do I get a refund?",
 "expect": {"contains": ["30 days"], "regex": "refund"}}

That's it. Input, plus what a good answer must contain. Run it:

python3 litmus.py run --dataset cases.jsonl --endpoint https://api.openai.com/v1 --model gpt-4o-mini
LITMUS REPORT  ============================================
  pass rate   97.4%  (76/78)
  failed      1
  errored     1
  [FAIL] refund-question (0.91s)
        contains: missing: 30 days

Run Litmus against your production prompt, save the JSON report as the baseline, and check every change against it:

python3 litmus.py compare baseline.json current.json --threshold 0.02

It lists the exact cases that used to pass and now fail, and exits 1 - so GitHub Actions blocks the merge. The workflow file is 15 lines, included in the guide.

pip install is where side tools go to die. Litmus is Python 3.8+ stdlib only. You can read all of it before running it.contains and regex are deterministic and free. LLM-as-judge is there for tone and helpfulness, with your rubric - and judge failures are reported as errors, never silently passed. Litmus is $12, one time: https://litmustools.gumroad.com/l/litmus. You get the tool, the field guide (eval-set patterns, LLM-judge rules, the CI workflow), and a runnable example. If it saves one bad deploy, it paid for itself.

── more in #ai-tools 4 stories · sorted by recency
── more on @litmus 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/i-got-tired-of-break…] indexed:0 read:2min 2026-11-11 · —