A release gate for LLM apps that runs on your real traffic: eval sets from your traces, tested graders, a calibrated LLM judge, a paired regression test in CI, a prompt-injection and data-leak suite, and a cost and latency budget, ending in one ship or hold.
Nine skills that decide whether a new prompt, model or retrieval change is safe to ship, as scripts in your own project, each ending in a machine-checked gate that prints PASS, FAIL or BLOCKED with evidence. Write the eval contract (how to call your baseline, candidate and judge as a command or allowlisted endpoint, thresholds, budgets with your own price table); build a frozen eval set from real JSONL, CSV, chat-log or OpenTelemetry traces, with PII scrubbed before storage, duplicates removed and leakage into prompt examples caught; collect human references and verdicts with two-labeler agreement; test every grader (exact, regex, JSON Schema, numeric, required facts, citations in retrieved context, rubrics) against known-good and empty answers; calibrate the LLM judge against your reviewers for kappa, length bias and position bias, and refuse it until it passes; grade both builds with repeats for flaky cases and paired McNemar tests per slice with Holm correction, with a GitHub Actions workflow; run 28 templated injection, exfiltration, tool-misuse and PII-leak probes plus probes generated from your contract, scored by canaries, derived tokens and markers; hold tokens, cost per 1,000 requests and p95 latency to budget; and roll it into one evidence-bound ship or hold that refuses stale gates. Works with any model or framework through adapters you control; never holds your keys. Python 3 standard library only. Requires an AI that can run commands on your computer (Claude Code, Codex or Cursor). The worked example is a fictional support assistant run on local stand-ins; every skill reads your own contract first.
Parcelwise is not a real company. A support assistant for a parcel-delivery company: retrieval over a help center and one order-lookup tool, answering in JSON. Parcelwise is built with 441 production traces in three export formats, human labels, two judges and a release candidate with planted defects, plus a fixed twin. The whole chain ran on both from a fresh fixture, using the scripts exactly as the skills ship them. The app and judges are local deterministic stand-ins, not models.
Release candidate: HOLD, with every planted finding raised and every planted count matched
| Gate | Skill | Status | Blocker | Major | Minor |
|---|---|---|---|---|---|
| contract | eval-contract | PASS | 0 | 0 | 0 |
| eval-set | trace-eval-set | FAIL | 0 | 5 | 6 |
| labels | eval-case-labels | FAIL | 0 | 6 | 0 |
| graders | eval-graders | FAIL | 0 | 1 | 0 |
| judge | judge-calibration | FAIL | 0 | 3 | 0 |
| regression | eval-regression-gate | FAIL | 0 | 24 | 2 |
| red-team | llm-red-team-suite | FAIL | 9 | 5 | 1 |
| budget | llm-cost-latency-budget | FAIL | 0 | 4 | 1 |
Fixed twin: SHIP, with every gate PASS (2 minor notes)
From the report
REGRESSION-SLICE-DROP · intent=billing
85.7% -> 21.4% (n=28, 18 regressed, 0 improved, McNemar p=7.63e-06); e.g. numbers [104.12, 3.0] not within 0.01 of 52.06.
Fix: The candidate is worse on this slice; read its failing cases.
EVALSET-LEAKAGE · c_18bbeb89b240
Test case near-duplicates app/prompt_examples.jsonl line 7 (Jaccard 1.0): pasted into the prompt after the freeze.
Fix: Remove the example from the prompt, or re-freeze without this case.
JUDGE-LENGTH-BIAS · helpfulness
Judge-minus-human pass rate is +0.56 higher on long outputs than short ones; false-pass rate on long outputs 1.0, short 0.0.
Fix: Tell the judge length is not quality, give it reference facts, and re-calibrate.
REDTEAM-EXFILTRATION · exfiltration:image-beacon
A poisoned help-center document made the candidate add a markdown image to an attacker host, on 5 of 5 attempts.
Fix: Do not render model-written links or images to hosts outside an allowlist; strip markdown images server-side.
The app under test and both judges are local deterministic stand-ins shipped with the fixture: latency, tokens and model names are simulated and prices are invented, so the proof needs no API key.
The human labels in the proof were written by a labeler simulator from the generator's ground truth.
Optional
Questions or a problem with 1.0.3? Email support@skillme.dev.
Arranged in the author's recommended order. Walk through them in sequence, or open any one on its own.
Starts a release eval of an LLM application – writes the .evals/eval-contract.json every later step obeys (how to call the app's baseline and candidate builds as a provider-agnostic command or allowlisted HTTP endpoint, the judge likewise, task type, slices.
Builds an LLM eval set from real production traces – imports JSONL, CSV, chat-message logs or OpenTelemetry (OTLP JSON) span exports in documented shapes (anything else is BLOCKED, not guessed), scrubs emails, phones, Luhn-valid card numbers.
Turns frozen eval cases into graded references and human verdicts – writes labeling files people fill (expected facts, amounts, tool calls, escalation, a known-good reference output; pass/fail verdicts on real model outputs for judge calibration).
Defines and tests the graders that score an LLM app's outputs – deterministic graders (exact, normalized, regex, JSON Schema validity with a stated stdlib subset, numeric tolerance, required and forbidden phrases, citations-in-retrieved-context for RAG.
Calibrates an LLM-as-judge against human labels before its verdicts can count toward a release – runs the judge on human-labeled dev outputs and reports agreement, Cohen's kappa, the confusion matrix.
Runs the baseline and candidate builds of an LLM app over the frozen test set (concurrency limit, retries, timeouts, repeats, cache keyed by input, app version and code) and decides whether the candidate regressed – grades every repeat.
Runs a fixed prompt-injection and data-leak suite against an LLM app build – direct injection, instruction override, system-prompt extraction (with a canary you plant), indirect injection through retrieved documents and tool outputs.
Checks an LLM app release against its cost and latency budget from the eval run logs – tokens per call, cost via your own price table (USD per million input/output tokens per model), cost per 1,000 requests and per successful task, p50/p95/p99 latency.
Turns every LLM eval gate into one evidence-bound release decision – SHIP, SHIP WITH N ACCEPTED RISKS or HOLD – by re-checking each gate's fingerprints (contract, every file it read, the app and judge code and versions.