skill_importer — mapping rules¶
Use this when you (the skill_importer skill) translate an external prompt or workflow into a reyn skill. The job is one direction only: source → reyn DSL. The output should pass reyn lint cleanly.
Source patterns and their reyn mappings¶
Single prompt → single phase¶
Source: "Summarize the input in 3 bullets, then expand into a paragraph."
Reyn: Two phases: outline (3 bullets) → expand (paragraph). Skill graph
outline:[expand], expand:[end].
If the source is genuinely a single transformation, use one phase + entry → end. If it has obvious sub-steps, split.
Linear sub-steps → linear graph¶
Source: "Step 1: extract entities. Step 2: classify each entity. Step 3: format the report."
Reyn: Three phases (extract, classify, format). Graph:
extract: [classify]
classify: [format]
format: [end]
Conditional branches → branching graph¶
Source: "If the input is a question, answer it. Otherwise, summarize."
Reyn: triage phase with graph triage: [answer, summarize]
answer: [end]
summarize: [end]
The branch decision is the LLM picking among candidate transitions in the triage phase. Don't encode the condition in phase instructions as control flow ("if X, set next_phase to Y"); the LLM picks among candidate_outputs directly.
Loops → review/revise pattern¶
Source: "Draft the answer, then revise until it satisfies the criteria."
Reyn: draft → review → [revise, end]; revise → review.
Self-loops aren't supported. Always go through a separate phase (revise).
Tool calls → Control IR¶
| Source pattern | Reyn equivalent |
|---|---|
| "Read file X" | file.read Control IR op |
| "Search the web for X" | MCP search tool (declared in skill permissions) |
| "Run command X" | shell Control IR op (requires --allow-shell) |
| "Ask the user about X" | ask_user Control IR op |
| "Look up project memory" | preprocessor run_skill: recall_memory |
Don't translate every "look up X" into recall_memory. Only when the source clearly intends to read user/project state.
Repeated outputs → artifact schema¶
Source: "Return JSON like {entities: [{name, type, confidence}, ...]}"
Reyn: artifacts/entity_list.yaml with that schema. Phase output flows into
this shape via P1 (next-phase input or skill final_output).
Don't do¶
- Don't infer fields not in the source. If the source doesn't ask for
quality_score, don't add it. - Don't invent decision values. Use
continue/finish/abortonly. Norevise,redo. [P7] - Don't enumerate output fields in phase instructions. [P8]
- Don't put control flow in phase instructions. Encode it in the graph. [P1]
- Don't add Python preprocessor steps the source didn't suggest. Keep imports minimal.
Output of an import¶
The importer should produce:
reyn/local/<name>/skill.mdreyn/local/<name>/phases/*.mdreyn/local/<name>/artifacts/*.yaml- (Optional)
reyn/local/<name>/<module>.pyfor Python preprocessor steps.
Then run reyn lint <name> via the lint Control IR op. If linting fails, revise once. If it still fails, surface the issues to the user — don't keep iterating.
Promotion guidance (for the user)¶
After import, the user should:
- Review the generated structure manually.
- Write a sample input and
reyn run <name>to verify behavior. - Run
skill_improverto refine if needed. - Move from
reyn/local/toreyn/project/when ready to commit.