codex: `<recommended_plugins>` fragment ignores `features.recommended_plugins`; only `features.plugins=false` removes it

Resolved 💬 2 comments Opened Aug 16, 2026 by maxivillus Closed Aug 16, 2026
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

Repo: openai/codex
Type: bug + enhancement
Status: готов к постингу

Title

<recommended_plugins> prompt fragment is not gated by features.recommended_plugins; disabling it requires features.plugins = false

Body

Version: codex-cli 0.147.0 (app-server mode)

Summary

Every model turn includes a <recommended_plugins> user-role fragment listing 40–50 installable-but-not-installed plugins from the openai-curated-remote catalog ("Here is a list of plugins that are available but not installed."). The fragment is replayed on every turn of a session (~1.9 KB ≈ ~0.5K tokens per turn; hundreds of thousands of processed tokens on long runs).

Two problems:

  1. The advertised feature flag does nothing. codex features list lists recommended_plugins (stable). Setting features.recommended_plugins = false in config.toml does not remove the fragment — it is still injected on every turn. (For reference, the model metadata advertises include_plugin_usage_instructions: true for the active model.)
  1. The only working switch is a sledgehammer. features.plugins = false does remove the fragment, but it disables the entire plugin surface (plugin tools, hooks, marketplaces) — even when no plugins are installed at all and the user only wants to suppress the recommendation list.

Expected behavior

  • Either honor features.recommended_plugins = false and suppress the fragment, or
  • provide a fine-grained switch (e.g. recommended_plugins_mode = "off" / a config key for the fragment), so the recommendation list can be disabled without turning off the plugins feature.

Secondary observation (may be TOML-layer, flagging for visibility)

features.* keys placed after table sections in config.toml (e.g. after [mcp_servers.*] or [projects.*] blocks) are silently ignored — only keys before the first table take effect. There is no warning. If this is intentional parsing behavior, a warning would save users from believing the setting was applied.

Reproduction

# config.toml
features.recommended_plugins = false   # (top of file) — fragment still present in every turn
features.plugins = false               # — fragment disappears, but plugins feature is off

Impact

Token/context cost and prompt noise per turn in non-interactive (app-server) and TUI sessions; no way to keep plugins enabled while dropping the recommendation list.

_Verification note: tested in unattended app-server sessions; fragment presence checked in session rollout files (<recommended_plugins> markers)._

View original on GitHub ↗

2 Comments

github-actions[bot] contributor · 11 days ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #38185

Powered by Codex Action

maxivillus · 11 days ago

Comment: openai/codex #38881 — close as duplicate of #38185

---

Confirmed duplicate of #38185 — closing in favor of it. Same root cause:
<recommended_plugins> (remote @openai-curated-remote catalog) is injected
unconditionally, and the only working switch (--disable plugins /
features.plugins=false) is all-or-nothing.

Two findings from our side that are not in #38185 yet, posted there as a
comment:

  1. features.* keys placed after a [table] in config.toml are silently

ignored — the same key before the table takes effect. So
"recommended_plugins=false in config" can look broken twice: the flag isn't
wired to this injection path, and depending on file layout the value never
parses.

  1. A/B-verified with codex debug prompt-input: features.plugins=false

removes the fragment but also strips the <plugins_instructions> block for
actually-installed plugins — unusable when real plugins are enabled. Cost:
~0.5K tokens per turn, re-emitted on every turn.