Skip to content

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

Open
harjothkhara wants to merge 29 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 29 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.
  • 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: focused gateway suites 89/89 passed; npm run build:cli, npm run typecheck:cli, npm run checks, changed-file hooks, commit hooks, and pre-push checks passed.
  • 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 and concisely describes the main fix for Homebrew refusing the pinned OpenShell tap during onboarding.
✨ 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 · medium 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.
2 terminology differences from the second opinion

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

  • missing-service result at ci/platform-matrix.json:42: selected only by the second-opinion lane as define.
  • pinned-formula untrusted-tap refusal at ci/platform-matrix.json:42: selected only by the second-opinion lane as define.
3 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.
  • openclaw-slack-pairing: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • hermes-e2e: 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.

  • established — lifecycle authority at docs/reference/architecture.mdx:115: Keep the established controlled term for launchd ownership.
  • justified — pinned-formula untrusted-tap refusal at docs/reference/architecture.mdx:110: Keep the modifier because it names the exact diagnostic accepted by the fallback gate.
  • established — standalone gateway fallback at ci/platform-matrix.json:42: Keep the established term; the surrounding conditions accurately narrow its selection.

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:

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

Copy link
Copy Markdown
Collaborator

Exact head fcc6702649093ef69bd8527b8f072ab12cc883cd has now passed the substantive ordinary PR CI retry. The refreshed E2E coordination selected cloud-onboard, onboard-repair, and onboard-resume, but it requires a manual legacy approve-e2e dispatch for fork code. I am not authorizing repository credentials to run fork code through that legacy path.

No additional code change is requested here. The remaining blocker is trusted E2E evidence for this exact head/base pair, or a maintainer-approved safe replacement/waiver. I will keep monitoring this PR without submitting a Changes Requested review.

@apurvvkumaria
apurvvkumaria enabled auto-merge (squash) July 30, 2026 21:58
@cjagwani
cjagwani dismissed their stale review July 31, 2026 00:59

Superseded by current head fcc6702; exact-head follow-up is waiting on credential-safe E2E evidence. No Changes Requested review is being submitted.

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

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.102 Release target

Projects

None yet

9 participants