Skip to content

fix(onboard): make local docker-driver gateway JWT non-expiring - #6304

Merged
jyaunches merged 1 commit into
mainfrom
fix/6287-docker-gateway-jwt-non-expiring
Jul 6, 2026
Merged

fix(onboard): make local docker-driver gateway JWT non-expiring#6304
jyaunches merged 1 commit into
mainfrom
fix/6287-docker-gateway-jwt-non-expiring

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Local Docker-driver sandboxes were provisioned with a 1-hour gateway sandbox JWT (gateway_jwt.ttl_secs = 3600). Once that token expires it cannot be renewed — the file-based token source has no rebootstrap path and RefreshSandboxToken requires a still-valid JWT — so exec, agents, logs, and rebuild fail with invalid token: ExpiredSignature / relay open timed out. This sets the local Docker-driver gateway JWT to non-expiring (ttl_secs = 0), which is OpenShell's documented default for single-player local deployments.

Related Issue

Fixes #6287

Changes

  • src/lib/onboard/docker-driver-gateway-config.ts: DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS 36000. The gateway then mints the exp = 0 non-expiring sentinel, which OpenShell's SandboxJwtAuthenticator accepts. The 3600 value was a stale carryover of OpenShell's pre-v0.0.71 default, which OpenShell itself changed to 0 for local single-player Docker/Podman/VM gateways in NVIDIA/OpenShell#1721 ("fix(gateway): allow local sandbox jwt to not expire").
  • src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts: the valid-token case now asserts the exp = 0 non-expiring sentinel; the expiry-rejection case uses fixed offsets so it still proves the validator rejects genuinely expired tokens regardless of the configured TTL.
  • docs/security/openshell-0.0.71-gateway-auth-review.mdx: update the sandbox JWT TTL rationale to reflect the non-expiring local contract.

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: awaiting maintainer sensitive-path review
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Verification

  • PR description includes the DCO sign-off declaration 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: vitest run docker-driver-gateway → 17 files, 121/121 passed; tsc -p tsconfig.cli.json exit 0; biome check clean on changed files
  • 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

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

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This PR changes the Docker-driver gateway sandbox JWT TTL from 3600 seconds to 0 (non-expiring), updates associated auth contract tests to mint and validate tokens with exp=0 when ttl_secs is 0, and revises documentation to reflect the new non-expiring token rationale.

Changes

Sandbox JWT TTL Update

Layer / File(s) Summary
Update gateway JWT TTL constant
src/lib/onboard/docker-driver-gateway-config.ts
DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS changed from 3600 to 0, making generated gateway TOML ttl_secs non-expiring.
Update auth contract tests
src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts
Minting logic and payload assertions updated so exp is 0 when ttlSecs === 0; expired-token fixture now uses fixed iat/exp offsets instead of deriving from ttlSecs.
Update gateway auth review docs
docs/security/openshell-0.0.71-gateway-auth-review.mdx
Documented ttl_secs changed to 0 with new rationale about avoiding file-based refresh dead-ends for expired on-disk bootstrap tokens.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested labels: bug-fix, security, area: onboarding

Suggested reviewers: prekshivyas, cv

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR changes the local JWT TTL to 0 and updates tests/docs, matching the issue's goal to stop local gateway relay tokens from expiring.
Out of Scope Changes check ✅ Passed The docs and contract test updates directly support the TTL change and do not introduce unrelated scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: making the local docker-driver gateway JWT non-expiring.
✨ 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 fix/6287-docker-gateway-jwt-non-expiring

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

@github-code-quality

github-code-quality Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix/6287-docker-gate... branch is 96%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/6287-docker-gate... 1534092 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/li...bprocess-env.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/bl...print/runner.ts 95%
nemoclaw/src/co...ration-state.ts 94%
nemoclaw/src/bl...ate-networks.ts 94%
nemoclaw/src/index.ts 94%

TypeScript / code-coverage/cli

The overall coverage in the fix/6287-docker-gate... branch is 71%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/6287-docker-gate... 1534092 +/-
src/lib/shields...nsition-lock.ts 87%
src/lib/actions...all/run-plan.ts 81%
src/lib/state/o...oard-session.ts 81%
src/lib/onboard/preflight.ts 71%
src/lib/state/sandbox.ts 71%
src/lib/onboard...er-gpu-patch.ts 69%
src/lib/shields/index.ts 68%
src/lib/policy/index.ts 66%
src/lib/actions...licy-channel.ts 60%
src/lib/onboard.ts 24%

Updated July 06, 2026 09:18 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor (Nemotron Ultra) — No blocking findings

Merge posture: No blocking advisor findings
Primary next action: Resolve or justify PRA-1: Non-expiring sandbox JWT (TTL=0) increases blast radius if signing key compromised in multi-tenant contexts.
Open items: 0 required · 1 warning · 2 suggestions · 3 test follow-ups
Since last review: 0 prior items resolved · 0 still apply · 3 new items found

