Skip to content

feat(onboard): map and coordinate startup profiles - #7960

Merged
ericksoa merged 16 commits into
mainfrom
feat/buildless-profile-application-coordinator
Jul 31, 2026
Merged

feat(onboard): map and coordinate startup profiles#7960
ericksoa merged 16 commits into
mainfrom
feat/buildless-profile-application-coordinator

Conversation

@ericksoa

@ericksoa ericksoa commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Summary

Maps managed startup profiles into explicit all-agent application plans and coordinates their preparation. The slice covers OpenClaw, Hermes, and LangChain Deep Agents Code without mutating image state or activating production buildless onboarding.

Related Issue

Part of #7744

Changes

  • Map validated startup profiles into fail-closed agent environment and application plans.
  • Coordinate profile preparation without container-engine-specific central branches.
  • Cover OpenClaw, Hermes, and DCode configuration, dashboard, messaging, tuning, and inference dispositions.
  • Keep the OpenClaw primary-model fixture internally consistent and map the shared Hermes dashboard port.
  • Reject unsupported agent/input combinations before application.
  • Derive the executable fixture agent set from the canonical catalog and cover every CLI success/failure path for all three agents.
  • Keep filesystem/shared-state mutation and production activation out of this slice.

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: This internal mapping/coordinator layer has no production caller and changes no CLI, configuration, default, workflow, or support claim.
  • 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: Exact-diff and independent P1/P2 reviews confirmed fail-closed all-agent mapping, no raw credentials, no Podman-specific central switch, and no state mutation; the exact-head advisor race was fixed with no-replace CAS and independently re-audited.
  • 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: no-docs-needed
  • Evidence: The exact eight-file diff (+3,587/-0) adds dormant profile mapping, coordination, and focused tests only; there is no user-visible activation or documentation contract change.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • Exact validated head/base: 7d1668bbe6b1758539531db185903fb0256b150a / 91fc63ede7775e2825be8ad6b3c5e5b8706f0119
  • Review budget: 8 files, +3,587/-0; no documentation paths.
  • 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: The 45 CLI-project slice tests plus 10 executable fixture CLI-path tests pass; the 24 transaction tests pass under five shuffled seeds; CLI typecheck/build and npm run validate:pr pass; git diff --check is clean.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: Exact-head required CI is the broad gate for this inert slice.
  • 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)

Stack

  • Base: PR3.3 branch feat/buildless-image-runtime-construction at 91fc63ede7775e2825be8ad6b3c5e5b8706f0119
  • This slice: PR3.4a branch feat/buildless-profile-application-coordinator at 7d1668bbe6b1758539531db185903fb0256b150a
  • Next: PR3.4b applies the plan in managed images and owns exact cleanup semantics. It is not part of this review diff.
  • Buildless support remains disabled until every supported agent and required qualification gate passes.

Signed-off-by: Aaron Erickson aerickson@nvidia.com

Summary by CodeRabbit

  • New Features

    • Added managed startup support for OpenClaw, Hermes, and DCode agents.
    • Applies agent configuration, proxy settings, messaging setup, dashboards, and corporate CA certificates.
    • Supports secure, atomic profile preparation with validation, permissions enforcement, recovery, and idempotent commits.
    • Added safeguards against invalid, tampered, incomplete, or mismatched startup profiles.
  • Tests

    • Added comprehensive coverage for environment mapping, security checks, recovery, retries, validation, and multi-agent coordination.
    • Added fixture generation and validation coverage for supported agents and startup configuration options.

ericksoa added 10 commits July 30, 2026 14:50
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Added managed startup profile fixtures and agent environment mapping for OpenClaw, Hermes, and LangChain Deep Agents Code. Added secure profile preparation, corporate CA validation, generation recovery, atomic commitment, adapter coordination, and comprehensive tests.

Changes

Managed startup

Layer / File(s) Summary
Profile fixture generation
scripts/checks/generate-managed-startup-profile-fixture.mts, test/generate-managed-startup-profile-fixture.test.ts
Generates and validates encoded profiles for all supported agents, with proxy, model, and corporate CA variants.
Agent environment mapping
src/lib/onboard/managed-startup/agent-environment.ts, src/lib/onboard/managed-startup-agent-environment.test.ts
Maps profiles to deterministic environment values, root-owned materials, and ordered agent actions. Tests cover agent behavior, disabled states, validation, serialization, and secret exclusion.
Secure application preparation and commitment
src/lib/onboard/managed-startup/application.ts, src/lib/onboard/managed-startup-application.test.ts
Adds root-only preparation, secure filesystem checks, corporate CA validation, atomic generations, recovery, pending state, idempotent reuse, and commitment.
Adapter coordination and retry flow
src/lib/onboard/managed-startup/coordinator.ts, src/lib/onboard/managed-startup-coordinator.test.ts
Validates adapter registries, applies pending profiles through matching adapters, commits successful applications, and retries failed operations.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ManagedStartupCoordinator
  participant prepareManagedStartupApplication
  participant ManagedStartupAgentAdapter
  participant commitManagedStartupApplication
  ManagedStartupCoordinator->>prepareManagedStartupApplication: prepare profile and recover state
  prepareManagedStartupApplication-->>ManagedStartupCoordinator: pending or committed application
  ManagedStartupCoordinator->>ManagedStartupAgentAdapter: apply pending agent environment
  ManagedStartupAgentAdapter-->>ManagedStartupCoordinator: application result
  ManagedStartupCoordinator->>commitManagedStartupApplication: commit prepared application
  commitManagedStartupApplication-->>ManagedStartupCoordinator: committed application
