Use this skill when building or packaging reusable NeMo Relay runtime behavior as an embedded configuration component or a manifest-backed `rust_dynamic` native or `worker` gRPC plugin, with deterministic validation and rollback-safe registration.
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Use this skill when a user wants to package reusable NeMo Relay runtime behavior behind plugin configuration. Keep reusable plugin behavior separate from one-off application startup code.
Use this skill when the behavior should be activated by shared config and reused across applications, teams, or process startup paths.
Common cases:
kind and activation lifecycle.Do not build a plugin when a narrower NeMo Relay surface is enough:
nemo-relay-instrument-calls.nemo-relay-plugin-observability.Choose the delivery model before designing config or registration:
relay-plugin.toml manifest when the
plugin ships independently of the host. Use rust_dynamic for a trusted
in-process native Rust library, or worker for a local grpc-v1 worker.
Read the public native dynamic-plugin or gRPC worker guide before designing
the package boundary. Do not reproduce native ABI or worker-protocol details
from memory.Native plugins are trusted C-ABI extensions that run in the Relay process and are not sandboxed. Worker plugins provide process isolation, not a security sandbox.
kind string and receives component-local config
from a shared plugin document.PluginContext, such as subscribers, guardrails, request intercepts,
execution intercepts, or stream execution intercepts.PluginContext gives the plugin system enough ownership to qualify runtime
names and roll back partial setup when activation fails.kind and the smallest JSON-compatible config shape.PluginContext, not by hand-registering
global behavior inside application startup.nemo-relay plugins edit, declare the config_schema capability and
reference a local Draft 7 or Draft 2020-12 JSON Schema file from
[config_schema].path in relay-plugin.toml. Schema-less plugins remain
editable as raw JSON objects.The top-level plugin document contains version, components, and policy.
Each component supplies the plugin kind, enabled, and component-local
config:
{
"version": 1,
"components": [
{
"kind": "redaction-policy",
"enabled": true,
"config": {
"preset": "strict"
}
}
],
"policy": {
"unknown_component": "warn",
"unknown_field": "warn",
"unsupported_value": "error"
}
}Keep business logic in plugin code, not in config. Use references to secrets or endpoints rather than embedding sensitive values.
nemo_relay.pluginnemo-relay-node/pluginnemo_relay::pluginUse the same canonical snake_case config keys across bindings and files. Node
helper functions can be camelCase, but plugin config objects remain
snake_case.
Keep the manifest package contract separate from the operator's plugin document.
The manifest must declare the lane-specific kind and load contract, a normal
SemVer Relay compatibility range, artifact integrity, and only the capabilities
the plugin needs. Use a local config_schema only when structured CLI editing
is needed.
Choose the native callback model from the target Relay version; do not present the 0.8 SDK as source-compatible with 0.7:
compat.relay = ">=0.7,<0.8".compat.relay = ">=0.8.0,<1.0". The SDK runs typed middleware
on an SDK-owned Tokio executor; subscribers and raw synchronous ABI
registrations remain synchronous. Do not block executor workers. Scope context
does not automatically propagate to tasks created with tokio::spawn, and
teardown must stop new callbacks and drain accepted work before unload.The 0.8 typed SDK lets native components configure its executor with a positive
executor.worker_threads value. When their manifest exposes a
config_schema, include that SDK-owned object and field in the schema. For
native ABI details, callback settlement or cancellation, and the full worker
protocol, use the relevant public dynamic-plugin guide rather than expanding
this skill.
PluginContext
should own the runtime behavior.kind chosen.rust_dynamic, or worker.snake_case.PluginContext.config_schema in relay-plugin.toml.nemo-relay-instrument-callsnemo-relay-plugin-observabilitynemo-relay-debug-runtime-integrationbe3d1a4
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.