Skip to content

feat: add normalized MCP and skills to Codex - #88

Merged
rapids-bot[bot] merged 7 commits into
NVIDIA:mainfrom
AjayThorve:feat/codex-capability-parity
Jul 20, 2026
Merged

feat: add normalized MCP and skills to Codex#88
rapids-bot[bot] merged 7 commits into
NVIDIA:mainfrom
AjayThorve:feat/codex-capability-parity

Conversation

@AjayThorve

@AjayThorve AjayThorve commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

Overview

Close the remaining truthful Codex capability gaps against the Claude adapter. This PR adds normalized MCP and skill support without claiming partial tools.blocked enforcement. It also completes FABRIC-100 by moving the adapter to the stable Codex SDK/runtime versioning contract: Fabric directly pins openai-codex==0.144.4, while the SDK owns its exact openai-codex-cli-bin==0.144.4 transitive dependency.

Fabric no longer declares or constrains the app-server package separately. The built Codex adapter wheel contains no direct CLI-bin requirement. No dependency is added or removed; both Codex packages remain Apache-2.0. This PR does not change the public Fabric API or schema.

Details

  • Map normalized FabricConfig.mcp entries into request-scoped Codex mcp_servers configuration for stdio, HTTP, and streamable HTTP transports. The stdio mapping uses Python's standard-library shlex module.
  • Register normalized FabricConfig.skills.paths with the Codex app-server before thread creation while preserving Codex-native implicit skill selection.
  • Reject malformed skill_paths values before SDK startup and preserve SDK cleanup when the private skill-registration seam is unavailable.
  • Advertise mcp and skills in the adapter descriptor and document their public Python SDK usage.
  • Keep tools.blocked explicitly unsupported. The pinned Codex runtime does not expose one deny boundary across built-in, local, MCP, and hosted tools.
  • Upgrade the direct SDK dependency from openai-codex==0.1.0b3 to openai-codex==0.144.4, remove Fabric-owned CLI-bin constraints, regenerate both lockfiles, and update attribution evidence.
config.add_skill_path("./skills/code-review")
config.add_mcp_server(
    "docs",
    transport="streamable-http",
    url="https://mcp.example.com/mcp",
    exposure="harness_native",
)

openai-codex==0.144.4 still does not wrap the app-server's process-scoped skills/extraRoots/set RPC. The adapter isolates that pinned-SDK compatibility seam in _register_skill_roots() so consumers do not need to stage skills into their workspace.

Validation

  • just test-python — 389 passed, 11 skipped
  • uv run --no-sync pytest -q tests/adapters/test_codex_adapter.py — 42 passed, including thread start/resume, explicit and relative codex_bin overrides, structured-output forwarding, failed/incomplete result normalization, timeout interruption, resume identity validation, and SDK close behavior
  • Live RUN_FABRIC_CODEX_INTEGRATION=1 E2E with FABRIC_TEST_CODEX_BIN set to the SDK-bundled 0.144.4 executable — 1 passed in 87.42s; covered ChatGPT authentication, one-shot execution, thread start/resume with state continuity, explicit runtime override, and context-managed shutdown
  • Live schema-constrained Fabric().run() with ChatGPT authentication returned the expected {"count": 2, "status": "ok"} payload through the 0.144.4 app-server
  • Live Fabric().run() with ChatGPT authentication, an implicitly selected temporary skill, and the remote OpenAI Docs MCP server returned the expected skill marker and MCP-derived answer
  • RUN_FABRIC_CODEX_RELAY_INTEGRATION=1 ... pytest -q tests/e2e/test_codex.py::test_codex_sdk_with_relay -s with nemo-relay 0.6.0 — 1 passed; verified gateway routing, ATIF/ATOF telemetry, thread resume, and state continuity
  • just --set no_uv true build-python — passed
  • uv build --project adapters/codex --out-dir /tmp/nemo-fabric-pr88-codex-wheel — passed; wheel metadata requires openai-codex==0.144.4 and has no direct openai-codex-cli-bin requirement
  • cargo check -p fabric-python --locked — passed
  • uv lock --check --project . and uv lock --check --project adapters/codex — passed
  • Python attribution generation — passed on a second clean run
  • uv run --no-project python scripts/licensing/license_diff.py --base-ref origin/main — no packages added or removed; both Codex packages remain Apache-2.0
  • just docs with the bundled Node runtime — 0 Fern errors, 1 existing warning

Where should the reviewer start?

Start with _native_mcp_servers(), _native_skill_paths(), and _register_skill_roots() in adapters/codex/src/nemo_fabric_adapters/codex/adapter.py. Then review the behavior-focused coverage in tests/adapters/test_codex_adapter.py, the exact advertised capability list in adapters/codex/fabric-adapter.json, and the dependency ownership change in adapters/codex/pyproject.toml.

The key design decisions are intentionally narrow: this PR does not claim tools.blocked parity until Codex can enforce the normalized deny policy across every tool surface, and Fabric depends only on the SDK rather than separately owning the SDK's app-server distribution.

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

  • Closes FABRIC-100

  • Relates to FABRIC-50

  • 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.

Summary by CodeRabbit

  • New Features
    • Added native MCP server and skill-directory support in the Codex adapter, including normalization, validation, and automatic registration into Codex runtime configuration.
  • Bug Fixes
    • Invalid native MCP transports, missing/invalid skill directories, and empty or incorrectly shaped mcp/skills now fail fast with clear codex_invalid_configuration errors.
  • Documentation
    • Updated Codex adapter docs with “Configure MCP and Skills,” clarified SDK-owned runtime selection and codex_bin override, and noted tools.blocked is unsupported.
  • Tests
    • Expanded Codex adapter test coverage for native capability handling and to ensure no unexpected SDK requests occur.

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

The Codex adapter now accepts normalized MCP and skills configuration, validates native servers and skill directories, registers skill roots through the SDK, and injects MCP servers into thread configuration. Documentation, dependency metadata, and tests cover the updated runtime and capability behavior.

Changes

Codex Native Capabilities

