feat: Improve Hermes Relay hook injection and event alignment#205
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughAdds Hermes task→session correlation and routing, per-tool ActiveTool tracking for robust end-event matching, Hermes hook backup/merge/restore in launcher runs, LLM span de-duplication and metric merging in ATIF, Node API main-thread Arg0 builders, many tests, and documentation/workflow updates. ChangesHermes Task-Session Correlation and Tool-ID Resilience
Observability: ATIF & OpenInference
Node API: main-thread Arg0 and with_scope
OpenClaw integration & replay tests
Docs, workflows, and scripts
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 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/cli/src/alignment/mod.rs`:
- Line 113: hermes_task_sessions is keyed only by task_id, so
record_hermes_task_session and route_hermes_task_event can collide across
sessions; change the storage to be collision-resistant by including session
scope in the key (e.g., use a composite key session_id + task_id or make
hermes_task_sessions a HashMap<session_id, HashMap<task_id, session_id_or_meta>>
/ nested map) and update record_hermes_task_session and route_hermes_task_event
to read/write using that composite/session-scoped key so entries cannot be
overwritten when different sessions reuse the same task_id.
In `@crates/cli/src/launcher.rs`:
- Around line 466-483: prepare_hermes currently mutates the user's Hermes config
during PreparedRun::new which can leave config.yaml patched if execute_live_run
returns early on failed health checks; update the flow so we either defer
calling prepare_hermes (or the write_merged_hermes_hooks step) until after
wait_for_health succeeds in execute_live_run, or ensure PreparedRun::restore is
always invoked on every early-return path from execute_live_run (add
try/finally-like cleanup or explicit restore on error paths). Refer to
prepare_hermes, write_merged_hermes_hooks, execute_live_run, wait_for_health,
and PreparedRun::restore to locate and implement the change.
In `@crates/cli/src/session.rs`:
- Around line 129-134: ActiveTool currently only stores handle, name, and
arguments so identical name+args from different subagents get conflated; add a
resolved owner/subagent identity field (e.g., owner or subagent_id) to the
ActiveTool struct and populate it wherever ActiveTool instances are created (the
synthetic start path and any start_tool constructors), update derives as needed,
and change the fallback/matching logic in end_tool (and the analogous code at
the other referenced range) to require the owner/subagent to match before
considering a name+args fallback so the real handle for a different subagent is
not left open.
In `@crates/cli/tests/coverage/session_tests.rs`:
- Around line 1615-1634: The pre/post tool-call test is vacuous because the
pre_tool_call JSON uses an empty session_id and can be filtered out, so the
subsequent assertion on session.tools.is_empty() doesn't prove mismatched
tool_call_id handling; update the test to make the pre_tool_call and
post_tool_call belong to a real session (non-empty session_id) and split the
test into phases: after injecting the pre_tool_call assert
!session.tools.is_empty() (e.g., session.tools.len() > 0), then inject the
post_tool_call with a different tool_call_id and assert session.tools.is_empty()
to verify the mismatch causes the tool to be removed; apply the same change
pattern to the other occurrence referenced (the block around the second instance
at the later lines).
In `@python/nemo_relay/nat_exporter.py`:
- Around line 40-47: The subscriber() currently reopens the file on every event
causing syscall overhead; instead open a single append handle in __init__ (e.g.
self._output = self._path.open("a")) and reuse it in subscriber() to write
_event_to_json(event) + "\n", calling self._output.flush() after each write for
durability; keep the existing self._lock and self._closed checks in
subscriber(), and close/cleanup the handle in shutdown() (and guard against
double-close) so the file is only opened once and closed on shutdown.
🪄 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: 539e1bb4-0a60-4cd1-880a-82c4de95efd0
📒 Files selected for processing (9)
crates/cli/src/alignment/mod.rscrates/cli/src/launcher.rscrates/cli/src/session.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/session_tests.rspython/nemo_relay/README.mdpython/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/tests/test_nat_exporter.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Check / Run
- GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (29)
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)
Use
snake_casenaming convention for Rust identifiers (e.g.,nemo_relay_tool_call)
**/*.rs: Any Rust change must runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor all FFI work since it is Rust work
Runjust test-rustto validate FFI changes
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting on FFI workWhen Rust files changed as part of Go work, also run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allwhen Rust files are changed as part of Node work
Runcargo clippy --workspace --all-targets -- -D warningswhen Rust files are changed as part of Node work
Runjust test-rustwhen Rust files are changed as part of Node work
**/*.rs: Runcargo fmt --allto format all Rust code
Runcargo clippy --workspace --all-targets -- -D warningsto enforce all clippy lints as errors
**/*.rs: Runcargo fmt --allwhen Rust files changed as part of WebAssembly work
Runcargo clippy --workspace --all-targets -- -D warningswhen Rust files changed as part of WebAssembly work
**/*.rs: If any Rust code changed, always runjust test-rust
If any Rust code changed, also runcargo fmt --all
If any Rust code changed, also runcargo clippy --workspace --all-targets -- -D warnings
Run Rust formatting withcargo fmt --all
Run Rust linting withcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Usecargo fmtfor Rust code formatting
Runcargo clippy -- -D warningsto lint Rust code and treat all warnings as errors
Use Rust snake_case naming convention for Rust identifiers
Include SPDX license header in all Rust source files using double-slash comment syntax
Validate Rust code withuv run pre-commit run --all-filesto enforce cargo fmt formatting check, cargo clippy lints, and cargo deny aud...
Files:
crates/cli/tests/coverage/session_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/session.rscrates/cli/src/alignment/mod.rs
{crates/adaptive/**/*.rs,**/*test*.{rs,py,go,ts,js},**/*adaptive*test*.{rs,py,go,ts,js},docs/plugins/adaptive/**}
📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)
Maintain documented and tested validation and report behavior for adaptive surfaces
Files:
crates/cli/tests/coverage/session_tests.rspython/tests/test_nat_exporter.pycrates/cli/tests/coverage/launcher_tests.rs
**/{Cargo.toml,**/*.rs}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Maintain consistency between Rust package names in
Cargo.tomland their actual usage across the codebase
Files:
crates/cli/tests/coverage/session_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/session.rscrates/cli/src/alignment/mod.rs
**/*.{h,hpp,c,cpp,rs}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Ensure FFI header and library naming follows consistent conventions across platform-specific builds
Files:
crates/cli/tests/coverage/session_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/session.rscrates/cli/src/alignment/mod.rs
**/*.{rs,toml}
📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)
Update Rust crate names and module prefixes during coordinated rename operations
Files:
crates/cli/tests/coverage/session_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/session.rscrates/cli/src/alignment/mod.rs
**/*.{rs,py,js,ts,tsx,jsx,go,sh,toml,yaml,yml,md}
📄 CodeRabbit inference engine (AGENTS.md)
Keep SPDX headers on source, docs, scripts, and configuration files. The project is Apache-2.0.
Files:
crates/cli/tests/coverage/session_tests.rspython/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/tests/test_nat_exporter.pypython/nemo_relay/README.mdcrates/cli/src/launcher.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/session.rscrates/cli/src/alignment/mod.rs
**/*.{rs,py,go,js,ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Follow binding naming conventions: Rust and Python use
snake_case, C FFI exports prefixednemo_relay_, Go usesPascalCasefor public APIs, Node.js usescamelCase.
Files:
crates/cli/tests/coverage/session_tests.rspython/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/tests/test_nat_exporter.pycrates/cli/src/launcher.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/session.rscrates/cli/src/alignment/mod.rs
crates/**/*.rs
📄 CodeRabbit inference engine (AGENTS.md)
crates/**/*.rs: Keep async behavior on the existing tokio-based model. Bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.
UseJson = serde_json::Valuein Rust-facing runtime APIs for JSON payload handling.
Files:
crates/cli/tests/coverage/session_tests.rscrates/cli/src/launcher.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/session.rscrates/cli/src/alignment/mod.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/cli/tests/coverage/session_tests.rspython/tests/test_nat_exporter.pycrates/cli/tests/coverage/launcher_tests.rs
{crates/python/src/py_api/**/*.rs,python/nemo_relay/**/*.py,python/nemo_relay/**/*.pyi}
📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)
Update Python native binding in
crates/python/src/py_api/mod.rswith Python wrapper docstring inpython/nemo_relay/<module>.pyand type stubs inpython/nemo_relay/*.pyimodules
Files:
python/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.py
python/nemo_relay/**/*.py
📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)
Use
snake_casenaming convention for Python identifiers (e.g.,nemo_relay.tools.call)Format changed Python wrapper and test files with
uv run ruff format pythonPython wrapper modules live under
python/nemo_relay/; the native extension is built fromcrates/pythonwithmaturin.
Files:
python/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.py
{pyproject.toml,**/*.py}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Maintain consistency between Python package names in
pyproject.tomland import paths used throughout the codebase
Files:
python/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/tests/test_nat_exporter.py
**/*.{py,txt,toml,cfg,yaml,yml}
📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)
Update Python package names and top-level module imports during coordinated rename operations
Files:
python/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/tests/test_nat_exporter.py
**/*.py
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
**/*.py: Run Python formatting withuv run ruff format python
Run Python testing withuv run pytest -k "<pattern>"
**/*.py: Use Ruff with rule sets E, F, W, I for Python linting
Use Ruff formatter with line length 120 and double quotes for Python code formatting
Runtyfor Python type checking
Use Python snake_case naming convention for Python identifiers
Include SPDX license header in all Python source files using hash comment syntax
Validate Python code withuv run pre-commit run --all-filesto enforce Ruff linting and formatting, and ty type checking
Files:
python/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/tests/test_nat_exporter.py
**/*.{md,mdx,py,sh,yaml,yml,toml,json}
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
Keep package names, repo references, and build commands current
Files:
python/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/tests/test_nat_exporter.pypython/nemo_relay/README.md
python/nemo_relay/**/*
⚙️ CodeRabbit configuration file
python/nemo_relay/**/*: Review Python wrapper changes for typed API consistency, contextvars-based scope isolation, async behavior, and parity with the native extension.
Stubs and runtime implementations should stay aligned.
Files:
python/nemo_relay/__init__.pypython/nemo_relay/nat_exporter.pypython/nemo_relay/README.md
**/test_*.{py,py}
📄 CodeRabbit inference engine (.agents/skills/add-integration/SKILL.md)
Relevant integration tests or smoke coverage must exist for the integration path
Files:
python/tests/test_nat_exporter.py
python/**/*test*.py
📄 CodeRabbit inference engine (.agents/skills/test-python-binding/SKILL.md)
python/**/*test*.py: Do not add@pytest.mark.asyncioto any test in Python test files
Do not add a-> Nonereturn type annotation to test functions
When mocking a class, useunittest.mock.MagicMockorunittest.mock.AsyncMockwith thespecconstructor argument when necessary, rather than defining a new class
Prefix mocked class names withmock, notfake
Prefer pytest fixtures over helper methods in Python tests
Preferpytest.mark.parametrizeover creating individual tests for different input types
Files:
python/tests/test_nat_exporter.py
python/**/{conftest.py,*test*.py}
📄 CodeRabbit inference engine (.agents/skills/test-python-binding/SKILL.md)
When creating a fixture follow the pattern:
@pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) def <fixture_name>_fixture() -> <return_type>:and only specify the scope argument when the value is something other than "function"
Files:
python/tests/test_nat_exporter.py
**/*.{md,rst,html,txt}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)
**/*.{md,rst,html,txt}: Always spellNVIDIAin all caps. Do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names withNVIDIAon first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms withs, not an apostrophe, such asGPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such asCPU,GPU,PC,API, andUIusually do not need to be spelled out for developer audiences.
Files:
python/nemo_relay/README.md
**/*.{md,rst,html}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)
Link the first mention of a product name when the destination helps the reader.
Files:
python/nemo_relay/README.md
**/*.md
📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)
Documentation must be updated if activation or usage changed
**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as/home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring[NVIDIA/NeMo](link)over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links ...
Files:
python/nemo_relay/README.md
**/{docs,examples,**/*.md,*.patch,*.diff,.github,*.sh,*.yaml,*.yml}
📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)
Update documentation, examples, CI configuration, and patch artifacts when performing rename operations
Files:
python/nemo_relay/README.md
**/*.{md,rst,txt}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
Spell
NVIDIAin all caps. Do not useNvidia,nvidia, orNV.
Files:
python/nemo_relay/README.md
**/*.{md,rst}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce.
Preferrefer tooverseewhen the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.
Files:
python/nemo_relay/README.md
{docs/**,README.md,CONTRIBUTING.md,**/*.md}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Run docs link validation with
just docs-linkcheckwhen links change
Files:
python/nemo_relay/README.md
{docs/**,README.md,**/Cargo.toml,**/package.json,**/*.md}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Ensure renamed public surfaces are reflected consistently in manifests and docs for large or public-facing changes
Files:
python/nemo_relay/README.md
**/*.{html,md,mdx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Include SPDX license header in HTML and Markdown files using HTML comment syntax
Files:
python/nemo_relay/README.md
**/README.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update relevant crate or package README when that surface changed
Files:
python/nemo_relay/README.md
🪛 Ruff (0.15.15)
python/nemo_relay/nat_exporter.py
[warning] 33-33: Avoid specifying long messages outside the exception class
(TRY003)
python/tests/test_nat_exporter.py
[warning] 41-41: Do not call getattr with a constant attribute value. It is not any safer than normal property access.
Replace getattr with attribute access
(B009)
🔇 Additional comments (7)
python/nemo_relay/nat_exporter.py (3)
23-33: LGTM!
49-68: LGTM!
71-76: LGTM!python/nemo_relay/__init__.py (1)
27-28: LGTM!Also applies to: 192-201, 431-464
python/nemo_relay/README.md (1)
188-210: LGTM!python/tests/test_nat_exporter.py (2)
40-41: LGTM!
14-37: ⚡ Quick winConfirm
scope_categoryend discriminant — CanonicalScopeEventJSON includes ascope_categoryfield and emits"scope_category": "end"for the pop/end event (e.g.,crates/core/tests/unit/types_tests.rsandcrates/ffi/tests/integration/api_tests.rsassert"scope_category" == "end"), soassert lines[2]["scope_category"] == "end"matches the real serialization.
willkill07
left a comment
There was a problem hiding this comment.
The improvements are more representative than the added exporter. Could the PR title be updated accordingly?
Otherwise, my only feedback is related to the added exporter and what value it adds over the existing AtofExporter.
Conditionally approving.
73d3761 to
b1df460
Compare
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 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 @.github/workflows/fern-docs.yml:
- Around line 377-378: Add an explanatory comment above the job-level
permissions block so reviewers know why contents: write is required;
specifically, update the permissions block that contains "permissions:" and
"contents: write" to include a short comment explaining the reason (e.g., token
usage for pushing docs or updating releases) and any security scope constraints.
In `@crates/cli/src/session.rs`:
- Around line 1605-1633: The matcher currently restricts to root-owned tools
when owner resolution returns None, causing a root-biased fallback; modify
matching_active_tool_key so the owner check only applies when owner_subagent_id
is Some: in matching_active_tool_key (used by remove_tool_handle_for_event)
change the filter closure to require active.owner_subagent_id ==
owner_subagent_id only when owner_subagent_id.is_some(), otherwise ignore
owner_subagent_id and match on name and arguments across all owners, then keep
the existing uniqueness check (matches.len() == 1) to return a single global
match.
In `@crates/cli/tests/coverage/adapters_tests.rs`:
- Around line 312-320: The test drops_uncorrelatable_hermes_pre_tool_call
currently omits both session_id and tool_call_id so it can pass when only one
correlatability gate exists; change the test input passed to hermes::adapt to
include a valid tool_call_id (e.g. "tool_call_id": "toolcall-1") while keeping
session_id omitted so the test isolates the missing-session correlatability
check and still expects the adapter to drop the event.
In `@crates/core/src/observability/atif.rs`:
- Around line 1327-1329: The current llm_response_signature function reduces the
signature to only the extracted message text (via extract_llm_response_message),
which causes different tool-call/raw-response structures — including tool-only
Anthropic responses that become empty strings — to be treated as identical;
update llm_response_signature to include the full promoted tool-call/raw
response structure (or a stable request correlation key when available) in the
returned signature so that tool invocations and raw response metadata are part
of the uniqueness check used by same_physical_llm_request; locate
llm_response_signature and include either the promoted tool call fields or a
correlation id from the response (and apply the same change to the other
occurrences noted around the commented ranges) so signature-only suppression no
longer collapses distinct calls.
In `@integrations/openclaw/src/hook-replay/llm.ts`:
- Around line 1197-1202: The cacheRead normalization currently misses top-level
fields named cached_tokens (and camelCase cachedTokens), causing cache-read
metrics to be dropped; update the cacheRead resolution in the llm replay
normalization to check for numberField(usage, 'cached_tokens') and
numberField(usage, 'cachedTokens') (prior to or alongside the other fallbacks)
so that usage objects already using the canonical NeMo Relay name or camelCase
variant are preserved; locate the cacheRead variable assignment and add those
checks to the existing chain that uses numberField(...) and
nestedNumberField(...).
🪄 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: 862a7d2a-a412-4c2a-8780-757a946da69f
📒 Files selected for processing (53)
.github/CODE_OF_CONDUCT.md.github/nightly-alpha-branches.yaml.github/workflows/fern-docs.ymlAGENTS.mdREADME.mdcrates/cli/src/adapters/hermes.rscrates/cli/src/alignment/mod.rscrates/cli/src/doctor.rscrates/cli/src/launcher.rscrates/cli/src/session.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/alignment_tests.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/src/observability/atif.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/tests/unit/observability/openinference_tests.rscrates/node/README.mdcrates/node/src/api/mod.rscrates/node/src/promise_call.rscrates/node/tests/scope_tests.mjscrates/wasm/README.mddocs/about-nemo-relay/concepts/subscribers.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/about-nemo-relay/release-notes/index.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/about-nemo-relay/release-notes/related-topics.mdxdocs/build-plugins/register-behavior.mdxdocs/build-plugins/validate-configuration.mdxdocs/getting-started/quick-start/index.mdxdocs/integrate-into-frameworks/about.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/nemo-relay-cli/about.mdxdocs/nemo-relay-cli/cursor.mdxdocs/nemo-relay-cli/hermes.mdxdocs/reference/performance.mdxdocs/resources/support-and-faqs.mdxdocs/supported-integrations/about.mdxdocs/supported-integrations/openclaw-plugin.mdxfern/docs.ymlgo/nemo_relay/README.mdintegrations/coding-agents/README.mdintegrations/coding-agents/cursor/README.mdintegrations/openclaw/README.mdintegrations/openclaw/src/hook-replay/llm.tsintegrations/openclaw/test/llm-replay.test.tspython/nemo_relay/README.mdscripts/docs/sync_fern_docs_branch.py
💤 Files with no reviewable changes (3)
- docs/about-nemo-relay/release-notes/related-topics.mdx
- .github/nightly-alpha-branches.yaml
- integrations/coding-agents/README.md
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Check / Run
- GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (54)
{docs/**,README.md,CONTRIBUTING.md}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
{docs/**,README.md,CONTRIBUTING.md}: For docs-only changes, run targeted checks only if commands, package names, or examples changed. Usejust docsfor docs-site builds andjust docs-linkcheckwhen links changed
Run docs site build withjust docs
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxdocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
{docs/**,README.md,CONTRIBUTING.md,**/*.md}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Run docs link validation with
just docs-linkcheckwhen links change
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxpython/nemo_relay/README.mdgo/nemo_relay/README.mddocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxintegrations/coding-agents/cursor/README.mddocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxcrates/node/README.mdcrates/wasm/README.mddocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxintegrations/openclaw/README.mdAGENTS.mdREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
{docs/**,README.md}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Verify README and docs entry points still match current package names and paths for large or public-facing changes
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxdocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
{docs/**,examples/**,README.md}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Verify examples still run with documented commands for large or public-facing changes
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxdocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
{docs/**,README.md,**/Cargo.toml,**/package.json,**/*.md}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Ensure renamed public surfaces are reflected consistently in manifests and docs for large or public-facing changes
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxpython/nemo_relay/README.mdgo/nemo_relay/README.mddocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxintegrations/coding-agents/cursor/README.mddocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxcrates/node/README.mdcrates/wasm/README.mddocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxintegrations/openclaw/README.mdAGENTS.mdREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
**/*.{md,mdx,py,sh,yaml,yml,toml,json}
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
Keep package names, repo references, and build commands current
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxpython/nemo_relay/README.mdgo/nemo_relay/README.mddocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxintegrations/coding-agents/cursor/README.mddocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxcrates/node/README.mdcrates/wasm/README.mddocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxintegrations/openclaw/README.mdAGENTS.mdfern/docs.ymlREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxscripts/docs/sync_fern_docs_branch.pydocs/about-nemo-relay/release-notes/index.mdx
**/*.mdx
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
In MDX files, top-of-file comments must use JSX comment delimiters: {/* to open and */} to close. Do not use HTML comments for MDX SPDX headers.
MDX top-of-file SPDX comments must use {/* ... */} delimiters instead of HTML comment delimiters (Must-Fix)
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxdocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxdocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
**/*.{html,md,mdx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Include SPDX license header in HTML and Markdown files using HTML comment syntax
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxpython/nemo_relay/README.mdgo/nemo_relay/README.mddocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxintegrations/coding-agents/cursor/README.mddocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxcrates/node/README.mdcrates/wasm/README.mddocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxintegrations/openclaw/README.mdAGENTS.mdREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
docs/**/*.{md,mdx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update embedded documentation snippets, patch docs, and binding-support notes if examples or supported bindings changed
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxdocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxdocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
docs/**
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Run
just docsor./scripts/build-docs.sh htmlto regenerate ignored Fern API reference pages before validation for documentation site changes
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxdocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxdocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}
⚙️ CodeRabbit configuration file
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency across language bindings.
Flag stale examples, missing SPDX headers where required, and instructions that no longer match CI or pre-commit behavior.
Files:
docs/build-plugins/validate-configuration.mdxdocs/nemo-relay-cli/about.mdxdocs/supported-integrations/about.mdxdocs/nemo-relay-cli/hermes.mdxdocs/about-nemo-relay/ecosystem.mdxdocs/getting-started/quick-start/index.mdxdocs/reference/performance.mdxdocs/integrate-into-frameworks/non-serializable-data.mdxdocs/about-nemo-relay/release-notes/highlights.mdxdocs/integrate-into-frameworks/about.mdxdocs/resources/support-and-faqs.mdxdocs/nemo-relay-cli/cursor.mdxdocs/about-nemo-relay/concepts/subscribers.mdxREADME.mddocs/supported-integrations/openclaw-plugin.mdxdocs/about-nemo-relay/release-notes/known-issues.mdxdocs/build-plugins/register-behavior.mdxdocs/about-nemo-relay/release-notes/index.mdx
**/*.{md,rst,html,txt}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)
**/*.{md,rst,html,txt}: Always spellNVIDIAin all caps. Do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names withNVIDIAon first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms withs, not an apostrophe, such asGPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such asCPU,GPU,PC,API, andUIusually do not need to be spelled out for developer audiences.
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdAGENTS.mdREADME.md
**/*.{md,rst,html}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)
Link the first mention of a product name when the destination helps the reader.
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdAGENTS.mdREADME.md
**/*.md
📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)
Documentation must be updated if activation or usage changed
**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as/home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring[NVIDIA/NeMo](link)over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links ...
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdAGENTS.mdREADME.md
**/{docs,examples,**/*.md,*.patch,*.diff,.github,*.sh,*.yaml,*.yml}
📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)
Update documentation, examples, CI configuration, and patch artifacts when performing rename operations
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdAGENTS.mdfern/docs.ymlREADME.md
**/*.{md,rst,txt}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
Spell
NVIDIAin all caps. Do not useNvidia,nvidia, orNV.
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdAGENTS.mdREADME.md
**/*.{md,rst}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce.
Preferrefer tooverseewhen the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdAGENTS.mdREADME.md
**/README.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update relevant crate or package README when that surface changed
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdREADME.md
**/*.{rs,py,js,ts,tsx,jsx,go,toml,yaml,yml,md,sh,bash,json}
📄 CodeRabbit inference engine (AGENTS.md)
Keep SPDX headers on source, docs, scripts, and configuration files. The project is Apache-2.0.
Files:
python/nemo_relay/README.mdgo/nemo_relay/README.mdintegrations/coding-agents/cursor/README.mdcrates/node/README.mdcrates/wasm/README.mdintegrations/openclaw/README.mdAGENTS.mdcrates/cli/src/doctor.rsfern/docs.ymlcrates/cli/tests/coverage/doctor_tests.rsREADME.mdcrates/cli/src/adapters/hermes.rsintegrations/openclaw/src/hook-replay/llm.tscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/node/src/promise_call.rscrates/node/src/api/mod.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rsintegrations/openclaw/test/llm-replay.test.tscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/alignment/mod.rscrates/cli/tests/coverage/alignment_tests.rscrates/core/src/observability/atif.rscrates/cli/src/launcher.rsscripts/docs/sync_fern_docs_branch.pycrates/cli/src/session.rs
python/nemo_relay/**/*
⚙️ CodeRabbit configuration file
python/nemo_relay/**/*: Review Python wrapper changes for typed API consistency, contextvars-based scope isolation, async behavior, and parity with the native extension.
Stubs and runtime implementations should stay aligned.
Files:
python/nemo_relay/README.md
{crates/adaptive/**,python/nemo_relay/plugin.py,go/nemo_relay/**,**/node/**,**/wasm/**}
📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)
{crates/adaptive/**,python/nemo_relay/plugin.py,go/nemo_relay/**,**/node/**,**/wasm/**}: Maintain consistent plugin lifecycle across all language bindings (Python, Go, Node/WebAssembly, and Rust)
Keep plugin context surfaces aligned across all language implementations
Files:
go/nemo_relay/README.mdcrates/node/README.mdcrates/wasm/README.mdcrates/node/tests/scope_tests.mjscrates/node/src/promise_call.rscrates/node/src/api/mod.rs
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/README.md
docs/reference/**
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update relevant reference documentation for any public API changes
Files:
docs/reference/performance.mdx
{crates/adaptive/**,python/nemo_relay/adaptive.py,python/nemo_relay/plugin.py,go/nemo_relay/adaptive/**,go/nemo_relay/!(adaptive)/**,**/node/**,**/wasm/**}
📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)
Keep adaptive surface in sync across crates/adaptive, shared plugin behavior in core and bindings, Python adaptive/plugin wrappers in python/nemo_relay/adaptive.py and python/nemo_relay/plugin.py, Go adaptive helpers under go/nemo_relay/adaptive plus shared plugin helpers in go/nemo_relay, and Node/WebAssembly adaptive helpers and plugin wrappers
Files:
crates/node/README.mdcrates/wasm/README.mdcrates/node/tests/scope_tests.mjscrates/node/src/promise_call.rscrates/node/src/api/mod.rs
crates/{python,ffi,node,wasm}/**/*
⚙️ CodeRabbit configuration file
crates/{python,ffi,node,wasm}/**/*: 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/README.mdcrates/wasm/README.mdcrates/node/tests/scope_tests.mjscrates/node/src/promise_call.rscrates/node/src/api/mod.rs
AGENTS.md
📄 CodeRabbit inference engine (CLAUDE.md)
Document agent implementations in AGENTS.md with clear descriptions of functionality and usage
Files:
AGENTS.md
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}
⚙️ CodeRabbit configuration file
{.github/**,.gitlab-ci.yml,.pre-commit-config.yaml,justfile,scripts/**}: Review automation changes for reproducibility, pinned versions where appropriate, secret handling, and consistency with the documented validation matrix.
Pay attention to commands that need generated native artifacts, FFI libraries, or platform-specific environment variables.
Files:
.github/CODE_OF_CONDUCT.md.github/workflows/fern-docs.ymlscripts/docs/sync_fern_docs_branch.py
**/{crates/**/*.rs,python/**/*.py,crates/ffi/**/*.{h,c},go/**/*.go,crates/node/**/*.{js,ts,mjs}}
📄 CodeRabbit inference engine (AGENTS.md)
Follow binding naming conventions: Rust and Python
snake_case, C FFI exports prefixednemo_relay_, GoPascalCasefor public APIs, Node.jscamelCase.
Files:
crates/node/tests/scope_tests.mjscrates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/adapters/hermes.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/node/src/promise_call.rscrates/node/src/api/mod.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/alignment/mod.rscrates/cli/tests/coverage/alignment_tests.rscrates/core/src/observability/atif.rscrates/cli/src/launcher.rscrates/cli/src/session.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/node/tests/scope_tests.mjscrates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/alignment_tests.rs
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)
Use
snake_casenaming convention for Rust identifiers (e.g.,nemo_relay_tool_call)
**/*.rs: Any Rust change must runjust test-rust
Any Rust change must runcargo fmt --all
Any Rust change must runcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allfor all FFI work since it is Rust work
Runjust test-rustto validate FFI changes
Runcargo clippy --workspace --all-targets -- -D warningsto enforce strict linting on FFI workWhen Rust files changed as part of Go work, also run
cargo fmt --all,just test-rust, andcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Runcargo fmt --allwhen Rust files are changed as part of Node work
Runcargo clippy --workspace --all-targets -- -D warningswhen Rust files are changed as part of Node work
Runjust test-rustwhen Rust files are changed as part of Node work
**/*.rs: Runcargo fmt --allto format all Rust code
Runcargo clippy --workspace --all-targets -- -D warningsto enforce all clippy lints as errors
**/*.rs: Runcargo fmt --allwhen Rust files changed as part of WebAssembly work
Runcargo clippy --workspace --all-targets -- -D warningswhen Rust files changed as part of WebAssembly work
**/*.rs: If any Rust code changed, always runjust test-rust
If any Rust code changed, also runcargo fmt --all
If any Rust code changed, also runcargo clippy --workspace --all-targets -- -D warnings
Run Rust formatting withcargo fmt --all
Run Rust linting withcargo clippy --workspace --all-targets -- -D warnings
**/*.rs: Usecargo fmtfor Rust code formatting
Runcargo clippy -- -D warningsto lint Rust code and treat all warnings as errors
Use Rust snake_case naming convention for Rust identifiers
Include SPDX license header in all Rust source files using double-slash comment syntax
Validate Rust code withuv run pre-commit run --all-filesto enforce cargo fmt formatting check, cargo clippy lints, and cargo deny aud...
Files:
crates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/adapters/hermes.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/node/src/promise_call.rscrates/node/src/api/mod.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/alignment/mod.rscrates/cli/tests/coverage/alignment_tests.rscrates/core/src/observability/atif.rscrates/cli/src/launcher.rscrates/cli/src/session.rs
**/{Cargo.toml,**/*.rs}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Maintain consistency between Rust package names in
Cargo.tomland their actual usage across the codebase
Files:
crates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/adapters/hermes.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/node/src/promise_call.rscrates/node/src/api/mod.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/alignment/mod.rscrates/cli/tests/coverage/alignment_tests.rscrates/core/src/observability/atif.rscrates/cli/src/launcher.rscrates/cli/src/session.rs
**/*.{h,hpp,c,cpp,rs}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Ensure FFI header and library naming follows consistent conventions across platform-specific builds
Files:
crates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/adapters/hermes.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/node/src/promise_call.rscrates/node/src/api/mod.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/alignment/mod.rscrates/cli/tests/coverage/alignment_tests.rscrates/core/src/observability/atif.rscrates/cli/src/launcher.rscrates/cli/src/session.rs
**/*.{rs,toml}
📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)
Update Rust crate names and module prefixes during coordinated rename operations
Files:
crates/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/adapters/hermes.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/node/src/promise_call.rscrates/node/src/api/mod.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/alignment/mod.rscrates/cli/tests/coverage/alignment_tests.rscrates/core/src/observability/atif.rscrates/cli/src/launcher.rscrates/cli/src/session.rs
crates/**/*.rs
📄 CodeRabbit inference engine (AGENTS.md)
Use
Json = serde_json::Valuein Rust-facing runtime APIs where the existing code expects JSON payloads.Use
Result<T>withFlowErrorin core runtime paths. 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/cli/src/doctor.rscrates/cli/tests/coverage/doctor_tests.rscrates/cli/src/adapters/hermes.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/node/src/promise_call.rscrates/node/src/api/mod.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/src/alignment/mod.rscrates/cli/tests/coverage/alignment_tests.rscrates/core/src/observability/atif.rscrates/cli/src/launcher.rscrates/cli/src/session.rs
**/*.{py,txt,toml,cfg,yaml,yml}
📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)
Update Python package names and top-level module imports during coordinated rename operations
Files:
fern/docs.ymlscripts/docs/sync_fern_docs_branch.py
{README.md,docs/**/*.{md,rst,txt},fern/**/*}
📄 CodeRabbit inference engine (.agents/skills/prepare-code-freeze/SKILL.md)
Search and update documentation source for references to the old version in
README.md,docs, andferndirectories, updating current-version install commands, package examples, and configuration examples to<next-version>
Files:
fern/docs.ymlREADME.md
{crates/adaptive/**/*.rs,**/*test*.{rs,py,go,ts,js},**/*adaptive*test*.{rs,py,go,ts,js},docs/plugins/adaptive/**}
📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)
Maintain documented and tested validation and report behavior for adaptive surfaces
Files:
crates/cli/tests/coverage/doctor_tests.rscrates/cli/tests/coverage/adapters_tests.rscrates/cli/tests/coverage/gateway_tests.rscrates/core/tests/unit/observability/openinference_tests.rscrates/cli/tests/coverage/session_tests.rsintegrations/openclaw/test/llm-replay.test.tscrates/core/tests/unit/observability/atof_tests.rscrates/core/tests/unit/atif_tests.rscrates/cli/tests/coverage/launcher_tests.rscrates/cli/tests/coverage/alignment_tests.rs
{README.md,docs/getting-started/**/*.md}
📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)
Update
README.md,docs/getting-started/, or binding-level READMEs if behavior differs by language or usage changed
Files:
README.md
README.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update
README.mdto reflect current workspace members and top-level documentation when workspace structure changes
Files:
README.md
**/*.{wasm,js,ts}{,x}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Ensure WebAssembly package naming conventions are consistent with generated package expectations and downstream consumption
Files:
integrations/openclaw/src/hook-replay/llm.tsintegrations/openclaw/test/llm-replay.test.ts
**/*.{js,ts,jsx,tsx}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
Run Node.js formatting with
npm run format --workspace=nemo-relay-nodeInclude SPDX license header in all JavaScript and TypeScript source files using double-slash comment syntax
Files:
integrations/openclaw/src/hook-replay/llm.tsintegrations/openclaw/test/llm-replay.test.ts
crates/node/src/**/*.rs
📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)
Use
camelCasenaming convention for Node.js identifiers (e.g.,toolCall)
Files:
crates/node/src/promise_call.rscrates/node/src/api/mod.rs
crates/node/src/api/**/*.rs
📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)
Update Node.js binding in
crates/node/src/api/mod.rsfor language-native bindings
Files:
crates/node/src/api/mod.rs
{crates/core,crates/adaptive}/**/*
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
Changes to
crates/coreorcrates/adaptivemust run the full language matrix
Files:
crates/core/tests/unit/observability/openinference_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/core/src/observability/atif.rs
crates/core/**/*.rs
📄 CodeRabbit inference engine (.agents/skills/test-go-binding/SKILL.md)
If the change touched
crates/coreor shared runtime semantics, also usevalidate-changefor broader validation
Files:
crates/core/tests/unit/observability/openinference_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/core/src/observability/atif.rs
crates/{core,adaptive}/**
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
If
crates/coreorcrates/adaptivechanged, run the full matrix across Rust, Python, Go, Node.js, and WebAssembly
Files:
crates/core/tests/unit/observability/openinference_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/core/src/observability/atif.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/openinference_tests.rscrates/core/tests/unit/observability/atof_tests.rscrates/core/src/observability/openinference.rscrates/core/tests/unit/atif_tests.rscrates/core/src/observability/atif.rs
**/*{test,spec,smoke}.{js,ts,py}
📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)
Relevant integration tests or smoke path must pass
Files:
integrations/openclaw/test/llm-replay.test.ts
crates/core/src/observability/{atif,otel,openinference}.rs
📄 CodeRabbit inference engine (.agents/skills/maintain-observability/SKILL.md)
When changing event fields in ATIF, OpenTelemetry, or OpenInference observability surfaces, keep the core event model in
crates/core/src/observability/atif.rs,crates/core/src/observability/otel.rs, andcrates/core/src/observability/openinference.rsin sync
Files:
crates/core/src/observability/openinference.rscrates/core/src/observability/atif.rs
.github/workflows/*.{yml,yaml}
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
.github/workflows/*.{yml,yaml}: Putpermissions:on each job that needs token access in GitHub Actions workflows
Avoid workflow-level permissions unless the repository intentionally centralizes them and the inheritance tradeoff is documented
Keep third-party actions pinned to full commit SHAs and preserve the readable version comment after the SHA
Prefer action-native or ecosystem-native caching over genericactions/cache
Use lockfiles or dependency manifests to drive cache invalidation in GitHub Actions workflows
Keep deploy and publish permissions isolated to the jobs that need them in GitHub Actions
Read both caller and callee when a workflow usesworkflow_callin GitHub Actions
Put release-tag validation in the earliest practical caller job when the pipeline has tag-based publish behavior
Keep release-tag policy aligned withRELEASING.md: raw SemVer tags only, no leadingv
contents: readis the default minimum permission for checkout-based build, test, docs, and packaging jobs
pull-requests: readis required for PR metadata lookup jobs in GitHub Actions workflows
pages: writeandid-token: writeshould be limited to Pages deployment jobs and callers that invoke them through reusable workflows
For reusable workflows, the caller must grant every permission the called jobs require; the callee cannot elevate beyond what the caller provides
Preferastral-sh/setup-uvcache support withcache-dependency-globanchored touv.lock
PreferSwatinem/rust-cachewith explicitshared-keyandworkspacesinstead of ad hoc target-directory caching
Avoid caching generated outputs that can hide stale behavior unless the repo already relies on them deliberately
Files:
.github/workflows/fern-docs.yml
.{github/workflows/*.{yml,yaml},gitlab-ci.yml}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Ensure CI workflows reference the same package names, install commands, and build commands as local development workflows
Files:
.github/workflows/fern-docs.yml
{pyproject.toml,**/*.py}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Maintain consistency between Python package names in
pyproject.tomland import paths used throughout the codebase
Files:
scripts/docs/sync_fern_docs_branch.py
{scripts/**,third-party/**}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
{scripts/**,third-party/**}: For third-party integration or patch changes, run patch validation with./scripts/apply-patches.sh --checkand relevant integration tests. Keep root./scripts/*.shwrappers for third-party flows
Run third-party patch bootstrap with./scripts/bootstrap-third-party.sh
Run third-party patch validation with./scripts/apply-patches.sh --check
Files:
scripts/docs/sync_fern_docs_branch.py
**/*.py
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
**/*.py: Run Python formatting withuv run ruff format python
Run Python testing withuv run pytest -k "<pattern>"
**/*.py: Use Ruff with rule sets E, F, W, I for Python linting
Use Ruff formatter with line length 120 and double quotes for Python code formatting
Runtyfor Python type checking
Use Python snake_case naming convention for Python identifiers
Include SPDX license header in all Python source files using hash comment syntax
Validate Python code withuv run pre-commit run --all-filesto enforce Ruff linting and formatting, and ty type checking
Files:
scripts/docs/sync_fern_docs_branch.py
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Do not hand-edit generated or packaged outputs unless the repository workflow expects them to be checked in. Regenerate through the documented recipe or script.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Prefer the repository `just` recipes over raw tool commands. Use raw `cargo`, `pytest`, `go test`, `npm`, or `wasm-pack` commands only for focused debugging or targeted single-test reruns.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Run tests for every language affected by a change. If you touch the Rust core runtime, middleware semantics, event shape, scope behavior, typed codecs, plugins, or observability, validate every affected binding.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Before review, prefer `uv run pre-commit run --all-files` when the change crosses languages or tooling.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Preserve the shared runtime model across bindings. Do not add behavior to one primary binding without considering Rust, Python, and Node.js parity.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Prefer documented public APIs and stable wrapper commands. Do not rely on internal helpers in examples or user-facing docs.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Keep primary documentation focused on Rust, Python, and Node.js. Treat Go, WebAssembly, and raw FFI as experimental and source-first unless binding-support guidance changes.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Update `README.md`, `fern/`, package READMEs, and binding-support notes when public behavior, package names, examples, or supported bindings change.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Keep release-process details in maintainer docs such as `RELEASING.md`. Do not move release-history policy into user-facing docs or `CHANGELOG.md`.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Keep stable public wrappers at the `scripts/` root in docs and examples. Reference namespaced helper paths only when documenting internal maintenance work.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Use branch prefixes from the contributor docs: `feat/`, `fix/`, `docs/`, `test/`, or `refactor/`.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Use signed-off commits for PR work: `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: Before creating, opening, publishing, or editing a pull request, read `.github/pull_request_template.md` and use it as the PR body skeleton. Preserve its visible headings, checklist items, and related-issue guidance.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: PR descriptions should include what changed, why, how it was tested, and any breaking changes within the repository template format.
Learnt from: CR
Repo: NVIDIA/NeMo-Relay
Timestamp: 2026-06-03T04:11:40.730Z
Learning: If repo-local PR guidance conflicts with generic GitHub connector or plugin guidance, follow the repo-local PR guidance for PR body format and review handoff details.
📚 Learning: 2026-05-07T18:04:44.387Z
Learnt from: mnajafian-nv
Repo: NVIDIA/NeMo-Flow PR: 67
File: integrations/openclaw/src/modules.ts:1-2
Timestamp: 2026-05-07T18:04:44.387Z
Learning: In NVIDIA/NeMo-Flow, TypeScript source files should use `//` line comments for SPDX headers (e.g., `// SPDX-FileCopyrightText: ...` and `// SPDX-License-Identifier: ...`) rather than C-style block comments (`/* ... */`). The repo’s copyright checker enforces this mapping, so `//` SPDX headers in `.ts` files should not be flagged as a style violation.
Applied to files:
integrations/openclaw/src/hook-replay/llm.tsintegrations/openclaw/test/llm-replay.test.ts
📚 Learning: 2026-05-03T04:23:07.497Z
Learnt from: willkill07
Repo: NVIDIA/NeMo-Flow PR: 46
File: .github/workflows/ci_rust.yml:31-64
Timestamp: 2026-05-03T04:23:07.497Z
Learning: In GitHub Actions workflow YAML, it’s valid to conditionally disable a service container by setting the service container’s `image` to an empty string (`''`) via a matrix variable (e.g., `redis_service_image: ''`). This intentionally makes the runner skip service initialization for that matrix entry rather than failing the job. When reviewing workflows, don’t flag this as an error if the workflow uses an empty `image` to disable the service on specific matrix entries (e.g., OS-specific setups); verify the `image` is sourced from the matrix variable and that the service is only expected to be available when a non-empty image is provided.
Applied to files:
.github/workflows/fern-docs.yml
🪛 LanguageTool
docs/about-nemo-relay/release-notes/highlights.mdx
[style] ~37-~37: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ... for guardrails plugin configuration. - Added guardrail scopes for conditional guardr...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[style] ~71-~71: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...t-in guardrails plugin documentation. - Added CI path filters, CLI draft release asse...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
🪛 markdownlint-cli2 (0.22.1)
.github/CODE_OF_CONDUCT.md
[warning] 6-6: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
🪛 Ruff (0.15.15)
scripts/docs/sync_fern_docs_branch.py
[warning] 203-203: Avoid specifying long messages outside the exception class
(TRY003)
🪛 zizmor (1.25.2)
.github/workflows/fern-docs.yml
[warning] 378-378: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment
(undocumented-permissions)
[info] 451-451: code injection via template expansion (template-injection): may expand into attacker-controllable code
(template-injection)
[error] 439-439: runtime artifacts potentially vulnerable to a cache poisoning attack (cache-poisoning): enables caching by default
(cache-poisoning)
willkill07
left a comment
There was a problem hiding this comment.
The commit history and changes with your rebase are causing issues that should not be present. Please rewrite the history to only contain your commits. There are changes which are out-of-scope and/or outdated.
8eecf56 to
ea87222
Compare
Signed-off-by: Yuchen Zhang <yuchenz@nvidia.com>
Signed-off-by: Yuchen Zhang <yuchenz@nvidia.com>
Thanks Will! Just cleaned up the PR and I'll appreciate another review |
willkill07
left a comment
There was a problem hiding this comment.
logic looks good! let's just relax the naming a bit to be more generic.
Signed-off-by: Yuchen Zhang <yuchenz@nvidia.com>
|
The naming has been generalized. @willkill07 could you re-approve when you get a chance? |
|
/merge |
Overview
Adds Relay-side support needed for NVIDIA NeMo Agent Toolkit to consume Hermes Relay telemetry.
This change:
Why
Hermes invokes hooks from its own config and can execute through a different process boundary than the caller. For NeMo Agent Toolkit integration, Relay needs to capture Hermes lifecycle events reliably and make them available as replayable ATOF JSONL so the toolkit can import them into its telemetry stream.
Details
Where should the reviewer start?
Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)
Summary by CodeRabbit
New Features
Bug Fixes
Tests
Documentation