Skip to content

feat: OSC debugger in Advanced, a doctor probe that can actually fail, and BEYOND on 8000 - #110

Merged
pyramation merged 1 commit into
mainfrom
feat/osc-port-doctor-probe
Aug 19, 2026
Merged

feat: OSC debugger in Advanced, a doctor probe that can actually fail, and BEYOND on 8000#110
pyramation merged 1 commit into
mainfrom
feat/osc-port-doctor-probe

Conversation

@pyramation

Copy link
Copy Markdown
Contributor

Summary

Three things that came out of debugging the real BEYOND machine, where doctor reported OSC healthy while nothing was listening.

The doctor check was structurally unable to fail. It only asserted that a target was configured. It now probes it: a connected UDP socket sends a zero-length datagram and classifies the outcome, since UDP has no handshake and honest states are the most it can offer.

type UdpState = 'refused' | 'unreachable' | 'no-rejection';
// ECONNREFUSED/ECONNRESET → refused (fail: nothing is bound there)
// any other error          → unreachable (warn)
// short timer elapses      → no-rejection (pass, explicitly *not* proof of delivery)

no-rejection deliberately does not claim health — it says no refusal was observed. The timer is what keeps an unroutable show-network host from hanging doctor; udp-probe.test.ts asserts that directly.

BEYOND's default is 8000, not 7001. Screenshots of the venue's BEYOND.ini show [OSC] PortIn=8000, which is BEYOND's factory port; 7001 was our invention and cost real debugging time. DEFAULT_BEYOND_PORT/DEFAULT_FB4_PORT now live in @wavegrid/layout and everything (desktop target, projects osc, signals, receiver env, deploy generator, docs) reads them. Fixtures that use 7001 as an explicitly configured port stay as they are — only default-asserting ones moved.

Where BEYOND is installed locally, doctor now reads BEYOND.ini (override with WAVEGRID_BEYOND_INI) and reports whether its OSC server is on, which port it binds, whether we're aiming at that port, and whether ShowRGBAPanel=0 — the setting that makes white render as red. Unknown keys produce no check rather than a false negative, and the whole thing is skipped when BEYOND isn't present, so nothing assumes Windows paths on Linux/macOS.

Advanced → OSC is the operator-facing half, so a diagnosis over chat is "read me what the panel says": resolved target, probe verdict in plain words, BEYOND.ini findings with remedies, and a bounded tail of every message in and out (direction, address, args, peer). It sends too — blackout / full white / full amber on one zone or all fixtures, plus a free-form address with typed args (255, i:3, f:1.0, s:text) — always single one-shot messages through the existing encoders, never a show loop, and it can optionally listen locally to watch what arrives. All main-process IPC: no API key, no external service.

Presets reuse encodeBeyondMessages/encodeFB4Messages so the panel can't drift from what the receiver sends; OscMessage.value is number | number[], hence the normalize before typing each argument as a float.

Link to Devin session: https://app.devin.ai/sessions/ec43152136134467a853ec0bbf783ea9
Requested by: @pyramation

@pyramation pyramation self-assigned this Aug 19, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@pyramation
pyramation merged commit 791e7c9 into main Aug 19, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant