skill_builder — design checklist¶
Use this checklist whenever you (the skill_builder skill) plan or write a new skill. Every item maps to one or more of the P1–P8 principles.
Phase decisions (must hold)¶
- [ ] Each phase declares only
input(and optionalpreprocessor,role,can_finish). [P1] - [ ] No phase markdown enumerates output fields. [P1, P8]
- [ ] No phase markdown describes Control IR format. [P8]
- [ ] No phase markdown names the next phase. The Skill graph owns transitions. [P1]
- [ ] Phase instructions describe what to do, when to choose which candidate, and domain rules — nothing else.
Skill decisions (must hold)¶
- [ ]
skill.mddeclaresentry,graph,final_output. [P2] - [ ]
final_outputis a single artifact type, not a union. - [ ]
graphusesendas the terminal sentinel for any phase whosecan_finish: true. - [ ] If the skill has multiple paths, every leaf path eventually reaches
end.
Artifact decisions (must hold)¶
- [ ] Each artifact has a clear, single-purpose schema.
- [ ] Avoid kitchen-sink artifacts that carry unrelated fields "just in case."
- [ ] Required fields are minimal — anything that could be optional, mark optional.
- [ ] Field names are lowercase_snake_case.
OS-agnosticism red flags¶
If you find yourself wanting any of these, stop and reconsider — they signal a P7 violation in the skill design:
- [ ] A field called
quality_notes,revision_reason, or other meta-feedback baked into a domain artifact. → use a separate review artifact instead. - [ ] A
decisionfield with values likerevise,redo,improve. → usecontinueand let the graph route to a revise phase. - [ ] Phase instructions that say "the next phase will need X" → just describe X in this phase's output (which is the next phase's input).
Python preprocessor checklist¶
If a phase uses a python preprocessor step:
- [ ] The
.pyfile lives in the skill directory (relative path only — no.., no absolute paths). - [ ] Mode is
safeunless unsafe access is genuinely required. - [ ]
output_schemais declared explicitly (the LLM-visible enrichment shape). - [ ] The skill's
permissions.pythonlists the same module/function pair as the preprocessor step. - [ ] In safe mode: no
open,eval,exec,__import__,subprocess, or imports outside the allowlist. - [ ] If the function is non-trivial (>30 LOC), break it up — preprocessor functions should be small and obvious.
Eval-friendliness¶
- [ ] Each phase has a clear input/output relationship that an LLM judge can verify against criteria.
- [ ] Avoid criteria that would be "vacuously true" under any reasonable phase output (e.g. "char_count is correct" for a Python preprocessor that always computes it correctly).
Final lint¶
After writing files:
- [ ] Run
reyn lint <skill_name>and fix all errors. - [ ] Treat warnings as advisory but read them.
When you've finished¶
If every box is checked, the skill is ready for first-run testing. The very first run on a sample input usually reveals one or two missed details — that's normal. Use skill_improver for systematic refinement.