Change NeMo Relay dynamic plugin loaders, manifests, native ABI, gRPC worker protocol, or Python worker SDK. Do not use for ordinary built-in plugin configuration.
Use this skill for plugin.kind = "rust_dynamic", plugin.kind = "worker",
nemo-relay-plugin, nemo-relay-worker, nemo-relay-worker-proto,
nemo-relay-types, and the Python nemo-relay-plugin package.
Rules
Keep the stable boundary explicit: native plugins cross a C ABI; worker
plugins cross grpc-v1.
Do not pass Rust runtime types, trait objects, futures, or allocator-owned
strings across the native dynamic-library boundary.
Typed native middleware futures run on the SDK-owned Tokio executor. Keep
subscribers synchronous and preserve raw synchronous ABI registrations.
Define closed worker transport structures in protobuf when generated clients
must enforce their fields. Keep open application payloads lossless by using
JsonValue or JsonEnvelope rather than google.protobuf.Value.
Keep relay-plugin.toml dynamic records separate from generic runtime
components. Enabled dynamic records may synthesize internal component specs;
disabled records stay inspectable but unloaded.
Relay 0.8 establishes the native API 1 and grpc-v1 canonical
ToolExecutionResult baseline. Require every dynamic plugin to rebuild and
declare a compat.relay range that excludes versions before 0.8. Recommend
>=0.8.0,<1.0; open-ended or narrower 0.8-or-newer ranges are valid.
Treat compat.relay as the plugin author's compatibility assertion, not
proof that an artifact was rebuilt. Do not add a legacy raw-result adapter.
Relay 0.8 retains the grpc-v1 identifier and
nemo.relay.worker.v1 package while changing the tool-result protobuf types;
every worker must regenerate its bindings and rebuild. Native ABI v4 permits
append-only host-table extensions guarded by struct_size; existing fields
must remain frozen at their original offsets. Incompatible native JSON,
reordered or replaced native fields, or incompatible worker protobuf changes
must bump native_api or worker_protocol.
Do not add tests under src; Rust tests belong in crate tests/ trees and
Python SDK tests belong under python/tests.
Native and worker plugins are trusted extensions. Document that native plugins
are in-process and unsandboxed; worker plugins provide process isolation but
not a security sandbox.
Native loader keeps libraries alive until registered callbacks are cleared
and deregisters plugin kinds before unload.
Worker activation covers process launch, token auth, handshake, validation,
declarative registration, proxy rollback, cancellation, and shutdown.
Rust and Python SDKs expose every supported registration surface.
Runtime helpers cover marks, scopes, continuations, and isolated scope
stacks.
plugins list, plugins inspect, and plugins validate report lifecycle
and compatibility status without leaking secret config.
Top-level doctor reports resolved dynamic plugin and host configuration
status.
When detailed dynamic plugin guides exist, they keep Rust native, Python
worker, and grpc-v1 protocol details on separate pages.
justfile, Codecov, and CI package/test workflows include new plugin
crates and packages.
Validation
Choose checks by the changed layer:
Manifest or shared types: test the owning Rust crate.
Native loader or ABI: prepare plugin fixtures and run the focused native
plugin integration test.
Worker protocol or host: test the worker crates and regenerate or test the
Python worker SDK only when its protocol surface changes.
Shared runtime behavior: run the Rust suite and only binding suites whose
observable plugin behavior changes.
Documentation or packaging: run their targeted checks only when changed.
Canonical surface suites prepare plugin fixtures. Before a raw focused native
or worker integration test, run just build-test-plugin-fixtures; never compile
fixtures inside an individual test case.
References
crates/core/src/plugin/dynamic/
crates/plugin
crates/worker
crates/worker-proto
crates/types
python/plugin
examples/rust-native-plugin
docs/build-plugins
examples/python-grpc-worker-plugin
1---2name: maintain-dynamic-plugins3description: Change NeMo Relay dynamic plugin loaders, manifests, native ABI, gRPC worker protocol, or Python worker SDK. Do not use for ordinary built-in plugin configuration.4license: Apache-2.05---67# Maintain Dynamic Plugins89Use this skill for `plugin.kind = "rust_dynamic"`, `plugin.kind = "worker"`,10`nemo-relay-plugin`, `nemo-relay-worker`, `nemo-relay-worker-proto`,11`nemo-relay-types`, and the Python `nemo-relay-plugin` package.1213## Rules1415- Keep the stable boundary explicit: native plugins cross a C ABI; worker16 plugins cross `grpc-v1`.17- Do not pass Rust runtime types, trait objects, futures, or allocator-owned18 strings across the native dynamic-library boundary.19- Typed native middleware futures run on the SDK-owned Tokio executor. Keep20 subscribers synchronous and preserve raw synchronous ABI registrations.21- Define closed worker transport structures in protobuf when generated clients22 must enforce their fields. Keep open application payloads lossless by using23 `JsonValue` or `JsonEnvelope` rather than `google.protobuf.Value`.24- Keep `relay-plugin.toml` dynamic records separate from generic runtime25 components. Enabled dynamic records may synthesize internal component specs;26 disabled records stay inspectable but unloaded.27- Relay 0.8 establishes the native API 1 and `grpc-v1` canonical28 `ToolExecutionResult` baseline. Require every dynamic plugin to rebuild and29 declare a `compat.relay` range that excludes versions before 0.8. Recommend30 `>=0.8.0,<1.0`; open-ended or narrower 0.8-or-newer ranges are valid.31- Treat `compat.relay` as the plugin author's compatibility assertion, not32 proof that an artifact was rebuilt. Do not add a legacy raw-result adapter.33- Relay 0.8 retains the `grpc-v1` identifier and34 `nemo.relay.worker.v1` package while changing the tool-result protobuf types;35 every worker must regenerate its bindings and rebuild. Native ABI v4 permits36 append-only host-table extensions guarded by `struct_size`; existing fields37 must remain frozen at their original offsets. Incompatible native JSON,38 reordered or replaced native fields, or incompatible worker protobuf changes39 must bump `native_api` or `worker_protocol`.40- Do not add tests under `src`; Rust tests belong in crate `tests/` trees and41 Python SDK tests belong under `python/tests`.42- Native and worker plugins are trusted extensions. Document that native plugins43 are in-process and unsandboxed; worker plugins provide process isolation but44 not a security sandbox.4546## Checklist4748- [ ] Manifest validation covers kind, compatibility, load contract, integrity,49 capability mismatch, and disabled-plugin behavior.50- [ ] Native loader keeps libraries alive until registered callbacks are cleared51 and deregisters plugin kinds before unload.52- [ ] Worker activation covers process launch, token auth, handshake, validation,53 declarative registration, proxy rollback, cancellation, and shutdown.54- [ ] Rust and Python SDKs expose every supported registration surface.55- [ ] Runtime helpers cover marks, scopes, continuations, and isolated scope56 stacks.57- [ ] `plugins list`, `plugins inspect`, and `plugins validate` report lifecycle58 and compatibility status without leaking secret config.59- [ ] Top-level `doctor` reports resolved dynamic plugin and host configuration60 status.61- [ ] When detailed dynamic plugin guides exist, they keep Rust native, Python62 worker, and `grpc-v1` protocol details on separate pages.63- [ ] `justfile`, Codecov, and CI package/test workflows include new plugin64 crates and packages.6566## Validation6768Choose checks by the changed layer:6970- Manifest or shared types: test the owning Rust crate.71- Native loader or ABI: prepare plugin fixtures and run the focused native72 plugin integration test.73- Worker protocol or host: test the worker crates and regenerate or test the74 Python worker SDK only when its protocol surface changes.75- Shared runtime behavior: run the Rust suite and only binding suites whose76 observable plugin behavior changes.77- Documentation or packaging: run their targeted checks only when changed.7879Canonical surface suites prepare plugin fixtures. Before a raw focused native80or worker integration test, run `just build-test-plugin-fixtures`; never compile81fixtures inside an individual test case.8283## References8485- `crates/core/src/plugin/dynamic/`86- `crates/plugin`87- `crates/worker`88- `crates/worker-proto`89- `crates/types`90- `python/plugin`91- `examples/rust-native-plugin`92- `docs/build-plugins`93- `examples/python-grpc-worker-plugin`
Run npx skillmds@latest add nvidia/maintain-dynamic-plugins in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Change NeMo Relay dynamic plugin loaders, manifests, native ABI, gRPC worker protocol, or Python worker SDK. Do not use for ordinary built-in plugin configuration. It is listed under AI & ML on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free. This skill is licensed under Apache-2.
NVIDIA (@nvidia) published this skill. Their other Agent Skills are listed on their SkillMD profile.