Remote curated plugins ignore per-plugin enabled=false config
What version of Codex CLI is running?
codex-cli 0.140.0
What subscription do you have?
Not specified.
Which model were you using?
gpt-5.5
What platform is your computer?
Windows x64
What terminal emulator and version are you using (if applicable)?
Windows Terminal, running PowerShell.
Codex doctor report
Codex Doctor v0.140.0 · windows-x86_64
Environment
✓ system en-US
✓ runtime standalone (windows, package <CODEX_HOME>\packages\standalone\releases\0.140.0-x86_64-pc-windows-msvc, bin <CODEX_HOME>\packages\standalone\releases\0.140.0-x86_64-pc-windows-msvc\bin, resources <CODEX_HOME>\packages\standalone\releases\0.140.0-x86_64-pc-windows-msvc\codex-resources, path <CODEX_HOME>\packages\standalone\releases\0.140.0-x86_64-pc-windows-msvc\codex-path)
✓ install consistent
✓ search file exists (bundled)
✓ git git version 2.54.0.windows.1
✓ terminal Windows Terminal · zellij 0.44.3
✓ state databases healthy
✓ threads rollout files and state DB thread inventory agree
Configuration
✓ config loaded
✓ auth auth is configured
✓ mcp 1 server (1 stdio) · 0 disabled
✓ sandbox restricted fs + restricted network · approval OnRequest
Updates
✓ updates update configuration is locally consistent
Connectivity
✓ network no proxy env vars
✓ websocket connected (HTTP 101 Switching Protocols) · 15s timeout
✓ reachability active provider endpoints are reachable over HTTP
Background Server
○ app-server not running (ephemeral mode)
17 ok · 1 idle · 0 warn · 0 fail ok
What issue are you seeing?
Per-plugin enabled = false entries in ~/.codex/config.toml do not suppress remote curated plugin injection in fresh Codex CLI sessions.
My config explicitly disables several remote curated plugins:
[plugins."data-analytics@openai-curated-remote"]
enabled = false
[plugins."figma@openai-curated-remote"]
enabled = false
[plugins."product-design@openai-curated-remote"]
enabled = false
[plugins."public-equity-investing@openai-curated-remote"]
enabled = false
Despite that, a fresh codex exec --ephemeral session still exposes those plugins in the model-visible plugin context:
browser
computer-use
data-analytics
documents
figma
github
pdf
presentations
product-design
public-equity-investing
spreadsheets
This is not stale context from an existing conversation. It reproduces in a new ephemeral CLI session after upgrading from 0.139.0 to 0.140.0.
codex plugin list does not show these remote curated plugins as locally installed/enabled through the regular CLI marketplace path. It only shows the primary runtime plugins as installed/enabled in this environment:
documents@openai-primary-runtime
pdf@openai-primary-runtime
spreadsheets@openai-primary-runtime
presentations@openai-primary-runtime
The remote curated plugin bundles are cached locally under a path like:
<CODEX_HOME>\plugins\cache\openai-curated-remote\
but the user-facing installed plugin list and the per-plugin disabled config do not reflect or control the injected session context.
What steps can reproduce the bug?
- Use Codex CLI
0.140.0on Windows with plugins enabled. - Add explicit disabled entries for remote curated plugins to
~/.codex/config.toml:
```toml
[plugins."data-analytics@openai-curated-remote"]
enabled = false
[plugins."figma@openai-curated-remote"]
enabled = false
[plugins."product-design@openai-curated-remote"]
enabled = false
[plugins."public-equity-investing@openai-curated-remote"]
enabled = false
```
- Start a fresh ephemeral session:
``powershell``
codex exec --ephemeral --skip-git-repo-check -C <empty-test-dir> "List the plugins directly visible/injected into this context. Do not run tools. Return only the plugin names, one per line."
- Observe that the disabled remote curated plugins are still injected:
``text``
data-analytics
figma
product-design
public-equity-investing
- As a control, disable all plugin/app surfaces plus the explicit
node_replMCP server:
``powershell
codex exec --ephemeral --skip-git-repo-check -C <empty-test-dir>
-c 'features.plugins=false'
-c 'features.apps=false'
-c 'mcp_servers.node_repl.enabled=false' ``
"List the plugins directly visible/injected into this context. Do not run tools. Return only the plugin names, one per line. If none are visible, return NONE."
- Control output:
``text``
NONE
What is the expected behavior?
If a plugin has this config:
[plugins."plugin-name@marketplace"]
enabled = false
then a fresh Codex session should not inject that plugin's skills/plugin instructions into the model-visible context.
If remote curated plugins are account-synced or controlled by a different identifier than plugin-name@openai-curated-remote, Codex should expose that state clearly in codex plugin list, codex doctor, and documentation, and provide a documented per-host/per-session way to disable each remote curated plugin without turning off all plugins.
Actual behavior
Per-plugin disabled entries appear to be ignored for openai-curated-remote plugin injection. The only reliable workaround found is feature-level disabling:
[features]
plugins = false
apps = false
[mcp_servers.node_repl]
enabled = false
That removes the unwanted remote curated plugin context, but it also disables all plugin/app functionality and is too broad for users who want primary runtime plugins or selected plugins enabled.
Additional information
Related/adjacent issues found before filing:
- #26275: Data Analytics plugin tools appear in remote Codex CLI without local install/config.
- #21520: Older report that skills/plugins set to
enabled = falsewere still injected into the request body.
This report is narrower: it reproduces on codex-cli 0.140.0 with explicit per-plugin enabled = false entries for openai-curated-remote plugins, in fresh codex exec --ephemeral sessions.
4 Comments
I traced this through the plugin loader and the report looks reproducible from the current code path.
What happens today:
plugins_for_config_with_force_reload()builds the load cache key from only persisted user plugin config + skill rules +remote_plugin_enabled, then callsload_plugins_from_layer_stack(..., self.remote_installed_plugin_configs(), ..., config.remote_plugin_enabled).remote_installed_plugin_configs()converts the remote-installed cache intoPluginConfig { enabled: plugin.enabled, ... }for every locally cached remote bundle.merge_configured_plugins_with_remote_installed()then merges thoseextra_pluginsinto user config.prefer_remote_curated_conflicts == config.remote_plugin_enabled, so when remote plugins are enabled, the remotelinear@openai-curated-remotestyle entry intentionally replaces local curated entries with the same plugin name.[plugins."foo@openai-curated-remote"] enabled = false; if the remote installed cache saysenabled = true, the remote cache entry is inserted/overwritten during the extra-plugin merge.Existing test coverage already demonstrates the conflict behavior:
This passes and asserts that with
remote_plugin = true, a locallinear@openai-curatedentry is replaced bylinear@openai-curated-remote.I think the missing behavior is precedence for explicit user disablement. A narrow fix would be for
merge_configured_plugins_with_remote_installed()to preserve an explicit configured entry for the same remote plugin key when that entry isenabled = false, or to overlay user config after remote-installed config specifically forenabled. The important part is that the remote-installed server state should be allowed to add installed plugins, but not silently re-enable a plugin the local config explicitly disabled.This also explains the confusing
codex plugin listangle: listing and execution appear to consult different surfaces. Execution seesself.remote_installed_plugin_configs()duringplugins_for_config(), while the list UI can omit those remote installed plugins depending on visible marketplaces/configured state. So the plugin can be injected duringexeceven when it is not obvious fromplugin list.Windows Desktop reproduction: disabled remote curated Superpowers remains in the effective skill catalog and is actively read
I am seeing the same underlying behavior in Codex Windows Desktop: Superpowers remains present in the effective skill catalog, and its SKILL.md files can still be actively read even though the plugin is explicitly disabled.
Codex feedback ID:
019f8781-8ecd-73c1-8aea-2c0890616124
Environment:
Configuration:
[plugins."superpowers@openai-curated"]
enabled = false
The user-facing plugin identifier is superpowers@openai-curated, while the currently active runtime cache source is under openai-curated-remote.
This appears to be Codex's normal logical-plugin-ID to remote-cache-backend mapping, not two independently active Superpowers plugins. Other curated plugins on the same installation use the same mapping pattern.
Expected behavior:
Actual behavior:
The catalog/path-reference counts above are not being presented as actual file-read counts.
Using a stricter metric that counts only tool calls whose arguments explicitly contain a Superpowers SKILL.md path, with duplicate paths inside one call counted once:
An earlier broader detector found 152 path/load signals, but that was a wider heuristic and should not be treated as equivalent to explicit SKILL.md reads. The strict explicit-path result is 66.
Active-version verification:
The currently injected version is genuinely Superpowers 6.2.0, not merely a directory label.
Its active plugin manifest reports:
The active 6.2.0 plugin tree contains no registered SessionStart hook and no active .codex-plugin/hooks directory.
A fresh task created under the current App/Core process selected only the 6.2.0 Superpowers skill source. Older 5.1.3 and 6.1.1 paths were absent from that task's effective catalog.
Older manifest versions and backup or temporary copies exist on disk, but they are not simultaneously active injection sources for current fresh tasks.
This rules out the following explanations for the current behavior:
Cache and catalog refresh evidence:
In a previous controlled check, the active Superpowers cache directory was moved out of its discovery path after a complete backup was created.
A fresh task in the same App/Core process still received:
The plugin manager did not restore the directory during that check.
This indicates that the running Desktop process retained a previously constructed skill discovery or catalog snapshot rather than rebuilding it from the current disk and configuration state.
The cache was restored afterward, and the restored files matched the pre-test hash manifest. No permanent plugin or configuration changes were left behind.
Impact:
This evidence does not prove that Superpowers is responsible for all Codex latency, token use, or tool failures. Task complexity remains a major confounding variable.
It does demonstrate that:
The currently active Superpowers version already includes the newer Codex-related manifest behavior, including hooks: {} and no registered SessionStart hook.
Reinstalling or updating the same Superpowers 6.2.0 version therefore does not appear to address this issue. The remaining failure boundary appears to be Codex Desktop/Core per-plugin disable handling, skill discovery, catalog construction, or catalog invalidation.
Related issues:
Suggested fixes:
I can provide additional sanitized timestamps, manifest hashes, or aggregate metrics if needed, using the Codex feedback ID above.
Additional reproduction from Codex Desktop on macOS:
26.803.41515Codex Desktop/0.147.0-alpha.6.56.2.0Disabling Superpowers in the Desktop Plugins UI wrote:
After fully quitting with Cmd-Q, reopening Desktop, and creating a brand-new task, all 14
superpowers:*skills were still exposed andusing-superpowerswas selected automatically. This rules out retained context from an existing task.I also reproduced this with an independent fresh app-server process:
skills/listreported14/14Superpowers skills enabled despite the plugin-level setting. Trying eithersuperpowers@openai-curated-remoteorsuperpowers@openai-curatedas the disabled plugin identity did not change the result.Verified controls/workarounds:
[[skills.config]]overrides withenabled = falsework; disabling all 14 skills removes them from the model-visible skill list.This suggests the remote plugin state is being merged after, or without honoring, the local plugin-level
enabled=falseoverride.Independent Windows reproduction on Desktop 26.814.5517.0 / CLI 0.145.0-alpha.4
I reproduced the same failure with a remote curated plugin and a controlled uninstall comparison.
Environment:
26.814.5517.00.145.0-alpha.46.3.0Reproduction:
/plugins.Spaceon the installed Superpowers entry. The UI changed toDisabled/Space to enable.``
toml
``[plugins."superpowers@openai-curated-remote"]
enabled = false
ChatGPT,codex, andcodex-code-mode-hostprocesses, restarted Desktop, and ran a brand-newcodex exec --json --ephemeraltask in a clean disposable Git fixture.Actual result:
SKILL.mdfiles from the remote curated cache, includingusing-superpowers,test-driven-development, andverification-before-completion, plus bundled references.codex debug prompt-inputinspection reported zero Superpowers matches while the realcodex execrun still received and used the skills. This suggests the debug rendering and effective execution context can disagree for remote plugin injection.Control:
Observed single-pair impact (not presented as a general cost estimate): input tokens dropped from
294,247to62,035, and completed tool steps from6to2after uninstall. The important correctness result is that the documented per-plugin toggle did not establish the disabled treatment, while uninstall did.This confirms the bug persists on a newer Windows Desktop build and Superpowers version. I can provide sanitized JSONL excerpts or exact command lines if maintainers need them.