Every prompt used to start PowerShell and load System.Speech (~1.5 s idle, longer with VRChat and
SteamVR running), so prompts lagged their beeps, overlapped and were hard to hear. Start the engine once
during the lead-in and hand each prompt to it (7-10 ms); a new prompt cancels one still speaking.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A deadband of 0.5 (rejected by the module) made analyze divide by zero. Check deadband and
assistClosed with the module's limits up front, speak a clear error and change nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ModuleConfig.Validate: maxFloor + minRange <= 1, minCeil > 0; LidCal clamp bound can no longer exceed 1
- ReloadConfig: record the timestamp only after a successful load so a temporarily locked file is retried
- tune.py analyze: map with lid.deadband / wink.assistClosed from the installed config; STEAMFRAME_CONFIG override
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- tune.py: reject reversed/flat per-eye ranges and keep the previous config; recommend wink assist;
readiness check before recording; skip malformed trace lines
- module: invalid steamframe-config.json is not applied (last good config kept, configError reported);
neutral eyes when no source is fresh; trace written with invariant culture
- setup: sandbox mode leaves real SteamVR settings and firewall alone; block rules handled separately;
headset target only counts connected adapters
- headset-setup.sh: build a pinned, reviewed frameeyeosc revision and move existing checkouts to it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- module: works if only one of UDP 9015/9020 can be opened; logs state changes only (capped);
trace is opt-in; writes a status file; reports when another module owns eye tracking
- scripts/setup.ps1: idempotent installer with dry run, uninstall and optional headset setup
- scripts/doctor.ps1: health check with a spoken summary
- Start Here.cmd menu; tune.py calibrate (spoken, one step); package.ps1 release zip
- README: quick start and troubleshooting first
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- blink.saturatedRaw: a closed lid with the other pinned at its ceiling is a blink, however long
- wink.assist: show the other eye open when it stays above its floor while one eye is closed
- tune.py analyze understands the ceiling signature and caps holdMs
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>