Record Store Guy: master plan, worlds design, engine spec, production bible

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
m3ultra 2026-07-19 16:39:11 +10:00
commit 9a5ed2d02b
5 changed files with 479 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
engine/clips/*.mp4
production/raw/
.DS_Store
*.env

96
ENGINE.md Normal file
View File

@ -0,0 +1,96 @@
# RECORD STORE GUY engine spec — FMV QTE player
Pure static web app: no build step, no framework, no server logic. One HTML file,
one JS file, one CSS file, one JSON scene graph, a folder of mp4 clips. Must run
from `python3 -m http.server` locally and from nginx on the games VPS unchanged.
## Files
```
engine/
index.html shell: <video>, overlay divs, HUD
player.js all logic (~400 lines, vanilla ES6, no deps)
styles.css arcade look: scanlines, CRT vignette, neon HUD
scenes.json the scene graph (authored data, engine reads it verbatim)
clips/*.mp4 24fps 1280x720 h264+aac, named <scene_id>_<kind>.mp4
```
## scenes.json schema
```jsonc
{
"meta": { "title": "RECORD STORE GUY", "lives": 5, "version": 1 },
"start": "s01_entrance",
"scenes": {
"s01_entrance": {
"clip": "clips/s01_action.mp4", // the scene's action clip
"death": "clips/s01_death.mp4", // played on fail, then retry scene
"windows": [ // 1..n QTE windows within the clip
{
"t": [3.2, 3.9], // seconds: window open..close
"input": "right", // right|left|up|down|action (action = space/enter/click)
"cue": true // show the flashing direction cue at t[0]
}
],
"onSuccess": "s02_aisles", // next scene id, or "WIN"
"checkpoint": false // true = death respawns here, not act start
}
}
}
```
Rules the engine enforces:
- Input BEFORE the window opens = instant fail (Dragon's Lair rule — no button mashing).
Grace: inputs in the 250ms before t[0] fail; earlier inputs are ignored (idle fidget).
- No input by t[1] = fail. Wrong direction = fail.
- Multiple windows per clip run in sequence; all must pass.
- On fail: swap to death clip immediately (seek 0, play), then decrement lives.
Lives 0 → game-over screen → attract. Otherwise retry the scene (or last checkpoint).
- On success of last window: let action clip finish, then advance to onSuccess.
## Player loop (player.js structure)
1. **Boot**: fetch scenes.json → preload manifest.
2. **Preloader**: two `<video>` elements, A/B swap. While A plays scene N, B preloads
scene N's death clip first (most likely next need), then N+1's action clip, via
`preload="auto"` + `load()`. Also `fetch()` + blob-URL cache for clips ≤ ~8MB to
guarantee gapless swap. Show % bar on boot for first 3 clips only.
3. **Clock**: drive QTE timing off `video.currentTime` polled in `requestAnimationFrame`
(NOT wall-clock setTimeout — survives decode stutter/tab throttling).
4. **Input**: keydown (arrows + space/enter) and touch (swipe quadrants + tap = action).
Map gamepad later (Gamepad API, d-pad + A). Ignore key auto-repeat.
5. **Cue rendering**: at window open, flash a chunky neon arrow (direction) or ring
(action) center-low on screen, CSS animation ~300ms pulse. Dragon's Lair barely
cued; we cue by default — `cue:false` per window for hard mode later.
6. **HUD**: lives as record icons top-left, scene name bottom-left (debug only), score
= scenes cleared × 1000 minus deaths × 100, arcade font.
7. **States**: ATTRACT (loop attract.mp4 or title card + "PRESS ANY KEY", high-score
from localStorage) → PLAYING → DEATH → GAMEOVER → WIN (win.mp4 → credits → attract).
8. **Debug mode** (`?debug=1`): timeline scrubber, windows drawn as colored bands on a
bar under the video, current input state, frame-step keys (,/.), scene jump dropdown.
This is how we'll tune every window against real Flow clips — build it FIRST.
## Feel-tuning constants (top of player.js, tweak in one place)
```js
const WINDOW_DEFAULT = 0.7; // s — default window length if authoring shorthand used
const EARLY_GRACE = 0.25; // s before open where input = fail
const DEATH_HOLD = 0.6; // s to hold last death frame before retry fade
const CUE_LEAD = 0.0; // s to show cue before window opens (bump to 0.15 if too hard)
```
## Placeholder clips — tools/make_placeholders.sh
Generates test clips so the whole game is playable before any Flow spend. For each
scene in scenes.json: 5s 1280x720 clip, solid color per scene, huge scene-id text,
and at each QTE window a white flash + 1kHz beep + arrow glyph burned in at exactly
t[0]..t[1] (drawtext + sine + overlay enable='between(t,A,B)'). Death placeholders =
red background + "DEATH sXX". ffmpeg one-liner per clip; script reads scenes.json
with python3 -c json. Also make attract/gameover/win placeholders.
Ship scenes.json with 3 authored placeholder scenes so the loop is provable end-to-end.
## Post-processing real clips — tools/postprocess.sh
`postprocess.sh <in.mp4|dir> <scene_id> <action|death>` → trim silence/dead frames
(args for in/out points), scale/pad to 1280x720, 24fps, `-c:v libx264 -crf 20
-pix_fmt yuv420p -movflags +faststart`, silent aac track if none (uniform streams =
gapless swaps), output to engine/clips/ with canonical name, print duration so the
author can set windows. Keep originals in production/raw/ untouched.
## Deploy
rsync engine/ to botchat games VPS per deploy-map skill; it's static. Cache-bust
scenes.json + player.js with ?v= query from meta.version. Verify live by curling
the URL and loading in browser. ship-check before public link.

123
PLAN.md Normal file
View File

@ -0,0 +1,123 @@
# RECORD STORE GUY — master execution plan
*(title FINAL — John's executive call, 2026-07-19)*
Dragon's Lair / Space Ace-style FMV QTE game: a guy in a record store surviving
escalating, ridiculous, surreal hazards — the floor floods into a shark ocean,
turns to lava, the roof rips off into space, the store goes full Tron. Uncharted-
level setpiece adrenaline + Dragon's Lair wrong-move-you're-dead urgency + comedy.
AI-generated 45s clips (Google Flow / Veo, John's 9000 paid credits) strung
together by a web player demanding precisely-timed inputs. Creative design of the
worlds/setpieces: **WORLDS.md** (read it after this file).
**Division of labor (hard rule):**
- **Google Flow (9000 credits)** = ONLY the final in-game video clips. John paid for
these and wants them used — but never wasted on tests that FLUX can do.
- **MODELBEAST FLUX (`flux_local`, free, ~9s/image)** = all concept art, character
bible references, style frames, marketing art, and the stills we upload to Flow
as "ingredients" for character consistency.
- **MODELBEAST local video ops** = optional pre-viz/animatics only, never final clips.
## Environment facts (verified 2026-07-19 on m3ultra)
- MODELBEAST queue **UP**: `http://100.89.131.57:8777` (34 operators). This machine
(m3ultra) IS the primary.
- CLI: `~/Documents/MODELBEAST/mb` (stdlib-only python). Needs `MB_TOKEN` env var.
**Token was NOT found on m3ultra** — it lives in `~/Documents/backnforth/.env` on
**ultra** (per fleet skill), or create/read one via MODELBEAST web UI ⚙ Settings →
Users → token, or `scripts/users.py`. Read from disk; never print/commit it.
Example: `MB_TOKEN=$(ssh ultra@100.91.239.7 'grep MB_TOKEN ~/Documents/backnforth/.env | cut -d= -f2')` — or ask John which token to use. Guest tokens cap at 4 active jobs.
- ffmpeg: `/opt/homebrew/bin/ffmpeg`
- Project dir created: `~/Documents/recordstoreguy/` with `bible/concept/`, `engine/clips/`, `tools/`.
## Phases
### Phase 1 — Engine shell with placeholder clips (zero credits)
Build the full player before any real video exists. Placeholders prove the QTE feel.
Spec: `ENGINE.md`. Placeholder generator: `tools/make_placeholders.sh` (ffmpeg
test-pattern clips with big text + a visual "beep" flash at the QTE window so timing
is testable by eye). Definition of done: playable in browser start→3 scenes→death→
retry→win, lives counter, attract loop, debug overlay showing windows.
### Phase 2 — Bible + FLUX concept art (zero credits)
`bible/BIBLE.md` holds the verbatim STYLE/CHARACTER/SET blocks (drafted — see file).
Generate concept art on MODELBEAST; iterate until John approves each. Commands:
```sh
cd ~/Documents/MODELBEAST
export MB_TOKEN=... # from disk, see above
./mb run flux_local -p prompt="<PROMPT>" -p seed=<N> --wait --download ~/Documents/recordstoreguy/bible/concept/
```
Concept shot list (full prompts in BIBLE.md §Concept-art prompts):
1. `hero_sheet` — Dez full-body turnaround, neutral pose, front+side
2. `hero_face` — close-up head, 3/4 view (this becomes the Flow ingredient)
3. `villain` — the antagonist (direction TBD with John — see Open Decisions)
4. `store_wide` — the record store master set, wide establishing
5. `store_backroom` — second set (stockroom / listening booth)
6. `style_frame` — one full "this is what the game looks like" money shot
7. `death_concept` — one comedic death (shelf of crates toppling)
8. `title_card` — RECORD STORE GUY logo/marquee concept
Run 34 seeds each, keep best. Free, so iterate hard BEFORE touching Flow.
### Phase 3 — Flow consistency test (~100 credits MAX, gated on John's approval)
In Google Flow (browser; John logs in himself — never handle his credentials):
1. Upload approved `hero_face` + `hero_sheet` FLUX stills as **ingredients**.
2. Generate 5 test clips, Veo Fast (~20 cr each): same character, same set block,
5 different one-sentence actions (walk-in, duck, grab record, get scared, run).
3. Judge: does the face/outfit/style hold across clips? Log verdicts in
`production/SHOTLOG.csv`. If it holds → green-light full production. If not →
revise ingredients/style block with more FLUX iterations and retest (another ~100).
### Phase 4 — Story + scene graph (with John — mise en scène discussion)
Creative direction now drafted in `WORLDS.md` (premise, 7 worlds, setpieces, deaths,
clip budget). Remaining work this phase: John iterates WORLDS.md, then:
- `scenes.json` fully authored (schema in ENGINE.md) with per-scene prompt sheets in
`production/prompts/` — each sheet is the verbatim template with only the action
sentence and camera line filled in.
### Phase 5 — Batch production in Flow (the 9000 credits)
Budget: 9000 cr ≈ 450 Veo Fast gens. Keep-rate assumption 1-in-2.5 → ~180 usable
clips. Target game: ~35 scenes × (1 action clip + 1 death clip) + intro + attract +
game-over + win ≈ **80 final clips** → ~200280 gens spent, leaving reserve for
hero-moment quality gens (100 cr each, use sparingly: intro, final scene, best deaths).
Discipline:
- Work scene-by-scene from prompt sheets; NEVER freestyle a prompt in Flow.
- Frame-chain within a scene (last frame → start frame / Flow extend) for continuity;
hard cuts between scenes hide the rest.
- Log every gen in `production/SHOTLOG.csv`: `scene_id,take,credits,verdict,notes`.
Running credit total in the log; stop and re-plan if burn rate exceeds 2× budget line.
- Download keepers to `production/raw/`, then `tools/postprocess.sh` (ffmpeg: trim,
normalize to 24fps 1280×720 h264 + aac silent/or SFX bed, name `<scene_id>_<kind>.mp4`)
into `engine/clips/`.
### Phase 6 — Sound + deploy
- SFX/music: needle-drop crackle bed + stingers. (m1max is the audio machine but
disk-critical — keep audio work local or ask John.)
- Deploy: static site → botchat games VPS (`humanjing@100.71.119.27`, docker) next to
the other partly.party games, per deploy-map skill. Verify live with cache-busted curl.
- Run ship-check skill before exposing publicly.
## Decisions status
1. **Title**: ✅ RECORD STORE GUY (final, John 2026-07-19).
2. **Premise/worlds/tone**: ✅ surreal escalating setpiece worlds, Uncharted chaos +
comedy deaths — designed in WORLDS.md (John reviews/iterates the specifics).
3. **Art style**: OPEN — plan assumes 80s hand-drawn cel (Bluth-adjacent); alt is
live-action FMV cheese. Style block in BIBLE.md is written for cel — decide before Phase 3.
4. **Hero design**: OPEN — "Dez" is a placeholder design; John approves/redirects at
concept-art review.
5. **Villain**: recommended **The Dead Wax** (fits WORLDS.md arc) — confirm with John.
## File map
```
recordstoreguy/
PLAN.md ← this file (master; Opus starts here)
WORLDS.md ← creative design: premise, 7 worlds, setpieces, QTEs, deaths, clip budget
ENGINE.md ← full engine spec (schema, player loop, QTE rules, placeholder script spec)
bible/BIBLE.md ← style/character/set blocks, prompt grammar, concept-art prompts, Flow workflow
bible/concept/ ← FLUX outputs land here
engine/ ← index.html, player.js, styles.css, scenes.json, clips/
tools/ ← make_placeholders.sh, postprocess.sh
production/ ← (Phase 4+) prompts/, raw/, SHOTLOG.csv
```
Git: repo lives at `~/Documents/recordstoreguy`, remote already configured:
`origin ssh://git@100.71.119.27:222/monster/recordstoreguy.git` (Gitea). Never commit
tokens; engine/clips + production/raw are gitignored (video bulk stays out of git).

163
WORLDS.md Normal file
View File

@ -0,0 +1,163 @@
# RECORD STORE GUY — worlds & setpiece design (v1 draft for John's review)
Tone target: **Uncharted setpiece adrenaline × Dragon's Lair urgency × Looney Tunes
comedy.** Everything is always collapsing, flooding, erupting, or chasing the guy
toward camera, and every wrong/late input is an instant, funny, held-tableau death.
Because every clip is generated to exact spec, there is zero cost difference between
"guy trips over a crate" and "the ocean is a spinning turntable whirlpool with a
needle arm crashing down" — so we ALWAYS pick the wilder shot.
## Premise (one screen, shown as the intro clip)
Closing time, night shift. The guy finds an unlabeled record in the returns bin,
shrugs, drops the needle. The run-out groove bleeds black liquid vinyl — **the Dead
Wax** — and the store starts *playing* him: each "track" warps the shop into a new
hostile world. Survive all seven tracks, reach the turntable, and lift the tonearm
at the exact right beat to end it.
Structure = a record: **7 worlds = 7 tracks**, side A (13) escalates the store, side
B (46) leaves reality entirely, track 7 is the boss. Between worlds: a 2s "needle
skip" transition clip (screen judders like a skipping record) — hides all continuity
drift and became our scene-change idiom for free.
## The worlds
### Track 1 — CLOSING TIME (tutorial; the shop turns hostile)
Set block: BIBLE SET-A (store floor, night, neon).
Scenes (~4): shelf avalanche dodge (←), giant rolling 12" chases him down the aisle
Indiana-Jones-boulder style (sprint, ↑ to vault the counter), cassette-tape tentacles
burst from the bargain bin and whip at his ankles (jump →), ceiling fan rips loose
and helicopters at head height (duck ↓).
Deaths: flattened under crate avalanche, sneakers-and-thumbs-up tableau · steamrolled
into a groove-embossed pancake by the rolling 12" · mummified in brown cassette tape,
eyes blinking.
### Track 2 — SIDE A / SEA (the flood)
Set block v1: > the record store flooded into an open ocean at night, aisles of
> wooden record racks bobbing like rafts on rolling waves, neon store signs glowing
> underwater, spray and foam, no walls, horizon of black water under a starless sky.
Scenes (~5): floor liquefies, scramble onto a floating rack (↑) · rack-to-rack jumps
across swells, timed to the wave peaks (→,→) · **shark run**: fins circle — the fins
are records — sharks with vinyl dorsal fins lunge as he crosses a chain of half-
sunk crates (←,↑) · whirlpool: the whole ocean starts SPINNING like a platter, a
skyscraper-sized tonearm swings down, ride the outer groove-current and leap the
needle as it plows past (action) · escape: surf a floating gatefold sleeve down a
wave toward the stockroom door (→, action).
Deaths: swallowed whole, camera holds on the shark burping out headphones · sucked
down the spindle-hole at the whirlpool's center like a draining tub, glug ·
mistimed jump, faceplants a rack that tips him in with theatrical slow topple.
### Track 3 — HOT WAX (lava)
Set block v1: > the record store as a volcanic cavern, floor of glowing molten
> orange vinyl, record crates floating like obsidian rafts, dripping melted records
> hanging from shelves like stalactites, ember flecks in the air, red-black palette.
Scenes (~4): hop the crate stepping-stones as they sink one beat after landing
(→,→,↑ rhythm section — this is the "musical" QTE scene) · melted-record stalactite
drips a lava blob — sidestep (←) · **sleeve-dactyls**: gatefold album covers flap off
the walls like pterodactyls and dive-bomb (duck ↓, then action to swat one with a
crate lid) · geyser finale: molten wax geysers erupt in sequence down the aisle,
run the gauntlet toward camera, Uncharted-style collapse escape (↑,→, action).
Deaths: sinks slowly into molten vinyl giving a solemn Terminator thumbs-up ·
snatched by a sleeve-dactyl, exits screen-right screaming, feather (single record)
floats down · one beat late on a geyser — launched skyward, lands as a freshly
pressed 7" with his face as the label.
### Track 4 — B-SIDE / SPACE (roof rips off)
Set block v1: > the record store torn open to deep space, shelving units drifting
> in zero gravity trailing debris fields of floating records, Earth tiny below,
> nebula light in purple and teal, the guy in a fishbowl bubble helmet formed from
> his headphones' glow, silent starfield.
Scenes (~5): decompression — grab a shelf as everything goes weightless (action) ·
zero-g leaps between drifting racks, momentum only, one chance per push (→,↑) ·
asteroid field of tumbling records — weave (←,→,←) · **the black hole spindle**: a
spindle-shaped singularity starts pulling the whole debris field into orbit —
slingshot around it Interstellar-style by kicking off a passing Marantz amplifier
(action at perihelion, the hardest window in the game) · re-entry: ride a flaming
record like a heat-shield surfboard back down through the atmosphere (hold ↓, then
action to bail into the store's chimney).
Deaths: drifts away slowly, tiny, waving politely forever · spaghettified into a
long thin groove around the spindle singularity · re-entry mistimed — arrives as a
smoking crater in the checkerboard floor, hand emerges holding the record, unharmed.
### Track 5 — THE GRID (sucked into the hi-fi — Tron world)
Set block v1: > inside a computerized hi-fi system rendered as a neon wireframe
> world, glowing cyan and magenta grid floor like a giant equalizer, towers of
> circuit-board skyscrapers, records rendered as glowing light-discs, black sky
> with scrolling waveform aurora, the guy outlined in neon piping.
Scenes (~5): equalizer floor — the grid tiles are EQ bars pumping to the bass, cross
during the quiet bars (→ on the beat, ✕2) · **light-disc battle**: Dead Wax security
programs (faceless neon figures) fling light-discs — deflect (←), catch (action),
throw back (→): first real "combat" volley of the game, 3-input chain · derezz
tunnel: a wall of static deletion sweeps the corridor, outrun it toward camera (↑,↑)
· hack the gate: giant spinning platter-lock, hit the action input when the groove
gap aligns (action) · escape on a light-cycle that is obviously a Technics 1200
with wheels (hold →, then ↑ off the ramp).
Deaths: derezzes into pixels that reform as a sad 8-bit sprite of himself, bloop ·
takes a light-disc to the chest, freezes, falls over rigid like a mannequin, clang ·
light-cycle wipeout — respawns momentarily as a screensaver bouncing between screen
edges.
(Tron-adjacent styling note: neon-grid aesthetic is fine; avoid literal TRON
trade-dress terms in prompts — our version is "inside a hi-fi", discs are records.)
### Track 6 — THE RUN-OUT (inside the groove — the Dead Wax's home)
Set block v1: > a surreal endless landscape inside a record's run-out groove, black
> glossy vinyl canyons with concentric ridge walls curving to the horizon, a distant
> impossibly huge chrome needle plowing the groove like a ship's prow, dust motes
> the size of boulders, single spotlight sun, oppressive silence.
Scenes (~4): canyon sprint as THE NEEDLE plows up the groove behind him, monolith-
sized, throwing a bow-wave of shredded vinyl (↑, →, ↑ escalating chase — the
scariest sequence, minimal comedy, earn the finale) · boulder-dust storm — shelter
in a scratch crevice at the right instant (↓) · groove-wall ridge-run: the walls
ripple with the music, ride a ripple crest up and over into the next groove (→ at
the crest) · the label: reach the paper label — a vast circular plain — as black
tendrils erupt from the spindle hole ahead (final approach, action).
Deaths: the needle catches him — screen-filling white scratch-noise flash, then he's
a click in the groove forever (the one genuinely eerie death; earn it) · buried by a
dust boulder, pops out coughing a 78rpm shellac · mistimes the ridge-run and is
flung into the next groove over, has to watch himself rerun the same scene (meta gag).
### Track 7 — THE DEAD WAX (boss)
Set block v1: > the record store restored but wrong, bathed in black glossy liquid
> vinyl dripping upward, the Dead Wax towering as a shifting mass of molten records
> and tonearm limbs over the sacred glowing turntable altar at the listening booth.
Structure — three QTE volleys, Dragon's Lair final-dragon style:
1. **Tendril storm**: dodge chain ←,↓,→ as vinyl tendrils smash the floor.
2. **The remix**: the Dead Wax replays hazards from every world in 1s flashes (shark!
geyser! disc! needle!) — 4-input rapid chain, one per callback. Victory-lap scene
that reuses the audience's training.
3. **The needle drop**: the guy leaps onto the spinning platter, runs against its
rotation in place toward the tonearm, and must LIFT THE NEEDLE on the exact final
beat of the music (action, tightest window in the game, 0.4s).
Win clip: needle lifts → the Dead Wax deflates into an ordinary record with a
"PROMO — NOT FOR SALE" sticker → dawn light, store normal, he sleeves the record,
files it under "Misc", sips cold coffee. Stinger after credits: the store cat paws
the record back out of the bin. RECORD STORE GUY WILL RETURN.
Boss deaths: pressed between two giant platters into a limited-edition picture disc
of his own face · the remix callbacks get him in whichever way he failed most (if
engine tracks death stats, pick that clip — cheap personalization, huge laugh).
## Death design rules (the comedy engine)
- Wile E. Coyote physics: instant, absurd, painless-looking, held tableau for
DEATH_HOLD, hero always intact on retry. Never gore.
- Every death is a *punchline to the specific mistake* — late jump gets a different
death than wrong direction where the budget allows.
- Budget trick: each world gets ONE generic world-death (splash/sink/derezz) shared
across its scenes + scene-specific deaths only for the setpiece scenes. Dragon's
Lair reused deaths constantly; nobody minded.
## Clip budget vs the 9000 credits
| Bucket | clips | gens @1-in-2.5 keep | credits (Fast=20) |
|---|---|---|---|
| Action scenes: 31 (4+5+4+5+5+4+4 incl. boss volleys) | 31 | ~78 | ~1560 |
| Deaths: 7 world-generic + ~14 scene-specific | 21 | ~53 | ~1060 |
| Needle-skip transitions (1 per world, reused) | 7 | ~14 | ~280 |
| Intro, win, stinger, attract, game-over | 5 | ~15 | ~300 |
| Quality-tier re-shoots of ~8 hero moments (@100) | — | ~12 | ~1200 |
| **Total** | **~64** | | **~4400** |
Leaves ~4600 credits of contingency — enough to survive a 1-in-4 keep rate or add
a whole bonus world (John will have ideas). Discipline rules in PLAN.md Phase 5 apply.
## QTE difficulty curve
Track 1 windows 0.9s single inputs → mid-game 0.7s with 23 chains → Track 6 chase
0.6s → boss finale 0.4s. Checkpoint at the start of each track (checkpoint:true),
5 lives, so a run is tense but finishable — Dragon's Lair quarter-munching cruelty
is the vibe, not the economics.

93
bible/BIBLE.md Normal file
View File

@ -0,0 +1,93 @@
# RECORD STORE GUY — production bible (v0 draft, pending John's art review)
The whole consistency strategy: **nothing is ever prompted freestyle.** Every image
(FLUX) and every clip (Flow/Veo) is assembled from the verbatim blocks below plus
ONE shot-specific action sentence and ONE camera line. Blocks are copy-pasted
character-for-character. Edit a block → bump its version and regenerate the
ingredient stills before generating any more clips with it.
## STYLE BLOCK v1 (verbatim in every prompt, FLUX and Flow)
> 1980s hand-drawn cel animation, theatrical animated feature quality, thick
> confident ink outlines, rich painterly gouache backgrounds, dramatic colored
> rim lighting, saturated jewel-tone palette with deep shadows, subtle film grain,
> 2D animation cel look, no photorealism, no 3D render, no CGI.
(If John flips to live-action FMV cheese, replace with: "early 1990s live-action
full-motion-video game footage, shot on Betacam, slightly soft, practical neon
lighting, theatrical overacting" — and regenerate everything. Decide BEFORE Phase 3.)
## HERO BLOCK v1 — "Dez" (placeholder design, John approves at concept review)
> Dez, a lanky 20-something record store clerk with a tall messy black quiff,
> olive skin, thick eyebrows, wearing an open red flannel shirt over a faded black
> band t-shirt, rolled dark jeans, scuffed white hi-top sneakers, oversized silver
> headphones worn around the neck, expressive rubber-limbed animation acting.
Notes: silhouette-first design (quiff + flannel + neck headphones reads at any
size/angle — that's what survives gen drift). Keep clothing colors primary and few.
## VILLAIN candidates (pick one with John, then write VILLAIN BLOCK v1)
1. **The Dead Wax** — an entity living in run-out grooves; black liquid vinyl that
drips out of records and takes shapes. Great for varied deaths, easy consistency
(it's a black glossy mass — gen drift can't hurt it). *(recommended)*
2. **Mildred** — possessed store cat, eyes like spinning 45 adapters.
3. **The Audiophile** — tyrannical ghost of the store's founder, cable-tentacles,
tube-amp glow chest.
## SET BLOCKS v1
**SET-A store floor:** > inside a cluttered independent record store at night, rows
> of wooden crates packed with vinyl records, walls covered in gig posters and
> album sleeves, a buzzing neon sign glowing red and cyan, dusty air, single
> flickering fluorescent tube, checkerboard floor.
**SET-B backroom:** > the record store stockroom, floor-to-ceiling industrial
> shelving stacked with record boxes, a single hanging bulb, a service hatch,
> cobwebs, teetering towers of 7-inch singles.
**SET-C listening booth:** > a vintage wood-paneled listening booth with a glowing
> turntable console, padded walls, a porthole window, warm amber light.
(3 sets is enough for a full gauntlet — Dragon's Lair reused rooms shamelessly.
Add SET-D "the groove" (surreal inside-the-record void, black glossy landscape,
concentric ridges to the horizon) if we pick villain #1.)
## PROMPT GRAMMAR
**FLUX still:** `[STYLE] [HERO or VILLAIN] [SET] [pose/expression sentence] [framing line]`
**Flow clip:** `[STYLE] [HERO] [VILLAIN if present] [SET] [ACTION: one sentence, one
verb chain, ≤25 words] [CAMERA: one line, e.g. "static wide shot" / "slow push-in"]`
Rules:
- ONE action per clip. Veo garbles compound choreography. A scene needing two beats
= two clips frame-chained.
- Name the character every time ("Dez ducks…" never "he ducks…").
- Camera: default static or slow push — wild moves amplify drift.
- Deaths end on a held comedic tableau (readable freeze for DEATH_HOLD).
- Negative/avoid line on every gen: "no text, no captions, no watermark, no extra
people, no photorealism."
## FLOW WORKFLOW (Phase 3+; John drives the browser/login, never Claude with credentials)
1. Ingredients: upload approved FLUX `hero_face` + `hero_sheet` (+ villain still).
Every clip gen uses ingredients-to-video referencing them.
2. Veo Fast (~20 cr) for all takes; quality (~100 cr) reserved for intro/win/hero deaths.
3. Within-scene continuity: Flow "extend" / last-frame→first-frame chaining.
Between scenes: hard cuts (hide drift; it's the Dragon's Lair idiom anyway).
4. 16:9, and trim in post — never re-gen to fix length (postprocess.sh trims free).
5. Log EVERY gen in production/SHOTLOG.csv before the next gen:
`date,scene_id,take,mode,credits,verdict(keep/reject),drift_notes`.
## CONCEPT-ART PROMPTS (Phase 2, MODELBEAST flux_local, free — iterate hard)
Compose per grammar above. Shot list + specific final sentences:
1. `hero_sheet`: "character model sheet, full body turnaround, front view and side
view, neutral standing pose, plain warm gray background" *(omit SET)*
2. `hero_face`: "close-up head and shoulders portrait, three-quarter view, confident
smirk, plain warm gray background" *(omit SET — this is the prime Flow ingredient)*
3. `villain`: per chosen candidate + "emerging menacingly, full figure, dramatic low angle"
4. `store_wide`: STYLE + SET-A + "wide establishing shot, empty of people, moody" *(omit HERO)*
5. `store_backroom`: STYLE + SET-B same treatment
6. `style_frame`: full grammar, SET-A, "Dez frozen mid-leap over a toppling crate of
records as black vinyl tendrils snatch at his ankles, dramatic wide shot" — the money shot
7. `death_concept`: SET-A, "Dez flattened under an avalanche of record crates, only
sneakers and one hand visible giving a weak thumbs-up, comedic tableau"
8. `title_card`: "vintage 1983 arcade cabinet marquee art with the title RECORD STORE GUY in
chrome airbrushed lettering over a black vinyl record dripping like liquid" *(text
WILL come out mangled — it's concept only; real logo gets drawn/typeset later)*
Run seeds 14 per shot (`-p seed=N`), pick best, file as
`bible/concept/<shot>_v1_s<seed>.png`. John reviews before anything touches Flow.