Skip to content

fix(onboard): continue onboarding when Homebrew refuses the pinned OpenShell tap - #7739

Open
harjothkhara wants to merge 31 commits into
NVIDIA:mainfrom
harjothkhara:fix/7707-homebrew-untrusted-tap
Open

fix(onboard): continue onboarding when Homebrew refuses the pinned OpenShell tap#7739
harjothkhara wants to merge 31 commits into
NVIDIA:mainfrom
harjothkhara:fix/7707-homebrew-untrusted-tap

Conversation

@harjothkhara

@harjothkhara harjothkhara commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Summary

On macOS with Homebrew 6.x, nemoclaw onboard aborted before [1/8] Preflight because the OpenShell formula identity check threw when brew list or brew info failed. Homebrew 6.x refuses to load formulae from taps it has not marked trusted, including the pinned nvidia/openshell tap. Onboarding now treats that specific refusal as an unconfirmed identity: it warns once with Homebrew's own reason and continues on the standalone gateway fallback. Every other identity-check failure still fails closed.

Related Issue

Fixes #7707

Changes

  • src/lib/onboard/docker-driver-gateway-service.ts: when brew list --formula openshell or brew info --json=v2 openshell returns the exact refusal naming the pinned nvidia/openshell/openshell formula and tap, probe launchctl print gui/<uid>/homebrew.mxcl.openshell without loading the formula. Only the exact missing-unit result permits the standalone fallback and one deduplicated warning. A loaded unit or an unknown probe result throws OpenShellGatewayServiceTrustError, so the operational gateway fallback on current main cannot bypass lifecycle authority. Unrecognized identity failures remain fail-closed, while the separate missing-formula fallback on current main remains intact. The adjacent source comment records that this compatibility branch should be removed when the minimum supported Homebrew can inspect the pinned formula without trusting or loading the tap.
  • Tests: unit and real-path coverage for matching brew list and brew info refusals; generic, foreign-tap, and pinned-name-prefix failures; loaded, denied, status-less, unrunnable, and unrecognized launchd probes; exact missing-unit fallback; warn-once behavior; and proof that the package-managed starter is not invoked.
  • Docs: docs/reference/troubleshooting.mdx, docs/reference/architecture.mdx, and ci/platform-matrix.json (regenerating docs/reference/platform-support.mdx and docs/get-started/prerequisites.mdx) no longer claim onboarding never uses the standalone fallback while Homebrew is present.

Known limits, stated plainly:

  • A run resumed from a checkpoint that recorded a packaged-service owner fails with the existing explicit "authority changed, requires a fresh onboarding run" error rather than migrating. That error is the existing fail-closed contract, not new behavior.
  • Proof runs against a mocked brew boundary; not verified against a live Homebrew 6.x host. No onboarding-process-level test asserts [1/8] Preflight is reached; the real-path test stops at gateway-owner resolution.

Type of Change

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

Quality Gates

  • Tests added or updated for changed behavior
  • Docs updated for user-facing behavior changes
  • 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: PASS — the nine-category review covers secrets, input validation, authorization and lifecycle authority, dependencies, logging, cryptography, configuration, tests, and failure modes. The follow-up preserves standalone fallback only for the official Apple Silicon missing-keg diagnostic or the complete pinned-tap refusal with a proven missing launchd unit. Altered or otherwise unrecognized brew list failures now stop with a redacted identity error before launchd inspection or service mutation. No findings remain.

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: docs-updated
  • Evidence: docs/get-started/prerequisites.mdx, docs/reference/architecture.mdx, docs/reference/platform-support.mdx, and docs/reference/troubleshooting.mdx accurately define the recognized Homebrew refusal, the required missing launchd-unit proof, the fail-closed handling of every other identity query failure, and launchd authority for a loaded service. The follow-up aligns implementation with that documented trust boundary, so no further documentation changes are needed. Focused suites pass 89/89; the CLI build, type check, repository checks, changed-file hooks, and commit hooks pass. Re-confirmed at merge commit 76cb83c5e, which merges current main (17 commits) with no conflicts and changes no source of this PR. docs/AGENTS.md is unchanged across the merge (ac44d5a5f at both the previously reviewed head and this head), so the authoring rules the earlier review applied still hold. docs/reference/troubleshooting.mdx was also changed on main; the auto-merged result was inspected and this PR's added lines remain correctly placed and one sentence per line. Focused onboarding suites re-run after the merge and pass 89/89. Re-confirmed again at merge commit 47218c5e6, which merges current main (86 commits) with no conflicts. The effective PR diff is the same nine files. main reorganized the documentation contract: root AGENTS.md moved DORI routing into docs/AGENTS.md and moved the receipt procedure into CONTRIBUTING.md#documentation-writer-review-receipt, so the hidden blob SHA changes from 3dd7c2425 to c69aad4d5 without changing any rule this PR depends on. docs/reference/troubleshooting.mdx changed on main again; the auto-merged result was inspected and this PR's five added lines remain correctly placed after the standalone-fallback sentence, one sentence per line.
  • Agent: Codex Desktop (original review); Claude Code (post-merge re-confirmation at 76cb83c5e)

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result: on head 47218c5e6, npx vitest run --project cli src/lib/onboard/docker-driver-gateway-service.test.ts src/lib/onboard/gateway-host-runtime-homebrew-untrusted-tap.test.ts passed 2 files and 89 tests, and npx vitest run --project plugin nemoclaw/src/security/credential-filter.test.ts passed 1 file and 8 tests. npm run validate:pr passed in full, including TypeScript (CLI), TypeScript (plugin), repository checks, and the source-shape and test-file budgets. The prior build-typecheck failure was stale-base only: test/package-contract/cli/policy-prompt-eof.test.ts failed on the old base with TypeError: (0 , channels_2.listChannels) is not a function, touches nothing this PR changes, and passes 2/2 on the refreshed head.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds with no new warnings (doc changes only) — 0 errors; the only 2 warnings are pre-existing and identical on pristine main