Loading

Possibly related PRs

  • NVIDIA/NemoClaw#7946: Provides the managed startup profile schema and transport contracts consumed here.
  • NVIDIA/NemoClaw#7959: Adds onboarding and profile-builder modules consumed by this implementation.
  • NVIDIA/NemoClaw#7892: Relates to Hermes dashboard profile handling used by the environment mapper.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 6.82% 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 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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main changes: mapping and coordinating managed startup profiles.
✨ 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 feat/buildless-profile-application-coordinator

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

@ericksoa ericksoa added area: onboarding Onboarding FSM, provider setup, sandbox launch, or first-run flow area: security Security controls, permissions, secrets, or hardening feature PR adds or expands user-visible functionality platform: container Affects Docker, containerd, Podman, or images 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 7d1668b in the feat/buildless-profi... branch remains at 96%, unchanged from commit 91fc63e in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit 7d1668b in the feat/buildless-profi... branch remains at 81%, unchanged from commit 91fc63e in the main branch.

Show a code coverage summary of the most impacted files.
File main 91fc63e feat/buildless-profi... 7d1668b +/-
src/lib/onboard...box-prebuild.ts 92% 74% -18%
src/lib/actions...ocker-health.ts 82% 65% -17%
src/lib/actions...confirmation.ts 79% 69% -10%
src/lib/onboard/preflight.ts 80% 80% 0%
src/lib/onboard...host-anchors.ts 90% 94% +4%
src/lib/domain/.../connect-env.ts 89% 97% +8%
src/lib/onboard/docker-cdi.ts 70% 80% +10%
src/lib/onboard.../application.ts 0% 86% +86%
src/lib/onboard.../coordinator.ts 0% 89% +89%
src/lib/onboard...-environment.ts 0% 92% +92%

Updated July 31, 2026 04:54 UTC

@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: Review the warnings below.
Findings: 0 blockers · 1 warning · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 1 warning · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized E2E selections differ; Nemotron reported the same number of blockers, 1 fewer warning, the same number of suggestions.

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: onboard-repair, onboard-resume, cloud-onboard

1 optional E2E recommendation
  • sandbox-operations
1 warning · 0 suggestions

Warnings

Warnings do not block.

PRA-1 Warning — Remove or connect the unused managed-startup framework

  • Location: src/lib/onboard/managed-startup/coordinator.ts:129
  • Category: architecture
  • Problem: The new coordinator, state applicator, and profile mapper are exported but have no production caller. The patch therefore adds a 1,622-line transaction and adapter layer that cannot apply a startup profile in a managed image.
  • Impact: Managed-image startup behavior remains unchanged while the repository carries an unexercised privileged state and adapter framework.
  • Recommendation: Wire the existing managed-image startup entrypoint to concrete adapters through this coordinator, or remove the unused framework until that consumer is included.
  • Verification: Search production TypeScript and image-entrypoint sources for an import and invocation of coordinateManagedStartupApplication.
  • Test coverage: Add an integration test for the managed-image startup entrypoint that supplies a profile and proves it invokes the matching concrete adapter and commits the state.
  • Simplification (delete): Remove The unused mapper, applicator, coordinator, and their tests if no current startup entrypoint will consume them.; use Retain only the profile contract needed by an active caller; add orchestration with its concrete image integration.. Net: 0 lines.
  • Keep: Do not remove profile validation, root-owned state checks, or CA validation once an active managed-image entrypoint uses them.
  • Evidence: src/lib/onboard/managed-startup/coordinator.ts:129 exports coordinateManagedStartupApplication. src/lib/onboard/managed-startup/application.ts:843 exports prepareManagedStartupApplication. src/lib/onboard/managed-startup/agent-environment.ts:456 exports mapManagedStartupProfileToAgentEnvironment. A repository search returned no production import or invocation outside these new modules; all external references are test files.

Workflow run details

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

ericksoa added 2 commits July 30, 2026 18:52
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa added the needs: review PR is conflict-free and awaiting maintainer review label Jul 31, 2026
Base automatically changed from feat/buildless-image-runtime-construction to main July 31, 2026 02:35
Preserve the exact reviewed tree while moving the stacked base to merged PR3.3.

Signed-off-by: Aaron Erickson <aerickson@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.

