33 KiB
C5a Game pages, achievements, Properties: evidence log
Package card: docs/phase2/PLAN.md §2.4 "C5a Game pages, achievements, Properties". Concept: docs/phase2/concepts/game-pages.md (GP, owned by C5a; its Now Playing and binding-UI sections are built by C5b). Steam build at the time of writing: 11094443.
Status
READY: wp.c5a (re-checked in R2 fix pass 1, 2026-10-07 20:15, build 11094443; the T1 CSS is always on with the theme, so only the runtime flag is listed. Run it with C1a's wp.c1a for the glass-mode hook and P3's wp.p3 for the tooltips; without the shell it still works and only the glass mode stays hero). Not ready, stays off: overArtPops (needs glassd G2 holes + GP AT-HV-OFFAXIS by V1 / a wearer).
R2 fix pass 1: DONE (17:45–20:15). M1 fixed and verified live; the cheap and the found defects fixed too (details and the evidence table in the log entry "R2 fix pass 1"):
- M1: the stats are one line, "Last Played Oct 2 Play Time 10.2 hours", text at y 358–384 inside Steam's lifted 80 px cap, with 80 px hover targets (P-08).
- Beyond the review: the hero column at x 104 (VP P-29, a must: Play's centre was 460 px off); Steam Input 16 px after Play-from; the VR chip at y 244 with its disc leading; the private badge as a 114 px round hover target clear of Manage (REQ C5b->C5a); the focused tab's glow kept inside the track (the square-frame lead); achievements rebuilt (track pinned at y 116 instead of under Back and the search capsule, Steam's row slots kept so rows no longer overlap, 1136 px column, Global rows legible); every Properties page at visionOS sizes (9 of 11 failed the gates before).
- Gates, CSS only,
--flags wp.c5a,wp.c1a,wp.p3, pad and laser, native off: all five PASS on/library/app/620980(19:45 / 19:46), achievements My (19:47 / 19:53) and Global (19:46 / 19:46), and 10 of 11 Properties pages (laser 19:13–19:28, pad 18:54–20:13). Updates fails only on C4a's rich pop-up (P-83 radius, a top-edge line): REQ C5a->C4a. - G-MOCK
cmp game-pages-title.htmlPASS (20:07: every mapped element within 3.3 px). G-PADpad-bfs(20:01): entry Play, 0 irreversible, unreached = the lazy feed's tail (as R2's run). Native (native-session, 19:40):sgchecktitle 0 pops, details 3 pops at +10 mm, achievements 0, all PASS;hvlook: one window, no doubled edge; the frame deleted on both machines. R2-10 (windowon achievements) and G-REMOVE (0 marks without the flag) checked live (19:33). - REQs to C5a: C5b->C5a and Coordinator->C5a handled (answers in their logs). Open from C5a: REQ C5a->C4a (the rich pop-up), REQ C5a->P3 (laser tooltips: Steam's grey pooled tooltip shows under the gear, P3's above-tooltip never; the lead, confirmed with
tooltip.state()). - Concept and mockups: GP revision 3 notes (§3.2, §3.3, §4.1, AT-GEO, §4.10, §4.11, function table);
game-pages.cssCancel 60 with three menu mockups re-rendered;game-pages.jsdata-ids andwp/C5a-cmp.jsonfor G-MOCK. - Device left: theme on, CSS only; no C5a flag in
/tmp/lgs/flags.json(it holds another agent's live step'swp.c1a,wp.c1b,wp.p3); 0 hv frames on the Frame; the route is another agent's (/search/tab/All, C1b mid-run), so it was not changed; every hover step parked the pointer.
Milestones reached: M0 (note below), M2 T1, M3 T2, M4 native fragment (theme/layers/50-gamepage.json, native check clean). Files: theme/50-appdetails.css (draft theme/_wip/), device/rt/50-gamepage.js (draft device/rt/_wip/), theme/layers/50-gamepage.json.
Known, not blocking: synopsis line (GQ12) and the "⋯" event-card button (GQ19, AT-OPT) not built; the inline title sits leading (C1a's search capsule is centred while searchCircle is off); Steam Cloud chip not placed (no cloud row on the test app); achievements use GP's documented single-column fallback (built to SM-D17's column), not the 400 px grid; Properties pages have no coloured page circles or hero circle (T2 data-lgs-page not built); the tab arrows are two circles, not the mockup's paired capsule (P-83).
Requests
- REQ C5a->C4a: the rich (two-line) pop-up
button%{DropDownControlButton}.DialogButton:has(%{DropDownLabelContainer})(76 px, radius 30,theme/10-primitives.css§6) is the last gate failure on/app/620980/properties/updatesin both modes (gates … --flags wp.c5a,wp.c1a,wp.p3 --mode pad|laser, 18:45 and 19:16, native off): SIZE P-83 "text control radius 30 < 0.45 × height 76" on both pop-ups (Automatic Updates, Background Downloads), and OUTLINE edge profile on their top side "ratio 1.0, brightest 31 / 17 dL, edge visible" (a uniform bright line along the whole top edge, all 8 segments equal). Same element as C7's open REQ for/account. Asked: radius ≥ 34.2 (a 38 px capsule end) and a top sheen that fades toward the ends (or sits inside the edge), so P-83 and the ≤ 0.35 edge ratio hold wherever the rich pop-up is used. C5a does not restyle C4a's primitive. - REQ C5a->P3: in laser mode the game page's icon-only owners get Steam's grey pooled tooltip below the control and never your glass one above (R2 lead, confirmed).
/library/app/620980,--flags wp.c5a,wp.c1a,wp.p3 --mode laser, a real CDP hover on Manage held 1.5 s (glass.py shot main r2fx_c5a_geartip_laser --route /library/app/620980 --hover "%{AppButtons} %{MenuButtonContainer} %{Container>MenuButton},1500", 19:31 and 19:44, native off): the gear is:hoverand.lgs-dwell, carriesdata-lgs-tip="above"andaria-label="Manage", notitle;__LGS_RT.tooltip.state()at +1.3 s and +2.4 s readsshown: [], count: 0whilemapTooltips: 1(vrPooledPopupStore.m_mapTooltipsholds Steam's own tooltip for the gear); no.lgs-tipnode exists in main. The shot shows Steam's small grey "Manage" box under the gear, over the tab arrows. Asked: your above-tooltip for[data-lgs-tip]owners under laser dwell (the paddata-lgs-tip-pad="now"path is separate), and Steam's pooled tooltip for that same owner held back while yours shows, so one tooltip appears, above (PLAN §1.13, GP §3.2). Same for Play-from (data-lgs-tip="above"). If the pooled tooltip is to stay, its look is C3a's (it is unthemed grey here).
Requests to C5a, handled
- REQ C1a->C5a (quiet legend band): adopted; C1a draws the legend and its band (
quietBacking); mockups not re-rendered this session (expedited). C5a-D6. - REQ C1a->C5a (page roots under the toolbar): done in T1. The hero stays full-bleed; the achievements header starts at y 108 (
margin-top: calc(var(--lgs-hdr-pad) - 24px)); Properties puts the game's name in the toolbar row beside Back (x 100 with C1a's E-BACK circle, x 148 beside the T1 capsule) and the detail pane at--lgs-hdr-pad + 48. C5a-D8. - REQ C1c->C5a (menus): C1c's slab, +10 mm, flat destructive alerts adopted; nothing in C5a's files draws a menu. Cancel: 60, not the 56 this REQ asked for (PLAN R2-5, REQ Coordinator->C5a). C5a-D7.
- REQ C4a->C5a (Play label): live T1 draws
--lgs-text-on-coloron green, white on blue; mockups not re-rendered this session. C5a-D2. - REQ C5b->C5a (private badge, P-80 / P-08): done in R2 fix 1. The badge is a 114 px round hover target 1 px clear of Manage, its 30 px disc at the gear's top right; answered in
wp/C5b.md. C5a-D11. - REQ Coordinator->C5a (R2-5, R2-10, Q-B): done in R2 fix 1. Cancel 60 in the GP mockups (re-rendered), R2-10 checked live (
window), Q-B closed in GP §8; answered inwp/coordinator.md.
Log
2026-10-07, R2 fix pass 1 (17:45–20:15, build 11094443)
Review wp/C5a-review-R2.md: one major (M1), plus the leads of the cut-off R2 session. Open REQs to C5a at the start: REQ C5b->C5a (private badge), REQ Coordinator->C5a (R2-5, R2-10); both handled (answers in wp/C5b.md and wp/coordinator.md).
Found at the start. An earlier fix attempt that was cut off had already put the stats on one line in theme/50-appdetails.css (17:19, in the coordinator's 17:43 checkpoint) and closed GP Q-B, with no log entry and no live check. Its shot shots/r2f_c5a_pad.png (17:21) still showed the clipped stack: the theme had not been reloaded yet. This pass verified that change live and completed it.
Fixed (all live; drafts in theme/_wip/, device/rt/_wip/; check-theme PASS and fontkit.py --hooks-check up to date before every sync):
- M1, the stats. "Last Played Oct 2 Play Time 10.2 hours" on one line: label and value on one baseline, 6 px apart, stats 22 px apart, the text at y 358–384 (GP §4.1 and the mockup: 358). Steam caps
%{StatusAndStats}at 46 px withoverflow: hidden(the cause of M1); the cap is lifted to the block's 80 px, so neither text nor targets are cut. Each stat's tooltip source is an 80 px tall hover target, y 314–394 (60 px failed P-08 once it was no longer clipped: "hit 75 % own"). Probe (glass.py js, pad, 17:54): label and value both at y 358, 26 tall;max-height80;L.gates.hitStatsover the 164 × 80 box 100 % own. - VP P-29 (must; not in the review). At x 40, Play's centre was 180, 460 px off the window centre. The hero column (logo box, chip, stats, cluster, tab row) now starts at x 104 (
--gp-col), as the revision 3 mockups draw it: Play (104, 448, 280, 80), centre 244 (396 off). Tab content keeps the 40 px inset. The T2 dimming sampler's boxes moved with it. C5a-D9. - Cluster spacing. Steam's 10 px left margin on
%{ControllerConfigButton}made the Play-from → Steam Input gap 26; it is 16 (Steam Input at 496). - VR chip. Steam's 12 px margin under the last notice centred the chip 6 px high (y 238): top now 244. Steam lays the chip out row-reversed; it is
row, so the yellow disc leads, as in the mockup and as its 4 / 14 px padding assumes. - Private badge (REQ C5b->C5a). Steam's indicator (
focusable: false, its one function a laser hover tooltip). It is now Steam's own red circle at 30 px (x 835–865, y 429–459), in the system red, with the eye centred on it (Steam had placed the eye at 2 px, 2 px), drawn in the upper left of its own 114 px round hover target (822–936, 416–530), 1 px clear of Manage's box. An 80 px round target left the corners of P-08's box unhit (92 % own, 19:29); at 114 pxL.gates.hitStatsover the gate's 114 × 80 box reads 97 % own, 0 % other (19:58). It no longer overlaps the gear, whose own target stays whole (Manage 100 % own). C5a-D11. - Tab glow cut into a square frame (lead, confirmed). The selected and focused segment's outer glow (P4's white hook, 22 px blur) was clipped by Steam's 84 px tab scroller into a rectangle around the capsule (
p2_c5arev_details_tabfocus.png;r2fxdiagnostic: with the glow switched off for one shot the frame went). The capsule now clips its contents (overflow: clip, on the game page and the achievements track): the glow stays inside the track. - Achievements (lead, plus two defects found live). (1) Scrolled into the list, Steam pinned the My / Global row at y 40, under Back and the search capsule (
r2fx_c5a_ach_tabs.png): the tab page is nowcalc(100vh − 96px)(overflow: clip), so the track pins at y 116 as on the game page; the list keeps Steam's 680 px viewport, so the same windowed rows render as in stock (a shorter viewport dropped one row: AUD GONE "Focus"); its end padding and scroll padding (168) keep a focused row ≤ 613 (a pad walk through all 26 rows,L.pad, about 18:20). (2) Steam places every row absolutely with an inline height 80 at an 88 px pitch: GP's min-height 96 made each row overlap the next, and the "Locked Achievements" label sat 20 px into the next row. Rows keep Steam's 80 px slots (title 24 / 28, description 20 / 24; the rarity line moved under the unlock date at the trailing edge), the label fills its 25 px slot. (3) SM-D17's 1136 px column, x 72–1208 (VP P-81), for header, tabs, search and both lists. (4) Global tab: Steam's #0e141b slab removed; its 16 / 12 px title and description (deeper Steam rules) now 24 and 20, white (white .70 on the rarity fill read 3.9:1 over a bright room). C5a-D10. - Properties (lead, confirmed: 9 of 11 pages failed). Every page now at visionOS sizes (C5a-D12): descriptions Callout 22 (P-38 body text; C4a's row primitive sets 20, so a selector of the same weight later in the bundle); a page's own classless text blocks Callout white; Betas as a header row and 80 px rounded rows 8 px apart, Steam's radio input as an 80 px round target with a check disc on the selected beta, no 1 px rules, no scroller shade, no blue cell mark; DLC as a platter around Steam's grid with ≥ 80 px rows and header cells, round clear cells, no underlined names; Privacy DLC rows 80 px; the Compatibility ARM checkbox an 80 px capsule row; Controller texts Callout / Subheadline white; Updates build lines Subheadline; Installed Files size line Callout;
(Selected by Valve testing…)and "Use global setting" white (CONTRAST); the active sidebar row's arc narrowed as C6a's (its edge profile read .53 on Performance). - Cancel 60 (REQ Coordinator->C5a, R2-5).
game-pages.css.gp-menu .cancelis 60 tall, ≥ 192 wide;game-pages-manage,-manage-sub,-playfromre-rendered withtools/mockshot.pyand viewed. - Mockup builder.
game-pages.jstags the cluster slots, tab capsule, logo box, chip and each stat withdata-id(no visual change) forglass.py cmp;wp/C5a-cmp.jsonmaps them. - Concept. GP §3.2, §3.3, §4.1, AT-GEO, the function table rows and GQ2 carry the x 104 geometry (a revision 3 note); §4.10 records the achievements fallback as built; §4.11 the Properties pages as built.
Evidence (CSS only unless stated; --flags wp.c5a,wp.c1a,wp.p3; every verdict below from a native=off step, R2-13):
| Check | Command, time | Result |
|---|---|---|
| G-AUD, SIZE, TYPE, OUTLINE, MOTION, main route | gates main --route /library/app/620980 --mode pad --json --shot r2fx_c5a_pad 19:45; --mode laser … r2fx_c5a_laser 19:46 |
all five PASS in both modes (AUD 59 controls, 34 texts, 0 issues; SIZE 7 checked, 0 fails, the four tab segments E-SEG; MOTION PASS: C1b's non-token fade-outs that failed it at 17:54 are gone from 21-search.css) |
| Achievements, My | same, --route /library/app/620980/achievements/my/individual, pad 19:47, laser 19:53 |
all five PASS both modes (AUD 42 / 41, 0 issues) |
| Achievements, Global | same route, --pre clicks the Global tab, pad and laser 19:46 |
all five PASS both modes (AUD 22 / 55, 0 issues; TYPE 19 checked) |
| Properties, laser | gates main --route /app/620980/properties/<page> --mode laser, 19:13–19:28, all 11 pages |
all five PASS on General, Compatibility, Installed Files, Betas, Controller, DLC, Game Recording, Privacy, Customization, Performance; Updates fails only on C4a's rich pop-up (P-83 radius 30 at 76 tall; a uniform top-edge line, ratio 1.0): REQ C5a->C4a |
| Properties, pad | same, --mode pad: Betas 19:09, DLC 19:06, Controller, Privacy, Game Recording, Performance 18:54–18:56, Compatibility 19:54, Installed Files 19:56, General 20:10, Customization 20:13 |
all five PASS; Updates 19:55 as in laser (C4a's) |
| G-MOCK | cmp docs/phase2/mockups/game-pages-title.html --id C5a --mode pad --json 20:07 |
PASS: play, playfrom, logo, stat1, stat2 0 px; input dw +3.3, manage dx +3.3, tabs dw −2.8, chip dw +1.6 (labels' own metrics); arrows unmapped (two circles live, P-83). Side by side shots/p2_cmp_c5a_game-pages-title.png, viewed |
| G-PAD | pad-bfs --route /library/app/620980 --json 20:01 |
entry focus Play; 0 irreversible; truncated by its budget (158 s, 41 nodes); unreached = "Load More Activity" and three later feed cards (lazy feed, as R2's run). A 19:36 run (another agent's native session on) listed one "not replayable" up-move between two lazily loaded feed cards; the clean run has none |
| G-DEPTH, G-HV (native) | native-session --pre "L.nav(…)" --step "sgcheck --route /library/app/620980 --json" --step "sgcheck … --pre <outer scroller to its end>" --step "hv c5a_r2fx_native_details --look …" --step "sgcheck --route …/achievements/my/individual" 19:40 |
title 0 pops, details 3 pops at +10 mm (pinned track, two arrows), achievements 0 pops: all PASS; hv look (viewed): the details state as one window over the room, pinned track under the toolbar, inline title, no doubled edge (doubled: false); verdict withheld (auto rect, exit 3 as documented). Frame deleted on both machines (look folder removed; 0 /tmp/lgs/hv-*.png on the Frame) |
| R2-10 | js 19:33 |
%{BasicUiRoot}[data-lgs-glass] = window on achievements, hero on the game page |
| G-REMOVE (runtime) | js without flags, 19:33 |
0 [data-lgs-gp], 0 .lgs-gp-title, 0 [data-lgs-label], 0 [data-lgs-gp-jump], 0 --lgs-gp-dimL styles |
| Shots vs mockups | r2fx_c5a_pad.png, _laser.png, _ach_*, _achglob_*, `props*_pad |
laser.pngnext top2_game-pages_title.png, p2_social-media_achievements.png` (composited over a room tone to judge the glass) |
Lead not fixed here (owner's): the Manage laser tooltip. Confirmed: in laser mode Steam's grey pooled tooltip shows under the gear and P3's glass tooltip never shows (tooltip.state() count: 0, m_mapTooltips 1): REQ C5a->P3.
Device left: theme on, CSS only (the native session returned by itself); flags step-scoped; the pointer parked by every hover step; no menu opened by C5a; hv frames deleted; route: see Status.
2026-10-07, session 2: M2 T1, M3 T2, M4 fragment, live checks (build 11094443)
Built (all live, synced, check-theme PASS, fontkit.py --hooks regenerated and --hooks-check up to date):
theme/50-appdetails.css(drafttheme/_wip/50-appdetails.css): §1-§4 rewritten for phase 2. Hero 656 (--header-height), artobject-position: 62% 40%, three-layer dimming on%{HeaderBackgroundImage}::after(T2 alphas or .45/.65/.65), logo box (40, 108) 560 × 124, VR chip (40, 244) 36 tall; stats block out of the row (absolute, y 334-394, label over value: keeps G-AUD's text sizes); cluster at y 448-528: Play 280 × 80 (green tint,#0d0e12label; blue with white for Install/Update), Play-from 80 circle with a display glyph on its free::beforeand Steam's caret as a 28 px badge, Steam Input / Manage 80 circles (clear glass + P4raisedhook +clearedge), Stop red on focus; Steam's Play shine replaced by a static inner glow. Tabs: 64 track, 60 × ≥140 segments 2 px apart (E-SEG), white selected (--lgs-ill: white), nav hook, Steam's 24 px edge mask off,max-heightof the Game Info tab lifted; arrows paired after the track (flexorder, laser only) as 80 × 80 targets with 64 visible. Tab pagecalc(100vh - 96px): outer range 432, pinned row at y 116, content padding 128 (rest content starts at the glass bottom). §4b with T2: sticky art (capsule + 432, play row −640: a margin on the capsule collapsed with the play row's, probed), cross-fade to Steam'slibrary_hero_blur.jpgat .40 × brightness .55, liquid track when pinned, play row faded with no laser clicks while it rests under the toolbar (stock hides it under its opaque header),lgs-arriveon jumps, inline title. §5b type pass (dates 24 Semibold title case, event titles 28, summaries 22/29, etc.). Every phase 1 ring (--lgs-focus-ring,--lgs-focus-outline,--lgs-glass-rim,--lgs-control-rim) replaced (G-OUTLINE).overflow: clipon the hero (its mirrored reflection otherwise grew the scroll range: 608, and 1252 with sticky; probed). Achievements: single-column fallback with phase 2 tokens (content from y 108, Title 2, 20 px title-case stats, 96 px rows, 64 px icons, My/Global as a 64 recessed track of 60 segments + paired arrows). Properties: C6a's skeleton scoped to%{AppProperties}(400 sidebar black .14, 72 rows at 80 pitch with the nav hook, detail pane from y 116, centred 816 column), the game's name as Title 2 in the toolbar row (x 100 beside C1a's Back circle, x 148 beside the T1 capsule).device/rt/50-gamepage.js(flagwp.c5a; draftdevice/rt/_wip/): statedata-lgs-gp, C1aglassMode('app')(hero ↔ window, optional), adaptive dimming (canvas sample of the same-origin hero; solved values on the live hero), Steam Input label from#AppControllerConfiguration_SteamInput,data-lgs-tip="above"+data-lgs-tip-pad="now"on Play-from / Stop / Manage (P3 draws them), E-SEG tags, inline title node, jump detection.remove()clears every mark, the node and the glass hook.theme/layers/50-gamepage.json(flagwp.c5a): supersedes legacyplay,app-button; pinned tab track and arrows +10 (wearer +15 interactive); focused content cards +15 attended; over-art cluster / tabs behindoverArtPops(off) withhole: {fill: "auto"},slab: "none".
Live evidence:
- Shots (viewed, compared by eye with
shots/p2_game-pages_title.png/_yourstuff.png):shots/p2_c5a_title_t1.png(CSS only),p2_c5a_title_t2.png(flags on: matches the mockup's layout: logo, chip, stats, cluster with the labelled Steam Input capsule, segmented track and paired arrows),p2_c5a_details_t2.png(pinned track at y 116, content at y 228),p2_c5a_ach_t1.png,p2_c5a_props_t1.png. Differences from the mockups, explained: no synopsis line (GQ12, optional, not built); the search stays C1a's capsule (searchCircleoff), so the inline title sits leading beside Back instead of centred; Steam Cloud chip not placed (no%{CloudStatusRow}on the test app); achievements use GP's documented single-column fallback, not the 400 px grid. glass.py gates main --route /library/app/620980 --flags wp.c5a,wp.c1a,wp.p3 --mode pad|laser --json: AUD PASS in both modes (29 controls, 42 texts; no GONE / HIDDEN / SHRUNK / UNCLICKABLE / CONTRAST); TYPE PASS; OUTLINE PASS (8 glass elements, 0 fails); MOTION PASS in pad, laser fails only on C1a's Back transition and Steam's own portrait fade (not C5a's nodes); SIZE: only%{PrivateAppActiveIndicator}(Steam's 21 px focusable private badge, 30 px now, stock fails the same rule) and its 1 % touch on Manage's box; the tab segments now meet E-SEG (60 tall, 2 px apart; re-run pending in the final check).glass.py pad-bfs --route /library/app/620980with the flags vs--stock: entry focus Play (P-22); 0 irreversible; the unreached set equals stock's (laser-only arrows, the stats tooltip source, the private badge, Post before typing, Load More, text-only event cards) plus one large event card the BFS did not reach in its budget; a direct walk (L.gpTakeon the first event card, Down ×7, flags on) reaches the major-update cards, so traversal is intact.- Native check (P7 is complete):
glass.py native-session --pre "L.nav('/library/app/620980')" --step "sgcheck --route /library/app/620980 --flags wp.c5a,wp.c1a,wp.p3" --step "sgcheck ... --pre <outer scroller to its end>" --step "hv c5a_native_gp --look --flags ..."(10:49): title state 0 pops on main (PLAN-5a-1: nothing pops over the art whileoverArtPopsis off), overall PASS; details state 3 pops at +10 mm (pinned track + two arrows), depths {0, 10}, overall PASS (G-DEPTH clean).hvlook viewed: the game page as one window over the room, hero, cluster and segmented row, no doubled edge; G-HV verdict withheld (auto rect, exit 3 as documented); the frame was deleted on both machines at once (hvremoves the Frame copy; the local look folder deleted by hand,hv --clean). Native session returned to CSS only by itself. - Follow-ups from the gate runs, fixed live: the arrows are two 64 px circles in 80 px targets (P-83: an icon-only half capsule failed the roundness rule); the stats block items are 60 px tall targets (P-80); the achievements stats block has no platter (GP §4.10; its fill drew a visible bottom edge); every wide-card
--lgs-raised-shadow(a full-width 1.5 px top line, OUTLINE ratio .93) is nownone; Properties'%{Detail}is 20 px and Steam's 0.67 px%{SectionTopLine}is transparent. - Properties gates (
/app/620980/properties/general, pad and laser): SIZE, TYPE, OUTLINE, MOTION PASS; AUD: one SHRUNK onDialogContent_InnerWidth, a non-interactive focus-scope Panel (952 → 832 wide) because the sidebar is SET's 400 px; its rows keep 80 px heights and every control is present and clickable (explained, not a function loss). Two text boxes are narrower but taller (bigger type next to C4a's wider value capsule).
2026-10-07, session 2: M0 conformance note (PLAN §1 decides; no mockup re-renders, expedited mode)
Start-of-session request check: four requests to C5a (C1a ×2, C1c, C4a), handled below.
| # | GP said | PLAN §1 / request decides | Built as |
|---|---|---|---|
| C5a-D1 | Focus = + white .14 | §1.4: + --lgs-focus-add (.32) through P4's --lgs-ill hook; no ring anywhere (VP P-42) |
every phase 1 --lgs-focus-ring / --lgs-focus-outline use replaced by hooks |
| C5a-D2 | Play label white | REQ C4a->C5a, CTL C-D21: --lgs-text-on-color (#0d0e12) on green; white only on blue (Install/Update) |
T1 |
| C5a-D3 | Cluster over art +10/+15, tabs pinned +20, menus +30, alerts +30, tooltips owner+5 | §1.7 default profile: cluster and tab row over art 0 until G2 + AT-HV-OFFAXIS (then +10, flag overArtPops); pinned tabs +10 (wearer +20); focused content cards +15; menus +10 (C1c); destructive alerts ("Exit game?") 0; tooltips CSS shadow only |
theme/layers/50-gamepage.json |
| C5a-D4 | Toolbar row 108 | C1a settled lgs-hdr-40 (CQ1): Back at (24, 24), search capsule; pinned tab row at y 116 stays GP's (it clears the 84 px toolbar controls) |
T1 geometry |
| C5a-D5 | Title → details trigger on Steam's Pinned |
Probed on build 11094443: %{GamepadTabbedPage>Pinned} is set at rest and %{ScrolledDown} never toggles on the outer scroller, so T1 cannot see the state; T2 sets `data-lgs-gp="title" |
"details"from the outer scroller (state, not scroll-linked) and C1a'sglassMode('app')hook returnshero/window` |
| C5a-D6 | Quiet legend on-room text | REQ C1a->C5a: C1a's dim band (quietBacking) is adopted; the mockups are not re-rendered this session (expedited); C1a draws the legend |
C1a's |
| C5a-D7 | Menus 72 rows, Cancel 60 | REQ C1c->C5a: C1c owns the slab (+10 mm, destructive by count, flat destructive alerts); GP's placement order adopted by C1c. Cancel stays 60 (PLAN R2-5, REQ Coordinator->C5a: C1c's 56 superseded); the GP mockups' Cancel is 60 since R2 fix 1 | C1c's |
| C5a-D8 | Page roots under the toolbar | REQ C1a->C5a: hero stays full-bleed; Properties and achievements roots get padding-top: var(--lgs-hdr-pad, 68px) |
T1 |
| C5a-D9 | Hero column at x 40 (GP rev 2 §3.2, §4.1, AT-GEO) | VP P-29 (must): Play's centre within 400 px of the window centre; at x 40 it was 180 (460 off). The revision 3 mockups already drew x 104 | R2 fix 1: logo, chip, stats, cluster and tab row at x 104 (--gp-col), tab content keeps 40; GP §3.2 / §3.3 / §4.1 / AT-GEO updated (revision 3 note) |
| C5a-D10 | Achievement rows min-height 96, "not virtualised" (GP §4.10) | Measured: Steam places every row absolutely (inline height 80 at an 88 px pitch, Global 68 at 76) and windows the list to its viewport; 96 px rows overlapped the next row | R2 fix 1: rows keep Steam's slots; SM-D17's 1136 px column (P-81); the tab page calc(100vh − 96px) pins the track at y 116; GP §4.10 updated |
| C5a-D11 | Private badge overlapping the gear's top right by a third (GP §3.2) | P-08 / P-80 for the badge (REQ C5b->C5a) and Manage's own target: an overlap is a dead zone in Manage (the badge has no handler) | R2 fix 1: 30 px disc beside the gear's top right, inside its own 80 px round hover target, 1 px clear of Manage |
| C5a-D12 | Properties pages "as Settings" (GP §4.11), built for General only | G-SIZE / G-TYPE / G-OUTLINE / AUD on every page (R2 lead) | R2 fix 1: Betas, DLC, Controller, Privacy, Compatibility, Updates, Installed Files, Game Recording, Performance restyled (80 px rows and targets, Callout descriptions, no 1 px rules) |
2026-10-07, session 1: M0 conformance
- Start-of-session request check:
grep -n "REQ [A-Za-z0-9]*->C5a:" docs/phase2/wp/*.md→ no matches (no requests to C5a). - No device steps this session: M0 is documents and mockups only (PLAN §2.1). The device was not touched.
2026-10-07, session 2: build and verification (build 11094443)
Coordinator message vs the user's request (recorded as received). Mid-session the coordinator wrote: do not run glass.py native-session or any native-mode test this session (P7's scene-graph fix has priority on the native lock); write the fragments; record "deferred to V1: P7 fix in progress". The user's own request relayed for this run was "still do native glass work", and the harness says that request wins where they conflict. Resolution: the native fragments and native CSS are written (below), and the one native check is run through native-session, which waits on /tmp/lgs/native.lock (flock, up to 30 min), so P7 keeps priority: the check only starts once P7 releases the lock. If the lock is not free in time, the check is recorded as deferred to V1.
T1 (theme/50-appdetails.css, draft theme/_wip/50-appdetails.css; phase 1 copy kept only in the session scratchpad). Sections 1-5b rewritten: page surface clear; hero 656 px (--header-height and the art), dimming layer on %{HeaderBackgroundImage}::after (--lgs-gp-dimT/L/B, T1 .45/.65/.65), logo box (40, 108) 560 × 124, VR chip (40, 244) 36 tall; play row overlapping the art by 208 px (scroll range stays 432, measured: 1152 − 720); stats block out of the row (60 px tall tooltip target); Play 280 × 80 (green with --lgs-text-on-color, blue with white), Steam's shine sweep replaced by a static inner glow; 80 px clear circles for Play-from (display glyph on its free ::before, Steam's caret as a 28 px badge), Stop (red fill on focus/hover), Steam Input (194 px labelled capsule with T2) and Manage (white while its menu is open); tab track 64 px with contiguous 60 px segments (E-SEG), paired 80 × 80 arrows after it (flex order, the D-pad never reaches them); tab page from y 96 when pinned, content padding 128 so focus stays under the pinned row; type pass on every tab page (≥ 18 px, ≥ 500, title case). Sections 6-11 kept, every phase 1 ring (--lgs-focus-ring, --lgs-focus-outline, --lgs-glass-rim, --lgs-control-rim) replaced (fields: --lgs-field-focus; others: the selection arc / white glow; VP P-42). Achievements (§12): header from y 108, Title 2, title-case stats, 12 px progress capsule, rows ≥ 96, My/Global as a recessed 64 px track with paired arrows (GP §4.10's single-column fallback; the 400 px grid sidebar is not built). Properties (§13): C6a's skeleton scoped to %{AppProperties} (400 px sidebar, 72 px nav rows on P4's nav hook, the game's name as Title 2 beside Back in the toolbar row, pane from y 116). §14 native rules. python docs/phase2/fontkit.py --hooks run (hosts up to date); check-theme PASS.
T2 (device/rt/50-gamepage.js, flag wp.c5a, draft device/rt/_wip/). State data-lgs-gp="title|details" from the outer scroller's end (Steam's Pinned class is set at rest on this build, ScrolledDown never toggles: probed), sticky art + cross-fade to Steam's library_hero_blur.jpg at .40 / brightness .55, play row fades and takes no clicks while pinned (stock hides it under its 40 px header), C1a glassMode('app') hero ↔ window (live: data-lgs-glass="window" in details), adaptive dimming (one 160 × 82 canvas per hero URL, 4.5:1 / 3:1 solve), Steam Input label from #AppControllerConfiguration_SteamInput, data-lgs-tip="above" + data-lgs-tip-pad="now" on Play-from / Stop / Manage (P3 draws them), the inline title (appStore display name; leading after Back while C1a's search is a capsule), data-lgs-gp-jump arrival (700 ms), E-SEG tags. Removal clears every attribute, style property and the title node.
Native fragments. theme/layers/50-gamepage.json (flag wp.c5a): supersedes legacy play and app-button; pinned track and arrows +10 mm liquid slab (wearer +15 interactive); attended content cards (DLC tiles, community items, collection tiles, event cards) +15 mm; over-art cluster and tab row behind the separate flag overArtPops (off) with slab: "none" and hole: {fill: "auto"}, so they stay at 0 until G2 + AT-HV-OFFAXIS (PLAN-5a-1). No plates (game routes are window / hero covers), no popup or sg fragments (menus are C1c's).
Shots (viewed, compared by eye with p2_game-pages_title.png, _yourstuff.png, _achievements.png, _properties.png): shots/p2_c5a_title_t2.png (cluster, labelled Steam Input, segmented track and paired arrows on the art; matches the mockup's layout; the live hero is darker so the T2 dims sit near their floor), p2_c5a_details_t2.png (pinned track at y 116 over the blurred art backdrop, content below), p2_c5a_ach_t1.png, p2_c5a_props_t1.png. Known differences from the mockups: no synopsis line (GQ12 source not built), Steam Cloud chip not moved, the achievements page keeps Steam's single column (GP's fallback).
pad-bfs /library/app/620980 with wp.c5a,wp.c1a,wp.p3 (10:35): entry focus Play; Play → Right Play-from → Steam Input (Configure Controller) → Manage, Down → tabs, Up → toolbar search; every reversible edge identical to the stock run (--stock, same command): the first 8 nodes' edges match one for one, B effect identical, 0 irreversible in both. Unreached in both: the tab arrows (laser only, by design), the stats tooltip source, the private badge, Post, "Load More Activity" and late feed items (lazy-loaded; the stock run hit its budget and reached more of the feed, not a different path).