Skip to content

test: raise Rust and binding coverage - #634

Open
willkill07 wants to merge 3 commits into
NVIDIA:release/0.7from
willkill07:test/rust-coverage-release-0.7
Open

test: raise Rust and binding coverage#634
willkill07 wants to merge 3 commits into
NVIDIA:release/0.7from
willkill07:test/rust-coverage-release-0.7

Conversation

@willkill07

@willkill07 willkill07 commented Aug 2, 2026

Copy link
Copy Markdown
Member

Overview

Adds the non-CLI test coverage extracted from the combined Sonar and coverage work for release/0.7.

  • I confirm this contribution is my own work, or I have the right to submit it under this project's license.
  • I searched existing issues and open pull requests, and this does not duplicate existing work.

Details

  • Expand Rust core and adaptive unit and integration coverage.
  • Cover codec, observability, plugin, logging, worker, subscriber, and runtime edge cases.
  • Extend FFI, Python-native, Node, and Go binding coverage while preserving existing test patterns.
  • Refactor high-complexity test functions needed by the cognitive-complexity policy PR.
  • No breaking API changes.

Validation performed:

  • Branch commit hooks, including formatting, Clippy, Cargo checks, Go formatting and vet, and Node formatting
  • uv run pre-commit run --all-files on the equivalent combined tree
  • Rust workspace tests; the CLI global-state-sensitive suite passed with one test thread
  • Exact four-branch merge tree comparison against the original combined branch

Where should the reviewer start?

Start with crates/plugin/tests/typed_callbacks.rs for the test-complexity refactors, then crates/core/tests/coverage/logging_rotation_tests.rs for representative new coverage.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

Summary by CodeRabbit

  • Tests
    • Expanded coverage for response caching, logging rotation, codec handling, observability, plugin configuration, worker processes, guardrails, and lifecycle management.
    • Added regression checks for malformed inputs, streaming completion, error handling, status validation, repeated cache updates, and isolated configuration environments.
    • Improved cross-language coverage across FFI, Python, Node.js, Go, and Rust integrations.
    • Strengthened validation of API registries, event metadata, telemetry, callbacks, and stream handling.
    • Refined test organization and shared assertions without changing product behavior.

Signed-off-by: Will Killian <wkillian@nvidia.com>
@willkill07
willkill07 requested a review from a team as a code owner August 2, 2026 00:53
@github-actions github-actions Bot added size:XXL PR is very large Test Test related lang:go PR changes/introduces Go code lang:js PR changes/introduces Javascript/Typescript code lang:rust PR changes/introduces Rust code labels Aug 2, 2026
@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 3f3dc5b8-da13-4a83-a376-30edcabdff24

📥 Commits

Reviewing files that changed from the base of the PR and between ccb335b and 4384705.

📒 Files selected for processing (1)
  • crates/core/tests/unit/observability/plugin_component_tests.rs
📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (13)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

When changing the core Rust runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and satisfy cargo deny check per deny.toml.

**/*.rs: 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.
For Rust changes headed for review, run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings even if relying on pre-commit.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
{crates/core,crates/adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes to crates/core or crates/adaptive must run the full language matrix

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions in Rust and Python: use snake_case.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,py,js,mjs,cjs,ts,tsx}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at the wrapper layer.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,go,js,ts,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use language-appropriate naming conventions: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add the SPDX license header to all Rust, Go, JavaScript, and TypeScript source files using the corresponding // comment form.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*: Format changed files with the language-native formatter before the final lint/test pass.
If dynamic plugin behavior changed, use maintain-dynamic-plugins and 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.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/{core,adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If a language surface changed, always run that language's test target even when Rust core did not change.

**/*.{rs,py,go,js,ts}: When observability configuration or lifecycle is exposed, keep FFI and Python, Go, and Node.js binding-native config objects and subscriber/exporter methods aligned in logical knobs and semantics.
Require every OpenTelemetry endpoint to have a type and nonblank destination; resolve header_env values at activation and reject missing, blank, or duplicate headers.
Concatenate layered ATOF sink, ATIF storage, and OpenTelemetry endpoint lists with higher-precedence entries first.
Preserve correct handling of mark events, start/end events, orphan cases, and span or trajectory fields derived from intended event data.
Run affected Rust tests and just test-rust when event fields change; run just test-python, just test-go, and just test-node when binding-native configuration or lifecycle changes.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,js,ts,tsx,go,java,kt,swift}

