Use when converting an existing benchmark, rubric, verifier, task YAML/JSON, or domain check into SkillEvaluator BYOG/BYOT custom evaluation.
npx skills add https://github.com/NVIDIA/SkillEvaluator --skill create-custom-grader
Convert team-owned benchmark definitions into runnable SkillEvaluator custom graders
and, when needed, native Harbor tasks.
Help an agent author valid SkillEvaluator BYOG/BYOT files from a user's
benchmark instead of leaving the user with empty grader templates.
Use this skill when the user wants to:
evals/grader.py or evals/grader.shtask.yaml, task.json, pytest checks, or shellverifiers into BYOG or BYOT
Do not use this skill for ordinary evals/evals.json authoring when no custom
grading logic is needed. Use the normal dataset authoring workflow for that.
evals/, benchmark prompts, fixtures, and any verifier code.default_plus_custom when custom metrics should complement default evaluator scoring.custom_only only when the user wants the custom grader to own pass/fail semantics.evals/grader.py or evals/grader.sh, then validate the Harbor contract.skillevaluator init-custom-grader <skill-dir> --language python --mode default_plus_custom
skillevaluator tier3 validate <skill-dir>
SKILL.md.skillevaluator.service credentials depending on the benchmark.
Choose one path before writing files:
| User need | Evaluator shape |
| --- | --- |
| Existing evals.json task plus extra domain checks | Top-level BYOG: evals/grader.py or evals/grader.sh |
| Existing benchmark prompt/rubric that can run in the generated workspace | Top-level BYOG plus evals/evals.json and evals/files/ |
| Benchmark owns task layout, setup, service lifecycle, or verifier harness | Native BYOT/BYOG: evals/harbor/<case>/... |
| User wants only custom reward/pass criteria | grading.mode: custom_only |
| User wants default evaluator dimensions plus custom metrics | grading.mode: default_plus_custom |
Default to default_plus_custom unless the user explicitly wants the custom
grader to replace the default evaluator metrics.
Read the target SKILL.md, existing evals/, benchmark prompts, fixtures,
rubric, reference solution, tags, and any expected trigger/non-trigger
metadata.
Use benchmark prompts or prompt variants as question entries. Use the
target skill as expected_skill. Put each case's required starter files
under evals/files/<case-id>/, and declare
files: ["evals/files/<case-id>"] on every corresponding eval entry. Do not
omit files in a multi-case dataset, because omission intentionally stages
the entire shared directory for legacy compatibility. Preserve
benchmark-specific rubric text in the entry only when the grader needs to
read it.
For generated tasks:
skillevaluator init-custom-grader <skill-dir> --language python --mode default_plus_custom
For shell checks:
skillevaluator init-custom-grader <skill-dir> --language shell --mode default_plus_custom
For native Harbor tasks:
skillevaluator init-harbor-task <skill-dir> --case-id <case-id> --with-config
The custom grader is real executable logic, not metadata. It must read
available evidence, compute numeric scores, and write the evaluator reward
contract.
skillevaluator validate <skill-dir> --harbor-contract
Fix missing files, invalid Python, missing reward output, and native Harbor
ID mismatches before evaluation.
Prefer a real with-skill/baseline run. If services, credentials, GPU, or
cost block full E2E, state exactly what was validated and what was not.
Python and shell graders run inside the Harbor verifier context. They may read:
/logs/agent/trajectory.json for agent actions and final answer evidence/tests/entry.json for the eval case metadata/workspace/input/ for the entry's declared committed fixtures fromevals/files/
/solution/ or other task outputs only when the task environment producesthem
They must write:
/logs/verifier/reward.json/logs/verifier/reward.txt with a numeric score from 0.0 to 1.0Use this reward shape:
{
"overall": 0.92,
"custom_metrics": {
"domain_repair": 1.0,
"domain_verification": 0.8
},
"details": {
"domain_repair": {
"score": 1.0,
"reason": "The solution repaired the required files."
}
}
}
In default_plus_custom, default evaluator scoring keeps its overall
authoritative and adds the grader's custom_metrics into reports. In
custom_only, the grader's overall is the pass/fail reward.
Never emit custom metric names that collide with reserved evaluator fields:
security, skill_execution, skill_efficiency, accuracy,
goal_accuracy, behavior_check, overall, details, metrics,
metric_set, or entry_id.
limits in details.
skill source files, reference fixtures, or grader templates.
0.0 through 1.0.exercise meaningfully different behavior.
expected_skill,expected_behavior, negative cases, or custom metrics that inspect
trajectory evidence.
For a benchmark task with task.yaml, code/, prompt variants, coverage, and a
rubric:
code/ into evals/files/<case-id>/.evals/evals.json entries from the prompt variants, andset files: ["evals/files/<case-id>"] on each corresponding entry.
expected_skill to the benchmark's target skill.evals/grader.py to inspect the agent trajectory and changedworkspace files.
rapids_diagnosis, rapids_requirements_repair,
rapids_repair_safety, and rapids_verification.
report both default evaluator metrics and custom metric deltas.
judgment still needs explicit observable proxies or a human-approved scoring
policy.
init-custom-grader creates scaffolding only; the agent must replace theplaceholder scoring logic.
the benchmark proven until an evaluation run has produced real rewards.
| Problem | Fix |
| --- | --- |
| evals/evals.json missing | Create entries from the benchmark prompt or run init-custom-grader to seed one. |
| Custom metrics do not appear | Ensure reward.json has numeric values under custom_metrics and no reserved-name collisions. |
| custom_only fails | Write numeric overall in reward.json or numeric reward.txt. |
| Grader scores copied fixtures | Restrict file searches to generated workspace/output paths, not the skill package or grader source. |
When finished, report:
Take nvidia/create-custom-grader from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.