Skip to content

perf(onboard): replace fixed readiness polls with deadline waits - #7274

Merged
cv merged 12 commits into
mainfrom
3768-perf-onboard-deadline-readiness-polls
Jul 26, 2026
Merged

perf(onboard): replace fixed readiness polls with deadline waits#7274
cv merged 12 commits into
mainfrom
3768-perf-onboard-deadline-readiness-polls

Conversation

@amata-human

@amata-human amata-human commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Summary

Replace the remaining fixed-count onboarding readiness loops with fast, deadline-based polling that backs off to a capped interval. Fast systems now continue immediately, while slow systems receive the full configured deadline and timeout messages report the budget that was actually used.

Related Issue

Fixes #3768

Changes

  • Add a shared readiness-wait option builder for deadline budgets, capped backoff, legacy poll-budget conversion, zero-budget test behavior, and deadline formatting. Sandbox, dashboard, and gateway onboarding consumers need the same timing contract; keeping it shared prevents their retry semantics and timeout messages from drifting. readiness-wait.test.ts protects immediate, retry, timeout, short-budget, and zero-budget behavior.
  • Apply deadline waits to sandbox creation, dashboard readiness, gateway startup and recovery, and agent gateway startup. Preserve NEMOCLAW_HEALTH_POLL_COUNT and NEMOCLAW_HEALTH_POLL_INTERVAL by deriving the same total budget rather than adding another configuration path.
  • Keep sandbox phase debounce and stable-ready observation semantics while making ordinary readiness cadence adaptive and bounded by NEMOCLAW_SANDBOX_READY_TIMEOUT. Preserve the compatibility recreate path’s original two-second stable-ready confirmation interval, with regression coverage for the timing invariant.
  • Update command and troubleshooting documentation so debounce guidance describes observation counts and the authoritative overall deadline.

Type of Change

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

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification:
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: Codex Desktop maintainer nine-category review remains valid on exact head 0fd39b8458909512faac8fa6260613d5dc1ae02e. PASS in all categories with no findings: the PR diff only alters bounded polling schedules and timeout reporting; it adds no credential, authorization, command-construction, dependency, network-policy, or sandbox-boundary exposure. The final signed main sync changed only an already-merged shields test outside the PR-visible diff.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: docs-updated
  • Evidence: docs/reference/commands.mdx and docs/reference/troubleshooting.mdx accurately document adaptive polling, observation-count debounce, and the authoritative readiness deadline. The exact-head main sync changed only src/lib/shields/flow.test.ts, so the prior npm run docs result remains applicable: 0 errors, and generated OpenClaw, Hermes, and Deep Agents variants contain the updated guidance.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit: Not applicable; scripts/prepare-dgx-station-host.sh is unchanged.
  • Station profile/scenario: Not applicable.
  • Result: Not applicable.
  • Supporting evidence: Not applicable.

Verification

  • 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 or justification: npx vitest run --project cli over the eight affected readiness/onboard test files on reviewed head 31523b4f30ed70b2c4ce421fa0b70b3d52433e0b: 83 passed, 1 skipped. Exact head 0fd39b8458909512faac8fa6260613d5dc1ae02e only merges current main without altering the PR-visible diff; the normal CLI type-check and push hooks passed.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: Not required for this scoped runtime change. A full CLI run reached 9,546 passed and 1 skipped; two unrelated base-image.test.ts 5-second timeouts reproduced in isolation.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without errors (doc changes only) — 0 errors; Fern reported 2 unprinted warnings
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Angel Mata amata@nvidia.com

Summary by CodeRabbit

  • Improvements
    • Standardized gateway and sandbox readiness waiting with faster initial polling, adaptive backoff, and consistent deadline-based outcomes.
    • Added support for tolerating transient readiness errors via a configurable debounce window, while still failing immediately for terminal failure phases.
    • Enhanced gateway startup and recovery to detect early exits and clearly differentiate healthy vs timeout results.
  • New Features
    • Introduced a reusable readiness-wait utility used across onboarding and readiness tracing.
  • Documentation
    • Updated readiness polling/troubleshooting docs with precise debounce/timeout semantics and examples.
  • Tests
    • Added/updated readiness, gateway, and tracing tests to match the new timing behavior.

