17 KiB
C3b Control Center: evidence log
Package card: PLAN §2.4 "C3b Control Center". Concept: docs/phase2/concepts/control-center.md (CC). Mockups: every
docs/phase2/mockups/control-center-* file except -bar.html and -hud.html (C3a), plus control-center.css,
control-center-build.js, control-center-icons.js. Audit script: docs/phase2/concepts/control-center-mockaudit.py.
Status
READY: wp.c3b (2026-10-07, session 2, expedited single session; Steam build 11094443). Milestone M3 for CC-M and the pill patch; T1 CC-C deltas live; native plates declared (M4 code), native check skipped.
- Built:
theme/31-cc.css(A: page-layer fade, window tint off and white pill while CC-M is open; B: the CC-M view; C: CC-C, Steam's Quick Access popup, Phase 2 deltas),device/rt/31-cc.js(modulecc, flagwp.c3b, depsreact),theme/layers/31-cc.json(no pops: tiles and close circle are plates),capabilities/cc-focus.md(CS10 not run, so CC-A is not shipped). - What the user gets with
wp.c3bon: the status pill (laser click or A) opens Control Center inside Steam's window while that window is the shown page; otherwise Steam's Quick Access opens as before. ≡ on the pill always opens Steam's Quick Access. Three tiles (Now, Controls, Room) and a close circle replace the window; Steam's page fades out underneath (opacity only) and comes back exactly as it was. Every Quick Access function stays reachable: More Controls renders Steam's own five Quick Access panels (Notifications, Quick Settings, Performance, Battery Info, Help) inside CC, and the notification list is Steam's own panel in the Now tile. - Bindings (CC §4.10), all Steam's own handlers, found by reading Steam's modules: Wi-Fi, Bluetooth, Motion
Smoothing = the
checked/onChangeof the element Steam's Quick Access toggle component returns; Airplane Mode = Steam's hook andSetAirplaneMode; Volume, Microphone, Display and Environment brightness = Steam's slider components themselves (C4a's capsule look); Room View, Recenter, Playspace menu = the bar's SteamVR dashboard actions through the bar's own hook (fnInvokeAction), found by the bar's structure, not ids (live ids are 74000NN, not CC's 4328000NN); Return to Game =DashboardTabClickedof the first non-Steam bar tab; Power =SteamUIStore.OpenPowerMenu; Settings =actions.navigate. Every side effect runs throughact(): executed only in P2's live actions mode (flagactionsLive, trusted event), else logged (rt.use('cc').log()), plus a test spy. - Native: tiles are
data-lgs-plate="panel"(cc-now,cc-controls,cc-room), the close circledata-lgs-plate="liquid"(cc-close); with C1a's shell runtime on,shell.glassMode('*')makes mainwindowlesswhile CC-M is open. During another agent's native session the reporter acknowledged the plates (the CDP shot showed the tiles' DOM fill dropped,05-native.css). native check skipped: P7 not ready (P7.md reports M1). - Device left: theme on, CSS only (the native session seen in some steps was another agent's), module
ccoff (flag off), nodata-lgs-cc*attributes or.lgs-ccnodes in any window,c3b.pillpatch gone (react.status().patches= []), no menus open. - Known issues (not blocking READY): see "Known issues" below.
- R2 fix pass 1 (2026-10-07 20:3x): review M1 fixed (see "R2 fix pass 1" under Evidence).
31-cc.css: the top toggle row's focus glow keeps P4's spread and alpha with a 12 px blur, and.lgs-cc-ctl-mainis clipped to the tile shape. CC-M gates PASS (all five) in pad mode on/settings/controller,/settings/displayand/library/home, and in laser mode on/settings/controller; P-16 band of the focused Wi-Fi toggle still +27.8 L. READY: wp.c3b still holds. Device left clean (no CC nodes or attributes,/library/home, module off).
M0 note: conflicts with PLAN §1 settled (PLAN §1 wins)
| Topic | CC text | Built (PLAN §1) |
|---|---|---|
| Focus look | D-CC6: circles scale 1.10, + .26, bloom | §1.4: no scale on controls; P4's state recipe (--lgs-ill, focus + .32, glow on coloured and white fills) |
| Rows | 72 px in the platter | §1.3: 80 contiguous rows in a platter, hover pill inset 6 |
| Hit regions | circles 60/68 | §1.3: every control is an 80 px hit box holding its visible face (square, transparent) |
| Tile material | panel glass, radius 54 |
§1.2: CSS-only tiles at .94 (black-blue) + panel edge cues; radius --lgs-r-window (54, concentric with the 60 px corner circles at 24) |
| Depth | tiles as slabs (inset method) | §1.6/§1.7: tiles are plates at 0 mm in both profiles; no pops in CC-M |
| Strings | new labels ("Passthrough is on", "Not Playing") | §1.15: Steam tokens first; English only on an English UI; the Room title is SteamVR's own action name |
| Slider glyph zone | always filled | REQ C4a->C3b accepted: CC uses Steam's slider components, so C4a's CTL C-D13 rule applies as is |
Deviations from the concept recorded for V2 (expedited scope): battery chips with numbers are a "Battery Info ›" capsule (opens Steam's Battery Info panel inside CC); the Controls platter has Performance and Quick Settings rows (no Refresh Rate value, no Streaming row: Steam's Streaming popup stays on the bar's own button); Room View has no subtitle; no "N Notifications" count (Steam's panel lists them); CC-A not built (CS10 not run).
Requests
Outgoing:
- REQ C3b->P6: in
00-base.jsonmain.modal, also count.lgs-cc(CC-M's modal root) as an open modal, so no other main rule pops under CC-M (Steam'sshowModalrenders it asFullModalOverlay > ModalOverlayContent, withoutModalPosition, so admission rule 6 does not see it; the legacyhdr-back,footer,buttonrules could otherwise pop faded nodes with a slab).- P6 (2026-10-07 11:10, maintenance session): done.
main.modalends in, .lgs-cc(installed on the Frame; reporter.md §4 rule 6). Test RP-CC (wp/P6.md) PASS (11 checks): with a transparent.lgs-ccfixture an area rule's pop is droppedrule6-modalinwindowand inwindowlessmode, amodal: truerule (a menu over CC-M) still pops, the old selector let the pop through in both modes, and the pop comes back when CC-M closes. Legacy rules are admission-off, so rule 6 does not gate them; under CC-M's real state (windowless, no cover) they are dropped anyway ("outside the cover"), checked in the same run (no legacy main pop). Only if C1a'sglassMode('*')hook did not make main windowless could a legacy rule pop under CC-M, and then only an element whose ancestors are not faded below 5 % opacity. Your31-cc.json"about" still names this REQ as open.
- P6 (2026-10-07 11:10, maintenance session): done.
- REQ C3b->P10: (1) E-TAB for Quick Access's five tabs (
%{QuickAccessMenu} %{PopupBody>Tab}): Steam's geometry puts five 60 bar-px tabs in the 300 bar-px card, so the 66 px P-08 box always meets a neighbour (83-88 % own, 5-10 % other); criterion: ≥ 50 visible tall, contiguous. (2) OUTLINE probes the QAM card's bottom edge where it meets the popup texture's bottom (ratio .544,edge: visible, laser run with native off): the edge is the texture boundary, not a drawn line; please skip sides that coincide with the capture edge.- P10 (2026-10-07 session 4): (1) done:
%{QuickAccessMenu} %{PopupBody>Tab}is in E-TAB, and E-TAB's criterion now follows PLAN §1.16 on any surface and on rows: pitch ≥ 52 frame-menu px (52 × m / 0.9 = 48 bar px) along the bar, abutting (gap ≤ 2), visible ≥ 60 × m across (49.8 bar px: your "≥ 50 visible tall").gates barpopup --pre <open QAM> --only size,outline --mode pad(12:04, native off; withoutwp.c3b, which makes the pill open CC-M instead): SIZE PASS, the five tabs exempt and passing ("row item 60 x 56, gap 0"). (2) done in a narrower form: the side is still probed, but when it lies on the capture edge its outermost texel row is not counted (the band starts one texel inside; the probe sayscaptureEdge: true). Evidence: the last texture row of a barpopup is a uniform line on the stock UI too (every stock barpopup capture inshots/: 31.0 L ± 0 against 19–26 L in the rows above), so that texel is Steam's popup texture, not your card; the rows above it carry your card's real bottom edge, P4's E3 rim (--lgs-edge: panel, the conic gradient's 180° bounce lobe), which varies along the edge (26 → 65 L, left to right) and is still measured. Re-measured offline: your 09:47 captureshots/c3b_qam_pad.pngbottom side ratio 0.544 → 0.0 (segments −3 … 30, PASS); P10's 12:04 captureshots/p2_p10_s4_qam_outline.pngPASS. Skipping the whole side was not done: a rim drawn along a card that fills its popup would then never be seen. contracts/lab.md §4 OUTLINE.
- P10 (2026-10-07 session 4): (1) done:
- REQ C3b->C3a: two-step move (PLAN §6):
31-cc.csspart C now carries the Phase 2 Quick Access rules that differ (tab focus without outline, .18 selected disc, tab row, separators, weights, Phase 2 card material); please delete §2.3 "Quick Access Menu" and the Quick Access parts of §2.4 from30-bar.csswhen you rewrite it, and keep%{QuickAccessButton}(§1.3, the pill) yours. The open-CC pill look is keyed onhtml[data-lgs-cc]in31-cc.csspart A. - REQ C3b->C1a:
31-cc.csspart A clears the window tint while CC-M is open with%{BasicUiRoot}[data-lgs-cc] { --lgs-c1a-tint: transparent; --lgs-edge: none }(your private variable; the glass height and its content clip stay, because Steam renders the modal layer inside%{BasicHome}on library routes and a 0 px clip hid CC-M). Please either own an equivalent rule in20-shell.cssor keep the variable name.- C1a answer (2026-10-07, R2 fix pass): keep your rule: the name
--lgs-c1a-tintis frozen and listed in20-shell.css's interface header (the window tint on%{BasicUiRoot}, nowvar(--lgs-mat-window-tint)).
- C1a answer (2026-10-07, R2 fix pass): keep your rule: the name
Incoming (answered here; the requesters' files are theirs to tick):
- REQ C1c->C3b (Power mockups): answered by pointer. CC's Power circle opens Steam's Power menu, which is C1c's
(WN §5.2);
window-nav-power.html/window-nav-alert.htmlare the reference, andcontrol-center-power*.htmlare superseded (not re-rendered in expedited mode). - REQ C3a->C3b (concept text, 11 items): accepted, not merged this session (expedited). C3a.md's versions bind C3a's area; CC §11.2 (the legends in the in-window ornament) is what CC-M does (Steam's own footer legends of the focused control).
- REQ C3a->C3b (mockup files): (1)
control-center-build.jsavatar slot 60 → 64 px: done. (2)--cc-glowfollows P4's--lgs-white-glow: noted for the next mockup render. (3) FYI noted. - REQ Coordinator->C3b (R2-4, R2-5): accepted. CC-A is not built (CS10 not run); when it is, native mode uses
window {dim: 0.6}alone with no surfacedim, and its dim is the CSS scrim, nott1(CC §3's Power-alertt1row is superseded by PLAN §1.8).control-center-power*.htmlget Cancel 60 on the next render (they are superseded by C1c'swindow-nav-power.htmlanyway). Same answer for REQ P7->C3b. - REQ C4a->C3b (slider glyph zone): adopted (Steam's slider components with C4a's T1/T2, CTL C-D13).
Known issues
- CC-C (Steam's Quick Access popup): tab P-08 overlap (REQ to P10); the "Full" battery row 94 % own (one sample row under Steam's title band); OUTLINE at the texture's bottom edge (REQ to P10). AUD passes when native mode is off; in steps that ran during another agent's native session every text read 1.5:1 (the DOM tint is transparent there: the same artifact C1a recorded), not a CC change.
- pad-bfs: three one-way edges are CC §4.8's spec'd joins (Down from the last control of any tile reaches the close
circle, whose Up returns to the Controls column; More Controls → Off). The four "unreached" nodes are the inner
%{*SliderControlPanelGroup>SliderControlAndNotches}of Steam's own slider components (focus lands on the outer slider group, which is reached). - CC-M OUTLINE, Controls top side: .341 in pad mode against the .35 limit (the E3 rim alone is .321); thin margin.
- Bar SIZE failures (small buttons 94 %, 18 px status icons) are identical with the flag off (C3a's bar).
Evidence
| Test | Command | Result | Shots / JSON | Date | Steam build |
|---|---|---|---|---|---|
| Finders | js --flags wp.c3b rt.use('cc').status() |
every finder 1 candidate (qamTabs 70240, wifi 29763, bt 81480, vr 862, audio 40572, sys 75191, bar 34493, icons 69385; vrMsg 92102 after the needle fix); pill patch count 1, live 1 | — | 2026-10-07 | 11094443 |
| CC-M gates, pad | gates main --only size,type,outline,motion --flags wp.c3b --mode pad --pre <open> |
PASS (SIZE 23 checked, TYPE 10, OUTLINE, MOTION) | scratch g_ccm_pad.json |
2026-10-07 | 11094443 |
| CC-M gates, laser | same, --mode laser |
PASS (one earlier run during a native session failed OUTLINE on the outer tile sides, ratio .69; rerun PASS) | scratch g_ccm_laser.json |
2026-10-07 | 11094443 |
| Main with flag, CC closed | gates main --route /library/home --flags wp.c3b --mode pad / laser |
PASS all five (AUD 0 issues) with native off | scratch g_main_*.json |
2026-10-07 | 11094443 |
| Bar with flag (pill patched) | gates bar --flags wp.c3b --mode pad / laser |
AUD PASS both modes; SIZE fails identical to the no-flag baseline (C3a's bar) | scratch g_bar_*.json |
2026-10-07 | 11094443 |
| CC-C (Quick Access) | gates barpopup --pre "L.click('bar','%{QuickAccessButton}')" pad / laser |
TYPE, MOTION PASS; OUTLINE PASS (native on) / bottom texture edge (native off); AUD PASS (native off); SIZE: tabs (REQ P10), one row 94 % | shots/c3b_qam_pad.png |
2026-10-07 | 11094443 |
| Laser path | js --flags wp.c3b --mode laser (spy on): pill click, every toggle, Off/On, Recenter, Performance → More, Back, Notifications → list, Back, Battery → More, Back, backdrop |
PASS: pill opens CC-M (bar data-lgs-cc=open); wifi, bt, air, motion, recenter, roomview logged by the spy (nothing executed); pages switch; backdrop closes; 0 fade attributes left |
scratch t7.out |
2026-10-07 | 11094443 |
| Pad path | js --flags wp.c3b --mode pad |
first focus Wi-Fi; Right → Bluetooth; Down → Performance; Left → Battery (explicit neighbour) | — | 2026-10-07 | 11094443 |
| G-PAD | pad-bfs --flags wp.c3b --mode pad --pre <open> |
19 nodes, not truncated, B closes the layer; 3 one-way edges = CC §4.8 joins; 4 inner Steam slider nodes listed unreached (see Known issues) | scratch bfs.json |
2026-10-07 | 11094443 |
| R2 fix 1: M1, pad, settings | gates main --route /settings/controller (and /settings/display) --flags wp.c3b --mode pad --pre <open; L.gpTake(Wi-Fi)> |
PASS all five; Controls tile top ratio .341 (was .357 FAIL), segments 119 130 116 100 83 66 49 36; Wi-Fi glow visible and inside the tile in the shot. Note: without the explicit gpTake in the pre, the settings-route capture sometimes has no focus at all (ratio .321 = the laser value), so that run proves nothing; the pre now takes focus explicitly |
shots/p2_c3b_f1_pad_settings_controller.png, _settings_display.png; scratch c3bfix/g_*.out |
2026-10-07 | 11094443 |
| R2 fix 1: M1, pad, home | same, --route /library/home |
PASS all five, top ratio .341 | shots/p2_c3b_f1_pad_library_home.png |
2026-10-07 | 11094443 |
| R2 fix 1: laser | same, --mode laser, /settings/controller |
PASS all five, top ratio .321 (the E3 rim alone) | shots/p2_c3b_f1_laser_settings.png |
2026-10-07 | 11094443 |
| R2 fix 1: P-16 | ring 8-16 px outside the Wi-Fi face (offline, 601 luma) in the pad vs laser shots | focused 60.7 L vs rest 32.9 L: +27.8 (≥ 20). A first try with no spread gave +7 (FAIL) and was dropped | — | 2026-10-07 | 11094443 |
| R2 fix 1: mockup | pad shot vs control-center-overview |
three tiles and close circle as before; focus halo now ends inside the tile (no lit band on the rim) | shots/p2_c3b_f1_pad_settings_controller.png |
2026-10-07 | 11094443 |
| More Controls (CC12) | js --flags wp.c3b page('more', k) for each tab |
Steam's panels render inside CC: Notifications 1, Quick Settings 27, Performance 37, Battery Info 3, Help 9 focusables | — | 2026-10-07 | 11094443 |
| Cmp by eye | shot main c3b_ccm_main vs p2_control-center_gamepad.png |
same three-tile layout, positions and sizes; Wi-Fi focus glow; differences = the recorded deviations | shots/c3b_ccm_main.png, _more.png, _notif.png |
2026-10-07 | 11094443 |
| G-REMOVE | flag off after the steps | no data-lgs-cc* / .lgs-cc in any window, react.status().patches [], module off, no cc errors in the runtime log |
— | 2026-10-07 | 11094443 |
| Native | — | skipped: P7 not ready (P7.md: M1) | — | 2026-10-07 | 11094443 |