Action checklist

  • PRA-1 Resolve or justify: Non-expiring sandbox JWT (TTL=0) increases blast radius if signing key compromised in multi-tenant contexts in src/lib/onboard/docker-driver-gateway-config.ts:15
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-2 In-scope improvement: Test correctly validates exp=0 sentinel but could use clearer comment in src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts:45
  • PRA-3 In-scope improvement: Documentation notes multi-tenant TTL reservation but code doesn't enforce or warn in docs/security/openshell-0.0.71-gateway-auth-review.mdx:70

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify security src/lib/onboard/docker-driver-gateway-config.ts:15 Add a runtime warning at gateway config generation if environment signals multi-tenant usage (e.g., NEMOCLAW_GATEWAY_MULTI_TENANT=1 or multiple sandbox IDs configured). Document clearly in deployment guides that this config is for single-player local deployments only.
PRA-2 Improvement correctness src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts:45 Add a comment explaining that exp=0 is the OpenShell sentinel for non-expiring tokens.
PRA-3 Improvement docs docs/security/openshell-0.0.71-gateway-auth-review.mdx:70 Add a console.warn at gateway config generation time if NEMOCLAW_GATEWAY_MULTI_TENANT=1 or similar signal is detected, advising that non-expiring tokens are not suitable for shared environments.
Review findings by urgency: 0 required fixes, 1 item to resolve/justify, 2 in-scope improvements

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-1 Resolve/justify — Non-expiring sandbox JWT (TTL=0) increases blast radius if signing key compromised in multi-tenant contexts

  • Location: src/lib/onboard/docker-driver-gateway-config.ts:15
  • Category: security
  • Problem: The PR changes DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS from 3600 to 0, making sandbox JWTs non-expiring. This aligns with OpenShell's documented default for local single-player deployments but increases the blast radius if a gateway signing key is compromised — tokens remain valid indefinitely. The docs note this is reserved for single-player; multi-tenant gateways should use positive TTL.
  • Impact: If an operator accidentally uses this config for a shared/multi-tenant gateway, a compromised signing key would allow indefinite token forgery without rotation.
  • Recommended action: Add a runtime warning at gateway config generation if environment signals multi-tenant usage (e.g., NEMOCLAW_GATEWAY_MULTI_TENANT=1 or multiple sandbox IDs configured). Document clearly in deployment guides that this config is for single-player local deployments only.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read docs/security/openshell-0.0.71-gateway-auth-review.mdx 'NemoClaw Boundary' section for TTL=0 rationale and scope limitation. Search for NEMOCLAW_GATEWAY_MULTI_TENANT in codebase.
  • Missing regression test: Add a test that verifies the generated gateway config emits ttl_secs = 0 and that the JWT validation logic accepts exp=0 as valid (already covered in docker-driver-gateway-config-auth-contract.test.ts). Consider adding a test that warns when multi-tenant env var is set.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read docs/security/openshell-0.0.71-gateway-auth-review.mdx 'NemoClaw Boundary' section for TTL=0 rationale and scope limitation. Search for NEMOCLAW_GATEWAY_MULTI_TENANT in codebase.
  • Evidence: src/lib/onboard/docker-driver-gateway-config.ts:15 exports DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS = 0; docs/security/openshell-0.0.71-gateway-auth-review.mdx documents 'positive TTL is reserved for shared, multi-tenant gateways'

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

PRA-2 Improvement — Test correctly validates exp=0 sentinel but could use clearer comment

  • Location: src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts:45
  • Category: correctness
  • Problem: The auth contract test handles ttlSecs === 0 by setting exp=0 in minted tokens. The validation helper expects exp === 0 || exp >= now - 60, correctly mirroring OpenShell's behavior where exp=0 means non-expiring.
  • Impact: Low — test passes and correctly validates the new contract. A comment would improve maintainability.
  • Suggested action: Add a comment explaining that exp=0 is the OpenShell sentinel for non-expiring tokens.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Run: vitest run src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts
  • Missing regression test: Already covered by existing test 'emits an OpenShell 0.0.72-compatible sandbox JWT bundle and TTL contract'.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test line 45: exp: ttlSecs === 0 ? 0 : now + ttlSecs; validation helper expects exp === 0 || exp >= now - 60

PRA-3 Improvement — Documentation notes multi-tenant TTL reservation but code doesn't enforce or warn

  • Location: docs/security/openshell-0.0.71-gateway-auth-review.mdx:70
  • Category: docs
  • Problem: The docs state 'positive TTL is reserved for shared, multi-tenant gateways' but the TTL is hardcoded to 0 with no override or warning mechanism.
  • Impact: Operators may not realize this config is unsuitable for multi-tenant deployments until a security review.
  • Suggested action: Add a console.warn at gateway config generation time if NEMOCLAW_GATEWAY_MULTI_TENANT=1 or similar signal is detected, advising that non-expiring tokens are not suitable for shared environments.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Search for NEMOCLAW_GATEWAY_MULTI_TENANT or multi-tenancy signals in the codebase; verify docs/security/openshell-0.0.71-gateway-auth-review.mdx contains the multi-tenant note.
  • Missing regression test: None required; this is a documentation/operator guidance improvement.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: docs/security/openshell-0.0.71-gateway-auth-review.mdx line 70: 'positive TTL is reserved for shared, multi-tenant gateways'; src/lib/onboard/docker-driver-gateway-config.ts has no multi-tenant detection
Simplification opportunities: 1 possible cut

