feat(onboard): map and coordinate startup profiles - #7960
Conversation
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>
📝 WalkthroughWalkthroughAdded 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. ChangesManaged startup
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
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit 7d1668b in the TypeScript / code-coverage/cliThe overall coverage in commit 7d1668b in the Show a code coverage summary of the most impacted files.
Updated |
PR Review Advisor — No blocking findings reportedAdvisor assessment: No blocking advisor findings reported Model lanes
Nemotron output stays in workflow artifacts and does not change the assessment above. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: 1 optional E2E recommendation
1 warning · 0 suggestionsWarningsWarnings do not block.
|
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Preserve the exact reviewed tree while moving the stacked base to merged PR3.3. Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (6)
src/lib/onboard/managed-startup-agent-environment.test.ts (1)
583-583: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRemove the assertion that cannot fail.
phaseis typed as"runtime-setup" | "post-agent-install", and Lines 575-582 already pin the exact phase andrunAspairs. This assertion cannot fail, so it adds no behavioral confidence. If the intent is to freeze the action vocabulary against anagent-installphase, 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 winAssert 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 winValidate 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 andmkdirSync. 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 winMake the fake model the state after a commit, or narrow the title.
dependenciesForreturns the samepreparedobject with status"prepared"on every call. After a real commit,prepareManagedStartupApplicationreturnsalready-committed, and the coordinator then skips the adapter. This test therefore cannot distinguish recovery from an interrupted commit from a plain second dispatch.Make
prepareApplicationreturnalready-committedoncecommitApplicationhas 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);
mockRejectedValueOncestill takes priority overmockImplementationfor 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 valueUnreachable identity guards in
coordinator.ts.createAdapterRegistrykeys every entry byadapter.agentand 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 thebyAgent.sizecheck and the per-agentif (!adapter)guard; build the frozen registry directly frombyAgent.src/lib/onboard/managed-startup/coordinator.ts#L145-L148: delete the cross-dispatch check and callregistry[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 winRemove the unused dependency-injection seam.
No production entrypoint calls
coordinateManagedStartupApplication;ManagedStartupCoordinatorDependenciesis 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
📒 Files selected for processing (7)
scripts/checks/generate-managed-startup-profile-fixture.mtssrc/lib/onboard/managed-startup-agent-environment.test.tssrc/lib/onboard/managed-startup-application.test.tssrc/lib/onboard/managed-startup-coordinator.test.tssrc/lib/onboard/managed-startup/agent-environment.tssrc/lib/onboard/managed-startup/application.tssrc/lib/onboard/managed-startup/coordinator.ts
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
There was a problem hiding this comment.
🧹 Nitpick comments (3)
src/lib/onboard/managed-startup-application.test.ts (3)
560-577: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winReduce coupling to internal call order, and confirm the surviving state through the public boundary.
The
lstatSyncspy throws ENOENT for the first access tocommittedPath, whichever internal call site that is. The test therefore depends on the internal read order inside preparation. IfrecoverStategains an earliercommitted.jsonprobe, 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 winAssert the commit outcome, not only the absence of a throw.
Lines 416 and 430 only prove that
commitManagedStartupApplicationdoes not throw. They do not prove that the recovered generation became the committed state. Assert the returned status and the persistedcommitted.jsonfingerprint.♻️ 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 winExtract the competing-profile fixture.
The same
changedprofile construction repeats at lines 436-443, 452-459, 492-499, and 540-547. Each block callsprofileFor("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
📒 Files selected for processing (2)
src/lib/onboard/managed-startup-application.test.tssrc/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>
|
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. |
<!-- 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 -->
<!-- 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>
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
Type of Change
Quality Gates
Documentation Writer Review
no-docs-needed+3,587/-0) adds dormant profile mapping, coordination, and focused tests only; there is no user-visible activation or documentation contract change.DGX Station Hardware Evidence
Verification
7d1668bbe6b1758539531db185903fb0256b150a/91fc63ede7775e2825be8ad6b3c5e5b8706f0119+3,587/-0; no documentation paths.Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run validate:prpassed after refreshingorigin/mainwhen hooks were skipped or unavailablenpm run validate:prpass;git diff --checkis clean.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result: Exact-head required CI is the broad gate for this inert slice.npm run docsbuilds without warnings (doc changes only)Stack
feat/buildless-image-runtime-constructionat91fc63ede7775e2825be8ad6b3c5e5b8706f0119feat/buildless-profile-application-coordinatorat7d1668bbe6b1758539531db185903fb0256b150aSigned-off-by: Aaron Erickson aerickson@nvidia.com
Summary by CodeRabbit
New Features
Tests