Actionable comments posted: 2

🧹 Nitpick comments (6)
src/lib/onboard/managed-startup-agent-environment.test.ts (1)

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

Remove the assertion that cannot fail.

phase is typed as "runtime-setup" | "post-agent-install", and Lines 575-582 already pin the exact phase and runAs pairs. This assertion cannot fail, so it adds no behavioral confidence. If the intent is to freeze the action vocabulary against an agent-install phase, assert that at the type or contract level instead.

♻️ Proposed cleanup
-    expect(messagingActions.map((action) => String(action.phase))).not.toContain("agent-install");

Based on path instructions: "Flag copied production algorithms, broad mocks that bypass the behavior under test, and conditionals that make a test pass without exercising its claim."

🤖 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/managed-startup-agent-environment.test.ts` at line 583,
Remove the redundant `messagingActions.map(...).not.toContain("agent-install")`
assertion from the test. Keep the exact phase and `runAs` assertions around
lines 575–582, and do not add a replacement unless a separate type or
contract-level check is already supported.

Source: Path instructions

src/lib/onboard/managed-startup-application.test.ts (1)

203-205: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert the canonical profile against an independent expectation.

Both sides of this assertion read the same file. The check therefore proves only that the stored bytes contain no incidental whitespace. It cannot fail if the key order or the payload is wrong.

Compare the stored bytes to the canonical serialization of the fixture profile.

💚 Proposed assertion
-    expect(fs.readFileSync(prepared.profilePath, "utf8")).toBe(
-      JSON.stringify(JSON.parse(fs.readFileSync(prepared.profilePath, "utf8"))),
-    );
+    expect(fs.readFileSync(prepared.profilePath, "utf8")).toBe(
+      serializeManagedStartupProfile(profileFor(agent)),
+    );

Extend the existing profile import:

 import {
   encodeManagedStartupProfile,
   MANAGED_STARTUP_PROFILE_SCHEMA_VERSION,
+  serializeManagedStartupProfile,
   type ManagedStartupAgent,

Based on path instructions: "Prefer observable outcomes through the public boundary over source-text, private-shape, or mock-call assertions."

🤖 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/managed-startup-application.test.ts` around lines 203 - 205,
Update the assertion in the managed startup application test to compare the
stored profile bytes from prepared.profilePath against the canonical JSON
serialization of the fixture profile, using the existing profile fixture/import
rather than parsing and re-reading the same file. Preserve the UTF-8 read and
verify both payload content and key ordering through the public file output.

Source: Path instructions

src/lib/onboard/managed-startup/application.ts (1)

156-172: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Validate every ancestor of the state directory, not only the immediate parent.

requireSecureDirectory(parent, runtime, false) checks one component. The failure text says "state directory component", so the intent is broader. If any higher ancestor is group- or world-writable, an attacker with write access there can replace the parent directory between the check and mkdirSync. Root-only execution limits the exposure today, so treat this as hardening.

Walk the ancestor chain from the filesystem root down to the parent.

🛡️ Proposed ancestor validation
   const normalized = path.resolve(stateDirectory);
-  const parent = path.dirname(normalized);
-  requireSecureDirectory(parent, runtime, false);
+  for (const ancestor of ancestorsOf(path.dirname(normalized))) {
+    requireSecureDirectory(ancestor, runtime, false);
+  }

Add the helper next to requireSecureDirectory:

function ancestorsOf(target: string): string[] {
  const chain: string[] = [];
  let current = target;
  for (;;) {
    chain.unshift(current);
    const parent = path.dirname(current);
    if (parent === current) return chain;
    current = parent;
  }
}
🤖 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/managed-startup/application.ts` around lines 156 - 172,
Update the state-directory setup around requireSecureDirectory to validate every
ancestor from the filesystem root through the state directory’s parent, rather
than only the immediate parent. Add an ancestorsOf helper beside
requireSecureDirectory, iterate its returned chain in root-to-parent order, and
preserve the existing final validation of normalized after creation.
src/lib/onboard/managed-startup-coordinator.test.ts (1)

229-253: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Make the fake model the state after a commit, or narrow the title.

dependenciesFor returns the same prepared object with status "prepared" on every call. After a real commit, prepareManagedStartupApplication returns already-committed, and the coordinator then skips the adapter. This test therefore cannot distinguish recovery from an interrupted commit from a plain second dispatch.

Make prepareApplication return already-committed once commitApplication has succeeded. Then assert that the adapter runs exactly once and the commit is revalidated.

💚 Proposed stateful fake for the commit-boundary test
   it("reapplies a pending adapter after a crash at the commit boundary", async () => {
     const prepared = preparedFor("langchain-deepagents-code");
     const dependencies = dependenciesFor(prepared);
     const { adapters, applyByAgent } = adaptersFor();
+    let committedOnce = false;
+    dependencies.prepareApplication.mockImplementation(async () =>
+      committedOnce ? preparedFor("langchain-deepagents-code", "already-committed") : prepared,
+    );
     dependencies.commitApplication.mockRejectedValueOnce(
       new Error("simulated process interruption"),
     );
+    dependencies.commitApplication.mockImplementation(async (application) => {
+      committedOnce = true;
+      return committedFrom(application);
+    });

Then assert the recovery outcome:

     expect(retried.application.status).toBe("committed");
-    expect(applyByAgent["langchain-deepagents-code"]).toHaveBeenCalledTimes(2);
-    expect(dependencies.commitApplication).toHaveBeenCalledTimes(2);
+    expect(retried.adapterApplied).toBe(true);
+    expect(applyByAgent["langchain-deepagents-code"]).toHaveBeenCalledTimes(2);
+    expect(dependencies.commitApplication).toHaveBeenCalledTimes(2);

mockRejectedValueOnce still takes priority over mockImplementation for the first commit call, so the interruption is preserved.

Based on path instructions: "Flag copied production algorithms, broad mocks that bypass the behavior under test, and conditionals that make a test pass without exercising its claim."

🤖 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/managed-startup-coordinator.test.ts` around lines 229 - 253,
Update the commit-boundary test around coordinateManagedStartupApplication so
the fake prepareApplication state reflects a successful commit: keep returning
the prepared state until commitApplication succeeds, then return
already-committed on subsequent preparation. Preserve the first simulated commit
rejection, and assert that the adapter runs once while commitApplication is
called twice to verify recovery and revalidation rather than a second dispatch.