These are safe simplification checks only. Do not remove validation, security controls, data-loss prevention, or required tests.

  • PRA-1 shrink (src/lib/onboard/docker-driver-gateway-config.ts:15): Hardcoded TTL=0 constant
    • Replacement: Configurable TTL with default=0 and runtime warning for multi-tenant env
    • Net: 10 lines
    • Safety boundary: Must preserve TTL=0 as default for single-player; mTLS, JWT signing, sandbox binding, cross-gateway rejection, auth-disable scrubbing must remain enforced
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — Integration test: start gateway, wait >1 hour, verify host-CLI relay still works (proves non-expiring token survives old 1-hour boundary). Runtime/sandbox/infrastructure paths need behavioral runtime validation: the TTL=0 change affects token lifetime in live gateway/sandbox interactions. Unit tests cover contract; integration tests should verify long-idle reuse and multi-tenant guard.
  • PRA-T2 Runtime validation — Multi-tenant guard test: verify warning or TTL override when NEMOCLAW_GATEWAY_MULTI_TENANT=1 or multiple sandbox IDs configured. Runtime/sandbox/infrastructure paths need behavioral runtime validation: the TTL=0 change affects token lifetime in live gateway/sandbox interactions. Unit tests cover contract; integration tests should verify long-idle reuse and multi-tenant guard.
  • PRA-T3 Runtime validation — Key rotation scenario: verify old non-expiring tokens invalidated after signing key rotation (via kid mismatch). Runtime/sandbox/infrastructure paths need behavioral runtime validation: the TTL=0 change affects token lifetime in live gateway/sandbox interactions. Unit tests cover contract; integration tests should verify long-idle reuse and multi-tenant guard.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Non-expiring sandbox JWT (TTL=0) increases blast radius if signing key compromised in multi-tenant contexts

  • Location: src/lib/onboard/docker-driver-gateway-config.ts:15
  • Category: security
  • Problem: The PR changes DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS from 3600 to 0, making sandbox JWTs non-expiring. This aligns with OpenShell's documented default for local single-player deployments but increases the blast radius if a gateway signing key is compromised — tokens remain valid indefinitely. The docs note this is reserved for single-player; multi-tenant gateways should use positive TTL.
  • Impact: If an operator accidentally uses this config for a shared/multi-tenant gateway, a compromised signing key would allow indefinite token forgery without rotation.
  • Recommended action: Add a runtime warning at gateway config generation if environment signals multi-tenant usage (e.g., NEMOCLAW_GATEWAY_MULTI_TENANT=1 or multiple sandbox IDs configured). Document clearly in deployment guides that this config is for single-player local deployments only.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read docs/security/openshell-0.0.71-gateway-auth-review.mdx 'NemoClaw Boundary' section for TTL=0 rationale and scope limitation. Search for NEMOCLAW_GATEWAY_MULTI_TENANT in codebase.
  • Missing regression test: Add a test that verifies the generated gateway config emits ttl_secs = 0 and that the JWT validation logic accepts exp=0 as valid (already covered in docker-driver-gateway-config-auth-contract.test.ts). Consider adding a test that warns when multi-tenant env var is set.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read docs/security/openshell-0.0.71-gateway-auth-review.mdx 'NemoClaw Boundary' section for TTL=0 rationale and scope limitation. Search for NEMOCLAW_GATEWAY_MULTI_TENANT in codebase.
  • Evidence: src/lib/onboard/docker-driver-gateway-config.ts:15 exports DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS = 0; docs/security/openshell-0.0.71-gateway-auth-review.mdx documents 'positive TTL is reserved for shared, multi-tenant gateways'

PRA-2 Improvement — Test correctly validates exp=0 sentinel but could use clearer comment

  • Location: src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts:45
  • Category: correctness
  • Problem: The auth contract test handles ttlSecs === 0 by setting exp=0 in minted tokens. The validation helper expects exp === 0 || exp >= now - 60, correctly mirroring OpenShell's behavior where exp=0 means non-expiring.
  • Impact: Low — test passes and correctly validates the new contract. A comment would improve maintainability.
  • Suggested action: Add a comment explaining that exp=0 is the OpenShell sentinel for non-expiring tokens.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Run: vitest run src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts
  • Missing regression test: Already covered by existing test 'emits an OpenShell 0.0.72-compatible sandbox JWT bundle and TTL contract'.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: Test line 45: exp: ttlSecs === 0 ? 0 : now + ttlSecs; validation helper expects exp === 0 || exp >= now - 60

PRA-3 Improvement — Documentation notes multi-tenant TTL reservation but code doesn't enforce or warn

  • Location: docs/security/openshell-0.0.71-gateway-auth-review.mdx:70
  • Category: docs
  • Problem: The docs state 'positive TTL is reserved for shared, multi-tenant gateways' but the TTL is hardcoded to 0 with no override or warning mechanism.
  • Impact: Operators may not realize this config is unsuitable for multi-tenant deployments until a security review.
  • Suggested action: Add a console.warn at gateway config generation time if NEMOCLAW_GATEWAY_MULTI_TENANT=1 or similar signal is detected, advising that non-expiring tokens are not suitable for shared environments.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Search for NEMOCLAW_GATEWAY_MULTI_TENANT or multi-tenancy signals in the codebase; verify docs/security/openshell-0.0.71-gateway-auth-review.mdx contains the multi-tenant note.
  • Missing regression test: None required; this is a documentation/operator guidance improvement.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: docs/security/openshell-0.0.71-gateway-auth-review.mdx line 70: 'positive TTL is reserved for shared, multi-tenant gateways'; src/lib/onboard/docker-driver-gateway-config.ts has no multi-tenant detection

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

@laitingsheng laitingsheng added security NV QA Bugs found by the NVIDIA QA Team area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression and removed NV QA Bugs found by the NVIDIA QA Team labels Jul 6, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: openshell-gateway-auth-contract, cloud-onboard
Optional E2E: sandbox-operations, full-e2e

Dispatch hint: openshell-gateway-auth-contract

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • openshell-gateway-auth-contract (about 20 minutes): This is the existing explicit live/source-contract E2E for NemoClaw-generated OpenShell gateway auth. The changed TTL is emitted into OPENSHELL_GATEWAY_CONFIG and affects sandbox JWT behavior across the local mTLS + sandbox JWT security boundary, so this resource-heavy explicit job must run before merge.
  • cloud-onboard (high): Changed onboard, trace timing, scorecard, or E2E workflow code can affect cloud onboard wall-clock behavior and should refresh the trusted cloud-onboard trace timing signal.

Optional E2E

  • sandbox-operations (about 60 minutes): Optional adjacent confidence for Docker/OpenShell sandbox lifecycle, gateway recovery, and host CLI operations using the generated gateway config. Useful because the TTL change is intended to avoid sandbox JWT bootstrap/relay dead-ends, but the targeted auth-contract job is the merge-blocking coverage.
  • full-e2e (about 75 minutes): Optional end-to-end assistant/user-flow confidence after onboarding with hosted inference. This can catch broad regressions in real sandbox callbacks or assistant interaction caused by gateway auth config changes.

