/output-eval-audit
Audit an existing eval suite for trustworthiness. Use when inheriting evals, suspecting evals miss real failures, or after significant pipeline changes.
$ npx -y skills add growthxai/output --skill output-eval-audit --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/output-eval-audit
Context preview
The summary Claude sees to decide when to auto-load this skill.
Audit an existing eval suite for trustworthiness. Use when inheriting evals, suspecting evals miss real failures, or after significant pipeline changes.
SKILL.md
output-eval-audit.SKILL.mdname: output-eval-audit
description: Audit an existing eval suite for trustworthiness. Use when inheriting evals, suspecting evals miss real failures, or after significant pipeline changes.
allowed-tools: [Bash, Read]
Auditing an Eval Suite
Overview
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.
When to Use
- Inheriting an eval suite from another team or developer
- Suspecting that evals pass but production quality is poor
- After switching models, rewriting prompts, or changing pipeline logic
- Periodic health check (quarterly or after major releases)
Step 1: Gather Artifacts
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 files
Inventory 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.
Step 2: Run the Diagnostic
Evaluate each of the four areas below. For each, assign a status:
- **Pass** — Meets the standard
- **Warn** — Partially meets the standard, improvements needed
- **Fail** — Does not meet the standard, significant risk
---
Area 1: Error Analysis Grounding
**Question:** Were the evaluators derived from observed failure modes in real workflow traces?
**Check:**
- Do failure categories exist (documented in a file, comments, or commit history)?
- Does each evaluator map to a specific failure category?
- Or are evaluators measuring generic qualities ("quality score", "overall rating")?
**Pass criteria:**
- Each evaluator targets a named failure mode (e.g., "check_tone" targets tone mismatch, not "evaluate general quality")
- Failure categories were derived from reviewing real traces (not brainstormed)
**Common failures:**
- Evaluators named `evaluate_quality`, `check_overall`, `rate_output` — generic, not grounded in observed failures
- Evaluators were written based on what seemed important, not what actually fails
- No evidence of trace review before evaluator creation
**Remediation:** `output-eval-error-analysis` — Review 50+ traces and categorize actual failure modes before modifying evaluators
---
Area 2: Evaluator Design
**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:**
- All checks above are met for every evaluator
**Common failures:**
- A single judge prompt evaluates 3+ criteria simultaneously ("Rate tone, accuracy, and completeness")
- Judge prompts have no few-shot examples
- Deterministic checks (length, string contains, regex) use LLM judges instead of `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
---
Area 3: Judge Validation
**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:**
- Every LLM judge has documented TPR/TNR metrics above 80%
- Train/dev/test split was used (no data leakage)
**Common failures:**
- No validation at all — judges were written and immediately deployed
- Few-shot examples in the judge prompt are the same examples used to measure metrics (data leakage)
- "It seems to work" without quantitative measurement
- Only raw accuracy reported (masks class imbalance)
**Remediation:** `output-eval-validate-judge` — Calibrate each judge against human labels using TPR/TNR
---
Area 4: Dataset Coverage
**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
Read more
name: output-eval-audit description: Audit an existing eval suite for trustworthiness. Use when inheriting evals, suspecting evals miss real failures, or after significant pipeline changes. allowed-tools: [Bash, Read]
Auditing an Eval Suite
Overview
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.
When to Use
- Inheriting an eval suite from another team or developer
- Suspecting that evals pass but production quality is poor
- After switching models, rewriting prompts, or changing pipeline logic
- Periodic health check (quarterly or after major releases)
Step 1: Gather Artifacts
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 files
Inventory 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.
Step 2: Run the Diagnostic
Evaluate each of the four areas below. For each, assign a status:
- **Pass** — Meets the standard
- **Warn** — Partially meets the standard, improvements needed
- **Fail** — Does not meet the standard, significant risk
---
Area 1: Error Analysis Grounding
**Question:** Were the evaluators derived from observed failure modes in real workflow traces?
**Check:**
- Do failure categories exist (documented in a file, comments, or commit history)?
- Does each evaluator map to a specific failure category?
- Or are evaluators measuring generic qualities ("quality score", "overall rating")?
**Pass criteria:**
- Each evaluator targets a named failure mode (e.g., "check_tone" targets tone mismatch, not "evaluate general quality")
- Failure categories were derived from reviewing real traces (not brainstormed)
**Common failures:**
- Evaluators named `evaluate_quality`, `check_overall`, `rate_output` — generic, not grounded in observed failures
- Evaluators were written based on what seemed important, not what actually fails
- No evidence of trace review before evaluator creation
**Remediation:** `output-eval-error-analysis` — Review 50+ traces and categorize actual failure modes before modifying evaluators
---
Area 2: Evaluator Design
**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:**
- All checks above are met for every evaluator
**Common failures:**
- A single judge prompt evaluates 3+ criteria simultaneously ("Rate tone, accuracy, and completeness")
- Judge prompts have no few-shot examples
- Deterministic checks (length, string contains, regex) use LLM judges instead of `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
---
Area 3: Judge Validation
**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:**
- Every LLM judge has documented TPR/TNR metrics above 80%
- Train/dev/test split was used (no data leakage)
**Common failures:**
- No validation at all — judges were written and immediately deployed
- Few-shot examples in the judge prompt are the same examples used to measure metrics (data leakage)
- "It seems to work" without quantitative measurement
- Only raw accuracy reported (masks class imbalance)
**Remediation:** `output-eval-validate-judge` — Calibrate each judge against human labels using TPR/TNR
---
Area 4: Dataset Coverage
**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
The open-source TypeScript framework for building AI workflows and agents. Designed for Claude Code — describe what you want, Claude builds it, with all the best practices already in place. One framework.
Repo: growthxai/output
Other skills on output.
- /llm-output-schema-constraints
Zod schema constraints that Anthropic rejects or silently ignores when sent as structured-output tool definitions via Output.object(). Use when writing or reviewing Zod schemas passed to Output.object(), or debugging structured-output validation errors.
Open skill - /prompt-file-provider-options
Guide to the providerOptions structure in .prompt files — decision tree for where an option goes, common mistakes, per-provider quick reference, and Anthropic prompt caching. Use when writing or reviewing .prompt file frontmatter (provider, model, providerOptions,
Open skill - /validate
Run lint, build, and tests to validate changes are correct
Open skill - /output-build-workflow
Implement an Output SDK workflow from a plan document. Use when the user asks to build, implement, or code a workflow from an existing plan, or after output-plan-workflow has produced a plan and the user is ready to build.
Open skill - /output-credentials-edit
View and edit encrypted credentials in an Output.ai project. Use when adding secrets, updating API keys, verifying credential values, or retrieving a specific credential.
Open skill - /output-credentials-env-vars
Wire encrypted credentials to environment variables using the credential: convention. Use when setting up LLM provider keys (ANTHROPIC_API_KEY, OPENAI_API_KEY) or any env var that should come from encrypted credentials.
Open skill

