Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Add a new step under src/nemotron/steps/<category>/<step_id>/ — manifest (step.toml), runner glue, configs, and per-step README.md. Use when extending the catalog so /nemotron-customize can route to it.
.claude/skills/nemotron-add-step/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | — | — |
| case-23 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-08 | ✗→✓ | ▲ Improved | — | — |
| case-21 | ✗→✓ | ▲ Improved | — | — |
Invocation: /nemotron-add-step.
You help contributors add a new step to the nemotron-customize step library without getting the manifest schema, starter configs, or validation flow wrong.
Concise. Checklist-first. Ask for missing facts before writing files.
Example — simple step:
user: Add a new eval backend for a NeMo Evaluator workflow.
assistant: I need six inputs before I write files:
1. One-sentence purpose
2. Category
3. Stack library
4. Consumed artifact types
5. Produced artifact types
6. The library example or script to reference
Then I'll create the step directory, write step.toml + starter configs, add step.py only if the library lacks a good standalone example, regenerate STEPS.md, and run `uv run pytest tests/steps -q`.Example — new artifact type:
user: Add an sdg step that produces preference-pair JSONL.
assistant: `preference_jsonl` is not in `src/nemotron/steps/types.toml`.
I'll first confirm no existing type fits. If it really is new, I'll add a top-level type entry with `description` and the smallest correct `is_a` or `convert_to` relationship, then wire the new step to that type and run the step validations.Four phases. Always in this order.
Read these first:
src/nemotron/steps/types.tomlsrc/nemotron/steps/sft/megatron_bridge/step.tomlsrc/nemotron/steps/sft/megatron_bridge/step.pysrc/nemotron/steps/sft/guide.mdsrc/nemotron/steps/index.pyThen ask the contributor:
curate, sdg, translate, prep, pretrain, sft, peft, rl, optimize, eval, convert, benchmark)src/nemotron/steps/types.toml)Use these repo conventions:
sft/megatron_bridge and eval/model_eval.step.toml uses [step].id, name, category, description, and tags.[[strategies]] uses when / then / optional skill.[[errors]] uses name / recovery / optional skill.types.toml currently uses top-level artifact tables like [checkpoint_hf], not a nested [types.*] layout.step.py is optional. Only add it if the library does not already provide a good standalone reference.Create the step directory:
src/nemotron/steps/{category}/{step_name}/Create these files:
src/nemotron/steps/{category}/{step_name}/step.tomlsrc/nemotron/steps/{category}/{step_name}/config/default.yamlsrc/nemotron/steps/{category}/{step_name}/config/tiny.yamlsrc/nemotron/steps/{category}/{step_name}/step.py only if neededIf needed, also create:
src/nemotron/steps/{category}/guide.md if the category now has multiple steps and no guide exists yetsrc/nemotron/steps/types.toml if the step introduces a new artifact typeFor step.toml, include:
[step] identity (id, name, category, description, tags)[[consumes]][[produces]][[models]] when model choice matters[[parameters]] for top pipeline-shaping knobs only[[strategies]] with at least 2–3 useful recommendations[[errors]] with common failure modes[reference] pointing to real repo-relative library code/docsGeneration rules:
[reference] must resolve in this workspace; external library references should be stable upstream URLs.step.py, keep it thin and runnable. Include a PEP 723 # /// script header with [tool.runspec].step.py at 30 lines or less unless a slightly longer wrapper is unavoidable.config/default.yaml is the production starter config.config/tiny.yaml is the quick smoke config.types.toml:is_a for implicit compatibilityconvert_to only when an explicit converter step is requiredAlways run both commands after generation:
uv run python src/nemotron/steps/index.pyuv run pytest tests/steps -qIf either command fails:
Show:
step.py was created or intentionally omittedtypes.tomlsrc/nemotron/steps/STEPS.mdsft/megatron_bridgeguide.md is neededdefault.yaml and tiny.yaml starter configstypes.toml only when the step truly needs itskills/nemotron-customize/ (SKILL.md, act/*.md, examples/*.md, or context/*) unless the user explicitly asks for skill/context updates.step.toml[reference]step.py when a library example already does the jobtypes.toml entries.[reference].is_a relationship to an existing type is enough before inventing a totally separate branch.uv run pytest tests/steps -q fails, fix the manifest/type/reference issue before changing anything broader.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-25 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-27 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-28 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-26 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-24 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 28 cases were attempted, and 26 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +61 percentage points is the difference between those two pass rates over the 26 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.