Signed-off-by: harjoth harjoth.khara@gmail.com

Summary by CodeRabbit

  • New Features
    • Enhanced macOS (Apple Silicon) onboarding to use the standalone OpenShell gateway when Homebrew cannot load the pinned official formula and the managed service is confirmed absent.
  • Documentation
    • Updated platform support, prerequisites, architecture, and troubleshooting guidance for Homebrew refusal and fallback scenarios.
  • Bug Fixes
    • Improved service-state handling with clearer warnings and safe failure when a Homebrew-managed gateway is already active or cannot be verified.
  • Tests
    • Added coverage for Homebrew refusal, service detection, fallback behavior, and gateway startup decisions.

…enShell formula

Homebrew 6.x refuses to load formulae from taps it has not marked trusted,
so brew info fails for the pinned nvidia/openshell tap and the formula
identity check aborted onboarding before preflight. Treat an unconfirmed
identity as no managed Homebrew service: warn once with brew's own reason
and continue on the standalone gateway. Positive evidence of a missing or
wrong-tap formula still fails closed.

Refs: NVIDIA#7707
Signed-off-by: harjoth <harjoth.khara@gmail.com>
…ebrew formula identity

Refs: NVIDIA#7707
Signed-off-by: harjoth <harjoth.khara@gmail.com>
Cross-review found the fallback too broad: any brew info failure skipped
the identity gate, and the standalone path can still execute a
brew-installed binary. Only the refusal that names the pinned
nvidia/openshell formula and tap now degrades to the standalone
fallback; every other failure keeps the fail-closed abort.

Refs: NVIDIA#7707
Signed-off-by: harjoth <harjoth.khara@gmail.com>
…arning and docs

Refs: NVIDIA#7707
Signed-off-by: harjoth <harjoth.khara@gmail.com>
@copy-pr-bot

copy-pr-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@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

Homebrew refusal handling now checks the pinned OpenShell formula refusal and the homebrew.mxcl.openshell launchd service. Onboarding uses the standalone gateway only when the service is confirmed missing. Tests and macOS documentation cover the updated behavior.

Changes

Homebrew fallback handling

Layer / File(s) Summary
Pinned-tap refusal handling
src/lib/onboard/docker-driver-gateway-service.ts
Recognizes the specific refusal, probes launchd state, warns once per refusal reason, selects the standalone fallback only when the service is missing, and keeps other failures fatal.
Gateway fallback validation
src/lib/onboard/docker-driver-gateway-service.test.ts, src/lib/onboard/gateway-host-runtime-homebrew-untrusted-tap.test.ts
Tests loaded, missing, and indeterminate launchd states, refusal variants, warning deduplication, managed startup, and standalone gateway resolution.
Platform behavior documentation
ci/platform-matrix.json, docs/get-started/prerequisites.mdx, docs/reference/{architecture,platform-support,troubleshooting}.mdx
Documents the exact refusal, launchd verification, standalone fallback, launchd ownership, and Xcode Command Line Tools guidance.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#8098: Both changes update gateway adoption and fallback logic, but this PR handles Homebrew and launchd state.
  • NVIDIA/NemoClaw#8106: Both changes update managed gateway fallback behavior and its tests.

