evaluation-methodology

PluginEval quality methodology — dimensions, rubrics, statistical methods, and scoring formulas. Use this skill when understanding how plugin quality is measured, when interpreting a low score on a specific dimension, when deciding how to improve a skill's triggering accuracy or orchestration fitnes

By wshobson · 6,011 installs

npx skills add wshobson/agents --skill evaluation-methodology

Source repository · Upstream listing

Evaluation Methodology This document is the authoritative reference for how PluginEval measures plugin and skill quality. It covers the three evaluation layers, all ten scoring dimensions, the composite formula, badge thresholds, anti pattern flags, Elo ranking, and actionable improvement tips. Related: [Full rubric anchors](references/rubrics.md) The Three Evaluation Layers PluginEval stacks three complementary layers. Each layer produces a score between 0.0 and 1.0 for each applicable dimension, and later layers override or blend with earlier ones according to per dimension blend weights. Layer 1 — Static Analysis Speed: < 2 seconds. No LLM calls. Deterministic. The static analyzer ( layers/static.py ) runs six sub checks directly against the parsed SKILL.md: Sub check What it measures frontmatter quality Name presence, description length, trigger phrase quality orchestration wiring Output/input documentation, code block count, orchestrator anti pattern progressive disclosure Line count vs. sweet spot (200–600 lines), references/ and assets/ bonuses structural completeness Heading density, code blocks, examples section, troubleshooting section token efficiency MUST/NEVER/ALWAYS density, duplicate line repetition ratio ecosystem coherence Cross references to other skills/agents, "related"/"see also" mentions These six sub checks feed directly into six of the ten final dimensions (via STATIC TO DIMENSION mapping). The remaining four dimensions — output quality , scope calibration , robustness , and part of triggering accuracy — receive no static contribution and rely entirely on Layer 2 and/or Layer 3. Anti pattern penalty is applied multiplicatively to the Layer 1 score: Each additional detected anti pattern reduces the score by 5%, flooring at 50%. Layer 2 — LLM Judge Speed: 30–90 seconds. One or more LLM calls (Sonnet by default). Non deterministic. The eval judge agent reads the SKILL.md and any references/ files, then scores four dimensions using anchored rubrics (see [references/rubrics.md](references/rubrics.md)): 1. Triggering accuracy — F1 score derived from 10 mental test prompts 2. Orchestration fitness — Worker purity assessment (0–1 rubric) 3. Output quality — Simulates 3 realistic tasks; assesses instruction quality 4. Scope calibration — Judges depth and breadth relative to the skill's category The judge returns a structured JSON object (no markdown fences) that the eval engine merges into the composite. When judges 1 , scores are averaged and Cohen's kappa is reported as an inter judge agreement metric. Layer 3 — Monte Carlo Simulation Speed: 5–20 minutes. N=50 simulated Agent SDK invocations (default). Statistical. Monte Carlo runs N real prompts through the skill and records: Activation rate — Fraction of prompts that triggered the skill Output consistency — Coefficient of variation (CV) across quality scores Failure rate — Error/crash fraction with Clopper Pearson exact CIs Token efficiency — Median token count, IQR, outlier count The Layer 3 composite formula: where efficiency norm = max(0, 1 − median tokens / 8000) . Composite Scoring Formula The final score is a weighted blend across all three layers for each dimension, then summed: Dimension Weights Dimension Weight Why it matters triggering accuracy 0.25 A skill that never fires — or fires incorrectly — has no value orchestration fitness 0.20 Skills must be pure workers; supervisor logic belongs in agents output quality 0.15 Correct, complete output is the primary deliverable scope calibration 0.12 Neither a stub nor a bloated monster progressive disclosure 0.10 SKILL.md is lean; detail lives in references/ token efficiency 0.06 Minimal context waste per invocation robustness 0.05 Handles edge cases without crashing structural completeness 0.03 Correct sections in the right order code template quality 0.02 Working, copy paste ready examples ecosystem coherence 0.02 Cross references; no duplication with siblings Layer Blend Weights Each dimension draws from different layers at different ratios. With all three layers active ( depth deep or certify ): Dimension Static Judge Monte Carlo triggering accuracy 0.15 0.25 0.60 orchestration fitness 0.10 0.70 0.20 output quality 0.00 0.40 0.60 scope calibration 0.30 0.55 0.15 progressive disclosure 0.80 0.20 0.00 token efficiency 0.40 0.10 0.50 robustness 0.00 0.20 0.80 structural completeness 0.90 0.10 0.00 code template quality 0.30 0.70 0.00 ecosystem coherence 0.85 0.15 0.00 At depth standard (static + judge only), blends are renormalized to drop the Monte Carlo column. At depth quick (static only), all weight falls on Layer 1. Blended Score Calculation For a given depth, the blended score for dimension d is: This normalization ensures that skipping Monte Carlo at standard depth doesn't artificially deflate scores. Interpreting Dimension Scores Each dimension score is a float in [0.0, 1.0] . The CLI converts it to a letter grade: Grade Score range Meaning A 0.90 – 1.00 Excellent — no meaningful improvement needed B 0.80 – 0.89 Good — minor gaps only C 0.70 – 0.79 Adequate — one or two clear improvement areas D 0.60 – 0.69 Marginal — needs targeted work F < 0.60 Failing — significant remediation required When reading a report, focus first on the lowest graded dimension that has the highest weight. A D in triggering accuracy (weight 0.25) costs far more than a D in ecosystem coherence (weight 0.02). Confidence intervals appear in the report when Layer 2 or Layer 3 ran. Narrow CIs (± < 5 points) indicate stable scores. Wide CIs suggest inconsistency — often caused by an ambiguous description or instructions that work for some prompt styles but not others. Quality Badges Badges require both a composite score threshold AND an Elo threshold (when Elo is available). The Badge.from scores() logic checks composite first, then Elo if provided: Badge Composite Elo Meaning Platinum ★★★★★ ≥ 90 ≥ 1600 Reference quality — suitable for gold corpus Gold ★★★★ ≥ 80 ≥ 1500 Production ready Silver ★★★ ≥ 70 ≥ 1400 Functional, has improvement opportunities Bronze ★★ ≥ 60 ≥ 1300 Minimum viable — not yet recommended for users — < 60 any Does not meet minimum bar The Elo threshold is skipped when Elo has not been computed (i.e., at quick or standard depth without certify ). A skill can earn a badge on composite score alone in those cases. Anti Pattern Flags The static analyzer detects five anti patterns. Each carries a severity multiplier that feeds into the penalty formula. OVER CONSTRAINED Trigger: More than 15 occurrences of MUST, ALWAYS, or NEVER in the SKILL.md. Problem: Overly prescriptive instructions reduce model flexibility, increase token overhead, and signal that the author is trying to micromanage every output rather than providing principled guidance. Fix: Audit every MUST/ALWAYS/NEVER. Replace directive language with explanatory framing where possible. Reserve hard constraints for genuine safety or correctness requirements. Target fewer than 10 such directives per 100 lines. EMPTY DESCRIPTION Trigger: The frontmatter description field is fewer than 20 characters after stripping. Problem: Without a meaningful description, the Claude Code plugin system cannot determine when to invoke the skill. The skill becomes invisible to autonomous invocation. Fix: Write a description of at least 60–120 characters that includes: A "Use this skill when..." or "Use when..." trigger clause Two or more concrete contexts separated by commas or "or" MISSING TRIGGER Trigger: The description does not contain "use when", "use this skill when", "use proactively", or "trigger when" (case insensitive). Problem: Even a long description is useless for autonomous invocation if it doesn't include a clear trigger signal. The system's routing model needs an explicit cue. Fix: Prepend "Use this skill when..." to the description, followed by specific scenarios. Example: "Use this skill when measuring plugin quality, interpreting score reports, or explaining badge thresholds to a team." BLOATED SKILL Trigger: SKILL.md exceeds 800 lines AND the skill has no references/ directory. Problem: A monolithic SKILL.md forces the entire document into context on every invocation, wasting tokens on content only needed in edge cases. Fix: Create a references/ directory and move supporting material there: Detailed rubrics → references/rubrics.md Extended examples → references/examples.md Configuration reference → references/config.md The SKILL.md should link to these files with [text](references/filename.md) so the model can fetch them on demand. ORPHAN REFERENCE Trigger: SKILL.md contains a markdown link [text](references/filename) where filename does not exist in the references/ directory. Problem: Dead links waste tokens on context that will never resolve and confuse the model. Fix: Either create the missing reference file or remove the dead link. DEAD CROSS REF Trigger: SKILL.md references another skill or agent by relative path and that path cannot be resolved from the skills/ directory. Problem: Broken ecosystem links undermine the plugin's coherence score and may cause the model to attempt navigation to non existent files. Fix: Verify the referenced skill exists. Update the path or remove the reference. Elo Ranking PluginEval uses an Elo/Bradley Terry rating system to rank a skill against the gold corpus. Starting rating: 1500 (the corpus median by convention). K factor: 32 (standard for moderate stakes ratings). Expected score formula (standard Elo): Rating update after each matchup: where actual score is 1.0 for a win, 0.5 for a draw, 0.0 for a loss. Confidence intervals are computed via 500 sample bootstrap, reported as 95% CI. Corpus percentile reflects pairwise win rate against the gold corpus. Position bias check: Pairs are evaluated in both orders; disagreements are flagged. The plugin eval init command builds the corpus index from a plugins directory: CLI Reference Score a skill (quick static analysis only) Returns Layer 1 results in < 2 seconds. Useful for fast feedback during authoring. Score with LLM judge (default) Runs static + LLM judge (standard depth). Takes 30–90 seconds. Score with full output as JSON Emits structured JSON including composite.score , composite.dimensions , and layers[0].anti patterns . Suitable for CI integration: Full certification (all three layers + Elo) Runs static + LLM judge + Monte Carlo (50 simulations) + Elo ranking. Takes 15–20 minutes. Assigns a quality badge. Use before publishing a skill to the marketplace. Head to head comparison Evaluates both skills at quick depth and prints a dimension by dimension comparison table. Useful for deciding between two implementations or measuring improvement before/after a rewrite. Initialize corpus for Elo Builds the local corpus index at ~/.plugineval/corpus . Required before Elo ranking works. Scripting the Composite Formula Reproduce the composite score offline (pre commit hook, CI gate): JSON Output Format Top level shape of output json : Parse composite.score in CI to gate deployments: Tips for Improving a Skill's Score Work through dimensions in weight order. The largest gains come from fixing the top weighted dimensions first. Whic