← Files AkinatorARCHIVED FILE

memory/2026-08-26-codex-plugin-validation-surprises.md

2.63 KB · Oct 3, 2026 · 06:33 UTC

↓ Download file

---
name: codex-plugin-validation-surprises
type: surprise
date: 2026-08-26
---

# Codex plugin validation requires interface assets, and rejects loose files under skills/

## The fact

Three things Codex plugin validation enforces that the written spec does not make
obvious:

1. **`interface.composerIcon` is required**, and must reference a square image.
2. **`interface.logo` is required**, and must reference a square image.
3. **Files directly under `skills/` are not imported**, and fail validation:
   *"Files directly under `skills/` are not imported as skills. Move this file
   into a skill directory containing `SKILL.md`, or remove it."*

The spec lists `composerIcon` and `logo` among the *optional* interface fields.
They are not optional. Reading the field list and believing it produces a plugin
that looks correct, passes every local test, and is rejected on submission.

## Why

The first two were misread rather than undocumented: the spec's "Optional
Fields" section lists them, but the validator treats the interface block as a
storefront listing, and a listing without an icon cannot be rendered. The lesson
generalizes - **the validator is the contract, the field list is a summary.**

The third is a genuine trap, and Akinator walked straight into it. `skills/` had
a `README.md` index: linked from every router, correct by the taxonomy's own
"every artifact reachable from an index" law, and reasonable in any normal
repository. In a *plugin* it silently makes the package invalid, because both
platforms import skills by scanning for subdirectories containing `SKILL.md`.

The index now lives at `docs/skills.md`.

## Date

- 2026-08-26 - recorded when the owner reported all three from a validation run.
  `docs/compatibility.md` had asserted the opposite about the assets and was
  corrected in the same batch.

## Reversal conditions

- Codex changes the interface requirements, or begins importing loose files under
  `skills/`.
- Akinator stops shipping a Codex plugin manifest, at which point only the
  `skills/` constraint still applies (Claude Code also ignores loose files there,
  it just does not reject the plugin for them).

## Related

- `rules/08-skills-dir-holds-only-skill-directories.md` - the constraint, with a
  test as its enforcement
- `docs/compatibility.md` - the corrected contract table
- `docs/deviations.md` - item 4, kept and corrected rather than rewritten
- `assets/akinator-icon.png`, `assets/akinator-logo.png` - the required assets;
  hand-designed since 2026-09-18, when the drawing script was retired
- [[verify-contracts-from-installed-plugins]] - the same lesson from the Claude
  side: the artifact beats the documentation

SHA-256: c2a8b1666b3246b68f14ab067aba40458ede3d12e06f81a1171979d02a9d76ad