diff --git a/.pql/changelog/ticket_deps/2026-07.sql b/.pql/changelog/ticket_deps/2026-07.sql index b27050445..4e752fd98 100644 --- a/.pql/changelog/ticket_deps/2026-07.sql +++ b/.pql/changelog/ticket_deps/2026-07.sql @@ -26,3 +26,4 @@ INSERT INTO ticket_deps (blocker_record_id, blocked_record_id, created_at, updat INSERT INTO ticket_deps (blocker_record_id, blocked_record_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FS5XQW73B1P8WKR2BCZBFXZW', '06FS5XW0ZMPVYA2CPBBTP88TQC', '2026-07-24 07:12:41.953', '2026-07-24 07:12:41.953', NULL, '900579ff4a0f777db3fee1b48be50ad2', 2) ON CONFLICT(blocker_record_id, blocked_record_id) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_deps.updated_at OR (excluded.updated_at = ticket_deps.updated_at AND excluded.hash > ticket_deps.hash); INSERT INTO ticket_deps (blocker_record_id, blocked_record_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FS5XXY5GNCQEXYAYQEQD0CHM', '06FS5XZF4A978WS1J66Q2JBK8C', '2026-07-24 07:12:42.876', '2026-07-24 07:12:42.876', NULL, '6215bc0bc9966f904af9212895fb2a93', 2) ON CONFLICT(blocker_record_id, blocked_record_id) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_deps.updated_at OR (excluded.updated_at = ticket_deps.updated_at AND excluded.hash > ticket_deps.hash); INSERT INTO ticket_deps (blocker_record_id, blocked_record_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FS5XT949C8D2JZRWDX2CRZN8', '06FRXKFEJMDEPQ0PZ5Q862DHKG', '2026-07-24 07:12:43.096', '2026-07-24 07:12:43.096', NULL, '1813bd9c252aa447c9d7ad88c604d6cd', 2) ON CONFLICT(blocker_record_id, blocked_record_id) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_deps.updated_at OR (excluded.updated_at = ticket_deps.updated_at AND excluded.hash > ticket_deps.hash); +INSERT INTO ticket_deps (blocker_record_id, blocked_record_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPE8FR7TGEM7X6QVPV4M', '06FBPTXPPHC9FZ4T0GNKR615PR', '2026-07-25 18:11:40.311', '2026-07-25 18:11:40.311', NULL, '10922d908dd3b4fb42c989bb75391935', 2) ON CONFLICT(blocker_record_id, blocked_record_id) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_deps.updated_at OR (excluded.updated_at = ticket_deps.updated_at AND excluded.hash > ticket_deps.hash); diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index 9ded777e5..ef90fa3e7 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -2115,3 +2115,210 @@ Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above i INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FRJD6EKPBQE08NA8VHP692W8', 'status', 'backlog', 'in_progress', NULL, '2026-07-25 18:04:06', '2026-07-25 18:04:06.736', '2026-07-25 18:04:06.736', NULL, '581321f1ce2faaef8636c8b2f5182716', 2) ON CONFLICT(hash) DO NOTHING; INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FSM3MQ5GFSPKKFJF6GGZN8CM', 'status', 'backlog', 'ready', NULL, '2026-07-25 18:04:07', '2026-07-25 18:04:07.273', '2026-07-25 18:04:07.273', NULL, '56f337047d088a7547c30ce3f4186497', 2) ON CONFLICT(hash) DO NOTHING; INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FRJD6EKPBQE08NA8VHP692W8', 'assigned_to', NULL, 'hoshe', NULL, '2026-07-25 18:04:09', '2026-07-25 18:04:09.374', '2026-07-25 18:04:09.374', NULL, '91edbb31a5c8128989e1fb19f2eedc70', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'description', '(description follows in first append) + +--- +Refinement (2026-06-16, /whats-next Si pass) — FULL scope (user decision). Two deliverables + conventions. + +(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model. + +(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) — per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest. + +(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. _open / _closed), Godot TileSet resource organization (/.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: __.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL. + +OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog — note the edge. T-1049''s per-class stories will reference these conventions — do T-1050 first / concurrently so T-1049 can cite them. + +--- +HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming). +The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md +"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen +render-3D->2D-sprites step). Direction correction: we are NOT producing sprites — Trellis +produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES. +Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before +activating. See the sprite-vs-3D root-cause note (this session). + +Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it — the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them.', '(description follows in first append) + +--- +Refinement (2026-06-16, /whats-next Si pass) — FULL scope (user decision). Two deliverables + conventions. + +(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model. + +(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) — per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest. + +(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. _open / _closed), Godot TileSet resource organization (/.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: __.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL. + +OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog — note the edge. T-1049''s per-class stories will reference these conventions — do T-1050 first / concurrently so T-1049 can cite them. + +--- +HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming). +The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md +"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen +render-3D->2D-sprites step). Direction correction: we are NOT producing sprites — Trellis +produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES. +Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before +activating. See the sprite-vs-3D root-cause note (this session). + +Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it — the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them. + +Refinement (batch-5 Si pass, 2026-07-25) — SUPERSEDES the 2026-06-16 block above (sprite-centric, invalidated by D-244). READY. + +CONTEXT: D-244 (confirmed, 2026-06-16) already re-scoped the catalog structure and repointed +renderer/README.md, sprite-gen SKILL.md, docs/assets/README.md, docs/assets/visual/{README,palette}.md, +and docs/assets/_templates/sprite.md (marked legacy) at the 3D-model reality. This ticket is now +narrower than its original draft: instantiate what D-244 named but did not fill in, plus author +conventions.md (net-new — no D-244 amendment touched it). + +DELIVERABLE (a) — Category catalog files, per docs/assets/README.md''s already-updated structure: + - docs/assets/visual/models.md — 3D objects/props (.glb via /glb-gen). Row template TBD (see + conventions.md below) since _templates/sprite.md is explicitly legacy/retired for this use. + - docs/assets/visual/textures.md — PBR surface maps (BaseColor/Normal/Roughness) for 3D models. + - docs/assets/visual/artwork.md — flat 2D art (paintings/flags/billboards/signage) via /sprite-gen''s + repurposed 2D-artwork role. + - docs/assets/visual/icons.md — UI icons (13 SVGs already exist in client/assets/icons/ — this file + should reflect that as-built inventory, not start at zero). + - docs/assets/visual/effects.md — shaders/particles/overlays. + Each file follows docs/assets/audio/README.md''s model: per-category status table (planned/in-progress/ + placeholder/final per docs/assets/README.md''s vocab), current counts. Update docs/assets/visual/README.md''s + category table counts once files exist (currently all show 0, which will stay accurate at initial creation + — do not invent placeholder rows). + ACCEPTANCE: 5 files exist, cross-linked from visual/README.md (already has the links — verify they resolve), + each with a real (possibly empty) status table matching the audio/README.md pattern. + +DELIVERABLE (b) — glb-gen production path: + - Create client/assets/models/ with furniture/ and props/ subdirectories (mirroring the proven + spike layout at spikes/3dpipeline/models/{furniture,props}/) + .gitkeep in each. + - Define client/assets/models/manifest.json, schema mirroring docs/architecture/character-asset-organization.md''s + per-asset-entry pattern (that doc''s clothing/accessory entries are the closest precedent — a flat + per-item record, not per-body-type variants since environment props aren''t body-fitted). Minimum + fields: name, category (furniture|props), source_model (path under client/assets/models/), subdirectory, + status (planned/in-progress/placeholder/final — reuse the docs/assets/README.md vocab so catalog and + manifest never disagree). Promotion = repo-canonical per D-241 — an asset entering manifest.json AND + client/assets/models/ IS the promotion act; nothing stays "promoted" in spikes/. + - Update .claude/skills/glb-gen/SKILL.md — replace the "client/assets/models/ does not exist... that''s + a Phase-5 concern" paragraph (lines ~96-102) with the new path + a pointer to the manifest. NOTE: + this contradicts nothing already in D-244/T-750 — T-750''s own epic description lists furniture/props + production as Phase-4 parallel work, so populating the production path (not populating the world with + them — that''s Phase 5 per T-961) is in-scope now. + ACCEPTANCE: client/assets/models/{furniture,props}/.gitkeep exist; manifest.json schema documented + (either inline in SKILL.md or as a comment/example in the file itself, following the character + manifest''s convention); SKILL.md''s stale "does not exist" paragraph is corrected. + +DELIVERABLE (c) — docs/assets/visual/conventions.md (NEW FILE — no prior art to amend): + - Model naming: _.glb (e.g. table_baroque.glb, chair_modernist.glb) — + mirrors the spike''s existing baroque_table.glb/modernist_chair.glb pattern loosely; pick one + order and state it (category-first matches the character-asset clothing convention + _; the spike used descriptor-first — this is a naming decision to make, + not silently pick — see lead note below on who rules it). + - Mask sidecar: _mask.png, single-channel per the character-asset convention (Section 3 + of character-asset-organization.md) UNLESS the item needs multi-region tinting, in which case follow + the RGBA channel-routed convention from that doc''s Section 11 (T-1089) rather than reinventing one. + - Texture naming keyed to D-235 tokens: PBR maps for building-exterior surfaces should name by + the ratified ObjectTag vocabulary (D-235 amendment, wiki/economics/object_tag_vocabulary.toml) — + e.g. concrete_wall_basecolor.png, pitched_roof_normal.png — NOT the old renderer/README.md + __.png scheme, which is direction-indexed for the retired 4-direction + sprite render and does not apply to PBR texture maps at all (there is no "direction" for a texture, + only map type: basecolor/normal/roughness). + - Door state handling — DO NOT port a state-frame suffix convention. The 2026-06-16 draft proposed + _open/_closed GLB variants; this is sprite-era thinking (baked state = baked frame). + For a 3D object the door''s open/closed/locked/sealed state (T-979/T-998''s DoorSpec: Open/Closed/ + TemporalWindow/Locked/Sealed) is a RUNTIME transform/animation on one door .glb, not separate baked + models — but the actual mechanism (AnimationPlayer swing vs. procedural hinge rotation vs. a + door-model convention with a named "open" bone) is a Phase-5 rendering decision (player control + + in-world rendering, per the cascade), not a Phase-4 asset-catalog concern. This ticket + should record ONLY the negative constraint (no state-frame suffix files) and defer the positive + mechanism to whichever Phase-5 ticket handles door rendering. Do not invent a runtime convention here. + - Godot TileSet resource organization — OUT OF SCOPE, removed from ticket. client/scripts/rendering/ + tile_renderer.gd''s TileSet is an explicitly-labeled placeholder ("programmatic TileSet with placeholder + colored rectangles," D-014) and the cascade rule states current in-world rendering code is + "left as-is until Phase 5 — do not build on it or rip it out before then." A /.tres + convention would be building on Phase-5-owned code from Phase 4. Do not author this section. + - Multi-tile footprint metadata: still relevant (a table/couch spans multiple sim tiles regardless + of sprite vs 3D) — keep this item, express as a manifest.json field (e.g. footprint_tiles: [w, h]) + rather than a filename convention. + ACCEPTANCE: conventions.md exists, covers model naming / mask sidecars / D-235-keyed texture naming / + multi-tile footprint metadata; explicitly states the door-state and TileSet items are deferred (with + reasons) rather than silently omitted, so a future refinement pass doesn''t have to re-derive why. + +SEQUENCING (unchanged from 2026-06-16 note): T-1053 (araminta briefing rewrite) softly depends on this +catalog. T-1049''s per-class stories reference these conventions — this ticket lands first / concurrently. + +Lead note (batch-5 activation): the model-naming-order call (category-first vs descriptor-first) is +delegated to araminta (art seat) this batch — her ruling lands in conventions.md with a one-line +rationale; surfaced to Jeroen in the batch report for cheap veto. VERDICT: READY.', NULL, '2026-07-25 18:11:31', '2026-07-25 18:11:31.588', '2026-07-25 18:11:31.588', NULL, '538f0887a4125773b49a88dcdd0b99ff', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'description', '(description follows in first append)', '(description follows in first append) + +Refinement (batch-5 Si pass, 2026-07-25) — READY. + +CURRENT STATE: docs/assets/visual/palette.md exists as a STUB (correctly re-scoped by D-244 — no +sprite-era content survives in it) — 4 bullets: camera angle (D-019, now superseded by D-148 for +gameplay — palette.md''s bullet is stale and must be corrected), entity colors (D-033), environmental +neutrality (D-045), "functional warmth." It explicitly defers to "art direction workshop synthesis and +first visual sprint" — this ticket IS that synthesis pass for Phase 4. + +WHAT D-235 ALREADY FIXES (do not re-litigate): the building-exterior material/roof/facade/street +vocabulary (WallMaterial/RoofForm/FacadeRhythm/StreetSurface, ratified as the 28-template +architecture_trait_catalog.toml / wiki/economics/object_tag_vocabulary.toml) and the fallback-to-generic +mechanism. D-235 is the LOGICAL token layer ("what material is this wall") — Phase 4+ scope per its own +Implementation note ("textured render + the bulk of the theme library are Phase 5+"). T-1052 is the +RENDERED-LOOK layer on top: given a WallMaterial token, what does concrete_wall actually look like +(hue range, texture grain, weathering baseline) when art is eventually produced against it. + +WHAT T-1052 MUST STILL AUTHOR (net-new, no existing decision covers this): + - Correct the camera-angle bullet: D-148 (30 deg low-angle Camera3D, supersedes D-019) is the GAMEPLAY + camera; D-019''s -72.5 deg survives only for the offline renderer (2D-artwork / retired sprite mode, + per renderer/README.md). palette.md''s current bullet conflates these — fix it to name both and + which applies where. + - A concrete color/material register for the D-235 token vocabulary: not new tokens, but the RANGE + each token maps to (e.g. "stone_wall reads as warm grey-tan, not cool grey" / "corrugated_metal + weathers to rust-orange, not staying silver") — the thing D-235 explicitly parked for Phase 5+ art + production but which a style bible can pre-specify so future asset generation has a target. + - Reconcile with docs/design/visual-grammar-v01.md and docs/workshops/art-direction-mood-board/ + workshop-outcomes.md (both pre-cascade, v0.1-era, sprite-framed) — extract what survives (color + relationships, "functional warmth" identity, D-033 palette) vs what''s superseded by D-235/D-244 + (era-based material ladder — explicitly retired by D-235''s own text: "Era is NOT a material filter + here"). Do not leave two contradictory style documents live without a note in one pointing at the + other''s supersession. + - Texture "grain"/rendering treatment for the D-244 3D-object reality: since objects are lit 3D meshes + now (not flat sprite fills), the style bible should say something about the toon/PBR balance — + precedent exists in client/assets/characters/shaders/ (toon.gdshader, toon_masked.gdshader, + outline.gdshader) and the glb-gen postprocess convention (roughness=1.0/specular=0.0 "for toon + compatibility" per .claude/skills/glb-gen/SKILL.md''s setup_materials() note). Confirm whether + environment props share this toon treatment with characters, or diverge — this is a real open + question the style bible should answer, not assume. + +ACCEPTANCE: docs/assets/visual/palette.md is no longer a stub; camera-angle bullet corrected; +color/material register for D-235 tokens documented; toon-vs-PBR treatment for props stated; +supersession relationship to visual-grammar-v01.md / workshop-outcomes.md is explicit (either by +archiving/marking those superseded, or by palette.md stating exactly what it inherits from each). + +Lead note (batch-5 activation): the toon-vs-PBR treatment call for environment props is delegated to +araminta (art seat) this batch — her ruling lands in palette.md with rationale; surfaced to Jeroen in +the batch report for cheap veto. VERDICT: READY.', NULL, '2026-07-25 18:11:34', '2026-07-25 18:11:34.859', '2026-07-25 18:11:34.859', NULL, '3a08af26c8f04bdd4ecef0b4a2fcd115', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPPHC9FZ4T0GNKR615PR', 'description', '(description follows in first append)', '(description follows in first append) + +Refinement (batch-5 Si pass, 2026-07-25) — GAPS. Formally deferred rather than refined into an +actionable brief-writing task now. + +WHY: T-1051 was filed as a child of T-1049''s per-class breakdown (the fable-ous.md audit T-1049 cites, +2026-06-12). T-1049 itself is HELD pending the same sprite-to-3D re-scope as T-1050 (its "Refinement +2026-06-16 — READY" block still frames the per-class stories, briefs, and catalog files in sprite-era +language, and its own text says "sequence T-1049 to consume T-1050''s conventions where they overlap" — +so T-1049 cannot be un-held before T-1050 lands). T-1051 is one layer further down that same +dependency: it cannot be meaningfully scoped (what does a "one-page brief" even template against?) +until (1) T-1050 lands conventions.md + the catalog structure a brief would reference, AND (2) T-1049 +is re-scoped and un-held (it owns the per-class story breakdown T-1051 is part of). + +Zero repo hits exist for lamp posts, barns, TVs, or billboards beyond the T-750 epic description text +(confirmed by T-1049''s own audit matrix) — there is no existing partial work this ticket would be +resuming, so there is no cost to deferring it cleanly. + +DISPOSITION: blocker edge wired (T-1051 blocked-by T-1049). When T-1049 is re-scoped (a future Si +pass, after T-1050 lands), that re-scope explicitly decides whether lamp posts/barns/TVs/billboards +get real briefs or a formal deferral note (T-1049''s existing block already leaned toward "explicitly +record which classes are deferred" for cars via Q-067 — the same treatment likely applies to these +four, but that is T-1049''s call when re-scoped, not this ticket''s in isolation).', NULL, '2026-07-25 18:11:38', '2026-07-25 18:11:38.173', '2026-07-25 18:11:38.173', NULL, '8567ca57e67996983e28229cb470dbd4', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'status', 'backlog', 'in_progress', NULL, '2026-07-25 18:11:42', '2026-07-25 18:11:42.942', '2026-07-25 18:11:42.942', NULL, '97221c4a7a5aa2ff6e522b450335292d', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'status', 'backlog', 'in_progress', NULL, '2026-07-25 18:11:42', '2026-07-25 18:11:42.948', '2026-07-25 18:11:42.948', NULL, '613156e91577043373205250f21a72cd', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'assigned_to', NULL, 'justine', NULL, '2026-07-25 18:11:45', '2026-07-25 18:11:45.571', '2026-07-25 18:11:45.571', NULL, '7fe3851d234f1cafb2b4fc70c1f5eed8', 2) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'assigned_to', NULL, 'araminta', NULL, '2026-07-25 18:11:46', '2026-07-25 18:11:46.095', '2026-07-25 18:11:46.095', NULL, '0d1336d72b0807fe85c054696e914350', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index b3ccd56eb..927168e82 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -3071,3 +3071,500 @@ Harness techniques inventory addition (from the PR #204 / T-1183 restart-persist 5. Fixed-center revisit mode: record a prior run''s actual derived centers and re-request them literally on the comparison run, bypassing cursor-anchored re-derivation — required when run 2 must land on run 1''s exact cache keys, not merely repeat the gesture. Harness-discipline gap found 2026-07-25 (Jeroen spotted a live orphan): agent-side kill-on-completion does not cover an agent CRASHING mid-capture (API error killed a session between server spawn and its own cleanup step — the server ran on unnoticed for ~25 min on the shared machine). Inventory addition: (6) the LEAD runs an explicit orphan sweep (ps for godot4 + settled-reach-server) at every cycle checkpoint — commit, merge, and after any agent dies abnormally — not only inside agent protocols; pr-process step 1a''s >5-min gdUnit grep does not match live-capture servers, so the sweep needs the server binary name too.', 'in_progress', 'medium', 'hoshe', 'client', NULL, '2026-07-22 09:42:47.197', '2026-07-25 18:04:09.369', NULL, 'bfec1c0e51d38b2b61d89e92c62540a2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Create the visual production-status catalog; fix glb-gen production path + naming conventions', '(description follows in first append) + +--- +Refinement (2026-06-16, /whats-next Si pass) — FULL scope (user decision). Two deliverables + conventions. + +(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model. + +(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) — per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest. + +(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. _open / _closed), Godot TileSet resource organization (/.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: __.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL. + +OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog — note the edge. T-1049''s per-class stories will reference these conventions — do T-1050 first / concurrently so T-1049 can cite them. + +--- +HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming). +The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md +"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen +render-3D->2D-sprites step). Direction correction: we are NOT producing sprites — Trellis +produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES. +Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before +activating. See the sprite-vs-3D root-cause note (this session). + +Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it — the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them. + +Refinement (batch-5 Si pass, 2026-07-25) — SUPERSEDES the 2026-06-16 block above (sprite-centric, invalidated by D-244). READY. + +CONTEXT: D-244 (confirmed, 2026-06-16) already re-scoped the catalog structure and repointed +renderer/README.md, sprite-gen SKILL.md, docs/assets/README.md, docs/assets/visual/{README,palette}.md, +and docs/assets/_templates/sprite.md (marked legacy) at the 3D-model reality. This ticket is now +narrower than its original draft: instantiate what D-244 named but did not fill in, plus author +conventions.md (net-new — no D-244 amendment touched it). + +DELIVERABLE (a) — Category catalog files, per docs/assets/README.md''s already-updated structure: + - docs/assets/visual/models.md — 3D objects/props (.glb via /glb-gen). Row template TBD (see + conventions.md below) since _templates/sprite.md is explicitly legacy/retired for this use. + - docs/assets/visual/textures.md — PBR surface maps (BaseColor/Normal/Roughness) for 3D models. + - docs/assets/visual/artwork.md — flat 2D art (paintings/flags/billboards/signage) via /sprite-gen''s + repurposed 2D-artwork role. + - docs/assets/visual/icons.md — UI icons (13 SVGs already exist in client/assets/icons/ — this file + should reflect that as-built inventory, not start at zero). + - docs/assets/visual/effects.md — shaders/particles/overlays. + Each file follows docs/assets/audio/README.md''s model: per-category status table (planned/in-progress/ + placeholder/final per docs/assets/README.md''s vocab), current counts. Update docs/assets/visual/README.md''s + category table counts once files exist (currently all show 0, which will stay accurate at initial creation + — do not invent placeholder rows). + ACCEPTANCE: 5 files exist, cross-linked from visual/README.md (already has the links — verify they resolve), + each with a real (possibly empty) status table matching the audio/README.md pattern. + +DELIVERABLE (b) — glb-gen production path: + - Create client/assets/models/ with furniture/ and props/ subdirectories (mirroring the proven + spike layout at spikes/3dpipeline/models/{furniture,props}/) + .gitkeep in each. + - Define client/assets/models/manifest.json, schema mirroring docs/architecture/character-asset-organization.md''s + per-asset-entry pattern (that doc''s clothing/accessory entries are the closest precedent — a flat + per-item record, not per-body-type variants since environment props aren''t body-fitted). Minimum + fields: name, category (furniture|props), source_model (path under client/assets/models/), subdirectory, + status (planned/in-progress/placeholder/final — reuse the docs/assets/README.md vocab so catalog and + manifest never disagree). Promotion = repo-canonical per D-241 — an asset entering manifest.json AND + client/assets/models/ IS the promotion act; nothing stays "promoted" in spikes/. + - Update .claude/skills/glb-gen/SKILL.md — replace the "client/assets/models/ does not exist... that''s + a Phase-5 concern" paragraph (lines ~96-102) with the new path + a pointer to the manifest. NOTE: + this contradicts nothing already in D-244/T-750 — T-750''s own epic description lists furniture/props + production as Phase-4 parallel work, so populating the production path (not populating the world with + them — that''s Phase 5 per T-961) is in-scope now. + ACCEPTANCE: client/assets/models/{furniture,props}/.gitkeep exist; manifest.json schema documented + (either inline in SKILL.md or as a comment/example in the file itself, following the character + manifest''s convention); SKILL.md''s stale "does not exist" paragraph is corrected. + +DELIVERABLE (c) — docs/assets/visual/conventions.md (NEW FILE — no prior art to amend): + - Model naming: _.glb (e.g. table_baroque.glb, chair_modernist.glb) — + mirrors the spike''s existing baroque_table.glb/modernist_chair.glb pattern loosely; pick one + order and state it (category-first matches the character-asset clothing convention + _; the spike used descriptor-first — this is a naming decision to make, + not silently pick — see lead note below on who rules it). + - Mask sidecar: _mask.png, single-channel per the character-asset convention (Section 3 + of character-asset-organization.md) UNLESS the item needs multi-region tinting, in which case follow + the RGBA channel-routed convention from that doc''s Section 11 (T-1089) rather than reinventing one. + - Texture naming keyed to D-235 tokens: PBR maps for building-exterior surfaces should name by + the ratified ObjectTag vocabulary (D-235 amendment, wiki/economics/object_tag_vocabulary.toml) — + e.g. concrete_wall_basecolor.png, pitched_roof_normal.png — NOT the old renderer/README.md + __.png scheme, which is direction-indexed for the retired 4-direction + sprite render and does not apply to PBR texture maps at all (there is no "direction" for a texture, + only map type: basecolor/normal/roughness). + - Door state handling — DO NOT port a state-frame suffix convention. The 2026-06-16 draft proposed + _open/_closed GLB variants; this is sprite-era thinking (baked state = baked frame). + For a 3D object the door''s open/closed/locked/sealed state (T-979/T-998''s DoorSpec: Open/Closed/ + TemporalWindow/Locked/Sealed) is a RUNTIME transform/animation on one door .glb, not separate baked + models — but the actual mechanism (AnimationPlayer swing vs. procedural hinge rotation vs. a + door-model convention with a named "open" bone) is a Phase-5 rendering decision (player control + + in-world rendering, per the cascade), not a Phase-4 asset-catalog concern. This ticket + should record ONLY the negative constraint (no state-frame suffix files) and defer the positive + mechanism to whichever Phase-5 ticket handles door rendering. Do not invent a runtime convention here. + - Godot TileSet resource organization — OUT OF SCOPE, removed from ticket. client/scripts/rendering/ + tile_renderer.gd''s TileSet is an explicitly-labeled placeholder ("programmatic TileSet with placeholder + colored rectangles," D-014) and the cascade rule states current in-world rendering code is + "left as-is until Phase 5 — do not build on it or rip it out before then." A /.tres + convention would be building on Phase-5-owned code from Phase 4. Do not author this section. + - Multi-tile footprint metadata: still relevant (a table/couch spans multiple sim tiles regardless + of sprite vs 3D) — keep this item, express as a manifest.json field (e.g. footprint_tiles: [w, h]) + rather than a filename convention. + ACCEPTANCE: conventions.md exists, covers model naming / mask sidecars / D-235-keyed texture naming / + multi-tile footprint metadata; explicitly states the door-state and TileSet items are deferred (with + reasons) rather than silently omitted, so a future refinement pass doesn''t have to re-derive why. + +SEQUENCING (unchanged from 2026-06-16 note): T-1053 (araminta briefing rewrite) softly depends on this +catalog. T-1049''s per-class stories reference these conventions — this ticket lands first / concurrently. + +Lead note (batch-5 activation): the model-naming-order call (category-first vs descriptor-first) is +delegated to araminta (art seat) this batch — her ruling lands in conventions.md with a one-line +rationale; surfaced to Jeroen in the batch report for cheap veto. VERDICT: READY.', 'backlog', 'high', NULL, 'visual', NULL, '2026-06-12 10:40:59', '2026-07-25 18:11:31.583', NULL, '9308e8dc46545e41dc298a34500e7621', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Write the Phase-4 visual style bible into docs/assets/visual/palette.md', '(description follows in first append) + +Refinement (batch-5 Si pass, 2026-07-25) — READY. + +CURRENT STATE: docs/assets/visual/palette.md exists as a STUB (correctly re-scoped by D-244 — no +sprite-era content survives in it) — 4 bullets: camera angle (D-019, now superseded by D-148 for +gameplay — palette.md''s bullet is stale and must be corrected), entity colors (D-033), environmental +neutrality (D-045), "functional warmth." It explicitly defers to "art direction workshop synthesis and +first visual sprint" — this ticket IS that synthesis pass for Phase 4. + +WHAT D-235 ALREADY FIXES (do not re-litigate): the building-exterior material/roof/facade/street +vocabulary (WallMaterial/RoofForm/FacadeRhythm/StreetSurface, ratified as the 28-template +architecture_trait_catalog.toml / wiki/economics/object_tag_vocabulary.toml) and the fallback-to-generic +mechanism. D-235 is the LOGICAL token layer ("what material is this wall") — Phase 4+ scope per its own +Implementation note ("textured render + the bulk of the theme library are Phase 5+"). T-1052 is the +RENDERED-LOOK layer on top: given a WallMaterial token, what does concrete_wall actually look like +(hue range, texture grain, weathering baseline) when art is eventually produced against it. + +WHAT T-1052 MUST STILL AUTHOR (net-new, no existing decision covers this): + - Correct the camera-angle bullet: D-148 (30 deg low-angle Camera3D, supersedes D-019) is the GAMEPLAY + camera; D-019''s -72.5 deg survives only for the offline renderer (2D-artwork / retired sprite mode, + per renderer/README.md). palette.md''s current bullet conflates these — fix it to name both and + which applies where. + - A concrete color/material register for the D-235 token vocabulary: not new tokens, but the RANGE + each token maps to (e.g. "stone_wall reads as warm grey-tan, not cool grey" / "corrugated_metal + weathers to rust-orange, not staying silver") — the thing D-235 explicitly parked for Phase 5+ art + production but which a style bible can pre-specify so future asset generation has a target. + - Reconcile with docs/design/visual-grammar-v01.md and docs/workshops/art-direction-mood-board/ + workshop-outcomes.md (both pre-cascade, v0.1-era, sprite-framed) — extract what survives (color + relationships, "functional warmth" identity, D-033 palette) vs what''s superseded by D-235/D-244 + (era-based material ladder — explicitly retired by D-235''s own text: "Era is NOT a material filter + here"). Do not leave two contradictory style documents live without a note in one pointing at the + other''s supersession. + - Texture "grain"/rendering treatment for the D-244 3D-object reality: since objects are lit 3D meshes + now (not flat sprite fills), the style bible should say something about the toon/PBR balance — + precedent exists in client/assets/characters/shaders/ (toon.gdshader, toon_masked.gdshader, + outline.gdshader) and the glb-gen postprocess convention (roughness=1.0/specular=0.0 "for toon + compatibility" per .claude/skills/glb-gen/SKILL.md''s setup_materials() note). Confirm whether + environment props share this toon treatment with characters, or diverge — this is a real open + question the style bible should answer, not assume. + +ACCEPTANCE: docs/assets/visual/palette.md is no longer a stub; camera-angle bullet corrected; +color/material register for D-235 tokens documented; toon-vs-PBR treatment for props stated; +supersession relationship to visual-grammar-v01.md / workshop-outcomes.md is explicit (either by +archiving/marking those superseded, or by palette.md stating exactly what it inherits from each). + +Lead note (batch-5 activation): the toon-vs-PBR treatment call for environment props is delegated to +araminta (art seat) this batch — her ruling lands in palette.md with rationale; surfaced to Jeroen in +the batch report for cheap veto. VERDICT: READY.', 'backlog', 'medium', NULL, 'visual', 'D-235', '2026-06-12 10:40:59', '2026-07-25 18:11:34.859', NULL, '65d7ab732c3d9e6c912962245db39d28', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPPHC9FZ4T0GNKR615PR', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Author one-page briefs (or record formal deferral) for lamp posts, barns, TVs, billboards', '(description follows in first append) + +Refinement (batch-5 Si pass, 2026-07-25) — GAPS. Formally deferred rather than refined into an +actionable brief-writing task now. + +WHY: T-1051 was filed as a child of T-1049''s per-class breakdown (the fable-ous.md audit T-1049 cites, +2026-06-12). T-1049 itself is HELD pending the same sprite-to-3D re-scope as T-1050 (its "Refinement +2026-06-16 — READY" block still frames the per-class stories, briefs, and catalog files in sprite-era +language, and its own text says "sequence T-1049 to consume T-1050''s conventions where they overlap" — +so T-1049 cannot be un-held before T-1050 lands). T-1051 is one layer further down that same +dependency: it cannot be meaningfully scoped (what does a "one-page brief" even template against?) +until (1) T-1050 lands conventions.md + the catalog structure a brief would reference, AND (2) T-1049 +is re-scoped and un-held (it owns the per-class story breakdown T-1051 is part of). + +Zero repo hits exist for lamp posts, barns, TVs, or billboards beyond the T-750 epic description text +(confirmed by T-1049''s own audit matrix) — there is no existing partial work this ticket would be +resuming, so there is no cost to deferring it cleanly. + +DISPOSITION: blocker edge wired (T-1051 blocked-by T-1049). When T-1049 is re-scoped (a future Si +pass, after T-1050 lands), that re-scope explicitly decides whether lamp posts/barns/TVs/billboards +get real briefs or a formal deferral note (T-1049''s existing block already leaned toward "explicitly +record which classes are deferred" for cars via Q-067 — the same treatment likely applies to these +four, but that is T-1049''s call when re-scoped, not this ticket''s in isolation).', 'backlog', 'medium', NULL, 'visual', NULL, '2026-06-12 10:40:59', '2026-07-25 18:11:38.173', NULL, '6b2a870d348502d5ea42f134e1e12e85', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Create the visual production-status catalog; fix glb-gen production path + naming conventions', '(description follows in first append) + +--- +Refinement (2026-06-16, /whats-next Si pass) — FULL scope (user decision). Two deliverables + conventions. + +(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model. + +(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) — per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest. + +(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. _open / _closed), Godot TileSet resource organization (/.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: __.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL. + +OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog — note the edge. T-1049''s per-class stories will reference these conventions — do T-1050 first / concurrently so T-1049 can cite them. + +--- +HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming). +The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md +"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen +render-3D->2D-sprites step). Direction correction: we are NOT producing sprites — Trellis +produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES. +Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before +activating. See the sprite-vs-3D root-cause note (this session). + +Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it — the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them. + +Refinement (batch-5 Si pass, 2026-07-25) — SUPERSEDES the 2026-06-16 block above (sprite-centric, invalidated by D-244). READY. + +CONTEXT: D-244 (confirmed, 2026-06-16) already re-scoped the catalog structure and repointed +renderer/README.md, sprite-gen SKILL.md, docs/assets/README.md, docs/assets/visual/{README,palette}.md, +and docs/assets/_templates/sprite.md (marked legacy) at the 3D-model reality. This ticket is now +narrower than its original draft: instantiate what D-244 named but did not fill in, plus author +conventions.md (net-new — no D-244 amendment touched it). + +DELIVERABLE (a) — Category catalog files, per docs/assets/README.md''s already-updated structure: + - docs/assets/visual/models.md — 3D objects/props (.glb via /glb-gen). Row template TBD (see + conventions.md below) since _templates/sprite.md is explicitly legacy/retired for this use. + - docs/assets/visual/textures.md — PBR surface maps (BaseColor/Normal/Roughness) for 3D models. + - docs/assets/visual/artwork.md — flat 2D art (paintings/flags/billboards/signage) via /sprite-gen''s + repurposed 2D-artwork role. + - docs/assets/visual/icons.md — UI icons (13 SVGs already exist in client/assets/icons/ — this file + should reflect that as-built inventory, not start at zero). + - docs/assets/visual/effects.md — shaders/particles/overlays. + Each file follows docs/assets/audio/README.md''s model: per-category status table (planned/in-progress/ + placeholder/final per docs/assets/README.md''s vocab), current counts. Update docs/assets/visual/README.md''s + category table counts once files exist (currently all show 0, which will stay accurate at initial creation + — do not invent placeholder rows). + ACCEPTANCE: 5 files exist, cross-linked from visual/README.md (already has the links — verify they resolve), + each with a real (possibly empty) status table matching the audio/README.md pattern. + +DELIVERABLE (b) — glb-gen production path: + - Create client/assets/models/ with furniture/ and props/ subdirectories (mirroring the proven + spike layout at spikes/3dpipeline/models/{furniture,props}/) + .gitkeep in each. + - Define client/assets/models/manifest.json, schema mirroring docs/architecture/character-asset-organization.md''s + per-asset-entry pattern (that doc''s clothing/accessory entries are the closest precedent — a flat + per-item record, not per-body-type variants since environment props aren''t body-fitted). Minimum + fields: name, category (furniture|props), source_model (path under client/assets/models/), subdirectory, + status (planned/in-progress/placeholder/final — reuse the docs/assets/README.md vocab so catalog and + manifest never disagree). Promotion = repo-canonical per D-241 — an asset entering manifest.json AND + client/assets/models/ IS the promotion act; nothing stays "promoted" in spikes/. + - Update .claude/skills/glb-gen/SKILL.md — replace the "client/assets/models/ does not exist... that''s + a Phase-5 concern" paragraph (lines ~96-102) with the new path + a pointer to the manifest. NOTE: + this contradicts nothing already in D-244/T-750 — T-750''s own epic description lists furniture/props + production as Phase-4 parallel work, so populating the production path (not populating the world with + them — that''s Phase 5 per T-961) is in-scope now. + ACCEPTANCE: client/assets/models/{furniture,props}/.gitkeep exist; manifest.json schema documented + (either inline in SKILL.md or as a comment/example in the file itself, following the character + manifest''s convention); SKILL.md''s stale "does not exist" paragraph is corrected. + +DELIVERABLE (c) — docs/assets/visual/conventions.md (NEW FILE — no prior art to amend): + - Model naming: _.glb (e.g. table_baroque.glb, chair_modernist.glb) — + mirrors the spike''s existing baroque_table.glb/modernist_chair.glb pattern loosely; pick one + order and state it (category-first matches the character-asset clothing convention + _; the spike used descriptor-first — this is a naming decision to make, + not silently pick — see lead note below on who rules it). + - Mask sidecar: _mask.png, single-channel per the character-asset convention (Section 3 + of character-asset-organization.md) UNLESS the item needs multi-region tinting, in which case follow + the RGBA channel-routed convention from that doc''s Section 11 (T-1089) rather than reinventing one. + - Texture naming keyed to D-235 tokens: PBR maps for building-exterior surfaces should name by + the ratified ObjectTag vocabulary (D-235 amendment, wiki/economics/object_tag_vocabulary.toml) — + e.g. concrete_wall_basecolor.png, pitched_roof_normal.png — NOT the old renderer/README.md + __.png scheme, which is direction-indexed for the retired 4-direction + sprite render and does not apply to PBR texture maps at all (there is no "direction" for a texture, + only map type: basecolor/normal/roughness). + - Door state handling — DO NOT port a state-frame suffix convention. The 2026-06-16 draft proposed + _open/_closed GLB variants; this is sprite-era thinking (baked state = baked frame). + For a 3D object the door''s open/closed/locked/sealed state (T-979/T-998''s DoorSpec: Open/Closed/ + TemporalWindow/Locked/Sealed) is a RUNTIME transform/animation on one door .glb, not separate baked + models — but the actual mechanism (AnimationPlayer swing vs. procedural hinge rotation vs. a + door-model convention with a named "open" bone) is a Phase-5 rendering decision (player control + + in-world rendering, per the cascade), not a Phase-4 asset-catalog concern. This ticket + should record ONLY the negative constraint (no state-frame suffix files) and defer the positive + mechanism to whichever Phase-5 ticket handles door rendering. Do not invent a runtime convention here. + - Godot TileSet resource organization — OUT OF SCOPE, removed from ticket. client/scripts/rendering/ + tile_renderer.gd''s TileSet is an explicitly-labeled placeholder ("programmatic TileSet with placeholder + colored rectangles," D-014) and the cascade rule states current in-world rendering code is + "left as-is until Phase 5 — do not build on it or rip it out before then." A /.tres + convention would be building on Phase-5-owned code from Phase 4. Do not author this section. + - Multi-tile footprint metadata: still relevant (a table/couch spans multiple sim tiles regardless + of sprite vs 3D) — keep this item, express as a manifest.json field (e.g. footprint_tiles: [w, h]) + rather than a filename convention. + ACCEPTANCE: conventions.md exists, covers model naming / mask sidecars / D-235-keyed texture naming / + multi-tile footprint metadata; explicitly states the door-state and TileSet items are deferred (with + reasons) rather than silently omitted, so a future refinement pass doesn''t have to re-derive why. + +SEQUENCING (unchanged from 2026-06-16 note): T-1053 (araminta briefing rewrite) softly depends on this +catalog. T-1049''s per-class stories reference these conventions — this ticket lands first / concurrently. + +Lead note (batch-5 activation): the model-naming-order call (category-first vs descriptor-first) is +delegated to araminta (art seat) this batch — her ruling lands in conventions.md with a one-line +rationale; surfaced to Jeroen in the batch report for cheap veto. VERDICT: READY.', 'in_progress', 'high', NULL, 'visual', NULL, '2026-06-12 10:40:59', '2026-07-25 18:11:42.941', NULL, '59842f2c6f871ac65a35da2af2d26258', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Write the Phase-4 visual style bible into docs/assets/visual/palette.md', '(description follows in first append) + +Refinement (batch-5 Si pass, 2026-07-25) — READY. + +CURRENT STATE: docs/assets/visual/palette.md exists as a STUB (correctly re-scoped by D-244 — no +sprite-era content survives in it) — 4 bullets: camera angle (D-019, now superseded by D-148 for +gameplay — palette.md''s bullet is stale and must be corrected), entity colors (D-033), environmental +neutrality (D-045), "functional warmth." It explicitly defers to "art direction workshop synthesis and +first visual sprint" — this ticket IS that synthesis pass for Phase 4. + +WHAT D-235 ALREADY FIXES (do not re-litigate): the building-exterior material/roof/facade/street +vocabulary (WallMaterial/RoofForm/FacadeRhythm/StreetSurface, ratified as the 28-template +architecture_trait_catalog.toml / wiki/economics/object_tag_vocabulary.toml) and the fallback-to-generic +mechanism. D-235 is the LOGICAL token layer ("what material is this wall") — Phase 4+ scope per its own +Implementation note ("textured render + the bulk of the theme library are Phase 5+"). T-1052 is the +RENDERED-LOOK layer on top: given a WallMaterial token, what does concrete_wall actually look like +(hue range, texture grain, weathering baseline) when art is eventually produced against it. + +WHAT T-1052 MUST STILL AUTHOR (net-new, no existing decision covers this): + - Correct the camera-angle bullet: D-148 (30 deg low-angle Camera3D, supersedes D-019) is the GAMEPLAY + camera; D-019''s -72.5 deg survives only for the offline renderer (2D-artwork / retired sprite mode, + per renderer/README.md). palette.md''s current bullet conflates these — fix it to name both and + which applies where. + - A concrete color/material register for the D-235 token vocabulary: not new tokens, but the RANGE + each token maps to (e.g. "stone_wall reads as warm grey-tan, not cool grey" / "corrugated_metal + weathers to rust-orange, not staying silver") — the thing D-235 explicitly parked for Phase 5+ art + production but which a style bible can pre-specify so future asset generation has a target. + - Reconcile with docs/design/visual-grammar-v01.md and docs/workshops/art-direction-mood-board/ + workshop-outcomes.md (both pre-cascade, v0.1-era, sprite-framed) — extract what survives (color + relationships, "functional warmth" identity, D-033 palette) vs what''s superseded by D-235/D-244 + (era-based material ladder — explicitly retired by D-235''s own text: "Era is NOT a material filter + here"). Do not leave two contradictory style documents live without a note in one pointing at the + other''s supersession. + - Texture "grain"/rendering treatment for the D-244 3D-object reality: since objects are lit 3D meshes + now (not flat sprite fills), the style bible should say something about the toon/PBR balance — + precedent exists in client/assets/characters/shaders/ (toon.gdshader, toon_masked.gdshader, + outline.gdshader) and the glb-gen postprocess convention (roughness=1.0/specular=0.0 "for toon + compatibility" per .claude/skills/glb-gen/SKILL.md''s setup_materials() note). Confirm whether + environment props share this toon treatment with characters, or diverge — this is a real open + question the style bible should answer, not assume. + +ACCEPTANCE: docs/assets/visual/palette.md is no longer a stub; camera-angle bullet corrected; +color/material register for D-235 tokens documented; toon-vs-PBR treatment for props stated; +supersession relationship to visual-grammar-v01.md / workshop-outcomes.md is explicit (either by +archiving/marking those superseded, or by palette.md stating exactly what it inherits from each). + +Lead note (batch-5 activation): the toon-vs-PBR treatment call for environment props is delegated to +araminta (art seat) this batch — her ruling lands in palette.md with rationale; surfaced to Jeroen in +the batch report for cheap veto. VERDICT: READY.', 'in_progress', 'medium', NULL, 'visual', 'D-235', '2026-06-12 10:40:59', '2026-07-25 18:11:42.948', NULL, 'ec166c5d4c83097a1d51136ebf37380d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPJ910NNR5T2R9F9NWQR', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Create the visual production-status catalog; fix glb-gen production path + naming conventions', '(description follows in first append) + +--- +Refinement (2026-06-16, /whats-next Si pass) — FULL scope (user decision). Two deliverables + conventions. + +(1) CATALOG: instantiate the 5 docs/assets/visual/*.md files (sprites, furniture, tilesets, icons, effects) with per-category status tables. Template: docs/assets/_templates/sprite.md (SPR/FUR/TILE/ICO/FX prefixes); status vocab planned/in-progress/placeholder/final (docs/assets/README.md). Audio side (docs/assets/audio/README.md) is the working model. + +(2) glb-gen PRODUCTION PATH: SKILL.md:115 names client/assets/models/ which does NOT exist. Create it + furniture/ + props/ subdirs (mirror the spike) + .gitkeep. Define client/assets/models/manifest.json schema MIRRORING the character manifest (docs/architecture/character-asset-organization.md) — per-asset entries: name, category, source-model path, subdirectory. Promotion convention per D-241 (promotion = repo-canonical). Update SKILL.md to point at the new path + reference the manifest. + +(3) CONVENTIONS (author NOW, full scope): door state-frame suffixes (e.g. _open / _closed), Godot TileSet resource organization (/.tres), multi-tile footprint metadata, and renderer/textures/ naming keyed to D-235 tokens (current renderer/README.md:80-95 covers sprites only: __.png). Author these in docs/assets/visual/conventions.md (single home) and cross-link from the SKILL. + +OVERLAP: T-1053 (rewrite araminta briefing) softly depends on this catalog — note the edge. T-1049''s per-class stories will reference these conventions — do T-1050 first / concurrently so T-1049 can cite them. + +--- +HELD 2026-06-16 (separated from the cascade batch; needs re-scoping before resuming). +The asset pipeline this ticket assumes is sprite-centric (docs/assets/visual/sprites.md +"Entities", _templates/sprite.md, SPR/FUR/TILE/ICO/FX prefixes, the /sprite-gen +render-3D->2D-sprites step). Direction correction: we are NOT producing sprites — Trellis +produces 3D objects (.glb) displayed in-world; the only flattened 2D content is TEXTURES. +Re-scope this ticket around a 3D-model + texture catalog (not a sprite catalog) before +activating. See the sprite-vs-3D root-cause note (this session). + +Batch-5 Si pass correction (2026-07-25): the 2026-06-16 refinement block above is INVALIDATED by the HELD note that follows it — the sprite-centric scope (SPR/FUR prefixes, sprite catalog, /sprite-gen) contradicts the recorded direction (Trellis produces 3D .glb models; only flattened 2D content is textures). Do not implement as written. A re-scope pass (3D-model + texture catalog, manifest mirroring character-asset-organization, D-241 promotion, D-235-keyed texture naming) is running as part of batch 5; T-1052 (style bible) and T-1051 (title-only) get refinement passes in the same sweep. Sequencing per T-1049''s own note stands: this ticket''s conventions land first, T-1049/T-1053 consume them. + +Refinement (batch-5 Si pass, 2026-07-25) — SUPERSEDES the 2026-06-16 block above (sprite-centric, invalidated by D-244). READY. + +CONTEXT: D-244 (confirmed, 2026-06-16) already re-scoped the catalog structure and repointed +renderer/README.md, sprite-gen SKILL.md, docs/assets/README.md, docs/assets/visual/{README,palette}.md, +and docs/assets/_templates/sprite.md (marked legacy) at the 3D-model reality. This ticket is now +narrower than its original draft: instantiate what D-244 named but did not fill in, plus author +conventions.md (net-new — no D-244 amendment touched it). + +DELIVERABLE (a) — Category catalog files, per docs/assets/README.md''s already-updated structure: + - docs/assets/visual/models.md — 3D objects/props (.glb via /glb-gen). Row template TBD (see + conventions.md below) since _templates/sprite.md is explicitly legacy/retired for this use. + - docs/assets/visual/textures.md — PBR surface maps (BaseColor/Normal/Roughness) for 3D models. + - docs/assets/visual/artwork.md — flat 2D art (paintings/flags/billboards/signage) via /sprite-gen''s + repurposed 2D-artwork role. + - docs/assets/visual/icons.md — UI icons (13 SVGs already exist in client/assets/icons/ — this file + should reflect that as-built inventory, not start at zero). + - docs/assets/visual/effects.md — shaders/particles/overlays. + Each file follows docs/assets/audio/README.md''s model: per-category status table (planned/in-progress/ + placeholder/final per docs/assets/README.md''s vocab), current counts. Update docs/assets/visual/README.md''s + category table counts once files exist (currently all show 0, which will stay accurate at initial creation + — do not invent placeholder rows). + ACCEPTANCE: 5 files exist, cross-linked from visual/README.md (already has the links — verify they resolve), + each with a real (possibly empty) status table matching the audio/README.md pattern. + +DELIVERABLE (b) — glb-gen production path: + - Create client/assets/models/ with furniture/ and props/ subdirectories (mirroring the proven + spike layout at spikes/3dpipeline/models/{furniture,props}/) + .gitkeep in each. + - Define client/assets/models/manifest.json, schema mirroring docs/architecture/character-asset-organization.md''s + per-asset-entry pattern (that doc''s clothing/accessory entries are the closest precedent — a flat + per-item record, not per-body-type variants since environment props aren''t body-fitted). Minimum + fields: name, category (furniture|props), source_model (path under client/assets/models/), subdirectory, + status (planned/in-progress/placeholder/final — reuse the docs/assets/README.md vocab so catalog and + manifest never disagree). Promotion = repo-canonical per D-241 — an asset entering manifest.json AND + client/assets/models/ IS the promotion act; nothing stays "promoted" in spikes/. + - Update .claude/skills/glb-gen/SKILL.md — replace the "client/assets/models/ does not exist... that''s + a Phase-5 concern" paragraph (lines ~96-102) with the new path + a pointer to the manifest. NOTE: + this contradicts nothing already in D-244/T-750 — T-750''s own epic description lists furniture/props + production as Phase-4 parallel work, so populating the production path (not populating the world with + them — that''s Phase 5 per T-961) is in-scope now. + ACCEPTANCE: client/assets/models/{furniture,props}/.gitkeep exist; manifest.json schema documented + (either inline in SKILL.md or as a comment/example in the file itself, following the character + manifest''s convention); SKILL.md''s stale "does not exist" paragraph is corrected. + +DELIVERABLE (c) — docs/assets/visual/conventions.md (NEW FILE — no prior art to amend): + - Model naming: _.glb (e.g. table_baroque.glb, chair_modernist.glb) — + mirrors the spike''s existing baroque_table.glb/modernist_chair.glb pattern loosely; pick one + order and state it (category-first matches the character-asset clothing convention + _; the spike used descriptor-first — this is a naming decision to make, + not silently pick — see lead note below on who rules it). + - Mask sidecar: _mask.png, single-channel per the character-asset convention (Section 3 + of character-asset-organization.md) UNLESS the item needs multi-region tinting, in which case follow + the RGBA channel-routed convention from that doc''s Section 11 (T-1089) rather than reinventing one. + - Texture naming keyed to D-235 tokens: PBR maps for building-exterior surfaces should name by + the ratified ObjectTag vocabulary (D-235 amendment, wiki/economics/object_tag_vocabulary.toml) — + e.g. concrete_wall_basecolor.png, pitched_roof_normal.png — NOT the old renderer/README.md + __.png scheme, which is direction-indexed for the retired 4-direction + sprite render and does not apply to PBR texture maps at all (there is no "direction" for a texture, + only map type: basecolor/normal/roughness). + - Door state handling — DO NOT port a state-frame suffix convention. The 2026-06-16 draft proposed + _open/_closed GLB variants; this is sprite-era thinking (baked state = baked frame). + For a 3D object the door''s open/closed/locked/sealed state (T-979/T-998''s DoorSpec: Open/Closed/ + TemporalWindow/Locked/Sealed) is a RUNTIME transform/animation on one door .glb, not separate baked + models — but the actual mechanism (AnimationPlayer swing vs. procedural hinge rotation vs. a + door-model convention with a named "open" bone) is a Phase-5 rendering decision (player control + + in-world rendering, per the cascade), not a Phase-4 asset-catalog concern. This ticket + should record ONLY the negative constraint (no state-frame suffix files) and defer the positive + mechanism to whichever Phase-5 ticket handles door rendering. Do not invent a runtime convention here. + - Godot TileSet resource organization — OUT OF SCOPE, removed from ticket. client/scripts/rendering/ + tile_renderer.gd''s TileSet is an explicitly-labeled placeholder ("programmatic TileSet with placeholder + colored rectangles," D-014) and the cascade rule states current in-world rendering code is + "left as-is until Phase 5 — do not build on it or rip it out before then." A /.tres + convention would be building on Phase-5-owned code from Phase 4. Do not author this section. + - Multi-tile footprint metadata: still relevant (a table/couch spans multiple sim tiles regardless + of sprite vs 3D) — keep this item, express as a manifest.json field (e.g. footprint_tiles: [w, h]) + rather than a filename convention. + ACCEPTANCE: conventions.md exists, covers model naming / mask sidecars / D-235-keyed texture naming / + multi-tile footprint metadata; explicitly states the door-state and TileSet items are deferred (with + reasons) rather than silently omitted, so a future refinement pass doesn''t have to re-derive why. + +SEQUENCING (unchanged from 2026-06-16 note): T-1053 (araminta briefing rewrite) softly depends on this +catalog. T-1049''s per-class stories reference these conventions — this ticket lands first / concurrently. + +Lead note (batch-5 activation): the model-naming-order call (category-first vs descriptor-first) is +delegated to araminta (art seat) this batch — her ruling lands in conventions.md with a one-line +rationale; surfaced to Jeroen in the batch report for cheap veto. VERDICT: READY.', 'in_progress', 'high', 'justine', 'visual', NULL, '2026-06-12 10:40:59', '2026-07-25 18:11:45.570', NULL, '1c88b124701c748774a3a03ef3a0bc18', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FBPTXPV39JX54HYP83RZJFDM', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Write the Phase-4 visual style bible into docs/assets/visual/palette.md', '(description follows in first append) + +Refinement (batch-5 Si pass, 2026-07-25) — READY. + +CURRENT STATE: docs/assets/visual/palette.md exists as a STUB (correctly re-scoped by D-244 — no +sprite-era content survives in it) — 4 bullets: camera angle (D-019, now superseded by D-148 for +gameplay — palette.md''s bullet is stale and must be corrected), entity colors (D-033), environmental +neutrality (D-045), "functional warmth." It explicitly defers to "art direction workshop synthesis and +first visual sprint" — this ticket IS that synthesis pass for Phase 4. + +WHAT D-235 ALREADY FIXES (do not re-litigate): the building-exterior material/roof/facade/street +vocabulary (WallMaterial/RoofForm/FacadeRhythm/StreetSurface, ratified as the 28-template +architecture_trait_catalog.toml / wiki/economics/object_tag_vocabulary.toml) and the fallback-to-generic +mechanism. D-235 is the LOGICAL token layer ("what material is this wall") — Phase 4+ scope per its own +Implementation note ("textured render + the bulk of the theme library are Phase 5+"). T-1052 is the +RENDERED-LOOK layer on top: given a WallMaterial token, what does concrete_wall actually look like +(hue range, texture grain, weathering baseline) when art is eventually produced against it. + +WHAT T-1052 MUST STILL AUTHOR (net-new, no existing decision covers this): + - Correct the camera-angle bullet: D-148 (30 deg low-angle Camera3D, supersedes D-019) is the GAMEPLAY + camera; D-019''s -72.5 deg survives only for the offline renderer (2D-artwork / retired sprite mode, + per renderer/README.md). palette.md''s current bullet conflates these — fix it to name both and + which applies where. + - A concrete color/material register for the D-235 token vocabulary: not new tokens, but the RANGE + each token maps to (e.g. "stone_wall reads as warm grey-tan, not cool grey" / "corrugated_metal + weathers to rust-orange, not staying silver") — the thing D-235 explicitly parked for Phase 5+ art + production but which a style bible can pre-specify so future asset generation has a target. + - Reconcile with docs/design/visual-grammar-v01.md and docs/workshops/art-direction-mood-board/ + workshop-outcomes.md (both pre-cascade, v0.1-era, sprite-framed) — extract what survives (color + relationships, "functional warmth" identity, D-033 palette) vs what''s superseded by D-235/D-244 + (era-based material ladder — explicitly retired by D-235''s own text: "Era is NOT a material filter + here"). Do not leave two contradictory style documents live without a note in one pointing at the + other''s supersession. + - Texture "grain"/rendering treatment for the D-244 3D-object reality: since objects are lit 3D meshes + now (not flat sprite fills), the style bible should say something about the toon/PBR balance — + precedent exists in client/assets/characters/shaders/ (toon.gdshader, toon_masked.gdshader, + outline.gdshader) and the glb-gen postprocess convention (roughness=1.0/specular=0.0 "for toon + compatibility" per .claude/skills/glb-gen/SKILL.md''s setup_materials() note). Confirm whether + environment props share this toon treatment with characters, or diverge — this is a real open + question the style bible should answer, not assume. + +ACCEPTANCE: docs/assets/visual/palette.md is no longer a stub; camera-angle bullet corrected; +color/material register for D-235 tokens documented; toon-vs-PBR treatment for props stated; +supersession relationship to visual-grammar-v01.md / workshop-outcomes.md is explicit (either by +archiving/marking those superseded, or by palette.md stating exactly what it inherits from each). + +Lead note (batch-5 activation): the toon-vs-PBR treatment call for environment props is delegated to +araminta (art seat) this batch — her ruling lands in palette.md with rationale; surfaced to Jeroen in +the batch report for cheap veto. VERDICT: READY.', 'in_progress', 'medium', 'araminta', 'visual', 'D-235', '2026-06-12 10:40:59', '2026-07-25 18:11:46.095', NULL, '4df3e92b2bc003a7b73f860dd47704f2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);