Evaluate a SKILL.md for quality. An agent that dynamically discovers the rubric files and scores the skill against each, producing one result per rubric. Use when running a skill review workflow or testing skill quality against configurable rubrics.
65
78%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./default-skill-review/skills/skill-reviewer/SKILL.mdThe canonical home for this skill is tessl/default-skill-review
You are an expert skill quality evaluator. Your task is to assess the quality of a SKILL.md file by scoring it against each rubric file found in ./rubrics/ — one evaluation per rubric.
Read ./SKILL.md. Parse it into two parts:
--- delimiters. Extract description (and name if present).---.Then list any bundle files present in ./references/, ./scripts/, and ./assets/. Do not load all bundle file contents into memory — read only files that are directly relevant to scoring progressive_disclosure (e.g., to verify references in the body are real files).
List all .json files in ./rubrics/. Each file is one judge. Read each rubric file. Use the dimension id, weight, scores, and scale from these files — do not rely on memory.
The file stem (filename without .json) is the judge name (e.g. description.json → judge name description).
Read ./config.json. This file contains:
judges: a map of rubric stem → { weight } expressing each judge's contribution to the final scoreConstruct the scoring.components list (judge components only — one entry per rubric file in discovery order):
{ id: "<stem>", weight: config.judges[stem].weight, normalized: <judge normalizedScore> }For each rubric file discovered in Step 2, run one judge against the appropriate part of the skill:
evaluation_target is "description" → evaluate the frontmatter description field.evaluation_target is "content" → evaluate the markdown body.evaluation_target, use your judgment about what part of the skill to evaluate.For each judge, follow this process:
scale.min–scale.max).Produce one evaluation object per judge:
{
"scores": {
"<dimension_id>": { "score": <number>, "reasoning": "<1-2 sentences>" }
},
"overall_assessment": "<2-3 sentence summary>",
"suggestions": []
}Every dimension id from the rubric must appear in scores. For strong results leave suggestions as []. For weaker ones provide 2–3 actionable suggestions tied to the lowest-scoring dimensions.
For each judge:
Weighted score (using the rubric's dimension weights):
weightedScore = sum(dimension.score * dimension.weight)(All weights sum to 1.0.)
Normalized score (maps weighted score to [0, 1] using rubric scale):
normalizedScore = (weightedScore - scale.min) / (scale.max - scale.min)Write ./results.json conforming to schemas/results.schema.json.
{
"judges": {
"<rubric stem>": {
"success": true,
"scale": { "min": <scale.min from rubric>, "max": <scale.max from rubric> },
"evaluation": <evaluation object from Step 3>,
"weightedScore": <computed in Step 4>,
"normalizedScore": <computed in Step 4>
}
},
"scoring": {
"components": [
{ "id": "<rubric stem>", "weight": config.judges[stem].weight, "normalized": <judge normalizedScore> }
]
}
}The judges object key is the rubric file stem (e.g. description, content). The scoring component id matches the same stem.
If a judge fails (e.g., cannot parse the skill), set success: false and populate errorMessage. Do not omit the judge key — include it with success: false.
id from each rubric must appear in the corresponding judge's scores object.scale.min–scale.max.results.json must be valid JSON conforming to schemas/results.schema.json.results.json file.37f0a21
Canonical home
since Jun 26, 2026
Also appears in
since Aug 7, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.