Source: Path instructions

src/lib/onboard/managed-startup/coordinator.ts (2)

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

Unreachable identity guards in coordinator.ts. createAdapterRegistry keys every entry by adapter.agent and rejects unshipped agents, duplicates, and missing agents. The agent-to-entry mapping is therefore guaranteed by construction, and each later identity guard is dead code.

  • src/lib/onboard/managed-startup/coordinator.ts#L86-L99: delete the byAgent.size check and the per-agent if (!adapter) guard; build the frozen registry directly from byAgent.
  • src/lib/onboard/managed-startup/coordinator.ts#L145-L148: delete the cross-dispatch check and call registry[prepared.profile.agent].apply(...) directly.

Based on learnings: avoid defensive error handling around internal helper logic when there is no realistic failure mode.

🤖 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/managed-startup/coordinator.ts` around lines 86 - 99, Remove
the redundant identity guards in createAdapterRegistry at
src/lib/onboard/managed-startup/coordinator.ts#L86-L99, including the
byAgent.size check and per-agent missing-adapter guard, and build the frozen
registry directly from byAgent. At
src/lib/onboard/managed-startup/coordinator.ts#L145-L148, remove the
cross-dispatch validation and call registry[prepared.profile.agent].apply(...)
directly.

Source: Learnings


31-52: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Remove the unused dependency-injection seam.

No production entrypoint calls coordinateManagedStartupApplication; ManagedStartupCoordinatorDependencies is used only by tests. Remove the seam or link the follow-up that adds its production consumer and protecting test.

🤖 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/managed-startup/coordinator.ts` around lines 31 - 52, Remove
the unused ManagedStartupCoordinatorDependencies interface and
DEFAULT_DEPENDENCIES injection seam, and update
coordinateManagedStartupApplication to use the production preparation and commit
functions directly. Adjust related signatures and tests to match, without adding
a production consumer.

Source: Coding guidelines

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

Inline comments:
In `@scripts/checks/generate-managed-startup-profile-fixture.mts`:
- Line 16: Update the AGENTS declaration in the startup profile fixture
generator to import and use MANAGED_STARTUP_AGENTS when constructing the Set,
removing the duplicated hardcoded agent list so newly supported agents remain
synchronized with the canonical definition.
- Around line 189-229: Add focused CLI coverage for the `main` entry point in
`generate-managed-startup-profile-fixture.mts`, exercising `--corporate-ca-b64`,
missing `--agent`, invalid agent input, unsupported arguments, and valid
combinations of supported flags. Assert both emitted output and failure
behavior, while invoking the script through its CLI path so the executable
wrapper is covered.

---

Nitpick comments:
In `@src/lib/onboard/managed-startup-agent-environment.test.ts`:
- Line 583: Remove the redundant
`messagingActions.map(...).not.toContain("agent-install")` assertion from the
test. Keep the exact phase and `runAs` assertions around lines 575–582, and do
not add a replacement unless a separate type or contract-level check is already
supported.

In `@src/lib/onboard/managed-startup-application.test.ts`:
- Around line 203-205: Update the assertion in the managed startup application
test to compare the stored profile bytes from prepared.profilePath against the
canonical JSON serialization of the fixture profile, using the existing profile
fixture/import rather than parsing and re-reading the same file. Preserve the
UTF-8 read and verify both payload content and key ordering through the public
file output.

