feat: add and publish TypeScript adapter contract - #203
Conversation
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
|
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:
WalkthroughThis PR adds a TypeScript adapter-contract package with generated bindings, canonical schemas, validation, build targets, version synchronization, CI, and npm trusted publication. It also updates Rust validation and repository contribution, maintenance, and release guidance. ChangesAdapter contract delivery
Estimated code review effort: 4 (Complex) | ~75 minutes Sequence Diagram(s)sequenceDiagram
participant ReleaseTag
participant PublishWorkflow
participant PublishScript
participant NpmRegistry
ReleaseTag->>PublishWorkflow: trigger stable, beta, or RC publication
PublishWorkflow->>PublishScript: pass package version and dist-tag
PublishScript->>NpmRegistry: inspect registry state
PublishScript->>NpmRegistry: publish package artifact
PublishScript->>NpmRegistry: verify version, integrity, and dist-tag
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
Fern docs preview: https://nvidia-preview-pull-request-203.docs.buildwithfern.com/nemo/fabric |
There was a problem hiding this comment.
Actionable comments posted: 19
🤖 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 @.agents/skills/maintain-ci/SKILL.md:
- Around line 32-35: Update the permission guidance in maintain-ci so id-token:
write explicitly includes the protected npm publication job used by
publish_typescript.yml and publish_typescript_package.py, while keeping pages:
write restricted to Pages deployment jobs. Remove or revise the conflicting
limitation that scopes id-token: write only to Pages jobs.
In @.github/workflows/publish_typescript.yml:
- Around line 27-30: Add explanatory comments directly within the permissions
block of the workflow, documenting why contents: read and id-token: write are
required for publishing. Keep the existing permission scopes unchanged and make
each comment specific enough to guide future reviewers.
In @.pre-commit-config.yaml:
- Line 12: Update the file-matching regex in the copyright-header hook to
include the tsx extension alongside ts, ensuring both TypeScript and TSX files
are checked for SPDX headers while preserving all existing extensions and
matching behavior.
In `@crates/fabric-core/src/config.rs`:
- Around line 1191-1192: Add a compile-time exhaustiveness guard alongside
`TelemetryProvider::ALL` that matches every current `TelemetryProvider` variant
and becomes non-exhaustive when a new variant is added. Keep `ALL` as the source
for `adapter_telemetry_providers_schema`, ensuring contributors must update it
whenever extending the enum.
In `@justfile`:
- Around line 311-327: Extract the repeated adapter-contract dependency
installation into a shared just recipe, then make build-typescript,
generate-typescript-contract, pack-typescript, and test-typescript depend on it
instead of invoking npm ci themselves. Preserve each recipe’s existing command
sequence while ensuring chained targets install dependencies only once. Update
the publish_typescript.yml workflow to use the same test-typescript recipe or
otherwise remain behaviorally aligned with it.
In `@RELEASING.md`:
- Around line 153-155: Insert a blank line after list item 5 and before “Review
docs and snippets that mention explicit versions, including:” so the latter
renders as a separate paragraph rather than a continuation of the list item.
In `@scripts/ci/publish_typescript_package.py`:
- Around line 172-180: Update _state_matches in
scripts/ci/publish_typescript_package.py (lines 172-180) to handle a missing
dist.integrity separately from a present-but-different integrity, while
documenting or enforcing that equality requires a byte-identical repack and
reporting each case accurately. Update step 4 in RELEASING.md (lines 207-231) so
it no longer promises successful no-op reconciliation for manually published
tarballs, or pin bootstrap Node and npm versions to those used by
.github/workflows/publish_typescript.yml.
- Around line 244-262: Update the verification loop around _published_state and
_state_matches to fail immediately when a visible PublishedState conflicts with
the expected artifact, rather than retrying it; keep retries only when the state
is None. Ensure the conflict exception is not caught by the surrounding
PublicationError handler, and replace the fixed sleep(5) delay with exponential
backoff between remaining verification attempts.
In `@tests/scripts/test_publish_typescript_package.py`:
- Around line 152-176: Extend the tests around publish_package to cover invalid
dist_tag values, verification_attempts below one, packed-version mismatches,
unsafe or missing npm pack tarballs, and verification exhaustion after npm
publish fails. Assert each guard raises the expected error, and verify the final
exhaustion case includes both publish and verification failure details; use the
existing NpmRunner and helper symbols to model each response.
- Line 100: Remove the -> None return annotations from all affected test
functions in the test module, including
test_existing_exact_package_is_an_idempotent_success and the tests at the other
specified locations, while preserving their parameters and bodies.
In `@tests/scripts/test_set_typescript_project_version.py`:
- Line 98: Update the match expression in the pytest.raises call to use a raw
string literal for the regular expression, preserving the existing pattern and
exception assertion behavior.
- Around line 19-59: Convert _write_package_files into a pytest fixture using
`@pytest.fixture`(name="package_files") with a package_files_fixture function,
preserving its existing file-writing behavior and return values. Update each
affected test to accept package_files as an argument and use the fixture result
instead of calling the helper directly.
In `@typescript/adapter-contract/README.md`:
- Line 22: Update the README headings “Stable v1alpha2 contract” and “Preview
invocation types” to title case, preserving their existing wording and
structure.
- Around line 18-20: Update the documented TypeScript minimum in the README and
the corresponding version requirement in scripts/check-package.mjs to 5.3 or
later, keeping the existing Node.js and module-resolution guidance unchanged.
In `@typescript/adapter-contract/schemas/agent-config.schema.json`:
- Around line 170-179: Update the Rust fields AgentModelConfig.provider and
AgentModelConfig.model in crates/fabric-core/src/agent_config.rs to validate at
least one non-whitespace character using the existing regex validation
mechanism, while preserving their current non-empty string constraints.
Regenerate the canonical, TypeScript, and run-plan schema snapshots afterward.
In `@typescript/adapter-contract/schemas/agent-run-result.schema.json`:
- Around line 33-50: Update the Rust AgentArtifact::path schema attribute to
require at least one non-whitespace character, matching the existing name and
kind validation. Regenerate the canonical and mirrored agent-run-result schemas
so path retains its relative-path and traversal protections while rejecting
whitespace-only values.
In `@typescript/adapter-contract/scripts/check-package.mjs`:
- Around line 170-179: Update the dependency-field list in the package
validation loop to also check the npm-supported “bundleDependencies” spelling,
preserving the existing rejection behavior for any declared production
dependency field.
In `@typescript/adapter-contract/test/projection-guards.test.mjs`:
- Around line 28-36: Update the test’s conditional mutation to locate the target
conditional by its content rather than assuming it is at index 0; select the
entry whose then.required array is present, append "usage" to that array, and
preserve the existing assertRunResultConditionals failure assertion.
In `@typescript/adapter-contract/test/tsconfig.json`:
- Around line 1-13: Add the repository-required SPDX copyright and license
comments before the opening JSON object in both
typescript/adapter-contract/test/tsconfig.json (lines 1-13) and
typescript/adapter-contract/tsconfig.build.json (lines 1-16); no other
configuration changes are needed.
🪄 Autofix
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: 85f3cd77-6523-4efb-a951-c13172bdcee1
⛔ Files ignored due to path filters (6)
typescript/adapter-contract/package-lock.jsonis excluded by!**/package-lock.jsontypescript/adapter-contract/src/generated/adapter-descriptor.tsis excluded by!**/generated/**typescript/adapter-contract/src/generated/agent-config.tsis excluded by!**/generated/**typescript/adapter-contract/src/generated/agent-run-request.tsis excluded by!**/generated/**typescript/adapter-contract/src/generated/agent-run-result.tsis excluded by!**/generated/**typescript/adapter-contract/src/generated/runtime-context.tsis excluded by!**/generated/**
📒 Files selected for processing (46)
.agents/skills/contribute-api/SKILL.md.agents/skills/maintain-ci/SKILL.md.agents/skills/maintain-packaging/SKILL.md.agents/skills/update-project-version/SKILL.md.agents/skills/validate-change/SKILL.md.github/workflows/ci_typescript.yml.github/workflows/publish_typescript.yml.pre-commit-config.yamlAGENTS.mdCONTRIBUTING.mdREADME.mdRELEASING.mdcrates/fabric-core/src/config.rscrates/fabric-core/src/schema.rsdocs/adapter-contract/README.mdjustfileschemas/SCHEMA.mdschemas/adapter-contract/adapter-descriptor.schema.jsonschemas/run-plan.schema.jsonscripts/ci/publish_typescript_package.pyscripts/ci/set_typescript_project_version.pyskills/nemo-fabric-build-adapter/SKILL.mdtests/scripts/test_publish_typescript_package.pytests/scripts/test_set_typescript_project_version.pytypescript/adapter-contract/.gitignoretypescript/adapter-contract/LICENSEtypescript/adapter-contract/README.mdtypescript/adapter-contract/package.jsontypescript/adapter-contract/schemas/adapter-descriptor.schema.jsontypescript/adapter-contract/schemas/agent-config.schema.jsontypescript/adapter-contract/schemas/agent-run-request.schema.jsontypescript/adapter-contract/schemas/agent-run-result.schema.jsontypescript/adapter-contract/schemas/runtime-context.schema.jsontypescript/adapter-contract/scripts/check-package.mjstypescript/adapter-contract/scripts/clean.mjstypescript/adapter-contract/scripts/generate.mjstypescript/adapter-contract/scripts/projection-guards.mjstypescript/adapter-contract/src/index.tstypescript/adapter-contract/src/json.tstypescript/adapter-contract/src/preview.tstypescript/adapter-contract/src/version.tstypescript/adapter-contract/test/preview.test.tstypescript/adapter-contract/test/projection-guards.test.mjstypescript/adapter-contract/test/stable.test.tstypescript/adapter-contract/test/tsconfig.jsontypescript/adapter-contract/tsconfig.build.json
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
a1ff4ba to
416dc5c
Compare
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.agents/skills/update-project-version/SKILL.md (1)
23-24: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAlign the documented conversion with the implementation.
just set-versionpasses one SemVer string to every helper.set_python_project_versionswrites that string directly into Python metadata and dependency pins. Add PEP 440 conversion and cross-surface validation, with tests for prerelease and build-metadata versions.🤖 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 @.agents/skills/update-project-version/SKILL.md around lines 23 - 24, Align the versioning workflow documented around just set-version and set_python_project_versions with the implementation: convert SemVer prerelease and build metadata to valid PEP 440 before writing Python metadata or dependency pins, while preserving the original SemVer for TypeScript metadata. Add cross-surface validation and tests covering prerelease and build-metadata versions.Source: Learnings
🤖 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/publish_typescript.yml:
- Around line 69-99: After set_typescript_project_version.py updates the
manifests in the Prepare release metadata step, run git diff --exit-code to
require the tagged commit’s package.json and package-lock.json state to already
match the release version; fail the workflow with the resulting diff if they
differ, before writing release outputs.
- Around line 101-107: Update the release workflow’s TypeScript dependency setup
and test steps to reuse the `test-typescript` recipe, including its
`install-typescript` dependency, instead of duplicating `npm ci` with different
flags. If retaining `--no-audit --no-fund` is required, add them to
`install-typescript` so both paths remain identical.
In @.pre-commit-config.yaml:
- Line 12: Extend the pre-commit file matcher and the format handling in
check_copyright.py for .bash, .jsx, .css, and .scss, using # comments for .bash,
// comments for .jsx and .tsx, and block comments for .css and .scss. Keep the
existing .html support intact, and do not add JSON extensions until a valid
JSON-compatible SPDX strategy is defined.
In `@RELEASING.md`:
- Around line 203-219: Update the manual publish instructions in the release
workflow section to require Node 24 and npm 11.5.1 or newer before running npm
publish. Keep the existing bootstrap publish commands and ensure the documented
tool versions match the pins in publish_typescript.yml so the later repack
integrity check can reconcile.
In `@tests/scripts/test_publish_typescript_package.py`:
- Line 317: Update both match patterns in the relevant tests to use raw string
literals, preserving their existing regex text while preventing Ruff RUF043
warnings for unescaped period metacharacters.
- Around line 84-88: Convert _package_directory into a pytest fixture using the
required `@pytest.fixture`(name="package_directory") and package_directory_fixture
naming convention. Move the existing temporary package setup into that fixture,
then update every test using _package_directory to accept package_directory and
use the fixture directly instead of requesting tmp_path for this setup.
---
Outside diff comments:
In @.agents/skills/update-project-version/SKILL.md:
- Around line 23-24: Align the versioning workflow documented around just
set-version and set_python_project_versions with the implementation: convert
SemVer prerelease and build metadata to valid PEP 440 before writing Python
metadata or dependency pins, while preserving the original SemVer for TypeScript
metadata. Add cross-surface validation and tests covering prerelease and
build-metadata versions.
🪄 Autofix
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: fb9d0ebc-3ff7-4ed8-8c6e-79b79e16a500
📒 Files selected for processing (30)
.agents/skills/contribute-api/SKILL.md.agents/skills/maintain-ci/SKILL.md.agents/skills/maintain-packaging/SKILL.md.agents/skills/update-project-version/SKILL.md.agents/skills/validate-change/SKILL.md.github/workflows/publish_typescript.yml.pre-commit-config.yamlRELEASING.mdcrates/fabric-core/src/agent_config.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rscrates/fabric-core/src/schema.rsjustfileschemas/adapter-contract/agent-config.schema.jsonschemas/adapter-contract/agent-run-result.schema.jsonschemas/run-plan.schema.jsonscripts/ci/publish_typescript_package.pyscripts/ci/set_typescript_project_version.pytests/scripts/test_publish_typescript_package.pytests/scripts/test_set_typescript_project_version.pytypescript/adapter-contract/README.mdtypescript/adapter-contract/package.jsontypescript/adapter-contract/schemas/agent-config.schema.jsontypescript/adapter-contract/schemas/agent-run-result.schema.jsontypescript/adapter-contract/scripts/check-dependencies.mjstypescript/adapter-contract/scripts/check-package.mjstypescript/adapter-contract/scripts/generate.mjstypescript/adapter-contract/test/projection-guards.test.mjstypescript/adapter-contract/test/tsconfig.jsontypescript/adapter-contract/tsconfig.build.json
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
- GitHub Check: Test (Python 3.12, macos-arm64)
- GitHub Check: Test (Python 3.14, windows-amd64)
- GitHub Check: Test (Python 3.13, windows-amd64)
- GitHub Check: Test (Python 3.13, macos-arm64)
- GitHub Check: Test (Python 3.11, macos-arm64)
- GitHub Check: Test (Python 3.11, windows-amd64)
- GitHub Check: Test (Python 3.12, windows-amd64)
- GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (38)
**/*
📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)
**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.
**/*: Always spellNVIDIAin all caps; do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names withNVIDIAon first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...
Files:
schemas/adapter-contract/agent-run-result.schema.jsonschemas/adapter-contract/agent-config.schema.jsontypescript/adapter-contract/test/tsconfig.jsontypescript/adapter-contract/schemas/agent-config.schema.jsontypescript/adapter-contract/tsconfig.build.jsontests/scripts/test_set_typescript_project_version.pytypescript/adapter-contract/scripts/check-dependencies.mjscrates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rstypescript/adapter-contract/test/projection-guards.test.mjstypescript/adapter-contract/scripts/check-package.mjstypescript/adapter-contract/schemas/agent-run-result.schema.jsonjustfiletypescript/adapter-contract/README.mdcrates/fabric-core/src/config.rsscripts/ci/set_typescript_project_version.pyRELEASING.mdtypescript/adapter-contract/package.jsoncrates/fabric-core/src/agent_config.rsscripts/ci/publish_typescript_package.pytypescript/adapter-contract/scripts/generate.mjstests/scripts/test_publish_typescript_package.pyschemas/run-plan.schema.json
schemas/**/*
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
When a schema or public contract changes, run the Rust, Python, and TypeScript suites and review generated schemas, adapter-contract representations, TypeScript sources, and API references.
Files:
schemas/adapter-contract/agent-run-result.schema.jsonschemas/adapter-contract/agent-config.schema.jsonschemas/run-plan.schema.json
⚙️ CodeRabbit configuration file
schemas/**/*: Schemas are generated public contract snapshots. Check that schema diffs correspond to intentional Rust type changes and are covered by core tests.
Files:
schemas/adapter-contract/agent-run-result.schema.jsonschemas/adapter-contract/agent-config.schema.jsonschemas/run-plan.schema.json
**/*.{json,json5,jsonc,js,jsx,ts,tsx,css,scss}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
All source files must include the required SPDX license header, using the appropriate comment syntax for the file type.
Files:
schemas/adapter-contract/agent-run-result.schema.jsonschemas/adapter-contract/agent-config.schema.jsontypescript/adapter-contract/test/tsconfig.jsontypescript/adapter-contract/schemas/agent-config.schema.jsontypescript/adapter-contract/tsconfig.build.jsontypescript/adapter-contract/schemas/agent-run-result.schema.jsontypescript/adapter-contract/package.jsonschemas/run-plan.schema.json
{adapter-contract,typescript/adapter-contract}/**/*
📄 CodeRabbit inference engine (AGENTS.md)
Keep the southbound adapter contract documentation current when the API changes.
Files:
typescript/adapter-contract/test/tsconfig.jsontypescript/adapter-contract/schemas/agent-config.schema.jsontypescript/adapter-contract/tsconfig.build.jsontypescript/adapter-contract/scripts/check-dependencies.mjstypescript/adapter-contract/test/projection-guards.test.mjstypescript/adapter-contract/scripts/check-package.mjstypescript/adapter-contract/schemas/agent-run-result.schema.jsontypescript/adapter-contract/README.mdtypescript/adapter-contract/package.jsontypescript/adapter-contract/scripts/generate.mjs
**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For native binding changes, run
cargo check -p fabric-python --locked.
Files:
tests/scripts/test_set_typescript_project_version.pycrates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rsscripts/ci/set_typescript_project_version.pycrates/fabric-core/src/agent_config.rsscripts/ci/publish_typescript_package.pytests/scripts/test_publish_typescript_package.py
**/*.{md,mdx,yml,py,rs,sh}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
Keep documentation aligned with current NeMo Fabric behavior, repository layout, entry points, commands, package names, APIs, bindings, and support claims.
Files:
tests/scripts/test_set_typescript_project_version.pycrates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rstypescript/adapter-contract/README.mdcrates/fabric-core/src/config.rsscripts/ci/set_typescript_project_version.pyRELEASING.mdcrates/fabric-core/src/agent_config.rsscripts/ci/publish_typescript_package.pytests/scripts/test_publish_typescript_package.py
tests/**/*.py
📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)
tests/**/*.py: Use pytest to run Python tests.
Do not add@pytest.mark.asyncioto tests; async tests are automatically detected by the async runner.
Do not add-> Nonereturn type annotations to test functions.
When mocking a class, useunittest.mock.MagicMockorAsyncMock, using thespecargument when necessary, rather than defining a new class.
Prefix mocked class names withmock, notfake.
Prefer pytest fixtures over helper methods.
If a fixture is needed in multiple test files, define it once inconftest.pyrather than repeating it.
Define fixtures using@pytest.fixture(name="<fixture_name>"[, scope="<scope>"])and a<fixture_name>_fixturefunction; specifyscopeonly when it is notfunction.
Preferpytest.mark.parametrizeover separate tests for different input types.
Use@pytest.mark.usefixtureswhen a fixture is needed but its returned value is unused or it returns no value.
Avoid defensive programming in tests; access expected values directly so missing data raises a clear failure, such as usingresults["data"]instead ofresults.get("data").
When adapter installation metadata changes, packaging metadata tests must directly assert that the root project depends unconditionally on the exact-versionnemo-fabric-runtimedistribution.
Packaging metadata tests must verify that each root harness extra delegates to the matching version of the leaf adapter'sharnessextra.
Packaging metadata tests must verify that bare leaf dependencies remain adapter-owned and that the rootadapter-testsdependency group installs each leaf through itsharnessextra.
Packaging metadata tests must verify that every leaf providesfull; only adapters importing NeMo Relay Python APIs providerelay, while adapters using an external Relay executable havefullequal toharness.
Files:
tests/scripts/test_set_typescript_project_version.pytests/scripts/test_publish_typescript_package.py
**/*.{py,pyi}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
When Python code or a Python-facing adapter changes, run
just test-python.
Files:
tests/scripts/test_set_typescript_project_version.pyscripts/ci/set_typescript_project_version.pyscripts/ci/publish_typescript_package.pytests/scripts/test_publish_typescript_package.py
**/*.{rs,py,ts,tsx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.{rs,py,ts,tsx}: Use language-appropriate naming:snake_casefor Rust and Python functions and variables;PascalCasefor Rust, Python, and TypeScript types; preserve wiresnake_casenames for TypeScript contract properties.
Run tests for every affected language surface; changes to the Rust core or public adapter-contract schemas require Rust, Python, and TypeScript test suites.
When adding functionality, include tests in the corresponding Rust crate or relevanttests/area.
Keep checked-in JSON Schema snapshots, Python representations, and generated TypeScript declarations synchronized when public contracts change.
Use the repositoryjustfiletest targets (just test-rust,just test-python,just test-typescript, orjust test-all) rather than ad hoc test commands where applicable.
Files:
tests/scripts/test_set_typescript_project_version.pycrates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rsscripts/ci/set_typescript_project_version.pycrates/fabric-core/src/agent_config.rsscripts/ci/publish_typescript_package.pytests/scripts/test_publish_typescript_package.py
**/*.py
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.
Files:
tests/scripts/test_set_typescript_project_version.pyscripts/ci/set_typescript_project_version.pyscripts/ci/publish_typescript_package.pytests/scripts/test_publish_typescript_package.py
**/*.{rs,py,html,md,mdx,toml,yml,yaml,sh,bash}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Include the required SPDX copyright and Apache-2.0 license header in every source file, using the comment syntax appropriate to its file type.
Files:
tests/scripts/test_set_typescript_project_version.pycrates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rstypescript/adapter-contract/README.mdcrates/fabric-core/src/config.rsscripts/ci/set_typescript_project_version.pyRELEASING.mdcrates/fabric-core/src/agent_config.rsscripts/ci/publish_typescript_package.pytests/scripts/test_publish_typescript_package.py
{tests/**,python/tests/**}
⚙️ CodeRabbit configuration file
{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.
Files:
tests/scripts/test_set_typescript_project_version.pytests/scripts/test_publish_typescript_package.py
.pre-commit-config.yaml
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Regenerate attribution files with the named pre-commit hooks rather than editing generated output:
attributions-rustandattributions-python.
Files:
.pre-commit-config.yaml
**/*.{rs,toml}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For any Rust change, run
just test-rustandcargo fmt --all -- --check.When Rust code changes, run
cargo fmt --all -- --checkandjust test-rust.
Files:
crates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rs
crates/fabric-core/**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
Changes under
crates/fabric-coremust run both the Rust and Python test suites.
Files:
crates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rs
crates/fabric-core/**/*.rs
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
For Rust API reference changes, update Rust documentation comments under
crates/fabric-core/instead of generated API reference files.
Files:
crates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rs
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Implement new or changed public API behavior in the shared Rust core first.
**/*.rs: Format Rust code withcargo fmt --alland ensurecargo fmt --all -- --checkpasses.
Runcargo check --workspace --lockedfor changes affecting the Rust workspace, core runtime, CLI, or native Python extension.
Files:
crates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rs
crates/fabric-core/**/*
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
If
crates/fabric-corechanges in a way exposed through Python, run both the Rust and Python test suites.
Files:
crates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rs
crates/fabric-core/src/**/*.rs
⚙️ CodeRabbit configuration file
crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.
Files:
crates/fabric-core/src/schema.rscrates/fabric-core/src/agent_execution.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rs
.github/workflows/*.{yml,yaml}
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
.github/workflows/*.{yml,yaml}: Definepermissions:on each job that needs token access, avoid workflow-level permissions unless centralized inheritance is intentionally documented, and grant only the minimum required scopes.
Pin every third-party action to a full commit SHA and retain a readable version comment after the SHA.
Prefer action-native or ecosystem-native caching over genericactions/cache.
Tie cache invalidation to lockfiles, dependency manifests, or explicit tool versions.
Isolate deploy and publish permissions to only the jobs that require them.
When usingworkflow_call, inspect and account for both the caller and callee workflows.
Keep local commands aligned with equivalentjustfilerecipes.
Keep tag filters, prerelease normalization, and publication behavior aligned withRELEASING.md.
Usecontents: readas the minimum permission for checkout-based build, test, documentation, and packaging jobs.
Grantpull-requests: readonly when a job performs pull-request metadata lookup.
Limitpages: writeto Pages deployment jobs and callers that invoke those jobs through reusable workflows.
Limitid-token: writeto jobs exchanging GitHub OIDC tokens with protected deployment targets, including Pages deployment and protected npm publication jobs.
For reusable workflows, callers must grant every permission required by called jobs; callees cannot elevate permissions beyond the caller's grant.
For Python workflows, preferastral-sh/setup-uvcaching withcache-dependency-globanchored touv.lock.
For Rust workflows, preferSwatinem/rust-cachewith explicitshared-keyandworkspacesinstead of ad hoc target-directory caching.
Avoid caching generated outputs that can hide stale behavior unless the repository deliberately relies on them.
Pass secrets only to the jobs that consume them.
Ensure concurrency, branch filters, and documentation publication guards reflect repository intent.
Before editing, inspect workflow uses, permissions, se...
Files:
.github/workflows/publish_typescript.yml
.github/workflows/publish_typescript.yml
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
Publish the TypeScript contract through the protected
npmjsenvironment, grantid-token: writefor npm trusted publishing, and do not provide an npm write token that could mask an OIDC configuration failure.Use npm trusted publishing through the protected
npmjsenvironment.
Files:
.github/workflows/publish_typescript.yml
.github/workflows/{ci_typescript.yml,publish_typescript.yml,ci_python.yml,ci_rust.yml}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Keep CI install commands and package names consistent with local workflows and current packaging metadata.
Files:
.github/workflows/publish_typescript.yml
.agents/skills/**
📄 CodeRabbit inference engine (.agents/skills/README.md)
.agents/skills/**: Maintainer skills must be discoverable from.agents/skills/; Claude Code exposes the same set through.claude/skillswithout mixing in consumer skills.
Keep consumer-facing integration guidance in the top-levelskills/directory and exclude it from the maintainer skill set.
Files:
.agents/skills/maintain-packaging/SKILL.md.agents/skills/contribute-api/SKILL.md.agents/skills/validate-change/SKILL.md.agents/skills/update-project-version/SKILL.md.agents/skills/maintain-ci/SKILL.md
.agents/skills/*/
📄 CodeRabbit inference engine (.agents/skills/README.md)
Use descriptive, task-based names for maintainer skill directories, such as
contribute-apiorvalidate-change.
Files:
.agents/skills/maintain-packaging/SKILL.md.agents/skills/contribute-api/SKILL.md.agents/skills/validate-change/SKILL.md.agents/skills/update-project-version/SKILL.md.agents/skills/maintain-ci/SKILL.md
.agents/skills/**/*.md
📄 CodeRabbit inference engine (AGENTS.md)
Maintainer skills under
.agents/skills/may reference repository internals and contribution commands and are intended for contributing to NeMo Fabric itself.
Files:
.agents/skills/maintain-packaging/SKILL.md.agents/skills/contribute-api/SKILL.md.agents/skills/validate-change/SKILL.md.agents/skills/update-project-version/SKILL.md.agents/skills/maintain-ci/SKILL.md
.agents/skills/maintain-packaging/SKILL.md
📄 CodeRabbit inference engine (AGENTS.md)
Keep packaging implementation guidance in
.agents/skills/maintain-packaging/SKILL.md.
Files:
.agents/skills/maintain-packaging/SKILL.md
justfile
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
Use
just --fmt --checkas the initial narrow validation check.Keep build, test, clean, and documentation recipes consistent with current package names and commands.
The
set-versionrecipe must runjust lock-pythonafter source metadata is updated.
Files:
justfile
**/*.{md,mdx,rst}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spellNVIDIAin all caps; do not useNvidia,nvidia, orNV.
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 ashereorread more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce, and preferrefer tooverseewhen directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
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 commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.
**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...
Files:
typescript/adapter-contract/README.mdRELEASING.md
**/*.{md,rst,txt,adoc}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)
**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Usecanfor possibility and reservemayfor permission; useafterfor temporal order; userefer tofor cross-references; prefer short direct sentences and specific verbs; avoid unnecessarypleasein technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: usefor exampleorsuch asinstead ofe.g.,and so oninstead ofetc.,that isinstead ofi.e.,compared toinstead ofvs., andby,through, orusinginstead ofvia. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Usethatwithout commas for essential clauses, andwhichwith commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such asJune 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space beforea.m.orp.m.; useETandPTfor needed time zones; avoid24/7; and preferfrom 12:30 to 1:00 p.m.for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...
Files:
typescript/adapter-contract/README.mdRELEASING.md
**/*.{md,mdx}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
**/*.{md,mdx}: Use the full product nameNVIDIA NeMo Fabricon first use, typically in the title and H1; useNeMo Fabricthereafter. Usefabricalone only for the CLI tool and surround it with backticks.
Treat incorrect or stale commands, package names, paths, APIs, support claims, procedures, examples, terminology, or public behavior documentation as blocking issues.
CapitalizeNVIDIAcorrectly and format code, commands, paths, and filenames as inline code where needed.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences; ensure examples match current APIs and build commands.
Use descriptive anchor text, avoid raw URLs and generic labels such ashere, and use repository-relative.mdxpaths for links withindocs/.
Prefer active voice, present tense, short sentences, plain English, consistent terminology, and imperative, parallel, scannable procedures.
Useafterinstead ofoncewhen expressing temporal sequence, and usecanrather thanmaywhen describing possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
When reporting documentation-review findings, lead withMust fix,Should fix, andNice to havecategories; include file path, line reference, current problem, rationale, and a concrete rewrite or direction.Update documentation and examples in the same branch as a public API addition or behavior change.
Update documentation in the same branch when public behavior, adapters, examples, or workspace structure changes.
Files:
typescript/adapter-contract/README.mdRELEASING.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}
⚙️ CodeRabbit configuration file
{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercasefabricCLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.
Files:
typescript/adapter-contract/README.mdRELEASING.md
RELEASING.md
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Reflect public packaging changes, release tags, registry publication, and release-facing commands in the release documentation.
Keep release policy and the end-to-end maintainer workflow in
RELEASING.md; do not move release-history policy into user-facing documentation or add a duplicateCHANGELOG.md.
Files:
RELEASING.md
**/{Cargo.toml,Cargo.lock,pyproject.toml,package.json}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For new or updated dependencies, document the functional need, alternatives considered, and why the selected dependency is the narrowest fit.
Files:
typescript/adapter-contract/package.json
**/{Cargo.toml,pyproject.toml,package.json}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
**/{Cargo.toml,pyproject.toml,package.json}: Keep package names, import paths, and module names internally consistent.
For each new dependency, record the functional need, viable alternatives considered, why the selected dependency is the narrowest fit, and any unresolved licensing question.
Files:
typescript/adapter-contract/package.json
typescript/adapter-contract/{package.json,package-lock.json}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Keep the adapter-contract package's production dependency graph empty; build-only dependencies must have permissive, recorded license evidence. Its package version follows the workspace release version without changing its independent wire contract version.
Files:
typescript/adapter-contract/package.json
**/{Cargo.toml,pyproject.toml,package.json,Cargo.lock,uv.lock,package-lock.json}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Inspect resolved transitive dependencies, not only direct package licenses. Treat unknown, non-SPDX/custom, proprietary, source-available, copyleft, and network-copyleft terms as explicit review points and route unresolved questions to dependency approvers with distribution and linkage context.
Files:
typescript/adapter-contract/package.json
typescript/adapter-contract/package.json
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
Keep the TypeScript adapter-contract package version aligned with the normalized Cargo SemVer release version.
Files:
typescript/adapter-contract/package.json
**/{package.json,npm-shrinkwrap.json,package-lock.json}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
When the TypeScript manifest or npm lockfile changes, inspect the complete npm dependency tree and license fields, confirm zero production dependencies, and run package and audit checks.
Files:
typescript/adapter-contract/package.json
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:06.921Z
Learning: For each public API addition or behavior change, determine whether the CLI, PyO3 binding, Python SDK, type stubs, schemas, and Python/TypeScript adapter-contract bindings must expose it.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:06.921Z
Learning: Keep every affected public API surface in parity.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:06.921Z
Learning: Clearly describe public behavior, cover every affected public surface, ensure the validation matrix matches the changed surfaces, and explain the user-facing change in PR notes.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:06.921Z
Learning: Use the `karpathy-guidelines` companion guidance during implementation or review; keep changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:17.232Z
Learning: When local lint passes but GitHub authorization is uncertain, inspect GitHub's permission model and the upstream action or reusable workflow source rather than assuming local success proves remote success.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: Use valid Cargo SemVer for prerelease or build-metadata releases and equivalent PEP 440 versions in explicit Python metadata; verify that built package versions are equivalent rather than copying incompatible syntax.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: When changing the helper code, keep `set_project_version` aligned so it calls the Cargo, Python, and TypeScript version helpers.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: `set_cargo_workspace_version` must update the workspace version and `nemo-fabric-core` dependency, then verify every `nemo-fabric-*` workspace package through Cargo metadata.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: `set_python_project_versions` must recursively update the root setuptools version, adapter manifests, and internal exact-version pins while rejecting a static version in `python/pyproject.toml`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: `set_typescript_project_version` must update the package manifest and both root npm lockfile version entries without changing dependency versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: Validate version changes with targeted searches, `cargo check --workspace --locked`, Python build/package validation, relevant tests and wheel builds, TypeScript packaging validation, and `git diff --check` as appropriate.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: Avoid blind repository-wide replacement of version-like strings; distinguish package-version surfaces from examples and unrelated dependency versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:37.296Z
Learning: Keep version changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: Keep integration skills under `skills/` separate from maintainer skills under `.agents/skills/`; do not mix external integration guidance with repository-internal contribution guidance.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: Update user-facing entry points when public behavior, the `nemo-fabric` package, examples, or supported bindings change, including the README, Fern docs, adapter and integration READMEs, and examples README.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: Run `just docs` after changing the documentation site.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: Use branch prefixes `feat/`, `fix/`, `docs/`, `test/`, or `refactor/`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: Name branches after the work, never the Linear ticket; do not embed ticket IDs or slugs in branch names.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: Use signed-off commits for pull-request work with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: When creating a pull request from the current branch, target the upstream repository rather than a fork.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:21:58.571Z
Learning: PR descriptions must include what changed, why, how it was tested, and any breaking changes within the repository template format.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:22:07.121Z
Learning: All contributors must sign off every commit using `git commit -s`; unsigned commits will not be accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:22:07.121Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:22:07.121Z
Learning: Pull requests require at least one approving review, passing CI, and completion of requested review changes; do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:22:07.121Z
Learning: Use commit messages in the format `type: short description`, with an allowed type such as `feat`, `fix`, `docs`, `test`, `refactor`, `chore`, or `perf`; keep the first line under 72 characters.
📚 Learning: 2026-08-07T07:15:33.918Z
Learnt from: AnuradhaKaruppiah
Repo: NVIDIA/NeMo-Fabric PR: 186
File: schemas/adapter-contract/legacy/adapter-invocation.schema.json:176-176
Timestamp: 2026-08-07T07:15:33.918Z
Learning: For the NeMo Fabric v1alpha southbound adapter contract, treat the adapter descriptor's `contract_version` as the version of the complete contract, including `RuntimeContext`. Keep `RuntimeContext` strict by rejecting unknown properties, and require a negotiated contract-version change for additive shape changes.
Applied to files:
schemas/adapter-contract/agent-run-result.schema.jsonschemas/adapter-contract/agent-config.schema.json
📚 Learning: 2026-08-07T07:15:35.305Z
Learnt from: AnuradhaKaruppiah
Repo: NVIDIA/NeMo-Fabric PR: 186
File: schemas/adapter-contract/agent-config.schema.json:374-381
Timestamp: 2026-08-07T07:15:35.305Z
Learning: For the NeMo Fabric southbound adapter contract schemas, treat `AdapterDescriptor.contract_version` as the single negotiated version for the entire contract, covering `AgentConfig`, `AgentRunRequest`, `AgentRunResult`, and `RuntimeContext` before adapter startup. Do not require individual version fields in these payloads; verify behavior against the maintained adapter-contract README.
Applied to files:
schemas/adapter-contract/agent-run-result.schema.jsonschemas/adapter-contract/agent-config.schema.json
🪛 ast-grep (0.45.1)
tests/scripts/test_set_typescript_project_version.py
[info] 119-119: use jsonify instead of json.dumps for JSON output
Context: json.dumps(lock, indent=2)
Note: [CWE-116] Improper Encoding or Escaping of Output.
(use-jsonify)
scripts/ci/publish_typescript_package.py
[error] 49-55: Command coming from incoming request
Context: subprocess.run(
["npm", *arguments],
cwd=cwd,
check=False,
capture_output=True,
text=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').
(subprocess-from-request)
tests/scripts/test_publish_typescript_package.py
[info] 46-55: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
[
{
"name": PACKAGE,
"version": version,
"integrity": INTEGRITY,
"filename": filename,
}
]
)
Note: [CWE-116] Improper Encoding or Escaping of Output.
(use-jsonify)
🪛 LanguageTool
.agents/skills/maintain-packaging/SKILL.md
[uncategorized] ~32-~32: The official name of this software platform is spelled with a capital “H”.
Context: ...mmands - npm trusted publishing through .github/workflows/publish_typescript.yml and ...
(GITHUB)
RELEASING.md
[uncategorized] ~381-~381: The official name of this software platform is spelled with a capital “H”.
Context: ...ml) | For RC, beta and release tags | | [.github/workflows/publish_typescript.yml](.git...
(GITHUB)
.agents/skills/maintain-ci/SKILL.md
[style] ~49-~49: To form a complete sentence, be sure to include a subject.
Context: ... metadata lookup jobs. - pages: write should be limited to Pages deployment jobs and...
(MISSING_IT_THERE)
[style] ~51-~51: To form a complete sentence, be sure to include a subject.
Context: ... reusable workflow. - id-token: write should be limited to jobs that exchange a GitH...
(MISSING_IT_THERE)
🪛 Ruff (0.16.1)
scripts/ci/publish_typescript_package.py
[error] 50-50: subprocess call: check for execution of untrusted input
(S603)
[error] 51-51: Starting a process with a partial executable path
(S607)
[warning] 77-77: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 84-84: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 117-117: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 120-120: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 122-124: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 126-126: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 128-128: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 143-145: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 223-223: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 225-225: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 245-247: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 274-277: Avoid specifying long messages outside the exception class
(TRY003)
[warning] 278-278: Avoid specifying long messages outside the exception class
(TRY003)
tests/scripts/test_publish_typescript_package.py
[warning] 317-317: Pattern passed to match= contains metacharacters but is neither escaped nor raw
(RUF043)
[warning] 357-357: Pattern passed to match= contains metacharacters but is neither escaped nor raw
(RUF043)
[warning] 452-452: Boolean-typed positional argument in function definition
(FBT001)
🪛 zizmor (1.29.0)
.github/workflows/publish_typescript.yml
[warning] 32-32: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment
(undocumented-permissions)
🔇 Additional comments (29)
.agents/skills/contribute-api/SKILL.md (1)
3-3: LGTM!Also applies to: 23-24, 40-40
.agents/skills/maintain-ci/SKILL.md (1)
32-35: LGTM!Also applies to: 49-53, 103-104
.agents/skills/maintain-packaging/SKILL.md (1)
3-3: LGTM!Also applies to: 27-33, 66-69, 89-90, 109-113
.agents/skills/update-project-version/SKILL.md (1)
3-3: LGTM!Also applies to: 40-41, 51-61, 70-80, 92-99, 108-108, 121-122
.agents/skills/validate-change/SKILL.md (1)
26-41: LGTM!Also applies to: 63-65, 78-78, 95-99, 129-132
crates/fabric-core/src/config.rs (1)
1193-1199: LGTM!crates/fabric-core/src/agent_execution.rs (1)
145-146: LGTM!Also applies to: 177-209, 304-325
schemas/run-plan.schema.json (1)
108-175: LGTM!Also applies to: 332-343, 611-621
schemas/adapter-contract/agent-config.schema.json (1)
170-180: LGTM!schemas/adapter-contract/agent-run-result.schema.json (1)
33-50: LGTM!typescript/adapter-contract/schemas/agent-config.schema.json (1)
170-180: LGTM!typescript/adapter-contract/README.md (1)
12-32: LGTM!Also applies to: 34-113
typescript/adapter-contract/package.json (1)
34-41: LGTM!typescript/adapter-contract/schemas/agent-run-result.schema.json (1)
33-50: LGTM!typescript/adapter-contract/scripts/generate.mjs (1)
95-97: LGTM!typescript/adapter-contract/scripts/check-dependencies.mjs (1)
1-57: LGTM!crates/fabric-core/src/agent_config.rs (1)
67-70: 🎯 Functional CorrectnessKeep the current validation.
validate_configrejects blankproviderandmodelvalues beforeAgentConfigprojection. Runtime startup revalidatesplan.config; the projectedAgentConfigis serialized only.> Likely an incorrect or invalid review comment.crates/fabric-core/src/schema.rs (1)
394-399: LGTM!Also applies to: 429-429
typescript/adapter-contract/scripts/check-package.mjs (1)
175-175: LGTM!typescript/adapter-contract/test/projection-guards.test.mjs (1)
30-34: LGTM!scripts/ci/set_typescript_project_version.py (1)
13-19: LGTM!tests/scripts/test_set_typescript_project_version.py (1)
19-21: LGTM!Also applies to: 63-86, 89-123
scripts/ci/publish_typescript_package.py (2)
17-97: LGTM!Also applies to: 100-181, 213-278
238-247: 🩺 Stability & AvailabilityNo change needed. The release workflow accepts only stable, beta, and RC versions, and rejects unsupported prerelease labels before publication. The publisher can retain its fail-closed behavior for an unsupported registry dist-tag version.
tests/scripts/test_publish_typescript_package.py (1)
104-118: LGTM!Also applies to: 161-186, 241-266, 369-438, 441-456
justfile (1)
311-325: LGTM!Also applies to: 327-328, 401-406
.github/workflows/publish_typescript.yml (1)
6-14: LGTM!Also applies to: 20-44, 46-67, 109-119
RELEASING.md (1)
34-34: LGTM!Also applies to: 151-155, 229-247, 381-381, 394-411, 449-458
typescript/adapter-contract/test/tsconfig.json (1)
1-3: 🗄️ Data Integrity & IntegrationKeep the SPDX headers in both
tsconfigfiles. The repository invokes these files throughtsc, not a strict JSON parser.> Likely an incorrect or invalid review comment.
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
416dc5c to
d6ac027
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
typescript/adapter-contract/README.md (1)
92-98: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winShould fix: Use a complete lead-in sentence.
Line 92 uses the fragment “From this directory:”. Introduce the command block with a complete sentence.
Proposed fix
-From this directory: +Run the following commands from this directory:As per coding guidelines, “Introduce every code block with a complete sentence.”
🤖 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 `@typescript/adapter-contract/README.md` around lines 92 - 98, Update the prose introducing the command block near the setup instructions to use a complete lead-in sentence instead of the fragment “From this directory:”. Preserve the existing npm commands and their order.Source: Coding guidelines
🤖 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 `@RELEASING.md`:
- Around line 451-457: Update the TypeScript contract package verification step
in RELEASING.md to include commands that install the exact release version from
a clean directory, then run npm audit signatures. Keep the existing npm view
checks for version and dist-tags, and make the added commands executable for
validating registry signatures and provenance attestations.
In `@tests/scripts/test_publish_typescript_package.py`:
- Around line 160-183: Parameterize test_absent_package_publishes_and_verifies
to cover both latest and next tags, updating expected version and dist-tag
lookups plus the npm publish command from the selected tag. Preserve the
existing publish-and-verify assertions and ensure the next case verifies
dist-tags.next and publishes with --tag next.
- Around line 429-444: Update test_version_order to remove the boolean
positional parameter from its signature; parameterize each case as a single
typed value containing candidate, current, and expected ordering, then unpack it
inside the test before asserting _version_key results.
---
Outside diff comments:
In `@typescript/adapter-contract/README.md`:
- Around line 92-98: Update the prose introducing the command block near the
setup instructions to use a complete lead-in sentence instead of the fragment
“From this directory:”. Preserve the existing npm commands and their order.
🪄 Autofix
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: 778b0d38-b696-420f-9bab-7ff2b2a491f0
📒 Files selected for processing (12)
.agents/skills/update-project-version/SKILL.md.github/workflows/publish_typescript.yml.pre-commit-config.yamlRELEASING.mdcrates/fabric-core/src/agent_config.rscrates/fabric-core/src/config.rscrates/fabric-core/src/runtime.rscrates/fabric-core/src/schema.rsscripts/lint/check_copyright.pytests/scripts/test_publish_typescript_package.pytypescript/adapter-contract/README.mdtypescript/adapter-contract/scripts/check-dependencies.mjs
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
- GitHub Check: Preview docs
- GitHub Check: Test (Python 3.14, windows-amd64)
- GitHub Check: Test (Python 3.12, windows-amd64)
- GitHub Check: Test (Python 3.11, windows-amd64)
- GitHub Check: Test (Python 3.13, windows-amd64)
- GitHub Check: Test (Python 3.12, macos-arm64)
- GitHub Check: Test (Python 3.13, macos-arm64)
- GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (29)
**/*
📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)
**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.
**/*: Always spellNVIDIAin all caps; do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names withNVIDIAon first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...
Files:
scripts/lint/check_copyright.pytypescript/adapter-contract/README.mdcrates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rstypescript/adapter-contract/scripts/check-dependencies.mjsRELEASING.mdcrates/fabric-core/src/agent_config.rstests/scripts/test_publish_typescript_package.pycrates/fabric-core/src/schema.rs
**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For native binding changes, run
cargo check -p fabric-python --locked.
Files:
scripts/lint/check_copyright.pycrates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rstests/scripts/test_publish_typescript_package.pycrates/fabric-core/src/schema.rs
**/*.{md,mdx,yml,py,rs,sh}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
Keep documentation aligned with current NeMo Fabric behavior, repository layout, entry points, commands, package names, APIs, bindings, and support claims.
Files:
scripts/lint/check_copyright.pytypescript/adapter-contract/README.mdcrates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rsRELEASING.mdcrates/fabric-core/src/agent_config.rstests/scripts/test_publish_typescript_package.pycrates/fabric-core/src/schema.rs
**/*.{py,pyi}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
**/*.{py,pyi}: When Python code or a Python-facing adapter changes, runjust test-python.
For Python SDK or PyO3 binding changes, usepython-tests, run focused pytest tests first, thenjust test-python; rebuild withjust build-pythonwhen native code or packaging changes.
Files:
scripts/lint/check_copyright.pytests/scripts/test_publish_typescript_package.py
**/*.{rs,py,pyi,toml}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
If the PyO3 bridge or package metadata changes, run
just build-pythonandcargo check -p fabric-python --locked.
Files:
scripts/lint/check_copyright.pycrates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rstests/scripts/test_publish_typescript_package.pycrates/fabric-core/src/schema.rs
**/*.py
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.py: Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.
Python files must use the specified two-line SPDX header with Python comments.
Files:
scripts/lint/check_copyright.pytests/scripts/test_publish_typescript_package.py
**/*.{rs,py,ts,tsx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
**/*.{rs,py,ts,tsx}: Usesnake_casefor Rust and Python functions and variables, andPascalCasefor Rust, Python, and TypeScript types.
Run tests for every language surface affected by a change; changes to the Rust core or public adapter-contract schemas require Rust, Python, and TypeScript test suites.
When adding functionality, include tests in the corresponding Rust crate or relevanttests/area.
Public contract changes must keep checked-in JSON Schema snapshots, Python representations, and generated TypeScript declarations synchronized.
Files:
scripts/lint/check_copyright.pycrates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rstests/scripts/test_publish_typescript_package.pycrates/fabric-core/src/schema.rs
**/*.{rs,py,js,ts,tsx,html,md,mdx,toml,yaml,yml,sh,bash}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
All source files must include the project SPDX copyright and Apache-2.0 license header using the comment syntax appropriate to the file type.
Files:
scripts/lint/check_copyright.pytypescript/adapter-contract/README.mdcrates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rsRELEASING.mdcrates/fabric-core/src/agent_config.rstests/scripts/test_publish_typescript_package.pycrates/fabric-core/src/schema.rs
**/*.{md,mdx,rst}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spellNVIDIAin all caps; do not useNvidia,nvidia, orNV.
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 ashereorread more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce, and preferrefer tooverseewhen directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
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 commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.
**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...
Files:
typescript/adapter-contract/README.mdRELEASING.md
**/*.{md,rst,txt,adoc}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)
**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Usecanfor possibility and reservemayfor permission; useafterfor temporal order; userefer tofor cross-references; prefer short direct sentences and specific verbs; avoid unnecessarypleasein technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: usefor exampleorsuch asinstead ofe.g.,and so oninstead ofetc.,that isinstead ofi.e.,compared toinstead ofvs., andby,through, orusinginstead ofvia. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Usethatwithout commas for essential clauses, andwhichwith commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such asJune 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space beforea.m.orp.m.; useETandPTfor needed time zones; avoid24/7; and preferfrom 12:30 to 1:00 p.m.for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...
Files:
typescript/adapter-contract/README.mdRELEASING.md
**/*.{md,mdx}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
**/*.{md,mdx}: Use the full product nameNVIDIA NeMo Fabricon first use, typically in the title and H1; useNeMo Fabricthereafter. Usefabricalone only for the CLI tool and surround it with backticks.
Treat incorrect or stale commands, package names, paths, APIs, support claims, procedures, examples, terminology, or public behavior documentation as blocking issues.
CapitalizeNVIDIAcorrectly and format code, commands, paths, and filenames as inline code where needed.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences; ensure examples match current APIs and build commands.
Use descriptive anchor text, avoid raw URLs and generic labels such ashere, and use repository-relative.mdxpaths for links withindocs/.
Prefer active voice, present tense, short sentences, plain English, consistent terminology, and imperative, parallel, scannable procedures.
Useafterinstead ofoncewhen expressing temporal sequence, and usecanrather thanmaywhen describing possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
When reporting documentation-review findings, lead withMust fix,Should fix, andNice to havecategories; include file path, line reference, current problem, rationale, and a concrete rewrite or direction.Update documentation and examples in the same branch as the public API change.
Update SDK/API references, embedded examples, integration documentation, and adapter-support notes when public behavior or related surfaces change.
Files:
typescript/adapter-contract/README.mdRELEASING.md
typescript/adapter-contract/**/*
📄 CodeRabbit inference engine (AGENTS.md)
Keep the TypeScript southbound adapter contract current when the API changes.
Files:
typescript/adapter-contract/README.mdtypescript/adapter-contract/scripts/check-dependencies.mjs
**/README.md
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update the relevant README when changes affect the public workspace, supported adapters, adapter surfaces, or examples.
Files:
typescript/adapter-contract/README.md
**/*.{html,md}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
HTML and Markdown files must use the specified SPDX header comment.
Files:
typescript/adapter-contract/README.mdRELEASING.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}
⚙️ CodeRabbit configuration file
{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercasefabricCLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.
Files:
typescript/adapter-contract/README.mdRELEASING.md
.github/workflows/*.{yml,yaml}
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
.github/workflows/*.{yml,yaml}: Definepermissions:on each job that needs token access, avoid workflow-level permissions unless centralized inheritance is intentionally documented, and grant each job only its minimum required permissions.
Pin every third-party action to a full commit SHA and retain a readable version comment after the SHA.
Prefer action-native or ecosystem-native caching over genericactions/cache.
Tie cache invalidation to lockfiles, dependency manifests, or explicit tool versions; for uv, preferastral-sh/setup-uvwithcache-dependency-globanchored touv.lock, and for Rust preferSwatinem/rust-cachewith explicitshared-keyandworkspaces.
Do not cache generated outputs that can conceal stale behavior unless the repository deliberately relies on that cache.
Keep deploy and publish permissions isolated to the jobs that need them.
When usingworkflow_call, inspect both the caller and callee; callers must grant every permission required by called jobs because callees cannot elevate caller permissions.
Usecontents: readas the minimum default for checkout-based build, test, documentation, and packaging jobs.
Grantpull-requests: readonly to jobs that require pull-request metadata lookup.
Limitpages: writeto Pages deployment jobs and callers that invoke those jobs through reusable workflows.
Limitid-token: writeto jobs exchanging GitHub OIDC tokens with protected deployment targets, including Pages deployment and protected npm publication jobs.
Keep Python, Rust, and documentation jobs aligned with their lockfiles and correspondingjustfilerecipes.
Keep local commands aligned with equivalentjustfilerecipes.
Keep concurrency settings, branch and tag filters, and documentation publication guards consistent with repository intent.
Keep tag filters, prerelease normalization, and publication behavior aligned withRELEASING.md.
Before editing workflows, inspect the workflow graph foruses:,permissions:, `secr...
Files:
.github/workflows/publish_typescript.yml
.github/workflows/publish_typescript.yml
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
Publish the TypeScript contract through the protected
npmjsenvironment, grantid-token: writefor npm trusted publishing, and do not provide an npm write token that could mask an OIDC configuration failure.Use npm trusted publishing through the protected
npmjsenvironment.
Files:
.github/workflows/publish_typescript.yml
**/{.github/workflows/*,Cargo.toml,Cargo.lock,package.json,package-lock.json,pyproject.toml,uv.lock}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
For CI or packaging changes, use
maintain-ciormaintain-packaging, then run recipes and checks whose behavior changed.
Files:
.github/workflows/publish_typescript.yml
.agents/skills/**
📄 CodeRabbit inference engine (.agents/skills/README.md)
.agents/skills/**: Maintainer skills must be discoverable from.agents/skills/; Claude Code exposes the same set through.claude/skillswithout mixing in consumer skills.
Keep consumer-facing integration guidance in the top-levelskills/directory and exclude it from the maintainer skill set.
Files:
.agents/skills/update-project-version/SKILL.md
.agents/skills/*/
📄 CodeRabbit inference engine (.agents/skills/README.md)
Use descriptive, task-based names for maintainer skill directories, such as
contribute-apiorvalidate-change.
Files:
.agents/skills/update-project-version/SKILL.md
.agents/skills/**/*.md
📄 CodeRabbit inference engine (AGENTS.md)
Use maintainer skills under
.agents/skills/for repository-internal API, documentation, testing, CI, packaging, release, and PR contribution guidance.
Files:
.agents/skills/update-project-version/SKILL.md
**/*.{rs,toml}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For any Rust change, run
just test-rustandcargo fmt --all -- --check.For Rust core, CLI, or shared runtime semantic changes, run Rust formatting and tests; add Python tests when behavior is exposed through the SDK and run relevant CLI tests.
Files:
crates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rscrates/fabric-core/src/schema.rs
crates/fabric-core/**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
Changes under
crates/fabric-coremust run both the Rust and Python test suites.
Files:
crates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rscrates/fabric-core/src/schema.rs
crates/fabric-core/**/*.rs
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
For Rust API reference changes, update Rust documentation comments under
crates/fabric-core/instead of generated API reference files.If
crates/fabric-corechanges in a way exposed through Python, run both the Rust and Python suites.
Files:
crates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rscrates/fabric-core/src/schema.rs
**/*.rs
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Start implementation from the shared Rust core behavior first.
When Rust code changes, run
cargo fmt --all -- --checkandjust test-rust.
**/*.rs: Format Rust code withcargo fmt --all, verify formatting withcargo fmt --all -- --check, and runcargo check --workspace --lockedfor core runtime, CLI, and native extension changes.
Rust files must use the specified two-line SPDX header with Rust comments.
Files:
crates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rscrates/fabric-core/src/schema.rs
crates/fabric-core/src/**/*.rs
⚙️ CodeRabbit configuration file
crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.
Files:
crates/fabric-core/src/runtime.rscrates/fabric-core/src/config.rscrates/fabric-core/src/agent_config.rscrates/fabric-core/src/schema.rs
RELEASING.md
📄 CodeRabbit inference engine (AGENTS.md)
Keep release policy and the end-to-end maintainer workflow in
RELEASING.md; do not move release-history policy into user-facing documentation or add a duplicateCHANGELOG.md.
Files:
RELEASING.md
tests/**/*.py
📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)
tests/**/*.py: Use pytest to run Python tests.
Do not add@pytest.mark.asyncioto tests; async tests are automatically detected by the async runner.
Do not add-> Nonereturn type annotations to test functions.
When mocking a class, useunittest.mock.MagicMockorAsyncMock, using thespecargument when necessary, rather than defining a new class.
Prefix mocked class names withmock, notfake.
Prefer pytest fixtures over helper methods.
If a fixture is needed in multiple test files, define it once inconftest.pyrather than repeating it.
Define fixtures using@pytest.fixture(name="<fixture_name>"[, scope="<scope>"])and a<fixture_name>_fixturefunction; specifyscopeonly when it is notfunction.
Preferpytest.mark.parametrizeover separate tests for different input types.
Use@pytest.mark.usefixtureswhen a fixture is needed but its returned value is unused or it returns no value.
Avoid defensive programming in tests; access expected values directly so missing data raises a clear failure, such as usingresults["data"]instead ofresults.get("data").
When adapter installation metadata changes, packaging metadata tests must directly assert that the root project depends unconditionally on the exact-versionnemo-fabric-runtimedistribution.
Packaging metadata tests must verify that each root harness extra delegates to the matching version of the leaf adapter'sharnessextra.
Packaging metadata tests must verify that bare leaf dependencies remain adapter-owned and that the rootadapter-testsdependency group installs each leaf through itsharnessextra.
Packaging metadata tests must verify that every leaf providesfull; only adapters importing NeMo Relay Python APIs providerelay, while adapters using an external Relay executable havefullequal toharness.
Files:
tests/scripts/test_publish_typescript_package.py
{tests/**,python/tests/**}
⚙️ CodeRabbit configuration file
{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.
Files:
tests/scripts/test_publish_typescript_package.py
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:14.307Z
Learning: Determine whether the CLI, PyO3 binding, Python SDK, type stubs, schemas, or Python and TypeScript adapter-contract bindings must expose a new or changed public API surface.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:14.307Z
Learning: Keep every affected public API surface in parity.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:14.307Z
Learning: Clearly describe the public behavior.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:14.307Z
Learning: Cover every affected public surface.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:14.307Z
Learning: Ensure the validation matrix matches the changed public surfaces.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:14.307Z
Learning: Explain the user-facing change in pull request notes.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:14.307Z
Learning: Keep changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:48.390Z
Learning: For prerelease or build-metadata releases, use valid Cargo SemVer and equivalent PEP 440 Python metadata; ensure Maturin-built and setuptools-built packages resolve to equivalent versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:48.390Z
Learning: Use `just set-version <cargo-version>` to update release metadata and lockfiles rather than performing blind repository-wide replacement.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:48.390Z
Learning: When modifying version-update helpers, keep their contracts aligned: invoke Cargo, Python, and TypeScript helpers; recursively process adapter manifests; validate Cargo metadata; reject a static runtime version; preserve dependency versions; and run `just lock-python`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:48.390Z
Learning: Audit old-version references with targeted searches and distinguish package-version surfaces from examples and unrelated dependency versions.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:48.390Z
Learning: Validate version changes with targeted metadata searches, `cargo check --workspace --locked`, `just build-python`, `just wheels`, `just pack-typescript`, and `git diff --check`; run `just test-python` when integration or packaging behavior changes materially.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:47:48.390Z
Learning: Do not update only Cargo metadata, add a literal runtime Python version, omit exact internal pins or lockfiles, update the TypeScript manifest without its npm lockfile entry, or blindly replace version-like strings.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:10.168Z
Learning: Use branch prefixes `feat/`, `fix/`, `docs/`, `test/`, or `refactor/`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:10.168Z
Learning: Name branches after the work and never include Linear ticket IDs or slugs.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:10.168Z
Learning: Use signed-off commits for pull request work with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:10.168Z
Learning: When creating a pull request from the current branch, target the upstream repository rather than a fork.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:10.168Z
Learning: If repository-local PR guidance conflicts with generic GitHub connector or plugin guidance, follow the repository-local guidance for PR body format and review handoff details.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:10.168Z
Learning: PR descriptions must state what changed, why it changed, how it was tested, and any breaking changes within the repository template format.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:21.135Z
Learning: Release tags must use SemVer with a leading `v`, such as `v0.1.0` or `v0.1.0-rc.1`; tags without the leading `v` are invalid.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:21.135Z
Learning: All contributions must include DCO sign-off; contributors should commit with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:21.135Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:21.135Z
Learning: Pull requests require at least one approving review and passing CI before merge.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:21.135Z
Learning: Do not force-push during review; address review feedback with additional commits.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:48:21.135Z
Learning: Commit messages must use `type: short description`, use one of the documented types, and keep the first line under 72 characters.
🪛 ast-grep (0.45.1)
tests/scripts/test_publish_typescript_package.py
[info] 46-55: use jsonify instead of json.dumps for JSON output
Context: json.dumps(
[
{
"name": PACKAGE,
"version": version,
"integrity": INTEGRITY,
"filename": filename,
}
]
)
Note: [CWE-116] Improper Encoding or Escaping of Output.
(use-jsonify)
🪛 LanguageTool
RELEASING.md
[uncategorized] ~383-~383: The official name of this software platform is spelled with a capital “H”.
Context: ...ml) | For RC, beta and release tags | | [.github/workflows/publish_typescript.yml](.git...
(GITHUB)
🪛 Ruff (0.16.1)
tests/scripts/test_publish_typescript_package.py
[warning] 440-440: Boolean-typed positional argument in function definition
(FBT001)
🪛 zizmor (1.29.0)
.github/workflows/publish_typescript.yml
[warning] 32-32: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment
(undocumented-permissions)
🔇 Additional comments (9)
crates/fabric-core/src/runtime.rs (1)
561-561: 📐 Maintainability & Code QualityVerify the required Rust core validation.
The supplied validation evidence does not show the required checks for these Rust core changes. Run and report
cargo fmt --all -- --check,cargo check --workspace --locked,just test-rust, andjust test-python.
crates/fabric-core/src/runtime.rs#L561-L561: validate runtime startup behavior.crates/fabric-core/src/agent_config.rs#L246-L319: validate projected configuration rejection paths.crates/fabric-core/src/config.rs#L2426-L2429: validate telemetry provider selection.crates/fabric-core/src/schema.rs#L357-L373: validate schema parity behavior.As per coding guidelines, Rust changes require formatting and Rust tests. As per path instructions, changes under
crates/fabric-coremust run both Rust and Python test suites.Sources: Coding guidelines, Path instructions
typescript/adapter-contract/scripts/check-dependencies.mjs (1)
15-15: LGTM!Also applies to: 43-55
.agents/skills/update-project-version/SKILL.md (2)
3-3: LGTM!Also applies to: 20-47, 84-91, 100-100, 108-108, 121-122
51-63: 🗄️ Data Integrity & IntegrationNo implementation change required. The documented workflow matches the implementation, including TypeScript manifest and lockfile updates without dependency changes, and the
just lock-pythonstep..pre-commit-config.yaml (1)
12-12: LGTM!scripts/lint/check_copyright.py (1)
79-89: LGTM!Also applies to: 98-99
.github/workflows/publish_typescript.yml (1)
1-123: LGTM!tests/scripts/test_publish_typescript_package.py (1)
1-118: LGTM!Also applies to: 121-157, 186-426
RELEASING.md (1)
27-34: LGTM!Also applies to: 191-249, 375-413
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 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 `@RELEASING.md`:
- Around line 457-463: Wrap the temporary verification commands in RELEASING.md,
including verification_dir setup, trap, cd, npm init, npm install, and npm audit
signatures, in a subshell configured with set -euo pipefail. Keep cleanup scoped
to that subshell so failed mktemp or cd commands cannot run npm in the checkout
or alter the caller’s working directory.
- Around line 457-463: Update the post-release verification commands in the
documented npm check to pass both the generic npmjs registry and the `@nvidia`
scope-specific npmjs registry to each npm command, including npm init, npm
install, and npm audit signatures.
🪄 Autofix
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: 8e4e7ad7-7d36-40f4-8a9e-1e036c1ca02d
📒 Files selected for processing (2)
RELEASING.mdtests/scripts/test_publish_typescript_package.py
📜 Review details
⏰ Context from checks skipped due to timeout. (9)
- GitHub Check: Preview docs
- GitHub Check: Test (Python 3.11, windows-amd64)
- GitHub Check: Test (Python 3.13, linux-amd64)
- GitHub Check: Test (Python 3.11, macos-arm64)
- GitHub Check: Test (Python 3.12, windows-amd64)
- GitHub Check: Test (Python 3.13, macos-arm64)
- GitHub Check: Test (Python 3.12, macos-arm64)
- GitHub Check: Test (Python 3.13, windows-amd64)
- GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (15)
**/*
📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)
**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.
**/*: Always spellNVIDIAin all caps; do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol afterNVIDIAwhen referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names withNVIDIAon first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...
Files:
tests/scripts/test_publish_typescript_package.pyRELEASING.md
**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For native binding changes, run
cargo check -p fabric-python --locked.
Files:
tests/scripts/test_publish_typescript_package.py
**/*.{md,mdx,yml,py,rs,sh}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
Keep documentation aligned with current NeMo Fabric behavior, repository layout, entry points, commands, package names, APIs, bindings, and support claims.
Files:
tests/scripts/test_publish_typescript_package.pyRELEASING.md
tests/**/*.py
📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)
tests/**/*.py: Use pytest to run Python tests.
Do not add@pytest.mark.asyncioto tests; async tests are automatically detected by the async runner.
Do not add-> Nonereturn type annotations to test functions.
When mocking a class, useunittest.mock.MagicMockorAsyncMock, using thespecargument when necessary, rather than defining a new class.
Prefix mocked class names withmock, notfake.
Prefer pytest fixtures over helper methods.
If a fixture is needed in multiple test files, define it once inconftest.pyrather than repeating it.
Define fixtures using@pytest.fixture(name="<fixture_name>"[, scope="<scope>"])and a<fixture_name>_fixturefunction; specifyscopeonly when it is notfunction.
Preferpytest.mark.parametrizeover separate tests for different input types.
Use@pytest.mark.usefixtureswhen a fixture is needed but its returned value is unused or it returns no value.
Avoid defensive programming in tests; access expected values directly so missing data raises a clear failure, such as usingresults["data"]instead ofresults.get("data").
When adapter installation metadata changes, packaging metadata tests must directly assert that the root project depends unconditionally on the exact-versionnemo-fabric-runtimedistribution.
Packaging metadata tests must verify that each root harness extra delegates to the matching version of the leaf adapter'sharnessextra.
Packaging metadata tests must verify that bare leaf dependencies remain adapter-owned and that the rootadapter-testsdependency group installs each leaf through itsharnessextra.
Packaging metadata tests must verify that every leaf providesfull; only adapters importing NeMo Relay Python APIs providerelay, while adapters using an external Relay executable havefullequal toharness.
Files:
tests/scripts/test_publish_typescript_package.py
**/*.{rs,py,ts,tsx}
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
**/*.{rs,py,ts,tsx}: Start from the shared Rust core behavior first when contributing a public API addition or behavior change.
Determine whether the CLI, PyO3 binding, Python SDK, type stubs, schemas, or Python and TypeScript adapter-contract bindings must expose the new public surface.
**/*.{rs,py,ts,tsx}: Use language-appropriate naming conventions: Rust and Python functions and variables usesnake_case; Rust, Python, and TypeScript types usePascalCase; TypeScript contract properties preserve wiresnake_casenames.
When changing the Rust core or public adapter-contract schemas, run the Rust, Python, and TypeScript test suites because the bindings depend on the generated wire contract.
Files:
tests/scripts/test_publish_typescript_package.py
**/*.{py,pyi,ts,tsx}
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Maintain parity for Python SDK, Python type stubs, and Python/TypeScript adapter-contract bindings when they are affected by a new API surface.
Files:
tests/scripts/test_publish_typescript_package.py
**/*.{py,rs}
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
Keep Python and Rust CI jobs aligned with their lockfiles and corresponding
justfilerecipes.
Files:
tests/scripts/test_publish_typescript_package.py
**/*.{py,pyi}
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
When changing version-helper code,
set_python_project_versionsmust update the root setuptools version, recursively discovered adapter manifests, and all internal exact-version pins while rejecting a static version inpython/pyproject.toml.Run
just test-pythonwhen Python code or a Python-facing adapter changes.Python public APIs must use type annotations, and native binding declarations must remain synchronized with their Rust implementations.
Files:
tests/scripts/test_publish_typescript_package.py
**/{tests,*/tests}/**/*.{rs,py,ts,tsx}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
When adding functionality, include tests in the corresponding Rust crate or relevant area under
tests/. Keep JSON Schema snapshots, Python representations, and generated TypeScript declarations synchronized for public contract changes.
Files:
tests/scripts/test_publish_typescript_package.py
{tests/**,python/tests/**}
⚙️ CodeRabbit configuration file
{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.
Files:
tests/scripts/test_publish_typescript_package.py
**/*.{md,mdx,rst}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spellNVIDIAin all caps; do not useNvidia,nvidia, orNV.
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 ashereorread more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce, and preferrefer tooverseewhen directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
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 commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.
**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...
Files:
RELEASING.md
**/*.{md,rst,txt,adoc}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)
**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Usecanfor possibility and reservemayfor permission; useafterfor temporal order; userefer tofor cross-references; prefer short direct sentences and specific verbs; avoid unnecessarypleasein technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: usefor exampleorsuch asinstead ofe.g.,and so oninstead ofetc.,that isinstead ofi.e.,compared toinstead ofvs., andby,through, orusinginstead ofvia. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Usethatwithout commas for essential clauses, andwhichwith commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such asJune 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space beforea.m.orp.m.; useETandPTfor needed time zones; avoid24/7; and preferfrom 12:30 to 1:00 p.m.for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...
Files:
RELEASING.md
**/*.{md,mdx}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
**/*.{md,mdx}: Use the full product nameNVIDIA NeMo Fabricon first use, typically in the title and H1; useNeMo Fabricthereafter. Usefabricalone only for the CLI tool and surround it with backticks.
Treat incorrect or stale commands, package names, paths, APIs, support claims, procedures, examples, terminology, or public behavior documentation as blocking issues.
CapitalizeNVIDIAcorrectly and format code, commands, paths, and filenames as inline code where needed.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences; ensure examples match current APIs and build commands.
Use descriptive anchor text, avoid raw URLs and generic labels such ashere, and use repository-relative.mdxpaths for links withindocs/.
Prefer active voice, present tense, short sentences, plain English, consistent terminology, and imperative, parallel, scannable procedures.
Useafterinstead ofoncewhen expressing temporal sequence, and usecanrather thanmaywhen describing possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
When reporting documentation-review findings, lead withMust fix,Should fix, andNice to havecategories; include file path, line reference, current problem, rationale, and a concrete rewrite or direction.Update documentation and examples in the same branch as the public API change.
Documentation and examples must use the current install, import, and build commands.
Changes affecting public behavior, adapters, examples, or workspace structure must update the corresponding documentation.
Files:
RELEASING.md
RELEASING.md
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Reflect public packaging changes, release tags, registry publication, and release-facing commands in the release documentation.
Keep release policy and the end-to-end maintainer workflow in
RELEASING.md.
Files:
RELEASING.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}
⚙️ CodeRabbit configuration file
{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercasefabricCLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.
Files:
RELEASING.md
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:55:44.520Z
Learning: Keep every affected public surface in parity.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:55:44.520Z
Learning: Public behavior must be clearly described.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:55:44.520Z
Learning: Every affected public surface must be covered.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:55:44.520Z
Learning: The validation matrix must match the changed surfaces.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:55:44.520Z
Learning: PR notes must explain the user-facing change.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:55:55.301Z
Learning: Keep changes scoped, surface assumptions, and define focused validation before editing.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:55:55.301Z
Learning: If local lint passes but GitHub authorization remains uncertain, inspect GitHub's permission model and the upstream action or reusable-workflow source rather than assuming local success proves remote success.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:18.320Z
Learning: Validate version changes with targeted metadata searches, `cargo check --workspace --locked`, Python build/package checks, applicable integration tests, wheel and TypeScript packaging checks, and `git diff --check`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:38.243Z
Learning: Use branch prefixes `feat/`, `fix/`, `docs/`, `test/`, or `refactor/`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:38.243Z
Learning: Name branches after the work and never include Linear ticket IDs or slugs in branch names.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:38.243Z
Learning: Use Conventional Commit PR titles in the form `<type>: <summary>`; reserve `fix` for actual product bugs, not CI, documentation, or chores.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:38.243Z
Learning: Use signed-off commits for pull request work with `git commit -s`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:38.243Z
Learning: When creating a pull request from the current branch, target the upstream repository rather than a fork.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:38.243Z
Learning: PR descriptions must state what changed, why, how it was tested, and any breaking changes within the repository template format.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:46.576Z
Learning: Release tags must use SemVer with a leading `v`; tags such as `0.1.0` and `0.1.0-rc.1` are prohibited.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:46.576Z
Learning: All contributors must sign off commits with `git commit -s`; commits without DCO sign-off will not be accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:46.576Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:46.576Z
Learning: Pull requests require at least one approving review and passing CI before merge; do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-08-11T16:56:46.576Z
Learning: Commit messages must use `type: short description`, use one of the documented types, and keep the first line under 72 characters.
🔇 Additional comments (1)
tests/scripts/test_publish_typescript_package.py (1)
95-102: LGTM!Also applies to: 161-186, 435-450
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Overview
Add and publish the dependency-free
nemo-fabric-adapter-contractTypeScript projection of the Rust-generated v1alpha2 adapter schemas. Descriptor, configuration, runtime-context, request, and result types share the package root, matching the Python adapter-contract package's single model namespace. Invocation request/result types retain their documented preview status until the typed lifecycle transport is enforced, but that status does not create a TypeScript-only import boundary.The package is intentionally unscoped, matching the public NeMo Relay npm naming pattern and avoiding a dependency on npm
@nvidiaorganization administration. Publication uses GitHub OIDC through a protectednpmjsenvironment, never receives a long-lived npm write token, and automatically produces provenance after the one-time package bootstrap.The package has zero production dependencies.
json-schema-to-typescript@15.0.4is an exact-pinned build dependency selected to avoid hand-maintaining a parallel contract hierarchy. Its development-only transitive graph includesargparse@2.0.1underPython-2.0; dependency approver acknowledgement is requested before merge.This PR combines and supersedes #199. It does not add a TypeScript lifecycle host, Pi adapter, runtime validator, or adapter integration; those remain follow-up work for the 0.3 release line. This is a new package and introduces no breaking API change.
Details
./previewentry point.justrecipes, documentation, and maintainer workflow parity.latest, beta and RC releases usenext, and alpha releases remain unpublished.Trusted publishing reference: https://docs.npmjs.com/trusted-publishers/
Validation
just test-typescriptnpm pack --dry-run --jsonuv run pytest -q tests/scripts/test_publish_typescript_package.py tests/scripts/test_set_typescript_project_version.py(36 passed)uv run pre-commit run --files <changed-files>just docsjust --fmt --checkgit diff --checkjust test-rust,cargo fmt --all -- --check,just test-python, anduv run pre-commit run --all-filespassed earlier in the branch; GitHub Actions repeats the repository matrix on the current head.Registry bootstrap completed on 2026-08-11:
nemo-fabric-adapter-contract@0.0.0was published as an inert three-file placeholder byajaythorvewith npm 2FA. The live registry shasum (bc60b575e6e5242e21f0fa5d97b1025661c84570) and integrity matched the reviewed dry-run.nextpoints to0.0.0; npm also initialized the first package version aslatestand rejected removing that onlylatesttag. This did not exercise trusted publishing: the first supported release remains pending the protectednpmjsenvironment, acceptance of the npm maintainer invitations sent toanuradhakaruppiahanddagardner-nv, and the npm trusted-publisher binding after merge.Where should the reviewer start?
typescript/adapter-contract/package.json,src/index.ts, andtest/execution.test.tsfor the Python-parity single-root export boundary.typescript/adapter-contract/scripts/generate.mjsandscripts/projection-guards.mjsfor schema projection and fail-closed assumptions.crates/fabric-core/src/schema.rsand the canonical schemas for the wire-contract and runtime invariants..github/workflows/publish_typescript.yml,scripts/ci/publish_typescript_package.py, and its tests for the OIDC and immutable-registry boundary.Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)
Relates to FABRIC-190
Closes FABRIC-193
Closes FABRIC-194
Closes FABRIC-195
Relates to FABRIC-196
Supersedes feat: add TypeScript adapter contract #199
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.