- name
- add-binding-feature
- description
- Add or change a public NeMo Relay runtime API across Rust and affected language bindings when no more specific maintainer skill owns the domain. Do not use for middleware additions, internal refactors, binding-local fixes, or docs-only changes.
- license
- Apache-2.0
# Add a Binding Feature
Use this skill when a change affects the public runtime surface and must stay in
parity across the Rust core, FFI, and one or more bindings.
Do not use this skill for:
- Internal-only core refactors with no public API change
- New middleware contracts, which use the middleware-specific workflow
- Binding-local bug fixes that do not change shared behavior
- Docs-only or example-only updates
## Implementation Order
1. **Core Rust**
Implement the behavior first in `crates/core/src/api/` and
related core modules such as `crates/core/src/api/runtime/`,
`crates/core/src/codec/`, or `crates/core/src/json.rs`.
2. **FFI / shared C surface, when affected**
Update `crates/ffi` and its generated header only when the capability is
exposed through the C ABI or Go binding.
3. **Language-native bindings**
Update each binding that exposes the capability; leave unrelated bindings
unchanged.
4. **Language wrapper helpers**
Update Python wrapper modules, Go shorthand packages, typed helpers, or
adaptive/plugin helpers if the new behavior belongs there.
5. **Docs and examples**
Update reference docs, language-binding docs, and examples when the public
surface or expected usage changed.
6. **Validation**
Follow the repository validation policy for the surfaces whose public or
observable behavior changed.
## Naming Conventions
| Layer | Convention | Example |
|-------------|-------------------|--------------------------------------|
| Rust | `snake_case` | `nemo_relay_tool_call` |
| C FFI | `nemo_relay_` prefix | `nemo_relay_tool_call` |
| Python | `snake_case` | `nemo_relay.tools.call` |
| Go | `PascalCase` | `nemo_relay.ToolCall` |
| Node.js | `camelCase` | `toolCall` |
## Parity Checklist
- [ ] Core function with doc comment in `crates/core/src/api/`
- [ ] Runtime callback/state, codec, JSON, or event/tool/LLM/scope types added
in the relevant core module if needed
- [ ] FFI wrapper and generated header updated if the C ABI changes
- [ ] Python native binding, wrapper, docstring, and stubs updated if exposed
- [ ] Go wrapper and shorthand package updated if the experimental Go surface
exposes the capability
- [ ] Node.js native binding and wrapper updated if exposed
- [ ] Typed wrapper or adaptive/plugin helper surfaces updated when applicable
- [ ] Meaningful tests added in every affected language surface
- [ ] SPDX license header on any new files
- [ ] Relevant pages under `docs/reference/` updated
- [ ] `README.md`, `docs/getting-started/`, or binding-level READMEs updated if behavior differs by language
- [ ] Relevant getting-started, README, or example docs updated if usage changed
## Decision Points
Lock these before implementing:
- Which bindings actually expose the new surface?
- Is the change part of the plain JSON API, typed wrappers, adaptive/plugin
helpers, or observability helpers?
- Does the new API need manual lifecycle and managed execute variants, or only
one of them?
- Does the new behavior change event fields, metadata, or scope expectations?
- If tool execution is affected, does every callback, continuation, managed
return, and manual end surface use the canonical `ToolExecutionResult`
contract and preserve its opaque annotation?
- Are docs/examples required because the intended usage changed?
## Key References
- Architecture: `docs/about-nemo-relay/architecture.mdx`
- Reference index: `docs/reference/api/index.mdx`
- Getting started and binding status: `README.md`,
`docs/getting-started/quick-start/index.mdx`,
`docs/reference/support-matrix.mdx`
- Typed wrappers and codecs: `docs/integrate-into-frameworks/using-codecs.mdx`,
`docs/integrate-into-frameworks/provider-codecs.mdx`
- Adaptive config/plugins: `docs/configure-plugins/about.mdx`,
`docs/build-plugins/about.mdx`,
`docs/configure-plugins/adaptive/configuration.mdx`
- Existing pattern: follow a surface already implemented across core, FFI,
Python, Go, and Node.js rather than inventing a new shape
View on GitHub