In `@src/lib/onboard/managed-startup-coordinator.test.ts`:
- Around line 229-253: Update the commit-boundary test around
coordinateManagedStartupApplication so the fake prepareApplication state
reflects a successful commit: keep returning the prepared state until
commitApplication succeeds, then return already-committed on subsequent
preparation. Preserve the first simulated commit rejection, and assert that the
adapter runs once while commitApplication is called twice to verify recovery and
revalidation rather than a second dispatch.

In `@src/lib/onboard/managed-startup/application.ts`:
- Around line 156-172: Update the state-directory setup around
requireSecureDirectory to validate every ancestor from the filesystem root
through the state directory’s parent, rather than only the immediate parent. Add
an ancestorsOf helper beside requireSecureDirectory, iterate its returned chain
in root-to-parent order, and preserve the existing final validation of
normalized after creation.

In `@src/lib/onboard/managed-startup/coordinator.ts`:
- Around line 86-99: Remove the redundant identity guards in
createAdapterRegistry at src/lib/onboard/managed-startup/coordinator.ts#L86-L99,
including the byAgent.size check and per-agent missing-adapter guard, and build
the frozen registry directly from byAgent. At
src/lib/onboard/managed-startup/coordinator.ts#L145-L148, remove the
cross-dispatch validation and call registry[prepared.profile.agent].apply(...)
directly.
- Around line 31-52: Remove the unused ManagedStartupCoordinatorDependencies
interface and DEFAULT_DEPENDENCIES injection seam, and update
coordinateManagedStartupApplication to use the production preparation and commit
functions directly. Adjust related signatures and tests to match, without adding
a production consumer.
🪄 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: 3dd5bedb-759f-493d-84d7-d9d6ed33e1ce

📥 Commits

Reviewing files that changed from the base of the PR and between 91fc63e and bb7a260.

📒 Files selected for processing (7)
  • scripts/checks/generate-managed-startup-profile-fixture.mts
  • src/lib/onboard/managed-startup-agent-environment.test.ts
  • src/lib/onboard/managed-startup-application.test.ts
  • src/lib/onboard/managed-startup-coordinator.test.ts
  • src/lib/onboard/managed-startup/agent-environment.ts
  • src/lib/onboard/managed-startup/application.ts
  • src/lib/onboard/managed-startup/coordinator.ts

Comment thread scripts/checks/generate-managed-startup-profile-fixture.mts Outdated
Comment thread scripts/checks/generate-managed-startup-profile-fixture.mts
@ericksoa ericksoa removed the needs: review PR is conflict-free and awaiting maintainer review label Jul 31, 2026
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@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 (3)
src/lib/onboard/managed-startup-application.test.ts (3)

560-577: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Reduce coupling to internal call order, and confirm the surviving state through the public boundary.

The lstatSync spy throws ENOENT for the first access to committedPath, whichever internal call site that is. The test therefore depends on the internal read order inside preparation. If recoverState gains an earlier committed.json probe, the test silently simulates a different race and still passes.

Add a public-boundary assertion that the winner remains authoritative after the rejection. That keeps the behavioral claim verifiable even if internal read order changes.

♻️ Suggested added assertion
     expect(fs.existsSync(competingGeneration)).toBe(false);
     expect(fs.existsSync(winner.generationDirectory)).toBe(true);
+    vi.restoreAllMocks();
+    const reread = prepare("openclaw");
+    expect(reread.status).toBe("already-committed");
+    expect(reread.fingerprint).toBe(winner.fingerprint);
🤖 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/managed-startup-application.test.ts` around lines 560 - 577,
Update the test around prepareProfile to assert through its public-facing state
or startup behavior that winner.generationDirectory remains authoritative after
the rejected changed profile. Keep the existing rejection and cleanup
assertions, but add a post-rejection public-boundary check rather than relying
solely on the lstatSync call-order spy or internal filesystem details.

Source: Path instructions


409-431: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert the commit outcome, not only the absence of a throw.

Lines 416 and 430 only prove that commitManagedStartupApplication does not throw. They do not prove that the recovered generation became the committed state. Assert the returned status and the persisted committed.json fingerprint.

♻️ Suggested stronger assertion
-    expect(() => commitManagedStartupApplication(recovered, runtime)).not.toThrow();
+    const committed = commitManagedStartupApplication(recovered, runtime);
+    expect(committed.status).toBe("committed");
+    expect(
+      JSON.parse(fs.readFileSync(path.join(stateDirectory, "committed.json"), "utf8")),
+    ).toMatchObject({ fingerprint: recovered.fingerprint });
🤖 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/managed-startup-application.test.ts` around lines 409 - 431,
Strengthen both recovery tests around commitManagedStartupApplication by
capturing its returned result and asserting the committed status, then read
persisted committed.json and verify its fingerprint matches the recovered
generation (or first preparation). Replace the current not.toThrow-only
assertions while preserving the existing recovery and cleanup checks.

Source: Path instructions


436-443: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Extract the competing-profile fixture.

