diff --git a/CREDITS.md b/CREDITS.md
index c425bf2..94a31ea 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -58,9 +58,6 @@ their folder sidecar:
- `docs/screens/refs/hollywood/premiere-staging-street-day-wikimedia-2006-02-12.jpg` — John
Barreiros, CC BY 2.0, via Wikimedia Commons.
- Public-domain files in the same folder: Charles W. Beam (1922) and Gary Minnaert (2006).
-- `docs/screens/refs/joke-shop/comedy-store-signature-band-day-wikimedia-2020-04-09.jpg` — Tony
- Mariotti, CC BY 2.0, via Wikimedia Commons ( as requested).
-- Public-domain files in the Joke Shop folder: Gary Minnaert (2006).
- `docs/screens/refs/hollywood/el-capitan-theatre-marquee-neighbour-day-wikimedia-2009-07-11.jpg` —
Alan Light, CC BY 2.0, via Wikimedia Commons.
- `docs/screens/refs/hollywood/hollywood-boulevard-night-context-ccbysa.jpg` — Downtowngal,
diff --git a/MEMORY.md b/MEMORY.md
index e33ece6..d96bfcc 100644
--- a/MEMORY.md
+++ b/MEMORY.md
@@ -84,78 +84,7 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
street context CC BY-SA 3.0). The CC BY-SA frame is redistributed unmodified for study only with
no derived asset, and that review is written into the sidecar; a licensed night photo of the hero
facade is still the top missing reference.
-- **Joke Shop reference board (2026-11-03):** three photos in `docs/screens/refs/joke-shop/` (PD x2
- by Gary Minnaert 2006, CC BY 2.0 by Tony Mariotti 2020) covering the hillside/canopy block, the
- frontage with palms and the signature-band/curtain detail. `The Comedy Store.jpg` (CC BY-SA 3.0)
- from the old link list was deliberately skipped: the PD frames cover the same evidence and no
- share-alike review was needed. The CC BY file requests a dofollow link, recorded in its sidecar
- and CREDITS.
-- **Imagery evidence model (2026-11-03):** `TODO.md` now separates three image sources that must
- not be mixed: licensed real-location photos (evidence of what a place looks like), generated
- concept boards (art-direction proposals with model/prompt/spend provenance), and build captures
- (proof the build matches). Per-venue boards go under `docs/screens/refs//` with a
- `SIDECAR.md` per folder (photo table: file, subject, view, URL, author, licence, date, purpose,
- shipped; plus redactions, derived-decision log and a table referencing the generated boards used
- in the three-up). Generated frames stay in `docs/screens/concepts/`, never in `refs/`, and stay
- out of `assets/` until picked, cropped, credited and audited. Every workstream now
- ends with a capture step that updates `README.md` plus the matching docs page, verified with
- `tools/check_screenshots.sh` and `python3 tools/check_docs.py`.
-- **Collider coverage gate (2026-11-03):** `WorldBuilder` sets `library_prop` metadata on every
- node in `library_nodes`, and `NON_BLOCKING_LIBRARY` (`marquee`, `wall_lantern`, `handrail`,
- `double_door`) documents the mounted/decorative pieces that intentionally publish no
- walk-blocking body. `test_world.gd` verifies placed props have `Collision` + `Shape` +
- `Avoidance` in all three venues, and that library dressing has a body unless exempt. Both
- were mutation-checked (removing `_add_prop_collision` fails 3 tests; dropping `handrail` from
- the exemption list fails with the node name). Suite is 275/275. Add the metadata when adding a
- new library placement, or the coverage test will report it.
-- **3D review gates (2026-11-03):** `tools/test_blender_assets.py` now gates texel density
- (all five character slots present, 40–400 px/m authored, ≥250 px/m effective fabric), and
- `tools/test_model_review.py` gates scorecard coverage (every `CHARACTERS`/`GEAR`/`PROPS` entry
- needs a row in `docs/3d-model-review.md`, characters need a verdict). Python tooling is 116
- tests. Collider-proxy coverage is still an open gate. Remember CI only runs the Godot suite;
- the Python tests are local (`cd tools && python3 -m unittest discover -p 'test_*.py'`).
-- **Pose capture is blocked (2026-11-03):** `src/test/capture_npc_pose.gd` stages idle/walk/sit
- poses for the pose/weight review, but the saved frames show the rest pose while the same run
- logs `rig_y=-0.339`, `leg0=-1.357` and a rotated `HipL` bone quaternion at capture time.
- Verified meanwhile: one skinned mesh bound to one `Skeleton3D`; hiding it removes the body;
- direct `set_bone_pose_rotation` on HipL/KneeL/Spine/ShoulderL/ElbowL/Head changes rendered
- pixels; a bone *position* offset moves the head; a standalone probe running the same
- `_animate()` sequence renders the crouch. A staged in-game `film` frame also showed the arms
- Standalone SceneTree probes (avatar under `root`, under a `Node3D` stage, created
- mid-`_process`) all render the seated crouch, and a `SubViewport` + `RenderingServer.force_draw()`
- probe does too (window probes diff ~2,200-2,360; offscreen 602 at +2/+6/+12 frames, including a
- re-created avatar). So the rig, the animation math and the offscreen path are sound; only
- `capture_npc_pose.gd` still saves rest frames, which makes its phase/camera/force-draw ordering
- the defect. A headless test locks the proxy→bone contract
- (`test_pose_reaches_the_skeleton_bones`, suite 273). Rebuild the harness from the verified
- recipe in `docs/3d-model-review.md` instead of iterating on the current phase machine.
-- **3D review baseline (2026-11-03):** `docs/3d-model-review.md` records the first skill-guided
- measurements: 46/46 assets clean, library 59,012 tris, characters 4,482–5,474 tris (68–69% of
- the 8,000 caps), `npc_base` only 1,204/2,488, 24-NPC 6.94 ms, and authored texel density
- 64–122 px/m (fabric effective 287–440 after the 4× repeat). That is below the skill's 128–256
- background tier but the slot maps are neutral and tinted at runtime, so it is a recorded decision
- point, not a defect. Added `blender_assets.py texels` (stdlib, per-slot px/m from GLB UV/world
- area, fabric reported twice) and `inspect --json --out` (the glTF importer's INFO log is captured
- in `stats.import_log`; Blender's startup banner still pollutes stdout). Baseline/review captures
- run fine under `xvfb-run` into `tmp/`.
-- **3D model re-evaluation first (2026-11-03):** `TODO.md` is re-planned around a new unversioned
- `3D model re-evaluation` track, ahead of character and local-map work, because the crowd-variant
- roster would otherwise multiply whatever the existing models get wrong. It scores all 8
- characters, 18 gear, 20+6 props and the three venues in `docs/3d-model-review.md`, fixes ranked
- P0/P1 only, and must not change the `npc_base` contract, renderer or 0.10.0 candidate. The MIT
- Blender skill pack is now routed through `AGENTS.md` §Local Blender skills; skill advice loses
- to the project contract, and there is no Blender MCP here (headless flatpak scripts instead).
- MEMORY was trimmed to ~800 lines on 2026-11-03 (historical handoffs and release anecdotes
- dropped; gotchas kept); further trimming is tracked in `TODO.md`.
-- **GLB intake inspection (`blender_assets.py inspect`, 2026-11-03):** runs inside Blender, clears
- parents and applies object transforms, then reports tris/budget, raw and seam-split verts,
- Godot-space bounds (height/feet for characters), bones, materials, UVs, skinning and
- animations as `issues` (contract failures, exit 1) or `warnings`. `--json`/`--category` exist
- for intake scripts. Gotchas: the glTF importer creates an `Icosphere` mesh used as
- `pose_bone.custom_shape`, which must be excluded or it dominates bounds; a parented import
- needs `parent_clear(CLEAR_KEEP_TRANSFORM)` before `transform_apply`; Blender is Z-up so bounds
- and bone rests are converted to `(x, z, -y)`. On project assets its counts match `audit`
- exactly, but `audit` stays the stdlib/CI release gate and `inspect` never adapts a file.
+- **Joke Shop reference board removed (2026-11-03):** the committed Comedy Store photo board was removed in favour of the local-only `tmp/research/comedy-store/` research set (owner override: development reference, no licence gate, never committed). The three-up board's photo panel remains a historical public-domain frame; the block's current reference lives in the gitignored research folder.
- **Blender Skills Pack installed locally (2026-11-03):** the MIT `blender-skills` pack
(v1.3.0, 94 skills + a shared `references/` folder) is installed at
diff --git a/TODO.md b/TODO.md
index ac3b994..eafb31a 100644
--- a/TODO.md
+++ b/TODO.md
@@ -199,6 +199,8 @@ and never ship a generated or downloaded image without provenance.
canopy signature band) with a sidecar, linked from `docs/joke-shop-map.md` and credited in
`CREDITS.md`. The CC BY-SA `The Comedy Store.jpg` from the old link list was deliberately not
used; the public-domain frames cover the same evidence. (`docs/screens/refs/joke-shop/`.)
+ **Removed 2026-11-03:** the committed Comedy Store photo board was replaced by the local-only
+ `tmp/research/comedy-store/` research set (owner override; see §3D model re-evaluation → A).
- [ ] Find more pictures from the Comedy Store, the Sunset Boulevard block, collect at least five additional shots for reference; do not care about licensing, these images are only stored locally for reference and inference during development. Find pictures from the neighboring hotel building and the street surroundings.
- [ ] Fill the Joke Shop gaps: better visual representation of actual facade, parking lot to the side, neighboring hotel parking ramp and building, night canopy/sign, entrance recess, south-side neighbours, buildings across the street, hillside behind the building, hill detail.
house detail, neighbouring buildings, and any relevant street-level context.
diff --git a/docs/joke-shop-map.md b/docs/joke-shop-map.md
index 65f2aef..0b3fa68 100644
--- a/docs/joke-shop-map.md
+++ b/docs/joke-shop-map.md
@@ -79,18 +79,13 @@ just as with the Hollywood day/night rows.
## References
-The committed, license-cleared photo board for this block — with the provenance sidecar and the
-decisions each photo informed — is in
-[`screens/refs/joke-shop/README.md`](screens/refs/joke-shop/README.md), and the three-up board
-(real photo | generated concept | current capture) is in
-[`screens/boards/README.md`](screens/boards/README.md).
+The old committed Comedy Store photo board was removed on 2026-11-03 in favour of a local-only
+research set under `tmp/research/comedy-store/` (owner override: development reference, never
+committed, no licence gate). The three-up board (real photo | generated concept | current capture)
+is in [`screens/boards/README.md`](screens/boards/README.md); its photo panel is a historical
+public-domain frame, and the current block reference now lives in the gitignored research folder.
- OpenStreetMap way 428854155:
-- Wikimedia Commons photographs used for proportion and material study:
- -
- -
- -
- -
- AI art-direction frames: [`screens/concepts/joke_shop/`](screens/concepts/joke_shop/README.md)
- The hall wall uses the `dark_stucco` pick (1024 px, matte charcoal grain) instead of the grey
paver tile, so the black stucco reads as the real club's flat plaster rather than masonry.
diff --git a/docs/screens/boards/README.md b/docs/screens/boards/README.md
index c1c5081..41a058a 100644
--- a/docs/screens/boards/README.md
+++ b/docs/screens/boards/README.md
@@ -15,4 +15,4 @@ attribution lives in the caption and the [refs sidecars](../refs/README.md)).
| --- | --- |
|  | El Capitan facade, day. Photo: [CC BY 2.0, woo, 2009](https://commons.wikimedia.org/wiki/File:El_Capitan_Theater_frontal_fachade-The_Masonic_Temple.jpg) via `refs/hollywood`. Concept: photo-anchored generation. Capture: current build with the ashlar limestone field (`limestone_ashlar`, anchored on the same photo). |
|  | El Capitan block, night. Photo: CC BY-SA 3.0 (reviewed; redistribution only, no derived assets) via `refs/hollywood`. Concept: photo-anchored night restage. Capture: current build. |
-|  | Joke Shop frontage, day. Photo: public domain (2006) via `refs/joke-shop`. Concept: photo-anchored (hillside frame; the branded frontage trips the model's recitation filter). Capture: current build with the `dark_stucco` wall tile. |
+|  | Joke Shop frontage, day. Photo: local-only research frame (`tmp/research/comedy-store`, gitignored). Concept: photo-anchored (gemini + gpt). Capture: current build with the `dark_stucco` wall tile. |
diff --git a/docs/screens/boards/jokeshop-day-board.json b/docs/screens/boards/jokeshop-day-board.json
index 46e13c1..f055fb0 100644
--- a/docs/screens/boards/jokeshop-day-board.json
+++ b/docs/screens/boards/jokeshop-day-board.json
@@ -1,7 +1,7 @@
{
"board": "jokeshop-day-board.jpg",
- "caption": "Joke Shop frontage, day. Photo: public domain 2006. Concept: photo-anchored (hillside frame). Capture: dark stucco wall tile.",
- "photo": "docs/screens/refs/joke-shop/comedy-store-frontage-palms-day-pd-2006-12-29.jpg",
+ "caption": "Joke Shop frontage, day. Photo: local-only research frame (tmp/research/comedy-store). Concept: photo-anchored (gemini + gpt). Capture: dark stucco wall tile.",
+ "photo": "tmp/research/comedy-store/01.jpg (local-only, gitignored)",
"concept": "docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.png",
"capture": "docs/screenshots/12-joke-shop.png"
}
diff --git a/docs/screens/concepts/README.md b/docs/screens/concepts/README.md
index 1d8d326..dd83ca5 100644
--- a/docs/screens/concepts/README.md
+++ b/docs/screens/concepts/README.md
@@ -1,6 +1,13 @@
# Scene concepts: the realistic target look
-These are AI-generated example frames (`python3 tools/scene_concepts.py generate --group scene`, `openai/gpt-5-image-mini`, 1280×720) for the realism pass. They are art direction, not assets. `tools/scene_concepts.py realism` pairs them with the in-game shots from `src/test/capture_realism.gd` (see `SHOTS` in the tool). New generations never overwrite a file here; they are saved as `-vN.png`.
+These are AI-generated example frames for the realism pass. They are art direction, not assets.
+`tools/scene_concepts.py realism` pairs them with the in-game shots from `src/test/capture_realism.gd`
+(see `SHOTS` in the tool). New generations never overwrite a file here; they are saved as
+`-vN.png`.
+
+Concepts are organised per venue in the two subfolders below. The older top-level single-frame
+concepts were removed on 2026-11-03 in favour of the per-venue boards, which carry photo-anchored
+generations with a `.refgen.json` provenance sidecar each (source photo, licence, model).
## Real-world Hollywood block
@@ -10,37 +17,10 @@ The map-optimization references for the El Capitan Entertainment Centre block
facts and game mapping are documented in
[`../../hollywood-boulevard-map.md`](../../hollywood-boulevard-map.md).
-## Concept list
-
-### Hollywood Entrance
-
-
-warm low sun, long soft shadows, brick with visible mortar and wear, stone plinth, potted topiary, haze that fades the far street to beige
-
-### Hollywood Entrance Golden Hour
-
-
-strong back light and rim light on people, marquee bulbs reading even in daylight
-
-### Hollywood Entrance Rain Night
-
-
-dark scene lit by practical lights only (marquee, sodium lamps), wet glossy ground with reflections, fog
-
-### Boulevard Skyline
-
-
-deep layered skyline with real towers and haze, palms lining the road, red curb paint, believable asphalt
-
-### Boulevard Skyline Dusk
-
-
-purple/orange gradient sky, neon signs, lit windows, car light trails
-
-### The Joke Shop — Sunset Strip
+## The Joke Shop — Sunset Strip
The current Joke Shop map is based on The Comedy Store at 8433 Sunset Blvd.
-The real-site mapping, simplifications and reference photographs are in
+The real-site mapping and simplifications are in
[`../../joke-shop-map.md`](../../joke-shop-map.md); the frames are in
[`joke_shop/README.md`](joke_shop/README.md).
@@ -48,56 +28,15 @@ The real-site mapping, simplifications and reference photographs are in

-### Legacy Joke Shop Alley (pre-map optimization)
+## Cross-cutting targets
-
-narrow brick alley, one warm wall lantern as key light, deep shadows, people in dark jackets
+For comparison with locally generated realism runs (`docs/screens/realism/`, gitignored):
-
-close material detail: brick, mortar, aged wood door, brass
-
-These two frames describe the old alley layout and are retained for comparison;
-they are no longer the target for the Joke Shop map.
-
-### Studio Stage Door Night
-
-
-granite facade, a bright bulb canopy as the main light, a glossy black car, stanchions and a barrier
-
-### Sidewalk Material Closeup
-
-
-paver joints, stains, granite curb, aggregate asphalt and a tree grate at grazing light
-
-### Entrance Steps Podium
-
-
-granite steps, handrails, glass doors, the check-in podium
-
-### Crowd Barrier Line
-
-
-steel barriers, a red carpet, a crowd with depth-of-field haze
-
-### Responder Arrival Wide
-
-
-fire engine, turnout gear, red/blue light spill on wet pavement
-
-### NPC Portrait Day
-
-
-close portrait of a pedestrian: skin with visible pores and stubble, fabric weave, shallow depth of field. The bar for an avatar close-up, not for the crowd shots
-
-The `npc_portrait` capture in `capture_realism.gd` is staged, not posed by the crowd: it freezes one NPC on an open patch of sidewalk, parks the rest of the crowd out of frame, turns the subject into the camera and stands the guard on the sunlit side. It is the only shot where a face fills the frame, so it is the one to eyeball after an avatar change (generate a local run under `docs/screens/realism/`).
-
-Cross-cutting targets, for comparison with locally generated realism runs:
-
-- **Exposure.** The concepts keep the ground mid-grey. The game's sidewalk is close to white, so it is overexposed.
-- **Night means dark.** The night/dusk concepts are lit by practical lights. The game's "Evening" phase is a bright pink-orange frame.
-- **Depth.** The concepts show a layered skyline fading into haze. The new v2 skyline strips supply this; the old box skyline did not.
-- **Geometry and foliage.** The facades have plinths, cornices and deep window reveals, and the trees and shrubs are organic. The game uses flat walls and blob trees.
-
-## Additional previews
-
-
+- **Exposure.** The concepts keep the ground mid-grey; the game's sidewalk reads lighter, so it
+ overexposes against the reference.
+- **Night means dark.** The night/dusk concepts are lit by practical lights only (marquee,
+ signage, street lamps), with wet pavement reflections.
+- **Depth.** The concepts show a layered skyline fading into haze; the v2 skyline strips supply
+ this at the boulevard boundary.
+- **Geometry and foliage.** The facades have plinths, cornices and deep window reveals, and the
+ trees and shrubs are organic; the venue-realism passes close these gaps incrementally.
diff --git a/docs/screens/concepts/boulevard_skyline_day.png b/docs/screens/concepts/boulevard_skyline_day.png
deleted file mode 100644
index 248a8a0..0000000
Binary files a/docs/screens/concepts/boulevard_skyline_day.png and /dev/null differ
diff --git a/docs/screens/concepts/boulevard_skyline_dusk.png b/docs/screens/concepts/boulevard_skyline_dusk.png
deleted file mode 100644
index 71bb4db..0000000
Binary files a/docs/screens/concepts/boulevard_skyline_dusk.png and /dev/null differ
diff --git a/docs/screens/concepts/crowd_barrier_line.png b/docs/screens/concepts/crowd_barrier_line.png
deleted file mode 100644
index 7a500f5..0000000
Binary files a/docs/screens/concepts/crowd_barrier_line.png and /dev/null differ
diff --git a/docs/screens/concepts/entrance_steps_podium.png b/docs/screens/concepts/entrance_steps_podium.png
deleted file mode 100644
index eedcd89..0000000
Binary files a/docs/screens/concepts/entrance_steps_podium.png and /dev/null differ
diff --git a/docs/screens/concepts/hollywood_boulevard/README.md b/docs/screens/concepts/hollywood_boulevard/README.md
index afd3b7a..67338f2 100644
--- a/docs/screens/concepts/hollywood_boulevard/README.md
+++ b/docs/screens/concepts/hollywood_boulevard/README.md
@@ -44,3 +44,15 @@ mild — treat this as the overcast target, not a decay reference.
## Across the boulevard

+
+## Facade — local-reference anchored, two models
+
+
+
+
+
+Both frames are anchored on the same local-only research photo
+(`tmp/research/elcapitan/01.jpg`, gitignored) with `--reference-unchecked`, one with
+`google/gemini-2.5-flash-image` and one with `openai/gpt-5-image-mini`. Provenance and model are
+in each frame's `.refgen.json` sidecar. Local reference only; the photo never enters the repo and
+these frames are art direction, not assets.
diff --git a/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gemini_day.png b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gemini_day.png
new file mode 100644
index 0000000..fb57e57
Binary files /dev/null and b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gemini_day.png differ
diff --git a/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gemini_day.refgen.json b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gemini_day.refgen.json
new file mode 100644
index 0000000..3cdcbaa
--- /dev/null
+++ b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gemini_day.refgen.json
@@ -0,0 +1,12 @@
+{
+ "concept": "el_capitan_facade_gemini_day",
+ "generated": "el_capitan_facade_gemini_day.png",
+ "model": "google/gemini-2.5-flash-image",
+ "reference": {
+ "file": "tmp/research/elcapitan/01.jpg",
+ "licence": "unchecked",
+ "page": "",
+ "licence_checked": false
+ },
+ "suffix": "Use the attached reference photograph as the fixed source of geometry and composition: keep the building's proportions, column rhythm, band heights, signage placement and camera angle exactly as photographed. Only restage lighting, weather, people and surface condition where the prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
+}
diff --git a/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gpt_day.png b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gpt_day.png
new file mode 100644
index 0000000..6ecc4b4
Binary files /dev/null and b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gpt_day.png differ
diff --git a/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gpt_day.refgen.json b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gpt_day.refgen.json
new file mode 100644
index 0000000..2e617d6
--- /dev/null
+++ b/docs/screens/concepts/hollywood_boulevard/el_capitan_facade_gpt_day.refgen.json
@@ -0,0 +1,12 @@
+{
+ "concept": "el_capitan_facade_gpt_day",
+ "generated": "el_capitan_facade_gpt_day.png",
+ "model": "openai/gpt-5-image-mini",
+ "reference": {
+ "file": "tmp/research/elcapitan/01.jpg",
+ "licence": "unchecked",
+ "page": "",
+ "licence_checked": false
+ },
+ "suffix": "Use the attached reference photograph as the fixed source of geometry and composition: keep the building's proportions, column rhythm, band heights, signage placement and camera angle exactly as photographed. Only restage lighting, weather, people and surface condition where the prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
+}
diff --git a/docs/screens/concepts/hollywood_entrance_golden_hour.png b/docs/screens/concepts/hollywood_entrance_golden_hour.png
deleted file mode 100644
index f0f8f0d..0000000
Binary files a/docs/screens/concepts/hollywood_entrance_golden_hour.png and /dev/null differ
diff --git a/docs/screens/concepts/hollywood_entrance_morning.png b/docs/screens/concepts/hollywood_entrance_morning.png
deleted file mode 100644
index 1c15cbd..0000000
Binary files a/docs/screens/concepts/hollywood_entrance_morning.png and /dev/null differ
diff --git a/docs/screens/concepts/hollywood_entrance_rain_night.png b/docs/screens/concepts/hollywood_entrance_rain_night.png
deleted file mode 100644
index 19e04d0..0000000
Binary files a/docs/screens/concepts/hollywood_entrance_rain_night.png and /dev/null differ
diff --git a/docs/screens/concepts/joke_shop/README.md b/docs/screens/concepts/joke_shop/README.md
index d2167ac..2e558a8 100644
--- a/docs/screens/concepts/joke_shop/README.md
+++ b/docs/screens/concepts/joke_shop/README.md
@@ -10,12 +10,9 @@ game textures. The geometry mapping and source links are in

-Generated with `generate --reference`, anchored on the licence-cleared
-[`comedy-store-hillside-canopy-day-pd-2006-12-29.jpg`](../../refs/joke-shop/comedy-store-hillside-canopy-day-pd-2006-12-29.jpg)
-board photo (public domain); provenance in
-[`joke_shop_entrance_day-v2.refgen.json`](joke_shop_entrance_day-v2.refgen.json).
-The frontage photo itself triggers the model's image-recitation filter, so the
-hillside block frame anchors the facade; shape follows the frontage photo.
+Generated with `generate --reference`, anchored on a Comedy Store board photo that has since
+been removed from the committed refs (the block now uses the local-only `tmp/research/comedy-store/`
+set); provenance in [`joke_shop_entrance_day-v2.refgen.json`](joke_shop_entrance_day-v2.refgen.json).
## Entrance — day
@@ -29,6 +26,15 @@ hillside block frame anchors the facade; shape follows the frontage photo.

-The older top-level concepts `joke_shop_alley_evening.png` and
-`joke_shop_door_closeup.png` are kept as a record of the pre-map-optimization
-alley design. They no longer describe the current Joke Shop map.
+## Facade — local-reference anchored, two models
+
+
+
+
+
+Both frames are anchored on the same local-only research photo
+(`tmp/research/comedy-store/01.jpg`, gitignored) with `--reference-unchecked`, one with
+`google/gemini-2.5-flash-image` and one with `openai/gpt-5-image-mini`. Provenance and model are
+in each frame's `.refgen.json` sidecar. Local reference only; the photo never enters the repo and
+these frames are art direction, not assets.
+
diff --git a/docs/screens/concepts/joke_shop/comedy_store_facade_gemini_day.png b/docs/screens/concepts/joke_shop/comedy_store_facade_gemini_day.png
new file mode 100644
index 0000000..3bb0046
Binary files /dev/null and b/docs/screens/concepts/joke_shop/comedy_store_facade_gemini_day.png differ
diff --git a/docs/screens/concepts/joke_shop/comedy_store_facade_gemini_day.refgen.json b/docs/screens/concepts/joke_shop/comedy_store_facade_gemini_day.refgen.json
new file mode 100644
index 0000000..0d7226b
--- /dev/null
+++ b/docs/screens/concepts/joke_shop/comedy_store_facade_gemini_day.refgen.json
@@ -0,0 +1,12 @@
+{
+ "concept": "comedy_store_facade_gemini_day",
+ "generated": "comedy_store_facade_gemini_day.png",
+ "model": "google/gemini-2.5-flash-image",
+ "reference": {
+ "file": "tmp/research/comedy-store/01.jpg",
+ "licence": "unchecked",
+ "page": "",
+ "licence_checked": false
+ },
+ "suffix": "Use the attached reference photograph as the fixed source of geometry and composition: keep the building's proportions, column rhythm, band heights, signage placement and camera angle exactly as photographed. Only restage lighting, weather, people and surface condition where the prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
+}
diff --git a/docs/screens/concepts/joke_shop/comedy_store_facade_gpt_day.png b/docs/screens/concepts/joke_shop/comedy_store_facade_gpt_day.png
new file mode 100644
index 0000000..9e973e1
Binary files /dev/null and b/docs/screens/concepts/joke_shop/comedy_store_facade_gpt_day.png differ
diff --git a/docs/screens/concepts/joke_shop/comedy_store_facade_gpt_day.refgen.json b/docs/screens/concepts/joke_shop/comedy_store_facade_gpt_day.refgen.json
new file mode 100644
index 0000000..1660a37
--- /dev/null
+++ b/docs/screens/concepts/joke_shop/comedy_store_facade_gpt_day.refgen.json
@@ -0,0 +1,12 @@
+{
+ "concept": "comedy_store_facade_gpt_day",
+ "generated": "comedy_store_facade_gpt_day.png",
+ "model": "openai/gpt-5-image-mini",
+ "reference": {
+ "file": "tmp/research/comedy-store/01.jpg",
+ "licence": "unchecked",
+ "page": "",
+ "licence_checked": false
+ },
+ "suffix": "Use the attached reference photograph as the fixed source of geometry and composition: keep the building's proportions, column rhythm, band heights, signage placement and camera angle exactly as photographed. Only restage lighting, weather, people and surface condition where the prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
+}
diff --git a/docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.refgen.json b/docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.refgen.json
index d349c45..b94c2c9 100644
--- a/docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.refgen.json
+++ b/docs/screens/concepts/joke_shop/joke_shop_entrance_day-v2.refgen.json
@@ -3,10 +3,11 @@
"generated": "joke_shop_entrance_day-v2.png",
"model": "google/gemini-2.5-flash-image",
"reference": {
- "file": "docs/screens/refs/joke-shop/comedy-store-hillside-canopy-day-pd-2006-12-29.jpg",
+ "file": "tmp/research/comedy-store/01.jpg (local-only; original board photo removed 2026-11-03)",
"licence": "Public domain",
"page": "https://commons.wikimedia.org/wiki/File:ComedyStore_01.jpg",
- "licence_checked": true
+ "licence_checked": true,
+ "removed_from_refs": true
},
"suffix": "Use the attached reference photograph as the fixed source of geometry and composition: keep the building's proportions, column rhythm, band heights, signage placement and camera angle exactly as photographed. Only restage lighting, weather, people and surface condition where the prompt asks for it. Do not invent extra storeys, wings or ornaments that the photo does not show."
}
diff --git a/docs/screens/concepts/joke_shop_alley_evening.png b/docs/screens/concepts/joke_shop_alley_evening.png
deleted file mode 100644
index e34c84b..0000000
Binary files a/docs/screens/concepts/joke_shop_alley_evening.png and /dev/null differ
diff --git a/docs/screens/concepts/joke_shop_door_closeup.png b/docs/screens/concepts/joke_shop_door_closeup.png
deleted file mode 100644
index 7d0cf72..0000000
Binary files a/docs/screens/concepts/joke_shop_door_closeup.png and /dev/null differ
diff --git a/docs/screens/concepts/npc_portrait_day-v2.png b/docs/screens/concepts/npc_portrait_day-v2.png
deleted file mode 100644
index ff17d14..0000000
Binary files a/docs/screens/concepts/npc_portrait_day-v2.png and /dev/null differ
diff --git a/docs/screens/concepts/npc_portrait_day.png b/docs/screens/concepts/npc_portrait_day.png
deleted file mode 100644
index a27e36c..0000000
Binary files a/docs/screens/concepts/npc_portrait_day.png and /dev/null differ
diff --git a/docs/screens/concepts/responder_arrival_wide.png b/docs/screens/concepts/responder_arrival_wide.png
deleted file mode 100644
index f0766b1..0000000
Binary files a/docs/screens/concepts/responder_arrival_wide.png and /dev/null differ
diff --git a/docs/screens/concepts/sidewalk_material_closeup.png b/docs/screens/concepts/sidewalk_material_closeup.png
deleted file mode 100644
index 2eddaa8..0000000
Binary files a/docs/screens/concepts/sidewalk_material_closeup.png and /dev/null differ
diff --git a/docs/screens/concepts/studio_stage_door_night.png b/docs/screens/concepts/studio_stage_door_night.png
deleted file mode 100644
index fccbc72..0000000
Binary files a/docs/screens/concepts/studio_stage_door_night.png and /dev/null differ
diff --git a/docs/screens/refs/README.md b/docs/screens/refs/README.md
index 61c0c34..320b8cd 100644
--- a/docs/screens/refs/README.md
+++ b/docs/screens/refs/README.md
@@ -21,9 +21,6 @@ docs/screens/refs/
README.md # board overview and image gallery
SIDECAR.md # provenance table
*.jpg|png
- joke-shop/ # 8433 Sunset Blvd block
- README.md
- SIDECAR.md
tv-studio/ # studio entrance reference set
README.md
SIDECAR.md
diff --git a/docs/screens/refs/joke-shop/README.md b/docs/screens/refs/joke-shop/README.md
deleted file mode 100644
index 2a0a8e3..0000000
--- a/docs/screens/refs/joke-shop/README.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Joke Shop / Sunset Strip reference board
-
-Licensed photographs of the real Comedy Store block at 8433 Sunset Boulevard, used as evidence for
-the game's second venue: the low black hall, the deep signature canopy, the circular blade sign, the
-red curtain bays and the dry hillside that rises directly behind the roofline.
-
-Development reference only; not shipped with the game. Provenance and licences are in
-[`SIDECAR.md`](SIDECAR.md). Folder rules: [`../README.md`](../README.md). Generated art-direction
-frames: [`../../concepts/joke_shop/`](../../concepts/joke_shop/README.md).
-
-| Photo | What it is evidence for |
-| --- | --- |
-|  | **Block and hillside.** The hall's height against the boulevard, the canopy depth from the street, and the dry slope with houses and palms rising behind the roofline. |
-|  | **Frontage rhythm.** Blade sign height and diameter, the flat black wall, palm placement, kerb setback and where the entrance sits in the run. |
-|  | **Canopy and curtain detail.** Signature density on the fascia, the white band width, the red curtain bays and the warm interior spill at dusk. |
-
-## Gaps to fill
-
-- A night photograph of the canopy, blade sign and red curtain wash (the current night evidence is
- the generated concept frame and the game capture).
-- A closer view of the entrance recess and door hardware.
-- An across-street frame showing the neighbouring frontages on the south side of Sunset.
-- A hillside detail showing the house rooflines above the club.
-
-Add new files with the naming convention in [`../README.md`](../README.md) and list them in the
-sidecar in the same commit.
diff --git a/docs/screens/refs/joke-shop/SIDECAR.md b/docs/screens/refs/joke-shop/SIDECAR.md
deleted file mode 100644
index d7cb45f..0000000
--- a/docs/screens/refs/joke-shop/SIDECAR.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Sidecar — The Comedy Store block, 8433 Sunset Blvd
-
-| Field | Value |
-| --- | --- |
-| Venue / block | The Comedy Store (game: The Joke Shop), Sunset Boulevard, West Hollywood |
-| Folder | `docs/screens/refs/joke-shop/` |
-| Collected by | project (agent session, 2026-11-03) |
-| Date range | 2006–2020 (original captures); downloaded 2026-11-03 |
-| Intended use | venue three-up board, canopy/frontage proportions, hillside silhouette |
-| Shipped? | no — development reference only; not bundled with the game or releases |
-
-## Photographs
-
-| File | Subject | View | Source | Author | Licence | Captured | Purpose | Shipped |
-| --- | --- | --- | --- | --- | --- | --- | --- | --- |
-| `comedy-store-hillside-canopy-day-pd-2006-12-29.jpg` | Comedy Store and the hillside behind it | day, across Sunset | | Gary Minnaert | Public domain | 2006-12-29 | street wall height, canopy depth, hillside houses and palms | no |
-| `comedy-store-frontage-palms-day-pd-2006-12-29.jpg` | Frontage with palms and the wall sign | day, straight on | | Gary Minnaert | Public domain | 2006-12-29 | blade sign size/height, wall length, palm rhythm, entrance position | no |
-| `comedy-store-signature-band-day-wikimedia-2020-04-09.jpg` | Canopy signatures and red curtains | day, three-quarter | | Tony Mariotti (Los Angeles; [rubyhome.com](https://www.rubyhome.com/)) | CC BY 2.0 | 2020-04-09 | signature density, fascia band width, curtain bays, interior spill | no |
-
-Licence text: [CC BY 2.0](https://creativecommons.org/licenses/by/2.0/). The CC BY file is also
-credited in [`../../../CREDITS.md`](../../../CREDITS.md) under "Development-only reference images".
-
-Not used: `File:The Comedy Store.jpg` (CC BY-SA 3.0) from the map document's original link list.
-The two public-domain frames above cover the same evidence, so the share-alike review was not
-needed for this board.
-
-## Redactions and permissions
-
-- No identifiable faces, licence plates or interiors in the committed crops; the plate area of the
- parked car in the first photo is already unreadable at this resolution.
-- Exterior public frontage only. The interior signature wall photo found in the Commons search was
- **not** downloaded or committed.
-
-## What was derived from this set
-
-| Decision | Evidence | Where it landed |
-| --- | --- | --- |
-| 27 m frontage, 8.4 m street wall, 12.2 m OSM height | frontage photo measured against the door width | `docs/joke-shop-map.md`, `WorldBuilder` `comedy_store` spec |
-| 4.9 m sloped canopy with a signature fascia | block and canopy photos | canopy slab geometry and the `Label3D` signature bands |
-| 3.9 m circular blade sign on a roof pole | frontage photo | blade sign mesh and its night emissive |
-| Hillside houses and palms above the roofline | block photo | `SunsetHillside` backdrop geometry |
-| Red curtain bays between entrance and east end | signature-band photo | curtain bays and the entrance curtain |
-
-## Generated boards used with this set
-
-Generated frames are kept in [`../../concepts/joke_shop/`](../../concepts/joke_shop/README.md) and
-are used for palette and night mood only; shape follows the photographs.
-
-| Board | Path | Model | Generated | Spend |
-| --- | --- | --- | --- | --- |
-| Joke Shop entrance, day | `docs/screens/concepts/joke_shop/joke_shop_entrance_day.png` | `openai/gpt-5-image-mini` | 2026-11-02 | ~$0.01 |
-| Joke Shop entrance, night | `docs/screens/concepts/joke_shop/joke_shop_entrance_night.png` | `openai/gpt-5-image-mini` | 2026-11-02 | ~$0.01 |
-| Joke Shop across the street | `docs/screens/concepts/joke_shop/joke_shop_across_street.png` | `openai/gpt-5-image-mini` | 2026-11-02 | ~$0.01 |
-
-## Notes
-
-- Images re-encoded as JPEG q85 with EXIF removed (no GPS or camera metadata committed); the
- untouched downloads stay outside the repository.
-- `File:The Comedy Store West Hollywood (51017780551).jpg` asks for a dofollow attribution link;
- the link is included above and in `CREDITS.md`.
diff --git a/docs/screens/refs/joke-shop/comedy-store-frontage-palms-day-pd-2006-12-29.jpg b/docs/screens/refs/joke-shop/comedy-store-frontage-palms-day-pd-2006-12-29.jpg
deleted file mode 100644
index 844dd2d..0000000
Binary files a/docs/screens/refs/joke-shop/comedy-store-frontage-palms-day-pd-2006-12-29.jpg and /dev/null differ
diff --git a/docs/screens/refs/joke-shop/comedy-store-hillside-canopy-day-pd-2006-12-29.jpg b/docs/screens/refs/joke-shop/comedy-store-hillside-canopy-day-pd-2006-12-29.jpg
deleted file mode 100644
index d22225b..0000000
Binary files a/docs/screens/refs/joke-shop/comedy-store-hillside-canopy-day-pd-2006-12-29.jpg and /dev/null differ
diff --git a/docs/screens/refs/joke-shop/comedy-store-signature-band-day-wikimedia-2020-04-09.jpg b/docs/screens/refs/joke-shop/comedy-store-signature-band-day-wikimedia-2020-04-09.jpg
deleted file mode 100644
index e0e7a33..0000000
Binary files a/docs/screens/refs/joke-shop/comedy-store-signature-band-day-wikimedia-2020-04-09.jpg and /dev/null differ
diff --git a/tools/scene_concepts.py b/tools/scene_concepts.py
index ba9f58c..1a6f1c9 100644
--- a/tools/scene_concepts.py
+++ b/tools/scene_concepts.py
@@ -87,31 +87,6 @@ TEXTURE_STYLE = (
# name -> (group, prompt). Scene names describe venue + time of day.
CATALOGUE = {
# -- Example 3D game scenes (art direction) ------------------------------
- "hollywood_entrance_morning": ("scene", (
- "Hollywood Boulevard brick building entrance in early morning sun, short "
- "concrete steps up to a dark glazed double door under a bulb-lit marquee, "
- "black bollards, a green litter bin, potted shrubs, palm trees and hazy "
- "mid-rise buildings down the boulevard")),
- "hollywood_entrance_golden_hour": ("scene", (
- "the same Hollywood brick venue entrance at golden hour, long warm shadows "
- "across worn concrete sidewalk pavers, marquee bulbs starting to glow, a few "
- "pedestrians, palm silhouettes against an orange sky")),
- "hollywood_entrance_rain_night": ("scene", (
- "Hollywood brick venue entrance late at night in light rain, wet asphalt "
- "reflecting the marquee and sodium street lamps, puddles on the sidewalk, "
- "lit windows in the distant skyline, a lone security guard post by the door")),
- "boulevard_skyline_day": ("scene", (
- "view from a Hollywood Boulevard sidewalk across a four-lane street toward a "
- "layered Los Angeles skyline of mid-rise and high-rise buildings, palm trees "
- "lining the street, the Hollywood hills hazy on the horizon, clear blue sky")),
- "boulevard_skyline_dusk": ("scene", (
- "Hollywood Boulevard at dusk looking down the street, street lamps switching "
- "on, purple and orange sky, distant skyline windows lighting up, car light "
- "trails, palm trees in silhouette")),
- "joke_shop_alley_evening": ("scene", (
- "a narrow brick side street outside a small comedy club in the evening, a red "
- "scalloped awning over a wooden door, a warm wall lantern, a chalkboard "
- "A-frame sign on the sidewalk, a short queue of people in jackets")),
"joke_shop_entrance_day": ("scene", (
"the Comedy Store comedy club on the Sunset Strip in West Hollywood, a low "
"black building with a deep sloped black canopy covered in white celebrity "
@@ -131,34 +106,6 @@ CATALOGUE = {
"circular THE JOKE SHOP sign and signature-covered canopy, red curtains and "
"warm entrance, palm trees, traffic and billboards on the Sunset Strip, dry "
"hillside houses rising behind the club, late afternoon haze")),
- "joke_shop_door_closeup": ("scene", (
- "close view of a comedy club door: aged dark-red brick with mortar detail, a "
- "brass door handle, a glowing wall lantern, a chalkboard sign, evening light")),
- "studio_stage_door_night": ("scene", (
- "a TV studio stage door at night: granite facade, a large bulb-lit marquee "
- "canopy, a black sedan at the curb, chrome stanchions with a red velvet rope, "
- "fans with phones behind a steel crowd barrier")),
- "sidewalk_material_closeup": ("scene", (
- "low camera close-up along a city sidewalk: weathered concrete pavers with "
- "expansion joints and stains, a granite curb, asphalt with aggregate and lane "
- "paint, a cast-iron tree grate, morning sun")),
- "entrance_steps_podium": ("scene", (
- "a security check-in podium at the foot of three granite entrance steps with "
- "black metal handrails, glass double doors with a card reader, a bulb marquee "
- "above, daylight")),
- "crowd_barrier_line": ("scene", (
- "a row of steel bike-rack crowd barriers along a Hollywood sidewalk before a "
- "premiere, people waiting behind them, a red carpet, palm trees and a hazy "
- "skyline, late afternoon")),
- "npc_portrait_day": ("scene", (
- "eye-level close portrait of an ordinary adult pedestrian standing on a "
- "sunlit Hollywood sidewalk, upper body and face filling the frame, plain "
- "casual jacket, natural skin detail, shallow depth of field, blurred brick "
- "facade and palm trees behind")),
- "responder_arrival_wide": ("scene", (
- "wide shot of a fire engine and firefighters in dark turnout gear arriving at "
- "a brick venue entrance at night, red and blue light reflections on wet "
- "pavement, onlookers kept back by a guard")),
# -- Real-world Hollywood block (map optimization) ----------------------
"hollywood_boulevard_entrance_day": ("scene", (
"photorealistic eye-level view of the El Capitan Entertainment Centre at "
@@ -241,9 +188,7 @@ PICKS = {
# Realism trial: capture shot -> concept it is judged against.
SHOTS = {
"entrance_day": "hollywood_boulevard_entrance_day",
- "boulevard_day": "boulevard_skyline_day",
"street_day": "hollywood_boulevard_across_street",
- "boulevard_night": "hollywood_entrance_rain_night",
"street_night": "hollywood_boulevard_entrance_night",
"entrance_late": "hollywood_boulevard_entrance_night",
"street_late": "hollywood_boulevard_across_street",
@@ -251,10 +196,6 @@ SHOTS = {
# the Hollywood layout.
"joke_shop_door": "joke_shop_entrance_night",
"12-joke-shop": "joke_shop_entrance_night",
- "studio_door": "studio_stage_door_night",
- "studio_stage_door_night": "studio_stage_door_night",
- "13-studio-arrival": "studio_stage_door_night",
- "npc_portrait": "npc_portrait_day",
}
diff --git a/tools/test_scene_concepts.py b/tools/test_scene_concepts.py
index b82b4aa..3c66ef0 100644
--- a/tools/test_scene_concepts.py
+++ b/tools/test_scene_concepts.py
@@ -25,7 +25,7 @@ class CatalogueTests(unittest.TestCase):
self.assertEqual(sc.CATALOGUE[concept][0], "scene", shot)
def test_paths_stay_in_their_folders(self):
- self.assertTrue(sc.raw_path("boulevard_skyline_day").is_relative_to(sc.CONCEPT_DIR))
+ self.assertTrue(sc.raw_path("hollywood_boulevard_entrance_day").is_relative_to(sc.CONCEPT_DIR))
self.assertTrue(sc.raw_path("hollywood_boulevard_entrance_day").is_relative_to(
sc.CONCEPT_DIR / "hollywood_boulevard"))
self.assertTrue(sc.raw_path("joke_shop_entrance_day").is_relative_to(