Draft post: plugins.allow is exclusive — the warning's suggested fix disabled 44 plugins - #54
Merged
Merged
Conversation
clarkbw
force-pushed
the
post/plugins-allow
branch
from
August 12, 2026 14:51
4a97be4 to
d7cbefd
Compare
…disabled 44 plugins Candidate #17 from the 2026-08-11 blog-candidate review. A config warning printed a ready-to-paste one-entry allowlist every turn; applying it on a live agent gateway collapsed enabled plugins 47 -> 3, because plugins.allow is an exclusive allowlist over all plugins including the ~46 bundled ones. Casualties: the fallback model provider and bundle-mcp (every MCP tool). OpenClaw is named — all semantics quoted from docs.openclaw.ai (tools/plugin, tools/acp-agents, tools/browser), consistent with the published 2026-07-29 post. Config snippets are minimal reproductions from publicly documented keys. Two hand-written SVGs: the 47 -> 3 result, and the activation asymmetry (channel config rescues its plugin, mcp.servers does not). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HaMaRk9UijJQMDX48EVvTk
clarkbw
force-pushed
the
post/plugins-allow
branch
from
August 29, 2026 02:35
d7cbefd to
459009e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Post: 2026-08-11-plugins-allow-exclusive-allowlist-config-warning-suggested-fix-breaks-production-disables-bundled-plugins-openclaw-mcp-bridge-fallback-provider.md
Draft only — merge = publish. The
date:and filename carry the drafting date (2026-08-11); bump both at merge time withscript/bump.py/script/publish.py.What it is
Candidate #17 from the 2026-08-11 blog-candidate review. The arc: a config warning printed a ready-to-paste one-entry allowlist every single turn; applying it on the live gateway collapsed enabled plugins 47 → 3, because
plugins.allowis an exclusive allowlist over all plugins including the ~46 bundled ones.The two casualties are the reason it's a post and not a footnote:
anthropic-provider— the fallback model. The failure is invisible until the primary is down, i.e. the only moment it matters. A resilience feature that silently stops loading is worse than one you never configured, because you stop budgeting for the failure it was meant to absorb.bundle-mcp— every MCP tool. Servers still launch, still connect, still probe healthy; their tools are just absent from the request. No error.The subtle bit, and the one I'd have got wrong too: naming
channels.telegramauto-activates its plugin even under a restrictive allowlist; namingmcp.servers.<name>does not rescuebundle-mcp. So the lane that keeps working is the one you'd notice, and the lane that goes dark is the one you have to go looking for.Landing: the durable engineering move wasn't code — it was writing the decision to keep living with the warning into the config as a comment at the exact spot someone would make the change. "Record why you ignored the linter" is the generalizable lesson, alongside "allowlists that silently include the batteries."
Verification of the public claims
OpenClaw is named — precedent is the published 2026-07-29 post and pending #46. Every semantic claim was fetched from
docs.openclaw.aibefore writing, not recalled:plugins.allowis exclusive — quoted verbatim fromdocs.openclaw.ai/tools/plugin: "plugins.allowis an exclusive allowlist. Plugin-owned tools outside the allowlist stay unavailable even whentools.allowincludes"*"."docs.openclaw.ai/tools/acp-agents: "Ifplugins.allowis set, it is a restrictive plugin inventory and must includeacpx, or the installed ACP backend is intentionally blocked." Plus the Codex setup note requiring the bundledcodexid in the allowlist.docs.openclaw.ai/tools/plugin: "provider/model ref, channel config, CLI backend, or agent harness runtime." The asymmetry argument rests onmcp.serversbeing absent from that list, which the post states as observed-plus-not-listed rather than as a documented negative.docs.openclaw.ai/tools/browsersays an explicit rootbrowserblock "activates the bundled browser plugin even under a restrictiveplugins.allow", explicitly "matching bundled channel config behavior".docs.openclaw.ai/tools/mcpdirectly; it's an argument from a verified absence, and the post frames it that way ("which is exactly why you don't think to check it").Privacy
Source story is in the private repo; everything is generalised. No hostnames, no IPs, no topology, no private repo names or paths — grepped the post and both SVGs for all of them. "The live box", "a Raspberry Pi next to a SignalK server" is the level of detail.
~/.openclawappears once as OpenClaw's own documented global plugin root, not as our filesystem. The config snippets are minimal reproductions built from publicly documented keys — none is our file, and the recorded-decision comment in The fix is a freshly written condensed template, not the one on the box.Figures
Two hand-written SVGs, dark ground, system fonts, no
]or angle brackets in alt text:enabled-plugins-before-after.svg— the result, under the TL;DR: the 47 → 3 bars, the three survivors named with why each survived, and the two critical casualties marked with ✕.activation-asymmetry.svg— the mechanism, in Diagnosis: two lanes, config key → owning plugin → what the agent can do, green through telegram and broken atbundle-mcp.No third figure — the remaining candidate would have restated the JSON snippets in rounded rectangles.
Checks
Rendered
_site/<slug>/index.htmlconfirmed: both<img src="/assets/img/…">present, both SVGs shipped to_site/assets/img/<post-slug>/, all fourpost_urlrelated links resolved to real permalinks, both SVGs parse as well-formed XML, and the<id>/<name>placeholders survived Liquid and kramdown as escaped entities inside the code blocks. No{% raw %}guard needed — the only Liquid in the body is the allowedpost_urltags.Two things to check before merging
deepseek/anthropic-providernaming. These are public OpenClaw plugin ids and the primary/fallback split is a config preference rather than infrastructure, so I judged it inside the guardrail and kept it — the concreteness is most of what makes the "no fallback" point land. Say the word and I'll swap both forprimary-provider/fallback-providerplaceholders; it costs about four lines and one figure edit.🤖 Generated with Claude Code
https://claude.ai/code/session_01HaMaRk9UijJQMDX48EVvTk