The same changed profile construction repeats at lines 436-443, 452-459, 492-499, and 540-547. Each block calls profileFor("openclaw") twice. A small helper removes the duplication and makes the differing model the only visible variable.

♻️ Suggested helper
+  function competingProfile(model: string): ManagedStartupProfile {
+    const base = profileFor("openclaw");
+    return {
+      ...base,
+      inference: { ...base.inference, model, primaryModelRef: `inference/${model}` },
+    };
+  }

Then replace each inline block:

-    const changed = {
-      ...profileFor("openclaw"),
-      inference: {
-        ...profileFor("openclaw").inference,
-        model: "nvidia/a-competing-model",
-        primaryModelRef: "inference/nvidia/a-competing-model",
-      },
-    };
+    const changed = competingProfile("nvidia/a-competing-model");
🤖 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/managed-startup-application.test.ts` around lines 436 - 443,
Extract the repeated changed-profile construction in the managed startup
application tests into a small helper that accepts the competing model and
derives its primaryModelRef. Replace each repeated block around the affected
test cases with calls to that helper, preserving the existing openclaw profile
base and making the model value the only per-test input.
🤖 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/onboard/managed-startup-application.test.ts`:
- Around line 560-577: Update the test around prepareProfile to assert through
its public-facing state or startup behavior that winner.generationDirectory
remains authoritative after the rejected changed profile. Keep the existing
rejection and cleanup assertions, but add a post-rejection public-boundary check
rather than relying solely on the lstatSync call-order spy or internal
filesystem details.
- Around line 409-431: Strengthen both recovery tests around
commitManagedStartupApplication by capturing its returned result and asserting
the committed status, then read persisted committed.json and verify its
fingerprint matches the recovered generation (or first preparation). Replace the
current not.toThrow-only assertions while preserving the existing recovery and
cleanup checks.
- Around line 436-443: Extract the repeated changed-profile construction in the
managed startup application tests into a small helper that accepts the competing
model and derives its primaryModelRef. Replace each repeated block around the
affected test cases with calls to that helper, preserving the existing openclaw
profile base and making the model value the only per-test input.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 84766dba-3866-4f93-b5a5-10906e059bfa

📥 Commits

Reviewing files that changed from the base of the PR and between b14013f and c95bdf7.

📒 Files selected for processing (2)
  • src/lib/onboard/managed-startup-application.test.ts
  • src/lib/onboard/managed-startup/application.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/onboard/managed-startup/application.ts

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa

Copy link
Copy Markdown
Contributor Author

Advisor PRA-1 disposition: acknowledged and intentionally not implemented in this review unit. #7960 is the dormant all-agent mapping/coordinator contract required by #7744; adding a production image-entrypoint caller here would violate the epic invariant that earlier slices remain inert and that user-visible buildless activation occurs only after OpenClaw, Hermes, and DCode, multi-architecture image integration, recovery, GPU/local-inference coverage, and protected E2E qualify together.

Concrete managed-image application follows in #7961, shared-state transactions in #7969, image-owned all-agent entrypoint integration in PR3.13, protected qualification in PR3.14, and production onboarding activation in PR3.15. The framework is retained because those immediate descendants consume the contract; it is not advertised or selectable in #7960. No production-wiring change belongs in this slice.

@ericksoa
ericksoa merged commit 64d6828 into main Jul 31, 2026
112 of 116 checks passed
@ericksoa
ericksoa deleted the feat/buildless-profile-application-coordinator branch July 31, 2026 05:10
@sandl99 sandl99 mentioned this pull request Jul 31, 2026
23 tasks
sandl99 added a commit that referenced this pull request Jul 31, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Adds the canonical July 30 release entry for `v0.0.99` before the
release tag is captured.
The entry covers all 37 merged PRs since `v0.0.98` and bounds
experimental or dormant work without presenting it as supported
behavior.

## Changes

- Adds `docs/changelog/2026-07-30.mdx` with the exact `## v0.0.99`
heading, parser-safe MDX SPDX comment, summary, detailed release
bullets, and published documentation routes.
- Records user-visible recovery, snapshot, shared-route, Hermes,
readiness, inference, image, documentation, and release E2E changes.
- States that the managed-image selection and startup-profile contracts
remain dormant and do not activate buildless onboarding.

Source summary:

