Evaluation Methodology
Seth HobsonCommunityCreated by Seth Hobson
- Skill
- Guidelines
- Agent tooling
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The evaluation-methodology skill provides the framework for PluginEval, a system designed to score AI agent skills and plugins on a scale of 0 to 100. It defines the dimensions, rubrics, and scoring formulas used to assess skill quality, including triggering accuracy, orchestration fitness, and output quality. The methodology employs three distinct layers: a deterministic static linting layer, an experimental LLM judge layer, and a Monte Carlo simulation layer. This skill serves as a reference for developers to interpret scores, identify anti-patterns, and optimize their skills for better performance within an agentic ecosystem.
What it does
- Defines the composite scoring formula based on weighted dimensions and layer results.
- Provides specific rubrics and anti-pattern definitions for skill improvement.
- Outlines the four evaluation depths ranging from quick linting to thorough Monte Carlo testing.
- Explains how to interpret dimension-specific grades and quality badges.
- Offers actionable advice for fixing common issues like poor triggering or orchestration wiring.
- Details the experimental nature of LLM-based and Monte Carlo evaluation layers.
When to use it
- When you need to understand how your skill's quality score is calculated.
- When you are troubleshooting a low score in a specific dimension like triggering accuracy.
- When you want to optimize your skill's description or orchestration wiring for better performance.
- When you need to explain quality metrics or badges to external stakeholders.
- When you are setting quality thresholds for a plugin marketplace.
Advantages
- Provides a standardized, repeatable way to measure skill quality.
- Offers clear, actionable guidance on how to improve specific scoring dimensions.
- Distinguishes between deterministic static checks and experimental model-based evaluations.
- Helps developers avoid common anti-patterns that negatively impact scores.
Usage examples
- “How can I improve my skill's triggering accuracy score?”
- The agent will guide you to update your frontmatter description to include at least 100 characters, a clear trigger phrase like 'Use this skill when', and three or more specific contexts.
- “What does the orchestration_fitness dimension measure?”
- The agent will explain that it evaluates the skill's wiring, specifically looking for clear descriptions of inputs and outputs, and will advise you to avoid certain prohibited words.
- “Why did my skill score drop after I added more content?”
- The agent will instruct you to check the anti-patterns list in the JSON output to see if you triggered flags like BLOATED_SKILL or OVER_CONSTRAINED.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/wshobson/evaluation-methodology/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip evaluation-methodology.zip -d .agents/skills
Documentation by Seth Hobson
Evaluation methodology
PluginEval scores a skill or a plugin from 0 to 100 by combining up to three layers. The static
layer is a lint. It's fast and deterministic, and it's useful for checking structure. The LLM
judge and Monte Carlo layers are experimental, not validated against human labels, so treat their
numbers as rough signals. For the trace-based eval program, see evals/README.md at the
repository root.
The judge rubric anchors are in references/rubrics.md. Fixes for each anti-pattern and tips for each dimension are in references/improving-scores.md.
Evaluation depths
| Depth | Layers | Confidence label |
|---|---|---|
quick | static | Estimated |
standard (default for score) | static and judge | Assessed |
deep (used by certify) | static, judge, and Monte Carlo with 50 runs | Certified |
thorough | static, judge, and Monte Carlo with 100 runs | Certified+ |
The label names the depth that ran, not a check against human judgment. A plugin directory gets the static layer only, whatever depth you ask for.
Static layer (lint)
The static layer reads SKILL.md and makes no model calls. It computes seven sub-scores, and the first six feed composite dimensions:
frontmatter_quality(feedstriggering_accuracy)orchestration_wiring(feedsorchestration_fitness)progressive_disclosure,structural_completeness,token_efficiency,ecosystem_coherenceharness_portability
harness_portability maps to no dimension, so it doesn't change a skill's composite score. It
does carry 6% of the static layer's own score. A plugin's score is built from that layer score,
so portability findings can lower a plugin's score a little. Its findings are not counted as
anti-patterns.
The static layer flags six anti-patterns: OVER_CONSTRAINED, EMPTY_DESCRIPTION,
MISSING_TRIGGER, BLOATED_SKILL, ORPHAN_REFERENCE, and DEAD_CROSS_REF. Each flag cuts the
score by 5%, down to a floor of 50%:
penalty = max(0.5, 1.0 - 0.05 * anti_pattern_count)The report prints a severity for each flag, but the penalty counts flags and ignores severity.
LLM judge layer (experimental)
The judge layer makes four model calls and returns four holistic scores from 0 to 1:
triggering_accuracy: Haiku reads the description and writes 10 test prompts, 5 that should trigger and 5 that should not. It predicts the outcome for each prompt and reports its own F1. Nothing checks those predictions against real triggering.orchestration_fitnessandscope_calibration: Sonnet rates the skill on a five-point rubric.output_quality: Sonnet imagines three tasks and rates the output it expects.
The three Sonnet calls see only the first 3,000 characters of SKILL.md. Only one judge runs,
because nothing reads the judges setting.
Monte Carlo layer (experimental)
Haiku writes 15 prompts that should trigger the skill, and the layer repeats them to reach 50
runs (100 at thorough). Each run sends the SKILL.md text and one prompt to the model, and the
layer records four measures:
Activation rate is the share of runs with any non-empty reply, so it shows whether the model answered, not whether the skill should have fired.
Output quality is reply length divided by 500, capped at 1.0.
Failure rate is the share of runs that errored.
Token efficiency is
1 - median_tokens / 8000.
Every prompt is one that should trigger, so the layer never checks that the skill stays out of
unrelated requests. The layer's JSON includes Wilson, bootstrap, and Clopper-Pearson intervals
for its own measures. The composite ci_lower and ci_upper fields are always null.
Composite score
First, for each dimension, the engine blends the layer scores that exist, and it renormalizes the blend weights over those layers. Second, it sums the weighted dimension scores, and it renormalizes the dimension weights over the dimensions that have a score. Third, it multiplies the sum by 100 and by the anti-pattern penalty.
| Dimension | Weight | Static | Judge | Monte Carlo |
|---|---|---|---|---|
triggering_accuracy | 0.25 | 0.15 | 0.25 | 0.60 |
orchestration_fitness | 0.20 | 0.10 | 0.70 | none |
output_quality | 0.15 | none | 0.40 | 0.60 |
scope_calibration | 0.12 | none | 0.55 | none |
progressive_disclosure | 0.10 | 0.80 | none | none |
token_efficiency | 0.06 | 0.40 | none | 0.50 |
robustness | 0.05 | none | none | 0.80 |
structural_completeness | 0.03 | 0.90 | none | none |
code_template_quality | 0.02 | none | none | none |
ecosystem_coherence | 0.02 | 0.85 | none | none |
A cell reads "none" when its layer produces no score for the dimension, even where
LAYER_BLENDS lists a weight. No layer produces code_template_quality, so it's always
unmeasured. For a plugin directory, the composite is the static layer's mean score across the
plugin's skills and agents, times 100, times the penalty for the plugin's anti-pattern count.
Badges and grades
Badges come from the composite score alone. Platinum needs at least 90, Gold at least 80, Silver
at least 70, and Bronze at least 60. Badge.from_scores accepts an Elo rating, but no command
computes one. Plugin-level badges, including the ones in the weekly CI report, come from the
static layer alone. Skill-level badges at standard depth or deeper also include the
experimental layers.
Each measured dimension gets a letter grade on the 0 to 100 scale, from A+ at 97 down to D- at 60, and F below 60.
Usage
plugin-eval score ./path/to/skill --depth quick # static lint only
plugin-eval score ./path/to/skill # static and judge
plugin-eval certify ./path/to/skill # deep depth
plugin-eval compare ./skill-a ./skill-b # quick depth by default
plugin-eval score ./path/to/skill --depth quick --output json --threshold 70At standard depth or deeper, score, certify, and compare print a note on stderr that the
judge and Monte Carlo layers are experimental. For a plugin directory, the CLI prints a warning
that only the static layer runs instead. With --threshold, the command exits with code 1 when the
composite is below the value. plugin-eval init writes a corpus index, but no other command
reads it.
Examples
An abridged example of the JSON output follows. Scripts can read composite.score from it:
{
"layers": [{"layer": "static", "score": 0.75, "sub_scores": {}, "anti_patterns": []}],
"composite": {"score": 76.9, "ci_lower": null, "ci_upper": null, "badge": "silver",
"confidence_label": "Estimated", "dimensions": []},
"elo": null
}Troubleshooting
When a score drops after you add content, check
layers[0].anti_patternsin the JSON.If
triggering_accuracyis low at quick depth, add a trigger phrase such as "Use this skill when" to the description, followed by several comma-separated contexts.Judge scores change between runs, because the model writes new test prompts and tasks each time. Use the static layer for comparisons you want to repeat.
If stderr says the judge could not measure some dimensions, install the LLM extra with
uv sync --extra llm.
Related
The eval-judge agent scores the four judge dimensions inside Claude Code, and the
eval-orchestrator agent runs the CLI and merges the results.
Files
- ATTRIBUTION.mdAdded by AutoGineer885 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md7.7 KiB
- references/improving-scores.md5.5 KiB
- references/rubrics.md22.2 KiB
references/improving-scores.md
Improving a PluginEval score
Start with the static layer, because it's the only layer that gives the same result on every run. Each section below names what the code checks and how to change the result. The judge and Monte Carlo layers are experimental, so a change that moves only their scores may not reflect a real change in quality.
Anti-pattern flags
Each flag cuts the composite score by 5%, down to a floor of 50%.
| Flag | What triggers it | Fix |
|---|---|---|
OVER_CONSTRAINED | More than 15 uses of the uppercase words MUST, ALWAYS, or NEVER in SKILL.md | Keep hard rules for safety and correctness, and explain the reason for the rest. |
EMPTY_DESCRIPTION | A description shorter than 20 characters | Write a longer description that includes a trigger phrase. |
MISSING_TRIGGER | No trigger phrase, such as "Use when", "Use this skill when", "Use proactively", or "Trigger when", in the description | Add "Use this skill when" followed by specific contexts. |
BLOATED_SKILL | More than 800 lines and no references/ directory | Move long tables, examples, and background into references/, and link to them from SKILL.md. |
ORPHAN_REFERENCE | A link from SKILL.md into references/ that points at a missing file | Create the file or remove the link. |
DEAD_CROSS_REF | Text in SKILL.md that looks like a skill path, such as skills/<name>, and doesn't resolve | Fix the path or reword the text. |
Skills with disable-model-invocation: true or a paths: glob in the frontmatter are exempt from
MISSING_TRIGGER. The DEAD_CROSS_REF check matches plain prose too, so a phrase like
"skills/agents" counts as a path.
Harness portability findings
Portability findings lower the harness_portability sub-score, which is 1.0 minus the sum of
their severities. The report doesn't list the findings, so compare the sub-score in the JSON
output.
| Finding | Severity | What triggers it |
|---|---|---|
SKILL_OVER_CODEX_CAP | 0.15 | The SKILL.md file is over 8 KB and the skill has no references/ directory. |
CLAUDE_TOOL_REFS | 0.02 for each tool, up to 0.10 | A backticked tool name used as a tool, such as "use Bash" or "the Read tool". |
CLAUDE_TOOL_PROSE | 0.05 | A phrase such as "the Read tool". |
To fix either tool finding, name the action instead of the tool, e.g., "open the file" or "run the shell command". The code also has checks for agent files, but no score uses them.
Tips for each dimension
Work on the dimensions with the largest weight first, because they move the composite the most. At quick depth only the static checks count, so each tip names the static check it affects.
triggering_accuracy (weight 0.25)
The static part of this dimension is frontmatter_quality. It rewards a description of at least
100 characters, a trigger phrase, the word "proactively", and three or more comma-separated
contexts that start with words such as "when" or "for". Write "Use this skill when" followed by
specific contexts, and then check by hand that the description wouldn't match unrelated requests.
orchestration_fitness (weight 0.20)
The static part is orchestration_wiring. It starts at 0.70 and adds points when SKILL.md
describes an output format, describes its inputs, and has at least two code blocks. It subtracts
0.15 when the text uses a word that starts with "orchestrat", "coordinat", or "dispatch".
Describe what the skill receives and what it returns.
output_quality (weight 0.15) and scope_calibration (weight 0.12)
Only the experimental layers score these dimensions, so a quick-depth score ignores them. The anchors in rubrics.md describe what a high score should mean, and the judge doesn't load them.
progressive_disclosure (weight 0.10)
The check scores the line count of SKILL.md as follows:
0.60 for 200 to 600 lines
0.50 for 100 to 199 lines
0.40 for 601 to 800 lines
0.20 for fewer than 100 lines, and 0.15 for more than 800
Any file in references/ adds 0.15, or 0.25 when SKILL.md is over 400 lines. Any file in
assets/ adds another 0.15.
token_efficiency (weight 0.06)
The check subtracts points when MUST, NEVER, and ALWAYS appear more than once per 10 lines, and when lines repeat. Remove repeated lines, and explain rules instead of adding more hard rules.
structural_completeness (weight 0.03)
The check rewards six or more H2 and H3 headings, five or more code blocks, and code in three or more languages. It also rewards a markdown table and sections whose headings start with "Example", "Usage", or "Troubleshooting".
ecosystem_coherence (weight 0.02)
The check starts at 0.50 and adds up to 0.25 for skill paths. It adds another 0.25 when the text
says "related", "see also", "companion", or "complement". Make sure any skill path resolves,
because a path that doesn't resolve also raises DEAD_CROSS_REF.
robustness (weight 0.05) and code_template_quality (weight 0.02)
Only the Monte Carlo layer scores robustness, as 1 minus its failure rate. No layer scores
code_template_quality, so it never counts.
Troubleshooting
When the composite drops after an edit, look for new flags in
layers[0].anti_patterns.compareruns at quick depth by default. A rewrite that moves content toreferences/can score lower there, because a shorter SKILL.md can loseprogressive_disclosureandstructural_completenesspoints.Judge scores change between runs, because the model writes new test prompts and tasks each time. Compare static scores when you need a result you can repeat.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Seth Hobson
- Publisher
- Seth Hobson (Community)
- Source
- wshobson/agents · plugins/plugin-eval/skills/evaluation-methodology · commit 4bde316
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Seth Hobson or Seth Hobson.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download evaluation-methodology.zip