Skip to content

feat(blueprint): add Entra runtime identity reference - #7686

Merged
ericksoa merged 9 commits into
mainfrom
6871-entra-runtime-identity/ae
Jul 30, 2026
Merged

feat(blueprint): add Entra runtime identity reference#7686
ericksoa merged 9 commits into
mainfrom
6871-entra-runtime-identity/ae

Conversation

@ericksoa

@ericksoa ericksoa commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

Add Microsoft Entra ID as the second pluggable, data-only runtime identity implementation after the Okta reference from #7265. Entra delegated credentials can now refresh through the trusted Entra issuer and reach only the reviewed Microsoft Graph /v1.0/me resource path.

Related Issue

Part of #6871

Changes

  • Add the entra-runtime-v1 provider profile with app-supplied delegated refresh material, User.Read/offline_access guidance, and no bootstrap application or OBO flow.
  • Register Entra through the provider-neutral runtime-identity trust-policy seam. A profile alone is intentionally insufficient to grant credential trust: the reviewed implementation separately constrains the token issuer to login.microsoftonline.com and credential delivery to GET graph.microsoft.com/v1.0/me.
  • Add positive and negative unit coverage, including rejection when the Graph resource host is substituted as the OAuth token issuer.
  • Add TC-INF-13, which uses real OpenShell and a public HTTPS fixture to prove the Entra-shaped refresh request, delegated bearer injection into Graph /me, denial of /users, token rotation, secret-safe evidence, and ownership-aware rollback.
  • Document Entra tenant setup, refresh-token handling, the operator acceptance check against a real tenant, and the boundary between deterministic PR E2E evidence and tenant acceptance.

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: reviewed the fail-closed issuer/resource trust split, credential scoping, negative host/path cases, secret-safe evidence, and rollback behavior; protected TC-INF-13 remains an exact-head merge gate.
  • 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: docs-updated
  • Evidence: docs/reference/architecture.mdx; nemoclaw-blueprint/provider-profiles/entra-runtime-v1.yaml
  • Agent: Codex Desktop documentation writer subagent

DGX Station Hardware Evidence

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

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — npm --prefix nemoclaw test -- src/blueprint/runtime-identity.test.ts src/blueprint/runner-identity.test.ts (129 passed); npx vitest run --project integration test/blueprint-runtime-identity-lifecycle.test.ts test/blueprint-runtime-identity-schema.test.ts (8 passed); CLI typecheck passed; live collection lists TC-INF-12 and TC-INF-13.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — protected exact-head CI and TC-INF-13 pending.
  • 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: Aaron Erickson aerickson@nvidia.com

Summary by CodeRabbit

  • New Features

    • Added experimental Microsoft Entra runtime identity support, including OAuth refresh flow and Microsoft Graph access control limited to GET /v1.0/me.
    • Introduced a new Entra runtime identity contract profile (entra-runtime-v1) with bearer delivery and refresh configuration.
  • Documentation

    • Updated runtime identity architecture guidance with clearer Entra/Graph verification rules, deterministic conformance coverage, and maintainer acceptance criteria.
  • Tests / Reliability

    • Updated reviewed trust policy handling to a refined structure with enforced REST method/path.
    • Expanded E2E coverage across multiple runtime identity scenarios (TC-INF-12 and TC-INF-13) and strengthened secret-isolation assertions; improved OAuth test server route configurability.

Copilot AI review requested due to automatic review settings July 28, 2026 03:56
@ericksoa ericksoa self-assigned this Jul 28, 2026

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a Microsoft Entra runtime identity profile, separates token-issuer and credential-delivery trust policies, validates reviewed REST paths, expands provider documentation, and parameterizes live identity E2E coverage across Okta and Entra-shaped scenarios.

Changes

Runtime identity contracts and validation

