Files
goldeneye-pc-port/docs/dev/preview-video.md
T
James Dansereau 608808a212 Docs: v0.2.0 finalization — README/Pages + media pass (#80)
* README: 32 s gameplay preview montage (mp4) + preview-video runbook

* Prune: drop superseded goldeneye-demo.gif (replaced by gh-preview montage)

* Docs: v0.2.0 finalization pass — final wording, aligned known issues, Deck-verified line, social preview card

- README + pages site: 'v0.2.0 (pre-release)' -> v0.2.0 throughout; the
  stale 'not yet verified on real Deck hardware' line is replaced with the
  playtest fact (D253 fixed, D255 still open).
- Known-issues lists in README + site now match the release notes one-for-one
  (adds the F10 bottom-row duplicate D251 and the intermittent Deck SIGSEGV
  D255; D243/D230/D252/D245/D246/D75 carry their finding labels).
- Working list mentions AllUnlocked default-ON (D257) with the F10 opt-out.
- First-public-release note added to the README hero and site status line,
  hedged with 'to our knowledge'.
- social-preview.png (1280x640 GitHub link card) composed from a gameplay
  frame of the preview montage; scratchpad/make-social-preview.py is the
  local recipe (gitignored, like make-preview.py).
- Commit docs/img/shots/manifest.csv (gallery -> source recording map);
  gitignore the regenerable CONTACT-SHEET.jpg; drop scratch-gdb-cmds.txt.

* Social preview: regenerate card from updated briefing HTML (v0.2.0 final wording)

The PNG committed earlier was a screenshot of the rendered site (stale
wording, video element unrendered). The canonical source is
.github/social-preview.html per .github/social-preview.md; update its
Status/Statistics lines to the v0.2.0 final state and re-render:

- Status: RELEASED v0.2.0 — WINDOWS · LINUX · STEAM DECK
- All 21 solo missions — full campaign completed in playtesting
- ~22k lines C/C++ · ~10k Python (port layer + tools)
- ~250 bugs root-caused · two coding agents, one human, part-time

Verified by pixel-diff against the previous render: only the four text
bands changed; title/fonts/layout identical. Drop the unreferenced
root-level social-preview.png.

* docs: refresh social preview + status for v0.2.0 playtest results

- Social card: 'RELEASED v0.2.0', 21/21 missions completed in playtesting,
  ~250 bugs fixed, two agents + one human; re-rendered the PNG from the
  canonical .github/social-preview.html source (pixel-diff vs the old render
  shows only the four edited text bands changed)
- README Status: campaign now claimed as completable end to end (user
  playtest: full campaign, Agent difficulty, PC); Working list matches
- findings: D255 updated with the Deck register capture (Rdi=nil -> NULL
  ObjectRecord.model, destroy-path ordering case confirmed; truncation ruled
  out) and the rule-#2 sign-off question for a guard; D254 field-verified

* docs: regenerate findings index (D254/D255 status updates)
2026-09-13 22:12:13 -04:00

3.8 KiB
Raw Blame History

GitHub preview video — runbook

The README embeds docs/media/goldeneye-gh-preview.mp4 (the gif of the same name is too heavy for GitHub; keep it only if someone wants a local copy). It's a ~32 s, 8-clip montage of gameplay cut from ShadowPlay session recordings.

Tooling

scratchpad/ is gitignored, so make-preview.py is a local tool (it hardcodes local video paths anyway) — this doc is the tracked artifact. If it goes missing, the commands below describe exactly what to rebuild. Run with plain python. Working files (per-clip mp4s, concat list, palette, state.json) go to scratchpad/.preview-work/ — disposable, safe to wipe (but then re-run build after any edit).

python scratchpad/make-preview.py list                  # montage index -> source session + time
python scratchpad/make-preview.py shift <i> <±sec>      # nudge a clip within its source video
python scratchpad/make-preview.py set   <i> <sec>       # absolute source time
python scratchpad/make-preview.py replace <i> <.10|.12|.18|.19>  # new random spot in a session
python scratchpad/make-preview.py regen --seed N        # full random redo (same clips/lengths)
python scratchpad/make-preview.py build                 # re-concat + re-render from state.json

Every edit command rebuilds mp4 + gif automatically. A full rebuild takes ~30–50 s; a single-clip shift is the same cost (concat dominates). Budget one command per step if running under a timeout — cut+concat and the two gif passes together fit in ~55 s.

Source material

C:\Users\james\Videos\NVIDIA\Build-pc\new\ — ShadowPlay recordings (3072x1728 @ 60 fps, h264), no usable audio track (cut with -an). The four sessions and their tags are hardcoded in SESSIONS at the top of the script; add a new session there (tag, filename suffix, duration) to use it.

Rules learned from review rounds

  • Never start a clip in the first ~60 s of a session: desktop / boot / menus. (MIN_START)
  • Bad zones — source times that show non-gameplay; random picks avoid them and replace should too. Currently known (in BAD_ZONES):
    • .10 @ ~395–425 s: file-select menu
    • .10 @ ~1290–1420 s: watch close-up (appears twice in that session) Add new ones here whenever a review round finds another.
  • Clip length 4 s is the sweet spot; 5 s starts to drag, <3 s flickers.
  • Same-session spacing: two clips from one session ≥90 s apart, or they read as a repeat of the same scene.
  • When told "roll forward/back ~N seconds", use N ± a few s and prefer a high-motion moment in that window if you have keyframe stats (see below); otherwise a flat offset is fine.
  • If a pick lands on a menu/loading screen, step it forward again rather than picking a new random time — the user's "a bit later/earlier" almost always means the same scene, different part.

Output spec (don't change casually)

  • mp4: 1920x1080 @ 30 fps, libx264 crf 20, +faststart, no audio. ~25 MB for 32 s.
  • gif: 512 px wide, 12 fps, two-pass palette (palettegen then paletteuse=dither=bayer:bayer_scale=3). ~28 MB — local use only.

Optional: motion data to find "cool" moments

scratchpad/analyze-sessions.py dumps per-keyframe YAVG stats for the session files; the diff between consecutive keyframes is a decent proxy for "something is happening". If you need to find the coolest moment in a time window, maximize it — but note plain random picks with spacing constraints have been preferred by the reviewer over signal-optimized cuts, so use this only when asked for "something cool".

ffmpeg notes (Windows)

No system ffmpeg; the script falls back to the imageio-ffmpeg static binary (pip install imageio-ffmpeg). Pass paths as forward-slash or bare filenames with cwd= set — drive-letter colons and backslashes break filter-graph argument parsing.