Skip to content

fix(images): replay MCP discovery permissions - #8754

Merged
jyaunches merged 9 commits into
mainfrom
codex/mcp-discovery-runtime-permissions-replacement
Aug 10, 2026
Merged

fix(images): replay MCP discovery permissions#8754
jyaunches merged 9 commits into
mainfrom
codex/mcp-discovery-runtime-permissions-replacement

Conversation

@jyaunches

@jyaunches jyaunches commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Exact staging run 31396519688 showed that Docker preserved mode 0664 from the build context when it copied the reviewed MCP discovery runtime. Replay root ownership and read-only modes in each final image before bundle execution, while keeping the existing fail-closed tree assertion unchanged. Add a PR-only Deep Agents Code regression that rebuilds the exact staging source and effective Docker configuration without claiming that the unavailable historical image was reproduced byte-for-byte.

Related Issue

Fixes #8665.

Supersedes #8745. GitHub accepted that PR's final fast-forward branch update but did not synchronize its pull ref, commit list, or PR checks. This replacement carries that GitHub-Verified history plus the review repairs at commit cef961c6ba411682a60819b02a9096b161374e8d on a fresh branch.

Independently supersedes the permission-fix scope of #8702. Its latest PR commit lost the permission-normalizing COPY options during conflict resolution and all three managed-image builds reproduce the 0664 failure. This PR uses a distinct legacy-builder-compatible final-image replay and does not transfer that PR's code, tests, managed-startup copy changes, or runtime-directory diagnostics.

Changes

  • Replay root:root ownership, directory mode 0555, and regular-file mode 0444 under /usr/local/lib/nemoclaw/mcp-tool-discovery-runtime in the OpenClaw, Hermes, and Deep Agents Code final images.
  • Use non-dereferencing traversal so the replay cannot change an out-of-tree link target, then run the unchanged find -L tree assertion after bundle validation.
  • Report a named permission-replay failure without changing the existing bundle, JSON, tree, or managed-startup diagnostics.
  • Execute the shared Dockerfile replay against the real reviewed bundle at mode 0664, run the bundle afterward, and verify ownership, modes, bytes, failure behavior, and link scope for all three Dockerfiles.
  • Make the PR image workflow reproduce mode 0664 before each real managed-image build, then inspect the immutable final image for root ownership, 0555/0444 modes, and the exact bundle contract.
  • Rebuild the staging base from exact NemoClaw source d097a22145859102c0495b0310de264b7a27624f, apply the staging run's effective final-image configuration through the declared build arguments, prove layer ancestry, and run the final-image contract. The recorded ceaa94... index was local-only and unavailable, so the job treats it as provenance rather than an executable image identity.
  • Keep classic Docker builder compatibility by applying permissions in the final RUN layer instead of using COPY --chmod or COPY --chown.
  • Do not dispatch a Brev image build; exact staging validation remains a post-merge step.

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: This restores an internal managed-image file-permission invariant. It changes no public command, configuration, default, API, operator workflow, or successful user behavior.
  • 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: Codex Desktop independently reviewed commit cef961c6b across all nine security categories, including shell status handling, symlink scope, ownership and mode enforcement, output privacy, workflow authorization, and the historical-image limitation. It found no actionable security issue.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: The change repairs internal managed-image MCP tool-discovery filesystem metadata and adds CI-only regression coverage. It does not change public commands, configuration, defaults, APIs, or operator workflows; existing MCP tool-discovery documentation remains accurate.
  • 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 validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — 68 tests passed across the managed-image workflow, MCP discovery image contract, and all three final-image layout contracts; the 19-test workflow contract was rerun after the final ordering assertion.
  • 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 scoped image-permission repair. npm run validate:pr passed for the review repair, including repository checks, source-shape budgets, Biome, hadolint, secret scanning, and CLI typecheck; the final assertion also passed normal commit and push hooks.
  • 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: Julie Yaunches jyaunches@nvidia.com

Summary by CodeRabbit

  • Security

    • Managed images now enforce secure ownership and read-only permissions for the tool-discovery runtime.
    • Directories remain executable while files remain readable without being writable, and symlinks are handled safely.
  • Bug Fixes

    • Improved consistency and reliability when building managed images, including protection against permission drift.
  • Quality

    • Added automated validation for image security properties, runtime execution, and discovery response format.

