Some plugin skills reference a shared plugin-level icon asset instead of copying the icon into every skill directory. In the repro this showed up in Twilio Developer Kit skills, and one CodeRabbit skill had the same shape:
interface:
icon_small: "../../assets/logo.svg"
icon_large: "../../assets/logo.svg"The skill loader only knew the skill directory, so it rejected every icon path containing ..:
codex_core_skills::loader: ignoring interface.icon_small: icon path must not contain '..'
The skills still loaded because icon metadata is optional, but the warnings repeated whenever skills were scanned.
The logging PR fixes nested span amplification. This is a loader/model issue: plugin metadata can legitimately point at shared plugin assets, but the loader could not distinguish that from unsafe path traversal.
Branch: fix-plugin-shared-skill-icons
Commit: 3efa3a5c1d62
Compare: https://github.com/openai/codex/compare/main...b-nnett:fix-plugin-shared-skill-icons
The fix passes the plugin root alongside plugin skill roots, then allows .. in plugin skill icon paths only when the lexically normalized target stays under:
<plugin_root>/assets/
Guardrails preserved:
- Non-plugin skill icons still reject
... - Plugin icon paths that escape
<plugin_root>/assets/still reject. - Existing skill-local
./assets/...icon paths still work.
cargo test -p codex-core-skills # 96 passed
cargo test -p codex-plugin # 1 passed
cargo test -p codex-core-plugins # 191 passed