Plan the 0.10.0 minor and thorough NPC visual pass
Full build / Import + headless tests (push) Successful in 33s
Full build / Full desktop build + optional release (push) Skipped

Renumber the pre-release patches after shipped 0.9.1, promote the next release
candidate to 0.10.0, and expand NPC work into reference/acceptance, proportions,
face/hair, hands/clothing, gear fit, pose/performance and visual verification.
Sync the README status and remaining-gap references.
This commit is contained in:
zwitschi committed 2026-11-02 10:55:38 +01:00
1 parent 49bfccc808
commit 64590fe797
2 files changed
+114 -60

No files matched your search

+5 -6
View File
@@ -38,9 +38,8 @@ precision walk, the Joke Shop alley, the TV Studio arrival, and the prop lineup.
> Downloads are public (no sign-in required) since the host's instance-wide > Downloads are public (no sign-in required) since the host's instance-wide
> `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31. > `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31.
> >
> **Latest: v0.9.1** — unified Godot 4.7.2 CI/release environment with cached > **Latest: v0.9.1** — unified Godot 4.7.2 CI/release environment, plus
> Godot binaries/templates, plus v0.9.0's production-quality and v0.8 > v0.9.0's production-quality and v0.8 tutorial/campaign/resume work.
> tutorial/campaign/resume work.
> Releases are built automatically when a `vX.Y.Z` tag is pushed > Releases are built automatically when a `vX.Y.Z` tag is pushed
> (see [`docs/RELEASING.md`](docs/RELEASING.md)); manual builds use > (see [`docs/RELEASING.md`](docs/RELEASING.md)); manual builds use
> `./tools/build_releases.sh`. Installer/AppImage packaging runs in the same pipeline > `./tools/build_releases.sh`. Installer/AppImage packaging runs in the same pipeline
@@ -120,9 +119,9 @@ Full setup, every run/test/smoke command, and the controls table are in
## Development Status ## Development Status
v0.9.0 adds the production-quality baseline: mixer/accessibility settings, a v0.9.1 unifies the project, local tooling and CI/release environment on Godot
24-NPC performance budget and the unified Godot 4.7.2 toolchain, on 4.7.2. It builds on v0.9.0's production-quality and audio/accessibility pass,
top of v0.8's tutorial, campaign, checkpoint resume, difficulty and Help. See v0.8's tutorial/campaign/resume work and the v0.7.x venue/gear/judge work. See
[`docs/development-status.md`](docs/development-status.md) for the implemented [`docs/development-status.md`](docs/development-status.md) for the implemented
list and [`TODO.md`](TODO.md) for the v1.0.0 roadmap. Manual verification uses list and [`TODO.md`](TODO.md) for the v1.0.0 roadmap. Manual verification uses
the [`docs/smoke-checklist.md`](docs/smoke-checklist.md). the [`docs/smoke-checklist.md`](docs/smoke-checklist.md).
+109 -54
View File
@@ -5,9 +5,9 @@ see `AGENTS.md` for the workflow and `MEMORY.md` for the decisions behind these
## Gap Analysis and v1.0.0 Roadmap ## Gap Analysis and v1.0.0 Roadmap
Baseline: **v0.9.0** (2026-11-01). Three playable venues, tutorial/campaign/checkpoint resume, Baseline: **v0.9.1** (2026-11-02). Three playable venues, tutorial/campaign/checkpoint resume,
difficulty/help, audio/accessibility settings, a 24-NPC budget baseline, a complete difficulty/help, audio/accessibility settings, a 24-NPC budget baseline, a complete
escalation/access/radio loop, shift review, the Blender asset library, 250 headless + 94 Python escalation/access/radio loop, shift review, the Blender asset library, 250 headless + 97 Python
tests, a clean screen-design judge and an optional Forward+ Desktop HQ build. This is a strong tests, a clean screen-design judge and an optional Forward+ Desktop HQ build. This is a strong
release-candidate foundation, not yet a 1.0 product. release-candidate foundation, not yet a 1.0 product.
@@ -32,19 +32,19 @@ release-candidate foundation, not yet a 1.0 product.
| Area | Current baseline | Remaining gap | Risk | Milestone | | Area | Current baseline | Remaining gap | Risk | Milestone |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| 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 1.0 | 0.9.5 | | 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 1.0 | 0.10.0 |
| Dialog/UI | Complete screens and panel art, but copy/button behavior has not had a dedicated audit | Terminology, button states, long-string layout and full screen coverage need a focused pass | Inconsistent UI undermines first-hour clarity | 0.9.1 | | Dialog/UI | Complete screens and panel art, but copy/button behavior has not had a dedicated audit | Terminology, button states, long-string layout and full screen coverage need a focused pass | Inconsistent UI undermines first-hour clarity | 0.9.2 |
| Animation/presentation | Procedural pose layers, portrait captures, reduced hem clipping | Final model/pose/facial readability and gear-fit acceptance before visual QA | Close-up jank reduces perceived quality | 0.9.2 | | Animation/presentation | Procedural pose layers, portrait captures, reduced hem clipping | Thorough NPC silhouette/face/gear/pose/LOD optimization before visual QA | Close-up jank reduces perceived quality | 0.9.3 |
| Audio/accessibility | Procedural ambience/SFX, volume controls, captions/reduce-motion settings, searchable Help | Full accessibility/localization acceptance review, audio caption coverage and P0/P1 fixes | Public 1.0 cannot claim accessible play | 0.9.1 / 0.9.5 | | Audio/accessibility | Procedural ambience/SFX, volume controls, captions/reduce-motion settings, searchable Help | Full accessibility/localization acceptance review, audio caption coverage and P0/P1 fixes | Public 1.0 cannot claim accessible play | 0.9.2 / 0.10.0 |
| Localization | English JSON table, validation and input-generated Help | Pseudo-locale/layout audit and translator workflow sign-off | Text expansion/clipping at release | 0.9.1 / 0.9.5 | | Localization | English JSON table, validation and input-generated Help | Pseudo-locale/layout audit and translator workflow sign-off | Text expansion/clipping at release | 0.9.2 / 0.10.0 |
| Performance/platform | 24-NPC headless budget (6.9 ms), Compatibility/Web/HQ paths | Target hardware matrix, Web/HQ manual profiling, frame-time/memory evidence | Platform-specific drops or startup failures | 0.9.4 / 0.9.5 | | Performance/platform | 24-NPC headless budget (6.9 ms), Compatibility/Web/HQ paths | Target hardware matrix, Web/HQ manual profiling, frame-time/memory evidence | Platform-specific drops or startup failures | 0.9.5 / 0.10.0 |
| Save lifecycle | Settings/campaign/history/checkpoint files, atomic writes | Migration fixtures from 0.8/0.9, fresh-install/upgrade verification, rollback instructions | Player progress loss on upgrade | 0.9.5 | | Save lifecycle | Settings/campaign/history/checkpoint files, atomic writes | Migration fixtures from 0.8/0.9, fresh-install/upgrade verification, rollback instructions | Player progress loss on upgrade | 0.10.0 |
| QA/CI | Headless suite, smokes, screenshot compare, optional judge | Full visual judge gate, release-candidate smoke matrix, final gallery and release dry run | Regressions escape the release gate | 0.9.4 / 0.9.5 | | QA/CI | Headless suite, smokes, screenshot compare, optional judge | Full visual judge gate, release-candidate smoke matrix, final gallery and release dry run | Regressions escape the release gate | 0.9.5 / 0.10.0 |
| Release/legal | Unsigned desktop/macOS builds, Web/HQ packages | Signing/notarization decision, checksums, AI-asset provenance, credits, privacy/body-camera and rating review | Public release blocked by trust/policy | 0.9.5 | | Release/legal | Unsigned desktop/macOS builds, Web/HQ packages | Signing/notarization decision, checksums, AI-asset provenance, credits, privacy/body-camera and rating review | Public release blocked by trust/policy | 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.4 / 0.9.5 | | 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.5 / 0.10.0 |
| Post-launch | Stable 0.9 feature set | Live replay, more venues, VO/music, image-to-mesh props and seasonal content | Scope creep before launch | Post-1.0 | | Post-launch | Stable 0.9 feature set | Live replay, more venues, VO/music, image-to-mesh props and seasonal content | Scope creep before launch | Post-1.0 |
## Patch 0.9.1 — Dialog, button and UI polish ## Patch 0.9.2 — Dialog, button and UI polish
Goal: make every player-facing screen read consistently and pass the Python Goal: make every player-facing screen read consistently and pass the Python
screen-design judge before any model/texture changes. No gameplay rules change. screen-design judge before any model/texture changes. No gameplay rules change.
@@ -97,48 +97,103 @@ screen-design judge before any model/texture changes. No gameplay rules change.
strings/scale pass, and the Python compare/judge gate has no unexplained strings/scale pass, and the Python compare/judge gate has no unexplained
diff. diff.
## Patch 0.9.2 — NPC model refinement ## Patch 0.9.3 — NPC visual optimization
Goal: make the eight character variants and their gear hold up in portraits and Goal: make the eight character variants hold up in portrait, conversation and crowd
normal play without changing the `npc_base`/`Rig/Head` contract. views without changing the `npc_base`/`Rig/Head` contract or the skinned/procedural
fallback behavior.
### Model and rig audit ### Reference and acceptance criteria
- [ ] Render all eight variants from front, profile, back and portrait angles; - [ ] Establish a portrait/contact-sheet baseline for all eight variants: front, three-quarter,
compare faces, hair, ears, hands, shoes, proportions and gear fit. profile, back, full body and a crowd-distance silhouette.
- [ ] Audit head/face readability (brow, eyes, lips, nose, hairline) at portrait - [ ] Define acceptance criteria for proportions, face readability, hair, hands, shoes, clothing
distance; fix the highest-impact silhouette/face issues. silhouette, gear fit and animation at the gameplay camera height (1.7 m).
- [ ] Audit gear fit and clipping: caps/beanie/hood/helmet/sunglasses, shoulder bag, - [ ] Record the camera/lighting/background used for comparison so model changes can be judged
backpack, SCBA tank, lanyard, hand items and the new coat/dress stride. consistently; keep the existing portrait capture path deterministic.
- [ ] Audit coat/dress/skirt hems during walk, blocking, sitting and turning; fix - [ ] Identify the highest-impact gaps from the current portraits (e.g. face depth, hair mass,
remaining leg/hem intersections with weights, geometry or stride limits. neck/shoulder transition, hand/foot shape, coat/dress hem) and rank them by player visibility.
- [ ] Re-check the frozen contract: mesh `npc_base`, bone names, five tint slots, - [ ] Publish a before/after NPC comparison sheet for review before changing the library.
front direction, attach points, triangle/vertex budgets and grounding.
- [ ] Rebuild affected GLBs, bake AO, run `godot --headless --path . --import`, and
run `blender_assets.py audit` plus fit/portrait checks.
### Pose and animation polish ### Body proportions and silhouette
- [ ] Review idle, walk, warning, blocking, recognition, refusal, phone, clipboard, - [ ] Audit all variants against a shared human proportion guide (head height, shoulder width,
photo, film, sit and responder poses for pops or floating props. torso length, hip width, limb length, foot length) and correct the worst outliers.
- [ ] Add/adjust short transitions for negotiation/reaction poses without breaking - [ ] Improve neck, shoulder, torso and hip transitions so the silhouette reads as one body rather
the seeded pose helpers or head-turn behavior. than stacked primitives; preserve the existing broad/slim/average build variations.
- [ ] Verify LOD tiers and the impostor at 16/24-NPC distances; re-run the budget - [ ] Add subtle body-shape variation between variants beyond uniform scaling (shoulder slope,
smoke and record any triangle/draw-call changes. torso taper, hip width, limb thickness) while staying inside the triangle/vertex budget.
- [ ] Refresh the Blender review sheets and character portraits; keep per-asset - [ ] Check the procedural fallback and `npc_base` silhouette against the library so the fallback
previews local if gitignored. remains a credible offline substitute.
- [ ] Re-measure LOD 0/1/2 silhouettes and ensure the impostor still matches each variant at distance.
### Verification ### Head, face and hair
- [ ] Add/update headless tests for any new pose/model contract behavior. - [ ] Refine the head volume and jaw/cheek/chin proportions against the portrait concept; keep the
- [ ] Capture the portrait and character gallery; compare against the design face front direction unambiguous for the focus cone and head-turn.
references and run the Python judge. - [ ] Improve brow/eye-socket depth, eyelid/iris readability, nose bridge/tip, lips and ear shape
- [ ] Update `docs/blender-assets.md`, architecture/status and `MEMORY.md` with the without turning the low-poly face into a noisy mesh.
revised budgets, limitations and rebuild commands. - [ ] Audit hair caps, fringes, side locks, buns and beard silhouettes for gaps, intersections and
- [ ] Exit: portrait/readability and gear fit pass, no obvious P0/P1 clipping remains, obvious scalp seams; keep hair color in the tintable slot.
and the 24-NPC budget/full test suite are green. - [ ] Verify hats/hoods/sunglasses/helmets still clear the refined brow, ears and hair; update gear
fit measurements and rebuild any affected gear.
- [ ] Check face readability under day, evening and LATE lighting and at the portrait capture’s
shallow depth of field.
## Patch 0.9.3 — Texture and material refinement ### Hands, feet and clothing
- [ ] Refine hands and fingers enough to read at conversation distance without exceeding the
character triangle budget; check grip alignment for phone, cup, clipboard, camera, sign,
flashlight, wand and radio.
- [ ] Audit shoes/boots for silhouette, grounding and contact with the floor; preserve the
responder and firefighter footwear language.
- [ ] Improve clothing layer transitions at collars, cuffs, plackets, waistbands, pockets, badges
and reflective bands; remove obvious z-fighting or floating detail.
- [ ] Add believable fabric folds/wrinkles at elbows, knees, waist and hems where the extra
geometry pays off in portraits; keep the fixed detail materials and five tint slots intact.
- [ ] Re-check coat/dress/skirt hems during walking, blocking, sitting and turning; eliminate
visible leg-through-hem clipping and floating hems.
- [ ] Verify outfit tinting on all five contract slots and fixed-colour details (hi-vis, leather,
steel, patches, plastic, rubber) remains unchanged.
### Gear and equipment fit
- [ ] Run the Blender `fit` report for every character and all head/back/chest/hand gear; record
head-band, skirt/hip clearance and inner-face clearances.
- [ ] Re-fit caps, beanie, hood, sunglasses and firefighter helmet against the refined face/hair;
ensure eyebrow/ear clearance and a readable face with the hood up.
- [ ] Re-fit backpack, shoulder bag and SCBA tank against the revised torso/hips; fix strap and
tank intersections and keep attachments outside the body silhouette.
- [ ] Verify lanyards, radios, phones, cups, clipboards, umbrellas, cameras, protest signs,
flashlights and wands sit correctly in the hand/grip and do not float.
- [ ] Add regression checks for gear attach parents, head/back silhouette clearance and hand-item
grip; rebuild affected GLBs, bake AO and re-import.
### Poses, animation and performance
- [ ] Review idle, walk, warning, blocking, recognition, refusal, phone, clipboard, photo, film,
sit, panic/flee and responder poses for pops, foot sliding, floating props and head-turn
overshoot.
- [ ] Add or refine short negotiation/reaction transitions (comply, argue, leave, recognize,
block) without changing the seeded pose/outfit determinism.
- [ ] Re-measure the skinned-avatar frame cost at 16/24 NPCs and the LOD/impostor thresholds;
record triangle, mesh and draw-call changes before raising any cap.
- [ ] Ensure the procedural fallback still passes the pose, target and crowd behavior tests after
the model changes.
### Verification and handoff
- [ ] Rebuild the affected Blender assets, AO maps, manifest and review sheets; run
`blender_assets.py audit`, `fit`, character imports and the full Godot test suite.
- [ ] Recapture the portrait, character gallery and crowd-distance shots; compare old/new and run
the Python screen-design judge.
- [ ] Update `docs/blender-assets.md`, architecture/status, `MEMORY.md` and the changelog with the
new budgets, limitations and rebuild commands.
- [ ] Exit: all eight variants pass the portrait/readability criteria, gear and hems no longer
clip in normal play, the 24-NPC budget remains green, and the visual judge has no unexplained
regressions.
## Patch 0.9.4 — Texture and material refinement
Goal: improve close-range surface and character texture quality while keeping GL Goal: improve close-range surface and character texture quality while keeping GL
Compatibility/Web parity, deterministic assets and offline CI. Compatibility/Web parity, deterministic assets and offline CI.
@@ -176,7 +231,7 @@ Compatibility/Web parity, deterministic assets and offline CI.
and skyline; document accepted trade-offs. and skyline; document accepted trade-offs.
- [ ] Update asset docs and the changelog/status with the promoted texture versions. - [ ] Update asset docs and the changelog/status with the promoted texture versions.
## Patch 0.9.4 — Integration, performance and judge gate ## Patch 0.9.5 — Integration, performance and judge gate
Goal: integrate the UI/model/texture patches, prove the combined build on the Goal: integrate the UI/model/texture patches, prove the combined build on the
target paths and leave a clean release-candidate handoff. target paths and leave a clean release-candidate handoff.
@@ -209,18 +264,18 @@ target paths and leave a clean release-candidate handoff.
- [ ] Update README, architecture, development status, changelog and TODO with the - [ ] Update README, architecture, development status, changelog and TODO with the
final patch-level results and any remaining gaps. final patch-level results and any remaining gaps.
- [ ] Tag/version or otherwise freeze `0.9.4` as the integration checkpoint before - [ ] Tag/version or otherwise freeze `0.9.4` as the integration checkpoint before
the `0.9.5` release candidate. the `0.10.0` release candidate.
- [ ] Exit: combined build is functionally green, visually reviewed, performance - [ ] Exit: combined build is functionally green, visually reviewed, performance
measured and ready for the 0.9.5 content-lock/playtest phase. measured and ready for the 0.10.0 content-lock/playtest phase.
## Milestone 0.9.5 — Release candidate ## Milestone 0.10.0 — Release candidate
Goal: freeze the feature set, prove it with external players, clear release/legal blockers and Goal: freeze the feature set, prove it with external players, clear release/legal blockers and
verify every distribution path. This is the next shipped version before 1.0. verify every distribution path. This is the next shipped version before 1.0.
### Content lock and external playtest ### Content lock and external playtest
- [ ] Declare a content/feature freeze for 0.9.5; only release-blocking fixes and balance changes - [ ] Declare a content/feature freeze for 0.10.0; only release-blocking fixes and balance changes
may land after the freeze. may land after the freeze.
- [ ] Produce a release-candidate build with the tutorial, campaign, all three venues, Help, - [ ] Produce a release-candidate build with the tutorial, campaign, all three venues, Help,
accessibility settings and checkpoint/resume enabled. accessibility settings and checkpoint/resume enabled.
@@ -267,7 +322,7 @@ verify every distribution path. This is the next shipped version before 1.0.
Gitea host cannot leave a partially uploaded release. Gitea host cannot leave a partially uploaded release.
- [ ] Verify release metadata, tag/version consistency, asset counts and download links; retain - [ ] Verify release metadata, tag/version consistency, asset counts and download links; retain
at least the latest 0.8/0.9 releases and document older-asset pruning. at least the latest 0.8/0.9 releases and document older-asset pruning.
- [ ] Decide and document whether macOS signing/notarization is required for 0.9.5 or explicitly - [ ] Decide and document whether macOS signing/notarization is required for 0.10.0 or explicitly
remains a 1.0 blocker; record the quarantine instructions either way. remains a 1.0 blocker; record the quarantine instructions either way.
### Legal, credits and platform policy ### Legal, credits and platform policy
@@ -299,7 +354,7 @@ verify every distribution path. This is the next shipped version before 1.0.
settings, pause/resume, all venues and Desktop HQ fallback. settings, pause/resume, all venues and Desktop HQ fallback.
- [ ] Confirm no P0/P1 defects remain; P2 items must be documented as known limitations or - [ ] Confirm no P0/P1 defects remain; P2 items must be documented as known limitations or
post-1.0 work. post-1.0 work.
- [ ] Create the `v0.9.5` version bump, changelog entry and tag; build/publish the release and - [ ] Create the `v0.10.0` version bump, changelog entry and tag; build/publish the release and
verify all assets and download links. verify all assets and download links.
- [ ] Exit: the release candidate is content-locked, externally played, legally reviewed, - [ ] Exit: the release candidate is content-locked, externally played, legally reviewed,
documented, reproducibly built, and approved as the final stepping stone to 1.0.0. documented, reproducibly built, and approved as the final stepping stone to 1.0.0.