📄 CodeRabbit inference engine (.agents/skills/add-middleware/SKILL.md)

Add tests covering registration and duplicate names, deregistration and missing names, priority ordering, callback failure policy, scope-local inheritance and cleanup, event payload semantics, immutable mark and scope fields, and parity across affected bindings.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/{core,adaptive}/**/*.rs

⚙️ CodeRabbit configuration file

crates/{core,adaptive}/**/*.rs: Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.
Pay close attention to task-local/thread-local scope propagation, callback lifetimes, stream finalization, and root_uuid isolation.
Public API changes should preserve existing behavior unless tests and docs show the intended migration path.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/core/tests/unit/observability/plugin_component_tests.rs
🔇 Additional comments (1)
crates/core/tests/unit/observability/plugin_component_tests.rs (1)

831-833: LGTM!


Walkthrough

This PR expands regression and edge-case coverage across adaptive, core, FFI, plugin, Python, Node.js, and Go tests. It also extracts reusable helpers for assertions, fixtures, status checks, callback state, and isolated test environments.

Changes

Cross-language test coverage and maintainability

Layer / File(s) Summary
Adaptive and core coverage
crates/adaptive/tests/..., crates/core/tests/..., crates/core/src/logging/rotation.rs
Adds coverage for response-cache behavior, logging rotation and sinks, codecs, workers, plugins, guardrails, ATIF, and observability.
FFI status and API coverage
crates/ffi/tests/...
Adds assert_status!, migrates status checks, and expands registry, callback, type, and activation tests.
Language binding coverage
crates/plugin/tests/..., crates/python/tests/..., crates/node/tests/...
Refactors callback and wrapper assertions and adds stream, event, response, and promise-handling coverage.
Go test isolation and helpers
go/nemo_relay/*_test.go
Adds isolated working-directory execution and shared helpers for adaptive runtime, propagation, telemetry, callbacks, and plugin activation.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 55.23% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title follows Conventional Commits format and accurately summarizes the expanded Rust and binding test coverage.
Description check ✅ Passed The description includes all required sections, checkboxes, change details, reviewer guidance, related issue, and validation results.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown

@willkill07 willkill07 added this to the 0.7 milestone Aug 2, 2026
@willkill07 willkill07 self-assigned this Aug 2, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
crates/ffi/tests/unit/api/core_tests.rs (1)

1143-1150: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add #[track_caller] to assert_invalid_timestamp.

The function is called from seven sites (lines 1158, 1189, 1200, 1230, 1252, 1282, 1300). Without #[track_caller], every failure reports line 1144. The attribute on assert_native_status alone does not help, because the location stops at this helper.

♻️ Proposed fix
+    #[track_caller]
     fn assert_invalid_timestamp(status: NemoRelayStatus) {
         assert_status!(status, NemoRelayStatus::InvalidArg);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/ffi/tests/unit/api/core_tests.rs` around lines 1143 - 1150, Add the
#[track_caller] attribute directly to the assert_invalid_timestamp helper so
assertion failures report the originating test call site rather than the
helper’s definition; leave its existing status and error-message checks
unchanged.
crates/ffi/tests/unit/callable_tests.rs (1)

659-720: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

The LlmHandle assertion does not belong in assert_event_callbacks.

Lines 715-719 build an LlmHandle and assert its name. That check is unrelated to event subscribers and sanitizers. The refactor is an opportunity to move it into its own helper or drop it, since a builder-name assertion adds no callback coverage.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/ffi/tests/unit/callable_tests.rs` around lines 659 - 720, The
unrelated LlmHandle builder assertion should not remain in
assert_event_callbacks. Remove the LlmHandle construction and name check from
assert_event_callbacks, or relocate it to a dedicated handle-focused test only
if that coverage is required; keep the event subscriber and sanitizer assertions
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/adaptive/tests/unit/response_cache/intercept_tests.rs`:
- Around line 171-173: Update the unit test around next_unit_f64() to assert the
generated value is within the unit interval, including 0.0 and excluding 1.0,
rather than only checking is_finite(). Preserve the existing should_bypass
assertions.

In `@crates/core/tests/unit/observability/plugin_component_tests.rs`:
- Around line 3455-3458: Update the mutex acquisition in
s3_remote_storage_uploads_to_a_custom_http_endpoint to recover from a poisoned
lock by using the same unwrap_or_else(|error| error.into_inner()) pattern as the
other new tests in this file, while preserving the existing test_mutex guard
behavior.
- Around line 708-725: Update
atif_dispatcher_surfaces_fatal_and_disabled_local_sink_states to construct an
AtifDispatcher with an enabled, configured local sink instead of
AtifSectionConfig::default(). Assert sink_targets() is non-empty before
inserting the SinkLabel::Local error, then assert the local target is removed
afterward while preserving the existing fatal-error assertion.
- Around line 651-672: Guard the environment-mutating tests at the start of
atif_storage_http_header_env_*, atif_storage_secret_var_*, and
atif_storage_private_helpers_resolve_env_and_key_prefix_branches with
crate::observability::test_mutex(), matching the existing lock-and-recover
pattern in
atof_stream_header_validation_reports_invalid_values_and_environment_names. Hold
the guard for the full test so all environment setup and cleanup are serialized.

In `@crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs`:
- Around line 948-958: Update monitor_test_worker so its fixture does not orphan
a long-lived sleep process: replace the 60-second command with an immediately
exiting process and ensure the resulting Child is reaped before storing it,
unless the tests require a running child. If any test depends on the child
remaining alive, preserve sleep but explicitly terminate and wait on it in each
relevant test.

In `@crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs`:
- Around line 240-241: Update the test around the two
runtime.record_access_status calls to assert
runtime.access_state.load(Ordering::Acquire) equals 2 immediately after each
call, covering both the initial transition and duplicate-success behavior.

In `@crates/ffi/tests/integration/api_tests.rs`:
- Around line 48-57: The assert_native_status and assert_status! definitions are
duplicated across the integration and unit test binaries and the macro uses an
unqualified helper path. In crates/ffi/tests/integration/api_tests.rs:48-57,
move the helper into shared test support and either remove the macro or qualify
its expansion; in crates/ffi/tests/unit/api_tests.rs:49-58, delete the duplicate
definitions and import the shared helper.

In `@crates/ffi/tests/integration/plugin_activation_tests.rs`:
- Around line 186-204: Rename assert_discovered_activation to a name that
reflects both verification and mutation of plugins_toml, and update its call
sites so the one-shot discovery setup is explicit. Add #[track_caller] to this
helper and the other new helper introduced alongside it, preserving assertion
behavior while ensuring failures report the original caller locations.

In `@crates/python/tests/coverage/py_types_coverage_tests.rs`:
- Around line 569-638: Remove the outer nested wrappers
assert_remaining_handle_methods, assert_remaining_event_methods, and
assert_llm_stream_methods, and inline their test bodies into the enclosing test
functions. Preserve the existing behavior and retain the inner helper around
lines 704-762 where it provides a meaningful concern-based split.
- Around line 251-264: Replace the inline Event::Mark match in
assert_mark_and_tool_event_fields with the existing py_mark_event helper,
passing the same Mark event and Python context; preserve the current event data
and resulting PyMarkEvent behavior.

---

Outside diff comments:
In `@crates/ffi/tests/unit/api/core_tests.rs`:
- Around line 1143-1150: Add the #[track_caller] attribute directly to the
assert_invalid_timestamp helper so assertion failures report the originating
test call site rather than the helper’s definition; leave its existing status
and error-message checks unchanged.

In `@crates/ffi/tests/unit/callable_tests.rs`:
- Around line 659-720: The unrelated LlmHandle builder assertion should not
remain in assert_event_callbacks. Remove the LlmHandle construction and name
check from assert_event_callbacks, or relocate it to a dedicated handle-focused
test only if that coverage is required; keep the event subscriber and sanitizer
assertions unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 32193b52-3559-4f36-80e6-b364eec4965b

📥 Commits

Reviewing files that changed from the base of the PR and between 31c4a5c and 9b1a4c6.

📒 Files selected for processing (53)
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • crates/node/tests/llm_tests.mjs
  • crates/node/tests/tools_tests.mjs
  • crates/node/tests/typed_tests.mjs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/otel_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/test_helpers_test.go
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (29)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

When changing the core Rust runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and satisfy cargo deny check per deny.toml.

**/*.rs: 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.
For Rust changes headed for review, run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings even if relying on pre-commit.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
{crates/core,crates/adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes to crates/core or crates/adaptive must run the full language matrix

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/tests/unit/atif_tests.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions in Rust and Python: use snake_case.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
**/*.{rs,py,js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,py,js,mjs,cjs,ts,tsx}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at the wrapper layer.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/node/tests/llm_tests.mjs
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/node/tests/typed_tests.mjs
  • crates/node/tests/tools_tests.mjs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
**/*.{rs,py,go,js,ts,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use language-appropriate naming conventions: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • go/nemo_relay/adaptive_plugin_test.go
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • go/nemo_relay/coverage_gap_test.go
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • go/nemo_relay/context_test.go
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • go/nemo_relay/adaptive_runtime_test.go
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • go/nemo_relay/adaptive_test.go
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • go/nemo_relay/otel_test.go
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
**/*.{rs,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add the SPDX license header to all Rust, Go, JavaScript, and TypeScript source files using the corresponding // comment form.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • go/nemo_relay/adaptive_plugin_test.go
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • go/nemo_relay/coverage_gap_test.go
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • go/nemo_relay/context_test.go
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • go/nemo_relay/adaptive_runtime_test.go
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • go/nemo_relay/adaptive_test.go
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • go/nemo_relay/otel_test.go
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
crates/adaptive/**

📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)

Keep crates/adaptive aligned with the canonical adaptive config schema, built-in section helpers, plugin lifecycle, and validation/report behavior.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*: Format changed files with the language-native formatter before the final lint/test pass.
If dynamic plugin behavior changed, use maintain-dynamic-plugins and 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.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/node/tests/llm_tests.mjs
  • go/nemo_relay/adaptive_plugin_test.go
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/node/tests/typed_tests.mjs
  • crates/node/tests/tools_tests.mjs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • go/nemo_relay/coverage_gap_test.go
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • go/nemo_relay/context_test.go
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • go/nemo_relay/adaptive_runtime_test.go
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • go/nemo_relay/adaptive_test.go
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • go/nemo_relay/otel_test.go
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
crates/{core,adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/tests/unit/atif_tests.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If a language surface changed, always run that language's test target even when Rust core did not change.

**/*.{rs,py,go,js,ts}: When observability configuration or lifecycle is exposed, keep FFI and Python, Go, and Node.js binding-native config objects and subscriber/exporter methods aligned in logical knobs and semantics.
Require every OpenTelemetry endpoint to have a type and nonblank destination; resolve header_env values at activation and reject missing, blank, or duplicate headers.
Concatenate layered ATOF sink, ATIF storage, and OpenTelemetry endpoint lists with higher-precedence entries first.
Preserve correct handling of mark events, start/end events, orphan cases, and span or trajectory fields derived from intended event data.
Run affected Rust tests and just test-rust when event fields change; run just test-python, just test-go, and just test-node when binding-native configuration or lifecycle changes.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • go/nemo_relay/adaptive_plugin_test.go
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • go/nemo_relay/coverage_gap_test.go
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • go/nemo_relay/context_test.go
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • go/nemo_relay/adaptive_runtime_test.go
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • go/nemo_relay/adaptive_test.go
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • go/nemo_relay/otel_test.go
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
**/*.{rs,py,js,ts,tsx,go,java,kt,swift}

📄 CodeRabbit inference engine (.agents/skills/add-middleware/SKILL.md)

Add tests covering registration and duplicate names, deregistration and missing names, priority ordering, callback failure policy, scope-local inheritance and cleanup, event payload semantics, immutable mark and scope fields, and parity across affected bindings.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • go/nemo_relay/adaptive_plugin_test.go
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • go/nemo_relay/coverage_gap_test.go
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • go/nemo_relay/context_test.go
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • go/nemo_relay/adaptive_runtime_test.go
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • go/nemo_relay/adaptive_test.go
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • go/nemo_relay/otel_test.go
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
crates/{core,adaptive}/**/*.rs

⚙️ CodeRabbit configuration file

crates/{core,adaptive}/**/*.rs: Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.
Pay close attention to task-local/thread-local scope propagation, callback lifetimes, stream finalization, and root_uuid isolation.
Public API changes should preserve existing behavior unless tests and docs show the intended migration path.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/tests/unit/atif_tests.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/node/tests/llm_tests.mjs
  • go/nemo_relay/adaptive_plugin_test.go
  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/node/tests/typed_tests.mjs
  • crates/node/tests/tools_tests.mjs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/adaptive/tests/unit/plugin_component_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/adaptive/tests/unit/trie/builder_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/adaptive/tests/unit/response_cache/store_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • go/nemo_relay/coverage_gap_test.go
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • go/nemo_relay/context_test.go
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • go/nemo_relay/adaptive_runtime_test.go
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • go/nemo_relay/adaptive_test.go
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/plugin/tests/typed_callbacks.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/core/tests/unit/atif_tests.rs
  • go/nemo_relay/otel_test.go
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
crates/node/**/*.{js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Use camelCase for Node.js public APIs.

Files:

  • crates/node/tests/llm_tests.mjs
  • crates/node/tests/typed_tests.mjs
  • crates/node/tests/tools_tests.mjs
crates/{python,ffi,node}/**/*

⚙️ CodeRabbit configuration file

crates/{python,ffi,node}/**/*: Treat binding changes as public API changes. Check for parity with the other language bindings, FFI ownership/lifetime safety,
callback error propagation, stable type conversion, and consistent async/stream semantics.
Flag changes that update one binding without corresponding tests or documentation for the same surface elsewhere.

Files:

  • crates/node/tests/llm_tests.mjs
  • crates/ffi/tests/integration/api_tests.rs
  • crates/node/tests/typed_tests.mjs
  • crates/node/tests/tools_tests.mjs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/python/tests/coverage/py_plugin_coverage_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • crates/python/tests/coverage/py_api_coverage_tests.rs
  • crates/python/tests/coverage/py_adaptive_coverage_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
go/nemo_relay/**/*.go

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

go/nemo_relay/**/*.go: Format changed Go packages with cd go/nemo_relay && go fmt ./...
Run Go tests with just test-go to build and test the NeMo Relay Go binding
Use just build-go when you want an explicit build-only pass or need the artifact for other work
Use just ci=true test-go when you need the CI-style coverage and JUnit path
On macOS, set DYLD_LIBRARY_PATH to the ../../target/release directory before running the raw go test command directly

Use PascalCase for public Go APIs.

Files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
**/*.go

📄 CodeRabbit inference engine (CONTRIBUTING.md)

When changing the experimental Go binding, format Go code with gofmt and keep go vet ./... passing.

Files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
{crates/python/src/py_api/mod.rs,python/nemo_relay/**/*.py,python/nemo_relay/**/*.pyi,go/nemo_relay/**/*.go,crates/node/src/api/**/*.rs}

📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)

Update the language-native bindings for every exposed surface in Python, Go, and Node.js.

Files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
{python/nemo_relay/**/*.py,python/nemo_relay/**/*.pyi,go/nemo_relay/**/*.go}

📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)

