Skip to content

Commit 3fc7e3b

Browse files
committed
docs(board): EXECUTION PATH — cinematic frames stored in LanceDB at 16-color palette (demoscene sweet spot)
User-sized 2026-05-13: prerendered cinematic frames fit Lance trivially at any palette point. 16-color (4-bit nibble-packed) is the sweet spot: 4-color 207 MB / 4.1 GB too restrictive for anatomy gradients 16-color 415 MB / 8.3 GB sweet spot — ~80-150 MB after Lance compression 256-color 829 MB / 16.5 GB overkill, kills demoscene constraint Lance schema: one PaletteRow + N FrameRows (frame_id, timestamp_us, 4-bit-packed indices, keyframe bool). Versioning + random-access seek + time-travel built in. Alternatives ruled out: Rust game engine — wrong tool (live engines, re-derive renderer) Quarto — wrong layer (pitch deck around cinematic) Unity WebGL — wrong dep (non-Rust runtime, 20-100 MB bundle) Why 16-color wins: AVX2 _mm256_unpack decodes 64 px/instruction (60fps playback in ndarray::simd dispatch); shared palette across all frames = 10x metadata compression; forced palette discipline IS the aesthetic (Andromeda/Sanity/Spaceballs demoscene precedent). Build pipeline: offline tool reads scripted trajectory + procedural T-pose; renders high-quality offline; Floyd-Steinberg dither to curated cyan/teal palette; write Lance rows; q2 playback streams + AVX2-unpacks + blits. Closes the storage-format open question from the prior REFRAME entry.
1 parent ccaac76 commit 3fc7e3b

1 file changed

Lines changed: 62 additions & 0 deletions

File tree

.claude/board/IDEAS.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,68 @@ Agents filter by `@`-mention or domain to see what's theirs.
9191

9292
Earlier this session conflated EWA-Sandwich with a Gaussian-splat anatomical renderer. Per user 2026-05-13 follow-up + source confirmation: EWA-Sandwich is **Pillar 6** of the JC pillars framework — Σ push-forward `M·Σ·Mᵀ` for multi-hop edge propagation in the SPD cone. Already implemented at `crates/jc/src/ewa_sandwich.rs` (450 LOC) + `crates/lance-graph-contract/src/sigma_propagation.rs` (488 LOC) + `crates/jc/examples/osint_edge_traversal.rs` + `crates/jc/examples/splat_perturbationslernen.rs`. Not a new idea — an existing certified pillar. See EPIPHANIES 2026-05-13 CORRECTION-OF entry.
9393

94+
## 2026-05-13 — EXECUTION PATH: prerendered cinematic stored as palette-indexed frames in LanceDB (16-color demoscene point is the sweet spot)
95+
96+
Concrete delivery path for the sales-asset cinematic (sized 2026-05-13 per user):
97+
98+
**Frame budget at 1280×720:**
99+
100+
| Palette | bits/px | bytes/frame | 900 frames (30 s @ 30 fps) | 18,000 frames (300 s @ 60 fps) |
101+
|---|---|---|---|---|
102+
| 4-color | 2 | 230 KB | 207 MB | 4.1 GB |
103+
| 16-color | 4 | 460 KB | 415 MB | 8.3 GB |
104+
| 256-color | 8 | 921 KB | 829 MB | 16.5 GB |
105+
106+
All four points fit Lance trivially. Columnar compression on palette indices (RLE-like) typically adds 3-5× shrink → 16-color 30s cinematic = **~80-150 MB after compression**.
107+
108+
**Lance schema (sketch):**
109+
110+
```rust
111+
// One row per frame; shared palette stored once in a separate small table
112+
struct FrameRow {
113+
frame_id: u32, // monotone
114+
timestamp_us: u64, // playback time
115+
indices: LargeBinary, // 4-bit-packed nibble buffer, 1280×720×4/8 = 460KB
116+
keyframe: bool, // true for cinematic chapter boundaries
117+
}
118+
119+
struct PaletteRow {
120+
palette_id: u8, // usually just 0 for "the cyan demo palette"
121+
rgba: FixedSizeBinary, // 16 × u32 = 64 bytes
122+
name: Utf8, // "cyan-demoscene-v1"
123+
}
124+
```
125+
126+
**Why Lance beats the alternatives for THIS use case:**
127+
128+
| Alternative | Verdict | Reason |
129+
|---|---|---|
130+
| **LanceDB frame rows** | ✅ chosen | Already in stack; columnar streaming; versioning ("v2 of intro reel"); random-access seek for chapter buttons; time-travel queries; palette discipline IS the demoscene aesthetic; nibble-packed indices are AVX2-friendly (60 fps playback trivially decoded) |
131+
| **Rust game engine** (bevy/fyrox/ggez) | ❌ wrong tool | Live engines; re-derive what `ndarray::hpc::renderer` already does. Use for live interaction phase, NOT prerender storage. |
132+
| **Quarto** | ⚠️ wrong layer | Quarto is for the pitch deck AROUND the cinematic. Embed the rendered output; don't make Quarto the renderer. |
133+
| **Unity WebGL** | ⚠️ wrong dep | Adds non-Rust runtime + 20-100 MB WebGL bundle for the user. Justifiable only if interactive 3D, but live renderer + WebGPU already covers that. |
134+
135+
**Why 16-color is the sweet spot:**
136+
1. 415 MB raw / ~80-150 MB compressed for 30 s @ 30 fps — small enough for a single release artifact (similar to bgz7 Qwen3.5 release pattern)
137+
2. 4-bit nibble-packed indices = `_mm256_unpack` decodes 64 pixels per AVX2 instruction → playback hot loop fits in `ndarray::simd` dispatch table for free
138+
3. Forced palette discipline → coherent cyan/teal/white glow → demoscene look comes from the constraint, not a separate art pass
139+
4. Shared palette across all frames: store ONE PaletteRow + N FrameRows → another 10× metadata compression
140+
5. Aesthetically authentic: Amiga AGA used 256 colors but the best demoscene WOW productions (Andromeda, Sanity, Spaceballs) milked 16/32-color palettes for maximum impact
141+
142+
**4-color point** is too restrictive for body anatomy (skin gradients lose definition). **256-color point** is overkill — kills the demoscene constraint and bloats the artifact for no visual win.
143+
144+
**Build pipeline:**
145+
1. Offline tool reads scripted camera trajectory + procedural T-pose entity positions (FMA SPO not required for cinematic; see prior REFRAME entry)
146+
2. Renders frames at higher quality (path tracing / accumulation / anti-aliasing) — slow but offline
147+
3. Color-quantize each frame to the curated 16-color cyan/teal palette via Floyd-Steinberg dithering
148+
4. Write to Lance with the schema above; one PaletteRow + N FrameRows
149+
5. Q2 cockpit playback hook: `cinematic_player.play("intro-v1")` → streams frame rows → decode nibbles → AVX2 unpack to RGBA → blit to canvas at 30/60 fps
150+
151+
**Replaces / complements:**
152+
- Replaces the storage-format open question in the REFRAME entry (was: Arrow batches / MP4 / .splat / custom temporal-delta — now answered: Lance with palette-indexed schema)
153+
- Complements: still uses the live `ndarray::hpc::renderer` for the post-cinematic interaction phase; handoff contract unchanged
154+
- New open: temporal-delta codec on top of palette indices? Probably not worth complexity; raw frames compress fine via Lance's existing zstd/lz4
155+
94156
## 2026-05-13 — REFRAME: holographic cinematic is a SALES asset (customer-conversation hook), not a product feature — owner = demo budget, NOT sprint-5
95157

96158
User clarification 2026-05-13: the holographic projection + prerender cinematic exists to "get customers hooked" — it's conversion-funnel eye candy, not a maintained product capability. This re-prioritizes everything in the two entries below this one.

0 commit comments

Comments
 (0)