jyaunches and others added 7 commits August 10, 2026 12:13
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
…untime-permissions

Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The change normalizes MCP tool-discovery runtime ownership and permissions in managed images. PR workflows reproduce permission drift and validate runtime behavior. Staging QA rebuilds a historical base and verifies the candidate Deep Agents Code image contract.

Changes

Discovery runtime hardening

Layer / File(s) Summary
Permission replay contract
Dockerfile, agents/*/Dockerfile, test/support/managed-bootstrap-image-contract.ts
Managed image builds set runtime entries to root:root, directories to mode 0555, and files to mode 0444. Tests verify failure handling, content preservation, and non-dereferencing of symlinks.
PR image validation
.github/workflows/managed-images.yaml, test/managed-image-publication-workflow.test.ts
PR builds reproduce permission drift before image validation. Tests verify runtime ownership, permissions, execution, JSON responses, and malformed-input rejection.
Staging QA reproduction
.github/workflows/managed-images.yaml, test/managed-image-publication-workflow.test.ts
The staging job validates pinned revisions, rebuilds the historical base, builds the candidate Deep Agents Code image, checks base-layer inheritance, and verifies the final discovery contract.

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

Sequence Diagram(s)

sequenceDiagram
  participant StagingQA
  participant HistoricalBase
  participant CandidateImage
  participant DiscoveryRuntime
  StagingQA->>HistoricalBase: rebuild pinned historical base
  StagingQA->>CandidateImage: build candidate image against rebuilt base
  CandidateImage->>DiscoveryRuntime: execute discovery runtime
  DiscoveryRuntime-->>StagingQA: return protocol and invalid-arguments error
  StagingQA->>CandidateImage: inspect image ID, base layers, ownership, and modes
Loading

Possibly related PRs

  • NVIDIA/NemoClaw#8642: Added related final-image ownership and read-only runtime assertions.
  • NVIDIA/NemoClaw#8702: Modified managed-image Dockerfiles and contract tests for MCP discovery-runtime permissions.
  • NVIDIA/NemoClaw#8745: Extended related discovery-runtime permission replay across Dockerfiles, workflows, and tests.

Suggested labels: area: sandbox, area: security

Suggested reviewers: cv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR fixes the permission contract and adds regression coverage [#8665], but it lacks exact staging build, READY handoff, Launchable, and E2E evidence. Run the exact QA-base producer build and staging validation, then provide the READY handoff, image digest, Launchable results, and E2E evidence.
✅ Passed checks (4 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed The workflow, Dockerfile, and test changes directly support the image permission fix and linked issue requirements [#8665].
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 and concisely describes the main change: replaying MCP discovery permissions in managed images.
✨ 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 codex/mcp-discovery-runtime-permissions-replacement

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

@github-code-quality

github-code-quality Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit cef961c in the codex/mcp-discovery-... branch remains at 96%, unchanged from commit 3574032 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit cef961c in the codex/mcp-discovery-... branch remains at 82%, unchanged from commit 3574032 in the main branch.

Show a code coverage summary of the most impacted files.
File main 3574032 codex/mcp-discovery-... cef961c +/-
src/lib/agent/aliases.ts 100% 94% -6%
src/lib/onboard...age/contract.ts 93% 89% -4%
src/lib/state/registry.ts 89% 87% -2%
src/lib/messagi...annel-config.ts 95% 93% -2%
src/lib/policy/index.ts 67% 67% 0%
src/lib/onboard...-transaction.ts 94% 94% 0%
src/lib/securit...ate-endpoint.ts 96% 97% +1%
src/lib/policy/...ne-exclusion.ts 87% 92% +5%
src/lib/onboard...eway-binding.ts 83% 88% +5%
src/lib/messagi...placeholders.ts 92% 100% +8%

Updated August 10, 2026 20:23 UTC

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Blocking findings reported

Advisor assessment: Blockers require maintainer review
Next action: Review the blockers below.
Findings: 1 blocker · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 1 blocker · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 1 blocker · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized terminology decisions differ; normalized E2E selections differ; severity counts match.
5 terminology differences from the second opinion

Advisory only. These are normalized differences from the primary terminology receipt.

  • permission replay at Dockerfile:1521: primary classified it as established; the second opinion classified it as justified.
  • permission drift at .github/workflows/managed-images.yaml:114: selected only by the second-opinion lane as justified.
  • reviewed-runtime-bundle at .github/workflows/managed-images.yaml:119: selected only by the second-opinion lane as established.
  • staging QA at .github/workflows/managed-images.yaml:52: selected only by the second-opinion lane as justified.
  • discovery contract at .github/workflows/managed-images.yaml:243: selected only by the second-opinion lane as justified.
2 additional E2E selections from the second opinion

Advisory only. The primary lane did not select these E2E jobs or targets.

  • rebuild-hermes: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • rebuild-openclaw: The completed second-opinion lane identified E2E coverage that the primary lane omitted.

Second-opinion terminology and E2E selections are advisory. Live E2E does not run automatically for pull requests.

4 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • justified — discovery permission drift at .github/workflows/managed-images.yaml:114: Keep “discovery permission drift” for the explicit writable-artifact fixture.
  • justified — staging QA base at .github/workflows/managed-images.yaml:53: Keep “staging QA base” where the locally rebuilt historical base must be distinct from a published base image.
  • justified — recorded local-only index digest at .github/workflows/managed-images.yaml:75: Keep the full term when identifying provenance that cannot serve as an image identity.
  • established — permission replay at Dockerfile:1521: Keep the literal assertion identifier; no explanatory-text replacement is required.

E2E guidance

Advisory only. A maintainer can dispatch the default E2E suite against this exact revision.

Recommended E2E: cloud-onboard, full-e2e, hermes-e2e, hermes-inference-switch, managed-image-multiarch-startup, security-posture, ubuntu-repo-cloud-langchain-deepagents-code

1 optional E2E recommendation
  • staging-brev-launchable

Blockers

PRA-1 Blocker — Name each managed-startup contract failure

  • Location: Dockerfile:1528
  • Category: acceptance
  • Problem: The managed-startup checks continue as an anonymous `&&` chain after the new named discovery permission replay failure. A missing, linked, incorrectly owned, or incorrectly mode-set managed-startup runtime can still stop the image build with no failed-sub-check name.
  • Impact: A managed-startup contract regression can again fail the producer-equivalent build without identifying which required check failed, delaying diagnosis of a security-sensitive image failure.
  • Fix: Route every remaining managed-startup and bootstrap contract predicate through the existing named assertion helper, and apply the same change to the Hermes and Deep Agents Code final-image copies.
  • Verification: Inspect the failing-command paths for a missing, symlinked, wrongly owned, or wrongly mode-set managed-startup runtime. Each path should emit one named assertion before exit.
  • Test coverage: Extend the shared managed-bootstrap image-contract test to make each managed-startup predicate fail and assert its exact named diagnostic for all three final Dockerfiles.
  • Evidence: .github/workflows/managed-images.yaml:225-234 names the discovery-tree failures but relies on the Dockerfile build result for managed-startup checks. Dockerfile:1528-1536 contains bare managed-startup file, symlink, ownership, mode, and metadata checks. Issue 8665 acceptance criterion: “A future contract failure identifies the failed sub-check in the producer log and handoff receipt.”

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: 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 @.github/workflows/managed-images.yaml:
- Around line 189-200: Update the layer inheritance jq invocation in the managed
image workflow to use null-input mode with -n, since its filter relies
exclusively on --argjson variables and should not read stdin. Preserve the
existing filter and failure behavior, and extend the relevant workflow contract
assertion in managed-image-publication-workflow.test.ts to verify the jq command
includes -n.
- Line 166: Update the Docker build arguments in the managed-images workflow to
use the declared NEMOCLAW_INFERENCE_PROVIDER_ID argument with value inference,
or remove the argument if relying on the Dockerfile default; do not pass the
undeclared NEMOCLAW_PROVIDER_KEY argument.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 81e24c25-a508-40bc-8c51-4af626244c0a

📥 Commits

Reviewing files that changed from the base of the PR and between 3574032 and 7eeaefa.

📒 Files selected for processing (6)
  • .github/workflows/managed-images.yaml
  • Dockerfile
  • agents/hermes/Dockerfile
  • agents/langchain-deepagents-code/Dockerfile
  • test/managed-image-publication-workflow.test.ts
  • test/support/managed-bootstrap-image-contract.ts

Comment thread .github/workflows/managed-images.yaml Outdated
Comment thread .github/workflows/managed-images.yaml
Signed-off-by: Julie Yaunches <jyaunches@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)
test/managed-image-publication-workflow.test.ts (1)

682-684: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Require checkout before staging permission drift.

The staging assertions only require drift to run before baseBuild. They do not require drift to run after prCheckout, although the step uses the candidate directory. Add the lower-bound ordering assertion. (raw.githubusercontent.com)

As per path instructions, verify both boundaries of the observable workflow ordering.

Proposed assertion
     expect(drift["working-directory"]).toBe("candidate");
+    expect(steps.indexOf(drift)).toBeGreaterThan(steps.indexOf(prCheckout));
     expect(steps.indexOf(drift)).toBeLessThan(steps.indexOf(baseBuild));
🤖 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/managed-image-publication-workflow.test.ts` around lines 682 - 684,
Update the staging workflow ordering assertions around finalBuild, contract, and
baseBuild to also require the drift step to occur after prCheckout, since drift
uses the candidate directory. Verify both ordering boundaries: prCheckout before
drift and drift before baseBuild, while preserving the existing assertions.

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 `@test/managed-image-publication-workflow.test.ts`:
- Around line 132-135: Update the inline validator extraction helper around
required(...) to trim the regex capture before validating it, then reject both
missing and whitespace-only captures. Preserve returning the trimmed validator
for non-empty matches, and add a regression case covering a whitespace-only
extracted validator.

---

Outside diff comments:
In `@test/managed-image-publication-workflow.test.ts`:
- Around line 682-684: Update the staging workflow ordering assertions around
finalBuild, contract, and baseBuild to also require the drift step to occur
after prCheckout, since drift uses the candidate directory. Verify both ordering
boundaries: prCheckout before drift and drift before baseBuild, while preserving
the existing assertions.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 05e2df69-6ae7-406a-838a-5dceac6e5a87

📥 Commits

Reviewing files that changed from the base of the PR and between 7eeaefa and 45f3526.

📒 Files selected for processing (2)
  • .github/workflows/managed-images.yaml
  • test/managed-image-publication-workflow.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/managed-images.yaml

Comment on lines +132 to +135
return required(
source.match(/if ! node -e '([\s\S]+?)' <<< "\$actual_discovery_contract"/u)?.[1],
"managed-image workflow is missing or has an incomplete inline Node validator",
).trim();

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 | 🟠 Major | ⚡ Quick win

Reject an empty extracted validator.

required(...) rejects only an absent match. A whitespace-only match survives that call, then .trim() returns "". node -e "" exits successfully, so this helper can accept a workflow with no effective validator. Trim before the presence check and add a whitespace-only regression case. (raw.githubusercontent.com)

Proposed fix
 function inlineNodeStdinValidator(source: string): string {
+  const validator = source.match(
+    /if ! node -e '([\s\S]+?)' <<< "\$actual_discovery_contract"/u,
+  )?.[1]?.trim();
   return required(
-    source.match(/if ! node -e '([\s\S]+?)' <<< "\$actual_discovery_contract"/u)?.[1],
+    validator || undefined,
     "managed-image workflow is missing or has an incomplete inline Node validator",
-  ).trim();
+  );
 }
📝 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
return required(
source.match(/if ! node -e '([\s\S]+?)' <<< "\$actual_discovery_contract"/u)?.[1],
"managed-image workflow is missing or has an incomplete inline Node validator",
).trim();
const validator = source.match(
/if ! node -e '([\s\S]+?)' <<< "\$actual_discovery_contract"/u,
)?.[1]?.trim();
return required(
validator || undefined,
"managed-image workflow is missing or has an incomplete inline Node validator",
);
🤖 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/managed-image-publication-workflow.test.ts` around lines 132 - 135,
Update the inline validator extraction helper around required(...) to trim the
regex capture before validating it, then reject both missing and whitespace-only
captures. Preserve returning the trimmed validator for non-empty matches, and
add a regression case covering a whitespace-only extracted validator.

Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
@jyaunches

Copy link
Copy Markdown
Contributor Author

Review disposition for cef961c6ba411682a60819b02a9096b161374e8d:

  • The advisor blocker asks this permission repair to diagnose every later bootstrap/runtime-directory predicate. Its premise that the five managed-startup checks are unnamed is incorrect: all three Dockerfiles retain regular-file, non-symlink, owner-root-root, mode-0444, and metadata-0:0:444, after the named discovery replay, bundle, JSON, tree-scan, and tree-safety checks. The shared contract requires those names across all three Dockerfiles and executes every failure path added by this work.
  • The only later bare predicates are pre-existing bootstrap/trampoline and /run/nemoclaw checks. This PR adds only the MCP discovery permission replay and explicitly excludes fix(images): normalize managed runtime bundle metadata #8702's runtime-directory diagnostic scope. Expanding those contracts should be handled separately if maintainers want it.
  • The whitespace-only validator comment does not expose a passing gap. The test executes the extracted validator against three invalid payloads and requires a nonzero result for each. An empty node -e program exits zero, so that condition fails the existing regression.

No code change is warranted for these comments. The post-merge Brev/Launchable handoff remains intentionally deferred, as requested in #8665 and this PR description.

@jyaunches
jyaunches merged commit f817ad6 into main Aug 10, 2026
93 of 96 checks passed
@jyaunches
jyaunches deleted the codex/mcp-discovery-runtime-permissions-replacement branch August 10, 2026 21:02
jyaunches added a commit that referenced this pull request Aug 11, 2026
<!-- markdownlint-disable MD041 -->
## Summary

This PR updates the August 10, 2026 v0.0.106 release entry with gateway
readiness fixes that merged after PR #8756.
PRs #8765, #8767, and #8768 remain outside this entry because they are
open and do not carry the `v0.0.106` release label.

## Changes

- Document acceptance of OpenShell v0.0.101 `Server:` endpoint output
and target-bound process tags when trusted listener evidence matches the
configured gateway.
- Document preservation of selected-gateway stale state so onboarding
can reconcile a registered gateway when a gateway-scoped OpenShell
status check cannot connect.
- Record evidence-backed exclusions for internal image, startup,
qualification, proxy-environment, CI, and test-harness changes in PRs
#8754, #8609, #8762, #8432, #8766, and #8581.
- Exclude PRs #8765, #8767, and #8768 because their changes are absent
from `main` and the PRs do not carry the `v0.0.106` release label.
The release entry must be updated after any of those PRs merges for
v0.0.106.

## 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 dated changelog SPDX placement,
version headings, forbidden terms, and link form.
- [ ] 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: `docs/changelog/2026-08-10.mdx`; an independent Codex
Desktop subagent reviewed the writing rules and documentation style,
terminology, structure, voice, code-sample presentation, links, source
and test accuracy, release meaning, product scope, and evidence-backed
exclusions at commit `190bf882c`.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 190bf88 -->
<!-- docs-review-agents-blob-sha: c4923a3 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable; `scripts/prepare-dgx-station-host.sh`
is unchanged.
- 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 validate:pr` passed after refreshing `origin/main` 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: `npx
vitest run test/changelog-docs.test.ts` passed 6 tests.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: Not applicable to a
documentation-only release-entry update.
- [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: passed with 0 errors and 2 existing 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)
— no page was added.

---
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>


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

## Summary by CodeRabbit

* **Bug Fixes**
* Improved gateway readiness detection for OpenShell v0.0.101 endpoint
output.
* Process tags are now accepted only when they match trusted listener
information for the configured gateway.
* Preserved stale gateway status during connection failures to support
accurate onboarding reconciliation.

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

Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Deep Code runtime contract blocks exact Brev Launchable image publication

2 participants