# Phase 12: SteamVR IPD Slider UI - Discussion Log

> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.

**Date:** 2026-03-28
**Phase:** 12-steamvr-ipd-slider-ui
**Areas discussed:** Slider activation strategy, Slider-to-rendering pipeline, Beyond 1 exclusion (HARD-04)

---

## Slider Activation Strategy

| Option | Description | Selected |
|--------|-------------|----------|
| Try Init-time + Bool=false first | Cheapest test: set IpdUIRange properties during Activate() and try DriverDisplaysIPDChanges=false | |
| Skip native slider, build overlay | Phase 10 proved native slider doesn't work from sidecar. Build custom SteamVR dashboard overlay | |
| Skip native slider, desktop tray app | Simple Windows tray app that talks to driver via named pipe | |
| Spike first, then decide | Phase 12 starts with a mini-spike, then pivots based on results | |
| Other (user) | Spike native slider at runtime (not Init), also explore component-based approaches like Phase 11.1 proximity. Fallback to SteamVR settings tab | ✓ |

**User's choice:** Spike Track B first (native slider is best UX), but set properties at runtime not Init (Phase 11.1 proved Init-time HMD container writes fail). Also explore component-based approaches analogous to proximity handle probing. If Track B fails, fall back to SteamVR Settings Tab using settingsschema.vrsettings.

**Notes:** User identified SteamVR settings tab UI kit as fallback — pointed to Shiftall driver example at `C:\Program Files (x86)\Steam\steamapps\common\Shiftall Controller Drivers\resources\`. Research confirmed vrlink driver has slider control with min/max/decimals/step.

### Sub-question: Fallback UI preference

| Option | Description | Selected |
|--------|-------------|----------|
| SteamVR dashboard overlay | Custom overlay visible in VR dashboard | |
| Desktop tray app | Simple Windows app with slider via named pipe | |
| Decide later based on spike | Don't lock in a fallback yet | |
| Other (user) | SteamVR settings tab with predefined UI kit elements | ✓ |

**User's choice:** SteamVR settings tab using settingsschema.vrsettings with slider control.

---

## Slider-to-Rendering Pipeline

| Option | Description | Selected |
|--------|-------------|----------|
| Auto-apply (Recommended) | Driver auto-calls SetDisplayEyeToHead when slider changes | ✓ |
| Require pipe command | Slider only stores value, user must send 'ipd <mm>' to apply | |

**User's choice:** Auto-apply

### Sub-question: Event scope

| Option | Description | Selected |
|--------|-------------|----------|
| Apply all IpdChanged events | Any source that changes IPD triggers rendering update | ✓ |
| Only our slider changes | Only react to changes we initiated | |
| All events with guard | Apply all with debounce/guard to prevent loops | |

**User's choice:** Apply all IpdChanged events. Named pipe stays open for Beyond Utility integration.

---

## Beyond 1 Exclusion (HARD-04)

| Option | Description | Selected |
|--------|-------------|----------|
| Skip slider setup entirely | If serial starts with 'BS1', no slider, no auto-apply, no IPD pipe command | ✓ |
| Skip slider but keep pipe | Don't show slider for B1, but keep ipd pipe command available | |
| Show slider with fixed range | Show slider locked to 64mm (min=max=0.064) | |

**User's choice:** Skip slider setup entirely for Beyond 1.

**Notes:** User corrected that the BS1/BS2 prefix is on the **HMD serial** (tag 0x08 in user flash), NOT the tracking/lighthouse serial (tag 0x09). HMD serial must be added to the parser — currently only tag 0x09 is parsed.

---

## Claude's Discretion

- Exact spike test methodology for Track B
- Settings tab slider formatting details
- Settings change polling structure

## Deferred Ideas

- IPD persistence across restarts — Phase 13
- `/input/system/click` handle probing — existing todo, not part of slider work
