An Agent Skill that builds a skill with evals out of the conversation in which the agent finally got it right.
100%
Does it follow best practices?
Impact
100%
3.84xAverage score across 3 eval scenarios
Passed
No findings from the security scan
Editing evals/, evals-reference/, evals-regression/, scoring rules, or any claim about how
much the skill helps.
task.md. Write the message a user would send about their own code:
one or two sentences naming the file and the change. Never the diagnosis, the convention, the
shape of the answer, or the quality the habit delivers, and nothing a user would not type, such
as a list of requirements or of files to write.criteria.json to make a run pass. If a criterion is unfair (it asks for something
the task never required, or rejects a correct answer), fix it as its own fix(evals) commit
with the reason, then rerun both variants.scripts/local_screen.sh is a local screening result (Local
screening): it decides placement and guides tuning, and is recorded as
local with its run count and range, never presented as a hosted result.task.md is the user's message. It asks for a named file such as settings.py or
review.md, or names the files it works on.
Code the task works on ships as files, never pasted into task.md: a folder beside
task.md, here project/, declared in scenario.json as a directory fixture:
{"fixtures": {"project": {"type": "directory", "path": "./project", "installPath": "shop"}}}Tessl copies project/ into shop/ in the working directory, so task.md names files as
shop/.... Add a setup.sh when the task needs git history; Tessl runs it in the working
directory after installing the fixture. It uploads only the declared files, so setup.sh
writes any later version of a file itself instead of copying it from the scenario folder.
The project's own files (pyproject.toml, pom.xml, tsconfig.json) set the version. A
task that ships nothing needs an Assume sentence (Assume Python 3.12.), which the
validator checks; a scenario.json with only a description ships nothing.
capability.txt is one line naming the capability under test.
criteria.json is a Tessl weighted_checklist: context, type, and checklist items with
name, description, and max_score. Nothing else, so tessl eval lint stays clean.
criteria-meta.json holds this repository's metadata (invocation, task_type,
evidence_type) and a categories map from each checklist name to safety, quality, or
maintainability.
invocation is natural when the prompt never names the skill and explicit when it says
Use $my-skill. Report the two separately; only natural scenarios show that the description
triggers the skill. The validator does not require a mix, because an explicit-only skill can
have no natural scenarios.task.md, the context of criteria.json, or the name or description of a check: "skill
bundle", "the skill's", "as the skill says", "from the skill", or "bundled". The validator
reads nothing else, so criteria-meta.json and capability.txt never trigger it. It then
requires evidence_type: skill_context_dependent in evals-regression/. If the scenario does
not need the skill's text, reword the phrase instead of moving it.evals/ is the main suite and the only source of lift claims. Run it with both variants.
evals-reference/ holds candidates and broad coverage. Run it with both variants.
evals-regression/ holds scenarios both variants already solve, plus scenarios that need text
only the skill contains. Run it with the skill only.
evidence_type says why a scenario sits where it does: ordinary_lift, focused_main,
focused_reference, solved_regression, or skill_context_dependent. The validator enforces
which suite each value may live in.
New scenarios start in evals-reference/. A scenario starts in evals-regression/ only when
it needs text that exists only in the skill; a reference scenario moves there once it scores 100
both with and without the skill. Classify each one from an isolated run:
tessl eval view <run-id> --json > /var/tmp/eval-run.json
python3 scripts/classify_eval_result.py /var/tmp/eval-run.json --scenario-dir <scenario-dir>Promotion to evals/ needs 100 with the skill and a delta of at least 30 percentage points.
The Tessl registry gives a full aggregate score only with three or more scenarios in evals/,
so keep at least three there.
Move the folder rather than copy it: a main task that shares 85% or more of its eight-word runs
with a reference or regression task fails the validator as a duplicate.
NUMBERING.md has the full rule and the numbering scheme.
skills/my-skill/references/: no scenario names, expected outputs, rubrics,
run IDs, or scores.resources/,
setup scripts), is not ordinary lift. The validator flags it; move the reference example to
another domain, or classify the scenario as focused evidence with a written
runtime_reference_overlap_rationale..tessl-plugin
skills
build-a-skill
assets
template
.tessl-plugin
evals
01-settings-loader-errors
evals-reference
01-webhook-error-review
evals-regression
02-hard-stop-audit
scripts
skills
my-skill
references