Layer / File(s) Summary
Capability contracts and runtime configuration
adapters/codex/fabric-adapter.json, adapters/codex/README.md, docs/integrations/codex.mdx, adapters/codex/pyproject.toml, pyproject.toml, ATTRIBUTIONS-Python.md, adapters/codex/src/...
The adapter declares MCP and skills support, documents SDK-managed runtime selection and capability mappings, updates Codex dependencies, and maps normalized skills settings.
Native MCP and skill validation
adapters/codex/src/...
MCP transports are validated and converted, skill paths are resolved to directories containing SKILL.md, and valid roots are registered through skills/extraRoots/set; invalid configurations prevent SDK invocation.
Per-invocation Codex wiring
adapters/codex/src/...
Native MCP servers are injected into thread configuration, while skill registration and prompt computation occur inside the SDK timeout before the thread turn starts.
Capability and invocation test coverage
tests/adapters/test_codex_adapter.py
Tests cover SDK request behavior, MCP mapping, skill registration, invalid configurations, descriptor acceptance, and resolved native capability plans.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant FabricConfig
  participant CodexAdapter
  participant CodexSDK
  participant CodexThread
  FabricConfig->>CodexAdapter: normalized MCP servers and skill paths
  CodexAdapter->>CodexAdapter: validate transports and resolve SKILL.md directories
  CodexAdapter->>CodexSDK: register skill roots with extraRoots
  CodexAdapter->>CodexThread: send prompt with mcp_servers configuration
  CodexThread-->>CodexAdapter: thread turn result
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title follows Conventional Commits, is concise, and accurately summarizes the MCP and skills Codex changes.
Description check ✅ Passed The description includes the required Overview, reviewer start point, related issue, validation, and confirmation checkboxes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@github-actions

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 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 `@adapters/codex/src/nemo_fabric_adapters/codex/adapter.py`:
- Around line 241-249: Update _native_skill_paths to default skill_paths to an
empty list only when the capability key is absent; preserve falsy values such as
None, an empty string, an empty mapping, or False for validation so they raise
AdapterConfigError instead of disabling skills. Add a parameterized regression
test covering these falsy non-list values.

In `@docs/integrations/codex.mdx`:
- Around line 33-38: Update the adapter description to state that each skill
directory is resolved, validated by checking for its SKILL.md file, and then
registered as a process-scoped Codex skill root; do not say the directory is
resolved to the file. Preserve the existing statements about skill discovery and
startup validation.

In `@tests/adapters/test_codex_adapter.py`:
- Line 117: Add a failure-path test around the private skill-registration seam
in the Codex adapter, configuring the mocked client without a usable
`_client.request`. Assert the adapter returns `codex_invalid_configuration`,
does not start a thread, and closes the SDK client during cleanup; preserve the
existing success-path setup and assertions.
- Around line 199-202: Replace the monkeypatch.setenv call in
test_sdk_maps_native_mcp_servers_into_thread_config with an os.environ
assignment for FABRIC_TEST_MCP_URL, preserving the same test value and
environment setup.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: e8be5fd1-e640-4450-aaf5-6e02194a6672

📥 Commits

Reviewing files that changed from the base of the PR and between 3535728 and 504078d.

📒 Files selected for processing (5)
  • adapters/codex/README.md
  • adapters/codex/fabric-adapter.json
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • docs/integrations/codex.mdx
  • tests/adapters/test_codex_adapter.py
📜 Review details
⏰ Context from checks skipped due to timeout. (11)
  • GitHub Check: Build and publish docs
  • GitHub Check: Test (Python 3.12, arm64)
  • GitHub Check: Test (Python 3.11, arm64)
  • GitHub Check: Test (Python 3.14, arm64)
  • GitHub Check: Test (Python 3.13, arm64)
  • GitHub Check: Test (Python 3.14, x86_64)
  • GitHub Check: Test (Python 3.13, x86_64)
  • GitHub Check: Test (Python 3.11, x86_64)
  • GitHub Check: Test (Python 3.12, x86_64)
  • GitHub Check: Build wheels (x86_64)
  • GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (26)
**/*.{json,jsonc}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Public contract changes must keep checked-in JSON Schema snapshots synchronized.

Files:

  • adapters/codex/fabric-adapter.json
**/*

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*: All source files must include the specified SPDX copyright and Apache-2.0 license header using the comment syntax appropriate to the file type.
Release tags must use raw Rust-compatible SemVer without a leading v, such as 0.1.0 or 0.1.0-rc.1.

**/*: 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.

**/*: Keep pull request branch scope coherent and reviewable.
Run relevant tests under validate-change before opening or updating a pull request.
Format changed files with the language-native formatter.
Update documentation and examples for public behavior changes.
Update dependent maintainer or consumer guidance when code changes affect APIs, bindings, commands, paths, packaging guidance, or best practices.
Use Conventional Commit style for pull request titles: <type>: <concise imperative summary>, choosing the type from the actual change surface. Use fix only for user-facing or runtime product-code bug fixes.
A pull request body must include #### Overview, #### Details, #### Validation, #### Where should the reviewer start?, and `#### Related ...

Files:

  • adapters/codex/fabric-adapter.json
  • docs/integrations/codex.mdx
  • tests/adapters/test_codex_adapter.py
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • adapters/codex/README.md
**/*.{rs,py,pyi,json,yaml,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.

Files:

  • adapters/codex/fabric-adapter.json
  • tests/adapters/test_codex_adapter.py
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
{adapters/**,examples/**}

⚙️ CodeRabbit configuration file

{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public Fabric contracts.

Files:

  • adapters/codex/fabric-adapter.json
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • adapters/codex/README.md
**/*.{md,mdx,html}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Changes affecting public behavior, adapters, examples, or workspace structure must update the corresponding documentation; public API changes require updated SDK or API reference documentation.

Files:

  • docs/integrations/codex.mdx
  • adapters/codex/README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

For docs site changes, run just docs to regenerate Python and Rust API references and validate Fern configuration.

**/*.{md,mdx}: Prioritize factual accuracy in NeMo Fabric documentation and keep commands, package names, APIs, file paths, repository layout, entry points, support claims, examples, and procedures aligned with current repository behavior.
Update relevant entry-point documentation when public behavior changes, including README.md, docs/index.yml, package or crate READMEs, and adapter or integration READMEs.
Use {/* ... */} delimiters for top-of-file SPDX comments in MDX files, not HTML comment delimiters.
Capitalize NVIDIA correctly and use consistent current repository terminology, product names, APIs, and feature names.
Format commands, code, expressions, file names, paths, and filenames as inline code where appropriate.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences.
Use descriptive link text instead of raw URLs or generic labels such as here.
Write procedures as short, imperative, parallel, easy-to-scan steps; prefer active voice, present tense, plain English, and concise sentences.
Use after instead of once when expressing temporal sequence, and use can instead of may when describing possibility rather than permission.
Use unambiguous date formats and avoid ordinal dates in body text.
When reviewing documentation, report findings in severity order under Must fix, Should fix, and Nice to have, with file paths, line references, explanations, and concrete rewrites or directions.

Files:

  • docs/integrations/codex.mdx
  • adapters/codex/README.md
**/*.mdx

📄 CodeRabbit inference engine (CONTRIBUTING.md)

MDX files must use the specified SPDX header in a JSX comment.

In MDX files, use JSX comment delimiters ({/* and */}) for top-of-file comments, including SPDX headers; do not use HTML comments.

