Files
settled-reach/docs/assets/briefs/doors.md
T
jpmschweitzerandClaude Fable 5 660f4a703f docs(assets): PR #213 review fixes — DoorSpec fields, spike inventory, axis honesty, D-154
doors.md now presents D-231's actual struct shape (initial_state
Open/Closed/Locked/Sealed; TemporalWindow lives in the independent
credential field) and attaches the Phase-5 runtime bridge to
initial_state only. furniture-props.md inventories all five spike GLBs
— acceptance is 4 promotable (3 furniture + lion_statue), vw_beetle
explicitly excluded to the Q-067 deferral. deferred.md + station-walls
gain the axis-completeness note: roof/facade/street textures ride the
wall-brief convention as a same-family follow-on, so the register
accounts for all four D-235 axes. The briefing's D-257 pointer
corrected to palette.md §2.1–2.2, and both the briefing and palette.md
(leave-cleaner, gap inherited from PR #211) now carry D-154's amendment
to D-033 — relationship colors display only in the insert/perception
overlay; normal gameplay is a uniform #1a1a1a outline (D-150).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-25 23:10:09 +02:00

98 lines
4.7 KiB
Markdown

---
title: "Asset Brief — Doors"
description: "Door models — no D-235 ObjectTag axis; logical DoorSpec exists, runtime open/closed mechanism deferred to Phase 5"
type: design
status: active
ticket: ""
decision_refs: [D-231, D-244, D-257]
author: "Araminta"
created: 2026-07-25
updated: 2026-07-25
---
# Asset Brief — Doors
One page. Gates its child story — the story does not enter `in_progress`
without this brief attached.
---
## 1. Scope
Door **models** (`furniture` or `props` manifest category — a door is a
fitted architectural object, closer to `props`; the manifest's `category`
field is authoritative regardless of subdirectory per `conventions.md` §1).
Doors have **no D-235 ObjectTag axis** — wall/roof/facade/street are building-
exterior surface tags; a door is a discrete object that sits in a wall
opening. What DOES exist already: the **logical** `DoorSpec`/
`InteriorDescriptor` model (T-979/T-998, D-231) — door count derivation
(Main/Service/Emergency/Hidden) and **two separate derived fields**:
`initial_state` (`Open`/`Closed`/`Locked`/`Sealed`) and, independently,
`credential` (`None`/`TemporalWindow(hours)`/`Corporate(corp)`/
`Resident(block)`/`Authority`/`Social(f32)`) — but that work is server-side
struct definition only, not visual. This brief covers the **visual asset**
only; it does not touch T-979/T-998's derivation logic.
## 2. Visual Reference
No D-235 token to cite — doors take `palette.md` §2's toon default (same
shader family as characters/furniture: `toon.gdshader` or `toon_masked
.gdshader`, `roughness=1.0`/`specular=0.0`). A door with a glazed panel
(e.g. a station door with a window) falls under the §2.1 glazing carve-out
if the pane is gameplay-load-bearing for sightlines — treat that panel as a
separate material slot at minimal-PBR, the rest of the door stays flat toon.
No dedicated door row exists in palette.md §3's material register (that
table only covers wall/roof/facade/street) — if a door's finish should match
its host building's wall material (e.g. a timber door on a `timber_wall`
building), that is a future content-authoring choice, not something this
brief specifies.
## 3. Naming
`<category>_<descriptor>.glb` per `conventions.md` §1 — e.g. `door_sliding
.glb`, `door_hinged.glb`. **Negative constraint, binding (`conventions.md`
§5): do NOT author state-frame suffix files** (`door_open.glb`/
`door_closed.glb`). One door `.glb` per descriptor; `DoorSpec`'s
`initial_state` (`Open`/`Closed`/`Locked`/`Sealed`) is a **runtime
transform/animation** on that single model — the actual mechanism
(`AnimationPlayer` swing, procedural hinge rotation, or a named "open" bone
convention) is explicitly a **Phase-5 rendering decision**, out of scope for
this Phase-4 asset brief and for the story it gates. The separate
`credential` field (`None`/`TemporalWindow(hours)`/`Corporate(corp)`/
`Resident(block)`/`Authority`/`Social(f32)`) is an access-control value, not a
door pose — it carries no visual-asset implication at all (no lock-indicator
variant, no separate model), so this brief's naming/negative-constraint
scope is `initial_state` only. Mask sidecar (`<model>_mask.png`) only if a
tintable variant is wanted; footprint is single-tile (`[1, 1]`, omit the
field) — a door does not span multiple sim tiles.
## 4. Generation Path
Standard path: `/image-gen` (toon-shaded concept, 3/4 front view, closed-door
pose since there is no baked open state) → `/glb-gen` (Trellis) → Blender
postprocess → promotion into `client/assets/models/props/` + `manifest.json`
entry. No texture-only alternative here — a door is inherently a discrete
mesh, not a tileable surface.
## 5. Acceptance
2 starter assets enter `models.md` + `manifest.json` at `planned`: (1)
`door_hinged` — the generic single-leaf door, the closest thing this class
has to a D-235-style fallback default even though no `generic_door` tag is
formally ratified (Q-119's text lists "generic door/floor/furniture parents"
as a candidate milestone-0 set alongside the ratified `generic_wall/roof/
facade/street`**milestone-0 IF Q-119 resolves yes**, not resolved here);
(2) `door_sliding` — matches the `workshop-outcomes.md` §3.3 `door_sliding`
prior-art mention and a plausible station-context default. Both ship as one
model each, no state-frame variants, per §3's negative constraint.
---
## Cross-References
- `docs/assets/visual/conventions.md` §1, §2, §5 — model naming, mask sidecar, door-state negative constraint
- `docs/assets/visual/palette.md` §2 — toon default, glazing carve-out if applicable
- `docs/assets/visual/models.md` — target catalog
- `client/assets/models/manifest.json`
- T-979/T-998 (D-231) — the logical `DoorSpec`/`InteriorDescriptor` this brief's visual asset will eventually attach to (Phase 5, not this brief's scope)