@amata-human amata-human added area: docs Documentation, examples, guides, or docs build area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: performance Latency, throughput, resource use, benchmarks, or scaling labels Jul 21, 2026
@amata-human amata-human self-assigned this Jul 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

@github-code-quality

github-code-quality Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 0fd39b8 in the 3768-perf-onboard-de... branch remains at 96%, unchanged from commit 3e54a83 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit 0fd39b8 in the 3768-perf-onboard-de... branch remains at 81%, unchanged from commit f3127e0 in the main branch.

Show a code coverage summary of the most impacted files.
File main f3127e0 3768-perf-onboard-de... 0fd39b8 +/-
src/lib/onboard/docker-cdi.ts 80% 70% -10%
src/lib/shields/index.ts 71% 67% -4%
src/lib/onboard.ts 32% 31% -1%
src/lib/actions...confirmation.ts 69% 79% +10%
src/lib/agent/onboard.ts 73% 84% +11%
src/lib/onboard...ness-tracing.ts 75% 92% +17%
src/lib/actions...ocker-health.ts 65% 82% +17%
src/lib/onboard...box-prebuild.ts 74% 92% +18%
src/lib/onboard...adiness-wait.ts 0% 100% +100%
src/lib/onboard...ay-readiness.ts 0% 100% +100%

Updated July 26, 2026 01:09 UTC

@coderabbitai

coderabbitai Bot commented Jul 21, 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

The change replaces fixed readiness polling with shared deadline-based waits, adaptive backoff, zero-budget handling, and formatted deadlines across agent, gateway, sandbox, and dashboard onboarding flows. Tests, traces, timeout messages, and readiness documentation are updated accordingly.

Changes

Onboarding readiness waits

