skill-creator initializer generates invalid description frontmatter
Open 💬 1 comment Opened Aug 5, 2026 by techronin
What issue are you seeing?
The bundled skill-creator initializer creates a SKILL.md whose placeholder description is parsed by YAML as a list. The bundled validator then rejects the freshly generated skill:
Description must be a string, got list
The source is:
codex-rs/skills/src/assets/samples/skill-creator/scripts/init_skill.py
At current main (ed2f985a26eee9a59cde0fdefd20f69b45bc25f5), the template contains:
description: [TODO: Complete and informative explanation of what the skill does and when to use it. Include WHEN to use this skill - specific scenarios, file types, or tasks that trigger it.]
Because square brackets are YAML sequence syntax, yaml.safe_load returns a list, while quick_validate.py correctly requires description to be a string.
What steps can reproduce the bug?
SKILL_CREATOR=codex-rs/skills/src/assets/samples/skill-creator
SMOKE_ROOT=$(mktemp -d)
python3 "$SKILL_CREATOR/scripts/init_skill.py" example-skill \
--path "$SMOKE_ROOT" \
--interface 'display_name=Example Skill' \
--interface 'short_description=Example generated skill' \
--interface 'default_prompt=Use $example-skill for an example.'
python3 "$SKILL_CREATOR/scripts/quick_validate.py" \
"$SMOKE_ROOT/example-skill"
Observed result:
Description must be a string, got list
What is the expected behavior?
A new skill created by the bundled initializer should pass the bundled structural validator before its TODO text is replaced.
Quoting the placeholder fixes the mismatch without changing its content:
description: "[TODO: Complete and informative explanation of what the skill does and when to use it. Include WHEN to use this skill - specific scenarios, file types, or tasks that trigger it.]"
After this one-line change:
- the generated
descriptionparses as a string; - the generated
agents/openai.yamlremains unchanged; and quick_validate.pyreturnsSkill is valid!for the fresh package.
Additional information
- Reproduced with
codex-cli 0.145.0on macOS. - Confirmed against current
openai/codexmainated2f985a26eee9a59cde0fdefd20f69b45bc25f5. py_compilepasses for all three bundled Python utilities before and after the one-line change.git diff --checkpasses.- I can submit the one-line PR with the verified reproduction if a maintainer invites the contribution, in accordance with
docs/contributing.md.
1 Comment
I confirmed the root cause in the skill template: the
descriptionfield is unquoted with[...], so YAML parses it as a sequence rather than a string and quick_validate rejects newly generated skills immediately.A one-line fix is to quote that placeholder value while leaving the TODO text unchanged. This avoids changing template meaning and should be a minimal, low-risk change.
Since this appears to be the first parser-facing failure in the
init_skill.pyflow, I also recommend a regression check that runsquick_validate.pyon fresh output frominit_skill.py.I’m flagging this here because external code PRs are still invite-only in this repo (
docs/contributing.md), so issue-level analysis is the safest path for follow-up.