# Current state — factual snapshot (2026-07-04) ## Codebase | Area | Size | State | |---|---|---| | Core (`src/rng` + `scene/` + `render/` + `ui/` + `main` + build) | ~3,220 lines | Committed, disciplined, small | | QFT (`src/qft/`) | 9 files, ~1,250 lines | Committed (one commit, May 29) | | Compose (`src/compose/`) | 4 files, ~680 lines | Committed | | Watercolor (`src/render/watercolor.js`) | 427 lines | **Uncommitted** (Jun 24–25) | | Milkweed-botanical (`src/milkweed/umbel.js`) | 169 lines | **Uncommitted** (Jun 25) | | Milkweed-windfield (`src/field/wind.js`, `src/scene/umbel.js`, `src/scene/drift.js`, GROUP_BUILDERS registry) | ~225 lines + compose rework | **Committed on unmerged branch** `milkweed-wind-field` (63066ee, Jun 17, also pushed) | | Tools | 37 files, ~4,750 lines | Committed except 3 newest | Git: 12 commits on `main`, May 20 → Jun 10. Last commit **24 days ago**. The uncommitted watercolor + milkweed work is a 2-day session (Jun 24–25) followed by 9 days of silence. An entire fourth renderer exists only in the working tree. ## The two milkweeds (important — memory/docs conflate them) 1. **Branch** `milkweed-wind-field`: the "hidden realities" system — one divergence-free wind field (closed-form time integral, elegantly done), three detectors (dunes/water/seeds), umbel-as-vertex, drift-as-advection, plus the GROUP_BUILDERS registry refactor of the composition engine. Committed Jun 17, never merged. 2. **Working tree on main** (`src/milkweed/umbel.js`): a *different* milkweed — a botanical Asclepias still-life scene built for the watercolor renderer. Does not import the wind field. Both export `generateUmbel` with **incompatible signatures**. Merging the branch as-is collides. This is an unmade decision materialized as two files. ## Renderers 4 renderers for bubble-chamber scenes (photo raster / SVG / PDF / watercolor); QFT has only its own SVG renderer — no photographic or watercolor QFT exists. Feature parity: PDF lags (no media layer, vignette, stains, fingerprints); SVG has private params (`boundary*`, `diskPressure`, `emit`, `transparentPaper`); ~150–200 lines of look logic triplicated and drifting (three bubble sizes). Watercolor integrates through the proper seam (same signature, shared `sampleBubbles`/`depthFactors`, palette registry extended not bypassed), with known rough edges: dead `preview` flag, scratch-canvas cache keyed by width only, heavy per-pigment blur cost at print resolution, no UI entry point yet — reachable only via `tools/preview.html?renderer=watercolor`. ## Parameter surface ≈68 total: 53 in the UI (43 sliders / 2 selects / 8 toggles) + ~15 hidden or SVG-only. Flat namespace is starting to encode per-palette sub-schemas by label convention ("(magentarise)" ×3). Every new param is a 3–4 place edit. ## Tools & outputs - 8 durable pipeline tools; ~25 one-off sketch scripts (fork-and-mutate: the same `merge()` helper verbatim in 5 files, `F()` color helper redefined in 12 of 17 QFT tools, the contact-sheet HTML inlined 17 times). Zero shared tool-level utility module. - `output/`: 2.4 GB, 19 directories, 675 tracked files. Chronology: inspiration → masters (May 20–21) → 5 iteration series → QFT sketches 01–09 → qft-bc → layering (642 MB, the largest) → liberation → templates 1–4 → watercolor + milkweed (untracked). - `output/masters/`: 7 masters, 5 seeds, all from May 20–21. Nothing since. ## Stale / dead weight - `bubble_chamber.html` — the headline "portable single file" deliverable — built May 31, now 3.5 weeks behind `src/` (missing the milkweed palette, the Jun 17 svgVector changes, watercolor). Nothing detects staleness; the built file stamps *that* it was built, not from what. - `bubble_chamber.v2.html` — superseded snapshot, dead. - `tools/archive-wall.html` — hardcodes the May 29 curation; predates templates/liberation/watercolor. - `compositions/hero.mjs` — the only file in `compositions/`; uses radial-grid keys (`vp`, `rays`, `depthLines`) that `gridSheets` now silently ignores. - `tools/inkwash-export.mjs` — self-declared superseded by the native watercolor renderer ("kept as a record"). - `composer.html` — works, but one phase behind (untouched during watercolor). - `package.json` — 3 npm scripts, all from May 20; none of the ~25 later tools registered. - `tools/render-qft-svg.mjs` references a `render-milkweed-svg.mjs` that doesn't exist. ## Known bugs 1. **Ripple grids silently dropped** by `renderQFTSVG` (`src/qft/renderer.js:178-181`) — every "ripple" variation across sketches 08–09 shipped without its subject. 2. `drawDamage`/`drawInstrument` last param named `inv` but called with `light` (`src/render/canvasPhoto.js:110,208`) — works today, trap for the next edit. 3. `perspectiveGridSVG` creates an rng it never uses — the compose layer's 'pA'/'pB' salts do nothing for radial grids. 4. Dead pre-palette-era fields in `canvasPhoto.js` `palette()`; `delta.js:53` comment inverts what the formula does; `watercolor.js:374` `0.05 * 8`.