17 KiB
C6b SteamVR Settings: evidence log
Package card: docs/phase2/PLAN.md §2.4 "C6b SteamVR Settings". Concept: docs/phase2/concepts/settings.md (SET)
§4.10, §4.12, §9.5; CTL §13, §19.2. Steam build 11094443. Surface vr:systemui (frame page system.settings).
Status
M2 and M3 reached (2026-10-07, session 1, 10:50-12:55; the only C6b session). Steam build 11094443.
- T1 (live, unflagged):
theme/vr/30-settings.cssrewritten (draft identical intheme/_wip/vr-30-settings.css,check-themePASS, synced): Steam's footprint (1858 × 952 glass, r 78, on.SettingsSidebarPageContainer), the scrolling 576 px sidebar (104 / 115 rows, .18 pill + lobe), "SteamVR" title, platter rows (115, 35 px labels, 32 px descriptions), 86 / 121 refresh circles, 92 px sliders, title-case 86 px capsules, purple advanced dot, thick-glass popovers with the leading check slot, the modal fit rule, the Advanced Settings ornament straddling the glass bottom. Shared.SettingsMainlooks (also Now Playing's modals) kept and made gate-clean. - T2 (flag
wp.c6b):device/vr/systemui.settings.js: Back circle (SwitchToPageto Steam), icon circles, section hero, Off/On → switches (knob = SteamVR's own sliding pill), ARIAtab/switch,E-SWITCHexemption.remove()takes everything away (checked: 0 attributes, no node after removal). - Evidence: gates on
vr:systemui(General, laser with T2; pad and laser T1): AUD, TYPE, MOTION PASS; SIZE and OUTLINE fail only on C1a's elements (REQ C6b->C1a). P-S5, T-VR-EXIT, T-VR-SW (live, read only), P-S6, T-VR-FOOT (DOM) PASS.pad-bfs: not applicable (laser-only SteamVR page; its gamepad path is T-VR-EXIT). - Native: no fragment possible (SteamVR pages are not reporter surfaces). Native check run (P7 M3):
hvlook shows a stale dark cover over the SteamVR panel in native mode (REQ C6b->P8);sgcheck /settings/lgsvr: only legacy R2. - Not built (fallbacks documented): inline title (D6); mockup re-renders (expedited).
- Device left: theme on, CSS only (native off after the session), Steam's page active, SteamVR settings on
General, RAM test script removed (
/tmp/lgs/vr-scripts/empty), no flags of C6b's left.
READY: wp.c6b (evidence: Evidence rows "laser, T2 present" 12:28, P-S5 12:33, T-VR-EXIT 12:12, T-VR-SW 11:52; no
GONE / HIDDEN / UNCLICKABLE on SteamVR's page; page-script status err: null; the remaining gate failures are C1a's).
Caveat for V1: a flag flip during a session is picked up late by the daemon (REQ C6b->P8); with defaults.json the
script loads at unit start.
M0 note: SET conformed to PLAN §1 (expedited: no mockup re-render)
| # | SET / CTL says | PLAN §1 / gate says | Built |
|---|---|---|---|
| D1 | Sidebar selection white .26 + specular top arc | §1.4: navigation selected = --lgs-fill-nav (.18) + arc + Semibold; VP P-42 no full-width line |
.18 pill + a lobe at 30 % of the width (C6a's D4/D5) + Semibold; hover = the spot only (§1.4 navigation rows) |
| D2 | Refresh Rate: 104 px circles at a 116 pitch (SET §4.10) | CTL §13 / §19.2 V1 (C4a's vocabulary, REQ C4a->C6b): 86 at a 121 pitch | 86 at 121 (35 px gap), under the label |
| D3 | Off/On switch: SteamVR's sliding ::after pill at opacity 0, knob = the unselected option's ::after |
§1.5 one motion system (a knob that jumps between two elements has no motion) | The knob is SteamVR's own sliding pill (transform untouched, 38 px box so its translateX(100% × index) moves it 38 px; drawn 50 px round). The click method is SET's (selected option inert and hidden, unselected stretched over the track, hit 128 × 114) |
| D4 | Bottom fade of 104 px on the scrolling sidebar | A mask-image on the sidebar would also mask the ornament (it is a DOM descendant) |
No fade; the list ends at the glass edge, 48 px end padding |
| D5 | Window E4/E5 dark edge (DESIGN2) | C5b's live finding: on a transparent SteamVR overlay the inset black shadow reads as a bright band | Lobe only (C5b's recipe), no inset edge |
| D6 | Inline title when the hero scrolls away | Needs a scroll-linked T2 (no budget in this expedited session) | Not built (fallback: the selected sidebar row names the section) |
| D7 | Hero 81 px circle + 55 px title on two lines | C6a's compact hero (§1.7 rule 5, one row) | 87 px circle + Title 1 (55 px Bold) in one centred row |
| D8 | Depth (T5 systemui window cover) | §1.7; SteamVR pages are not reporter surfaces (reporter.md §3: surfaces are Steam windows; C5b-D3 same finding) | No layer, plate or popup fragment: none can address vr:systemui. Depth stays SteamVR's own (flat panel) |
Observation for the coordinator
SteamVR's Display Brightness read 40 % (the slider at its origin, --slider-value 0) at 11:52, 12:21 and 12:29,
and 120 % in the 12:33 shot. C6b dispatched no input on any SteamVR control: its steps only switch the frame page
(SwitchToPage), click sidebar section rows (navigation), click C6b's own Back node, and read (elementFromPoint,
computed styles, captures). Between 12:29 and 12:33 C6b ran only a native-session (a page switch, an hv grab,
sgcheck). Either the value is live (adaptive) or another step changed it; worth a check against the action logs.
Native (PLAN §1.6, §1.7)
No fragment: SteamVR's settings page is drawn by vr:systemui, which the reporter does not report (its surfaces are
Steam's windows and popups, theme/layers/00-base.json); the window cover, plates and pops cannot address it. The
CSS-only glass above is what native mode shows here too.
Requests
-
REQ C6b->P8: a flagged page script is not (re)installed after a flag flip.
python glass.py js "…" --in vr:systemui --flags wp.c6b(flags.json written for the step, 12:13 and 12:14, CSS-only unit) waited 30 s with nowindow.__LGS_VRX.settingsandstatus.shell.vrScripts{}; the journal showspage script settings installedonly at 12:11:50, the second a frame page change (valve.steam.gamepadui.main -> system.settings) happened. So lab steps with--flags wp.<id>onvr:surfaces mostly run without the page script. A default-on flag (defaults.json, V1) is read at unit start, so production is not affected; C6b's evidence below used a RAM test copy in/tmp/lgs/vr-scripts/(contract §6), removed after each run.- P8 (2026-10-07 14:06 EDT, maintenance session 4): done. Cause: the daemon's SteamVR page theming was
paused (
/tmp/lgs/vr-theme-paused), and while paused it injects no page script (hencevrScripts {}). The lab's--theme offon avr:page (alsogates/audit's stock snapshot) writes that pause, and its--theme on(lgs_vr.apply_once()) never removed it, so after anygates vr:systemuiwith AUD the pause stayed until the nextlgs onor daemon start (a native session's start removes it). Your 12:11:50 install came one poll after your step wrote the flags; from then until 12:31 the journal has no page-script line at all, not even the removal when your step's flag went, which is what a paused daemon looks like. Seen again live 13:11:paused: true,vrScripts {}, a 24 s--flags wp.c6bstep never got__LGS_VRX.settings. Fixed indevice/lgs_vr.py(apply_once()ends the pause) anddevice/lgs_shell.py(a pause older than 300 s is stale and removed; each page-script pass reads the flags files itself). Live after the fix:js … --in vr:systemui --flags wp.c6bfound__LGS_VRX.settingsat its first sample (installed 14:06:13, removed 14:06:14 when the step's flag went);gates vr:systemui --only aud14:06:32 paused and resumed page theming 2 s later (journal), no pause file left. A step should still wait forwindow.__LGS_VRX.settings(≤ 1.5 s after the flag flips). contracts/daemon.md §6.
- P8 (2026-10-07 14:06 EDT, maintenance session 4): done. Cause: the daemon's SteamVR page theming was
paused (
-
REQ C6b->C1a: two
gates vr:systemuifindings intheme/vr/10-systemui.css(C1a's), seen on every C6b run: OUTLINE P-42 "closed rim of 3 shadow lines" on%{ControllerStatusRoot} %{LargeStatusArea}::before(rects 278,1571 and 535,1571, 220 × 54:inset 0 1.5pxwhite .42 +inset 1px 1px+inset -1px …), and SIZE P-08 on the frame-controlButtonControl WithIcon LargeIconat (139, 1256) 107 × 107 ("hit 100% own, 0% other … over 107x106": the failing part is not the hit; perhaps the 0.48 circle rule).- C1a answer (2026-10-07, R2 fix pass, session 6): done. (1) OUTLINE: the controller card (and every other C1a panel in
vr/10-systemui.css) is now P4's panel glass with the E4/E5 dark edge and the lit top lip, no closed rim; More Options is thick glass with light-only rows and focus (no ring, no 1 px separators). (2) SIZE: the frame-control circles keep their 107 × 107 hit and 80 px visible circles; the finding did not reproduce.gates vr:systemui --flags wp.c1a --mode pad|laser(17:49): all five gates PASS (SIZE4 controls checked, 0 fails); with C3a's static zoo of the on-demand panels (More Options, the pills, the tooltip, section 5) SIZE, TYPE, OUTLINE and AUD PASS too.
- C1a answer (2026-10-07, R2 fix pass, session 6): done. (1) OUTLINE: the controller card (and every other C1a panel in
-
REQ C6b->P8: in native mode, with the dashboard frame on SteamVR's settings page (
system.settings, your journal logssystemui: frame page valve.steam.gamepadui.main -> system.settings), thehvframe of 12:31 shows a dark glass rectangle over the left ~72 % of SteamVR's panel, top-left aligned with it, the right column outside it on the panel's own (lighter) CSS glass. It looks like the main surface's cover (glassd) is still drawn although Steam's page is not shown. Please hide main's cover, base and pops (visible: false) while the frame's active page is not Steam's, as for any hidden surface. (If it is not the cover, the SteamVR panel is physically wider than Steam's window, which also matters to SET T-VR-FOOT; C6b's CSS draws one uniform glass over the whole panel.)- P8 (2026-10-07 13:45 EDT, maintenance session 4): done as asked. While the daemon's
page.steamis false (the frame showssystem.settingsor the binding UI), main stays inglassd.jsonwith nothing to draw (its quad stays masked out of the room map) and is left out of the scene-graph spec (no cover, base, pop or slab;lgs-nativecomes off main); back on Steam's page its plates and slabs materialize again.status.mainAway. Live (native session 13:45, Home windowless,FrameStoreswitched tosystem.settingsfor 13 s fromvr:systemui):mainAwaytrue and main empty inglassd.jsonfrom 13:45:51 to 13:45:59 (the reporter had already dropped main at 13:45:48 here, Steam's document going hidden); thehv --lookof the settings page showed SteamVR's panel with no dark rectangle; back at 13:46:01, Home's 18 plates and the card slab returned by 13:46:04. contracts/daemon.md §4.2.
- P8 (2026-10-07 13:45 EDT, maintenance session 4): done as asked. While the daemon's
Requests to C6b, handled
- REQ C4a->C6b: (1)
settings-steamvr.htmlre-render: not done (expedited, no mockup re-renders); (2) 86 / 121 refresh circles: built (D2), measured in T-VR below; (3) SteamVR popovers: the current value is checked in the leading slot (a 34 px check at x 38, every row reserves the slot), no fill.
Evidence
| Test | Date | Command | Result | Artifacts |
|---|---|---|---|---|
| P-S6 free pseudos | 2026-10-07 10:58 | probe in vr:systemui (page shown under the Steam lab lock) |
PASS: .SettingsMainPanel::before/::after, .SegmentedControlGroupOption::after, .SettingsSidebarPageContainer::before are none in SteamVR's CSS (the group's own ::before/::after and the option's :not(:first-child)::before are SteamVR's: restyled, transforms untouched) |
— |
| SET T-VR-FOOT (DOM part) | 2026-10-07 11:52 | probe3 (scratch c6b/probe3.js) |
PASS (DOM): panel box [2,156,1858,1045] unchanged (its quad); glass = .SettingsSidebarPageContainer 1858 × 952, r 78.3 = 91.1 % of the panel height, Steam's 656 / 720 = 91.1 %; ornament [498,1066,865,121] centred (x 930), straddling the glass by 41. The hvgrab half: see the native row (the SteamVR panel looks physically wider than Steam's window cover) |
— |
| SET T-VR-SW (live, read only) | 2026-10-07 11:52 | probe3: elementFromPoint at 9 points (5/50/95 % × 10/50/90 %) of a live [data-lgs-switch] group (On) |
PASS 9/9 on the unselected option (Off, hit box 128 × 114 at [1619,718]); the selected option opacity 0 / pointer-events: none; knob = SteamVR's pill, 38 px box, translateX(38px) when On. Nothing was clicked |
— |
| SET T-VR-EXIT | 2026-10-07 12:12 | scratch c6b/p4a.js in vr:systemui (page shown): frame.inputFocus.FocusLeftFrameMenu(); then a lock-free read of .gpfocus in every Steam popup; then FocusApplicationRoot() |
PASS: .gpfocus in valve.steam.gamepadui.frame.menu… on the VR Settings item: the gamepad path out of SteamVR's page (D-pad Left → tab bar) works with the theme |
— |
G-AUD/SIZE/TYPE/OUTLINE/MOTION, vr:systemui General, laser, T2 present |
2026-10-07 12:28 | gates vr:systemui --mode laser --pre <settings_open, hold 70 s> --json, T2 from a RAM copy in /tmp/lgs/vr-scripts/ (REQ C6b->P8) |
AUD PASS, TYPE PASS (22), MOTION PASS, SIZE: 12 checked, 3 switches E-SWITCH pass ("hit 100% own over 86 x 80"); the only failures are C1a's (frame-control P-08, ControllerStatus P-42 rims: REQ C6b->C1a) | scratch c6b/g4_laser.json |
| same, pad (T1 only: the page script was stripped by the AUD theme toggle and not back yet) | 2026-10-07 12:29 | gates vr:systemui --mode pad … |
AUD PASS, TYPE PASS (32), MOTION PASS; SIZE / OUTLINE only C1a's findings | scratch c6b/g4_pad.json |
| same, Play Area (T1) | 2026-10-07 12:21 | gates vr:systemui --mode pad (SteamVR had stayed on Play Area) |
AUD 2 SHRUNK (AuroraPalette button 499 × 265 → 499 × 221; "Speed" label 567 × 36 → 351 × 45): fixed (column 1180 = 813 main px like C6a's 816, stock right column 500, the colour button keeps its own padding) | scratch c6b/g3_pad.json |
| Play Area re-measure after the fix | 2026-10-07 12:50 | scratch c6b/probe_play.js (page shown, Play Area row clicked, General clicked again, back to Steam) |
PASS: "Speed" 437 × 45 (area 0.96 of stock, AUD's floor 0.85), AuroraPalette 499 × 265 = stock. (A full gates re-run on Play Area at 12:42 did not get the page: another agent's step switched the frame back, now=5) |
— |
| G-AUD/SIZE/TYPE/OUTLINE/MOTION, General, laser (T1, after all fixes) | 2026-10-07 12:44 | gates vr:systemui --mode laser --pre <settings_open 70 s> --json |
AUD PASS, TYPE PASS, MOTION PASS; SIZE / OUTLINE: only C1a's findings | scratch c6b/g7_gen.json |
| SET P-S5 (Back circle) | 2026-10-07 12:33 | scratch c6b/ps5b.js in vr:systemui (T2 from the RAM copy): show SteamVR's page, wait for .lgs-c6b-back, elementFromPoint at its centre, dispatch a click there (as the laser's mouse event arrives) |
PASS: Back [22,176,116,116] (panel (20, 20), the 86 px disc inside), the centre hits it, aria-label "Back" (SteamVR's #back); active page 1 (system.settings) → 5 (Steam). Same step: hero data-lgs-title "General" / data-lgs-sec general, 8 role=tab rows, 5 role=switch groups |
— |
Look vs SET §4.10 / p2_settings_steamvr.png (by eye) |
2026-10-07 12:33 | shot vr:systemui p2_c6b_general_t2c (T2), p2_c6b_video_t2b, p2_c6b_playarea_t2 (T1) composited over a grey room |
Footprint, Back + "SteamVR" at Steam's title place, sidebar icon circles and the .18 selected pill, compact hero, platter rows with 3 px separators, 86 px refresh circles at 121, 92 px slider with the value on the knob, green switches, the Advanced ornament straddling the glass bottom: as the concept. T1 alone (flag off): the same without Back, icons, hero and switches (Off/On stay segmented) | shots/p2_c6b_*_t2*.png |
G-PAD (pad-bfs) |
— | not applicable | SteamVR's page has no Steam route and no gamepad focus of its own (SET §4.10: laser only); its gamepad path is T-VR-EXIT above (D-pad Left → tab bar). The Steam-side way in (/settings/lgsvr) is C6a's route |
— |
| Native check (P7 M3) | 2026-10-07 12:29-12:31 | native-session --flags wp.c6b --step "hv c6b_native --surface vr:systemui --pre <settings_open 9 s> --look" --step "sgcheck --route /settings/lgsvr" |
hv frame viewed, then deleted on both machines: SteamVR's page with T2 (Back, icons, hero, switches), but a dark rectangle covers the left ~72 % of the panel while the right column (the switches) sits on the panel's lighter glass: most likely glassd's cover of Steam's main window still drawn while the frame shows system.settings (REQ C6b->P8). sgcheck on /settings/lgsvr (the Steam-side way in): only R2 on the legacy hdr-back (5.54 mm) and footer (4.43 mm) pops, not C6b's. Back to CSS only: yes |
— (frame deleted) |
Log
2026-10-07 session 1 (10:50 onward), build 11094443
- Read card, SET §4.10/§4.12/§9.5, CTL §13/§19.2, PLAN §1.3-§1.7, tokens §1/§5, reporter §3, daemon §6.
- Live DOM probes (Steam lab lock held by a sleeping
jsstep, thenjs --in vr:systemui): panel 1858 × 1045, sidebar 416 wide, 8 rows of 74, page container 1442 wide with 100 px padding; free pseudos (P-S6):.SettingsMainPanel::before/::after,.SegmentedControlGroupOption::after,.SettingsSidebarPageContainer::beforearenone; the page container scrolls natively (React propsonScroll, noonWheel), so the sidebar'soverflow-y: autois scrolled by the same CEF wheel events; localisation tokens#settings_togglebutton_off/_on,#settings_sectiontitle_*; Chromium 126 (:has()supported).