Skip to content

feat(inference): add a non-interactive reasoning-effort input for compatible endpoints - #7711

Merged
apurvvkumaria merged 17 commits into
mainfrom
feat/reasoning-effort-input
Jul 28, 2026
Merged

feat(inference): add a non-interactive reasoning-effort input for compatible endpoints#7711
apurvvkumaria merged 17 commits into
mainfrom
feat/reasoning-effort-input

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

NemoClaw exposed reasoning as a boolean only, so an automation client that requires an explicit reasoning-effort value could not express it through the public CLI and had to either drop the setting or edit lower-level runtime configuration. A compatible OpenAI endpoint now takes a reasoning effort through NEMOCLAW_REASONING_EFFORT or --reasoning-effort, and NemoClaw carries the value through the same lifecycle state as the reasoning flag so it survives resume, rebuild, and recreation.

Related Issue

Resolves #7659

Changes

  • src/lib/onboard/reasoning-mode.ts: add the effort normaliser, the request resolver, the resume-conflict reporter, and the environment helpers beside the existing reasoning-flag ones. Accepted values are low, medium, high, and default for the unset state. A flag beats the variable, which is the deterministic precedence the issue asks for.
  • src/commands/inference/set.ts and src/commands/sandbox/inference/set.ts: add --reasoning-effort to both grammars, restricted to the accepted values at parse time.
  • src/lib/inference/selection.ts, src/lib/state/onboard-session.ts, src/lib/onboard/sandbox-registration.ts, src/lib/onboard/machine/, src/lib/onboard/setup-nim-*.ts: record compatibleEndpointReasoningEffort in selection, session, and registry state, gated on the compatible-endpoint provider exactly as the reasoning flag is.
  • src/lib/actions/sandbox/rebuild-*.ts: replay the recorded value through resume, rebuild, recreation, and both image preflights, and add NEMOCLAW_REASONING_EFFORT to the ambient-recreate isolation set so an unrelated onboard cannot contaminate a rebuild.
  • Dockerfile, src/lib/onboard/dockerfile-patch.ts, scripts/nemoclaw-start.sh, scripts/generate-openclaw-config.mts: carry the value into the image and emit it as params.extra_body.reasoning_effort on model entries whose route uses openai-completions. OpenClaw merges params.extra_body into openai-completions request bodies, so this is the configuration-level route to a reasoning_effort the endpoint actually receives; no direct OpenShell or agent-runtime change is required of the consumer.
  • src/lib/actions/inference-set.ts: apply an explicit request to the running sandbox's config, preserve a recorded effort when the flag is omitted, and clear it on default.

Reasoning effort reuses the existing reasoning-flag rails rather than introducing an abstraction, a fallback, or a compatibility path. The one new closed enum matches the value set the issue names, and test/generate-openclaw-config-reasoning-effort.test.ts fails the build on any value outside it.

Hermes is deliberately out of scope. AGENTS.md requires a Hermes-specific repro or acceptance test before adding Hermes behavior for an OpenClaw issue, so the hardcoded agent.reasoning_effort in agents/hermes/config/hermes-config.ts is unchanged and remains a separate source of truth worth a follow-up issue.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification:
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: nine-category maintainer security review PASS at 2810852be; exact-base 8d3e728b9 binary-diff SHA-256 104590fe8f861ed8bf25df00db17d45910c107c0387fc4f7a15956e471675d5a.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

npm run docs exits 0 and fern check reports 0 errors, but it also reports 2 warnings that are present on main and unrelated to this change, so the "builds without warnings" verification item below is left unchecked.

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: docs-updated
  • Evidence: docs/inference/configure-model-capabilities.mdx, docs/inference/set-up-openai-compatible-endpoint.mdx, docs/reference/commands.mdx. The review ran three times and returned docs-blocked twice before this result. Its first pass found that the reference page promised durability the code did not deliver: inference set patched params.extra_body.reasoning_effort for any openai-completions route, while the registry row kept the value only for compatible-endpoint, so the next rebuild dropped it. Commit 4817d69 scopes the patch to that provider and adds a covering test. Its second pass caught an over-correction in that same commit, where the docs wrongly denied that NEMOCLAW_REASONING_EFFORT accepts default; commit a5df976 restores it and scopes the validation claim to the provider that actually validates. Commit 999b756 closes the remaining nit, where an explicit request wrote the session field for a provider whose registry row cannot record it. The review confirmed no other page needs a change and that no dated changelog entry belongs here.
  • Final maintainer follow-up: the exact 2810852be change set aligns the reasoning-effort documentation with fail-closed provider/API validation; npm run docs and the documentation-writer review pass.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result: exact 2810852be maintainer follow-up suites pass: 173 inference-set tests plus 80 focused tests (253 total); npm run typecheck:cli, npm run checks, npm run docs, and diff-scoped prek hooks all pass.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result:
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Tinson Lai tinsonl@nvidia.com

