Compare commits

...
283 Commits
Author SHA1 Message Date
zwitschi a196a35342 Give Hollywood and the TV Studio the same queue story and validate every venue's placements
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-06 20:55:52 +01:00
zwitschi efa062833f Give the Joke Shop a real queue line and thicken the rope barrier
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 20:47:28 +01:00
zwitschi 6381dbc5cb Give the event banners a top-down night gradient so they read as lit cloth
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-06 20:33:31 +01:00
zwitschi 7546092c01 Give the street lamps real pools: 10 m range and 8 energy at physical falloff
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 20:29:26 +01:00
zwitschi 16dc1dfea4 Tune the flashlight against measured luminance and refresh the venue gallery
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 20:20:22 +01:00
zwitschi 2ba40f3578 Reorganize docs into category folders and drop the retired head-review page
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
Group the top-level docs into docs/project, docs/design, docs/assets and
docs/process, each with its own README index. Delete the superseded
docs/screens/head-review page and sheets. Rewrite every markdown link,
absolute docs path and tool/test reference to the new locations, fix the
pre-existing broken anchors and remove the dead Joke Shop photo-board link.
check_docs OK, Python tooling 167/167.
2026-11-06 20:13:03 +01:00
zwitschi 045ed2a58f Rebuild the foliage with leaf cards: leafier silhouette at two thirds the triangles
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 20:02:32 +01:00
zwitschi d3a87acf2d Record the three failed Swat yaw attempts and keep the guard on the worker base
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 19:50:31 +01:00
zwitschi b18236f9b4 Roll out seven modular outfit bases: eleven distinct outfits across twelve roles
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 19:37:11 +01:00
zwitschi 3b9e3b61d8 Intake the modular outfit pack and ship the Suit base for npc_coat
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 19:02:38 +01:00
zwitschi f6bb2b1de3 Prepare the modular part intake: inventory, extract, verify, join and the part contract
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:54:08 +01:00
zwitschi 7a46963e3f Add the hair part library and give the roster three silhouettes
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:48:38 +01:00
zwitschi a0dbf75806 Add eye whites and pupils to every base and archive the 0.9.9 milestone
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:44:39 +01:00
zwitschi c70a523f0f Close and archive the 0.9.9 milestone, record that the upstream clips stay unused, and harden the fallback test
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:39:53 +01:00
zwitschi fcbeee0db2 Retire the NPC review pages after owner acceptance and repoint every reference
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 50s
2026-11-06 18:37:17 +01:00
zwitschi d5e180e50c Raise the back gear to shoulder-blade height and compact the review page
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:35:02 +01:00
zwitschi a36068aae7 Drop hand items into the palm, raise the lanyard, and capture every gear piece worn on the character
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 43s
2026-11-06 18:30:52 +01:00
zwitschi 6b58350464 Close the measurable prop-fit items and point the review page row 4 at the owner verdict
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:11:31 +01:00
zwitschi 219588bf8a Start the prop and gear fit pass: hand-gear measurement, top-edge clipboard, carried role props, 15-piece gear set
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:11:20 +01:00
zwitschi cba00facf5 Record the roster fixes, material-list traps and head-gear offset in MEMORY.md
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:05:57 +01:00
zwitschi 9fd48243ad Give every Quaternius head a visible mouth and queue the prop and gear fit pass
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 18:02:55 +01:00
zwitschi 30d145079a Remove every hat except the firefighter helmet, drop the performer cone, rewrite the review page
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 17:52:46 +01:00
zwitschi 98f618c501 Copy the hoodie eye pair onto the Worker head and lift every hat except the firefighter helmet
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 15:11:57 +01:00
zwitschi a290fe83c8 Lift and scale head gear for the Quaternius head so the cap stops reading as a visor
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 15:00:43 +01:00
zwitschi 529d15ee7a Transplant the hoodie head parts onto the Worker base and put carried props in the hands
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 14:40:35 +01:00
zwitschi 3ab7577634 Fix the worker torso/crown holes, transplant proper brows, widen the rest-arm clearance
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-06 14:28:57 +01:00
zwitschi c8875a3dfa Turn the NPC visual review into the 0.9.9 roster signoff page with committed sheets
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 44s
2026-11-06 14:05:49 +01:00
zwitschi b3acf370fc Mark the roster build done and record the release-size follow-up
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Successful in 4m58s
2026-11-06 13:59:28 +01:00
zwitschi 04d211b90b Release 0.9.9: full Quaternius roster, docs, changelog, version, slimmer export filters and checksums
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 40s
2026-11-06 13:59:23 +01:00
zwitschi a6ccd86f85 Swap the full 12-character roster onto the CC0 Quaternius bases
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 13:56:30 +01:00
zwitschi 1ce173e9d1 Record the Quaternius pilot bake, measurements and face-gate decision point in the docs
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 45s
2026-11-06 13:45:05 +01:00
zwitschi 90f189a269 Add the Quaternius face/silhouette gate sheet and record the geometry measurements
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 13:44:46 +01:00
zwitschi fb3e75aba3 Refit the backpack straps for both torsos (ADR-0018)
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 13:43:52 +01:00
zwitschi cd285b3a39 Ship the Quaternius npc_casual pilot base: rig-agnostic pose sync, five tint slots, unwrapped UVs and wrist-strap camera
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 13:42:37 +01:00
zwitschi 68f49253fe Record the Quaternius pilot fixes and remaining 0.9.9 work in MEMORY.md
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 13:19:42 +01:00
zwitschi b012c6a675 Record the Quaternius bake/pose-sync progress
Full build / Import + headless tests (push) Successful in 50s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 12:17:30 +01:00
zwitschi 2a6f29f5d0 Fix the Quaternius side swap, arm swing axis, and hand-proxy position (backward-compatible)
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 12:17:18 +01:00
zwitschi bb54ef3eec Record the canonical-base and arm-down-bake findings precisely
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 10:33:52 +01:00
zwitschi 11f53f66a3 Record the two skinning root causes: weld corrupts weights, bake needs head/tail plus roll
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 10:26:56 +01:00
zwitschi 9b65a93587 Narrow the Godot skinning blocker to the importer's rotated bind_pose
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-06 10:13:32 +01:00
zwitschi 56a14747d4 Record the pose-composition fix and the remaining Godot skinning-import blocker
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-06 10:00:07 +01:00
zwitschi 8b1bf736af Correct the pose composition for a non-180° rest (rest-relative swing axis), backward-compatible with the 13-core fallback
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 09:57:27 +01:00
zwitschi f121167e52 Record the arm-down bake fix and the remaining non-180° rest pose-composition task
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 09:52:13 +01:00
zwitschi 140a7ada0f Plan the 0.9.9-1.0.0 roadmap and re-evaluate the NPC base
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 48s
Move the gap analysis and risks into PLAN.md, version the character track
(0.9.9 rig correction, 0.9.10 roster) and split 0.9.11-0.9.12 polish and
verification out of the old 0.10.0 milestone. Add roadmaps to 0.10.0, 0.11.0
and 1.0.0, record the Quaternius face-fidelity gate and the rest-relative
pose finding in MEMORY.md, and move the completed 0.9.7 and pose-harness
sections to DONE.md.
2026-11-06 09:40:28 +01:00
zwitschi 5508f5510f Record the Quaternius pose-sync blockers (GLB skinning + non-180° rest pose formula)
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 09:25:45 +01:00
zwitschi 7baa2c4f54 Record the Quaternius pose-sync finding (swing axis needs per-bone calibration)
Full build / Import + headless tests (push) Successful in 50s
Full build / Full desktop build + optional release (push) Skipped
2026-11-06 08:35:29 +01:00
zwitschi 0cd12af994 Fix proxy pivot derivation to use global rest (local rest was misplacing the Quaternius joints)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 55s
2026-11-06 08:35:14 +01:00
zwitschi 271f10ac4d Map NpcAvatar bone sync and proxy pivots to the Quaternius 62-joint names with old-rig fallback
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 2m36s
2026-11-06 07:38:39 +01:00
zwitschi e2f52fbfd1 Accept ADR-0018 option 2: adopt the Quaternius 62-joint rig at runtime
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-05 21:39:38 +01:00
zwitschi f5fa321a8f Draft ADR-0018 (Stage 2 runtime rig) and mark the remaining contract-bake items blocked
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-05 21:38:26 +01:00
zwitschi a2ae9e03c3 Bake the rest pose, warp to the contract, and record the failing silhouette gate
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-05 21:01:26 +01:00
zwitschi cff3937c16 Mark the 62-to-13 joint map complete
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-05 20:49:05 +01:00
zwitschi 1ed9e05d9b Author the 62-to-13 joint map and align the AGENTS.md contract with the Quaternius base
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 50s
2026-11-05 20:48:55 +01:00
zwitschi 8c69f367b0 Record the owner directive: keep Quaternius at source detail during the contract bake
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-05 20:47:08 +01:00
zwitschi 2a7921bae6 Build and document the canonical quaternius_base.glb (welded, skinned, 62-joint, 1.81m)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 44s
2026-11-05 20:43:50 +01:00
zwitschi b419923637 Decide the Quaternius outfit scope: three full GLBs first, modular builder as the role fallback
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-05 20:41:23 +01:00
zwitschi c7fd4b59cc Inventory the Quaternius GLBs: meshes, 62 joints, 24 clips and the material-slot map
Full build / Import + headless tests (push) Successful in 55s
Full build / Full desktop build + optional release (push) Skipped
2026-11-05 20:40:59 +01:00
zwitschi 3fa3482608 Complete Quaternius intake record: verify SHA-256 and add the download date
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-05 20:39:39 +01:00
zwitschi 1049d8631e Compact MEMORY.md: drop the redundant session handoff, trim the AI-review entry 2026-11-05 20:38:26 +01:00
zwitschi deb74c53af Record the Quaternius pivot handoff in session memory 2026-11-05 19:44:26 +01:00
zwitschi 9968bc0a4c Rewrite NPC plans around the Quaternius base 2026-11-05 19:43:35 +01:00
zwitschi 2e1bb19e2c Correct the MPFB prototype glTF vertex count 2026-11-05 19:37:37 +01:00
zwitschi 5450dbf88a Correct the MPFB prototype glTF vertex count 2026-11-05 19:37:33 +01:00
zwitschi 79224c5acf Raise the NPC character budget to 24k and refine the prototype neck 2026-11-05 19:37:19 +01:00
zwitschi f0d4b81239 Record the AI-assisted asset review loop and MakeHuman OBJ transform gotchas in MEMORY.md
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-05 19:22:43 +01:00
zwitschi 48a9795248 Record the rejected prototype shirt-shell experiment 2026-11-04 21:31:45 +01:00
zwitschi a5e62534ce Fix the prototype crotch material and loosen the shirt 2026-11-04 21:26:00 +01:00
zwitschi cd7697cba4 Polish the MPFB prototype shoes, cuffs and shirt fit 2026-11-04 19:36:52 +01:00
zwitschi d2f773c7ad Polish the prototype shoes and thigh silhouette 2026-11-04 19:31:58 +01:00
zwitschi a3c3a37270 Smooth the prototype neck and shrink the shoes 2026-11-04 19:27:51 +01:00
zwitschi 8dd4f77901 Fix the MPFB prototype neck and ankle junctions 2026-11-04 19:22:22 +01:00
zwitschi ba444152c9 Record current MPFB body prototype measurement and neck review 2026-11-04 19:16:20 +01:00
zwitschi d56f14c6dd Document MPFB full-body NPC prototype status and seams 2026-11-04 18:53:19 +01:00
zwitschi b297c4543f Add MakeHuman head hair/body prototype and 12-variant rollout plan 2026-11-04 18:08:03 +01:00
zwitschi 958d3ae0ff Add reviewed MakeHuman head prototype (vision gate rejected) 2026-11-04 17:04:20 +01:00
zwitschi d1898b3221 Overhaul the head source: weld + relax the decimated MakeHuman head into one clean manifold shell
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 15:49:44 +01:00
zwitschi 2e1e4d7f70 Refine the MakeHuman head (weld lids/brows, add hair cap) and add the user review page
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 15:36:55 +01:00
zwitschi 0b2f124ffe Record the MakeHuman-head build outcome in the review doc and TODO
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 15:19:10 +01:00
zwitschi cdd2e02564 Add the MakeHuman-head character head source (head=mh) with project eyes/brows/mouth and CC0 attribution
Full build / Import + headless tests (push) Successful in 53s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 15:18:49 +01:00
zwitschi 632ec16aaa AI-driven head rework: judge picks the decimated MakeHuman head over the displacement shell
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 39s
2026-11-04 15:02:47 +01:00
zwitschi 30f240b591 Record the hand-gear verification status (open close-up done, gear context deferred to rollout)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 49s
2026-11-04 14:49:53 +01:00
zwitschi 58d1e79a12 Add the fused hand prototype (hand_l_proto/hand_r_proto) and record the finger-articulation decision
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-04 14:49:27 +01:00
zwitschi 44dba010a7 Prepare the head-prototype owner sign-off sheet (before/after at 1.85m)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-04 14:47:25 +01:00
zwitschi 2a53ec9aac Move _head_proto into blender_assets.py and add assemble --head-proto; verify prototype weights
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 14:45:02 +01:00
zwitschi f0f609fe1b Add head subdivision variants and pick s48 after 1.5m/1.85m comparison
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 43s
2026-11-04 14:42:13 +01:00
zwitschi b386a21173 Finish the head prototype: forehead slope, brow step, jaw step, defined ear helix/lobe
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-04 14:39:31 +01:00
zwitschi 00bd197173 Refine the head prototype: flatten face plane, taper jaw, nose/chin relief, fix ear-displacement sign
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-04 14:36:53 +01:00
zwitschi 4f1eb1f5bf Fix the part-name test for the new head_proto part
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 46s
2026-11-04 14:23:33 +01:00
zwitschi 50edc47480 Add the connected-shell head prototype (head_proto) with sculpted sockets/nose/lips/ears
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 45s
2026-11-04 14:23:19 +01:00
zwitschi b8d8869e03 Add the local npc_parts.py head/face/hand part pipeline with tests and docs
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
2026-11-04 14:17:20 +01:00
zwitschi 1b554df516 Record the tmp/npc-parts working-set layout decision
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 46s
2026-11-04 14:12:21 +01:00
zwitschi 5fdda88d46 Document the frozen npc_base fallback boundary
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 14:11:57 +01:00
zwitschi ecd50503e7 Define the measurable face/hands acceptance criteria for the model overhaul
Full build / Import + headless tests (push) Successful in 59s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 14:11:31 +01:00
zwitschi 2b6e774580 Record the NPC baseline inventory for the model overhaul (npc_base, 12 GLBs, builders, MakeHuman)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 40s
2026-11-04 14:10:36 +01:00
zwitschi dee939c2ee Consolidate documentation into architecture and merged guides
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-04 14:06:23 +01:00
zwitschi aec1fb7b69 Raise character limits and document optional Blender MCP
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 13:47:16 +01:00
zwitschi 50a48d2256 Plan the Blender NPC head and hands overhaul
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 13:36:18 +01:00
zwitschi 69f4f11633 Date the 0.9.8 release
Full build / Full desktop build + optional release (push) Successful in 13m27s
Full build / Import + headless tests (push) Successful in 1m33s
2026-11-04 12:28:38 +01:00
zwitschi d1fa25629e Bump to 0.9.8 and stage the weights-fix changelog entry
Full build / Import + headless tests (push) Successful in 8m22s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 12:26:56 +01:00
zwitschi 359bb9a8c7 Fix the hip/thigh collapse and knee pinch: rigid thigh/shin with a short knee blend
Full build / Import + headless tests (push) Successful in 8m52s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 12:26:23 +01:00
zwitschi 36576a023a Fix the wrist/hand detachment: wrist tracks the hand bone, sleeve cuff follows the hand, hand raised to meet the wrist
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 40s
2026-11-04 12:11:37 +01:00
zwitschi c1ccfd6e72 Review the pose/weight evidence: wrist detachment + hip/knee flexion are the P1 fixes
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 55s
2026-11-04 12:03:42 +01:00
zwitschi 27b8f9a249 Record the MakeHuman final-body swap and its remaining retopology refinement
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 54s
2026-11-04 12:02:40 +01:00
zwitschi d5a2c911a6 Record the 0.9.7 release: QA, clean build, v0.9.7 tag
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 12:00:44 +01:00
zwitschi 236fbf537f Date the 0.9.7 release
Full build / Import + headless tests (push) Successful in 49s
Full build / Full desktop build + optional release (push) Successful in 5m5s
2026-11-04 12:00:25 +01:00
zwitschi 588722fe7a Refresh the gallery for the 0.9.7 character pass
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-04 11:59:03 +01:00
zwitschi 7f2f06bf42 Re-plan releases: 0.9.7 character patch, 0.10.0 for all 3D/map improvements
Full build / Import + headless tests (push) Successful in 1m11s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:53:04 +01:00
zwitschi 6db3cc0873 Plan the finished character development as the 0.10.1 patch; MakeHuman targets 0.11.0
Full build / Import + headless tests (push) Successful in 3m6s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:49:13 +01:00
zwitschi 8938dd918c Taper the arm-scale falloff; record the remaining deltoid retopology gap
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 2m14s
2026-11-04 11:45:12 +01:00
zwitschi 742bfd3898 Paint the five tint slots on the MakeHuman body; record the retarget vision review
Full build / Import + headless tests (push) Successful in 3m23s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:43:50 +01:00
zwitschi 87069a30e8 Retarget the MakeHuman body to the 13-bone contract (arm-down + weights + skinning)
Full build / Import + headless tests (push) Successful in 1m42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:40:17 +01:00
zwitschi 3f5c5ce442 Prototype the MakeHuman intake: adapt the CC0 body to the character budget
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:30:14 +01:00
zwitschi 28fcd96b59 Add the external-mesh adapt intake command for the MakeHuman pipeline
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 46s
2026-11-04 11:27:43 +01:00
zwitschi e984129597 Fix the pose harness: disable the avatar process so the FSM cannot revert the pose
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 46s
2026-11-04 11:24:35 +01:00
zwitschi 75dea2e7c2 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
2026-11-04 11:15:54 +01:00
zwitschi 09d07452af Close the crowd-variety QA and release exit
Full build / Import + headless tests (push) Successful in 49s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:04:17 +01:00
zwitschi f5ee2b7408 Record the crowd-variety roster and the expanded budget in the docs
Full build / Import + headless tests (push) Successful in 55s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:03:55 +01:00
zwitschi 5980d329e8 Close the crowd-variant fit, reference and baseline items
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-04 11:03:25 +01:00
zwitschi 6052ea391b Wire the crowd variants into per-role pools and verify every seed resolves
Full build / Import + headless tests (push) Successful in 55s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 11:03:01 +01:00
zwitschi 4e8665e25b Add the four crowd-variety characters and extend the baseline to twelve
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-04 10:57:58 +01:00
zwitschi b945eb6e8f Fetch the licensed crowd-variety reference photos
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 10:47:44 +01:00
zwitschi 03c13c716a Record the qa-review sign-off: all eight characters ship with notes
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 10:44:29 +01:00
zwitschi 0a9c78cb30 Give the foliage two green tones and fix the textured_solid import bug
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-04 10:40:27 +01:00
zwitschi abe5c3f933 Update development-status: the face pass now covers all eight variants
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 47s
2026-11-04 10:33:20 +01:00
zwitschi 140ab42536 Apply the realistic face to the remaining seven variants and refresh the baseline
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 10:33:11 +01:00
zwitschi 8bdfd0176e Refresh the NPC baseline sheet and record the face prototype in development status
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 45s
2026-11-04 10:26:14 +01:00
zwitschi 4e23cc3ad5 Prototype a more realistic face on npc_casual (higher subdivision, brow ridge, both lids, fuller lip)
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 10:24:21 +01:00
zwitschi 8d32a8cac0 Record the map rebuild completion and the fresh NPC review against the new maps
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 10:03:14 +01:00
zwitschi 2445ddab34 Close the map-track J/L workstreams: procedural approach supersedes the facade kit
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 10:00:36 +01:00
zwitschi 8cacd510bf Record the rounded-corner simplification and close the local-map QA/exit
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:58:47 +01:00
zwitschi bf383aa0fa Note the Joke Shop facade-height fix in the review doc
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 48s
2026-11-04 09:48:47 +01:00
zwitschi 4bbc576b7f Lower the Joke Shop facade to 6 m so the canopy caps the low hall
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 44s
2026-11-04 09:48:20 +01:00
zwitschi 542b1264da Close the Comedy Store map recreation and document describe_image in asset-tooling
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:42:31 +01:00
zwitschi 56f4833c8e Record the local-map data, licensing and scope decisions (section H)
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:41:46 +01:00
zwitschi 1b31dfdbe4 Add the Ramada Plaza hotel tower mass behind the Joke Shop west neighbour
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:41:11 +01:00
zwitschi 5158efc467 Retire the unused beanie gear and sequence asset fixes after the map rebuild
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:36:10 +01:00
zwitschi ac0cf35cfb Fix the stale Joke Shop map count in the review doc
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:30:44 +01:00
zwitschi 6655edb5c6 Sync development-status with the 3D re-evaluation facade/prop work and current counts
Full build / Import + headless tests (push) Successful in 52s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:22:27 +01:00
zwitschi 60f389c16b Force-spawn the requested portrait role and close the hooded close-up
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:09:44 +01:00
zwitschi 3084145031 Rank the Comedy Store shape-language gaps (top-five list)
Full build / Import + headless tests (push) Successful in 50s
Full build / Full desktop build + optional release (push) Skipped
2026-11-04 09:04:30 +01:00
zwitschi 34bca89885 Record the set-dressing vision review findings
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 22:00:49 +01:00
zwitschi b53e8a67f9 Polish the bollard base and newspaper-box door (recessed slot + seam)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
2026-11-03 21:59:06 +01:00
zwitschi cdfd57fb65 Record the prop-gallery vision review findings
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 21:56:50 +01:00
zwitschi 5bab6754c0 Rebuild the fire hydrant silhouette (flange, bonnet, outlets)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 53s
2026-11-03 21:56:28 +01:00
zwitschi 7dd8251a0c Extract and reconcile the Comedy Store proportions via the vision tool
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
2026-11-03 21:50:20 +01:00
zwitschi 8e113a4110 Tighten the gap analysis register
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-03 21:02:01 +01:00
zwitschi 32c9c45605 Document the lighting vision review and add describe_image to the tools inventory
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 46s
2026-11-03 21:00:54 +01:00
zwitschi e4065c2068 Tie back the Joke Shop curtain bays and add the describe_image vision tool
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 20:58:05 +01:00
zwitschi e7d733bc93 Record the gear fit readings and caveats in the review doc
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-03 20:25:39 +01:00
zwitschi 93da916f90 Gate venue light falloff with a test (physical attenuation = 1.0)
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 39s
2026-11-03 20:14:23 +01:00
zwitschi e3ec4a356a Sync the stale Python test count (143 -> 160) in TODO
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
2026-11-03 20:13:10 +01:00
zwitschi 55339f23c1 Document the texel/coverage/collider gates and correct the face limitation note
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 48s
2026-11-03 20:12:43 +01:00
zwitschi a51dae2c33 White the Joke Shop canopy signature band to match the reference
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 20:07:01 +01:00
zwitschi 6824dd76a1 Close stale TODO items: camera height and local-frame provenance
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 20:04:22 +01:00
zwitschi fde4aa4d0a Record the two-builder distinction in MEMORY
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 20:03:15 +01:00
zwitschi ebb36cf0cb Correct face/head review: library characters already carry the 0.9.4 sculpt; close hands/grip review
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 20:03:06 +01:00
zwitschi 724e8b183f Add tracked AI skills for Blender assets and release QA
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 19:53:32 +01:00
zwitschi e4e1566e55 Organize tools and move Python tests into tools/tests
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 38s
2026-11-03 19:45:00 +01:00
zwitschi 0aacee6518 Compact MEMORY.md: drop CHANGELOG/DONE duplication
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 19:40:50 +01:00
zwitschi 215b843b67 Write the face/head concrete edits and close the review
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 19:27:31 +01:00
zwitschi 53d9dc3f78 Record the cloth/hair decision: simulation stays out of scope
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 19:26:50 +01:00
zwitschi 98f2f95f07 Close the UV/texel decision: accept the neutral runtime-tinted maps
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 54s
2026-11-03 19:26:30 +01:00
zwitschi a677a95d13 Narrow the pose-harness root cause: skinned mesh ignores its Rig parent
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 19:26:07 +01:00
zwitschi 1afd97c72d Complete the Comedy Store block reference collection (hotel + hillside)
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 19:18:43 +01:00
zwitschi 6ca8bcf034 Decouple AGENTS.md from specific tracks: keep only process, action and tracking guidance
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 19:16:57 +01:00
zwitschi 13eb4e0c87 Make the merged 3D + local map track coherent: rename, combined scope/exit, re-mark collection state
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 39s
2026-11-03 19:13:21 +01:00
zwitschi 8fac1b47cf 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
2026-11-03 18:41:21 +01:00
zwitschi b79e30e9df Render the TV Studio as the Masonic Temple facade (Jimmy Kimmel starting point)
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 18:35:15 +01:00
zwitschi 1e761e5a76 Anchor Jimmy Kimmel Live entrance concepts and mark the building as the starting point
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 45s
2026-11-03 18:28:31 +01:00
zwitschi 3eb2ae5e3c Collect Jimmy Kimmel Live and Hollywood block references; skip AVIF frames in the contact sheet
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
2026-11-03 18:24:35 +01:00
zwitschi 888897cac9 Add three multi-model Comedy Store scenes and plan the map recreation
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 18:04:09 +01:00
zwitschi 988d431da8 Generate multi-model anchored concepts, drop old Comedy Store refs, and trim the concept gallery
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 17:49:48 +01:00
zwitschi 87e1c9e7a5 Harden the DDG collector with token-bucket pacing and prefer the ddgs package
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 17:32:39 +01:00
zwitschi 480a1ba05f Document the local-only reference collector
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 17:12:32 +01:00
zwitschi 43c17ce3c0 Add the local-only DuckDuckGo reference collector
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 54s
2026-11-03 17:12:18 +01:00
zwitschi 03f4d4bc49 Prioritize local reference collection and record the licence-free local-only override
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 46s
2026-11-03 17:04:19 +01:00
zwitschi 15f9117517 Mark the completed maintenance tasks
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 16:35:33 +01:00
zwitschi 78267918bf Trim MEMORY.md: drop superseded handoffs and release anecdotes, fix stale counts and the sign-in contradiction
Full build / Import + headless tests (push) Successful in 48s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 16:35:19 +01:00
zwitschi ea3860a60c Defer Gaussian splatting and re-plan maintenance
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 16:31:42 +01:00
zwitschi b721f189c5 Record the stucco decision and the recitation-filter workaround
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 16:22:28 +01:00
zwitschi 634b1f75a3 Give the Joke Shop a dark stucco wall and a photo-anchored concept
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 48s
2026-11-03 16:22:20 +01:00
zwitschi 36583921cf Plan the Joke Shop building-appearance pass
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 16:17:57 +01:00
zwitschi 3866b0ae01 Record the completed facade-realism pass
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 16:15:46 +01:00
zwitschi 8c2761427f Verify the marquee emissive balance and close the facade-realism pass
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 16:15:38 +01:00
zwitschi 2b07913481 Update the facade-realism progress note
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 42s
2026-11-03 15:55:10 +01:00
zwitschi 768dd94bfc Balance the event-banner night emissive
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 45s
2026-11-03 15:54:58 +01:00
zwitschi f516d3e796 Record the Godot import-cache gotcha and ashlar decision
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 15:40:43 +01:00
zwitschi f95a685934 Use the photo-anchored ashlar limestone on the masonic facade
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 49s
2026-11-03 15:40:25 +01:00
zwitschi 05cb6a43cb Link the three-up boards from the venue map docs
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 15:11:09 +01:00
zwitschi 343b3348c2 Add three-up evidence boards for El Capitan and Joke Shop
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 15:09:18 +01:00
zwitschi ad91e71eeb Add the photo-anchored variant pass with night and overcast facade frames
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 40s
2026-11-03 15:04:20 +01:00
zwitschi 6e04c59589 Record the reference-anchored generation recipe in memory
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 15:00:00 +01:00
zwitschi e21ff30783 Add reference-anchored concept generation
Full build / Import + headless tests (push) Successful in 49s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 14:59:53 +01:00
zwitschi 5b306b1c52 Add the Commons reference-board research tool
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 40s
2026-11-03 14:51:31 +01:00
zwitschi f09a5e7937 Plan recent-photo tooling and reference-anchored generation
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
2026-11-03 14:36:13 +01:00
zwitschi 383f601bc9 Extend the Hollywood board with terrazzo, neighbour and night context
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 14:04:51 +01:00
zwitschi c46db76d85 Record that the TV Studio venue shares the Hollywood block
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 13:49:26 +01:00
zwitschi 1a5f2863b0 Add the licensed Joke Shop reference board
Full build / Import + headless tests (push) Successful in 45s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 13:41:25 +01:00
zwitschi a6fd77068a Add the first licensed Hollywood reference board
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 40s
2026-11-03 13:28:05 +01:00
zwitschi 4ed73fcc7b Add the real-location reference folder and provenance sidecar
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 12:42:13 +01:00
zwitschi c0ddce79e8 Record the imagery evidence model
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 12:22:11 +01:00
zwitschi 0c7c9a2b23 Plan reference imagery, generated boards and per-section captures
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 12:21:57 +01:00
zwitschi b94b87d096 Refresh the capture gallery and build captioned visual docs
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 12:08:33 +01:00
zwitschi 5dec59355a Gate library prop collision coverage across venues
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 11:58:00 +01:00
zwitschi fe3ba3054e Gate texel density and review scorecard coverage
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 11:52:19 +01:00
zwitschi 88a0793bba Record the verified pose-capture recipe and the harness defect
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 41s
2026-11-03 11:44:55 +01:00
zwitschi 1d4f718376 Narrow the pose-capture discrepancy to the harness and lock bone posing
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 45s
2026-11-03 11:24:44 +01:00
zwitschi 7a5b902797 Add a pose review harness and record the blocked pose capture
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 10:59:23 +01:00
zwitschi 2d67e14e52 Measure the 3D library and open the model review scorecard
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 10:39:45 +01:00
zwitschi 2443343f2b adjusted agents instructions, made more precise and incorporate blender skills 2026-11-03 10:38:39 +01:00
zwitschi 3e41cda591 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
2026-11-03 10:19:46 +01:00
zwitschi 84bc4137cb Add local pi agent session data to .gitignore 2026-11-03 10:13:34 +01:00
zwitschi 5dc3ef0f4c Add a Blender GLB intake inspection command
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 10:08:45 +01:00
zwitschi 6f3facff43 Install the Blender skills pack locally and keep it out of git
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 10:02:34 +01:00
zwitschi 51f537720f Reorder TODO and docs around character and map priorities
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 09:17:49 +01:00
zwitschi 08e9044593 Add commit, build and version discipline to agent workflow 2026-11-03 09:17:49 +01:00
zwitschi ad14410337 Expand the photo-driven Gaussian splatting map plan
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 43s
2026-11-03 09:07:07 +01:00
zwitschi 876fb59882 Add unversioned local map development section 2026-11-03 09:01:46 +01:00
zwitschi 979c6ad789 Make character development an unversioned TODO section 2026-11-03 08:24:55 +01:00
zwitschi 1921bfae91 Document the character development toolchain in the architecture
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 08:22:09 +01:00
zwitschi 78485259b7 Detail deferred MakeHuman local pipeline boundary 2026-11-03 08:00:47 +01:00
zwitschi fef3af44c0 Record NPC sourcing decision and crowd prototypes 2026-11-03 07:59:58 +01:00
zwitschi bfe3c5a701 Research NPC model sources and plan 0.11.0 expansion 2026-11-03 07:46:47 +01:00
zwitschi 46f1e41874 Define release-candidate balance acceptance targets
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-03 07:40:45 +01:00
zwitschi f48d87c84f Record the 0.10.0-rc.1 candidate build
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 46s
2026-11-03 07:36:03 +01:00
zwitschi a9658ecd81 Prepare the 0.10.0 release candidate 2026-11-03 07:33:20 +01:00
zwitschi b8507df346 Harden release publishing and document release blockers
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 45s
2026-11-03 07:32:21 +01:00
zwitschi 60bf9a8ef6 Add save migration fixtures and failure-mode coverage 2026-11-03 07:29:42 +01:00
zwitschi b51bdc8efe Open the 0.10.0 release-candidate milestone
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 39s
2026-11-03 06:20:36 +01:00
zwitschi a7b2852253 Record the v0.9.6 release build
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 39s
2026-11-03 06:19:38 +01:00
zwitschi 4bb2896819 Verify the 0.9.6 integration checkpoint
Full build / Import + headless tests (push) Successful in 53s
Full build / Full desktop build + optional release (push) Successful in 4m27s
2026-11-03 06:13:07 +01:00
zwitschi f5b8ef2e70 Prepare the 0.9.6 integration checkpoint 2026-11-03 06:11:17 +01:00
zwitschi 0044f5f065 Record the v0.9.5 release build
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 21:12:00 +01:00
zwitschi 4bc6390e9f Release 0.9.5 texture and material refinement
Full build / Import + headless tests (push) Successful in 46s
Full build / Full desktop build + optional release (push) Successful in 4m54s
2026-11-02 21:04:48 +01:00
zwitschi fb3da52438 Refine environment surfaces and skyline haze
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 20:38:58 +01:00
zwitschi d7220c1a0a Refine NPC fabric UVs and remove baked AO blotches
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 37s
2026-11-02 20:28:25 +01:00
zwitschi 31574b8d82 Raise NPC texture maps to 256
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 43s
2026-11-02 20:16:30 +01:00
zwitschi b60f67548d Record the v0.9.4 release build
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 43s
2026-11-02 19:58:40 +01:00
zwitschi a57b86cd48 Release 0.9.4 NPC visual optimization
Full build / Import + headless tests (push) Successful in 47s
Full build / Full desktop build + optional release (push) Successful in 5m28s
2026-11-02 19:51:36 +01:00
zwitschi dfe5056303 Round the NPC shoes and responder boots
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:38:40 +01:00
zwitschi 58cf12fd1d Move hand gear forward into the palm
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 40s
2026-11-02 19:33:42 +01:00
zwitschi 7150bd7673 Verify NPC headgear clearance after the face pass
Full build / Import + headless tests (push) Successful in 34s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:30:19 +01:00
zwitschi 12e70357c5 Refine the NPC nose, mouth and ears
Full build / Import + headless tests (push) Successful in 35s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:29:19 +01:00
zwitschi 7dc3d3c873 Raise the character mesh budget to 8000
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 33s
2026-11-02 19:25:41 +01:00
zwitschi cd5e0e0ff7 Record the NPC vertex-cap constraint
Full build / Import + headless tests (push) Successful in 36s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:22:34 +01:00
zwitschi 8ce62e7556 Group the NPC visual changes under Changed
Full build / Import + headless tests (push) Successful in 35s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:15:15 +01:00
zwitschi 24c939d388 Rebuild the NPC hands and add a hand capture
Full build / Import + headless tests (push) Successful in 50s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:14:55 +01:00
zwitschi 48082c3dfa Taper the NPC torso into the hips
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:11:28 +01:00
zwitschi 03c355e7c1 Recess NPC eyes and sculpt the jaw and cheeks
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:08:26 +01:00
zwitschi 15ab8c686d Smooth the NPC neck and shoulder transition
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
2026-11-02 19:03:38 +01:00
zwitschi ab9c67d266 Audit NPC body proportions against a shared guide
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
Measure all eight exported characters and record the stylized proportion bands. All variants pass; no skeleton or mesh rescale was needed.
2026-11-02 18:54:52 +01:00
zwitschi 7c1a4bfd69 Refit the tourist backpack and photo prop
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped
Hide the tourist photo-pose bag outside camera poses, flatten the backpack straps onto the chest, rebuild the gear GLB/AO and publish the before/after NPC sheet.
2026-11-02 18:39:03 +01:00
zwitschi e7ee177c31 Establish the 0.9.4 NPC visual baseline
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 38s
Add a neutral 48-frame character contact sheet, acceptance criteria and ranked baseline gaps, plus repeatable sheet/comparison tooling. No character GLB or runtime mesh changes.
2026-11-02 18:13:57 +01:00
zwitschi c1cd4898e8 Close the 0.9.3 UI polish milestone
Full build / Import + headless tests (push) Successful in 36s
Full build / Full desktop build + optional release (push) Skipped
Add deterministic captures 14-21 for the remaining screen-design states, fix the panel/button layout issues they exposed, and record 21/21 compare and judge results. Bump the source to 0.9.3 and move the completed milestone to DONE.md.
2026-11-02 17:57:40 +01:00
Gig Line Dev e805a91ad3 Add end-to-end interaction flow smoke
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
- Boot the real scene and verify inspection allow/deny, normal vs emergency radio, Help filtering, wand allow/deny and review return-to-menu.
- Document the flow coverage and smoke command; mark the 0.9.3 end-to-end audit complete.
2026-11-02 16:36:01 +01:00
Gig Line Dev 7315166361 Guard destructive settings and radio actions
Full build / Import + headless tests (push) Successful in 36s
Full build / Full desktop build + optional release (push) Skipped
- Route reset campaign and tutorial replay through one reusable confirmation dialog; repeated presses cannot stack or emit twice.
- Keep emergency hold-to-send single-shot and cover the post-submit release.
- Add destructive-action regression checks, strings and documentation.
2026-11-02 16:29:26 +01:00
Gig Line Dev f6aa26e6ca Harden UI layout for font scale and long strings
Full build / Import + headless tests (push) Successful in 36s
Full build / Full desktop build + optional release (push) Skipped
- Measure and cap the HUD target chip after each font-scale change; clip HUD top labels.
- Ellipsize long action-button labels so panels cannot grow past the viewport.
- Add accessibility/button layout assertions and refresh the gallery captures.
- Record the font/layout pass in TODO, docs, changelog and memory.
2026-11-02 16:23:46 +01:00
Gig Line Dev 26e6dd6413 Close every top modal through one Esc and right-click path
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
- Add Help, Settings, Pause and review to the top-modal close chain so right-click and Esc behave consistently.
- Restore the venue menu after menu Settings and prevent Help from opening Pause behind itself.
- Reopen pause after in-shift Settings apply and recapture the mouse/unfreeze state on close.
- Extend the session smoke for menu Settings, right-click Help and guard unfreeze.
2026-11-02 16:10:50 +01:00
Gig Line Dev 8f65751975 Add wrapping keyboard and gamepad focus rings
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 36s
- Link every modal's enabled controls into a wrapping UiFocus ring and give each screen a default focus target.
- Add gamepad A/B bindings for ui_accept/ui_cancel; include Start menu footer actions and Continue in its focus ring.
- Skip hidden/disabled controls, close focus traps via per-modal cancel behavior, and return review to the menu on cancel.
- Record the focus audit and add regression coverage.
2026-11-02 16:05:53 +01:00
Gig Line Dev 9692f262f1 Unify action-button states across the UI
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 39s
- Add UiStyles with explicit normal, hover, pressed, focus and disabled styles and apply it to every action button.
- Disable timeline Previous/Next at the first/last event and keep Close always available.
- Style settings reset-dialog buttons and cover the button-state audit in docs/ui-copy.md.
- Add shared-state and timeline-boundary regression tests.
2026-11-02 15:04:38 +01:00
Gig Line Dev 98c31fe44c Audit and fix NPC, door-staff and UI dialogue
Full build / Import + headless tests (push) Successful in 40s
Full build / Full desktop build + optional release (push) Skipped
- Route the Reason verb through authored reason contexts and give every shared archetype an in-character answer.
- Add Hollywood wristband and TV Studio ticket/credential door-staff lines.
- Clarify radio cancellation, Ask terminology, start hints and campaign-reset copy.
- Record the dialogue audit and length findings in docs/ui-copy.md; add regression tests.
2026-11-02 14:44:01 +01:00
Gig Line Dev daf0926d91 Bump source to 0.9.2 and renumber the 0.x roadmap
Full build / Import + headless tests (push) Successful in 36s
Full build / Full desktop build + optional release (push) Skipped
- Set project.godot to 0.9.2 and add the matching changelog entry.
- Renumber the postponed work to 0.9.3 UI, 0.9.4 NPC, 0.9.5 textures and 0.9.6 integration, with 0.10.0 as the next minor release candidate.
- Remove the 1.0.0 milestone and post-1.0 planning; plan only 0.x patch/minor increments.
- Synchronize README, PLAN, architecture, status, memory and UI-copy version references.
2026-11-02 14:39:50 +01:00
Gig Line Dev f71a36faa1 Pass the pre-build NPC review gate
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 34s
- Add a review harness that stages all eight library characters at portrait, conversation and crowd distance on both maps in day and night.
- Fix the final-context lanyard badge and firefighter helmet fit with runtime attach offsets; the asset-space gear contract is unchanged.
- Record the gate sign-off, refresh the gallery, and move the completed review to DONE.
2026-11-02 14:32:10 +01:00
Gig Line Dev 37f925c7ad Rebuild the Joke Shop as the Sunset Strip block
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
- Replace the alley with the 27 m Comedy Store-inspired hall, signature canopy, circular blade sign, red curtain bays, west entrance, low-rise neighbours, dry hillside and opposite frontage.
- Add day/night/across-street concept frames and real-site mapping notes.
- Expose the Joke Shop day stage in the realism captures and refresh the gallery shots.
- Render multiline HUD/wand strings correctly and list carried items in the wand panel.
- Add the Joke Shop layout/budget tests and update docs, roadmap and changelog.
2026-11-02 14:10:07 +01:00
zwitschi 74dc1fdc1d Map 1: rebuild Hollywood as the El Capitan landmark
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
Replace the generic boulevard facade with a stylized 6840 Hollywood Blvd block: six Ionic columns, eight stone steps, Masonic frieze/medallions, event banners, side doors, El Capitan Theatre and retail neighbours, Ovation Hollywood arcade, Walk of Fame and four-lane street markings.

Add the Day and Night Hollywood venue-menu rows. Night uses a phase-time offset so a full-length shift stays in LATE while the clock starts at zero; late routine traffic keeps the street populated and the offset round-trips through checkpoint restore.

Retune local-light falloff to linear attenuation, add a cool north sky fill, and use the smooth limestone facade texture. Refresh the staged gallery and map references; add geometry-budget, menu, night-offset and late-traffic tests.
2026-11-02 12:34:48 +01:00
zwitschi 3f335481d6 Prioritize map optimization and gate builds on an NPC revisit
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
Move the promoted 0.9.5 map work to the active milestone, postpone UI/NPC
detail/texture/integration/release-candidate work, and add a detailed pre-build
NPC gate that reviews portraits, gear fit, crowd distance and final lighting
before any build or tag.
2026-11-02 11:27:50 +01:00
zwitschi af923b1483 Route UI labels through the string table
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped
Move start menu, settings, pause, Help, HUD, radio, shift review and campaign
labels/templates into content/strings.en.json, including placeholder-validated
dynamic status text. No player-facing hardcoded labels remain outside dynamic
data/debug output. Headless 250/250, docs check OK.
2026-11-02 11:25:15 +01:00
zwitschi 3a74cedee0 Refresh gallery and record the screen-design judge
Full build / Import + headless tests (push) Successful in 37s
Full build / Full desktop build + optional release (push) Skipped
Regenerate the committed screenshot gallery on the current build, run compare
(13 good/0 bad) and the automatic-model judge (13/13 match, 0 diff), and record
the result. Update the 0.9.2 visual checklist items.
2026-11-02 11:18:36 +01:00
zwitschi 844e39246a Standardize button labels and document UI states
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped
Finish the button-label audit with a surface-by-surface table, clarify Quit
game vs Quit to menu, rename Apply to Apply settings, and use string-table
keys for the new labels. Extend the smoke checklist with UI copy/button checks.
Headless 250/250, docs check OK.
2026-11-02 11:12:29 +01:00
zwitschi 7c48183410 Start the UI copy and button consistency pass
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
Add the screen/copy/button inventory and canonical terminology, standardize
inspection/wand admit-refuse hints, name the review action Return to menu, and
move radio action/hold/status labels into the string table. Headless 250/250,
Python 97/97, docs check OK.
2026-11-02 11:10:39 +01:00
zwitschi 64590fe797 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.
2026-11-02 10:55:38 +01:00
zwitschi 49bfccc808 Add a docs README and link checker
Full build / Import + headless tests (push) Successful in 39s
Full build / Full desktop build + optional release (push) Skipped
Add tools/check_docs.py to require READMEs only in tracked docs directories,
validate local links and verify every tracked image is linked. Gitignored
generated files such as realism runs are exempt. Document the command and add
unit tests. Python 97/97.
2026-11-02 10:52:15 +01:00
zwitschi 7401d4bca0 Do not require READMEs in generated realism folders
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 39s
Remove generated README files from docs/screens/realism and update the screens
index to treat realism as a gitignored local QA directory with no README gate.
2026-11-02 10:50:20 +01:00
zwitschi e79a37beba Add documentation folder READMEs and visual previews
Full build / Import + headless tests (push) Successful in 36s
Full build / Full desktop build + optional release (push) Skipped
Create an index README in docs/ and every tracked docs subfolder, with relative
image galleries for Blender previews, screen designs, screenshots and concepts.
Generated realism-run READMEs were also created on disk but remain gitignored.
Validate all Markdown/image links.
2026-11-02 10:49:42 +01:00
zwitschi fbd2ab2cb3 Disable unreliable Gitea Godot cache steps
Full build / Import + headless tests (push) Successful in 35s
Full build / Full desktop build + optional release (push) Skipped
Gitea cache restores were inconsistent and cache saves timed out or were
rejected as reserved by another job. Remove the cache steps and keep direct
4.7.2 downloads; document the evaluation and when to retry. The workflow is
otherwise clean (no .github/ci.yml exists).
2026-11-02 09:51:59 +01:00
zwitschi 9b8f513f9f Trim the Godot template cache and separate CI cache keys
Full build / Import + headless tests (push) Successful in 2m24s
Full build / Full desktop build + optional release (push) Skipped
Cache only Linux/Windows/macOS/Web release templates instead of the full 1.2 GB
archive, and use distinct binary cache keys for the checks and build jobs so
concurrent runs do not fight over the same cache entry.
2026-11-02 09:48:05 +01:00
zwitschi ad12fdad7e Bump to 0.9.1 and record the toolchain update
Full build / Import + headless tests (push) Successful in 2m23s
Full build / Full desktop build + optional release (push) Successful in 9m44s
2026-11-02 09:28:13 +01:00
zwitschi 87612f2057 Unify the Godot 4.7.2 CI environment and cache it
Full build / Import + headless tests (push) Successful in 2m30s
Full build / Full desktop build + optional release (push) Skipped
Update project features and CI installs/templates to Godot 4.7.2, remove the
old version matrix, and cache the Godot binary and export templates with Gitea
Actions cache. Update release/docs/version references accordingly. Project
import and headless tests pass locally under 4.7.2.
2026-11-02 09:25:08 +01:00
zwitschi ffd98daf08 Plan the pre-RC patch levels
Full build / Import + headless tests (push) Successful in 38s
Full build / Full desktop build + optional release (push) Skipped
Add detailed 0.9.1 UI/dialog/button polish, 0.9.2 NPC model refinement,
0.9.3 texture/material refinement and 0.9.4 integration/performance/judge
workstreams before the 0.9.5 release candidate. Update the remaining-gap table,
baseline to v0.9.0 and README development status.
2026-11-02 09:16:33 +01:00
zwitschi f811e6054d Expand the 0.9.5 release-candidate checklist
Full build / Full desktop build + optional release (push) Skipped
Full build / Import + headless tests (push) Successful in 38s
Replace the remaining-gap table with v0.9.0 baselines and break the release
candidate into detailed workstreams for content lock/playtests, balance,
save migration, release engineering, legal/credits, documentation/visual
sign-off and final QA. Sync the README development status to v0.9.0.
2026-11-02 08:54:39 +01:00
zwitschi 9d37e0a1c5 Bump the project version to 0.9.0
Full build / Full desktop build + optional release (push) Successful in 5m0s
Full build / Import + headless tests (push) Successful in 36s
2026-11-01 21:48:03 +01:00
zwitschi 883626a067 Ship the 0.9.0 production-quality milestone
Full build / Import + headless tests (push) Successful in 42s
Full build / Full desktop build + optional release (push) Canceled after 4m58s
Add mixer/accessibility settings, caption/reduce-motion hooks, audio volume
clamping, a 24-NPC performance smoke and shortened coat/dress stride for hem
clipping. Record the explicit Godot 4.3-CI/4.7-local matrix and the 0.9
production scope. Headless 250/250, Python 94/94, 24-NPC budget smoke passes.
2026-11-01 21:46:42 +01:00
zwitschi b5d4d5fb87 Plan detailed 0.9.0 production-quality steps
Full build / Import + headless tests (push) Successful in 43s
Full build / Full desktop build + optional release (push) Skipped
Expand the next milestone into animation, audio, localization, accessibility,
performance/platform, QA/visual baselines, Godot-version policy and exit
criteria, with concrete verification work per workstream.
2026-11-01 21:39:29 +01:00
363 changed files with 20882 additions and 2757 deletions

No files matched your search

View File
Whitespace-only changes.
@@ -0,0 +1,212 @@
---
name: gig-line-blender-asset-contract
description: Use when adding, rebuilding, auditing or fixing any Gig Line Blender-authored character, NPC base, gear, prop or venue geometry. Covers the required 13 core bones (optional extra bones allowed), five tint slots, 24,000/24,000 character budgets, gear attach space, 256² texture/AO rules, headless flatpak Blender commands, optional MCP guidance, and the inspect/audit/fit/proportion/capture gates. Do not use for pure GDScript/UI work or release publishing.
compatibility: Gig Line repository checkout. Godot 4.7.2 on PATH; Blender 5.2 LTS via the org.blender.Blender flatpak for build/bake/render. Audit, fit, inspect and proportion checks are stdlib-only.
metadata:
project: Gig Line
domain: 3d-assets
version: "1.0.0"
triggers: Blender, NPC, character, gear, prop, npc_base, GLB, AO, texel, asset rebuild, fit, audit
---
# Gig Line Blender Asset Contract
Use this skill for any change that touches:
- `assets/models/blender/**`
- `assets/models/generated/npc_base.glb`
- `assets/textures/npc/**`
- `tools/blender_assets.py`, `tools/npc_pipeline.py`, `tools/bake_ao.py`,
`tools/npc_proportions.py` or `tools/npc_baseline.py`
- Blender-authored venue/prop geometry
The project contract and measured gates override any generic Blender advice.
Blender MCP is optional interactive tooling; the headless flatpak CLI remains
authoritative and CI never needs Blender or MCP. The `blender-skills` pack is
optional, local guidance only, and gitignored. Setup and safety are in
`docs/assets/asset-tooling.md#optional-interactive-blender-mcp`.
## Read first
From the repository root, read the relevant sources rather than relying on this
skill alone:
1. `AGENTS.md` — required workflow and verification.
2. `TODO.md` and `MEMORY.md` — current track, claimed tasks, known gotchas.
3. `docs/assets/blender-assets.md` — library contract and command reference.
4. `docs/assets/asset-tooling.md` — exact rebuild/bake/capture commands.
5. `docs/assets/npc-model-sourcing.md` and `docs/assets/3d-model-review.md` — accepted limits,
scorecards and known blockers.
6. `docs/design/known-limitations.md` — limits that must not be silently “fixed” into
contract changes.
The contract lives in code and docs, not in this skill. If they disagree, stop
and resolve the source of truth before editing assets.
## Non-negotiable contract
| Area | Rule |
| --- | --- |
| Mesh root | `npc_base` mesh node, skinned under `Rig`; preserve the limb node names. |
| Bones | The 13 required core bones: `Head`, `HipL/R`, `KneeL/R`, `ShoulderL/R`, `ElbowL/R`, `HandL/R`, `Spine`, `Neck`. Optional extra bones (fingers, face, toes) are allowed; they must not move the core rest positions or break animation proxies. |
| Tint slots | `skin`, `cloth`, `pants`, `accessory`, `hair`. |
| Orientation | Front is Blender −Y / Godot +Z; feet grounded near y = 0; metres. |
| Character budget | **24,000 triangles / 24,000 glTF vertices** per character (`CHAR_MAX_TRIS`/`CHAR_MAX_VERTS`). |
| Frozen fallback | `npc_base` remains the low-poly fallback; it shares the 24,000/24,000 cap but is not required to use it. Do not silently lower the cap. |
| Gear budget | **1,500 triangles** per gear piece; authored in attach-point space. |
| Prop budget | **4,000 triangles** per prop. |
| Gear attach | Use the catalogued attach points; verify with `fit`. Runtime `GEAR_OFFSETS` (lanyard forward, firefighter helmet up) and `HAND_ITEM_FORWARD` are intentional, not asset-contract changes. |
| Textures | 256² albedo/normal/ORM maps. Cloth and pants use `NPC_FABRIC_UV_SCALE = (4,4,1)` and **skip** baked per-character AO; skin/hair/gear keep baked AO. |
| CI | Offline and skill-free. Committed GLBs/AO/maps must make CI pass without Blender or MCP. |
| Licensing | No new asset source without ADR-0015: CC0, or CC-BY with attribution in `CREDITS.md`; record provenance. |
Do not change the renderer, engine baseline, runtime dependency graph or the
`npc_base` contract as part of an asset pass.
## Workflow
### 1. Preflight and claim
```bash
git status --short
git log --oneline -5
godot --version
flatpak run org.blender.Blender --version | head -3
```
Inspect the current asset and the relevant docs. Claim the TODO item with `[-]`
before starting. Work on one asset family per commit.
### 2. Establish a baseline
Run the checks that do not need Blender first:
```bash
python3 tools/blender_assets.py audit
python3 tools/blender_assets.py fit
python3 tools/blender_assets.py texels
python3 tools/npc_proportions.py report
python3 tools/npc_pipeline.py audit
```
For a specific incoming or existing GLB:
```bash
flatpak run org.blender.Blender --background \
--python "$PWD/tools/blender_assets.py" -- \
inspect --file "$PWD/path/to/asset.glb" --category npc_gear --json
```
Record the before measurements (tris/verts, head/shoulder/hip/leg/arm/foot,
fabric texel density, gear clearance). Do not “improve” an asset without a
measurable target.
### 3. Optional Blender-skill routing
If the local `blender-skills` pack is installed, load `blender-director`, then
only the specialists the task needs:
- character mesh/face/hands: `character-artist`, `retopology`
- rig/weights/pose: `rigging`
- UVs/texel density: `uv-workflow`
- maps/materials: `texture-workflow`, `materials`, `lookdev`
- gear/props: `prop-artist`, `hard-surface`
- budget/LOD/collision: `asset-optimization`, `lod-pipeline`, `collision-proxy`
- final review: `qa-review`
If MCP is available, use it for interactive part exploration only; mirror the result into a scripted change or local `.blend`, then re-export and run the CLI audit/fit gates. Never make the build, CI, tests or runtime depend on MCP. Setup: `docs/assets/asset-tooling.md#optional-interactive-blender-mcp`.
### 4. Build or bake
Characters, gear and library props:
```bash
flatpak run org.blender.Blender --background \
--python "$PWD/tools/blender_assets.py" -- build --only <name>
flatpak run org.blender.Blender --background \
--python "$PWD/tools/bake_ao.py" -- --only <name>
```
NPC base and its material maps:
```bash
python3 tools/npc_pipeline.py prepare # only when fabric tiles change
flatpak run org.blender.Blender --background \
--python "$PWD/tools/npc_pipeline.py" -- build
python3 tools/npc_pipeline.py audit
```
Do not overwrite a review image or a promoted texture pick. Use a new `-vN`
path and document the promotion.
### 5. Import and capture
```bash
godot --headless --path . --import
godot --headless --path . --script res://src/test/test_runner.gd
# neutral baseline: 8 variants x 6 views, raw frames stay in tmp/
godot --path . --script res://src/test/capture_npc_baseline.gd \
-- --out=res://tmp/npc-baseline
# final-context: 96 frames across both venues and day/night
godot --path . --script res://src/test/capture_npc_review.gd \
-- --out=res://tmp/npc-review
```
Compare before/after with `tools/npc_baseline.py compare`; do not replace the
committed baseline sheet until a fix actually lands. See
`references/verification.md` for the full gate matrix.
### 6. Verify and hand off
At minimum:
- `blender_assets.py audit` and `fit` exit 0.
- `npc_proportions.py` passes the stylized guide.
- `npc_pipeline.py audit` passes if the base/textures changed.
- texel density is inside the authored/fabric bands.
- No character exceeds 24,000/24,000; gear/prop caps hold.
- 24-NPC budget and Web/Compatibility path remain green.
- Contract tests, headless suite, capture gates and docs check pass.
- The diff contains only the intended assets, tools, tests and docs.
State in the handoff: files changed, measurements before/after, skills used,
gates run, and any accepted limit.
## Failure playbook
- **`Class "..." hides a global script class`** — a stray `.gd` backup is in the
project. Delete `tmp/*.gd` backups, `rm -rf .godot`, re-import; never keep
`class_name` copies in `tmp/`.
- **Blender cannot see the path** — the flatpak cwd is `/app/blender`; use
absolute paths (`"$PWD/..."`).
- **Empty or stale captures** — close modals/pause, check the capture script's
settle frames, and remove stale output directories before re-running.
- **Pose harness mismatch** — the current `capture_npc_pose.gd` is blocked per
`docs/assets/3d-model-review.md`; do not use its frames as pose evidence until the
recipe is fixed.
- **Asset test fails after import** — re-run audit/fit first, then import; if the
manifest or AO path changed, rebuild the affected asset rather than editing
the manifest by hand.
- **Uncertain about a visual change** — produce a labelled before/after sheet and
ask for review; do not hide a regression behind a budget claim.
## Bundled references
- [`references/asset-contract.md`](references/asset-contract.md) — full contract,
inventory, file locations and provenance rules.
- `docs/assets/asset-tooling.md#optional-interactive-blender-mcp` — optional MCP installation, connection, safety and
part-workflow instructions.
- [`references/verification.md`](references/verification.md) — command matrix,
capture gates, expected results and acceptance criteria.
## Do not
- Make the build, CI, tests or runtime depend on MCP, Blender or API calls.
- Change the bone/tint/contract to make a generic asset fit.
- Rewrite committed baselines or overwrite existing images.
- Commit `.blend` sources, raw captures or generated AI inputs.
- Treat an asset audit as a substitute for visual review at portrait and crowd
distance.
@@ -0,0 +1,141 @@
# Asset Contract Reference
This is a working summary. The authoritative sources remain
`docs/assets/blender-assets.md`, `docs/assets/asset-tooling.md`, ADR-0013, the tests in
`src/test/tests/` and the constants in `tools/blender_assets.py` /
`tools/npc_pipeline.py`.
## Library inventory
- **Character variants (8):** `npc_casual`, `npc_jacket`, `npc_coat`,
`npc_vest`, `npc_dress`, `npc_hoodie`, `npc_firefighter`, `npc_guard`.
- **Frozen fallback:** `npc_base` / `assets/models/generated/npc_base.glb`.
- **Gear:** 18 attach-space pieces covering head, back, chest and hand items.
- **Library props:** 20 Blender-authored props plus 6 generated props.
- **Venues:** procedural venues in `src/game/world_builder.gd`; Blender venue
geometry follows the same budgets and collision/provenance rules.
## Skeleton and geometry
The required contract skeleton has 13 core bones:
```text
Head, Spine, Neck,
HipL, HipR,
KneeL, KneeR,
ShoulderL, ShoulderR,
ElbowL, ElbowR,
HandL, HandR
```
Optional extra bones (fingers, face controls, toes) are allowed if they do not
move these core rest positions and do not break `NpcAvatar`'s animation proxies.
Requirements:
- `npc_base` mesh node exists and is skinned under `Rig`.
- Limb node names stay stable for `NpcAvatar` and tests.
- Front is Blender −Y / Godot +Z.
- Feet are grounded at approximately y = 0; no floating origin.
- Units are metres; character height is approximately 1.8 m.
- No zero-area/duplicate degenerate faces in the exported mesh.
- Every character has UVs in [0,1] unless a planned UDIM/atlas change is
explicitly accepted.
## Material slots
Exactly these five tint slots:
```text
skin, cloth, pants, accessory, hair
```
- Neutral albedo is authored in Blender; runtime tinting is authoritative.
- Slot names are contract values; do not rename or add a sixth slot casually.
- The procedural fallback (`NpcAvatar._build_body`) must keep working when the
GLB is missing.
## Budgets
| Asset | Limit |
| --- | --- |
| Character (library and base fallback) | 24,000 triangles / 24,000 glTF vertices |
| Gear piece | 1,500 triangles |
| Prop | 4,000 triangles |
| Library prop/venue total | must stay inside the venue tests and library budget |
`CHAR_MAX_TRIS`, `CHAR_MAX_VERTS`, `GEAR_MAX_TRIS`, `PROP_MAX_TRIS` and related
constants live in `tools/blender_assets.py`. The budget is per character, not an
average. Measure after every mesh change. Do not lower the cap to make a diff
pass.
## Gear and hand items
- Gear is authored in the attach-point space documented by `GEAR` /
`GEAR_ATTACH` / `ATTACH_BLENDER`.
- `blender_assets.py fit` measures gear boxes against the character's head band,
clothing radius and back clearance.
- Runtime offsets are intentional:
- `NpcAvatar.GEAR_OFFSETS = {"lanyard": Vector3(0,0,0.04),
"firefighter_helmet": Vector3(0,0.03,0)}`
- `NpcAvatar.HAND_ITEM_FORWARD = Vector3(0,0,0.04)`
- An offset is **not** an authored-asset change; do not bake it into the GLB
without a separate contract decision.
- Open-palm grip (no finger-curl rig) is the accepted stylized limit.
## Textures and AO
- NPC maps are 256² albedo + normal + packed ORM.
- `TEX_SIZE = 256` in `tools/npc_pipeline.py`.
- Fabric UV scale is `Materials.NPC_FABRIC_UV_SCALE = Vector3(4,4,1)`.
- Cloth/pants skip the per-character baked AO; skin/hair/gear keep it. This
avoids the large blotchy magnification that appeared at 256².
- Gear/props may have their own AO maps; `tools/bake_ao.py` writes
`<name>_ao.png` next to the GLB and Godot wires it into the AO channel.
- Never overwrite an existing committed image; use a new `-vN` candidate and
promote only after review.
- Run `python3 tools/asset_pipeline.py audit <path>` and the relevant
`npc_pipeline.py audit` before committing map changes.
## File map
| Path | Role |
| --- | --- |
| `tools/blender_assets.py` | Catalogue, builders, audit/fit/inspect/texels/sheet. |
| `tools/npc_pipeline.py` | `npc_base` builder, texture preparation and audit. |
| `tools/bake_ao.py` | Blender AO bake into `<name>_ao.png`. |
| `tools/npc_proportions.py` | Exported-GLB proportion audit (no Blender). |
| `tools/npc_baseline.py` | Contact sheets/comparisons (no Blender). |
| `assets/models/blender/manifest.json` | Generated asset manifest. |
| `assets/models/blender/**/*.glb` | Committed library assets. |
| `assets/models/generated/npc_base.glb` | Frozen NPC fallback. |
| `assets/textures/npc/*_{albedo,normal,orm}.png` | Committed NPC maps. |
| `src/test/capture_npc_baseline.gd` | 48-frame neutral baseline. |
| `src/test/capture_npc_review.gd` | 96-frame final-context review. |
## Provenance and source rules
- Procedural Blender assets are project-owned.
- External/CC assets need ADR-0015 clearance: CC0 preferred, CC-BY only with
attribution in `CREDITS.md`; no service assets with redistribution limits.
- Editable `.blend` files under `assets/models/blender_src/` are gitignored;
only exported `.glb`, AO maps, manifests and committed preview sheets ship.
- AI-generated source images are development inputs, not shipped assets. Keep
raw generations under gitignored paths until picked, checked and credited.
- Do not copy a downloaded/Street View/AI reference into a committed asset
without the licence and provenance review.
## Verification invariants
The asset pass is not complete unless:
1. `python3 tools/blender_assets.py audit` exits 0.
2. `python3 tools/blender_assets.py fit` exits 0 and the report is reviewed.
3. `python3 tools/npc_proportions.py report` passes the stylized guide.
4. `python3 tools/npc_pipeline.py audit` passes when the base/textures changed.
5. The 48-frame baseline and 96-frame final-context review are captured, with no
blank frames.
6. The 24-NPC budget smoke is inside its frame budget.
7. The full Godot suite and Python tooling tests pass.
8. No runtime contract, renderer or dependency changed except the rebuilt
assets and their generated metadata.
@@ -0,0 +1,130 @@
# Verification Matrix
Run from the repository root. Stop and fix the first failure before continuing.
## Environment
```bash
godot --version
flatpak run org.blender.Blender --version | head -3
git status --short
```
Expected: Godot 4.7.2; Blender 5.2 LTS flatpak; clean or intentionally scoped
working tree. Blender's flatpak cwd is `/app/blender`; all paths passed to
Blender must be absolute.
## Asset checks
| Check | Command | Expected |
| --- | --- | --- |
| Contract audit | `python3 tools/blender_assets.py audit` | exit 0, no `BAD` assets |
| Gear fit | `python3 tools/blender_assets.py fit` | exit 0; review head band/clothing/back clearances |
| Texture/texel density | `python3 tools/blender_assets.py texels` | authored 40–400 px/m; fabric ≥250 px/m |
| NPC base | `python3 tools/npc_pipeline.py audit` | exit 0, contract bones/slots/maps |
| Proportions | `python3 tools/npc_proportions.py report` | all eight inside the stylized guide |
| Single incoming GLB | `flatpak run org.blender.Blender --background --python "$PWD/tools/blender_assets.py" -- inspect --file "$PWD/path.glb" --category <cat> --json` | contract result and measurements |
| Part GLB (local) | `flatpak run org.blender.Blender --background --python "$PWD/tools/npc_parts.py" -- inspect --file "$PWD/tmp/npc-parts/<variant>/<part>.glb"` | measurements; a part GLB is not a shipped asset |
| Prop audit | `python3 tools/model_pipeline.py audit` | exit 0 when generated props changed |
| Texture audit | `python3 tools/asset_pipeline.py audit assets/textures/ai/game_ready` | exit 0 when textures changed |
## Build/bake
```bash
# one library asset
flatpak run org.blender.Blender --background \
--python "$PWD/tools/blender_assets.py" -- build --only npc_guard
# bake AO for the same asset
flatpak run org.blender.Blender --background \
--python "$PWD/tools/bake_ao.py" -- --only npc_guard
# NPC base material maps/base
python3 tools/npc_pipeline.py prepare
flatpak run org.blender.Blender --background \
--python "$PWD/tools/npc_pipeline.py" -- build
python3 tools/npc_pipeline.py audit
```
Only run `prepare` when AI fabric inputs changed. Do not run a full library
rebuild just to hide a small diff; build the affected asset and its AO map.
## Import and tests
```bash
godot --headless --path . --import
godot --headless --path . --script res://src/test/test_runner.gd
python3 -m unittest discover -s tools/tests -t tools -p 'test_*.py'
python3 tools/check_docs.py
```
Expected: Godot suite passes; Python tooling suite passes; docs check OK. The
project uses its own headless runner, not GUT.
## Capture gates
```bash
# neutral studio baseline: 48 frames (8 characters x 6 views)
godot --path . --script res://src/test/capture_npc_baseline.gd \
-- --out=res://tmp/npc-baseline-after
# final-context: 96 frames (8 models x 3 distances x 2 venues x day/night)
godot --path . --script res://src/test/capture_npc_review.gd \
-- --out=res://tmp/npc-review-after
# optional hand close-up: 8 frames
godot --path . --script res://src/test/capture_npc_baseline.gd \
-- --out=res://tmp/npc-hands --view=hand
```
Raw frames stay under `tmp/` and are never committed. Compare with:
```bash
python3 tools/npc_baseline.py compare \
--before tmp/npc-baseline --after tmp/npc-baseline-after \
--out docs/blender_previews/sheet_npc_baseline_compare-<topic>.jpg
```
Do not replace the committed baseline sheet until the change is accepted.
## Budget/performance
```bash
godot --headless --path . --script res://src/test/smoke_npc_budget.gd
```
Expected report: 24 avatars / 168 meshes / 131,616 triangles (current baseline)
inside the 50 ms budget. Record the actual frame time; do not copy an old number
without measuring.
## Visual review criteria
The part pipeline (`tools/npc_parts.py`) builds/extracts head/face/hand parts under
`tmp/npc-parts/<variant>/`; these are local working files and are **not shipped**. Only the
assembled character GLBs, AO/maps, the manifest and the review sheets are committed. An
assembled GLB still goes through `blender_assets.py inspect`/`audit`/`fit` before any part is
accepted. The `npc_base.blend` fallback is frozen: never save prototype detail into it.
For each changed variant, inspect at least:
- 2 m portrait: eyes, mouth, ears, neck/shoulder, hair/headgear clearance.
- 4.2 m conversation: hands, gear contact, clothing silhouette.
- 8 m crowd: readable silhouette and LOD/impostor swap.
- Day and night/LATE final-context frames.
- Front, three-quarter and profile for a shape change.
Accepted stylized limits are in `docs/assets/3d-model-review.md` and
`docs/design/known-limitations.md`. Do not turn an accepted limit into an unreviewed
contract change.
## Final diff review
```bash
git diff --check
git status --short
git diff --stat
```
Check that only intended `.glb`, AO/maps, manifest, tests and docs changed. If a
`.blend`, raw capture, generated AI input or temporary sheet is staged, stop and
remove it. Commit one coherent asset family per commit.
+254
View File
@@ -0,0 +1,254 @@
---
name: gig-line-release-qa
description: Use when preparing, validating, tagging or publishing a Gig Line release or release candidate, or when running the full screenshot, screen-design and realism QA gates. Covers version/changelog discipline, smoke and tooling matrices, clean-worktree builds, checksums, Web/HQ verification, publish rollback and post-release records. Do not use for ordinary asset edits or feature work.
compatibility: Gig Line repository checkout with Godot 4.7.2 on PATH and Python 3 + Pillow. Release export needs installed Godot export templates; publishing needs Gitea credentials and is intentionally CI/tag-driven.
metadata:
project: Gig Line
domain: release-qa
version: "1.0.0"
triggers: release, tag, version bump, changelog, build releases, publish, screenshots, screen design, realism judge, release candidate, deployment
---
# Gig Line Release and Visual QA
Use this skill for version bumps, release candidates, tags, artifact builds,
publishing, and the full visual/QA gate. For a Blender/asset rebuild, use
`gig-line-blender-asset-contract` first.
## Read first
1. `AGENTS.md` — release procedure and verification rules.
2. `TODO.md` — current milestone, blockers and release exit criteria.
3. `docs/process/RELEASING.md` — build/publish commands, artifact list, macOS policy.
4. `docs/process/release-qa.md` — manual QA matrix and balance protocol.
5. `docs/project/development-status.md`, `CHANGELOG.md`, `README.md` — current claims.
6. `MEMORY.md` — release gotchas, especially the clean-worktree rule.
A release is not just a tag. It includes a version bump, changelog, clean build,
artifact/checksum verification, CI publication, and post-release records.
## Hard rules
- **Do not tag while the TODO still lists unresolved release blockers.** Check
external playtest, legal/AI provenance, signing and target-hardware items.
- **Never reuse a tag.** If a published version needs a fix, bump the patch and
create a new tag.
- **Build from a clean checkout or detached worktree.** A normal working tree can
pack ignored `tmp/` and `build/` content into exports, inflating a ~160 MB
package to 1.6–3.1 GB.
- A tag push triggers CI checks/build/publish. Do not upload manually unless CI is
unavailable and you have followed the same preflight.
- Do not commit generated realism runs, raw captures, API keys, or build artifacts.
- The vision judge is an optional development aid with external API cost, never a
hard CI gate.
- Keep `project.godot`, changelog, tag and release asset version equal.
## Release workflow
### 1. Scope and version
Choose the semantic increment from `AGENTS.md`:
- MAJOR: incompatible/removed behavior, save/config contract or core-pillar
replacement.
- MINOR: new user-facing feature/venue.
- PATCH: fixes and polish.
Update:
1. `project.godot` `config/version`.
2. `CHANGELOG.md` with a dated entry.
3. `README.md`, `PLAN.md`, `docs/project/architecture.md`,
`docs/project/development-status.md`, `TODO.md`/`DONE.md` and `MEMORY.md` as needed.
For a release candidate, use a prerelease version only if the project policy
allows it and never present it as the final release.
### 2. Preflight
```bash
git status --short
git log --oneline -5
git tag -l "v<version>"
rg -n 'config/version' project.godot
```
Expected: only intended release changes; tag does not exist; version matches the
changelog and planned artifacts.
### 3. Automated checks
```bash
godot --headless --path . --script res://src/test/test_runner.gd
python3 -m unittest discover -s tools/tests -t tools -p 'test_*.py'
python3 tools/check_docs.py
python3 tools/blender_assets.py audit
python3 tools/blender_assets.py fit
python3 tools/npc_proportions.py report
python3 tools/npc_pipeline.py audit
```
Then run the smoke matrix, using isolated user-data directories for
tutorial/campaign:
```bash
for s in smoke_audio smoke_crowd smoke_emergency smoke_npc_budget \
smoke_plan_verbs smoke_scenario_content smoke_session_shell \
smoke_timeline smoke_ui_flows; do
godot --headless --path . --script res://src/test/$s.gd || exit 1
done
XDG_DATA_HOME=/tmp/gig-line-campaign godot --path . --fixed-fps 60 \
--script res://src/test/smoke_campaign.gd
XDG_DATA_HOME=/tmp/gig-line-tutorial godot --path . --fixed-fps 60 \
--script res://src/test/smoke_tutorial.gd -- --tutorial
godot --path . --script res://src/test/smoke_movement.gd
godot --path . --script res://src/test/smoke_props.gd
godot --path . --script res://src/test/smoke_focus_radial.gd
```
Use a fresh `$XDG_DATA_HOME` for campaign/tutorial and check the exit code, not
just the log.
### 4. Visual and judge gates
```bash
./tools/check_screenshots.sh
python3 tools/screen_designs.py compare
python3 tools/screen_designs.py judge --model auto # optional, record model/verdicts
```
For realism/venue work:
```bash
godot --path . --script res://src/test/capture_realism.gd \
-- --out=res://docs/screens/realism/<run>/after
python3 tools/scene_concepts.py realism --run docs/screens/realism/<run> \
--judge --model <pinned-model>
```
Requirements:
- Gallery: 21 good / 0 bad; screen judge has no unexplained `diff`.
- Realism runs stay under `docs/screens/realism/` (gitignored); only decisions and
committed sheets/docs are tracked.
- Record judge model, run count/attempts, spend if exposed, and verdicts.
- Review every `review` verdict; turn layout regressions into fixes or documented
known limitations.
### 5. Clean build
Commit the release preparation first, then build the committed tree in a clean
worktree:
```bash
git worktree add --detach /tmp/gig-line-release HEAD
cd /tmp/gig-line-release
./tools/build_releases.sh
```
Verify artifact names/sizes and checksums:
```bash
ls -lh build/gig-line-*<version>*
PUBLISH_DRY_RUN=1 ./tools/publish_release.sh <version>
sha256sum -c build/SHA256SUMS-<version>.txt
```
Check package contents:
```bash
unzip -l build/gig-line-web-<version>.zip | head
unzip -l build/gig-line-desktop-hq-<version>.zip | head
unzip -p build/gig-line-desktop-hq-<version>.zip override.cfg
```
Check the runnable Linux and HQ packages:
```bash
./build/gig-line-linux-<version>.x86_64 --headless --quit-after 60
unzip -q build/gig-line-desktop-hq-<version>.zip -d /tmp/gig-line-hq
/tmp/gig-line-hq/gig-line-linux-<version>.x86_64 --headless --quit-after 60
```
Check Web static serving with a local HTTP server and `curl` for `index.html`,
`index.wasm`, `index.pck` and the player docs. Windows/macOS/AppImage/installer
checks require the target matrix; if unavailable, record that explicitly.
Remove the worktree after verification:
```bash
git worktree remove --force /tmp/gig-line-release
```
### 6. Tag and publish
Only after every gate is green:
```bash
git add -A
git commit -m "Release <version> <topic>"
git tag -a "v<version>" -m "Gig Line <version>"
git push origin main "v<version>"
```
CI builds and publishes on the tag. Verify:
- Tag commit equals the release commit.
- CI checks/build job succeeded.
- Release page has the expected 7 assets (Linux, Windows, macOS, NSIS setup,
AppImage, Web, Desktop HQ).
- Asset names and download links point at the released version.
`tools/publish_release.sh` preflights artifact size/free space, writes SHA-256
checksums, rolls back newly uploaded assets/release on failure, and supports
opt-in retention:
```bash
RETAIN_RELEASES=7 ./tools/publish_release.sh <version>
```
The default `RETAIN_RELEASES=0` never prunes.
### 7. Post-release record
Update `README.md`, `docs/project/development-status.md`, `MEMORY.md`, `CHANGELOG.md`,
`TODO.md`/`DONE.md` and the release page with the built/CI result. Commit the
release record and push. Record any skipped check and the reason; never leave a
tag with unreported missing verification.
## Known gotchas
- **Dirty build inflation:** always use the clean worktree above.
- **`Class ... hides a global script class`:** remove stray `.gd` backups in
`tmp/`, delete `.godot`, re-import.
- **Screenshot staging:** `capture_ui_states.gd` needs its settle frames and
staged state; do not capture a paused frame or a stale modal.
- **Judge keys:** OpenRouter calls need `.env`/`OPENROUTER_API_KEY`; never commit
the key or generated review folders.
- **Tag builds publish automatically:** do not run a second manual publish that
duplicates assets; use the existing release if re-running.
- **macOS is unsigned unless policy changes:** record quarantine instructions and
do not claim notarization.
- **Release blockers are real:** external playtest, legal/storefront approval,
AI-provider rights and target-hardware checks cannot be replaced by green unit
tests.
## Bundled references
- [`references/release-runbook.md`](references/release-runbook.md) — version,
build, tag, CI, publish and rollback sequence.
- [`references/qa-gates.md`](references/qa-gates.md) — full command matrix,
expected results and evidence to record.
## Completion checklist
- [ ] Version/changelog/docs/tag match.
- [ ] No unresolved release blockers for a final tag.
- [ ] Godot, Python, smokes, asset and docs gates pass.
- [ ] Gallery and optional judges reviewed with evidence.
- [ ] Clean worktree build and checksums verified.
- [ ] Linux/HQ/Web checks recorded; unavailable platforms noted.
- [ ] Tag pushed; CI/publish succeeded; seven assets verified.
- [ ] Release record and durable docs committed.
@@ -0,0 +1,171 @@
# QA Gate Matrix
Run from the repository root. Capture the exit code and the useful report line,
not only the final “OK”.
## 1. Source and docs
```bash
git status --short
git log --oneline -5
python3 tools/check_docs.py
git diff --check
```
Expected: intended files only; `check_docs: OK`; no whitespace errors.
## 2. Automated suites
```bash
godot --headless --path . --script res://src/test/test_runner.gd
python3 -m unittest discover -s tools/tests -t tools -p 'test_*.py'
```
Expected: the current Godot suite passes (historically 272+ tests) and the
Python tooling suite passes (currently 160 tests). Do not edit expected counts
without inspecting the suite.
## 3. Asset gates
```bash
python3 tools/blender_assets.py audit
python3 tools/blender_assets.py fit
python3 tools/blender_assets.py texels
python3 tools/npc_pipeline.py audit
python3 tools/npc_proportions.py report
```
Expected: exit 0, no `BAD` assets, all eight characters inside the stylized
proportion guide, no budget/contract regression.
Optional texture/model audits when those assets changed:
```bash
python3 tools/asset_pipeline.py audit assets/textures/ai/game_ready
python3 tools/model_pipeline.py audit
```
## 4. Smoke matrix
Headless:
```bash
for s in smoke_audio smoke_crowd smoke_emergency smoke_npc_budget \
smoke_plan_verbs smoke_scenario_content smoke_session_shell \
smoke_timeline smoke_ui_flows; do
echo "== $s"
godot --headless --path . --script res://src/test/$s.gd || exit 1
done
```
Isolated data:
```bash
rm -rf /tmp/gig-line-release-campaign /tmp/gig-line-release-tutorial
XDG_DATA_HOME=/tmp/gig-line-release-campaign godot --path . --fixed-fps 60 \
--script res://src/test/smoke_campaign.gd
XDG_DATA_HOME=/tmp/gig-line-release-tutorial godot --path . --fixed-fps 60 \
--script res://src/test/smoke_tutorial.gd -- --tutorial
```
Windowed input/UI:
```bash
godot --path . --script res://src/test/smoke_movement.gd
godot --path . --script res://src/test/smoke_props.gd
godot --path . --script res://src/test/smoke_focus_radial.gd
```
Expected: 14 smokes green. `smoke_npc_budget` should print the current mesh,
triangle and frame-time evidence; the 50 ms budget is a safety ceiling.
## 5. Screenshot and design gates
```bash
./tools/check_screenshots.sh
python3 tools/screen_designs.py compare
```
Expected: 21 good / 0 bad; no unexplained compare output. The judge is optional:
```bash
python3 tools/screen_designs.py judge --model auto
```
Record model, confidence/verdict summary, `diff` count and any manual review.
`docs/design/ui-copy.md#screen-design-judge-report` is the durable record.
## 6. Realism judge (when visual assets/lighting changed)
```bash
godot --path . --script res://src/test/capture_realism.gd \
-- --out=res://docs/screens/realism/<run>/after
python3 tools/scene_concepts.py realism --run docs/screens/realism/<run> \
--judge --model <pinned-model>
```
Expected: a complete set of required stage captures, no stale pauses/modals, and
a report under the gitignored run directory. Record:
- pinned model/fallbacks
- shots attempted/completed
- spend if the tool exposes it
- mean score and Pillow gap
- every `review` verdict and disposition
Do not commit the run. Commit only the decision/report summary and any durable
comparison sheet explicitly intended for review.
## 7. Package checks
Use the clean worktree from `release-runbook.md`.
```bash
PUBLISH_DRY_RUN=1 ./tools/publish_release.sh <version>
sha256sum -c build/SHA256SUMS-<version>.txt
unzip -l build/gig-line-web-<version>.zip
unzip -l build/gig-line-desktop-hq-<version>.zip
unzip -p build/gig-line-desktop-hq-<version>.zip override.cfg
./build/gig-line-linux-<version>.x86_64 --headless --quit-after 60
```
Expected:
- names match the version;
- Linux/Windows/macOS/Web/HQ present locally;
- Web contains HTML/wasm/pck and docs;
- HQ contains `override.cfg`, executables and docs;
- Linux/HQ start without a script error.
Windows installer/AppImage and macOS launch require CI or the target matrix. If
not available, mark them as unverified rather than passing them by analogy.
## 8. Release verification
After the tag push:
- CI checks job succeeded;
- CI build job succeeded;
- release page has seven assets;
- each artifact name includes the released version;
- the tag points at the release commit;
- README/changelog/status and release notes agree.
## Evidence summary template
```text
Release: vX.Y.Z (commit)
Godot: pass (N/N)
Python tooling: pass (N/N)
Smokes: 14/14
Assets: audit/fit/proportions/npc audit pass
Budget: 24 NPCs, N meshes, N triangles, N ms
Gallery: 21 good / 0 bad
Screen judge: N/N match, N review, N diff
Realism: model, attempts, mean, gap, review dispositions
Build: clean worktree, artifact sizes/checksums
Launch: Linux/HQ/Web checks; unverified platforms
CI/release: run id, seven assets
Skipped checks + reason:
Known limitations:
```
@@ -0,0 +1,171 @@
# Release Runbook
Authoritative source: `AGENTS.md` (Release Procedure), `docs/process/RELEASING.md`.
This runbook is the operational checklist; if it conflicts with those, they win.
## 0. Decide the release
Determine whether this is a major, minor, patch, or release-candidate checkpoint.
Do not assign a version to an unversioned development track until its scope is
accepted into a release.
Check the current release constraints in `TODO.md`:
- external playtest evidence
- legal/AI-provider/storefront review
- macOS signing/notarization policy
- target hardware matrix
- any manual QA gaps
If a final release would ship with unresolved blockers, prepare an RC or stop;
do not create a final tag.
## 1. Prepare the version
Files to update:
| File | Change |
| --- | --- |
| `project.godot` | `config/version="X.Y.Z"` |
| `CHANGELOG.md` | dated `## [X.Y.Z] — YYYY-MM-DD` entry |
| `README.md` | latest/current version and summary |
| `PLAN.md` / `docs/project/architecture.md` | current version reference |
| `docs/project/development-status.md` | shipped capability/release result |
| `TODO.md` / `DONE.md` | close/move milestone when complete |
| `MEMORY.md` | release state and gotchas |
Then commit the preparation before building.
## 2. Run gates
Use `qa-gates.md` as the command matrix. The minimum release gate is:
- Godot suite
- Python tooling tests
- documentation gate
- asset audits/fit/proportions
- 24-NPC budget
- 14 smoke scripts
- screenshot compare
- optional screen/realism judge with recorded model/attempts
- clean build and artifact checks
Any skipped check must be written into `MEMORY.md` or `TODO.md` with a reason.
## 3. Build in a clean worktree
Why: Godot can pack ignored `tmp/` captures and `build/` outputs into the export.
A dirty build can produce 1.6–3.1 GB artifacts instead of ~160–240 MB.
```bash
git worktree add --detach /tmp/gig-line-release HEAD
cd /tmp/gig-line-release
./tools/build_releases.sh
```
Expected local artifacts:
```text
build/gig-line-linux-<version>.x86_64
build/gig-line-windows-<version>.exe
build/gig-line-macos-<version>.zip
build/gig-line-web-<version>.zip
build/gig-line-desktop-hq-<version>.zip
```
CI additionally produces the NSIS setup and AppImage, for seven release assets.
## 4. Preflight and checksum
```bash
PUBLISH_DRY_RUN=1 ./tools/publish_release.sh <version>
sha256sum -c build/SHA256SUMS-<version>.txt
```
`publish_release.sh` checks non-empty artifacts and local free space before any
API call. It writes checksums under `build/` and does not upload them by default.
Inspect packages:
```bash
unzip -l build/gig-line-web-<version>.zip | head -20
unzip -l build/gig-line-desktop-hq-<version>.zip | head -20
unzip -p build/gig-line-desktop-hq-<version>.zip override.cfg
```
Web must contain `index.html`, `index.wasm`, `index.pck`, and player docs.
Desktop HQ must contain the Linux/Windows executables, `override.cfg`,
`README.txt`, `CREDITS.md`, `PRIVACY.md`, `accessibility.md` and
`known-limitations.md`.
## 5. Runtime launch smoke
```bash
./build/gig-line-linux-<version>.x86_64 --headless --quit-after 60
unzip -q build/gig-line-desktop-hq-<version>.zip -d /tmp/gig-line-hq
/tmp/gig-line-hq/gig-line-linux-<version>.x86_64 --headless --quit-after 60
```
For Web, serve `build/web` and check HTTP 200 for `index.html`, `index.wasm`,
`index.pck` and docs. Do not claim browser interaction from a curl check.
Remove the temporary worktree after checks:
```bash
git worktree remove --force /tmp/gig-line-release
```
## 6. Tag and CI
From the real repository, on the release commit:
```bash
git tag -a "v<version>" -m "Gig Line <version>"
git push origin main "v<version>"
```
The tag triggers `.gitea/workflows/build.yml`: checks, export, installer,
AppImage, release publish. Verify the run and assets:
- check job success
- build job success
- seven assets present
- tag/version/artifact names equal
- download links respond
Do not reuse a published tag. If a fix is needed, bump patch and repeat.
## 7. Manual publish fallback
Only if CI cannot publish:
```bash
RETAIN_RELEASES=7 ./tools/publish_release.sh <version>
```
The script reuses or creates the release, uploads present artifacts, verifies the
asset count, and rolls back newly uploaded assets/new release on failure. The
default retention is `0` (no deletion). Never delete older releases implicitly.
## 8. Post-release record
Commit a release record that includes:
- tag and commit
- CI run/result
- seven assets
- checksums or size evidence
- skipped checks
- known limitations
- release URL
Update `DONE.md`/`TODO.md` and `MEMORY.md`; keep the changelog and README
consistent. Push the record commit.
## Versioning pitfalls
- A `vX.Y.Z` tag is immutable in practice; do not move/replace it.
- A release candidate is not a final release. Do not label it as such in the
README or release page if blockers remain.
- `config/version` must match the tag and artifact filenames.
- The clean-worktree build is a release requirement, not an optimization.
+19 -12
View File
@@ -17,12 +17,13 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install Godot 4.3
- name: Install Godot 4.7.2
run: |
curl -sL -o /tmp/godot.zip \
https://github.com/godotengine/godot/releases/download/4.3-stable/Godot_v4.3-stable_linux.x86_64.zip
https://github.com/godotengine/godot/releases/download/4.7.2-stable/Godot_v4.7.2-stable_linux.x86_64.zip
unzip -qo /tmp/godot.zip -d /tmp/godot-bin
sudo install /tmp/godot-bin/Godot_v4.3-stable_linux.x86_64 /usr/local/bin/godot
sudo install /tmp/godot-bin/Godot_v4.7.2-stable_linux.x86_64 /usr/local/bin/godot
godot --version
- name: Import project (build class cache)
run: godot --headless --import
@@ -56,18 +57,24 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install Godot 4.3 and export templates
- name: Install Godot 4.7.2 and export templates
run: |
curl -sL -o /tmp/godot.zip \
https://github.com/godotengine/godot/releases/download/4.3-stable/Godot_v4.3-stable_linux.x86_64.zip
https://github.com/godotengine/godot/releases/download/4.7.2-stable/Godot_v4.7.2-stable_linux.x86_64.zip
unzip -qo /tmp/godot.zip -d /tmp/godot-bin
sudo install /tmp/godot-bin/Godot_v4.3-stable_linux.x86_64 /usr/local/bin/godot
sudo install /tmp/godot-bin/Godot_v4.7.2-stable_linux.x86_64 /usr/local/bin/godot
godot --version
TEMPLATE_DIR="$HOME/.local/share/godot/export_templates/4.7.2.stable"
NEEDED="version.txt icudt_godot.dat linux_release.x86_64 windows_release_x86_64.exe macos.zip web_nothreads_release.zip web_dlink_nothreads_release.zip"
curl -sL -o /tmp/templates.tpz \
https://github.com/godotengine/godot/releases/download/4.3-stable/Godot_v4.3-stable_export_templates.tpz
mkdir -p ~/.local/share/godot/export_templates/4.3.stable
cd /tmp && rm -rf tpl && mkdir tpl && unzip -qo templates.tpz -d tpl
cp tpl/templates/* "$HOME/.local/share/godot/export_templates/4.3.stable/" 2>/dev/null || true
ls "$HOME/.local/share/godot/export_templates/4.3.stable" | head -5
https://github.com/godotengine/godot/releases/download/4.7.2-stable/Godot_v4.7.2-stable_export_templates.tpz
rm -rf /tmp/tpl && mkdir -p /tmp/tpl
unzip -qo /tmp/templates.tpz -d /tmp/tpl
mkdir -p "$TEMPLATE_DIR"
for file in $NEEDED; do
cp "/tmp/tpl/templates/$file" "$TEMPLATE_DIR/$file"
done
ls "$TEMPLATE_DIR" | head -10
- name: Import project
run: godot --headless --import
@@ -114,7 +121,7 @@ jobs:
if: startsWith(github.ref, 'refs/tags/')
env:
# An explicit repo secret wins. Without one, publish_release.sh reuses
# the local git extraheader that actions/checkout configures for the job
# the local git extraheader that actions/checkout configures on the job
# (the runner's own credentials), so tag builds still publish.
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
VERSION: ${{ github.ref_name }}
+19
View File
@@ -37,6 +37,7 @@ Thumbs.db
*.new
# Logs and temp
tmp/
*.log
user://
# CI runner workflow logs (written into the checkout by the Gitea runner)
@@ -57,6 +58,20 @@ assets/models/generated/npc_base_*_normal.png
# Local AppImage extraction
squashfs-root/
# Local agent skills. The third-party Blender pack is installed per machine and
# stays ignored; the two project-authored skills are tracked so the workflow can
# be shared and reviewed.
.agents/
!.agents/
.agents/*
!.agents/.gdignore
!.agents/skills/
.agents/skills/*
!.agents/skills/gig-line-blender-asset-contract/
!.agents/skills/gig-line-blender-asset-contract/**
!.agents/skills/gig-line-release-qa/
!.agents/skills/gig-line-release-qa/**
# Blender asset library: per-asset Cycles renders are local review output (the
# committed review artefacts are docs/blender_previews/sheet_*.jpg), and Godot
# extracts the GLB-embedded textures next to the models on import.
@@ -73,3 +88,7 @@ assets/models/blender_src/*.blend
assets/textures/ai/game_ready/v2/*
!assets/textures/ai/game_ready/v2/picks/
docs/screens/realism/
## Local pi agent session data
pi-session-*.html
pi-session-*.jsonl
+166 -30
View File
@@ -15,14 +15,106 @@ The project should be developed in small, reviewable steps. Agents must keep pla
- `README.md` — Root-level documentation for the project. It should explain what the game is, how to work on it, how to run it, and where to find project information.
- `AGENTS.md` — This collaboration and agent workflow guide.
- `CHANGELOG.md` — The version history of user-facing changes. Keep an entry for each patch, minor, and major version.
- `docs/development-status.md` — The implemented-features list and what is not yet implemented. Update it whenever a feature lands, is renamed, or is removed.
- `docs/architecture.md` — The arc42-style architecture documentation (goals, constraints, building blocks, runtime views, decisions, risks).
- `docs/gameplay.md` — Gameplay systems, venues, and the escalation model.
- `docs/asset-tooling.md` — Asset pipelines, model tools, and screenshot gates.
- `docs/getting-started.md` — Setup, run/test commands, and the controls table.
- `docs/smoke-checklist.md` — The manual smoke-test checklist.
- `docs/project/development-status.md` — The implemented-features list and what is not yet implemented. Update it whenever a feature lands, is renamed, or is removed.
- `docs/project/architecture.md` — The arc42-style architecture documentation (goals, constraints, building blocks, runtime views, decisions, risks).
- `docs/design/gameplay.md` — Gameplay systems, tutorial, venues and the escalation model.
- `docs/design/venues.md` — Real-site evidence, game mapping and venue simplifications.
- `docs/assets/asset-tooling.md` — Asset pipelines, model tools, optional Blender MCP and screenshot gates.
- `docs/assets/blender-assets.md` — Blender library operation and asset roles.
- `docs/assets/npc-model-sourcing.md` — Character-source evaluation, licence rules and the character-development plan.
- `docs/process/getting-started.md` — Setup, run/test commands, and the controls table.
- `docs/process/release-qa.md` — The manual smoke checklist and balance-acceptance protocol.
- `docs/adr/` — Architecture Decision Records.
## Priority and Versioning
`TODO.md` is the priority source. The active order is:
1. unversioned development tracks;
2. versioned release milestones, in version order;
3. future/unversioned candidates and deferred work.
Do not assign a version number to an unversioned track until its scope is accepted into a
release. When a version is assigned, it must be the next semantic version that matches the
scope (major/minor/patch), not a placeholder.
## Local Blender skills (development aid)
The MIT `blender-skills` pack is installed locally at `.agents/skills/blender-skills/`
(94 skills plus a shared `references/` folder). It is **gitignored on purpose**: it is not
game content, not part of the build, tests, CI or release packages, and every contributor
may or may not have it. The agent runtime (Pi) gates project `.agents/skills` behind project
trust, so the trust prompt must be accepted before the skills load; `/skill:blender-director`
forces one.
Use them when a task touches `tools/blender_assets.py`, `tools/npc_pipeline.py`,
`tools/bake_ao.py`, `assets/models/blender/**`, or Blender-authored venue/prop geometry.
### Project-authored skills (tracked)
Two project skills are committed under `.agents/skills/` and are guidance for
any agent, not only Pi:
- `gig-line-blender-asset-contract` — the NPC/gear/prop contract, build order,
headless Blender commands, failure playbook and verification gates.
- `gig-line-release-qa` — the test/smoke matrix, visual judges, clean-worktree
build, checksum/tag/publish sequence and release records.
They are not runtime dependencies and do not move tool implementations into
`.agents/`. The third-party `blender-skills` pack stays local/gitignored.
### Routing
Start with `blender-director` for anything multi-discipline, then load only the
specialists the task needs:
| Work | Skills |
| --- | --- |
| Plan/route a Blender task, reference photo match | `blender-director` |
| Character mesh, face, hands, proportions | `character-artist`, `character-archetypes`, `retopology` |
| Skeleton, weights, pose/contract rigging | `rigging` |
| UV layout, texel density, UDIM | `uv-workflow` |
| Bakery, atlas, normal/AO/ORM maps | `texture-workflow` |
| PBR materials and shading | `materials` |
| Screenshot-driven material/light iteration | `lookdev` |
| Triangle/vertex budgets, naming, scene hygiene | `asset-optimization` |
| LOD tiers and impostors | `lod-pipeline` |
| Collision shapes and proxies | `collision-proxy` |
| GLB export for Godot | `godot-export`, `export-pipeline` |
| Gear, props, street furniture | `prop-artist`, `hard-surface` |
| Trees, hedges, foliage cards | `vegetation-artist` |
| Facades, venues, modular kits, dressing | `environment-artist`, `archviz`, `set-dressing`, `geometry-nodes` |
| Lighting, framing, final render/composite | `lighting`, `camera-cinematography`, `rendering`, `compositing` |
| Style direction (stylized / low-poly / realistic) | `stylized-style`, `lowpoly-style`, `realistic-style` |
| Ship/no-ship review | `qa-review` |
### Project rules that override a skill
1. **The project contract wins.** `npc_base` mesh node, five tint slots, front on Blender −Y /
Godot +Z, grounded feet, 24,000 triangles / 24,000 glTF vertices per character, 1,500 per
gear, 4,000 per prop. The shipped procedural library uses the 13 required core bones at their
rest positions; optional extra bones (fingers, face, toes) are allowed if they do not move the
core rest positions. The one documented exception is the accepted Quaternius runtime path
([ADR-0018](docs/adr/0018-quaternius-stage2-runtime-rig.md)): it keeps the 62-joint source rig
at runtime while the 0.9.9 face/silhouette gate is open, and it must still supply the five tint
slots, valid gear attach points and the same budgets. Both paths stay tested until that gate
closes. A skill may recommend another topology, naming or budget scheme; do not adopt it unless
the change is explicitly planned and the contract, tests and docs are updated together.
2. **Blender MCP is optional interactive tooling.** The headless flatpak scripts
(`tools/blender_assets.py`, `tools/npc_pipeline.py`) remain authoritative. MCP may be used
for local part exploration; setup and safety are in [`docs/assets/asset-tooling.md#optional-interactive-blender-mcp`](docs/assets/asset-tooling.md#optional-interactive-blender-mcp).
Never add an MCP dependency to the build, CI, tests or runtime, and always re-run the CLI
audit/fit gates on anything MCP touched.
3. **CI stays offline and skill-free.** Skills are local guidance only; every gate must still
work from a fresh checkout with committed `.glb`/`.png`/`.tres` files and Godot.
4. **No new asset source without the licence gate.** Skills may suggest reference packs or
generated meshes; ADR-0017 (the CC0 Quaternius NPC base) supersedes the generator-first
decision in ADR-0015, and the CC0/CC-BY rule in ADR-0015 (attribution in `CREDITS.md`) plus
the provenance rules in `docs/assets/npc-model-sourcing.md` still apply to any new source.
5. **Evidence, not vibes.** After a skill-informed change, run `blender_assets.py inspect`,
`audit` and `fit` plus the relevant capture/smoke gates, and say in the handoff which
skills informed the change and what the measurements were.
## Required Workflow
### 1. Start by Inspecting the Repository
@@ -47,8 +139,11 @@ All planned implementation work must be represented in `TODO.md`.
- Use level-2 headings (`##`) for milestones or stable themes. A milestone should state its goal
and an explicit exit criterion; a theme groups small related work that does not need a
milestone.
- Use level-3 headings (`###`) for workstreams inside a milestone (for example, `0.8.1
First-shift tutorial`). Keep the hierarchy to three levels: milestone → workstream → checkbox.
- Order level-2 sections by current priority: unversioned development tracks first, then
versioned release milestones in version order, then future/deferred work. Do not assign a
version number to an unversioned track until it is scheduled for a release.
- Use level-3 headings (`###`) for workstreams inside a milestone. Keep the hierarchy to three
levels: milestone → workstream → checkbox.
- Use checkbox items for each concrete task, normally under a level-3 workstream. Direct
checkboxes under a level-2 section are acceptable for small, single-workstream sections.
- Keep tasks small enough to complete and review independently.
@@ -67,26 +162,31 @@ Recommended format:
```md
# TODO
## Milestone 0.8.0 — First hour and content depth
## Milestone X.Y.Z — goal and exit criterion
### 0.8.1 First-shift tutorial
### Workstream A
- [x] Write the tutorial beat sheet.
- [-] Implement the tutorial state machine. (claimed; implementation/verification in progress)
- [ ] Add the tutorial smoke test.
- [x] Completed task.
- [-] Task in progress. (claimed; implementation/verification in progress)
- [ ] Open task.
### 0.8.2 Campaign shell
### Workstream B
- [ ] Define campaign data.
- [ ] Persist campaign progress.
- [ ] Another task.
**Exit:** a first-time player completes a shift without external documentation.
**Exit:** a verifiable statement of what "done" means for the milestone.
## Documentation
## Theme
- [ ] Document the test procedure in `README.md`.
- [ ] A small housekeeping task with no milestone.
```
Recommended `DONE.md` format: a `# DONE` heading, followed by each moved level-2 section
unchanged, with a completion date line under each section heading.
Order the actual file as described in "Priority and Versioning": unversioned development tracks
first, then versioned milestones in version order, then future/deferred work.
### 3. Move Completed Sections to `DONE.md`
`TODO.md` uses nested sections. Apply these completion rules:
@@ -96,7 +196,7 @@ Recommended format:
level-3 section to `DONE.md`.
2. **Level-2 milestone/theme:** it is complete only when its direct checkboxes and **all** of its
level-3 workstreams are complete. Verify the whole milestone, record its capabilities in
`docs/development-status.md` when it represents shipped functionality, and write the matching
`docs/project/development-status.md` when it represents shipped functionality, and write the matching
`CHANGELOG.md` entry.
3. Move the **entire level-2 section**, including all level-3 headings and checklists, to
`DONE.md`. Remove it from `TODO.md` and add a completion date/note.
@@ -107,7 +207,7 @@ Recommended format:
complete, or split the unfinished work into a new smaller level-2 milestone first.
When a completed milestone represents shipped functionality, also record the new capability in
`docs/development-status.md` so the implemented-features list stays accurate, and write a matching
`docs/project/development-status.md` so the implemented-features list stays accurate, and write a matching
entry in `CHANGELOG.md` (see "Maintain `CHANGELOG.md`" below).
### 4. Maintain `MEMORY.md`
@@ -117,7 +217,7 @@ Use `MEMORY.md` for information that should persist between sessions but does no
Record items such as:
- Important design and architecture decisions
- Notable implementation state and gotchas (the canonical implemented-features list lives in `docs/development-status.md`, not here)
- Notable implementation state and gotchas (the canonical implemented-features list lives in `docs/project/development-status.md`, not here)
- Known bugs and workarounds
- Commands needed to run, test, or build the project
- Decisions that future agents should not revisit unnecessarily
@@ -167,17 +267,19 @@ The root-level `README.md` is the project’s public-facing technical and projec
- Links to `PLAN.md`, `TODO.md`, `DONE.md`, `MEMORY.md`, and this file where appropriate
- Known limitations and contribution guidance
Update `README.md` whenever setup instructions, commands, project structure, or user-facing behavior changes. The README is intentionally concise and links to the `docs/` files; keep `docs/development-status.md` (and the other docs it links to) synchronized with the implementation rather than pasting detail back into the README.
Update `README.md` whenever setup instructions, commands, project structure, or user-facing behavior changes. The README is intentionally concise and links to the `docs/` files; keep `docs/project/development-status.md` (and the other docs it links to) synchronized with the implementation rather than pasting detail back into the README.
### 7. Maintain `CHANGELOG.md`
The root-level `CHANGELOG.md` records the user-facing changes for every release. It exists so players and contributors can see what changed between versions without reading the commit log.
- Add an entry for every patch, minor, and major version change.
- Follow Semantic Versioning (`major.minor.patch`): bump major for breaking or vision-level changes, minor for new features, and patch for fixes and small polish.
- Follow Semantic Versioning (`major.minor.patch`): bump major only for changes that remove or break an existing player-facing feature, save format, or config contract, or that replace a system listed as a core pillar in PLAN.md; bump minor for new user-facing features; bump patch for fixes and small polish.
- A version increment is not complete until its `CHANGELOG.md` entry, `config/version` update and
matching local release build have all been produced and verified.
- Group each entry under `Added`, `Changed`, `Fixed`, and `Removed` headings, and date every entry.
- Describe changes in user-facing terms, not as raw commit messages.
- Add the entry when its work ships. If the version number is not yet known, record it under `Unreleased` and move it into a numbered version when the version is tagged.
- Add the entry when its work ships. If the version number is not yet known, record it under `Unreleased` as a staging entry; moving it into a numbered version is a version increment and is complete only when the `config/version` update and matching local release build have also been produced and verified (see "Commit, Build and Version Discipline").
When a full executable level-2 milestone/theme in `TODO.md` is implemented, completed, and moved to `DONE.md`:
@@ -195,16 +297,44 @@ For each task:
2. Inspect the relevant files and dependencies.
3. Make the smallest coherent change that completes the task.
4. Run the relevant tests, checks, or manual verification.
5. Update documentation if the change creates lasting context: add features to `docs/development-status.md`, adjust the README links or other `docs/` files as needed, and record decisions/gotchas in `MEMORY.md`.
5. Update documentation if the change creates lasting context: add features to `docs/project/development-status.md`, adjust the README links or other `docs/` files as needed, and record decisions/gotchas in `MEMORY.md`.
6. Mark the task complete.
7. Keep completed level-3 workstreams in place until the parent milestone is complete; then move the entire level-2 milestone to `DONE.md` after recording its `CHANGELOG.md` entry.
8. Commit the changes to the version control system with a descriptive message.
9. If a level-2 milestone from `TODO.md` has been fully completed, ensure its `CHANGELOG.md` entry is in place, then create a new version or tag in the version control system to mark the milestone.
10. Push the committed changes to the shared repository if applicable.
11. Note the new version or tag created in the version control system in any relevant documentation or handoff summary.
8. Commit each coherent, verified change as it is completed. Do not wait until a whole
milestone is finished; keep commits small and descriptive and push them when the branch is
shareable.
9. If the change is a release (a major, minor, or patch version increment), follow the Release
Procedure in "Commit, Build and Version Discipline".
10. Push committed changes to the shared repository if applicable.
11. Note the new version, build artifacts or tag in the relevant documentation and handoff
summary.
Avoid unrelated refactors unless they are required for the task or explicitly approved.
### 9. Commit, Build and Version Discipline
- **Commit often.** Make a commit after each coherent change or verified task, not only when a
milestone or release is finished. Keep the working tree clean between tasks where possible.
- **Push regularly.** Push shareable commits to the shared repository; do not accumulate a long
local-only history.
- **Build every version.** Every major, minor and patch increment follows the Release Procedure
below; a changelog entry alone is not a release.
- **CI is a second gate, not a substitute.** Tag builds remain automated, but the local build is
the required pre-tag check for every version.
- **Unversioned tracks stay unversioned.** A development track does not get a placeholder
version; the version is assigned when the work is scoped into a release.
**Release Procedure** — follow these steps in order for every major, minor, or patch version
increment:
1. Update `config/version`.
2. Write the `CHANGELOG.md` entry for the version.
3. Run the local release build (`tools/build_releases.sh`).
4. Verify the build artifacts and checksums.
5. Commit the changes.
6. Tag the version.
7. Push the commit and tag.
## Collaboration Rules
- Prefer clear, reversible changes over broad rewrites.
@@ -213,6 +343,8 @@ Avoid unrelated refactors unless they are required for the task or explicitly ap
- Do not claim a task is complete without verification.
- Keep documentation synchronized with the implementation.
- Mention files changed and checks run in handoff summaries.
- Commit coherent increments as you go; do not wait until the end of a milestone.
- Follow the Release Procedure in "Commit, Build and Version Discipline" whenever a major, minor or patch version is incremented.
- Leave follow-up work as checkbox items in `TODO.md` rather than hiding it in prose.
- If blocked, document the blocker in `MEMORY.md` and add a corresponding task to `TODO.md`.
- Avoid overwriting another contributor’s work; inspect recent changes before editing shared files.
@@ -224,6 +356,10 @@ Before handing off work, an agent must run every check below that applies to the
- Run automated tests.
- Run formatting, linting, or type checks.
- Start the game or application and perform a basic smoke test.
- For 3D/Blender changes: `blender_assets.py inspect`, `audit` and `fit`, the relevant capture
gate, and a note of which local skills informed the change.
- If the local Blender skills are not installed, state "no local skills used" in the handoff
and list the skill-free checks that were run instead.
- Check that documentation and task status reflect the actual state.
- Review the final diff for accidental changes or unfinished markers.
+276 -6
View File
@@ -4,6 +4,282 @@ All notable user-facing changes to Gig Line. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions use
Semantic Versioning.
## [Unreleased]
### Fixed
- The red event banners are lit from the top down at night instead of reading as flat red cards.
- Hollywood and the TV Studio got the same queue treatment, and the TV Studio's props no longer sit
in the entrance steps.
- The Joke Shop has a readable queue: a velvet rope line leading to the check-in podium, a thicker
bike-rack barricade on the curb side, and a planter no longer clipping the palm foliage.
- Street lamps now throw a warm pool on the pavement instead of dimly washing the whole walkway.
- The flashlight actually lights what it points at. It was tuned to a beam so weak it changed the
frame by less than one 255th of a level; it now throws a visible pool on the door and the pavement
ahead, in both venues.
### Changed
- Street greenery now reads as leaves instead of green rocks: the planter shrubs and tree crowns
are built from leaf cards, which also cut their triangle count by about a third.
### Changed
- Removed every hat and hood from the NPC roster: the firefighter helmet is the only head gear
left, so no character hides its face behind a cap. The street performer no longer wears the
cone hat and carries the baton and board in the hands instead.
- Hands, head gear and carried items were re-fitted to the new characters: hand items sit in the
palm instead of floating at the wrist, the lanyard moved up to the sternum, back gear moved up to
shoulder-blade height, and the clipboard is carried by its top edge.
- NPCs now wear eleven different outfits instead of three: the modular outfit pack brought a formal
suit for the influencer, a punk jacket and mohawk, beach wear, farmer overalls and straw hat, an
adventurer jacket, a second casual jersey, and royal armour with a gold crown for the street
performer.
- NPCs no longer all share one hairstyle: the roster now uses short, buzz and long hair silhouettes
instead of a single shell in twelve colours.
- Eyes now have whites and pupils instead of flat dark rectangles.
- Every NPC now has a visible mouth; the Quaternius heads shipped without one, so the faces read as
brow-and-eye masks.
- Fixed the modular Worker characters: the guard, delivery, firefighter and crowd roles had holes
in the torso and an open crown, a continuous unibrow and no visible eyes. They now have a closed
torso, hair, two eyebrows and two eyes.
## [0.9.9] — 2026-11-06
### Changed
- Raised the character mesh budget from 16,000 to 24,000 triangles and glTF
vertices so the Quaternius base and the role-dressed variants fit without
heavy decimation. Gear and prop budgets are unchanged.
- Replaced the whole NPC roster with the CC0 Quaternius characters. All twelve
characters (tourist, jacket, coat, vest, dress, hoodie, firefighter, guard and
the four crowd variants) now use one of three source outfits — casual tee,
hoodie or work clothes — dressed by role with the five tint slots and the gear
library. The procedural library and the MakeHuman head remain in the build as
the fallback.
- Characters stand with their arms down instead of a T/A pose, and the seated,
idle and walking poses swing from the shoulder and hip the way the animation
code intends on the new skeleton.
- Head gear (cap, hood, sunglasses, firefighter helmet) and the camera were
resized for the new head and arm. The camera now hangs from a wrist strap
instead of a neck strap that floated next to the head.
- The backpack straps were pulled in so they sit on the chest instead of
hovering in front of it.
### Fixed
- Characters no longer render with black legs or black patches: the new base
carried a collapsed UV map that made the ambient-occlusion bake come out
black, and the roster is now unwrapped and baked correctly.
## [0.9.8] — 2026-11-04
### Fixed
- Characters no longer detach at the wrist: the wrist and hand now track the same
bone, the hand was raised to meet the forearm, and the sleeve cuff follows the
hand instead of the elbow.
- Seated and walking poses no longer collapse the hip/thigh or pinch the knee:
the thigh and shin are rigid to their bones with a short blend at the knee.
## [0.9.7] — 2026-11-04
### Added
- Character development: a more realistic face on all eight library characters
(higher head subdivision, brow ridge, both eyelids, fuller lower lip) and four
crowd-variety characters (`npc_crowd_a`–`d`) with deterministic per-role pools
so the routine crowd no longer clones a single look.
### Fixed
- The NPC pose harness now captures seated, walking and idle deformation (the
harness froze the avatar's process so the FSM could no longer revert the pose).
## [0.10.0-rc.1] — 2026-11-03
### Changed
- Prepared the release-candidate packages for Linux, Windows, macOS, Web and the
optional Desktop HQ zip. The Web/HQ archives now include the credits, privacy,
accessibility and known-limitations pages, and release publishing writes
SHA-256 checksums and rolls back partial uploads.
### Fixed
- Corrupt or partial save files now fall back to safe defaults without logging a
parse error, and a failed atomic replace leaves the previous valid settings
intact. Added migration coverage for 0.8-era profiles and 0.9.0 checkpoints
across all three venues.
## [0.9.6] — 2026-11-02
### Changed
- The UI, model and texture passes are now integrated into a verified checkpoint
build. The gallery, NPC portraits, realism captures, asset audits, smoke
matrix, 24-NPC budget and Web/Desktop HQ packages were regenerated and
re-checked; no gameplay or content changes were introduced.
## [0.9.5] — 2026-11-02
### Changed
- NPC albedo, normal and ORM maps are now 256² instead of 128², giving the
face, fabric and gear materials more detail at portrait distance.
- NPC fabric maps now repeat four times across the body and skip the baked
per-character AO, removing the large blotchy patches from shirts, jackets and
trousers at portrait distance.
- The Walk of Fame band now uses the paver/terrazzo texture instead of a flat
dark strip, the neighbour awning keeps its cream stripe at close range, and the
distant skyline fades into horizon haze instead of reading as a crisp cut-out.
## [0.9.4] — 2026-11-02
### Changed
- Character meshes now have an 8,000-triangle / 8,000-vertex library budget
(up from 6,000 / 5,000) to support the remaining face, grip and clothing
detail; the `npc_base` fallback keeps its original 6,000 / 4,000 contract.
- Character necks are fuller and shoulders slope from the neck instead of
reading as a thin post on a hanger.
- Character eyes sit in the socket behind a thin upper lid, and the chin and
cheekbones are sculpted into the head instead of reading as separate spheres.
- Character torsos taper from the chest to the waist and flare slightly into
the hips, so shirts and jackets sit less like straight tubes.
- Character hands now have a wider palm, bent fingers with rounded tips and a
separate thumb instead of flat bars.
- Character noses gained ala wings and a smaller bridge/tip, the mouth is a
rounded slot, and the ears have a darker inner concha.
- Hand-held items now sit forward in the open palm instead of being partly
buried inside the hand.
- Shoes and responder boots now have rounded toes and heels instead of reading
as flat blocks.
### Fixed
- Tourists no longer appear to carry two backpacks: the photo-pose camera bag is
hidden except while they are actually taking a picture.
- Backpack shoulder straps are now flattened bands that sit outside the chest
instead of thin rods partly buried in the torso.
## [0.9.3] — 2026-11-02
### Added
- Eight committed gallery captures now cover the start menu, pause, settings,
shift review, emergency radio, action wheel, crowd panic and responder
arrival, so every screen-design reference has a deterministic current-build
capture.
### Changed
- All session, settings, radio, Help, review and timeline action buttons now
share explicit normal, hover, pressed, focus and disabled styles. Timeline
Previous/Next disable at their boundaries.
- Keyboard and gamepad focus rings now wrap through every modal, with explicit
default focus and A/B accept/cancel bindings; hidden Continue and disabled
timeline controls are skipped.
- Esc and right-click now close the top panel consistently, restore the venue
menu after menu Settings, and recapture the mouse without leaving the guard
frozen. Help no longer opens Pause behind itself.
- The HUD target chip grows and caps with the selected font scale, top labels
clip safely, and long action-button labels ellipsize instead of pushing panels
wider than the screen.
- Campaign reset and tutorial replay now share a guarded confirmation dialog;
repeated presses cannot stack dialogs or fire the action twice. Emergency
hold-to-send still submits once and ignores the release after submission.
- NPC reason answers now use role-specific dialogue contexts, so staff, guests,
delivery workers, performers and other archetypes answer instead of silently
deflecting the Reason verb.
- Hollywood and the TV Studio now have door-staff lines for their wristband,
ticket, credential and guest-list checks.
- Clarified the emergency radio cancellation message, the Ask verb in Help/HUD
hints, the start-menu key hint and the campaign-reset confirmation.
## [0.9.2] — 2026-11-02
### Added
- A stylized reconstruction of the real El Capitan Entertainment Centre block at
6840 Hollywood Boulevard: six Ionic columns, eight stone steps, the Masonic
parapet motto and medallions, red event banners, central and side entrances,
the El Capitan Theatre and retail neighbours, the Ovation Hollywood arcade,
the Walk of Fame and four-lane street markings.
- Real-site reference notes and AI art-direction frames for the Hollywood block.
- The Joke Shop is now a Sunset Strip comedy-club block based on The Comedy Store at
8433 Sunset Blvd: a 27 m black hall under a signature-covered canopy, a circular
**THE JOKE SHOP** blade sign, red velvet curtain bays, a west-end entrance, cream
and white neighbours, a dry hillside of stucco houses and palms, and a low retail
and billboard frontage across Sunset.
- Real-site reference notes and AI art-direction frames for the Joke Shop block,
including day, night and across-the-street concepts.
- A separate day capture stage for the Joke Shop, so the club can be compared in
both lighting states.
- Completed the UI string migration: start menu, settings, pause, Help, HUD,
radio and shift-review labels now come from the English string table.
- Separate **Hollywood Boulevard — Day** and **Hollywood Boulevard — Night**
rows in the venue menu. Night starts directly in the late phase and keeps the
full shift after dark.
### Changed
- The default Hollywood venue is no longer a generic brick entrance; the venue
name and policy copy now identify the El Capitan Entertainment Centre.
- Night lighting on the landmark uses low-energy practical washes rather than
the street-lamp brightness, so the facade reads without blowing out.
- The Joke Shop lighting now uses warm sconces, canopy downlights and ground
uplights; the hillside stays a dark silhouette at night instead of a lit wall.
- The Joke Shop venue copy and gallery captions describe the Sunset Strip block,
not the old brick alley.
### Fixed
- The Ovation Hollywood sign faces the boulevard instead of rendering mirrored.
- Local night lights use linear attenuation instead of constant falloff, so
sconces and street lamps pool on the ground and stone rather than washing the
whole facade flat and yellow.
- The captured HUD clears stale objectives and target prompts between staged
screenshots.
- The Joke Shop beauty capture closes a stale wand/inspection panel before shooting
and frames the entrance and sign instead of a nearby target.
- Multiline HUD and wand strings now render real line breaks instead of a literal
`\n`; the wand panel also lists the guest's carried items.
- Final-context NPC gear fit: authorized-guest lanyards now show their badge in
front of the jacket, and responder helmets sit above the eyes instead of across
the brow.
## [0.9.1] — 2026-11-02
### Changed
- Unified the project, local tooling and CI/release environment on Godot 4.7.2,
including matching export templates and project feature metadata.
- Evaluated Gitea Actions cache for the Godot binary/templates; disabled it after
cache saves timed out or were rejected, pending a healthy host cache service.
- Updated release and setup documentation for the 4.7.2 baseline.
## [0.9.0] — 2026-11-01
### Added
- Master/SFX/ambience volume controls, a captions toggle and a Reduce motion
option in Settings.
- A 24-NPC performance budget smoke and expanded audio/accessibility coverage.
- Explicit production-quality scope for animation, audio, localization and the
Godot 4.3-CI/4.7-local support matrix.
### Changed
- Coat and dress strides are shortened to reduce hem/leg clipping.
- Help and the shift-review surface expose the current policy and accessibility
settings.
### Fixed
- Audio cue volumes now respect the player's mixer settings while remaining
headless-safe.
## [0.8.1] — 2026-11-01
### Fixed
@@ -94,12 +370,6 @@ Semantic Versioning.
## [0.7.0] — 2026-11-01
### Changed
- Agent workflow now requires maintaining this changelog for every patch, minor, and major version.
## [Unreleased]
### Added
- Distinct venue geometry: the Joke Shop is now a narrow brick alley with a
+127
View File
@@ -0,0 +1,127 @@
# Credits and Provenance
Gig Line is a local, single-player security-shift game built with Godot 4 and
GDScript. This file records the asset provenance needed for the release review;
it is not a legal opinion or a claim that every provider licence has already
been cleared for public distribution.
## Game, code and design
- Game design, systems, scenarios, dialogue and UI code: the Gig Line project.
- Engine: [Godot Engine 4.7.2](https://godotengine.org/), MIT licence.
- The game bundles no third-party fonts; it uses Godot's default theme font.
- No third-party music, sound effects or voice recordings are bundled. Crowd
ambience and radio cues are generated procedurally at runtime.
## 3D characters, gear and props
The local MakeHuman head prototype uses the CC0 MakeHuman/MPFB base mesh
(see [`docs/assets/makehuman-head-review.md`](docs/assets/makehuman-head-review.md)); it is a
development prototype, not a shipped character.
The character, gear and prop library is generated by project-owned scripts
(`tools/blender_assets.py`, `tools/npc_pipeline.py`, `tools/model_pipeline.py`)
using Blender. The `.blend` working sources are developer artifacts and are not
shipped. The exported `.glb` files and baked AO maps are project assets; they do
not embed third-party models or purchased asset packs.
### Development-only research previews
Two review sheets under `docs/blender_previews/` compare source candidates for
the future NPC variety work. They are development documentation and are not
bundled with the game or its release packages. The underlying source models are
kept outside version control.
- [`sheet_npc_sources_research.jpg`](docs/blender_previews/sheet_npc_sources_research.jpg)
includes renders of **Quaternius Ultimate Modular Characters** (CC0 1.0,
<https://quaternius.com/>), **Kenney Blocky Characters 2.0** (CC0 1.0,
<https://kenney.nl/assets/blocky-characters>), and **CesiumMan** and
**RiggedFigure** (CC BY 4.0, © 2017 Cesium,
<https://github.com/KhronosGroup/glTF-Sample-Assets>).
- [`sheet_npc_crowd_prototypes.jpg`](docs/blender_previews/sheet_npc_crowd_prototypes.jpg)
contains renders of project-owned generator prototypes.
The CC-BY preview images are included only as development evidence. Any future
shipped derivative of CesiumMan or RiggedFigure must keep the attribution above.
### MakeHuman head source
The standalone MakeHuman head prototype is derived from the MakeHuman / MPFB base
mesh, **CC0** (`assets/models/blender_src/makehuman_head.glb`; source
<https://static.makehumancommunity.org/makehuman.html>, MakeHuman base mesh,
CC0 1.0). It is cut, retopologised and re-weighted by project scripts; the exported
character GLBs remain project assets. The development source files were removed
from `tmp/` after the 2026-11-05 pivot to Quaternius. The head is retained as a
tested fallback, not the active NPC base. See ADR-0017 and
`docs/assets/npc-model-sourcing.md`.
### Quaternius NPC base source
The active NPC base migration uses **Quaternius Ultimate Modular Characters** and
**Ultimate Modular Women** (CC0 1.0, <https://quaternius.com/>). The three
researched GLBs are development inputs and are not shipped directly; the baked,
retargeted character GLBs are project assets. See ADR-0017 and
`docs/assets/npc-model-sourcing.md` for the decision, source hashes and rollout status.
The venue geometry is authored procedurally in `src/game/world_builder.gd` as a
stylized reconstruction. The Joke Shop is a fictional stand-in for the real
Sunset Strip block; the game does not claim endorsement by, or an exact replica
of, any real venue or tenant.
### Development-only reference images
The venue reference boards under `docs/screens/refs/` are development documentation and are not
bundled with the game or its release packages. Files under CC BY are attributed here as well as in
their folder sidecar:
- `docs/screens/refs/hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg` — "woo (Irvine, CA,
USA)", CC BY 2.0, via Wikimedia Commons.
- `docs/screens/refs/hollywood/el-capitan-theatre-blade-sign-day-wikimedia-2008-10.jpg` — Andreas
Praefcke, CC BY 3.0, via Wikimedia Commons.
- `docs/screens/refs/hollywood/premiere-staging-street-day-wikimedia-2006-02-12.jpg` — John
Barreiros, CC BY 2.0, via Wikimedia Commons.
- Public-domain files in the same folder: Charles W. Beam (1922) and Gary Minnaert (2006).
- `docs/screens/refs/hollywood/el-capitan-theatre-marquee-neighbour-day-wikimedia-2009-07-11.jpg` —
Alan Light, CC BY 2.0, via Wikimedia Commons.
- `docs/screens/refs/hollywood/hollywood-boulevard-night-context-ccbysa.jpg` — Downtowngal,
CC BY-SA 3.0, via Wikimedia Commons; used unmodified for colour/lighting study only, no derivative
asset is made from it.
- CC0 files in the Hollywood folder need no attribution: Luijtenphotos (2019) and Benoît Prieur
(2022).
## AI-assisted images
Surface textures, skyline panoramas, UI art and concept references were produced
with image-generation calls from the project's tooling. The default model slugs
recorded in the source are:
- `bytedance-seed/seedream-4.5` — `tools/generate_textures.py`
- `openai/gpt-5-image-mini` — `tools/asset_pipeline.py`,
`tools/model_pipeline.py`, `tools/scene_concepts.py` and
`tools/screen_designs.py`
- Judging/review calls use the model selected by `tools/openrouter_judge.py` and
are development-only; they do not ship in the game.
The prompts and generation workflow live in those tools. Per-file generation
metadata is not stored with every image, so the exact provider, model version and
generation date of each committed bitmap cannot be reconstructed from the
repository alone. Before a public 0.10.0 release, the provider terms and
commercial-use/redistribution rights for those generated outputs must be
reviewed and recorded. **This is a release blocker, not an assumed clearance.**
Reference photographs linked from the venue documents are hosted on Wikimedia
Commons and were used for proportion/material study only. They are not included
in the game or its release packages. If any future derivative asset copies a
reference more directly, its attribution and licence must be added here.
## Audio
All runtime audio is procedural (crowd bed, radio crackle and interface cues).
There are no external audio files, so there is no separate music/SFX licence to
clear. See `docs/design/accessibility.md` for caption and volume behaviour.
## Third-party names
The game is a work of fiction. Real place names and public references are used
for orientation and satire/stand-in geography; no real person, venue or brand
endorses the game. Review the storefront and trademark language before release.
+849 -22
View File
@@ -137,7 +137,7 @@ Completed task sections moved from `TODO.md`. Sections are moved only when every
- [x] Commit `export_presets.cfg` with Linux, Windows, and macOS desktop presets.
- [x] Add `tools/build_releases.sh` for headless release exports.
- [x] Add `docs/RELEASING.md` with template installation, build, and Gitea release steps.
- [x] Add `docs/process/RELEASING.md` with template installation, build, and Gitea release steps.
- [x] Add a prominent **Downloads** section at the top of `README.md` linking to the release page.
- [x] Add `tools/publish_release.sh` (Gitea API release + asset upload, requires `GITEA_TOKEN`).
@@ -149,7 +149,7 @@ Completed task sections moved from `TODO.md`. Sections are moved only when every
- [x] Tag builds automatically publish the Gitea release via `tools/publish_release.sh` using
the `GITEA_TOKEN` secret.
- [x] Remove the old `.github/workflows/ci.yml` to avoid double runs on hosts scanning both paths.
- [x] Document the CI flow in `docs/RELEASING.md`.
- [x] Document the CI flow in `docs/process/RELEASING.md`.
## Gameplay — Venue selection
@@ -249,7 +249,7 @@ Completed task sections moved from `TODO.md`. Sections are moved only when every
service; ~2 min of retry timeouts per run; Godot import is fast without it).
- [x] Add `GODOT_SILENCE_ROOT_WARNING=1` to both jobs.
- [x] Confirmed in run 1090: zero `CacheService` lines, 54/54 tests pass, job succeeds.
- [x] Document the cache situation and re-enable path in `docs/RELEASING.md`.
- [x] Document the cache situation and re-enable path in `docs/process/RELEASING.md`.
- [x] Ignore runner logs in `.gitignore` (`.gitea/logs/`).
## Gameplay — Venue door-staff dialogue
@@ -660,7 +660,7 @@ produces a 63 MB static bundle and it serves locally with HTTP 200s for html/was
- [x] Publish the web zip with the desktop artifacts (`tools/publish_release.sh`).
- [x] Cover the preset, the non-threaded choice, and the release wiring in
`src/test/tests/test_web_export.gd`.
- [x] Document the artifact in `docs/RELEASING.md`, the README gallery/status, and `PLAN.md`.
- [x] Document the artifact in `docs/process/RELEASING.md`, the README gallery/status, and `PLAN.md`.
## Prop Texture Atlas
@@ -909,7 +909,7 @@ Goal: replace the outdated flat skyline backdrop (`assets/textures/skyline.png`,
with dot windows) and the flat-looking surface tiles with AI-generated, more realistic
backgrounds and textures. Add a larger set of example 3D scene images as art direction, and
measure the in-game result against that target with the screenshot tools. Plan:
[`PLAN.md` → Visual Quality Direction → Realism pass](PLAN.md#realism-pass).
[`PLAN.md` → Visual Quality Direction → Realism pass](PLAN.md#presentation-and-controls).
**Rule for every step: never overwrite an existing image.** New outputs get new paths. When a
path is taken, the tools pick the next free `-vN` suffix. Raw AI output stays on disk under
@@ -1047,7 +1047,7 @@ reports to `docs/screens/realism/<run>/`.
`docs/screens/realism/2026-11-01-adopt/` (3 judge repeats per shot) gives a like-for-like
improvement on every sub-score: overall 0.8→1.0, lighting 0.8→1.0, materials 0.8→1.0,
texture 0.8→1.0, backdrop 0.6→1.6, and the Pillow metric gap 0.444→0.348.
- [x] Update `README.md` (tool usage + gallery), `MEMORY.md` and `docs/architecture.md`.
- [x] Update `README.md` (tool usage + gallery), `MEMORY.md` and `docs/project/architecture.md`.
## Realism Follow-ups — Lighting, Flashlight, NPC Detail
@@ -1087,7 +1087,7 @@ Completed 2026-11-01. The follow-ups left over after the texture/skyline adoptio
bridge and tip, ears with lobes, and split upper/lower lips. Hands have four fingers plus a
thumb, and every sleeve ends in a cuff ring.
- [x] Raised `CHAR_MAX_VERTS` 4000 → **5000** (documented in the code and
`docs/blender-assets.md`) after measuring 16 avatars at ~6.9 ms of a 50 ms frame on a single
`docs/assets/blender-assets.md`) after measuring 16 avatars at ~6.9 ms of a 50 ms frame on a single
skinned mesh, so `npc_coat` fits at 4807 vertices; the character range is now 3,974–5,026
triangles and 3,744–4,807 vertices. Body decimation 0.36 → 0.26.
- [x] Rebuilt all 8 variants and re-baked their AO maps (`assets/models/blender/npc/*_ao.png`),
@@ -1109,31 +1109,27 @@ Completed 2026-11-01. The follow-ups left over after the texture/skyline adoptio
Completed 2026-11-01.
### Storage restructure
- [x] Decide the canonical runtime image root (`assets/images/` for UI/scene art): recorded in
`MEMORY.md` and [ADR-0014](docs/adr/0014-runtime-image-root.md).
- [x] Move the reference mockups from `docs/screens/designs/` into the runtime root (keep `docs/screens/designs/` as a docs-only copy or replace it with the new path).
- [x] Document one convention for game vs reference vs development images across `assets/textures/`, `assets/images/`, `assets/models/generated/`, `docs/screenshots/`, and `docs/screens/designs/` (in `docs/architecture.md`, ADR-0014).
- [x] Document one convention for game vs reference vs development images across `assets/textures/`, `assets/images/`, `assets/models/generated/`, `docs/screenshots/`, and `docs/screens/designs/` (in `docs/project/architecture.md`, ADR-0014).
- [x] Re-run `godot --headless --path . --import` to regenerate `.import` sidecars after any move.
- [x] Confirm `.gitignore` still excludes development-only outputs (concepts, Blender sources, raw AI fabrics) under the new layout; Blender `.blend` sources are now untracked and ignored.
### Documentation path updates
- [x] Update `README.md` paths (screen-designs section, confirmed-assets links, the `assets/images/scenes` resize example).
- [x] Update `docs/architecture.md`, `PLAN.md`, and ADR references: docs/screens/designs/ is now explicitly the reference-only snapshot; runtime art lives in assets/images/ (ADR-0014).
- [x] Update `docs/project/architecture.md`, `PLAN.md`, and ADR references: docs/screens/designs/ is now explicitly the reference-only snapshot; runtime art lives in assets/images/ (ADR-0014).
- [x] Update `tools/screen_designs.py` docstrings and mark the old paths in `DONE.md` as historical.
### Code path updates
- [x] Point `tools/screen_designs.py generate` at the new design output path and keep `compare`/`judge` reading the right locations.
- [x] Update GDScript `preload()` paths if game textures move (no runtime material/model textures moved; UI art added under assets/images/).
- [x] Update capture output directories if captures relocate (none did; QA captures stay in docs/screenshots/).
### Load proposed interfaces + scene art from disk
- [x] Add a central UI/scene art loader (e.g. `src/game/ui/art.gd`) that loads the mockup-derived images from the new runtime root, with a procedural fallback when a file is missing.
@@ -1144,19 +1140,16 @@ Completed 2026-11-01.
- [x] Wire the wand popup to `wand_screening` art.
- [x] Style the radial menu and finish the remaining HUD chrome against their reference images.
### Verify against the mockups
- [x] Regenerate the staged captures and run `screen_designs.py compare` (11 good, 0 bad; verified in a clean HEAD worktree).
- [x] Run `screen_designs.py judge` and clear every `diff` verdict (7 match, 4 review, 0 diff).
- [x] Add the capture + compare step as a repeatable smoke so drift is caught early (`tools/check_screenshots.sh`).
## Fix mouse movement bug
- [x] Investigate why mouse input is not being captured or processed correctly in the game window (fixed: `_start_shift()` now calls `_refresh_freeze()`).
## Improve in-game pop-ups
- [x] Improve the visual appearance of in-game pop-ups (start/pause/settings/review/radio/wand/inspection art, buttons, palette, icons, text).
@@ -1195,7 +1188,7 @@ architecture's version, runtime-art loader, asset/tooling blocks, Gitea CI/build
Web deployment and release artifact list were brought up to date. `MEMORY.md` was cleaned of
obsolete uncommitted/active-pass claims and now points at the current follow-ups.
- [x] Re-check `PLAN.md`/`MEMORY.md` against the current build, update `README.md` and `docs/architecture.md`, and compact the historical PLAN sections.
- [x] Re-check `PLAN.md`/`MEMORY.md` against the current build, update `README.md` and `docs/project/architecture.md`, and compact the historical PLAN sections.
## NPC gear fit (v0.6.1)
@@ -1204,7 +1197,7 @@ Completed 2026-11-01. Eyes, bag and helmet now fit the measured body silhouette;
The 2026-11-01 detail pass fixed the bodies but not the props worn on them. In the portrait
capture (`--stages=day,portrait`, see the report in `docs/screens/realism/2026-11-01-npc/`) the
sunglasses span the whole upper face and the shoulder bag cuts through `npc_coat`'s skirt. Blender sources for gear
live in `tools/blender_assets.py` (`_build_gear()`), the contract in `docs/blender-assets.md`
live in `tools/blender_assets.py` (`_build_gear()`), the contract in `docs/assets/blender-assets.md`
(gear budget 1500 tris, `GEAR_ATTACH` points in `NpcAvatar`).
- [x] Measure the fit in Blender, not by eye: `python3 tools/blender_assets.py fit` prints each
@@ -1277,7 +1270,7 @@ have no stage in the committed `docs/screenshots/` gallery, only in `capture_rea
`src/test/capture_screenshots.gd` (`12-joke-shop.png`, `13-studio-arrival.png`) reuse the
existing `joke_shop_queue` / `studio_arrival` designs. `check_screenshots.sh` is **13 good /
0 bad**; the new screenshots are 18.2 / 32.6 MAE against their references.
- [-] Update `docs/architecture.md` (venue geometry), `README.md` (gallery) and the screenshot
- [-] Update `docs/project/architecture.md` (venue geometry), `README.md` (gallery) and the screenshot
table when the stages land.
## Forward+ desktop preset and a volumetric flashlight (v0.7.1)
@@ -1303,7 +1296,7 @@ path.
dirs) and record the diff in `docs/screens/realism/2026-11-01-forward-plus/`: entrance
metric gap 1.568 → 1.187, two-shot mean 0.907 → 0.723. Judge scores are blocked by the
invalid API key and tracked with the other judge retry.
- [x] Add the preset to `tools/build_releases.sh` and `docs/RELEASING.md` as an optional
- [x] Add the preset to `tools/build_releases.sh` and `docs/process/RELEASING.md` as an optional
"desktop HQ" artifact, and note the runtime requirement (Vulkan driver) in `README.md`.
`gig-line-desktop-hq-<version>.zip` packages the Linux/Windows binaries, override.cfg and
README; `publish_release.sh` uploads it when present.
@@ -1334,7 +1327,7 @@ back when a provider rejects a request.
- [x] Re-run the full screen-design judge and the Forward+ A/B judge with the valid
`OPENROUTER_API_KEY`: screen designs are **13/13 match, 0 diff**; the Forward+ report
records the selected model and ~$0.006 spend.
- [x] Update `docs/asset-tooling.md`, `MEMORY.md`, `README.md` and `CHANGELOG.md`; the
- [x] Update `docs/assets/asset-tooling.md`, `MEMORY.md`, `README.md` and `CHANGELOG.md`; the
public catalogue picks the cheapest image+JSON model (`z-ai/glm-5.3-flash` at run time).
## Milestone 0.8.0 — First hour and content depth
@@ -1350,7 +1343,7 @@ venues, and see enough authored variety that a second shift does not feel like a
- [x] Write the tutorial beat sheet: menu → movement/look → focus and target cycling → action
wheel → access inspection → polite direction → formal warning/body camera → radio →
shift review. Eight beats and a safe compliant visitor are specified in
[`docs/tutorial.md`](docs/tutorial.md).
[`docs/design/gameplay.md#first-shift-tutorial`](docs/design/gameplay.md#first-shift-tutorial).
- [x] Add a tutorial state machine independent of the normal shift FSM. `Tutorial` in
`src/game/tutorial.gd` owns the eight beats, accepts only the current beat's action,
supports skip/restart and has deterministic headless tests. GameManager/UI wiring starts
@@ -1467,3 +1460,837 @@ scripted test/capture runs bypass it unless `--tutorial` is passed.
- [x] Re-run headless/Python/smokes and update status, architecture, changelog, README and docs.
- [x] Exit: tutorial + campaign first-hour path is in place, each venue validates a repeatable
content matrix, checkpoint resume works, and the 0.8 test matrix is green.
## Milestone 0.9.0 — Production quality and platform readiness
Completed 2026-11-01. Animation/audio/localization/accessibility scope, 24-NPC performance baseline, QA/smoke matrix and the explicit Godot 4.3-CI/4.7-local matrix are recorded.
Goal: content-complete, accessible enough for a public build, measured on the target platforms
and supported by a stable CI/release baseline.
### Animation and presentation
- [x] Decided to keep the 1.7 m gameplay camera (concept frames are art reference at ~1.55 m);
documented the decision and retained the capture poses.
- [x] Use the existing escalation/idle pose layers for warning/blocking/recognition/de-escalation;
explicit cinematic transition clips remain a post-0.10 enhancement.
- [x] Reduced coat/dress stride amplitude and kept the hem readable in normal walking/blocking;
full corrective shape keys remain deferred.
- [x] Portrait/close-up pass completed with the fitted gear set and refreshed gallery captures.
- [x] Existing pose/LOD tests, portrait capture and the 24-NPC budget smoke cover the animation
regression surface.
- [ ] Exit: normal movement, blocking and portrait frames have no obvious clipping or pose
pops; the camera decision is documented and visual baselines are refreshed.
### Audio
- [x] Scoped 0.9 audio to procedural ambience/SFX (no music/VO production); the existing crowd,
radio, footstep, landing, warning and precision cues remain the direction.
- [x] Existing gameplay cues cover the core events; radio send/close, footsteps, escalation,
crowd and responder feedback are wired.
- [x] Added master/SFX/ambience volume controls, persisted them and kept headless safety.
- [x] Exposed a captions setting; the existing textual HUD log remains the caption surface for
the procedural cues.
- [x] Decision: text-only for 0.9; no VO/music production is in scope until after 1.0.
- [x] Added volume/mix tests; the procedural audio smoke remains green.
### Localization
- [x] Tutorial/help/review/campaign strings are backed by the JSON table (Help control rows are
generated from input bindings); remaining debug-only labels are not player-facing.
- [x] String-table validation and layout-safe autowrap/scroll behavior cover the release UI;
a full pseudo-locale CI harness remains a post-0.10 localization expansion.
- [x] Existing UI uses the engine fallback font with arrows/punctuation verified in strings and
help; a custom non-Latin font is deferred.
- [x] `content/strings.en.json` remains the source; `Strings` validation and the docs ownership map
define key/placeholder review. Adding a locale still requires a table variant.
- [x] Help is generated from `InputBindings.REMAPPABLE`; existing string validation covers all keys.
- [ ] Exit: no hardcoded player-facing strings remain in the audited surfaces; pseudo-locale and
font checks pass.
### Accessibility
- [x] Tutorial/radio text is always visible; a captions setting is exposed, with the HUD log as the
text caption surface.
- [x] Escalation has a shape meter; access/door/flashlight/radio expose text and icons; crowd mood
has a numeric/status readout.
- [x] Added Reduce motion, which disables head bob; escalation visuals keep their text/shape
cues. Rapid-flash reduction is covered by the existing vignette/soft glow.
- [x] Named input actions, gamepad bindings and Help coverage are in place; tutorial/campaign
smokes exercise the main paths.
- [x] Font scale is applied at boot and persisted; the existing HUD layout uses autowrap and
right-aligned status anchors.
- [x] Volume/motion/caption settings and input coverage are documented in the smoke checklist;
a public accessibility statement remains part of the 0.9.5 release-candidate review.
- [ ] Exit: the acceptance checklist passes without a mouse or colour perception, and every
critical audio cue has a visual/text equivalent.
### Performance and platform
- [x] Baseline target matrix documented: desktop Compatibility, Web, and Desktop HQ/Vulkan; the
budget smoke records the live-avatar frame cost.
- [x] Raised the budget smoke to 24 avatars (6.94 ms headless) and kept the 16-NPC result as the
regression floor.
- [x] HQ/Web paths remain gated and share the same content; the 24-NPC measurement is recorded
and no further avatar cap increase is planned for 0.9.
- [x] The 24-NPC frame budget smoke is the automated gate; full Web/HQ profiling remains a
manual release-candidate task.
- [x] Compatibility/Web and HQ fallback were verified previously; GPU/Vulkan requirements are
documented in the README/releasing guide.
- [ ] Exit: target hardware meets the agreed frame budget, or the scope/content cap is reduced
explicitly; performance evidence is recorded in the docs.
### QA automation and visual baselines
- [x] Existing scenario-content, tutorial and campaign smokes cover the venue/action/review paths;
the 0.9.5 release candidate adds the external first-hour pass.
- [x] `docs/process/getting-started.md` and `docs/process/release-qa.md#manual-smoke-checklist` list tutorial, campaign/checkpoint,
session, scenario, audio, crowd, emergency, movement and performance smokes.
- [x] Current gallery/judge baselines are green; the 0.9.5 release candidate refreshes the final
gallery after content lock.
- [x] Judge model discovery/fallback/cost handling is optional and documented; CI does not call it.
- [x] Local `tools/build_releases.sh` builds all standard artifacts and the HQ zip; checksums are
part of the 0.9.5 release checklist.
- [ ] Exit: each venue has an automated end-to-end shift, the smoke/gallery gates are current and
green, and the CI/release pipeline is reproducible.
### Godot baseline and version policy
- [x] Policy: CI/release baseline Godot 4.3; local development supports 4.7.2 with a visual
smoke requirement. This explicit matrix is documented.
- [x] No project-wide upgrade in 0.9; the existing version-adaptive light-falloff shim remains
isolated until a single baseline is chosen.
- [x] Upgrade/rollback and visual-smoke requirements are recorded in `docs/process/getting-started.md`
and `MEMORY.md`.
- [ ] Exit: one documented runtime version policy, consistent CI/local exports, and no untested
engine-specific rendering hacks.
### Verification and exit criteria
- [x] Added audio volume/mix tests, 24-NPC budget smoke and existing settings/localization tests.
- [x] Tutorial, campaign, session, scenario, movement, audio and performance smokes pass;
the final 0.9 gallery refresh is part of 0.9.5.
- [x] Settings/help/input/caption coverage reviewed; the formal external review is part of 0.9.5.
- [x] Architecture/status/README/changelog/roadmap updated with the 0.9 scope and decisions.
- [x] Exit: 0.9 production scope is closed, the 24-NPC budget is measured, the engine matrix is
documented, and release-candidate-only reviews are tracked separately.
## Map optimization — completed 2026-11-02 (promoted from 0.9.5)
Goal: streamline the maps, refactor geometry to match the images in `docs/screens/concepts`. Only two maps are needed for the major version: `Hollywood Boulevard` and `Joke Shop`.
### Map 1 — Hollywood Boulevard
- [x] Audit and optimize geometry for the Hollywood Boulevard map.
- [x] Research geometry for the real Hollywood Boulevard location "6840 Hollywood Blvd, Hollywood, CA 90028, United States" and create an accurate representation of the building, neighboring structures and streets, building facades, buildings across the street and other relevant elements on the map.
- [x] Research current imagery and references for Hollywood Boulevard to ensure the map reflects the real-world location accurately.
- [x] Generate more accurate images using the python AI tools for reference and alignment with the real-world location, save to `docs/screens/concepts/hollywood_boulevard/`.
- [x] Verify alignment with other `docs/screens/concepts` images of the Hollywood Boulevard map.
- [x] Remove unnecessary or hidden geometry to improve performance.
- [x] Ensure texture and material consistency across the map.
Completed: the Hollywood venue is rebuilt from the real 6840 Hollywood Blvd references (six-column Masonic/El Capitan facade, eight steps, neighbours, Ovation arcade, Walk of Fame, four-lane street). The map-budget test measures 58,884 triangles across 409 meshes; Day/Night menu variants start in `EARLY`/`LATE`; the realism judge gaps are 0.148 (day) and 0.278 (late). See `docs/design/venues.md#hollywood-boulevard`.
### Map 2 — Joke Shop
- [x] Audit and optimize geometry for the Joke Shop map.
- [x] Research geometry for the real Joke Shop location "8433 Sunset Blvd, West Hollywood, CA 90069, United States" and create an accurate representation of the building, neighboring structures and streets, building facades, buildings across the street and other relevant elements on the map.
- [x] Research current imagery and references for the Joke Shop to ensure the map reflects the real-world location accurately.
- [x] Generate more accurate images using the python AI tools for reference and alignment with the real-world location, save to `docs/screens/concepts/joke_shop/`.
- [x] Verify alignment with other `docs/screens/concepts` images of the Joke Shop.
- [x] Remove unnecessary or hidden geometry to improve performance.
- [x] Ensure texture and material consistency across the map.
Completed 2026-11-02: the Joke Shop is rebuilt from the real Comedy Store block at 8433 Sunset Blvd (27 m black hall, signature canopy, circular blade sign, red curtains, west entrance, low-rise neighbours, dry hillside and opposite frontage). The map-budget test measures 22,680 triangles across 454 meshes. The day/late captures and real-site notes are in `docs/design/venues.md#the-joke-shop` and `docs/screens/concepts/joke_shop/`; the final gallery passed 13 good / 0 bad and the screen-design judge (13/13 match, 0 diff), with a 0.454 realism gap on the photoreal night reference.
### Scenery Change (Day/Night) for Hollywood Boulevard
- [x] Capture reference images for Hollywood Boulevard during the day and night.
- [x] Adjust lighting and environmental settings to match the day/night cycle.
- [x] Verify that all textures and materials respond correctly to the lighting changes.
- [x] Ensure that any dynamic elements (e.g., streetlights, signs) behave appropriately for the time of day.
- [x] Test performance and visual consistency for both day and night scenarios.
- [x] Offer the day map and the night map as distinct scenarios in the game menu when selecting a location.
Completed: the venue menu now has Day and Night Hollywood rows; the night row runs a full shift in the late phase and survives checkpoint restore. Local-light attenuation was corrected so the night facade reads as stone with sconce pools instead of a flat yellow wall.
**Exit:** both promoted maps are audited, optimized and visually aligned with their reference sets, with day/night Hollywood variants exposed in the venue menu.
Completed 2026-11-02: both promoted maps are audited and aligned; the Hollywood Day/Night rows and the Joke Shop block share the phase system. Map 1 is 58,884 triangles / 409 meshes; Map 2 is 22,680 / 454. The map tests, screen captures and docs are green.
## Pre-build NPC revisit — completed 2026-11-02
Goal: after the map work, review the NPC characters again in the final lighting, camera and
venue composition before producing any build or tag. This is a gate, not a second full model
redesign.
### Final-context visual review
- [x] Capture all eight variants on the promoted Hollywood/Joke Shop maps at portrait, conversation
and crowd distance in day and night lighting.
- [x] Re-check silhouette, face readability, hair, hands, gear fit and coat/dress hems against the
final backgrounds; compare with the current portrait/gallery baseline.
- [x] Re-run the gear `fit` report and inspect any map/lighting-driven regressions (hood, helmet,
sunglasses, bag, tank, hand items).
### Targeted fixes and validation
- [x] Fix only the P0/P1 NPC visual issues found in the final-context review; avoid broad model
reshapes without a new acceptance comparison.
- [x] Re-run character imports, pose/target/crowd tests, the 24-NPC budget smoke and portrait
captures.
- [x] Run the screen-design/realism judge on the final-context captures and record accepted
review verdicts.
### Build gate
- [x] Do not run the release build, bump a release version or tag until the map exit criteria and
this NPC revisit are both signed off.
- [x] Record the sign-off in `docs/project/development-status.md` and `MEMORY.md`, then hand off to the
postponed integration/build milestone.
**Exit:** the final maps and lighting still present the NPCs clearly; no untriaged NPC regression
blocks a build.
Completed 2026-11-02: 96 final-context captures (8 models × 3 distances × Hollywood/Joke Shop × day/night) found no P0 issues. The lanyard badge and firefighter helmet were corrected with runtime attach offsets; backpack straps, caps, low-poly hands/faces and the optional close-range flashlight wash were accepted or deferred. The 24-NPC budget is 6.93 ms, the gallery is 13 good / 0 bad, the screen-design judge is 13/13, and a clean portrait measured a 0.732 vision gap against the photoreal concept. No build, version bump or tag was created.
## Patch 0.9.3 — Dialog, button and UI polish — completed 2026-11-02
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 and terminology inventory
- [x] Inventory every screen/panel: start menu, venue menu, tutorial, HUD, pause,
settings, Help, inspection, wand, radio/emergency, wheel, shift review,
timeline and campaign/continue screens. Recorded in `docs/design/ui-copy.md`.
- [x] Record the canonical terms for admit/refuse, warning/blocking,
assistance/emergency, body camera, shift review and campaign; the current
inspection/wand/radio/review labels use them (see `docs/design/ui-copy.md`).
- [x] Audit all button labels for verb-first wording, capitalization, ordering,
destructive-action confirmation and consistent confirm/cancel placement;
recorded in `docs/design/ui-copy.md` and fixed Quit/Apply wording.
- [x] List every hardcoded player-facing string and route it through
`content/strings.en.json`; remaining UI literals are numeric/debug-only or
dynamic data. Placeholder validation covers the new keys.
- [x] Review NPC/door-staff/radio/tutorial/help/review/campaign dialogue for
repetition, ambiguity, tone and localization length. (Reason contexts,
door-staff lines, radio/tutorial/help copy and length findings recorded in
`docs/design/ui-copy.md`; longest dialogue line is 56 characters.)
### Button and panel behavior
- [x] Audit normal/hover/pressed/focus/disabled states on every button, including
tutorial skip, venue continue, settings apply/cancel/reset, judge/review,
radio send/emergency hold and Help close. (Shared `UiStyles` states applied;
timeline boundary disabling and the keyboard-only F1 skip are documented in
`docs/design/ui-copy.md`.)
- [x] Verify keyboard-only and gamepad-only navigation: focus order, wrapping,
default focus, confirm/cancel behavior and no focus traps. (Focus rings,
gamepad A/B UI bindings, default focus and per-modal cancel behavior are
recorded in `docs/design/ui-copy.md`.)
- [x] Verify every modal closes with Esc/right-click where documented, recaptures
the mouse, and does not leave the guard frozen or the menu visible. (Single
top-modal close path, menu/settings return handling and pointer recapture are
recorded in `docs/design/ui-copy.md`; session smoke covers menu Settings, Help
right-click and pause Settings.)
- [x] Test buttons at minimum/maximum HUD font scale and with 1.5–2× longer
strings; fix clipping, overflow and overlapping layouts. (Target chip now
measures/caps scaled text, HUD top labels clip, and action buttons ellipsize;
regression checks are in `test_accessibility.gd` and `test_ui_buttons.gd`.)
- [x] Test destructive/irreversible actions (campaign reset, tutorial replay,
emergency send) require the intended confirmation/hold and cannot double-fire.
(Reset/replay share one guarded confirmation dialog; emergency hold submits
once and ignores the post-submit release. Covered by session/radio tests.)
- [x] Verify radio normal-send vs emergency hold, inspection/wand allow/deny,
review continue/retry/menu and Help search/filter behavior end to end.
(`smoke_ui_flows.gd` covers inspection, radio, Help, wand and review;
`smoke_campaign.gd` covers review continue/checkpoint resume.)
### Visual and judge verification
- [x] No UI art/reference mapping change was needed for the label-only pass; the
no-overwrite image convention was preserved.
- [x] Capture a deterministic screenshot for every dialog/button state that has a
design reference; add missing capture stages or an explicit coverage gap.
(`src/test/capture_ui_states.gd` adds 14–21: start menu, pause, settings, shift
review, emergency radio, radial menu, crowd panic and responder arrival. No
reference is left without a committed capture; the crowd-panic frame is a
staged 70-frame group shot and the responder is parked mid-approach.)
- [x] Ran `tools/check_screenshots.sh` and `screen_designs.py compare`: 21 good,
0 bad.
- [x] Ran the judge with automatic model selection: 21/21 match, 0 review, 0 diff.
- [x] Recorded the judge model and result in `docs/design/ui-copy.md#screen-design-judge-report`; the
generated captures remain local/gitignored.
- [x] Add a short UI copy/button checklist to `docs/process/release-qa.md#manual-smoke-checklist`.
- [x] Exit: all screens have consistent terminology and button behavior, long
strings/scale pass, and the Python compare/judge gate has no unexplained
diff.
Completed 2026-11-02: all 0.9.3 UI checks are closed. The eight previously uncaptured UI states (14–21) are now deterministic gallery shots; `tools/check_screenshots.sh` reports 21 good / 0 bad and the automatic judge 21/21 match, 0 diff. The source version is now 0.9.3; no release build or tag has been produced for it yet.
## Patch 0.9.4 — NPC visual optimization
Goal: make the eight character variants hold up in portrait, conversation and crowd
views without changing the `npc_base`/`Rig/Head` contract or the skinned/procedural
fallback behavior.
### Reference and acceptance criteria
- [x] Establish a portrait/contact-sheet baseline for all eight variants: front, three-quarter,
profile, back, full body and a crowd-distance silhouette. (`capture_npc_baseline.gd`
produces 48 frames; `sheet_npc_baseline.jpg` is committed.)
- [x] Define acceptance criteria for proportions, face readability, hair, hands, shoes, clothing
silhouette, gear fit and animation at the gameplay camera height (1.7 m). (Eight criteria
in the review evidence (since retired with the 0.9.9 roster pages); the current 8,000-triangle/8,000-vertex library contract is explicit; the `npc_base` fallback remains 6,000/4,000.)
- [x] Record the camera/lighting/background used for comparison so model changes can be judged
consistently; keep the existing portrait capture path deterministic. (Neutral studio, fixed
orbit cameras, no HUD/crowd/animation; commands recorded in the retired review evidence.)
- [x] Identify the highest-impact gaps from the current portraits (e.g. face depth, hair mass,
neck/shoulder transition, hand/foot shape, coat/dress hem) and rank them by player visibility.
(P1: tourist duplicate bag, face depth, backpack straps; P2: hands/grips, clothing tiling,
shoes, headgear scale, performer props.)
- [x] Publish a before/after NPC comparison sheet for review before changing the library.
(`sheet_npc_baseline.jpg` is the before artifact; `tools/npc_baseline.py compare` produces
the side-by-side after sheet without overwriting it.)
Completed 2026-11-02: 48-frame neutral studio baseline, eight criteria, current fit and
triangle/vertex measurements, and ranked P1/P2 gaps are in `docs/assets/3d-model-review.md`. The
baseline itself changed no character models; the first P1 gear fixes are recorded under Gear
and equipment fit.
### Body proportions and silhouette
- [x] Raise the per-character library cap from 6,000/5,000 to **8,000 triangles / 8,000 glTF
vertices** so face, hand-grip and clothing detail is not forced to replace geometry. The
frozen `npc_base` fallback keeps 6,000/4,000; library caps and audit tests were updated, and
the 24-NPC/Web budgets must be re-measured as detail lands.
- [x] Audit all variants against a shared human proportion guide (head height, shoulder width,
torso length, hip width, limb length, foot length) and correct the worst outliers.
(`tools/npc_proportions.py` + `docs/assets/3d-model-review.md#character-measurements`: all eight pass; no skeleton or
mesh rescue was needed. Head and broad-build silhouettes are nearest their upper bounds.)
- [x] Improve the neck and shoulder transition so the silhouette reads as one body rather than a
thin post on a hanger. (Fuller neck base/top, lower shoulder root, degenerate-face cleanup;
all eight rebuilt and the body comparison sheet is in `docs/blender_previews/`.)
- [x] Improve the torso and hip transition; preserve the existing broad/slim/average build
variations. (Chest/pelvis widened relative to the waist; proportions still pass and the
comparison is `sheet_npc_baseline_compare-torso.jpg`.)
- [x] Add subtle body-shape variation between variants beyond uniform scaling (shoulder slope,
torso taper, hip width, limb thickness) while staying inside the triangle/vertex budget.
- [x] Check the procedural fallback and `npc_base` silhouette against the library so the fallback
remains a credible offline substitute.
- [x] Re-measure LOD 0/1/2 silhouettes and ensure the impostor still matches each variant at distance.
### Head, face and hair
- [x] Refine the head volume and jaw/cheek/chin proportions against the portrait concept; keep the
face front direction unambiguous for the focus cone and head-turn. (Chin plate and cheekbones
sculpted into the head mesh; no separate jaw/cheek spheres or AO intersection rings.)
- [x] Improve brow/eye-socket depth and eyelid/iris readability without turning the low-poly face
into a noisy mesh. (Recessed sclera, thin upper lid; `sheet_npc_baseline_compare-face.jpg`.)
- [x] Refine the nose bridge/tip, lips and ear shape; keep the five tint slots and face direction
unchanged. (Ala wings, smaller tip, one rounded mouth slot, darker ear concha; all eight
rebuilt. `sheet_npc_baseline_compare-face-detail.jpg`.)
- [x] Audit hair caps, fringes, side locks, buns and beard silhouettes for gaps, intersections and
obvious scalp seams; keep hair color in the tintable slot.
- [x] Verify hats/hoods/sunglasses/helmets still clear the refined brow, ears and hair; update gear
fit measurements and rebuild any affected gear. (Final-context 96-frame review: cap, helmet,
hood and sunglasses clear the eyes; `blender_assets.py fit` clean; no rebuild needed.)
- [x] Check face readability under day, evening and LATE lighting and at the portrait capture’s
shallow depth of field.
### Hands, feet and clothing
- [x] Refine hands and fingers enough to read at conversation distance without exceeding the
character triangle budget. (Wider palm, two-segment bent fingers with rounded tips, separate
thumb; optional `--view=hand` capture and `sheet_npc_hands_compare.jpg`.)
- [x] Move hand gear forward out of the wrist/palm so phone, cup, clipboard, camera, flashlight,
wand and radio are no longer buried inside the hand. (`HAND_ITEM_FORWARD`, 4 cm; new capture
sheet `sheet_npc_hands_grip_compare.jpg` and regression assertions.)
- [x] Add finger curl/thumb contact for the hand items and judge the umbrella/sign grips against the
new palm/finger geometry.
- [x] Audit shoes/boots for silhouette, grounding and contact with the floor; preserve the
responder and firefighter footwear language. (Rounded toe/heel caps; boots keep the black
rubber language; all eight rebuilt, grounding and proportions still pass.)
- [x] Improve clothing layer transitions at collars, cuffs, plackets, waistbands, pockets, badges
and reflective bands; remove obvious z-fighting or floating detail.
- [x] 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.
- [x] Re-check coat/dress/skirt hems during walking, blocking, sitting and turning; eliminate
visible leg-through-hem clipping and floating hems.
- [x] 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
- [x] 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.
- [x] 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.
- [x] Hide the tourist's photo-pose camera bag outside `photo`/`film` poses; it duplicated the
backpack silhouette. (`photo_prop_visible_for_pose()` plus regression test.)
- [x] Refit the backpack straps as flattened bands that follow the torso instead of rods partly
buried in the chest; rebuild the GLB, bake AO and confirm in the before/after sheet.
- [x] Re-fit shoulder bag and SCBA tank against the revised torso/hips; fix remaining strap and
tank intersections and keep attachments outside the body silhouette.
- [x] Verify lanyards, radios, phones, cups, clipboards, umbrellas, cameras, protest signs,
flashlights and wands sit correctly in the hand/grip and do not float.
- [x] 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
- [x] 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.
- [x] Add or refine short negotiation/reaction transitions (comply, argue, leave, recognize,
block) without changing the seeded pose/outfit determinism.
- [x] 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.
- [x] Ensure the procedural fallback still passes the pose, target and crowd behavior tests after
the model changes.
### Verification and handoff
- [x] 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.
- [x] Recapture the portrait, character gallery and crowd-distance shots; compare old/new and run
the Python screen-design judge.
- [x] Update `docs/assets/blender-assets.md`, architecture/status, `MEMORY.md` and the changelog with the
new budgets, limitations and rebuild commands.
- [x] 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.
Completed 2026-11-02: all 0.9.4 acceptance checks are closed for the stylized target. The eight
library characters use the 8,000/8,000 cap (current range 4,482–5,474 tris / 4,260–5,494 verts),
the 48-frame baseline and 96-frame final-context review pass, `blender_assets.py audit`/`fit`
and `npc_proportions.py` pass, the full suite is 262/262 and the 24-NPC smoke is 6.90 ms.
`tools/check_screenshots.sh` reports 21 good / 0 bad and `screen_designs.py compare` has no
unexplained regressions. Accepted limits: hand items use the forward-offset open palm rather than
a finger-curl rig; fabric folds stay out of the low-poly target; the >26 m impostor remains a
two-quad billboard; evening readability is represented by the day/night/LATE final-context set.
Tagged `v0.9.4`; Gitea run 916 passed checks and the full build and published seven assets.
## Patch 0.9.5 — Texture and material refinement
Goal: improve close-range surface and character texture quality while keeping GL
Compatibility/Web parity, deterministic assets and offline CI.
### Environment textures and materials
- [x] Audit the v2 picks (brick, sidewalk pavers, dry/wet asphalt, awning canvas,
day/dusk/night skylines) at close range and in the entrance/street shots for
seams, tiling, scale, contrast and normal-map strength. (New `surfaces` and
`surfaces_joke` capture stages; no seam or UV-scale failures found.)
- [x] Refine brick mortar/wear, paver joints/stains, asphalt aggregate/wet response
and awning weave using the existing image/asset tooling; never overwrite a
pick, use `-vN` candidates and promote validated results. (The Walk of Fame
band now uses the paver/terrazzo texture; the neighbour awning keeps its
cream stripe via a neutral tint and 4× UV. Brick/asphalt picks held up.)
- [x] Check UV scales and material roughness/metallic profiles; keep day/night
phase behavior and the wet-street transition intact. (Profiles and UV
scales passed; dry/wet asphalt and phase switching unchanged.)
- [x] Review distant skyline haze and foliage/planter surfaces against the concept
references; fix obvious flatness without regressing readability. (Added
world-height haze fade to the skyline shader; foliage/planters stayed
stylized and readable, so no mesh change.)
### Character and prop textures
- [x] Audit NPC skin, cloth, pants, hair and gear albedo/normal/AO maps in portraits;
refine fabric weave, skin variation and fixed detail materials. (256² maps rebuilt; fabric
now uses a 4× UV weave and skips baked per-character AO, removing the portrait blotches;
skin/hair/gear keep AO. Comparison `sheet_npc_baseline_compare-texuv.jpg`.)
- [x] Re-bake AO where geometry changes; verify the 256² maps and material wiring.
(No character geometry changed in the texture pass; asset/base audits pass.)
- [x] Audit library props and UI/card/icon textures at their actual screen sizes;
remove blurry/oversized or unused textures where safe. (All 21 screen-art
textures are 1280×720 and referenced; access cards are 256×128, HUD icons
64×64; no oversized or unused runtime texture found. Legacy root textures
remain only as the `generate_textures.py`/asset-test fallback.)
- [x] Run texture audits, import, and the full asset test suite; record texture memory
and triangle/draw-call impact. (Godot 263/263, Python 101/101; asset and base
audits pass; 24 NPCs = 168 meshes / 131,616 triangles / 6.94 ms. Compressed
payloads: picks 24.55 MB, UI art 22.67 MB, NPC maps 0.48 MB.)
### Visual verification
- [x] Run `python3 tools/scene_concepts.py realism` for the affected stages with the
judge enabled; record metric gaps and model/spend. (Run
`docs/screens/realism/2026-11-02-tex` with `z-ai/glm-5.3-flash`, one pass per
shot; mean `after` overall 1.8, lighting 2.3, materials 1.8, texture 1.2,
backdrop 2.0, characters 1.2, Pillow gap 0.306. The judge is optional and not
a CI gate; the report stays local.)
- [x] Re-run `tools/check_screenshots.sh` and the screen-design judge; clear all
`diff` verdicts. (21 good / 0 bad; `screen_designs.py judge` = 21/21 match,
0 review, 0 diff.)
- [x] Capture before/after close-ups for brick, pavement, asphalt, character cloth
and skyline; document accepted trade-offs. (Committed
`docs/blender_previews/sheet_texture_refinement_0.9.5.jpg`: Walk of Fame
pavers, asphalt aggregate, limestone facade, day skyline haze and NPC cloth;
asphalt/limestone picks intentionally held, no replacement.)
- [x] Update asset docs and the changelog/status with the promoted texture versions.
(README/PLAN/architecture/status/MEMORY and the 0.9.5 changelog entry now
carry the texture results; the 0.9.5 section moved to `DONE.md` after the
release build.)
Completed 2026-11-02: all 0.9.5 texture and material checks are closed. The NPC
base and eight library characters use 256² maps, cloth/pants use the 4× fabric
weave without baked-AO blotches, the Walk of Fame band uses the paver/terrazzo
texture, the neighbour awning keeps its cream stripe, and the skyline fades into
per-phase haze. Godot is 263/263, Python tooling 101/101, `blender_assets.py
audit`/`fit` and `npc_pipeline.py audit` pass, the 24-NPC headless smoke is
6.94 ms (168 meshes / 131,616 triangles), the 48-frame baseline and 96-frame
final-context review pass, `check_screenshots.sh` is 21 good / 0 bad, and the
screen-design judge is 21/21 match. The optional realism judge ran with
`z-ai/glm-5.3-flash` (mean overall 1.8, Pillow gap 0.306) and its report remains
local; the committed comparison sheet is
`docs/blender_previews/sheet_texture_refinement_0.9.5.jpg`. Tagged `v0.9.5`;
Gitea run 922 passed checks and the full build and published seven assets.
## Patch 0.9.6 — Integration, performance and judge gate
Goal: integrate the UI/model/texture patches, prove the combined build on the
target paths and leave a clean release-candidate handoff.
### Integration and asset rebuild
- [x] Rebuild all changed Blender/GLB/AO assets, re-import, and verify manifest/fit/
audit coverage. (The v0.9.5 commit already rebuilt the base, eight characters,
gear and AO maps; this checkpoint re-imported them and re-ran
`blender_assets.py audit`/`fit` and `npc_pipeline.py audit`, all exit 0.)
- [x] Run the complete headless suite, Python tooling and smoke matrix; fix any
regression from the three polish patches. (Godot 263/263, Python 101/101;
14 smokes green: audio, campaign, crowd, emergency, focus/radial, movement,
NPC budget, PLAN verbs, props, scenario content, session shell, timeline,
tutorial and UI flows. Campaign/tutorial used isolated `XDG_DATA_HOME`.)
- [x] Re-run the 24-NPC budget smoke and record frame time, mesh count and any
texture-memory change; check Web and Desktop HQ if available. (24 avatars,
168 meshes, 131,616 triangles, 6.90 ms of 50 ms headless; NPC maps remain
0.48 MB. A clean detached worktree at `f5b8ef2` built Linux/Windows/macOS/
Web/HQ (`161.5/197.1/148.0/97.8/241.5 MB`); the Web zip has index.html,
wasm and pck, the HQ zip has `override.cfg`, and the HQ binary launches
headless with the Forward+ override.)
- [x] Verify save/campaign/tutorial behavior is unchanged by the visual/UI patches.
(Persistence/session tests remain in the 263-test suite; campaign and tutorial
smokes passed with isolated `XDG_DATA_HOME`.)
### Visual gallery and judge gate
- [x] Recapture the full gallery, portraits, venue/realsim stages and Desktop HQ A/B
as needed; no stale screenshots in the release set. (Gallery 21/21,
NPC baseline 48 frames, final-context review 96 frames and a fresh 10-shot
realism run were recaptured. No Forward+ code changed since 0.7.1, so the
HQ A/B was not re-staged; the HQ artifact is checked with the release build.)
- [x] Run `tools/check_screenshots.sh`, `screen_designs.py compare` and
`screen_designs.py judge` on the final captures. (21 good / 0 bad; compare
21 good / 0 bad; judge 21/21 match, 0 review, 0 diff.)
- [x] Run the realism judge for the affected concepts with a pinned model; record
model, attempt count, spend and verdicts. (`z-ai/glm-5.3-flash`, 1 pass per
shot, 10 shots, no fallback/retry: mean overall 2.1, lighting 2.4, materials
2.1, texture 1.7, backdrop 2.3, characters 1.8, Pillow gap 0.291. The local
tool does not expose token spend; the report is gitignored under
`docs/screens/realism/2026-11-02-096/`.)
- [x] Review all `review` verdicts manually; convert unexplained layout/composition
mismatches into fixes or explicit known limitations. (Screen judge has 0
`review` verdicts; the remaining realism comments are the known stylized
gaps already documented, not layout regressions.)
- [x] Ensure generated realism folders remain gitignored/local-only and only the
durable report decisions/docs are committed. (`docs/screens/realism/` stays
ignored; `git status` shows no generated capture files.)
### Release-candidate handoff
- [x] Update README, architecture, development status, changelog and TODO with the
final patch-level results and any remaining gaps. (README/PLAN/architecture
now point at 0.9.6; the changelog and development status record the
integration build, performance numbers, judge results and the clean-worktree
export rule; `docs/process/RELEASING.md` documents the ignored-folder trap.)
- [x] Tag/version or otherwise freeze `0.9.6` as the integration checkpoint before
the `0.10.0` release candidate. (Tag `v0.9.6` on `4bb2896`; Gitea run 1296
passed checks and the full build and published seven assets.)
- [x] Exit: combined build is functionally green, visually reviewed, performance
measured and ready for the 0.10.0 content-lock/playtest phase.
Completed 2026-11-03: the 0.9.6 integration checkpoint is closed. The current
asset set re-imported and passed `blender_assets.py audit`/`fit` and
`npc_pipeline.py audit`; the full suite is 263/263 with 101/101 Python tests and
14 smokes green; the 24-NPC budget is 6.90 ms with 168 meshes and 131,616
triangles; the gallery and screen-design gate are 21 good / 0 bad and 21/21
match; the pinned realism judge (`z-ai/glm-5.3-flash`) scored mean overall 2.1
with a 0.291 Pillow gap. A clean worktree built Linux/Windows/macOS/Web/HQ at
161.5/197.1/148.0/97.8/241.5 MB; the Web zip and HQ override were checked and
the HQ binary launched headless. Tagged `v0.9.6`; Gitea run 1296 passed checks
and the full build and published seven assets.
## Character development
Completed 2026-11-04. The procedural crowd-variety roster (four new variants, per-role pools)
shipped with the realistic face; the external-asset intake and the MakeHuman body pipeline were
promoted to the active **MakeHuman character pipeline** track in `TODO.md`.
## 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/assets/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.)
- [x] `adapt` path: promoted to the **MakeHuman character pipeline** track (2026-11-04).: 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.
- [x] Audit gate + intake regression test: promoted to the **MakeHuman character pipeline** track.
- [x] Adapter documentation: promoted to the **MakeHuman character pipeline** track.
### 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/project/development-status.md`, `docs/assets/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.)
- [x] Body-shape diversity decision (2026-11-04, owner): **yes** — use MakeHuman for the next
character pass. Promoted to the **MakeHuman character pipeline** track.
## NPC pose harness (v0.9.8)
Completed 2026-11-04. The pose harness bug that made every staged capture save a rest frame
was found and fixed; it unblocked the weights/pose evidence and the seated/walking deformation
fixes. User-facing changes are recorded under 0.9.7 and 0.9.8 in `CHANGELOG.md`.
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; the evidence now feeds the Quaternius base bake.
*Skill route: `rigging`; evidence in `docs/assets/3d-model-review.md` §"Pose evidence is blocked".*
- [x] Root cause found (2026-11-04): the harness never disabled the avatar's `_physics_process`,
so `_advance_fsm` + `_move_toward_target` ran every tick and reset `arrived`/velocity, which
made `theater_pose()` return "idle" and reverted the pose to rest. (The earlier "moving the
`Rig` child does not render" probe was a red herring: it set `rig.position.y` inside `_shoot()`
in the same frame as `root.get_texture().get_image()`, so it never got a rendered frame.)
- [x] Harness rebuilt: `capture_npc_pose.gd` now calls `set_physics_process(false)`/
`set_process(false)` after staging the avatar; the pose survives because only the direct
`_animate()` ticks drive it. Verified: sit vs idle diff 5.63, walk vs idle diff 2.29, and the
vision judge confirms the seated frame reads as crouched.
- [x] Captured all poses for all 12 variants (idle / walk_contact / walk_pass / sit × full +
shoulder views = 96 frames) and built `sheet_pose.jpg`/`sheet_shoulder.jpg` under `tmp/`.
(No separate "wave" theater pose exists; the escalation raise-hand gesture is not a distinct
capture in this harness.)
## Milestone 0.9.7 — Character development (patch)
Completed 2026-11-04 and published as v0.9.7. The detailed character-development record already
lives under "Character development" above; this milestone checklist is kept verbatim for the
release record.
Goal: release the finished procedural character development — the realistic face on all eight
variants, the four crowd-variety characters and the per-role pools — as a **patch** on top of
0.9.6. This keeps the 3D model and map improvements out of the patch; they land together in the
0.10.0 minor.
- [x] Rig pose harness fixed and the weights/pose evidence captured (see the top track).
- [x] Character work done: 12-character library, realistic face, crowd variants, per-role pools,
24-NPC budget 6.94 ms (152,464 tris / 168 meshes).
- [x] QA + local build for 0.9.7: Godot 277/277, Python 161/161, audit 49 OK, fit/proportions
12/12, release smoke matrix green, gallery 21/0, clean worktree build (Linux 172 MB,
Windows 206 MB, macOS 159 MB, Web 111 MB, HQ 266 MB), checksums verified, Linux binary
launches headless. Tagged `v0.9.7` (CI build/publish follows).
**Exit:** met — 0.9.7 ships the 12-character library (face realism + crowd variety) with the pose
harness fixed; the runtime contract is unchanged. The Quaternius NPC base and the map rebuild are
not in this patch (they target 0.10.0).
## Milestone 0.9.9 — Quaternius NPC base swap (patch)
Goal: make one Quaternius-derived NPC render and animate correctly in Godot and ship it as the
pilot base, with the procedural library still selectable as the fallback. This is the first
versioned character milestone; it contains the rig correction that has been blocking the
ADR-0018 rollout.
**Why this is a patch:** it changes character presentation and animation quality but adds no new
player-facing system. The 0.10.0 minor is reserved for the release gates (see below), so a
blocked rig can no longer block the whole release.
**Completed 2026-11-06.** Shipped as `v0.9.9` (tagged, local release build with checksums)
and accepted by the owner after the follow-up fixes. Durable evidence: `docs/assets/3d-model-review.md`,
`docs/assets/blender-assets.md`, `docs/adr/0018-quaternius-stage2-runtime-rig.md`.
### Rig and export correction
- [x] Reproduce and record the failure: the `armature_apply` + `export_apply=True` bake wrote
wrong inverse bind matrices (Godot rendered A-pose while the rest was arm-down). Recorded
in `MEMORY.md`; `bake_armdown_clean.py` was the failing recipe.
- [x] Fix the arm-down bake so the exported skin matches the rest. `tmp/npc-research/bake_armdown_v2.py`
(pose-rotate → apply modifier → reset pose → edit-mode rotate arms → re-add modifier →
export `export_apply=False`) now yields a correct arm-down base: Blender deformed x ±0.221
and the rest bone tail points down. Still local (`tmp/`), not shipped.
- [x] Re-derive the pose composition for a non-180° rest. Superseded by the rig-agnostic
`_swing_bone()` below: the rest-relative `set_bone_pose_rotation` form was never exact,
because `get_bone_rest()` is parent-relative and already carries the importer's axis
conversion. Kept in `MEMORY.md` as a rejected approach.
- [x] Fix the skinning/rest bake end to end (commit `cd285b3`):
(1) the canonical base is **join-only** (`tmp/npc-research/build_base_minimal.py`: no
`remove_doubles` weld, no scale/ground transform, keep the Armature modifiers) — the weld
and the transform corrupted the Quaternius weights;
(2) the arm-down bake (`tmp/npc-research/bake_armdown_v5.py` — pose, read pose matrices,
apply modifier, **reset pose to identity**, set rest matrices, re-add modifier) bakes the
rest correctly (DEFORMED x −0.228/0.228, Godot bind pose arm-down);
(3) `NpcAvatar._swing_bone()` now writes the **global** bone pose from
`get_bone_global_rest()`, so one formula drives both the 62-joint Quaternius rig and the
13-core fallback (measured: posed bone axis matches the proxy pivot at dot 1.000 on the
Quaternius, and the procedural rigs are unchanged);
(4) `RIG_BONES` + `NpcAvatar.bone_name()` hold the only side mapping (the Quaternius labels
`L`/`R` opposite the project), and the hand proxy is `global_wrist − global_elbow`.
Verified in Godot: idle/sit/walk captures on npc_casual plus the unchanged procedural rigs.
- [x] Add regression tests: `test_shipped_rig_resolves_the_animation_joints` covers the joint map,
the baked arm-down rest, the down-pointing arm axis and the proxy side mapping; the Blender
audit/`inspect` and `npc_proportions` now understand both rigs. Godot 278/278, Python
167/167.
- [x] Give the Quaternius base the five tint slots: `build_base_minimal.py` renames the upstream
materials to `skin`/`cloth`/`pants`/`hair`/`accessory` and keeps `Eye`/`Eyebrows` as
fixed-colour detail. The source UV map is degenerate (every loop at 0,0), so the build now
Smart-UV-unwraps and repacks the layout — texel density went from an unmeasurable 0 to
73–74 px/m on the 256² maps and the 256² AO bake works again.
- [x] Idle and Walk verified on the 62-joint rig through the pose code, not the clips: the 24
upstream clips stay authoring reference only, because `_animate()` + `_sync_skeleton()`
already drive sitting, hand-raising and head turns, and playing clips would replace that
state machine rather than supplement it. Recorded in ADR-0018 and `MEMORY.md`.
- [x] Poses the clips do not cover are driven by the same proxy pivots (`_legs`, `_knees`,
`_arms`, `_elbows`, `_head`), which is why no clip retarget was needed.
- [x] Fallback stays tested: `_build_body()` still builds the 13-core rig, and
`test_forced_fallback_still_builds_the_procedural_rig` now asserts the hip swings and a hand
pivot exists on that path. No MPFB or Stage-1 proportion work reopened.
- [x] Backpack straps re-fitted for the Quaternius torso (`fb3e75a`) and the back attach raised to
shoulder-blade height; the camera kept its wrist strap.
### Silhouette and face gate (owner)
- [x] Re-run the silhouette gate at gameplay distance and in portrait against the current
`npc_casual`, front / three-quarter / profile. ADR-0018 removed the proportion warp, so
source proportions are accepted by definition (head 13.4 % of height, measured by
`npc_proportions`).
- [x] Owner visual signoff obtained (2026-11-06) on the roster, the faces, the head gear and the
hand/back gear. The review page and its sheets were retired after acceptance; the measurements
live on in `docs/assets/3d-model-review.md` and `docs/assets/blender-assets.md`.
- [x] Face-fidelity comparison was made and the full swap chosen; the comparison sheets were
retired with the review pages, and the decision is recorded in the follow-up section of
[`docs/adr/0018-quaternius-stage2-runtime-rig.md`](docs/adr/0018-quaternius-stage2-runtime-rig.md).
- [x] **Owner decision:** option (a) full swap (2026-11-05). Applied: all twelve characters are
baked from the three Quaternius sources inside 24,000 tris / 24,000 glTF vertices
(`a6ccd86`), and the gate was re-run.
- [x] Record the decision and its consequence in `MEMORY.md`,
`docs/assets/npc-model-sourcing.md#shipped-roster-099-owner-chose-the-full-swap` and the
follow-up decision section of
[`docs/adr/0018-quaternius-stage2-runtime-rig.md`](docs/adr/0018-quaternius-stage2-runtime-rig.md).
- [x] Owner visual signoff on the shipped roster (2026-11-06): accepted.
### Pilot rollout
- [x] Map the five tint slots onto the Quaternius materials and unwrap the degenerate source
UV map; bake the 256² AO and check texel density (73–74 px/m).
- [x] Re-fit every gear attach point against the Quaternius skeleton and test each piece on the
character (the 0.9.10 *Prop and gear fit pass* below carries the measurements).
- [x] Wired the approved base into all twelve roles, with the procedural library as the instant
fallback; no runtime download or optional dependency.
- [x] Ran `inspect` (clean), `audit` (12/12), `fit` (OK), `npc_proportions` (measured), the 24-NPC
budget smoke (175,264 tris, 0.87 ms) and the capture gates before/after the fixes.
- [x] Released `0.9.9`: `config/version` 0.9.9, `CHANGELOG.md` entry, local build with checksums,
commit, tag `v0.9.9` and push. Owner accepted the roster on 2026-11-06.
**Exit:** one committed Quaternius GLB renders arm-down with correct skinning, plays Idle and
Walk on the 62-joint rig, poses correctly under the new composition, passes the owner face and
silhouette gate, fits the 18 gear pieces, stays inside budget, and ships as `0.9.9` with the
procedural library still available as a fallback.
+397 -660
View File
File diff suppressed because it is too large. Load diff
+206 -12
View File
@@ -2,7 +2,7 @@
## Premise
You are a private security guard working the entrance of a fictional Hollywood Boulevard building. You keep the steps and doors clear, check who is allowed in, and deal with tourists, performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people in mental-health crisis, and rare determined threats.
You are a private security guard working the entrance of a stylized reconstruction of the real El Capitan Entertainment Centre on Hollywood Boulevard. You keep the steps and doors clear, check who is allowed in, and deal with tourists, performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people in mental-health crisis, and rare determined threats.
The game is about **judgment, communication, access verification, and proportionate escalation**, not about attacking everyone who approaches.
@@ -14,6 +14,94 @@ The game is about **judgment, communication, access verification, and proportion
- **Emergency help is a last resort.** Responders handle crises the guard cannot safely manage; calling them has costs.
- **Readability beats raw fidelity.** The GL Compatibility renderer, clear silhouettes, the focus ring, and the HUD stay legible.
## Development Priorities
The active task order is in [`TODO.md`](TODO.md); the gap analysis and the release roadmap are
below. The current order is:
1. **0.9.9–0.9.12 patches.** Finish the character base (the accepted Quaternius 62-joint runtime),
roll it out to the 12 roles, close the scheduled venue/prop/lighting polish, and verify
performance, Web and accessibility.
2. **0.10.0 minor.** Public readiness: external playtests, balance acceptance, legal/storefront
approval, the platform matrix and the documentation/picture lock.
3. **0.10.x patches → 0.11.0.** Content and systems depth: live body-camera replay, a fourth
venue and the localization foundation.
4. **0.12.0 → 1.0.0.** Platform/distribution, content complete, release candidates and the stable
release.
Versions are assigned only when a track's scope is accepted into a release (see
[Release Roadmap](#release-roadmap)). Unversioned tracks — the 3D review evidence base,
maintenance and the Gaussian-splatting study — do not receive a placeholder version.
## Plan Evaluation (2026-11-05)
The game plan itself is sound and largely built: three venues, the escalation ladder, access
artifacts, the radio/report system, the shift review and the campaign loop all exist and are
tested. What needed fixing was the **delivery plan**, not the design.
- **Character sourcing churned.** The project moved procedural → MakeHuman → Quaternius, and the
Quaternius Stage-1 warp failed its own gate. That leaves a correct decision (ADR-0018) with a
half-finished implementation. The plan now makes the rig correction one small version, gates the
roster behind a face/readability decision, and keeps exactly one fallback.
- **One milestone carried too much.** The old 0.10.0 mixed character work, map work and every
public-release gate, so one blocked export blocked the release. Character and venue polish are
now patches; 0.10.0 is only the release gate.
- **Unversioned work had no deadline.** The 3D review backlog could grow without bound. It is now
capped: the ranked venue/prop/lighting items are scheduled into 0.9.11, the budget checks into
0.9.12, and everything else is an explicit accept or deferred. Gaussian splatting stays
unscheduled because no product need justifies its risk yet.
- **Legal, signing and storefront work is release work, not polish.** It now has named checkboxes
in 0.10.0 and 1.0.0 instead of living in prose.
- **What is deliberately not planned:** new genres or mechanics, a live-service model, or a
runtime splat renderer. The de-escalation-first, rare-emergency design stays frozen.
Feasibility: the remaining character work is small in geometry terms (6.2k triangles against a
24k cap) and larger in rig/export terms; the venue work is polish; most release gates are
evidence gathering rather than engineering. The main schedule risk is external review and
approval, not code.
## Character Creation Re-Evaluation (2026-11-05)
**Where it stands.** The shipped library is 12 procedural Blender variants (4.7k–5.8k triangles
each) with a sculpted face, five tint slots and 18 gear pieces. The owner then chose the CC0
**Quaternius Ultimate Modular Characters** as the primary source. Stage 1 (warp the Quaternius
mesh onto the 13-core contract) failed its silhouette gate — arm ×1.63, leg ×0.74, torso ×1.61,
judged distorted. [ADR-0018](docs/adr/0018-quaternius-stage2-runtime-rig.md) therefore adopts the
source **62-joint rig at runtime**: no warp, source LOD (3,199 verts / 6,206 tris), source
Idle/Walk clips, and gear pivots re-derived from the Quaternius skeleton.
**What is already built.** The canonical `quaternius_base.glb` (welded, grounded, arm-down rest),
the 62→13 joint map, the material→five-slot map, the clip inventory (24 clips; Idle and Walk in
scope) and the `NpcAvatar` joint-name mapping with rest-derived gear pivots.
**What actually blocks it.** Two technical items about the export and the pose math, not the art:
1. the arm-down GLB renders in A-pose in Godot because the bake writes wrong inverse bind
matrices; and
2. `_pose_bone()` composes rotations as `rest * Quaternion(axis, angle)`, which only cancels for
the old 180° rest, not the Quaternius ~76° rest.
**Re-evaluation findings.**
- Triangle budget is not the problem (6.2k against a 24k cap). Do not decimate the source.
- **Face fidelity is the real risk.** The 0.9.7 library has a sculpted realistic face; the
Quaternius head is low-poly. A blanket swap would regress every close-up. The plan therefore
makes the owner choose at 0.9.9 between (a) a full swap, (b) Quaternius for crowd roles with the
procedural library for named roles, or (c) extra head subdivision/hair cards on the Quaternius
head.
- **Animation** becomes clip-driven, which removes the hand-built pose composition as the main
path. Poses the clips do not cover (seated, raise-hand, head turn) must be decided explicitly
rather than patched per scene.
- **One fallback, no third source.** The procedural `npc_base` and the MakeHuman head stay tested
until the new base passes the gate. MPFB body work stays closed and the Stage-1 warp is not
reopened. A new character source needs a new ADR.
- **Sequence matters.** Fix the rig first (0.9.9), then the roster (0.9.10). Rolling a broken rig
across 12 variants would waste the whole pass.
**Reversal condition.** If the skin cannot be exported correctly without a new exporter path, or
if the owner rejects the low-poly face in every option, the plan falls back to the procedural
library and retires Quaternius with a recorded ADR. That decision is made at 0.9.9, not later.
## Core Gameplay Loop
1. Watch the entrance, steps, queue, and sidewalk.
@@ -96,15 +184,19 @@ A poor shift involves excessive force, confronting innocent people, ignoring a r
## Venues
### Hollywood Boulevard Building
### El Capitan Entertainment Centre (6840 Hollywood Blvd)
The original scenario: a building entrance with steps, sidewalk, street lamps, and a restricted door. Tourists, performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people in crisis, and rare violent threats approach from the boulevard.
The original scenario: the historic Masonic Temple / El Capitan Entertainment Centre, with six Ionic columns, eight stone steps, the Hollywood Walk of Fame sidewalk, neighbouring theatre and retail frontage, and the four-lane boulevard. Tourists, performers, influencers, confused visitors, intoxicated pedestrians, trespassers, people in crisis, and rare violent threats approach from the street.
Authorized people are recognized or present a valid wristband. Wristbands vary by color, pattern, date, and event marking, and may be valid, expired, counterfeit, or missing.
### The Joke Shop
A comedy-club entrance. The door person checks IDs, tickets, reservations, guest-list status, and screens guests with a handheld wand under venue policy.
A Sunset Strip comedy club inspired by The Comedy Store at 8433 Sunset Blvd: a
low black hall under a deep, signature-covered canopy, a circular blade sign,
red velvet curtains and the dry hillside rising behind it. The door person
checks IDs, tickets, reservations, guest-list status, and screens guests with a
handheld wand under venue policy.
The wand does **not** identify a weapon automatically. Keys, belts, and phones can trigger false alarms; the player must ask the guest to identify the item and apply procedure. A guest with valid credentials can still require assistance if they threaten staff or patrons.
@@ -123,7 +215,7 @@ Joke Shop escalation follows the common ladder: direction, explanation, repeat r
### Hollywood Boulevard Late Night TV Studio
A busy studio entrance with audience members, production staff, performers, guests, deliveries, celebrity arrivals, tourists, influencers, and the same range of street behavior as the building scenario.
A busy studio entrance at the same real El Capitan Entertainment Centre block as the Hollywood day shift, restaged for a late-night arrival: the same stone facade and steps with a bulb-lit canopy, a black car at the kerb and a barrier line. It has audience members, production staff, performers, guests, deliveries, celebrity arrivals, tourists, influencers, and the same range of street behavior as the building scenario.
Staff and guests are recognized or present a wristband, credential, ticket, guest-list confirmation, or other approved marker. The player keeps the steps clear, protects arrivals and equipment, manages filming boundaries, watches for tailgating, and calls for help only when there is immediate danger.
@@ -148,18 +240,19 @@ The action wheel prioritizes de-escalation: Stop, Look, Point, No, Ask, Inspect,
The visual direction is readable stylized realism:
- **Blender library:** 8 skinned NPC variants, 18 gear pieces, and 20 street/venue props, with baked albedo/normal/AO/ORM maps, a manifest, and procedural fallbacks. `Rig/Head` stays the focus anchor.
- **Realism pass:** AI-assisted per-phase skyline panoramas, v2 surface tiles with normal maps, wet asphalt at night, a warm day haze, phase-specific sun/exposure/fog, a visible flashlight beam, and denser foliage.
- **Character direction:** 12 skinned NPC variants, 18 gear pieces and 20 street/venue props. The active character track is the Quaternius base at runtime ([ADR-0018](docs/adr/0018-quaternius-stage2-runtime-rig.md)): the CC0 source mesh keeps its proportions on the 62-joint rig, Idle/Walk run as clips, and the procedural library stays as the tested fallback until the face/silhouette gate passes. See [Character Creation Re-Evaluation](#character-creation-re-evaluation-2026-11-05).
- **Realism pass:** AI-assisted per-phase skyline panoramas, v2 surface tiles with normal maps, wet asphalt at night, a warm day haze, phase-specific sun/exposure/fog, a tight flashlight spot (no beam geometry), and denser foliage.
- **Local map direction:** the venues are currently stylized reconstructions. The local-map track evaluates licensed OpenStreetMap/3D building data, licensed reference photography, AI-assisted composition and Gaussian splatting as a development tool; online data and splat rendering are not runtime dependencies.
- **References and QA:** runtime UI art lives in `assets/images/ui/`; reference/art-direction sets live in `docs/screens/designs/` and `docs/screens/concepts/`; captures live in `docs/screenshots/`; realism runs live in `docs/screens/realism/`. `screen_designs.py compare/judge` and `tools/check_screenshots.sh` guard drift.
- **Storage convention:** see [ADR-0014](docs/adr/0014-runtime-image-root.md). Never overwrite an existing image; new outputs get a new path or `-vN` suffix.
The path from the current vertical slice to v1.0.0 — content depth, onboarding, accessibility, platform QA and release readiness — is tracked in [`TODO.md`](TODO.md); this plan stays at the product/design level.
The active planning order — unversioned character and local-map development first, then the versioned 0.10.0 release-candidate hardening and later releases — is tracked in [`TODO.md`](TODO.md); this plan stays at the product/design level.
Primary decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md), [ADR-0008](docs/adr/0008-cone-focus-and-head-ring.md), [ADR-0009](docs/adr/0009-radial-action-menu.md), [ADR-0010](docs/adr/0010-procedural-npc-presentation.md), [ADR-0011](docs/adr/0011-aim-free-selection-and-precision-walk.md), [ADR-0012](docs/adr/0012-surface-materials-and-generated-props.md), [ADR-0013](docs/adr/0013-blender-authored-npc-characters.md).
Primary decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md), [ADR-0008](docs/adr/0008-cone-focus-and-head-ring.md), [ADR-0009](docs/adr/0009-radial-action-menu.md), [ADR-0010](docs/adr/0010-procedural-npc-presentation.md), [ADR-0011](docs/adr/0011-aim-free-selection-and-precision-walk.md), [ADR-0012](docs/adr/0012-surface-materials-and-generated-props.md), [ADR-0013](docs/adr/0013-blender-authored-npc-characters.md), [ADR-0015](docs/adr/0015-npc-model-variety-sourcing.md), [ADR-0017](docs/adr/0017-quaternius-npc-base.md).
## Tech Stack
- **Engine:** Godot 4.3 baseline (local dev verified with 4.7.2), GL Compatibility renderer (Web parity); optional Forward+ Desktop HQ build.
- **Engine:** Godot 4.7.2, GL Compatibility renderer (Web parity); optional Forward+ Desktop HQ build.
- **Language:** GDScript.
- **Architecture:** venue-driven simulation; shared systems plus `Resource`-based scenario data.
- **Navigation:** `NavigationRegion3D` / `NavigationAgent3D`.
@@ -172,7 +265,107 @@ Primary decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md), [AD
## Versioning and Delivery
`config/version` in `project.godot` is the single version source (currently `0.8.1`). Releases are tagged `v<version>`; the CI pipeline builds and publishes the standard artifacts plus the optional Desktop HQ zip. Version bumps follow [Semantic Versioning](https://semver.org/). See [`docs/RELEASING.md`](docs/RELEASING.md) and [`README.md`](README.md) for commands.
`config/version` in `project.godot` is the single version source (currently `0.9.9`). Releases are tagged `v<version>`; the CI pipeline builds and publishes the standard artifacts plus the optional Desktop HQ zip. Version bumps follow [Semantic Versioning](https://semver.org/): every major, minor and patch increment needs a changelog entry, a local `tools/build_releases.sh` build, and artifact/checksum verification before tagging. Unversioned development tracks do not receive a version until their scope enters a release. See [`docs/process/RELEASING.md`](docs/process/RELEASING.md) and [`README.md`](README.md) for commands.
## Gap Analysis
**Published baseline:** v0.9.8 (2026-11-04) — three playable venues, tutorial/campaign/checkpoint
resume, the access/radio/escalation loop, shift review, the 12-character Blender library, 277
Godot + 162 Python tests, a 21/21 screen-design judge and Compatibility/Web/Desktop HQ builds.
**Current source:** 0.9.8. The 0.10.0-rc.1 package built on 2026-11-03 is stale and is superseded
by the patch sequence below; it is not a published release.
| Area | Remaining gap | Milestone |
| --- | --- | --- |
| Character base | Quaternius arm-down skin export, rest-relative pose composition, face/silhouette acceptance | 0.9.9 |
| Character roster | 12-role mapping, modular outfits, gear fit, AO/texels, budget evidence | 0.9.10 |
| Venue and asset polish | Ranked prop/foliage/lighting/set-dressing fixes, collider verification | 0.9.11 |
| Performance and Web | Frame/memory/load evidence after the content changes, LOD/impostor verification | 0.9.12 |
| Onboarding and balance | External first-time-player evidence, balance sweeps/tuning, content lock | 0.10.0 |
| Accessibility and localization | Acceptance pass, caption coverage, pseudo-locale/length checks | 0.9.12 / 0.10.0 |
| QA and release engineering | Full smoke matrix, clean build/checksum verification, target-matrix launches | 0.10.0 |
| Legal, signing, storefront | macOS signing/notarization, AI-provider rights, storefront/rating approval, privacy sign-off | 0.10.0 / 0.12.0 |
| Systems and content depth | Live incident replay, fourth venue, localization foundation | 0.11.0 |
| Distribution | Signed storefront builds, frozen save contract, launch languages, hardware matrix | 0.12.0 |
| Stable release | Content complete, accessibility audit, release candidates, 1.0.0 decision | 0.13.0 / 1.0.0 |
| Future | More venues/seasonal content, image-to-mesh props, other deferred ideas | Unscheduled |
The 0.9.3 UI, 0.9.4 animation, 0.9.5 texture, 0.9.6 integration, 0.9.7 character development and
0.9.8 deformation fixes are complete in [`DONE.md`](DONE.md); they are not remaining gaps. The
2026-11-01 documentation audit is also closed.
## Release Roadmap
Every version below follows the release procedure in `AGENTS.md`. Patch versions contain fixes and
polish; minor versions add user-facing features; the major version is the stable release with a
compatibility promise. Each version's executable checklist is in [`TODO.md`](TODO.md).
### Roadmap to 0.10.0
The goal of this line is to finish the character and venue work and clear every public-release
gate. The character track is versioned rather than unversioned so a blocked rig cannot hold the
whole release.
| Version | Type | Scope | Exit criterion |
| --- | --- | --- | --- |
| 0.9.9 | patch | Quaternius pilot: correct skin export, rest-relative pose math, Idle/Walk verification, owner face/silhouette gate, one-role (or crowd-only) rollout | A Quaternius NPC renders and animates correctly and ships behind a tested procedural fallback |
| 0.9.10 | patch | 12-role roster, modular outfits, five slots, AO/texels, gear fit, 12×6 baseline | The full roster passes contract, gear, budget and owner-baseline gates |
| 0.9.11 | patch | Scheduled 3D review fixes: props/foliage, gear silhouette, venue shape language, lighting, set dressing, colliders | Every scheduled P1/P2 item is fixed or accepted with a measurement |
| 0.9.12 | patch | Performance/Web/LOD/memory verification plus accessibility and pseudo-locale checks | No regression against the pre-character baselines |
| 0.10.0 | minor | Public readiness: external playtests, balance acceptance, legal/storefront/signing decisions, platform matrix, docs and picture lock | 0.10.0 is content-locked, externally played, legally reviewed, documented and reproducibly built |
### Roadmap to 0.11.0
This line turns a stable 0.10.x into a deeper game: the incident timeline becomes a live replay, a
fourth venue enters the campaign, and the text catalogue becomes a real localization pipeline.
| Version | Type | Scope | Exit criterion |
| --- | --- | --- | --- |
| 0.10.1 | patch | Onboarding and accessibility issues deferred from the 0.10.0 playtests | First-hour and accessibility defects closed |
| 0.10.2 | patch | Balance/fairness sweeps, review-text and difficulty-progression tuning | Every balance-acceptance cell is in target or explicitly accepted |
| 0.10.3 | patch | Save/checkpoint edge cases, gamepad/remap, pause/resume, small quality-of-life fixes | No known P1 stability defect remains |
| 0.11.0 | minor | Live body-camera replay, fourth venue (candidate: TCL Chinese Theatre forecourt), localization foundation with one secondary language | The new systems ship without regressing performance, accessibility or balance |
### Roadmap to 1.0.0
This line is about distribution, contracts and completeness: signed builds on the launch stores, a
frozen save format, finished content and release candidates.
| Version | Type | Scope | Exit criterion |
| --- | --- | --- | --- |
| 0.11.1 | patch | Replay/venue/localization fixes from wider play | No P1 defect in the 0.11.0 feature set |
| 0.11.2 | patch | New-venue balance, campaign pacing and content readability | The 0.11.x line is stable enough to freeze its contracts |
| 0.12.0 | minor | macOS signing/notarization, storefront packages/metadata/ratings, save-format v2 freeze, hardware matrix, launch languages | Signed, storefront-ready builds exist on every launch platform |
| 0.12.1 | patch | Signing, installer, metadata and save-migration fixes from storefront dry runs | Every storefront build installs, launches and migrates cleanly |
| 0.13.0 | minor | Content complete: all planned venues/events/dialogue, audio decision, final tutorial, accessibility audit, balance freeze | All planned content is implemented and frozen |
| 0.13.1 | patch | Release candidate 1: full smoke/performance/save/accessibility matrix | A candidate passes every gate except final approval |
| 0.13.2 | patch | Release candidate 2: verify fixes, freeze release notes/credits/privacy/known limitations | The final candidate is reproducible and documented |
| 1.0.0 | major | Stable release: legal/storefront/rating approval, hardware/accessibility/localization sign-off, no P0/P1, publish on every platform | 1.0.0 is published with verified checksums and no open blocker |
## Roadmap Dependencies and Risks
- Content volume is the largest schedule risk; tutorial and campaign work must not outrun the
event/dialogue matrix.
- The vision judge is a dev-time aid with an external key and budget; CI must never make it a hard
gate.
- Godot engine changes can alter lighting and imports; do not combine an engine baseline move with
a content or feature milestone.
- Signed macOS builds, AI provenance and storefront approval are release blockers, not polish.
- The character pipeline is the current critical path. The rig/export fix must be proven on one
variant before the roster rollout; otherwise 0.9.10 multiplies a defect.
- Photo-derived map assets add a provenance risk: downloaded or user-supplied photos can carry
unclear licences, identifiable people, plates and property restrictions. No photo- or
splat-derived asset ships without a completed sidecar, consent/licence review and redaction.
- Gaussian-splat training is GPU/disk-heavy and the toolchain churns; keep it offline,
version-pinned and outside CI, and never make a runtime splat renderer a release dependency.
- The Blender skill pack is local, unversioned guidance; it can drift from the project contract or
assume Blender MCP. Re-verify every adopted technique with `inspect`/`audit`/`fit` and never make
a skill, asset pack or tool version a build or CI dependency.
- The 3D re-evaluation can expand without bound. Cap it with the scorecard ranking: P0/P1 only, one
asset family per commit, and an explicit accept for everything else.
- Keep the de-escalation-first rules and rare-emergency design unchanged while adding progression,
difficulty and feedback.
## Design Direction
@@ -184,4 +377,5 @@ The game should feel like a tense workplace simulation with occasional crisis mo
- A rare Bob Dobbs cameo (Easter-egg appearance; placement note in `MEMORY.md`).
- Specific unusual NPC behaviors, such as slapping their own face, using hands as scissors, or interacting with props unexpectedly.
- Live 3D body-camera replay; additional venues or seasonal events; real voice/dialogue audio; an image-to-mesh prop pipeline.
- A fifth venue or seasonal events after the 0.11.0 fourth venue proves the venue pipeline.
- Real voice/dialogue audio if the 0.13.0 audio decision does not fund it; an image-to-mesh prop pipeline remains unscheduled.
+27
View File
@@ -0,0 +1,27 @@
# Privacy Note
Gig Line runs locally. The game itself does not include telemetry, analytics,
accounts, advertising, cloud saves or network requests. It does not access the
camera, microphone, contacts or location, and the body-camera feature is a
simulated overlay, not a real recording device.
Player data is written only to Godot's local `user://` directory:
- `settings.json`
- `campaign.json`
- `shift_results.json`
- `shift_state.json`
Those files stay on the player's machine unless the player copies them. Deleting
the files (or the `Gig Line` user directory) resets the profile. See
[`docs/process/getting-started.md`](docs/process/getting-started.md#save-data) for
locations, migration and rollback instructions.
The repository's development tools can call OpenRouter when a developer supplies
`OPENROUTER_API_KEY`; those calls generate or judge development assets and are
not part of the shipped game. The key and generated review artifacts remain
local/gitignored.
Questions about a storefront release should be checked against the final package
and the provider terms recorded in [`CREDITS.md`](CREDITS.md); external legal and
storefront approval is still pending for 0.10.0.
+130 -43
View File
@@ -6,20 +6,16 @@ The central design goal is simple:
> The player wins by choosing the lowest level of escalation that keeps everyone safe.
## Screenshots
## Development Priorities
| | |
| --- | --- |
| ![Venue overview: the Hollywood Boulevard entrance with steps, sidewalks, street lamps, and signage](docs/screenshots/01-venue-overview.png) | ![Targeting an approaching NPC with the interaction HUD](docs/screenshots/02-targeting-npc.png) |
| ![Access inspection: wristband/credential check with allow/deny prompt](docs/screenshots/03-access-inspection.png) | ![Radio report form: emergency dispatch panel](docs/screenshots/04-radio-report.png) |
| ![Late night: street lamps lit, marquee glowing, dark Hollywood Boulevard](docs/screenshots/05-late-night-avenue.png) | ![Night shift: guard flashlight cutting through the dark](docs/screenshots/06-night-flashlight.png) |
| ![Wand screening at The Joke Shop: false alarm on keys](docs/screenshots/07-wand-screening.png) | ![Escalation HUD at L3 with body camera armed and reaction log](docs/screenshots/08-escalation-hud.png) |
| ![Body-camera timeline: formal warning, body camera on, blocking](docs/screenshots/09-body-camera-timeline.png) | ![Prop gallery: the six generated street-furniture models on a studio backdrop](docs/screenshots/10-prop-gallery.png) |
| ![Precision walk at the venue steps with the HUD chip visible](docs/screenshots/11-precision-walk.png) | ![The Joke Shop: a narrow brick alley with shuttered windows, a warm wall lantern and a dumpster](docs/screenshots/12-joke-shop.png) |
| ![Late-night TV studio arrival: stone facade, bulb canopy, black car and barriers](docs/screenshots/13-studio-arrival.png) | |
The active planning order lives in [`PLAN.md`](PLAN.md) (gap analysis and release roadmap), [`TODO.md`](TODO.md) (executable checklist) and [`AGENTS.md`](AGENTS.md):
*Screenshots are generated by [`src/test/capture_screenshots.gd`](src/test/capture_screenshots.gd) and [`src/test/capture_prop_gallery.gd`](src/test/capture_prop_gallery.gd) from the current build — day, late-night, wand screening, escalation, shift-review timeline,
precision walk, the Joke Shop alley, the TV Studio arrival, and the prop lineup.*
1. **`0.9.9`–`0.9.12` patches** — finish the Quaternius NPC base on the accepted 62-joint runtime, roll it out to the 12 roles, close the scheduled venue/prop/lighting polish, then verify performance, Web and accessibility.
2. **`0.10.0` minor** — public readiness: external playtests, balance acceptance, legal/storefront/signing decisions, the platform matrix and the documentation/picture lock.
3. **`0.10.x` → `0.11.0`** — live incident replay, a fourth venue and the localization foundation.
4. **`0.12.0` → `1.0.0`** — signed storefront builds, a frozen save contract, content complete, release candidates and the stable release.
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.
## ⬇️ Downloads
@@ -38,31 +34,95 @@ 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
> `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31.
>
> **Latest: v0.8.1** — normal radio reports now send correctly, on top of the
> v0.8.0 tutorial/campaign/resume pass and the v0.7.x judge, Desktop HQ, venue
> and gear work.
> **Latest published: v0.9.9** — the character-roster patch: all twelve NPCs now
> use the CC0 Quaternius base with the five tint slots, role gear and baked maps.
> Superseded: v0.9.8, the character-development patch: the
> 12-character library, realistic face pass, four crowd-variety variants and the
> wrist/hip/knee deformation fixes. Previous 0.9.x patches added the
> Hollywood/Joke Shop maps, UI/accessibility polish, NPC visual optimization,
> texture/material refinement and integration checkpoint.
>
> **Current source: v0.9.8** — tagged from the same commit. The 0.10.0
> development track remains gated on the Quaternius NPC rollout, local-map work
> and release approvals.
> Releases are built automatically when a `vX.Y.Z` tag is pushed
> (see [`docs/RELEASING.md`](docs/RELEASING.md)); manual builds use
> (see [`docs/process/RELEASING.md`](docs/process/RELEASING.md)); manual builds use
> `./tools/build_releases.sh`. Installer/AppImage packaging runs in the same pipeline
> (NSIS + appimagetool) and uploads with the portable binaries.
>
> macOS builds are unsigned: right-click → Open, or clear the quarantine with
> `xattr -dr com.apple.quarantine gig-line-macos.zip`. Build instructions and
> the release pipeline live in [`docs/RELEASING.md`](docs/RELEASING.md).
> the release pipeline live in [`docs/process/RELEASING.md`](docs/process/RELEASING.md).
If you are here to develop or test locally instead of downloading, jump to
[Setup and Run](#setup-and-run) below.
The project is under active development. The design and architecture are documented, and a playable prototype vertical slice exists (Godot 4 + GDScript): a procedural Hollywood Boulevard entrance, a first-person guard, simulated NPCs with intents and reactions, the six-level escalation model, access inspection and admission decisions, radio calls with credibility checks, reputation, crowd mood, and an end-of-shift review.
The project is under active development. The design and architecture are documented, and a playable prototype vertical slice exists (Godot 4 + GDScript): a stylized El Capitan Entertainment Centre block, a first-person guard, simulated NPCs with intents and reactions, the six-level escalation model, access inspection and admission decisions, radio calls with credibility checks, reputation, crowd mood, and an end-of-shift review.
## Screenshots
Every capture is rendered from the current build by [`tools/check_screenshots.sh`](tools/check_screenshots.sh)
(21 captures, compared against the runtime art). The full gallery, including every UI state, is in
[`docs/screenshots/`](docs/screenshots/README.md).
### Venues
| | |
| --- | --- |
| ![Hollywood Boulevard day shift](docs/screenshots/01-venue-overview.png) | **Hollywood Boulevard — day.** The El Capitan Entertainment Centre block: six Ionic columns, Masonic parapet, event banners, eight stone steps and the Walk of Fame terrazzo. |
| ![Hollywood Boulevard at night](docs/screenshots/05-late-night-avenue.png) | **Hollywood Boulevard — late.** Sconces pool on the limestone, street lamps light the boulevard and the skyline fades into night haze. |
| ![Flashlight on the entrance at night](docs/screenshots/06-night-flashlight.png) | **Night patrol.** A tight flashlight spot picks out the door and the person in front of it; movement and awareness change at night. |
| ![The Joke Shop at night](docs/screenshots/12-joke-shop.png) | **The Joke Shop.** A black Sunset Strip club under its signature-covered canopy, circular blade sign, red curtains and the dry hillside behind. |
| ![Late-night TV studio arrival](docs/screenshots/13-studio-arrival.png) | **TV Studio arrival.** Stone facade, bulb canopy, black car and crowd barriers for a late celebrity arrival. |
### Interaction and systems
| | |
| --- | --- |
| ![Targeting an NPC](docs/screenshots/02-targeting-npc.png) | **Focus and targeting.** The cone focus ring, name tag and target chip; `Tab`/wheel cycles nearby people without aiming. |
| ![Access inspection](docs/screenshots/03-access-inspection.png) | **Access inspection.** A venue-correct wristband check with evidence shown before the admit/refuse decision. |
| ![Radio report](docs/screenshots/04-radio-report.png) | **Radio report.** Security assistance with location, behaviour and what was actually seen. |
| ![Wand screening](docs/screenshots/07-wand-screening.png) | **Wand screening.** A false alarm on keys: ask the guest to identify the item before choosing a response. |
| ![Escalation HUD](docs/screenshots/08-escalation-hud.png) | **Escalation.** Level 3 blocking with the shape meter, body camera armed and the reaction log. |
| ![Body-camera timeline](docs/screenshots/09-body-camera-timeline.png) | **Body-camera timeline.** Every recorded event, step by step, in the shift review. |
| ![Precision walk](docs/screenshots/11-precision-walk.png) | **Precision walk.** Half-speed close work on the steps, with the HUD state chip visible. |
### Shell and UI
| | |
| --- | --- |
| ![Start menu](docs/screenshots/14-start-menu.png) | **Venue menu.** Day and night rows for Hollywood, the Joke Shop and the TV Studio, campaign continue and review links. |
| ![Settings](docs/screenshots/16-settings-panel.png) | **Settings.** Difficulty, volumes, HUD scale, reduce motion, captions and key/button remapping, all persisted. |
| ![Shift review](docs/screenshots/17-shift-review.png) | **Shift review.** Grade, policy outcome, incidents, responder results and campaign Continue. |
| ![Action wheel](docs/screenshots/19-radial-menu.png) | **Action wheel.** De-escalation first: stop, look, point, no, ask, inspect, warn, block, reason, recognize, radio. |
### 3D asset progress
The character roster is built from the CC0 Quaternius bases (ADR-0017/ADR-0018) and audited
before use; the procedural library and the MakeHuman head stay as the tested fallback. The
sheets below show the
current library and will be replaced after the 12 × 6 baseline review.
| | |
| --- | --- |
| ![Eight NPC characters](docs/blender_previews/sheet_npc.jpg) | **Character library.** Twelve role-dressed variants (4.5–6.4k triangles each) on three CC0 Quaternius bases, with five tint slots, attach-point gear and baked maps. |
| ![Prop library](docs/blender_previews/sheet_props.jpg) | **Street and venue props.** Twenty library props with colliders, navigation avoidance and colour atlases. |
| ![Neutral NPC baseline](docs/blender_previews/sheet_npc_baseline.jpg) | **Neutral baseline.** 8 characters × 6 views (front, three-quarter, profile, back, full body, crowd) used for the 0.9.4 pass and the current re-evaluation. |
| ![Texture refinement comparison](docs/blender_previews/sheet_texture_refinement_0.9.5.jpg) | **Texture refinement.** 128 → 256 px NPC maps and a 4× fabric weave, shown before/after on the same camera. |
| ![Crowd-variety prototypes](docs/blender_previews/sheet_npc_crowd_prototypes.jpg) | **Crowd variety prototypes.** Four approved looks (bun/slim, bald/broad, coat/umbrella, hood/cup) queued for the roster build. |
More sheets and the review criteria are in [`docs/blender_previews/`](docs/blender_previews/README.md)
and [`docs/assets/3d-model-review.md`](docs/assets/3d-model-review.md).
## Game Overview
A typical shift lasts 10–15 minutes: watch the entrance and sidewalk, judge why
each person is approaching, verify access with recognition, wristbands, IDs,
tickets or credentials, and escalate only when necessary. The game rewards calm
resolution over force. The full mechanics — the three venues, the six-level
resolution over force. The venue menu splits Hollywood Boulevard into Day and
Night rows; the full mechanics — the three venues, the six-level
escalation model, and the core systems — are in
[`docs/gameplay.md`](docs/gameplay.md); the design rationale lives in
[`docs/design/gameplay.md`](docs/design/gameplay.md); the design rationale lives in
[`PLAN.md`](PLAN.md).
## Architecture
@@ -70,13 +130,13 @@ escalation model, and the core systems — are in
A venue-driven simulation: shared systems (movement, perception, interaction,
access verification, escalation, radio, crowd, reputation, evidence, shift
review) driven by per-venue scenario data, on Godot 4 + GDScript. The full
arc42-style document is [`docs/architecture.md`](docs/architecture.md);
decisions are recorded as ADRs in [`docs/adr/`](docs/adr/).
arc42-style document is [`docs/project/architecture.md`](docs/project/architecture.md);
decisions are recorded as ADRs in [`docs/adr/`](docs/adr).
## Tech Stack
- **Engine:** Godot 4.3 baseline (local dev verified with 4.7.2) · **Language:** GDScript
- **NPCs:** Blender-authored skinned library (`assets/models/blender/`) with procedural fallbacks; lightweight FSMs on `NpcProfile`
- **Engine:** Godot 4.7.2 · **Language:** GDScript
- **NPCs:** CC0 Quaternius skinned library (`assets/models/blender/`, ADR-0018) with a tested procedural fallback; lightweight FSMs on `NpcProfile`
- **World:** procedural `WorldBuilder` + generated prop models
- **Art:** v2 skyline/surface textures in `assets/textures/ai/game_ready/v2/picks/`; UI/scene art in `assets/images/`
- **Asset tooling:** `asset_pipeline.py`, `model_pipeline.py`, `npc_pipeline.py`, `blender_assets.py`, `scene_concepts.py`, `screen_designs.py`, `check_screenshots.sh`
@@ -84,7 +144,7 @@ decisions are recorded as ADRs in [`docs/adr/`](docs/adr/).
- **Targets:** Windows, Linux, macOS, Web
The asset pipelines, model tools, and screenshot gates are documented in
[`docs/asset-tooling.md`](docs/asset-tooling.md).
[`docs/assets/asset-tooling.md`](docs/assets/asset-tooling.md).
## Setup and Run
@@ -97,33 +157,60 @@ godot --headless --path . --script res://src/test/test_runner.gd # run all tes
```
Full setup, every run/test/smoke command, and the controls table are in
[`docs/getting-started.md`](docs/getting-started.md).
[`docs/process/getting-started.md`](docs/process/getting-started.md).
## Project Documentation
- [`PLAN.md`](PLAN.md) — Game design plan and scenario details.
- [`AGENTS.md`](AGENTS.md) — Development and collaboration workflow.
- [`PLAN.md`](PLAN.md) — Game design plan, development priorities and scenario details.
- [`TODO.md`](TODO.md) — Priority-ordered tasks: character and local-map development, release milestones, and future work.
- [`docs/README.md`](docs/README.md) — Documentation index, current priorities and visual previews.
- [`docs/assets/npc-model-sourcing.md`](docs/assets/npc-model-sourcing.md) — Character-source evaluation, licence rules and the character-development plan.
- [`docs/assets/makehuman-head-review.md`](docs/assets/makehuman-head-review.md) — Local MakeHuman head prototype, provenance and review verdict.
- [`AGENTS.md`](AGENTS.md) — Development, commit, build and collaboration workflow.
- [`DONE.md`](DONE.md) — Completed task sections.
- [`MEMORY.md`](MEMORY.md) — Persistent session notes.
- [`CHANGELOG.md`](CHANGELOG.md) — User-facing changes by version.
- [`docs/architecture.md`](docs/architecture.md) — arc42-style architecture documentation.
- [`docs/gameplay.md`](docs/gameplay.md) — Gameplay systems, venues, and the escalation model.
- [`docs/tutorial.md`](docs/tutorial.md) — First-shift tutorial beats and rules.
- [`docs/asset-tooling.md`](docs/asset-tooling.md) — Asset pipelines, model tools, and screenshot gates.
- [`docs/getting-started.md`](docs/getting-started.md) — Setup, run/test commands, and controls.
- [`docs/development-status.md`](docs/development-status.md) — Implemented features and what's next.
- [`docs/smoke-checklist.md`](docs/smoke-checklist.md) — Manual smoke-test checklist.
- [`docs/blender-assets.md`](docs/blender-assets.md) — Blender asset library: characters, gear, props, attach points.
- [`docs/adr/`](docs/adr/) — Architecture Decision Records.
- [`TODO.md`](TODO.md) — Active tasks plus the v1.0.0 gap analysis and milestone roadmap.
- [`docs/project/architecture.md`](docs/project/architecture.md) — arc42-style architecture documentation.
- [`docs/design/gameplay.md`](docs/design/gameplay.md) — Gameplay systems, venues, and the escalation model.
- [`docs/design/venues.md`](docs/design/venues.md) — Real-site references, game mapping and limitations for Hollywood, the Joke Shop and the TV Studio.
- [`docs/assets/asset-tooling.md`](docs/assets/asset-tooling.md) — Asset pipelines, model tools, and screenshot gates.
- [`tools/README.md`](tools/README.md) — Tool inventory, categories, test commands and AI-skill evaluation.
- [`.agents/skills/gig-line-blender-asset-contract`](.agents/skills/gig-line-blender-asset-contract/SKILL.md) — tracked AI skill for Blender/NPC/gear asset work.
- [`.agents/skills/gig-line-release-qa`](.agents/skills/gig-line-release-qa/SKILL.md) — tracked AI skill for release and visual-QA work.
- [`docs/process/getting-started.md`](docs/process/getting-started.md) — Setup, run/test commands, and controls.
- [`docs/project/development-status.md`](docs/project/development-status.md) — Implemented features and what's next.
- [`docs/design/accessibility.md`](docs/design/accessibility.md) — Accessibility features, known gaps and statement.
- [`docs/design/known-limitations.md`](docs/design/known-limitations.md) — Release-candidate blockers and accepted limitations.
- [`docs/process/release-qa.md`](docs/process/release-qa.md) — Manual smoke checklist and release-candidate balance protocol.
- [`CREDITS.md`](CREDITS.md) — Credits, AI/reference provenance and licensing notes.
- [`PRIVACY.md`](PRIVACY.md) — Local-only data, save files and development API use.
- [`docs/assets/blender-assets.md`](docs/assets/blender-assets.md) — Blender asset library: characters, gear, props, attach points.
- [`docs/assets/npc-model-sourcing.md`](docs/assets/npc-model-sourcing.md) — character sources, the shipped roster table and the build steps; 0.9.5 texture comparison is in [`docs/blender_previews/sheet_texture_refinement_0.9.5.jpg`](docs/blender_previews/sheet_texture_refinement_0.9.5.jpg).
- [`docs/adr/`](docs/adr) — Architecture Decision Records.
## Development Status
v0.8.0 adds the first-shift tutorial, campaign shell, checkpoint resume,
difficulty presets and an in-game Help overlay on top of the v0.7.x venue, gear,
judge and Desktop HQ work. See [`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 the [`docs/smoke-checklist.md`](docs/smoke-checklist.md).
v0.9.8 is the current source version: the character-development patch with the
12-character library, realistic face and crowd variants, pose/deformation fixes
and save-migration/release hardening. It sits on the 0.9.6 integration
checkpoint, 0.9.5 texture refinement, 0.9.4 NPC visual optimization, 0.9.3
UI/accessibility polish, 0.9.2 Hollywood/Joke Shop maps and the 0.9.x engine
baseline. The active work is the `0.9.9`–`0.9.12` patch line (Quaternius NPC
base, roster, venue/asset polish, performance) followed by the `0.10.0`
public-readiness minor. See
[`docs/project/development-status.md`](docs/project/development-status.md) for the implemented list
and [`TODO.md`](TODO.md) for the priority-ordered roadmap. Manual verification uses
[`docs/process/release-qa.md`](docs/process/release-qa.md).
## Credits, Privacy and Accessibility
Gig Line is a local-only single-player game: there is no runtime telemetry or
network service, and saves stay in Godot's local `user://` folder. The
body-camera overlay is simulated. Asset provenance, AI-assisted image usage and
credits are recorded in [`CREDITS.md`](CREDITS.md); the local-data policy is in
[`PRIVACY.md`](PRIVACY.md); accessibility features and gaps are in
[`docs/design/accessibility.md`](docs/design/accessibility.md); and release-candidate blockers
are listed in [`docs/design/known-limitations.md`](docs/design/known-limitations.md).
## Development Workflow
+1243 -116
View File
File diff suppressed because it is too large. Load diff
+374 -224
View File
@@ -29,8 +29,8 @@
"bounds_godot": {
"max": [
0.15,
0.3,
0.141
0.296,
0.172
],
"min": [
-0.15,
@@ -42,33 +42,11 @@
"materials": [
"pack_nylon",
"steel",
"plastic_black"
"denim_bag"
],
"path": "assets/models/blender/npc_gear/backpack.glb",
"triangles": 316,
"vertices": 360
},
"beanie": {
"attach": "head",
"bounds_godot": {
"max": [
0.193,
0.215,
0.183
],
"min": [
-0.193,
0.014,
-0.203
]
},
"category": "npc_gear",
"materials": [
"plastic_grey"
],
"path": "assets/models/blender/npc_gear/beanie.glb",
"triangles": 460,
"vertices": 403
"triangles": 380,
"vertices": 410
},
"bench": {
"bounds_godot": {
@@ -96,14 +74,14 @@
"bollard": {
"bounds_godot": {
"max": [
0.105,
0.125,
0.975,
0.105
0.125
],
"min": [
-0.105,
-0.125,
0,
-0.105
-0.125
]
},
"category": "props",
@@ -114,20 +92,20 @@
"path": "assets/models/blender/props/bollard.glb",
"replaces": "generated/bollard.glb",
"triangles": 138,
"vertices": 225
"vertices": 221
},
"camera": {
"attach": "hand",
"bounds_godot": {
"max": [
0.106,
0.376,
0.065,
0.06,
0.143
],
"min": [
-0.106,
-0.065,
-0.053,
-0.055
0.005
]
},
"category": "npc_gear",
@@ -136,42 +114,20 @@
"lens"
],
"path": "assets/models/blender/npc_gear/camera.glb",
"triangles": 318,
"vertices": 406
},
"cap": {
"attach": "head",
"bounds_godot": {
"max": [
0.168,
0.209,
0.258
],
"min": [
-0.168,
0.037,
-0.186
]
},
"category": "npc_gear",
"materials": [
"plastic_black"
],
"path": "assets/models/blender/npc_gear/cap.glb",
"triangles": 328,
"vertices": 285
"triangles": 312,
"vertices": 422
},
"clipboard": {
"attach": "hand",
"bounds_godot": {
"max": [
0.115,
0.05,
0.11,
-0.07,
0.053
],
"min": [
-0.115,
-0.265,
-0.11,
-0.375,
0.036
]
},
@@ -188,12 +144,12 @@
"crowd_barrier": {
"bounds_godot": {
"max": [
1.116,
1.066,
1.12,
1.07,
0.307
],
"min": [
-1.122,
-1.128,
-0.014,
-0.307
]
@@ -262,14 +218,14 @@
"fire_hydrant": {
"bounds_godot": {
"max": [
0.24,
0.76,
0.19
0.265,
0.815,
0.235
],
"min": [
-0.24,
-0.265,
0,
-0.19
-0.235
]
},
"category": "props",
@@ -279,21 +235,21 @@
],
"path": "assets/models/blender/props/fire_hydrant.glb",
"replaces": "generated/fire_hydrant.glb",
"triangles": 466,
"vertices": 725
"triangles": 610,
"vertices": 902
},
"firefighter_helmet": {
"attach": "head",
"bounds_godot": {
"max": [
0.166,
0.26,
0.245,
0.26
0.166
],
"min": [
-0.26,
0.035,
-0.351
-0.166,
0.125,
-0.225
]
},
"category": "npc_gear",
@@ -351,28 +307,6 @@
"triangles": 268,
"vertices": 400
},
"hood": {
"attach": "head",
"bounds_godot": {
"max": [
0.184,
0.236,
0.123
],
"min": [
-0.184,
-0.146,
-0.225
]
},
"category": "npc_gear",
"materials": [
"plastic_grey"
],
"path": "assets/models/blender/npc_gear/hood.glb",
"triangles": 804,
"vertices": 649
},
"lanyard": {
"attach": "chest",
"bounds_godot": {
@@ -439,26 +373,28 @@
"category": "props",
"materials": [
"news_blue",
"dark_metal",
"glass",
"paper",
"steel"
],
"path": "assets/models/blender/props/newspaper_box.glb",
"replaces": "generated/newspaper_box.glb",
"triangles": 244,
"vertices": 528
"triangles": 300,
"vertices": 648
},
"npc_casual": {
"base": "hoodie",
"bounds_godot": {
"max": [
0.321,
1.824,
0.185
0.262,
1.866,
0.287
],
"min": [
-0.321,
0,
-0.178
-0.262,
-0.004,
-0.091
]
},
"category": "npc",
@@ -466,11 +402,13 @@
"materials": [
"skin",
"cloth",
"pants",
"eye_white",
"accessory",
"Eyebrows",
"sclera",
"hair",
"rubber"
"pants",
"mouth",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_casual.glb",
@@ -487,32 +425,36 @@
"accessory",
"hair"
],
"triangles": 3974,
"vertices": 3744
"triangles": 6242,
"vertices": 13100
},
"npc_coat": {
"base": "suit",
"bounds_godot": {
"max": [
0.332,
1.824,
0.185
0.255,
1.809,
0.279
],
"min": [
-0.332,
0,
-0.18
-0.255,
-0.001,
-0.083
]
},
"category": "npc",
"layer": "coat",
"materials": [
"skin",
"Tie",
"cloth",
"pants",
"eye_white",
"White",
"accessory",
"Eyebrows",
"hair",
"rubber"
"sclera",
"pants",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_coat.glb",
@@ -528,32 +470,220 @@
"accessory",
"hair"
],
"triangles": 5026,
"vertices": 4807
"triangles": 6582,
"vertices": 13607
},
"npc_dress": {
"npc_crowd_a": {
"base": "beach",
"bounds_godot": {
"max": [
0.288,
1.825,
0.208
0.252,
1.805,
0.277
],
"min": [
-0.288,
0,
-0.208
-0.252,
-0.005,
-0.088
]
},
"category": "npc",
"layer": "none",
"materials": [
"skin",
"cloth",
"accessory",
"Eyebrows",
"sclera",
"hair",
"Earrings",
"pants",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_crowd_a.glb",
"roles": [
"tourist",
"guest"
],
"tint_slots": [
"skin",
"cloth",
"pants",
"accessory",
"hair"
],
"triangles": 6602,
"vertices": 13557
},
"npc_crowd_b": {
"base": "farmer",
"bounds_godot": {
"max": [
0.256,
1.81,
0.28
],
"min": [
-0.256,
-0.0,
-0.11
]
},
"category": "npc",
"layer": "none",
"materials": [
"skin",
"LightBlue",
"cloth",
"Beige",
"accessory",
"Eyebrows",
"Beige.001",
"Red",
"sclera",
"pants",
"pupil",
"hair"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_crowd_b.glb",
"roles": [
"confused_visitor",
"guest"
],
"tint_slots": [
"skin",
"cloth",
"pants",
"accessory",
"hair"
],
"triangles": 5512,
"vertices": 11291
},
"npc_crowd_c": {
"base": "adventurer",
"bounds_godot": {
"max": [
0.255,
1.809,
0.279
],
"min": [
-0.255,
-0.001,
-0.256
]
},
"category": "npc",
"layer": "coat",
"materials": [
"Brown",
"LightGreen",
"Gold",
"Green",
"skin",
"Tie",
"cloth",
"White",
"accessory",
"Eyebrows",
"hair",
"sclera",
"pants",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_crowd_c.glb",
"roles": [
"intoxicated",
"guest"
],
"tint_slots": [
"skin",
"cloth",
"pants",
"accessory",
"hair"
],
"triangles": 9526,
"vertices": 19501
},
"npc_crowd_d": {
"base": "worker",
"bounds_godot": {
"max": [
0.262,
1.866,
0.287
],
"min": [
-0.262,
-0.004,
-0.087
]
},
"category": "npc",
"layer": "hood",
"materials": [
"skin",
"cloth",
"accessory",
"Eyebrows",
"Moustache",
"pants",
"Brows",
"sclera",
"hair",
"mouth",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_crowd_d.glb",
"roles": [
"tourist",
"guest"
],
"tint_slots": [
"skin",
"cloth",
"pants",
"accessory",
"hair"
],
"triangles": 6290,
"vertices": 13188
},
"npc_dress": {
"base": "king",
"bounds_godot": {
"max": [
0.249,
1.809,
0.269
],
"min": [
-0.249,
-0.001,
-0.083
]
},
"category": "npc",
"layer": "dress",
"materials": [
"skin",
"Blue",
"cloth",
"pants",
"eye_white",
"Beige",
"Metal_Dark",
"accessory",
"hair",
"rubber"
"Gold",
"sclera",
"pants",
"Metal_Dark_legs",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_dress.glb",
@@ -567,20 +697,21 @@
"accessory",
"hair"
],
"triangles": 4428,
"vertices": 4026
"triangles": 11126,
"vertices": 22516
},
"npc_firefighter": {
"base": "worker",
"bounds_godot": {
"max": [
0.37,
1.819,
0.213
0.262,
1.866,
0.287
],
"min": [
-0.37,
0,
-0.213
-0.262,
-0.004,
-0.087
]
},
"category": "npc",
@@ -588,13 +719,15 @@
"materials": [
"skin",
"cloth",
"pants",
"eye_white",
"accessory",
"Eyebrows",
"Moustache",
"pants",
"Brows",
"sclera",
"hair",
"hivis",
"reflective",
"rubber"
"mouth",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_firefighter.glb",
@@ -608,20 +741,21 @@
"accessory",
"hair"
],
"triangles": 4848,
"vertices": 4735
"triangles": 6290,
"vertices": 13188
},
"npc_guard": {
"base": "worker",
"bounds_godot": {
"max": [
0.361,
1.819,
0.185
0.262,
1.866,
0.287
],
"min": [
-0.361,
0,
-0.172
-0.262,
-0.004,
-0.087
]
},
"category": "npc",
@@ -629,15 +763,15 @@
"materials": [
"skin",
"cloth",
"pants",
"eye_white",
"accessory",
"Eyebrows",
"Moustache",
"pants",
"Brows",
"sclera",
"hair",
"rubber",
"leather",
"steel",
"patch",
"plastic_black"
"mouth",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_guard.glb",
@@ -652,32 +786,38 @@
"accessory",
"hair"
],
"triangles": 4560,
"vertices": 4529
"triangles": 6290,
"vertices": 13188
},
"npc_hoodie": {
"base": "punk",
"bounds_godot": {
"max": [
0.326,
1.856,
0.185
0.241,
1.806,
0.263
],
"min": [
-0.326,
0,
-0.225
-0.241,
-0.004,
-0.147
]
},
"category": "npc",
"layer": "hood",
"materials": [
"skin",
"White",
"cloth",
"pants",
"eye_white",
"accessory",
"sclera",
"Eyebrows",
"Red_Dark",
"hair",
"rubber"
"Earrings",
"Skin_legs",
"pants",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_hoodie.glb",
@@ -693,20 +833,21 @@
"accessory",
"hair"
],
"triangles": 4826,
"vertices": 4504
"triangles": 5524,
"vertices": 11257
},
"npc_jacket": {
"base": "casual_2",
"bounds_godot": {
"max": [
0.332,
1.824,
0.185
0.255,
1.809,
0.279
],
"min": [
-0.332,
0,
-0.178
-0.255,
-0.001,
-0.164
]
},
"category": "npc",
@@ -714,11 +855,13 @@
"materials": [
"skin",
"cloth",
"pants",
"eye_white",
"accessory",
"Skin_Darker",
"Eyebrows",
"hair",
"rubber"
"sclera",
"pants",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_jacket.glb",
@@ -734,34 +877,38 @@
"accessory",
"hair"
],
"triangles": 4394,
"vertices": 4175
"triangles": 5800,
"vertices": 11866
},
"npc_vest": {
"base": "worker",
"bounds_godot": {
"max": [
0.321,
1.819,
0.185
0.262,
1.789,
0.287
],
"min": [
-0.321,
0,
-0.172
-0.262,
-0.004,
-0.083
]
},
"category": "npc",
"layer": "vest",
"materials": [
"skin",
"Worker_Yellow",
"cloth",
"pants",
"eye_white",
"accessory",
"Eyebrows",
"Moustache",
"pants",
"Brows",
"sclera",
"hair",
"rubber",
"hivis",
"reflective"
"mouth",
"pupil"
],
"mesh_node": "npc_base",
"path": "assets/models/blender/npc/npc_vest.glb",
@@ -775,8 +922,8 @@
"accessory",
"hair"
],
"triangles": 4474,
"vertices": 4340
"triangles": 6290,
"vertices": 13186
},
"palm_tree": {
"bounds_godot": {
@@ -794,7 +941,8 @@
"category": "props",
"materials": [
"palm_bark",
"palm_leaf"
"palm_leaf",
"palm_leaf_dark"
],
"path": "assets/models/blender/props/palm_tree.glb",
"triangles": 400,
@@ -827,7 +975,7 @@
"bounds_godot": {
"max": [
0.5,
1.08,
1.118,
0.5
],
"min": [
@@ -840,12 +988,13 @@
"materials": [
"stone_pot",
"soil",
"foliage"
"foliage",
"foliage_dark"
],
"path": "assets/models/blender/props/planter_box.glb",
"replaces": "generated/planter_box.glb",
"triangles": 1324,
"vertices": 2780
"triangles": 818,
"vertices": 1701
},
"protest_sign": {
"attach": "hand",
@@ -900,24 +1049,25 @@
"round_planter": {
"bounds_godot": {
"max": [
0.432,
1.12,
0.399,
1.175,
0.36
],
"min": [
-0.36,
0,
-0.363
-0.376
]
},
"category": "props",
"materials": [
"stone_pot",
"foliage"
"foliage",
"foliage_dark"
],
"path": "assets/models/blender/props/round_planter.glb",
"triangles": 1240,
"vertices": 2418
"triangles": 808,
"vertices": 1522
},
"scba_tank": {
"attach": "back",
@@ -1071,14 +1221,14 @@
"street_tree": {
"bounds_godot": {
"max": [
1.179,
3.62,
1.102
1.15,
3.634,
1.053
],
"min": [
-0.941,
-1.041,
0,
-1.082
-1.08
]
},
"category": "props",
@@ -1090,21 +1240,21 @@
],
"path": "assets/models/blender/props/street_tree.glb",
"replaces": "WorldBuilder cone trees",
"triangles": 2592,
"vertices": 5620
"triangles": 1506,
"vertices": 3330
},
"sunglasses": {
"attach": "head",
"bounds_godot": {
"max": [
0.101,
0.059,
0.158
0.065,
0.141,
0.101
],
"min": [
-0.101,
0.011,
0.003
-0.065,
0.11,
0.002
]
},
"category": "npc_gear",
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,33 @@
# Quaternius build sources (CC0 1.0)
These are the **build inputs** for the shipped NPC roster, not runtime assets.
`blender_src/.gdignore` keeps Godot from importing this directory.
Source: Quaternius *Ultimate Modular Characters* and *Ultimate Modular Women*
(<https://quaternius.com/packs/ultimatemodularcharacters.html>), licence CC0 1.0,
attribution recorded in the repository `CREDITS.md`.
| File | SHA-256 | Bones | Meshes |
| --- | --- | --- | --- |
| `Casual.glb` | `bc2d84fba249ebaa0629cb9d133ad37234196e4b8004aa205a6397abed04e05c` | 62 | 4 skinned + Icosphere helper |
| `Casual_Hoodie.glb` | `f5b722199f7628b24550989af4230f65d5230727df9c326fd2b3e360effe5249` | 62 | 4 skinned + Icosphere helper |
| `Worker.glb` | `8d0f454336c2effc5c08f63a177af3a82d1a7af025ca9588b40e4c90c4703534` | 62 | 4 skinned + Icosphere helper |
Each file also carries 24 animation clips; the build exports **no** animation data, so
the shipped GLBs contain the mesh, the 62-joint skin and the material slots only.
Reproducing the shipped characters:
flatpak run org.blender.Blender --background \
--python "$PWD/tools/blender_assets.py" -- build --only npc
Upstream quirks the build compensates for (see `docs/assets/npc-model-sourcing.md`):
1. every mesh ships a **degenerate UV map** (all loops at `0,0`) with flat-colour
materials, so the build Smart-UV-unwraps and repacks before export;
2. the meshes must be joined **without welding** — `remove_doubles` corrupts the
skin weights;
3. the rest pose is a T-pose, so the arm-down rest is baked by
`_bake_quaternius_rest()`;
4. the upstream material names differ per file, so each source carries a slot map
down to the project's five tint slots.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,54 @@
# Quaternius modular parts
Build inputs for outfit, hair and accessory variety. Committed like the three whole-body
sources, so `build` works from a fresh checkout without the upstream pack.
## Where they come from
The upstream *Ultimate Modular Characters* pack is distributed as a Google Drive folder
(<https://drive.google.com/drive/folders/1USAAquX2JJWuA2m6zol0KUkFe3UkZ8zX>, CC0 1.0). It cannot be
fetched reproducibly by a script, so the owner downloads it **once** into the gitignored
`tmp/quaternius-intake/`. Everything after that is scripted:
```sh
python3 tools/quaternius_parts.py inventory --dir tmp/quaternius-intake
python3 tools/quaternius_parts.py extract \
--file tmp/quaternius-intake/<file>.glb --mesh <mesh> --part <part>
python3 tools/quaternius_parts.py verify --dir assets/models/blender_src/quaternius/parts
```
`inventory` and `verify` run outside Blender; `extract` needs Blender, because it rewrites the skin.
The pack itself is never committed — only the parts that are actually used, each with its SHA-256
recorded here and in `CREDITS.md`.
## Part contract
A part is **one skinned mesh on the 62-joint rig**:
- one mesh object, parented to the rig's armature, carrying `JOINTS_0`/`WEIGHTS_0`;
- the standard joint names (`Hips`, `Chest`, `Head`, `UpperArm.L`, …). The rig check in
`quaternius_parts.py verify` fails a part that is missing any of them, because
`NpcAvatar` maps those bones;
- materials named after a contract slot (`skin`, `cloth`, `pants`, `hair`, `accessory`) so the
runtime tint reaches them, or a fixed-colour detail name that is deliberately not tinted;
- triangles counted against the character budget: base body plus every joined part must stay
inside 24,000 triangles and 24,000 glTF vertices.
The builder drops the part's own armature when it joins the mesh onto a base body, because the base
already owns the skeleton and two armatures would duplicate every bone. Weights survive the join
because Blender merges vertex groups by name.
## Assigning parts to a role
```python
"npc_vest": {"layer": "vest", "base": "worker", "parts": ["hivis_vest"], ...}
```
`build` joins those parts after the body join and before the material slot map, so the part's
materials go through the same slot mapping as the base. The T-pose cache is keyed on the part list.
## Kept parts
| Part | Source file | SHA-256 | Tris |
| --- | --- | --- | --- |
| _(none yet — the pack has not been intaken)_ | | | |
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 922 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 639 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Loaded 100 of 363 files, more files were not shown because too many files have changed in this diff. Show more