--- name: nemotron-add-pattern description: Add a cross-cutting decision pattern under src/nemotron/steps/patterns/. Use when a recurring ML decision (tokenizer lock, eval bookends, LoRA-on-small-data, etc.) must be encoded so other skills can fire it during planning. --- # nemotron-add-pattern Invocation: `/nemotron-add-pattern`. You help contributors add a new cross-cutting pattern to `src/nemotron/steps/patterns/` without getting the frontmatter, scope, catalog regeneration, or tests wrong. ## Tone Concise. Checklist-first. Ask for missing facts before writing files. - Status updates: ≤2 lines - Prefer bullets over long prose - Say exactly which pattern file you will create and which commands you will run - Do not guess step ids or confidence level - Keep the recommendation actionable, not academic - Always regenerate `PATTERNS.md` and run tests --- ## Workflow Four phases. Always in this order. ### 1. Orient Read these first: - `src/nemotron/steps/patterns/sft-small-dataset-prefer-lora.md` - `src/nemotron/steps/PATTERNS.md` - `src/nemotron/steps/index.py` - `tests/steps/test_patterns.py` Then ask the contributor: 1. What is the pattern about? (one sentence) 2. When should it apply? (natural-language triggers) 3. Which steps does it touch? (step ids, or `[]` for global) 4. What is the confidence level? (`high`, `medium`, or `experimental`) 5. Does it introduce a new concept or just encode existing tribal knowledge? Use these repo conventions: - Pattern files live at `src/nemotron/steps/patterns/{id}.md`. - The filename stem must match the frontmatter `id`. - Required frontmatter fields are `id`, `title`, `tags`, `triggers`, `steps`, and `confidence`. - `steps: []` is valid for a global pattern. - Valid confidence values are `high`, `medium`, and `experimental`. - The body uses these sections: `## When to apply`, `## What to do`, `## Exceptions`, `## References`. - Step-strategy cross-links in `step.toml` are a separate task. Do not edit them here. ### 2. Generate Create: - `src/nemotron/steps/patterns/{id}.md` The pattern file must contain: - YAML frontmatter with `id`, `title`, `tags`, `triggers`, `steps`, `confidence` - `## When to apply` - `## What to do` - `## Exceptions` - `## References` Generation rules: 1. Keep the pattern id kebab-case and make it match the filename exactly. 2. Turn vague triggers into 2–4 concrete, observable conditions. 3. Scope the pattern honestly: use explicit step ids if it only applies to a subset of steps; use `[]` only when it is truly global. 4. Put the recommendation itself in `What to do`; keep background explanation shorter than the action guidance. 5. If the pattern introduces a new concept, define it in the first paragraph of `When to apply`. 6. Do not modify existing patterns. 7. Regenerate the catalog with: - `uv run python src/nemotron/steps/index.py` 8. Run validations with: - `uv run pytest tests/steps -q` ### 3. Validate Check all of these before finishing: - Frontmatter has all required fields - The pattern id matches the filename - `steps` contains only valid step ids - `confidence` is one of `high`, `medium`, `experimental` - `src/nemotron/steps/PATTERNS.md` is updated - `uv run pytest tests/steps -q` passes If validation fails: 1. Fix the real frontmatter, scope, or catalog issue 2. Re-run the failing command 3. Do not present the result until tests pass ### 4. Summarize Show: - What pattern was created - The file added - The final scope (`steps` list or global) - The confidence level - That `PATTERNS.md` was regenerated - That `uv run pytest tests/steps -q` passed --- ## Boundaries ### Do - Reuse the live pattern format from `small-dataset-lora.md` - Keep triggers concrete - Keep advice prescriptive and easy to apply - Regenerate `PATTERNS.md` - Run tests every time ### Don’t - Don’t modify existing patterns - Don’t modify `step.toml` strategy blocks here - Don’t invent step ids - Don’t label a new idea `high` confidence without evidence - Don’t stop before tests pass --- ## When Stuck - If the step scope is unclear, look at `src/nemotron/steps/STEPS.md` and ask which ids the contributor actually wants. - If the trigger is vague, rewrite it as an observable condition before writing the file. - If the concept is still experimental, mark it `experimental` rather than overstating certainty. - If the pattern overlaps an existing one, explain the overlap and ask whether this should be a separate pattern. - After two failed validation loops, stop and report the exact failing command and error. --- ## Calibration Examples ### Example 1 — simple high-confidence pattern User: > Add a pattern saying we should use a consistent random seed across stages. Assistant: > I’ll confirm whether this is global or limited to a few steps, then I’ll create `src/nemotron/steps/patterns/consistent-random-seed.md` with the required frontmatter and the four body sections. > > I’ll mark it `high` confidence only if the guidance is already established team practice, regenerate `PATTERNS.md` with `uv run python src/nemotron/steps/index.py`, and run `uv run pytest tests/steps -q` before I finish. ### Example 2 — experimental step-scoped pattern User: > Add a pattern for code-generation SFT that uses a higher learning rate. Assistant: > I’ll confirm the exact step ids and keep the scope narrow, for example `sft/automodel` and `sft/megatron_bridge` if that is what you intend. > > Because this is a newer idea rather than settled guidance, I’ll label it `experimental`, encode the trigger conditions in frontmatter, create the new pattern markdown file, regenerate `PATTERNS.md`, and run `uv run pytest tests/steps -q`.