New E2E recommendations

  • Sandbox JWT TTL and bootstrap-token refresh semantics (high): The existing OpenShell gateway auth live contract validates mTLS/JWT auth reachability and cross-sandbox rejection, but nearby helper coverage appears to mint a positive-expiry JWT for the probe and does not directly exercise the new ttl_secs = 0 non-expiring bootstrap-token contract or the expired on-disk bootstrap-token host-CLI relay failure mode described by the PR.
    • Suggested test: Add a live E2E scenario that onboards a Docker-driver sandbox with the generated gateway config, asserts ttl_secs = 0 is consumed by OpenShell as non-expiring for local sandbox callbacks, and verifies a host-CLI relay/sandbox callback path continues to work after simulating an otherwise-expired bootstrap-token state.

Dispatch hint

  • Workflow: .github/workflows/e2e.yaml
  • jobs input: openshell-gateway-auth-contract

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

E2E Target Recommendation

Required E2E targets: openshell-gateway-auth-contract, ubuntu-repo-cloud-openclaw
Optional E2E targets: None

Dispatch required E2E targets:

  • gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=openshell-gateway-auth-contract
  • gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-openclaw

Workflow run

Full E2E target advisor summary

E2E Target Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E targets

  • openshell-gateway-auth-contract: The PR changes the Docker-driver OpenShell gateway JWT TTL contract and corresponding auth-contract assertions/docs. The wired free-standing OpenShell gateway auth contract job directly runs test/e2e/live/openshell-gateway-auth-source-contract.test.ts against the generated gateway config and is the smallest live E2E dispatch for this auth/JWT surface.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=openshell-gateway-auth-contract
  • ubuntu-repo-cloud-openclaw: The gateway config change affects normal Docker-backed OpenClaw onboarding. This live-supported Ubuntu Docker target is the smallest registry target that exercises the generated OpenShell gateway configuration through the standard onboarding path.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field targets=ubuntu-repo-cloud-openclaw

Optional E2E targets

  • None.

Relevant changed files

  • docs/security/openshell-0.0.71-gateway-auth-review.mdx
  • src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts
  • src/lib/onboard/docker-driver-gateway-config.ts

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Changes requested

Merge posture: Do not merge yet
Primary next action: Resolve or justify PRA-1: Source-of-truth review needed: Local Docker-driver gateway sandbox JWT TTL.
Open items: 0 required · 2 warnings · 1 suggestion · 8 test follow-ups
Top item: Add source-contract coverage for exp=0 sandbox JWTs

Action checklist

  • PRA-1 Resolve or justify: Source-of-truth review needed: Local Docker-driver gateway sandbox JWT TTL
  • PRA-2 Resolve or justify: Add source-contract coverage for exp=0 sandbox JWTs in test/e2e/live/openshell-gateway-auth-source-contract-helpers.ts:356
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Acceptance clause
  • PRA-T5 Add or justify test follow-up: Acceptance clause
  • PRA-T6 Add or justify test follow-up: Acceptance clause
  • PRA-T7 Add or justify test follow-up: Acceptance clause
  • PRA-T8 Add or justify test follow-up: Acceptance clause
  • PRA-3 In-scope improvement: Carry the non-expiring TTL rationale into the active 0.0.72 source-of-truth note in docs/security/openshell-0.0.72-compatibility-review.mdx:27

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-2 Resolve/justify security test/e2e/live/openshell-gateway-auth-source-contract-helpers.ts:356 Update the live source-contract token minting path to parse `ttl_secs` from the generated `OPENSHELL_GATEWAY_CONFIG` and mint `exp = 0` when the generated TTL is zero, then keep the existing valid-token and cross-sandbox probes on that token. If running the live scenario is too heavy in this PR, add the equivalent focused integration helper assertion and explicitly wire the live helper so it no longer hardcodes `now + 3600`.
PRA-3 Improvement docs docs/security/openshell-0.0.72-compatibility-review.mdx:27 Add a short sentence to the 0.0.72 compatibility review noting that the inherited gateway JWT contract includes NemoClaw's local `ttl_secs = 0` non-expiring setting, or extend the existing doc-alignment test to assert the active 0.0.72 note points to that TTL rationale.
Review findings by urgency: 0 required fixes, 2 items to resolve/justify, 1 in-scope improvement

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-1 Resolve/justify — Source-of-truth review needed: Local Docker-driver gateway sandbox JWT TTL

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Partial: `src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts` verifies generated config/helper behavior for `ttl_secs = 0`, but the live OpenShell source-contract still mints a positive-expiring token and does not validate exp=0 against the real gateway.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: `DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS` is changed to 0 and the 0.0.71 security note documents the refresh dead-end; the live helper hardcodes `exp: now + 3600`.

