Pulse Integration Contracts
PASS 14 PARTIAL 3 UNVERIFIED 7 FAIL 0
PASS — wired in code and verifiable via /berlin-pulse routes. PARTIAL — pieces exist but no value flows end-to-end yet. UNVERIFIED — code path exists, real hardware / real device test not performed this session. FAIL — not implemented.
| Contract chain | Status | Note | Anchor |
|---|---|---|---|
| Source → Layer → FX → Projector | PASS | sources/+page.svelte:assignToLayer → setLayerClip → PulseProjector.findClip; transform/color/distort/mathFx all consumed. | src/routes/berlin-pulse/sources/+page.svelte |
| Demo sample → Player → Analyser | PASS | HEAD probe per card surfaces missing files as MISSING badges before play; Dre 2 sample pack shipped. | src/routes/berlin-pulse/audio/+page.svelte |
| Graph runtime → pulseStore params | PASS | Output bindings panel on /graph: pick (node, port) → param, runtime tick writes via applyParam. "Apply to Layer A/B/C" quick buttons. | src/routes/berlin-pulse/graph/+page.svelte |
| MIDI message → cockpit parameter | PASS | Profile resolver in midi.ts → applyParam; cockpit subscribes to onCueRequest/onRandomLayerRequest/onTransportRequest/onMasterBrightnessRequest. | src/lib/pulse/midi.ts |
| Cockpit transform/color/distort → projector style | PASS | Each layer.transform/color/distort/mathFx renders as inline CSS transform + filter + tint overlay in PulseProjector. | src/lib/components/pulse/PulseProjector.svelte |
| Background color/gradient → projector | PASS | state.background → CSS variable on .projector root; cockpit panel offers color/gradient/transparent modes + random. | src/lib/components/pulse/PulseProjector.svelte |
| Remote (BC) → cockpit | PASS | BroadcastChannel "wozu-pulse" — remote publishes param/clip/pulse/blackout; cockpit subscriber matches types. | src/routes/berlin-pulse/remote/+page.svelte |
| Multi-projector popup | PASS | window.open + localStorage hydration share pulseStore between cockpit + projector windows. | src/lib/pulse/pulseStore.ts |
| Stage device → light mapping target | PASS | targetRegistry.ts resolves stage device ids to bridge device ids. bridgeClient.sendLight tolerates stage/bridge/target ids transparently. Orphan links flagged. | src/lib/pulse/targetRegistry.ts |
| Timecode → automated cue firing | PASS | cueSchedule.ts watches pulseClock and fires cues on beat/bar/ms crossings. Loop-safe, clock-reset-safe, persisted to LS. Cockpit Transport panel ships add/edit/remove UI. | src/lib/pulse/cueSchedule.ts |
| device.state feedback → UI | PASS | deviceStateStore ingests every bridge `device.state` envelope. /berlin-pulse/devices liveStateFor merges it with the LIFX/WLED-specific readouts already there. | src/lib/pulse/deviceStateStore.ts |
| MIDI hardware (11 profiles) | UNVERIFIED | Profile resolver + auto-bind + override flow tested in code paths. Real controller not connected this session. | src/lib/pulse/midi/profiles/index.ts |
| LIFX hardware | UNVERIFIED | UDP adapter with GetLabel/GetPower/LightGet exists in pulse-bridge. No live LIFX bulb verified this session. | tools/pulse-bridge/adapters/lifx.mjs |
| WLED hardware | UNVERIFIED | HTTP /json adapter. No live WLED node verified this session. | tools/pulse-bridge/adapters/wled.mjs |
| Camera input | UNVERIFIED | enumerateDevices picker + getUserMedia path implemented; live camera flow not verified this session. | src/lib/components/pulse/PulseCockpit.svelte |
| Mobile portrait (iPhone real device) | UNVERIFIED | CSS @media rules updated (preview-first, sticky subnav, hamburger drawer, perf mode). No on-device test this session. | src/lib/components/pulse/PulseCockpit.svelte |
| Mobile landscape (real device) | UNVERIFIED | CSS @media (max-width:1100 + orientation:landscape) splits preview-left / controls-right. No on-device test this session. | — |
| Long-session memory / RAF leak | UNVERIFIED | Cleanup paths present (cancelAnimationFrame, removeUserClip stops tracks, onDestroy unsubs). No multi-hour profile run. | — |
| Art-Net DMX output | PASS | tools/pulse-bridge/adapters/artnet.mjs ships standard ArtDmx send. See docs/PULSE_ART_NET.md. | tools/pulse-bridge/adapters/artnet.mjs |
| USB DMX foundation | PARTIAL | tools/pulse-bridge/src/usbDmx/ ships list/connect/send/blackout via optional serialport. Bridge.status.usbDmx reports {supported,connected,activePath}. Real timing-accurate driver + Enttec/DMXking protocol layers deferred. | tools/pulse-bridge/src/usbDmx/ |
| RDM device discovery | PARTIAL | Simulator only. Real hardware needs RDM-capable USB interface (Enttec DMX USB Pro, DMXking RDM Pro). | tools/pulse-bridge/src/rdm/ |
| Auto-patch (DMX address conflicts) | PASS | autoPatch.ts ships deterministic conflict resolver. /patch shows changelog preview + Apply button that fires rdm.setAddress for every move. Works against simulator today; same code path will drive real hardware when USB DMX driver lands. | src/lib/pulse/autoPatch.ts |
| Bridge capability probe | PASS | bridge.status returns udp/serial/rdm/displayDetection/artnet/sacn/webMidi flags. Surfaced on /berlin-pulse/patch. | tools/pulse-bridge/src/nativeIoCapabilities.mjs |
| ESP32 Art-Net receiver firmware | PARTIAL | Reference sketch + hideakitai/ArtNet pointer documented in docs/PULSE_ART_NET.md. No first-party firmware shipped yet. | docs/PULSE_ART_NET.md |