33 KiB
C1a Shell chrome: adversarial review R2
Reviewer: independent agent (review R2). Package card: PLAN §2.4 "C1a Shell chrome"; builder's log docs/phase2/wp/C1a.md
(Status: READY with wp.c1a, M4 claimed 09:08). Concept: docs/phase2/concepts/window-nav.md (WN). Steam build 11094443.
Scratch evidence (JSON, logs, probes): <scratchpad>/r2/ of this session (C:/Users/blcha/AppData/Local/Temp/claude/ C--Users-blcha-liquid-glass-frame/9826dd03-.../scratchpad/r2/). Kept CDP shots: shots/p2_c1a_r2_*.png (Steam surfaces
only; no room imagery). Headset frames were looked at and deleted at once on both machines.
Status
Complete (2026-10-07 10:45 – 13:40 EDT, two sittings; the first was cut off at 11:50 and resumed from the scratch
evidence). Verdict: fix (8 major, 13 minor findings; no blocker). The device was left as found: theme on in CSS-only
mode (native-session reported "back to CSS only: yes"), every step's flags popped by the lab, no flags file key of mine
left, pointer at (1400, 900) after every hover step, no menu or dialog left open (13:35: route /library/home, 0
modals, native false; the wp.c1a/wp.p3 keys then in /tmp/lgs/flags.json belong to other agents' running steps).
Besides this file, only the lab's own captures shots/p2_c1a_r2_*.png were written; no package file was touched.
Re-checked 15:15 after a pause (no device change): C1a's files (theme/20-shell.css, theme/layers/20-shell.json,
theme/vr/10-systemui.css, device/rt/20-shell.js) and wp/C1a.md are unchanged since this review; every request in
"Requests to C1a" is still open; P3's 14:42 edit of 05-attention.js keeps attend().off() silent (no onLeave), so
m1 stands; glass.py status: theme on, no unresolved tokens. The findings below stand as written.
Re-checked again 16:22 (a quick pass at the user's request): every C1a file still dated 08:33 or earlier (wp/C1a.md
11:00); no request to C1a newly answered; device/defaults.json still absent and lgs_layers.js (edited 13:18) still
applies a fragment's owns fields whatever its flag (l. 246–283), so M2 stands; under the lab updated since
(lab_gates.js and others), gates vr:systemui --flags wp.c1a --mode pad --only outline (16:22, native=off) still
fails OUTLINE ×2 on %{ControllerStatusRoot} %{LargeStatusArea}::before (M1). glass.py status afterwards: css-only.
Verdict in one paragraph
The shell's CSS-only chrome on main is solid: route glass modes, the toolbar row, the hugging ornament with its dim-band
quiet legend, the tab bar's two capsules, the More circle and the Options member work, keep every function on both paths,
pass G-AUD / G-SIZE / G-TYPE / G-OUTLINE on the shell's own nodes in both input modes, and remove cleanly. It is not READY:
the SteamVR chrome it owns still draws Phase 1's closed rims (G-OUTLINE fails on vr:systemui), the default-flag native
mode draws a square slab around the tab bar, High Contrast misses its gate on the main window, the toolbar on windowless
routes is not glass, the Liquid Glass motion of the shell's own pieces is not built, the focused tab-bar item still
scales, twelve requests addressed to C1a are unanswered (three of them from complete platform packages), and several of
the card's own acceptance tests were never run.
Findings
Severity per the review brief: blocker = lost function, safety problem or crash; major = a failed gate or test, or a clear visual or conformance miss; minor = polish. Each finding names its evidence (section "Evidence" below).
Major
-
M1.
theme/vr/10-systemui.cssdraws outlines on SteamVR chrome: G-OUTLINE fails onvr:systemuiin both modes. The controller status card (§4, lines 265–277) paints Phase 1's--lgs-panel-rim(inset 0 1.5px 0white .42 +inset 1px 1px 0+inset -1px -1px 0: a closed rim of hard 1–1.5 px lines, P-42/P-43, must). Gate:gates vr:systemui --flags wp.c1a --mode pad|laser(13:10,native=off): OUTLINE FAIL ×2 on%{ControllerStatusRoot} %{LargeStatusArea}::before(rects 278,516 and 536,516, 220 × 54). Seen on the capture (shots/p2_c1a_r2_vr2_pad.pngoverroom-studio): both cards show a thin light outline round the whole slab. The same rim token is on More Options (§3.2, l. 172), the gamepad-mode pill (§3.3, l. 228) and every §5 panel (l. 358–476;--lgs-control-rim, a 1 px line, on the room-setup buttons, l. 414). More Options also draws a 2 px focus ring on its focused row (inset 0 0 0 2px var(--lgs-focus-outline), l. 217: P-17 must) and keeps Steam's 1 px row separators "recoloured as hairlines" (l. 167–186: P-43 must). It is not WN §3.5.2's thick glass either (radius 44, 96 systemui px rows with 8 px gaps): it is--lgs-r-menupanel glass with Steam's rows. Two complete packages filed this (REQ C5b->C1a, REQ C6b->C1a): everyvr:systemuigate run fails for them too. Fix: E4/E5 + the lit top lip (as §3 already does for the frame-control capsule) instead of--lgs-panel-rim/--lgs-control-rim; the focus light recipe of §3 instead of the ring; separators as space or a ≥ 2 px tone step; thick glass per WN §3.5.2. -
M2. Native mode with today's defaults draws a square-cornered slab round the tab bar (REQ P7->C1a, open).
theme/layers/20-shell.jsonownsframe.menuand replaces its cover with%{DashboardMenu}%{Variant_FrameMenu} > .lgs-tabcap, %{DashboardMenu}%{Variant_FrameMenu}:not(:has(> .lgs-tabcap))without anr. A fragment'sownsfields apply whatever itsflag(device/lgs_layers.jsmergeFragments, l. 236–283:flaggates only rules andsupersedes). Withwp.c1aoff (the default: there is nodevice/defaults.json, V2 has not accepted C1a) there is no.lgs-tabcap, so the cover is the whole menu box, and C1a's own T1 sets that box toborder-radius: 0(theme/20-shell.cssl. 739). The reporter therefore sends a radius-0 rectangle the size of the menu box (both capsules and the 10 px gap between them; P7's cover was 102 × 768 texture px), and glassd draws it: P7's headset frame of 12:36 ("a grey rectangle with square corners around the tab-bar capsule",wp/P7.mdl. 132, l. 186). Withwp.c1aon, the shapes are right: my native probe (13:06) readframe.menushapes[327,122,123,612, r 62]and[327,749,123,330, r 62], both acked (data-lgs-cover). So the shipped state today (runtime flag off, native on once V1's gate passes) shows an outline-like slab, against the quality bar's "edges come from the material and shader only". Fix: give the fallback a radius ("r": "capsule", or keep a radius on the box when no.lgs-tabcapexists), and answer P7. -
M3. High Contrast: the main window's glass stays at .84, not the near-opaque .94 (G-A11Y; REQ P4->C1a, open).
--lgs-c1a-tint: rgb(20 22 30 / calc(.60 + var(--lgs-dial) * .24))(20-shell.cssl. 60) gives .84 underprefers-contrast: more; P4's--lgs-mat-window-tintisrgb(11 13 16 / .94)there. Probe--media contrast(<scratchpad>/r2/hc.out):dial 1, root background tilesrgba(20, 22, 30, 0.84),matWindowTint rgb(11 13 16 / .94). The tab bar (l. 896–900) and the ornament (l. 714–719) do switch to opaque glass in High Contrast, so the window is the odd one out. PLAN §4.1 G-A11Y: "near-opaque glass with the 2 px edge". -
M4. The toolbar row on
windowlessroutes is not glass in CSS-only mode, and differs from what native mode draws (REQ C2a-R2->C1a, open; WN §3.2 "Windowless routes"). On/library/homewith C2a's hook (--flags wp.c1a,wp.p3,wp.c2a, 13:08,native=off):data-lgs-glass="windowless",data-lgs-back="root"; Back carriesdata-lgs-plate=liquid,data-lgs-plate-inset=10,data-lgs-plate-r=capsulebut its CSS fill is none (::beforetransparent, no shadow: the section-root borderless rule, l. 271–277); the search field carries theshell-searchplate tags but draws the recessed well (black .30 + inset shadow) straight over the room, with no glass behind it (<scratchpad>/r2/home_probe.json). Seen onshots/p2_c1a_r2_home_windowless.pngover both rooms: a bare arrow floating over the room and a smoked bar beside C2a's glass "What's New" capsule; the placeholder measures 4.4 : 1 over the lounge (borderline). WN §3.2 asks for the CSS plate look there (black .58 with a white .16 → .04 gradient + edge cues), and native mode would draw a 60 px liquid circle and a 520 × 64 liquid capsule that CSS-only mode never shows. (C2a-R2's "80 × 80 / 536 × 80 plates" is not right: the insets 10 / 8 make them 60 and 520 × 64. The look mismatch stands.) -
M5. The Liquid Glass motion of the shell's own pieces is not built (WN §7; PLAN §1.5; quality bar).
theme/20-shell.csshas exactly ten transition declarations and no animation (grep): nothing on#Footer::before/::after, so the capsule ↔ quiet legend switch is instant (WN §7 l. 787: "materialize-in250 /materialize-out350,lgs-mat-glass-*on#Footer::before"); no label fade or backingsnappymorph when legends change (l. 786: the anchors jump); the More circle is a plain opacity transition of 250 / 350 ms (l. 921–928), not P5's materialize with separate glass and content channels (.lgs-mat,lgs-mat-glass-in,theme/02-motion.nowrap.cssl. 84–111, 219–221; WN l. 788, PLAN §1.5 row "Materialize … More circle, ornaments"); the tab bar keeps Steam's 300 ms width transition (l. 744–749, "stay Steam's") where WN §7 l. 774 retimes it tosnappy/fade; no tab-selection cross-fade (l. 775). The durations that do exist are tokens (MOTION gates pass); what is missing is the materialize recipe itself. -
M6. Twelve requests addressed to C1a are unanswered (
grep -n "REQ [A-Za-z0-9-]*->C1a", 13:20; table under "Requests to C1a"). Several have visible consequences beyond M1–M4:- C1b #9:
20-shell.css§6 (l. 1022–1167, Phase 1's search route) is still live. It paints unscoped.gpfocusrings on the search scope tabs (0 0 0 2px scrim, 0 0 0 4px focus-outline, l. 1099–1102, outranking C1b'sbox-shadow: none !important: C1b review R2),--lgs-focus-ringon the arrows (l. 1117),--lgs-glass-rim1 px lines (l. 1056, 1156) and Phase 1 aliases: P-17, P-42/P-43 and P-01 (must) on/search. - Coordinator (R2-1, R2-2, R2-3, R2-5, R2-10, R2-11): WN is not updated. §3.4.1 "Library routes" and §3.4.2 slot 1 still
put Sort/Filter in ornament slot 1 with five fixed slots; §3.7 still says "until the coordinator rules (O4)"; §9.3
rows L6/L7 still name "Ornament slot 1"; the mockups
window-nav-anatomy*.html,-ornament.html,-chrome.htmlstill draw the fixed-slot ornament as the default, so PLAN-1a-3 (G-MOCK) compares the device against a superseded design. - C2c REQ-9 / R2-2: the toolbar's trailing group. Measured (geometry probe, 12:18): Steam's laser Sort & Filter group at x 906–1256 against the shell's 536 px search box at x 372–908 (visible capsule 380–900): 6 px of visible gap (R2-2 asks ≥ 20) and 2 px of overlapping hit box. The width is C2c's to cap (REQ Coordinator->C2c), but C1a never answered where the group goes or confirmed the area is kept free.
- C6a: the 520 px capsule straddles the 400 px settings sidebar (x 380–900); seen on
p2_c1a_r2_settings.png. - C3b: CC-M clears the window by writing C1a's private
--lgs-c1a-tint; C1a has not taken the rule or frozen the name. - P6: the window sheen, the ornament capsule and Back are painted with literals. P6's stopgaps in
05-native.css(l. 85, 105–127) key on the legacyfooter/hdr-backpops, whichwp.c1anow supersedes; C1a's own §4c takes over for the ornament plate and the windowless Back plate (my native probe:#Footer::afterbackground none once the plate is acked) and P6's l. 51 drops the window sheen. No double paint seen, but P6 asked to be told when the ornament became a plate so its overrides follow, and was not.
- C1b #9:
-
M7. READY and M4 are not supported by the card's acceptance tests (PLAN §2.1 definition of done 1, 2).
- AT-4 (the function audit on Home, a game page,
/account,/controller/calibration/0, CONFIRM, MENU, POWER,frame.menu,floatingfooter): not run as specified; the log hasgateson Home, AllGames, a game page, Downloads,/settings/system,/media/grid,frame.menu,floatingfooteronly. (I ran the missing ones, below: the shell's nodes are clean there, so this is missing evidence, not a missing function.) - AT-7: only the computed pitch;
tabBarAlways(the always-visible part) never run. AT-20 (headset view with the tab bar always visible, MENU and CONFIRM up, the ornament off-axis): not run. AT-17 (SteamVR chrome and the T4 moves): no evidence row at all; the ledger rows W1–W8 depend on it. - AT-0b: the CSS-only part passes, the native part was not shown (my native session repeats only the DOM part, below).
- AT-23: the tab-bar capsules were never measured. AT-2: the scroll guard still fails (blocked on C2c, recorded).
- PLAN-1a-3:
docs/phase2/wp/C1a-cmp.jsonmaps only the ornament's members forwindow-nav-chrome(mockOrigin [320, -300]), never the window-bar row the mockup is about (framecap,winbar-pill,tooltiprects exist inp2_cmp_c1a_window-nav-chrome.rects.jsonand are not compared). - There is no "session 5" section in the log (only Status bullets): no start-of-session request check, no command table, no dates for the M4 claim. M4's native look (09:05) predates P7's B1 fix (frame-menu copies half a capsule off) and its G-HV verdict was withheld, so M4 is not reached by PLAN §2.1's definition ("G-DEPTH and G-HV pass in a native session").
- AT-4 (the function audit on Home, a game page,
-
M8. The focused tab-bar item scales 1.1× under gamepad focus (VP P-05, must; no deviation recorded). Steam zooms the focused
%{DashboardMenu>Item}with its own transform; the shell keeps it and widens the pill's inset so the zoomed pill stays inside the capsule (C1a log l. 181, l. 242: "Steam zooms the focused tab-bar item 1.1×"; WN §3.3.4 keeps Steam's scale on the current route too). P-05: "tabs … never scale or lift on hover or focus"; PLAN §1.4 "rows and toolbar buttons never scale"; PLAN §4.4 lists only P-11, P-37, P-65, P-67 as deviations. Either neutralise it without touching Steam'stransform(the independentscaleproperty composes with it, LAB allowsscale) or get a recorded deviation. (My own D-pad probe did not enter the bar, so the 1.1 is the builder's measurement, not re-measured.)
Minor
- m1. Removal leaves
#header[data-lgs-reveal](G-REMOVE in one state).reveal()sets the attribute on#header(20-shell.jsl. 256);teardownDom()removes it only from#header's descendants (l. 686); P3'sattend().off()leaves withoutonLeave. Live (<scratchpad>/r2/readback3.json, 12:01,native=off): reveal shown ("Library", Back 143 wide),wp.c1apushed off → moduleoff,#headerstilldata-lgs-reveal(1 node). While it stays, a re-install keeps the Large Title at opacity 0 (#header[data-lgs-reveal] > .lgs-title;applyRoutechecks only Back's attribute, l. 164). Reachable when the theme or the flag goes off while the laser rests on Back. One-line fix. - m2. The tab-bar capsules have no E3 edge (WN §8.1: "Arc + lobe ×1.10, dark edge 6 px .12"): only a gradient sheen
and
--lgs-raised-shadowon the cap rows; no--lgs-edgehook on the menu. AT-23 never measured them. - m3. P-07 (should): ornament hit boxes do not abut. Members are 4 px apart (
gap: 4px, l. 489) and 10 px more before the quiet group (l. 599–601): measured gaps 5, 3, 14, 4 px (geometry probe, laser). WN §3.4.1 itself says "adjacent members' hit boxes abut (VP P-07)". - m4. The More circle has no tooltip (WN §3.4.4 "Feedback": "Options" after 0.8 s through P3's tooltip layer) and its
aria-labelis empty in laser mode (builder's AT-26 note). - m5. The tab bar's +25 mm is P7's
tabBarDepthflag, which neither WN nor C1a's interface table names; withtabBarAlwaysalone the bar keeps Steam's +10 mm.frame.menustayslaserOnly: truein the reporter while C1a owns the surface, so withtabBarAlwaysin gamepad mode the bar has no glassd cover. - m6. Native, windowless routes:
#header %{BackContainer}[data-lgs-plate-ack]:not(:hover, .gpfocus)::before(l. 1004) drops the CSS fill only at rest; on hover or focus the full raised fill repaints over glassd's acked plate. - m7. The Back reveal animates layout (
max-width,padding, l. 252) where LAB asks for opacity / scale / translate; under Reduce Motion the capsule still grows on a 180 ms width transition (P-56 reads "only opacity"). - m8. The ≡ glyph badge is broken in gamepad mode. Steam's Menu glyph is a wide pill image; the invert + screen recipe
(l. 545–551) leaves a dark pill wider than the 30 px badge disc, spilling over its edge (
<scratchpad>/r2/ badges_grey.pngfromp2_c1a_r2_ag_pad.png). The letter glyphs also keep Steam's ring inside the badge, not WN's "16 px Bold letter". - m9. Two must-level false positives on Steam's
#headerthat V2 will record against the shell. P-82 FAIL on/settings/system(pad, 12:39:#header'sinnerTextis E-BACK's hidden "Back", no Large Title there) and G-SIZE P-80/P-08 on/controller/calibration/0(13:23: "%{Profile>Header}1280 × 40, visible short side 40").#headerispointer-events: nonewith a nav node and only mouse/context-menu props (probehdr_pad.json, 13:27; not inL.gates.controlsat that moment), so these are lab-model artefacts, but C1a owns the row and should file the REQ to P10 (E-BACK-aware P-82; nav containers withpointer-events: noneare not targets) so the record is clean. - m10. Input-mode scoping: the search field's ring
:is(.gpfocuswithin, :focus-within)(l. 328) and the native Back rule (l. 1004) have no input-mode class (P-01); the ring can paint under a stale laser.gpfocuswithin(P-02). - m11. Phase 1 aliases in
vr/10-systemui.css(--lgs-t-fast,--lgs-ease,--lgs-panel-*,--lgs-control-rim,--lgs-focus-outline): PLAN §6 removes the aliases once areas reach M2; this file then loses its timing and glass. - m12. The pointer proxy's 1.5 px dark ring fails G-OUTLINE (P-43) in native laser runs.
gates main --pre POWER --mode laser(13:21,native=onfrom another agent's session): OUTLINE FAIL "lgs-pointer lgs-pointer-on1.5px ring (box-shadow)". The proxy is a recorded deviation for P-11 (drawing a cursor), not for P-43; a 2 px ring or a soft shadow would keep it readable and clear the gate. (Rated minor only because the element is the recorded cursor deviation; V2 will see a failed gate until it is fixed.) - m13. P-73 (should): no scroll edge at the bottom. Content is cut hard at the glass edge (the
clip-pathat--lgs-c1a-gh, l. 120–122) under the ornament; only the top has the 124 px band. Seen on the AllGames shots (the second poster row ends in a straight cut behind the capsule).
Evidence
All CSS-tier rows were checked for native=off in the step line (other agents' native sessions run between steps).
Gates (G-AUD, G-SIZE, G-TYPE, G-OUTLINE, G-MOTION)
| Surface, route, mode | Command (flags wp.c1a,wp.p3 unless noted) |
Result on the shell's nodes | Time |
|---|---|---|---|
main AllGames, pad / laser |
gates main --route /library/tab/AllGames --mode pad|laser --json |
AUD, TYPE, OUTLINE, MOTION PASS; SIZE 1: C2c's tab "Great On Frame" (not the shell) | 10:51–10:54 |
main /settings/system, laser |
same | all PASS (quiet legend on the band, AUD CONTRAST 0) | 11:26 |
main /library/app/1147940, pad / laser |
same | all PASS (hero: Back clear glass) | 12:06, 12:32 |
main /library/collection/favorite, pad / laser |
same | shell clean; SIZE: C2c's tab and "Favorites" panel | 12:33 |
main /media/grid, pad |
same | shell clean; SIZE: a C7 media tile | 12:01 |
main /search/tab/All, pad |
same | shell clean; TYPE: a C1b result label 16 px | 12:37 |
main /library/home, pad, +wp.c2a |
--only aud,size,type,outline |
SIZE, TYPE, OUTLINE PASS; AUD = C2a's T3 view replacing Steam's Home (GONE ×160, C2a's) | 13:09 |
frame.menu on Downloads, pad / laser |
gates frame.menu --route /library/downloads |
all PASS (E-TAB items) | 12:29, 12:32 |
floatingfooter |
gates floatingfooter --only aud,size,type |
PASS (0 controls while the dashboard has focus) | 12:37 |
vr:systemui, pad / laser |
gates vr:systemui --flags wp.c1a --mode pad|laser --json --shot p2_c1a_r2_vr2_<m> |
OUTLINE FAIL ×2 (M1); AUD, SIZE, TYPE, MOTION PASS | 13:10 |
| AT-4: CONFIRM over AllGames, pad / laser | gates main --route /library/tab/AllGames --pre <pre_confirm.js> --only aud,size,type,outline |
all PASS (header contents and ornament under the modal kept; no GONE / HIDDEN) | 13:21 |
| AT-4: POWER (look only), pad | same with <pre_power.js> |
AUD, TYPE, OUTLINE PASS; SIZE: only C1c's Cancel line (E-MENU: fill 188 × 56) | 13:21 |
| AT-4: POWER, laser | same | native=on (another agent): the proxy's ring (m12); AUD CONTRAST on labels whose CSS glass native mode drops (the AUD model sees no glassd glass: a lab limit, not a shell defect) |
13:22 |
AT-4: /account, pad |
gates main --route /account --only aud,outline |
AUD PASS (the quiet legend inside the window-full glass, CONTRAST 0: AT-29's /account part); OUTLINE: only a C4a/C7 dropdown's top edge (0.999); the window's edges 0.04 / 0 |
13:33 |
AT-4: /controller/calibration/0, laser |
--only aud,size,type,outline |
AUD, TYPE, OUTLINE PASS; SIZE: #header itself (m9) |
13:23 (native=on) |
Not obtained (lab lock busy 240 s): Downloads both modes, /settings/system pad, /media/grid laser (the builder's
rows cover them; nothing contradicts). Names shown on /account are not quoted anywhere here (PLAN §1.15).
Geometry (one locked js step per mode, <scratchpad>/r2/probe_geom.js, 12:06 laser / 12:18 pad)
- Every route:
#Footer0, 628, 1280 × 92;--gamepadui-current-footer-height92px; Back box (14, 14) 80 × 80; search box 536 × 80 at x 372 (656 × 80 at x 312 on a collection); Large Title at x 100 on section roots. - AllGames laser: plate (= capsule) x 333, 614 wide, members 345–935: left − 12 and right + 12 exact, centred at 640,
largest gap 14 (R2-2 check 1 PASS);
data-lgs-plate=liquidonly as a capsule;/settings/systemand the collection: quiet, plate node withoutdata-lgs-plate(R2-1's "no plate for the quiet legend" PASS in the DOM). - AllGames pad (Steam in its real laser state): Steam's Sort & Filter group at 906, 14, 350 × 80,
position: fixed, right 24; overlap with the search box 2 px,elementFromPointat the seam = the search box's panel (M6). - Quiet band alpha on
p2_c1a_r2_settings.png: 155–158 (= .62) over shot y 985–1030, x 720–1200 (R2-1 values hold).
pad-bfs (G-PAD), with the flags, --stock and theme-only
| Route | Shell on (wp.c1a,wp.p3) |
Stock (--stock) |
Note |
|---|---|---|---|
/library/downloads (pad) |
3 nodes, 0 irreversible, 4 unreached | the same 3 nodes and 4 unreached | the unreached rows are Steam's (empty queue); identical sets |
/settings/system (laser stub) |
93 nodes, 510 moves, 0 irreversible, 0 unreached | 93, 0, 0 | identical |
/library/tab/AllGames (pad) |
76 nodes (truncated at the 150 s budget), 1 irreversible (30 –up→ 3) | 90 (truncated), the same irreversible edge | Left from a poster exits to frame.menu and Right returns (14 exits, all back by the opposite press); the key differences are text case only (stock uppercase) |
Files: <scratchpad>/r2/bfs_{c1a_pad,c1a_laser,off,stock}_*.{json,txt} (10:59–11:49). No reachability loss. (The stock
and theme-only runs overlapped another agent's native session; pad-bfs reads only the DOM and Steam's focus, so they
stand.)
Native session (P7 complete; one batched native-session, 13:06–13:08, <scratchpad>/r2/run_native.py, native.log)
- Probe (AllGames, laser): reporter
mainmodewindow, cover[0, 0, 1920, 984, r 81](656 × 54 × 1.5), plateshell-ornament [500, 942, 920, 126, r 63] liquid, acked; the CSS capsule and its E3 hook dropped (#Footer::afterbackground none,--lgs-edge: none); the root cover acked and its sheen gone.frame.menuliquid, two capsule shapes r 62, both.lgs-tabcapacked. Pointer proxy (AT-0b DOM part): one.lgs-pointerin main and one in the frame menu, at the synthetic move's point (130, 403),pointer-events: none, hit test passes through to the poster, off afterpointerleave;pointerProxymodenative. sgcheckAllGames, laser and pad: no R1 (nothing over the ornament'sdata-lgs-nopopbox), nohdr-*,footer,sort-filterpop; the only failures are R2 on the legacytab-arrow×2 (4.43 mm) andcard(2.95 mm), owned by C2c / C2a / C5a (reporter §3.5)./settings/system: PASS, 0 pops./library/homewithwp.c2a: PASS, 0 pops.conformance --only P-11,P-34,P-46…P-51(AllGames, native): P-11, P-46, P-47, P-48, P-51 PASS; P-34, P-49 manual.hv(4 frames: AllGames with a hover, settings, AllGames 30° off-axis, Home): doubling 0.29–0.31 (< 0.6), window top edge ratio 0.0; verdict withheld (auto rect). The headset was not facing the dashboard: the window sat at the frame's bottom edge, so the ornament, the tab bar's shape and the proxy ring were out of frame. G-HV for the shell's chrome stays open (M7). Frames looked at and deleted (the three later looks expired before I opened them; nothing kept).
Live looks against the mockups (CDP shots composited over room-lounge / room-studio, viewed)
p2_c1a_r2_ag_pad.png/_ag_laser.pngvsp2_window-nav_anatomy.png: toolbar row (borderless Back on the section root, Large Title, recessed 520 capsule), glass to 656 with rounded bottom corners, the ornament straddling the edge, glyph badges only in pad mode. Matches the design except the mockup's (now superseded) fixed slots and the laser pill in the ornament. The ornament's top edge profile: 22.9, 45.5, 60.6, 92.6, 23.4, 2.9, 0.7, 1.4 → ratio 0.01 (lounge and studio): a lobe, not a line. The ≡ badge glitch (m8).p2_c1a_r2_settings.png: quiet legend on its band, legible over the bright sill; the capsule over the sidebar edge (M6, C6a).p2_c1a_r2_home_windowless.png: M4.p2_c1a_at8b_focus.png(builder's) andp2_c1a_r2_tab_rest.pngover the lounge: two capsules, the focus pill and the current-route circle clearly different shapes; labels legible over the bright window. (My own tab-focus pre did not move focus into the bar; that shot equals the rest shot and is not used.)p2_c1a_r2_vr2_pad.png: M1 (the controller cards' outline); frame controls one quiet capsule.- Not compared: the window-bar row against
window-nav-chrome.html(no shot of the moved row exists; AT-17).
Function retention (WN §9, both paths)
Checked against WN §9.1–§9.3 and §9.8 for C1a's rows: Back (click / B), the field (click / Up), the tab bar (click while
laser-visible / D-pad Left from the page edge, Right back: pad-bfs exits), the ornament members (click on Steam's legend
nodes, none hidden in either mode: AUD 0 HIDDEN on every route above; physical buttons), A and B as quiet members in both
modes (geometry probe), the More circle and the Options member (builder's AT-25/26, not re-run), SteamVR chrome restyle
only (AUD PASS on vr:systemui). No lost function found. W1/W2 (move, resize) have no gamepad path, as in stock.
Rows L6/L7 still point at "ornament slot 1" (M6). N3 ("B at the window root opens the bar") is unproven (AT-8).
Removal, robustness, idle
- Flag cycles (
<scratchpad>/r2/cycle2.out, 11:06): three install/remove cycles ofwp.c1aon Downloads: 0 shell nodes or attributes left in main, frame.menu or bar, 0 listeners after removal, modulesoff; 1 s idle with the shell on: 0 mutations, 0 running animations. The reveal-state removal leaks (m1). --stockprobe (13:12,probe_stock.js): with the theme off inside the lock, 0data-lgs-*/shell nodes, nolgs-*html classes, no--lgs-*inline variables and nolgsstyle on main, frame.menu, bar. (The lab applies--stockbefore a step's flags, so this shows the off state is clean, not removal right after an install; the flag cycles above show that.)- Fail-closed: each module is an
RT.definewith its token lookups insideinstall()(a missing token throws there, P1 marks the module failed); every DOM write is guarded. No unbounded state found (history stack capped at 64). - Perf (Phase 1
perf, one run each, 12:04 / 12:35,native=off):/settings/system88.7 vs 90.2 fps stock (−1.7 %, 1 long frame); AllGames 61.4 vs 84 fps, 11 long frames: that route's G-PERF is C2c's (REQ Coordinator->C2c (3)). The ABBA runs below put the shell's runtime and the theme at parity on Downloads. - Nothing runs at idle: no interval or rAF loop of the shell's at rest (MutationObservers on
#Footer's subtree and#header's children only; the More circle's 200 ms poll lives only while its menu is open, ≤ 1.5 s when none opens).
Conformance (VP P-items for the shell)
conformance on AllGames, Downloads and /settings/system (<scratchpad>/r2/conf_{pad,laser}.json, 12:37–12:42,
native=off) and the depth items in the native session:
| Item | Result | Shell's share |
|---|---|---|
| P-08, P-80, P-83, P-38, P-84 | P-08 FAIL only on C2c's tabs and posters; the rest PASS | none |
| P-17 | PASS on main; FAIL in More Options (static, M1) and on /search scope tabs (§6, M6) |
yes |
| P-42, P-43 | PASS on main (6 glass elements); FAIL on vr:systemui |
M1 |
| P-01, P-02, P-89 | FAIL (must), mostly other files; the shell adds l. 328 and l. 1004 (P-01) and §6's unscoped rules | m10, M6 |
| P-82 | FAIL on /settings/system in pad mode |
m9 |
| P-07 | not automated; measured gaps 3–14 px | m3 |
| P-11, P-46, P-47, P-48, P-51 | PASS (native) | — |
| P-23 | see the --pad run below |
— |
| P-52, P-58 | PASS (nothing at rest, token durations) | the missing materialize is M5 |
| P-60, P-62 | Back at (24, 24) on every route (geometry); the field 64 px capsule | — |
| P-70 | frame-control glyphs .70 × SteamVR's idle .6 = .42 (static) | — |
| P-87 | PASS (.84 at most); High Contrast exempt, but G-A11Y is not (M3) |
M3 |
P-20/P-22/P-23 (conformance --route /library/downloads --route /settings/system --route /library/tab/AllGames --pad --only P-20,P-22,P-23 --flags wp.c1a,wp.p3 --mode pad, 13:11–13:14; Downloads ran while another agent's session had
native on, the other two native=off; <scratchpad>/r2/conf_pad23.json): P-22 PASS (entry focus on the primary item on
all three). P-23 FAIL (must): /settings/system the sidebar's first row at y 108–180 (top < 124); AllGames posters at
y 102 and 390–656 (top < 124, bottom > 612). The shell's guard variables and its generic %{ScrollPanel}%{ScrollY}
padding are in place; these scrollers and page roots are C6a's and C2c's (REQ C1a->C6a, REQ C1a->C2c (1)–(2)), so it
counts against AT-2 (M7), not as a new C1a defect. P-20's "unreached" come from the conformance step's short BFS budget
(4 nodes); the full pad-bfs runs above are the G-PAD evidence.
G-FOCUS and G-PERF
- G-FOCUS on the tab bar (PLAN-1a-2), re-measured offline on the builder's
shots/p2_c1a_at8b_focus.pngcomposited overroom-lounge(glass.py focus --png … circle r 34on the icons): focus − rest +51.3, focus − current circle +34.6, current circle − rest +16.7: PASS, matching the builder's +51.0 / +34.8. Not re-shot live (my own tab-focus pre did not enter the bar). - Runtime cost (RT-7 statistic,
perf main --route /library/downloads --ab theme --flags wp.c1a,wp.p3 --mode pad, 13:17, 8 runs, allnative=off): fps ratio 1.0, extra long frames 0 (A/A spread 1): PASS. - G-PERF (
--ab stock, same route, 13:18): fps ratio 1.006, extra long frames −0.5: PASS.
Requests to C1a (open at 13:20)
| Request | From | What | Visible effect |
|---|---|---|---|
| REQ C1b->C1a #9 | C1b | delete §6 (search route) | rings and 1 px rims on /search (M6) |
| REQ C1c->C1a (info) | C1c | will-change: auto on the split during modals; what isolates the tab row from the menu's frost |
the library tab row reads sharp behind a menu's top edge |
| REQ C2a-R2->C1a | C2a review | windowless toolbar plates vs CSS look | M4 |
| REQ-9 REQ C2c->C1a | C2c | keep the toolbar trailing area free / say where the group goes | 6 px gap, 2 px overlap (M6) |
| REQ C3b->C1a | C3b | own the CC-M window-clear rule or freeze --lgs-c1a-tint |
contract risk |
| REQ C5b->C1a | C5b | vr:systemui OUTLINE and MOTION |
M1 (the 0.04 s MOTION finding did not reproduce at 13:10: MOTION PASS) |
| REQ C6a->C1a | C6a | search capsule over the settings sidebar | M6 |
| REQ C6b->C1a | C6b | vr:systemui OUTLINE and frame-control SIZE |
M1 (the SIZE finding did not reproduce at 13:10: SIZE PASS) |
| REQ P4->C1a | P4 | High Contrast window tint | M3 |
| REQ P6->C1a | P6 | literal paints; tell P6 when the ornament is a plate | native double paint risk |
| REQ P7->C1a | P7 | frame-menu cover radius | M2 |
| REQ Coordinator->C1a | Coordinator | WN and mockups for R2-1/2/3/5/10/11 | M6, M7 (G-MOCK on superseded mockups) |
| REQ C1a->V1 (C1a's own, open) | — | quietBacking in defaults.json |
none (built-in default) |