Files

38 KiB
Raw Permalink Blame History

P6 Compositor, Steam side: evidence log

Status

Maintenance session 4 (2026-10-07 12:55-14:25 EDT, platform maintainer; build 11094443): REQ C4b->P6 done (surface scaleFrom in the report, §3.1, §6) and, for REQ C2a->P8 #17, a reporter defect fixed: explicit data-lgs-mosaic bands were reported also when the surface had a cover (window / window-full / hero, or Phase 1's cover), against contract §2.3, which drew the window glass with only the bands' content on it; bands now only without a cover shape. Installed (device/lgs_layers.js sha1 ca65765f… = tree, 13:43). Tests on the Frame: RP-MO (new) PASS 7/7, RP-1 PASS (4 states, byte-identical with Phase 1, run with --flags wp.c1a=false because a session override keeps C1a's T2 on), RP-2 PASS (20 plates; checks now ignore live area plates such as C1a's ornament), RP-X PASS 18/18 (its mosaic check now expects no bands in window mode, per §2.3). The harness p6test.py gained rpmo and step options (--flags); the RAM copy in /tmp/lgs/p6/ has them, frag/00-base.json refreshed to the tree's. Open REQs to P6: none (grep 14:20).

Maintenance session (2026-10-07 10:45-, platform maintainer): REQ C3b->P6 done: 00-base.json main.modal also matches .lgs-cc (CC-M's root), so rule 6 drops every other area pop on main while Control Center is open; installed on the Frame; RP-CC PASS (11 checks, 11:08, row below); contract reporter.md §4 and §11. Open REQs to P6: none (grep 11:20). Also checked for C2a's #17 (native Home): the reporter's Home report is as C2a describes (windowless, shapes: [], plates, 4 mosaic bands); the downstream look is P8's row in wp/P8.md.

Review R1 fixed (2026-10-07 09:27, Steam build 11094443; review wp/P6-review-R1.md): both majors and all ten minors are fixed or answered, and every affected test passes again on the Frame (R1 rows in Evidence: RP-1, RP-3/4/5, RP-6, RP-7 (20 checks, new cases C and D), RP-8 (10 checks, computed-paint audit on three routes), RP-X, RP-RV (new, 9 checks), cost in both injection orders). REQ P9->P6 (hole.fill: "auto") and REQ P1->P6 (shared index, no leaked webpack record) done. Disposition of each finding: § Review R1 below. Complete stands.

M1 reached (2026-10-07): contract docs/phase2/contracts/reporter.md; stubs load and are inert until enabled.

M3 reached (2026-10-07 06:15) and complete (2026-10-07 06:25): every build of the card is in the tree and every acceptance test passes on the Frame: RP-1 to RP-8, plus RP-X (the remaining builds: owns, supersedes (also flag-gated), fragment and surface flags, hole/tint/slab/from/sink/exclude/flag, explicit mosaic, occluder, 32-plate cap, rule 7, window request) and a cost check (Evidence below). G-REMOVE (P6 part) clean after a native session. M4 (fragments in native) belongs to the areas; P6 has no area fragment of its own.

What is in the tree:

  • Reporter v3 (device/lgs_layers.js): fragment merge (owns, supersedes (plain or while a flag is on), fragment flag, surface flag), glass modes from data-lgs-glass, plates (data-lgs-plate*), mosaic bands, admission rules 0-7 (profile, covered, click-safe cap snapped to {10, 15, 25} mm, media, destructive, containers only, modal/scroll, 4 depths), lifts by input mode (.gpfocus / .lgs-dwell:hover), hole, tint, slab: "none" (data-lgs-noslab), from/sink, coverDz, window {dim, recede}, v3 acks (both call forms), snapshot/debug/rules. A real stop() leaves no __LGS* global (REQ P1->P6). Phase 1's layers.json object still works as the whole configuration.
  • theme/layers/00-base.json: main (modes, modal), bar, barpopup, frame.menu, floatingfooter, and C3a's notifications, volumelevel, tooltip behind "flag": "wp.c3a" (REQ C3a->P6). 99-legacy.json: Phase 1's 14 rules, admission off. theme/layers.json is kept unchanged as P8's fallback until 99-legacy.json is retired (coordinator note; PLAN §6 release step 7).
  • device/rt/08-popups.js (module popups, flag wp.p6, off until an area ships a popup fragment that changes something): wraps SendPendingInstanceParamsToSteamVR / CreatePooledPopup (own properties), per-host z/zMm/scale/set from theme/popups/*.json (rt.data('popups')), restored on removal and by TTL (runtime gone or theme off for 3 s); dead wrappers of an earlier runtime are skipped on restore; follows entry flags (rt.flags.onAny) and geom (rt.bridge.on) on popups already shown (R1); TTL poll through rt.setInterval; API returned from install and exposed as __LGS_RT.popups (no global); apply(list) test hook. theme/popups/00-base.json: the six host names, no changes.
  • theme/05-native.css: Phase 1 rules kept for the legacy pops, updated in R1 to today's area paints (main cover ::after sheen off; footer capsule's literal tint → scrim and its host's E3 arc off; Back and tab-arrow raised fill → scrim, highlight off; Home arrows' literal highlight off; Play and the game-page menu button: control rim and sheen off, tint kept); Phase 2 section: main cover zeroes --lgs-mat-window-* and --lgs-edge; other covers zero the card's material tokens; acked plates drop fill, shadow, blur, edge and every material token (REQ C1c->P6); pops (not data-lgs-noslab) zero material tokens and edge, keep their blur; hosts of popped ::before/::after parts lose their --lgs-edge (R1).
  • Reporter R1 additions: duplicate ids as flag-aware fallbacks, rule-level admission: false ignored with an error, rule 2 over every focusable a click in the crop reaches, rule 7 over legacy layers too, hole.fill: "auto" → hole.edges and literal edges (contract §3.1-§3.5, §4).

Test harness (not in the repo; P6 owns no tools path): p6test.py (rp1, rp2, rp345, rp6, rp7 + rp7check, rpx, rprv, rpperf [--v3first]) and rp8.js, run on the Frame from /tmp/lgs/p6/ with copies of the files under test (/tmp/lgs is RAM: re-create after a reboot; the PC copy is in the session scratchpad, also lost). Pattern, so another agent can rebuild it: install test reporters under __LGS_LAYERS_T* with attrPrefix: "data-lgst" and no binding (Phase 1's reporter from b8fea9a with its globals renamed __LGS_LAYERS_P1*), fixtures in a #lgs-p6-fix container (rule targets pointer-events:auto since R1, so Steam's focusables under them are not counted by rule 2's hit test; the rest none), lab.Lock() (and both=True for systemui reads), flags through __LGS_RT.test.flags.push/pop, input modes through __LGS_RT.test.input.set, cleanup in finally. RP-7's TTL cases load 08-popups.js under a proxy window whose __LGS_RT is a stand-in runtime (define captures the module, data('popups'), a bridge with geom). RP-8 reads window.__LGS_LAYERS afresh each time (P8 re-injects the reporter when anyone syncs a fragment).

Remaining: nothing in the card. Follow-ups for later rounds: delete theme/layers.json and 99-legacy.json when the areas have superseded every legacy rule (who retires which id: contract §3.5); turn wp.p6 on in defaults.json (V1) once an area's popup fragment needs it; when C1a/C2a answer REQ P6->C1a / P6->C2a, drop the matching literal overrides in 05-native.css §1-§3. Open REQs to P6: none (checked 09:23; REQ P9->P6 and REQ P1->P6 done this session). Unverifiable without a wearer: the frame menu's only_visible_with_laser effect (RP-7 proves the request only, PLAUSIBLE: systemui reports the panel property false in every state). Integration with the areas runs live since R1 (p6test.py rpint 09:12 with wp.c1a, wp.c2a, wp.p3 on: Home windowless with 17 plates, 4 automatic mosaic bands and the focused disc popped at 15 mm over its occluder plate; AllGames in window mode with C1a's ornament plate and no legacy footer pop; no errors).

Requests

  • REQ P6->P8: In inject_reporter, read theme/layers/*.json in name order (skip _wip/; each parsed object with "file": "<name>" added) and pass the list as layers in __LGS_LAYERS_OPTS; fall back to theme/layers.json when the folder is missing; re-inject when any fragment changes. The reporter accepts both forms (contract reporter.md §3.1, §9). Pass the report's profile on, and the new layer fields from, sink to the spec (P7), surface coverDz, top-level window (P7 window {dim, recede}).

    • P8 (2026-10-07 04:28): done. layers = theme/layers/*.json in name order with file (fallback theme/layers.json), re-injected when lgs_layers.js, a fragment or the profile changes; opts carry profile and geom {S, r}; v3 acks {key: {cover, pops, plates}} when status().v >= 3; plates, mosaic, hole, tint, slab material (none only with the cap), interactive, from, sink, surface coverDz, dim and top-level window passed to glassd.json / the spec (daemon contract §7-9). Live check waits for your reporter v3.
  • REQ P6->P1: Pass theme/popups/*.json (name order, skip _wip/, each with "file") to the runtime as data that modules can read, e.g. rt.data('popups') returning the list (contract reporter.md §5.2). device/rt/08-popups.js reads rt.data('popups'), then rt.data.popups, then window.__LGS_POPUPS.

    • P1 (2026-10-07): done: rt.data('popups') (a copy) and rt.data.popups: every visible theme/popups/*.json in name order with "file" added; invalid JSON is left out and listed in rt.status().failedLoads. contracts/runtime.md §3.1.
  • REQ P6->C2a: FYI, no action needed unless you want it: your 41-home.json note says a fragment-level supersedes is not flag-gated. It is now: give the fragment a top-level "flag": "wp.c2a" (or write entries as {"id": "card", "flag": "wp.c2a"}) and the legacy rules you list (tabs, tab-arrow, card on Home) drop only while wp.c2a is on (contract reporter.md §3.1, tested in RP-X). Mark this done or answer here.

    • C2a (2026-10-07 06:42): thanks; 41-home.json now has the top-level "flag": "wp.c2a". The supersedes list waits for M4: card and tabs also serve the library routes, so the ids are chosen together with C2c's 40-library.json.
  • REQ P6->C1a: paint the window's top sheen (%{BasicUiRoot}::after, white .08 → 0), the bottom ornament capsule (#Footer::after, white .12 → .03 over a dark tint) and the Back capsule (--lgs-raised-bg/-shadow) through the --lgs-mat-window-* / --lgs-mat-liquid-* tokens, or key your own native rules on [data-lgs-cover] / [data-lgs-pop~="after"] / [data-lgs-pop~="before"]. Why: literal colours are not reached by 05-native.css §4, so in native mode the CSS sheen, tint and E3 arc sat on top of glassd's glass (review R1 M1, doubled edge). Until then 05-native.css overrides those three paints itself (§1, §2: background none / scrim), so nothing breaks; if you change these selectors or move the ornament to a plate with data-lgs-nopop (contract §2.1, §3.5), tell P6 so the overrides follow.

    • C1a answer (2026-10-07, R2 fix pass): the ornament is now a plate, as you asked to be told: T2 node #Footer > .lgs-orn-plate (data-lgs-nopop always, data-lgs-plate="liquid" + id shell-ornament only as a capsule); once it is acked, 20-shell.css §4c drops #Footer::after's paint and its E3 hook itself. On windowless routes Back and the search field are plates (shell-back, shell-search) painted through --lgs-mat-plate-bg, which your ack rule clears. The window's top sheen (%{BasicUiRoot}::after) stays literal; your l. 51 rule drops it under the cover. Your stopgaps keyed on the legacy footer / hdr-back pops only matter with wp.c1a off (the fragment supersedes those pops).
  • REQ P6->C2a: Home's tab-row arrows (41-home.css about lines 337 and 352) draw their top highlight with a literal inset 0 1.5px 1.5px -1px rgb(255 255 255 / .22) (also !important under hover and focus). Please paint it through --lgs-raised-shadow (as the library arrows do) or key a native rule on [data-lgs-pop~="self"]. Why: popped (legacy tab-arrow) in native mode it is a second edge inside glassd's crescent (RP-8 R1 paint audit); 05-native.css §3 now sets box-shadow: none !important on popped Home arrows as a stopgap, so tell P6 if you change that selector.

    • C2a (2026-10-07, R2 fix pass): done. Both arrow rules (rest, and hover/focus with !important) now paint var(--lgs-raised-shadow); no literal inset is left in 41-home.css. Also, 41-home.json now supersedes the legacy tab-arrow (and card) behind wp.c2a, so with wp.c2a on the Home arrows are not popped at all and your 05-native.css §3 stopgap for popped Home arrows no longer applies there (keep or drop it as you like; it still covers wp.c2a off). Native session 20:00: sgcheck on What's New PASS in both modes.
  • REQ P6->P7: restrict the base mosaic to the report's mosaic bands when present; make a pop's panel interactive only when the layer says interactive: true; place plates with the cover (same panel and coverDz). (Contract §10; filed late, review R1 m10.) P6 (2026-10-07 08:40): closed after reading lgs_sg.js (mosaic bands in mosaic(), interactive only in the wearer profile with the layer's interactive: true, plates and cover at coverDz): nothing open; P7 may reopen.

Review R1

Finding Disposition Evidence
M1 native mode keeps CSS glass on acked elements painted with literals Fixed. 05-native.css: hosts of popped ::before/::after lose --lgs-edge (generic, §4), plus an id-specific rule for #Footer (C1a sets its edge with an id selector, which outweighs the generic rule: found by the new audit); main cover ::after background: none; #Footer::after literal tint → scrim; Back and tab arrows: --lgs-raised-bg → scrim, --lgs-raised-shadow off; Home arrows' literal highlight off; Play / menu button --lgs-control-rim and --lgs-panel-sheen off (the audit found these on the game page and Home). REQ P6->C1a and P6->C2a filed. RP-8 extended with a computed-paint audit of every tagged element on AllGames, a game page and Home RP-8 R1 (09:00): paintClean true; footer --lgs-edge none, ::before none, ::after scrim; native shot footer edge pixel (960, 942) rgb(19, 10, 6) α 123 (was 199, 200, 199 α 196)
M2 wrapper ignores flag and geometry changes on shown popups Fixed. install subscribes rt.flags.onAny (re-send when an entry's flag is among the changed names) and rt.bridge.on('geom') (re-send when S or r changed and a zMm entry exists); resendLive(true) re-sends only popups an entry matches or matched. apply() also uses it RP-7 R1 checks flagEntryWaits, flagOnApplies (z 0.07 in the request and systemui 0.0700 within 0.6 s), flagOffRestores (z_pixels 60, systemui 0.09185), zMmFollowsGeom
m1 RP-6 pad half flaky Fixed in the harness: a D-pad move puts focus on the grid first, the measured move goes right, the state is polled up to 1.2 s and must lift the focused poster RP-6 R1: lift at 0.12 s on the focused poster
m2 cost claim depends on run order Agreed, reworded: same cost as Phase 1. Four runs alternating the order: whoever runs first pays the flush Cost R1 row
m3 no map from legacy ids to areas Done: contract §3.5 (id, what it pops, who retires it, and how shared ids retire) contracts/reporter.md §3.5
m4 rule 7 counts only admission pops Fixed: every kept layer counts; depths only legacy layers use are marked (legacy) RP-RV rule7Legacy, RP-X rule7Default (now 5 distinct depths … 0.012 (legacy) …)
m5 duplicate ids ignore flags Fixed: a later rule with a taken id is kept as a fallback when every earlier one is conditional (flag, fragment flag, flagged supersede, profile), and applies only while none of them is live; an unconditional duplicate is still skipped with an error RP-RV dupFallbackRules, dupFlagOff, dupFlagOn, dupUnconditional
m6 rule-level admission: false bypass Fixed: ignored outside an admission-off fragment, named in errors RP-RV admissionFalseIgnored (the rule is then dropped by rule 2, s = 40)
m7 rule 2 counts only focusables inside Fixed: every focusable that intersects the crop by ≥ 8 × 8 counts: the element, descendants, ancestors, and other elements where a click at the middle of their part of the crop reaches them (hit test; one hidden under the popped element is not a target) RP-RV rule2Neighbour (outset over a 40 px neighbour: dropped s=40; same without outset: kept at 15 mm); RP-3 still 10 mm capped
m8 RP-7 frame-menu check reads back the request Agreed: the frame-menu flag's effect is PLAUSIBLE (needs a wearer); systemui reports only-visible-with-laser false in every state again (sgPre, sgApplied). zMm/space is now exercised live RP-7 R1 zMmMain (zMm 20, space main, S .369, r .8 → 0.06775 in request and systemui), zMmFollowsGeom (r → 1: 0.0542)
m9 runtime-contract hygiene Fixed: rt.setInterval for the TTL (window timer only without a runtime), API via rt.expose('popups') / rt.use('popups') (no __LGS_POPUPS_API), nothing defined at load time without a runtime (MOD.test for stand-in runtimes), restored() drops an offset Steam never sent RP-7 R1 noGlobal, installedWrapped (through __LGS_RT.popups), TTL cases through a stand-in runtime
m10 log precision Fixed: R0 times below corrected to the result files' mtimes; P7 request filed (closed: lgs_sg.js already does it); the C1c REQ answer shortened to one line; RP-5's media case stays a <video> fixture (disclosed) this file

Evidence

Steam build 11094443 for every row (PLAN §7 rule 7; same build as P10's rows of the same hour). Result files on the Frame in /tmp/lgs/p6/ (RAM, gone at reboot; no camera data, no names).

Test Command Result JSON Date
S4 RP-MO (new: REQ C2a->P8 #17, REQ C4b->P6) cd /tmp/lgs/p6 && python3 -B p6test.py rpmo --out rpmo.json (lab lock; /library/tab/AllGames; reporter under __LGS_LAYERS_T2/T3/T4 with 00-base + 99-legacy, plus an owner fragment "scaleFrom": "overlay" (T3) and one with "sideways" (T4); fixture: 6 capsule plates in two rows and two data-lgs-mosaic bands; data-lgs-glass set to none, window, window-full, hero, windowless, then the bands removed) PASS 7/7: with a cover (window, window-full, hero, and no attribute) mosaic absent; windowless gives the two explicit bands {0, 294, 1920, 192}, {0, 624, 1920, 192}; without the band elements the automatic bands ({148, 298, 784, 184}, {1048, 628, 784, 184}, plus one for C1a's live ornament plate); scaleFrom "overlay" from the owner, absent by default, "sideways" refused with main.scaleFrom: "main" or "overlay" in errors; cleanup: fixture removed, glass restored. (First run 13:23 failed only on the test's own count of automatic bands: C1a's live ornament plate adds one; expectation fixed) rpmo.json 2026-10-07 13:24
S4 RP-1 re-run p6test.py rp1 --flags wp.c1a=false --out rp1.json (the harness now takes step options; RP-1 needs no area T2, and a session override in /tmp/lgs/flags.json keeps wp.c1a on) PASS: Home, AllGames, AllGames + D-pad, game page: sameFragments and sameLegacyObject true, no diff. (A 13:29 run without the flag failed on C1a's live data-lgs-glass and ornament plate, i.e. on the environment, not on the reporter) rp1.json 2026-10-07 13:43
S4 RP-2 re-run p6test.py rp2 --flags wp.c1a=false --out rp2.json (plate checks count only the fixture's fx-* plates) PASS: 20 plates, materials and rects exact; window 1920 × 984 r 81, window-full 1920 × 1080; windowless shapes: [] and the 4 automatic bands rp2.json 2026-10-07 13:45
S4 RP-X re-run p6test.py rpx --out rpx.json (its mosaic check now expects no bands: the fixture sets window mode, which has a cover) PASS 18/18 rpx.json 2026-10-07 13:29
M RP-CC (REQ C3b->P6, new) python3 -B /tmp/lgs/maint/p6cc.py on the Frame (lab lock; on /library/tab/AllGames: reporter v3 under __LGS_LAYERS_T5 with the new 00-base.json and under __LGS_LAYERS_T6 with the old one, each with a test fragment (t-flat, 10 mm; t-modal, modal: true) and 99-legacy; fixtures pointer-events:none: two panel plates, t-flat on one of them, and a transparent 1280 × 720 div.lgs-cc standing in for CC-M's root; then data-lgs-glass set to windowless (CC-M's real state) and restored; route restored, fixtures and test globals removed and checked) PASS (11 checks): CC-M closed: t-flat pops; CC-M open: t-flat dropped rule6-modal in window and in windowless mode with the new base, kept by the old base in both (the bug); a menu-like modal: true rule still pops over CC-M; with CC-M open and windowless no legacy main pop (legacy rules are admission-off: "outside the cover"; in window mode the legacy hdr-back, footer, tab-arrow, card stay, recorded); t-flat back once CC-M closes; no error but rule 7's legacy depth warning; nothing left (0 marked elements, no test global). The first two runs: one tested nothing (a visible modal: true match counts as an open modal, so the fixture for it is now added only while CC-M is open), one waited out the lab lock (240 s) p6cc.out (scratchpad maint/) 2026-10-07 11:08
R1 RP-RV (new) p6test.py rprv (fragment 47-p6rv.json between 00-base and 99-legacy: card (legacy id) behind flag p6DupFlag, play (legacy id) unconditional, rv-adm with rule-level admission: false over 40 px buttons, rv-nb (decorative 100 px crop, outset 12 over a 40 px neighbour button) and rv-nb0 (no outset), rv-hole (hole: {fill: "auto", shadow: .3}, slab: none) over a 300 × 200 <img> (red left half, blue right) under a black 0 → .5 gradient, rv-edges with literal edges and one bad side; instances with p6DupFlag off and on; a D-pad move so legacy pops show) PASS (9 checks): fallback rules [47-p6rv off, 99-legacy on] / [on, off], the area card at the fixture only with the flag (legacy skipped "id taken by 47-p6rv.json (live)"), no duplicate error for card, main.play: duplicate id (99-legacy.json), skipped; rv-adm error and dropped rule2-click-safe s=40; rv-nb dropped s=40, rv-nb0 at 0.0407; rule 7 main: 5 distinct depths (max 4): 0, 0.012 (legacy), 0.015 (legacy), 0.0271, 0.0407; hole edges top [171,34,34 ×2, 34,34,171 ×2], bottom [130,26,26 ×2, 26,26,130 ×2] (the gradient deepens), left reddish and right bluish lists of 3, no fill; literal edges passed, right: 42 named in errors (08:28; again at 09:19 after REQ P1->P6) rprv.json 2026-10-07 09:19
R1 Integration (areas live) p6test.py rpint (lab lock; wp.c1a, wp.c2a, wp.p3 pushed through rt.test.flags for the step; reporter v3 under a test global with the live fragments 00-base, 20-shell, 21-search, 31-cc, 40-library, 41-home, 99-legacy; Home and AllGames, each at rest and after a D-pad move) Works with the areas' real DOM. Home: data-lgs-glass="windowless" → mode: windowless, no cover shape, 17 plates (C1a's Back, search, segmented control and What's New capsules; C2a's 13 discs, ids from data-lgs-plate-id), 4 mosaic bands built from the plate rows; after the move the focused disc pops as C2a's home-disc at 0.0407 (15 mm) and its plate (grown to 198 px with the focus scale) is occluder. AllGames: window mode, C1a's ornament as a plate (shell-ornament 920 × 126 r 63), legacy tab-arrow ×2 and card pops, no legacy footer (C1a supersedes it); errors empty on every state rpint.json 2026-10-07 09:12
R1 RP-1 p6test.py rp1 PASS: byte-identical surfaces with Phase 1 on the four states, both forms (08:33; again at 09:18 after REQ P1->P6) rp1.json 2026-10-07 09:18
R1 RP-3/4/5 p6test.py rp345 (fixture rule targets now hit-testable) PASS all three, values as before (t-cap 0.0271 capped, want 0.081; t-cap40 dropped s=40; t-int wearer 0.0678 interactive; destructive and media dropped). The first R1 run failed RP-3/4 (s = 32/34 from Steam's tab buttons under the pointer-events:none fixtures): that led to rule 2's hit test (m7 row). Passed again at 09:18 after REQ P1->P6 rp345.json 2026-10-07 09:18
R1 RP-X p6test.py rpx PASS (18 checks). 08:31: rule7Default gave main: 5 distinct depths (max 4): 0, 0.012 (legacy), 0.0271, 0.0407, 0.0678 (the four area depths alone pass; the legacy tab-arrow makes five). 09:19 run failed only because C1a's new header layout put the tab arrows under two hit-testable fixtures (legacy tab-arrow: covered); the check now reads the rule's debug trace (evaluated with p6TestFlag off, "superseded while p6TestFlag is on" with it on) and expects the rule 7 warning only when the legacy arrows show; 09:22 PASS rpx.json 2026-10-07 09:22
R1 RP-6 p6test.py rp6 (pad half: focus to the grid with one move, then the measured move right, state polled ≤ 1.2 s) PASS: pad lift on the focused poster at 0.12 s; laser lift after dwell; sweep 19 samples, 0 lifts, 0 early dwell; rest lift (dz 0.0407) rp6.json 2026-10-07 08:31
R1 RP-7 p6test.py rp7 (A as before through __LGS_RT.popups; (C) apply([00-base, {p6flag: z 0.07, flag p6RevFlag}]) while the test popup stays shown, then p6RevFlag pushed and popped through rt.test.flags; (D) the TTL "runtime gone" copy runs a zMm: 20, space: main entry under a stand-in runtime with geom S .369 r .8, then geom r 1 through its bridge listener) PASS (20 checks): (A) z 0.05 / scale 1.25 in the request and systemui (0.0500, mpp ×1.25), frame-menu request flag false then restored (effect PLAUSIBLE, m8); (C) entry off: request untouched (z_pixels 60) and the frame menu restored since its entry left the config; flag on: z_meters 0.07, systemui 0.0700 within 0.6 s (flagResends 1); flag off: z_pixels 60, systemui 0.09185 within 0.6 s; (D) 0.06775 in the request and systemui, then 0.0542 after the geom change (geomResends 1); TTL restored both cases; no __LGS_POPUPS* global at any step; host pools unchanged rp7.json 2026-10-07 08:31
R1 RP-8 python glass.py native-session --step "eval SharedJSContext @/tmp/lgs/p6/rp8.js" --step "js \"(async () => JSON.stringify(await __LGS_P6_RP8()))()\"" --step "eval SharedJSContext \"delete window.__LGS_P6_RP8; 1\"" (real glassd; fragments live then: 00-base, 20-shell, 21-search, 31-cc, 41-home, 99-legacy; paint audit after acks and settled transitions on AllGames, /library/app/735580, Home) PASS (10 checks): the 8 earlier checks (plates acked in 600 ms, fill transparent, shadow none; cover dropped incl. ::after none; tagged ≤ acked) plus paintClean (19 tagged elements on 3 routes: no E3 arc, light gradient, light inset edge or cover tint) and footerAudited. Notes only: the tab-row tracks keep a dark recessed inset shade (a control track, not glass). Earlier R1 runs failed and drove the fixes: 08:36 (footer arc: C1a's id selector; Play / menu-button control rim; Home arrows' raised fill), 08:46 (Home arrows' literal highlight), 08:55 (harness: a re-injected reporter). 09:25: PASS again (10 checks, 19 tagged elements, plates acked in 600 ms) with the final reporter (REQ P1->P6) and 40-library live stdout scratchpad/p6/rp8_r1e.txt, rp8_r1f.txt (not kept); shots shots/p2_p6_r1_native_{allgames,app,home}.png (08:46) 2026-10-07 09:00, 09:25
R1 native look the 08:46 shots composited over a glass tone rgb(62 66 78), next to the reviewer's p2_p6_rev_native_allgames.png The footer capsule's white top line and E3 marks are gone: pixel (960, 942) rgb(19, 10, 6) α 123 (was 199, 200, 199 α 196); the capsule is a frosted scrim over which glassd draws the glass; Back is a scrim capsule; the window shows no CSS sheen. Overlaps in the AllGames header and an "Alphabetical / Filter" row over the ornament come from area CSS in progress (also in CSS-only mode), not P6 shots/p2_p6_r1_native_allgames.png 2026-10-07 08:50
R1 Cost p6test.py rpperf ×2 and p6test.py rpperf --v3first ×2 (live fragments incl. the areas' 20-shell, 21-search, 31-cc, 41-home, then 40-library) Same cost as Phase 1. Phase 1 first: v3 2.23 / 2.42 ms against Phase 1 4.12 / 3.29 ms; v3 first: v3 2.75 / 3.36 ms against Phase 1 2.11 / 1.88 ms. Mean of the four: v3 2.69 ms, Phase 1 2.85 ms per sample; snapshot() 0.70-0.78 ms both rpperf_{a,b,c,d}.json 2026-10-07 09:02-09:08
R1 G-REMOVE (P6 part) python glass.py js after the 09:00 native session PASS for P6: no __LGS_POPUPS* or __LGS_P6* global, no __LGS_RT.popups (module off), no own method on vrPooledPopupStore, no fixture or data-lgst-* attribute, no test flag left. Native-mode attributes and __LGS_LAYERS were present because another agent's native session started at 09:00:37 (/dev/shm/lgs/shell.json). After the 09:25 session: no __LGS_LAYERS*/__LGS_POPUPS*/__LGS_P6* global, no data-lgs-cover/-pop/-plate-ack/-noslab or data-lgst-* attribute and no lgs-native on any window, no own method on the store, no test flag; theme on (CSS only) stdout 2026-10-07 09:01, 09:26
RP-1 cd /tmp/lgs/p6 && python3 p6test.py rp1 --out rp1.json (one lab lock: Phase 1's reporter from b8fea9a as __LGS_LAYERS_P1 with theme/layers.json; reporter v3 as __LGS_LAYERS_T2 with [00-base.json, 99-legacy.json] and as __LGS_LAYERS_T3 with the Phase 1 object; snapshot().surfaces compared as JSON text) PASS: byte-identical surfaces on /library/home, /library/tab/AllGames, AllGames after L.pad('down') (focused card) and /library/app/735580 (6 surfaces each; main pops e.g. hdr-back@0.015 tabs@0.012 tab-arrow card@0.008, game page play@0.02 app-button); v3, profile default, geom from P8's bridge {S: 0.369, r: 1}; no errors rp1.json 2026-10-07 05:57 (file overwritten by the 06:29 re-run)
RP-2 p6test.py rp2 (20 fixed div[data-lgs-plate] in main, 5 × 4 materials window/panel/liquid/thick, 200 × 110 CSS px, r 24; one with phase .5, materialize, tint, fill; then data-lgs-glass = window, window-full, windowless on %{BasicUiRoot}, restored) PASS: 20 plates, ids, materials and rects exact in texture px (e.g. fx-0-0 60, 60, 300 × 165, r 36); window mode cover 1920 × 984 r 81, window-full 1920 × 1080; windowless: shapes: [], 20 plates, 4 mosaic bands (one per row, +2 px) rp2.json 2026-10-07 05:58
RP-3 p6test.py rp345 (test fragment 50-p6test.json between 00-base and 99-legacy: t-cap dz 0.081 over five 72 px buttons, t-cap40 over 40 px buttons; geom S .369, r 1) PASS: t-cap reported dz 0.0271 (10 mm) with capped: true, want: 0.081; t-cap40 dropped rule2-click-safe s=40 cap=0.0208 rp345.json 2026-10-07 06:00
RP-4 same run (instances with profile default and wearer; and the real flag path __LGS_RT.test.flags.with({interactivePops: true})) PASS: default: every layer interactive: false; wearer: only t-int (interactive: true, wearer depth 25 mm = 0.0678, click-safe cap skipped) is interactive; legacy layers carry no interactive; flag path: profile default → wearer during → default after rp345.json 2026-10-07 06:00
RP-5 same run (Steam's own CONFIRM dialog with no-op handlers, then its OK button tagged data-lgs-destructive, both profiles; a <video> fixture under t-media; dialog closed, never confirmed) PASS: plain CONFIRM: only the modal rule pops (others rule6-modal); destructive: no pop in either profile (rule4-destructive); media: rule3-media. The media route case is the <video> mechanism (any video or [data-lgs-media]), not a real trailer route rp345.json 2026-10-07 06:00
RP-6 p6test.py rp6 (test rule t-card when: attended, 15 mm, on %{LibraryItemBox}; wp.p3 on for the step through rt.test.flags.push; rt.test.input.set('pad') + L.pad('down'); rt.test.input.set('laser') + CDP mouseMoved onto a poster for 350 ms; a CDP sweep over 5 posters at 45 ms each recorded in the page every 12 ms; pointer to (1400, 900) after) PASS: pad: card on the focused poster (dz 0.0407 = 15 mm); laser: card on the hovered poster after dwell (.lgs-dwell set); sweep: 14 samples, 0 lifts, 0 dwell under 80 ms; at rest on the last poster the card lifts rp6.json 2026-10-07 06:00
RP-7 p6test.py rp7 + p6test.py rp7check rp7.json (lab.lock + lab-vr.lock. (A) wp.p6 on through rt.test.flags.push; a test popup in the idle barpopup host by the SP E2 method (parent main, z 40 px, non-interactive); __LGS_POPUPS_API.apply([00-base, test fragment]): host p6test (contentSel #lgs-p6-orn, z 0.05, scale 1.25) and frame.menu (owns, set only_visible_with_laser: false); flag off. (B) TTL: a second copy of the module under a proxy window with a fake runtime, then the fake runtime replaced (runtime gone), then the fake theme off) PASS (13 checks): request z_meters 0.05, z_pixels 0, scale 1.25; systemui panel translation z 0.0500 (was 0.0919 = 60 px × Mp) and meters-per-pixel ×1.250; frame menu request only_visible_with_laser false; after removal no own methods on the store, Steam's request (z_pixels 60) and the scene graph back, frame-menu flag back; TTL restored both cases within 4.5 s; host pools identical before and after. Note: systemui's panel property only-visible-with-laser reads false for the frame menu even while Steam requests true, so the flag is checked on the request rp7.json 2026-10-07 06:03
RP-8 python glass.py native-session --step "eval SharedJSContext @/tmp/lgs/p6/rp8.js" --step "js \"<run __LGS_P6_RP8 once>\"" ×3 (lock retries) --step "eval SharedJSContext \"delete ...\"" (real glassd and daemon, reporter v3 injected by P8 with 00-base, 41-home, 99-legacy; on /library/tab/AllGames: two data-lgs-plate="panel" fixtures, one painted by a class rule (fill + shadow), one inline through --lgs-plate-bg) PASS (8 checks): native on main; reporter v3 in ack mode; both plates keep their CSS fill before the ack, acked after 600 ms ({cover: true, pops: [card, footer, hdr-back, tab-arrow], plates: [p6-rp8, p6-rp8b]}), then fill transparent and shadow none; main cover tagged and its background transparent (--lgs-mat-window-bg transparent, --lgs-edge none); tagged pops ≤ acked pops (4 = 4), tagged plates = acked plates; after removal no plate in the report and no fixture left; back to CSS only: yes. First run (06:10) failed only because its fixture painted inline (inline beats the stylesheet; areas paint plates through rules or --lgs-plate-bg): the fixture was fixed, not the CSS stdout (%TEMP%/rp8_out2.txt on the PC, not kept); shots/p2_p6_rp8_native.png (Steam's texture in native mode: window glass gone, capsules keep a light scrim; composited over a glass tone it is clean, the faint halos in a raw viewer are alpha ≤ 5 %) and shots/p2_p6_rp8_css.png (CSS only, same route) 2026-10-07 06:17
G-REMOVE (P6 part) python glass.py js "({g: Object.keys(window).filter(k => /^__LGS_LAYERS|__LGS_POPUPS|__LGS_P6/.test(k)), attrs: ..., own: Object.getOwnPropertyNames(vrPooledPopupStore)...})" after the native session went back to CSS only PASS: no __LGS_LAYERS*, __LGS_POPUPS* or test global (the Phase 1 leftovers __LGS_LAYERS_NAVMOD, _LAST, T2_LAST are gone), no data-lgs-cover/-pop/-plate-ack/-noslab attribute in main, no own method on vrPooledPopupStore, lgs-native off stdout 2026-10-07 06:20
RP-8 re-run same command after adding the material tokens and blur tokens to the acked-plate rule (REQ C1c->P6), files synced PASS (8 checks), plates acked in 700 ms, fill transparent, shadow none; back to CSS only: yes stdout 2026-10-07 06:24
RP-X re-run, RP-1 re-run p6test.py rpx, p6test.py rp1 after adding fragment-level flag and flagged supersedes (fixture fragment 45-flagged.json: flag: p6TestFlag, supersedes: ["tab-arrow", {"id": "card", "flag": "p6Other"}], one rule) PASS (RP-X 18 checks: the 15 below plus legacy tab-arrow reported with the flag off and gone with it on, card kept with unless: p6Other, the fragment's own rule only with its flag, and data-lgs-noslab=self on the slab: none pop only ); RP-1 still byte-identical on all four states rpx.json, rp1.json 2026-10-07 06:32 (rpx), 06:29 (rp1)
RP-X (rest of the card) p6test.py rpx (fragments 00-base, 20-owner (owns main: window mode h 600 r 40, coverMm −10), 30-intruder (changes main's material without owns), 50-p6x (supersedes hdr-back, main.footer; rules with hole {fill: scrim, shadow}, tint green and auto, slab: none, from: cut / fromMm, sink: false, exclude, a rule flag, wearer depths 30 and 50 mm), 99-legacy; fixtures: 7 rule targets, two plates under pops (one occluder="false"), two data-lgs-mosaic bands, 34 more plates; data-lgs-window-dim="0.6" on main's <html>; instances in default profile and in wearer profile with the flags p6TestFlag and wp.c3a) PASS (15 checks): owner's mode shape 1920 × 900 r 60 and coverDz −0.0271; intruder ignored with an error; both legacy rules superseded; hole {shadow: .35, fill: rgba(0, 0, 0, .35)}, tint rgb(48 209 88), material: none, from: cut, sink: false; auto tint rgb(48 120 230), from 0.0136; excluded target dropped; the flagged rule only with its flag; C3a's notifications, volumelevel, tooltip surfaces only with wp.c3a; plate under a pop occluder: true, the opted-out one not; 32 plates + 4 "dropped (more than 32)" errors; explicit mosaic bands in texture px; window: {dim: 0.6}; rule 7: no warning in the default profile (4 depths), "6 distinct depths (max 4)" in the wearer profile; wearer pops interactive only in the wearer profile rpx.json 2026-10-07 06:20 (overwritten 06:32)
Cost p6test.py rpperf (Phase 1's reporter and reporter v3 with the live fragments 00-base, 41-home, 99-legacy side by side: AllGames, 7 D-pad moves, Home, a game page) v3 2.0 ms per sample against Phase 1's 3.55 ms in the same ticks, but Phase 1 was injected first and pays each tick's layout flush (review m2): read it as the same cost as Phase 1 (R1 row below) rpperf.json 2026-10-07 06:22