openclaw - 💡(How to fix) Fix Plugin config (plugins.entries.<id>.config) has no env-var or writable-overlay path — every change requires image rebuild in policy-locked sandboxes [1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#72950Fetched 2026-04-28 06:29:38
View on GitHub
Comments
1
Participants
2
Timeline
2
Reactions
1
Timeline (top)
commented ×1cross-referenced ×1

In plain English: plugin config (plugins.entries.<id>.config) is sourced from openclaw.json at startup — and that file is in a directory that NemoClaw makes read-only by Landlock policy at runtime. So a plugin like outshift-open/openclaw-deep-observability that needs per-deployment config (OTLP endpoint, service name, etc.) cannot be reconfigured after the sandbox is built; every config change requires a full image rebuild. There's no env-var override path and no writable-overlay path documented.

Companion issue planned against NVIDIA/NemoClaw to make plugin config writable from the policy side; this is the OpenClaw-core angle on the same problem.

Root Cause

In plain English: plugin config (plugins.entries.<id>.config) is sourced from openclaw.json at startup — and that file is in a directory that NemoClaw makes read-only by Landlock policy at runtime. So a plugin like outshift-open/openclaw-deep-observability that needs per-deployment config (OTLP endpoint, service name, etc.) cannot be reconfigured after the sandbox is built; every config change requires a full image rebuild. There's no env-var override path and no writable-overlay path documented.

Companion issue planned against NVIDIA/NemoClaw to make plugin config writable from the policy side; this is the OpenClaw-core angle on the same problem.

Code Example

# 1. Build a NemoClaw sandbox with deep-observability plugin baked in (per
#    project setup; openclaw.json baked at build time with plugin config block).

# 2. Try to edit openclaw.json at runtime:
openshell sandbox exec -n nemoclaw-deepobs -- /bin/bash -c '
  sed -i "s|http://172.17.0.1:14318|https://example.com|" /sandbox/.openclaw/openclaw.json
'
# Output: sed: cannot rename /sandbox/.openclaw/sed3iy3v: Operation not permitted

# 3. The OPS path is to rebuild the image. Multi-minute round-trip per config tweak.
RAW_BUFFERClick to expand / collapse

Summary

In plain English: plugin config (plugins.entries.<id>.config) is sourced from openclaw.json at startup — and that file is in a directory that NemoClaw makes read-only by Landlock policy at runtime. So a plugin like outshift-open/openclaw-deep-observability that needs per-deployment config (OTLP endpoint, service name, etc.) cannot be reconfigured after the sandbox is built; every config change requires a full image rebuild. There's no env-var override path and no writable-overlay path documented.

Companion issue planned against NVIDIA/NemoClaw to make plugin config writable from the policy side; this is the OpenClaw-core angle on the same problem.

Problem

The OpenClaw config schema currently sources plugin config from a single location: plugins.entries.<id>.config in openclaw.json. That file is in /sandbox/.openclaw/openclaw.json in NemoClaw, which is Landlock-RO at runtime per sandbox security policy. So:

  • Editing the file at runtime → EACCES, no useful diagnostic.
  • Plugin code can't read overrides from anywhere else.
  • Change config = full image rebuild (~5–10min).

For plugins that follow OTel ecosystem conventions, this is particularly awkward: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME, etc. are well-established standard env-vars, and the OpenTelemetry SDK reads them automatically. But the plugin can't pass them through if OpenClaw's config layer doesn't surface them — and OpenClaw's plugin-config schema currently has no env-var overlay support.

Suggested fix (in priority order)

1. Env-var overrides for plugin config

Allow plugins to declare which env vars override which config keys. Either:

  • Schema-level: plugins.entries.<id>.configEnv: { endpoint: "OTEL_EXPORTER_OTLP_ENDPOINT" } — OpenClaw resolves env-vars at startup, applies to config.
  • Or: pass process.env through to plugin's register(api) so the plugin can read its own env-vars.

2. Writable-overlay path for plugin config

Allow plugin config to source from a writable path AS WELL AS openclaw.json. e.g., /sandbox/.openclaw-data/plugin-config.json (which IS writable in NemoClaw) overlaid on top of openclaw.json. Plugin sees the merged result.

3. (Minimum) document the build-time-only constraint

If neither of the above is acceptable, at least document that plugin config is build-time-only in policy-locked environments and explain how plugins should be developed accordingly (e.g., consume only env vars, or expose a runtime config endpoint).

Repro

# 1. Build a NemoClaw sandbox with deep-observability plugin baked in (per
#    project setup; openclaw.json baked at build time with plugin config block).

# 2. Try to edit openclaw.json at runtime:
openshell sandbox exec -n nemoclaw-deepobs -- /bin/bash -c '
  sed -i "s|http://172.17.0.1:14318|https://example.com|" /sandbox/.openclaw/openclaw.json
'
# Output: sed: cannot rename /sandbox/.openclaw/sed3iy3v: Operation not permitted

# 3. The OPS path is to rebuild the image. Multi-minute round-trip per config tweak.

Why it matters

This compounds with the deploy/docker-compose architectural mismatch — when users debug span-not-landing issues under NemoClaw, they want to try different OTel endpoint configurations. Each attempt is a full image rebuild. The iteration cost discourages diagnosis. Eight cycles of "tweak endpoint → rebuild → test → no change" is what we did during this run; it didn't have to be that painful.

Alternatives considered

  • Hot-reload of openclaw.json: doesn't help if the file is RO at runtime.
  • Plugins read their own config independently from openclaw.json: breaks the unified-config contract that's already established.

Test plan

After fix #1 (env-var overrides):

  • Plugin config has endpoint: "http://default-endpoint" baked in.
  • Set OTEL_EXPORTER_OTLP_ENDPOINT=http://override.example.com in the sandbox env (via openshell sandbox-create env injection).
  • Plugin's actual exporter URL should be http://override.example.com/v1/traces.
  • Restart sandbox → endpoint persists per env, no image rebuild.

Risk / blast radius

  • Env-var overrides: medium risk for plugins that read config without expecting env-overlay (could surprise on existing deployments). Mitigated by making it opt-in at the plugin level (plugin declares which keys are env-overridable).
  • Writable-overlay: small risk; opt-in via config schema change.
  • Docs-only: zero risk.

Open questions for maintainers

  1. Is there architectural intent to keep plugin config strictly file-based? If so, what's the path forward for policy-locked environments?
  2. Companion: a NVIDIA/NemoClaw issue is planned suggesting NemoClaw expose a writable overlay path for plugin config. Which fix-side is preferred?
  3. The OTel ecosystem env-var conventions (OTEL_EXPORTER_OTLP_ENDPOINT, etc.) are well-established. Acceptable to lean on those rather than invent OpenClaw-specific ones?

Tested-against

  • OpenClaw v2026.4.9
  • NemoClaw v0.0.26 / OpenShell 0.0.36 (sandbox provider with Landlock RO)
  • Plugin: outshift-open/openclaw-deep-observability (main HEAD as of 2026-04-26)

Severity

Medium. Doesn't block functionality, but it's a development-velocity tax that compounds with other plugin issues. Anyone iterating on plugin config under NemoClaw will hit it.

extent analysis

TL;DR

Implement env-var overrides for plugin config to allow for runtime configuration changes without requiring a full image rebuild.

Guidance

  • Introduce env-var overrides for plugin config, allowing plugins to declare which env vars override which config keys.
  • Consider making env-var overrides opt-in at the plugin level to mitigate potential risks.
  • Alternatively, explore implementing a writable-overlay path for plugin config to source from a writable path in addition to openclaw.json.
  • Document the build-time-only constraint for plugin config in policy-locked environments if neither of the above solutions is feasible.

Example

// Example of env-var overrides in plugin config
"plugins": {
  "entries": {
    "<id>": {
      "config": {
        "endpoint": "OTEL_EXPORTER_OTLP_ENDPOINT"
      },
      "configEnv": {
        "endpoint": "OTEL_EXPORTER_OTLP_ENDPOINT"
      }
    }
  }
}

Notes

The proposed solutions aim to address the issue of plugin config being read-only at runtime due to Landlock policy. However, the feasibility of these solutions may depend on the specific requirements and constraints of the OpenClaw and NemoClaw projects.

Recommendation

Apply workaround by implementing env-var overrides for plugin config, as it provides a flexible and non-intrusive way to allow for runtime configuration changes without requiring a full image rebuild. This approach also aligns with established OTel ecosystem conventions.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

openclaw - 💡(How to fix) Fix Plugin config (plugins.entries.<id>.config) has no env-var or writable-overlay path — every change requires image rebuild in policy-locked sandboxes [1 comments, 2 participants]