Layer / File(s) Summary
Shared readiness scheduler
src/lib/onboard/readiness-wait.ts, src/lib/onboard/readiness-wait.test.ts
Adds shared deadline-budget, adaptive-interval, zero-budget, and deadline-formatting utilities with focused tests.
Agent gateway readiness
src/lib/agent/gateway-readiness.ts, src/lib/agent/gateway-readiness.test.ts, src/lib/agent/onboard.ts, src/lib/agent/onboard.test.ts
Adds waitForAgentGatewayReady and replaces inline agent health polling with deadline-based waiting and injectable clock/sleep hooks.
Gateway health and recovery
src/lib/onboard.ts, src/lib/onboard/gateway-health-wait.ts, src/lib/onboard/gateway-recovery.ts, src/lib/onboard/docker-driver-gateway-readiness.ts, src/lib/onboard/*gateway*.test.ts
Routes gateway startup and recovery through shared wait options while preserving health, TCP, process, and bridge checks; timeout messages report configured limits.
Sandbox and dashboard readiness
src/lib/onboard/sandbox-readiness-tracing.ts, src/lib/onboard/sandbox-readiness-tracing.test.ts, src/lib/onboard/tracing.ts, docs/reference/commands.mdx, docs/reference/troubleshooting.mdx
Converts sandbox and dashboard loops to deadline-based waits, adds Error-phase debounce handling and tracing updates, and documents the resulting polling and timeout behavior.

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

Suggested labels: refactor

Suggested reviewers: dfernandez365-rgb

Sequence Diagram(s)

sequenceDiagram
  participant Onboarding
  participant ReadinessWait
  participant GatewayOrSandbox
  participant Diagnostics
  Onboarding->>ReadinessWait: create deadline-based wait options
  ReadinessWait->>GatewayOrSandbox: poll readiness with adaptive intervals
  GatewayOrSandbox-->>ReadinessWait: readiness or phase result
  ReadinessWait-->>Onboarding: success or deadline outcome
  Onboarding->>Diagnostics: record traces and failure details
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes cover the linked issue scope by updating sandbox, dashboard, gateway recovery, agent gateway, and tests to use deadline-based waits.
Out of Scope Changes check ✅ Passed The docs and test updates are directly tied to the readiness-wait refactor and do not indicate unrelated scope creep.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: onboarding readiness polling is being replaced with deadline-based waits.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 3768-perf-onboard-deadline-readiness-polls

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

@github-actions

github-actions Bot commented Jul 21, 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 E2E selections differ; severity counts match.

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

E2E guidance

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

Recommended E2E: full-e2e, hermes-e2e, onboard-repair, onboard-resume, cloud-onboard

1 optional E2E recommendation
  • gateway-health-honest

Workflow run details

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/lib/onboard.ts (1)

2108-2158: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

Consider extracting the Docker-driver gateway readiness loop later.

This block mixes several concerns inline (child-exit tracking, endpoint registration, health/TCP checks, sandbox-bridge verification) inside the large onboard.ts entrypoint. A dedicated module alongside the existing docker-driver-gateway-* helpers would improve testability, matching the pattern already used for gateway-recovery.ts. As per path instructions, this repo's guidance for src/lib/onboard.ts is to keep PRs "thin" and mechanical and defer such moves to a later, separate change rather than doing it in this migration PR, so this is a deferred suggestion only.

🤖 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 `@src/lib/onboard.ts` around lines 2108 - 2158, No code change is required for
this deferred suggestion; leave the Docker-driver gateway readiness loop inline
in onboard.ts. Consider extracting the logic into a dedicated
docker-driver-gateway helper module in a separate follow-up change.

Source: Path instructions

src/lib/onboard/gateway-recovery.ts (1)

230-237: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Misleading failure message for legacy zero-interval recovery config.

formatReadinessDeadline(waitBudgetMs) is a plain ms/s formatter. For a legacy recoveryPollInterval=0/recoveryPollCount>0 config, waitBudgetMs computes to 0, so the thrown message reads "...within the configured 0ms recovery deadline" even though the loop actually ran up to recoveryPollCount immediate probes (via the zeroBudgetAttempts path). This can mislead an operator diagnosing a failed recovery into thinking no attempts occurred. formatGatewayHealthWaitLimit (used for the equivalent case in src/lib/onboard.ts) already special-cases this by reporting "N immediate health probes" — consider reusing that same distinction here for consistent diagnostics.

♻️ Possible approach
-  throw new Error(
-    `Gateway '${gatewayName}' did not become ready within the configured ${formatReadinessDeadline(
-      waitBudgetMs,
-    )} recovery deadline (${recoveryPollInterval}s poll interval)`,
-  );
+  const deadlineDescription =
+    recoveryPollInterval === 0 && recoveryPollCount > 0
+      ? `${recoveryPollCount} immediate health ${recoveryPollCount === 1 ? "probe" : "probes"}`
+      : `${formatReadinessDeadline(waitBudgetMs)} recovery deadline (${recoveryPollInterval}s poll interval)`;
+  throw new Error(
+    `Gateway '${gatewayName}' did not become ready within the configured ${deadlineDescription}`,
+  );
🤖 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 `@src/lib/onboard/gateway-recovery.ts` around lines 230 - 237, Update the
failure message in the gateway recovery timeout path to use the same zero-budget
distinction as formatGatewayHealthWaitLimit: when recoveryPollInterval is zero
and zeroBudgetAttempts applies, report the configured number of immediate probes
instead of a 0ms recovery deadline. Preserve the existing
deadline-and-poll-interval wording for nonzero budgets and normal
configurations.
src/lib/onboard/sandbox-readiness-tracing.ts (1)

375-429: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Dashboard zero-budget path skips the not_ready/terminal trace emitted by the other two waiters.

When budgetMs is 0, waitOptions is null and ready short-circuits to false without ever calling waitUntil, but no addTraceEvent is emitted here — unlike pollSandboxReady (Line 124: options.trace?.("not_ready", ...)) and waitForCreatedSandboxReadyWithTrace (Line 256: addTraceEvent("not_ready", ...)), which both explicitly trace the zero-budget short-circuit. Only the console.warn fires, so operators relying on tracing to diagnose a misconfigured zero timeout for dashboard readiness get no signal.

♻️ Proposed fix to trace the zero-budget short-circuit
   return withDashboardReadinessTrace(sandboxName, port, timeoutSecs, () => {
     let attempt = 0;
     const waitOptions = createReadinessWaitOptions({
       budgetMs,
       maxIntervalMs: 2_000,
       now: options.now,
       sleep: (ms) => sleep(ms / 1000),
     });
+    if (!waitOptions) {
+      addTraceEvent("not_ready", { attempts: 0, deadline_ms: budgetMs });
+    }
     const ready =
       waitOptions !== null &&
       waitUntil(() => {
🤖 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 `@src/lib/onboard/sandbox-readiness-tracing.ts` around lines 375 - 429, Update
waitForDashboardReadyWithTrace so the zero-budget path (when waitOptions is
null) emits the same terminal "not_ready" trace event as the other readiness
waiters before returning false. Preserve the existing probe, success, warning,
and nonzero-budget behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/reference/troubleshooting.mdx`:
- Around line 1504-1511: Correct the example in the troubleshooting guidance
following the “fail fast” instruction: update
NEMOCLAW_SANDBOX_READY_ERROR_DEBOUNCE to 1 and remove the contradictory comment
about tolerating 60 observations, while leaving the surrounding timeout guidance
unchanged.

---

Nitpick comments:
In `@src/lib/onboard.ts`:
- Around line 2108-2158: No code change is required for this deferred
suggestion; leave the Docker-driver gateway readiness loop inline in onboard.ts.
Consider extracting the logic into a dedicated docker-driver-gateway helper
module in a separate follow-up change.

In `@src/lib/onboard/gateway-recovery.ts`:
- Around line 230-237: Update the failure message in the gateway recovery
timeout path to use the same zero-budget distinction as
formatGatewayHealthWaitLimit: when recoveryPollInterval is zero and
zeroBudgetAttempts applies, report the configured number of immediate probes
instead of a 0ms recovery deadline. Preserve the existing
deadline-and-poll-interval wording for nonzero budgets and normal
configurations.

In `@src/lib/onboard/sandbox-readiness-tracing.ts`:
- Around line 375-429: Update waitForDashboardReadyWithTrace so the zero-budget
path (when waitOptions is null) emits the same terminal "not_ready" trace event
as the other readiness waiters before returning false. Preserve the existing
probe, success, warning, and nonzero-budget behavior.
🪄 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: bdd98380-a809-42cf-a56d-6a2169fe3750

📥 Commits

Reviewing files that changed from the base of the PR and between d5fa194 and 0ba29dd.

📒 Files selected for processing (15)
  • docs/reference/commands.mdx
  • docs/reference/troubleshooting.mdx
  • src/lib/agent/gateway-readiness.test.ts
  • src/lib/agent/gateway-readiness.ts
  • src/lib/agent/onboard.ts
  • src/lib/onboard.ts
  • src/lib/onboard/gateway-health-wait.test.ts
  • src/lib/onboard/gateway-health-wait.ts
  • src/lib/onboard/gateway-recovery.test.ts
  • src/lib/onboard/gateway-recovery.ts
  • src/lib/onboard/readiness-wait.test.ts
  • src/lib/onboard/readiness-wait.ts
  • src/lib/onboard/sandbox-readiness-tracing.test.ts
  • src/lib/onboard/sandbox-readiness-tracing.ts
  • src/lib/onboard/tracing.ts

Comment thread docs/reference/troubleshooting.mdx
Signed-off-by: Angel Mata <amata@nvidia.com>
Signed-off-by: Angel Mata <amata@nvidia.com>
Signed-off-by: Angel Mata <amata@nvidia.com>
@amata-human

Copy link
Copy Markdown
Contributor Author

CI blocker note: reviewed-npm-audit fails on newly reported vulnerabilities in the reviewed archive graph (tar critical and axios high). This PR does not change package.json, either lockfile, or ci/reviewed-npm-audit.json (git diff origin/main...HEAD is empty for all five inputs), and the audit reproduces locally under the exact workflow Node 22.22.2. All eight CLI shards, merged CLI coverage, static checks, build/typecheck, CodeQL, growth guardrails, and the other required jobs pass. The downstream checks and E2E coordination failures are consequences of that audit prerequisite.

@dfernandez365-rgb dfernandez365-rgb left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exact-head review: 44926b00efa4b96b3cded6f6d539ce112d063d95.

The deadline conversion shortens the GPU compatibility stale-row confirmation window from 2 seconds to 250 ms. waitForCreatedSandboxReadyWithTrace() deliberately receives stableReadyPolls: 2 on the compatibility recreate path because OpenShell can retain the old container's Ready row before publishing the replacement supervisor's Error -> Ready transition. On d5fa1942, the confirmation poll is separated by sleep(2). This head routes the same check through createReadinessWaitOptions() with the default 250 ms initial interval (sandbox-readiness-tracing.ts:249-253), so two reads of the same stale row can now satisfy the safeguard before re-registration becomes visible.

I reproduced the exact-head behavior with a deterministic clock and an always-Ready list: the function returned {ready:true} after a single 0.25 second sleep. The existing stability test remains green because it asserts only call counts, not the temporal invariant.

Please preserve a minimum two-second confirmation window for the compatibility stableReadyPolls path (or replace the count with an explicit stability duration), and add a regression test that proves a stale Ready row lasting longer than 250 ms cannot reach the GPU proof prematurely. The general fast first retry can remain for readiness paths that do not carry this stale-registration contract.

@jyaunches

Copy link
Copy Markdown
Contributor

Addressed the exact-head readiness-stability finding in 3d1d911.

The ordinary readiness paths still start at 250 ms and back off adaptively. The compatibility recreate path (stableReadyPolls greater than 1) now retains the original 2-second confirmation interval, and the stability regression test asserts that first delay explicitly.

Local verification:

  • 30 focused CLI tests passed (1 existing skip)
  • Biome passed for the four changed files
  • npm run build:cli passed
  • npm run typecheck:cli passed

Please re-review the updated head.

jyaunches and others added 2 commits July 23, 2026 10:37
@amata-human

Copy link
Copy Markdown
Contributor Author

Updated head bbdb0e28883e235d7c2bcd94d9bbab1b07bce293 merges current main and retains the readiness-stability fix from 3d1d911431f1fa8267280e907e428048ab92f832.

Fresh local verification on the merged head:

  • 81 focused readiness/onboard tests passed (1 existing skip)
  • npm run check:diff passed, including prek pre-commit/pre-push hooks and CLI typechecking

The prior E2E failure was a cold sandbox build exceeding the performance budget; the refreshed head now includes current main runner routing and retry changes.

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

@amata-human, I’ll re-review the updated head, including the retained readiness-stability behavior and the merged main changes.

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

@amata-human

Copy link
Copy Markdown
Contributor Author

CI follow-up on refreshed head bbdb0e28883e235d7c2bcd94d9bbab1b07bce293:

  • All ordinary PR checks passed, including all 8 CLI shards, aggregate CLI coverage, build/typecheck, static checks, npm audit, CodeQL, sandbox image tests, macOS E2E, DCO, docs receipt, and both automated review-advisor lanes. CodeRabbit completed with no new actionable findings.
  • Selected onboard-repair and onboard-resume E2E scenarios passed.
  • hermes-e2e failed before test execution because the ubuntu-latest runner could not provision its requested swap. The failed-job rerun reproduced this as Hermes E2E swap provisioning failed: 0 of 34359738368 bytes active.
  • full-e2e completed onboarding successfully on both attempts, but cold sandbox-image construction exceeded the existing absolute performance budget: 199.6s initially and 189.5s on rerun versus 171s. The readiness waits themselves completed successfully.

These two remaining E2E failures are hosted-runner capacity/performance failures and are not safely addressable by this readiness-polling PR. The branch is clean, current with main, and awaiting maintainer re-review/CI disposition.

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>

# Conflicts:
#	docs/reference/commands.mdx
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Synced the contributor branch normally to current main in signed, GitHub-verified merge commit b886cc8f41dfa3b55a5036a3e11fbb9d8a129ef0; the original author commits and credit remain intact.

The prior requested stability invariant is preserved at the exact head: stableReadyPolls > 1 keeps a 2-second initial confirmation interval, and the regression test asserts that first 2-second sleep. The resolved CodeRabbit findings also remain covered: zero-interval recovery reports immediate probe counts, zero-budget dashboard readiness emits not_ready, and the troubleshooting fail-fast example uses debounce 1.

Validation on the merged tree:

  • focused readiness/deadline tests: 8 files, 83 passed, 1 skipped
  • plugin build: passed
  • CLI build and CLI typecheck: passed
  • strict docs validation: passed
  • pre-commit and pre-push hooks: passed
  • documentation-writer review: no additional docs needed

@dfernandez365-rgb please re-review the exact head when available.

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@cv
cv merged commit 029c7aa into main Jul 26, 2026
76 of 77 checks passed
@cv
cv deleted the 3768-perf-onboard-deadline-readiness-polls branch July 26, 2026 01:30
@cv cv mentioned this pull request Jul 26, 2026
23 tasks
apurvvkumaria pushed a commit that referenced this pull request Jul 27, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Add the canonical `docs/changelog/2026-07-25.mdx` release entry with the
exact `## v0.0.96` heading.
The entry reconciles all 90 first-parent commits since v0.0.95 with all
92 merged PRs in the live `v0.0.96` label ledger and groups the
user-visible changes by operator journey.

## Changes

- Add the parser-safe dated MDX changelog entry for v0.0.96 with
root-absolute links to the focused user guides.
- Source summary:
- [#7194](#7194) ->
`docs/changelog/2026-07-25.mdx`: Document persistent baseline network
policy exclusions and their inspection, rebuild, and snapshot behavior.
- [#7188](#7188),
[#7427](#7427), and
[#7546](#7546) ->
`docs/changelog/2026-07-25.mdx`: Document DNS-backed HTTPS inference
routing, keyless loopback endpoints, and provider-marker isolation.
- [#7238](#7238) ->
`docs/changelog/2026-07-25.mdx`: Document blueprint sandbox and provider
identifier validation before state writes or OpenShell calls, with
bounded terminal-safe rejection previews.
- [#7319](#7319),
[#7274](#7274),
[#7528](#7528),
[#7353](#7353), and
[#7560](#7560) ->
`docs/changelog/2026-07-25.mdx`: Document the managed default gateway
service, onboarding readiness, and container-runtime identity
safeguards.
- [#7349](#7349),
[#7498](#7498),
[#7406](#7406),
[#7196](#7196),
[#7559](#7559),
[#7421](#7421),
[#7510](#7510),
[#7295](#7295), and
[#7565](#7565) ->
`docs/changelog/2026-07-25.mdx`: Document gateway-scoped status,
lifecycle diagnostics, managed MCP recovery, delete-edge safeguards, and
fail-closed CLI prompt and command output.
- [#7591](#7591) ->
`docs/changelog/2026-07-25.mdx`: Document opt-in authenticated MCP
tool-name discovery, its bounded and names-only contract, probe
interaction, and rebuild requirement.
- [#7305](#7305),
[#7480](#7480),
[#7471](#7471),
[#7365](#7365), and
[#7541](#7541) ->
`docs/changelog/2026-07-25.mdx`: Document installer version checks,
version-tag reporting, license guidance, WSL Ollama selection, and DGX
Station vLLM detection.
- [#7482](#7482),
[#7466](#7466),
[#7208](#7208),
[#7434](#7434), and
[#7586](#7586) ->
`docs/changelog/2026-07-25.mdx`: Document Ollama resource details,
reasoning precedence, Hermes onboarding behavior, and preserved managed
Hermes BuildKit failures.

- [#6830](#6830),
[#7492](#7492),
[#7563](#7563), and
[#7582](#7582) ->
`docs/changelog/2026-07-25.mdx`: Document the authoritative OpenClaw
production lock, fixed managed-image dependencies, immutable Hermes base
adoption, and Hermes image-size reduction.
- [#7505](#7505),
[#7530](#7530),
[#7547](#7547),
[#7508](#7508),
[#7548](#7548),
[#7549](#7549),
[#7537](#7537),
[#7534](#7534),
[#7515](#7515),
[#7511](#7511),
[#7551](#7551),
[#7562](#7562),
[#7575](#7575),
[#7496](#7496),
[#7594](#7594),
[#7595](#7595), and
[#7599](#7599) ->
`docs/changelog/2026-07-25.mdx`: Summarize release validation, transient
and bounded dispatch reconciliation, exact pre-tag qualification,
identity revalidation, npm-audit retry, sharding, image reuse, timeout,
telemetry, and workflow-hardening changes.
- Reconciled without separate changelog prose:
- [#7539](#7539),
[#7526](#7526),
[#7507](#7507),
[#7506](#7506),
[#7519](#7519),
[#7516](#7516),
[#7396](#7396),
[#7254](#7254),
[#7583](#7583),
[#7596](#7596), and
[#7598](#7598): Test-harness or
fixture-only changes.
- [#7403](#7403),
[#7161](#7161),
[#6877](#6877),
[#7531](#7531),
[#7525](#7525),
[#7522](#7522),
[#7536](#7536),
[#7552](#7552),
[#7566](#7566),
[#7553](#7553),
[#7561](#7561),
[#7577](#7577),
[#7569](#7569),
[#7585](#7585),
[#7584](#7584),
[#7592](#7592),
[#7580](#7580),
[#7571](#7571),
[#7517](#7517),
[#7589](#7589),
[#7402](#7402),
[#7558](#7558),
[#7544](#7544), and
[#7601](#7601): Dependency,
internal recovery, validation, contributor-workflow, E2E optimization,
telemetry, or CI trust changes with no separate user-facing release
claim.
- [#7556](#7556),
[#7573](#7573),
[#7576](#7576), and
[#7578](#7578): Experimental
repository-maintainer conflict automation with no canonical user
documentation surface.

## Type of Change

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

## Quality Gates

- [ ] Tests added or updated for changed behavior
- [x] Existing tests cover changed behavior — justification:
`test/changelog-docs.test.ts` validates dated changelog structure,
version headings, and published links.
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: Reviewed `docs/changelog/2026-07-25.mdx` at exact head
`0f5dedb47` against 90 first-parent release commits and 92 merged PRs
labeled `v0.0.96`. Verified parser-safe MDX SPDX, the exact version
heading, literal CLI names, writing style, skip terms, all 20
root-absolute published links, and the accepted #7591 opt-in
authenticated discovery bounds. #7544, #7599, and #7601 remain internal
or CI-only release-ledger entries. Changelog tests passed 6/6, the docs
build passed with 0 errors and two pre-existing Fern warnings, and `npm
run check:diff` plus the final diff check passed.
- Agent: Codex Desktop documentation-writer subagent
<!-- docs-review-head-sha: 0f5dedb -->
<!-- docs-review-agents-blob-sha: be20a09 -->

## 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 check:diff` passed when hooks were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `npx vitest run
test/changelog-docs.test.ts`: 6/6 passed.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: Not applicable to this
prose-only changelog entry.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) — the
build passed with 0 errors and 2 existing Fern warnings; the
published-route check passed.
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)
— native changelog files use the required parser-safe MDX SPDX comment
and no frontmatter.

---
Signed-off-by: Carlos Villela <cvillela@nvidia.com>


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

* **New Features**
* Persistent network policy exclusions with consistent restore/exclusion
reporting across rebuilds/snapshots.
* Opt-in MCP tool discovery via `mcp status --tools` with bounded,
redacted authenticated traffic.
* Improved HTTPS inference switching for custom endpoints and refreshed
onboarding/model menu details.
* Refined OpenShell gateway defaults for port `8080`, including more
reliable readiness checks.
* **Bug Fixes**
* Prevent incorrect provider/model restoration after compatible-provider
update failures.
* Preserve managed MCP state after exec loss and tighten gateway/doctor
status scoping.
* **Tests**
* Stronger, fail-closed release validation with hardened
evidence/artifact handoff and bounded timeouts/retries.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: docs Documentation, examples, guides, or docs build area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: performance Latency, throughput, resource use, benchmarks, or scaling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

perf(onboard): replace remaining fixed readiness polls with deadline-based waits

5 participants