Update language wrapper helpers such as Python wrapper modules, Python type stubs, and Go shorthand packages when the new behavior belongs in those helper layers.

Files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
go/nemo_relay/**

📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)

Keep shared plugin helpers in go/nemo_relay aligned with plugin registration, composition, and lifecycle behavior.

Files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
**/*.{md,mdx,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/maintain-observability/SKILL.md)

Examples and documentation must use each exporter's documented flush/deregister order before shutdown.

Files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
go/nemo_relay/**/*

⚙️ CodeRabbit configuration file

go/nemo_relay/**/*: Review Go binding changes for cgo memory ownership, race safety, callback cleanup, idiomatic exported APIs, and parity with Rust/FFI behavior.
Any API change should include focused Go tests and consider race-test behavior.

Files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
crates/core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation

Files:

  • crates/core/tests/unit/subscriber_dispatcher_tests.rs
  • crates/core/src/logging/rotation.rs
  • crates/core/tests/unit/plugin_tests.rs
  • crates/core/tests/coverage/logging_rotation_tests.rs
  • crates/core/tests/unit/codec/openai_responses_tests.rs
  • crates/core/tests/unit/types_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/local_python_tests.rs
  • crates/core/tests/unit/llm_api_tests.rs
  • crates/core/tests/unit/observability/atof_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/codec/anthropic_tests.rs
  • crates/core/tests/unit/codec/openai_chat_tests.rs
  • crates/core/tests/coverage/logging_sink_tests.rs
  • crates/core/tests/unit/dynamic_worker_tests.rs
  • crates/core/tests/unit/observability/openinference_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/component_tests.rs
  • crates/core/tests/integration/api_surface_tests.rs
  • crates/core/tests/unit/observability/otel_tests.rs
  • crates/core/tests/unit/atif_tests.rs