Files:

  • docs/integrations/codex.mdx
{README.md,docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Keep package names, repository references, and build commands current in documentation and examples.

Files:

  • docs/integrations/codex.mdx
{docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Update relevant getting-started, reference, adapter, and example documentation when the corresponding examples or adapters change.

Files:

  • docs/integrations/codex.mdx
docs/**/*.{md,mdx,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Run just docs when the documentation site changes.

Files:

  • docs/integrations/codex.mdx
{docs/**/*,.github/workflows/ci_python.yml,.github/workflows/ci_rust.yml,justfile}

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

Use the current install, import, build, test, clean, and documentation commands consistently in documentation, examples, CI workflows, and just recipes.

Files:

  • docs/integrations/codex.mdx
{docs/**/*,.github/workflows/ci_python.yml,.github/workflows/ci_rust.yml}

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

Reflect public packaging changes in release-facing documentation and examples.

Files:

  • docs/integrations/codex.mdx
**/*.{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 spell NVIDIA in all caps; do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such as here or read more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once, and prefer refer to over see when 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:

  • docs/integrations/codex.mdx
  • adapters/codex/README.md
docs/**/*

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

For documentation or examples changes, run just docs when practical and verify documented commands against the current repository.

Files:

  • docs/integrations/codex.mdx
{docs/**,README.md,AGENTS.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.

Files:

  • docs/integrations/codex.mdx
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.py: Python public APIs must use type annotations, and native Python binding declarations must remain synchronized with their Rust implementations.
Python files must begin with the specified # SPDX copyright and Apache-2.0 license header.

Files:

  • tests/adapters/test_codex_adapter.py
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.{rs,py}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py}: Use snake_case for Rust and Python functions and variables; use PascalCase for Rust types and Python classes.
Run tests for every language surface affected by a change. Changes touching the Rust core or public schemas require both Rust and Python test suites.
Public contract changes must keep native Python binding declarations synchronized with their Rust implementations.

Files:

  • tests/adapters/test_codex_adapter.py
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.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.asyncio to tests; async tests are automatically detected by the async runner.
Do not add -> None return annotations to test functions.
When mocking a class, use unittest.mock.MagicMock or AsyncMock, supplying spec when necessary; do not define a new mock class.
Prefix mocked class names with mock, not fake.
Prefer pytest fixtures over helper methods.
Define shared fixtures in conftest.py rather than repeating them across test files.
Define fixtures using @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and a <fixture_name>_fixture function; specify scope only when it is not function.
Prefer pytest.mark.parametrize over separate tests for different input types.
Use @pytest.mark.usefixtures when a fixture is needed but its return value is unused.
Use os.environ to modify environment variables in tests; do not use monkeypatch.setenv, because the autouse restore_environ_fixture in tests/conftest.py restores the environment after each test.
Avoid defensive programming in tests; access expected data directly so missing data raises a clear error instead of being silently tolerated.
Run focused tests with uv run pytest -k "<pattern>" and all tests with uv run pytest.

Files:

  • tests/adapters/test_codex_adapter.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/adapters/test_codex_adapter.py
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.{rs,py,pyi,toml}

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

When the PyO3 bridge or package metadata changes, run just build-python and cargo check -p fabric-python --locked.

Files:

  • tests/adapters/test_codex_adapter.py
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
tests/adapters/**/*

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

When an adapter or integration changes, run its focused tests under tests/adapters, followed by just test-python.

Files:

  • tests/adapters/test_codex_adapter.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/adapters/test_codex_adapter.py
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update an adapter or example README.md when that adapter or example surface changes.

Files:

  • adapters/codex/README.md
**/*.{html,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

HTML and Markdown files must use the specified SPDX header in an HTML comment.

Files:

  • adapters/codex/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Update documentation and examples in the same branch as the public API change.

Verify README and documentation entry points, package names, paths, examples, and public commands remain current after changes.

Files:

  • adapters/codex/README.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.
Use can for possibility and reserve may for permission; use after for temporal order; use refer to for cross-references; prefer short direct sentences and specific verbs; avoid unnecessary please in 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: use for example or such as instead of e.g., and so on instead of etc., that is instead of i.e., compared to instead of vs., and by, through, or using instead of via. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Use that without commas for essential clauses, and which with commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such as June 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space before a.m. or p.m.; use ET and PT for needed time zones; avoid 24/7; and prefer from 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:

  • adapters/codex/README.md
🧠 Learnings (2)
📚 Learning: 2026-06-29T22:34:52.407Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 27
File: adapters/codex-cli/fabric-adapter.json:13-15
Timestamp: 2026-06-29T22:34:52.407Z
Learning: In NeMo-Fabric adapter manifest files (e.g., `*/fabric-adapter.json`), keep `config.accepts` limited to the top-level Fabric capability sections that `resolve_capability_plan` consumes (such as `models`, `tools`, `mcp`, `skills`, `telemetry`). Do not add adapter-owned `harness.settings` keys to `config.accepts`; `harness.settings` should remain adapter-owned and be passed through unchanged.

Applied to files:

  • adapters/codex/fabric-adapter.json
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.

Applied to files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
🧬 Code graph analysis (1)
tests/adapters/test_codex_adapter.py (1)
python/src/nemo_fabric/types.py (2)
  • add_mcp_server (720-738)
  • add_skill_path (740-744)
🔇 Additional comments (5)
adapters/codex/src/nemo_fabric_adapters/codex/adapter.py (1)

13-13: LGTM!

Also applies to: 29-29, 86-90, 180-240, 251-299, 647-649, 738-738, 896-904, 933-933

adapters/codex/fabric-adapter.json (1)

11-11: LGTM!

adapters/codex/README.md (1)

82-95: LGTM!

Also applies to: 104-105, 170-172

docs/integrations/codex.mdx (1)

2-3: LGTM!

Also applies to: 12-31, 40-44

tests/adapters/test_codex_adapter.py (1)

9-9: LGTM!

Also applies to: 195-198, 203-236, 264-291, 657-672, 695-728

Comment thread adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
Comment thread docs/integrations/codex.mdx Outdated
Comment thread tests/adapters/test_codex_adapter.py Outdated
Comment thread tests/adapters/test_codex_adapter.py Outdated
@AjayThorve
AjayThorve marked this pull request as ready for review July 20, 2026 05:34
@AjayThorve
AjayThorve requested a review from a team as a code owner July 20, 2026 05:34
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve
AjayThorve requested a review from a team as a code owner July 20, 2026 16:43

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@docs/integrations/codex.mdx`:
- Around line 51-52: Update the codex_bin documentation to state that overrides
accept either an absolute path or a path relative to the Fabric config root.
Keep the existing intentional app-server override guidance and ensure the
wording matches the adapter’s supported path behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: d27963ab-8c1c-4f24-b114-de8d882e553c

📥 Commits

Reviewing files that changed from the base of the PR and between 12bd6b6 and d9469b7.

⛔ Files ignored due to path filters (2)
  • adapters/codex/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • ATTRIBUTIONS-Python.md
  • adapters/codex/README.md
  • adapters/codex/pyproject.toml
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • docs/integrations/codex.mdx
  • pyproject.toml
💤 Files with no reviewable changes (1)
  • pyproject.toml
📜 Review details
⏰ Context from checks skipped due to timeout. (10)
  • GitHub Check: Test (Python 3.14, arm64)
  • GitHub Check: Test (Python 3.12, x86_64)
  • GitHub Check: Test (Python 3.14, x86_64)
  • GitHub Check: Test (Python 3.13, x86_64)
  • GitHub Check: Test (Python 3.13, arm64)
  • GitHub Check: Test (Python 3.11, arm64)
  • GitHub Check: Test (Python 3.12, arm64)
  • GitHub Check: Test (Python 3.11, x86_64)
  • GitHub Check: Build and publish docs
  • GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (25)
**/*.{md,mdx,html}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Changes affecting public behavior, adapters, examples, or workspace structure must update the corresponding documentation; public API changes require updated SDK or API reference documentation.

Files:

  • ATTRIBUTIONS-Python.md
  • docs/integrations/codex.mdx
  • adapters/codex/README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

For docs site changes, run just docs to regenerate Python and Rust API references and validate Fern configuration.

**/*.{md,mdx}: Prioritize factual accuracy in NeMo Fabric documentation and keep commands, package names, APIs, file paths, repository layout, entry points, support claims, examples, and procedures aligned with current repository behavior.
Update relevant entry-point documentation when public behavior changes, including README.md, docs/index.yml, package or crate READMEs, and adapter or integration READMEs.
Use {/* ... */} delimiters for top-of-file SPDX comments in MDX files, not HTML comment delimiters.
Capitalize NVIDIA correctly and use consistent current repository terminology, product names, APIs, and feature names.
Format commands, code, expressions, file names, paths, and filenames as inline code where appropriate.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences.
Use descriptive link text instead of raw URLs or generic labels such as here.
Write procedures as short, imperative, parallel, easy-to-scan steps; prefer active voice, present tense, plain English, and concise sentences.
Use after instead of once when expressing temporal sequence, and use can instead of may when describing possibility rather than permission.
Use unambiguous date formats and avoid ordinal dates in body text.
When reviewing documentation, report findings in severity order under Must fix, Should fix, and Nice to have, with file paths, line references, explanations, and concrete rewrites or directions.

Files:

  • ATTRIBUTIONS-Python.md
  • docs/integrations/codex.mdx
  • adapters/codex/README.md
**/*

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*: All source files must include the specified SPDX copyright and Apache-2.0 license header using the comment syntax appropriate to the file type.
Release tags must use raw Rust-compatible SemVer without a leading v, such as 0.1.0 or 0.1.0-rc.1.

**/*: 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.

**/*: Keep pull request branch scope coherent and reviewable.
Run relevant tests under validate-change before opening or updating a pull request.
Format changed files with the language-native formatter.
Update documentation and examples for public behavior changes.
Update dependent maintainer or consumer guidance when code changes affect APIs, bindings, commands, paths, packaging guidance, or best practices.
Use Conventional Commit style for pull request titles: <type>: <concise imperative summary>, choosing the type from the actual change surface. Use fix only for user-facing or runtime product-code bug fixes.
A pull request body must include #### Overview, #### Details, #### Validation, #### Where should the reviewer start?, and `#### Related ...

Files:

  • ATTRIBUTIONS-Python.md
  • docs/integrations/codex.mdx
  • adapters/codex/README.md
  • adapters/codex/pyproject.toml
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.{html,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

HTML and Markdown files must use the specified SPDX header in an HTML comment.

Files:

  • ATTRIBUTIONS-Python.md
  • adapters/codex/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Update documentation and examples in the same branch as the public API change.

Verify README and documentation entry points, package names, paths, examples, and public commands remain current after changes.

Files:

  • ATTRIBUTIONS-Python.md
  • adapters/codex/README.md
**/*.{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 spell NVIDIA in all caps; do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such as here or read more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once, and prefer refer to over see when 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:

  • ATTRIBUTIONS-Python.md
  • docs/integrations/codex.mdx
  • adapters/codex/README.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.
Use can for possibility and reserve may for permission; use after for temporal order; use refer to for cross-references; prefer short direct sentences and specific verbs; avoid unnecessary please in 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: use for example or such as instead of e.g., and so on instead of etc., that is instead of i.e., compared to instead of vs., and by, through, or using instead of via. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Use that without commas for essential clauses, and which with commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such as June 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space before a.m. or p.m.; use ET and PT for needed time zones; avoid 24/7; and prefer from 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:

  • ATTRIBUTIONS-Python.md
  • adapters/codex/README.md
**/*.mdx

📄 CodeRabbit inference engine (CONTRIBUTING.md)

MDX files must use the specified SPDX header in a JSX comment.

In MDX files, use JSX comment delimiters ({/* and */}) for top-of-file comments, including SPDX headers; do not use HTML comments.

Files:

  • docs/integrations/codex.mdx
{README.md,docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Keep package names, repository references, and build commands current in documentation and examples.

Files:

  • docs/integrations/codex.mdx
{docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Update relevant getting-started, reference, adapter, and example documentation when the corresponding examples or adapters change.

Files:

  • docs/integrations/codex.mdx
docs/**/*.{md,mdx,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Run just docs when the documentation site changes.

Files:

  • docs/integrations/codex.mdx
{docs/**/*,.github/workflows/ci_python.yml,.github/workflows/ci_rust.yml,justfile}

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

Use the current install, import, build, test, clean, and documentation commands consistently in documentation, examples, CI workflows, and just recipes.

Files:

  • docs/integrations/codex.mdx
{docs/**/*,.github/workflows/ci_python.yml,.github/workflows/ci_rust.yml}

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

Reflect public packaging changes in release-facing documentation and examples.

Files:

  • docs/integrations/codex.mdx
docs/**/*

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

For documentation or examples changes, run just docs when practical and verify documented commands against the current repository.

Files:

  • docs/integrations/codex.mdx
{docs/**,README.md,AGENTS.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.

Files:

  • docs/integrations/codex.mdx
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update an adapter or example README.md when that adapter or example surface changes.

Files:

  • adapters/codex/README.md
{adapters/**,examples/**}

⚙️ CodeRabbit configuration file

{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public Fabric contracts.

Files:

  • adapters/codex/README.md
  • adapters/codex/pyproject.toml
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,toml}: Rust code must be formatted with cargo fmt --all; formatting can be checked with cargo fmt --all -- --check, and Rust workspaces must compile with cargo check --workspace --locked.
Rust files must begin with the specified // SPDX copyright and Apache-2.0 license header.

When Rust code or Rust project configuration changes, run cargo fmt --all -- --check and just test-rust.

Files:

  • adapters/codex/pyproject.toml
**/*.{toml,yaml,yml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

TOML, YAML, and shell files must use the specified SPDX header with # comments.

Files:

  • adapters/codex/pyproject.toml
**/pyproject.toml

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Run just build-python to verify that all Python package metadata resolves.

Files:

  • adapters/codex/pyproject.toml
**/*.{rs,py,pyi,toml}

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

When the PyO3 bridge or package metadata changes, run just build-python and cargo check -p fabric-python --locked.

Files:

  • adapters/codex/pyproject.toml
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.py: Python public APIs must use type annotations, and native Python binding declarations must remain synchronized with their Rust implementations.
Python files must begin with the specified # SPDX copyright and Apache-2.0 license header.

Files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.{rs,py}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py}: Use snake_case for Rust and Python functions and variables; use PascalCase for Rust types and Python classes.
Run tests for every language surface affected by a change. Changes touching the Rust core or public schemas require both Rust and Python test suites.
Public contract changes must keep native Python binding declarations synchronized with their Rust implementations.

Files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.{rs,py,pyi,json,yaml,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.

Files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.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:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
🧠 Learnings (1)
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.

Applied to files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
🔇 Additional comments (4)
adapters/codex/src/nemo_fabric_adapters/codex/adapter.py (1)

281-284: LGTM!

adapters/codex/pyproject.toml (1)

29-29: 🎯 Functional Correctness

Verify the SDK bump against runtime and seam compatibility.

This changes the SDK from 0.1.0b3 to 0.144.4. The published openai-codex 0.144.4 metadata requires Python >=3.10; confirm the adapter does not still support older Python versions. (pypi.org)

Also run the skill-registration integration path against the resolved artifact because the adapter relies on the SDK’s private _client.request(...) API. As per coding guidelines, run just build-python and just test-python.

Source: Coding guidelines

ATTRIBUTIONS-Python.md (1)

5890-5890: LGTM!

Also applies to: 5900-5900

adapters/codex/README.md (1)

52-60: LGTM!

Also applies to: 81-93, 103-104, 169-171

Comment thread docs/integrations/codex.mdx Outdated
Signed-off-by: Ajay Thorve <athorve@nvidia.com>
Comment thread adapters/codex/src/nemo_fabric_adapters/codex/adapter.py

@Salonijain27 Salonijain27 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approved from a dependency point of view

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve
AjayThorve requested a review from a team as a code owner July 20, 2026 21:52
@github-actions

Copy link
Copy Markdown

Signed-off-by: Ajay Thorve <athorve@nvidia.com>
@AjayThorve

Copy link
Copy Markdown
Collaborator Author

/merge

@rapids-bot
rapids-bot Bot merged commit 0f8ffcf into NVIDIA:main Jul 20, 2026
20 of 21 checks passed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

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

⚠️ Outside diff range comments (3)
adapters/codex/README.md (1)

90-96: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Document the skill-directory name-uniqueness constraint.

The adapter rejects duplicate resolved skill directory names (_native_skill_paths in adapter.py), but this constraint isn't mentioned here. Calling it out would help users interpret the codex_invalid_configuration error when two configured skills.paths entries resolve to the same directory name.

✏️ Proposed addition
 - `skills.paths` names skill directories that contain `SKILL.md`. The adapter
   registers each directory as a process-scoped Codex skill root so Codex can
-  select matching skills through its normal discovery behavior.
+  select matching skills through its normal discovery behavior. Each resolved
+  directory name must be unique across `skills.paths`.
🤖 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 `@adapters/codex/README.md` around lines 90 - 96, Update the skills.paths
documentation to state that resolved skill directory names must be unique;
duplicate names are rejected by _native_skill_paths and produce a
codex_invalid_configuration error. Keep the existing description of skill
discovery unchanged.
adapters/codex/src/nemo_fabric_adapters/codex/adapter.py (2)

29-29: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Avoid the private _client.request seam. skills/extraRoots/set still goes through an internal SDK protocol path, so a future openai-codex release can break this without any public deprecation path. Add a narrow compatibility wrapper or test around the call.

🤖 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 `@adapters/codex/src/nemo_fabric_adapters/codex/adapter.py` at line 29, Update
the code using SkillsExtraRootsSetResponse so the skills/extraRoots/set request
no longer relies directly on the private _client.request seam. Add a narrow
compatibility wrapper around this call, or add a focused test that locks the
expected request behavior across openai-codex releases while keeping the
existing response handling intact.

1012-1018: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

Narrow the blind except Exception in SDK cleanup.

Static analysis flags catching a blind Exception here. The turn-execution branch above already narrows to (CodexError, RuntimeError, OSError); using the same tuple in this finally block would be more consistent and avoid masking unexpected error types during cleanup while still reporting the stop failure.

♻️ Proposed fix
     finally:
         if codex is not None:
             try:
                 await codex.close()
-            except Exception:
+            except (CodexError, RuntimeError, OSError):
                 output = _failure(
                     "codex_sdk_stop_failed", "Codex SDK runtime failed to stop"
                 )
🤖 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 `@adapters/codex/src/nemo_fabric_adapters/codex/adapter.py` around lines 1012 -
1018, Update the cleanup exception handler in the codex shutdown flow to catch
only CodexError, RuntimeError, and OSError, matching the turn-execution handling
above. Keep the existing _failure("codex_sdk_stop_failed", ...) response for
those expected cleanup failures and allow unexpected exception types to
propagate.

Source: Linters/SAST tools

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

Outside diff comments:
In `@adapters/codex/README.md`:
- Around line 90-96: Update the skills.paths documentation to state that
resolved skill directory names must be unique; duplicate names are rejected by
_native_skill_paths and produce a codex_invalid_configuration error. Keep the
existing description of skill discovery unchanged.

In `@adapters/codex/src/nemo_fabric_adapters/codex/adapter.py`:
- Line 29: Update the code using SkillsExtraRootsSetResponse so the
skills/extraRoots/set request no longer relies directly on the private
_client.request seam. Add a narrow compatibility wrapper around this call, or
add a focused test that locks the expected request behavior across openai-codex
releases while keeping the existing response handling intact.
- Around line 1012-1018: Update the cleanup exception handler in the codex
shutdown flow to catch only CodexError, RuntimeError, and OSError, matching the
turn-execution handling above. Keep the existing
_failure("codex_sdk_stop_failed", ...) response for those expected cleanup
failures and allow unexpected exception types to propagate.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 7d7e0e3c-9d87-4ca0-920f-6152060369c7

📥 Commits

Reviewing files that changed from the base of the PR and between e4c1668 and c6a7c69.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • adapters/codex/README.md
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • docs/integrations/codex.mdx
  • pyproject.toml
  • tests/adapters/test_codex_adapter.py
📜 Review details
⏰ Context from checks skipped due to timeout. (10)
  • GitHub Check: Preview docs
  • GitHub Check: Pre-commit
  • GitHub Check: Test (Python 3.12, x86_64)
  • GitHub Check: Test (Python 3.13, x86_64)
  • GitHub Check: Test (Python 3.14, x86_64)
  • GitHub Check: Test (Python 3.13, arm64)
  • GitHub Check: Test (Python 3.12, arm64)
  • GitHub Check: Test (Python 3.11, arm64)
  • GitHub Check: Test (Python 3.11, x86_64)
  • GitHub Check: Test (Python 3.14, arm64)
⚠️ CI failures not shown inline (6)

GitHub Actions: Rust / Test (arm64): feat: add normalized MCP and skills to Codex

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Rust / Test (x86_64): feat: add normalized MCP and skills to Codex

Conclusion: failure

View job details

##[group]Run just test-rust
 �[36;1mjust test-rust�[0m
 shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
 env:
   CARGO_INCREMENTAL: 0
   CARGO_PROFILE_DEV_DEBUG: 0
   CARGO_TERM_COLOR: always
   RUST_BACKTRACE: short
   RUSTFLAGS: -D warnings
   CARGO_UNSTABLE_SPARSE_REGISTRY: true
   CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
   CACHE_ON_FAILURE: false
 ##[endgroup]
 cargo test --workspace --locked
 �[1m�[92m   Compiling�[0m nemo-fabric-core v0.1.0 (/home/runner/work/NeMo-Fabric/NeMo-Fabric/crates/fabric-core)
 �[1m�[92m   Compiling�[0m nemo-fabric-cli v0.1.0 (/home/runner/work/NeMo-Fabric/NeMo-Fabric/crates/fabric-cli)
 �[1m�[92m    Finished�[0m `test` profile [unoptimized] target(s) in 4.99s
 �[1m�[92m     Running�[0m unittests src/lib.rs (target/debug/deps/nemo_fabric_cli-c6ca16d34f22a9db)
 running 19 tests
 Experiment with NeMo Fabric presets and maintained examples
 Usage: nemo-fabric <COMMAND>
 Commands:
   preset   Discover complete built-in presets
   example  Discover and initialize maintained examples
   plan     Resolve and print a run plan as JSON
   doctor   Diagnose a selected configuration without running it
   run      Execute one request through a selected configuration
   version  Print the Fabric core version
   help     Print this message or the help of the given subcommand(s)
 Options:
   -h, --help     Print help
   -V, --version  Print version
 test app::tests::explicit_help_is_successful ... ok
 test app::tests::failed_and_cancelled_runs_are_errors ... ok
 test app::tests::missing_subcommand_is_an_error ... ok
 test app::tests::model_overrides_require_a_preset_with_a_default_model ... ok
 test app::tests::parses_example_variant ... ok
 test app::tests::parses_preset_plan ... ok
 test app::tests::plan_requires_a_preset ... ok
 test app::tests::preset_model_overrides_preserve_provider_settings ... ok
 test assets::tests::stages_and_removes_embedded_files ... ok
 test app::tests::selectors_are_mutually_exclusive ... ok
 test exam...

GitHub Actions: Rust / Test (arm64): feat: add normalized MCP and skills to Codex

Conclusion: failure

View job details

##[group]Run just test-rust
 �[36;1mjust test-rust�[0m
 shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
 env:
   CARGO_INCREMENTAL: 0
   CARGO_PROFILE_DEV_DEBUG: 0
   CARGO_TERM_COLOR: always
   RUST_BACKTRACE: short
   RUSTFLAGS: -D warnings
   CARGO_UNSTABLE_SPARSE_REGISTRY: true
   CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
   CACHE_ON_FAILURE: false
 ##[endgroup]
 cargo test --workspace --locked
 �[1m�[92m   Compiling�[0m nemo-fabric-core v0.1.0 (/home/runner/work/NeMo-Fabric/NeMo-Fabric/crates/fabric-core)
 �[1m�[92m   Compiling�[0m nemo-fabric-cli v0.1.0 (/home/runner/work/NeMo-Fabric/NeMo-Fabric/crates/fabric-cli)
 �[1m�[92m    Finished�[0m `test` profile [unoptimized] target(s) in 5.49s
 �[1m�[92m     Running�[0m unittests src/lib.rs (target/debug/deps/nemo_fabric_cli-14421df198e0c90a)
 running 19 tests
 Experiment with NeMo Fabric presets and maintained examples
 Usage: nemo-fabric <COMMAND>
 Commands:
   preset   Discover complete built-in presets
   example  Discover and initialize maintained examples
   plan     Resolve and print a run plan as JSON
   doctor   Diagnose a selected configuration without running it
   run      Execute one request through a selected configuration
   version  Print the Fabric core version
   help     Print this message or the help of the given subcommand(s)
 Options:
   -h, --help     Print help
   -V, --version  Print version
 test app::tests::explicit_help_is_successful ... ok
 test app::tests::failed_and_cancelled_runs_are_errors ... ok
 test app::tests::missing_subcommand_is_an_error ... ok
 test app::tests::model_overrides_require_a_preset_with_a_default_model ... ok
 test app::tests::parses_example_variant ... ok
 test app::tests::parses_preset_plan ... ok
 test app::tests::plan_requires_a_preset ... ok
 test app::tests::preset_model_overrides_preserve_provider_settings ... ok
 test app::tests::selectors_are_mutually_exclusive ... ok
 test assets::tests::stages_and_removes_embedded_files ... ok
 test exam...

GitHub Actions: Rust / 1_Test (arm64).txt: feat: add normalized MCP and skills to Codex

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Rust / Test (x86_64): feat: add normalized MCP and skills to Codex

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Rust / 0_Test (x86_64).txt: feat: add normalized MCP and skills to Codex

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m
🧰 Additional context used
📓 Path-based instructions (33)
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,toml}: Rust code must be formatted with cargo fmt --all; formatting can be checked with cargo fmt --all -- --check, and Rust workspaces must compile with cargo check --workspace --locked.
Rust files must begin with the specified // SPDX copyright and Apache-2.0 license header.

When Rust code or Rust project configuration changes, run cargo fmt --all -- --check and just test-rust.

Files:

  • pyproject.toml
**/*

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*: All source files must include the specified SPDX copyright and Apache-2.0 license header using the comment syntax appropriate to the file type.
Release tags must use raw Rust-compatible SemVer without a leading v, such as 0.1.0 or 0.1.0-rc.1.

**/*: 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.

**/*: Keep pull request branch scope coherent and reviewable.
Run relevant tests under validate-change before opening or updating a pull request.
Format changed files with the language-native formatter.
Update documentation and examples for public behavior changes.
Update dependent maintainer or consumer guidance when code changes affect APIs, bindings, commands, paths, packaging guidance, or best practices.
Use Conventional Commit style for pull request titles: <type>: <concise imperative summary>, choosing the type from the actual change surface. Use fix only for user-facing or runtime product-code bug fixes.
A pull request body must include #### Overview, #### Details, #### Validation, #### Where should the reviewer start?, and `#### Related ...

Files:

  • pyproject.toml
  • docs/integrations/codex.mdx
  • adapters/codex/README.md
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • tests/adapters/test_codex_adapter.py
**/*.{toml,yaml,yml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

TOML, YAML, and shell files must use the specified SPDX header with # comments.

Files:

  • pyproject.toml
{Cargo.toml,pyproject.toml,python/pyproject.toml,python/src/nemo_fabric/**}

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

{Cargo.toml,pyproject.toml,python/pyproject.toml,python/src/nemo_fabric/**}: Keep Rust package names, Python package/import paths, and native module names internally consistent across Cargo and Python packaging metadata and source paths.
Ensure generated native and Python artifacts are placed where downstream consumers expect them.

Files:

  • pyproject.toml
{Cargo.toml,pyproject.toml,python/pyproject.toml,Cargo.lock,uv.lock}

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

Keep workspace, Rust, Python, and lockfile versions aligned where required.

Files:

  • pyproject.toml
{pyproject.toml,python/pyproject.toml,Cargo.toml,python/src/nemo_fabric/**}

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

The editable maturin build must continue to produce the nemo_fabric._native extension.

Files:

  • pyproject.toml
{.github/workflows/ci_python.yml,.github/workflows/ci_rust.yml,justfile,pyproject.toml,python/pyproject.toml,Cargo.toml}

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

CI workflows must reference the same package names and commands used by local build and installation workflows.

Files:

  • pyproject.toml
{Cargo.toml,Cargo.lock,pyproject.toml,python/pyproject.toml,uv.lock,docs/package.json,docs/package-lock.json}

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

Maintain package metadata and dependency resolution consistently across Rust, Python, documentation tooling, and their lockfiles.

Files:

  • pyproject.toml
**/pyproject.toml

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Run just build-python to verify that all Python package metadata resolves.

Files:

  • pyproject.toml
**/*.{rs,py,pyi,toml}

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

When the PyO3 bridge or package metadata changes, run just build-python and cargo check -p fabric-python --locked.

Files:

  • pyproject.toml
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • tests/adapters/test_codex_adapter.py
**/*.{md,mdx,html}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Changes affecting public behavior, adapters, examples, or workspace structure must update the corresponding documentation; public API changes require updated SDK or API reference documentation.

Files:

  • docs/integrations/codex.mdx
  • adapters/codex/README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

For docs site changes, run just docs to regenerate Python and Rust API references and validate Fern configuration.

**/*.{md,mdx}: Prioritize factual accuracy in NeMo Fabric documentation and keep commands, package names, APIs, file paths, repository layout, entry points, support claims, examples, and procedures aligned with current repository behavior.
Update relevant entry-point documentation when public behavior changes, including README.md, docs/index.yml, package or crate READMEs, and adapter or integration READMEs.
Use {/* ... */} delimiters for top-of-file SPDX comments in MDX files, not HTML comment delimiters.
Capitalize NVIDIA correctly and use consistent current repository terminology, product names, APIs, and feature names.
Format commands, code, expressions, file names, paths, and filenames as inline code where appropriate.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences.
Use descriptive link text instead of raw URLs or generic labels such as here.
Write procedures as short, imperative, parallel, easy-to-scan steps; prefer active voice, present tense, plain English, and concise sentences.
Use after instead of once when expressing temporal sequence, and use can instead of may when describing possibility rather than permission.
Use unambiguous date formats and avoid ordinal dates in body text.
When reviewing documentation, report findings in severity order under Must fix, Should fix, and Nice to have, with file paths, line references, explanations, and concrete rewrites or directions.

Files:

  • docs/integrations/codex.mdx
  • adapters/codex/README.md
**/*.mdx

📄 CodeRabbit inference engine (CONTRIBUTING.md)

MDX files must use the specified SPDX header in a JSX comment.

In MDX files, use JSX comment delimiters ({/* and */}) for top-of-file comments, including SPDX headers; do not use HTML comments.

Files:

  • docs/integrations/codex.mdx
{README.md,docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Keep package names, repository references, and build commands current in documentation and examples.

Files:

  • docs/integrations/codex.mdx
{docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Update relevant getting-started, reference, adapter, and example documentation when the corresponding examples or adapters change.

Files:

  • docs/integrations/codex.mdx
docs/**/*.{md,mdx,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Run just docs when the documentation site changes.

Files:

  • docs/integrations/codex.mdx
{docs/**/*,.github/workflows/ci_python.yml,.github/workflows/ci_rust.yml,justfile}

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

Use the current install, import, build, test, clean, and documentation commands consistently in documentation, examples, CI workflows, and just recipes.

Files:

  • docs/integrations/codex.mdx
{docs/**/*,.github/workflows/ci_python.yml,.github/workflows/ci_rust.yml}

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

Reflect public packaging changes in release-facing documentation and examples.

Files:

  • docs/integrations/codex.mdx
**/*.{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 spell NVIDIA in all caps; do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such as here or read more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once, and prefer refer to over see when 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:

  • docs/integrations/codex.mdx
  • adapters/codex/README.md
docs/**/*

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

For documentation or examples changes, run just docs when practical and verify documented commands against the current repository.

Files:

  • docs/integrations/codex.mdx
{docs/**,README.md,AGENTS.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.

Files:

  • docs/integrations/codex.mdx
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update an adapter or example README.md when that adapter or example surface changes.

Files:

  • adapters/codex/README.md
**/*.{html,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

HTML and Markdown files must use the specified SPDX header in an HTML comment.

Files:

  • adapters/codex/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Update documentation and examples in the same branch as the public API change.

Verify README and documentation entry points, package names, paths, examples, and public commands remain current after changes.

Files:

  • adapters/codex/README.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.
Use can for possibility and reserve may for permission; use after for temporal order; use refer to for cross-references; prefer short direct sentences and specific verbs; avoid unnecessary please in 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: use for example or such as instead of e.g., and so on instead of etc., that is instead of i.e., compared to instead of vs., and by, through, or using instead of via. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Use that without commas for essential clauses, and which with commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such as June 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space before a.m. or p.m.; use ET and PT for needed time zones; avoid 24/7; and prefer from 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:

  • adapters/codex/README.md
{adapters/**,examples/**}

⚙️ CodeRabbit configuration file

{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public Fabric contracts.

Files:

  • adapters/codex/README.md
  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.py: Python public APIs must use type annotations, and native Python binding declarations must remain synchronized with their Rust implementations.
Python files must begin with the specified # SPDX copyright and Apache-2.0 license header.

Files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • tests/adapters/test_codex_adapter.py
**/*.{rs,py}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{rs,py}: Use snake_case for Rust and Python functions and variables; use PascalCase for Rust types and Python classes.
Run tests for every language surface affected by a change. Changes touching the Rust core or public schemas require both Rust and Python test suites.
Public contract changes must keep native Python binding declarations synchronized with their Rust implementations.

Files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • tests/adapters/test_codex_adapter.py
**/*.{rs,py,pyi,json,yaml,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.

Files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • tests/adapters/test_codex_adapter.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:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
  • tests/adapters/test_codex_adapter.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.asyncio to tests; async tests are automatically detected by the async runner.
Do not add -> None return annotations to test functions.
When mocking a class, use unittest.mock.MagicMock or AsyncMock, supplying spec when necessary; do not define a new mock class.
Prefix mocked class names with mock, not fake.
Prefer pytest fixtures over helper methods.
Define shared fixtures in conftest.py rather than repeating them across test files.
Define fixtures using @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and a <fixture_name>_fixture function; specify scope only when it is not function.
Prefer pytest.mark.parametrize over separate tests for different input types.
Use @pytest.mark.usefixtures when a fixture is needed but its return value is unused.
Use os.environ to modify environment variables in tests; do not use monkeypatch.setenv, because the autouse restore_environ_fixture in tests/conftest.py restores the environment after each test.
Avoid defensive programming in tests; access expected data directly so missing data raises a clear error instead of being silently tolerated.
Run focused tests with uv run pytest -k "<pattern>" and all tests with uv run pytest.

Files:

  • tests/adapters/test_codex_adapter.py
tests/adapters/**/*

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

When an adapter or integration changes, run its focused tests under tests/adapters, followed by just test-python.

Files:

  • tests/adapters/test_codex_adapter.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/adapters/test_codex_adapter.py
🧠 Learnings (1)
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.

Applied to files:

  • adapters/codex/src/nemo_fabric_adapters/codex/adapter.py
🧬 Code graph analysis (2)
adapters/codex/src/nemo_fabric_adapters/codex/adapter.py (2)
adapters/common/src/nemo_fabric_adapters/common/utils.py (2)
  • base_dir (62-68)
  • relay_enabled (156-157)
tests/adapters/test_codex_adapter.py (1)
  • close (119-120)
tests/adapters/test_codex_adapter.py (2)
adapters/codex/src/nemo_fabric_adapters/codex/adapter.py (2)
  • run (1098-1108)
  • state_dir (490-491)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)
  • base_dir (62-68)
🪛 Ruff (0.15.21)
adapters/codex/src/nemo_fabric_adapters/codex/adapter.py

[warning] 1015-1015: Do not catch blind exception: Exception

(BLE001)

tests/adapters/test_codex_adapter.py

[warning] 488-488: Missing return type annotation for private function fail_to_create_home

Add return type annotation: Never

(ANN202)


[warning] 488-488: Missing type annotation for *_args

(ANN002)


[warning] 488-488: Missing type annotation for **_kwargs

(ANN003)


[warning] 489-489: Avoid specifying long messages outside the exception class

(TRY003)

🔇 Additional comments (8)
adapters/codex/src/nemo_fabric_adapters/codex/adapter.py (3)

241-274: Falsy skill_paths fix confirmed.

.get("skill_paths", []) now defaults only when the key is absent, preserving the intended validation for falsy non-list values. This matches the previously requested fix.


253-253: Consistent base_dir-relative path resolution.

All native path resolution (skill_paths, resolve_cwd, codex_bin, artifact root, relay command base) consistently resolves against common_utils.base_dir(payload) without expanduser() or reliance on harness.settings.cwd.
Based on learnings, this matches the required convention for adapter-configured paths.

Also applies to: 300-308, 428-478, 481-486, 634-647, 731-747


689-698: MCP/skills wiring and validation ordering look correct.

thread_config injects native mcp_servers only when present, config overrides are merged afterward, validate_payload resolves skill_paths up-front and exercises thread_config (which validates MCP servers) before touching the SDK, and invoke_codex_sdk registers skill roots before thread creation inside the timeout boundary — matching the PR's stated ordering guarantees.

Also applies to: 781-813, 943-969

pyproject.toml (1)

128-128: CLI-bin constraint removal matches the SDK dependency retention plan.

Removing the openai-codex-cli-bin==0.137.0a4 constraint aligns with retaining the SDK's own exact transitive pin, and openai-codex==0.144.4 is a valid, current release line (confirmed against the upstream openai/codex release history).

adapters/codex/README.md (1)

52-69: Documentation matches current adapter behavior.

The NVIDIA provider, codex_bin resolution, MCP/skills mapping, tools.blocked unsupported rationale, Relay-provider restriction, and Relay observability guidance all match the corresponding code in adapter.py and are consistent with docs/integrations/codex.mdx.

Also applies to: 98-103, 112-113, 150-156, 169-172

docs/integrations/codex.mdx (1)

104-132: Relay/NVIDIA provider restriction is consistent with README and adapter code.

The Relay-requires-openai-provider statement matches validate_payload's check and the equivalent README section.

tests/adapters/test_codex_adapter.py (2)

109-116: Mock setup and new MCP-mapping/no-call assertions look correct.

The _client.request mock seam correctly exercises the skill-registration compatibility path, and the oneshot test's client._client.request.assert_not_awaited() / client.models.assert_not_awaited() assertions properly guard against unnecessary calls when no MCP/skills config is present. os.environ usage and AsyncMock follow the repository's test conventions.

Also applies to: 194-231


819-828: Regression coverage for falsy capability settings and resolved plan shape is solid.

Rejecting {} for mcp_servers/skills and asserting the resolved native capability plan (skill_paths, mcp_servers with exposure) gives good end-to-end coverage of the normalized configuration contract.

Also applies to: 862-889

@AjayThorve
AjayThorve deleted the feat/codex-capability-parity branch July 20, 2026 22:00
description: "Configure ChatGPT or API key authentication for the NeMo Fabric Codex SDK adapter."
title: "Use the Codex Adapter"
description: "Configure capabilities, authentication, and telemetry for the NeMo Fabric Codex SDK adapter."
---

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Must fix: This is the first product-name use on the page, but it omits the NVIDIA prefix. The documentation style guide requires “NVIDIA NeMo Fabric” on first use, followed by “NeMo Fabric.” Please change the description to “Configure capabilities, authentication, and telemetry for the NVIDIA NeMo Fabric Codex SDK adapter.”

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants