Batch-5 visual track: T-1050 + T-1052, implementing the batch-5 Si re-scope (sprite-era plan invalidated by D-244).
T-1050 (justine): the five D-244 catalog files (models/textures/artwork/icons/effects — icons carries the 13 as-built SVGs with traced consumers), client/assets/models/{furniture,props}/ + schema-documented manifest.json mirroring the character manifest, glb-gen SKILL.md stale-path fix, and docs/assets/visual/conventions.md (model naming, mask sidecars, D-235-token texture naming, footprint_tiles; door-state + TileSet recorded as explicit Phase-5 deferrals).
T-1052 (araminta): full Phase-4 style bible in palette.md — D-148/D-019 camera split, color/material register for every D-235 ObjectTag, survives-vs-superseded reconciliation with visual-grammar-v01.md and the mood-board transcript.
Two delegated art rulings recorded (flagged for Jeroen veto): category-first model naming (table_baroque.glb); environment props share the character toon treatment with a minimal-PBR carve-out for glass/polished metal (sightline truthfulness under occlusion-based perception).
Test plan
Docs + empty scaffolding only; no rendered path changes (no eyeball owed)
Pre-push gate green: full gdUnit 3638/3638
All catalog links verified resolving; manifest schema self-documenting with labeled example block
## Summary
Batch-5 visual track: T-1050 + T-1052, implementing the batch-5 Si re-scope (sprite-era plan invalidated by D-244).
**T-1050 (justine):** the five D-244 catalog files (models/textures/artwork/icons/effects — icons carries the 13 as-built SVGs with traced consumers), client/assets/models/{furniture,props}/ + schema-documented manifest.json mirroring the character manifest, glb-gen SKILL.md stale-path fix, and docs/assets/visual/conventions.md (model naming, mask sidecars, D-235-token texture naming, footprint_tiles; door-state + TileSet recorded as explicit Phase-5 deferrals).
**T-1052 (araminta):** full Phase-4 style bible in palette.md — D-148/D-019 camera split, color/material register for every D-235 ObjectTag, survives-vs-superseded reconciliation with visual-grammar-v01.md and the mood-board transcript.
**Two delegated art rulings recorded (flagged for Jeroen veto):** category-first model naming (table_baroque.glb); environment props share the character toon treatment with a minimal-PBR carve-out for glass/polished metal (sightline truthfulness under occlusion-based perception).
## Test plan
- Docs + empty scaffolding only; no rendered path changes (no eyeball owed)
- Pre-push gate green: full gdUnit 3638/3638
- All catalog links verified resolving; manifest schema self-documenting with labeled example block
Instantiates the five D-244 catalog files (models/textures/artwork/icons/
effects — icons carries the 13 as-built SVGs, stance icons traced to their
consumer and marked final), creates client/assets/models/{furniture,props}
with a schema-documented manifest.json mirroring the character manifest,
fixes glb-gen SKILL.md's stale 'path does not exist' paragraph, and authors
docs/assets/visual/conventions.md: category-first model naming (araminta
ruling), mask sidecars per the character convention, D-235-token-keyed
texture naming, footprint_tiles as manifest metadata. Door-state and
TileSet conventions are recorded as explicit deferrals (Phase-5 owned).
visual/README.md carries both this ticket's count/link updates and
T-1052's palette-section rewrite (shared file, committed here).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Authors the full style bible: camera table separating D-148 gameplay from
D-019 offline-renderer use; the delegated toon-vs-PBR ruling (environment
props share the character toon treatment, with a minimal-PBR carve-out for
glass/polished metal so sightlines read truthfully under occlusion-based
perception); a color/material register for every D-235 ObjectTag (hue,
grain, D-217-keyed weathering); and explicit supersession notes both ways
with visual-grammar-v01.md and the mood-board workshop transcript.
Includes branch-side pql changelog rows (T-1050/T-1052 -> review); the
worktree pre-commit export step failed benignly (write-through had
already refreshed the files) so they are staged explicitly here.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review: visual-asset-catalog -> main (type: mixed docs/assets)
Reviewers: Hoshe (QA) + Tyre (architecture/governance). Both REQUEST_CHANGES.
Hoshe (QA): REQUEST_CHANGES
#
File
Issue
1
docs/assets/README.md:17
Master pipeline table's Visual row still reads Status: Stub — contradicted by this PR's own visual/README.md ("Active — catalog structure instantiated, T-1050") and palette.md ("Active — Phase-4 style bible, T-1052"). Update to Active, matching the audio row's convention.
Verified clean (no action): icons.md 13-SVG inventory + consumer trace exact (4 stance icons wired via stance_indicator.gd ICON_MAP, 9 unconsumed, no other consumers); manifest.json valid + mirrors the character manifest's keyed-object pattern, and the actual loader precedent (manifest.get("furniture", {})) never iterates top-level keys; all acceptance criteria met item-by-item; every added link/anchor resolves; status vocab consistent; empty-table discipline held; palette.md's register covers all 32 D-235 tags + 4 generics with accurate D-217 weathering language. Noted: pre-existing broken D-066 links (workshop-outcomes.md:93,122, stale relative paths) predate the branch — folded into the fix round as leave-cleaner since the PR touches the file.
Tyre (architecture/governance): REQUEST_CHANGES
#
File
Issue
1
HIGH palette.md §2.1/§2.2
The binding glass carve-out is keyed to precision_glass/smart_facade — retired pre-amendment example tokens the 2026-07-07 D-235 amendment says "never shipped"; zero matches in object_tag_vocabulary.toml. §2 thereby contradicts §3's own ratified list in the same file, and precision_glass is axis-mislabeled "(facade)" (it was a wall label in the dead list). Replace with the ratified glass_curtain_wall (wall) + industrial_glazing (facade); fix the axis label.
2
conventions.md §2
Mask-channel semantics attributed to character-asset-organization.md "Section 3" — the channel/color semantics live in Section 5 (Mask Sidecar Convention); Section 3 only covers the filename. Fix the pointer.
3
palette.md §2 (governance)
Ruling: the toon/PBR treatment needs a D-record; category-first naming does not. The ruling binds all future environment shader work, carves a PBR exception on occlusion-perception gameplay load, and reconciles against D-235/D-244 — the exact profile those records have. Claim + write the record (cross-ref D-043/D-044/D-235/D-244); palette.md §2 points at it rather than being the authority. Gives the veto a durable target.
4
client/assets/models/manifest.json
Underscore pseudo-keys (_comment/_fields/_example_only_not_a_real_asset) diverge from the character manifest (pure data, external docs) and the example block contains a structurally-valid phantom entry (furniture/table_baroque.glb). No loader exists yet, but a naive top-level-key iterator inherits a trap with no stated skip contract. Cheapest fix: add an explicit "keys prefixed _ are metadata — loaders must skip them" line to _comment.
5
palette.md:6 (LOW)
decision_refs frontmatter omits D-149, which the body load-bears at line 31. Add it.
Verified clean (no action): all 32+4 D-235 tokens exact vs the ratified TOML; D-148/D-019 camera split correct; D-217 weathering faithful; setup_materials() claim exact (postprocess_glb.py:290,300-301); door-state + TileSet deferrals correctly Phase-5-owned per D-166 with nothing built on Phase-5 code; supersession notes leave exactly one live style authority; T-961 "production path, not world population" boundary respected.
Verdict: CHANGES REQUESTED
Fix round dispatched to the authoring agents (araminta: T1/T3/T5 + the D-066 leave-cleaner; justine: H1/T2/T4). Lead verifies, commits, re-pushes through the gate.
# Review: visual-asset-catalog -> main (type: mixed docs/assets)
Reviewers: Hoshe (QA) + Tyre (architecture/governance). Both REQUEST_CHANGES.
## Hoshe (QA): REQUEST_CHANGES
| # | File | Issue |
|---|------|-------|
| 1 | docs/assets/README.md:17 | Master pipeline table's Visual row still reads `Status: Stub` — contradicted by this PR's own visual/README.md ("Active — catalog structure instantiated, T-1050") and palette.md ("Active — Phase-4 style bible, T-1052"). Update to Active, matching the audio row's convention. |
Verified clean (no action): icons.md 13-SVG inventory + consumer trace exact (4 stance icons wired via stance_indicator.gd ICON_MAP, 9 unconsumed, no other consumers); manifest.json valid + mirrors the character manifest's keyed-object pattern, and the actual loader precedent (`manifest.get("furniture", {})`) never iterates top-level keys; all acceptance criteria met item-by-item; every added link/anchor resolves; status vocab consistent; empty-table discipline held; palette.md's register covers all 32 D-235 tags + 4 generics with accurate D-217 weathering language. Noted: pre-existing broken D-066 links (workshop-outcomes.md:93,122, stale relative paths) predate the branch — folded into the fix round as leave-cleaner since the PR touches the file.
## Tyre (architecture/governance): REQUEST_CHANGES
| # | File | Issue |
|---|------|-------|
| 1 | **HIGH** palette.md §2.1/§2.2 | The binding glass carve-out is keyed to `precision_glass`/`smart_facade` — retired pre-amendment example tokens the 2026-07-07 D-235 amendment says "never shipped"; zero matches in object_tag_vocabulary.toml. §2 thereby contradicts §3's own ratified list in the same file, and `precision_glass` is axis-mislabeled "(facade)" (it was a wall label in the dead list). Replace with the ratified `glass_curtain_wall` (wall) + `industrial_glazing` (facade); fix the axis label. |
| 2 | conventions.md §2 | Mask-channel semantics attributed to character-asset-organization.md "Section 3" — the channel/color semantics live in Section 5 (Mask Sidecar Convention); Section 3 only covers the filename. Fix the pointer. |
| 3 | palette.md §2 (governance) | **Ruling: the toon/PBR treatment needs a D-record; category-first naming does not.** The ruling binds all future environment shader work, carves a PBR exception on occlusion-perception gameplay load, and reconciles against D-235/D-244 — the exact profile those records have. Claim + write the record (cross-ref D-043/D-044/D-235/D-244); palette.md §2 points at it rather than being the authority. Gives the veto a durable target. |
| 4 | client/assets/models/manifest.json | Underscore pseudo-keys (`_comment`/`_fields`/`_example_only_not_a_real_asset`) diverge from the character manifest (pure data, external docs) and the example block contains a structurally-valid phantom entry (`furniture/table_baroque.glb`). No loader exists yet, but a naive top-level-key iterator inherits a trap with no stated skip contract. Cheapest fix: add an explicit "keys prefixed `_` are metadata — loaders must skip them" line to `_comment`. |
| 5 | palette.md:6 (LOW) | `decision_refs` frontmatter omits D-149, which the body load-bears at line 31. Add it. |
Verified clean (no action): all 32+4 D-235 tokens exact vs the ratified TOML; D-148/D-019 camera split correct; D-217 weathering faithful; setup_materials() claim exact (postprocess_glb.py:290,300-301); door-state + TileSet deferrals correctly Phase-5-owned per D-166 with nothing built on Phase-5 code; supersession notes leave exactly one live style authority; T-961 "production path, not world population" boundary respected.
## Verdict: CHANGES REQUESTED
Fix round dispatched to the authoring agents (araminta: T1/T3/T5 + the D-066 leave-cleaner; justine: H1/T2/T4). Lead verifies, commits, re-pushes through the gate.
Fixed — palette.md §2.1/§2.2 re-keyed to the ratified glass_curtain_wall (wall) + industrial_glazing (facade); axis mislabel corrected; grep confirms zero remaining precision_glass/smart_facade references; §3.1 cross-ref verified still correct
Tyre
2
Fixed — conventions.md mask-channel pointer Section 3 → Section 5, verified against the actual doc structure (Section 3 = filename only; Section 5 = channel semantics)
Tyre
3
Fixed — D-257 claimed + written in governance/decisions/architecture.md (filed in architecture alongside D-235/D-244/D-148 rather than perception — the binding content is rendering treatment; D-043/D-044 cross-referenced for the perception rationale). palette.md §2 now cites D-257 as authority instead of being it. pql decisions validate passes; sync clean (0 broken refs)
Tyre
4
Fixed — manifest.json _comment now states the explicit contract: _-prefixed top-level keys are metadata, loaders must skip them. Example block retained (well-labeled). JSON re-validated
Tyre
5 (LOW)
Fixed — D-149 + D-257 added to palette.md decision_refs and the appendix cross-reference table
Bonus (leave-cleaner, from Hoshe's notes): the pre-existing broken D-066 links in workshop-outcomes.md (lines 93/122, stale relative paths missing the governance/ segment) repaired and verified against the real anchor.
No retractions — every finding was accurate.
Gate detour (for the record): the fix-round push first bounced on 2 viewer-test failures this docs branch could not have caused — a latent main-side isolation defect (viewer unit tests riding the machine-shared user://atlas_cache/; the T-1183 disk lookup short-circuits before test_mode's no-op IPC), exposed by a concurrent live GJ380c capture from the T-1157 work warming the exact key the tests assume cold. Fixed at root on main (9ac98542d: disk_cache_root_override seam + hermetic _make_viewer() helpers — the first slice of T-1193, verified passing against a deliberately warm cache), merged back into this branch. Gate then green (full gdUnit 3638/3638). Proceeding to merge.
# Fix round — all 6 findings addressed in `2ca70d022`
| Reviewer | # | Resolution |
|----------|---|------------|
| Hoshe | 1 | **Fixed** — docs/assets/README.md Visual row `Stub` → `Active — catalog + style bible instantiated (T-1050/T-1052)`, matching the Audio row's phrasing convention |
| Tyre | 1 (HIGH) | **Fixed** — palette.md §2.1/§2.2 re-keyed to the ratified `glass_curtain_wall` (wall) + `industrial_glazing` (facade); axis mislabel corrected; grep confirms zero remaining `precision_glass`/`smart_facade` references; §3.1 cross-ref verified still correct |
| Tyre | 2 | **Fixed** — conventions.md mask-channel pointer Section 3 → Section 5, verified against the actual doc structure (Section 3 = filename only; Section 5 = channel semantics) |
| Tyre | 3 | **Fixed** — **D-257** claimed + written in governance/decisions/architecture.md (filed in architecture alongside D-235/D-244/D-148 rather than perception — the binding content is rendering treatment; D-043/D-044 cross-referenced for the perception rationale). palette.md §2 now cites D-257 as authority instead of being it. `pql decisions validate` passes; sync clean (0 broken refs) |
| Tyre | 4 | **Fixed** — manifest.json `_comment` now states the explicit contract: `_`-prefixed top-level keys are metadata, loaders must skip them. Example block retained (well-labeled). JSON re-validated |
| Tyre | 5 (LOW) | **Fixed** — D-149 + D-257 added to palette.md `decision_refs` and the appendix cross-reference table |
Bonus (leave-cleaner, from Hoshe's notes): the pre-existing broken D-066 links in workshop-outcomes.md (lines 93/122, stale relative paths missing the `governance/` segment) repaired and verified against the real anchor.
No retractions — every finding was accurate.
**Gate detour (for the record):** the fix-round push first bounced on 2 viewer-test failures this docs branch could not have caused — a latent main-side isolation defect (viewer unit tests riding the machine-shared `user://atlas_cache/`; the T-1183 disk lookup short-circuits before test_mode's no-op IPC), exposed by a concurrent live GJ380c capture from the T-1157 work warming the exact key the tests assume cold. Fixed at root on main (`9ac98542d`: `disk_cache_root_override` seam + hermetic `_make_viewer()` helpers — the first slice of T-1193, verified passing against a deliberately warm cache), merged back into this branch. Gate then green (full gdUnit 3638/3638). Proceeding to merge.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Batch-5 visual track: T-1050 + T-1052, implementing the batch-5 Si re-scope (sprite-era plan invalidated by D-244).
T-1050 (justine): the five D-244 catalog files (models/textures/artwork/icons/effects — icons carries the 13 as-built SVGs with traced consumers), client/assets/models/{furniture,props}/ + schema-documented manifest.json mirroring the character manifest, glb-gen SKILL.md stale-path fix, and docs/assets/visual/conventions.md (model naming, mask sidecars, D-235-token texture naming, footprint_tiles; door-state + TileSet recorded as explicit Phase-5 deferrals).
T-1052 (araminta): full Phase-4 style bible in palette.md — D-148/D-019 camera split, color/material register for every D-235 ObjectTag, survives-vs-superseded reconciliation with visual-grammar-v01.md and the mood-board transcript.
Two delegated art rulings recorded (flagged for Jeroen veto): category-first model naming (table_baroque.glb); environment props share the character toon treatment with a minimal-PBR carve-out for glass/polished metal (sightline truthfulness under occlusion-based perception).
Test plan
Instantiates the five D-244 catalog files (models/textures/artwork/icons/ effects — icons carries the 13 as-built SVGs, stance icons traced to their consumer and marked final), creates client/assets/models/{furniture,props} with a schema-documented manifest.json mirroring the character manifest, fixes glb-gen SKILL.md's stale 'path does not exist' paragraph, and authors docs/assets/visual/conventions.md: category-first model naming (araminta ruling), mask sidecars per the character convention, D-235-token-keyed texture naming, footprint_tiles as manifest metadata. Door-state and TileSet conventions are recorded as explicit deferrals (Phase-5 owned). visual/README.md carries both this ticket's count/link updates and T-1052's palette-section rewrite (shared file, committed here). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>Review: visual-asset-catalog -> main (type: mixed docs/assets)
Reviewers: Hoshe (QA) + Tyre (architecture/governance). Both REQUEST_CHANGES.
Hoshe (QA): REQUEST_CHANGES
Status: Stub— contradicted by this PR's own visual/README.md ("Active — catalog structure instantiated, T-1050") and palette.md ("Active — Phase-4 style bible, T-1052"). Update to Active, matching the audio row's convention.Verified clean (no action): icons.md 13-SVG inventory + consumer trace exact (4 stance icons wired via stance_indicator.gd ICON_MAP, 9 unconsumed, no other consumers); manifest.json valid + mirrors the character manifest's keyed-object pattern, and the actual loader precedent (
manifest.get("furniture", {})) never iterates top-level keys; all acceptance criteria met item-by-item; every added link/anchor resolves; status vocab consistent; empty-table discipline held; palette.md's register covers all 32 D-235 tags + 4 generics with accurate D-217 weathering language. Noted: pre-existing broken D-066 links (workshop-outcomes.md:93,122, stale relative paths) predate the branch — folded into the fix round as leave-cleaner since the PR touches the file.Tyre (architecture/governance): REQUEST_CHANGES
precision_glass/smart_facade— retired pre-amendment example tokens the 2026-07-07 D-235 amendment says "never shipped"; zero matches in object_tag_vocabulary.toml. §2 thereby contradicts §3's own ratified list in the same file, andprecision_glassis axis-mislabeled "(facade)" (it was a wall label in the dead list). Replace with the ratifiedglass_curtain_wall(wall) +industrial_glazing(facade); fix the axis label._comment/_fields/_example_only_not_a_real_asset) diverge from the character manifest (pure data, external docs) and the example block contains a structurally-valid phantom entry (furniture/table_baroque.glb). No loader exists yet, but a naive top-level-key iterator inherits a trap with no stated skip contract. Cheapest fix: add an explicit "keys prefixed_are metadata — loaders must skip them" line to_comment.decision_refsfrontmatter omits D-149, which the body load-bears at line 31. Add it.Verified clean (no action): all 32+4 D-235 tokens exact vs the ratified TOML; D-148/D-019 camera split correct; D-217 weathering faithful; setup_materials() claim exact (postprocess_glb.py:290,300-301); door-state + TileSet deferrals correctly Phase-5-owned per D-166 with nothing built on Phase-5 code; supersession notes leave exactly one live style authority; T-961 "production path, not world population" boundary respected.
Verdict: CHANGES REQUESTED
Fix round dispatched to the authoring agents (araminta: T1/T3/T5 + the D-066 leave-cleaner; justine: H1/T2/T4). Lead verifies, commits, re-pushes through the gate.
Fix round — all 6 findings addressed in
2ca70d022Stub→Active — catalog + style bible instantiated (T-1050/T-1052), matching the Audio row's phrasing conventionglass_curtain_wall(wall) +industrial_glazing(facade); axis mislabel corrected; grep confirms zero remainingprecision_glass/smart_facadereferences; §3.1 cross-ref verified still correctpql decisions validatepasses; sync clean (0 broken refs)_commentnow states the explicit contract:_-prefixed top-level keys are metadata, loaders must skip them. Example block retained (well-labeled). JSON re-validateddecision_refsand the appendix cross-reference tableBonus (leave-cleaner, from Hoshe's notes): the pre-existing broken D-066 links in workshop-outcomes.md (lines 93/122, stale relative paths missing the
governance/segment) repaired and verified against the real anchor.No retractions — every finding was accurate.
Gate detour (for the record): the fix-round push first bounced on 2 viewer-test failures this docs branch could not have caused — a latent main-side isolation defect (viewer unit tests riding the machine-shared
user://atlas_cache/; the T-1183 disk lookup short-circuits before test_mode's no-op IPC), exposed by a concurrent live GJ380c capture from the T-1157 work warming the exact key the tests assume cold. Fixed at root on main (9ac98542d:disk_cache_root_overrideseam + hermetic_make_viewer()helpers — the first slice of T-1193, verified passing against a deliberately warm cache), merged back into this branch. Gate then green (full gdUnit 3638/3638). Proceeding to merge.Pull request closed