$skill invocation resolves stale cached plugin skill from not-installed marketplace plugin
What issue are you seeing?
After hitting the outdated Superpowers issue described in issues #28846 / #29517, I installed the upstream Superpowers marketplace as superpowers-dev to use the newer version.
After that, Codex had:
superpowers@superpowers-devinstalled and enabled, version 6.1.1superpowers@openai-curatednot installed- a stale/openai-curated Superpowers copy still present in the local plugin cache, version 5.1.4
The surprising behavior was that explicit $superpowers invocation resolved to the stale cached openai-curated copy, while plain natural-language invocation of superpowers resolved to the correct enabled superpowers-dev plugin.
Observed:
- Prompt:
invoca superpowers e dimmi la cartella da cui fai la discovery e la versione di superpowers. Non modificare alcun file - resolved to:
~/.codex/plugins/cache/superpowers-dev/superpowers/6.1.1/skills - version:
6.1.1
- Prompt:
invoca $superpowers e dimmi la cartella da cui fai la discovery e la versione di superpowers. Non modificare alcun file - resolved to the stale openai-curated cache path
- version:
5.1.4
After adding an explicit config entry disabling the not-installed curated plugin, $superpowers started resolving correctly to superpowers-dev 6.1.1.
This suggests that $skill resolution may still consider cached skills from a not-installed plugin when another plugin with the same skill name is installed/enabled.
What steps can reproduce the bug?
- Have the old curated Superpowers plugin cache present locally, for example under:
~/.codex/plugins/cache/openai-curated-remote/superpowers/5.1.4/skills
- Do not have the curated plugin installed/enabled. In my case,
codex plugin listshowed the curated Superpowers plugin as not installed.
- Install and enable the upstream Superpowers marketplace as
superpowers-dev.
- Confirm config contains the enabled upstream plugin:
superpowers@superpowers-dev enabled = true
- Start a new Codex session.
- Use a natural-language invocation:
invoca superpowers e dimmi la cartella da cui fai la discovery e la versione di superpowers. Non modificare alcun file
Observed result:
Codex resolves Superpowers from:
~/.codex/plugins/cache/superpowers-dev/superpowers/6.1.1/skills
- Start another fresh Codex session, or use the same environment.
- Use explicit
$skillinvocation:
invoca $superpowers e dimmi la cartella da cui fai la discovery e la versione di superpowers. Non modificare alcun file
Observed result before workaround:
Codex resolves Superpowers from the stale openai-curated cache:
~/.codex/plugins/cache/openai-curated-remote/superpowers/5.1.4/skills
- Add this explicit disable entry to
~/.codex/config.toml:
[plugins."superpowers@openai-curated"]
enabled = false
- Restart Codex and repeat the
$superpowersprompt.
Observed result after workaround:$superpowers resolves correctly to:~/.codex/plugins/cache/superpowers-dev/superpowers/6.1.1/skills
What is the expected behavior?
Explicit $skill invocation should only resolve skills from installed/enabled plugins, or should disambiguate duplicate skill names using the enabled plugin state.
A cached plugin that is not installed should not participate in $skill resolution.
In this case, $superpowers should have resolved to superpowers@superpowers-dev 6.1.1, the only installed/enabled Superpowers plugin, instead of resolving to the stale cached superpowers@openai-curated 5.1.4 copy.
Additional information
This appears related to, but distinct from, #28846 and #29517.
Those issues report that superpowers@openai-curated is outdated compared with upstream. This issue is about what happens after installing an updated upstream marketplace to work around that: the stale curated copy can still be selected by explicit $skill invocation unless it is explicitly disabled in config, even though it is not installed.
Workaround that fixed the issue locally:
[plugins."superpowers@openai-curated"]enabled = false
After adding that entry and restarting Codex, $superpowers resolved to:
~/.codex/plugins/cache/superpowers-dev/superpowers/6.1.1/skills
Environment:
- macOS
- Codex CLI observed: 0.142.5
- Model: gpt-5.5
- Affected both Codex App and CLI-style sessions
- Upstream Superpowers marketplace source:
https://github.com/obra/superpowers.git
4 Comments
I saw a similar stale-skill-resolution failure in a local Codex session using a project/custom skill workflow. Keeping details generic here to avoid exposing local paths or project information.
Setup:
Observed behavior:
$skillsyntax.Impact:
Expected behavior:
$skillinvocation should resolve only to the currently active/canonical enabled skill source.This seems related to the stale cached-skill selection described in this issue, even though my case involved a project/custom skill mirror rather than only a marketplace plugin cache.
I can reproduce a closely related case on macOS with Codex App / CLI 0.142.5, but it shows up in the Codex App composer UI rather than only explicit
$skillinvocation.Setup:
superpowers@superpowers-marketplace, version5.1.0codex plugin list --jsonshows only that Superpowers plugin as installed/enabled.codex plugin list --available --jsonalso only reports that installed Superpowers entry./brainresults:BrainstormingSuperpowers: BrainstormingThe bare
Brainstormingentry opened this stale remote curated cache path:The stale remote bundle had:
with:
So the App composer was exposing a no-prefix skill from
openai-curated-remote/superpowers, even though the user-visible installed plugin state only containedsuperpowers@superpowers-marketplace.I also tried the documented disable direction:
but the remote curated cache could still be rehydrated. The only local workaround that stopped the duplicate composer entry was:
codex plugin remove superpowers@openai-curated-remote --jsonopenai-curated-remote/superpowersbundle and stale remote catalog cache~/.codex/plugins/cache/openai-curated-remote/superpowerswith an immutable empty tombstone directoryExpected behavior:
$skillresolution.enabled = falseforsuperpowers@openai-curated-remoteshould take precedence over remote-installed/cache state.codex plugin list, the App plugin UI, and composer skill suggestions should agree on whether a remote curated plugin is active.This seems related to #28443 and #26275 as well.
I can reproduce a materially consequential variant on macOS using ChatGPT Desktop 26.803.61601 and bundled
codex-cli 0.147.0-alpha.6.5.codex plugin list --jsondoes not list GitHub as installed, and my~/.codex/config.tomlcontains no GitHub plugin entry. Nevertheless, Codex materialized:and created
.codex-remote-plugin-install.jsonon 2026-08-11, identifying remote pluginplugin_connector_1p_1a69035c238881919c4190932b2df699.A subsequent Codex task injected
github:yeetinto the model-visible skill catalog. ItsSKILL.mddefaults PR creation to draft. The agent followed that instruction and opened a completed PR as draft even though I had never intentionally selected or installed that skill.This is more than stale autocomplete: a plugin absent from the user-visible installed list supplied workflow instructions that changed external GitHub state.
Expected behavior:
codex plugin list, and configuration diagnostics.Related reports: #28443, #26275, and #29450.
ChatGPT Desktop feedback ID containing the affected task telemetry:
019fe6ee-6dd7-72f3-be2f-b28b2f5001aa.I reproduced a materially similar GitHub-plugin variant on 2026-08-20 in T3 Code on Linux.
Observed plugin state:
codex plugin list --jsonreported no installed or available plugins.codex plugin marketplace listreported no configured marketplaces.github:githubfrom the remote curated cache snapshotgithub/0.1.9-5f7cd798dc99.skills/github/SKILL.mdsaid that stage, commit, push, and PR creation each require separate explicit authorization and that requesting one action never authorizes the others.Reproduction:
Put up the PR for it and I'll review.This is stale relative to current
openai/pluginsmain. The current GitHub routing skill classifiespublish changesas the complete create/switch branch, stage, commit, push, and draft-PR workflow and routes it toskills/yeet/SKILL.md;yeetexplicitly performs push followed by PR creation.Impact:
Expected behavior:
codex plugin list, app/T3 plugin state, and model-visible skill roots should agree on plugin identity and version.put up/open/create a PRshould run the bounded publish workflow—including the necessary push and draft PR creation—without a redundant authorization round, while still not implying merge, force-push, or unrelated changes.I did not edit or delete the cache. After the user clarified the intended compound authorization, the exact task branch was pushed and one draft PR was created successfully. The remaining issue is stale remote-plugin selection/distribution.