Files

36 KiB
Raw Permalink Blame History

P1 Runtime core and lifecycle: evidence log

Status

Maintenance session (2026-10-07 10:45-, platform maintainer). Both open REQs to P1 handled:

  • REQ P2->P1 done: device/rt/00-rt.js makeScope keeps a Set of live subscriptions; every tracked off() removes itself when it runs, so fired or cancelled scoped timers no longer pile up (runtime.md §3.2, §11). Offline 44/44 (h_maint.js: the R1 harness + C23-C26, which fail on the old code), rt_harness.js 78/78 in both modes, h1.js 9/9, h2.js clean. Live with the new file: RT-1, RT-4, RT-I PASS (10:54-10:58), RT-2 PASS (11:02).
  • REQ C4a->P1 answered: already met by R1 M1 (pure-factory harvest works in a fresh context; a short index is never used or cached; lgs on retries with backoff). Live proof this session: SharedJSContext crashed at 10:56:45 (V8 OOM, below) and the next lgs on built a 544-module index in the fresh context at the first attempt.
  • Incident (not caused by P1's change, recorded): at 10:56:45 Steam's SharedJSContext renderer died of a V8 OOM (journalctl: steamwebhelper "V8 process OOM (Oilpan: Large allocation)", heap about 195 MB after a 2.5 s Mark-Compact, core dumped; the daemon saw Target crashed at 10:57:12) while RT-2's first run was loading the runtime with 30-odd lab commands of other agents queued. RT-2's first run failed (__LGS_RT gone), its re-run passed. The same context after the restart had an 80 MB heap (11:17). So RT-1 now also measures SharedJSContext's JS heap after a forced GC and fails above 1.5 MB retained per on/off cycle (first run: −0.28 MB per cycle), and RT-1 holds native.lock for its run, because another agent's native session started at 11:17:13 changed listener counts between RT-1's phases (that run failed only on listener deltas of the daemon's reporter). device/lgs.py, installed.
  • Open REQs to P1: none (grep 11:40).

Complete, review R1 fixed (2026-10-07 09:30, Frame time; Steam 11094443). M1 reached (04:10), M3 reached (05:36). Every finding of wp/P1-review-R1.md is fixed and re-verified live (table "Review R1" below; m1 is a stated deviation for the coordinator to accept). Live on the final code: RT-1 to RT-7, RT-H and the new RT-I (class index recovery) and RT-T (toast) all PASS (full suite 08:26, all ten; final-code runs 09:08–09:25: RT-1..5, RT-7, RT-H, RT-I, RT-T in the full run, RT-2 and RT-6 again after the last two changes), and RT-1..RT-5 PASS under both the pad and the laser input stubs (09:15, 09:18). Kept JSON: shots/p2_p1_selftest_r1_*.json. Open requests addressed to P1: none (C1a, P2 ×2 answered). M4/M5 do not apply to P1 (no layer, plate or popup fragments); V2 runs the global gates.

What is live (contract docs/phase2/contracts/runtime.md, changelog §11):

  • _wip/ skipping (and every _/. name) in the CSS bundler, the runtime loader and lgs check;
  • python device/lgs.py check [--json] / lgs.check(): offline bundle check (PC or Frame; P10's check-theme);
  • lgs on (R1): waits for Steam's UI and a plausible class index (backoff 2, 4, 8, 15 s; 120 s; each attempt in lgs.log), changes nothing when it gives up; the index is harvested from pure CSS-module factories only, cached only when ok (>= 200 modules) and current, rebuilt otherwise (lgsIndexShared, lgsWebpackRequire for every caller);
  • the loader: CSS core, then 00-rt.js, device/shared/*.js, device/rt/*.js, each file in its own strict-mode evaluation, then start(); CSS-only fallback when the loader fails; --no-rt, flag rt; rt.data('popups') (P6);
  • 00-rt.js: registry (deps, flags, fail-closed incl. dead scopes after removal or a timed-out install, status, log ring), flags (builtin < defaults.json < /tmp/lgs/flags.json < --flags < test overlays), rt.windows (track, onAdd/onRemove, onShow/onHide for pooled popups), bridge, rt.action, rt.expose, test hooks (input stub replayed when P3's module installs later), liveness (exact 2 s timer from a MutationObserver; 0.5 Hz tick, 4 Hz only without an observer; the CSS core watched when there is no main window), counts() incl. vrNavigationType;
  • lgs off cleanup report (runtime.patchedLeft, leftovers XPath sweep of every window), the Off toast after it; lgs status (module states, index); lgs flags; native argument on|off|auto (P8's NATIVE_MODES);
  • the on/off toast: panel glass 320 × 76, radius 30, no ring, P5 motion tokens, Reduce Motion fade, below the top rows;
  • transient install failures (err.transient, REQ P2->P1) retried up to 4 times; the CLI waits (90 s at most) for a locked lab step;
  • built-in flag table (§1.17) plus contracted defaults (react, reactLab, actionsLive, actionsDryRun, sgDepthAnim, shellThemeGraceS 600);
  • lgs selftest [ids] [--mode=pad|laser]: RT-1..RT-7, RT-H, RT-I, RT-T on the live UI.

Remaining: nothing in the card. Open: REQ P1->P6 (index and probe record in lgs_layers.js; does not block P1). Known limits, recorded: RT-6's full CLI cycle runs only when native.lock is free (it was at 08:23 and passed; later runs skipped it while other agents held native sessions); the toast lives in main's document, so it cannot sit above the window as the mockup's Steam toast quad does. For the coordinator: accept RT-7's pass rule (runtime.md §9, review m1). To re-verify after a Steam update or another package's change: python glass.py sync, then python glass.py selftest (all ten, about 8–10 min with lab-lock waits; JSON to shots/p1-selftest.json). Do not run it through frame_ssh run: its 120 s idle timeout kills it (review m7). Offline: node <scratch>/p1/h_r1.js <repo> (copied into the evidence below by command, not kept in repo).

Requests

  • REQ P1->P10: lab/lab_helpers.js:8 caches window.__LGS_INDEX = lgsBuildIndex() without checking it, and keeps it in a closure (const index), so a short index built while Steam reloads (the 06:50 incident: 3 modules) stays in the helpers and in the shared cache. Since review R1, device/lgs_index.js (which lab.py prepends) has lgsIndexShared({minModules: 200}): it reuses the cache only while it is ok and current, caches only an ok index and drops a bad one. Please read the index at call time through it (or at least if (ix.ok) before caching). Also contextMenus() (lab_helpers.js:127) pushes a Symbol('lgs-cm') probe chunk that webpack keeps in webpackChunksteamui for the life of the context: use lgsWebpackRequire() (splices its record) or splice yours. Same as C1a's REQ C1a->P10.
    • P10 (2026-10-07 08:30): done: the helpers take the index at call time through lgsIndexShared() (fallback to the old build only when lgs_index.js lacks it); contextMenus() uses lgsWebpackRequire() (else splices its own record) and also splices the lgs-cm records older helper builds left: live, 7 such records before, 0 after; L.index.ok true, 546 modules.
  • REQ P1->P6: device/lgs_layers.js caches W.__LGS_INDEX = lgsBuildIndex() unchecked (around the index() helper that reads __LGS_INDEX), and its webpack probe Symbol('lgs-layers') (about line 466) is never spliced out of webpackChunksteamui: 24 such records had accumulated on 2026-10-07 08:00 (each keeps its closure alive for the context's life). Please take the index through lgsIndexShared() (in device/lgs_index.js since review R1: caches only an ok index, rebuilds a stale one) and the require through lgsWebpackRequire(), or splice your probe record as P2 and P3 do. P6 (2026-10-07 09:20): done: getIndex() takes lgsIndexShared() when it is in scope, else __LGS_INDEX (not ok: false), and caches a fresh build only when it is good; webpackReq() uses lgsWebpackRequire() when in scope, else splices its Symbol('lgs-layers') record (and any an older build left) right after the push; RP-1, RP-3/4/5, RP-RV pass with it and no lgs-layers record is left in webpackChunksteamui.
  • REQ P1->P9: native/glassd/tools/test_atlas.py and test_shapes.py write fixtures to /tmp/lgs-fx/, outside /tmp/lgs (task rule 7: runtime and test state only under /tmp/lgs or /dev/shm/lgs). Please use /tmp/lgs/p9-fx/. RT-6 classifies /tmp/lgs-fx/ as "P9 fixtures" until then. P9 (2026-10-07, R1): done: every glassd test (test_atlas.py, test_shapes.py, test_fake.py, test_holes.py, test_locks.sh, test_live.sh, test_geometry.sh, test_feedcost.sh, test_phase.sh, test_bench.sh) now uses /tmp/lgs/p9-fx/<test>/ and removes it (and the empty parent) on any exit; the Python tests write no __pycache__; test_phase.sh keeps its SIGUSR1 room dump in its own dir. /tmp/lgs-fx/ is no longer written; the stale one on the Frame is gone.
  • REQ P1->P6: after lgs off, SharedJSContext keeps __LGS_LAYERS_NAVMOD (device/lgs_layers.js:512, a cache of a webpack module id), plus __LGS_LAYERS_LAST and __LGS_LAYERS_T2_LAST (not in the tree: an ad-hoc test script?). G-REMOVE counts every __LGS* global left after off. Please delete them on teardown, or declare them inert in contracts/reporter.md so V2 can list them as expected (like __LGS_INDEX). RT-4 reports them as "foreignGlobals". P6 (2026-10-07): done: a real stop() (not a re-injection) now deletes __LGS_LAYERS, __LGS_LAYERS_NAVMOD and every __LGS_LAYERS*_LAST; the reporter no longer writes a _LAST global (the last stop reason is in status().last while the API stays). __LGS_LAYERS_T2_LAST was from a P6 test instance; it is swept by the next real stop.
  • REQ P1->P2: device/rt/02-react.js defines react without flag: 'react', while contracts/react.md §1 makes react its kill switch (built-in default on). BUILTIN_FLAGS now has react: true (also reactLab: false, actionsLive: false), so adding flag: 'react' keeps today's behaviour and makes lgs flags react=off work.
    • P2 (2026-10-07): done: define({name: 'react', flag: 'react', …}) in 02-react.js; ready() also refuses while the flag is off. contracts/react.md §1 (v2).
  • REQ P1->P10: optional, for V2: a glass.py passthrough for python3 device/lgs.py selftest [RT-1,...] (exit code kept) that copies /tmp/lgs/p1-selftest.json back to the PC. Until then it runs through FR run.
    • P10 (2026-10-07 06:35): done: python glass.py selftest [RT-1,...] [--mode=pad|laser] [--json] runs device/lgs.py selftest (no lab lock: each test takes its own), keeps the exit code and copies /tmp/lgs/p1-selftest.json to shots/p1-selftest.json.

Review R1 (wp/P1-review-R1.md): what was done

Finding Fix (files) Evidence
M1 stale or short class index, no readiness wait, harvest runs every factory lgs_index.js: harvest only "pure" factories (e=>{e.exports={…}}; 545 of the 552 modules the old harvest found, the other 7 were localization JSON and a zlib table), never any other factory; ok (>= 200 modules for steamui), factories, current(); lgsIndexShared() caches only an ok, current index and drops a bad one; lgsWebpackRequire() splices its probe record. lgs.py: wait_ready() before anything is torn down (Steam UI, popup manager, main window, live webpack runtime, index ok, at most half the theme's tokens unresolved), backoff 2/4/8/15 s up to 120 s, each attempt logged, gives up without changing anything. lgs_core.js re-checks and reports index in on/status. Item 4: SWEEP_JS is one XPath query per window. Item 5: RT-1 records DOM counters after a forced GC Old vs new harvest on the live UI: 775 of 775 theme tokens resolve identically (theme/*.css + theme/vr), harvest 32 ms (old 44 ms); SteamVR page vr:systemui: 40 of 40 identical. XPath sweep vs element walk: same counts on all 9 windows. Offline h_r1.js A1–A13, B1–B5 (late-registering fake webpack: no runtime → not ok; 3 modules → not ok, not cached, planted bad cache dropped; impure factory never run; 300 modules → ok and cached; new chunk → rebuilt). Live RT-I PASS (forced short harvest: attempts at 0, 2.1, 6.2, 12.1 s logged, gave up after 12.1 s, theme version and runtime unchanged; planted 3-module cache rebuilt by on and by off+on; 0 probe records). RT-1: DOM counters identical before and after 3 cycles (12 documents, 54 813 nodes, 15 097 listeners)
M2 timed-out install not fail-closed 00-rt.js: _dispose() marks the scope dead; every scoped helper is a no-op returning a no-op off() (logged), track() undoes at once, rt.action answers removed; a timed-out install that settles later gets remove() once more (lateSettle). Stub rt.stub.slow (flag rt.stubSlow) in RT-2 Reviewer harness h2.js: after teardown('off') class gone, 0 interval ticks, slowApi not exposed, remove() called twice. h1.js 9/9 ok. h_r1.js C1–C7. Live RT-2 PASS with the slow stub (timed out; its late track, setInterval, setTimeout, listen, on logged as ignored; no lgs-rt-stub-slow* class; not exposed; remove() called again)
M3 toast: ring, non-token motion, over the search capsule lgs_core.js toast(): panel glass card (lgs-glass panel, E3 edge from the material while the theme is on), 320 × 76, radius 30, icon 48, 20/18 px type, frosted (--lgs-mat-thick-blur), no border/outline/ring; all theme tokens with literal fallbacks; Web Animations on P5's tokens (materialize 250 ms + translate −8 → 0 on snappy 488 ms b15, content 250 ms; dematerialize 350 ms), 180 ms fade under Reduce Motion; placed 16 px below the lowest control of the top rows in its column (y 154 on the library, 110 on home) Live RT-T PASS (computed: radius 30px, border 0, outline none, box-shadow without a spread ring, blur 30 px, opacity 1 at rest, 320 × 76, covers no control; animations 250/488/250/250 ms; reduce: one 180 ms opacity animation; theme-off "Off" toast identical computed look; removed after 2.2–2.3 s). Shots shots/p2_p1_toast_live.png (home route), shots/p2_cmp_p1_toast.png (cmp; the mockup's toast is outside its window crop), and a crop pair (scratchpad) of the live card next to shots/p2_window-nav_toast.png's card. Verdict: matches (material, radius, icon, type hierarchy, no outline). Deliberate difference: the mockup's toast is Steam's own quad above the window; P1's toast lives in main's document, so it sits below the toolbar inside the window
RT-6 flaky (vrserver writes chaperone_info.vrchap every 60 s) lgs.py: after-window 61 s (before 8 s); the file listed as a known writer with its cause; also mB4 below Full run 08:23: RT-6 PASS (86 s): 12 new files in the test window, 10 background, 0 unexplained; audit of our process only /tmp/lgs paths
m9 RT-6 restarts the daemon in auto Restarts in the mode found (was), CSS only if it was stopped Full run: fullCliCycle {shellBefore: off, off: stopped, on: started (css only)}
m1 RT-7 rule looser than the card Kept, stated as a deviation in runtime.md §9 for the coordinator (4 of 6 runs met the strict reading; the other two were within the A/A noise) Full run 08:24: fps ratio 0.973 (59.2 → 57.6), long frames css [19, 20, 21, 24] rt [21, 22, 24, 24], median extra 2.5 ≤ A/A spread 5; second run (08:28): ratio 1.027, long css [19, 18, 19, 19] rt [18, 18, 18, 19], median extra −1: the strict reading holds
mB1 Off toast counted as a leftover op('off') runs the core quietly, sweeps, then shows the toast (core_call({op: 'toast'}), which now works without __LGS) verify_r1.py on the Frame (08:20, lab lock): toastInSweep: false, no lgs- id in the sweep, toast shown after the sweep and gone after 2.8 s (the sweep's clean: false came from P6/P8's native-session marks html.lgs-native, data-lgs-cover, data-lgs-pop, not P1's)
m4 counts() without SteamVR navigation-type callbacks counts() and RT-1's COUNTS_JS add vrNavigationType (vrGamepadInput.m_NavigationTypeChangeCallbacks) Full run RT-1: counts on/off include vrNavigationType 1/1 (delta 0)
m2/m3 idle polling; liveness without main Tick 2 s while the observer watches main (reconcile + check), 250 ms only without an observer or main; without main the CSS core is watched; main tracked on add/remove h_r1.js C11 (4 ticks/s without observer), C13 (0.5 Hz with it), C14 (observer liveness 2019 ms), C15–C16 (no main: stays while the core is on, removed 2.2 s after it goes). Live RT-7: idle 0.14 ms/s (3 ticks in 5.95 s; was 0.24–0.39); RT-5b 2.018 s
m5 false bundler warnings bundle_files uses _css_scan (comment- and string-free) verify_r1.py: no warning: lines in lgs.log in the last 2 min after several on (there were two per on before)
m6 lgs dial writes next to the code DIAL = /tmp/lgs/dial verify_r1.py: lgs.py dial 0.5 exit 0, /tmp/lgs/dial = 0.5, no ~/.local/share/glass-shell/dial before or after; the file was removed again
m7 re-verify command dies on the SSH helper timeout selftest prints START <id> <time> before any lock wait; Status points to python glass.py selftest Full run output shows the START lines
mB2 input-stub replay promised, not implemented Implemented: a stub set without rt.input is applied when a module providing it installs (TTL left); set() returns applied h_r1.js C8–C10; live RT-H PASS (stub through P3's rt.input.stub)
mB3 sloppy wrapper 'use strict' first in both wrappers (rt_module_js) All 15 current runtime files wrapped and compiled (node --check): 0 errors; live reload: all 18 modules defined, 0 failed loads
mB4/mB6 RT-6 hides Steam web storage writes; RAM-only evidence New files under Steam's htmlcache/Default/{Local Storage, Session Storage, IndexedDB, WebStorage, File System, databases, Service Worker} and config/*.vdf are read and must carry no Glass Shell marker; window scan adds IndexedDB names and cookies; the final run is kept as shots/p2_p1_selftest_r1.json Full run: 5 such files content-checked clean (IndexedDB LOG/LOCK, QuotaManager); 0 markers in Steam's vdf and storage beforehand (grep)
mB5 contract drift runtime.md §8 idle cost corrected; shellThemeGraceS (600, daemon.md §2 now says 600) in BUILTIN_FLAGS and §4 lgs.py flags lists it
Found in the re-run (not a review finding): an unlocked lgs on --css from another agent reloaded the runtime inside RT-3's locked step lgs.py main(): CLI on, off, toggle, reload, dial take /tmp/lgs/lab.lock when it exists, waiting at most 90 s (then going on, logged); LGS_NO_LAB_LOCK=1 skips it; op() unchanged (PLAN §7.1; safe default with an opt-out, PLAN §1.17 rule) Laser re-run 08:51 RT-3 PASS; final runs below
Found in the re-run: RT-1/RT-4 counted another package's class toggling on <html> (P8's lgs-native, from a native session in another process) as a P1 leftover; RT-1 compared absolute on-phase counts that another process's subscriptions shift Leftovers diffed per mark against the baseline (P1's own marks always count; the daemon's .lgs-native, [data-lgs-cover], [data-lgs-pop] listed as daemonMarksChanged, never counted); RT-1 compares per-cycle deltas (on minus the off before it) and keeps every off at the first off's counts; onDiffs/offDiffs for diagnosis Unit check of _leftover_problems on the four observed shapes (pad baseline loses lgs-native: clean; laser input change: reported; planted lgs-rt-stub and lgs-leak: reported; lgs-native appearing: daemon list). Pad/laser re-runs 08:41–08:52: laser 5/5 PASS, pad 4/5 (RT-1 on-phase counts shifted: NavigationSource 12–13 vs 2–3, another session); pad RT-1 again 08:57 PASS with no phase diff
Found in the final runs: RT-6 flagged a source file another agent uploaded straight into ~/.local/share/glass-shell/native/spike/ (09:08), then SteamVR's tracking map ~/.config/openvr/config/cv/xrservice/serializedmap/*.pb (09:22) Synced sources under the install's `device theme
REQ P2->P1 (new during this round): retry installs that fail with err.transient 00-rt.js retryTransient: after max(1000, retryAfterMs), at most 4 times, logged, reason/retries in status; never after teardown or a timeout; dependents follow. Stub rt.stub.transient (flag rt.stubTransient) in RT-2 h_r1.js C17–C22 (40/40 in total); live RT-2 PASS 09:19 (transientRetried: installed after exactly 2 logged retries)

Evidence

Test Command Result Shots / JSON Date Steam build
offline node rt_harness.js (scratchpad harness: fake popup manager; 3 on/off cycles, failure isolation, flags push/pop, windows, bridge, liveness) all checks ok; liveness removal 2.0–2.3 s — 2026-10-07 —
check python device/lgs.py check on a fixture tree with 7 planted faults all 7 reported (braces, @keyframes outside .nowrap, bare declaration in .nowrap, malformed token, bad JSON, JS syntax via node, duplicate module name); _wip files listed as skipped — 2026-10-07 —
M1 live flock /tmp/lgs/lab.lock python3 device/lgs.py reload on the Frame runtime: running, 11 modules defined (4 P1 stubs + 7 from P2, P3, P6), all off behind flags, loadMs 117, theme on, shell CSS-only — 2026-10-07 11094443
offline (session 2) MO=1 node <scratch>/p1/rt_harness.js <repo> (harness extended: bridge on every set with changed, rt.action round trip / timeout / no-daemon / teardown, rt.expose set, refused for a core member, deleted on flag-off; fake MutationObserver) 78 checks ok, 0 FAIL; liveness 2049 ms with the observer, 2298 ms tick-only — 2026-10-07 —
RT-1 FR run "python3 -B ~/.local/share/glass-shell/device/lgs.py selftest" (after python glass.py sync) PASS (7.0 s): warm-up on/off then 3 × (on --flags rt.stubs, off): module states identical; Steam counts on {popupCreated 6, popupDestroyed 3, NavigationSource 7} / off {4, 2, 6} in every cycle (the +2 created = CSS core + runtime; +1 nav = rt.stub.a); DOM listeners on main/bar/barpopup identical per phase (on adds only the runtime's visibilitychange and stub b's pointerdown); off reports patchedLeft 0, no errors, no new marked element /tmp/lgs/p1-selftest.json (Frame, RAM) 2026-10-07 05:33 11094443
RT-2 same run PASS (2.8 s): rt.stub.throw failed ("throws on purpose"), its class gone from every window; stubs a/b/c installed; fixture files rt/98-selftest-syntax.js (SyntaxError) and rt/99-selftest-loadthrow.js (throw at load; its module failed too) in failedLoads; every other module unchanged; html.lgs-on and the theme <style> on main; runtime running same 2026-10-07 05:33 11094443
RT-3 same run PASS (10.2 s): "+" opened with L.click('bar', '%{AddWindowButton}'); barpopup (valve.steam.gamepadui.barpopup.76640001) visible, lgs-rt-stub + data-lgs-rt-stub="barpopup" on its <html>, stub log "window shown: barpopup"; closed again, hidden. Deviation (noted): Steam pools the bar popup window, so opening "+" creates no window and fires no popup-created callback; the runtime reports it as rt.windows.onShow (contract §3.3). onAdd for really created windows is covered by the offline harness same 2026-10-07 05:33 11094443
RT-4 same run PASS (14.7 s): (a) stubs: removed react, stub c, b, a; patchedLeft 0; no __LGS_RT/__LGS, no marked element, no global left. (b) integration, every module's flag on (react, react-lab, input, attention, states, tooltip, popups + stubs): 10 removed, patchedLeft 0, clean. Foreign globals reported, not ours: __LGS_LAYERS_NAVMOD, __LGS_LAYERS_LAST, __LGS_LAYERS_T2_LAST (REQ P1->P6). An earlier run counted another agent's probe element (div.lgs-glass[data-lgs-mat][data-lgs-dz] in main, present before our cycle and gone minutes later): the sweep now diffs against a baseline off taken first; the core's own marks always count same 2026-10-07 05:33 11094443
RT-5 same run PASS (5.4 s): (a) lab --theme off path: runtime gone after 0.36 s; (b) html.lgs-on removed from main alone, core sweep stopped: liveness removed the runtime after 2.017 s (2.497 s with the tick alone in session 1's code: now an exact 2 s timer armed by the MutationObserver), stub classes gone same 2026-10-07 05:33 11094443
RT-6 same run PASS (31.9 s): write audit of our process: only /tmp/lgs, /tmp/lgs/lgs.log, /tmp/lgs/sync.lock, /tmp/lgs/vr-theme-paused; find scan minus two control windows: 0 unexplained (known: systemd transient-unit state under /run/user/1000/systemd, Steam's own htmlcache and logs); nothing new under ~/.local/share/glass-shell; unit files only lgs-shell.service transient; no autostart; no lgs keys in web storage; full CLI cycle done (off stopped the unit, on started it CSS only). Earlier runs classified: /dev/shm/u1000-Shm_* (Steam/SteamVR IPC, mapped by vrserver and vrcompositor), /tmp/lgs-fx/ (P9 fixtures, REQ P1->P9), __pycache__/*.pyc (other agents' imports; our process writes none) same 2026-10-07 05:33 11094443
RT-7 same run PASS (41.9 s): L.perf('main', 3000) on /library/tab/AllGames, ABBA × 2: median fps theme only 68.65, theme + runtime 70.75 (ratio 1.031 ≥ 0.95); long frames > 34 ms per run css [10, 11, 10, 8], rt [11, 9, 11, 9] (median extra 0 ≤ A/A spread 3); p95 44.3 both; runtime tick 0.26 ms per second (budget 1). A first version with 3 pairs and means failed once at ratio 0.908 from one hitched run (worst frame 278 ms while other agents compiled): hence ABBA and medians same 2026-10-07 05:33 11094443
RT-H ... lgs.py selftest RT-H PASS (12.4 s): with wp.p3 on, rt.test.input.set('pad'/'laser', {ttlMs: 1500}) applied through P3's rt.input.stub (classes, data-lgs-vr-mode, rt.input.mode), then expired back to the live mode; flags.with (off inside, installed after); flags.push TTL 1.2 s expired, 0 overlays; action logger on inside the locked step; rt.expose (rtStubC by stub c; P2 already exposes react); rt.action('echo') answered by the daemon ({ok, result: {echo: 'p1-rt', src: 'main'}}); bridge keys daemon, geom, page, reply same 2026-10-07 05:34 11094443
RT-1..5 pad ... lgs.py selftest RT-1,RT-2,RT-3,RT-4,RT-5 --mode=pad PASS all five (lab input stub via classes; RT-5b 2.015 s) same 2026-10-07 05:35 11094443
RT-1..5 laser ... lgs.py selftest RT-1,RT-2,RT-3,RT-4,RT-5 --mode=laser PASS all five (RT-5b 2.014 s) same 2026-10-07 05:36 11094443
full suite, final code FR run "python3 -B ~/.local/share/glass-shell/device/lgs.py selftest" after the last sync PASS all eight (RT-1..RT-7, RT-H); lgs-shell CSS only before and after every test. RT-5: 0.31 s / 2.018 s. RT-6: 0 unexplained, audit only under /tmp/lgs, full CLI cycle done. RT-7 (busier device): median fps 67.5 vs 67.45 (ratio 0.999), long frames css [21, 18, 20, 16] rt [20, 19, 21, 20] (median extra 1 ≤ spread 5), tick 0.24 ms/s /tmp/lgs/p1-selftest.json (Frame, RAM) 2026-10-07 05:40 11094443
device left lgs status theme on, runtime running (react installed, others off), no session flags, barpopup and tooltip hidden, lgs-shell CSS only (it ran CSS only when each test began; the selftest restarts a unit its theme-off phases stopped, in the same mode) — 2026-10-07 05:37 11094443
offline (R1) node <scratch>/p1/h_r1.js <repo>; reviewer harnesses node h1.js <repo>, node h2.js <repo>; MO=1 and plain node <scratch>/p1/rt_harness.js <repo> h_r1.js 34 ok, 0 FAIL (A: harvest on a fake late-registering webpack; B: CHECK_JS; C: dead scopes, late settle, flag-off continuation, stub replay, counts, tick rates, liveness with/without observer and main); h1 9/9 ok (case 5 now: removed without main once the core goes); h2: class gone, 0 ticks, not exposed, remove() ×2; rt_harness.js 78/78 in both modes — 2026-10-07 08:00 —
harvest equivalence (R1) old lgsBuildIndex (HEAD) vs new, both built read-only in one evaluation (lab.py eval SharedJSContext @probe2.js; glass.py js --in vr:systemui) Steam: old 552 / new 546 modules, 775/775 theme tokens identical (35 unresolved, 2 ambiguous in both: theme/vr tokens), new 32 ms vs old 44 ms, 0 probe records left. vr:systemui: 17 / 16 modules, 40/40 identical — 2026-10-07 07:55 11094443
sweep equivalence (R1) element walk vs SWEEP_XPATH on every window (glass.py js) identical counts on all 9 windows — 2026-10-07 08:00 11094443
full suite (R1) python glass.py sync, then python glass.py selftest --json (all ten) PASS all ten (08:16:40–08:26:45). RT-1 25.6 s: counts on/off {popupCreated 6/4, popupDestroyed 3/2, navigationSource 5/4, vrNavigationType 1/1}, DOM counters equal before and after 3 cycles (12 docs, 54 813 nodes, 15 097 listeners). RT-2 13.4 s incl. the slow stub. RT-3 195.7 s (lock waits). RT-4 132.7 s. RT-5 a 1.16 s, b 2.018 s. RT-6 86.3 s: 0 unexplained, 5 Steam storage files content-checked clean, audit only /tmp/lgs, full CLI cycle back to CSS only. RT-7 84.5 s: ratio 0.973, long css [19, 20, 21, 24] rt [21, 22, 24, 24], median extra 2.5 ≤ spread 5, idle 0.14 ms/s. RT-H 10.4 s. RT-I 22.0 s. RT-T 16.2 s shots/p2_p1_selftest_r1.json (kept copy of shots/p1-selftest.json) 2026-10-07 08:26 11094443
RT-7 again (R1) python glass.py selftest RT-7 PASS (72.8 s): ratio 1.027 (64.05 → 65.8 fps), long frames css [19, 18, 19, 19] rt [18, 18, 18, 19], median extra −1 (meets the card's strict reading), idle 0.117 ms/s (3 ticks in 5.7 s) scratchpad rt7b.json 2026-10-07 08:28 11094443
RT-I, RT-2 (R1) python glass.py selftest RT-I,RT-2 PASS both (RT-2 182.5 s with lock waits; RT-I 80.3 s): see the "Review R1" table — 2026-10-07 08:16 11094443
RT-T (R1) python glass.py selftest RT-T (three runs while fixing: first FAIL from a probe bug, reading a live computed style after the toast was removed, and the toast at y 112 over the library's filter row; then PASS twice) PASS (13.7 s): see the "Review R1" table shots/p2_p1_toast_live.png, shots/p2_cmp_p1_toast.png 2026-10-07 08:10 11094443
mB1, m6, m5 (R1) python3 -B /tmp/lgs/p1/verify_r1.py on the Frame (lab lock; scratchpad script, deleted after) Off sweep has no #lgs-toast, toast shown after it, gone after 2.8 s; lgs dial 0.5 writes only /tmp/lgs/dial (removed again); no bundler warning lines — 2026-10-07 08:20 11094443
RT-1..5 pad / laser, first try (R1) python glass.py selftest RT-1,RT-2,RT-3,RT-4,RT-5 --mode=pad (then --mode=laser) pad: RT-2, 3, 5 PASS; RT-1, RT-4a FAIL: "new since baseline html.lgs-input-pad[data-lgs-vr-mode]": the baseline element was html.lgs-input-pad.lgs-native[data-lgs-vr-mode] and another agent's native session cleared P8's lgs-native meanwhile, so the whole-element signature changed. laser: RT-1, 2, 5 PASS; RT-4 FAIL (same, and lgs-native appearing); RT-3 FAIL: __LGS_RT is not defined: at 08:33:42 another agent ran lgs on --css (CLI, no lab lock), which reloaded the theme and runtime inside RT-3's locked step. Not P1 leftovers. Fixed in the test (per-mark diff, daemon marks apart) and in the CLI (waits for lab.lock) scratchpad pad.json, laser.json 2026-10-07 08:38 11094443
RT-1..5 pad / laser, second try (R1) same commands after the per-mark diff and the CLI lab lock laser 5/5 PASS (08:49–08:52); pad 4/5: RT-1 onStatusIdentical false while another session held 12–13 NavigationSource subscribers (2–3 normally); pad RT-1 again 08:57 PASS with no phase difference; RT-1 then switched to per-cycle deltas scratchpad pad2.json, laser2.json 2026-10-07 08:57 11094443
final runs (R1) python glass.py selftest (all ten), then ... RT-1,RT-2,RT-3,RT-4,RT-5 --mode=pad, then --mode=laser full 09:08: 9/10 PASS (RT-1: per-cycle deltas {popupCreated +2, popupDestroyed +1, navigationSource +1, vrNavigationType 0} identical, DOM counters flat; RT-4b daemonMarksChanged ["VR: div[data-lgs-pop]"] listed apart; RT-5 1.98 / 2.023 s; RT-7 ratio 1.055, long css [17, 18, 17, 18] rt [20, 16, 16, 15], median extra −1.5, idle 0.245 ms/s; RT-I 4 backoff attempts; RT-T at y 110, removed after 2.35 s); RT-6 FAIL on another agent's direct source upload (fixed, next rows). Pad 09:15 5/5 PASS (RT-5 1.75 / 2.019 s). Laser 09:18 5/5 PASS (RT-5 1.69 / 2.018 s) shots/p2_p1_selftest_r1_0908.json, _pad.json, _laser.json; the 08:26 all-ten run: shots/p2_p1_selftest_r1_0826.json 2026-10-07 09:18 11094443
RT-2, RT-6 on the final code (R1) after syncing the transient retry and the RT-6 classification: python glass.py selftest RT-2,RT-6, then python glass.py selftest RT-6 RT-2 PASS (11.7 s, all 14 checks incl. transientRetried); RT-6 09:22 FAIL on SteamVR's tracking map (not ours: audit only /tmp/lgs); after attribution by writer, RT-6 09:25 PASS (86.3 s; full CLI cycle skipped: native.lock held by another agent's native session) shots/p2_p1_selftest_r1_rt2.json, shots/p2_p1_selftest_r1_rt6.json 2026-10-07 09:25 11094443
offline, final code (R1) node <scratch>/p1/h_r1.js <repo>, h1.js, h2.js, rt_harness.js (both modes); python device/lgs.py check 40/40, 9/9, h2 clean, 78/78; check 59 files, 0 errors — 2026-10-07 09:20 —
device left (R1) lgs.op('status', vr=True) on the Frame, 09:27 theme on, index ok (546 modules, 0 unresolved), runtime running, 0 failed modules. Another agent's native session was active (it held native.lock, with its own step overlays and pad stub), so native mode and those flags are that agent's, left alone. P1's scratch files on the Frame (/tmp/lgs/p1) deleted; no /tmp/lgs/dial; no room imagery taken — 2026-10-07 09:27 11094443
offline (maintenance) node <scratch>/maint/h_maint.js <repo> (P1's R1 harness h_r1.js + C23-C26 for REQ P2->P1); rt_harness.js plain and MO=1; h1.js; h2.js; the same h_maint.js against a copy of 00-rt.js with the old array list 44 ok, 0 FAIL: C23 200 fired rt.setTimeouts → subscriptions back to the baseline (0); C24 50 pending timers + a listener + a bus subscription counted (52); C25 cancelled and unsubscribed → 0 and the listener really removed; C26 removal runs the live cleanups newest first, a pending timer never fires, an early off() does not run twice. Old code: C23-C25 FAIL (200 and 252 entries left). rt_harness.js 78/78 both modes, h1.js 9/9, h2.js clean — 2026-10-07 10:52 —
RT-1, RT-2, RT-4, RT-I (maintenance, new 00-rt.js) python glass.py selftest RT-1,RT-2,RT-4,RT-I --json RT-1 PASS (62.6 s), RT-4 PASS (16.2 s), RT-I PASS (31.4 s: forced short harvest gives up after logged backoff and changes nothing; planted 3-module cache rebuilt by on and by off + on; 544 modules). RT-2 FAIL (_st_status null): Steam's SharedJSContext died of a V8 OOM at 10:56:45 while the step loaded the runtime (journal: steamwebhelper "V8 process OOM (Oilpan: Large allocation)", heap ≈ 195 MB; daemon Target crashed 10:57:12); the restore's lgs on at 10:57:17 installed in the fresh context (2614 factories, 544 modules, first attempt) shots/p2_p1_selftest_maint_1054.json 2026-10-07 10:54-10:58 11094443
RT-2 re-run (maintenance) python glass.py selftest RT-2 --json PASS (208 s with lock waits), all 14 checks incl. transientRetried, slowLateWorkIgnored shots/p2_p1_selftest_maint_rt2_1102.json 2026-10-07 11:02 11094443
RT-1 with the JS heap check (maintenance) python glass.py selftest RT-1 --json after installing lgs.py (heap check) FAIL on listener deltas only: another agent's native session started at 11:17:13 (journal), and the daemon's reporter added and removed its own listeners (animation*, transition*, scroll, focusin/out) between RT-1's phases; module states, stubs, off reports clean; memory ok: JS heap 80.5 → 79.65 MB over 3 cycles (−0.28 MB per cycle), nodes −1.3, listeners −6.7 per cycle. Fixed in the test: RT-1 now holds native.lock (waits ≤ 900 s) shots/p2_p1_selftest_maint_rt1_1117.json 2026-10-07 11:17 11094443