crates/ffi/**

📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)

Rebuild the FFI crate in release mode so the shared library and header stay in sync when making changes to crates/ffi

Files:

  • crates/ffi/tests/integration/api_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
crates/ffi/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/ffi, also use test-ffi-surface for validation

Use C FFI export names prefixed with nemo_relay_ in the raw C FFI layer.

Files:

  • crates/ffi/tests/integration/api_tests.rs
  • crates/ffi/tests/unit/api_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/ffi/tests/unit/callable_tests.rs
  • crates/ffi/tests/unit/types_tests.rs
  • crates/ffi/tests/integration/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/unit/api/core_tests.rs
  • crates/ffi/tests/unit/api/plugin_tests.rs
  • crates/ffi/tests/unit/api/coverage_sweeps_tests.rs
  • crates/ffi/tests/unit/api/execution_tests.rs
  • crates/ffi/tests/unit/api/registry_tests.rs
{crates/**/src/**/*.rs,python/**/*.py}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

Do not add tests under src; Rust tests belong in crate tests/ trees, and Python SDK tests belong under python/tests.

Files:

  • crates/core/src/logging/rotation.rs
{crates/core/src/plugin/dynamic/**,crates/plugin/**,crates/worker/**,crates/worker-proto/**,crates/types/**,python/plugin/**,examples/rust-native-plugin/**,examples/python-grpc-worker-plugin/**,docs/build-plugins/**}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

Keep the stable boundary explicit: native plugins cross a C ABI, and worker plugins cross grpc-v1.

Files:

  • crates/plugin/tests/typed_callbacks.rs
{crates/core/src/plugin/dynamic/**/*.rs,crates/plugin/**/*.rs,crates/worker/**/*.rs,crates/worker-proto/**/*.rs,python/plugin/**/*.py}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

Manifest validation must cover kind, compatibility, load contract, integrity, capability mismatch, and disabled-plugin behavior.

Files:

  • crates/plugin/tests/typed_callbacks.rs
{crates/plugin/**/*.rs,python/plugin/**/*.py}

📄 CodeRabbit inference engine (.agents/skills/maintain-dynamic-plugins/SKILL.md)

Rust and Python SDKs must expose every supported registration surface.

Files:

  • crates/plugin/tests/typed_callbacks.rs
🧠 Learnings (2)
📚 Learning: 2026-07-28T20:33:25.156Z
Learnt from: willkill07
Repo: NVIDIA/NeMo-Relay PR: 572
File: go/nemo_relay/adaptive_runtime_test.go:214-238
Timestamp: 2026-07-28T20:33:25.156Z
Learning: When adding/adjusting Go unit tests for `BuildCacheRequestFacts` (request-ID validation and related request parsing), set `CacheRequestFactsInput.Provider` to a valid provider in all tests that are intended to isolate request-ID behavior—because `BuildCacheRequestFacts` does not validate `Provider`. Then add separate test coverage for malformed `AnnotatedRequest` JSON so JSON parsing failures are not conflated with `Provider`-related inputs.

Applied to files:

  • go/nemo_relay/adaptive_plugin_test.go
  • go/nemo_relay/test_helpers_test.go
  • go/nemo_relay/callbacks_test.go
  • go/nemo_relay/coverage_gap_test.go
  • go/nemo_relay/context_test.go
  • go/nemo_relay/adaptive_runtime_test.go
  • go/nemo_relay/llm_test.go
  • go/nemo_relay/plugin_activation_test.go
  • go/nemo_relay/adaptive_test.go
  • go/nemo_relay/otel_test.go
📚 Learning: 2026-07-28T20:07:29.880Z
Learnt from: willkill07
Repo: NVIDIA/NeMo-Relay PR: 571
File: crates/core/src/api/runtime/state.rs:996-1020
Timestamp: 2026-07-28T20:07:29.880Z
Learning: In NeMo Relay (RELAY-509), sanitizer callback failures must be treated as intentional fail-open behavior. When an event/tool (request/response) or LLM (request/response) sanitizer callback fails, the sanitizer chain should retain and publish the last valid event/payload snapshot (rather than dropping/invalidating the data) and log the failure including callback context (e.g., which sanitizer/callback failed and relevant identifiers). Apply this consistently across all sanitizer chains mentioned in the RELAY-509 documentation/migration guide.

Applied to files:

  • crates/core/src/logging/rotation.rs

Comment thread crates/adaptive/tests/unit/response_cache/intercept_tests.rs Outdated
Comment thread crates/core/tests/unit/observability/plugin_component_tests.rs
Comment thread crates/core/tests/unit/observability/plugin_component_tests.rs
Comment thread crates/core/tests/unit/observability/plugin_component_tests.rs Outdated
Comment thread crates/ffi/tests/integration/api_tests.rs
Comment thread crates/ffi/tests/integration/plugin_activation_tests.rs Outdated
Comment thread crates/python/tests/coverage/py_types_coverage_tests.rs Outdated
Comment thread crates/python/tests/coverage/py_types_coverage_tests.rs
Signed-off-by: Will Killian <wkillian@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/ffi/tests/integration/plugin_activation_tests.rs (1)

