# Requirements Archive: v2.0 Live IPD Change

**Archived:** 2026-04-06
**Status:** SHIPPED

For current requirements, see `.planning/REQUIREMENTS.md`.

---

# Requirements: Beyond 2 SteamVR Proximity Driver

**Defined:** 2026-03-23
**Core Value:** SteamVR and OpenVR applications can detect when the Beyond 2 is on or off the user's head, enabling automatic standby/wake and correct in-game presence detection.

## v2.0 Requirements

Requirements for live IPD change milestone. Each maps to roadmap phases.

### Feasibility

- [x] **FEAS-01**: Confirm SetFloatProperty(Prop_UserIpdMeters_Float) works from sidecar on HMD container
- [x] **FEAS-02**: Determine if lighthouse driver calls SetDisplayEyeToHead (which would block property-based IPD)
- [x] **FEAS-03**: Test whether setting IpdUIRange properties from sidecar triggers SteamVR IPD slider UI

### IPD Command

- [x] **IPD-01**: Driver accepts `ipd <mm>` command via named pipe and sets Prop_UserIpdMeters_Float on HMD container
- [x] **IPD-02**: Driver validates IPD value within Beyond physical range before applying
- [x] **IPD-03**: Driver responds with current IPD value via `ipd?` query command
- [x] **IPD-04**: `beyond_prox_ctl.exe` CLI supports `ipd <mm>` and `ipd?` commands
- [x] **IPD-05**: Status command includes current IPD value in response

### SteamVR Slider

- [x] **SLIDER-01**: SteamVR IPD slider UI appears in dashboard for Beyond HMD
- [x] **SLIDER-02**: Driver detects IPD slider changes via VREvent_IpdChanged
- [x] **SLIDER-03**: Slider-initiated IPD changes persist to headset lighthouse config (`default_mm` field) via lighthouse_console
- [x] **SLIDER-04**: Driver reads headset lighthouse serial from HID config data for lighthouse_console invocation

### Hardening

- [x] **HARD-01**: IPD value validated and clamped to Beyond physical range on all input paths
- [x] **HARD-02**: Driver reads initial IPD from HMD container on startup and tracks current value
- [x] **HARD-03**: Lighthouse_console persistence failures are logged but do not block live IPD change
- [x] **HARD-04**: SteamVR IPD slider only enabled when HMD serial does not start with 'BS1' (Beyond 1 has fixed IPD)

## Future Requirements

### Bidirectional Sync

- **SYNC-01**: Pipe notification when IPD changes from any source (slider, pipe, external)
- **SYNC-02**: Beyond Utility receives IPD change events from driver

## Out of Scope

| Feature | Reason |
|---------|--------|
| Physical IPD motor control | Beyond 2 has software-adjustable IPD only, no physical mechanism |
| IPD persistence via VRSettings | Headset lighthouse config is the authoritative source; VRSettings is not used |
| Pipe-command-triggered persistence | Beyond Utility handles its own persistence; only slider-triggered changes persist from driver |
| Eye tracking IPD correlation | Separate concern, separate driver component |
| Per-eye IPD (asymmetric) | SteamVR uses single symmetric IPD value |

## Traceability

| Requirement | Phase | Status |
|-------------|-------|--------|
| FEAS-01 | Phase 10 | Complete |
| FEAS-02 | Phase 10 | Complete |
| FEAS-03 | Phase 10 | Complete |
| IPD-01 | Phase 11 | Complete |
| IPD-02 | Phase 11 | Complete |
| IPD-03 | Phase 11 | Complete |
| IPD-04 | Phase 11 | Complete |
| IPD-05 | Phase 11 | Complete |
| SLIDER-01 | Phase 12 | Complete |
| SLIDER-02 | Phase 12 | Complete |
| SLIDER-03 | Phase 13 | Complete |
| SLIDER-04 | Phase 13 | Complete |
| HARD-01 | Phase 11 | Complete |
| HARD-02 | Phase 11 | Complete |
| HARD-03 | Phase 13 | Complete |
| HARD-04 | Phase 12 | Complete |

**Coverage:**
- v2.0 requirements: 16 total
- Mapped to phases: 16
- Unmapped: 0

---
*Requirements defined: 2026-03-23*
*Last updated: 2026-03-23 after roadmap creation*
