strudel — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited strudel (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Reference skill for programming music with Strudel — a JavaScript live-coding environment based on TidalCycles patterns, running in-browser.
Cycle — the fundamental time unit (~2 seconds at the default 30 cpm). All events fit within cycles; adding events makes each shorter, not the total longer. One cycle = one bar of 4/4 at the default tempo.
Pattern — a pure function from time to events. Everything is a pattern. Transforming a pattern wraps it; the original is unchanged.
Mini-notation — a DSL written inside "double quotes" (single-line) or ` backticks (multi-line). Single quotes '...'` are plain JS strings and are NOT parsed as patterns.
Chaining — methods chain left-to-right: note("c e g").s("piano").lpf(800).room(0.4).
`$:` tracks — the REPL syntax for parallel patterns. Each $: line is an independent stream. _$: mutes a track. Outside the REPL, use stack(...).
// First sound
s("bd sd hh cp")
// First note
note("c3 e3 g3 a3").s("piano")
// Stack drum + melody
stack(
s("bd*4, ~ cp ~ cp, hh*8"),
note("<c3 eb3 g3 bb3>/4").s("piano").room(0.4)
)
// Set BPM (default = 120 BPM in 4/4)
setcpm(120 / 4) // cycles per minute = BPM ÷ beats-per-cyclesetcpm(120 / 4) // 120 BPM, 4/4
setcpm(128 / 4) // house
setcpm(135 / 4) // techno
setcpm(174 / 4) // drum and bass
setCps(140/60/4) // cycles-per-second form| Key | Action |
|---|---|
Ctrl+Enter | Evaluate / update pattern |
Ctrl+. | Stop all patterns |
Pull these when you need detail:
| File | Contents |
|---|---|
references/mini-notation.md | Complete DSL syntax — all operators, euclidean, alternation, polyrhythm |
references/pattern-functions.md | All pattern combinators — time, conditional, random, accumulation, signals, stepwise |
references/sound-sources.md | Synths, drum banks, GM samples, FM synthesis, samples loading, MIDI/OSC |
references/audio-effects.md | Full effects chain — filters, ADSR, envelopes, delay, reverb, phaser, distortion, sidechain |
references/tonal.md | Scale/chord/voicing API, transposition, xenharmonic |
references/recipes.md | Production idioms — beats, bass, arpeggios, chord progressions, house/techno/D&B/trap |
references/visual-feedback.md | Visualizers (pianoroll, scope, spectrum, spiral) — what each shows and when to suggest them |
Most questions hit mini-notation or pattern-functions.
sine, rand, perlin for LFOs and continuous modulation.every, sometimes, chunk, arrange for variation over time.pianoroll(), scope(), or spectrum() when explaining or teaching.See references/visual-feedback.md for when each applies.
"..." or ` ... — not '...'`.<a b c> alternates one element per cycle (3 cycles to complete) — the whole pattern isn't faster.delay feedback ≥ 1 creates an infinite loop; keep it < 1.roomsize is expensive to change while running; set it once..orbit(n) — each orbit has its own shared delay/reverb bus.Default orbit = 1.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.