198-204: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Exercise discovery in the one-shot test. nemo_relay_tool_request_intercepts only dispatches registered callbacks; it does not discover plugins. The current assertion proves registry stability, not one-shot discovery. Trigger a second activation/discovery attempt after the file mutation, or rename the assertion to cover registry stability only.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/ffi/tests/integration/plugin_activation_tests.rs` around lines 198 -
204, Update the one-shot discovery test around tool_request_intercepts so it
explicitly performs a second activation or plugin-discovery attempt after
mutating plugins_toml, then verifies the original discovery state remains
unchanged. If discovery cannot be triggered there, rename or adjust the test
assertions to describe registry stability rather than one-shot discovery.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@crates/ffi/tests/integration/plugin_activation_tests.rs`:
- Around line 198-204: Update the one-shot discovery test around
tool_request_intercepts so it explicitly performs a second activation or
plugin-discovery attempt after mutating plugins_toml, then verifies the original
discovery state remains unchanged. If discovery cannot be triggered there,
rename or adjust the test assertions to describe registry stability rather than
one-shot discovery.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: f5aec402-464f-4312-8cd6-0d0ddaf7ce69

📥 Commits

Reviewing files that changed from the base of the PR and between 9b1a4c6 and ccb335b.

📒 Files selected for processing (5)
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (17)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

When changing the core Rust runtime or Rust-facing API surface, format Rust code with cargo fmt (rustfmt defaults), keep cargo clippy -- -D warnings clean, and satisfy cargo deny check per deny.toml.

**/*.rs: 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.
For Rust changes headed for review, run cargo fmt --all and cargo clippy --workspace --all-targets -- -D warnings even if relying on pre-commit.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/ffi/**

📄 CodeRabbit inference engine (.agents/skills/test-ffi-surface/SKILL.md)

Rebuild the FFI crate in release mode so the shared library and header stay in sync when making changes to crates/ffi

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
crates/ffi/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/ffi, also use test-ffi-surface for validation

Use C FFI export names prefixed with nemo_relay_ in the raw C FFI layer.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
**/*.{rs,py}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions in Rust and Python: use snake_case.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,js,mjs,cjs,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,py,js,mjs,cjs,ts,tsx}: Use Json = serde_json::Value in Rust-facing runtime APIs where the existing code expects JSON payloads.
Use Result<T> with FlowError in core runtime paths, and keep errors explicit and binding-appropriate at the wrapper layer.
Keep async behavior on the existing tokio-based model; bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,go,js,ts,c,h}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use language-appropriate naming conventions: Rust snake_case, C FFI exports prefixed nemo_relay_, Go PascalCase, Node.js camelCase, and Python snake_case.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,go,js,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add the SPDX license header to all Rust, Go, JavaScript, and TypeScript source files using the corresponding // comment form.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*: Format changed files with the language-native formatter before the final lint/test pass.
If dynamic plugin behavior changed, use maintain-dynamic-plugins and 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.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,go,js,ts}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If a language surface changed, always run that language's test target even when Rust core did not change.

