validate-change
Choose and run the right NeMo Relay validation matrix for a change instead of using one fixed test list
npx skills add https://github.com/nvidia/nemo-relay --skill validate-changeValidate a Change
Companion Guidance
Use karpathy-guidelines alongside this skill for implementation or review
work. Keep changes scoped, surface assumptions, and define focused validation
before editing.
Use this skill to choose the smallest validation set that still covers the surfaces touched by a change.
Mandatory Rules
- Format changed files with the language-native formatter before the final lint/test pass.
- If any Rust code changed, always run
just test-rust. - If any Rust code changed, also run
cargo fmt --all. - If any Rust code changed, also run
cargo clippy --workspace --all-targets -- -D warnings. - If
crates/coreorcrates/adaptivechanged, run the full matrix across Rust, Python, Go, and Node.js. - If a language surface changed, always run that language's test target even when Rust core did not change.
- If dynamic plugin behavior changed, use
maintain-dynamic-pluginsand include the native SDK, worker protocol, Python SDK, docs, packaging, and Codecov surfaces in the validation plan. - If code changes alter APIs, bindings, commands, paths, packaging behavior, observability/adaptive semantics, or documented best practices, update any dependent maintainer or consumer skills in the same branch.
- During iteration, prefer
uv run pre-commit run --files <changed files...>. - Before review or handoff, run
uv run pre-commit run --all-files.
Start With The Change Shape
- Core runtime or shared semantics changed
Use
test-rust-core. This always includesjust test-rust,cargo fmt --all,cargo clippy --workspace --all-targets -- -D warnings, and the full matrix across Rust, Python, Go, and Node.js. - Python-only wrapper or binding change
Use
test-python-binding. - Go binding change
Use
test-go-binding. - Node.js binding change
Use
test-node-binding. - FFI surface change
Use
test-ffi-surface. - Framework integration change Run the relevant language test target and focused integration tests or smoke path.
- Dynamic plugin loader, SDK, or protocol change
Use
maintain-dynamic-plugins. Run the targeted plugin crates andjust test-python-pluginfirst, then escalate to the core validation matrix when runtime behavior orcrates/corechanged. - Docs-only change
Run targeted checks only if commands, package names, or examples changed.
Use
just docsfor docs-site builds andjust docs-linkcheckwhen links changed. The./scripts/build-docs.shwrapper remains available for compatibility.
Core Validation Matrix
just test-rust
just test-python
just test-go
just test-node
Common Targeted Commands
# Rust only
just build-rust
just test-rust
just ci=true test-rust
cargo fmt --all
cargo clippy --workspace --all-targets -- -D warnings
# Python
just build-python
just build-python-plugin
just test-python
just test-python-plugin
uv run ruff format python
uv run pytest -k "<pattern>"
# Go
just build-go
just test-go
cd go/nemo_relay && go fmt ./...
# Node
just build-node
just test-node
npm run format --workspace=nemo-relay-node
# Docs site
just docs
just docs-linkcheck
Layer-Specific Skills
test-rust-coretest-python-bindingtest-go-bindingtest-node-bindingtest-ffi-surfacemaintain-dynamic-plugins
Pre-commit Semantics
Use pre-commit in two modes:
- During iteration, run
uv run pre-commit run --files <changed files...>. - Before review or handoff, run
uv run pre-commit run --all-files.
Important: --files still triggers any matching hook whose files or types
selectors match the provided paths. Some hooks then ignore filenames and run a
whole-language or workspace-wide command because they are configured with
pass_filenames: false.
Examples from this repo:
- Matching Python files run Ruff on the selected files, and also trigger
ty check . ...for the Python project. - Matching Rust files trigger
cargo fmt --all --,cargo clippy --workspace --all-targets -- -D warnings, andcargo check --workspace --all-targets. - Matching Go files trigger
gofmton the selected files andgo vet ./.... - Matching docs markdown files under
README.md,CONTRIBUTING.md, ordocs/trigger the docs link checker. - Matching
Cargo.toml,Cargo.lock, ordeny.tomltriggerscargo deny check. - Matching
Cargo.lock,uv.lock, orpackage-lock.jsontriggers the attributions generators. - Matching Node.js public JS/TS surfaces can also trigger the public docstring checks, while matching Node.js JS/TS files trigger the prettier wrapper.
Hygiene Checks
Run these whenever the change is headed for review. Rust changes should still
run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings
even if you also plan to rely on pre-commit.
cargo fmt --all
cargo clippy --workspace --all-targets -- -D warnings
uv run pre-commit run --all-files
If the change is large or public-facing, also verify:
- README and docs entry points still match current package names and paths
- Examples still run with the documented commands
- Any renamed public surfaces are reflected consistently in manifests and docs
- Dynamic plugin examples use
compat.relay = ">=0.5,<1.0"unless deliberately narrower.
References
- Testing guide:
docs/contribute/testing-and-docs.mdx - Contributor guide:
CONTRIBUTING.md - Build and test dispatchers:
justfile