Skip to main content

skill-forge-eval

Run evaluation pipelines on Claude Code skills to test triggering accuracy, workflow correctness, and output quality. Spawns executor, grader, comparator, and analyzer sub-agents for parallel evaluation. Generates eval_metadata.json, grading.json, and feedback reports. Use when user says "eval skill", "test skill", "run evals", "evaluate skill", "skill evals", "test skill quality", "run skill tests", or "skill evaluation".

Source facts

Repository
AgriciDaniel/skill-forge
Last source activity
March 6, 2026 at 16:30
Detected SKILL.md language
English
Stars
186
Forks
43

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
skill-forge-eval
description
Run evaluation pipelines on Claude Code skills to test triggering accuracy, workflow correctness, and output quality. Spawns executor, grader, comparator, and analyzer sub-agents for parallel evaluation. Generates eval_metadata.json, grading.json, and feedback reports. Use when user says "eval skill", "test skill", "run evals", "evaluate skill", "skill evals", "test skill quality", "run skill tests", or "skill evaluation".
# Skill Evaluation Pipeline Run structured evaluations against Claude Code skills to verify triggering, correctness, and quality using a multi-agent pipeline. ## Process ### Step 1: Define Eval Set Accept eval definitions from: - **Path to eval set JSON**: `evals/evals.json` or user-specified file - **Inline prompts**: User provides eval queries directly - **Auto-generated**: Generate from skill description (see Step 1b) **Eval set JSON schema:** ```json { "skill_name": "my-skill", "skill_path": "./my-skill", "evals": [ { "eval_id": 0, "eval_name": "descriptive-name", "prompt": "The user's task prompt", "input_files": [], "assertions": [ { "name": "output-has-score", "check": "Output contains a numeric score between 0-100", "weight": 1.0 } ], "should_trigger": true } ] } ``` #### Step 1b: Auto-Generate Eval Set If no eval set exists, generate one: 1. Read the skill's SKILL.md description and instructions 2. Run `python scripts/generate_eval_set.py <skill-path>` to produce a starter set 3. Present the generated set to the user for review and editing 4. User approves or modifies before proceeding ### Step 2: Set Up Workspace Create the eval workspace **outside** the skill directory to avoid confusing eval artifacts with skill files. Use a sibling directory or a dedicated location: ``` eval-workspace/ iteration-1/ eval-0/ eval_metadata.json # Assertions and config for this eval with_skill/ outputs/ # Skill execution outputs timing.json # Token count + duration grading.json # Assertion results + evidence baseline/ outputs/ timing.json grading.json eval-1/ eval_metadata.json with_skill/ outputs/ timing.json grading.json baseline/ outputs/ timing.json grading.json benchmark.json # Aggregated metrics benchmark.md # Human-readable report ``` For each eval directory, create `eval_metadata.json` from the eval set entry: ```json { "eval_id": 0, "eval_name": "descriptive-name", "prompt": "The user's task prompt", "assertions": [...], "should_trigger": true } ``` ### Step 3: Execute Eval Runs For each eval in the set, spawn two parallel runs: **With-skill run** (delegate to `agents/skill-forge-executor.md`): ``` Execute this task: - Skill path: <path-to-skill> - Task: <eval prompt> - Input files: <eval files if any, or "none"> - Save outputs to: <workspace>/iteration-<N>/eval-<ID>/with_skill/outputs/ - Outputs to save: <what the assertions check> ``` **Baseline run** (delegate to `agents/skill-forge-executor.md`): - For new skills: run without the skill loaded - For improved skills: run with the previous version (snapshot it first) Save timing data to `timing.json` in each run directory: ```json { "total_tokens": 84852, "duration_ms": 23332, "total_duration_seconds": 23.3 } ``` ### Step 4: Grade Results Delegate to `agents/skill-forge-grader.md` for each completed run: 1. Grade against assertions defined in eval_metadata.json 2. Save results to `grading.json` per run: ```json { "eval_id": 0, "run_type": "with_skill", "assertions": [ { "name": "output-has-score", "passed": true, "evidence": "Found score: 87/100 on line 14" } ], "pass_rate": 1.0 } ``` ### Step 5: Aggregate and Analyze 1. Run `python scripts/aggregate_benchmark.py <workspace>/iteration-<N> --skill-name <name>` 2. This produces `benchmark.json` and `benchmark.md` with: - Pass rate per eval (with_skill vs baseline) - Average time and token usage - Improvement ratio (with_skill / baseline) 3. Delegate to `agents/skill-forge-analyzer.md` to: - Surface patterns that aggregate stats might hide - Identify consistently failing assertion types - Flag regressions from previous iterations ### Step 6: Present Results Generate a summary report: ```markdown # Eval Report: [skill-name] — Iteration [N] ## Overall | Metric | With Skill | Baseline | Delta | |--------|-----------|----------|-------| | Pass Rate | X% | Y% | +Z% | | Avg Time | Xs | Ys | -Zs | | Avg Tokens | X | Y | -Z | ## Per-Eval Results | Eval | With Skill | Baseline | Status | |------|-----------|----------|--------| | eval-0 | PASS | FAIL | Improved | | eval-1 | PASS | PASS | Maintained | ## Patterns & Insights [From analyzer agent] ## Recommendations [Specific improvements based on failures] ``` ### Step 7: Collect Feedback Save user feedback to `feedback.json`: ```json { "reviews": [ { "run_id": "eval-0-with_skill", "feedback": "the chart is missing axis labels", "timestamp": "2026-03-06T12:00:00Z" } ], "status": "complete" } ``` Pass feedback to `/skill-forge evolve` for the next iteration. ## Advanced: Blind Comparison For rigorous A/B testing between skill versions: 1. Delegate to `agents/skill-forge-comparator.md` 2. Pass two directories: `eval-<ID>/with_skill/outputs/` and `eval-<ID>/baseline/outputs/` 3. Comparator assigns random labels (Version A / Version B) so it cannot know which is new 4. Rates each output on assertion criteria from `eval_metadata.json` 5. Returns preference scores without knowing which is "new" vs "old" ## Error Handling - **Executor timeout**: If a run exceeds 5 minutes, terminate and mark as `"timed_out": true` in timing.json - **Executor failure**: If a run crashes, save the error to `error.txt` in the run directory and continue with remaining evals - **Grading failure**: If grading cannot determine pass/fail, mark assertion as `"passed": null` with evidence explaining why - **Missing files**: If timing.json or grading.json is missing after a run, flag the eval as incomplete in the report - **Partial completion**: Always aggregate and report whatever results are available — do not block on one failed eval ## Quality Gates Before marking an eval run as complete: - [ ] All evals executed (with_skill + baseline) - [ ] Timing data captured for every run - [ ] All assertions graded with evidence - [ ] Benchmark aggregated with pass rate, time, tokens - [ ] Analyzer patterns documented - [ ] Results presented to user
View on GitHub