Pulse Integration Contracts

PASS 14 PARTIAL 3 UNVERIFIED 7 FAIL 0

← Cockpit

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 chainStatusNoteAnchor
Source → Layer → FX → ProjectorPASSsources/+page.svelte:assignToLayer → setLayerClip → PulseProjector.findClip; transform/color/distort/mathFx all consumed.src/routes/berlin-pulse/sources/+page.svelte
Demo sample → Player → AnalyserPASSHEAD 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 paramsPASSOutput 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 parameterPASSProfile resolver in midi.ts → applyParam; cockpit subscribes to onCueRequest/onRandomLayerRequest/onTransportRequest/onMasterBrightnessRequest.src/lib/pulse/midi.ts
Cockpit transform/color/distort → projector stylePASSEach layer.transform/color/distort/mathFx renders as inline CSS transform + filter + tint overlay in PulseProjector.src/lib/components/pulse/PulseProjector.svelte
Background color/gradient → projectorPASSstate.background → CSS variable on .projector root; cockpit panel offers color/gradient/transparent modes + random.src/lib/components/pulse/PulseProjector.svelte
Remote (BC) → cockpitPASSBroadcastChannel "wozu-pulse" — remote publishes param/clip/pulse/blackout; cockpit subscriber matches types.src/routes/berlin-pulse/remote/+page.svelte
Multi-projector popupPASSwindow.open + localStorage hydration share pulseStore between cockpit + projector windows.src/lib/pulse/pulseStore.ts
Stage device → light mapping targetPASStargetRegistry.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 firingPASScueSchedule.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 → UIPASSdeviceStateStore 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)UNVERIFIEDProfile resolver + auto-bind + override flow tested in code paths. Real controller not connected this session.src/lib/pulse/midi/profiles/index.ts
LIFX hardwareUNVERIFIEDUDP adapter with GetLabel/GetPower/LightGet exists in pulse-bridge. No live LIFX bulb verified this session.tools/pulse-bridge/adapters/lifx.mjs
WLED hardwareUNVERIFIEDHTTP /json adapter. No live WLED node verified this session.tools/pulse-bridge/adapters/wled.mjs
Camera inputUNVERIFIEDenumerateDevices picker + getUserMedia path implemented; live camera flow not verified this session.src/lib/components/pulse/PulseCockpit.svelte
Mobile portrait (iPhone real device)UNVERIFIEDCSS @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)UNVERIFIEDCSS @media (max-width:1100 + orientation:landscape) splits preview-left / controls-right. No on-device test this session.
Long-session memory / RAF leakUNVERIFIEDCleanup paths present (cancelAnimationFrame, removeUserClip stops tracks, onDestroy unsubs). No multi-hour profile run.
Art-Net DMX outputPASStools/pulse-bridge/adapters/artnet.mjs ships standard ArtDmx send. See docs/PULSE_ART_NET.md.tools/pulse-bridge/adapters/artnet.mjs
USB DMX foundationPARTIALtools/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 discoveryPARTIALSimulator 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)PASSautoPatch.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 probePASSbridge.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 firmwarePARTIALReference sketch + hideakitai/ArtNet pointer documented in docs/PULSE_ART_NET.md. No first-party firmware shipped yet.docs/PULSE_ART_NET.md