Skip to content

feat(onboard): add --dashboard-origin for managed OpenClaw dashboards - #13218

Open
kaofelix wants to merge 68 commits into
mainfrom
issues/13177-dashboard-origins
Open

kaofelix wants to merge 68 commits into
mainfrom
issues/13177-dashboard-origins

Conversation

@kaofelix

@kaofelix kaofelix commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Outcome

Onboarding a managed OpenClaw sandbox can now allow extra dashboard browser origins that keep their own port, such as https://launchpad.example.com:8443 in front of the dashboard on 18789. Before, the only input was CHAT_UI_URL, whose port onboarding replaces with the dashboard port, so OpenClaw rejected a proxy origin on another port.

This PR builds on #13198, which merged on October 16, and targets main.

Reason

The decision on #13177 accepts a separate onboard setting for this case: #13177 (comment). nemoclaw <sandbox> config set refuses gateway.* keys, so there was no supported host-side way to add such an origin.

Related issues

Refs #13177

Changes

  • Input: a repeatable nemoclaw onboard --dashboard-origin <origin> flag and NEMOCLAW_DASHBOARD_ORIGINS (comma-separated). Each value must be a bare origin, and a remote origin must use https. Invalid values fail before onboarding starts.
  • Config generator: scripts/generate-openclaw-config.mts reads NEMOCLAW_DASHBOARD_ORIGINS, validates it again, and appends the origins to gateway.controlUi.allowedOrigins. It does not change the dashboard bind or mode.
  • Managed startup profile: the OpenClaw dashboard section gets an optional extraOrigins key. It is omitted when no origin is set, so existing profiles encode the same as before. The image maps the key to NEMOCLAW_DASHBOARD_ORIGINS only when it is present. The reviewed in-image runtime bundle is regenerated.
  • Registry: dashboardOrigins is recorded at creation and on reuse. The registry and gateway index accept only a normalized list.
  • Rebuild: rebuild replays the registry record into the replacement profile and into the inner onboard, so the replacement keeps them. An exported NEMOCLAW_DASHBOARD_ORIGINS does not change a rebuild.
  • Reuse: re-running onboard on a running sandbox records or clears the origins and says that a rebuild applies the change.
  • Refusals: onboarding refuses the setting for Dockerfile builds (--from or the Dockerfile fallback) and for agents other than OpenClaw, instead of dropping it.
  • Docs: docs/reference/commands.mdx documents the flag and the variable.

The decision comment originally described a Dockerfile build argument as well. The root Dockerfile has a growth budget that requires new onboarding behavior to use the managed startup profile, so the comment was edited to make the setting managed-image only.

Verification

Validation for merge commit 7336192b76 against 997d5748a4 ran in a container without host credentials:

  • Reviewed runtime bundle verification: passed with the merged dependency locks.
  • Focused CLI suites: 43 files, 1,087 tests passed, including dashboard origins and the updated rebuild recovery cases.
  • Focused integration suites: 4 files, 52 tests passed and 2 skipped. These cover generated origins, runtime bundle pins, Dockerfile payloads, and sandbox build staging.
  • Dashboard target selection and environment: 33 E2E-support tests passed.
  • Commit hooks and publication validation: passed, including source architecture, growth limits, Dockerfile lint, and secret scans.
  • Pre-push CLI and checked-JavaScript compiler gates: passed. The plugin compiler gate had no applicable changed files.
  • Diff inspection found no credentials or new product scope.

Historical evidence: npm run docs passed on 179e1ae951 with zero errors and two warnings. dashboard-remote-bind on b95f6a5c3 passed for OpenClaw and Hermes, including the OpenClaw rebuild-origin assertions. These results do not establish live evidence for the merged revision.

Receipt refresh 452aeabc9f records the Linux AMD64 and ARM64 Pi images qualified together by successful managed-images run 41696614823 for source 7336192b76. The trusted-main collector authenticated both artifacts and checked their digests, source revision, cohort, platforms, and release. Both receipt hashes match the updated authority, and strict source-parity validation passed. The refresh changes only the two receipts and their authority hashes.

CI on 7336192b76 finished with the expected missing-receipt rejection and inherited synthetic hook-test timeouts. The adapter shard passed its one retry. Formatting and plugin shards repeated the 15-second deadline on their one retry each; those failures remain unresolved. The tests and their copied inputs match main 997d5748a4; focused unchanged Linux runs passed all 9 formatting, 9 plugin, and 18 adapter cases. The precise CI timing cause remains unproven. CI and automated reviews on the receipt refresh are pending; these results do not establish merge readiness.

Review notes

  • Merge 7336192b76 resolves the three qualification-file conflicts with main 997d5748a4. The origin feature and main's security and rebuild recovery changes are retained. The combined source was qualified by managed-images run 41696614823; receipt refresh 452aeabc9f records that evidence.
  • Three adjacent Dockerfile COPY instructions now share one statement with the same destination paths. This keeps the Dockerfile at main's line count and reduces its byte count by 31, without relying on the PR-specific growth exception.
  • Conflict resolution preserves the newer Hermes routing profile fields and the OpenClaw dashboard origins. Generated assertion budgets and the reviewed runtime bundle were regenerated from the merged source.
  • Review context: this session inspected 7336192b76 against 997d5748a4 in NVIDIA/NemoClaw, including qualification conflict resolution, retained origin handling, and auto-merged build staging. No additional source defect was identified. CodeRabbit skipped incremental review on 7336192b76, and no full review or Advisor specialist review was scheduled for that revision. Independent review of the combined revision is pending. The nine clear Advisor specialist results on b95f6a5c3 remain historical evidence.
  • Older CLI: a CLI from before this change rejects a recorded profile that contains extraOrigins. This affects only a sandbox onboarded with the flag, after a downgrade or with an older CLI sharing ~/.nemoclaw. Rebuild, clone, and managed snapshot restore then fail before changing anything.
  • Hermes is unchanged. Its browser URL has the same port rewrite; a Hermes change needs its own reproduction.
  • Release notes: the next release entry should mention --dashboard-origin and NEMOCLAW_DASHBOARD_ORIGINS for managed OpenClaw images, and that a rebuild applies recorded changes. This PR does not add a dated docs/changelog/ file, because release entries are written per release; the flag is documented in docs/reference/commands.mdx.

Signed-off-by: Kao Félix me@kaofelix.dev

Summary by CodeRabbit

  • New Features
    • Added support for configuring extra browser origins for managed OpenClaw dashboards during onboarding, using repeatable options or an environment variable.
    • Dashboard origins are saved with the sandbox, restored during onboarding resumes and rebuilds, and checked against allowed formats and limits.
    • Rebuilds retain saved origins and warn when exported settings differ from the recorded configuration.
  • Documentation
    • Updated the command reference with origin configuration options, validation rules, and rebuild guidance.

Rebuild reset OpenClaw gateway.controlUi.allowedOrigins to loopback because the
managed replacement profile and the custom-image recreate path hardcoded
http://127.0.0.1:<port>. Replay the registry's dashboardExternalUrl instead,
falling back to the previous profile's external URL for older records, and
rebind it to the replacement dashboard port.

An exported CHAT_UI_URL during rebuild is ignored with an explicit warning that
names how to change the origin. --control-ui-port now selects only the port and
keeps the CHAT_UI_URL host. Re-onboarding a running OpenClaw sandbox with a new
or removed origin says that a rebuild applies it.
…g generator

Add NEMOCLAW_DASHBOARD_ORIGINS to the OpenClaw config generator. Each entry
is a bare origin that keeps its own port; a remote origin must use https.
The generator adds the origins to gateway.controlUi.allowedOrigins after the
loopback and CHAT_UI_URL origins. Add the host-side parser that onboarding
will use for the flag and environment value.

Refs #13177
Add a repeatable onboard --dashboard-origin flag and NEMOCLAW_DASHBOARD_ORIGINS
for browser origins that keep their own port, such as a proxy on 8443 in
front of the dashboard on 18789. Each value is a bare origin; a remote
origin must use https.

The origins are recorded in the sandbox registry and in an optional
extraOrigins key of the OpenClaw managed startup profile. The managed image
adds them to gateway.controlUi.allowedOrigins. The profile omits the key
when no origin is set, so existing profiles stay unchanged.

Rebuild replays the recorded origins, and re-running onboard records or
clears them with a note that a rebuild applies the change. Onboarding
refuses the flag for Dockerfile builds and for agents other than OpenClaw.

Refs #13177
@kaofelix kaofelix self-assigned this Oct 15, 2026
@copy-pr-bot

copy-pr-bot Bot commented Oct 15, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Important

Review skipped

We couldn't safely recover the incremental review. No full review was started, and the last reviewed checkpoint was preserved. Retry later, or explicitly request a full review by commenting @coderabbitai full review.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
Walkthrough

OpenClaw onboarding now accepts validated extra dashboard origins through a flag or environment variable. The origins are applied to generated configuration and stored with sandbox state. Rebuild, resume, reuse, and clone paths carry recorded origins forward.

Changes: Dashboard origin configuration and lifecycle