Layer / File(s) Summary
Entra profile and policy contract
nemoclaw-blueprint/provider-profiles/entra-runtime-v1.yaml, nemoclaw/src/blueprint/runtime-identity.ts
Adds the Entra credential contract and separates token-issuer and credential-delivery policy settings.
Trust and delivery enforcement
nemoclaw/src/blueprint/runtime-identity.ts, nemoclaw/src/blueprint/runtime-identity.test.ts
Validates trusted destinations and reviewed delivery method/path values, with Entra and existing policy coverage.
Parameterized identity E2E flow
test/e2e/live/inference-routing.test.ts, test/e2e/live/runtime-identity-oauth-server.ts, .github/workflows/e2e.yaml
Runs refresh, attachment, delivery restriction, rotation, rollback, and leakage checks across provider scenarios using configurable OAuth routes.
Provider reference guidance
docs/reference/architecture.mdx
Documents Entra configuration, Graph /v1.0/me delivery, trust boundaries, conformance scenarios, and sandbox placeholders.

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

Suggested labels: area: e2e, area: docs

Suggested reviewers: jyaunches, cv, miyoungc

Sequence Diagram(s)

sequenceDiagram
  participant E2ETestRunner
  participant OpenShell
  participant OAuthFixture
  E2ETestRunner->>OAuthFixture: Configure scenario token and resource paths
  E2ETestRunner->>OpenShell: Plan and attach runtime identity
  OpenShell->>OAuthFixture: Refresh token and deliver bearer
  E2ETestRunner->>OpenShell: Probe reviewed and denied paths
  E2ETestRunner->>OpenShell: Rotate credentials and repeat request
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding an Entra runtime identity reference.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 6871-entra-runtime-identity/ae

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

@github-actions

Copy link
Copy Markdown
Contributor

@github-code-quality

github-code-quality Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit b7bb56e in the 6871-entra-runtime-i... branch remains at 96%, unchanged from commit 97fff98 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit b7bb56e in the 6871-entra-runtime-i... branch remains at 81%, unchanged from commit 45d7e1a in the main branch.

Show a code coverage summary of the most impacted files.
File main 45d7e1a 6871-entra-runtime-i... b7bb56e +/-
src/lib/onboard/docker-cdi.ts 80% 70% -10%
src/lib/onboard/preflight.ts 80% 80% 0%
src/lib/readine...ualification.ts 90% 92% +2%
src/lib/state/sandbox.ts 76% 79% +3%
src/lib/actions...sor-relaunch.ts 80% 85% +5%
src/lib/domain/.../connect-env.ts 89% 97% +8%
src/lib/actions...confirmation.ts 69% 79% +10%
src/lib/inferen...er-lifecycle.ts 63% 77% +14%
src/lib/actions...ocker-health.ts 65% 82% +17%
src/lib/onboard...box-prebuild.ts 74% 92% +18%

Updated July 30, 2026 17:19 UTC

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

🧹 Nitpick comments (2)
nemoclaw/src/blueprint/runtime-identity.test.ts (1)

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

Differentiate the it.each case titles.

All four rows share the literal title "rejects a broadened Entra credential-delivery profile", so a CI failure can't tell which boundary broke without inspecting the row index. Case 4 (Line 533-536) also isn't really a "credential-delivery" case — it tests the token-issuer boundary (rejecting graph.microsoft.com as the refresh token_url host).

