Skills (SKILL.md)
A skill is a plain, human-editable Markdown file — SKILL.md-standard-compatible frontmatter, then numbered step blocks. reelier compile writes one from a trace; you can also hand-edit it, and serializeSkill preserves any prose you add outside the step blocks verbatim.
---
name: sf-post-deploy-smoke
description: Post-deploy smoke sweep of seldonframe.com core routes
---
# SF post-deploy smoke sweep
Inputs: (none for this skill)
## Steps
### Step 1 — Homepage is up and branded
- intent: Confirm the marketing homepage serves and carries the brand sentinel
- action: http.get {"url": "https://www.seldonframe.com/"}
- assert: status == 200
- assert: body contains "SeldonFrame"
- effect: readFrontmatter
Must start with a ----fenced block. Two keys are required: name and description.
Steps
Numbered sequentially from 1, as ### Step N — Title. Each step has three required fields and two optional, repeatable ones:
| Field | Required? | Cardinality |
|---|---|---|
| intent | Yes | exactly 1 |
| action | Yes | exactly 1 |
| assert | No | 0 or more |
| bind | No | 0 or more |
| effect | Yes | exactly 1 |
A malformed skill (bad frontmatter, a missing required field, an unrecognized assert/bind expression, an out-of-order step number) is rejected with an error naming the exact step and line — Reelier never silently skips a broken step.
Assert mini-language
status == <int>/status != <int>body contains "<text>"/body not contains "<text>"json.<dotpath> is array/is setjson.<dotpath> == <json-scalar>/!=/>/<json.<dotpath> length > <int>(arrays and strings)
Bind mini-language
<name> = json.<dotpath><name> = body match /<regex>/(first capture group; no match is a divergence)
today and today±Nd (e.g. today-7d) are reserved for computed date template vars and can’t be used as a bind name.
Effect (closed enum)
read— no side effects, always executed.idempotent-write— a write safe to repeat, always executed.destructive— refused unless the run passes--yes. Never re-executed by escalation regardless of--yes.
Computed date vars
{{today}}, {{today-Nd}}, {{today+Nd}} (1–365) resolve deterministically from a clock, not from bindings — one clock snapshot per run, so a long run never straddles a UTC midnight boundary and sees a different {{today}} partway through.
The full normative spec — trace format, run-record shape, the MCP proxy contract, exact parser grammar — lives in SPEC.md on GitHub.