Layer / File(s) Summary
Validate origins and apply them to OpenClaw configuration
src/lib/dashboard/url.ts, scripts/generate-openclaw-config.mts, test/generation/*, src/lib/sandbox/build-context.ts, Dockerfile, test/runtime/sandbox/*
Shared parsing normalizes and validates origins. Configuration generation adds them to OpenClaw’s allowed-origin list. Runtime staging includes the URL utilities.
Resolve onboarding input and build managed profiles
src/lib/onboard/command-support.ts, src/lib/onboard/command.ts, src/lib/actions/onboard.ts, src/lib/onboard/managed-startup/*, src/lib/onboard/sandbox-create/orchestration.ts, src/lib/onboard/managed-workload/*, docs/reference/commands.mdx
Onboarding combines --dashboard-origin values with NEMOCLAW_DASHBOARD_ORIGINS. It restricts configured origins to OpenClaw managed images and passes them into startup profiles.
Persist origins across onboarding, reuse, and clone
src/lib/onboard/session-bootstrap.ts, src/lib/onboard/resume-config.ts, src/lib/onboard/machine/*, src/lib/onboard/sandbox-registration.ts, src/lib/onboard/sandbox-reuse.ts, src/lib/onboard/workload/clone.ts, src/lib/state/*
Session metadata and sandbox registry entries retain dashboard origins. Resume checks requested origins, and reuse and clone paths update or carry the recorded values.
Replay recorded origins during rebuild
src/lib/actions/sandbox/*, test/e2e/live/dashboard-remote-bind.test.ts, test/e2e/*, ci/e2e-assertion-*.json, tools/e2e/target-catalogue.mts
Rebuild uses recorded origins in replacement profiles and reports when ambient origin settings are ignored. E2E coverage verifies onboarding and rebuild behavior.

Pi agent qualification records

Layer / File(s) Summary
Update qualification image and receipt digests
ci/pi-agent-qualification-v1-linux-*.json, src/lib/agent/candidate-authority.ts
The Linux amd64 and arm64 qualification records and the accepted Pi receipt digests are updated.

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

Change: Feature · Severity of issue fixed: Medium

Sequence Diagram(s)

sequenceDiagram
  participant OnboardCommand
  participant OriginParser
  participant StartupProfile
  participant SandboxRegistry
  participant RebuildHandoff
  participant ConfigGenerator
  OnboardCommand->>OriginParser: validate flag and environment origins
  OriginParser-->>OnboardCommand: return normalized origins
  OnboardCommand->>StartupProfile: pass dashboardOrigins
  StartupProfile->>SandboxRegistry: store dashboardOrigins
  SandboxRegistry->>RebuildHandoff: supply recorded origins
  RebuildHandoff->>ConfigGenerator: apply origins to allowedOrigins
Loading

Possibly related issues

  • NVIDIA/NemoClaw#13177 — The changes add configurable extra origins and replay recorded values during rebuild, addressing the issue’s reported origin handling behavior.

Suggested labels: area: cli, area: sandbox

Suggested reviewers: ericksoa, prekshivyas

Merge Risk: Low · previous review c445e

The feature looks sound and is covered by unit and live tests. Before merging, redact the exported origins value in the rebuild warning. Consider rejecting --dashboard-origin together with --from or --from-image up front. Consider adding a real gateway Origin probe to the live test. None of these is likely to cause serious production failures.

Pre-merge checks: Passed 4
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title "feat(onboard): add --dashboard-origin for managed OpenClaw dashboards" matches the main change. The changeset adds a repeatable --dashboard-origin flag and NEMOCLAW_DASHBOARD_ORIGINS suppor…
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.
Full details: Title check

Explanation

The title "feat(onboard): add --dashboard-origin for managed OpenClaw dashboards" matches the main change. The changeset adds a repeatable --dashboard-origin flag and NEMOCLAW_DASHBOARD_ORIGINS support to onboarding for managed OpenClaw dashboards. The changes also cover validation, registry and profile recording, rebuild replay, clone, and resume, which the title does not name. The title is specific, concise, and follows the conventional-commit style. It does not describe anything absent from the changeset.

Finishing Touches
Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.

@github-code-quality

github-code-quality Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Code coverage overview

Languages: TypeScript

TypeScript / code-coverage/plugin

main 63002cd issues/13177-dashboa... 452aeab +/-
96% 97% +1%
View coverage of the 10 most impacted files.
File main 63002cd issues/13177-dashboa... 452aeab +/-
nemoclaw/src/sh...cy-boundary.cts 100% 97% -3%
nemoclaw/src/onboard/config.ts 98% 96% -2%
nemoclaw/src/ru...time-context.ts 100% 99% -1%
nemoclaw/src/bl...print/runner.ts 95% 95% 0%
nemoclaw/src/bl...ime-identity.ts 97% 97% 0%
nemoclaw/src/bl...t-management.ts 100% 100% 0%
nemoclaw/src/index.ts 94% 99% +5%
nemoclaw/src/de...search-state.ts 0% 100% +100%
nemoclaw/src/on...native-route.ts 0% 100% +100%
nemoclaw/src/search-config.ts 0% 100% +100%

TypeScript / code-coverage/cli

main 63002cd issues/13177-dashboa... 452aeab +/-
84% 86% +2%
View coverage of the 10 most impacted files.
File main 63002cd issues/13177-dashboa... 452aeab +/-
src/lib/onboard.ts 62% 50% -12%
src/lib/actions...ess-recovery.ts 65% 81% +16%
src/lib/inferen...ollama/proxy.ts 41% 61% +20%
src/lib/onboard.../application.ts 55% 84% +29%
src/lib/domain/...y/dimensions.ts 0% 73% +73%
src/lib/inferen...er/lifecycle.ts 0% 75% +75%
src/lib/actions...ry/operation.ts 0% 76% +76%
src/lib/actions...try/snapshot.ts 0% 83% +83%
src/lib/inferen...ovider/index.ts 0% 88% +88%
src/lib/actions...ned-recovery.ts 0% 93% +93%

ℹ️ Calculations represent line coverage. Results may change as calculations are updated.


Updated November 03, 2026 22:48 UTC

@kaofelix

Copy link
Copy Markdown
Collaborator Author

Live onboard and rebuild with an extra origin

Run against this PR's head 1e1ee70e6. Host: Linux amd64, Docker driver, OpenShell 0.0.116, NVIDIA hosted provider (build). Both branches include main with #13051.

  1. Onboard with CHAT_UI_URL=https://dash.example.test and --dashboard-origin https://dash.example.test:8443.
    • Workload: managed-image.
    • Registry: dashboardOrigins = ["https://dash.example.test:8443"].
    • Sandbox gateway.controlUi.allowedOrigins: http://127.0.0.1:18789, https://dash.example.test:18789, https://dash.example.test, https://dash.example.test:8443. The extra origin keeps port 8443.
  2. Rebuild with CHAT_UI_URL=https://other.example.test and NEMOCLAW_DASHBOARD_ORIGINS=https://ambient.example.test:9443 exported.
    • The sandbox was recreated and is Ready.
    • allowedOrigins is identical to step 1, including https://dash.example.test:8443. It contains neither exported value. The registry is unchanged.
    • The rebuild printed the Ignoring CHAT_UI_URL=... warning from fix(rebuild): keep the recorded OpenClaw dashboard origin #13198. It ignored NEMOCLAW_DASHBOARD_ORIGINS without a warning.

Local setup differences from a release install:

  • The managed images come from CI run 38661431968 for this commit. Onboard used --temp-managed-runtime-catalog with the catalog assembled from that run's contracts.
  • Rebuild has no catalog flag, so it got the same catalog through the live E2E catalog variables (GITHUB_ACTIONS=true, NEMOCLAW_RUN_LIVE_E2E=1, NEMOCLAW_E2E_MANAGED_IMAGE_CATALOG_JSON).
  • The CLI build identity was bound to the run's release, as the CI activation job does.

The managed startup runtime bundle changed for dashboard origins, and Pi
images copy that bundle. Refresh both Pi qualification receipts from the
AMD64 and ARM64 Pi candidate contracts published by workflow run
38661431968, attempt 1, for 1e1ee70. Update the candidate authority to
their exact SHA-256 digests and the image contract test to the reviewed
bundle digest.

Refs #13177
Address the PR Review Advisor findings on #13218:
- The config generator no longer repeats the origin policy. The managed
  startup profile validates origins with parseDashboardOrigins before mapping
  them; the generator only refuses an entry that is not a bare origin.
- A clone now records the rebound profile's extra origins on its registry
  entry, so a later rebuild of the clone keeps them.
- The removal procedure now says to unset NEMOCLAW_DASHBOARD_ORIGINS too.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor findings on d39e842

All four P1 findings are fixed in 19bec2fa0. They had three causes.

  • Two owners of the origin policy (architecture, reduction): the config generator no longer repeats the rules. The managed startup profile validates origins with parseDashboardOrigins before it maps them to NEMOCLAW_DASHBOARD_ORIGINS, and the profile is the only producer of that variable. The generator now only refuses an entry that is not a bare origin, so a malformed value cannot widen allowedOrigins. Its tests now cover that narrower job.
  • Clone dropped the origins (migration): the clone handoff now records the rebound profile's extraOrigins as dashboardOrigins on the clone's registry entry, so a later rebuild of the clone keeps them. New test: src/lib/onboard/managed-workload-clone-dashboard-origins.test.ts, which failed before the fix. Nothing in production calls this handoff yet.
  • Removal docs (documentation): the procedure now says to unset NEMOCLAW_DASHBOARD_ORIGINS as well as dropping --dashboard-origin. The CLI error messages already named both.

d39e842 also refreshed both Pi qualification receipts and the reviewed bundle pin, because Pi images copy the regenerated startup bundle. The receipts come from the Pi candidate contracts of workflow run 38661431968, attempt 1, for 1e1ee70e6. Later commits do not change Pi image inputs.

…nored

Rebuild replays the dashboard origins recorded at onboarding. An exported
NEMOCLAW_DASHBOARD_ORIGINS was ignored without a word, unlike CHAT_UI_URL.
Print the same kind of warning when the export names different origins,
with the onboard command that changes them. Equivalent spellings of the
recorded origins stay quiet.

Refs #13177
Address the second PR Review Advisor pass on #13218:
- Onboarding refuses --dashboard-origin and NEMOCLAW_DASHBOARD_ORIGINS for
  agents other than OpenClaw before it changes state. The startup profile
  builder refuses them too, instead of dropping them.
- parseDashboardOrigins rejects more than 16 origins, and the docs state
  the limit.
- The config generator enforces the same rules before it writes
  allowedOrigins: a bare http(s) origin, https unless loopback, and at
  most 16. It runs in the image without the shared module; tests keep
  the two in step.
- Regenerate the reviewed runtime bundle and update its pin. The Pi
  qualification receipts are refreshed in a following commit, once CI
  publishes Pi candidate images for this change.

Refs #13177
Pi images copy the managed startup runtime bundle, which changed in
db164d1. Refresh both Pi qualification receipts from the AMD64 and ARM64
Pi candidate contracts published by workflow run 38713442902, attempt 1,
for db164d1, and update the candidate authority to their exact SHA-256
digests.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor findings on 3fbe888

The second pass reported five P1 findings with three causes. All are fixed in db164d105. 72d5eb4f3 refreshes the Pi receipts for that change.

  • Other agents silently dropped the setting (customer value, documentation): resolveOnboardOptions now refuses --dashboard-origin and NEMOCLAW_DASHBOARD_ORIGINS for any agent other than OpenClaw before onboarding changes state. The startup profile builder refuses them too, so a direct caller cannot drop them. New tests cover Hermes, Deep Agents Code, and the variable on its own.
  • The generator accepted origins that onboarding refuses (reduction, verification): the generator now enforces the same rules before it writes allowedOrigins: a bare http(s) origin, https unless the host is loopback, and at most 16 entries. It cannot import parseDashboardOrigins because the image does not ship that module, and adding it would grow the root Dockerfile past its budget. Its tests now cover remote http, a non-http scheme, user information, and 17 origins. Three of them failed against the previous generator.
  • The 16-origin limit was undocumented (documentation): parseDashboardOrigins now rejects more than 16 origins for the flag and the variable, not only for a recorded profile. docs/reference/commands.mdx states the limit.

The reviewed runtime bundle changed again, so its pin is updated. Both Pi qualification receipts now come from the Pi candidate contracts of workflow run 38713442902, attempt 1, for db164d105.

Address the third PR Review Advisor pass on #13218:
- The config generator now normalizes origins the same way
  parseDashboardOrigins does, so a trailing slash, uppercase scheme or
  host, or a default port that onboarding accepts no longer fails the
  image build. A test compares the generator output with the shared
  parser.
- The docs say --dashboard-origin is refused with --from-image as well as
  --from and the Dockerfile fallback.

Refs #13177
@kaofelix

kaofelix commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor findings on 72d5eb4, and a question about live E2E

Two of the three findings are fixed in 800f8a374:

  • Docs: the restriction now says --dashboard-origin is refused with --from, --from-image, and the Dockerfile fallback.
  • Generator vs. onboarding: the generator rejected an origin that onboarding accepts, such as a trailing slash or an uppercase host. It now normalizes origins the same way as parseDashboardOrigins, and a test compares the two; that test failed before the fix. The generator still has its own copy of the checks: it runs inside the image, which doesn't ship src/lib/dashboard/url.ts, and the root Dockerfile size budget refuses new COPY lines.

Open: should this PR add live E2E coverage?

The third finding asks to extend the dashboard-remote-bind live E2E so it:

  1. onboards managed OpenClaw with an HTTPS origin on its own port,
  2. checks that the running sandbox's gateway.controlUi.allowedOrigins contains it,
  3. rebuilds, and checks again.

The decision on #13177 lists one live onboard-and-rebuild check in its validation plan. I ran that check by hand on this branch; the evidence is in the earlier comment. Unit and integration tests cover parsing, the registry, the startup profile, the generated config, and rebuild replay. Only a live run shows that the managed image applies the recorded origins.

The live case would install NemoClaw for real, needs the hosted inference secret, and runs only on the E2E runners.

Options:

  • A. Add an opt-in case to dashboard-remote-bind in this PR and validate it with one dispatched E2E run.
  • B. Track it as a follow-up issue and rely on the manual evidence for this PR.
  • C. No live coverage beyond the manual run.

Which do you recommend?

Address the PR Review Advisor findings on #13198:
- Test that a failed inner onboard still receives the recorded dashboard
  origin and that the ambient CHAT_UI_URL is restored afterwards.
- Document that changing or clearing CHAT_UI_URL for an existing
  sandbox takes effect only after a rebuild.

Refs #13177
Address the PR Review Advisor findings on #13218:
- Canonicalize NEMOCLAW_AGENT before the OpenClaw-only dashboard-origin
  check, so an alias such as nemoclaw is accepted and nemohermes is
  still refused.
- The config generator names a rejected NEMOCLAW_DASHBOARD_ORIGINS entry
  by position instead of echoing it, so user information is not printed.
- Document that origins added or changed for an existing sandbox apply
  only after a rebuild.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor findings on 800f8a3

Fixed in 4e4638a03:

  • Agent alias: onboarding now maps an OpenClaw alias such as NEMOCLAW_AGENT=nemoclaw to openclaw before the OpenClaw-only check. nemohermes is still refused. Tests cover both.
  • Generator error: a rejected NEMOCLAW_DASHBOARD_ORIGINS entry is named by position (entry 2) instead of echoed, so user information in it is not printed. A test checks that the user name and password are absent.
  • Docs: origins added or changed when you onboard an existing sandbox again apply only after nemoclaw <name> rebuild.

Not changed:

The branch also includes 39bcf1bde from #13198.

The image config generator kept its own copy of the dashboard-origin
rules, and the copy already differed: it accepted control characters and
over-long values that parseDashboardOrigins refuses. The generator now
imports parseDashboardOrigins, so onboarding, the startup profile, and
the generator share one owner.

- Copy src/lib/dashboard/url.ts and its two core imports into the image
  and the local build context. This adds two root Dockerfile lines; the
  growth exception for this PR is recorded separately on main.
- Keep naming a rejected entry by position, so user information in it is
  not printed.
- Test that control characters and over-long values are refused like
  parseDashboardOrigins refuses them.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

Root Dockerfile growth approved for this PR

Maintainer decision: approve root Dockerfile growth for #13218 up to 2,494 lines and 216,495 bytes (2 lines and 132 bytes over main).

1a68ff15a makes the OpenClaw config generator use parseDashboardOrigins instead of its own copy of the dashboard-origin rules. The copy had already drifted: it accepted control characters and over-long values that the shared parser refuses. The image needs two new COPY lines for src/lib/dashboard/url.ts and its two src/lib/core imports.

The guardrail reads exceptions only from the base branch, so the exception goes to main in a separate PR. Remove it after this PR merges.

Addresses the Review Advisor finding on 270f759. parseDashboardOrigins
appended the raw rejected value to its errors for a malformed URL, a
non-http scheme, a path, query, or fragment, and remote http. A token in
any of those parts could reach the terminal and logs. Errors now name the
entry by its position ("Dashboard origin 2 must ..."), matching how the
image's config generator already reports them. New tests cover each case.

The managed startup bundle includes this parser, so its pin is updated.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor finding on 270f759: rejected origins in errors

Fixed in 9f9c19db7. parseDashboardOrigins no longer includes the rejected value in any error. It names the entry by position instead, for example "Dashboard origin 2 must not include a path, query, or fragment.", the same way the image's config generator already reports a rejected entry. New tests in src/lib/dashboard/url.test.ts check that a token in a path, query, fragment, host, or malformed value never appears in the error; all six failed before the change.

The two E2E recommendations from this run are answered by the live dashboard-remote-bind run on c414c5036 (#13218 (comment)). Since then the origin code changed only in this error text.

The origin parser change rebuilt the managed startup bundle, a Pi image
input. Both receipts come from the managed-images run for 9f9c19d
(run 40891529187), and the candidate authority lists their SHA-256 digests.

Refs #13177
@wscurran wscurran removed the security label Oct 29, 2026
Addresses the Review Advisor finding on 663f273. Re-onboarding can change
or remove dashboard origins without a rebuild, so the managed receipt's
profile may still carry the old list. A snapshot clone copied that stale
list into the new sandbox and its registry entry.

The clone rebinder now takes extraOrigins from the source's registry
record, which the registry validates on load, and drops them when the
source records none. An invalid record fails the clone before any change.
The clone's registry fields follow the rebound profile, so both agree.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

Live E2E: dashboard-remote-bind passed on 663f27371

Manual PR E2E run: https://github.com/NVIDIA/NemoClaw/actions/runs/40903254011 (success)

  • Tested commit: 663f273719bd4f9db1e0a401921459832999f0ad, the current PR head. It includes the origin parser error change (9f9c19db7) and the 75-minute test limit.
  • Base: ef3ffec452ba573618df05675635f8e1605b60ed. Workflow: main at 5d463e0bc.
  • Selector: targets=dashboard-remote-bind, inference_mode=mock. Correlation ID 452cf5b8-91af-4405-a9d3-40d984e2ac85.
  • Images: the managed images CI built for this commit (run 40894454871).

All 7 phases passed (5m 48s), including onboard with NEMOCLAW_DASHBOARD_ORIGINS set (the running gateway allows the origin) and rebuild and verify recorded dashboard origins (3m 26s): with conflicting CHAT_UI_URL and NEMOCLAW_DASHBOARD_ORIGINS exported, the rebuilt gateway kept the recorded origin and allowed neither exported value.

This answers the E2E recommendations from the Advisor runs on 270f759 and 663f273.

@kaofelix

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor findings on 663f273

Clone reused stale origins: fixed in 3afabdd7d. Re-onboarding can change or remove origins without a rebuild, so the managed receipt's profile may still hold the old list, and a snapshot clone copied it. The clone rebinder now takes extraOrigins from the source's registry record, which the registry validates on load, and drops them when the source records none. An invalid record fails the clone before any change, and the clone's registry fields follow the rebound profile. New tests cover changed and removed origins; both failed before the fix.

E2E ownership of shared files: not changed, by maintainer decision. This is the same request as the finding on c414c50. As explained in #13218 (comment), dashboard-remote-bind owns the 15 files that decide how origins are requested, resumed, validated, and replayed. Shared registry and onboarding-flow files that only pass the list along stay out, so unrelated onboarding PRs are not pointed at this dashboard test.

Live E2E: dashboard-remote-bind passed on 663f27371 (#13218 (comment)). 3afabdd7d changes only the clone path, which that test does not exercise.

Brings in the Deep Agents Code 0.1.87 inputs (#13878) that main's
staging QA workflow expects. No conflicts.
Addresses the Review Advisor finding on 2250b00. A 75-minute test limit
left no room for the shared 10-minute cleanup inside the 80-minute
catalogue job. The limit returns to 60 minutes, which leaves 20 minutes
for cleanup and workflow finalization. Real runs take 6 to 8 minutes;
the per-step budgets, including the 25-minute rebuild, are ceilings.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor finding on 2250b00: dashboard E2E timeout

Fixed in 53be77a2d, by maintainer decision. The test limit returns to 60 minutes, which leaves 20 minutes of the 80-minute catalogue job for the shared 10-minute cleanup and workflow finalization.

This reverses the change made for the earlier finding on 4129ee6, which said 60 minutes could not cover every per-step budget. That finding is declined: the step budgets, including the 25-minute rebuild, are ceilings, not expected durations. Every live run on this PR finished in 6 to 8 minutes, with rebuilds of 3 to 5 minutes. Protecting cleanup matters more than covering a worst case where every step hits its ceiling. No assertions change, so the approved budget digest is unchanged.

@kaofelix
kaofelix requested a review from rsliter October 29, 2026 21:22
Addresses the Review Advisor finding on 53be77a. The registry loader keeps
a sandbox's dashboardOrigins as recorded, and rebuild turned a malformed
list into no origins, so the replacement sandbox silently lost them.
Rebuild now stops in its preflight step, before changing anything, and
tells the operator to run onboard again with valid origins, or without
them to remove them. An absent record still means no origins.

Refs #13177
@kaofelix

Copy link
Copy Markdown
Collaborator Author

PR Review Advisor findings on 53be77a

Rebuild dropped a malformed origins record: fixed in d33862449. The registry loader keeps a sandbox's dashboardOrigins as recorded, and rebuild turned a malformed list into no origins, so the replacement silently lost them. Rebuild now stops in its preflight step, before changing anything, and tells the operator to run onboard again with valid origins, or without them to remove them. An absent record still means no origins. The updated test failed before the fix.

E2E test deadline: not changed. This repeats the finding on 4129ee6, and the reasoning in #13218 (comment) still applies: the per-step budgets are ceilings, real runs take 6 to 8 minutes, and the 60-minute limit keeps 20 minutes of the 80-minute job for cleanup.

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

Reviewed d33862449f400cadd3ff8c03fb4b55fcd2bc6ac2 against the recorded base. Comment only; current conflicts prevent approval.

The dashboard-origin implementation follows the accepted #13177 scope: separately validated dashboard origins, managed OpenClaw-only support, persisted replay, and redacted invalid-input diagnostics. The reviewed source and tests did not establish a blocking correctness/security defect or an additional mandatory test gap. This does not authorize a broader runtime/provider integration.

GitHub currently reports CONFLICTING / DIRTY. Please resolve the integration conflicts and then validate the resulting revision; this is a merge-readiness condition, not a claim that the dashboard-origin design is wrong. Current CI and the incomplete Advisor coordination also need a revision-specific disposition before approval.

This is a bounded source/feedback review. I did not execute tests or live dashboard onboarding, and historical author-reported validation is not treated as independently reproduced current-head evidence. No merge performed.

main now runs dashboard-remote-bind for OpenClaw and Hermes. The merged test
keeps that coverage: the Hermes API-isolation phases stay as main has them, and
the dashboard-origin assertions run only for OpenClaw using each agent's
generated sandbox name. The OpenClaw phase order, contracts, and rebuild checks
from this branch are preserved, and the timeout note reflects the shared target.

Generated files take main's copies and are regenerated: the assertion budget,
the startup bundle and its pin, and this PR's assertion exception entry with the
approved digest, which is unchanged against main. The Pi receipts are refreshed
from this commit's CI run.
The merge with main changed Pi image inputs. Both receipts come from the
managed-images run for a6a71e9, collected with the reviewed collector from
main, and the candidate authority lists their SHA-256 digests.
…dget

main's platform-vitest-main workflow contract budgets this test's
TEST_TIMEOUT_MS inside WSL shard 1. A 60-minute value exceeded the shard
budget, so the value returns to main's 50 minutes. The per-step budgets stay
as ceilings; live runs on this target finish in 6 to 8 minutes.
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor finished for commit b95f6a5. Include the Advisor findings in the complete PR feedback collection. Verify and group valid findings before repair.

Request review only when Require no Advisor blockers is green.

All previous runs

@kaofelix

kaofelix commented Nov 2, 2026

Copy link
Copy Markdown
Collaborator Author

Revision-specific disposition for the conflict resolution

The conflicts are resolved and the revision is validated. The PR is now MERGEABLE.

Revisions

  • a6a71e9e0: merge of main (a68a94675). Resolved generated-file conflicts by regenerating the assertion budget, the startup bundle and its pin, and this PR's assertion exception entry (approved digest unchanged). Source conflicts were limited to the E2E test and its catalogue entries.
  • add9ebd7b: Pi qualification receipts from the managed-images run for a6a71e9e0, collected with the reviewed collector from main.
  • b95f6a5c3: the dashboard test timeout returns to main's 50 minutes, because test/automation/e2e/platform-vitest-main-workflow.test.ts budgets that value inside WSL shard 1. This supersedes the earlier 60- and 75-minute values.

Merge behavior for the shared target

main now runs dashboard-remote-bind for OpenClaw and Hermes. The merged test keeps that coverage: the Hermes API-isolation phases stay as main has them, and the dashboard-origin assertions run only for OpenClaw, using each agent's generated sandbox name. The OpenClaw audit and rebuild-origin assertions remain, in main's six declared phases.

Validation on b95f6a5c3

  • CI: all 59 checks pass.
  • dashboard-remote-bind live E2E: https://github.com/NVIDIA/NemoClaw/actions/runs/41483365825 passed both scenarios. OpenClaw ran 6m26s including the rebuild-origin assertions; Hermes ran 1m40s. Managed images came from this commit's image workflow.
  • Review Advisor on this revision: no P0/P1 findings. Its one remaining E2E recommendation asked for this live run, which now exists.
  • Conflict resolution was validated in a container without host credentials: formatting, lint, the assertion census, the pinned bundle contract, the CLI typecheck, and the affected cli and e2e-support suites.

Not done: no new live run on the earlier d33862449 revision, and no review request.

Signed-off-by: Kao Félix <me@kaofelix.dev>
@kaofelix
kaofelix marked this pull request as draft November 3, 2026 15:06
@kaofelix
kaofelix marked this pull request as ready for review November 3, 2026 17:10
Signed-off-by: Kao Félix <me@kaofelix.dev>
Signed-off-by: Kao Félix <me@kaofelix.dev>
Signed-off-by: Kao Félix <me@kaofelix.dev>
@wscurran wscurran added area: cli Command line interface, flags, terminal UX, or output area: docs Documentation, examples, guides, or docs build area: e2e End-to-end tests, nightly failures, or validation infrastructure area: networking DNS, proxy, TLS, ports, host aliases, or connectivity area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery labels Nov 3, 2026

This branch has not been deployed

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

Labels

area: cli Command line interface, flags, terminal UX, or output area: docs Documentation, examples, guides, or docs build area: e2e End-to-end tests, nightly failures, or validation infrastructure area: networking DNS, proxy, TLS, ports, host aliases, or connectivity area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow 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 integration: openclaw OpenClaw integration behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants