Files
security-game/docs/adr/0010-procedural-npc-presentation.md
T
zwitschi 6684d36739
Full build / Import + headless tests (push) Successful in 26s
Full build / Full desktop build + optional release (push) Failing after 3m58s
Fix release publishing and add a CI token fallback
Tag builds since v0.2.2 built all artifacts but never published a release:
- tools/publish_release.sh only assembled AUTH in the GITEA_TOKEN branch; the
  ~/.git-credentials branch set CRED and then used an unbound ${AUTH[@]} under
  `set -u`, so every API call failed and the job ended "could not create or find
  release". It now sets AUTH=(-u "$CRED").
- The repo has no GITEA_TOKEN secret and the runner has no git credentials, so the
  workflow now falls back to the built-in workflow token:
  GITEA_TOKEN: ${{ secrets.GITEA_TOKEN || github.token }}.

v0.2.9 was then built and published locally with all five artifacts (portable
Linux/Windows/macOS, NSIS installer, AppImage) and the release page verified via
the API. v0.2.4-v0.2.8 remain unpublished; they are superseded by the latest.

Docs
- docs/RELEASING.md records the incident and the local-publish fallback.
- TODO gains a release-pipeline follow-up (verify CI on the next tag).
- MEMORY notes the root cause, the missing secret, and which releases exist.
- Version 0.2.10.
2026-10-31 21:23:09 +01:00

2.9 KiB

ADR-0010: Procedural NPC presentation

  • Status: Accepted
  • Date: TBD

Context

Avatars are CharacterBody3D capsules color-coded by NpcType, with a few props (camera, box, hat, sign, bag), height and brightness variation from a seed, a walk bob, and a head turn toward the guard when noticed. They work as markers. At conversation distance they do not read as people: no neck, no face direction, no shoes, no hair.

The player is supposed to judge from clothes, props, and behavior, not from a label. The HUD currently prints the internal type (Violent Threat, Trespasser) next to the name. Putting that name on the body would make the judgment for them.

A full Mixamo / GLB pipeline would also add animation imports, licenses, and a skeleton the rest of the sim does not need yet. AI textures in assets/textures/ai/ are not sized or wired for clothing.

Decision

Keep the procedural capsule rig for this pass. Do not add skinned meshes or Mixamo.

Make the body read as a person at conversation distance:

  • Neck between torso and head.
  • Shoes.
  • Hair cap whose color comes from the visual seed.
  • Two dark eye spheres so the head has a front.
  • Named Head node (Rig/Head) as the attach point for the focus circle (ADR-0008) and the focus cone.
  • Collision capsule scaled to the visible height so the cone hits the body the player sees.

Keep archetype props, height / brightness variation, walk bob, and the notice head-turn.

Do not put the internal type name on the body or as a world nametag. A focused display_name under the ring is allowed. The debug overlay (F) may still print type, intent, and FSM state. The HUD target line can keep the type during the prototype; removing it from the HUD is a later readability pass, not this one.

AI clothing textures stay out unless a map is already the right size and is wired on purpose.

Consequences

Positive

  • People have a face direction the ring and the "noticed the guard" cue can use.
  • No new asset toolchain, licenses, or animation retargeting.
  • Head is a stable node other systems can find.
  • The player is not told Violent Threat by a floating label.

Negative

  • Capsule people still look like a prototype at cinematic camera distance.
  • Hair and eyes are spheres; they will not survive a close-up trailer.
  • A later skinned-mesh pass will replace this rig and must keep the Head contract.

Alternatives considered

  • Skinned Mixamo / GLB characters now: Rejected. Cost and pipeline exceed this pass; the sim only needs a readable body and a head node.
  • Billboard sprites: Rejected; first-person movement walks around people, and sprites fail at profile views.
  • Keep colored capsules as-is: Rejected; the focus circle and cone need a real head, and capsules do not read as people at two metres.
  • World labels with archetype names: Rejected because they leak sim truth and skip observation.