Skip to content

fix(onboard): report an interrupted onboard instead of an invalid transition - #8000

Merged
senthilr-nv merged 8 commits into
mainfrom
fix/onboard-terminal-state-race
Jul 31, 2026
Merged

fix(onboard): report an interrupted onboard instead of an invalid transition#8000
senthilr-nv merged 8 commits into
mainfrom
fix/onboard-terminal-state-race

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Summary

A sandbox that reaches Ready no longer lets its create-stream termination signal reach the NemoClaw CLI. If a separate host interruption ends onboarding while a step is in flight, onboarding now reports the existing resumable recovery path instead of an invalid machine transition.

Related Issue

Fixes #7982

Changes

  • Spawn the native sandbox create child in an owned POSIX process group and terminate that group at the ready gate, on poll failure, or before host signal termination. Injected child implementations keep direct-child signaling, and Windows keeps the existing spawn behavior.
  • Persist failure.interrupted on the onboarding session when the incomplete-exit backstop records a failed step. The durable session is the only interruption authority, so a later process and an in-process transition use the same state.
  • Reject stale transition and completion results from a durably interrupted session with OnboardInterruptedError. Ordinary failed sessions keep the existing invalid-transition behavior.
  • Add source and integration regressions for durable interruption state, ordinary failures, completion entry points, descendant process termination, host signals, exact listener cleanup, and the sandbox recreation path.

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: the change corrects an onboarding interruption race and preserves the existing documented onboard --resume recovery workflow. It adds no command, flag, configuration, default, supported surface, or workflow.
  • 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: independent Codex security review passed all nine categories for head a695af6ea and base 60b33abec; no actionable findings remain.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Product scope: approved independently of GitHub merge state. This PR repairs existing onboarding and sandbox process cleanup behavior. It creates no integration, solution recipe, image, configuration surface, or new lifecycle commitment.

Exact reviewed pair: head a695af6eafc2dc50ec8170ac068ef8773ffdac09; base 60b33abeca789b35aa8970d169948a279147376e. The refreshed PR patch SHA-256 is 46a967b1331ebf11ba29800b71f440b61b6e3b592892484a20c7bdaf35cc512d.

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: Reviewed all 11 changed files and the complete diff from base 60b33abec through head a695af6ea. The refreshed patch matches the prior reviewed patch. It corrects onboarding interruption handling and process-group cleanup while preserving the documented onboard --resume recovery workflow. It adds no command, flag, configuration, default, supported surface, or workflow. Existing recovery guidance in docs/reference/commands.mdx, docs/reference/troubleshooting.mdx, and the quickstarts remains accurate.
  • 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 validate:pr passed after refreshing origin/main 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 src/lib/onboard/exit-step-failure.test.ts src/lib/onboard/runtime-boundary.test.ts src/lib/onboard/runtime-boundary-record-only.test.ts src/lib/sandbox/create-stream-process-group.test.ts src/lib/sandbox/create-stream.test.ts src/lib/sandbox/create-stream-argv.test.ts src/lib/sandbox/create-stream-ready-gate.test.ts src/lib/state/onboard-session.test.ts passed 150/150. npx vitest run --project integration test/onboard-sandbox-recreation.test.ts passed 11/11. npm run build:cli, npm run typecheck:cli, and npm run checks:repository passed.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result:
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Tinson Lai tinsonl@nvidia.com
Signed-off-by: Senthil Ravichandran senthilr@nvidia.com

…nsition

The incomplete-exit backstop writes a terminal failed state while a step
can still be running, so a sandbox that finished successfully then tried a
sandbox to openclaw transition and raised an invalid-transition error. The
backstop now records the interrupted step, and both the runtime and the
boundary report an interrupted onboard that resumes cleanly.