PRA-2 Resolve/justify — Add source-contract coverage for exp=0 sandbox JWTs

  • Location: test/e2e/live/openshell-gateway-auth-source-contract-helpers.ts:356
  • Category: security
  • Problem: This PR changes NemoClaw's generated gateway JWT TTL from 3600 seconds to the exp=0 non-expiring sentinel, which intentionally expands credential lifetime for local Docker-driver sandboxes. The changed unit/auth-contract test now mints exp=0, but the live OpenShell source-contract helper still hardcodes `exp: now + 3600` when it mints the token used for real gateway acceptance, cross-sandbox rejection, and Docker-origin auth probes. That means the highest-value runtime contract still does not prove the exact OpenShell behavior this PR relies on: accepting exp=0 while preserving sandbox/gateway/mTLS boundaries.
  • Impact: If OpenShell's real `SandboxJwtAuthenticator` or config interpretation diverges from the helper's exp=0 assumption, this PR could either fail to fix the reported relay expiry path or silently remove JWT expiry without proving the remaining auth boundaries hold for non-expiring tokens.
  • Recommended action: Update the live source-contract token minting path to parse `ttl_secs` from the generated `OPENSHELL_GATEWAY_CONFIG` and mint `exp = 0` when the generated TTL is zero, then keep the existing valid-token and cross-sandbox probes on that token. If running the live scenario is too heavy in this PR, add the equivalent focused integration helper assertion and explicitly wire the live helper so it no longer hardcodes `now + 3600`.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read `test/e2e/live/openshell-gateway-auth-source-contract-helpers.ts` around `mintSandboxJwt`; it currently sets `exp: now + 3600` regardless of the generated `ttl_secs`.
  • Missing regression test: Add or update `openshell-gateway-auth-source-contract` so the generated `ttl_secs = 0` config produces a sandbox JWT with `exp = 0`, that token is accepted for its own sandbox, and the same token is rejected for a different sandbox.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read `test/e2e/live/openshell-gateway-auth-source-contract-helpers.ts` around `mintSandboxJwt`; it currently sets `exp: now + 3600` regardless of the generated `ttl_secs`.
  • Evidence: `src/lib/onboard/docker-driver-gateway-config.ts` now emits `DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS = 0`; `src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts` covers helper validation of exp=0; the live helper still mints `exp: now + 3600`.

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

PRA-3 Improvement — Carry the non-expiring TTL rationale into the active 0.0.72 source-of-truth note

  • Location: docs/security/openshell-0.0.72-compatibility-review.mdx:27
  • Category: docs
  • Problem: The changed source file points reviewers to `docs/security/openshell-0.0.72-compatibility-review.mdx` as the current source-of-truth review, while this PR updates only the inherited `openshell-0.0.71-gateway-auth-review.mdx` TTL rationale. The 0.0.72 note says the gateway JWT contract is unchanged and references the inherited contract, but it does not explicitly record that NemoClaw now requires the local Docker-driver `ttl_secs = 0` contract.
  • Impact: Future security reviews may read the active 0.0.72 note and miss the credential-lifetime decision, making it easier to accidentally reintroduce a positive TTL or to evaluate the non-expiring token behavior against stale evidence.
  • Suggested action: Add a short sentence to the 0.0.72 compatibility review noting that the inherited gateway JWT contract includes NemoClaw's local `ttl_secs = 0` non-expiring setting, or extend the existing doc-alignment test to assert the active 0.0.72 note points to that TTL rationale.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Read the comment in `src/lib/onboard/docker-driver-gateway-config.ts` and then grep `docs/security/openshell-0.0.72-compatibility-review.mdx` for `ttl_secs` or `non-expiring`; there is no match.
  • Missing regression test: Extend `keeps the OpenShell gateway auth source review aligned with the generated config` to assert the active 0.0.72 compatibility note references the inherited `ttl_secs = 0` local Docker-driver contract.
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: `src/lib/onboard/docker-driver-gateway-config.ts` says to see the 0.0.72 compatibility review, while the only updated TTL prose is in the 0.0.71 review.
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — OpenShell source-contract accepts a generated `ttl_secs = 0` sandbox JWT with `exp = 0` for its own sandbox. This change affects sandbox/gateway authentication and credential lifetime. Unit coverage checks the generated config and helper validation, but the real OpenShell gateway acceptance path for the exp=0 sentinel is not exercised by the current live source-contract helper.
  • PRA-T2 Runtime validation — OpenShell source-contract rejects the same `exp = 0` sandbox JWT when requesting a different sandbox config. This change affects sandbox/gateway authentication and credential lifetime. Unit coverage checks the generated config and helper validation, but the real OpenShell gateway acceptance path for the exp=0 sentinel is not exercised by the current live source-contract helper.
  • PRA-T3 Runtime validation — OpenShell source-contract still rejects mTLS-only Docker-origin access when the generated gateway config uses `ttl_secs = 0`. This change affects sandbox/gateway authentication and credential lifetime. Unit coverage checks the generated config and helper validation, but the real OpenShell gateway acceptance path for the exp=0 sentinel is not exercised by the current live source-contract helper.
  • PRA-T4 Acceptance clause — OS: macOS (Docker Desktop, not Colima) — add test evidence or identify existing coverage. The changed code is platform-neutral generated Docker-driver gateway config; no macOS/Docker Desktop-specific runtime evidence is present in the diff.
  • PRA-T5 Acceptance clause — NemoClaw CLI: v0.0.73 — add test evidence or identify existing coverage. The PR changes current source for generated gateway config, but does not include version-specific fixture coverage for v0.0.73.
  • PRA-T6 Acceptance clause — OpenClaw: v2026.5.27 — add test evidence or identify existing coverage. No OpenClaw-specific code is changed; the reported failure is addressed at the OpenShell gateway JWT config boundary.
  • PRA-T7 Acceptance clause — Provider: anthropic-prod (claude-sonnet-4-6) — add test evidence or identify existing coverage. Provider behavior is not part of the changed code; the fix targets host/sandbox gateway authentication independent of provider.
  • PRA-T8 Acceptance clause — Fresh non-interactive onboard: `NEMOCLAW_PROVIDER=anthropic ... NEMOCLAW_SANDBOX_NAME=<name> bash` (installer completes, sandbox reports Ready, inference healthy) — add test evidence or identify existing coverage. `buildDockerDriverGatewayLaunch()` calls `prepareDockerDriverGatewayConfigEnv()`, so new onboarded Docker-driver gateways will receive `ttl_secs = 0`; no non-interactive onboard runtime test is included in the diff.

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

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

Caution

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

⚠️ Outside diff range comments (1)
src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts (1)

206-213: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Inconsistent exp handling vs. rest of the file.