♻️ Proposed title parameterization
-  ])("rejects a broadened Entra credential-delivery profile", async (profile, message) => {
+  ])("rejects an Entra profile violating trust boundary: %s", async (profile, message) => {

(pass a short case label as a third array element, e.g. "widened delivery path", "delivery host swap", "delivery subdomain spoof", "issuer/delivery host swap", and reference it in the format string.)

🤖 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 `@nemoclaw/src/blueprint/runtime-identity.test.ts` around lines 517 - 537,
Differentiate the parameterized test cases in “rejects a broadened Entra
credential-delivery profile” by adding a short descriptive label to each row and
incorporating it into the test title. Use labels that identify the
delivery-path, delivery-host, delivery-subdomain, and issuer/delivery-host
boundary cases, with the fourth case explicitly reflecting the token-issuer
check.
test/e2e/live/runtime-identity-oauth-server.ts (1)

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

Duplicated bearer-token parsing between the GET handler and the fallback catchall.

Lines 163-172 and 191-198 repeat identical logic for extracting the bearer token and classifying auth. Consider extracting a small helper (e.g., classifyBearer(req, accessTokens, currentAccessToken)) to avoid the two copies drifting apart.

♻️ Proposed extraction
+function classifyBearer(
+  req: http.IncomingMessage,
+  accessTokens: readonly string[],
+  currentAccessToken: string | undefined,
+): { token: string | undefined; accessTokenVersion: number | null; auth: RuntimeIdentityResourceRequest["auth"] } {
+  const authorization = req.headers.authorization;
+  const token =
+    typeof authorization === "string" && authorization.startsWith("Bearer ")
+      ? authorization.slice("Bearer ".length)
+      : undefined;
+  const rawVersion = token ? accessTokens.findIndex((candidate) => candidate === token) + 1 : null;
+  const accessTokenVersion = rawVersion && rawVersion > 0 ? rawVersion : null;
+  const auth: RuntimeIdentityResourceRequest["auth"] =
+    token === currentAccessToken ? "ok" : token ? "invalid" : "missing";
+  return { token, accessTokenVersion, auth };
+}
🤖 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/e2e/live/runtime-identity-oauth-server.ts` around lines 162 - 205,
Extract the duplicated bearer-token parsing and authentication classification
from the GET resource handler and fallback catchall into a shared helper near
the request handling code. Have the helper accept the request, accessTokens, and
currentAccessToken, and return the token, auth classification, and access-token
version needed by both paths; update both handlers to reuse it without changing
their existing response behavior.
🤖 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.

Nitpick comments:
In `@nemoclaw/src/blueprint/runtime-identity.test.ts`:
- Around line 517-537: Differentiate the parameterized test cases in “rejects a
broadened Entra credential-delivery profile” by adding a short descriptive label
to each row and incorporating it into the test title. Use labels that identify
the delivery-path, delivery-host, delivery-subdomain, and issuer/delivery-host
boundary cases, with the fourth case explicitly reflecting the token-issuer
check.

In `@test/e2e/live/runtime-identity-oauth-server.ts`:
- Around line 162-205: Extract the duplicated bearer-token parsing and
authentication classification from the GET resource handler and fallback
catchall into a shared helper near the request handling code. Have the helper
accept the request, accessTokens, and currentAccessToken, and return the token,
auth classification, and access-token version needed by both paths; update both
handlers to reuse it without changing their existing response behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: b3fad885-a424-4d4d-afbd-5020ef7aa988

📥 Commits

Reviewing files that changed from the base of the PR and between d3eea5a and b8fa4ca.

📒 Files selected for processing (7)
  • .github/workflows/e2e.yaml
  • docs/reference/architecture.mdx
  • nemoclaw-blueprint/provider-profiles/entra-runtime-v1.yaml
  • nemoclaw/src/blueprint/runtime-identity.test.ts
  • nemoclaw/src/blueprint/runtime-identity.ts
  • test/e2e/live/inference-routing.test.ts
  • test/e2e/live/runtime-identity-oauth-server.ts

@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

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

Model lanes

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

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

E2E guidance

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

Recommended E2E: cloud-inference, cloud-onboard, full-e2e, hermes-e2e, security-posture, inference-routing, network-policy

Workflow run details

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

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Copilot AI review requested due to automatic review settings July 28, 2026 04:31

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

…entity/ae

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Copilot AI review requested due to automatic review settings July 28, 2026 04:33

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@ericksoa

Copy link
Copy Markdown
Contributor Author

Exact-head validation evidence

Validated commit 9dcc5f7d9cf590b47b7bf64081cfdeaeaad8bcb1 against base b92ef671c13a9d4b760191d2c94413a28b90a98a.

Pluggable architecture

  • Runtime identity remains provider-neutral and data-driven.
  • Each built-in provider registers a code-reviewed trust policy for token issuers and credential-delivery destinations; a profile alone cannot expand credential trust.
  • Entra is the second built-in implementation of that seam, alongside Okta. Tests and future integrations use the same policy interface.

Protected E2E

TC-INF-13 proved, through a real OpenShell gateway/provider/sandbox path and a public HTTPS Entra-shaped fixture:

  • two successful refresh-token exchanges at /organizations/oauth2/v2.0/token, including refresh-token rotation;
  • bearer version 1 and version 2 were injected into exactly GET /v1.0/me;
  • an unreviewed resource request was rejected before credential delivery;
  • inference remained live after identity attachment;
  • the sandbox received only opaque placeholders;
  • status, persisted state, command artifacts, and request ledgers remained secret-safe;
  • rollback removed the owned provider while preserving the reused sandbox;
  • cleanup completed with zero failures.

The complete protected matrix also passed, including inference routing, cloud inference/onboarding, network-policy live probes, Hermes, full E2E, and both security-posture jobs.

Real Entra acceptance

A separate live-tenant acceptance check silently refreshed an existing delegated token with User.Read and successfully called Microsoft Graph GET /v1.0/me; the returned subject matched the authenticated principal. No token or tenant identifiers were printed or copied.

Boundary: TC-INF-13 intentionally uses deterministic fixture credentials rather than a production tenant secret. Together, the live-tenant Graph check proves the external Entra/Graph contract, while TC-INF-13 proves NemoClaw's complete refresh, policy, injection, rotation, rollback, and secret-safety path.

Both PR review advisors and all current exact-head CI/E2E checks are green. GitHub reports the PR mergeable; the remaining branch-protection requirement is human approval.

@ericksoa ericksoa added v0.0.97 feature PR adds or expands user-visible functionality area: architecture Architecture, design debt, major refactors, or maintainability area: integrations Third-party service integration behavior area: policy Network policy, egress rules, presets, or sandbox policy area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery area: security Security controls, permissions, secrets, or hardening needs: review PR is conflict-free and awaiting maintainer review labels Jul 28, 2026
@cjagwani cjagwani added v0.0.98 and removed v0.0.97 labels Jul 28, 2026
@cjagwani

Copy link
Copy Markdown
Collaborator

Maintainer product-scope gate: the technical checks are green, but I cannot advance or approve this supported Entra integration yet. The linked #6871 still has needs: design; its maintainer discussion says the scope, composition model, and initial Okta/Entra flows require alignment, while the later comments are proposals rather than an accepted product decision. Please record explicit maintainer acceptance of the Entra reference scope and its ownership, lifecycle, compatibility, security, and validation expectations in #6871 (or link the accepted decision here). I will re-run the exact-head gate after that decision. This is a plain blocker comment, not a Changes requested review.

@cjagwani

Copy link
Copy Markdown
Collaborator

I rechecked this for the .98 queue at exact head 9dcc5f7d9cf590b47b7bf64081cfdeaeaad8bcb1.

The implementation is still behind NemoClaw's Product Scope Gate: the linked design issue #6871 remains open in Backlog with needs: design, so it does not yet establish an accepted supported Entra runtime-identity surface, its ownership/lifecycle/compatibility/security expectations, or the required validation contract. The current PR branch is also based on an older main, and maintainer edits are disabled.

I am not submitting a Changes Requested review and I am not modifying the contributor branch. To make this reviewable for approval, please first get an accepted maintainer design/product decision for #6871, then refresh onto current main and attach exact-head evidence from the intended tenant/live identity flow (including refresh, delivery-boundary rejection, and cleanup behavior) according to that accepted validation contract.

@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 (2)
docs/reference/architecture.mdx (1)

341-365: 📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

Block publication pending the Entra product-scope decision.

This new operational provider reference is a supported integration surface, while #6871 still lacks accepted scope, ownership, lifecycle, compatibility, security, and validation decisions. Keep it out of published product documentation, or route it through Community Solutions, until maintainers accept that scope. As per coding guidelines, “Before implementing or approving a new supported integration… confirm an accepted scope decision and defined ownership, lifecycle, compatibility, security, and validation expectations.”

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

In `@docs/reference/architecture.mdx` around lines 341 - 365, Remove the new
“Microsoft Entra Reference” operational provider section from published
architecture documentation until the Entra product-scope decision is accepted.
If retaining the guidance, move it into the Community Solutions documentation
path instead of presenting it as a supported integration.

Source: Coding guidelines

.github/workflows/e2e.yaml (1)

2067-2069: 🔒 Security & Privacy | 🔴 Critical | ⚡ Quick win

Do not expose secrets to candidate checkouts.

When inputs.checkout_sha is supplied, this job checks out PR-controlled code and then runs it with secrets.NVIDIA_INFERENCE_API_KEY in the environment. A candidate test can exfiltrate that key. Gate this job to a trusted checkout with no checkout_sha, or split the secret-bearing live lane from the PR-safe lane.

Proposed guard
-    if: ${{ (github.event_name != 'workflow_dispatch' || (inputs.jobs == '' && inputs.targets == '')) || contains(format(',{0},', inputs.jobs), ',dashboard-remote-bind,') || contains(format(',{0},', inputs.targets), ',dashboard-remote-bind,') }}
+    if: ${{ inputs.checkout_sha == '' && ((github.event_name != 'workflow_dispatch' || (inputs.jobs == '' && inputs.targets == '')) || contains(format(',{0},', inputs.jobs), ',dashboard-remote-bind,') || contains(format(',{0},', inputs.targets), ',dashboard-remote-bind,')) }}

As per path instructions, trusted automation must not execute PR-controlled code while holding repository secrets or write permissions.

Also applies to: 2083-2099

🤖 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 @.github/workflows/e2e.yaml around lines 2067 - 2069, Update the
dashboard-remote-bind job guard and its secret-bearing execution path to prevent
running PR-controlled checkouts with NVIDIA_INFERENCE_API_KEY. Allow this job
only for trusted checkouts where inputs.checkout_sha is absent, or separate the
live secret-using lane from the PR-safe candidate lane while preserving intended
job selection behavior.

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 `@docs/reference/architecture.mdx`:
- Around line 379-393: Update the protected-resource acceptance instructions
around the Entra access-token placeholder and curl request to explicitly execute
the command inside the sandbox child, using the child’s environment so proxy
delivery and Graph path rejection are exercised. Clarify that the host shell
must not run the request directly, while preserving the existing request and
secret-handling guidance.

---

Outside diff comments:
In @.github/workflows/e2e.yaml:
- Around line 2067-2069: Update the dashboard-remote-bind job guard and its
secret-bearing execution path to prevent running PR-controlled checkouts with
NVIDIA_INFERENCE_API_KEY. Allow this job only for trusted checkouts where
inputs.checkout_sha is absent, or separate the live secret-using lane from the
PR-safe candidate lane while preserving intended job selection behavior.

In `@docs/reference/architecture.mdx`:
- Around line 341-365: Remove the new “Microsoft Entra Reference” operational
provider section from published architecture documentation until the Entra
product-scope decision is accepted. If retaining the guidance, move it into the
Community Solutions documentation path instead of presenting it as a supported
integration.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: da304032-d139-48ad-b1e9-b54efe370305

📥 Commits

Reviewing files that changed from the base of the PR and between 2669d3f and 7ea834f.

📒 Files selected for processing (3)
  • .github/workflows/e2e.yaml
  • docs/reference/architecture.mdx
  • nemoclaw/src/blueprint/runtime-identity.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • nemoclaw/src/blueprint/runtime-identity.test.ts

Comment thread docs/reference/architecture.mdx
@cjagwani

Copy link
Copy Markdown
Collaborator

The Product Scope Gate is now cleared by the accepted maintainer decision in #6871, so I re-reviewed exact head 7ea834fdfda6fce3e77e001af2f228b006ed5c3a as a security-sensitive change. I am not approving it yet for two current-head gaps:

  • The reviewed Entra credential-delivery policy binds graph.microsoft.com, GET, and /v1.0/me, but not port 443. parseRuntimeIdentityEndpoint accepts any port through 65535, so a copied profile can widen the code-reviewed delivery endpoint without changing the host/method/path. Please bind the reviewed port in the policy and add a rejection test for a non-443 Entra endpoint.
  • The real-tenant acceptance instructions need to state that the placeholder-bearing curl runs inside a sandbox child. As written, the host-shell command either fails or encourages using a raw bearer, bypassing the proxy injection/path-rejection boundary. The unresolved CodeRabbit thread at docs/reference/architecture.mdx:393 captures this accurately.

The rest of the boundary reviewed fail-closed: exact issuer and Graph host matching, exact GET /v1.0/me, reviewed executable allowlist, secret-scoped refresh subprocess input, ownership-aware compensation, and negative delivery-path E2E coverage. This is a plain blocker comment, not a Changes Requested review; I will re-review after the branch is quiet following an update.

@ericksoa

Copy link
Copy Markdown
Contributor Author

Maintainer follow-through is complete on the current exact revision.

  • Accepted product scope and ownership decision: feat: add a core agent identity blueprint contract with Okta and Entra references #6871 (comment)
  • PR head: dba7dc40a232fd839a8bb90637eaf4bfff68f2b6
  • Base: 376beb50b6d184675283bdbc4f2eca18d7200a86
  • Branch is caught up with current main; GitHub reports the PR mergeable and every new commit is Verified.
  • Local npm run validate:pr passed on this exact head.
  • All 40 current GitHub checks passed, including DCO, commit lint, documentation receipt, CodeQL, platform E2E, both PR advisors, and CodeRabbit.
  • Protected exact-head E2E passed all selected jobs with no skips or pending tests: https://github.com/NVIDIA/NemoClaw/actions/runs/30508822515
  • The inference-routing job passed TC-INF-13 and uploaded its runtime-identity evidence.
  • The valid post-push documentation finding was fixed by requiring the Graph acceptance request to run inside a newly launched sandbox child. The scope objection is superseded by the accepted maintainer decision above; the dashboard E2E observation concerns unchanged code outside this diff and is already guarded by the repository exact-SHA controller path.

The only remaining repository gate is one approving human review on the current head; the author cannot self-approve.

@cjagwani

Copy link
Copy Markdown
Collaborator

Re-review at exact head dba7dc40a232fd839a8bb90637eaf4bfff68f2b6: the sandbox-child acceptance wording is now clear, so that blocker is resolved. The reviewed-port blocker remains.

entra-runtime-v1.yaml declares port: 443, but the trusted entra-runtime-v1 entry in RUNTIME_IDENTITY_PROFILE_POLICIES still binds only method, path, and host. parseRuntimeIdentityEndpoint still accepts any integer port from 1 through 65535, so a copied Entra profile can change only the port (for example, to 8443) and remain inside the code-reviewed policy. There is also still no Entra non-443 rejection case in runtime-identity.test.ts.

Please bind port 443 in the reviewed Entra credential-delivery policy and reject a copied profile that changes it. This is a plain blocker comment, not a Changes Requested review; I will recheck the next quiet exact head.

@ericksoa

Copy link
Copy Markdown
Contributor Author

Shipping handoff refreshed for the current exact head:

  • Head: e4f51cfc1020c62efe78d8a80c5d4d58b883a690
  • Base/current main: 45d7e1a8a9b5ccf167b97ee412dc831544ed4fd7
  • Mergeability: MERGEABLE
  • Exact-head CI: attempt 2 passed after retrying a registry-bound npm-audit timeout; all test shards and required aggregates passed
  • Required E2E: run 30553533229 passed; all seven selected selectors / eight concrete jobs passed, including inference-routing with the Entra Graph runtime-identity case
  • Documentation receipt, DCO, commit lint, security scans, review advisors, CodeRabbit, platform checks, and self-hosted checks are green

The branch is caught up and the technical gates are green. The remaining branch-protection gate is one approving human review; no reviewer has been requested.

@github-actions github-actions Bot added v0.0.99 and removed v0.0.98 labels Jul 30, 2026
@ericksoa
ericksoa merged commit 25de83d into main Jul 30, 2026
87 of 93 checks passed
@ericksoa
ericksoa deleted the 6871-entra-runtime-identity/ae branch July 30, 2026 17:33
@sandl99 sandl99 mentioned this pull request Jul 31, 2026
23 tasks
sandl99 added a commit that referenced this pull request Jul 31, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Adds the canonical July 30 release entry for `v0.0.99` before the
release tag is captured.
The entry covers all 37 merged PRs since `v0.0.98` and bounds
experimental or dormant work without presenting it as supported
behavior.

## Changes

- Adds `docs/changelog/2026-07-30.mdx` with the exact `## v0.0.99`
heading, parser-safe MDX SPDX comment, summary, detailed release
bullets, and published documentation routes.
- Records user-visible recovery, snapshot, shared-route, Hermes,
readiness, inference, image, documentation, and release E2E changes.
- States that the managed-image selection and startup-profile contracts
remain dormant and do not activate buildless onboarding.

Source summary:

- [#7972](#7972) ->
`docs/changelog/2026-07-30.mdx`: Records restored managed OpenClaw
configuration modes during recovery.
- [#7834](#7834) ->
`docs/changelog/2026-07-30.mdx`: Records clone-bound pairing
verification after snapshot restore.
- [#7975](#7975) ->
`docs/changelog/2026-07-30.mdx`: Records managed startup recovery
coverage.
- [#7960](#7960) ->
`docs/changelog/2026-07-30.mdx`: Records dormant startup-profile
coordination without activating a supported surface.
- [#7856](#7856) ->
`docs/changelog/2026-07-30.mdx`: Records persistence of the
credential-free OpenClaw startup command.
- [#7959](#7959) ->
`docs/changelog/2026-07-30.mdx`: Records dormant startup-profile
construction without changing onboarding.
- [#7946](#7946) ->
`docs/changelog/2026-07-30.mdx`: Records the internal startup-profile
schema and transport contract.
- [#7951](#7951) ->
`docs/changelog/2026-07-30.mdx`: Records platform-pull cleanup before
managed-image validation.
- [#7949](#7949) ->
`docs/changelog/2026-07-30.mdx`: Records rejection of retained Hermes
`uv` build cache metadata.
- [#7597](#7597) ->
`docs/changelog/2026-07-30.mdx`: Records separate command and agent
first-turn latency evidence.
- [#7931](#7931) ->
`docs/changelog/2026-07-30.mdx`: Records focused E2E replacement
evidence for retired selectors.
- [#7950](#7950) ->
`docs/changelog/2026-07-30.mdx`: Records exclusion of build-only
BuildKit telemetry from the Deep Agents Code probe.
- [#7665](#7665) ->
`docs/changelog/2026-07-30.mdx`: Records consolidated priority 2 E2E
coverage.
- [#7911](#7911) ->
`docs/changelog/2026-07-30.mdx`: Records the corrected NVIDIA DORI
installation pin.
- [#7934](#7934) ->
`docs/changelog/2026-07-30.mdx`: Records the staging image-family wait
before Brev Launchable deployment.
- [#7772](#7772) ->
`docs/changelog/2026-07-30.mdx`: Records dormant managed-image selection
contracts without activating buildless onboarding.
- [#7941](#7941) ->
`docs/changelog/2026-07-30.mdx`: Records corrected agent-specific
provider and policy guidance.
- [#7819](#7819) ->
`docs/changelog/2026-07-30.mdx`: Records removal of empty Deep Agents
Code provider-switch sections.
- [#7932](#7932) ->
`docs/changelog/2026-07-30.mdx`: Records independent
credential-generation E2E execution.
- [#7840](#7840) ->
`docs/changelog/2026-07-30.mdx`: Records shared-route preservation and
pre-delete peer validation during upgrades.
- [#7874](#7874) ->
`docs/changelog/2026-07-30.mdx`: Records the split between pre-tag
release entries and post-tag Announcements.
- [#7876](#7876) ->
`docs/changelog/2026-07-30.mdx`: Records the writable Hermes runtime
root within lockdown.
- [#7756](#7756) ->
`docs/changelog/2026-07-30.mdx`: Records validated multi-platform
managed-image publication.
- [#7914](#7914) ->
`docs/changelog/2026-07-30.mdx`: Records accepted `uv` version metadata
in Hermes image validation.
- [#7686](#7686) ->
`docs/changelog/2026-07-30.mdx`: Records the explicitly experimental
Microsoft Entra runtime identity reference.
- [#7869](#7869) ->
`docs/changelog/2026-07-30.mdx`: Records classified gateway relaunch
quarantine and rebuild guidance.
- [#7814](#7814) ->
`docs/changelog/2026-07-30.mdx`: Records state restore into replacement
sandboxes and SQLite write verification.
- [#7839](#7839) ->
`docs/changelog/2026-07-30.mdx`: Records quieter onboarding test
execution without a user-facing behavior claim.
- [#7854](#7854) ->
`docs/changelog/2026-07-30.mdx`: Records generalized agent-selection
guidance.
- [#7845](#7845) ->
`docs/changelog/2026-07-30.mdx`: Records isolated CDI test evidence
without a user-facing behavior claim.
- [#7843](#7843) ->
`docs/changelog/2026-07-30.mdx`: Records the corrected Omni sub-agent
model ID.
- [#7908](#7908) ->
`docs/changelog/2026-07-30.mdx`: Records reviewed Hermes and Deep Agents
Code dependency pins.
- [#7887](#7887) ->
`docs/changelog/2026-07-30.mdx`: Records rejection of a symlinked DGX
Station release marker.
- [#7747](#7747) ->
`docs/changelog/2026-07-30.mdx`: Records the internal compute-driver
separation without a user-facing behavior claim.
- [#7660](#7660) ->
`docs/changelog/2026-07-30.mdx`: Records atomic publication of rebuild
recovery manifests.
- [#7661](#7661) ->
`docs/changelog/2026-07-30.mdx`: Records bounded local inference
health-response retention.
- [#7654](#7654) ->
`docs/changelog/2026-07-30.mdx`: Records state preservation across
supervisor relaunch recovery.

## Type of Change

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

## Quality Gates

- [ ] Tests added or updated for changed behavior
- [x] Existing tests cover changed behavior — justification:
`test/changelog-docs.test.ts` validates the dated changelog contract,
SPDX comment, version heading, and published routes.
- [ ] 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-07-30.mdx`; the documentation-only diff
passed review against `WRITING.md`, the controlled word list, and
`docs/CONTRIBUTING.md`. The review covered terminology, structure,
active voice, release meaning, product-scope boundaries, and link and
code presentation. Changelog tests passed 6/6, and the docs build
reported 0 errors with 2 pre-existing warnings.
- Agent: Codex CLI
<!-- docs-review-head-sha: 200940f -->
<!-- docs-review-agents-blob-sha: c052d60 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit:
- Station profile/scenario:
- Result:
- Supporting evidence:

## 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/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 this
documentation-only release entry.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) —
result: Build passed with 0 errors and 2 pre-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)

---
Signed-off-by: San Dang <sdang@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Added release notes for v0.0.99 covering snapshot restoration, sandbox
recovery, gateway route upgrades, and Hermes security updates.
* Documented experimental Microsoft Entra runtime identity support and
enhanced readiness checks.
* Added details on managed image validation, trusted CI image promotion,
and end-to-end release evidence.

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

Labels

area: architecture Architecture, design debt, major refactors, or maintainability area: integrations Third-party service integration behavior area: policy Network policy, egress rules, presets, or sandbox policy area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery area: security Security controls, permissions, secrets, or hardening feature PR adds or expands user-visible functionality needs: review PR is conflict-free and awaiting maintainer review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants