LUME ↔ Duncan Fewkes playbook gap analysis
> **STATUS WARNING — stale status table.** This document remains useful as a > Duncan/Fewkes feature checklist, but its "LUME status" column predates later > Unity work. For current shipped/not-shipped state, use > `unity/lume_pcloud/ARCHITECTURE.md` first. As of 2026-05-01, the newer project > includes impulse, runtime calibration panel, motion gate, fluid sim, LUMM > mocopi receiver/animator, display controller, skeleton-fluid injector, and VFX > editor files that are not reflected accurately below. Treat rows 4,
Full Public Reader
LUME ↔ Duncan Fewkes playbook gap analysis
> STATUS WARNING — stale status table. This document remains useful as a
> Duncan/Fewkes feature checklist, but its "LUME status" column predates later
> Unity work. For current shipped/not-shipped state, use
> `unity/lume_pcloud/ARCHITECTURE.md` first. As of 2026-05-01, the newer project
> includes impulse, runtime calibration panel, motion gate, fluid sim, LUMM
> mocopi receiver/animator, display controller, skeleton-fluid injector, and VFX
> editor files that are not reflected accurately below. Treat rows 4, 5, 8, 10,
> 11, and 15 as old-plan notes until this table is regenerated.
_2026-04-26 — generated to anchor the Wave 5 priority list. Sources: the
4 Duncan playbook memory files (master + DV-DU + DT-DS + DR-DQ chunks)
and the 16 Wave 1-4 commits on `main`._
The reels are the source of truth for "what Duncan ships." The commits
are the source of truth for "what we ship." This file is the diff.
Layer-by-layer status
Legend: ✅ shipped · 🟡 partial · ❌ not started
| # | Layer | Duncan's stack | LUME status | Commit | Gap |
|---|---|---|---|---|---|
| 1 | Depth reprojection | Femto/Kinect → CPU/GPU pinhole | ✅ Wave 2 GPU compute | `7387abb2` | — |
| 2 | Optical flow | LK pyramid on linearised depth | ✅ Wave 4 dense single-scale LK | `ca975000` | Pyramid (multi-scale) deferred — fast motion above ~8 px/frame may alias |
| 3 | Audio FFT | 4 EQ bands + RMS + spectral centroid + transient | ✅ Wave 4-B LUMF sidecar | `976e594a`, `e36956f7` | — |
| 4 | Audio reactivity (3-channel) | outline=form, inner=action, impulse=transient kick via VFX AddForce | 🟡 outline + inner shipped; impulse not wired | Track C set transient bit on `_OutlineFlash`, but no per-particle force kick | Wire AddForce into VFX Graph from `_OutlineFlash` transient bit |
| 5 | 2D Eulerian fluid sim | Keijiro StableFluids fork, 6 named presets, reflective boundaries | ❌ NOT STARTED | — | Vendor `keijiro/StableFluids`, port advection kernel into URP, expose 6 presets (Default / Default_Smooth / LongThrow / MidThrow / ShortThrow / InvertedObstacle) |
| 6 | VFX Graph particles | `Multiparticle_Spine_FX` + `ParticleSystem_Spine_Trail` layered on depth particles | 🟡 Bootstrap shipped, node graph empty | `6d312a95`, `cf9becc4` | User wires the .vfx node graph per `Reference/Duncan/analyses/E460-noreel.md` recipe; runtime bridge already pushes globals |
| 7 | Marching cubes | Keijiro `ComputeMarchingCubes`, twin-mesh nested with `_InnerThreshold` / `_OuterThreshold` for glass-over-gold | ❌ NOT STARTED | — | Vendor Keijiro MC, write twin-mesh shader pass |
| 8 | Calibration | Per-install runtime tweak grid + circular degree-marked spatial UI; persisted to disk | 🟡 `LumeCalibration` ScriptableObject (intrinsics only) | `2f63709e` | No runtime debug UI yet, no per-install persistence, no spatial grid overlay |
| 9 | Wordmark / logo as payload | HOLOVIS letters as: blendshape inflation target + reflection probe + particle spawn surface + light source + SDF for "punch through" reveals | ❌ NOT STARTED (LUME wordmark is debossed plastic only) | — | Wave 5+: model the wordmark as a real Mesh in-scene, drive blendshape from `_AudioLevels.x`, use as VFX spawn source |
| 10 | Skeletal avatar | `Framed_MotionCap` digital human, particles bind to spine bones, not raw depth pixels | ❌ NOT STARTED | — | Wave 6+: requires mocopi PRO / Sapiens skeleton stream — depth-pixel only for Wave 5 |
| 11 | SuperHot motion-gating | Sim slows when player still, runs full speed on motion | ❌ NOT STARTED | — | Use existing W3 motion-mag scalar to drive `Time.timeScale` modulation on the fluid sim only |
| 12 | Frozen velocity buffer | One-shot snapshot mode for stillness-then-trail effect | ❌ NOT STARTED | — | Wave 5+: `RWTexture2D<float2>` cache + freeze flag |
| 13 | Human Kaleidoscope | 16-clone radial mirror render of the depth point cloud | ❌ NOT STARTED | — | Wave 5+: Camera Stack with rotated VFX submission, 16× render passes |
| 14 | Strip particles + pinscreen mesh | Procedural strip-extruded particles instead of quads, + blendshape pinscreen mesh for the wordmark | ❌ NOT STARTED | — | Wave 6+ |
| 15 | Settings + Motion-Settings UI | Separate from VFX Editor — runtime tweak panel for thresholds | ❌ NOT STARTED (we have `LumeWaveAutoWire` Editor menu only) | — | Wave 5: in-Player IMGUI for thresholds — Duncan calls this out as "hard product requirement, not nice-to-have" (E568) |
| 16 | Render pipeline | HDRP (compute thickness for metaballs, screen-space planar reflections, MULTIPLE_SCATTERING sky) | URP 17 | All commits | Decision deferred: stay URP for Sat-demo floor; evaluate HDRP migration only if metaball compute-thickness becomes Wave 6 priority |
Tooling parity
| Tooling | Duncan | LUME |
|---|---|---|
| Reference library | personal | ✅ `Reference/Duncan/` (83 reels + 69 analyses) |
| Wire format | NDI/OSC | ✅ LUME / LUMD / LUMF + reserved LUMC |
| Test suite | none visible | ✅ 37 pytest cases (33 fast + 4 slow) |
| Smoke-test runbook | none visible | ✅ `MAC5-SMOKE-TEST.md` (6-stage) |
| Health-check | none visible | ✅ `launchagents/health-check.sh` |
| Mac5 LaunchAgents | n/a | ✅ synthpub + audio-pub |
| Editor automation | manual scene tweaks | ✅ `Lume → Auto-Wire` + `Lume → Bootstrap Scene → Procedural Tunnel` + `Lume → Bootstrap Scene → Add VFX Graph Particles` |
What ships today (the "Wave 1 floor")
Even with everything in the ❌ column missing, the demo path works:
1. `Lume → Bootstrap Scene → Procedural Tunnel` → 6,144-point cylindrical helix
2. Press Play → audio-reactive cyan-pink particles, hue-cycle, beat-flash outline
3. Run `pointcloud_pub.py --synthetic-depth` → swap to Wave 2 GPU-projected
wavy bowl with motion-driven inner spread (W3) and LK flow vector field (W4-A)
4. Run `audio_pub.py --synthetic` → low-latency 4-band FFT replaces mic capture (W4-B)
Everything from row 1-4 in the layer table is live and tested. Rows 5-16 are
the Wave 5+ ladder.
Wave 5 priority order (recommended)
1. Layer 4 — Impulse channel (~2 hr): wire transient bit → VFX AddForce. The
plumbing exists; this is the smallest gap with the largest visual delta.
2. Layer 8 — Calibration runtime UI (~4 hr): Duncan calls this out as
"hard requirement" (E568). In-Player IMGUI panel binding to LumeOpticalFlow
tunables (`diffNormMm`, `responseGain`, `lkFlowClampPx`) + persist to JSON.
3. Layer 5 — Fluid sim (~1 day): vendor StableFluids, 6 presets, bass→large
low-freq positional offsets / mid+high→high-freq small offsets per E512.
4. Layer 11 — SuperHot motion-gating (~2 hr after layer 5): trivially layered
on top once fluid sim exists.
5. Layer 7 — Twin-mesh marching cubes (~1 day): vendor Keijiro MC.
6. Defer rows 9-15 to Wave 6+ (require mocopi PRO / wordmark mesh / camera stack).
Reference cross-links
- `Reference/Duncan/INDEX.md` — 83-row table of reels with analysis cross-links
- `Reference/Duncan/analyses/E512-*.md` — verbatim engineering notes on fluid sim
audio-reactivity rules (Bass→position, EQ-before-auto-gain, etc.)
- `Reference/Duncan/analyses/E535-*.md` — third-channel transient kick rationale
- `Reference/Duncan/analyses/E527-*.md` — HOLOVIS commercial install brand
- `Reference/Duncan/analyses/E470-*.md` — A6000@60fps target hardware
- `[home-path]` — canonical synthesis
Promotion Decision
Attach run IDs, datasets, metrics, and reproduction commands.
Source Anchor
lume-commerce/docs/research/DUNCAN-GAP-ANALYSIS.md
Detected Structure
Method · Evaluation · Code Anchors · Architecture