36 KiB
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.jsmakeScopekeeps aSetof live subscriptions; every trackedoff()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.js78/78 in both modes,h1.js9/9,h2.jsclean. 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 onretries with backoff). Live proof this session: SharedJSContext crashed at 10:56:45 (V8 OOM, below) and the nextlgs onbuilt 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 sawTarget crashedat 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_RTgone), 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 holdsnative.lockfor 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 andlgs check;python device/lgs.py check [--json]/lgs.check(): offline bundle check (PC or Frame; P10'scheck-theme);lgs on(R1): waits for Steam's UI and a plausible class index (backoff 2, 4, 8, 15 s; 120 s; each attempt inlgs.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,lgsWebpackRequirefor every caller);- the loader: CSS core, then
00-rt.js,device/shared/*.js,device/rt/*.js, each file in its own strict-mode evaluation, thenstart(); CSS-only fallback when the loader fails;--no-rt, flagrt;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 offcleanup report (runtime.patchedLeft,leftoversXPath sweep of every window), the Off toast after it;lgs status(module states,index);lgs flags; native argumenton|off|auto(P8'sNATIVE_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,shellThemeGraceS600); 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:8cacheswindow.__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(whichlab.pyprepends) haslgsIndexShared({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 leastif (ix.ok)before caching). AlsocontextMenus()(lab_helpers.js:127) pushes aSymbol('lgs-cm')probe chunk that webpack keeps inwebpackChunksteamuifor the life of the context: uselgsWebpackRequire()(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 whenlgs_index.jslacks it);contextMenus()useslgsWebpackRequire()(else splices its own record) and also splices thelgs-cmrecords older helper builds left: live, 7 such records before, 0 after;L.index.oktrue, 546 modules.
- P10 (2026-10-07 08:30): done: the helpers take the index at call time through
- REQ P1->P6:
device/lgs_layers.jscachesW.__LGS_INDEX = lgsBuildIndex()unchecked (around theindex()helper that reads__LGS_INDEX), and its webpack probeSymbol('lgs-layers')(about line 466) is never spliced out ofwebpackChunksteamui: 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 throughlgsIndexShared()(indevice/lgs_index.jssince review R1: caches only an ok index, rebuilds a stale one) and the require throughlgsWebpackRequire(), or splice your probe record as P2 and P3 do. P6 (2026-10-07 09:20): done:getIndex()takeslgsIndexShared()when it is in scope, else__LGS_INDEX(notok: false), and caches a fresh build only when it is good;webpackReq()useslgsWebpackRequire()when in scope, else splices itsSymbol('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 nolgs-layersrecord is left inwebpackChunksteamui. - REQ P1->P9:
native/glassd/tools/test_atlas.pyandtest_shapes.pywrite fixtures to/tmp/lgs-fx/, outside/tmp/lgs(task rule 7: runtime and test state only under/tmp/lgsor/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.shkeeps 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_LASTand__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 incontracts/reporter.mdso V2 can list them as expected (like__LGS_INDEX). RT-4 reports them as "foreignGlobals". P6 (2026-10-07): done: a realstop()(not a re-injection) now deletes__LGS_LAYERS,__LGS_LAYERS_NAVMODand every__LGS_LAYERS*_LAST; the reporter no longer writes a_LASTglobal (the last stop reason is instatus().lastwhile the API stays).__LGS_LAYERS_T2_LASTwas from a P6 test instance; it is swept by the next real stop. - REQ P1->P2:
device/rt/02-react.jsdefinesreactwithoutflag: 'react', whilecontracts/react.md§1 makesreactits kill switch (built-in default on).BUILTIN_FLAGSnow hasreact: true(alsoreactLab: false,actionsLive: false), so addingflag: 'react'keeps today's behaviour and makeslgs flags react=offwork.- P2 (2026-10-07): done:
define({name: 'react', flag: 'react', …})in02-react.js;ready()also refuses while the flag is off. contracts/react.md §1 (v2).
- P2 (2026-10-07): done:
- REQ P1->P10: optional, for V2: a
glass.pypassthrough forpython3 device/lgs.py selftest [RT-1,...](exit code kept) that copies/tmp/lgs/p1-selftest.jsonback to the PC. Until then it runs throughFR run.- P10 (2026-10-07 06:35): done:
python glass.py selftest [RT-1,...] [--mode=pad|laser] [--json]runsdevice/lgs.py selftest(no lab lock: each test takes its own), keeps the exit code and copies/tmp/lgs/p1-selftest.jsontoshots/p1-selftest.json.
- P10 (2026-10-07 06:35): done:
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 |