Batch-7 visual track: the first real environment assets enter the game per the furniture-props brief (T-1049/PR #213).
table_baroque, chair_modernist, desk_scifi (furniture, with mask sidecars) and lion_statue (props, non-tintable) promoted into client/assets/models/ under the category-first convention — byte-identical to the spike sources (MD5-verified), spikes/ untouched, vw_beetle excluded per the Q-067 deferral.
Postprocess verified already-applied by Blender node-graph inspection (mat_primary, roughness=1.0/specular=0.0 at the shader-input level) — not re-run.
All four registered in manifest.json at 'planned'; models.md catalog rows + README counts updated.
Discovery documented (conventions.md §2 + glb-gen SKILL.md): Godot externalizes each GLB's embedded texture as a loose <model>_Image_0.png referenced by binary UID even with embedded_image_handling=3 — a mandatory, previously-undocumented commit-with-the-model sidecar; deleting it breaks loading with an error no text-grep can trace.
For the review round (araminta)
footprint_tiles ruling needed: all four spike GLBs are Blender-normalized to 1m max dimension, so real-world footprint is not derivable from geometry. The brief's [2,1] example turns out to be illustrative, not derivable. This PR sets [1,1] for all four as a flagged judgment call — rule whether normalized spike assets default [1,1] or whether promotion requires an author-supplied real-world scale, and whether the brief gets amended.
Test plan
In-engine proof: clean headless import; ResourceLoader.load + instantiate verified for all four
Pre-push gate green (full gdUnit)
No runtime rendering path consumes these yet (Phase-5 concern) — no eyeball owed; the load proof is the acceptance
## Summary
Batch-7 visual track: the first real environment assets enter the game per the furniture-props brief (T-1049/PR #213).
- **table_baroque, chair_modernist, desk_scifi** (furniture, with mask sidecars) and **lion_statue** (props, non-tintable) promoted into client/assets/models/ under the category-first convention — byte-identical to the spike sources (MD5-verified), spikes/ untouched, vw_beetle excluded per the Q-067 deferral.
- Postprocess verified already-applied by Blender node-graph inspection (mat_primary, roughness=1.0/specular=0.0 at the shader-input level) — not re-run.
- All four registered in manifest.json at 'planned'; models.md catalog rows + README counts updated.
- **Discovery documented** (conventions.md §2 + glb-gen SKILL.md): Godot externalizes each GLB's embedded texture as a loose `<model>_Image_0.png` referenced by binary UID even with embedded_image_handling=3 — a mandatory, previously-undocumented commit-with-the-model sidecar; deleting it breaks loading with an error no text-grep can trace.
## For the review round (araminta)
**footprint_tiles ruling needed:** all four spike GLBs are Blender-normalized to 1m max dimension, so real-world footprint is not derivable from geometry. The brief's [2,1] example turns out to be illustrative, not derivable. This PR sets [1,1] for all four as a flagged judgment call — rule whether normalized spike assets default [1,1] or whether promotion requires an author-supplied real-world scale, and whether the brief gets amended.
## Test plan
- In-engine proof: clean headless import; ResourceLoader.load + instantiate verified for all four
- Pre-push gate green (full gdUnit)
- No runtime rendering path consumes these yet (Phase-5 concern) — no eyeball owed; the load proof is the acceptance
table_baroque, chair_modernist, desk_scifi (furniture, with mask
sidecars) and lion_statue (props, non-tintable) enter
client/assets/models/ under the category-first convention, byte-
identical to the spike sources (MD5-verified; spikes/ untouched,
vw_beetle excluded per the Q-067 deferral). Postprocess verified
already-applied by Blender node-graph inspection (mat_primary,
roughness=1.0/specular=0.0 shader inputs — the convenience properties
read stale defaults, the graph is authoritative), so not re-run. All
four registered in manifest.json at 'planned' with footprint_tiles
[1,1] (a flagged judgment call — normalized spike geometry erases
real-world scale; the brief ruling goes to araminta in review).
In-engine proof: clean headless import + ResourceLoader load +
instantiate for all four. Discovery documented in conventions.md §2 +
glb-gen SKILL.md: Godot externalizes the GLB's embedded texture as a
<model>_Image_0.png sidecar referenced by binary UID — it must be
committed or loading breaks with an undiscoverable dependency error.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review: furniture-promotion -> main (type: visual/assets)
Reviewers: Hoshe (QA) + Araminta (art direction — the ruling this PR requested is hers). Hoshe APPROVE; Araminta REQUEST_CHANGES (one doc amendment).
Hoshe (QA): APPROVE
No defects. Independently re-verified: MD5 byte-identity of all 4 GLBs + 3 masks against the spike sources; spikes/ untouched; vw_beetle and lion_statue_mask.png correctly absent; manifest.json valid and schema-exact with correct mask presence/absence and the _-prefix skip contract intact; models.md rows and README count exact; the conventions/SKILL sidecar docs mutually consistent; the mat_primary/roughness/specular claim corroborated against postprocess_glb.py source; live re-verification — clean headless import + ResourceLoader load/instantiate of chair_modernist and lion_statue, script deleted, processes clean.
Araminta (art direction): REQUEST_CHANGES
THE RULING (on the PR's own question): [1,1] STANDS for all four items — each justified by real-world class (café-scale table, chair, compact desk, statue), none misrepresented at 1 tile = 1m (D-243). The judgment call was sound.
General rule (binding going forward): a normalized promotion never infers footprint from geometry — normalization erases real-world scale. footprint_tiles is an AUTHORED value: [1,1] only when the object's real-world class is plausibly single-tile; ordinarily-multi-tile classes require the promoting author to state an intended footprint explicitly. The manifest stays the field of record; the authoring step is what was missing.
#
File
Issue
1
briefs/furniture-props.md §3 + conventions.md §4
The rule above must be codified BEFORE merge (her exact wording supplied) — the texture-heavy wall stories start next and must inherit a written rule, not tribal knowledge from this PR. Applied lead-side in the fix commit (her wording verbatim; conventions.md §4 gains the authored-not-derived sentence with a pointer to the brief's full rule; a pre-existing "Single Sunday-tile" typo in the same paragraph fixed to "Single-tile" in passing).
Her confirmations on record: category-first renames all correct (desk_scifi's direction verified against the spike source name); mask handling per §3 exact (lion_statue ships NO mask file, not an empty one); the extracted-texture subsection is correctly placed in §2 and stays mechanics-not-taste, no wording changes; D-257 conformance verified at the node-graph level and none of the four is glazing-class; the models.md row honestly carries the spike's known "mask too aggressive" issue rather than silently promoting it as clean; the manifest schema generalizes structurally to the wall stories — the transferable lesson ("don't let a pipeline artifact stand in for an authored value") is exactly why the rule is now written.
Verdict: CHANGES REQUESTED -> amendment applied; merging after gate.
# Review: furniture-promotion -> main (type: visual/assets)
Reviewers: Hoshe (QA) + Araminta (art direction — the ruling this PR requested is hers). Hoshe APPROVE; Araminta REQUEST_CHANGES (one doc amendment).
## Hoshe (QA): APPROVE
No defects. Independently re-verified: MD5 byte-identity of all 4 GLBs + 3 masks against the spike sources; spikes/ untouched; vw_beetle and lion_statue_mask.png correctly absent; manifest.json valid and schema-exact with correct mask presence/absence and the _-prefix skip contract intact; models.md rows and README count exact; the conventions/SKILL sidecar docs mutually consistent; the mat_primary/roughness/specular claim corroborated against postprocess_glb.py source; live re-verification — clean headless import + ResourceLoader load/instantiate of chair_modernist and lion_statue, script deleted, processes clean.
## Araminta (art direction): REQUEST_CHANGES
**THE RULING (on the PR's own question): `[1,1]` STANDS for all four items** — each justified by real-world class (café-scale table, chair, compact desk, statue), none misrepresented at 1 tile = 1m (D-243). The judgment call was sound.
**General rule (binding going forward):** a normalized promotion never infers footprint from geometry — normalization erases real-world scale. `footprint_tiles` is an AUTHORED value: `[1,1]` only when the object's real-world class is plausibly single-tile; ordinarily-multi-tile classes require the promoting author to state an intended footprint explicitly. The manifest stays the field of record; the authoring step is what was missing.
| # | File | Issue |
|---|------|-------|
| 1 | briefs/furniture-props.md §3 + conventions.md §4 | The rule above must be codified BEFORE merge (her exact wording supplied) — the texture-heavy wall stories start next and must inherit a written rule, not tribal knowledge from this PR. **Applied lead-side in the fix commit** (her wording verbatim; conventions.md §4 gains the authored-not-derived sentence with a pointer to the brief's full rule; a pre-existing "Single Sunday-tile" typo in the same paragraph fixed to "Single-tile" in passing). |
Her confirmations on record: category-first renames all correct (desk_scifi's direction verified against the spike source name); mask handling per §3 exact (lion_statue ships NO mask file, not an empty one); the extracted-texture subsection is correctly placed in §2 and stays mechanics-not-taste, no wording changes; D-257 conformance verified at the node-graph level and none of the four is glazing-class; the models.md row honestly carries the spike's known "mask too aggressive" issue rather than silently promoting it as clean; the manifest schema generalizes structurally to the wall stories — the transferable lesson ("don't let a pipeline artifact stand in for an authored value") is exactly why the rule is now written.
## Verdict: CHANGES REQUESTED -> amendment applied; merging after gate.
footprint_tiles is an authored value, never derived from normalized
mesh geometry — [1,1] defaults only for plausibly-single-tile classes;
ordinarily-multi-tile classes require an explicitly stated footprint at
promotion. Her exact wording in furniture-props.md §3; conventions.md
§4 gains the authored-not-derived sentence pointing at the full rule
(and a pre-existing 'Single Sunday-tile' typo fixed in passing). The
[1,1] values shipped for the four promoted items stand as ruled.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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-7 visual track: the first real environment assets enter the game per the furniture-props brief (T-1049/PR #213).
<model>_Image_0.pngreferenced by binary UID even with embedded_image_handling=3 — a mandatory, previously-undocumented commit-with-the-model sidecar; deleting it breaks loading with an error no text-grep can trace.For the review round (araminta)
footprint_tiles ruling needed: all four spike GLBs are Blender-normalized to 1m max dimension, so real-world footprint is not derivable from geometry. The brief's [2,1] example turns out to be illustrative, not derivable. This PR sets [1,1] for all four as a flagged judgment call — rule whether normalized spike assets default [1,1] or whether promotion requires an author-supplied real-world scale, and whether the brief gets amended.
Test plan
Review: furniture-promotion -> main (type: visual/assets)
Reviewers: Hoshe (QA) + Araminta (art direction — the ruling this PR requested is hers). Hoshe APPROVE; Araminta REQUEST_CHANGES (one doc amendment).
Hoshe (QA): APPROVE
No defects. Independently re-verified: MD5 byte-identity of all 4 GLBs + 3 masks against the spike sources; spikes/ untouched; vw_beetle and lion_statue_mask.png correctly absent; manifest.json valid and schema-exact with correct mask presence/absence and the _-prefix skip contract intact; models.md rows and README count exact; the conventions/SKILL sidecar docs mutually consistent; the mat_primary/roughness/specular claim corroborated against postprocess_glb.py source; live re-verification — clean headless import + ResourceLoader load/instantiate of chair_modernist and lion_statue, script deleted, processes clean.
Araminta (art direction): REQUEST_CHANGES
THE RULING (on the PR's own question):
[1,1]STANDS for all four items — each justified by real-world class (café-scale table, chair, compact desk, statue), none misrepresented at 1 tile = 1m (D-243). The judgment call was sound.General rule (binding going forward): a normalized promotion never infers footprint from geometry — normalization erases real-world scale.
footprint_tilesis an AUTHORED value:[1,1]only when the object's real-world class is plausibly single-tile; ordinarily-multi-tile classes require the promoting author to state an intended footprint explicitly. The manifest stays the field of record; the authoring step is what was missing.Her confirmations on record: category-first renames all correct (desk_scifi's direction verified against the spike source name); mask handling per §3 exact (lion_statue ships NO mask file, not an empty one); the extracted-texture subsection is correctly placed in §2 and stays mechanics-not-taste, no wording changes; D-257 conformance verified at the node-graph level and none of the four is glazing-class; the models.md row honestly carries the spike's known "mask too aggressive" issue rather than silently promoting it as clean; the manifest schema generalizes structurally to the wall stories — the transferable lesson ("don't let a pipeline artifact stand in for an authored value") is exactly why the rule is now written.
Verdict: CHANGES REQUESTED -> amendment applied; merging after gate.
Pull request closed