WP-009: Reference screenshot library (Showdown in Ghost Town)

Status: 📦 Queued Phase: 0 — Pre-Work (before WP-002) Depends on: WP-008 ✅ (room IDs available — see §Notes) Unblocks (recommended, not strict): EC-002 pre-flight (decoder visual comparison target), WP-001 §Scripted-room render branch trace, Phase 3 *_Room.cpp reimplementation (scripted-room ground truth) Companion EC: — (no EC; inline operator checklist in §Execution. Estimated effort ≤ 2 hrs and no sequential decision branches per wp-lifecycle §Phase 1 — Drafting.) Pre-flight required: No — pre-flight.md §When pre-flight is required explicitly exempts “screenshot/reference-image captures.” This WP commits PNG/WebP image assets + a Jekyll gallery page; it does not touch docs/formats/**, engines/scooby/**, or commit tool scripts under tools/**, and it locks no engine-generation classification. Targets generation(s): Gen 1 (Showdown in Ghost Town only) — per 01-VISION §Engine Lineage. Captures from other titles (Phantom Gen 1, Jinx Gen 2, Case File Gen 3) are explicitly out of scope; each gets its own WP if/when needed. Targets disc(s): Showdown Estimated effort: 1–2 hours


Goal

Capture exactly one clean, stationary frame per distinct room/scene in Showdown in Ghost Town from a YouTube longplay, store them as docs/assets/screenshots/showdown-screens/<room-id>.png (git-tracked, served by GitHub Pages — see §Notes for why docs/assets/ and not tools/samples/), and render them as a gallery page on the Pages site at https://github.barefootbetters.com/scooby-engine/docs/assets/screenshots/showdown-screens/. This index.md IS the canonical gallery page served by GitHub Pages and is the primary deliverable of this WP.

These become the visual ground truth for WP-002’s decoder: when probe_art.py produces an image, the comparison target is a named file, not a memory of what the game looked like.

Capture rules (binary):

Background

EC-002 pre-flight already requires a reference screenshot to be in place before running decode strategies. This WP creates that asset once, properly named and provenance-logged, so it’s reusable across WP-002 and any future decoder debugging session.

Without this library, “does this look right?” requires searching a longplay in real time. With it, it’s a 10-second side-by-side against a known-good file. For a decoder that may go through 5–6 strategy iterations (EC-002 Phases B1–B6), the savings compound.

Scope

This WP has two tiers, addressing two distinct downstream consumers:

Per-tier scope details

In scope (both tiers):

Capture quality requirements (both tiers):

Out of scope:

Dependencies

Exit criteria

  1. Required-tier coverage achieved (binary gate — WP cannot close without this).
    • All 16 TGIFILE.ART-backed canonical rooms captured as PNG files.
    • At least one character sprite anchor captured as OBJ_DAPHNE_A.png (or substituted sprite if OBJ_DAPHNE_A is unobservable in the longplay — log substitution reason in the Notes column).
    • Any Required-tier ID NOT captured MUST be listed in the provenance table with Match Status Gap and one of these explicit reasons:
      • Not reached in longplay
      • Not observable in source video (UI overlay, scene too brief, always behind transition)
    • The Required tier has no “uncertain” escape — every Required-tier row is either a captured canonical file or a Gap row with a reason. (Uncertain captures are saved as UNMATCHED_<slug> and listed in the Unmatched table; they do NOT satisfy Required-tier coverage.)
  2. Stretch-tier coverage logged.
    • For each of the 21 code-rendered canonical rooms, the gallery row is either a captured file (PNG or high-quality WebP) or a Gap row with the same reason set as Required tier.
    • Partial coverage is acceptable at this tier; the gate is honest accounting, not completion.
  3. Naming compliance (binary, both tiers).
    • Every committed file is either:
      • A WP-008 canonical room or object ID verbatim (e.g. ROOM_P21_Boot_Hill1.png, OBJ_DAPHNE_A.png), OR
      • Prefixed UNMATCHED_<descriptive-slug>.png (or .webp) with a Match Status: Unmatched row in the Unmatched captures table and a justification in the Notes column.
    • No silent slugs, no near-canonical names (ROOM_P21_BootHill.png when the catalog says ROOM_P21_Boot_Hill1), no half-matches.
  4. Gallery page rendered.
    • docs/assets/screenshots/showdown-screens/index.md (pre-renamed from README.md) renders on the Pages site, using the provenance schema in §Deliverables — every row shows an embedded preview alongside Room ID / Source Video / Timestamp / Match Status / Notes.
    • This index.md IS the canonical gallery page; it is the primary deliverable of this WP, not a side artifact.
  5. Decoder-anchor validation (Required-tier sanity check).
    • At least one Required-tier capture is a full-room static background (not a partial view, not a transition), clear and unobstructed per §Goal capture rules — suitable for direct visual comparison with decoded TGIFILE.ART output. This is the frame EC-002 pre-flight will pull when running decode strategies.
    • The OBJ_DAPHNE_A (or substitute) sprite anchor is present and clear — entry[0] of TGIFILE.ART is OBJ_DAPHNE_A, so this is the WP-002 first-decode comparison target. See §Notes.
  6. WORK_INDEX teaser updated.
    • WORK_INDEX “Reference Screenshots” section carries one or two representative thumbnail teasers, each linking to the gallery page. The full 16+ image set does NOT live inline in WORK_INDEX.
  7. Pages render verified.
    • Gallery page is visible at https://github.barefootbetters.com/scooby-engine/docs/assets/screenshots/showdown-screens/ and all embedded images load (no broken images in the live render).

Deliverables

Provenance schema (mandatory).

The index.md provenance table MUST include exactly these columns:

| Preview | Room ID | Source Video | Timestamp | Match Status | Notes | |—|—|—|—|—|—|

Where:

Page-weight sanity check: full-size PNGs run ~1–2 MB each; WebP at quality 90 runs ~150–300 KB. The width="320" embed keeps the rendered gallery light regardless of file format; the underlying file is unchanged.

Execution

Inline operator checklist (no separate EC — this WP is one continuous capture session, not a multi-step branched workflow). Run top-to-bottom once; check each item as completed.

Setup

Per-room capture loop (repeat for each distinct room encountered)

Close-out (substantive docs-only WP — commits go direct to main per wp-lifecycle §0 Triage; split into two commits per §Two-commit topology. There is no branch and no PR for this WP — the discipline is provided by §Scope, the inline checklist, and the two-commit split.)

Commit A — the deliverable

Commit B — the close

Verify Pages render

Notes