Re-prioritize: Rig harness -> MakeHuman -> 3D re-eval -> 0.11.0; move character development to DONE
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-04 11:15:54 +01:00
1 parent 09d07452af
commit 75dea2e7c2
3 files changed
+202 -139

No files matched your search

+78 -136
View File
@@ -3,14 +3,62 @@
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.
**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
Versioning and §Local Blender skills.
**Priority order (2026-11-04, owner):** 1) fix the `Rig` pose harness (unblocks pose/weight
and portrait evidence), 2) the MakeHuman character pipeline (more realistic bodies than the
procedural generator), 3) re-evaluate the 3D models against the new characters, 4) push the
**0.11.0** minor release. See `AGENTS.md` §Priority and Versioning and §Local Blender skills.
The MIT Blender skill pack lives locally at `.agents/skills/blender-skills/` (gitignored). Every
3D workstream below names the skills to load; they are guidance only, and the project contract,
`blender_assets.py audit`/`fit`/`inspect` and the capture gates stay authoritative.
## Fix the Rig pose harness
Goal: `src/test/capture_npc_pose.gd` reports a pose but saves rest frames; the root cause is
narrowed to the skinned mesh ignoring its `Rig` parent transform. Fixing it unblocks the
weights/pose column of the 3D review and the pose/portrait evidence for the MakeHuman intake.
*Skill route: `rigging`; evidence in `docs/3d-model-review.md` §"Pose evidence is blocked".*
- [ ] Answer why the skinned mesh ignores its `Rig` Node3D transform. Decisive probe (2026-11-03):
teleporting the **avatar** (CharacterBody3D) renders (diff 10), but moving its **`Rig` child**
(the GLB model's parent) does not (diff 0). Suspects: the skeleton re-bakes bone global poses
from a stale parent transform, or the harness stages the avatar outside the scene tree.
- [ ] Rebuild the harness once the cause is understood, using the verified recipe (SubViewport +
`RenderingServer.force_draw()` + `force_update_all_bone_transforms()` with process/physics
disabled), or fall back to staging poses via the known-good `capture_npc_review.gd`.
- [ ] Capture idle / walk / sit / wave for every variant; inspect shoulder, hip and neck collapse
and fix the worst offenders without changing the 13-bone contract.
## MakeHuman character pipeline
Goal: replace the procedural body generator with the CC0 MakeHuman base for the next character
pass — retopologised, rigged and dressed in project-owned clothing — so bodies read more
realistic than the current primitive shapes. This promotes the deferred MakeHuman evaluation to
an active track; ADR-0015 (CC0 / CC-BY with attribution) still governs every intake.
*Skill route: `retopology`, `rigging`, `uv-workflow`, `materials`, `character-artist`,
`asset-optimization`, `godot-export`, `qa-review`.*
### Intake and adaptation
- [ ] Add an `adapt` path in `tools/blender_assets.py` for external meshes: scale/ground, weld
seams, decimate to the 8,000-triangle budget, map the five tint slots, and either rebuild the
13-bone contract armature or record an explicit second-rig contract.
- [ ] Keep `blender_assets.py audit` as the single final gate; add a regression test for the intake
report/adaptation using a deterministic synthetic or licence-cleared fixture.
- [ ] Document the adapter commands and go/no-go checks in `docs/asset-tooling.md`.
### MPFB / MakeHuman body pipeline
- [ ] Prototype the local MPFB/MakeHuman pipeline outside the repo (retopology, custom rig,
project-owned clothing) and commit only the final CC0-derived assets with provenance.
- [ ] Decide the rig strategy: retarget the MakeHuman mesh to the frozen 13-bone `npc_base`
contract (needs a proportion warp, like the Quaternius no-go), or add a second rig/animation
path behind its own ADR.
- [ ] Re-run `inspect`/`audit`/`fit`/proportions and the 24-NPC budget after each intake; keep the
procedural generator as the fallback until a MakeHuman variant ships.
## 3D model and local map re-evaluation
Goal: re-judge every shipped 3D asset against the newly available Blender skill guidance, rank
@@ -25,7 +73,8 @@ the 0.10.0 release candidate.
rebuilds and the face/foliage prototypes) stay **blocked** until the full local map rebuild
(H–M) is done **and** a fresh 3D model review runs against the new maps. The measurements and
scorecard in `docs/3d-model-review.md` stand as the pre-rebuild baseline, not a go-ahead to start
character work now. Character development stays gated behind that second review.
character work now. (Character development has since shipped — see `DONE.md` — and the next
character pass is the MakeHuman pipeline above.)
**Map rebuild status (2026-11-03):** H–M are complete — the Joke Shop is now a 6.0 m low hall
(dark stucco, white signature fascia, tied-back curtains, hotel tower) and Hollywood/TV Studio
@@ -131,19 +180,8 @@ licence-free zone only.
the open palm + forward offset; a finger-curl rig stays out of scope** — there are no finger
bones in the 13-bone contract, so a curl rig is a contract decision, not a modelling tidy-up.
Recorded as ranked gap #6 (accept; revisit only if face work opens the budget).
- [ ] Weights/pose: capture idle, walk, sit and wave; inspect shoulder, hip and neck collapse;
fix the worst offenders using `rigging` practice without changing the 13-bone contract.
**Blocked:** the new `capture_npc_pose.gd` reports the seated/walking pose while the saved
frames still show the rest pose; direct bone writes deform the mesh, so this is a staging/
capture discrepancy that may also affect live venue frames. See
`docs/3d-model-review.md` §"Pose evidence is blocked".
- [ ] Rebuild the pose harness. **Re-attempt 2026-11-03 narrowed the root cause:** the recipe
(SubViewport + `force_draw()` + `force_update_all_bone_transforms()` + disabled process/physics)
still produced byte-identical rest frames. Decisive probe: teleporting the avatar renders
(diff 10) but moving the `Rig` child does not (diff 0) — the skinned mesh ignores its `Rig`
parent transform, so `rig_y=-0.339` never reaches the render. Next attempt must answer why
the skinned model ignores the `Rig` node, or stage poses via the known-good
`capture_npc_review.gd` fallback.
- [ ] Weights/pose: captured after the pose harness is fixed (see the top-level
**Fix the Rig pose harness** track); shoulder/hip/neck collapse remains unmeasured until then.
- [x] UV/texel density: measured (64–122 px/m authored, 287–440 px/m effective fabric on the 4×
repeat; table in `docs/3d-model-review.md`). Decision: **accept as-is** — the maps are
neutral/runtime-tinted (not painted skin), so density controls only subtle weave/noise, and
@@ -561,121 +599,6 @@ pass. The current `_build_comedy_store_building()` stays as the fallback.*
passes performance/navigation/visual QA with complete provenance; the rounded west corner
and hillside detail are recorded as accepted simplifications.
## Character development
Goal: break the eight-character clone effect with four licence-cleared crowd-variety looks while
keeping the frozen `npc_base` bone, tint-slot and gear-attach contract. The procedural generator is
the primary path; Quaternius is a reviewed reference and MakeHuman is deferred to a separate local
development pipeline.
The roster build is deliberately sequenced **after** the 3D model and local map re-evaluation: the new variants
must inherit the reviewed face/hand/gear baseline instead of multiplying whatever it finds.
*Skill route: `character-artist`, `retopology`, `rigging`, `uv-workflow`, `materials`,
`asset-optimization`, `lowpoly-style`, `godot-export`, `qa-review`.*
### Source review and decision
- [x] Research free/open-source character sources and evaluate at least three downloads against
the existing Blender contract. (Measured Quaternius CC0, Kenney CC0, Khronos
CesiumMan/RiggedFigure CC-BY and the MakeHuman CC0 base mesh; none is a drop-in.
Results, local preview sheet and SHA-256 provenance are in
`docs/npc-model-sourcing.md`.)
- [x] Review the sourcing research with the project owner and choose Option A (procedural),
Option B (Quaternius CC0 intake) or Option C (MakeHuman/MPFB body pipeline); record the
decision in an ADR and in `MEMORY.md`. (2026-11-03: extend the procedural generator as the
primary path, keep Quaternius as a reviewed prototype/reference, defer MakeHuman to a
separate local pipeline. Recorded in ADR-0015 and `MEMORY.md`.)
- [x] Add a source licence allow-list and provenance rule: CC0 preferred, CC-BY only with
attribution in `CREDITS.md`, and no service assets whose terms restrict redistribution.
(ADR-0015; the CC-BY research previews are attributed in `CREDITS.md`.)
- [x] Decide whether the external preview sheet stays local under `tmp/` or is committed with
the required CC-BY attribution. (Committed as
`docs/blender_previews/sheet_npc_sources_research.jpg` with Cesium CC-BY attribution;
the project-owned crowd prototype sheet is also committed.)
### Intake and validation
- [x] Add a Blender `inspect` path that imports a GLB, applies node transforms, reports
tris/verts, bounds, bones, materials, UVs and skinning, and lists contract failures.
(`blender_assets.py inspect --file ...` applies parent/object transforms, converts to
Godot Y-up, ignores the importer's bone-shape helper and prints budgets, bones, slots,
UVs, skinning and animations with issues/warnings; `--json` and `--category` supported.
Seven synthetic contract tests added; all 46 library GLBs inspect clean. `audit` remains
the final gate.)
- [ ] Add an `adapt` path for future external assets: scale/ground, weld seams, decimate, map the
five tint slots, and either rebuild the contract armature or record an explicit second-rig
contract. Use `retopology`/`rigging`/`uv-workflow` guidance for the manual steps, but keep
the Quaternius no-go: a contract rebuild needs a proportion warp, so this is not on the
character critical path.
- [ ] Keep `tools/blender_assets.py audit` as the single final gate; add a regression test for the
intake report/adaptation using a deterministic synthetic or licence-cleared fixture.
- [ ] Document the adapter commands and the go/no-go checks in `docs/asset-tooling.md`.
### Quaternius prototype
- [x] Prototype one Quaternius CC0 variant: weld/decimate to budget and capture Idle/Walk
renders. (12,518 imported verts -> 3,199 after weld -> 2,423 / 4,654 tris after a 0.75
decimate; Idle/Walk quality is good. Preview in
`docs/blender_previews/sheet_npc_sources_research.jpg`.)
- [x] Measure the prototype against the `npc_casual` controls: silhouette, rest pose, body
proportions and gear fit. (No-go for a contract rebuild: T-pose 62-bone realistic rig,
~0.96 m hip, ~1.68 m arm span and ~0.153 m shoulder joint do not match the arm-down
13-bone contract. Keep as reference; a second rig/animation path needs its own ADR.)
- [x] Make a go/no-go decision on Option B. (No-go for the current pass; proceed with the procedural
generator and keep Quaternius as a visual/style reference.)
### Roster and runtime
- [x] Approve four crowd-variety looks (build, head silhouette, hair/beard, outer layer and
accessory; no clothing that labels the NPC's behaviour). (`npc_crowd_a` bun/slim/sunglasses,
`npc_crowd_b` bald/broad/beard/shoulder bag, `npc_crowd_c` coat/umbrella, `npc_crowd_d`
hood/cup; prototype sheet committed.)
- [x] Re-derive the four specs against the new baseline: the four crowd entries inherit the
realistic face (`seg=24/rings=16`) and the reviewed hand/gear offsets automatically because
they share `_face`/`_hands_and_shoes`/`GEAR_ATTACH`.
- [x] Generate the four variants: built via `blender_assets.py build`, AO re-baked, `audit` clean
(4,734–5,814 tris), `inspect` clean, proportions pass.
- [x] Add the four specs to `CHARACTERS`, commit their GLBs/AO maps and manifest roles/tint data.
(Note: this adds ~2 MB to the next release build via `export_filter=all_resources` — accepted
for the crowd-variety roster.)
- [x] Per-role pools: `character_model_for()` now picks from `CHARACTER_POOLS` by seed — the
routine crowd roles gain the crowd variants (tourist → casual/crowd_a/crowd_d,
confused_visitor → casual/crowd_b, intoxicated → casual/crowd_c) while the special roles
keep their existing alternation (guest ⅓ jacket, trespasser/threat ½ hoodie). The test
now checks seed-stability plus that every pool entry resolves to a committed GLB
(277/277).
- [x] Gear fit + inspect for the four new variants: `fit` is clean (sunglasses band=inside,
shoulder bag clear; cup/umbrella are hand gear with the forward offset), `inspect` clean,
proportions pass.
- [x] Crowd-variety reference: five licence-cleared Commons photos fetched to
`tmp/research/crowd-variety/`; the AI proposal set stays the next step for detail.
- [x] Baseline + portrait rows: the four variants are in `capture_npc_baseline.gd` and
`sheet_npc_baseline.jpg` (12 variants × 6 views); review-doc rows added.
### QA and release
- [x] Gates with the expanded library: 24-NPC budget smoke 152,464 tris / 168 meshes / 6.94 ms
(under 50 ms), portrait baseline 12 variants × 6 views, `fit` clean, Godot 277/277, Python
160/160. No release build is created for this unversioned track.
- [x] Docs: `docs/development-status.md`, `docs/3d-model-review.md` and the baseline sheet updated;
`CREDITS.md` needs no change (the crowd variants are procedural, no new source). Accepted
visual limits: the crowd accessories (umbrella canopy, cup, sunglasses, beard) read at
full-body distance but not in the head-only portrait framing.
- [x] Exit: the 12-character library passes contract audit, portrait/gear acceptance, the 24-NPC
budget and licence/provenance review; the runtime contract (13 bones, five tint slots,
`npc_base` fallback) is unchanged.
### Deferred MakeHuman local pipeline
- [x] Evaluate the MakeHuman CC0 base mesh for a later separate local development pipeline.
(19,158 verts / 36,972 tris; scaled to 1.82 m; decimate 0.35 -> 3,780 verts / 6,468 tris;
UVs present, no normals/material groups/rig. Feasible only with retopology, a custom rig and
project-owned clothing; keep out of CI/build.)
- [ ] Decide whether body-shape diversity still matters after the 12-character library lands; if
yes, prototype the local MPFB/MakeHuman pipeline outside the repo and commit only the final
CC0-derived assets with provenance.
## Maintenance and documentation hygiene
Unversioned housekeeping that keeps the planning sources trustworthy. Do these when they block a
@@ -756,7 +679,7 @@ published while the gates below remain open.
| Area | Remaining gap | Milestone |
| --- | --- | --- |
| 3D model and local map re-evaluation | Skill-guided asset scorecard/repairs; OSM/3D data, reference-derived facades, AI-assisted composition and map QA | Unversioned |
| Character development | Four crowd variants, deterministic role pools, gear fit and runtime integration | Unversioned |
| Character development | Complete (moved to `DONE.md`); the MakeHuman body pipeline is the next character pass | 0.11.0 |
| Content and balance | External first-time-player evidence, balance sweeps/tuning and content lock | 0.10.0 |
| Audio, accessibility and localization | Accessibility/localization acceptance, caption coverage and pseudo-locale/layout sign-off | 0.10.0 |
| Performance and platform | Target-hardware matrix, Web/Desktop HQ profiling and frame/memory evidence | 0.10.0 |
@@ -769,9 +692,10 @@ The 0.9.3 UI, 0.9.4 animation, 0.9.5 texture, 0.9.6 integration and save-migrati
complete in `DONE.md`; they are not remaining gaps. The 2026-11-01 documentation audit
(architecture ownership, stale-claim cleanup and obsolete-plan removal) is also closed.
**Priority:** finish the unversioned 3D/local-map and character tracks first. The 0.10.0
milestone accepts only release-blocking fixes until its external-playtest, legal/storefront,
signing and platform gates clear; only then can the candidate become a final release.
**Priority (2026-11-04):** fix the `Rig` pose harness, then the MakeHuman character pipeline,
then re-evaluate the 3D models, then ship the **0.11.0** minor release. The 0.10.0 candidate
still accepts only release-blocking fixes until its external-playtest, legal/storefront, signing
and platform gates clear.
## Milestone 0.10.0 — Release candidate
@@ -927,6 +851,24 @@ order. Only a release-blocking defect from those tracks may enter this milestone
- [ ] Exit: the release candidate is content-locked, externally played, legally reviewed,
documented, reproducibly built, and approved as the 0.10.0 release candidate.
## Milestone 0.11.0 — MakeHuman characters
Goal: ship the MakeHuman-derived character bodies as a new minor release, with the pose harness
fixed and the 3D models re-evaluated against them. This follows the 0.10.0 release candidate;
the sequencing is Rig harness → MakeHuman intake → 3D re-evaluation → release.
- [ ] Fix the `Rig` pose harness and capture the weights/pose evidence (see the top track).
- [ ] Intake a MakeHuman CC0 body through the `adapt` path (retopology → rig → clothing → AO) and
pass `inspect`/`audit`/`fit`/proportions plus the 24-NPC budget.
- [ ] Re-evaluate the 3D scorecard against the new characters (Section B owner review) and record
the accepted limits.
- [ ] Run the full QA matrix and a local release build for 0.11.0; bump `config/version`, write the
`CHANGELOG.md` entry, tag and publish per the Release Procedure.
**Exit:** a 0.11.0 build ships the MakeHuman character pass with the pose harness fixed and the
scorecard re-reviewed; the runtime contract (13 bones, five tint slots, `npc_base`) is either
preserved or replaced behind an accepted ADR.
## Roadmap dependencies and risks
- Content volume is the largest schedule risk; tutorial and campaign work must not outrun the