Lumen/experiments/README.md
Lumen Stage1 c0bfd413ff Stage 1: project foundation (strict TS, lint boundaries B-1..B-7, directory structure, CI, boundary tests)
- dedicated git repo at /home/avi/Projects/Lumen (main)
- TypeScript strict (target ES2022, bundler, exactOptionalPropertyTypes, noUncheckedIndexedAccess)
- ESLint 9 + typescript-eslint strictTypeChecked + eslint-plugin-boundaries for B-1..B-7, no-restricted-globals/syntax for B-1/B-7
- Prettier 3.5
- Structure per IMPLEMENTATION-CONTRACT.md §4 (src/platform/idb|cache|sw, storage, data, sync/{transport,verifier}, domain/{emergency,schedule,map,festival,readiness,clock,favorites}, ui/{components,views,router,render}, app, emergency-baseline, assets, public, content, pipeline, tests, scripts)
- CI: .github/workflows/ci.yml (typecheck + lint + format + test)
- Boundary tests: tests/unit/boundaries.test.ts (4 tests) + scripts/check-boundaries.ts
- No feature code, no PWA/IDB/sync/mesh/accounts per contract Stage 1
2026-08-30 23:25:35 -05:00

59 lines
2.8 KiB
Markdown

# Lumen — Validation Experiments (Architecture Validation Phase)
These are **disposable validation experiments**. They are **not** application
code, not part of the future product, and must not be imported by the app.
They exist to falsify or confirm specific architectural assumptions before
the architecture is frozen. Each is referenced by the spike document that
consumes its results.
| File | Validates | Spike | Runtime |
|------|-----------|-------|---------|
| `exp1-time-model.mjs` | UTC storage, IANA-zone rendering, day boundaries, DST, skew, sanity window, now/next | SPIKE-08 | `node exp1-time-model.mjs` |
| `exp2-ab-update-sim.mjs` | A/B dual-slot atomic update state machine under crash/fault injection | SPIKE-02 | `node exp2-ab-update-sim.mjs` |
| `exp3-map-bench.html` | Map representation approaches (raster+DOM, SVG, canvas) | SPIKE-03 | headless Chromium (see below) |
## Evidence classes used throughout
Every claim in the spike documents is labelled:
- **CONFIRMED** — observed by running an experiment here, or directly
documented by the platform vendor as guaranteed behavior.
- **INFERRED** — follows from documented platform behavior + architectural
reasoning, but not directly observed in this environment.
- **UNVERIFIED** — cannot be established on this Linux dev box; requires a
physical device/browser.
## Environment
- Linux dev machine, Node v22.23.2 (full-ICU), headless Chromium
(`chromium-browser`), Firefox available.
- **No iOS hardware or iOS Simulator is reachable from this environment.**
Nothing labelled iOS is CONFIRMED here; iOS items are INFERRED or
UNVERIFIED and are listed in each spike's "must test on physical iOS"
section.
## How the map benchmark is run (EXP-3)
```
chromium-browser --headless=new --disable-gpu --no-sandbox \
--window-size=800,600 --virtual-time-budget=120000 \
--dump-dom "file:///…/experiments/exp3-map-bench.html"
```
**Interpretation caveat (important):** the benchmark measures synchronous JS
work per animation frame on a desktop GPU/CPU. All three approaches measured
≈ 0 ms/frame here. That does **not** mean they are equivalent on a low-end
Android phone: the dominant costs there are GPU compositing of transformed
layers, texture memory, and raster image decode — none of which a headless
desktop run represents. EXP-3's value is confirming that none of the three
has a disqualifying *JS-side* cost and that the DOM-overlay and SVG variants
are mechanically viable; the final representation decision still requires the
physical-device protocol in SPIKE-03.
## Observed results (run 2026-08-30)
- EXP-1: **24/24 PASS**. (Two earlier failures were test-data errors in the
experiment itself, corrected; the time logic was sound.)
- EXP-2: **16/16 PASS** across all crash/fault points.
- EXP-3: all variants complete; per-frame JS work ~0 ms across the board
(see caveat).