Desktop skill picker ignores icon_small/icon_large and always renders the generic cube
What version of Codex is running?
- ChatGPT desktop app:
26.818.41509(build6962) - Embedded Codex CLI:
0.149.0-alpha.4.1 - Platform: macOS 26.5.2, Apple Silicon
What issue are you seeing?
The ChatGPT desktop skill picker always renders the generic cube icon for standalone and plugin skills, even when valid interface.icon_small and interface.icon_large metadata is present in agents/openai.yaml.
The metadata is loaded correctly. A forced skills/list request returns a resolved, existing absolute path, for example:
{
"name": "yeet",
"interface": {
"iconSmall": "/Users/<user>/project/.codex/skills/yeet/assets/skill-provider.png",
"iconLarge": "/Users/<user>/project/.codex/skills/yeet/assets/skill-provider.png"
},
"enabled": true
}
However, the / picker, the @ skill list, and the skill slash-command list all show the same generic skill cube.
Inspection of the shipped desktop JavaScript shows that the skill data mapper preserves interface.iconSmall, but the three list-item builders instantiate the generic skill icon directly (icon: genericSkillIcon() / Icon: genericSkillIcon()) instead of using the supplied icon path. The existing image renderer is used for apps/plugins elsewhere in the same bundle.
What steps can reproduce the bug?
- Create a skill containing
SKILL.md,assets/provider.png, and this metadata:
``yaml``
interface:
display_name: "Provider Icon Repro"
icon_small: "./assets/provider.png"
icon_large: "./assets/provider.png"
- Confirm
assets/provider.pngexists and is readable. - Run Force reload skills from the command menu, or fully restart the desktop app.
- Open the composer and type
/or@to display the skill picker. - Observe that the row uses the generic cube rather than
provider.png. - Call
skills/listwithforceReload: true; observe thatinterface.iconSmallandinterface.iconLargeare correctly resolved.
What is the expected behavior?
Skill picker rows should render interface.iconSmall when it is present and valid, falling back to the generic skill icon only when no custom icon is available or loading fails.
The same behavior should apply consistently to:
- the
/skill picker; - the
@skill list; - slash-command skill results;
- inserted skill mention chips where custom icons are supported.
Additional information
- The current skills documentation describes
icon_smallandicon_largeas optional UI metadata for the ChatGPT desktop app. - Restarting and forcing a catalog reload do not change the result.
- PNG and SVG assets both reproduce the issue.
- This appears to be a presentation-layer wiring gap rather than a loader or cache problem.
1 Comment
Additional implementation detail from build 26.818.41509: the existing small-icon renderer already accepts a skill object or explicit
iconSmall,basePath, and fallback options. The missing wiring is limited to three builders: the@mention skill item, the/skill picker item, and the slash-command skill result; each currently instantiates the generic cube directly. A proof-of-concept swapping those three calls for the existing renderer validated the data path. This needs to ship in the signed desktop bundle:app.asaris part of the macOS resource seal, so mutating it locally is not a safe workaround.