**/*.{rs,py,go,js,ts}: When observability configuration or lifecycle is exposed, keep FFI and Python, Go, and Node.js binding-native config objects and subscriber/exporter methods aligned in logical knobs and semantics.
Require every OpenTelemetry endpoint to have a type and nonblank destination; resolve header_env values at activation and reject missing, blank, or duplicate headers.
Concatenate layered ATOF sink, ATIF storage, and OpenTelemetry endpoint lists with higher-precedence entries first.
Preserve correct handling of mark events, start/end events, orphan cases, and span or trajectory fields derived from intended event data.
Run affected Rust tests and just test-rust when event fields change; run just test-python, just test-go, and just test-node when binding-native configuration or lifecycle changes.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
**/*.{rs,py,js,ts,tsx,go,java,kt,swift}

📄 CodeRabbit inference engine (.agents/skills/add-middleware/SKILL.md)

Add tests covering registration and duplicate names, deregistration and missing names, priority ordering, callback failure policy, scope-local inheritance and cleanup, event payload semantics, immutable mark and scope fields, and parity across affected bindings.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/{python,ffi,node}/**/*

⚙️ CodeRabbit configuration file

crates/{python,ffi,node}/**/*: Treat binding changes as public API changes. Check for parity with the other language bindings, FFI ownership/lifetime safety,
callback error propagation, stable type conversion, and consistent async/stream semantics.
Flag changes that update one binding without corresponding tests or documentation for the same surface elsewhere.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/ffi/tests/integration/plugin_activation_tests.rs
  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/python/tests/coverage/py_types_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
{crates/core,crates/adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

Changes to crates/core or crates/adaptive must run the full language matrix

Files:

  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/core/**/*.rs

📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)

If the change touched crates/core or shared runtime semantics, also use validate-change for broader validation

Files:

  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/{core,adaptive}/**/*

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If crates/core or crates/adaptive changed, run the full validation matrix across Rust, Python, Go, and Node.js.

Files:

  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/{core,adaptive}/**/*.rs

⚙️ CodeRabbit configuration file

crates/{core,adaptive}/**/*.rs: Review the Rust runtime for async correctness, scope isolation, middleware ordering, and event lifecycle regressions.
Pay close attention to task-local/thread-local scope propagation, callback lifetimes, stream finalization, and root_uuid isolation.
Public API changes should preserve existing behavior unless tests and docs show the intended migration path.

Files:

  • crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs
  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
  • crates/core/tests/unit/observability/plugin_component_tests.rs
crates/adaptive/**

📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)

Keep crates/adaptive aligned with the canonical adaptive config schema, built-in section helpers, plugin lifecycle, and validation/report behavior.

Files:

  • crates/adaptive/tests/unit/response_cache/intercept_tests.rs
🔇 Additional comments (5)
crates/adaptive/tests/unit/response_cache/intercept_tests.rs (1)

89-120: LGTM!

Also applies to: 122-147, 149-155, 157-175

crates/core/tests/unit/observability/plugin_component_tests.rs (1)

86-86: LGTM!

Also applies to: 138-138, 411-411, 453-465, 637-732, 3034-3036, 3067-3069, 3126-3128, 3200-3202, 3233-3235, 3269-3271, 3326-3328, 3407-3541

crates/core/tests/unit/plugins/nemo_guardrails/remote_coverage_tests.rs (1)

94-111: LGTM!

Also applies to: 226-243, 811-857, 934-952

crates/ffi/tests/integration/plugin_activation_tests.rs (1)

101-101: LGTM!

Also applies to: 142-142, 163-185, 187-197

crates/python/tests/coverage/py_types_coverage_tests.rs (1)

57-102: LGTM!

Also applies to: 155-327, 533-533, 558-629, 631-824, 826-934, 1149-1205, 1255-1301, 1312-1324, 1361-1603, 1968-2005

Signed-off-by: Will Killian <wkillian@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lang:go PR changes/introduces Go code lang:js PR changes/introduces Javascript/Typescript code lang:rust PR changes/introduces Rust code size:XXL PR is very large Test Test related

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant