Workshop -> decision provenance was prose-only. Adds a `decision_refs:` YAML
frontmatter list (the confirmed D-records each workshop-outcomes.md touches,
filtered against the governance decision set) to all 17 workshop outcomes; the two
that lacked frontmatter (commodity-catalog, system-economic-specialization) get a
minimal block. pql indexes the list and `SELECT fm.decision_refs` round-trips it, so
"which workshops touch D-NNN" is answerable via SELECT + filter or `pql search`.
decision_refs is a relevance signal (decisions a workshop discusses/produces), not a
strict authorship claim — historical bare refs aren't disambiguated. Generated wiki
read-only sections are left untouched.
Noted in pql-requirements #5: 1.6.2 has no working DSL operator for frontmatter
list-membership (`~`/`contains` error, `in` matches nothing), so membership queries
need a client-side filter for now.
Reproducible via tooling/pql-migrate/add_workshop_provenance.py (idempotent).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Decisions, resolved questions, and deliverables from the Sprint 28 character visuals planning workshop (ticket #684)
workshop-outcomes
complete
28
684
2026-03-17
D-019
D-033
D-146
D-148
D-149
D-150
D-151
D-152
D-153
D-154
D-155
D-156
D-157
Sprint 28 Character Visuals Workshop — Outcomes
Ticket: #684
Date: 2026-03-17
Participants: Araminta (art direction), Gestalt (systems), Tyre (technical), Ozzie (player experience), Nigel (replayability), Qatux (documenter), SI (project manager)
Facilitator: Jeroen (project lead)
Rounds: 2 (Round 3 was spec sign-off; specs written by Qatux)
Summary
This workshop resolved the foundational visual architecture for The Settled Reach characters. The major outcome is a shift from the previous approach (2D pre-rendered sprites at a shallow art-convention tilt) to live 3D compositing at a 30° real camera tilt with 45° diamond-grid map rotation. This change was driven by a functioning prototype spike that demonstrated 3D placeholder characters (CSG shapes) reading legibly as people at isometric scale.
The workshop produced 10 new D-records (D-148–D-157), two spec documents, and this outcomes file.
Supersedes D-019. Default gameplay camera. Real Camera3D, not faked in art.
D-149
3D characters rendered live in scene
Not pre-rendered sprites. CharacterCompositor replaces Sprite2D in EntityRenderer.
D-150
Character outline — inverted hull method
Uniform dark gray (#1a1a1a). GPU vertex extrusion. Baked into billboard at LOD Tier 2.
D-151
Direction count — 8 server / 4 client visual groups
Server tracks 8 facings. Client renders 4 visual groups (Sprint 28). West mirrors East.
D-152
Character LOD — performance-driven budget
Frame budget threshold, not distance or count. Three tiers. Pause = full detail everywhere.
Scope decisions (decisions/scope.md)
ID
Title
Summary
D-153
Player not visually distinct from NPCs
Same models, same outlines. Distinction comes from gear only.
D-154
Outline not a relationship indicator
Uniform dark always. D-033 color palette valid in insert/perception mode only.
D-155
Character editor: cardinal rotation only
N/E/S/W buttons. No free-spin. Matches the 4 visual groups.
D-156
Faction colors = narrative, not visual
No faction color slot in compositor. Clothing choices emerge from character, not faction.
D-157
Game start = alarm clock / fade from black
Not a camera pull-back from editor. Editor is a separate context.
Amended decisions
ID
Change
D-019
Marked [SUPERSEDED by D-148]
D-033
Amended: entity relationship color valid in insert/perception mode only; not on character outline in normal gameplay
Round 1 Proposals — Overruled
The following Round 1 proposals were overruled by Jeroen and are recorded here for the archive. They should not be revisited without explicit project lead direction:
Proposal
Overruled by
Relationship color on outlines
D-154 — outlines are uniform dark always
Player character visually distinct (protagonist glow/tint)
D-153 — player = NPC visually
Free-spin in character editor
D-155 — cardinal buttons only
Camera pull-back from editor into game world
D-157 — alarm clock / fade from black
Faction colors as visual system
D-156 — narrative emergence only
Open Questions Resolved
Q
Question
Resolution
Q1
4 or 8 directions?
D-151: 8 server, 4 visual groups (Sprint 28). Hybrid approach.
Q2
Large crowd performance?
D-152: Performance-driven LOD. Progressive degradation outward from player. Pause = full detail.
Remaining Open Questions / Flags
These were identified during the workshop but not resolved. They are implementation concerns for the client and visual teams:
Item
Owner
Notes
Exact server-facing → visual group snap mapping
Tyre
Depends on camera/grid orientation. Confirm in compositor implementation.
Expression overlay: mesh swap vs. morph target
Tyre
Cost/quality tradeoff. Decide in #693.
Clothing mesh per body type vs. compositor scale
Tyre
Separate .glb per body type is simpler; scaling risks clipping. Decide in #693.
Stocky body type in Sprint 28
Araminta
Stretch goal — drop if time pressure.
D-146 + D-149 interaction
Qatux flag
D-146 says "tile-scale sprite" for editor preview; D-149 says live 3D rendering. Compatible if editor uses SubViewport with the live compositor. Do not reopen D-146.
Deliverables Produced
File
Description
docs/design/character-visuals-spec.md
Complete spec: layer stack, color regions, body/face/hair types, direction system, outline, LOD
docs/design/compositor-api-spec.md
Godot compositor data model, node architecture, public API, EntityRenderer integration