Merge local map tasks into the 3D review track
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-03 18:41:21 +01:00
1 parent b79e30e9df
commit 8fac1b47cf
9 files changed
+213 -215

No files matched your search

+2 -2
View File
@@ -28,8 +28,8 @@ The project should be developed in small, reviewable steps. Agents must keep pla
`TODO.md` is the priority source. The active order is: `TODO.md` is the priority source. The active order is:
1. unversioned development tracks (currently 3D model re-evaluation, character development and 1. unversioned development tracks (currently 3D model and local map re-evaluation, and
local map development); character development);
2. versioned release milestones, in version order; 2. versioned release milestones, in version order;
3. future/unversioned candidates and deferred work. 3. future/unversioned candidates and deferred work.
+8 -7
View File
@@ -17,7 +17,7 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
`openai/gpt-5-image-mini` frame (`.refgen.json` records `unchecked`). Gotcha: DDG photo 07.jpg `openai/gpt-5-image-mini` frame (`.refgen.json` records `unchecked`). Gotcha: DDG photo 07.jpg
was titled "Ramada hotel" but is actually an interior stage shot — Gemini refused it with a was titled "Ramada hotel" but is actually an interior stage shot — Gemini refused it with a
text-only message; the hotel/parking ramp reference is still missing from the local set. The text-only message; the hotel/parking ramp reference is still missing from the local set. The
map-recreation plan is tracked in `TODO.md` §Local map development → Comedy Store map recreation. map-recreation plan is tracked in `TODO.md` §3D model re-evaluation → K. Comedy Store map recreation.
- **Jimmy Kimmel Live = starting point (2026-11-03):** the building is the game's starting - **Jimmy Kimmel Live = starting point (2026-11-03):** the building is the game's starting
point: the Hollywood first shift and the late-night TV Studio arrival both begin at the El point: the Hollywood first shift and the late-night TV Studio arrival both begin at the El
Capitan Entertainment Centre housing the Kimmel stage/studio. Four photo-anchored entrance Capitan Entertainment Centre housing the Kimmel stage/studio. Four photo-anchored entrance
@@ -115,12 +115,13 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
`.agents/skills` behind project trust, so the trust prompt must be accepted before the `.agents/skills` behind project trust, so the trust prompt must be accepted before the
skills load. skills load.
- **Priority order (2026-11-03):** `TODO.md` now leads with the unversioned **Character - **Priority order (2026-11-03):** `TODO.md` now leads with the unversioned **3D model and
development** and **Local map development** tracks, then the versioned 0.10.0 release local map re-evaluation** track, then **Character development**, then the versioned 0.10.0
candidate and later releases. Do not attach a placeholder version to an unversioned track; release candidate and later releases. Local map workstreams are H–M inside the same 3D
assign one only when its scope enters a release. Character development is generator-first track. Do not attach a placeholder
(ADR-0015); local map development evaluates OSM/3D data, licensed reference imagery, version to an unversioned track; assign one only when its scope enters a release. Character
AI-assisted composition and development-only Gaussian splatting. development is generator-first (ADR-0015); the map work evaluates OSM/3D data, licensed
reference imagery, AI-assisted composition and development-only Gaussian splatting.
- **Commit/build discipline (2026-11-03):** commit each coherent verified change as it lands, not - **Commit/build discipline (2026-11-03):** commit each coherent verified change as it lands, not
only at milestone end, and push shareable commits. Every major, minor and patch version requires only at milestone end, and push shareable commits. Every major, minor and patch version requires
a `CHANGELOG.md` entry, a local `tools/build_releases.sh` build and artifact/checksum a `CHANGELOG.md` entry, a local `tools/build_releases.sh` build and artifact/checksum
+2 -2
View File
@@ -10,8 +10,8 @@ The central design goal is simple:
The active planning order lives in [`TODO.md`](TODO.md) and [`AGENTS.md`](AGENTS.md): The active planning order lives in [`TODO.md`](TODO.md) and [`AGENTS.md`](AGENTS.md):
1. **Character development** — crowd, age, build, hair and outfit variety on the owned procedural library, keeping the frozen NPC contract. Source evaluation and the licence decision are in [`docs/npc-model-sourcing.md`](docs/npc-model-sourcing.md). 1. **3D model and local map re-evaluation** — score every shipped asset, then evaluate licensed OpenStreetMap/3D data, reference-derived photoreal facades, AI-assisted composition and a Gaussian-splatting development evaluation.
2. **Local map development** — licensed OpenStreetMap/3D data, reference-derived photoreal facades, AI-assisted composition and a Gaussian-splatting development evaluation. 2. **Character development** — crowd, age, build, hair and outfit variety on the owned procedural library, keeping the frozen NPC contract. Source evaluation and the licence decision are in [`docs/npc-model-sourcing.md`](docs/npc-model-sourcing.md).
3. **Versioned release hardening** — the 0.10.0 release candidate and later semantic versions follow the unversioned development tracks. 3. **Versioned release hardening** — the 0.10.0 release candidate and later semantic versions follow the unversioned development tracks.
Versions are assigned only when a track's scope is accepted into a release. Every major, minor and patch version requires a changelog entry, a local release build and artifact verification before tagging. Versions are assigned only when a track's scope is accepted into a release. Every major, minor and patch version requires a changelog entry, a local release build and artifact verification before tagging.
+191 -194
View File
@@ -3,7 +3,7 @@
Work is grouped by theme. Each item should be small enough to complete and verify on its own; Work is grouped by theme. Each item should be small enough to complete and verify on its own;
see `AGENTS.md` for the workflow and `MEMORY.md` for the decisions behind these plans. see `AGENTS.md` for the workflow and `MEMORY.md` for the decisions behind these plans.
**Priority order:** 3D model re-evaluation → character development → local map development → **Priority order:** 3D model and local map re-evaluation → character development →
versioned release milestones (0.10.0) → future/deferred work. See `AGENTS.md` §Priority and versioned release milestones (0.10.0) → future/deferred work. See `AGENTS.md` §Priority and
Versioning and §Local Blender skills. Versioning and §Local Blender skills.
@@ -212,9 +212,6 @@ and never ship a generated or downloaded image without provenance.
used; the public-domain frames cover the same evidence. (`docs/screens/refs/joke-shop/`.) 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 **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). `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.
- [x] TV Studio: no separate board — the venue is the same El Capitan Entertainment Centre block as - [x] TV Studio: no separate board — the venue is the same El Capitan Entertainment Centre block as
the Hollywood day shift, restaged for a late-night arrival. The Hollywood board covers both the Hollywood day shift, restaged for a late-night arrival. The Hollywood board covers both
venues and the premiere-staging photo is the arrival evidence; the reuse is now stated in venues and the premiere-staging photo is the arrival evidence; the reuse is now stated in
@@ -224,11 +221,6 @@ and never ship a generated or downloaded image without provenance.
Walk of Fame terrazzo band, star close-up, and a night street-lighting context frame (cropped Walk of Fame terrazzo band, star close-up, and a night street-lighting context frame (cropped
to remove people and a plate). The board now has nine photos. (CC BY-SA night frame is to remove people and a plate). The board now has nine photos. (CC BY-SA night frame is
redistributed unmodified for study only; the review is recorded in the sidecar.) redistributed unmodified for study only; the review is recorded in the sidecar.)
- [ ] Remaining Hollywood gap: a licensed **night photograph of the hero facade and blade sign**
(the night frame on the board is a different block, near Vine), plus a sidewalk-level shot of
the steps/door recess and the east retail neighbour. For the committed board the licence gate
stays (no unlicensed Street View or scraped social media); local-only copies of the same
viewpoints go through section A instead.
- [ ] Generate one concept board per venue with `tools/scene_concepts.py generate` (palette, facade - [ ] Generate one concept board per venue with `tools/scene_concepts.py generate` (palette, facade
rhythm, lighting), keep raw output gitignored, commit only the selected board, and record the rhythm, lighting), keep raw output gitignored, commit only the selected board, and record the
model, prompt and spend in the sidecar. model, prompt and spend in the sidecar.
@@ -267,6 +259,193 @@ and never ship a generated or downloaded image without provenance.
`docs/architecture.md` and `AGENTS.md` with the skill routes and the new gates. `docs/architecture.md` and `AGENTS.md` with the skill routes and the new gates.
- [ ] Record accepted limits and deferred rebuilds in `docs/known-limitations.md` and `MEMORY.md`. - [ ] Record accepted limits and deferred rebuilds in `docs/known-limitations.md` and `MEMORY.md`.
**Local map workstreams (H–M).** Build a local, data-backed map pipeline that can replace or
supplement the stylized venue geometry with licensed OpenStreetMap footprints, 3D building
massing, reference-derived photoreal facades and AI-assisted composition. This remains part of
the same unversioned track, not a release gate. The shared reference/provenance gates in A/F
still apply; the map pipeline has its own exit in M.
*Local-map skill route: `environment-artist`, `archviz`, `hard-surface`, `geometry-nodes`,
`procedural-modeling`, `vegetation-artist`, `set-dressing`, `lighting`, `materials`,
`texture-workflow`, `lookdev`, `scene-assembly`, `qa-review`.*
### H. Local map data, licensing and scope
- [ ] Define the first target block and whether the result replaces, supplements or only informs
the current stylized venue specs (`docs/hollywood-boulevard-map.md`,
`docs/joke-shop-map.md`).
- [ ] Audit OpenStreetMap's ODbL attribution/share-alike obligations and decide whether derived
geometry ships, stays development-only, or needs a separate data layer.
- [ ] Choose an offline OSM extract workflow (Overpass/Geofabrik) and pin the extract date and
query so the map build is reproducible.
- [ ] Evaluate licence-compatible 3D building datasets (OSM Buildings, Overture, CityGML/LOD1–2
or local authority data); record coverage, accuracy, format and redistribution terms.
- [ ] Add a provenance sidecar for every map source and derived asset, including source URL,
licence, capture/extract date and attribution text.
### I. Local map reference imagery
**Recent-photo research (2026-11-03):** Commons geosearch around 34.10118/-118.34009 (500 m) plus
category/date sorting shows usable imagery from the last 12 months: Dolby Theatre billboards
(2026-09-30, CC0, 6 frames), Dolby street level and a fresh Walk of Fame star (2026-07-17, CC0),
a Michael Jackson impersonator at the El Capitan frontage (2026-02-25, CC BY-SA 4.0), the Celia
Cruz Square marker and a 2025-09-28 star series (CC0), and a Thunderbolts premiere (2025-04-28,
CC BY-SA 2.0). No recent frame shoots the El Capitan facade straight-on in daylight; the best
facade evidence is still the 2009 CC BY frame. The 8 downloaded candidates are in
`tmp/research/elcapitan-2026/` (gitignored) with `meta.json`; nothing was committed.
- [x] Wire `tools/refboard.py` (standalone, stdlib-only): `search --source search|geo|category`
lists candidates with ISO date, age-in-months and a commit/review/skip licence gate
(`--allow-ccbysa` after a recorded review); `fetch` downloads usable rows into `tmp/` with
spaced requests and writes `meta.json`; `rows` emits SIDECAR + README table rows from the
manifest. Six recent CC0 photos of the block were re-fetched into
`tmp/research/elcapitan-2026-tool/`. Tests in `tools/test_refboard.py` (licence gate, recent
filter, review-row exclusion, row emission).
- [ ] Add a `--max-age-months` filter (default 12) and a `--must-reuse` mode that matches the
folder's existing sidecar entries so a refresh only reports what changed.
- [ ] Research-diff step: keep the last-12-months board as the "current reality" evidence and the
older photos as the geometry evidence, labelled per photo; no sidecar date field needs to
change, only the purpose column.
- [ ] Write a reference shot list per block: facade materials, windows, signage, rooflines,
street furniture, curb cuts and lighting.
- [ ] Download and catalogue **committed** reference images from Wikimedia Commons, local/own
photography or other clearly licensed sources; record author, licence and attribution with
the §F sidecar template. Local-only research that ignores licence limits (DuckDuckGo,
street-view frames, neighbours, across-street buildings) is collected under §A into
`tmp/research/` and is never committed.
- [ ] Separate development-only references from shipped textures; commit only images with clear
redistribution rights and keep the rest under `tmp/` or the ignored reference folders.
- [ ] Build the per-block real-photo board under `docs/screens/refs/<block>/` using the sidecar
template from the 3D review §E, and link it from the venue map documents.
- [ ] Define the photoreal target and a material-derivation workflow (albedo/normal/roughness,
AO, weathering) that matches the existing Compatibility renderer (`texture-workflow`,
`materials`, `lookdev`), with the recent 2026 street frames as the current-reality reference
and the 2009 facade frame as the geometry reference.
- [ ] Remaining Hollywood gap: a licensed **night photograph of the hero facade and blade sign**
(the night frame on the board is a different block, near Vine), plus a sidewalk-level shot of
the steps/door recess and the east retail neighbour. For the committed board the licence gate
stays (no unlicensed Street View or scraped social media); local-only copies of the same
viewpoints go through section A instead.
### J. Local map geometry and AI-assisted composing
- [ ] Prototype OSM footprint import into Blender at game scale and orientation, then compare it
against the current venue footprint/collider layout.
- [ ] Import 3D building massing for the target block, clean the topology and assign LOD bands;
do not import unbounded city-scale meshes into the runtime (`scene-assembly`,
`asset-optimization`, `lod-pipeline`).
- [ ] Build a reusable photoreal facade kit (window bays, cornices, storefronts, awnings, signage)
with `environment-artist`/`hard-surface`/`geometry-nodes` so buildings share materials and
stay inside the venue triangle/material budgets.
- [ ] Run the assisted Blender pipeline end to end on the first block (OSM import → `inspect` →
retopo/UV assist → atlas → `audit`), and document the exact commands in
`docs/asset-tooling.md`.
- [x] Joke Shop building-appearance pass: `dark_stucco` tile (1024 px) promoted via the picks
pipeline and wired into `_build_comedy_store_building`, replacing the grey paver tile so the
hall reads as flat matte charcoal instead of masonry; photo-anchored day concept generated
from the hillside PD frame (the branded frontage photo trips the model's image-recitation
filter — recorded in the concept README); day capture promoted and the three-up board rebuilt.
Test asserts the hall wall carries `dark_stucco`.
- [x] Building-appearance realism pass, measured against the reference set: bring the masonic
facade's material response (limestone value/roughness, joint lines, weathering streaks),
the banner/canopy and marquee materials, and the night emissive balance to the level of the
2009 facade photo and the 2026 street frames; capture before/after and record each delta.
(Ashlar field: `limestone_ashlar` tile, reference-anchored on the facade photo, 768 px over
~4.6 m of wall = ~167 px/m, promoted via the picks pipeline, warm-shifted tint behind
`VENUE_SPECS`. Banner cloth: warm self-light registered with `_marquee_emissive` (0.14 base;
0.28 night / 0.028 day). Marquee sign face + bulbs: warm-incandescent already in the prop
PALETTE, now test-verified to brighten at night via `_marquee_emissive`. Day and night
captures promoted, both three-up boards rebuilt.)
- [ ] Upgrade the facade from flat material bands to photoreal detail: either texture-projected
detail (Path B below) or AI-generated material tiles derived from the facade photo (with
provenance), then verify texel density, tiling and the night look.
- [ ] Integrate the result behind `WorldBuilder.VENUE_SPECS` with colliders, navigation obstacles,
occlusion and the existing day/night materials.
### K. Comedy Store map recreation
*Plan (2026-11-03): rebuild the Joke Shop venue geometry from the new local-only reference set
(`tmp/research/comedy-store/`, gitignored) and the four photo-anchored scene pairs now in
`docs/screens/concepts/joke_shop/`. Evidence wins for shape; the concepts win for material/mood.
Nothing is committed until the licence gate on any promoted reference and the map-budget tests
pass. The current `_build_comedy_store_building()` stays as the fallback.*
- [ ] Extract the real proportions from the local frames (facade width/height, canopy depth and
slope, blade-sign diameter and pole height, red curtain bay count, entrance recess, kerb
setback, hillside rise) and reconcile them against the current 27 m / 8.4 m / 12.2 m spec
in `WorldBuilder.VENUE_SPECS["joke_shop"]` and `docs/joke-shop-map.md`.
- [ ] Rank the shape-language gaps between the current procedural building and the four scene
pairs: canopy fascia depth, blade-sign shape/position, curtain-bay rhythm, entrance recess,
hillside silhouette and the neighbouring hotel/parking mass. Write the top-five fix list
with measurements.
- [ ] Rebuild the canopy + blade sign as library props or procedural geometry through the assisted
pipeline (`blender_assets.py inspect` → scripted edits → `audit`/`fit`), keeping the 4,000
prop-triangle budget; verify against the street/strip concept pairs before committing.
- [ ] Add the neighbouring hotel/parking ramp as a low-detail blocker mass (no interior) so the
block silhouette matches the hotel reference frame, inside the venue mesh budget.
- [ ] Re-work the facade field from flat boxes to the reference's actual banding: black stucco
field (`dark_stucco`), deep canopy shadow, fascia band, red curtain bays and the recessed
entrance, using the four concept pairs for value/mood targets.
- [ ] Re-run the map-budget, navigation, collider and day/night capture gates after the rebuild
(`godot --headless --path . --script res://src/test/test_runner.gd`,
`tools/check_screenshots.sh`), and refresh the Joke Shop three-up board and
`docs/joke-shop-map.md`.
- [ ] Update `docs/development-status.md`, `docs/asset-tooling.md` and `CHANGELOG.md` when the
rebuild lands; record any accepted deviations from the reference.
### L. Generated location imagery
*Skill route: `lookdev`, `lighting`, `environment-artist`, `texture-workflow`; tooling:
`tools/scene_concepts.py`, `tools/asset_pipeline.py`, `tools/screen_designs.py`.*
**Tool plan for reference-anchored generation (plan first, implement after this section's review):**
- [x] Add `scene_concepts.py generate --reference <photo.png>`: attach a licence-cleared real photo
as a source image to the OpenRouter image request (multimodal chat endpoint with a base64
data URL), with a prompt suffix that preserves the photographed facade geometry. Record the
reference file, its licence and page in the `.refgen.json` provenance sidecar next to the
generated frame.
- [x] Extend `generate_textures.generate_image()` with an optional `reference_path` argument
(base64 data URL of the photo); existing call signatures unchanged, and the path is gated by
`scene_concepts._reference_source` requiring a refs-board `SIDECAR.md` row (or an explicit
`--reference-unchecked`). Verified live on the El Capitan day concept anchored on the CC BY
2.0 2009 facade photo; tests in `ReferenceGateTests`.
- [x] Add a sidecar-driven variant pass: `scene_concepts.py anchor --reference <photo>
--treatments day,night,weathered` generates same-framing variants with treatment clauses,
one `.refgen.json` provenance sidecar per frame. Verified live on the facade photo (night +
overcast frames committed; the weathered treatment reads as mild overcast — noted on the
board). Tests in `AnchorTests`.
- [-] Generate facade, street and signage concept frames for the target block
(`scene_concepts.py generate --reference ...`), commit only the selected frames, and record
model, prompt, spend **and source photo** in the block sidecar. (First frame done:
`hollywood_boulevard_entrance_day-v2`, anchored on the facade photo; remaining framings
pending.)
- [ ] Derive palette, lighting and material targets from the real-photo board and the generated
concepts, and record the deltas the facade kit has to close.
- [ ] Generate signage, awning and poster texture candidates with `asset_pipeline.py`; run the
role audit and the `CREDITS.md` provenance check before anything is used in the kit.
- [ ] Compare generated concepts against the licensed photos: where they disagree, the photos win
for shape and the generated board only informs colour, mood and detail density. Human review
stays the acceptance gate, and AI output is never treated as licensed map data.
### M. Local map QA and exit
- [ ] Compare the data-backed block against the existing screenshots and map documentation; keep
the stylized fallback available.
- [ ] Run the venue triangle/mesh budget, navigation and collider checks, plus day/night capture
comparisons.
- [ ] Capture day/night gallery frames of the new block and add before/after rows to `README.md`
and the venue map documents.
- [ ] Re-run `tools/check_screenshots.sh` after the map swap so the 21-shot gallery reflects the
new geometry, and refresh the `docs/screens/refs/` three-up sheets.
- [ ] Update `docs/architecture.md`, the venue map documents, `docs/asset-tooling.md`,
`docs/development-status.md` and `CHANGELOG.md` when the pipeline ships or a source is
rejected.
- [ ] Exit: one local block is reconstructed from licensed data with reference-derived photoreal
facades, passes performance/navigation/visual QA and has complete provenance; or the
pipeline is rejected with the findings recorded.
## Character development ## Character development
Goal: break the eight-character clone effect with four licence-cleared crowd-variety looks while Goal: break the eight-character clone effect with four licence-cleared crowd-variety looks while
@@ -374,187 +553,6 @@ must inherit the reviewed face/hand/gear baseline instead of multiplying whateve
yes, prototype the local MPFB/MakeHuman pipeline outside the repo and commit only the final yes, prototype the local MPFB/MakeHuman pipeline outside the repo and commit only the final
CC0-derived assets with provenance. CC0-derived assets with provenance.
## Local map development
Goal: build a local, data-backed map pipeline that can replace or supplement the stylized venue
geometry with licensed OpenStreetMap footprints, 3D building massing, reference-derived photoreal
facades and AI-assisted composition. This is an unversioned development track, not a release gate.
*Skill route: `environment-artist`, `archviz`, `hard-surface`, `geometry-nodes`,
`procedural-modeling`, `vegetation-artist`, `set-dressing`, `lighting`, `materials`,
`texture-workflow`, `lookdev`, `scene-assembly`, `qa-review`.*
### Data, licensing and scope
- [ ] Define the first target block and whether the result replaces, supplements or only informs
the current stylized venue specs (`docs/hollywood-boulevard-map.md`,
`docs/joke-shop-map.md`).
- [ ] Audit OpenStreetMap's ODbL attribution/share-alike obligations and decide whether derived
geometry ships, stays development-only, or needs a separate data layer.
- [ ] Choose an offline OSM extract workflow (Overpass/Geofabrik) and pin the extract date and
query so the map build is reproducible.
- [ ] Evaluate licence-compatible 3D building datasets (OSM Buildings, Overture, CityGML/LOD1–2
or local authority data); record coverage, accuracy, format and redistribution terms.
- [ ] Add a provenance sidecar for every map source and derived asset, including source URL,
licence, capture/extract date and attribution text.
### Reference imagery
**Recent-photo research (2026-11-03):** Commons geosearch around 34.10118/-118.34009 (500 m) plus
category/date sorting shows usable imagery from the last 12 months: Dolby Theatre billboards
(2026-09-30, CC0, 6 frames), Dolby street level and a fresh Walk of Fame star (2026-07-17, CC0),
a Michael Jackson impersonator at the El Capitan frontage (2026-02-25, CC BY-SA 4.0), the Celia
Cruz Square marker and a 2025-09-28 star series (CC0), and a Thunderbolts premiere (2025-04-28,
CC BY-SA 2.0). No recent frame shoots the El Capitan facade straight-on in daylight; the best
facade evidence is still the 2009 CC BY frame. The 8 downloaded candidates are in
`tmp/research/elcapitan-2026/` (gitignored) with `meta.json`; nothing was committed.
- [x] Wire `tools/refboard.py` (standalone, stdlib-only): `search --source search|geo|category`
lists candidates with ISO date, age-in-months and a commit/review/skip licence gate
(`--allow-ccbysa` after a recorded review); `fetch` downloads usable rows into `tmp/` with
spaced requests and writes `meta.json`; `rows` emits SIDECAR + README table rows from the
manifest. Six recent CC0 photos of the block were re-fetched into
`tmp/research/elcapitan-2026-tool/`. Tests in `tools/test_refboard.py` (licence gate, recent
filter, review-row exclusion, row emission).
- [ ] Add a `--max-age-months` filter (default 12) and a `--must-reuse` mode that matches the
folder's existing sidecar entries so a refresh only reports what changed.
- [ ] Research-diff step: keep the last-12-months board as the "current reality" evidence and the
older photos as the geometry evidence, labelled per photo; no sidecar date field needs to
change, only the purpose column.
- [ ] Write a reference shot list per block: facade materials, windows, signage, rooflines,
street furniture, curb cuts and lighting.
- [ ] Download and catalogue **committed** reference images from Wikimedia Commons, local/own
photography or other clearly licensed sources; record author, licence and attribution with
the §F sidecar template. Local-only research that ignores licence limits (DuckDuckGo,
street-view frames, neighbours, across-street buildings) is collected under §A into
`tmp/research/` and is never committed.
- [ ] Separate development-only references from shipped textures; commit only images with clear
redistribution rights and keep the rest under `tmp/` or the ignored reference folders.
- [ ] Build the per-block real-photo board under `docs/screens/refs/<block>/` using the sidecar
template from the 3D review §E, and link it from the venue map documents.
- [ ] Define the photoreal target and a material-derivation workflow (albedo/normal/roughness,
AO, weathering) that matches the existing Compatibility renderer (`texture-workflow`,
`materials`, `lookdev`), with the recent 2026 street frames as the current-reality reference
and the 2009 facade frame as the geometry reference.
### Geometry and AI-assisted composing
- [ ] Prototype OSM footprint import into Blender at game scale and orientation, then compare it
against the current venue footprint/collider layout.
- [ ] Import 3D building massing for the target block, clean the topology and assign LOD bands;
do not import unbounded city-scale meshes into the runtime (`scene-assembly`,
`asset-optimization`, `lod-pipeline`).
- [ ] Build a reusable photoreal facade kit (window bays, cornices, storefronts, awnings, signage)
with `environment-artist`/`hard-surface`/`geometry-nodes` so buildings share materials and
stay inside the venue triangle/material budgets.
- [ ] Run the assisted Blender pipeline end to end on the first block (OSM import → `inspect` →
retopo/UV assist → atlas → `audit`), and document the exact commands in
`docs/asset-tooling.md`.
- [x] Joke Shop building-appearance pass: `dark_stucco` tile (1024 px) promoted via the picks
pipeline and wired into `_build_comedy_store_building`, replacing the grey paver tile so the
hall reads as flat matte charcoal instead of masonry; photo-anchored day concept generated
from the hillside PD frame (the branded frontage photo trips the model's image-recitation
filter — recorded in the concept README); day capture promoted and the three-up board rebuilt.
Test asserts the hall wall carries `dark_stucco`.
- [x] Building-appearance realism pass, measured against the reference set: bring the masonic
facade's material response (limestone value/roughness, joint lines, weathering streaks),
the banner/canopy and marquee materials, and the night emissive balance to the level of the
2009 facade photo and the 2026 street frames; capture before/after and record each delta.
(Ashlar field: `limestone_ashlar` tile, reference-anchored on the facade photo, 768 px over
~4.6 m of wall = ~167 px/m, promoted via the picks pipeline, warm-shifted tint behind
`VENUE_SPECS`. Banner cloth: warm self-light registered with `_marquee_emissive` (0.14 base;
0.28 night / 0.028 day). Marquee sign face + bulbs: warm-incandescent already in the prop
PALETTE, now test-verified to brighten at night via `_marquee_emissive`. Day and night
captures promoted, both three-up boards rebuilt.)
- [ ] Upgrade the facade from flat material bands to photoreal detail: either texture-projected
detail (Path B below) or AI-generated material tiles derived from the facade photo (with
provenance), then verify texel density, tiling and the night look.
- [ ] Integrate the result behind `WorldBuilder.VENUE_SPECS` with colliders, navigation obstacles,
occlusion and the existing day/night materials.
### Comedy Store map recreation
*Plan (2026-11-03): rebuild the Joke Shop venue geometry from the new local-only reference set
(`tmp/research/comedy-store/`, gitignored) and the four photo-anchored scene pairs now in
`docs/screens/concepts/joke_shop/`. Evidence wins for shape; the concepts win for material/mood.
Nothing is committed until the licence gate on any promoted reference and the map-budget tests
pass. The current `_build_comedy_store_building()` stays as the fallback.*
- [ ] Extract the real proportions from the local frames (facade width/height, canopy depth and
slope, blade-sign diameter and pole height, red curtain bay count, entrance recess, kerb
setback, hillside rise) and reconcile them against the current 27 m / 8.4 m / 12.2 m spec
in `WorldBuilder.VENUE_SPECS["joke_shop"]` and `docs/joke-shop-map.md`.
- [ ] Rank the shape-language gaps between the current procedural building and the four scene
pairs: canopy fascia depth, blade-sign shape/position, curtain-bay rhythm, entrance recess,
hillside silhouette and the neighbouring hotel/parking mass. Write the top-five fix list
with measurements.
- [ ] Rebuild the canopy + blade sign as library props or procedural geometry through the assisted
pipeline (`blender_assets.py inspect` → scripted edits → `audit`/`fit`), keeping the 4,000
prop-triangle budget; verify against the street/strip concept pairs before committing.
- [ ] Add the neighbouring hotel/parking ramp as a low-detail blocker mass (no interior) so the
block silhouette matches the hotel reference frame, inside the venue mesh budget.
- [ ] Re-work the facade field from flat boxes to the reference's actual banding: black stucco
field (`dark_stucco`), deep canopy shadow, fascia band, red curtain bays and the recessed
entrance, using the four concept pairs for value/mood targets.
- [ ] Re-run the map-budget, navigation, collider and day/night capture gates after the rebuild
(`godot --headless --path . --script res://src/test/test_runner.gd`,
`tools/check_screenshots.sh`), and refresh the Joke Shop three-up board and
`docs/joke-shop-map.md`.
- [ ] Update `docs/development-status.md`, `docs/asset-tooling.md` and `CHANGELOG.md` when the
rebuild lands; record any accepted deviations from the reference.
### Generated location imagery
*Skill route: `lookdev`, `lighting`, `environment-artist`, `texture-workflow`; tooling:
`tools/scene_concepts.py`, `tools/asset_pipeline.py`, `tools/screen_designs.py`.*
**Tool plan for reference-anchored generation (plan first, implement after this section's review):**
- [x] Add `scene_concepts.py generate --reference <photo.png>`: attach a licence-cleared real photo
as a source image to the OpenRouter image request (multimodal chat endpoint with a base64
data URL), with a prompt suffix that preserves the photographed facade geometry. Record the
reference file, its licence and page in the `.refgen.json` provenance sidecar next to the
generated frame.
- [x] Extend `generate_textures.generate_image()` with an optional `reference_path` argument
(base64 data URL of the photo); existing call signatures unchanged, and the path is gated by
`scene_concepts._reference_source` requiring a refs-board `SIDECAR.md` row (or an explicit
`--reference-unchecked`). Verified live on the El Capitan day concept anchored on the CC BY
2.0 2009 facade photo; tests in `ReferenceGateTests`.
- [x] Add a sidecar-driven variant pass: `scene_concepts.py anchor --reference <photo>
--treatments day,night,weathered` generates same-framing variants with treatment clauses,
one `.refgen.json` provenance sidecar per frame. Verified live on the facade photo (night +
overcast frames committed; the weathered treatment reads as mild overcast — noted on the
board). Tests in `AnchorTests`.
- [-] Generate facade, street and signage concept frames for the target block
(`scene_concepts.py generate --reference ...`), commit only the selected frames, and record
model, prompt, spend **and source photo** in the block sidecar. (First frame done:
`hollywood_boulevard_entrance_day-v2`, anchored on the facade photo; remaining framings
pending.)
- [ ] Derive palette, lighting and material targets from the real-photo board and the generated
concepts, and record the deltas the facade kit has to close.
- [ ] Generate signage, awning and poster texture candidates with `asset_pipeline.py`; run the
role audit and the `CREDITS.md` provenance check before anything is used in the kit.
- [ ] Compare generated concepts against the licensed photos: where they disagree, the photos win
for shape and the generated board only informs colour, mood and detail density. Human review
stays the acceptance gate, and AI output is never treated as licensed map data.
### QA and exit
- [ ] Compare the data-backed block against the existing screenshots and map documentation; keep
the stylized fallback available.
- [ ] Run the venue triangle/mesh budget, navigation and collider checks, plus day/night capture
comparisons.
- [ ] Capture day/night gallery frames of the new block and add before/after rows to `README.md`
and the venue map documents.
- [ ] Re-run `tools/check_screenshots.sh` after the map swap so the 21-shot gallery reflects the
new geometry, and refresh the `docs/screens/refs/` three-up sheets.
- [ ] Update `docs/architecture.md`, the venue map documents, `docs/asset-tooling.md`,
`docs/development-status.md` and `CHANGELOG.md` when the pipeline ships or a source is
rejected.
- [ ] Exit: one local block is reconstructed from licensed data with reference-derived photoreal
facades, passes performance/navigation/visual QA and has complete provenance; or the
pipeline is rejected with the findings recorded.
## Maintenance and documentation hygiene ## Maintenance and documentation hygiene
Unversioned housekeeping that keeps the planning sources trustworthy. Do these when they block a Unversioned housekeeping that keeps the planning sources trustworthy. Do these when they block a
@@ -640,9 +638,8 @@ baseline; 0.10.0-rc.1 is the current candidate source, with release approvals st
| Area | Current baseline | Remaining gap | Risk | Milestone | | Area | Current baseline | Remaining gap | Risk | Milestone |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| 3D model re-evaluation | 8 characters, 18 gear, 20+6 props audited against budgets/proportions; no skill-guided scorecard yet | Scorecard, ranked P0/P1 fixes, texel/weight/collider measurements and accept decisions | Unmeasured drift stays in the shipped library | Unversioned | | 3D model and local map re-evaluation | 8 characters, 18 gear, 20+6 props and stylized venues audited against budgets/proportions; no skill-guided scorecard yet | Asset scorecard/repairs plus OSM/3D data, photoreal references, AI-assisted composition and map QA | Unmeasured drift, licensing/provenance or performance failure | Unversioned |
| Character development | 8-variant library; source/licence review and Quaternius/MakeHuman evaluation complete | Four crowd variants, role pools, gear fit and runtime integration | Repetition remains or external assets break the contract | Unversioned | | Character development | 8-variant library; source/licence review and Quaternius/MakeHuman evaluation complete | Four crowd variants, role pools, gear fit and runtime integration | Repetition remains or external assets break the contract | Unversioned |
| Local map development | Stylized venue geometry and reference maps | OSM/3D data, photoreal references, AI-assisted composition and splat evaluation | Licensing/provenance or performance failure | Unversioned |
| Content and balance | 3 venues with validated 12+ event matrices, recovery events and contextual dialogue | External playtest evidence, balance/fairness pass, event-weight tuning and final content lock | Repetition or unfair outcomes survive into the release candidate | 0.10.0 | | Content and balance | 3 venues with validated 12+ event matrices, recovery events and contextual dialogue | External playtest evidence, balance/fairness pass, event-weight tuning and final content lock | Repetition or unfair outcomes survive into the release candidate | 0.10.0 |
| Dialog/UI | Audited terminology, copy, button states, focus/navigation, modal close, long strings and all 21 screen captures | Keep the capture/compare/judge gate current as content changes | Low; the remaining risk is drift after new UI is added | Complete (0.9.3) | | Dialog/UI | Audited terminology, copy, button states, focus/navigation, modal close, long strings and all 21 screen captures | Keep the capture/compare/judge gate current as content changes | Low; the remaining risk is drift after new UI is added | Complete (0.9.3) |
| Animation/presentation | Procedural pose layers, portrait captures, reduced hem clipping, 8,000/8,000 NPC cap | Thorough NPC silhouette/face/gear/pose/LOD optimization before visual QA | Close-up jank reduces perceived quality | Complete (0.9.4) | | Animation/presentation | Procedural pose layers, portrait captures, reduced hem clipping, 8,000/8,000 NPC cap | Thorough NPC silhouette/face/gear/pose/LOD optimization before visual QA | Close-up jank reduces perceived quality | Complete (0.9.4) |
@@ -655,8 +652,8 @@ baseline; 0.10.0-rc.1 is the current candidate source, with release approvals st
| Documentation | Architecture/ADR/status/roadmap ownership established | Final README/changelog/status/TODO/smoke-checklist sign-off and known-limitations page | Docs drift at launch | 0.9.6 / 0.10.0 | | Documentation | Architecture/ADR/status/roadmap ownership established | Final README/changelog/status/TODO/smoke-checklist sign-off and known-limitations page | Docs drift at launch | 0.9.6 / 0.10.0 |
| Future 0.x | Stable 0.x feature set | Live replay, more venues, VO/music, image-to-mesh props and seasonal content | Scope creep before release | Unscheduled | | Future 0.x | Stable 0.x feature set | Live replay, more venues, VO/music, image-to-mesh props and seasonal content | Scope creep before release | Unscheduled |
**Current priority:** the unversioned **3D model re-evaluation** runs first because its findings **Current priority:** the unversioned **3D model and local map re-evaluation** runs first because its findings
gate the crowd-variant roster; **Character development** and **Local map development** follow. gate the crowd-variant roster; **Character development** follows.
The **0.10.0 release candidate** is the next versioned release; content lock, external playtest, The **0.10.0 release candidate** is the next versioned release; content lock, external playtest,
balance, save migration and release/legal sign-off remain tracked there. The source version is balance, save migration and release/legal sign-off remain tracked there. The source version is
0.10.0-rc.1; the v0.9.6 release is published. Earlier map/NPC/UI/texture/integration passes are 0.10.0-rc.1; the v0.9.6 release is published. Earlier map/NPC/UI/texture/integration passes are
+2 -2
View File
@@ -4,8 +4,8 @@ This folder holds the project documentation, visual references and generated QA
## Current priorities ## Current priorities
1. [Character development](../TODO.md#character-development) — crowd, age, build, hair and outfit variety; generator-first, with the frozen NPC contract. 1. [3D model and local map re-evaluation](../TODO.md#3d-model-re-evaluation) — asset scorecard and fixes, plus OpenStreetMap/3D data, licensed reference imagery, photoreal facades, AI-assisted composition and map/Gaussian-splatting evaluation.
2. [Local map development](../TODO.md#local-map-development) — OpenStreetMap/3D data, licensed reference imagery, photoreal facades, AI-assisted composition and Gaussian-splatting evaluation. 2. [Character development](../TODO.md#character-development) — crowd, age, build, hair and outfit variety; generator-first, with the frozen NPC contract.
3. [0.10.0 release candidate](../TODO.md#milestone-0100--release-candidate) — versioned release hardening after the unversioned development tracks. 3. [0.10.0 release candidate](../TODO.md#milestone-0100--release-candidate) — versioned release hardening after the unversioned development tracks.
## Start here ## Start here
+2 -2
View File
@@ -175,8 +175,8 @@ Evidence and detailed contracts live in [`blender-assets.md`](blender-assets.md)
### Local map development tooling (planned) ### Local map development tooling (planned)
The current venues are hand-authored procedural reconstructions in The current venues are hand-authored procedural reconstructions in
`src/game/world_builder.gd`. The **Local map development** track in `src/game/world_builder.gd`. The local map workstreams (**H–M**) in
[`TODO.md`](../TODO.md#local-map-development) is unversioned and planned: it will [`TODO.md`](../TODO.md#3d-model-re-evaluation) are unversioned and planned: they will
test whether licensed data and reference photography can replace or supplement the test whether licensed data and reference photography can replace or supplement the
stylized geometry without moving map data, AI composition or splat rendering into stylized geometry without moving map data, AI composition or splat rendering into
the runtime. the runtime.
+2 -2
View File
@@ -278,8 +278,8 @@ python3 tools/blender_assets.py texels --only npc_coat
## Local map development (planned) ## Local map development (planned)
The **Local map development** track in [`TODO.md`](../TODO.md#local-map-development) The local map workstreams (**H–M**) in [`TODO.md`](../TODO.md#3d-model-re-evaluation)
is not implemented yet; there are no map-generation commands to run. The planned are not implemented yet; there are no map-generation commands to run. The planned
pipeline will evaluate: pipeline will evaluate:
- offline OpenStreetMap extracts for footprints and licence-compatible 3D building - offline OpenStreetMap extracts for footprints and licence-compatible 3D building
+3 -3
View File
@@ -1,8 +1,8 @@
# Development Status # Development Status
Current planning priorities are the unversioned **3D model re-evaluation**, **Character Current planning priorities are the unversioned **3D model and local map re-evaluation** and
development** and **Local map development** tracks in [`TODO.md`](../TODO.md); none is part of the **Character development** tracks in [`TODO.md`](../TODO.md); none is part of the implemented list
implemented list below yet. The re-evaluation scores the existing characters, gear, props and below yet. The re-evaluation scores the existing characters, gear, props and
venues against the locally installed Blender skill guidance before the roster expands. The 0.10.0 venues against the locally installed Blender skill guidance before the roster expands. The 0.10.0
release candidate remains the next versioned release. release candidate remains the next versioned release.
+1 -1
View File
@@ -24,7 +24,7 @@ docs/screens/refs/
tv-studio/ # studio entrance reference set tv-studio/ # studio entrance reference set
README.md README.md
SIDECAR.md SIDECAR.md
blocks/<block-id>/ # local map-development blocks (TODO: Local map development) blocks/<block-id>/ # local map blocks (TODO: 3D model re-evaluation → H–M)
README.md README.md
SIDECAR.md SIDECAR.md
``` ```