testing
Three layers in CI today, by ascending integration scope: unit → ART → E2E. The PR gate
(flox activate -- task ci) runs typecheck + unit + ART + E2E. VRT (Visual
Regression Tests) is planned for the video domain but not yet implemented — see below.
Unit
Vitest, fast, scoped per workspace. Lives next to the code (foo.ts ↔ foo.test.ts). Run all unit tests:
flox activate -- task test Coverage areas today: graph store mutations, capacity logic, auth handshake, layout merging, note-entry coercion, docs module-manifest generator.
Port-surface consistency gates
Three gates keep each module’s I/O surface consistent across def, published manifest,
and rendered UI — drift between them was the root cause of the RIOTGIRLS regression where the def grew dozens of CV inputs but the card only rendered three handles
per voice (cables had nothing visible to land on).
- The module def at
packages/web/src/lib/{audio,video}/modules/<type>.ts(the runtime source of truth — what the engine wires up). - The published manifest at
/docs/modules/<type>(built frompackages/web/src/lib/docs/module-manifest.ts). - The card UI at
packages/web/src/lib/ui/modules/<Type>Card.svelte(the Svelte Flow Handle elements the user can plug cables into).
- Unit — manifest stays in sync with defs:
packages/web/src/lib/docs/module-manifest.test.tsiterates overgetAllModuleSpecs()and asserts the manifest’s input/output ids equal the def’s. Catches drift between the def and the docs builder. - E2E — UI matches def:
e2e/tests/io-spec-consistency.spec.tsspawns each module type, readswindow.__moduleSpecs, and asserts every Handle’sdata-handleidmatches the def. - E2E — CV range uniformity:
e2e/tests/cv-range-uniformity.spec.tswalks everycvinput port and asserts acvScalehint is declared, then drives an LFO at ±1 to confirm the target slider sweeps edge-to-edge. Catches the regression where a new module is added with a rawpassthroughCV input, leaving an LFO touching only ~10% of the natural range. See.myrobots/plans/cv-range-standard.md.
Adding a new module: the unit test iterates the registry automatically — no
edit needed. For the E2E test, add the new ModuleType string to the MODULE_TYPES array in io-spec-consistency.spec.ts and make sure the
card’s <Handle> id= values match the def’s port ids
exactly. If the UI is intentionally lagging the def (e.g. some CV ports kept off-card to avoid
chrome overload), add an entry to SKIP_DEF_VS_UI with a TODO pointing at the
follow-up branch.
Helper: packages/web/src/lib/dev/module-specs.ts exposes getAllModuleSpecs() as a thin projection of the registry. In dev / VITE_E2E_HOOKS=1 builds it’s also published as window.__moduleSpecs.
ART — Audio Regression Tests
Offline render of compiled DSP through node-web-audio-api → Float32 PCM. Tests
assert on FFT peak frequency, harmonic ratios, silence floor, and where deterministic,
byte-identical match against a .f32 baseline pinned in Git LFS. The harness lives
at art/setup/render.ts.
flox activate -- task art # run
flox activate -- task art:update # regenerate .f32 + .sha baselines Browse a rendered gallery of every .f32 baseline — a
waveform + log-frequency spectrogram per baseline, grouped by scenario — published to
GitHub Pages: ART gallery →. It’s generated by art/build_gallery.py and republished on every push to
main (.github/workflows/art-gallery.yml), the audio sibling of the VRT gallery.
Scenarios (113)
| group | spec |
|---|---|
| _meta | audio-profile-gate.test.ts |
| _meta | baseline-uniqueness.test.ts |
| adsr-invert | env-invert.test.ts |
| adsr | profile.test.ts |
| analog-logic-maths | algebra.test.ts |
| analog-logic-maths | profile.test.ts |
| analog-vco | fm-sync-model.test.ts |
| analog-vco | hard-sync.test.ts |
| analog-vco | pw-pm-morph.test.ts |
| attenumix | mix-saturation.test.ts |
| attenumix | profile.test.ts |
| audio-out | dc-blocker-and-limiter.test.ts |
| bluebox | profile.test.ts |
| buggles | woggle-events.test.ts |
| cartesian-lfo | cartesian-lfo.test.ts |
| charlottes-echos | profile.test.ts |
| charlottes-echos | single-tap.test.ts |
| charlottes-echos | wet-output.test.ts |
| chowkick | canonical-kicks.test.ts |
| chowkick | profile.test.ts |
| clouds | granular-texture.test.ts |
| cloudseed | impulse-response.test.ts |
| cocoadelay | profile.test.ts |
| cube | slice-readout.test.ts |
| cv-range-uniformity | cv-scale-coverage.test.ts |
| delay | profile.test.ts |
| depolarizer | profile.test.ts |
| drumseqz | eucl-render.test.ts |
| dx7 | algorithm-spectra.test.ts |
| dx7 | envelope.test.ts |
| dx7 | polyphony.test.ts |
| dx7 | preset-spectra.test.ts |
| dx7 | spectral-audit.test.ts |
| dx7 | syx-spectra.test.ts |
| elements | modal-character.test.ts |
| featurecv | feature-extract.test.ts |
| flipper | profile.test.ts |
| fourplexer | profile.test.ts |
| gatemaiden | profile.test.ts |
| helm | envelope-shapes.test.ts |
| hypercube | slice-readout.test.ts |
| illogic | attenuverter-and-logic.test.ts |
| illogic | profile.test.ts |
| kickdrum | profile.test.ts |
| lfo-shared-clock | deterministic-phase.test.ts |
| macrooscillator | spectral-character.test.ts |
| marbles | gate-and-cv.test.ts |
| meowbox | meow-c4.test.ts |
| meowbox | voct-tracking.test.ts |
| mixmstrs | passthrough.test.ts |
| modtris | gate-pulses.test.ts |
| moog-cp3 | profile.test.ts |
| moog904a | profile.test.ts |
| moog904b | profile.test.ts |
| moog904c | profile.test.ts |
| moog905 | profile.test.ts |
| moog907a | profile.test.ts |
| moog911 | profile.test.ts |
| moog911a | profile.test.ts |
| moog914 | profile.test.ts |
| moog921-vco | profile.test.ts |
| moog960 | profile.test.ts |
| moog962 | profile.test.ts |
| negativity | profile.test.ts |
| ninelives | profile.test.ts |
| noise | profile.test.ts |
| noise | spectral-shape.test.ts |
| note-pitch | note-pitch.test.ts |
| peaks | multimode.test.ts |
| polarizer | profile.test.ts |
| poly-chord | maj-triad.test.ts |
| polyhelm | poly-chord.test.ts |
| polyseqz | chord-fft.test.ts |
| pong | gate-pulses.test.ts |
| resofilter | profile.test.ts |
| ringback | profile.test.ts |
| rings | resonator-character.test.ts |
| riotgirls | passthrough.test.ts |
| sample-hold | quantized-vco-steps.test.ts |
| samsloop | varispeed-spectrum.test.ts |
| scaler | profile.test.ts |
| scope-tuner | internal-references.test.ts |
| scope-tuner | real-world.test.ts |
| score | score-pitch-and-envelope.test.ts |
| sequencer-transport | quicksave-handoff.test.ts |
| shimmershine | octave-up-tail.test.ts |
| sidecar | profile.test.ts |
| sidecar | static-ratio-curve.test.ts |
| slew-switch | profile.test.ts |
| stages | segment-shapes.test.ts |
| stereovca | ring-mod-spectrum.test.ts |
| swolevco | spectral-and-routing.test.ts |
| symbiote | drums-and-acid.test.ts |
| synesthesia | band-filtering.test.ts |
| tempo-stability | tempo-stability.test.ts |
| tides2 | poly-slope.test.ts |
| timelorde | bpm-120-internal.test.ts |
| treeohvox | voice-character.test.ts |
| twotracks | twotracks-lofi-error.test.ts |
| twotracks | twotracks-lofi-high.test.ts |
| twotracks | twotracks-lofi-low.test.ts |
| twotracks | twotracks-lofi-off.test.ts |
| unityscalemathematik | profile.test.ts |
| vca-invert | sign-flip.test.ts |
| veils | gain-curves.test.ts |
| veils | profile.test.ts |
| video | phase1-defs.test.ts |
| video | waveform-video-defs.test.ts |
| warps | algorithm-spectra.test.ts |
| warrenspectrum | ping-rings.test.ts |
| warrenspectrum | warrenspectrum.test.ts |
| wavecel | wavecel.test.ts |
| wavefolder | wavefolder-spectrum.test.ts |
Baselines (190)
Pinned in Git LFS at art/baselines/. .f32 = raw 32-bit PCM, .sha = sidecar hash.
| group | file |
|---|---|
| adsr | env.f32 |
| adsr | env.sha |
| analog-logic-maths | diff.f32 |
| analog-logic-maths | diff.sha |
| analog-logic-maths | max.f32 |
| analog-logic-maths | max.sha |
| analog-logic-maths | min.f32 |
| analog-logic-maths | min.sha |
| analog-logic-maths | product.f32 |
| analog-logic-maths | product.sha |
| analog-logic-maths | sum.f32 |
| analog-logic-maths | sum.sha |
| analog-vco | fm-morph-sine.f32 |
| analog-vco | fm-morph-sine.sha |
| analog-vco | fm-sync-c1-bsaw.f32 |
| analog-vco | fm-sync-c1-bsaw.sha |
| analog-vco | fm-sync-c1-bsine.f32 |
| analog-vco | fm-sync-c1-bsine.sha |
| analog-vco | fm-sync-c1-bsquare.f32 |
| analog-vco | fm-sync-c1-bsquare.sha |
| analog-vco | fm-sync-c1-vibrato.f32 |
| analog-vco | fm-sync-c1-vibrato.sha |
| analog-vco | fm-sync-c2-bmaster.f32 |
| analog-vco | fm-sync-c2-bmaster.sha |
| analog-vco | fm-sync-c3-feedback-a.f32 |
| analog-vco | fm-sync-c3-feedback-a.sha |
| analog-vco | fm-sync-c3-feedback-b.f32 |
| analog-vco | fm-sync-c3-feedback-b.sha |
| analog-vco | fm-sync-c4-mutual-a.f32 |
| analog-vco | fm-sync-c4-mutual-a.sha |
| analog-vco | fm-sync-c4-mutual-b.f32 |
| analog-vco | fm-sync-c4-mutual-b.sha |
| analog-vco | hard-sync.f32 |
| analog-vco | hard-sync.sha |
| analog-vco | pm-morph-saw.f32 |
| analog-vco | pm-morph-saw.sha |
| analog-vco | pm-morph-sine.f32 |
| analog-vco | pm-morph-sine.sha |
| analog-vco | pm-morph-square.f32 |
| analog-vco | pm-morph-square.sha |
| analog-vco | pw-sweep-50.f32 |
| analog-vco | pw-sweep-50.sha |
| analog-vco | pw-sweep-narrow.f32 |
| analog-vco | pw-sweep-narrow.sha |
| analog-vco | pw-sweep-wide.f32 |
| analog-vco | pw-sweep-wide.sha |
| attenumix | mix.f32 |
| attenumix | mix.sha |
| attenumix | out2.f32 |
| attenumix | out2.sha |
| bluebox | out.f32 |
| bluebox | out.sha |
| charlottes-echos | L.f32 |
| charlottes-echos | L.sha |
| chowkick | audio_out.f32 |
| chowkick | audio_out.sha |
| cocoadelay | out.f32 |
| cocoadelay | out.sha |
| cube | axis-aligned.f32 |
| cube | connect-strength-circle.f32 |
| cube | connect-strength-hard.f32 |
| cube | connect-strength-vee.f32 |
| cube | connect-vee.f32 |
| cube | hard-material.f32 |
| cube | morph-ceiling.f32 |
| cube | rotated.f32 |
| cube | space-crush-and-crush.f32 |
| cube | space-crush-max.f32 |
| cube | space-crush-mid.f32 |
| cube | space-diffuse-mid.f32 |
| cube | space-diffuse-rotated.f32 |
| cube | space-diffuse-wrap.f32 |
| cube | spread-right.f32 |
| cube | wrap-outside.f32 |
| delay | audio.f32 |
| delay | audio.sha |
| depolarizer | out.f32 |
| depolarizer | out.sha |
| featurecv | noise-bright.f32 |
| featurecv | ramp-loud.f32 |
| featurecv | sine-punch.f32 |
| featurecv | transient-onset.f32 |
| flipper | flip.f32 |
| flipper | flip.sha |
| flipper | flop.f32 |
| flipper | flop.sha |
| fourplexer | out1.f32 |
| fourplexer | out1.sha |
| gatemaiden | gate.f32 |
| gatemaiden | gate.sha |
| gatemaiden | trig.f32 |
| gatemaiden | trig.sha |
| hypercube | alpha-max.f32 |
| hypercube | alpha-mid.f32 |
| hypercube | alpha-rotated.f32 |
| hypercube | alpha-zero.f32 |
| illogic | and.f32 |
| illogic | and.sha |
| illogic | diff.f32 |
| illogic | diff.sha |
| illogic | or.f32 |
| illogic | or.sha |
| illogic | sum.f32 |
| illogic | sum.sha |
| kickdrum | audio_l.f32 |
| kickdrum | audio_l.sha |
| moog-cp3 | out_positive.f32 |
| moog-cp3 | out_positive.sha |
| moog904a | audio.f32 |
| moog904a | audio.sha |
| moog904b | audio.f32 |
| moog904b | audio.sha |
| moog904c | audio.f32 |
| moog904c | audio.sha |
| moog905 | audio.f32 |
| moog905 | audio.sha |
| moog907a | audio.f32 |
| moog907a | audio.sha |
| moog911 | env.f32 |
| moog911 | env.sha |
| moog911a | out1.f32 |
| moog911a | out1.sha |
| moog911a | out2.f32 |
| moog911a | out2.sha |
| moog914 | audio.f32 |
| moog914 | audio.sha |
| moog921-vco | rectangular.f32 |
| moog921-vco | rectangular.sha |
| moog921-vco | sawtooth.f32 |
| moog921-vco | sawtooth.sha |
| moog921-vco | sine.f32 |
| moog921-vco | sine.sha |
| moog921-vco | triangle.f32 |
| moog921-vco | triangle.sha |
| moog960 | row1.f32 |
| moog960 | row1.sha |
| moog960 | row2.f32 |
| moog960 | row2.sha |
| moog960 | row3.f32 |
| moog960 | row3.sha |
| moog962 | out.f32 |
| moog962 | out.sha |
| negativity | out.f32 |
| negativity | out.sha |
| ninelives | out1.f32 |
| ninelives | out1.sha |
| ninelives | out2.f32 |
| ninelives | out2.sha |
| ninelives | out3.f32 |
| ninelives | out3.sha |
| noise | brown.f32 |
| noise | brown.sha |
| noise | pink.f32 |
| noise | pink.sha |
| noise | white.f32 |
| noise | white.sha |
| polarizer | out.f32 |
| polarizer | out.sha |
| resofilter | out.f32 |
| resofilter | out.sha |
| ringback | out.f32 |
| ringback | out.sha |
| sample-hold | continuous-quant-curve.f32 |
| sample-hold | gated-quant-steps.f32 |
| scaler | out.f32 |
| scaler | out.sha |
| sidecar | audio_l_out.f32 |
| sidecar | audio_l_out.sha |
| sidecar | env_out.f32 |
| sidecar | env_out.sha |
| slew-switch | out2.f32 |
| slew-switch | out2.sha |
| slew-switch | switched.f32 |
| slew-switch | switched.sha |
| synesthesia | band1-65hz.f32 |
| synesthesia | band2-400hz.f32 |
| synesthesia | band3-2000hz.f32 |
| synesthesia | band4-8000hz.f32 |
| treeohvox | c-d-eb-f-eb-d-c.f32 |
| treeohvox | c-d-eb-f-eb-d-c.sha |
| unityscalemathematik | a_out.f32 |
| unityscalemathematik | a_out.sha |
| unityscalemathematik | b_out.f32 |
| unityscalemathematik | b_out.sha |
| unityscalemathematik | u_out.f32 |
| unityscalemathematik | u_out.sha |
| veils | mix.f32 |
| veils | mix.sha |
| veils | out1.f32 |
| veils | out1.sha |
VRT — Visual Regression Tests
E2E — Playwright
Headless Chromium, real Web Audio (worklets and all), against the actual SvelteKit app. Boots a
Vite dev server (or vite preview when E2E_USE_PREVIEW=1). Lives under e2e/tests/; specs tagged @smoke double as the post-deploy live check
on autotest.
flox activate -- task e2e # full suite
flox activate -- task e2e:headed # with the browser visible
flox activate -- task ci:smoke:live # smoke vs autotest.patchtogether.live Specs (322)
4plexer.spec.ts4plexvid.spec.tsacidwarp-render-smoke.spec.tsadsr-poly-midilane.spec.tsadsr-vca-invert.spec.tsai-debug.spec.tsai-smoke.spec.tsanalog-logic-maths.spec.tsanalog-vco-fm-sync.spec.tsanalog-vco-hard-sync.spec.tsarchivist.spec.tsatlantis-catalyst.spec.tsattenumix.spec.tsaudio-controls.spec.tsaudio-gate.spec.tsaudio-in.spec.tsaudioctx-sample-rate.spec.tsaut-patch-panel.spec.tsauth-handshake.spec.tsauth-routes.spec.tsawareness.spec.tsb3ntb0x.spec.tsbackdraft-full-output.spec.tsbackdraft-render-smoke.spec.tsbackdraft.spec.tsbentbox.spec.tsblood-audio-output.spec.tsblood-ingame.spec.tsblood-keyboard.spec.tsblood-mount.spec.tsbluebox.spec.tsbridge-late-materialization.spec.tsbuggles.spec.tscable-drag-drilldown.spec.tscable-drag-panel-lock.spec.tscable-drag-section-expand.spec.tscable-z-order.spec.tscadillac-collab.spec.tscadillac.spec.tscamera-input.spec.tscapacity.spec.tscarl-rackspace.spec.tscellshade.spec.tschowkick.spec.tsclear-load-multiwindow.spec.tsclear-patch-undo.spec.tsclear.spec.tsclick-pickup-cable.spec.tsclipplayer-controls.spec.tsclipplayer-edit-launch.spec.tsclipplayer-songmode.spec.tsclipplayer.spec.tsclouds.spec.tscloudseed.spec.tscollab.spec.tscombinations.spec.tsconnection-validate-edge.spec.tscontrol-color.spec.tscontrol-surface.spec.tscoverage-group-1-sinks.spec.tscoverage-group-2-sources.spec.tscoverage-groups-3-4-5.spec.tscoverage-groups-6-7-8-9.spec.tscube.spec.tscv-range-uniformity.spec.tsdestructor-render-smoke.spec.tsdocs-virtual-module.spec.tsdocs.spec.tsdoom-aspect.spec.tsdoom-audio-output.spec.tsdoom-cheat-gates.spec.tsdoom-controls.spec.tsdoom-handles.spec.tsdoom-identity-crossview.spec.tsdoom-keyboard-routing.spec.tsdoom-late-join.spec.tsdoom-launch.spec.tsdoom-mp-latejoin-freeze.spec.tsdoom-mp-lockstep-sharedstate.spec.tsdoom-mp-probe.spec.tsdoom-mp-real.spec.tsdoom-multiplayer.spec.tsdoom-per-type-death-gates.spec.tsdoom-wasm.spec.tsdrumseqz.spec.tsduplicate-module.spec.tsdx7-syx-load.spec.tsdx7.spec.tsedges.spec.tselectra-control.spec.tsfader-midi-assign.spec.tsfader.spec.tsfeaturecv-source-chain.spec.tsfeedback.spec.tsflip-rack-rear-view.spec.tsfour-modules.spec.tsfoxy-freeze-locks-wavetable.spec.tsfoxy.spec.tsfreezeframe.spec.tsfrogger.spec.tsgamepad.spec.tsgibribbon.spec.tsgraphic-eq-render-smoke.spec.tsgroup-exposed-controls.spec.tsgrouping-phase1.spec.tsgrouping-phase2.spec.tsgrouping-phase3.spec.tshelm.spec.tshouse-style.spec.tshydrogen-cv-per-voice.spec.tshydrogen-kits.spec.tsillogic.spec.tsin-card-title.spec.tsinsert-on-cable.spec.tsinstrument-exposed-port-patching.spec.tsinstruments.spec.tsintegration.spec.tsinwards-render-smoke.spec.tsio-spec-consistency.spec.tsjoystick.spec.tskeyboard-nav.spec.tskickdrum.spec.tskria.spec.tslanding-links.spec.tslanding-routing.spec.tslasso-group.spec.tslaunchpad-clip-launch.spec.tslaunchpad-keys-record.spec.tslaunchpad-single-arm-row.spec.tslfo-modulation-visible.spec.tslines-render-smoke.spec.tslivecode.spec.tsload-example-dropdown.spec.tsload-patch.spec.tsloopback.spec.tsmacseq.spec.tsmandelbulb-render-smoke.spec.tsmandleblot-render-smoke.spec.tsmapper.spec.tsmappy-export-import.spec.tsmappy-output.spec.tsmatrixmix.spec.tsmeowbox.spec.tsmidi-autobind-perfzip.spec.tsmidi-cv-buddy.spec.tsmidi-lane.spec.tsmidi-learn-note.spec.tsmidi-learn.spec.tsmidi-out-buddy.spec.tsmidi.spec.tsmidiclock.spec.tsmike-rackspace.spec.tsmilkdrop-render-smoke.spec.tsmodtris.spec.tsmodulation.spec.tsmodule-annotate.spec.tsmodules.spec.tsmulti-output.spec.tsmulti-video-playback.spec.tsnested-module-menu.spec.tsnibbles-cv-scope.spec.tsnibbles-render-smoke.spec.tsnibbles.spec.tsnode-context-menu.spec.tsnoise.spec.tsnote-entry.spec.tsnumpad-plus.spec.tsonetonine.spec.tsorganize-modules.spec.tsoutlines-render-smoke.spec.tsoutlines.spec.tspainter.spec.tspalette.spec.tsparam-edit-undo.spec.tspatch-menu-redesign.spec.tspatch-menu-ux.spec.tspatch-panel-jack-indicator.spec.tspatch-panel-nested.spec.tspatch-panel.spec.tspatch-to-cascade.spec.tspeaks.spec.tspeakstate-render-smoke.spec.tspeertube.spec.tspentemelodica.spec.tsper-module-per-port-behavioral.spec.tsper-module-per-port.spec.tsper-module.spec.tsperf-tempo-under-modulation.spec.tspicturebox-asset-select.spec.tspicturebox-limits.spec.tspicturebox-sync.spec.tspoly-chord.spec.tspolyhelm-poly-chain.spec.tspolyseqz.spec.tspong.spec.tspresent-second-display.spec.tspreset-slots-and-sets.spec.tsqbert-cv-joystick.spec.tsqbert-rom-missing.spec.tsquadralogical-assign.spec.tsquadralogical.spec.tsrackspace-isolation.spec.tsrackspace-persistence.spec.tsrear-view-patching.spec.tsrecorderbox.spec.tsrender-worker-acidwarp.spec.tsrender-worker-toybox.spec.tsreshaper-shapedramps.spec.tsresofilter.spec.tsringback.spec.tsrings.spec.tsriotgirls.spec.tssample-hold.spec.tssamsloop-boundaries-roundtrip.spec.tssamsloop-download.spec.tssamsloop-memory-bench.spec.tssamsloop-persistence.spec.tssamsloop-record.spec.tssamsloop.spec.tssave-group-and-naming.spec.tssave-load.spec.tssaved-groups-wiring.spec.tsscaler-cv-passthrough.spec.tsscope-tuner.spec.tsscope-video-out.spec.tsscope-xy-intensity.spec.tsscore.spec.tsscoreboard.spec.tssequencer-clock-without-play.spec.tssequencer-clock.spec.tssequencer-pages.spec.tssequencer-playhead-alignment.spec.tssequencer-transport.spec.tsshapegen-clock.spec.tsshapegen.spec.tsshared-clock.spec.tsshared-rack-sync.spec.tssidecar.spec.tsskifree.spec.tsskin-persists-app-wide.spec.tsskins.spec.tsslider-drag.spec.tssnes9x-gameplay-gates.spec.tssnes9x.spec.tssnh-hold.spec.tssoak.spec.tsspawn-at-cursor.spec.tsspirographs-render-smoke.spec.tsstages.spec.tsstereo-autowire.spec.tssticky-note.spec.tsswolevco.spec.tssynesthesia-video-mode.spec.tstempest-render-smoke.spec.tstempo-stability.spec.tstextmarquee-render-smoke.spec.tstextmarquee.spec.tstheme-diner.spec.tstheme-lcars.spec.tstheme-matrixcowboy.spec.tstiler.spec.tstimelorde-auto-spawn.spec.tstimelorde-tap-tempo.spec.tstimelorde-video.spec.tstopbar-buttons.spec.tstoybox-combine-editor.spec.tstoybox-cv-section.spec.tstoybox-disk-loading.spec.tstoybox-feedback.spec.tstoybox-layer-input.spec.tstoybox-layer-selector.spec.tstoybox-new-content.spec.tstoybox-node-batch.spec.tstoybox-node-controls.spec.tstoybox-node-menu.spec.tstoybox-presets-io.spec.tstoybox-presets.spec.tstoybox-shadertoy.spec.tstoybox-video-inputs.spec.tstoybox-video-projection.spec.tstv-librarian-audio.spec.tstv-librarian.spec.tstwotracks-perfzip.spec.tstwotracks.spec.tsui-refresh.spec.tsvarispeed-multislot-persist.spec.tsvarispeed-panel-layout.spec.tsvco-pitch-tracking.spec.tsveils.spec.tsversion-heading.spec.tsvfpga-floorplan.spec.tsvfpga-p2-cells.spec.tsvfpga-p3-composite.spec.tsvfpga-p4-early-hd.spec.tsvfpga-patchpanel-presets.spec.tsvfpga-runner-render-smoke.spec.tsvfpga-runner.spec.tsvideo-aspect-switch.spec.tsvideo-audio-cvgate-coverage.spec.tsvideo-audio-output.spec.tsvideo-chain.spec.tsvideo-controls.spec.tsvideo-full-frame.spec.tsvideo-fullscreen-multimonitor.spec.tsvideo-fullscreen.spec.tsvideo-hide-controls.spec.tsvideo-orientation.spec.tsvideobox-output.spec.tsvideobox-performance-bundle.spec.tsvideobox-upload-perf.spec.tsvideovarispeed-output.spec.tsvideovarispeed-perfzip.spec.tsvideovarispeed-switch.spec.tsvoice-chain-art.spec.tsvoice-chain.spec.tswarps.spec.tswarrenspectrum.spec.tswavecel-video-outs.spec.tswavecel-viz.spec.tswaveform-trace-shape.spec.tswavesculpt.spec.tswriteseq.spec.ts
Chaos
Single-user randomized intent fuzzer. Drives the canvas through 200+ random patches / mutations; checks invariants between each. Multi-user invariants land post-Stage B.
flox activate -- task chaos:run CI shape
The full gate runs in .github/workflows/ci.yml inside Flox so the toolchain (Node
22, Faust 2.85.5, esbuild) matches local. Postgres 17 is a service container; the DB schema is
applied before task ci runs.