The create stream also spawned its child in the CLI process group, so the
ready-gate SIGTERM could reach the CLI itself. It now spawns the child in
its own group, signals that group, and kills it if the host exits first.

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The change records interrupted onboarding failures, blocks continuation from interrupted sessions, and improves sandbox child cleanup. Native non-Windows sandbox processes now run in detached groups. Tests cover interruption state, transition guards, process-group termination, signal handling, and listener cleanup.

Changes

Onboarding interruption handling

Layer / File(s) Summary
Record interruption on exit-step failure
src/lib/state/onboard-session.ts, src/lib/onboard/exit-step-failure.ts, src/lib/onboard/exit-step-failure.test.ts, test/helpers/rebuild-flow-target-image-cases.ts
Failure records preserve an interrupted flag. Exit backstop failures set it to true; recreate failures set it to false.
Transition guards and error types
src/lib/onboard/machine/transitions.ts
assertOnboardNotInterrupted rejects transitions from interrupted failed states with OnboardInterruptedError.
Runtime boundary guards and validation
src/lib/onboard/machine/runtime.ts, src/lib/onboard/runtime-boundary.ts, src/lib/onboard/runtime-boundary.test.ts
Completion, result application, transitions, and session finalization reject interrupted sessions. Tests cover persisted interruptions and valid non-interrupted branching.

Sandbox process-group cleanup

Layer / File(s) Summary
Process-group spawn and centralized cleanup
src/lib/sandbox/create-stream.ts
Native non-Windows children use detached process groups. Shared cleanup terminates children or groups, handles host signals and exit, and removes listeners after settlement.
Process-group termination and signal validation
src/lib/sandbox/create-stream-process-group.test.ts, test/onboard-sandbox-recreation.test.ts
Tests verify child and grandchild termination, injected-child signaling, host signal forwarding, listener cleanup, and negative-PID SIGTERM calls.

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

Sequence Diagram(s)

sequenceDiagram
  participant RuntimeBoundary
  participant OnboardRuntime
  participant SessionState
  RuntimeBoundary->>OnboardRuntime: submit completion or transition result
  OnboardRuntime->>SessionState: read failed state and interruption marker
  SessionState-->>OnboardRuntime: return failure metadata
  OnboardRuntime-->>RuntimeBoundary: throw OnboardInterruptedError
Loading
sequenceDiagram
  participant HostProcess
  participant CreateStream
  participant SandboxProcessGroup
  HostProcess->>CreateStream: receive SIGINT, SIGTERM, or exit
  CreateStream->>SandboxProcessGroup: terminate child process group
  SandboxProcessGroup-->>CreateStream: settle stream
  CreateStream->>HostProcess: remove signal and exit listeners
Loading