Line 212 still computes exp: now + DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS, unlike the ttlSecs === 0 ? 0 : now + ttlSecs pattern applied at lines 91 and 107. With the TTL now 0, this mints a token with exp = now instead of the actual exp = 0 sentinel production code emits, so this test no longer exercises a representative non-expiring token.

As per path instructions, tests should avoid "conditionals that make a test pass without exercising its claim" — here the test still passes, but only because exp = now happens to satisfy the now - 60 skew window, not because it validates the real sentinel shape.

🧪 Proposed fix for consistency
       const token = mintOpenShellStyleSandboxJwt({
         signingKeyPath: pathsA.signingKeyPath,
         kid: kidA,
         gatewayId: gatewayIdA,
         sandboxId: sandboxIdA,
         iat: now,
-        exp: now + DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS,
+        exp:
+          DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS === 0
+            ? 0
+            : now + DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS,
       });
🤖 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/docker-driver-gateway-config-auth-contract.test.ts` around
lines 206 - 213, Update the token minting in
docker-driver-gateway-config-auth-contract.test.ts to match the file’s existing
TTL handling pattern. In the test that calls mintOpenShellStyleSandboxJwt,
replace the direct now + DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS exp value with the
same ttlSecs === 0 ? 0 : now + ttlSecs logic used elsewhere so the test
exercises the exp = 0 sentinel path consistently. Keep the change localized to
the mintOpenShellStyleSandboxJwt setup and ensure the assertions still validate
the intended non-expiring token shape.

Source: Path instructions

🧹 Nitpick comments (1)
docs/security/openshell-0.0.71-gateway-auth-review.mdx (1)

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

Split into one sentence per line.

Line 95 packs three sentences onto a single source line. As per path instructions, docs/mdx source should "Keep one sentence per line in Markdown and MDX source files."

📝 Proposed reflow
-The sandbox JWT config uses OpenShell's `ttl_secs = 0` non-expiring gateway contract for local single-player Docker-driver deployments, matching OpenShell's documented default (a positive TTL is reserved for shared, multi-tenant gateways). Non-expiring local tokens avoid the file-based sandbox JWT refresh dead-end, where an expired on-disk bootstrap token can no longer call `RefreshSandboxToken` and the host-CLI relay fails closed; this remains covered by the upstream OpenShell sandbox JWT expiry tests plus NemoClaw config-auth contract tests.
+The sandbox JWT config uses OpenShell's `ttl_secs = 0` non-expiring gateway contract for local single-player Docker-driver deployments, matching OpenShell's documented default (a positive TTL is reserved for shared, multi-tenant gateways).
+Non-expiring local tokens avoid the file-based sandbox JWT refresh dead-end, where an expired on-disk bootstrap token can no longer call `RefreshSandboxToken` and the host-CLI relay fails closed; this remains covered by the upstream OpenShell sandbox JWT expiry tests plus NemoClaw config-auth contract tests.
🤖 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/security/openshell-0.0.71-gateway-auth-review.mdx` at line 95, Reflow
the MDX text in the relevant documentation block so each sentence is on its own
source line, since the current paragraph under the sandbox JWT config note
contains multiple sentences on one line. Update the prose near the OpenShell
`ttl_secs = 0` explanation in the docs content to preserve the same wording
while splitting it into separate sentence-per-line entries.

Source: Path instructions

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

Outside diff comments:
In `@src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts`:
- Around line 206-213: Update the token minting in
docker-driver-gateway-config-auth-contract.test.ts to match the file’s existing
TTL handling pattern. In the test that calls mintOpenShellStyleSandboxJwt,
replace the direct now + DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS exp value with the
same ttlSecs === 0 ? 0 : now + ttlSecs logic used elsewhere so the test
exercises the exp = 0 sentinel path consistently. Keep the change localized to
the mintOpenShellStyleSandboxJwt setup and ensure the assertions still validate
the intended non-expiring token shape.

---

Nitpick comments:
In `@docs/security/openshell-0.0.71-gateway-auth-review.mdx`:
- Line 95: Reflow the MDX text in the relevant documentation block so each
sentence is on its own source line, since the current paragraph under the
sandbox JWT config note contains multiple sentences on one line. Update the
prose near the OpenShell `ttl_secs = 0` explanation in the docs content to
preserve the same wording while splitting it into separate sentence-per-line
entries.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 74447ac5-2f8e-4430-9543-2c96c9d30e43

📥 Commits

Reviewing files that changed from the base of the PR and between f0d2549 and 1534092.

📒 Files selected for processing (3)
  • docs/security/openshell-0.0.71-gateway-auth-review.mdx
  • src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts
  • src/lib/onboard/docker-driver-gateway-config.ts

@prekshivyas prekshivyas self-assigned this Jul 6, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some jobs failed

Run: 28804263616
Workflow ref: fix/6287-docker-gateway-jwt-non-expiring
Requested targets: (selector rejected by workflow validation)
Requested jobs: (selector rejected by workflow validation)
Summary: 0 passed, 1 failed, 0 cancelled, 0 skipped

Job Result
generate-matrix ❌ failure

Failed jobs: generate-matrix. Check run artifacts for logs.

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All requested jobs passed

Run: 28807471694
Workflow ref: fix/6287-docker-gateway-jwt-non-expiring
Requested targets: (default — all supported)
Requested jobs: openshell-gateway-auth-contract
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
openshell-gateway-auth-contract ✅ success

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

Approving: recommended E2E (openshell-gateway-auth-contract) dispatched on this head and passed, all required CI green, and the PR review advisor posted no blocking (needs_rework/blocked) verdict. Gateway-auth-contract change is well-scoped. Signed-off-by: Prekshi Vyas prekshiv@nvidia.com

