56 KiB
P10 Lab and verification tools: evidence log
Status
Session 5, part 3 (2026-10-07 16:22-16:40): every REQ to P10 is answered and marked. The last open one, REQ
C2a-R2->P10 (eight items), is answered in wp/C2a-review-R2.md: (1)-(5) from parts 1-2, and (6)-(8) new in
lab/lab_bfs.js v13 (a target must own its nav node, inner; replay from up to three ways in and one retry at the
end of the queue; a failed reversibility check re-measured from a D-pad path, takeOrder), synced 16:29/16:31;
Home pad-bfs PASS (16:32); TL-3 PASS (45 = 45), TL-6 static PASS. The hv step-mode bug (P7 recheck) is fixed
and was checked live in the 16:20 native session: the laser look showed the frame menu column and glyph-less legends,
the pad look glyphs (looks viewed and deleted on the PC; none on the Frame). That session's PC process ended after the
two looks (the sgcheck and park steps did not run); the device was found CSS-only, native.lock free, no frame left.
Not re-run on purpose (user asked for a faster pass): C2a #16's live sgcheck (offline TL-4 16/16 stands). Open,
for others: REQ P10->Coordinator (six measuring rules, below). contracts/lab.md §4 pad-bfs and §10 updated.
Session 5, part 2 (2026-10-07 from 15:15, after a usage-limit cut at 14:52): finishing the REQs. Part 1's code
is in the 15:15 checkpoint; its evidence is in <scratchpad>/s5/ (the native session of 14:50 ended normally:
CSS only at 14:56:47, no flag or frame left). Closed so far (answered in the requesters' logs): C1b #10, C2a #13,
C4b, C7, P8, Coordinator R2-15. New in part 2 (offline tests pass; synced 15:37, 16:00, 16:09): the pointer parks
outside the viewport (C2a-R2 (2)); focus --room (C2a-R2 (3)); motion P-54 judges entries only and P-53's 600 px
scale with the surface's m (C2a-R2 (4); tools/p2/test_motion_page.py); an alias with several windows names the
shown one in JS and CDP, motion's warm-up waits for a surface the pre opens, AUD re-matches records the theme
moved (text, then a unique class; path collisions not compared; fixture case 15), result stamps are taken once the
lock is held (C2b-R2); pad-bfs lists Steam's focusable: false nodes apart (C1b #10); flag-step records use the
process start time. Still running: batch C (s5/run2.py: T3 AUD with native off, High Contrast outline, Home and
What's New sweeps, perf --ab), then one native session (s5/ns_run2.py), TL-3 and TL-6, then the C2a-R2, C2a #14,
C2b-R2 and Coordinator R2-5/11/13 answers.
Session 5 (2026-10-07 from 12:59): closing the open REQs. Open to P10 at the start: C1b #10, C2a #13, C2a
#14, C4b (E-KEY), C7 (AUD panes), Coordinator (E-MENU, P-23, perf --ab); session 4 had coded and documented most
of them but had not marked them or checked all of them live. Also P7's recheck: an hv step inside
native-session drops its own --mode / --flags / --media (run_step() skips parse_step()). Plan: fix that
bug, re-check every REQ live (one shared native session for the native items: laser hv looks, C2a #16's live
sgcheck), mark each REQ, record the evidence below.
Session 4 (2026-10-07 from 10:45): REQ batch 2 in progress. Open REQs to P10: C1b #10, C1c (hv --pre), C2a #13,
#14, #16, C2b (E-GRID), C3a (bar pill glyphs), C3b (E-TAB, OUTLINE capture edge), C4a (obscured ≥ 25 %), P4
(check-theme hooks warning), P7 (hv first frame), P8 (python3 -B). P7's Status is "R1 fixes in progress", so
native-session checks are deferred this session (hard rule 4). Progress is recorded per REQ below as it lands.
Done and verified by 11:12: P8 (python3 -B, lab.py sets dont_write_bytecode; Frame caches deleted), P4
(check-theme WARN), C2a #16 (sgcheck R1 rounded pops, 3 new fixtures, TL-4 16/16), P7 + C1c (hv warm grab, --pre
layer; looked at live), C3a (glyphs part of their host: gates bar SIZE PASS), offline sweep fixture
tools/p2/test_gates_page.py 13/13 (C4a obscured + room, C2a #13, C3b E-TAB, C2b E-GRID, C3a). Waiting on the lab
lock: live C2b, C3b, C2a #13, C4a gates; pad-bfs recovery (code in, probe queued).
R1 review fixes done (session 3, 2026-10-07 07:52–08:40; review wp/P10-review-R1.md). Every major (M1–M6)
and every minor (m1–m9) finding is fixed, synced to the Frame (glass.py sync lab) and re-tested live or offline;
the rows "R1 …" in the evidence table below hold the commands and results. In short:
- M1
motion: pause what the pre starts in the same evaluation, seek, two rAFs before each capture;motion --selftest 300|1000PASS (max error .002); C1c's strips must be re-run (told in C1c.md). - M2
gatesOUTLINE:::before/::after, hard 1–2 px shadow lines, closed rims, rings on non-glass, four-side edge probes; the reviewer's Settings case now FAILs with the rim, the ring and two 1 px separators. - M3
conformance: a route without a result → BLOCKED items, exit 3. M4Lockexception-safe (TL-6 stub test on the Frame). M5hvframes fetched as the output streams (< 1 s on the Frame in a session), 90 s reaper, purge at every lock entry. M6ledgerstatus per namespace +evidencecolumn. - m1 flags.lock + own keys; systemui reads under lab-vr.lock. m2
native: on|offin every result and step line. m3 OUTLINE measuresshotLocal, a missing capture FAILs. m4 own look folder (120 s timer), withheld verdict exits 3. m5conformanceas a native-session step (depth items PASS live). m6 P-38 body ≥ 22. m7 all requests answered (C1a #101, C1c filmstrips, C2a #9, and new ones: C2a #12, P1 index/probe). m8pad-bfs@hover/--hover,--help. m9/tmp/lgs/shots, tl3 rmdir. - Also:
native-sessionskips the unlocked CSS return when native mode was never turned on; contract §1, §2, §3, §4, §9, §10 updated (§10 lists every behaviour change for other packages).
Milestone: complete (M3 card + R1 fixes). Baselines refreshed: tools/p2/baselines/functions.csv (ledger) and
gates_stock_library_home.json (below). Known limits (contract): conformance P-02/P-89 are heuristics; hv
without --rect withholds its verdict (exit 3); live sgcheck needs the native layer. Next session: run
grep -n "REQ [A-Za-z0-9]*->P10:" docs/phase2/wp/*.md and answer new requests.
The text below is the M3 status before the review (kept for history).
M1 reached (2026-10-07 session 1). M3 reached (2026-10-07 06:25, session 2): every command of the card is
live, documented in docs/phase2/contracts/lab.md (§9 table, §10 changelog) and tested on the device, and every
acceptance test passes: TL-1 (each command run on the stock UI with --stock, baselines in
tools/p2/baselines/ and the evidence table), TL-2, TL-3, TL-4, TL-5, TL-6. M4/M5 do not apply
to a tooling package (no layer, plate or popup fragments). The card is complete.
Live commands: --flags, --mode (P1 rt.test.input.set / P3 rt.input.stub / classes fallback), --media,
--stock, check-theme, edge, focus (live and --png), native-session (native.lock, both lab locks for
setup and return, session options apply to every step, every measuring step finished on the PC), gates, hv
(with --offaxis), pad-bfs, motion, sgcheck (--spec offline, live as a native-session step), cmp
(multi-mockup cmp.json, per-element surface/origin/scale), ledger, conformance (31 items automated, --pad
adds 3); sync SUB.
Session 2 also answered every request addressed to P10 (06:35): C1a ×2, C1c ×3, C2a ×3, C4a ×3, P1, P2, P5 ×2, P9,
P3/P7 hooks adopted (--hover real CDP hover, gate scope rules, exemption criteria + six exemptions,
--stock-route, hv --full, glass.py selftest, session-flag reset at the lock exit). Contract §1, §4, §6, §10
updated; all regression runs logged below.
Open then: REQ P10->C1a (SN-T1, since answered by C1a). Known limits, recorded in the
contract: conformance P-02 and P-89 are heuristics over our CSS (candidates to review); hv without --rect
withholds its verdict (the auto rect is a hint); live sgcheck needs the native layer (P6's reporter). Next session
(if any): run grep -n "REQ [A-Za-z0-9]*->P10:" docs/phase2/wp/*.md and answer new requests; nothing else pending.
Requests
- REQ P10->Coordinator: please confirm (or overrule) six measuring rules the gates use since session 5. None is
a §1.16 exemption: each says what an existing gate measures, and none waives a lost function. All are in
contracts/lab.md(§4, §10) with offline fixture cases, and the evidence below. (1) G-AUD SHRUNK lists, not counts: a scroll container or a focusable pane (one that holds controls or has no handler of its own) that stays ≥ 300 × 300 (scroll-container,container-pane; REQ C1c, C7), and a text run whose box shrinks while its whole string stays shown at a drawn size no smaller than stock (text-whole; C7's/invitestitle). A cut string, smaller type or a leaf target with its own handler stays SHRUNK. (2) G-AUD matching: a stock record with no themed record at its DOM path is matched to a themed record at a new path with the same kind, first class and text, when that identity is unique on both sides (C2b's T3 wraps and sorts Steam's own rows; without this every T3 row read GONE and PLAN-2b-1 could never pass in T3). A repeated or changed identity stays GONE. An empty snapshot is a FAIL (VACUOUS), never 0 issues. (3) G-PAD universe: nav nodes Steam itself declaresfocusable: false(the tab row's%{Arrows}, laser-only) are listed asnotFocusable, not unreached. Their function's gamepad path (bumpers) belongs in the ledger. (4) P-54 judges what enters (a target not shown before the interaction); a shown target that travels (Home's segmented-control pill, 156 px) is a move, listed, and P-53 still judges travel on targets wider than 600 px. (5) G-FOCUS / SHOT luma: translucent texels of a live capture are composited over P-14's bright and dark test rooms (AUD's uniform rooms, L 210 and 24) and a pair is judged by the worse room. Until session 5 they were read over black, so C2a's P-16 band read +219.5 where the bright room gives +7.6. (6) G-OUTLINE under High Contrast: the edge profiles are measured and listed but not judged (P-42 exempts High Contrast; C2a's discs draw a 2 px edge there by design). Why: each changes what a verdict means for V2's report, and PLAN §1 decides. Until you answer, P10 keeps them as documented. - REQ P10->Coordinator: please add a PLAN §1.16 row E-GRID | Launcher grid cells (the "+" popup) | AUD's
SHRUNK only (SIZE, TYPE, OUTLINE judge the cells as usual); each cell ≥ 67 × 80 popup px (80 × m by 96 × m), its
row and column neighbours abutting (gap ≤ 2), the whole cell its own hit | HA §4 (adopted by §1.14), REQ C2b->P10.
Why: HA §4's 4 × 72 × 96 grid turns Steam's 260 × 40 rows into cells with 66 % of the area, so G-AUD reports
SHRUNK by design (PLAN-2b-1 cannot pass otherwise).
lab/exemptions.jsonhas it since session 4, scoped to AUD SHRUNK (contracts/lab.md §6); until §1.16 lists it, evidence that relies on it names it.- Coordinator (2026-10-07 13:10, round R2): added as proposed (PLAN §1.16 E-GRID, your criterion), plus a separate line E-GRID (labels) for the text runs in the cells, which the cell criterion must no longer waive (C2b review R2 M1, M4): a label's SHRUNK is waived only while it stays in its cell, shows ≤ 2 lines, cuts no glyph and keeps the full name in the DOM (PLAN §1.19 R2-15). The gate change is REQ Coordinator->P10 (R2-15) in
wp/coordinator.md.
- Coordinator (2026-10-07 13:10, round R2): added as proposed (PLAN §1.16 E-GRID, your criterion), plus a separate line E-GRID (labels) for the text runs in the cells, which the cell criterion must no longer waive (C2b review R2 M1, M4): a label's SHRUNK is waived only while it stays in its cell, shows ≤ 2 lines, cuts no glyph and keeps the full name in the DOM (PLAN §1.19 R2-15). The gate change is REQ Coordinator->P10 (R2-15) in
- REQ P10->P7:
native/spike/sg_test.py(and any spike script that importslgs,lgs_vrorlab) runspython3without-B, so it writesdevice/__pycache__/{lgs,lgs_vr}.cpython-312.pycandlab/__pycache__/lab.cpython-312.pycon the Frame (seen again 10:57:47 after P10 deleted them at 10:53; alsonative/spike/__pycache__/sg_native.cpython-312.pyc, 09:49). They outlivelgs offand a reboot (PLAN §7, hard rule 8). Please run them withpython3 -B(or setsys.dont_write_bytecode = Truebefore the imports, aslab/lab.pynow does) and delete the three folders once.glass.pyitself runspython3 -Bsince session 4 (REQ P8->P10).- P7 (2026-10-07 12:05): done.
sg_test.py,sg_native.py,sg_timeline.pyandsg_vis.pysetsys.dont_write_bytecode = Truebefore their imports (installed on the Frame), P7's documented commands usepython3 -B, and the three folders were deleted on the Frame (12:05; none left).
- P7 (2026-10-07 12:05): done.
- REQ P10->P1: for
--flags(lab.md §1.1) please expose__LGS_RT.test.flags.push(obj) -> tokenand__LGS_RT.test.flags.pop(token)indevice/rt/00-rt.js(in-memory override for one locked lab step, on top ofdefaults.jsonand/tmp/lgs/flags.json; modules see the change through their normal flag reads/onChange). If you prefer another shape, write it incontracts/runtime.mdand I will follow it.- P1 (2026-10-07): done as asked:
__LGS_RT.test.flags.push(obj, {ttlMs}) -> token,pop(token); gated modules install/remove at once (await __LGS_RT.settled()to wait); overlays expire after 300 s. contracts/runtime.md §3.6.
- P1 (2026-10-07): done as asked:
- REQ P10->P1: for
check-themeplease make the offline bundle check callable without Steam:python device/lgs.py check [--json](or a functionlgs.check(theme_dir) -> list of problems), soglass.py check-themecan include it underbundler.- P1 (2026-10-07): done:
python device/lgs.py check [--json](exit 1 on errors) andlgs.check(root=None, node=True) -> {ok, errors, warnings, checked, skippedWip, node}. contracts/runtime.md §6.
- P1 (2026-10-07): done:
- REQ P10->P3: for
--mode(lab.md §1.2) please expose__LGS_RT.input.stub('laser'|'pad'|null)(null = stub off), changing only our classes on every popup, as PLAN §1.4 describes.- P3 (2026-10-07): done as asked:
__LGS_RT.input.stub(mode, {vrMode, ttlMs})returnsrestore(),stub(null)clears; onlyhtml.lgs-input-*/data-lgs-vr-modechange, Steam's getters untouched (IN-2 PASS live). Exists whilewp.p3is on (contracts/interaction.md §1.2). P3's attention also follows your untrustedL.hoverunder the stub (IN-3b).
- P3 (2026-10-07): done as asked:
- REQ P10->P7: for
sgcheckandhv --offaxisplease expose (a)__LGS_SG.spec()returning the last spec passed toupdate()(or null), and (b) a test hook that turns the dashboard about the vertical axis by N degrees and restores it (__LGS_SG.test.yaw(deg),yaw(0)restores; TTL-protected like the other overrides).- P10 (2026-10-07 06:20): both are in
device/lgs_sg.js(spec(),test.yaw(deg, ttlMs));hv --offaxisuses the hook (tested in CSS-only mode and in a native session, 25°),sgcheckrecordsspec()with the dump. - P7 (2026-10-07 08:20): confirmed, contract sg.md §2/§7:
yaw(deg, ttlMs)(±60°, TTL default 20 s, 1–120 s;yaw(0)and the watchdog restore; SG-YAW PASS). Fixed since: t1 is now found by Steam's page summon key, notpage:3(Steam's page was page 4 by 08:10, so the hook andwindowreturnedmissinguntil this fix).
- P10 (2026-10-07 06:20): both are in
- REQ P10->C1a:
glass.py ledgerfinds one shell-nav function that no concept maps: SN-T1 "Read a notification" (audit/shell-nav.md§A).window-nav.md§9 says it covers every SN §A function: please add a T1 row (new place, laser and gamepad paths, owner, test: the toast is C3a's area), or name the concept that maps it.- C1a (2026-10-07 session 3): done. WN §9.6 had it as one row "T1 / SY NO4"; it is now its own row
| T1 | Read a notification (toast) | … | C3a | AT-18 |plus a separateSY NO4row, so the ledger's id column reads T1.
- C1a (2026-10-07 session 3): done. WN §9.6 had it as one row "T1 / SY NO4"; it is now its own row
Evidence
| Test | Command | Result | Shots / JSON | Date | Steam build |
|---|---|---|---|---|---|
| M1 stubs | python glass.py check-theme, ledger, gates main |
exit 3, BLOCKED: ... stub |
— | 2026-10-07 | 11094443 |
| M1 step options | python glass.py js "L.route()" --flags wp.test,x=3 --mode pad --media reduce |
parsed, stripped, command ran (/library/home) |
— | 2026-10-07 | 11094443 |
| TL-3 | python tools/p2/tl3_settings_pad.py --route /settings/system (runs SET settings-pad.js unchanged with L.pad recorded, then glass.py pad-bfs --route /settings/system --budget 300) |
PASS: settings-pad reached 45 elements in the content column, pad-bfs the same 45 (0 missing, 0 extra); pad-bfs overall PASS: 93 nodes over 24 Settings routes, 0 of 70 unreached, 0 irreversible, 1 slider pair untested, 139.5 s | tools/p2/baselines/padbfs_settings_system.json |
2026-10-07 05:25 | 11094443 |
| TL-2 (focus) | python glass.py focus --png shots/p2_window-nav_tabbar.png --pair "store-vs-media=rect:82,223,343,275:rect:82,351,343,402" --pair "key-focus-vs-rest=rect:81,1004,342,1056:rect:81,813,342,864" and the same regions through C1a's window-nav-measure.py dl / focus |
PASS: fill to fill (Store pill vs Media at rest) dL +58.5 (WN §14: "59 fill to fill"); state key focus vs rest +42.5; both tools give identical L to 0.1 on every region (141.9 / 83.4; 137.3 / 94.8). The revision 2 "ΔL 40" was measured on a render that C1a replaced at M0 (focus add .30 → .28, shots are not in git), so only the fill-to-fill value is comparable | shots/p2_window-nav_tabbar.png (C1a render 05:27) |
2026-10-07 05:35 | n/a (mockup) |
| TL-2 (edge) | python glass.py edge shots/p2_window-nav_anatomy.png 66 400 1520 --luma 709; edge shots/p2_window-nav_power.png 212 384 896; edge shots/p2_window-nav_sort.png 174 707 1219; C1c's E7 regions for menu, alert, sheet |
PASS: Window (anatomy) segments 45.4, 61.2, 80.3, 81.7, 43.1, 17.2, 1.1, −3.2 = WN §8.2's 45, 61, 80, 82, 43, 17, 1, −3 (max diff 0.4); Power 66.9 … 6.3 vs 69 … 7 (max 2.5), ratio 0.12 = 0.13 ±.01; Sort 79.1 … 7.6 vs 78 … 7 (max 2.9), ratio 0.13 = 0.12 ±.01. Ornament and Search sheet rows: renders replaced at M0 (the ornament is now 880 wide with quiet members), not comparable. C1c's E7 ratios 0.22, 0.13, 0.12, 0.01, 0.00 reproduce exactly (601 luma, now the default as in WN's script rev 3) | shots/p2_window-nav_{anatomy,power,sort,menu,alert,sheet}.png |
2026-10-07 05:35 | n/a (mockup) |
mockshot --rects |
python tools/mockshot.py docs/phase2/mockups/window-nav-anatomy.html OUT.png --rects OUT.json |
render pixel-identical to the plain render (ImageChops.difference(...).getbbox() == None); 23 data-id rects |
scratch | 2026-10-07 05:33 | n/a |
| TL-4 | python tools/p2/test_sgcheck.py (13 fixtures tools/p2/fixtures/sg_*.json, each with its expected rules); python glass.py sgcheck --spec tools/p2/fixtures/sg_uncovered.json |
PASS: the uncovered pop is flagged (FAIL R1 main/ghost: not covered at texture px (1922, 902), exit 1); every fixture flags exactly its rule(s): R1, R1b, R2 (cap and off-set depth), R3, R4, R5, R6, R7, R8, R9; the clean and the 4-depth fixtures pass |
tools/p2/fixtures/sg_*.json |
2026-10-07 05:44 | n/a (offline) |
| sgcheck live (baseline) | python glass.py native-session --step "sgcheck --route /library/home" |
ran: native up in 2.6 s, 32 scene-graph nodes, 6 surfaces; 6 pops on main from the Phase 1 legacy rules (hdr-back, hdr-search, tabs, tab-arrow ×2, card) fail R2 (dz 2.95–5.54 mm, not in {0, 10, 15, 25}), R5 (32–42 CSS px tall) and R1 (the header pops leave the cover at its rounded corners): expected for admission-off legacy rules (P6 §4), to be retired by PLAN §6. Back to CSS only: yes |
— | 2026-10-07 05:42 | 11094443 |
| TL-1 cmp | python glass.py cmp docs/phase2/mockups/window-nav-anatomy.html --id P10 --stock (map docs/phase2/wp/P10-cmp.json: a tool check, not a verdict) |
ran: stock /library/home captured and its rects read in one lock, theme given back; search dx −232 dy −22 dw +608 dh −24 (Steam's 1127 px header field vs the mockup's 520 capsule, as expected for stock), back not found by the test selector (reported as ERROR, exit 1); offline re-run with --live-rects shots/p2_cmp_p10_window-nav-anatomy.live.json gives the same deltas |
shots/p2_cmp_p10_window-nav-anatomy.png, _live.png, .rects.json, .live.json |
2026-10-07 06:02 | 11094443 |
| TL-1 ledger | python glass.py ledger --out tools/p2/baselines/functions.csv |
ran: 447 rows from 7 concepts; 267 of 268 audit functions mapped (unmapped: SN-T1 "Read a notification", shell-nav §A, no concept row); 0 rows without a path; 111 rows with concept-own ids; status pass 8, partial 5, static 24, open 410; exit 1 (the unmapped row) | tools/p2/baselines/functions.csv |
2026-10-07 06:08 | n/a (offline) |
| TL-3 (re-run after the node-identity change) | python tools/p2/tl3_settings_pad.py --route /settings/system |
PASS: 45 = 45 (0 missing, 0 extra); baseline rewritten with hashed texts | tools/p2/baselines/padbfs_settings_system.json (redacted) |
2026-10-07 06:15 | 11094443 |
| TL-5 | python glass.py hv p10_tl5; python glass.py hv p10_tl5b --look, then python glass.py check-theme; then ls %TEMP%\lgs-hv, ls shots, and on the Frame ls /tmp/lgs/hv-*, ls /tmp/lgs-shots |
PASS: metrics printed (960 × 540 frame, auto rect, glass L 72.2, verdict withheld as the rect is a hint); no PNG left on the PC (the mkdtemp folder removed, lgs-hv empty) or on the Frame; with --look the kept frame was deleted by the next command (hv: deleted 1 kept headset-view frame(s)). The frames were not viewed |
— | 2026-10-07 05:54 | 11094443 |
| TL-6 | python tools/p2/tl6_locks.py |
PASS: static review: every command in lab_p2cmd.COMMANDS takes its lock (sgcheck both lab locks, hv lab-vr, native-session native.lock first, then both lab locks for setup and return; the rest lab.lock or lab-vr.lock by surface); Phase 1 nav/back/outline/click/js/shot/perf/audit under lab.lock. Concurrent: A held lab.lock 6 s, B (started 1.5 s later) ran 24.8 s after A ended (other agents' steps queued between), C on vr:systemui ran during A (independent lock) |
— | 2026-10-07 05:58 | 11094443 |
| TL-1 check-theme | python glass.py check-theme |
ran: PASS (bundler 35 files: 21 css, 4 js, 5 json, 5 py) | — | 2026-10-07 05:05 | n/a |
| TL-1 edge | see TL-2 (edge) | ran | — | 2026-10-07 05:35 | n/a |
| TL-1 gates | python glass.py gates main --route /library/home --stock --json |
ran (stock UI): SIZE 14 findings (40 px header field, 32 px shelf arrows, 34 px feed tabs), TYPE 5 (12 px uppercase tracked tab titles, 16 px Regular "Back"), OUTLINE 0 (no glass on stock), MOTION 1 (Steam's own animation on the featured Recent Games tile still running at rest); theme given back | tools/p2/baselines/gates_stock_library_home.json |
2026-10-07 05:59 | 11094443 |
| TL-1 pad-bfs | python glass.py pad-bfs --route /library/home --stock --budget 200 --out … |
ran (stock): 44 nodes, 309 moves, 59.8 s; 36 of 72 leaves unreached (feed avatars and arrows, offers below the fold), 16 irreversible moves in the feed panels (tab panels follow focus); entry focus = the featured Recent Games tile | tools/p2/baselines/padbfs_stock_library_home.json (redacted: the Friends feed holds personal names) |
2026-10-07 06:01 | 11094443 |
| TL-1 focus | python glass.py focus main --route /settings/system --mode pad --stock --pairs tools/p2/baselines/focus_pairs_settings_sidebar.json --keep p2_p10_focus_stock_settings |
ran (stock): P-14 sidebar focus vs rest dL +20.4 (FAIL < 40), P-16 band +0.0; themed (05:31, same pairs, no --stock): +50.1 and +2.4 |
shots/p2_p10_focus_stock_settings_{0,1}.png, shots/p2_p10_focus_settings_{0,1}.png |
2026-10-07 05:59 | 11094443 |
| TL-1 motion | python glass.py motion main --route /settings/system --mode pad --stock --name p10_stock_settings_focus --pre "…gpTake Storage…" |
ran (stock): 1 animation (Steam's %{ScaledChildren} 320 ms transform, listed not judged), 0 non-token, 0 at rest, PASS; themed run (05:36): 3 of our transitions at 140 ms (not a token: P4's in-progress CSS) |
shots/p2_motion_p10_stock_settings_focus_*.png, _strip.png; shots/p2_motion_p10_settings_focus_*.png |
2026-10-07 06:11 | 11094443 |
| TL-1 sgcheck, native-session | python glass.py native-session --mode pad --step "gates main --route /library/home --only size,type,motion" --step "sgcheck --route /library/home" |
ran: native up, both steps finished on the PC (gates summary; sgcheck: 27 nodes, 5 legacy pops failing R2), back to CSS only: yes (shell status: css-only) |
— | 2026-10-07 05:57 | 11094443 |
| TL-1 conformance | python glass.py conformance --stock --mode pad --out … (5 default routes) |
ran (stock): PASS 16, FAIL 12, MANUAL 53, BLOCKED 6, N/A 2; must items failing on stock: P-08, P-38, P-40, P-43, P-52, P-80, P-81, P-82, P-83, P-84 (Steam's own 12 px uppercase labels, 40 px header, 1 px footer border, text Back button) | tools/p2/baselines/conformance_stock.json |
2026-10-07 06:08 | 11094443 |
| TL-1 hv, cmp, ledger | see TL-5, "TL-1 cmp", "TL-1 ledger" | ran | |||
| hv --offaxis | python glass.py hv p10_off --offaxis 25 (CSS-only, lgs_sg.js installed for an override); python glass.py native-session --step "hv p10_off_native --offaxis 25" |
ran in both: yaw applied through __LGS_SG.test.yaw(25, 15000), frame measured, yaw(0) after; no PNG left on either machine (/tmp/lgs/hv-* absent, %TEMP%\lgs-hv empty); frames not viewed |
— | 2026-10-07 06:18 | 11094443 |
| step options | python glass.py js "[matchMedia reduce, contrast]" --media reduce,contrast, then the same without; python glass.py js "<input classes + rt.input.state().stub>" --flags wp.p3 --mode laser |
PASS: media applied on 11 Steam targets inside the step (true, true) and gone after (false, false); --flags wp.p3 pushed through rt.test.flags.push + /tmp/lgs/flags.json, --mode laser through rt.test.input.set: html.lgs-input-laser, data-lgs-vr-mode="laser", stub {laser} inside the step; after it /tmp/lgs/flags.json absent again (it was absent before) |
— | 2026-10-07 06:25 | 11094443 |
| REQ batch (C1a, C1c, C2a, C4a, P1, P2, P5, P9) | glass.py gates main --route /settings/system --mode pad; gates main --route /library/home --mode pad; audit main --route /library/lgs/steamhome --stock-route /library/home; focus main --route /settings/system --json --pairs '[{"a":{"state":"@hover …Storage,300"},"b":{"state":"[L.q(…).matches(':hover'), …]"}}]'; hv p10_full --full; conformance --route /settings/system --mode pad --only …; offline edge() on a flat 1.1 L fill |
ran: SIZE now reports skipped 6 obscured, 2 clipped and exemption criteria (E-SWITCH listed with pass/why); the CDP hover sets :hover on the target inside the step (true) and not after it (false); --stock-route pairs the routes (the moved Home was not there at the time: GONE rows); --full frame 1920 × 1080, deleted on both machines; a flat 1.1 L edge is edge: "none", PASS |
— | 2026-10-07 06:33 | 11094443 |
| cmp on a package map | python glass.py cmp docs/phase2/mockups/window-nav-menu.html --id C1c --mode pad (C1c's {"mockups": …} file, entry chosen by the stem; pre opens the tile menu, which the lock exit closed) |
ran: menu, Install row and Cancel matched by size (dw 0, dh 0 / +4 / +8) and offset by dx −82, dy −19 (C1c's note: T1 menus stay centred until its T2 anchors them); legend maps to Steam's full-width #Footer (dw +1029). Images viewed: same 6-row slab, live still Steam-coloured rows |
shots/p2_cmp_c1c_window-nav-menu.png (+ _live.png, .rects.json, .live.json; C1c may overwrite them) |
2026-10-07 06:36 | 11094443 |
| R1 M1 motion self-test | python glass.py motion main --route /library/home --selftest 300, then --selftest 1000 (two 200 × 140 boxes, white over opaque black: a WAAPI opacity 0 → 1 and a CSS opacity transition, both linear; luma / 255 per frame) |
PASS both: f 0 / .15 / .35 / .5 / .75 / 1 measured 0 / .149 / .349 / .498 / .749 / 1.000 for both boxes (max error .002, limit .05); "paused 2 after the pre, released 2", no stale frame (f 0 is the black underlay, not the previous route). Before the fix the reviewer measured ≈ .25 / .45 / .60 / .85 at 1000 ms and end state from f .35 at 300 ms. Strip viewed: an even ramp black → white | shots/p2_motion__p10_selftest_{300,1000}_*.png, _strip.png |
2026-10-07 08:10, 08:13 | 11094443 |
| R1 M2 OUTLINE on Settings | python glass.py gates main --route /settings/system --only outline,type --shot p2_p10_r1_outline_settings --json (the reviewer's case) |
FAIL as it should (was PASS, 0 findings, 1 probe): P-42 PageListColumn::before "closed rim of 3 shadow lines: inset 0 1px (top) .40, inset 1px 0 (left) .12, inset −1px −1px (right+bottom)"; P-43 the active row's ::before "2px ring"; P-43 two 196 × 1 %{PagedSettingsDialog>Separator} filled lines (missed before: L.visible drops boxes under 2 px); 40 pseudo-elements checked, 3 of 8 glass boxes are pseudo-elements; 18 edge probes on 4 sides: the sidebar pane's top ratio .997 (uniform line, dL 34) and left .401 FAIL, the window root's top .025 PASS. Crop viewed: the rim on the pane's top and left, the ring round "System" and the separator are all visible |
shots/p2_p10_r1_outline_settings.png |
2026-10-07 08:15 (native: on: it ran between the steps of my native session) |
11094443 |
| R1 M3 conformance fail-open | offline: conformance.run(["--route","/library/home"], lambda a: None, lambda a: None) and a two-route run with one route missing |
PASS: 36 automated items BLOCKED "/library/home: no result (lab lock busy, CDP error or device unreachable)", 53 MANUAL, BLOCKED: line, exit 3 (was 86 MANUAL, exit 0); with one of two routes missing the same items are BLOCKED, a FAIL elsewhere still exits 1 |
— | 2026-10-07 08:05 | n/a (offline) |
| R1 m5 conformance in native-session | python glass.py native-session --step "sgcheck --route /library/home" --step "hv p10r1_ns" --step 'js "(async()=>{await L.sleep(20000); return 1})()"' --step "conformance --route /settings/system" |
ran: native up 2.6 s; the conformance step is finished on the PC with the depth model: P-11, P-46, P-47, P-48, P-51 PASS (0 each), P-42/P-43 FAIL (the rims above), counts FAIL 9 / PASS 18 / MANUAL 56 / BLOCKED 4 / N/A 2; the hv metrics printed right after the hv step, before the 20 s step began (streamed); back to CSS only: yes; exit 1 (sgcheck's legacy R2 pops and conformance's must FAILs) | — | 2026-10-07 08:12–08:14 | 11094443 |
| R1 M6 ledger | python glass.py ledger --out tools/p2/baselines/functions.csv |
ran: 449 rows, 268/268 mapped, exit 0; status pass 4 / partial 11 / static 24 / open 410 (was pass 8, partial 5); the reviewer's three are open now: LA-L5 (HA AT-6: C1a's WN AT-6 row no longer counts), SN-N4 (CC A3–A6 → C3a/C3b logs: none), LA-L10 (no test id); every pass row names its log row in the new evidence column (e.g. SN-N3 "C1a: AT-8"); a home-apps row owned by C1a with a bare AT-3 needs "HA AT-3" in C1a's log |
tools/p2/baselines/functions.csv |
2026-10-07 08:20 | n/a (offline) |
| R1 M4/m1 TL-6 static | python tools/p2/tl6_locks.py --static-only |
PASS: every command's locks as before, plus: vr:systemui reads under lab-vr.lock (hv_grab, sgcheck_live, conformance via vr_lock()), flags file only under flags.lock with own-key restore |
— | 2026-10-07 08:05 | n/a |
| R1 m1 flags | python glass.py js "[L.route(), typeof L.index, …]" --flags p10r1test=3 while other agents' steps used --flags wp.c1c |
ran: step: flags={"p10r1test": 3} via rt.test.flags.push + /tmp/lgs/flags.json native=off; afterwards /tmp/lgs/flags.json held only the other agent's wp.c1c (my key removed, theirs kept); L.index.selector present (REQ C1a #101) |
— | 2026-10-07 08:09 | 11094443 |
| R1 TL-6 (full) | python tools/p2/tl6_locks.py |
PASS: static review ok (incl. systemui reads and flags.lock); lock exception safety on the Frame (lab.py imported, flock_wait stubbed to time out once, then a Step.apply that raises after "writing", test lock files /tmp/lgs/tl6-test*.lock): first entry raised lab: lock busy for 240 s (stub), depth after it 0, the second with Lock() locked (flock called) with depth 1 inside and 0 after, the failed apply raised, its undo ran, depth 0, and the next Lock locked again (before the fix depth stayed 1 and the next body ran unlocked); concurrent: B ran 110 s after A ended (other agents' steps queued between), never inside A |
— | 2026-10-07 08:16–08:20 | 11094443 |
| R1 M5 hv in native-session | scratch harness: glass.py native-session --step "hv p10r1_ns2" --step 'js "<sleep 15 s>"' while a PC thread listed /tmp/lgs/hv-*.png on the Frame over one SSH connection every ~0.5–1 s (names only) |
PASS: the metrics printed 0.6 s after the hv step began and before the next step; the poller never saw the frame (it lived under a second, between hvgrab and the streamed fetch), against the reviewer's ≥ 21 s for the whole session before the fix; back to CSS only: yes; exit 3 (the withheld G-HV verdict). Afterwards no hv-* on the Frame; the 90 s reaper had nothing left to delete |
— | 2026-10-07 08:16–08:21 | 11094443 |
| R1 TL-5 / m4 | python glass.py hv p10_tl5_r1; python glass.py hv p10_look_r1 --look, then watch %TEMP%\lgs-hv-look-* |
PASS: plain run prints the metrics and BLOCKED: G-HV verdict withheld …, exit 3 (was 0); no PNG on either machine. --look: the frame went to its own folder lgs-hv-look-<pid>-<n> (not the shared lgs-hv), "deleted in 120 s"; other agents' commands in between did not touch it; its timer deleted it at 08:23:52, two minutes after it was written (08:21:51). The frame was not viewed |
— | 2026-10-07 08:17, 08:21 | 11094443 |
| R1 m3 missing capture | offline: glass.gates_finish({... OUTLINE: {pass: true, probes: [1], shotLocal: <missing file>}}) |
PASS: OUTLINE pass: false, error: "no OUTLINE capture (…): edge probes not measured", overall FAIL (was PASS with 0 probes); live gates runs measure exactly OUTLINE.shotLocal (shots/_gates_tmp_<pid>_<n>.png, deleted after) |
— | 2026-10-07 08:22 | n/a |
| R1 REQ C2a #9 / clip-path | python glass.py gates main --route /library/home --mode pad --only size,outline --json |
PASS: SIZE 0 findings over 12 controls; %{SeasonalSale} (rect y 610–825) no longer fails P-08: visibleRect now resolves the clipping ancestor's clip-path: inset(0 0 calc(100% - 656px) …) (C1a moved --lgs-c1a-gh from <html> to %{BasicUiRoot}, so the old root read saw nothing), and it is skipped as obscured (centre below the glass cut, inside a scroller); 4 skipped "obscured". OUTLINE PASS: 17 pseudo-elements checked, 4 edge probes on the window root (top ratio .029) |
— | 2026-10-07 08:20 | 11094443 |
| R1 REQ C2a #12 transient | python glass.py js "<nav /library/home; L.gates.size('main'); add a fixed 320 × 240 [data-lgs-transient] probe at (300, 250); L.gates.size('main'); remove it>" --mode pad |
PASS: without the probe 11 controls checked, 0 skipped as transient; with it 9 checked and the shelf control under it skipped: covered (transient); probe removed in the same step (probeLeft: false) |
— | 2026-10-07 08:25 | 11094443 |
| R1 m8 pad-bfs pre | python glass.py pad-bfs --route /settings/system --budget 25 --pre "@hover .gpfocus"; then --mode pad --pre "@hover %{PagedSettingsDialog_PageList_ShowTitle>PagedSettingsDialog_PageListItem}" |
ran: the first stops with lab: hover: nothing matches .gpfocus in main (the @hover form is now a CDP hover through run_pre, not JS); the second records preResult = the hover point (128, 61) and runs the BFS (25 s budget, not a verdict); raw JSON deleted |
— | 2026-10-07 08:19, 08:23 | 11094443 |
| R1 M1 real interaction strip | python glass.py motion main --route /settings/system --mode pad --name p10_r1_settings_focus --pre "L.gpTake('main', '%{PagedSettingsDialog_PageList_ShowTitle>PagedSettingsDialog_PageListItem}@text=Storage')" |
ran: 4 animations paused after the pre and released after; all six frames differ (six MD5s; the session-2 stock run had one MD5 for f .5, .75 and 1); strip viewed: the Storage focus fill and its ring build up over f .15 → .35 → 1 while System's fade. Automatic part FAIL as before: 3 of our transitions at 140 ms (not a token; the Settings sidebar's CSS, not P10's) | shots/p2_motion_p10_r1_settings_focus_*.png, _strip.png |
2026-10-07 08:26 | 11094443 |
| R1 TL-1 gates (stock baseline) | python glass.py gates main --route /library/home --stock --json → tools/p2/baselines/gates_stock_library_home.json |
ran (stock UI, theme given back): SIZE 8, TYPE 5, OUTLINE 1 (new: Steam's own 1 × 32 px line on %{BackContainer}'s ::after, P-43; the old sweep could not see pseudo-elements or boxes under 2 px), MOTION PASS; element texts in the file are Steam's labels only |
tools/p2/baselines/gates_stock_library_home.json |
2026-10-07 08:26 | 11094443 |
| R1 regression (offline) | python tools/p2/test_sgcheck.py; glass.py edge shots/p2_window-nav_anatomy.png 66 400 1520 --luma 709; glass.py focus --png shots/p2_window-nav_tabbar.png --pair store-vs-media=…; glass.py check-theme; python -m pyflakes glass.py lab/*.py tools/p2/*.py; node parse of every lab/*.js |
PASS: TL-4 13/13; edge 45.4 … −3.2 (unchanged); focus +58.5 (unchanged); check-theme PASS (45 files); lint clean | — | 2026-10-07 08:30 | n/a |
| R1 REQ P1 index/probe | python glass.py js "[L.index.ok, L.index.size, L.sel('%{BasicUiRoot}'), <count of lgs-cm records in webpackChunksteamui>, L.restore()]", before and after the change |
ran: L.index.ok true, 546 modules, %{BasicUiRoot} resolved; lgs-cm probe records 7 → 0 |
— | 2026-10-07 08:29–08:31 | 11094443 |
| S4 P8 bytecode | glass.py runs env … PYTHONDONTWRITEBYTECODE=1 /usr/bin/python3 -B; lab/lab.py sets sys.dont_write_bytecode; find ~/.local/share/glass-shell -name __pycache__ before and after |
PASS: device/__pycache__ (lgs, lgs_shell, lgs_vr) and lab/__pycache__ (lab, lab_p2cmd) deleted 10:53 (only .pyc inside); every lab process since runs python3 -B; copies that came back at 10:57:47 were P7's sg_test.py (REQ P10->P7, answered 12:05) |
— | 2026-10-07 10:53–11:01 | 11094443 |
| S4 P4 check-theme hooks | python glass.py check-theme; python tools/p2/check_theme.py --root <scratch copy with an extra "--lgs-edge: panel" rule> (also --quiet, --json) |
PASS: the tree: PASS, no warning; the scratch copy: WARN hook host lists are stale (edge ::before, edge:panel ::before) …, still PASS, exit 0; JSON warnings |
— | 2026-10-07 10:50 | n/a (offline) |
| S4 C2a #16 sgcheck R1 radius (TL-4) | python tools/p2/test_sgcheck.py with new fixtures sg_roundpop.json, sg_roundpop_corner.json, sg_roundpop_oversize.json |
PASS 16/16: a 480 × 360 r 54 pop over its own plate is clean; a square pop over a rounded plate and a pop 6 px larger than its plate FAIL R1. Live re-check deferred (needs a native session; P7 in R1 fixes) | tools/p2/fixtures/sg_roundpop*.json |
2026-10-07 10:52 | n/a (offline) |
| S4 P7 hv fresh frame | python glass.py hv p10_s4_g1 --grabs 1 --look --pre "<CONFIRM, self-closing>"; then python glass.py hv p10_s4_g2 --look --pre "<same>" (default 2 grabs, 0.5 s) |
PASS: one grab showed another route and no dialog (stale); two grabs showed the step's dialog over Home and the current bar clock; metrics JSON grabs: 1 / 2, layer: true. Both frames looked at, then deleted on both machines (hv --clean; /tmp/lgs/hv-* 0) |
— | 2026-10-07 10:59, 11:00 | 11094443 |
| S4 C1c hv --pre (TL-5) | as above, and python glass.py hv p10_s4_plain (no layer) |
PASS: the dialog stayed open for the capture and the step's exit closed it ("closed 1 menu/dialog/popup opened by this step"); plain hv 4.8 s, exit 3 (verdict withheld, as before); no PNG left on either machine (%TEMP%\lgs-hv empty, no lgs-hv-look-*, /tmp/lgs/hv-* 0) |
— | 2026-10-07 10:55–11:01 | 11094443 |
| S4 TL-6 static | python tools/p2/tl6_locks.py --static-only |
PASS: hv takes lab-vr.lock, or lab.lock + lab-vr.lock with a layer; perf --ab under the surface's lock; every other row as before |
— | 2026-10-07 12:15 | n/a |
| S4 sweep fixture | python tools/p2/test_gates_page.py (tools/p2/fixtures/gates_page.html in local headless Chrome, 1280 × 720) |
PASS 20/20: obscured ≥ 25 % with room skipped, without room judged in place (P-08 FAIL with the note); P-08 box on the visible rect; E-TAB row; E-GRID AUD waiver met / not met / GONE kept; hosted glyphs; E-MENU column, grid, too narrow; Cancel pass / 56 px fill fails; panes vs a leaf in AUD. Negative controls: with the old box centre, without the room check or without the host rule, cases 5, 4 and 8a fail | — | 2026-10-07 11:05–12:20 | n/a (offline) |
| S4 C3a bar glyphs | python glass.py gates bar --only size --flags wp.c3a --mode laser; gates bar --only size --stock |
PASS (themed): 0 findings, 5 E-BAR exempt, 3 glyphs "part of its host"; stock: the same 3 glyphs part of the host, the pill passes, 5 findings left on Steam's small bar buttons (stock only) | — | 2026-10-07 11:10, 11:16 | 11094443 |
| S4 C2b E-GRID | python glass.py gates barpopup --pre "<OPEN +>" --only aud,size --mode laser --json |
PASS: AUD 0 issues, 35 E-GRID waivers (cells 72 × 96, gaps 0 / 0, hit 100 % own); SIZE 24 checked, 0 findings | — | 2026-10-07 11:15 | 11094443 |
| S4 C4a obscured | python glass.py gates main --route /settings/audio --only size --mode laser --json |
PASS: 12 checked; the Keyboard sidebar row skipped as obscured (35 % of its box under chrome, room to scroll); the Microphone slider wholly under the glass cut (clipped) on today's layout |
— | 2026-10-07 11:33 | 11094443 |
| S4 C3b E-TAB, OUTLINE | python glass.py gates barpopup --pre "<open QAM>" --only size,outline --mode pad --shot p2_p10_s4_qam_outline --json (without wp.c3b, which opens CC-M); offline re-measure of the bottom sides |
PASS: the five tabs E-TAB "row item 60 x 56, gap 0"; OUTLINE 4 probes pass. Bottom side: the last texture row is a uniform line on stock captures too (31 L over 19–26), so it is now skipped (captureEdge); C3b's 09:47 capture re-measured 0.544 → 0.0 (P4's bounce lobe varies 26 → 65 L) |
shots/p2_p10_s4_qam_outline.png |
2026-10-07 12:04 | 11094443 |
| S4 C2a #14 pad-bfs exits | python glass.py pad-bfs --route /library/home --flags wp.c2a,wp.p3,wp.c1a --mode pad --budget 200 --out <scratch> |
ran: 26 nodes, 188 moves, 39.8 s; 0 of 26 unreached (C2a's 09:05 run: 5 of 18); 5 exits to frame.menu, all back by the opposite press; 1 irreversible (C2a's What's New Left → Recent, Right → Collections, theirs); B: Steam's history back. Probe (11:20): Left from the first tile makes VRFrameMenu-… the active nav tree, Right gives it back to GamepadUI_VR_Full_Root |
— | 2026-10-07 11:33 | 11094443 |
| S4 TL-3 (re-run after the BFS change) | python tools/p2/tl3_settings_pad.py --route /settings/system (lock retries added) |
PASS: 45 = 45 (0 missing, 0 extra); baseline rewritten (redacted) | tools/p2/baselines/padbfs_settings_system.json |
2026-10-07 12:00 | 11094443 |
| S5 C2a #13 visible-rect box | python glass.py gates main --route /library/lgs/steamhome --pre <wait for What's New> --only size --flags wp.c2a,wp.p3,wp.c1a --mode laser --json |
PASS: 13 checked, %{SeasonalSale} (rect y 610–825, visible to 720) sampled on its visible part, no P-08 failure, not skipped; offline cases 5, 5b, 4b PASS |
<scratchpad>/s5/c2a13.json |
2026-10-07 13:30 | 11094443 |
| S5 C4b E-KEY | python glass.py gates keyboard --pre <show the keyboard> --mode laser --json, then the same with --flags wp.c4b |
PASS (SIZE): 58 %{KeyboardKeyHitArea} exempt as E-KEY both times, none failing; AUD now judges the keys (E-KEY scoped to size/type/outline): 1 real issue both times, CONTRAST text span "Enter" 21 -> 3.6 (C4b's) |
<scratchpad>/s5/c4b.json, c4b_on.json |
2026-10-07 13:31, 13:32 | 11094443 |
| S5 C7 panes and text | python glass.py gates main --route /chat --only aud --flags wp.c1a,wp.p3,wp.c7 --mode laser --json; the same on /invites |
PASS both, AUD 0 issues: /chat four panes container-pane (980 × 720 → 768 × 560 …), the empty-chat prompt text-whole (22 px vs 12); /invites InvitesList container-pane, the title text-whole (1032 × 32 → 472 × 38, 29.6 px vs 22). The JSON holds a friend's name (scratch copy redacted) |
<scratchpad>/s5/c7_chat.json, c7_invites.json |
2026-10-07 13:34, 13:36 | 11094443 |
| S5 E-MENU (R2-5) | python glass.py gates main --pre <menu_N.js: a lab context menu of N inert items through Steam's own menu component> --only size --flags wp.c1c --mode pad for N = 5, 6, 7, 10, and N = 7 --mode laser |
rows PASS in every layout: 5 regular column 384 × 72 pitch 78, 6 compact column 384 × 64 pitch 64, 7 and 10 grid 284 × 72 pitch 78 (≥ 280); Cancel FAIL by its own line every time: "fill 188 x 56 on a 192 x 60 element, 14 px clear …" (C1c still draws 56 inside a clear border: REQ Coordinator->C1c (1) is open) | <scratchpad>/s5/emenu_{5,6,7,10}_pad.json, emenu_7_laser.json |
2026-10-07 13:37–13:42 | 11094443 |
| S5 P-23 bound (R2-11) | python glass.py conformance --route /library/tab/AllGames --route /library/lgs/steamhome --only P-20,P-22,P-23 --pad --flags wp.c2a,wp.p3,wp.c1a --mode pad |
ran: bound 612 on AllGames ("bottom ornament") and 704 on What's New ("no ornament: glass bottom 720 − 16"); P-23 FAIL on both for the tab bar's focus at y 108 (< 124, the top bound); P-20/P-22 FAIL there from the pre-recovery sweep (13:43, before the overlay recovery) | <scratchpad>/s5/conf_p23.json |
2026-10-07 13:44 | 11094443 |
| S5 pad-bfs exits (C1b #10, C2a #14) | python glass.py pad-bfs --route /search/tab/All --pre <zero state / "half"> --flags wp.c1b,wp.p3,wp.c1a --mode pad; --route /library/tab/AllGames --flags wp.c2a,wp.p3,wp.c1a --mode pad --budget 300 |
zero state PASS: 7 of 7, 3 exits back by overlay (was 4 of 7); results: 34 nodes, 32 of 34 reached, 9 exits all back by overlay (was 4 of 34), the 2 left are Steam's %{Arrows} (focusable: false, below); AllGames 106 nodes, 15 exits all back by overlay, truncated at 309 s (350 posters) |
<scratchpad>/s5/bfs_search_c1b.json, bfs_search_half.json, bfs_allgames3.json (redacted) |
2026-10-07 14:16–14:24 | 11094443 |
| S5 hv step mode in a native session | python glass.py native-session --step 'js "<input classes, reported surfaces>" --mode laser' --step "hv p10_s5_ns_laser --mode laser --look" --step '… --mode pad' --step "hv p10_s5_ns_pad --mode pad --look" --step "sgcheck …" |
the laser hv step ran in laser mode (step: mode=laser, metrics JSON mode: laser, native: on, layer: true, both lab locks); before the fix it ran in the session's pad mode. The session was cut by the usage limit after the pad look; it still ended normally (CSS only 14:56:47, no frame left on either machine). Looks re-taken in part 2 |
<scratchpad>/s5/ns.log |
2026-10-07 14:50 | 11094443 |
| S5 offline sweeps | python tools/p2/test_gates_page.py (case 0 + 38 cases), python tools/p2/test_motion_page.py (5 cases), python tools/p2/test_sgcheck.py, python tools/p2/tl6_locks.py --static-only, python -m pyflakes …, node --check lab/*.js, glass.py check-theme, TL-2 edge/focus --png |
PASS all: new cases 12a2 (one long word in a line-clamped box keeps its SHRUNK), 14 (E-SEG 140 / 120), 15 (AUD re-match: wrapped and sorted rows matched, a repeated or renamed identity GONE; with the re-match disabled the case FAILs); motion: only the travelling pill is a move, the menu, sheet and drawer are P-54; TL-2 +58.5 / +42.5 and edge 45.4 … −3.2 unchanged | tools/p2/fixtures/gates_page.html, motion_page.html |
2026-10-07 15:25–15:45 | n/a |
| S5 focus rooms (C2a-R2 (3)) | offline: C2a reviewer's live captures shots/p2_c2a_r2_focus_{0..3}.png and their result JSON re-finished by glass.focus_finish with room auto / none / bright / dark |
auto: P-14 Collections +49.7 (bright) / +73.0 (dark), What's New +49.8 / +73.2, PASS; P-16 band +7.6 over bright (FAIL < 20) / +29.3 dark (texels 100 % translucent); none (the old reading over black): +92.5, +92.9, +219.5. The reviewer's own recomputation: bright L 225 +8.9 |
(reviewer's shots, kept) | 2026-10-07 15:33 | 11094443 |
| S5b probe: popups, Steam's arrows | python glass.py js "<popup names + visibility, L.surfaceName('barpopup'), the %{Arrows} nav nodes on /library/tab/AllGames>" (route given back) |
two barpopup windows (92520001, 92520007), both hidden at rest, surfaceName the first; both %{Arrows} have a nav node with m_Properties.focusable === false and an onClick (laser-only): the basis of notFocusable |
<scratchpad>/s5/out_probe.txt |
2026-10-07 15:38 | 11094443 |
| S5b target_for (unit) | on the Frame: lab.target_for('barpopup') with two stubbed barpopup targets and a stubbed L.surfaceName, called outside and inside a running event loop (as capture() does) |
PASS: the shown window's target both times (ws7), bar unaffected, 2 JS calls; no __pycache__ left |
<scratchpad>/s5/tf_test.py |
2026-10-07 15:37 | n/a |
| S5b focus rooms live (C2a-R2 (3)) | python glass.py focus main --route /library/home --pre <wait> --pairs <C2a reviewer's pairs.json> --flags wp.c2a,wp.p3,wp.c1a --mode pad (--room auto) |
ran (native off): P-14 Collections +49.7 bright / +73.0 dark PASS, What's New +49.8 / +73.2 PASS; P-16 band +7.6 bright (FAIL < 20) / +29.3 dark, regions 93–100 % translucent; the same captures read as stored gave +219.5. Captures deleted | — | 2026-10-07 15:51 | 11094443 |
| S5b motion entries (C2a-R2 (4)) | python glass.py motion main --route /library/home --pre <C2a reviewer's m_section.js> --name p10_s5_c2a_section --flags wp.c2a,wp.p3,wp.c1a --mode laser |
PASS (automatic part): 12 animations, all tokens; geometry 0 issues; moves 2: the pill's translate and width transitions, 156 px, "shown before the interaction" (C2a's run at 13:41 failed P-54 on them). Strip viewed: the pill slides Recent → Collections, the grid fades in |
shots/p2_motion_p10_s5_c2a_section_strip.png |
2026-10-07 15:52 | 11094443 |
| S5b motion barpopup (C2b-R2) | python glass.py motion barpopup --pre <open "+", wait until the list shows> --name p10_s5_plus_open --flags wp.c2b --mode laser |
15:52: ran in 10 s (no warm-up timeout; warm after the pre), 6 frames of the "+" opening, but P-53 "window scale 1.0..1.04" (the 600 px threshold scaled by width: 141 px); 16:04 after the 600 × m fix: PASS, 0 geometry issues. Strip viewed: the grid materializes, frame 0 black (opacity 0) |
shots/p2_motion_p10_s5_plus_open_strip.png |
2026-10-07 15:52, 16:04 | 11094443 |
S5b motion self-test (R1 M1, lab_motion.js changed) |
python glass.py motion main --route /library/home --selftest 300 |
PASS: max error .002 (limit .05) on both boxes, as in R1 | shots/p2_motion__p10_selftest_300_strip.png |
2026-10-07 16:06 | 11094443 |
| S5b AUD T1 / T3 (C2b-R2, R2-15) | python glass.py gates barpopup --pre <open "+"> --only aud --mode laser --json; the same with --flags wp.c2b,c2bToggle |
T1 (16:07): 24 cells waived by E-GRID, 6 labels by E-GRID (labels), 5 SHRUNK kept (qBittorrent, Chromium, LXTerminal, RenderDoc: "cut across … a line-clamped box draws none across"; Hide/Show Screens). T3 (16:11): stock 51 / themed 53 records, 49 re-matched across T3's DOM move, 1 path collision not compared, 23 + 5 waivers; issues = the same 5 labels + GONE "Liquid Glass" row and label (replaced by C2b's toggle row). Before: 49 GONE (15:21, and 15:54 before the collision rule: a SHRUNK between the old list box and the toggle row). Both runs overlapped another agent's native session (native: on; earlier runs then showed CONTRAST 1.5 from transparent acked fills, now noted in the summary) |
<scratchpad>/s5/out_aud_t1.txt, out_aud_t3tog.txt |
2026-10-07 16:07, 16:11 | 11094443 |
| S5b P8 SteamVR theme back | python glass.py shot vr:systemui _p10_s5_p8 --theme off; then glass.py shell status |
PASS: "(SteamVR pages themed again at the lock exit)"; daemon journal paused 15:55:29 → resumed 15:55:30 (3 s); steamvrPages.paused false, three pages ok. Capture deleted |
— | 2026-10-07 15:55 | 11094443 |
| S5b TL-5 | python glass.py hv p10_s5_tl5 |
PASS: metrics, exit 3 (verdict withheld), native: on in the JSON; no PNG on either machine (/tmp/lgs/hv-* none, %TEMP%\lgs-hv empty, no look folder) |
— | 2026-10-07 15:55 | 11094443 |
| S5b pad-bfs (C2a-R2 (1), C2a #14, C1b #10) | pad-bfs --route /library/home --stock --budget 200; --route /library/home --flags wp.c2a,wp.p3,wp.c1a --mode pad; --route /library/lgs/steamhome (same flags); --route /search/tab/All --pre <"half"> --flags wp.c1b,wp.p3,wp.c1a --mode pad |
stock Home: 44 nodes, 36 of 72 unreached (= the session 2 baseline), 7 exits back by overlay (review: 4 of 46); C2a Home: 24 of 26, 5 exits back, left: the card's Play and Options; What's New: starts (was "no gamepad focus"), 41 nodes, 7 exits back, truncated at 200 s, 21 Steam focusable: false nodes (arrows, feed avatars) listed apart; search results: PASS 32 of 32, 2 arrows apart. All four overlapped another agent's native session. The stock run's console summary printed feed names (the saved JSON is hashed; scratch copy redacted) |
<scratchpad>/s5/bfs_stock_home.json, bfs_home_c2a.json, bfs_wn.json, bfs_search_half2.json |
2026-10-07 15:55–16:19 | 11094443 |
| S5b perf --ab (R2-13) | python glass.py perf main --route /library/home --ab theme --rounds 1 --seconds 2 --flags wp.c2a --mode pad |
PASS: 8 runs native off; fps median 87.75 / 89.0 = 1.014; extra long frames −0.5 ≤ A/A spread 5; each subject run reapplied (action logger, flags overlay, mode classes) |
<scratchpad>/s5/out_perf_ab.txt |
2026-10-07 16:19 | 11094443 |
| S6 nav-node ownership probe (C2a-R2 (6)) | python glass.py js <own_probe.js: Home, cell 6 taken, card open; for every focusable with a nav node: node.m_element === el?> --flags wp.c2a,wp.p3,wp.c1a --mode pad |
20 focusables with a node, all with m_element; 18 own theirs (= the host element of the node's fiber); not own: lgs-home-play, lgs-home-more (the card's div role="button", node = the cell's) |
<scratchpad>/s6/own_probe.js |
2026-10-07 16:25 | 11094443 |
| S6 pad-bfs v13 Home (C2a-R2 (6)-(8)) | python glass.py pad-bfs --route /library/home --flags wp.c2a,wp.p3,wp.c1a --mode pad --budget 240 --out <scratch> before (16:27, (6) only) and after (16:32) the replay and recheck changes |
16:27: 0 of 26 unreached, inner Play and More, but #18 (row 2's last cell on page 1) untakeable (page 2 shown; its only way in came from page 1) and What's New -Left-> Recent irreversible, recheck "not replayable" (the D-pad path goes -Left-> Apps, so the first recheck looked for the wrong target). 16:32: PASS, 26 nodes, 219 moves, 0 unreached, 0 untakeable, 0 irreversible, takeOrder 1 (What's New -Left-> Recent; on the D-pad path -Left-> Apps and back), 5 exits back by overlay. Probe 16:29 (seg_probe.js): Apps taken directly, Right -> What's New, Left -> Apps |
<scratchpad>/s6/bfs_home_c2a2.json (redacted), out_bfs_home2.txt |
2026-10-07 16:27-16:33 | 11094443 |
| S6 TL-3 (re-run after the BFS change) | python tools/p2/tl3_settings_pad.py --route /settings/system |
PASS: 45 = 45, 0 missing, 0 extra; the new BFS keeps 0 unreached, 0 irreversible, 0 takeOrder, 0 inner on Settings; baseline rewritten (redacted: 0 clear texts) |
tools/p2/baselines/padbfs_settings_system.json |
2026-10-07 16:34 | 11094443 |
| S6 TL-6 static, lint | python tools/p2/tl6_locks.py --static-only; node --check lab/lab_bfs.js; python -m pyflakes glass.py |
PASS (incl. "hv step options parsed inside native-session"); syntax and lint clean | — | 2026-10-07 16:35 | n/a |
| S6 native session laser look (P7 recheck) | s5/ns_run2.py: native-session --step 'js <input classes, reporter surfaces> --mode laser' --step "hv p10_s5b_ns_laser --mode laser --look", the same with --mode pad |
step JSON mode: laser / pad, native: on, layer: true; reporter surfaces both times main, bar, two barpopups, floatingfooter, frame.menu; looks viewed: laser shows the frame menu's icon column beside the window and legends without glyphs, pad the same with glyphs. Both deleted on the PC at once; /tmp/lgs/hv-* 0. The PC process ended after these steps; device checked 16:23: CSS only, native.lock free |
<scratchpad>/s5/ns2.log |
2026-10-07 16:20-16:23 | 11094443 |