Suggested labels: area: sandbox

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.88% 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 address [#7982] by using durable interruption state and rejecting stale completion transitions that caused the invalid transition error.
Out of Scope Changes check ✅ Passed The process-group handling, interruption persistence, runtime checks, and regression tests directly support the linked issue objectives.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the primary change: reporting interrupted onboarding instead of an invalid state transition.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/onboard-terminal-state-race

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

@laitingsheng laitingsheng added NV QA Bugs found by the NVIDIA QA Team area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow bug-fix PR fixes a bug or regression labels Jul 31, 2026
@github-code-quality

github-code-quality Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit a695af6 in the fix/onboard-terminal... branch remains at 96%, unchanged from commit 106b505 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit a695af6 in the fix/onboard-terminal... branch remains at 81%, unchanged from commit 60b33ab in the main branch.


Updated July 31, 2026 17:38 UTC

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🤖 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/exit-step-failure.test.ts`:
- Around line 121-136: Wrap the listener invocation in the test around
registerIncompleteOnboardExitFailureHandler with a try/finally block, and move
errorSpy.mockRestore() into the finally clause so the console.error spy is
restored even when listeners[0](1) throws.

In `@src/lib/onboard/machine/interrupt-state.ts`:
- Around line 4-10: Persist the interruption marker and interrupted step through
the onboarding session in interrupt-state.ts, and update transitions.ts to throw
OnboardInterruptedError only for failed sessions carrying that durable marker.
In src/lib/onboard/runtime-boundary.test.ts lines 657-664, persist and reload an
interrupted session before asserting the error, and add coverage showing an
ordinary failed session does not throw; ensure resume, persisted-state migration
paths, and public entrypoints use the authoritative persisted state.

In `@src/lib/onboard/runtime-boundary.ts`:
- Around line 139-140: Guard the failed-session fallback in
recordSessionComplete() with assertOnboardNotInterrupted before calling
runtime.completeSession(updates), matching the existing completion transition
checks. Add a boundary test through the public recordSessionComplete()
entrypoint proving an interrupted failed session is rejected and
runtime.completeSession is not invoked.

In `@src/lib/sandbox/create-stream-process-group.test.ts`:
- Around line 92-95: Move the readStartedPids(markerPath) call before the result
assertion in the process-group termination test, so teardown can access recorded
child and grandchild PIDs even when expect(result) fails. Keep the existing
waitForExit checks unchanged.

In `@src/lib/sandbox/create-stream.ts`:
- Around line 348-351: Update terminateChildOnHostExit to also handle SIGINT and
SIGTERM, terminating the owned child group before allowing normal host signal
termination to proceed. Register these handlers alongside the existing exit
handler, remove all of them in finish, and add a regression test covering host
SIGTERM during a pending create.

In `@test/onboard-sandbox-recreation.test.ts`:
- Around line 1197-1202: Update the process.kill mock and related assertions
around process-group termination to record both pid and signal, restrict the
mock or validation to the expected child process group, and assert the payload
targets exactly -child.pid with the expected signal. Apply the same change to
the additional process.kill coverage noted in the comment.
🪄 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: 4e985cc0-2b76-46e8-957e-14b780246f37

📥 Commits

Reviewing files that changed from the base of the PR and between f8fb820 and ac4df56.

📒 Files selected for processing (10)
  • src/lib/onboard/exit-step-failure.test.ts
  • src/lib/onboard/exit-step-failure.ts
  • src/lib/onboard/machine/interrupt-state.ts
  • src/lib/onboard/machine/runtime.ts
  • src/lib/onboard/machine/transitions.ts
  • src/lib/onboard/runtime-boundary.test.ts
  • src/lib/onboard/runtime-boundary.ts
  • src/lib/sandbox/create-stream-process-group.test.ts
  • src/lib/sandbox/create-stream.ts
  • test/onboard-sandbox-recreation.test.ts

Comment thread src/lib/onboard/exit-step-failure.test.ts Outdated
Comment thread src/lib/onboard/machine/interrupt-state.ts Outdated
Comment thread src/lib/onboard/runtime-boundary.ts Outdated
Comment thread src/lib/sandbox/create-stream-process-group.test.ts Outdated
Comment thread src/lib/sandbox/create-stream.ts
Comment thread test/onboard-sandbox-recreation.test.ts
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

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

Model lanes

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

Advisory only. The primary lane did not select these E2E jobs or targets.

  • rebuild-hermes: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • rebuild-openclaw: The completed second-opinion lane identified E2E coverage that the primary lane omitted.
  • sandbox-survival: The completed second-opinion lane identified E2E coverage that the primary lane omitted.

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

Since last review: 0 prior items resolved · 0 still apply · 0 new items found

E2E guidance

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

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

1 optional E2E recommendation
  • sandbox-operations

Workflow run details

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

…state-race

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
An interrupted run recorded the marker only in process memory, so the
guard compensated by rejecting every failed session and a replacement
process lost the in-flight step. Record it on the session failure, guard
the recordSessionComplete fallback, and reap the owned create process
group on host SIGINT and SIGTERM.

Signed-off-by: Tinson Lai <tinsonl@nvidia.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.

🧹 Nitpick comments (1)
src/lib/sandbox/create-stream-process-group.test.ts (1)

142-155: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Assert listener identity instead of listener count.

Equal counts can pass if cleanup retains a new signal listener and removes a pre-existing listener. Snapshot process.listeners() before the call and compare the listener arrays after settlement.

Proposed test change
-    const sigintBefore = process.listenerCount("SIGINT");
-    const sigtermBefore = process.listenerCount("SIGTERM");
+    const sigintBefore = process.listeners("SIGINT");
+    const sigtermBefore = process.listeners("SIGTERM");
...
-    expect(process.listenerCount("SIGINT")).toBe(sigintBefore);
-    expect(process.listenerCount("SIGTERM")).toBe(sigtermBefore);
+    expect(process.listeners("SIGINT")).toEqual(sigintBefore);
+    expect(process.listeners("SIGTERM")).toEqual(sigtermBefore);

As per path instructions, review tests for behavioral confidence rather than implementation lock-in.

🤖 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/sandbox/create-stream-process-group.test.ts` around lines 142 - 155,
Update the test around streamSandboxCreate to snapshot
process.listeners("SIGINT") and process.listeners("SIGTERM") before the call,
then assert the post-settlement listener arrays match those snapshots by
identity. Replace the listener-count assertions while preserving the existing
setup and create-stream invocation.

Source: Path instructions

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

Nitpick comments:
In `@src/lib/sandbox/create-stream-process-group.test.ts`:
- Around line 142-155: Update the test around streamSandboxCreate to snapshot
process.listeners("SIGINT") and process.listeners("SIGTERM") before the call,
then assert the post-settlement listener arrays match those snapshots by
identity. Replace the listener-count assertions while preserving the existing
setup and create-stream invocation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 8d4c86d7-60fc-478b-87d6-f3c6418fa14b

📥 Commits

Reviewing files that changed from the base of the PR and between ac4df56 and 0e6c8e1.

📒 Files selected for processing (11)
  • src/lib/onboard/exit-step-failure.test.ts
  • src/lib/onboard/exit-step-failure.ts
  • src/lib/onboard/machine/runtime.ts
  • src/lib/onboard/machine/transitions.ts
  • src/lib/onboard/runtime-boundary.test.ts
  • src/lib/onboard/runtime-boundary.ts
  • src/lib/sandbox/create-stream-process-group.test.ts
  • src/lib/sandbox/create-stream.ts
  • src/lib/state/onboard-session.ts
  • test/helpers/rebuild-flow-target-image-cases.ts
  • test/onboard-sandbox-recreation.test.ts
🚧 Files skipped from review as they are similar to previous changes (5)
  • test/onboard-sandbox-recreation.test.ts
  • src/lib/onboard/runtime-boundary.ts
  • src/lib/onboard/exit-step-failure.test.ts
  • src/lib/onboard/machine/runtime.ts
  • src/lib/sandbox/create-stream.ts

@senthilr-nv senthilr-nv self-assigned this Jul 31, 2026
@senthilr-nv

Copy link
Copy Markdown
Collaborator

Automated review disposition for head 312ed71f3772623d57770facfc52ae1589bef55b and base 57f73a509cd7e950e01af1423b2514ef352bec82:

  • CodeRabbit's durable-interruption finding is resolved. failure.interrupted in the persisted session is now the only interruption authority; the process-global latch was removed.
  • The recordSessionComplete() fallback, host SIGINT and SIGTERM cleanup, exact process-group target assertion, test-spy restoration, process-group ownership cleanup, and exact signal-listener restoration findings are resolved in the displayed commits.
  • The docstring-coverage warning is not actionable for this change. The repository does not require docstrings for these local functions, and the changed comments already explain the non-obvious process and state invariants.
  • PRA-1 is not actionable as proposed. A genuine host interruption must remain terminal and resumable. Automatically applying an in-flight result after that interruption would bypass the durable terminal state. The defect path is corrected earlier: the ready-gate signal now targets an owned child process group and cannot signal the CLI process group. The process-group source tests and test/onboard-sandbox-recreation.test.ts cover that separation; the interrupted-session tests cover the separate fail-closed recovery behavior.

An independent nine-category security review passed for this exact head/base pair with no findings. The documentation writer review also passed with no-docs-needed because the existing onboard --resume recovery guidance remains accurate.

@senthilr-nv senthilr-nv 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 Files changed for PR head 312ed71 against base 57f73a5. I approve this exact head/base pair for merge.

Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
@senthilr-nv

Copy link
Copy Markdown
Collaborator

Automated review disposition for head f110f41c32f274a1e16d80339bde6153ebe06515 and base 57f73a509cd7e950e01af1423b2514ef352bec82:

  • CodeRabbit's durable-interruption finding is resolved. failure.interrupted in the persisted session is now the only interruption authority; the process-global latch was removed.
  • The recordSessionComplete() fallback, host SIGINT and SIGTERM cleanup, exact process-group target assertion, test-spy restoration, process-group ownership cleanup, and exact signal-listener restoration findings are resolved in the displayed commits.
  • The growth-guard failure is resolved by keeping the test-helper ownership release linear without adding an if statement.
  • The docstring-coverage warning is not actionable for this change. The repository does not require docstrings for these local functions, and the changed comments already explain the non-obvious process and state invariants.
  • PRA-1 is not actionable as proposed. A genuine host interruption must remain terminal and resumable. Automatically applying an in-flight result after that interruption would bypass the durable terminal state. The defect path is corrected earlier: the ready-gate signal now targets an owned child process group and cannot signal the CLI process group. The process-group source tests and test/onboard-sandbox-recreation.test.ts cover that separation; the interrupted-session tests cover the separate fail-closed recovery behavior.

An independent nine-category security review passed for this exact head/base pair with no findings. The documentation writer review also passed with no-docs-needed because the existing onboard --resume recovery guidance remains accurate.

@senthilr-nv senthilr-nv 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 Files changed for PR head f110f41 against base 57f73a5, including the linear test-cleanup follow-up. I approve this exact head/base pair for merge.

@senthilr-nv

Copy link
Copy Markdown
Collaborator

Automated review disposition for head f110f41c32f274a1e16d80339bde6153ebe06515 and base 57f73a509cd7e950e01af1423b2514ef352bec82:

@senthilr-nv

Copy link
Copy Markdown
Collaborator

Automated review disposition for head a695af6eafc2dc50ec8170ac068ef8773ffdac09 and base 60b33abeca789b35aa8970d169948a279147376e:

  • CodeRabbit's durable-interruption finding is resolved. failure.interrupted in the persisted session is now the only interruption authority; the process-global latch was removed.
  • The recordSessionComplete() fallback, host SIGINT and SIGTERM cleanup, exact process-group target assertion, test-spy restoration, process-group ownership cleanup, and exact signal-listener restoration findings are resolved in the displayed commits.
  • The growth-guard failure is resolved by keeping the test-helper ownership release linear without adding an if statement.
  • The docstring-coverage warning is not actionable for this change. The repository does not require docstrings for these local functions, and the changed comments already explain the non-obvious process and state invariants.
  • PRA-1 is not actionable as proposed. A genuine host interruption must remain terminal and resumable. Automatically applying an in-flight result after that interruption would bypass the durable terminal state. The defect path is corrected earlier: the ready-gate signal now targets an owned child process group and cannot signal the CLI process group. The process-group source tests and test/onboard-sandbox-recreation.test.ts cover that separation; the interrupted-session tests cover the separate fail-closed recovery behavior.
  • Nemotron's architecture warning about four files shared with open PR refactor(onboard): make runtime the machine authority #7716 is acknowledged as a merge-order risk, not a defect in this exact state. PR refactor(onboard): make runtime the machine authority #7716 remains open on an older base. Land fix(onboard): report an interrupted onboard instead of an invalid transition #8000 first; before refactor(onboard): make runtime the machine authority #7716 lands, it must refresh from the then-current main and revalidate the durable interruption guards at the machine/runtime boundary. No code change is warranted in fix(onboard): report an interrupted onboard instead of an invalid transition #8000 for this sequencing-only warning.

An independent nine-category security review passed for this exact head/base pair with no findings. The documentation writer review also passed with no-docs-needed because the existing onboard --resume recovery guidance remains accurate.

@senthilr-nv
senthilr-nv merged commit 1fc2ad1 into main Jul 31, 2026
71 of 75 checks passed
@senthilr-nv
senthilr-nv deleted the fix/onboard-terminal-state-race branch July 31, 2026 17:54
@senthilr-nv senthilr-nv mentioned this pull request Aug 1, 2026
23 tasks
senthilr-nv added a commit that referenced this pull request Aug 1, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Adds the canonical dated changelog entry for `v0.0.100` so the
maintainer release plan can verify the pre-tag documentation
prerequisite. The entry summarizes the user-facing changes merged since
`v0.0.99` and links to the relevant guides.

## Changes

- Add `docs/changelog/2026-07-31.mdx` with the exact `## v0.0.100`
heading.
- Cover restored OpenClaw pairing, transactional replacement, Deep
Agents Code, onboarding recovery, lifecycle cleanup, Hermes builds, host
provenance, documentation, and trusted E2E evidence.
- Distinguish active Docker and Kubernetes runtime-bundle enforcement
from the still-inactive managed shared-state transaction foundation.

## Source Coverage

The release entry maps the doc-impacting merged PRs in the
`v0.0.99..main` release range to `docs/changelog/2026-07-31.mdx`: #8021,
#8024, #7973, #8028, #7947, #7788, #7884, #8023, #7969, #8020, #7989,
#8000, #7907, #7942, #7567, #8013, #7955, #8017, #8014, #8015, #7629,
#7644, #7821, #7971, and #7991.

PR #7974 was reviewed after the final rebase and excluded because it
changes internal maintainer-skill attribution policy and tests only; it
does not change a user-facing product or 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: the
changelog contract test validates the dated entry, version heading, SPDX
form, and route constraints.
- [ ] Tests not applicable — justification:
- [x] Docs updated for user-facing behavior changes
- [ ] Docs not applicable — justification:
- [ ] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [ ] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification:
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `docs-updated`
- Evidence: `docs/changelog/2026-07-31.mdx`; exact-head review passed
for `6093f44f`; writing rules and documentation style reviewed; `npx
vitest run test/changelog-docs.test.ts` passed 6/6; `npm run docs`
passed with zero Fern errors and two generic Fern upgrade notices.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 6093f44 -->
<!-- docs-review-agents-blob-sha: 3dd7c24 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable; no DGX Station host script changed.
- Station profile/scenario: Not applicable.
- Result: Not applicable.
- Supporting evidence: Not applicable.

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — command/result or justification: `npx
vitest run test/changelog-docs.test.ts` passed 6/6 at `6093f44f`.
- [ ] 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 a dated
prose-only release entry.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only) —
validation passed with zero errors; Fern emitted two generic upgrade
notices.
- [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)
— the changelog entry has the required parser-safe MDX SPDX header;
dated changelog entries intentionally do not use page frontmatter.

---

Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
  * Added release notes for v0.0.100.
* Documented improvements to restore pairing, sandbox replacement,
onboarding recovery, lifecycle cleanup, runtime handling, build support,
host readiness, and end-to-end validation.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Senthil Ravichandran <senthilr@nvidia.com>
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 NV QA Bugs found by the NVIDIA QA Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nemoclaw onboard fails with InvalidOnboardMachineTransitionError after successful sandbox creation

3 participants