@jyaunches
jyaunches merged commit 748a788 into main Jul 6, 2026
203 of 204 checks passed
@jyaunches
jyaunches deleted the fix/6287-docker-gateway-jwt-non-expiring branch July 6, 2026 18:06
cv pushed a commit that referenced this pull request Jul 7, 2026
## Summary
Add the v0.0.75 release-notes entry for the release train, summarizing
the user-facing fixes merged since v0.0.74. Release-prep docs for the
`nemoclaw-maintainer-cut-release-tag` gate.

## Related Issue
Release prep for v0.0.75. Remove this section if none.

## Changes
- `docs/about/release-notes.mdx`: add the `## v0.0.75` section (themed
intro + grouped bullets with source-page links), matching the existing
v0.0.74 style.

### Source summary (doc-impacting PRs → doc page)
- #6370 -> `docs/about/release-notes.mdx`: prepared-backup recovery
restores gateway state and defers the live route check to onboarding, so
upgrade recovery no longer fails on an unset gateway route.
- #6305 -> `docs/about/release-notes.mdx`: in-place upgrades recover
gateway-orphaned sandboxes.
- #6332 -> `docs/about/release-notes.mdx`: same-name `--fresh`
re-onboard preserves fresh LangChain Deep Agents Code routing.
- #6335 -> `docs/about/release-notes.mdx`: custom Anthropic-compatible
inference uses the OpenAI frontend.
- #6298 -> `docs/about/release-notes.mdx`: OpenAI-only agents keep the
`/v1` base URL on Anthropic-compatible endpoints.
- #6304 -> `docs/about/release-notes.mdx`: local docker-driver gateway
credentials no longer expire.
- #6261 -> `docs/about/release-notes.mdx`: Hermes runtime and managed
MCP state reconcile after a runtime change.
- #6318 -> `docs/about/release-notes.mdx`: Hermes installs accept a
pinned base platform digest.
- #6291 -> `docs/about/release-notes.mdx`: OpenClaw local CLI pairing
restores its previous connection path.

Test-performance, CI, and chore commits since v0.0.74 are excluded as
non-user-facing.

## Type of Change
- [x] Doc only (prose changes, no code sample modifications)

## Quality Gates
- [x] Tests not applicable — justification: documentation-only change
(release notes prose).
- [x] Docs updated for user-facing behavior changes

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] `npm run docs` builds without warnings introduced by this change —
command/result: "Found 0 errors and 2 warnings" (the 2 warnings
pre-exist this change).
- [x] Doc pages follow the style guide (active voice, no numbered/colon
titles, correct NVIDIA/NemoClaw/OpenShell capitalization; skip-terms
avoided).
- [x] No secrets, API keys, or credentials committed

---
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>


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

* **Documentation**
* Added a new **v0.0.75** section to the release notes, highlighting
improved sandbox upgrade hardening and prepared-backup recovery, updated
inference routing for Anthropic-compatible endpoints, longer-lasting
local gateway credential handling, and restored CLI pairing reconnection
without re-pairing. Also includes cross-links to related NemoClaw CLI
and documentation pages.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ericksoa added a commit that referenced this pull request Jul 7, 2026
<!-- markdownlint-disable MD041 -->
## Summary
<!-- 1-3 sentences: what this PR does and why. -->
Correct the v0.0.75 release-note entry merged in #6371 before the
release tag is cut.
This follow-up restores the omitted OpenClaw `2026.6.10` upgrade and
narrows three claims to the runtime contracts that actually shipped.

## Changes
<!-- Bullet list of key changes. -->
- #5595 -> `docs/about/release-notes.mdx`: add the bundled OpenClaw
`2026.6.10` upgrade and its reviewed package, pairing, and recovery
boundaries.
- #6370 -> `docs/about/release-notes.mdx`: state that authoritative
onboarding restores the gateway provider and inference route during
rebuild, before sandbox recreation.
- #6335 and #6298 -> `docs/about/release-notes.mdx`: scope the OpenAI
frontend to Hermes while retaining the separate OpenAI-only-agent
behavior.
- #6304 -> `docs/about/release-notes.mdx`: name the non-expiring local
Docker-driver sandbox JWT contract precisely and link its gateway-auth
review.