Summary by CodeRabbit

  • New Features
    • Added configurable reasoning effort (low|medium|high|default) for compatible OpenAI-completions routes.
    • Introduced inference set --reasoning-effort and NEMOCLAW_REASONING_EFFORT (including runtime build/runtime propagation).
    • Reasoning effort is persisted across onboarding and rebuild/recreate/resume, and shown in status/doctor for the applicable route.
  • Documentation
    • Updated inference setup/set-up and command/environment references for the new flag and environment variable.
  • Tests
    • Added extensive coverage for validation, persistence, routing behavior, resume conflicts, and reporting.
  • Bug Fixes
    • Ensures effort is correctly injected/omitted per provider/API family and reflected in status, doctor JSON, and JSONL events.

…patible endpoints

NemoClaw exposed reasoning as a boolean only, so an automation client that
requires an explicit reasoning-effort value could not express it through the
public CLI. Add NEMOCLAW_REASONING_EFFORT and an --reasoning-effort flag on both
inference set grammars, accepting low, medium, high, and default for the unset
state, with the flag taking precedence over the variable.

The value follows the same lifecycle rails as the reasoning flag through
selection, session, registry, resume, rebuild, and recreation, and reaches the
endpoint as reasoning_effort in the request body of a model routed through
openai-completions. A resumed onboard keeps the recorded value and reports the
request it ignores. Unsupported values fail before any provider, policy,
sandbox, or registry effect.

Resolves #7659

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
…hat records it

inference set patched params.extra_body.reasoning_effort for any
openai-completions route, but the registry row only keeps the value for
compatible-endpoint, so the next rebuild silently dropped it. Restrict the
patch to that provider, and correct the documentation on provider scope, flag
precedence, and the agent surfaces the setting reaches.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
…re they fail

The variable accepts `default` for the unset state exactly as the flag does; a
previous edit wrongly said otherwise. Validation also fails only on the
compatible-endpoint provider, because every other provider clears the variable
without reading it. State both, and drop a duplicated sentence.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
…g provider

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 60b2521c-1e0b-43d7-b000-a44c9e20870f

📥 Commits

Reviewing files that changed from the base of the PR and between 2810852 and b75d244.

📒 Files selected for processing (8)
  • Dockerfile
  • docs/inference/configure-model-capabilities.mdx
  • docs/inference/set-up-openai-compatible-endpoint.mdx
  • docs/reference/commands.mdx
  • scripts/nemoclaw-start.sh
  • src/lib/onboard/machine/handlers/provider-inference-reasoning-effort-resume.test.ts
  • src/lib/onboard/machine/handlers/provider-inference.ts
  • test/nemoclaw-start-reasoning-effort.test.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • docs/inference/set-up-openai-compatible-endpoint.mdx
  • src/lib/onboard/machine/handlers/provider-inference-reasoning-effort-resume.test.ts
  • docs/inference/configure-model-capabilities.mdx
  • src/lib/onboard/machine/handlers/provider-inference.ts
  • docs/reference/commands.mdx

📝 Walkthrough

Walkthrough

Adds NEMOCLAW_REASONING_EFFORT support across CLI commands, environment configuration, compatible-endpoint request bodies, onboarding/session state, inference mutation, sandbox rebuilds, diagnostics, tests, and documentation.

Changes

Reasoning-effort configuration

