Files

33 KiB
Raw Permalink Blame History

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.html PASS (20:07: every mapped element within 3.3 px). G-PAD pad-bfs (20:01): entry Play, 0 irreversible, unreached = the lazy feed's tail (as R2's run). Native (native-session, 19:40): sgcheck title 0 pops, details 3 pops at +10 mm, achievements 0, all PASS; hv look: one window, no doubled edge; the frame deleted on both machines. R2-10 (window on 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.css Cancel 60 with three menu mockups re-rendered; game-pages.js data-ids and wp/C5a-cmp.json for G-MOCK.
  • Device left: theme on, CSS only; no C5a flag in /tmp/lgs/flags.json (it holds another agent's live step's wp.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/updates in 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 :hover and .lgs-dwell, carries data-lgs-tip="above" and aria-label="Manage", no title; __LGS_RT.tooltip.state() at +1.3 s and +2.4 s reads shown: [], count: 0 while mapTooltips: 1 (vrPooledPopupStore.m_mapTooltips holds Steam's own tooltip for the gear); no .lgs-tip node 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 pad data-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-color on 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 in wp/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 with overflow: 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-height 80; L.gates.hitStats over 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 px L.gates.hitStats over 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; r2fx diagnostic: 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 now calc(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 .cancel is 60 tall, ≥ 192 wide; game-pages-manage, -manage-sub, -playfrom re-rendered with tools/mockshot.py and viewed.
  • Mockup builder. game-pages.js tags the cluster slots, tab capsule, logo box, chip and each stat with data-id (no visual change) for glass.py cmp; wp/C5a-cmp.json maps 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 (draft theme/_wip/50-appdetails.css): §1-§4 rewritten for phase 2. Hero 656 (--header-height), art object-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, #0d0e12 label; blue with white for Install/Update), Play-from 80 circle with a display glyph on its free ::before and Steam's caret as a 28 px badge, Steam Input / Manage 80 circles (clear glass + P4 raised hook + clear edge), 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-height of the Game Info tab lifted; arrows paired after the track (flex order, laser only) as 80 × 80 targets with 64 visible. Tab page calc(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's library_hero_blur.jpg at .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-arrive on 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: clip on 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 (flag wp.c5a; draft device/rt/_wip/): state data-lgs-gp, C1a glassMode('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 (flag wp.c5a): supersedes legacy play, app-button; pinned tab track and arrows +10 (wearer +15 interactive); focused content cards +15 attended; over-art cluster / tabs behind overArtPops (off) with hole: {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 (searchCircle off), 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/620980 with 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.gpTake on 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 while overArtPops is off), overall PASS; details state 3 pops at +10 mm (pinned track + two arrows), depths {0, 10}, overall PASS (G-DEPTH clean). hv look 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 (hv removes 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 now none; 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 on DialogContent_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).