## Summary
- **#707**: 198 body segment GLBs (11 body types × 18 segments) exported from Quaternius Source .blends via headless Blender pipeline. 6 direct types (average, muscular, teen) + 5 auto-generated fork types (thin, heavy, child) flagged for artist review.
- **#708**: 20 hair/facial_hair/eyebrow GLBs + recolor mask PNGs converted from Source tier glTF exports. Includes bald placeholder.
- **#709**: 4 head template GLBs + mask PNGs from OnlyHead .blends (head_001–004).
- 8 Blender headless pipeline scripts in `tooling/` for reproducible asset processing.
257 files, ~250 GLBs + masks + pipeline scripts.
## Test plan
- [ ] Open representative GLBs in Blender to verify mesh integrity and bone weights
- [ ] Verify body segments load onto shared armature (skeleton/armature.glb)
- [ ] Check fork body type proportions (thin/heavy/child) — flagged for artist review
- [ ] Verify hair GLBs attach correctly to Head bone via BoneAttachment3D
- [ ] Confirm head templates are correctly scaled relative to body at gameplay zoom
- [ ] Full integration test via character compositor (#693) once built
🤖 Generated with [Claude Code](https://claude.com/claude-code)
"21 segments" in spec + script docstrings vs 18 actually delivered. Implementation is consistently 18 — the "21" references are stale. Fix docs and docstrings.
Missing __main__ guards (inconsistent with other pipeline scripts)
3
blender_process_bodies.py:107
suggestion
sys.exit(1) on missing source mid-loop — should preflight-check all paths first
Araminta (Art Direction): REQUEST_CHANGES
Pipeline architecture is sound, segmentation approach is correct (1-ring overlap, ankle extension). Two blockers, same root cause as Hoshe.
#
File
Severity
Issue
1
Spec + scripts
critical
Segment count 21 vs 18 discrepancy — same as Hoshe
2
average_m/
warning
Reference body type has no README noting its role as clothing reference body
3
blender_process_hair.py
suggestion
Solid-white hair masks should be commented as placeholder for multi-region
4
blender_process_heads.py
suggestion
Head mask sized from first-found texture — fragile iteration order
5
hair/bald.glb
suggestion
No mask sidecar — document as deliberate exception or add 1x1 black placeholder
6
child/README.md
suggestion
Non-uniform scale (Y=0.72 vs XZ=0.75) rationale should be documented
Verdict: CHANGES REQUESTED
Primary blocker (both reviewers): The "21 segments" figure in the architecture doc and two script docstrings is stale — the actual implementation is 18 segments, consistent with the CHANGELOG, SEGMENT_ORDER, and on-disk output. This is a doc cleanup, not a missing-segments bug.
Priority fixes:
Update architecture doc Section 2 and disk budget: 21→18, 231→198
Update docstrings in blender_segment_body.py and blender_process_bodies.py
Add brief README to average_m/ noting it as the reference body for clothing
Reviewed by Hoshe (QA) and Araminta (art direction) via /pr-review
## Review: visual -> main (type: visual)
### Hoshe (QA): REQUEST_CHANGES
Asset library is structurally sound — all 11 body types, naming conventions, mask sidecar pairing all verified correct. One blocker.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `character-asset-organization.md`, `blender_segment_body.py`, `blender_process_bodies.py` | critical | "21 segments" in spec + script docstrings vs 18 actually delivered. Implementation is consistently 18 — the "21" references are stale. Fix docs and docstrings. |
| 2 | `blender_inspect_body.py`, `blender_inspect_vgroups.py`, `check_icosphere.py` | suggestion | Missing `__main__` guards (inconsistent with other pipeline scripts) |
| 3 | `blender_process_bodies.py:107` | suggestion | `sys.exit(1)` on missing source mid-loop — should preflight-check all paths first |
### Araminta (Art Direction): REQUEST_CHANGES
Pipeline architecture is sound, segmentation approach is correct (1-ring overlap, ankle extension). Two blockers, same root cause as Hoshe.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | Spec + scripts | critical | Segment count 21 vs 18 discrepancy — same as Hoshe |
| 2 | `average_m/` | warning | Reference body type has no README noting its role as clothing reference body |
| 3 | `blender_process_hair.py` | suggestion | Solid-white hair masks should be commented as placeholder for multi-region |
| 4 | `blender_process_heads.py` | suggestion | Head mask sized from first-found texture — fragile iteration order |
| 5 | `hair/bald.glb` | suggestion | No mask sidecar — document as deliberate exception or add 1x1 black placeholder |
| 6 | `child/README.md` | suggestion | Non-uniform scale (Y=0.72 vs XZ=0.75) rationale should be documented |
### Verdict: CHANGES REQUESTED
**Primary blocker (both reviewers):** The "21 segments" figure in the architecture doc and two script docstrings is stale — the actual implementation is 18 segments, consistent with the CHANGELOG, SEGMENT_ORDER, and on-disk output. This is a doc cleanup, not a missing-segments bug.
**Priority fixes:**
1. Update architecture doc Section 2 and disk budget: 21→18, 231→198
2. Update docstrings in `blender_segment_body.py` and `blender_process_bodies.py`
3. Add brief README to `average_m/` noting it as the reference body for clothing
---
*Reviewed by Hoshe (QA) and Araminta (art direction) via `/pr-review`*
- Fix stale 21→18 segment count in architecture doc, script docstrings,
and disk budget table (critical — both reviewers)
- Add average_m/README.md noting role as clothing reference body
- Add __main__ guards to diagnostic scripts
- Preflight-check all source paths in blender_process_bodies.py
- Document solid-white hair masks as v0.2 placeholder for multi-region
- Add fallback size comment for head mask generation
- Add bald_mask.png (1×1 black) for sidecar convention consistency
- Document child non-uniform scale rationale (Y=0.72 vs XZ=0.75)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All 6 fixes verified. One minor note: MASK_RESOLUTION is 1024 but fallback log message says "512x512" — logging inconsistency, not a blocker.
Verdict: APPROVED
Re-reviewed by Hoshe (QA) and Araminta (art direction) via /pr-review
## Review: visual -> main (type: visual) — Round 2
### Hoshe (QA): APPROVE
All 4 fixes verified. No remaining issues.
### Araminta (Art Direction): APPROVE
All 6 fixes verified. One minor note: `MASK_RESOLUTION` is 1024 but fallback log message says "512x512" — logging inconsistency, not a blocker.
### Verdict: APPROVED
---
*Re-reviewed by Hoshe (QA) and Araminta (art direction) via `/pr-review`*
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
tooling/for reproducible asset processing.257 files, ~250 GLBs + masks + pipeline scripts.
Test plan
🤖 Generated with Claude Code
Review: visual -> main (type: visual)
Hoshe (QA): REQUEST_CHANGES
Asset library is structurally sound — all 11 body types, naming conventions, mask sidecar pairing all verified correct. One blocker.
character-asset-organization.md,blender_segment_body.py,blender_process_bodies.pyblender_inspect_body.py,blender_inspect_vgroups.py,check_icosphere.py__main__guards (inconsistent with other pipeline scripts)blender_process_bodies.py:107sys.exit(1)on missing source mid-loop — should preflight-check all paths firstAraminta (Art Direction): REQUEST_CHANGES
Pipeline architecture is sound, segmentation approach is correct (1-ring overlap, ankle extension). Two blockers, same root cause as Hoshe.
average_m/blender_process_hair.pyblender_process_heads.pyhair/bald.glbchild/README.mdVerdict: CHANGES REQUESTED
Primary blocker (both reviewers): The "21 segments" figure in the architecture doc and two script docstrings is stale — the actual implementation is 18 segments, consistent with the CHANGELOG, SEGMENT_ORDER, and on-disk output. This is a doc cleanup, not a missing-segments bug.
Priority fixes:
blender_segment_body.pyandblender_process_bodies.pyaverage_m/noting it as the reference body for clothingReviewed by Hoshe (QA) and Araminta (art direction) via
/pr-reviewReview: visual -> main (type: visual) — Round 2
Hoshe (QA): APPROVE
All 4 fixes verified. No remaining issues.
Araminta (Art Direction): APPROVE
All 6 fixes verified. One minor note:
MASK_RESOLUTIONis 1024 but fallback log message says "512x512" — logging inconsistency, not a blocker.Verdict: APPROVED
Re-reviewed by Hoshe (QA) and Araminta (art direction) via
/pr-reviewPull request closed