Layer / File(s) Summary
Input contracts and config generation
Dockerfile, src/lib/onboard/reasoning-mode.ts, scripts/*, src/commands/*
Adds validated `low
Inference mutation
src/lib/actions/inference-set.ts, src/lib/actions/inference-set-reasoning-effort.test.ts, src/commands/*test.ts
Validates and applies reasoning effort, updates model configuration, and persists or clears registry and session metadata according to provider and API family.
Onboarding and session state
src/lib/onboard/*, src/lib/inference/selection.ts, src/lib/state/onboard-session.ts, related tests
Carries normalized effort through provider selection, resume handling, flow context, registry selection, session persistence, and conflict reporting.
Sandbox rebuild lifecycle
src/lib/actions/sandbox/*, test/helpers/*, related tests
Preserves reasoning effort through trusted rebuild resume configuration, environment isolation, image preflight, session rewind, runtime preflight, and registry updates.
Diagnostics and documentation
src/lib/actions/sandbox/doctor*, src/lib/actions/sandbox/status-text.ts, src/lib/onboard/machine/events.ts, docs/inference/*, docs/reference/commands.mdx
Reports effective effort in doctor output, status text, and JSONL onboarding context, and documents accepted values, precedence, provider/API restrictions, replay behavior, and clearing semantics.
Integration validation
test/*reasoning-effort.test.ts, src/lib/*reasoning-effort.test.ts, related fixtures
Covers request validation, configuration generation, startup overrides, inference mutation, resume conflicts, persistence, provider compatibility, and route-specific clearing.

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

Possibly related PRs

Suggested labels: v0.0.97, area: onboarding, area: sandbox, area: cli, area: docs

Suggested reviewers: cv, ericksoa, prekshivyas

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.53% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding non-interactive reasoning-effort input for compatible endpoints.
Linked Issues check ✅ Passed The changes implement validated reasoning-effort input across onboarding, resume, rebuild, recreation, inference set, status, doctor, and events as required by #7659.
Out of Scope Changes check ✅ Passed The diff appears focused on reasoning-effort support and its lifecycle plumbing, with no obvious unrelated feature work.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/reasoning-effort-input

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

@github-code-quality

github-code-quality Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit b75d244 in the feat/reasoning-effor... branch remains at 96%, unchanged from commit 7f4b490 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit b75d244 in the feat/reasoning-effor... branch remains at 81%, unchanged from commit c3ab052 in the main branch.

Show a code coverage summary of the most impacted files.
File main c3ab052 feat/reasoning-effor... b75d244 +/-
src/lib/onboard...asoning-mode.ts 100% 89% -11%
src/lib/actions...or-inference.ts 100% 95% -5%
src/lib/actions...ge-preflight.ts 90% 87% -3%
src/lib/policy/index.ts 61% 61% 0%
src/lib/onboard...tup-nim-flow.ts 93% 94% +1%
src/lib/sandbox/config.ts 72% 74% +2%
src/lib/actions...ge-preflight.ts 94% 97% +3%
src/lib/private-networks.ts 88% 93% +5%
src/lib/platform.ts 84% 89% +5%
src/commands/sandbox/mcp.ts 0% 85% +85%

Updated July 28, 2026 18:51 UTC

@github-actions

Copy link
Copy Markdown
Contributor

@cv cv 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.

lgtm on green

@laitingsheng laitingsheng added area: inference Inference routing, serving, model selection, or outputs feature PR adds or expands user-visible functionality labels Jul 28, 2026
@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized E2E selections differ; severity counts match.

Nemotron output stays in workflow artifacts and does not change the assessment above.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: cloud-onboard, full-e2e, inference-routing, network-policy, onboard-repair, onboard-resume, state-backup-restore, upgrade-stale-sandbox

3 optional E2E recommendations
  • openclaw-inference-switch
  • rebuild-openclaw
  • sandbox-rebuild

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 8

🧹 Nitpick comments (3)
src/lib/onboard/reasoning-effort.test.ts (1)

58-60: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Cover default through the environment input.

This only verifies --reasoning-effort default; add the equivalent NEMOCLAW_REASONING_EFFORT=default assertion to protect the documented env contract.

🤖 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 `@src/lib/onboard/reasoning-effort.test.ts` around lines 58 - 60, Add an
environment-input test alongside the existing resolveReasoningEffortRequest
coverage, setting NEMOCLAW_REASONING_EFFORT to "default" and asserting it
resolves to { effort: null, explicit: true }. Use the test’s existing
environment setup and cleanup helpers so the documented env contract is verified
without affecting other tests.

Source: Path instructions

src/lib/onboard/sandbox-registration.test.ts (1)

397-457: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Exercise non-default session-to-registry propagation.

All new expectations use null, so this still passes if selection() drops a recorded "high" value. Add a matching-session case with "high" and assert the returned registry selection preserves it.

🤖 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 `@src/lib/onboard/sandbox-registration.test.ts` around lines 397 - 457, The
selection tests do not verify propagation of a non-default reasoning-effort
value. Add a matching-session case in the selection tests around selection()
using compatibleEndpointReasoningEffort set to "high", and assert the returned
registry selection preserves "high" while retaining the existing matching
metadata behavior.

Source: Path instructions

docs/reference/commands.mdx (1)

3141-3181: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

--reasoning-effort appears in the shared Hermes/OpenClaw synopsis but is only documented for OpenClaw.

Line 3142's $$nemoclaw inference set usage synopsis is inside the <AgentOnly variant="openclaw,hermes"> block (opened at line 3125), so it renders on both pages, but the entire --reasoning-effort explanation at lines 3175-3179 is scoped to <AgentOnly variant="openclaw"> only. Since NEMOCLAW_REASONING_EFFORT/--reasoning-effort is explicitly "OpenClaw only" per docs/inference/set-up-openai-compatible-endpoint.mdx and docs/inference/configure-model-capabilities.mdx, a Hermes reader sees the flag in the command signature with no explanation of what it does or that it's unsupported for their agent.

📝 Proposed fix: scope the flag to the OpenClaw-only synopsis
 ```bash
-$$nemoclaw inference set --provider <provider> --model <model> [--sandbox <name>] [--no-verify] [--endpoint-url <url>] [--credential-env <ENV>] [--inference-api <api>] [--reasoning-effort <effort>]
+$$nemoclaw inference set --provider <provider> --model <model> [--sandbox <name>] [--no-verify] [--endpoint-url <url>] [--credential-env <ENV>] [--inference-api <api>]

And add an OpenClaw-only synopsis variant near the existing `<AgentOnly variant="openclaw">` block (lines 3173-3181) that shows the flag alongside its explanation.
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @docs/reference/commands.mdx around lines 3141 - 3181, Remove
--reasoning-effort from the shared inference set synopsis in the Hermes/OpenClaw
section. Add an OpenClaw-only synopsis that includes --reasoning-effort
immediately before the existing OpenClaw-specific explanation, so Hermes
documentation does not advertise the unsupported flag.


</details>

<!-- cr-comment:v1:0eb0004c4894f4be2f05142a -->

_Source: Path instructions_

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

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 @scripts/nemoclaw-start.sh:

  • Around line 1150-1158: Update the reasoning-effort override flow to accept
    "default" as an explicit unset value and remove the field when selected. Apply
    the provider API override before mutating the model, then determine whether to
    add or remove reasoning_effort using that final effective API rather than the
    pre-override API. Preserve validation for unsupported values.

In @src/lib/actions/inference-set.ts:

  • Line 700: Scope reasoning effort to compatible-endpoint providers across all
    paths: in src/lib/actions/inference-set.ts lines 700-700, reject non-null
    explicit effort unless the selected provider is compatible-endpoint before route
    mutation; in lines 433-450, remove inherited reasoning_effort when the target
    provider or API cannot support it while preserving other extra_body values; in
    lines 983-985, persist null for unsupported providers; in
    scripts/generate-openclaw-config.mts lines 648-654, require both the
    compatible-endpoint provider binding and openai-completions; update
    src/lib/actions/inference-set-reasoning-effort.test.ts lines 114-144 to seed
    existing effort, switch to an unsupported provider/API, and assert it is
    rejected or removed.

In @src/lib/actions/sandbox/rebuild-env-isolation.test.ts:

  • Around line 51-54: Update the isolation behavior test fixture to assign a
    non-empty value to NEMOCLAW_REASONING_EFFORT, then assert the value is absent
    during isolation and restored afterward. Keep the existing contract assertion
    and test behavior for the other environment variables unchanged.

In @src/lib/actions/sandbox/rebuild-resume-config.ts:

  • Around line 118-120: Update the compatibleEndpointReasoningEffort assignment
    in the resume-config rebuild flow so an explicitly null
    registrySelection.compatibleEndpointReasoningEffort remains authoritative and
    does not fall back to legacySelection. Preserve legacy fallback only when the
    registry value is absent, and add a regression test covering registry null with
    legacy "low" if tests are present for this flow.

In @src/lib/onboard/machine/handlers/provider-inference.ts:

  • Around line 514-518: Update the describeIgnoredReasoningEffortEnv call in
    handleProviderInferenceState to pass the handler’s injected env argument,
    ensuring reasoning-effort resume reads NEMOCLAW_REASONING_EFFORT from the
    supplied environment rather than global process.env.

In @src/lib/onboard/reasoning-effort.test.ts:

  • Around line 16-19: Remove the direct process.env deletion from the afterEach
    cleanup in the reasoning-effort tests. Keep vi.unstubAllEnvs() as the sole
    restoration step so the original REASONING_EFFORT_ENV value remains intact.

In @src/lib/state/onboard-session.ts:

  • Line 747: Enforce the reasoning-effort enum at both persisted-state boundaries
    in src/lib/state/onboard-session.ts: around lines 747-747, validate
    compatibleEndpointReasoningEffort during durable-state loading and reject
    non-null values other than low, medium, or high; around lines 1273-1277, reject
    non-null updates outside the same enum before persisting. Preserve null handling
    and prevent invalid values from reaching resumed flows or storage.

In @test/generate-openclaw-config-reasoning-effort.test.ts:

  • Around line 119-124: Update the NEMOCLAW_REASONING_EFFORT validation exercised
    by runConfigScript to accept default as a valid value and clear the
    reasoning-effort override for it, while retaining the existing low, medium, and
    high behavior and rejecting unsupported values such as extreme.

Nitpick comments:
In @docs/reference/commands.mdx:

  • Around line 3141-3181: Remove --reasoning-effort from the shared inference set
    synopsis in the Hermes/OpenClaw section. Add an OpenClaw-only synopsis that
    includes --reasoning-effort immediately before the existing OpenClaw-specific
    explanation, so Hermes documentation does not advertise the unsupported flag.

In @src/lib/onboard/reasoning-effort.test.ts:

  • Around line 58-60: Add an environment-input test alongside the existing
    resolveReasoningEffortRequest coverage, setting NEMOCLAW_REASONING_EFFORT to
    "default" and asserting it resolves to { effort: null, explicit: true }. Use the
    test’s existing environment setup and cleanup helpers so the documented env
    contract is verified without affecting other tests.

In @src/lib/onboard/sandbox-registration.test.ts:

  • Around line 397-457: The selection tests do not verify propagation of a
    non-default reasoning-effort value. Add a matching-session case in the selection
    tests around selection() using compatibleEndpointReasoningEffort set to "high",
    and assert the returned registry selection preserves "high" while retaining the
    existing matching metadata behavior.

</details>

<details>
<summary>🪄 Autofix (Beta)</summary>

Fix all unresolved CodeRabbit comments on this PR:

- [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended)
- [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: Path: .coderabbit.yaml

**Review profile**: CHILL

**Plan**: Enterprise

**Run ID**: `0fccd8a4-ae1a-4a42-a67c-cd66c105a64a`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8a0f36f612cd8c58e53c22fd6e52d10193ee593d and 999b756540da8c502ff5063a1037d52131acd8ac.

</details>

<details>
<summary>📒 Files selected for processing (59)</summary>

* `Dockerfile`
* `docs/inference/configure-model-capabilities.mdx`
* `docs/inference/set-up-openai-compatible-endpoint.mdx`
* `docs/reference/commands.mdx`
* `scripts/generate-openclaw-config.mts`
* `scripts/nemoclaw-start.sh`
* `src/commands/inference/set.ts`
* `src/commands/sandbox/inference/set.ts`
* `src/lib/actions/inference-set-reasoning-effort.test.ts`
* `src/lib/actions/inference-set.ts`
* `src/lib/actions/sandbox/rebuild-custom-image-preflight.test.ts`
* `src/lib/actions/sandbox/rebuild-custom-image-preflight.ts`
* `src/lib/actions/sandbox/rebuild-dcode-pre-delete-drift.test.ts`
* `src/lib/actions/sandbox/rebuild-dcode-preflight.ts`
* `src/lib/actions/sandbox/rebuild-durable-config.ts`
* `src/lib/actions/sandbox/rebuild-env-isolation.test.ts`
* `src/lib/actions/sandbox/rebuild-env-isolation.ts`
* `src/lib/actions/sandbox/rebuild-managed-image-preflight.ts`
* `src/lib/actions/sandbox/rebuild-provider-preflight.test.ts`
* `src/lib/actions/sandbox/rebuild-recreate-observability.test.ts`
* `src/lib/actions/sandbox/rebuild-recreate-phase.ts`
* `src/lib/actions/sandbox/rebuild-resume-config.ts`
* `src/lib/actions/sandbox/rebuild-resume-session.test.ts`
* `src/lib/actions/sandbox/rebuild-resume-session.ts`
* `src/lib/actions/sandbox/rebuild-target-runtime.ts`
* `src/lib/inference/selection.ts`
* `src/lib/onboard.ts`
* `src/lib/onboard/dockerfile-patch.ts`
* `src/lib/onboard/machine/core-flow-phases.test.ts`
* `src/lib/onboard/machine/core-flow-phases.ts`
* `src/lib/onboard/machine/flow-context.test.ts`
* `src/lib/onboard/machine/flow-context.ts`
* `src/lib/onboard/machine/flow-phases/agent-policy-finalization.test.ts`
* `src/lib/onboard/machine/flow-phases/preflight-gateway.test.ts`
* `src/lib/onboard/machine/flow-phases/provider-sandbox.test.ts`
* `src/lib/onboard/machine/flow-sequence.test.ts`
* `src/lib/onboard/machine/flow-slices.test.ts`
* `src/lib/onboard/machine/handlers/provider-inference-reasoning-effort-resume.test.ts`
* `src/lib/onboard/machine/handlers/provider-inference-recovery-gating.test.ts`
* `src/lib/onboard/machine/handlers/provider-inference-route-containment.test.ts`
* `src/lib/onboard/machine/handlers/provider-inference-station-express.test.ts`
* `src/lib/onboard/machine/handlers/provider-inference.test-support.ts`
* `src/lib/onboard/machine/handlers/provider-inference.test.ts`
* `src/lib/onboard/machine/handlers/provider-inference.ts`
* `src/lib/onboard/machine/initial-flow-phases.test.ts`
* `src/lib/onboard/reasoning-effort.test.ts`
* `src/lib/onboard/reasoning-mode.ts`
* `src/lib/onboard/sandbox-registration.test.ts`
* `src/lib/onboard/sandbox-registration.ts`
* `src/lib/onboard/setup-nim-flow.test.ts`
* `src/lib/onboard/setup-nim-flow.ts`
* `src/lib/onboard/setup-nim-selection.ts`
* `src/lib/state/onboard-session-station-express.test.ts`
* `src/lib/state/onboard-session.ts`
* `test/dashboard-remote-bind-lifecycle.test.ts`
* `test/generate-openclaw-config-reasoning-effort.test.ts`
* `test/helpers/onboard-final-flow-phases.ts`
* `test/helpers/rebuild-managed-image-preflight-harness.ts`
* `test/onboard-resume-provider-recovery.test.ts`

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Comment thread scripts/nemoclaw-start.sh Outdated
Comment thread src/lib/actions/inference-set.ts Outdated
Comment on lines 51 to +54
"NEMOCLAW_CLOUD_EXPERIMENTAL_MODEL",
"NEMOCLAW_PREFERRED_API",
"NEMOCLAW_REASONING",
"NEMOCLAW_REASONING_EFFORT",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Exercise the new variable in the isolation behavior test.

The contract assertion proves that NEMOCLAW_REASONING_EFFORT is listed, but the behavioral test never sets it. Add a non-empty value to the fixture and assert it is removed during isolation and restored afterward; otherwise a regression in the actual cleanup path could pass.

As per path instructions, tests should provide behavioral confidence rather than implementation lock-in.

🤖 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 `@src/lib/actions/sandbox/rebuild-env-isolation.test.ts` around lines 51 - 54,
Update the isolation behavior test fixture to assign a non-empty value to
NEMOCLAW_REASONING_EFFORT, then assert the value is absent during isolation and
restored afterward. Keep the existing contract assertion and test behavior for
the other environment variables unchanged.

Source: Path instructions

Comment thread src/lib/actions/sandbox/rebuild-resume-config.ts Outdated
Comment thread src/lib/onboard/machine/handlers/provider-inference.ts
Comment thread src/lib/onboard/reasoning-effort.test.ts
Comment thread src/lib/state/onboard-session.ts Outdated
Comment thread test/generate-openclaw-config-reasoning-effort.test.ts
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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 `@src/lib/state/onboard-session-reasoning-effort.test.ts`:
- Around line 18-25: Remove the redundant if (!loaded) guard and its error throw
from requireLoadedSession, returning loaded directly after the existing expect
assertion.

In `@test/nemoclaw-start-reasoning-effort.test.ts`:
- Around line 13-19: Remove the explicit if guard from extractShellFunction
while preserving its missing-match error behavior. Reuse or introduce a throwing
helper, analogous to throwingBail in the sibling resume test, so the regex match
still throws “Expected ${name} in scripts/nemoclaw-start.sh” when absent and
returns the reconstructed function when present.
🪄 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: CHILL

Plan: Enterprise

Run ID: 1ff98153-ad15-4ecf-ab56-ad6028baec5b

📥 Commits

Reviewing files that changed from the base of the PR and between 999b756 and 166054a.

📒 Files selected for processing (28)
  • docs/inference/configure-model-capabilities.mdx
  • docs/inference/set-up-openai-compatible-endpoint.mdx
  • docs/reference/commands.mdx
  • scripts/generate-openclaw-config.mts
  • scripts/nemoclaw-start.sh
  • src/commands/global-oclif-command-adapters.test.ts
  • src/commands/sandbox/inference/oclif-command-adapters.test.ts
  • src/lib/actions/inference-set-reasoning-effort.test.ts
  • src/lib/actions/inference-set.ts
  • src/lib/actions/sandbox/rebuild-env-isolation.test.ts
  • src/lib/actions/sandbox/rebuild-resume-config.test.ts
  • src/lib/actions/sandbox/rebuild-resume-config.ts
  • src/lib/onboard.ts
  • src/lib/onboard/machine/core-flow-phases.test.ts
  • src/lib/onboard/machine/core-flow-phases.ts
  • src/lib/onboard/machine/handlers/provider-inference-reasoning-effort-resume.test.ts
  • src/lib/onboard/machine/handlers/provider-inference.test-support.ts
  • src/lib/onboard/machine/handlers/provider-inference.ts
  • src/lib/onboard/machine/initial-flow-phases.test.ts
  • src/lib/onboard/reasoning-effort.test.ts
  • src/lib/onboard/reasoning-mode.ts
  • src/lib/onboard/sandbox-registration.test.ts
  • src/lib/onboard/sandbox-registration.ts
  • src/lib/state/onboard-session-reasoning-effort.test.ts
  • src/lib/state/onboard-session.ts
  • test/generate-openclaw-config-reasoning-effort.test.ts
  • test/helpers/onboard-final-flow-phases.ts
  • test/nemoclaw-start-reasoning-effort.test.ts
💤 Files with no reviewable changes (1)
  • test/helpers/onboard-final-flow-phases.ts
🚧 Files skipped from review as they are similar to previous changes (14)
  • src/lib/onboard/sandbox-registration.ts
  • src/lib/onboard/machine/initial-flow-phases.test.ts
  • src/lib/actions/sandbox/rebuild-env-isolation.test.ts
  • src/lib/onboard/machine/core-flow-phases.ts
  • src/lib/actions/sandbox/rebuild-resume-config.ts
  • scripts/generate-openclaw-config.mts
  • src/lib/onboard/sandbox-registration.test.ts
  • docs/inference/configure-model-capabilities.mdx
  • src/lib/onboard/machine/handlers/provider-inference.ts
  • src/lib/onboard/reasoning-effort.test.ts
  • docs/reference/commands.mdx
  • src/lib/onboard/machine/core-flow-phases.test.ts
  • src/lib/state/onboard-session.ts
  • src/lib/actions/inference-set.ts

Comment thread src/lib/state/onboard-session-reasoning-effort.test.ts Outdated
Comment on lines +13 to +19
function extractShellFunction(name: string): string {
const match = src.match(new RegExp(`${name}\\(\\) \\{([\\s\\S]*?)^\\}`, "m"));
if (!match) {
throw new Error(`Expected ${name} in scripts/nemoclaw-start.sh`);
}
return `${name}() {${match[1]}\n}`;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

CI growth guardrail fails on the new if statement.

Pipeline reports a conditional-count increase (0→1) for this new test file, tied to the if (!match) guard in extractShellFunction. Restructure to avoid the if (e.g., a throwing helper akin to throwingBail used in the sibling resume test) to satisfy the guardrail without changing behavior.

🔧 Proposed fix to avoid the `if` statement
+const throwingBail = (msg: string): never => {
+  throw new Error(msg);
+};
+
 function extractShellFunction(name: string): string {
   const match = src.match(new RegExp(`${name}\\(\\) \\{([\\s\\S]*?)^\\}`, "m"));
-  if (!match) {
-    throw new Error(`Expected ${name} in scripts/nemoclaw-start.sh`);
-  }
-  return `${name}() {${match[1]}\n}`;
+  return match
+    ? `${name}() {${match[1]}\n}`
+    : throwingBail(`Expected ${name} in scripts/nemoclaw-start.sh`);
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function extractShellFunction(name: string): string {
const match = src.match(new RegExp(`${name}\\(\\) \\{([\\s\\S]*?)^\\}`, "m"));
if (!match) {
throw new Error(`Expected ${name} in scripts/nemoclaw-start.sh`);
}
return `${name}() {${match[1]}\n}`;
}
const throwingBail = (msg: string): never => {
throw new Error(msg);
};
function extractShellFunction(name: string): string {
const match = src.match(new RegExp(`${name}\\(\\) \\{([\\s\\S]*?)^\\}`, "m"));
return match
? `${name}() {${match[1]}\n}`
: throwingBail(`Expected ${name} in scripts/nemoclaw-start.sh`);
}
🧰 Tools
🪛 ast-grep (0.44.1)

[warning] 13-13: Regular expression constructed from variable input detected. This can lead to Regular Expression Denial of Service (ReDoS) attacks if the variable contains malicious patterns. Use libraries like 'recheck' to validate regex safety or use static patterns.
Context: new RegExp(${name}\\(\\) \\{([\\s\\S]*?)^\\}, "m")
Note: [CWE-1333] Inefficient Regular Expression Complexity

(regexp-from-variable)

🤖 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 `@test/nemoclaw-start-reasoning-effort.test.ts` around lines 13 - 19, Remove
the explicit if guard from extractShellFunction while preserving its
missing-match error behavior. Reuse or introduce a throwing helper, analogous to
throwingBail in the sibling resume test, so the regex match still throws
“Expected ${name} in scripts/nemoclaw-start.sh” when absent and returns the
reconstructed function when present.

Source: Pipeline failures

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
docs/reference/commands.mdx (1)

3633-3633: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the incompatible-provider contract.

“A different provider clears the variable without reading it” is both misleading and conflicts with the PR requirement that provider-incompatible reasoning-effort input fails before lifecycle effects. Document rejection instead; the CLI cannot clear the caller’s environment variable.

🤖 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 `@docs/reference/commands.mdx` at line 3633, Update the
NEMOCLAW_REASONING_EFFORT documentation to state that incompatible providers
reject the variable’s value before making lifecycle changes, rather than
claiming they clear it. Preserve the compatible-endpoint behavior and clarify
that the CLI cannot modify the caller’s environment variable.
🧹 Nitpick comments (1)
src/lib/actions/sandbox/doctor-inference.ts (1)

27-31: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the one-call forwarding wrapper.

resolveDoctorReasoningEffort adds a public layer without behavior. Import getEffectiveReasoningEffort directly in doctor.ts.

🤖 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 `@src/lib/actions/sandbox/doctor-inference.ts` around lines 27 - 31, Remove the
resolveDoctorReasoningEffort wrapper and its export from doctor-inference.ts,
then import and call getEffectiveReasoningEffort directly in doctor.ts while
preserving the existing behavior and types.

Source: Path instructions

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

Inline comments:
In `@src/lib/actions/sandbox/doctor-flow.test.ts`:
- Around line 297-300: Append the linked issue suffix “(`#7659`)” to the
parameterized test titles in doctor-flow.test.ts (lines 297-300),
status-flow.test.ts (lines 101-104), selection.test.ts (lines 65-68), and
jsonl-events.test.ts (lines 231-234), preserving their existing title text and
test behavior.

---

Outside diff comments:
In `@docs/reference/commands.mdx`:
- Line 3633: Update the NEMOCLAW_REASONING_EFFORT documentation to state that
incompatible providers reject the variable’s value before making lifecycle
changes, rather than claiming they clear it. Preserve the compatible-endpoint
behavior and clarify that the CLI cannot modify the caller’s environment
variable.

---

Nitpick comments:
In `@src/lib/actions/sandbox/doctor-inference.ts`:
- Around line 27-31: Remove the resolveDoctorReasoningEffort wrapper and its
export from doctor-inference.ts, then import and call
getEffectiveReasoningEffort directly in doctor.ts while preserving the existing
behavior and types.
🪄 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: CHILL

Plan: Enterprise

Run ID: 2fa82f9f-562e-446b-ae25-f48fa505081a

📥 Commits

Reviewing files that changed from the base of the PR and between 166054a and f680df0.

📒 Files selected for processing (18)
  • docs/inference/configure-model-capabilities.mdx
  • docs/reference/commands.mdx
  • src/lib/actions/inference-set-reasoning-effort.test.ts
  • src/lib/actions/inference-set.ts
  • src/lib/actions/sandbox/doctor-flow.test.ts
  • src/lib/actions/sandbox/doctor-inference.ts
  • src/lib/actions/sandbox/doctor.ts
  • src/lib/actions/sandbox/status-flow.test.ts
  • src/lib/actions/sandbox/status-text.ts
  • src/lib/inference/selection.test.ts
  • src/lib/inference/selection.ts
  • src/lib/onboard.ts
  • src/lib/onboard/machine/events.ts
  • src/lib/onboard/machine/jsonl-events.test.ts
  • src/lib/onboard/machine/types.ts
  • src/lib/state/onboard-session-reasoning-effort.test.ts
  • test/nemoclaw-start-reasoning-effort.test.ts
  • test/support/status-flow-test-harness.ts
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/lib/state/onboard-session-reasoning-effort.test.ts
  • docs/inference/configure-model-capabilities.mdx
  • src/lib/onboard.ts
  • test/nemoclaw-start-reasoning-effort.test.ts
  • src/lib/actions/inference-set-reasoning-effort.test.ts
  • src/lib/actions/inference-set.ts

Comment thread src/lib/actions/sandbox/doctor-flow.test.ts Outdated
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria
apurvvkumaria enabled auto-merge (squash) July 28, 2026 17:56
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria
apurvvkumaria merged commit 71a7856 into main Jul 28, 2026
77 of 78 checks passed
@apurvvkumaria
apurvvkumaria deleted the feat/reasoning-effort-input branch July 28, 2026 19:10
@cjagwani cjagwani mentioned this pull request Jul 28, 2026
23 tasks
cv pushed a commit that referenced this pull request Jul 28, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Add the canonical dated changelog entry for NemoClaw v0.0.97 before the
release plan captures `origin/main`.
The entry groups the user-visible and maintainer-facing changes since
v0.0.96 while preserving the Deferred dual-Station status, experimental
runtime-identity boundary, and pending physical IGX validation.

## Changes

- Add `docs/changelog/2026-07-28.mdx` with the parser-safe MDX SPDX
comment and exact `## v0.0.97` heading.
- Summarize the 43 merged PRs in the release range, omitting
internal-only changes from the public entry and linking each grouped
change to its most specific published documentation.
- Keep the experimental Okta reference explicitly opt-in and outside
normal onboarding, keep the two-Station path Deferred, and state that
physical IGX Orin validation remains pending.

### Source summary

- [#7440](#7440),
[#7443](#7443), and
[#7445](#7445) ->
`docs/changelog/2026-07-28.mdx`: Document read-only host readiness
reports and fail-closed platform qualification.
- [#7030](#7030) ->
`docs/changelog/2026-07-28.mdx`: Document the Deferred trusted
two-Station vLLM evaluation.
- [#7265](#7265) ->
`docs/changelog/2026-07-28.mdx`: Document the bounded experimental
direct-runner Okta runtime-identity reference.
- [#7711](#7711) and
[#7648](#7648) ->
`docs/changelog/2026-07-28.mdx`: Document compatible-endpoint reasoning
effort and retired NVIDIA Build model paths.
- [#7746](#7746),
[#7763](#7763), and
[#7681](#7681) ->
`docs/changelog/2026-07-28.mdx`: Document safe compatible-provider
creation, replacement refusal, and narrow OpenShell bridge URL handling.
- [#7641](#7641),
[#7690](#7690),
[#7631](#7631), and
[#7710](#7710) ->
`docs/changelog/2026-07-28.mdx`: Document paused-container recovery,
recreation journaling, pre-mutation uninstall checks, and
source-checkout OpenShell selection.
- [#7624](#7624) and
[#7762](#7762) ->
`docs/changelog/2026-07-28.mdx`: Document Jetson release diagnostics and
bounded render-device group propagation.
- [#7639](#7639),
[#7760](#7760),
[#7721](#7721), and
[#7761](#7761) ->
`docs/changelog/2026-07-28.mdx`: Document Telegram, MCP media-type,
Hermes image-mode, and locked-restart fixes.
- [#7653](#7653) and
[#7680](#7680) ->
`docs/changelog/2026-07-28.mdx`: Document Deep Agents policy tasks and
the bounded Claude Code OAuth path.
- [#7679](#7679) ->
`docs/changelog/2026-07-28.mdx`: Document the checksum-bound libssh2 and
Python HTMLParser backports.
- [#7655](#7655),
[#7651](#7651),
[#7664](#7664),
[#7666](#7666),
[#7670](#7670),
[#7719](#7719), and
[#7741](#7741) ->
`docs/changelog/2026-07-28.mdx`: Document exact candidate E2E evidence,
Launchable selection, diagnostic consolidation, and trusted WSL
validation.

## Type of Change

- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [ ] Tests added or updated for changed behavior
- [x] Existing tests cover changed behavior — justification:
`test/changelog-docs.test.ts` validates the dated changelog contract,
MDX header, heading uniqueness, and release-entry structure.
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: The committed `docs/changelog/2026-07-28.mdx` blob exactly
matches the reviewed file. Completeness, factual accuracy, link shape,
parser-safe MDX header, one-sentence-per-line style, `.docs-skip`
compliance, and bounded product claims passed.
- Agent: Codex Desktop documentation writer subagent
<!-- docs-review-head-sha: da6aa27 -->
<!-- docs-review-agents-blob-sha: be20a09 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable; this PR changes only the dated
changelog.
- Station profile/scenario: Not applicable.
- Result: Not applicable.
- Supporting evidence: Not applicable.

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run check:diff` passed when hooks were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run
test/changelog-docs.test.ts` passed 6/6.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — not applicable to this doc-only release
entry.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) —
completed with 0 errors and 2 pre-existing Fern warnings.
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)
— native changelog entries use the required parser-safe MDX SPDX comment
and intentionally have no frontmatter.

---
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added improved host readiness reporting and Jetson onboarding
guidance.
* Added controls for reasoning effort with compatible endpoints and
enhanced managed MCP discovery.
  * Improved Deep Agents task publication and preset support.
* **Bug Fixes**
* Hardened provider switching, sandbox recovery, uninstall behavior, and
Telegram connectivity.
* Improved container image integrity checks, media-type handling, and
checksum validation.
  * Enhanced vLLM evaluation behavior and release diagnostics.
* **Documentation**
  * Added the NemoClaw v0.0.97 changelog.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: inference Inference routing, serving, model selection, or outputs feature PR adds or expands user-visible functionality

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Expose a non-interactive reasoning-effort input for compatible endpoints

4 participants