## 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
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: prose-only release-note
corrections with no runtime behavior or code samples.
- [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:

## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: tests
are not applicable; `npm run docs` passed with 0 errors and 2
pre-existing warnings.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [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) —
result: 0 errors and 2 pre-existing warnings (missing authenticated
redirects check and existing light-theme accent contrast).
- [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)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Updated the `v0.0.75` release notes with clearer wording and expanded
details.
* Added more specific notes about the runtime upgrade, sandbox recovery
behavior, and routing safeguards.
* Refined the description of inference routing behavior and local
Docker-driver sandbox authentication handling.
* Adjusted the linked references and final release-note wording for
consistency.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
…IA#6304)

<!-- markdownlint-disable MD041 -->
## Summary

Local Docker-driver sandboxes were provisioned with a 1-hour gateway
sandbox JWT (`gateway_jwt.ttl_secs = 3600`). Once that token expires it
cannot be renewed — the file-based token source has no rebootstrap path
and `RefreshSandboxToken` requires a still-valid JWT — so `exec`,
`agents`, `logs`, and `rebuild` fail with `invalid token:
ExpiredSignature` / `relay open timed out`. This sets the local
Docker-driver gateway JWT to non-expiring (`ttl_secs = 0`), which is
OpenShell's documented default for single-player local deployments.

## Related Issue

Fixes NVIDIA#6287

## Changes

- `src/lib/onboard/docker-driver-gateway-config.ts`:
`DOCKER_DRIVER_GATEWAY_JWT_TTL_SECS` `3600` → `0`. The gateway then
mints the `exp = 0` non-expiring sentinel, which OpenShell's
`SandboxJwtAuthenticator` accepts. The `3600` value was a stale
carryover of OpenShell's pre-`v0.0.71` default, which OpenShell itself
changed to `0` for local single-player Docker/Podman/VM gateways in
[NVIDIA/OpenShell#1721](NVIDIA/OpenShell#1721)
("fix(gateway): allow local sandbox jwt to not expire").
- `src/lib/onboard/docker-driver-gateway-config-auth-contract.test.ts`:
the valid-token case now asserts the `exp = 0` non-expiring sentinel;
the expiry-rejection case uses fixed offsets so it still proves the
validator rejects genuinely expired tokens regardless of the configured
TTL.
- `docs/security/openshell-0.0.71-gateway-auth-review.mdx`: update the
sandbox JWT TTL rationale to reflect the non-expiring local contract.

## Type of Change

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

## Quality Gates
- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [x] 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: awaiting maintainer
sensitive-path review
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification
- [x] PR description includes the DCO sign-off declaration 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 — command/result: `vitest run
docker-driver-gateway` → 17 files, 121/121 passed; `tsc -p
tsconfig.cli.json` exit 0; `biome check` clean on changed files
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [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)
- [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)

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

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
Add the v0.0.75 release-notes entry for the release train, summarizing
the user-facing fixes merged since v0.0.74. Release-prep docs for the
`nemoclaw-maintainer-cut-release-tag` gate.

## Related Issue
Release prep for v0.0.75. Remove this section if none.

## Changes
- `docs/about/release-notes.mdx`: add the `## v0.0.75` section (themed
intro + grouped bullets with source-page links), matching the existing
v0.0.74 style.

### Source summary (doc-impacting PRs → doc page)
- NVIDIA#6370 -> `docs/about/release-notes.mdx`: prepared-backup recovery
restores gateway state and defers the live route check to onboarding, so
upgrade recovery no longer fails on an unset gateway route.
- NVIDIA#6305 -> `docs/about/release-notes.mdx`: in-place upgrades recover
gateway-orphaned sandboxes.
- NVIDIA#6332 -> `docs/about/release-notes.mdx`: same-name `--fresh`
re-onboard preserves fresh LangChain Deep Agents Code routing.
- NVIDIA#6335 -> `docs/about/release-notes.mdx`: custom Anthropic-compatible
inference uses the OpenAI frontend.
- NVIDIA#6298 -> `docs/about/release-notes.mdx`: OpenAI-only agents keep the
`/v1` base URL on Anthropic-compatible endpoints.
- NVIDIA#6304 -> `docs/about/release-notes.mdx`: local docker-driver gateway
credentials no longer expire.
- NVIDIA#6261 -> `docs/about/release-notes.mdx`: Hermes runtime and managed
MCP state reconcile after a runtime change.
- NVIDIA#6318 -> `docs/about/release-notes.mdx`: Hermes installs accept a
pinned base platform digest.
- NVIDIA#6291 -> `docs/about/release-notes.mdx`: OpenClaw local CLI pairing
restores its previous connection path.

Test-performance, CI, and chore commits since v0.0.74 are excluded as
non-user-facing.

## Type of Change
- [x] Doc only (prose changes, no code sample modifications)

## Quality Gates
- [x] Tests not applicable — justification: documentation-only change
(release notes prose).
- [x] Docs updated for user-facing behavior changes

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] `npm run docs` builds without warnings introduced by this change —
command/result: "Found 0 errors and 2 warnings" (the 2 warnings
pre-exist this change).
- [x] Doc pages follow the style guide (active voice, no numbered/colon
titles, correct NVIDIA/NemoClaw/OpenShell capitalization; skip-terms
avoided).
- [x] No secrets, API keys, or credentials committed

---
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>


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

* **Documentation**
* Added a new **v0.0.75** section to the release notes, highlighting
improved sandbox upgrade hardening and prepared-backup recovery, updated
inference routing for Anthropic-compatible endpoints, longer-lasting
local gateway credential handling, and restored CLI pairing reconnection
without re-pairing. Also includes cross-links to related NemoClaw CLI
and documentation pages.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
<!-- 1-3 sentences: what this PR does and why. -->
Correct the v0.0.75 release-note entry merged in NVIDIA#6371 before the
release tag is cut.
This follow-up restores the omitted OpenClaw `2026.6.10` upgrade and
narrows three claims to the runtime contracts that actually shipped.

## Changes
<!-- Bullet list of key changes. -->
- NVIDIA#5595 -> `docs/about/release-notes.mdx`: add the bundled OpenClaw
`2026.6.10` upgrade and its reviewed package, pairing, and recovery
boundaries.
- NVIDIA#6370 -> `docs/about/release-notes.mdx`: state that authoritative
onboarding restores the gateway provider and inference route during
rebuild, before sandbox recreation.
- NVIDIA#6335 and NVIDIA#6298 -> `docs/about/release-notes.mdx`: scope the OpenAI
frontend to Hermes while retaining the separate OpenAI-only-agent
behavior.
- NVIDIA#6304 -> `docs/about/release-notes.mdx`: name the non-expiring local
Docker-driver sandbox JWT contract precisely and link its gateway-auth
review.

## 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
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: prose-only release-note
corrections with no runtime behavior or code samples.
- [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:

## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: tests
are not applicable; `npm run docs` passed with 0 errors and 2
pre-existing warnings.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [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) —
result: 0 errors and 2 pre-existing warnings (missing authenticated
redirects check and existing light-theme accent contrast).
- [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)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Updated the `v0.0.75` release notes with clearer wording and expanded
details.
* Added more specific notes about the runtime upgrade, sandbox recovery
behavior, and routing safeguards.
* Refined the description of inference routing behavior and local
Docker-driver sandbox authentication handling.
* Adjusted the linked references and final release-note wording for
consistency.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

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

Labels

area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Sandbox gateway relay token expires (~15-20 min) with "invalid token: ExpiredSignature", breaking exec/agent/logs/rebuild

5 participants