NVIDIA / NVIDIA/NemoClaw

Retire the bundled NemoClaw OpenClaw plugin and decouple shared runtime code

Open
#11,357 3 comments 0 reactions 0 assignees View on GitHub
area: architecture area: packaging integration: openclaw
Dominant language
TypeScript
Stars
22.5k
Forks
3.1k
Avg merge
1d 43m
Merged PRs (30d)
718

Description

## Problem Statement

NemoClaw currently ships an OpenClaw extension with plugin ID `nemoclaw` and npm package name `nemoclaw-plugin`. It provides chat commands, inference-provider registration, sandbox context injection, and a secret scanner. The same source package also owns code required by the host CLI and other agents.

This couples ordinary NemoClaw builds, packaging, runtime startup, and upgrades to an OpenClaw plugin installation and SDK contract. Removing the extension requires a behavior and state migration. Deleting `nemoclaw/` would also remove shared code used by the CLI.

The requester accepts losing all `/nemoclaw` slash commands and the plugin's best-effort memory/workspace secret-write scanning. Retire the scanner without a replacement. Also remove the unused legacy host-to-sandbox migration subsystem and the plugin state/configuration helpers once their callers no longer need them. Preserve managed inference, agent context, credential custody, host redaction, backup sanitization, sandbox lifecycle, and unrelated agent-native plugins.

## Desired Behavior

After a fresh installation or migration from an existing sandbox:

- Users manage the sandbox through the existing host `nemoclaw` CLI. The `/nemoclaw` help, `status`, `config`, `onboard`, and `eject` commands are retired.
- OpenClaw starts and serves normal agent turns without the retired `nemoclaw` plugin or its provider registration.
- Managed inference uses the generated OpenClaw configuration and existing credential route.
- Agents still receive sandbox context.
- The plugin secret-write hook is absent. Previously covered secret-bearing writes are no longer guaranteed to be blocked; no equivalent replacement is required.
- Rebuild, recovery, and restore preserve user state and unrelated plugins without restoring the retired extension.
- Host CLI builds and packaged artifacts no longer depend on the retired plugin package.
- Unused legacy migration implementations are absent. Current host snapshot/rebuild flows and runner snapshot-retention commands continue to work; existing saved snapshots remain untouched.
- Retired plugin state/configuration helper implementations are absent once their remaining callers are resolved. Shared selection-config files and their host/Hermes consumers remain supported.

Concrete example: an existing sandbox with a selected inference model, conversation history, and a user-installed plugin rebuilds into the new image. The model still responds, the user plugin still works, and history remains available. The old NemoClaw extension is absent, and host CLI management continues to work.

## Requested outcome, confirmed scope, and current owner

- **Requested outcome:** Retire the bundled NemoClaw OpenClaw extension, including its slash commands, secret-write scanner, and redundant registration/build machinery.
- **Confirmed scope authority:** The requester accepts slash-command retirement and, on 2026-09-10, approved scanner retirement, removal of the plugin state/configuration helpers after their callers are resolved, and removal of the unused legacy migration subsystem without replacement. The scoped decisions and evidence are recorded below. Context-injection retirement is not accepted. A complete repository `Accept` decision for the architecture and installed-sandbox migration is not yet recorded. Before implementation, record the remaining decisions, accountable maintainer, context replacement mechanism, and validation plan. These decisions do not authorize reducing the other retained behaviors.
- **Current behavior owner:** The OpenClaw extension under `nemoclaw/`; the host CLI, image build, configuration generator, and state-restore code listed below.
- **Assigned implementation owner:** None assigned.
- **Ongoing ownership:** Proposed ownership remains with the existing NemoClaw core and OpenClaw integration maintainers. An accountable maintainer must be named in the accepted decision.
- **Placement and support expectations:** Core NemoClaw maintenance of the existing managed OpenClaw integration. No new public extension SDK, integration, or support tier is proposed.

## Current state and source evidence

