# 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 4–5s 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 3–4 seeds each, keep best. Free, so iterate hard BEFORE touching Flow.

### Phase 3 — Flow style + consistency test (~180 credits MAX, gated on John's approval)
**3a Style test first:** compile `shots/t2_s3_sharkrun.json` in all 4 looks
(`tools/promptc.py ... --all`), gen each once in Veo Fast (~80 cr) with the matching
FLUX ingredient still per look. John picks the look (default cel80s — the build
assumes it; a different pick only swaps prompt text, zero code change). **3b then:**
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** → ~200–280 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).
