Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audit an existing eval suite for trustworthiness. Use when inheriting evals, suspecting evals miss real failures, or after significant pipeline changes.
.claude/skills/growthxai-output-eval-audit/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 1934% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 2527% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 96% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 82% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 44% | 0% |
Audit your eval suite to determine whether it actually catches real failures. This skill provides a structured diagnostic that identifies gaps in error analysis, evaluator design, judge validation, and dataset coverage, with concrete remediation steps for each finding.
Read the eval infrastructure files for the workflow being audited:
src/workflows/<workflow_name>/
├── tests/
│ ├── datasets/ # YAML dataset files
│ │ ├── *.yml
│ │ └── ...
│ └── evals/
│ ├── evaluators.ts # Evaluator definitions
│ ├── workflow.ts # Eval workflow definition
│ └── *.prompt # Judge prompt filesInventory what exists:
| Artifact | File(s) | Count | |----------|---------|-------| | Evaluators | tests/evals/evaluators.ts | ? | | Eval workflow | tests/evals/workflow.ts | ? entries in evals array | | Judge prompts | tests/evals/*.prompt | ? | | Datasets | tests/datasets/*.yml | ? | | Datasets with ground_truth | ? of above | ? | | Datasets with last_output | ? of above | ? |
If any of these are missing entirely, note it and skip to "Starting From Zero" at the bottom.
Evaluate each of the four areas below. For each, assign a status:
Question: Were the evaluators derived from observed failure modes in real workflow traces?
Check:
Pass criteria:
Common failures:
evaluate_quality, check_overall, rate_output — generic, not grounded in observed failuresRemediation: output-eval-error-analysis — Review 50+ traces and categorize actual failure modes before modifying evaluators
Question: Are the evaluators well-designed for reliable automated evaluation?
Check each evaluator in tests/evals/evaluators.ts:
| Check | What to look for | |-------|------------------| | One failure mode per judge | Each judgeVerdict() evaluator targets exactly one criterion | | Binary verdicts | Judge prompts use pass/fail, not Likert scales (1-5) or multi-axis ratings | | Code-based where possible | Objective checks use Verdict.* helpers, not LLM judges | | Few-shot examples in judges | Judge .prompt files include pass, fail, and borderline examples | | Critique before verdict | Judge prompts request critique/reasoning before the verdict in structured output | | Appropriate criticality | required for blocking failures, informational for nice-to-have checks | | Correct interpret type | interpret config matches what the evaluator returns |
Pass criteria:
Common failures:
Verdict.*interpret type doesn't match evaluator return type (e.g., judgeVerdict() with interpret: { type: 'boolean' })Remediation: output-eval-judge-prompt — Redesign judge prompts following the four-component structure
Question: Have LLM judges been validated against human labels?
Check for each LLM-based evaluator (those using judgeVerdict(), judgeScore(), judgeLabel()):
| Check | What to look for | |-------|------------------| | Human labels exist | Datasets have ground_truth.evals.<evaluator_name>.verdict populated | | TPR/TNR measured | Validation results documented (file, comment, or commit) | | Train/dev/test split | Few-shot examples in the judge prompt come from a designated train split, not from the same data used for measurement | | Metrics meet threshold | TPR > 80% and TNR > 80% (target: > 90%) |
Pass criteria:
Common failures:
Remediation: output-eval-validate-judge — Calibrate each judge against human labels using TPR/TNR
Question: Do the datasets adequately cover the failure space?
Check:
| Check | What to look for | |-------|------------------| | Dataset count | Minimum 10 for simple workflows, 20+ for complex ones | | Diversity | Datasets vary across multiple input dimensions, not just happy paths | | Failure representation | At least 30% of datasets have human_verdict: fail in ground_truth | | Ground truth populated | Most datasets have ground_truth with per-evaluator labels | | Real + synthetic mix | Includes production traces alongside synthetic test cases | | No near-duplicates | Each dataset tests a meaningfully different scenario |
Pass criteria:
Common failures:
Remediation: output-eval-dataset-design — Design diverse datasets using dimension-based variation
Summarize findings in a structured format:
markdown# Eval Audit: <workflow_name> # Date: YYYY-MM-DD # Auditor: <name> ## Summary | Area | Status | Key Finding | |------|--------|-------------| | Error Analysis Grounding | Warn | Evaluators seem reasonable but no documented trace review | | Evaluator Design | Fail | Single judge evaluates 3 criteria simultaneously | | Judge Validation | Fail | No validation performed on any LLM judge | | Dataset Coverage | Warn | 12 datasets but only 2 are failure cases | ## Findings ### 1. Error Analysis Grounding — WARN Evaluators target reasonable criteria (tone, topic, length) but there is no evidence that these were derived from observed failures. The eval suite may be missing the workflow's actual top failure modes. **Next step:** Run error analysis on 50+ production traces (`output-eval-error-analysis`) ### 2. Evaluator Design — FAIL `evaluate_overall_quality` in evaluators.ts uses a single judgeVerdict() call that assesses tone, accuracy, and completeness simultaneously. This makes failures unactionable — when it fails, you don't know which criterion failed. **Next step:** Split into three focused judges (`output-eval-judge-prompt`) ### 3. Judge Validation — FAIL No TPR/TNR metrics exist for any LLM judge. The judge_quality@v1.prompt has no few-shot examples. **Next step:** Label 100 datasets, validate each judge (`output-eval-validate-judge`) ### 4. Dataset Coverage — WARN 12 datasets exist with cached output. Only 2 have ground_truth.human_verdict: fail. All inputs are simple topics with no edge cases. **Next step:** Design 20+ diverse datasets (`output-eval-dataset-design`) ## Priority Order 1. Error analysis (foundational — may change which evaluators are needed) 2. Split holistic judge into focused judges 3. Expand datasets to 30+ with balanced pass/fail 4. Validate all LLM judges
If the workflow has no eval infrastructure at all:
output-eval-error-analysis. Review 50+ workflow traces.output-eval-dataset-design. Create 20+ diverse datasets.output-dev-eval-testing. Write verify() evaluators and evalWorkflow().output-eval-judge-prompt. For subjective criteria only.output-eval-validate-judge. Before trusting any LLM judge.Do not skip error analysis. Building evaluators without understanding how the workflow fails wastes effort on the wrong things.
output-eval-error-analysis — Systematic trace review and failure categorizationoutput-eval-judge-prompt — Design effective LLM judge promptsoutput-eval-dataset-design — Generate diverse test datasetsoutput-eval-validate-judge — Calibrate LLM judges against human labelsoutput-dev-eval-testing — Implementation reference for offline eval testingoutput-dev-evaluator-function — Implementation reference for runtime evaluators| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | pass→pass | 13,678 | 7,516 | -45% | 1 | 1 | 0% | 2,075 | 3,495 | +68% | 0 | 0 | — |
case-01 | fail→pass | 5,045 | 25,926 | +414% | 1 | 1 | 0% | 313 | 6,365 | +1934% | 0 | 0 | — |
case-02 | fail→fail | 4,825 | 5,684 | +18% | 1 | 1 | 0% | 196 | 2,706 | +1281% | 0 | 0 | — |
case-03 | fail→pass | 4,466 | 27,998 | +527% | 1 | 1 | 0% | 253 | 6,647 | +2527% | 0 | 0 | — |
case-04 | fail→fail | 9,414 | 19,314 | +105% | 1 | 1 | 0% | 1,386 | 5,559 | +301% | 0 | 0 | — |
case-05 | pass→pass | 13,829 | 17,150 | +24% | 1 | 1 | 0% | 2,139 | 5,367 | +151% | 0 | 0 | — |
case-06 | pass→pass | 12,617 | 7,445 | -41% | 1 | 1 | 0% | 2,095 | 3,716 | +77% | 0 | 0 | — |
case-07 | fail→pass | 12,156 | 7,240 | -40% | 1 | 1 | 0% | 1,815 | 3,561 | +96% | 0 | 0 | — |
case-08 | pass→pass | 17,880 | 9,992 | -44% | 1 | 1 | 0% | 2,561 | 3,994 | +56% | 0 | 0 | — |
case-09 | pass→pass | 14,113 | 8,953 | -37% | 1 | 1 | 0% | 2,299 | 3,843 | +67% | 0 | 0 | — |
case-10 | pass→pass | 14,341 | 11,197 | -22% | 1 | 1 | 0% | 2,194 | 3,999 | +82% | 0 | 0 | — |
case-11 | pass→pass | 14,798 | 6,558 | -56% | 1 | 1 | 0% | 2,169 | 3,354 | +55% | 0 | 0 | — |
case-12 | pass→pass | 15,497 | 8,295 | -46% | 1 | 1 | 0% | 2,380 | 3,584 | +51% | 0 | 0 | — |
case-13 | fail→pass | 12,190 | 6,604 | -46% | 1 | 1 | 0% | 1,884 | 3,420 | +82% | 0 | 0 | — |
case-14 | fail→pass | 19,791 | 13,502 | -32% | 1 | 1 | 0% | 3,208 | 4,627 | +44% | 0 | 0 | — |
case-15 | pass→pass | 11,443 | 5,908 | -48% | 1 | 1 | 0% | 1,833 | 3,346 | +83% | 0 | 0 | — |
case-17 | pass→pass | 17,232 | 4,988 | -71% | 1 | 1 | 0% | 2,837 | 3,172 | +12% | 0 | 0 | — |
case-18 | pass→pass | 8,992 | 6,428 | -29% | 1 | 1 | 0% | 1,342 | 3,268 | +144% | 0 | 0 | — |
case-19 | pass→pass | 14,623 | 9,060 | -38% | 1 | 1 | 0% | 2,160 | 3,820 | +77% | 0 | 0 | — |
case-20 | pass→pass | 16,748 | 9,853 | -41% | 1 | 1 | 0% | 2,291 | 3,765 | +64% | 0 | 0 | — |
case-21 | pass→pass | 14,038 | 6,499 | -54% | 1 | 1 | 0% | 2,122 | 3,297 | +55% | 0 | 0 | — |
case-22 | fail→pass | 14,189 | 2,446 | -83% | 1 | 1 | 0% | 2,356 | 2,695 | +14% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.