Baseline: source review at [`6f5c9ac408f1`](https://github.com/NVIDIA/NemoClaw/commit/6f5c9ac408f19f324ad55f00c01dc0099b939178). The legacy migration caller, package, documentation, and history audit below uses [`e94c06f130e1`](https://github.com/NVIDIA/NemoClaw/commit/e94c06f130e1904229c9214f9d1f914b98f6b1ba). These findings are from source and existing tests; a plugin-free sandbox and a deletion build have not yet been exercised.

| Current responsibility | Evidence | Required disposition |
| --- | --- | --- |
| Slash commands | [Command handler](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/nemoclaw/src/commands/slash.ts#L24) | Remove. Current onboarding and eject handlers show status or instructions; host management stays in the CLI. |
| Sandbox context on every agent turn | [Runtime context hook](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/nemoclaw/src/runtime-context.ts#L56) | Preserve context content, trust, and delivery semantics through a qualified replacement. |
| Secret-write blocking | [Registration and tool-call hook](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/nemoclaw/src/index.ts#L317), [scanner](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/nemoclaw/src/security/secret-scanner.ts#L119) | Retire the plugin hook and plugin-only scanner without replacement. Preserve shared token-pattern definitions and the leak checks that consume them. |
| Inference provider metadata | [Provider registration](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/nemoclaw/src/index.ts#L282), [generated provider configuration](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/scripts/generate-openclaw-config.mts#L1406) | Prove the generated provider configuration is sufficient before removing registration. |
| Shared host code | [Credential filtering consumer](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/src/lib/security/credential-filter.ts#L22), [blueprint runner](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/src/lib/blueprint-runner.ts#L5), [shared build](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/nemoclaw/tsconfig.shared.json), [runner build](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/nemoclaw/tsconfig.runner.json) | Move shared implementation and tests to an existing appropriate core owner; update every consumer and packaged path. |
| Image installation and build context | [Plugin installation](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/Dockerfile#L1960), [context staging](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/src/lib/sandbox/build-context.ts#L212) | Remove the retired package from staging, installation, inspection, and image metadata checks. Preserve libraries still used elsewhere. |
| Configuration and registry refresh | [Plugin allowlist](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/scripts/generate-openclaw-config.mts#L1435), [startup refresh](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/scripts/nemoclaw-start.sh#L6149) | Remove only obsolete NemoClaw entries and assumptions. The refresh also serves other non-bundled plugins. |
| Existing-state migration | [Managed-extension ownership](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/src/lib/state/openclaw-managed-extensions.ts#L32), [install-registry discovery](https://github.com/NVIDIA/NemoClaw/blob/6f5c9ac408f19f324ad55f00c01dc0099b939178/src/lib/state/openclaw-plugin-restore.ts#L68) | Distinguish retired image-owned state from unrelated user plugins during migration and restore. |

The extraction inventory must include policy parsing, gateway health and endpoint checks, sandbox naming, private-network validation, credential filtering, shared snapshot sanitization used by the host CLI, banner helpers, and the runner's transitive dependencies. Delete the four unused legacy migration modules listed in the accepted decision below; do not move them as shared runtime code. Hermes host code also consumes the shared sandbox-name utility. Live inference credential checks import token-pattern definitions from the plugin's scanner. Extract those definitions and their relevant tests before removing plugin-only scanning code.

The Dockerfile uses the plugin package's TypeScript dependencies to build messaging preloads. Startup also reads `/opt/nemoclaw/node_modules/json5`. Neither dependency may disappear merely because plugin installation is removed.

## Scope, exclusions, and decisions

### Included

- Remove all `/nemoclaw` commands and the plugin registration banner.
- Remove the plugin secret-write hook, scanner, and path-resolution helpers that have no remaining consumers. No replacement hook, adapter, or native scanner is required. Preserve shared token-pattern definitions and existing leak checks.
- Remove inference-provider registration after proving that current model selection and routing do not require it.
- Extract shared code without duplicating validators, sanitizer implementations, or credential patterns.
- Remove `nemoclaw/src/blueprint/state.ts`, `nemoclaw/src/plugin-config.ts`, and `nemoclaw/src/onboard/config.ts` after resolving their remaining callers. Do not recreate a parallel plugin state/configuration subsystem or delete shared selection-config files.
- Remove the four unused legacy migration modules identified below without replacement. Update their build entries, package/image checks, tests, and stale explanatory references while preserving active host snapshot/rebuild and runner retention behavior.
- Migrate existing plugin files, configuration, install records, and restore behavior through the current lifecycle owners.
- Update package contents, installer readiness checks, contributor setup/doctor, Docker build contexts, manifests, CI artifacts, test projects, coverage ownership, and active repository guidance.
- Update public documentation and release notes to explain slash-command retirement, the loss of best-effort secret-write blocking, and any required migration or recovery action.

### Excluded

- Removing OpenClaw, OpenShell isolation, host CLI commands, or existing managed inference providers.
- Removing credential custody, host redaction, backup sanitization, shared credential patterns, or the leak checks that use them.
- Removing the current host snapshot/rebuild implementation, the blueprint runner and its snapshot list/prune/delete commands, or shared snapshot-sanitizer primitives needed by retained consumers.
- Deleting saved snapshots or shared selection-config files as a consequence of removing code.
- Dropping per-turn context delivery without a separate accepted decision.
- Disabling OpenClaw's plugin system or deleting messaging, search, diagnostics, user-installed, Kimi, or Gemini compatibility plugins.
- Removing the separate Hermes plugin or changing another agent's behavior.
- Introducing a public NemoClaw SDK, generic hook framework, new service, or unrelated runtime upgrade.

### Accepted decision: retire plugin secret-write scanning

- **Decision — Accept (2026-09-10):** Remove the bundled NemoClaw plugin's best-effort secret-write scanner without requiring an equivalent replacement.
- **Authority:** The requester explicitly approved recording this decision in #11357. This acceptance covers scanner retirement only. Other accepted removals are recorded separately below. The remaining architecture, context replacement, ownership, and installed-sandbox migration decisions stay open; no implementation owner is assigned by this record.
- **Reason:** The hook introduced by #1233 reduces accidental persistence of recognizable secrets in selected memory/workspace writes. It checks four named tools and selected paths, does not cover shell writes or encoded/split secrets, and warns and continues if registration fails. Retaining an OpenClaw hook integration solely for this bounded safeguard is not required for plugin retirement.
- **Placement and retained behavior:** Remove the plugin hook and plugin-only scanner/path helpers. Move token-pattern definitions still used by credential-leak checks to the existing core security owner. Preserve credential custody, host redaction, backup sanitization, and shared security regression evidence.
- **Accepted tradeoff:** Writes blocked by the old hook may become possible, and secrets supplied through conversations or tool results may persist in memory. The remaining controls do not provide equivalent memory-write protection. Document this loss without claiming unchanged protection or a measured security improvement.
- **Validation:** Verify fresh and migrated runtimes do not load the retired scanner or resurrect it through restore. Ordinary memory writes still work. Existing credential custody, redaction, sanitization, and leak-pattern tests must pass. Remove tests whose sole contract is the retired blocking behavior; keep tests for retained shared controls. No replacement-scanner parity test is required.
- **Estimate impact:** The earlier code-reduction comment assumed preserving secret scanning. Recalculate the net estimate during implementation; this decision does not establish a revised line count.

### Accepted decision: remove plugin state and configuration helpers

- **Decision — Accept (2026-09-10):** Remove `nemoclaw/src/blueprint/state.ts`, `nemoclaw/src/plugin-config.ts`, and `nemoclaw/src/onboard/config.ts` without recreating a parallel plugin state/configuration subsystem.
- **Authority and sequencing:** The requester accepted this removal. Delete these implementations only after the slash-command, provider-registration, and context callers no longer need them. This does not accept loss of per-turn context delivery; resolve that remaining requirement separately.
- **Reason and placement:** These implementations serve the retiring plugin. Their caller audit found no independent production consumers. The three files total 327 source lines at `e94c06f130e1`, including comments and blank lines.
- **Retained data and behavior:** Preserve `/sandbox/.nemoclaw/config.json` and other shared selection-config files while host and Hermes consumers still use them. Removal of reader/helper code does not authorize deleting persisted state or disabling host configuration synchronization.
- **Validation:** Confirm no retained production caller imports the removed helpers. Run clean CLI/runner builds and the affected host/Hermes configuration and context tests. Remove tests whose only contract is the retired implementation.
- **Ownership:** No implementation owner is assigned by this scoped record; the issue's remaining accountable-maintainer requirement still applies.

### Accepted decision: remove the unused legacy migration subsystem

- **Decision — Accept (2026-09-10):** Remove the four modules below without replacement. The requester accepted migration-only helper removal and then approved recording the completed caller audit and removal conclusion.
- **Reason and history:** [PR #492](https://github.com/NVIDIA/NemoClaw/pull/492), merged on 2026-03-21, removed the plugin's `migrate` and `eject` commands. Its diff removes their calls to `createSnapshotBundle`, `detectHostOpenClaw`, and `restoreSnapshotToHost`, while leaving the helper modules behind.
- **Caller evidence:** At `e94c06f130e1`, none of the four modules is reachable through the plugin or blueprint runner's relative-import graph. Repository searches found only tests, references in build configuration/comments, and calls within this unused subsystem. The current host snapshot/rebuild commands call `backupSandboxState` and `restoreSandboxState` in [the host state implementation](https://github.com/NVIDIA/NemoClaw/blob/e94c06f130e1904229c9214f9d1f914b98f6b1ba/src/lib/state/sandbox.ts#L1573).
- **Compatibility boundary:** These modules are shipped and technically available through package deep imports. They are absent from the named lifecycle API, have no documented public compatibility commitment, and are internal under the [extension taxonomy decision](https://github.com/NVIDIA/NemoClaw/blob/e94c06f130e1904229c9214f9d1f914b98f6b1ba/docs/reference/extension-taxonomy-sdk-readiness.mdx#L18). Bounded public code searches found test copies and no identified independent production consumer. Private or unindexed deep imports cannot be ruled out; release notes must identify the retired internal paths.

| Remove without replacement | Source lines at `e94c06f130e1` |
| --- | ---: |
| [`nemoclaw/src/commands/migration-state.ts`](https://github.com/NVIDIA/NemoClaw/blob/e94c06f130e1904229c9214f9d1f914b98f6b1ba/nemoclaw/src/commands/migration-state.ts) | 1,187 |
| [`nemoclaw/src/shared/migration-restore-boundary.cts`](https://github.com/NVIDIA/NemoClaw/blob/e94c06f130e1904229c9214f9d1f914b98f6b1ba/nemoclaw/src/shared/migration-restore-boundary.cts) | 712 |
| [`nemoclaw/src/security/snapshot-sanitizer.ts`](https://github.com/NVIDIA/NemoClaw/blob/e94c06f130e1904229c9214f9d1f914b98f6b1ba/nemoclaw/src/security/snapshot-sanitizer.ts) | 150 |
| [`nemoclaw/src/blueprint/snapshot.ts`](https://github.com/NVIDIA/NemoClaw/blob/e94c06f130e1904229c9214f9d1f914b98f6b1ba/nemoclaw/src/blueprint/snapshot.ts) | 285 |
| **Total, including comments and blank lines** | **2,334** |

- **Retained behavior and data:** Preserve current host snapshot/rebuild and backup sanitization, the blueprint runner, and its snapshot list/prune/delete modules. In particular, retain `nemoclaw/src/shared/snapshot-sanitizer-boundary.cts` for the host CLI; it is distinct from the migration-only `security/snapshot-sanitizer.ts` above. Preserve `snapshot-command.ts`, `snapshot-management.ts`, `snapshot-directory.ts`, and `snapshot-delete-helper.ts`. Leave existing saved snapshots untouched.
- **Validation:** Update `tsconfig.shared.json`, package/image expectations, and tests that directly load the retired modules. Remove the legacy migration package-contract test and the legacy snapshot portion of the managed-image probe. Preserve shared assertions in mixed tests, including snapshot listing and filesystem-safe deletion. Run clean builds, package contracts, and retained snapshot/rebuild/security tests. Source/history review confirms scope; deletion-build and runtime regression evidence remain implementation checks.
- **Estimate impact:** The four files contain 2,334 source lines. About 3,500 associated test/fixture lines require review, including assertions for retained behavior. These are inventory counts, not a measured final net diff; recalculate the earlier estimate during implementation.
- **Ownership:** No implementation owner is assigned by this scoped record; the issue's remaining accountable-maintainer requirement still applies.

### Decisions required before the affected implementation

1. **Context replacement:** Establish whether native facilities in the pinned OpenClaw runtime can preserve sandbox context content, trust, and delivery semantics. If this requires a small internal hook adapter, obtain an explicit decision on that narrower outcome before proceeding. Renaming the full plugin does not complete this issue. Scanner retirement is accepted above and does not require a replacement. Context-injection retirement remains unaccepted; helper removal must not silently drop this behavior.
2. **Provider compatibility:** Check persisted model references, provider aliases, model discovery, and authentication resolution. Preserve existing selections or define a tested migration for any reference that depends on plugin metadata.
3. **Context failure behavior:** The current context hook registration warns and continues when registration fails. Specify and accept the context replacement failure behavior; do not introduce an unreviewed fallback. No scanner replacement or scanner failure policy is required.
4. **Release sequencing:** Resolve the overlap with #10694 and #7698 before moving files or changing the runtime contract.

## Related work and delivery constraints

- **#10694 — open:** OpenClaw 2.0 migration currently requires the NemoClaw command, provider, and hooks to remain registered. These acceptance requirements conflict with full retirement. Coordinate the disposition and delivery order; this issue does not automatically amend or complete that epic.
- **#7698 — open:** OpenClaw artifact co-location includes moving the current plugin. Coordinate with its owner so shared core code is extracted and retired code is not moved unnecessarily.
- **#6229 — completed:** Extensibility terminology and SDK readiness decisions remain applicable. Internal refactoring must not imply a new SDK.
- **#492 — merged:** Removed the plugin CLI `migrate` and `eject` callers on 2026-03-21; the surviving unused helper subsystem is accepted for removal here.
- Targeted issue and open-PR searches found no direct duplicate or identified implementation PR for this retirement.

## Compatibility Requirements

Use the runtime pinned by the implementation base; this source review observes OpenClaw `2026.7.1`. An OpenClaw 2.0 migration remains owned by #10694.

Preserve the existing supported host/runtime matrix and both managed-image architectures. Do not broaden support claims. Cover hosted and local inference through the existing provider test ownership, including provider switching. Preserve persisted model settings and model-specific compatibility plugins.

Define the supported transition from a previously released image containing the plugin to the new image. Source checkout, installed npm package, prebuilt managed image, and staged source-image builds must agree on runtime contents. This installed-sandbox transition remains required after deleting the separate unused legacy host-to-sandbox migration implementation. Identify the retired internal module paths in release notes; preserve saved snapshots and shared selection-config files.

## Security or Privacy Impact

The intended reduction is removal of unnecessary plugin code and installation/registration machinery. This includes the accepted loss of best-effort secret-write blocking described above. Previously covered writes may persist secrets. No equivalent memory-write protection, image-size, startup-time, or vulnerability reduction is claimed without evidence.

Preserve these boundaries:

- Existing OpenShell network policy, filesystem isolation, process separation, gateway authentication, and configuration sealing.
- Host credential filtering and redaction, backup sanitization, and token-pattern definitions used by existing credential-leak checks. Use synthetic secrets in retained tests and verify diagnostics do not expose full values. These controls do not replace the retired memory-write hook.
- Sandbox context remains available at the intended prompt boundary, including subsequent turns and named-agent sessions. A move into editable workspace text requires evidence that it preserves the accepted trust and delivery contract.
- Migration accepts only validated, owned plugin identities and paths. It must not execute archived extension code to identify or remove it.
- Credential custody remains with the existing host/provider and gateway mechanisms. The generator currently supplies an `apiKey: "unused"` placeholder for the managed route; removing provider registration must not replace that with a real key in agent-visible configuration. Implementation evidence must identify actual credential locations, readers, lifetime, rotation, and removal for each exercised route.
- Moved security utilities keep their positive and negative regression evidence. Removing the plugin test project must not remove coverage of shared controls. Deleting the unused migration sanitizer does not authorize removing the shared sanitizer primitives used by current host backups.

No new cryptography, browser security-header contract, or third-party artifact is proposed. Any required dependency change needs its own recorded consumer, resolved version, and review.

## Observable acceptance examples and validation plan

| Case | Input or state | Required result | Shortest suitable evidence |
| --- | --- | --- | --- |
| Allowed management | Host CLI operates on an OpenClaw sandbox | Existing status, config, connection, logs, and lifecycle behavior continues | Focused CLI/integration tests; packaged CLI smoke test |
| Allowed agent turn | Plugin absent; generated configuration selects a managed model | Actual inference succeeds and the accepted sandbox context reaches the prompt | Generator tests plus pinned-runtime prompt/provider integration; focused live inference |
| Allowed write | Agent writes ordinary memory content after retirement | Write succeeds | Existing runtime memory-write coverage |
| Retired scanner | Fresh or migrated runtime no longer loads the bundled extension | No legacy NemoClaw secret-write hook is registered; no equivalent replacement is required | Runtime registration/package checks and lifecycle integration tests |
| Retained credential controls | Synthetic secrets exercise host output, backup sanitization, and shared leak patterns | Existing redaction, sanitization, and detection contracts still pass | Existing CLI security and E2E-support tests |
| Removed command | New runtime command registry | No legacy `/nemoclaw` registration | Runtime command inspection; avoid assertions on incidental error wording |
| Existing-state migration | Old snapshot contains NemoClaw, an unrelated user plugin, and user data | Retired plugin is absent; user plugin, data, and selected model survive | Existing restore/config-merge integration tests plus focused rebuild E2E |
| Repeated migration | Already migrated sandbox is rebuilt or restored again | Same desired state; no duplicate adapter/context and no retired-plugin resurrection | Repeat-operation integration tests |
| Ambiguous ownership | Malformed install record, unsafe path, or conflicting ownership | Stop before deleting uncertain state; report a redacted actionable error | Existing registry/path validation tests extended for retirement |
| Command failure | Migration or cleanup fails partway | No success/readiness claim; preserve recoverable state and report the remaining action | Fault-injected lifecycle tests |
| Transport ambiguity | Connection fails after a possible mutation | Inspect state before any repeat operation; classify an unverified result as inconclusive | Lifecycle boundary tests; no unconditional mutation retry |
| Verification failure | Target boots but inference, retained security, context, or state postconditions fail | Migration is incomplete; keep recovery evidence and follow the accepted rollback/recovery path | Pinned-runtime tests and a focused failure/recovery scenario |
| Other plugin lifecycle | A supported non-bundled plugin requires registry refresh | Its discovery and operation continue after retirement | Existing startup-refresh and plugin-lifecycle coverage |
| Shared-code extraction | CLI/Hermes consumers run without the old plugin package | No missing modules, changed validators, or sanitizer regressions | Source tests, typechecks, clean build, package contracts |
| Legacy migration removal | Four retired modules are absent from source and clean artifacts | Current host snapshot/rebuild and runner retention commands still work; saved snapshots remain intact | Clean builds, updated package/image checks, retained snapshot and security tests |
| Plugin helper removal | Retired helper implementations are absent after their callers are resolved | Host/Hermes selection-config consumers and accepted context delivery still work | Configuration, context, package, and caller-boundary checks |

Extend the existing tests where they own retained behavior: context tests, CLI security tests, shared leak-pattern tests, package contracts, configuration generation, OpenClaw restore tests, runtime startup-refresh tests, inference-switch tests, and rebuild/plugin E2E. Update registration checks for retirement. Remove plugin-only scanner and legacy migration tests without removing coverage of retained shared controls. Update the mixed snapshot and managed-image tests around the retained behavior.

The missing real-runtime dimensions are **managed inference and context delivery without the old extension**, and **retirement during an installed-sandbox rebuild without plugin resurrection**. Add or extend live coverage only for those boundaries. Parser, migration-plan, packaging, and registry cases belong in deterministic test lanes.

Run focused tests while changing each slice, then clean builds, appropriate typechecks, package contracts, and the repository's required PR checks. Update Vitest membership and coverage ownership when files move. Record tested commit, image digest, runtime version, scenario, result, and redacted evidence for live runs. Reuse the typed E2E registry rather than creating a second matrix.

## Capability slices

### Slice 1: Build and package the host CLI independently of the OpenClaw plugin

- **Outcome:** Contributors and release tooling can build/package the CLI and runner without building the OpenClaw extension. Existing consumers behave the same even if retirement is deferred.
- **Acceptance evidence:** Clean CLI build and installed-package execution work without old plugin artifact paths; shared security and Hermes consumer tests pass.
- **Dependencies and decisions:** Accepted core ownership and coordination with #7698. Update all current consumers rather than introducing a compatibility framework.
- **Test plan:** Move source tests with their owner; exercise compiled-artifact imports through package contracts and existing consumer tests. Remove the accepted unused migration subsystem and its direct build/test references during this extraction, while retaining host backup and runner retention checks.
- **Deferred scope:** The runtime extension remains installed until context replacement and the remaining retirement requirements are qualified. Scanner replacement is not required.

### Slice 2: Run and migrate managed OpenClaw without the retired extension

- **Outcome:** Fresh and existing sandboxes retain the required behavior while no longer installing or registering the legacy plugin.
- **Acceptance evidence:** The examples above pass, including real inference, context delivery, intentional scanner retirement, retained credential controls, user-plugin preservation, and repeated migration.
- **Dependencies and decisions:** Slice 1; accepted context replacement/failure design; resolved ordering with #10694. Scanner retirement is accepted without replacement.
- **Test plan:** Deliver removal, behavior replacements, state migration, packaging/CI changes, guidance, and focused runtime evidence together. Remove plugin state/configuration helpers once their callers are resolved, while preserving shared persisted configuration. Keep each changed behavior and its tests in the same reviewable change.
- **Deferred scope:** Any general plugin SDK, broader agent reorganization, upstream version migration, and unrelated performance work.

## Delivery order and completion

- **First capability slice:** Independent CLI and runner build/package ownership.
- **Later deferrals:** Unrelated SDK, runtime-upgrade, and artifact-move work stays with its existing owners.
- **Stop conditions:** Missing accepted scope/owner, unavailable equivalent context mechanism, unresolved conflicting migration requirements, or inability to prove safe state ownership/recovery.

Completion requires all of the following:

- [ ] The implementation decision, owner, compatibility boundary, and replacement mechanisms are recorded.
- [ ] All `/nemoclaw` commands and the legacy provider/banner registration are retired.
- [ ] The accepted context behavior has a tested owner.
- [ ] The plugin secret-write hook and scanner are retired without replacement; retained shared credential controls and leak checks still pass.
- [ ] Fresh and migrated sandboxes pass the inference, state, plugin, and security postconditions.
- [ ] Shared core and other-agent consumers no longer depend on the retired package.
- [ ] The four unused legacy migration modules are removed without replacement; current host snapshot/rebuild, runner retention, and shared sanitization checks pass.
- [ ] Plugin state/configuration helper implementations are removed after resolving their callers; shared selection-config files and saved snapshots remain intact.
- [ ] Obsolete build/install/CI/test references are removed; required shared runtime dependencies remain explicitly owned.
- [ ] Supported restore and recovery paths do not resurrect the retired plugin or delete unrelated user state.
- [ ] Guidance, documentation, and release notes explain the changed interface, migration, and loss of best-effort secret-write blocking.
- [ ] No renamed full plugin or unreviewed new support surface remains as a substitute for the accepted outcome.

## Category

Feature — maintenance of the existing OpenClaw integration.

## Checklist

- [x] Searched existing issues and open PRs; no direct duplicate found in the targeted searches.
- [x] Described the problem, desired behavior, compatibility constraints, and acceptance evidence.
- [x] Requester accepts retiring the plugin secret-write scanner without replacement (2026-09-10).
- [x] Requester accepts plugin state/configuration helper removal after resolving their remaining callers (2026-09-10).
- [x] Requester accepts removal of the audited unused legacy migration subsystem and its migration-only helpers without replacement (2026-09-10).
- [ ] Maintainer records the complete implementation acceptance decision.

Contributor guide

Open the contributing guide

Research direction

Start with nemoclaw/src/index.ts, runtime-context.ts, security/secret-scanner.ts, scripts/generate-openclaw-config.mts, scripts/nemoclaw-start.sh, and the state restore files named in the issue. Run the existing build, package, migration, and lifecycle tests before changing ownership, and record the unresolved context, architecture, maintainer, and validation decisions. Done means the retired plugin is absent while CLI management, context delivery, inference, user plugins, state, and retained snapshot flows still work.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, shell, typescript
Domain
backend, build-system, cli, devops, documentation, security
Issue type
Refactor
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.