Summary
The create_skill tool description tells the model to define async def execute(inp, context), but not that the module must also export a SKILL_DEFINITION dict with name, description and an object input_schema. The loader requires that dict, so a first attempt that follows the description fails.
The description also says "See data/skills/*.template", but no .template files are present in an installed data/skills/. The model cannot reach that guidance either.
Evidence (live, v4.10.0 campaign branch deploy, 2026-09-29)
- A model-authored skill following the description failed to load:
Failed to load skill live_battery_probe.py: SKILL_DEFINITION must be an object.
- The tool result was
Skill file written but failed to load. Check syntax and required exports (SKILL_DEFINITION dict + async execute function).
- The loader's requirements are in
src/tools/skill_manager.py: SKILL_DEFINITION must be an object with a valid name, a string description and an object input_schema.
Expected
- The
create_skill description states the full module contract, SKILL_DEFINITION plus execute, with a minimal example.
- It no longer points at template files that are not shipped where the model can see them.
Impact
Every install: the first skill created from the description alone fails. The load error names the requirement, so a retry usually recovers, but it costs a failed tool call and can derail a turn.
Summary
The
create_skilltool description tells the model to defineasync def execute(inp, context), but not that the module must also export aSKILL_DEFINITIONdict withname,descriptionand an objectinput_schema. The loader requires that dict, so a first attempt that follows the description fails.The description also says "See data/skills/*.template", but no
.templatefiles are present in an installeddata/skills/. The model cannot reach that guidance either.Evidence (live, v4.10.0 campaign branch deploy, 2026-09-29)
Failed to load skill live_battery_probe.py: SKILL_DEFINITION must be an object.Skill file written but failed to load. Check syntax and required exports (SKILL_DEFINITION dict + async execute function).src/tools/skill_manager.py:SKILL_DEFINITIONmust be an object with a validname, a stringdescriptionand an objectinput_schema.Expected
create_skilldescription states the full module contract,SKILL_DEFINITIONplusexecute, with a minimal example.Impact
Every install: the first skill created from the description alone fails. The load error names the requirement, so a retry usually recovers, but it costs a failed tool call and can derail a turn.