Agent skills
A skill is a discrete capability the chat agent can invoke. This spec defines the catalog we're building toward — what the AI can do, how to trigger it, and what it returns.
Why skills?
Today the chat agent is a single generalist prompt — the user types and hopes. Skills formalize the contract: each skill has a clear trigger, input shape, output (code vs text vs both), and a focused system prompt tuned to its job. This enables:
- Cheaper routing — explain/debug skills use Haiku; compose uses Sonnet.
- Predictable UX — users know what to ask, the agent knows how to answer.
- Testable behaviors — each skill gets its own evals.
- Discoverability — skills appear as quick actions in the chat.
Compose
- shippedCompose by genrecompose-genre
Generate a full track in a named genre (deep-house, techno, trap, ambient, jazz…). Respects key and BPM if provided.
Triggers- · DJ deck → COMPOSE
- · chat: "make a deep house track"
Returnscode+text - shippedEvolve current patterncompose-evolve
Small mutation of the current code — same structure, tweaked details. Used by autopilot every 30s and by the EVOLVE button.
Triggers- · Transport bar EVOLVE
- · autopilot interval
- · chat: "evolve this"
Returnscode - shippedAdd a specific layercompose-layer
Add a kick, hats, snare, bass, lead, pad, or FX chain to the current code while preserving the rest. Driven by deck layer buttons.
Triggers- · DJ deck → [+ Kick/Hats/…]
- · chat: "add a bassline"
Returnscode
Edit
- shippedTweak a parameteredit-filter
Modify a specific effect or parameter — filter cutoff, reverb amount, delay feedback, gain, pan — without rewriting structure.
Triggers- · chat: "darker filter on the lead"
Returnscode - shippedSwap / mute a layeredit-swap
Replace a sound bank, silence a track, or comment out a line. Keeps everything else intact.
Triggers- · chat: "mute the hats", "swap 909 for 808"
Returnscode
Explain
- plannedExplain a functionexplain-function
Describe what a Strudel function does, with examples. Complements the on-hover JSDoc tooltip with a conversational answer.
Triggers- · chat: "what does perlin.range do?"
Returnstext - plannedExplain current patternexplain-pattern
Walk the user through what each line of the current code is doing, in plain language. Good for learners.
Triggers- · chat: "explain this code"
Returnstext - plannedDebug an errorexplain-debug
Look at the current error state (from Strudel's evaluator) and suggest a fix. Covers syntax, unknown banks, mismatched parens.
Triggers- · auto: on eval error
- · chat: "why is this broken?"
Returnscode+text
Transform
- plannedTranspose / change keyedit-transpose
Shift pitched content to a new key while respecting mode (minor/major/phrygian etc.).
Triggers- · chat: "transpose to F minor"
Returnscode - plannedChange BPM or time feeledit-tempo
Re-time the pattern (halftime, double-time, swing). Recomputes eighth/sixteenth ratios.
Triggers- · chat: "half-time"
- · chat: "add 60% swing"
Returnscode - in-progressBuild a droptransform-drop
Construct a tension/release moment — mute / low-pass sweep / reintroduce — either inline or as labeled sections.
Triggers- · ToolsPanel DROP button
- · chat: "build a drop"
Returnscode - plannedCreate a variationtransform-variation
Derive a named alternate section (A/B, intro, bridge) from the current pattern. Used for live arrangement.
Triggers- · chat: "give me a B section"
Returnscode