- [#7972](#7972) ->
`docs/changelog/2026-07-30.mdx`: Records restored managed OpenClaw
configuration modes during recovery.
- [#7834](#7834) ->
`docs/changelog/2026-07-30.mdx`: Records clone-bound pairing
verification after snapshot restore.
- [#7975](#7975) ->
`docs/changelog/2026-07-30.mdx`: Records managed startup recovery
coverage.
- [#7960](#7960) ->
`docs/changelog/2026-07-30.mdx`: Records dormant startup-profile
coordination without activating a supported surface.
- [#7856](#7856) ->
`docs/changelog/2026-07-30.mdx`: Records persistence of the
credential-free OpenClaw startup command.
- [#7959](#7959) ->
`docs/changelog/2026-07-30.mdx`: Records dormant startup-profile
construction without changing onboarding.
- [#7946](#7946) ->
`docs/changelog/2026-07-30.mdx`: Records the internal startup-profile
schema and transport contract.
- [#7951](#7951) ->
`docs/changelog/2026-07-30.mdx`: Records platform-pull cleanup before
managed-image validation.
- [#7949](#7949) ->
`docs/changelog/2026-07-30.mdx`: Records rejection of retained Hermes
`uv` build cache metadata.
- [#7597](#7597) ->
`docs/changelog/2026-07-30.mdx`: Records separate command and agent
first-turn latency evidence.
- [#7931](#7931) ->
`docs/changelog/2026-07-30.mdx`: Records focused E2E replacement
evidence for retired selectors.
- [#7950](#7950) ->
`docs/changelog/2026-07-30.mdx`: Records exclusion of build-only
BuildKit telemetry from the Deep Agents Code probe.
- [#7665](#7665) ->
`docs/changelog/2026-07-30.mdx`: Records consolidated priority 2 E2E
coverage.
- [#7911](#7911) ->
`docs/changelog/2026-07-30.mdx`: Records the corrected NVIDIA DORI
installation pin.
- [#7934](#7934) ->
`docs/changelog/2026-07-30.mdx`: Records the staging image-family wait
before Brev Launchable deployment.
- [#7772](#7772) ->
`docs/changelog/2026-07-30.mdx`: Records dormant managed-image selection
contracts without activating buildless onboarding.
- [#7941](#7941) ->
`docs/changelog/2026-07-30.mdx`: Records corrected agent-specific
provider and policy guidance.
- [#7819](#7819) ->
`docs/changelog/2026-07-30.mdx`: Records removal of empty Deep Agents
Code provider-switch sections.
- [#7932](#7932) ->
`docs/changelog/2026-07-30.mdx`: Records independent
credential-generation E2E execution.
- [#7840](#7840) ->
`docs/changelog/2026-07-30.mdx`: Records shared-route preservation and
pre-delete peer validation during upgrades.
- [#7874](#7874) ->
`docs/changelog/2026-07-30.mdx`: Records the split between pre-tag
release entries and post-tag Announcements.
- [#7876](#7876) ->
`docs/changelog/2026-07-30.mdx`: Records the writable Hermes runtime
root within lockdown.
- [#7756](#7756) ->
`docs/changelog/2026-07-30.mdx`: Records validated multi-platform
managed-image publication.
- [#7914](#7914) ->
`docs/changelog/2026-07-30.mdx`: Records accepted `uv` version metadata
in Hermes image validation.
- [#7686](#7686) ->
`docs/changelog/2026-07-30.mdx`: Records the explicitly experimental
Microsoft Entra runtime identity reference.
- [#7869](#7869) ->
`docs/changelog/2026-07-30.mdx`: Records classified gateway relaunch
quarantine and rebuild guidance.
- [#7814](#7814) ->
`docs/changelog/2026-07-30.mdx`: Records state restore into replacement
sandboxes and SQLite write verification.
- [#7839](#7839) ->
`docs/changelog/2026-07-30.mdx`: Records quieter onboarding test
execution without a user-facing behavior claim.
- [#7854](#7854) ->
`docs/changelog/2026-07-30.mdx`: Records generalized agent-selection
guidance.
- [#7845](#7845) ->
`docs/changelog/2026-07-30.mdx`: Records isolated CDI test evidence
without a user-facing behavior claim.
- [#7843](#7843) ->
`docs/changelog/2026-07-30.mdx`: Records the corrected Omni sub-agent
model ID.
- [#7908](#7908) ->
`docs/changelog/2026-07-30.mdx`: Records reviewed Hermes and Deep Agents
Code dependency pins.
- [#7887](#7887) ->
`docs/changelog/2026-07-30.mdx`: Records rejection of a symlinked DGX
Station release marker.
- [#7747](#7747) ->
`docs/changelog/2026-07-30.mdx`: Records the internal compute-driver
separation without a user-facing behavior claim.
- [#7660](#7660) ->
`docs/changelog/2026-07-30.mdx`: Records atomic publication of rebuild
recovery manifests.
- [#7661](#7661) ->
`docs/changelog/2026-07-30.mdx`: Records bounded local inference
health-response retention.
- [#7654](#7654) ->
`docs/changelog/2026-07-30.mdx`: Records state preservation across
supervisor relaunch recovery.

## 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 the dated changelog contract,
SPDX comment, version heading, and published routes.
- [ ] 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-30.mdx`; the documentation-only diff
passed review against `WRITING.md`, the controlled word list, and
`docs/CONTRIBUTING.md`. The review covered terminology, structure,
active voice, release meaning, product-scope boundaries, and link and
code presentation. Changelog tests passed 6/6, and the docs build
reported 0 errors with 2 pre-existing warnings.
- Agent: Codex CLI
<!-- docs-review-head-sha: 200940f -->
<!-- docs-review-agents-blob-sha: c052d60 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit:
- Station profile/scenario:
- Result:
- Supporting evidence:

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — command/result or justification: `npx
vitest run test/changelog-docs.test.ts` passed 6/6 tests.
- [ ] 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
documentation-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) —
result: Build passed with 0 errors and 2 pre-existing warnings.
- [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)

---
Signed-off-by: San Dang <sdang@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Added release notes for v0.0.99 covering snapshot restoration, sandbox
recovery, gateway route upgrades, and Hermes security updates.
* Documented experimental Microsoft Entra runtime identity support and
enhanced readiness checks.
* Added details on managed image validation, trusted CI image promotion,
and end-to-end release evidence.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
ericksoa added a commit that referenced this pull request Jul 31, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Applies validated all-agent startup plans inside managed images and
defines exact runtime-input cleanup. It preserves a sanitized child
environment and deterministic replay for OpenClaw, Hermes, and LangChain
Deep Agents Code without enabling production buildless onboarding.

The managed-startup runtime and OCI argv normalizer are deliberately not
installed or invoked by a production image entrypoint in this slice.
PR3.13 is the named consumer that installs the image-owned assets, wires
every applicable OpenClaw, Hermes, and DCode entrypoint together, and
qualifies their exact image layouts. Wiring a production entrypoint here
would make an incomplete, unqualified subset reachable before the
all-agent publication and protected-E2E gates, violating the epic
activation invariant. This PR is internally complete as the dormant
application/runtime contract; production reachability and entrypoint
integration travel with their all-agent image tests in PR3.13.

## Related Issue

Part of #7744

## Changes

- Apply validated agent-environment plans to the managed image runtime.
- Forward or remove each declared runtime input according to its
per-agent disposition.
- Remove OpenClaw-only scheduler controls for Hermes and DCode while
preserving the supported OpenClaw set.
- Keep child commands on a sanitized environment and serialize only
validated application exports into the final runtime.
- Reject NUL, CR, and LF before numeric canonicalization and avoid
implicit `process.env` defaults.
- Refresh committed replay output with a stable fingerprint while
rejecting invalid input before filesystem/coordinator mutation.
- Keep changed test scaffolding branchless so the codebase-growth policy
evaluates the exact behavior linearly.
- Integrate entrypoint, messaging, and sandbox-launch contracts without
activating the stock buildless path.

## Type of Change

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

## Quality Gates

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: The application/runtime code
remains behind dormant managed-startup contracts and changes no
supported CLI, configuration, workflow, or runtime claim.
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: Exact-diff and
independent P1/P2 reviews covered environment sanitization, agent-gated
cleanup, invalid-input ordering, deterministic replay, and absence of
production activation.
- [ ] 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: `no-docs-needed`
- Evidence: The exact fourteen-file diff (`+2,308/-66`) changes dormant
application/runtime internals and focused tests only. No user-visible
buildless support is advertised or enabled.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 13932b9 -->
<!-- docs-review-agents-blob-sha: c052d60 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit:
- Station profile/scenario:
- Result:
- Supporting evidence:

## Verification

- Exact locally validated head/base:
`13932b9b2486cd42b6fc47645e2f3936e5308d1d` /
`f8fb820159c4843a19759efc9b0e28d4aa122440` (exact-head CI and protected
E2E running)
- Review budget: 14 files, `+2,308/-66`; no documentation paths.
- [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: 248
focused tests passed; CLI and plugin builds passed; `npm run
validate:pr` passed; `git diff --check` is clean.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result: Exact-head required CI is
the broad gate for this dormant behavior slice.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

## Stack

- Base: current `main` at `f8fb820159c4843a19759efc9b0e28d4aa122440`
(PR3.4a #7960 remains merged)
- This slice: PR3.4b branch `feat/buildless-managed-image-application`
at `13932b9b2486cd42b6fc47645e2f3936e5308d1d`
- Next: PR3.5 adds root-owned shared-state transactions and Docker
adapters. It is not part of this review diff.
- Buildless support remains disabled until every supported agent and
required qualification gate passes.

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>




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

## Summary by CodeRabbit

- **New Features**
- Added managed startup support for sandboxed agents, including
validated runtime environment forwarding and secure configuration setup.
- OpenClaw now supports fast auto-pair re-entry interval and polling
controls.
- Improved messaging setup by applying only active, enabled channels and
relevant post-install steps.
- Added support for managed startup commands launched with approved
environment variables.

- **Bug Fixes**
- Prevented unsupported, malformed, duplicate, or unsafe startup
environment settings from being applied.
- Improved handling of certificates, configuration files, ownership,
permissions, and runtime metadata during startup.

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

---------

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.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 area: security Security controls, permissions, secrets, or hardening feature PR adds or expands user-visible functionality platform: container Affects Docker, containerd, Podman, or images

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant