Re-plan the Blender tracks around the local skills and a 3D model review
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-03 10:19:46 +01:00
1 parent 84bc4137cb
commit 3e41cda591
5 files changed
+312 -110

No files matched your search

+14 -5
View File
@@ -4,6 +4,14 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
## Decisions
- **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 is ~960 lines with dated historical entries; trimming it is a tracked maintenance task.
- **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
@@ -356,11 +364,11 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
**Mockup copies:** 21 design references live in `assets/images/ui/`; `docs/screens/designs/`
remains the reference-only copy. `tools/screen_designs.py` reads/writes the runtime root.
## Handoff (read this first)
## Handoff — historical snapshot (2026-11-01; superseded by Current State / Plan vs code)
- **Status (2026-11-01, after the venue-geometry pass):** v0.7.0 is released. Post-v0.6.0 the
- **Status (2026-11-01, after the venue-geometry pass):** v0.7.0 was released at that point. Post-v0.6.0 the
realism pass, the visual-alignment pass and the NPC face/hand pass all landed. Headless
**229/229**, Python tooling **87/87**, `tools/check_screenshots.sh` **11 good / 0 bad**,
**272/272**, Python tooling **108/108**, `tools/check_screenshots.sh` **21 good / 0 bad**,
`screen_designs.py compare` 11 good / 0 bad, `scene_concepts.py audit` all GOOD,
`blender_assets.py audit` exit 0, `smoke_npc_budget` OK (16 avatars, 6.94 ms of 50 ms).
`PLAN.md` is compact; README/architecture track the current controls, asset pipeline, CI and
@@ -914,13 +922,14 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
- Shift length: `GameManager` uses the scenario's `shift_duration_s` (900s ≈ 10-15 min);
tests and the screenshot tool override elapsed time directly.
- Headless (dummy renderer) logs "Parameter m is null" from `mesh_get_surface_count`; it does not occur with a real GL driver and does not affect logic.
- Steps are visual-only (no collider) so NPCs can path to the entrance; the guard spawns on the landing so it never needs to climb.
- Steps have per-tread colliders (`_build_steps()` adds a `StaticBody3D` with one `BoxShape3D`
per tread), so the guard and NPCs walk up the entrance; the guard spawns on the landing.
- Persistence tests write into the real `user://shift_results.json` (harmless local pollution of the demo history).
- macOS export required `rendering/textures/vram_compression/import_etc2_astc=true` in `project.godot` (universal build demands ETC2 ASTC enabled).
- Venue `door_staff_lines` are logged through `GameManager` (inspect / wand / refuse). They are not a separate dialogue UI.
- Access loadout is implemented; do not re-fix `override_access` as if it were still unread.
- `Save.SETTINGS_FILE` is declared and unused; settings persistence goes through `Save.load_settings()` / `save_settings()`.
- Headless suite is **272/272**; Python tooling is **101/101**; screenshot compare is **21 good / 0 bad** and the automatic judge is **21/21 match, 0 diff**. Remaining visual follow-ups are in `TODO.md`.
- Headless suite is **272/272**; Python tooling is **108/108**; screenshot compare is **21 good / 0 bad** and the automatic judge is **21/21 match, 0 diff**. Remaining visual follow-ups are in `TODO.md`.
- Typed spawn signal extra args: handlers must accept the 4th `event: Dictionary` or Godot will not call them (`test_shift_coordinator_runs_a_shift` failed until `_on_spawn` took four args).
- GDScript inference trap that broke the main scene: a `var` typed as a base class
(`radial: CanvasLayer`) exposes script members as `Variant`, so `var x := radial.is_open` is a