Replies: 3 comments
|
I like the direction of one integration package per agent runtime. Before implementing that architecture, I would make these refactorings:
I would keep onboarding, messaging providers, policy, state, and OpenShell coordination inside the main NemoClaw package for now. They are product modules, not independently released integrations. This preparation would let the RFC focus on the important boundary: one independently qualifiable integration package per agent runtime. npm workspaces can organize those packages without requiring every workspace to be published through npm. |
|
Separately from the package-identity, workspace, and deterministic-packaging preparation identified by @cv, I see three trust-contract points that read as request-changes items rather than implementation details. They concern what an integration-package result is allowed to establish, how the RFC’s read-only invariant is enforced per operation, and how current support eligibility can be revoked without rewriting historical qualification evidence.
Section 3 permits the in-sandbox helper to apply native configuration, mutate MCP registrations, and reconcile declared agent-owned state. NemoClaw then “records the request identity, result, and applicable product-state receipt.” As written, a result produced by the component performing the mutation can become a product-state receipt without any observation produced by a component independent of that helper. Where an independent observation path exists, the accepted postcondition should be produced by that independent observer. A digest, configuration projection, status response, or similar value computed by the mutating helper would remain the executor’s account of its own effect; routing that value through NemoClaw or OpenShell would not make the evidence independent. Where the pinned OpenShell release provides no independent observation path for a particular native operation, that limitation should remain visible in the record rather than being resolved by treating the helper result as established state. The receipt should distinguish at least:
This would allow the 0.0.106 baseline to proceed where necessary without silently representing an unverified execution claim as equivalent to verified product state. The RFC already asks whether the helper should apply native configuration or return a bounded file-mutation plan for a core applier. I do not think that question can remain only under “Open questions.” The answer determines the available effect-verification path and the meaning of the resulting product-state receipt. The architecture decision should therefore resolve the receipt and evidence semantics even if some operations at the current baseline can produce only executor-claimed results.
The RFC states: “A read-only helper operation cannot change configuration or lifecycle state.” The mechanism currently described checks whether the operation’s declared effect class matches the requested action. That establishes consistency between the request and the declaration; it does not establish that the implementation behaved according to the declaration. Moving effect classification into the contract or catalog would correctly establish who owns the classification, but it would still not prove that a package implementation classified as read-only did not write configuration, alter process state, or otherwise mutate the runtime. The RFC should name the mechanism that prevents or detects such a violation and state the consequence when it occurs. General OpenShell sandbox policy does not appear sufficient by itself if read-only and configuration-changing helper operations execute in the same sandbox under the same filesystem, process, network, and provider grants. A mechanism satisfying the invariant must discriminate at the operation boundary—for example through a separately constrained execution path, operation-specific capabilities, or an independently produced before-and-after observation—and must fail closed when a purportedly read-only operation produces a mutation. This is not an additional invariant being proposed from outside the RFC. It is a request for the RFC to identify how one of its existing invariants is made true.
The support catalog already pins a support state, but the RFC does not define the lifecycle of that state. I do not see a specified transition model, revocation trigger, supersession rule, or consequence for deployments already running a release that later becomes ineligible. The qualification receipt should remain immutable historical evidence that an exact package, image, OpenShell release, driver, and platform combination passed an accepted matrix. That historical fact may remain true even after a vulnerability, compromised artifact, provenance failure, qualification defect, or violation of an asserted package boundary is discovered. Current eligibility therefore needs separate, revocable semantics. Those semantics could be represented through a separate support decision or through explicit catalog fields and transitions, but the RFC should define:
Revocation and supersession are not currently represented in the catalog schema or tracked in the open questions. These three issues are connected. If an operation classified as read-only is later found to have mutated state, prior helper-produced results and product-state receipts from that package may become suspect. The architecture therefore needs both explicit evidence status—executor-claimed versus independently observed—and a defined way to revoke or supersede current eligibility while preserving the historical record. The RFC specifies the ownership and authority boundaries with considerable precision. Verification of effects, per-operation enforcement of effect classes, and the lifecycle of current support eligibility need comparable precision before those boundaries can be relied upon. |
|
I really like this direction and agree with the refactoring roadmap suggested by @cv. Breaking the preparation into small, low-risk steps seems like the cleanest way to set up the foundation before migrating runtime boundaries across core:
I’m going to start working on step 1 to get the package naming and workspace layout sorted out, and will open a PR for review shortly. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
RFC 0002: Modular agent runtime integration packages
Decision
NemoClaw should define one versioned contract for agent runtime integration packages.
After the migration:
The term
pluginremains reserved for a package loaded by an agent runtime. This RFC usesintegration packagefor the NemoClaw boundary.Problem
NemoClaw discovers agent manifests under
agents/*/manifest.yaml. A manifest defines identity, runtime shape, configuration paths, health, inference, Model Context Protocol (MCP) support, state, and packaged artifacts.The manifest does not own all agent-specific behavior. Core code still selects agent behavior during onboarding, startup, inference mutation, recovery, MCP configuration, messaging, Shields operations, state restore, image publication, and end-to-end (E2E) testing.
A scan of commit
c6dbeae8found:src/lib,scripts, andtools.agents/with OpenClaw, Hermes, Deep Agents Code, or Pi in the filename.These counts measure coupling. They do not estimate deletion.
Representative dispatch points include:
profile-builder.ts, which builds separate startup profiles for each agent runtime.mcp-bridge-adapters.ts, which dispatches a closed set of MCP adapters.managed-image/contract.ts, which lists agents, image repositories, and runtime identities.gateway-restart.ts, which contains separate Hermes and OpenClaw recovery behavior.agents/openclaw/manifest.yaml, which records an incomplete artifact move.This structure increases the review and qualification scope for each agent runtime. A change for one runtime can also affect another runtime through shared files.
The internal
RuntimeProviderBundlehas a different role. It contains core-only compatibility for Docker and Kubernetes. Integration packages must not import or extend it. NemoClaw can remove overlapping facets only after a supported OpenShell release provides equivalent behavior and passes the supported E2E matrix.Scope
Goals
Non-goals
This RFC does not:
AgentRevisionstorage.Terms
This RFC uses these OpenClaw RFC 0027 terms where they apply:
Agentagentduring migration, but new contracts must distinguish the logical agent from its runtime.AgentRevisionWorkloadIdentityHarnessagent runtimefor OpenClaw, Hermes, LangChain Deep Agents Code, Pi, and DeepSeek Harness.DriverSandboxDriver, but this RFC does not claim that mapping as shipped.AdapterChannelSecretBrokerRestrictionA package update affects a later deployment or rebuild. It cannot mutate a running deployment through a tag or package selector change.
OpenShell boundary
This design uses two OpenShell references:
ec84074apins OpenShell0.0.106. Implementation and support qualification must use the pinned release until NemoClaw changes the pin.v0.0.110and commit56c45a99show later work. They do not define NemoClaw-supported behavior.OpenShell has three authority layers relevant to this design:
ComputeDriverThe OpenShell roadmap affects future convergence:
OpenShell drivers, gateway interceptors, and supervisor middleware are enforcement extension points. They are not agent runtime packages.
Convergence rules
RuntimeProviderBundle.Design
flowchart LR SOURCE["First-party source in NemoClaw or external source"] --> RELEASE["Versioned package release"] RELEASE --> CATALOG["NemoClaw support catalog"] CATALOG --> CORE["NemoClaw workflow and plan compiler"] CORE --> CLIENT["NemoClaw OpenShell client"] CLIENT --> GATEWAY["OpenShell gateway"] GATEWAY --> DRIVER["ComputeDriver"] GATEWAY --> SUPERVISOR["OpenShell supervisor"] SUPERVISOR --> HELPER["Agent runtime helper"] HELPER --> RUNTIME["Agent runtime"] RECEIPT["Qualification receipt"] --> CATALOGEach integration package contains four parts.
1. Agent runtime descriptor
The descriptor is declarative, versioned, and credential-free. It defines:
The descriptor cannot contain arbitrary host commands, an OpenShell endpoint, a compute-driver selector, or a credential backend.
2. Generic operation plans
NemoClaw compiles operator intent into these versioned, serializable plans:
AgentRuntimeStartupPlanV1AgentRuntimePolicyPlanV1AgentRuntimeStatePlanV1AgentRuntimeCapabilityPlanV1AgentRuntimeOperationRequestV1AgentRuntimeOperationResultV1Plans contain no credential values. NemoClaw validates product intent and sends sandbox operations through its OpenShell client. OpenShell validates and enforces each sandbox operation.
3. In-sandbox agent runtime helper
A managed sandbox image can provide one helper at a fixed path. The helper accepts versioned JSON requests through a supported OpenShell sandbox operation.
The first protocol supports:
Each operation is read-only or configuration-changing. NemoClaw rejects a request whose effect class does not match the operation.
The helper cannot:
NemoClaw records the request identity, result, and applicable product-state receipt. OpenShell policy limits the helper's filesystem, process, network, and provider access.
4. Support catalog and qualification receipt
The NemoClaw repository owns the support catalog. Each selected release pins:
ComputeDriverand platform matrix.Source publication does not add a release to the catalog. A package cannot select itself or change its support state.
Ownership
ComputeDriverimplementsTrust rules
Support and source placement
Repository location does not determine support.
Supported and candidate releases have catalog entries. Compatible source does not become selectable because it exists or is published.
First-party integrations
First-party source stays in a package-owned area of the NemoClaw repository. NemoClaw maintainers own review, release, compatibility, security response, qualification, and lifecycle expectations.
A first-party package uses the public descriptor, schemas, helper protocol, catalog, and qualification contract. Core can depend on the public contract and registry. Core cannot import a package implementation path.
The NemoClaw release can publish core and a first-party package together.
First-party source placement is permanent. It is not a staging step for repository extraction.
External integrations
An external integration can implement the same contract from another NVIDIA-maintained or third-party repository. External source is not first-party source. Compatibility is not support.
For an external release:
The external package owner maintains upstream compatibility, dependencies, patches, images, native configuration, and agent-specific tests. NemoClaw maintainers own the contract, catalog, OpenShell integration, product workflow, support decision, and qualification matrix.
Moving source between repositories changes first-party ownership. It does not preserve or change support automatically.
Architecture guardrails
RuntimeProviderBundleremains a core-only compatibility boundary.Each migration reports these measures before and after the change:
A migration fails this RFC if it reduces a switch but adds another lifecycle authority, OpenShell call site, cross-feature import, or agent-specific core decision.
Migration
Phase 0: accept the design
The decision must name:
Coordinate this work with source-boundary roadmap #7691. Onboarding authority roadmap #7700 does not define a public package SDK and does not authorize this work.
Inventory each
RuntimeProviderBundlefacet as retain, converge, or remove. Remove a facet only after supported OpenShell parity and E2E qualification.Phase 1: add the contract and registry
Add schemas, parsers, the package registry, conformance fixtures, and one OpenShell client boundary. Register existing in-tree implementations without changing behavior.
Add architecture checks that:
RuntimeProviderBundle.Phase 2: migrate LangChain Deep Agents Code
Use LangChain Deep Agents Code as the first complete migration. Preserve commands, state, policy, image identity, OpenShell behavior, and E2E results. Remove its core name dispatch.
Phase 3: migrate Hermes
Use Hermes to verify gateway, dashboard, messaging, MCP, state reconciliation, recovery, and restrictive policy. The package must not add direct OpenShell calls or another supervisor.
Phase 4: require the contract for new runtimes
Pi and DeepSeek Harness must use the package contract before supported activation. They cannot add a core lifecycle, recovery, compute, OpenShell, or state authority.
Phase 5: support external source repositories
After Deep Agents Code and Hermes pass the contract, publish the conformance, provenance, version-negotiation, and catalog-admission interfaces needed by external packages.
First-party source remains in NemoClaw. This phase does not make an external package first party or supported.
Phase 6: migrate OpenClaw
Complete artifact co-location under issue #7698. Migrate the default runtime after two representative packages pass the contract. Remove
AgentDefinitionbehavior that duplicates the accepted contract.Phase 7: adopt a stable OpenShell client
When OpenShell releases an accepted public API or SDK under #2565, evaluate it against the core client boundary. Adoption requires a pin update, compatibility review, state-migration analysis, and complete supported E2E.
Replace only redundant compatibility code. Do not expose OpenShell internals through the package contract.
Validation
Contract validation
Migration equivalence
Each migration compares the old and package-backed paths for:
Live E2E
The registry and OpenShell client changes affect every supported agent runtime. Their pull request must run the complete supported live E2E matrix from a same-repository NVIDIA-owned branch.
Qualification records the exact supported OpenShell release. Results from upstream main or an unpinned release are exploratory evidence.
The evidence has two layers:
Each package runs the journeys that apply to its declared capabilities:
Schema and conformance tests do not replace live E2E evidence for support.
Completion criteria
The migration is complete when:
Alternatives
Open questions
RuntimeProviderBundlefacets remain NemoClaw-owned after OpenShell parity, and what removes each obsolete facet?Requested decision
Maintainers should record one decision:
Accept: Approve the architecture. Name the accountable maintainer, first migration target, and validation plan.Request changes: Name the required contract, ownership, trust, or migration changes.Defer: Name the decision or dependency that must complete first.Decline: Keep the manifest-plus-core-dispatch architecture and state why it is preferable.Acceptance selects an architecture direction. It does not activate a supported agent runtime, approve an external package, or move first-party source out of the NemoClaw repository.
All reactions