Suggested labels: area: docs

Suggested reviewers: cv

Sequence Diagram(s)

sequenceDiagram
  participant Onboarding
  participant Homebrew
  participant Launchd
  Onboarding->>Homebrew: Check pinned OpenShell formula
  Homebrew-->>Onboarding: Return untrusted-tap refusal
  Onboarding->>Launchd: Probe homebrew.mxcl.openshell
  Launchd-->>Onboarding: Return service state
  Onboarding-->>Onboarding: Continue with standalone fallback or stop
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes address issue [#7707] by allowing the specific refusal, verifying no loaded launchd service, and preserving fail-closed behavior for other failures.
Out of Scope Changes check ✅ Passed The code, tests, and documentation changes directly support the Homebrew fallback behavior described in issue [#7707].
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 summarizes the main change: allowing onboarding to continue when Homebrew refuses the pinned OpenShell tap.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@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 terminology decisions differ; normalized E2E selections differ; severity counts match.
4 terminology differences from the second opinion

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

  • exact missing-service result at ci/platform-matrix.json:42: selected only by the second-opinion lane as justified.
  • pinned-formula untrusted-tap refusal at ci/platform-matrix.json:42: selected only by the second-opinion lane as justified.
  • detached standalone gateway fallback at ci/platform-matrix.json:42: selected only by the second-opinion lane as justified.
  • launchd lifecycle authority at docs/reference/architecture.mdx:115: 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.

  • full-e2e: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • gateway-guard-recovery: The completed second-opinion lane identified E2E coverage that the primary lane omitted.

Second-opinion terminology and E2E selections are advisory. They do not change the primary assessment or E2E / PR Gate.

3 semantic terminology decisions

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

  • define — pinned-formula untrusted-tap refusal at docs/reference/architecture.mdx:110: Define this term at first use as the exact Homebrew refusal for nvidia/openshell/openshell from nvidia/openshell.
  • established — lifecycle authority at docs/reference/architecture.mdx:115: Keep the established controlled term when naming launchd ownership.
  • established — standalone gateway fallback at ci/platform-matrix.json:42: Keep the established term and state its exact selection conditions.

E2E guidance

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

Recommended E2E: cloud-onboard, onboard-repair, onboard-resume

Workflow run details

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

@harjothkhara
harjothkhara marked this pull request as ready for review July 28, 2026 16:03

@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

🧹 Nitpick comments (1)
ci/platform-matrix.json (1)

42-42: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Keep generated platform notes to one sentence per source line.

The updated matrix note renders as multi-sentence Markdown table rows, which violates the documentation source rule.

  • ci/platform-matrix.json#L42-L42: rewrite the macOS note as one sentence while retaining the fallback details.
  • docs/get-started/prerequisites.mdx#L99-L99: regenerate after correcting the matrix note.
  • docs/reference/platform-support.mdx#L84-L84: regenerate after correcting the matrix note.

As per coding guidelines, “Keep one sentence per line in Markdown and MDX source files.”

🤖 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 `@ci/platform-matrix.json` at line 42, Rewrite the macOS note in
ci/platform-matrix.json at line 42 as a single sentence while preserving all
existing runtime, Homebrew, fallback, Colima, Docker CLI, and Xcode details;
then regenerate docs/get-started/prerequisites.mdx at line 99 and
docs/reference/platform-support.mdx at line 84 so their generated notes also
remain one sentence per source line.

Source: Coding guidelines

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

Inline comments:
In `@src/lib/onboard/docker-driver-gateway-service.test.ts`:
- Around line 197-218: Update the test for the unconfirmed formula identity in
startPackageManagedDockerDriverGateway to inject a throwing
startOpenShellGatewayUserService mock, then assert it was not called while
retaining the existing started === false assertion.

---

Nitpick comments:
In `@ci/platform-matrix.json`:
- Line 42: Rewrite the macOS note in ci/platform-matrix.json at line 42 as a
single sentence while preserving all existing runtime, Homebrew, fallback,
Colima, Docker CLI, and Xcode details; then regenerate
docs/get-started/prerequisites.mdx at line 99 and
docs/reference/platform-support.mdx at line 84 so their generated notes also
remain one sentence per source line.
🪄 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: dd6e495c-1f77-4376-be7a-855cc538c54a

📥 Commits

Reviewing files that changed from the base of the PR and between bbdd850 and d37a028.

📒 Files selected for processing (8)
  • ci/platform-matrix.json
  • docs/get-started/prerequisites.mdx
  • docs/reference/architecture.mdx
  • docs/reference/platform-support.mdx
  • docs/reference/troubleshooting.mdx
  • src/lib/onboard/docker-driver-gateway-service.test.ts
  • src/lib/onboard/docker-driver-gateway-service.ts
  • src/lib/onboard/gateway-host-runtime-homebrew-untrusted-tap.test.ts

Comment thread src/lib/onboard/docker-driver-gateway-service.test.ts Outdated
…-refusal fallback

Review found the fallback made the standalone cutover path reachable
while launchd still owned a loaded openshell service: cutover could
adopt that process or kill one launchd would restart. Probe launchctl
(which does not load the formula) before degrading and abort with
stop-the-service guidance while the unit is loaded. Also bound the
refusal match so taps that only start with the pinned name stay fatal,
and assert the managed start is never invoked in the fallback test.

Refs: NVIDIA#7707
Signed-off-by: harjoth <harjoth.khara@gmail.com>
@harjothkhara

Copy link
Copy Markdown
Contributor Author

@coderabbitai Declining the one-sentence-per-line nitpick on ci/platform-matrix.json:42. That guideline covers Markdown and MDX sources; this note is a JSON string field. The cell was already five sentences before this PR (container runtime, Homebrew, Colima, Docker CLI, Xcode notes) — this change only extends the existing Homebrew sentence. Rewriting the shared row as one sentence is out of scope here.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@harjothkhara Agreed — the Markdown/MDX one-sentence-per-line guideline does not apply to this JSON string field, and extending the existing Homebrew sentence is appropriately scoped. Withdrawing the nitpick.

🐇

Review found two fail-open edges in the tap-refusal fallback. The
launchd probe treated a launchctl that could not run as proof the
service was stopped; only a completed run that reports the unit missing
now permits the fallback. The refusal matcher compared a prefix, so a
neighbouring tap such as nvidia/openshell.fork still matched; it now
compares the named formula and tap exactly.

Refs: NVIDIA#7707
Signed-off-by: harjoth <harjoth.khara@gmail.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

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

Inline comments:
In `@src/lib/onboard/docker-driver-gateway-service.ts`:
- Around line 286-287: Update the launchctl result classification near the
status handling so `not-loaded` is returned only for the recognized missing-unit
status/stderr combination; classify other nonzero exits, including unrecognized
stderr, as `unknown` while preserving successful status handling. Add a
regression test covering an indeterminate nonzero launchctl failure and verify
the fallback path remains blocked.
🪄 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: d2a924bc-f7bf-4873-b04c-3d60dfa65614

📥 Commits

Reviewing files that changed from the base of the PR and between 3b75153 and ab87091.

📒 Files selected for processing (7)
  • ci/platform-matrix.json
  • docs/get-started/prerequisites.mdx
  • docs/reference/architecture.mdx
  • docs/reference/platform-support.mdx
  • docs/reference/troubleshooting.mdx
  • src/lib/onboard/docker-driver-gateway-service.test.ts
  • src/lib/onboard/docker-driver-gateway-service.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • docs/reference/troubleshooting.mdx
  • docs/reference/architecture.mdx
  • ci/platform-matrix.json
  • src/lib/onboard/docker-driver-gateway-service.test.ts

Comment thread src/lib/onboard/docker-driver-gateway-service.ts Outdated
harjothkhara and others added 3 commits July 28, 2026 10:10
…nit state

Review found the probe still read every completed nonzero exit as proof
the unit was absent. launchctl reports a missing service as exit 113
with "Could not find service"; only those signals now mean not-loaded,
and any other failure stays unknown and keeps the abort.

Refs: NVIDIA#7707
Signed-off-by: harjoth <harjoth.khara@gmail.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@wscurran wscurran added area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression platform: macos Affects macOS, including Apple Silicon labels Jul 28, 2026
@wscurran

Copy link
Copy Markdown
Contributor

✨ Thanks for the PR. This fixes onboarding to continue with a standalone gateway fallback when Homebrew 6.x refuses the pinned nvidia/openshell tap. Maintainers will review the fallback logic, warning behavior, and that other identity-check failures still fail closed.


Related open issues:


Related open issues:

@cjagwani

cjagwani commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@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

🤖 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 96-100: The Homebrew formula detection flow must fail closed for
unrecognized brew list failures. In hasOfficialHomebrewFormula, return false
only when allowStandaloneForPinnedTapLoadRefusal accepts the failed probe;
otherwise throw the formula identity error, and add a test covering an altered
brew list diagnostic. Apply this guidance to docs/reference/architecture.mdx
lines 96-100 and docs/reference/troubleshooting.mdx lines 936-940; both sites
require the same behavior update.
🪄 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: 7337ea00-a619-40fa-9023-29ff39e3d769

📥 Commits

Reviewing files that changed from the base of the PR and between 48d2974 and 4c1c55b.

📒 Files selected for processing (5)
  • ci/platform-matrix.json
  • docs/get-started/prerequisites.mdx
  • docs/reference/architecture.mdx
  • docs/reference/platform-support.mdx
  • docs/reference/troubleshooting.mdx
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/get-started/prerequisites.mdx
  • docs/reference/platform-support.mdx

Comment thread docs/reference/architecture.mdx
Comment thread src/lib/onboard/docker-driver-gateway-service.test.ts Fixed
Comment thread src/lib/onboard/gateway-host-runtime-homebrew-untrusted-tap.test.ts Fixed
@github-actions github-actions Bot added v0.0.102 and removed v0.0.101 labels Aug 3, 2026
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>

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

Security review PASS for revision 5307aa8. Categories reviewed: secrets, input validation, authorization and lifecycle authority, dependencies, logging, cryptography, configuration, tests, and failure modes. The official Apple Silicon missing-keg diagnostic and complete pinned-tap refusal retain their bounded fallback paths; every other list failure stops with a redacted error before launchd inspection or service mutation. Focused suites pass 89/89, and the CLI build, type check, repository checks, and hooks pass. No findings remain.

@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Merge-train status: this branch revision merges cleanly with current main; 89 focused onboarding tests passed and the documentation build completed successfully.

The ordinary protected fork workflow was approved, but the branch's PR workflow predates the controller's current run-identity contract. The base-branch coordinator therefore skipped the completed run and cannot produce the required E2E risk plan. A contributor-authorized branch synchronization is required before normal CI and protected E2E can complete. No gate exception or bypass is requested.

@harjothkhara

Copy link
Copy Markdown
Contributor Author

Synced the branch onto current main as requested. Merge commit 76cb83c5e, no conflicts. This picks up #7862, so the coordinator can identify the run.

The focused onboarding suites still pass 89/89 after the merge, and I refreshed the documentation writer review metadata for the new head.

One thing that still needs a maintainer: the new head has not been vetted, so the pull_request workflows are all sitting at action_required and no PR CI run exists for 76cb83c5e. E2E / PR Gate Coordination reports "Waiting for PR CI", so it cannot produce the risk plan until that CI is allowed to start.

cv added a commit that referenced this pull request Aug 4, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Recent main changes left managed-image validation and platform-watch
fixtures out of sync with their production contracts. This change
restores those gates without weakening package identity, provenance, or
forward ownership checks.

## Changes

- Align the Hermes managed-image capability checks with the reviewed
`aiohttp==3.14.3` update from #8203.
- Validate neutral OpenClaw plugin packages from the installed project
directories because OpenClaw 2026.7.1 does not persist
`plugins.installs` metadata.
- Validate Google Chat with the rest of the installed OpenClaw
capability union.
- Match the BuildKit SLSA base-dependency URI emitted for digest-pinned
images while retaining the separate digest check.
- Mark the Ubuntu container checkout as a Git safe directory and verify
`HEAD` before generating build identity.
- Make the VM-driver snapshot fixture report the all-interface forward
binding required on WSL.
- Leave the macOS Homebrew failure to existing PR #7739, which has the
focused product fix.

## Type of Change

- [x] 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

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: This repair changes CI
validation and platform test fixtures. It does not change a supported
user command, configuration, workflow, or default.
- [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: Pending review of
managed-image provenance and package-identity validation.
- [ ] 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: `blocked`
- Evidence: No documentation paths changed. This host has no independent
documentation-writer subagent, so the required final review is pending.
- Agent: Pi coding agent
<!-- docs-review-head-sha: 6cd1da3 -->
<!-- docs-review-agents-blob-sha:
3dd7c24 -->

## 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 — 6 integration files / 60 tests passed;
WSL-bound snapshot fixture passed 5/5; review follow-ups passed 33 and
15 focused tests; repository checks, ShellCheck, and normal hooks
passed; the repaired verifier accepted the failed main Deep Agents
attestation.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: GitHub CI will run the
broad gate; the redundant local broad run was stopped after focused
validation passed.
- [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)
- [ ] 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: Carlos Villela <cvillela@nvidia.com>


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

- **Bug Fixes**
- Improved managed image validation for Google Chat and plugin
installation consistency.
- Updated Hermes image checks to use the latest approved `aiohttp`
version.
  - Improved dashboard traffic forwarding behavior in WSL environments.
- Corrected Docker dependency evidence generation for platform-specific
image references.

- **Reliability**
  - Added safeguards to ensure builds use the intended source revision.
- Expanded automated checks for image publication, plugin configuration,
and workflow integrity.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

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

Requesting changes because this PR changes lifecycle authority instead of completing NemoClaw's existing Homebrew trust contract.

PR #7555 deliberately trusts only the checksum-verified nvidia/openshell/openshell formula and removes that trust after installation. At head 181e1bffd, src/lib/onboard/docker-driver-gateway-service.ts:516 treats the expected post-install Homebrew 6 refusal as an unavailable package-managed service. It then selects the detached standalone gateway when the launchd unit is absent. The installer can therefore stage a Homebrew-managed service that onboarding immediately abandons.

Please preserve the supported Homebrew path:

  • Extract pinned-checksum verification and formula-scoped trust/untrust into one reusable Homebrew operation boundary.
  • Use that boundary during installation and subsequent formula inspection plus service start and stop operations.
  • For a legacy installation that cannot satisfy pinned verification, stop with an actionable repair instruction or rerun the pinned installer.
  • Use the standalone fallback only when Homebrew or the OpenShell formula is genuinely absent.
  • Do not use one exact Homebrew stderr sentence as the durable compatibility contract.
  • Do not persist formula trust, trust the complete tap, or set HOMEBREW_NO_REQUIRE_TAP_TRUST.
  • Fail closed when formula trust cannot be granted or removed.

This design keeps trust scoped to the verified formula and the named operation. It also keeps Homebrew as lifecycle authority for a Homebrew installation.

Please add behavior tests for inspection, start, stop, repair guidance, missing Homebrew, missing formula, trust refusal, and untrust cleanup failure. Update the changed documentation to describe the resulting repair and fallback boundaries.

@harjothkhara

Copy link
Copy Markdown
Contributor Author

Agreed. If the installer removes formula trust after install, that refusal is the expected state, not a missing service — keying the fallback off it reads the condition backwards.

Two questions before I start:

  1. @apurvvkumaria approved this approach on 08-03 with a security pass, and 5307aa842 is their commit. Which design should win?
  2. Does the boundary extraction belong here or in a follow-up? Recent commits are from @cjagwani, @apurvvkumaria and @cv — if maintainers are carrying this branch, say so and I'll stay clear.

Happy to do the work once the direction is set.

@github-actions github-actions Bot added v0.0.103 and removed v0.0.102 labels Aug 4, 2026
@cjagwani cjagwani added v0.0.104 Release target and removed v0.0.103 labels Aug 5, 2026
@harjothkhara

Copy link
Copy Markdown
Contributor Author

Refreshed onto current main at 47218c5e6 — a signed, verified merge, no conflicts. The effective diff is the same nine files, so scope and attribution are unchanged.

The previous red CI was stale base only. build-typecheck failed on test/package-contract/cli/policy-prompt-eof.test.ts with TypeError: (0 , channels_2.listChannels) is not a function; that file and the channels module are untouched by this PR, and it passes 2/2 on the refreshed head. checks and E2E / PR Gate were both reporting that same job — the gate said it dispatched no run because CI had not passed — so all three clear together.

Validation on the new head: focused onboarding suites 89/89, plugin credential-filter 8/8, and npm run validate:pr passes in full. Docs receipt refreshed. main also moved the receipt procedure into CONTRIBUTING.md and DORI routing into docs/AGENTS.md, so the hidden AGENTS.md blob changes to c69aad4d5 with no rule change affecting this PR. docs/reference/troubleshooting.mdx changed on main again; the merged result was inspected and this PR's five lines remain correctly placed.

@jyaunches the design question in your review is untouched by this refresh and still open. Before I rebuild, I want to make sure I build the right thing: should the reusable Homebrew operation boundary wrap each pinned-verification-plus-trust-plus-untrust cycle per operation, or hold trust across a single onboarding run and untrust once at the end? The first is stricter and what I read you as asking for, but it re-verifies on every inspection, start, and stop.

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

Labels

area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression platform: macos Affects macOS, including Apple Silicon v0.0.104 Release target

Projects

None yet

9 participants