Lesson 271: Blender Diligence Hero GLB rclone Mirror Receipt on BUILD_RECEIPT (2026)
Direct answer: Before Q4 2026 partner diligence mirror week, promote blender_glb_mirror_receipt_v1.json with M1–M6 gates—pin gltf_export_preset_v1.json, export hero_diligence.glb once, sha256sum GLB + hero_glb_mirror_manifest.json, archive rclone copy --dry-run log, crosswalk team_drive_id to cousin diligence_mirror_receipt_v1, and fail-close blender_glb_mirror_ok on BUILD_RECEIPT before live mirror or partner zip. Pair diligence mirror preflight (Guide #33), Blender hero glTF diligence evening, and cousin Lesson 249 (playtest identity—not diligence mirror).

Why this matters now (Q4 diligence mirror week)
Q4 2026 funds audit release-evidence/diligence/03-art/hero/—not a WIP .blend or informal Dropbox link. Teams pass Lesson 264 archive_handoff_ok on Resolve bundles but still mirror a re-exported GLB whose checksum differs from the partner README. Nightly rclone copy multiplies whatever is on disk—garbage-in equals partner confusion-out.
Lesson 270 wires GameMaker setlive on BUILD_RECEIPT; 271 wires Blender diligence hero mirror so Thursday row review diffs a real 03-art/hero/ story beside 02-trailer/.
Beginner path (export → hash → dry-run → receipt)
| Step | Action | Success check |
|---|---|---|
| 1 | Pin export preset + freeze note | M1 EXPORT_FREEZE.md signed |
| 2 | Export hero_diligence.glb once |
File under 03-art/hero/ |
| 3 | Write manifest + sha256sum |
M2/M3 lines logged |
| 4 | rclone copy --dry-run |
M4 log shows planned transfers |
| 5 | jq team_drive_id crosswalk |
M5 matches mirror config |
| 6 | File receipt + BUILD_RECEIPT | blender_glb_mirror_ok: true |
Time: ~55 minutes first diligence sprint; ~15 minutes when preset and remote are pinned.
Developer path (gates M1–M6)
| Gate | Check | Fail when |
|---|---|---|
| M1 | Export preset + modifier freeze | Ad-hoc glTF settings per export |
| M2 | sha256 on hero_diligence.glb |
Hash missing or .blend hashed |
| M3 | hero_glb_mirror_manifest.json |
vertex_count / glb_bytes absent |
| M4 | rclone copy --dry-run |
Zero transfers when GLB exists |
| M5 | team_drive_id crosswalk |
Drift vs diligence_mirror_config_v1 |
| M6 | Receipt + BUILD_RECEIPT | Promote before M5 GREEN |
Align with Guide #33 preflight—guide = ninety-second gate; 271 = BUILD_RECEIPT milestone with promotion jq.
Cousin receipt crosswalk
| Field | Cousin (playtest Lesson 249) | Cousin (evening tutorial) | Cousin (Resolve 264) | This lesson (271) |
|---|---|---|---|---|
| Schema | gltf_export_hash_receipt_v1 |
blocks A–D evening | resolve_archive_rclone_receipt_v1 |
blender_glb_mirror_receipt_v1 |
| Scope | fest_public / playtest | First-evening diligence | 02-trailer archive | 03-art/hero BUILD_RECEIPT |
| Path | release-evidence/art/ |
release-evidence/diligence/03-art/hero/ |
release-evidence/diligence/02-trailer/ |
release-evidence/diligence/03-art/hero/ |
Do not merge schemas—reference paths in cousin_receipts only.
M1 — Pin export preset
Archive tools/blender/gltf_export_preset_v1.json (cousin fields from Lesson 249):
{
"format": "glb",
"export_apply": true,
"export_texcoords": true,
"export_normals": true,
"export_tangents": true,
"export_materials": "EXPORT",
"export_image_format": "AUTO",
"export_draco_mesh_compression": false,
"export_animations": true,
"export_nla_strips": true,
"export_def_bones": false
}
Freeze checklist (release-evidence/diligence/03-art/hero/EXPORT_FREEZE.md):
| Check | Pass |
|---|---|
hero_diligence collection is sole export root |
Yes |
| Modifiers applied consistently | Yes |
| Fab textures use proxy_2k only | Yes |
Draco policy matches manifest (false for diligence) |
Yes |
M2–M3 — Export + sha256 bundle
Blender File → Export → glTF 2.0 (.glb) → release-evidence/diligence/03-art/hero/hero_diligence.glb.
hero_glb_mirror_manifest.json:
{
"schema": "hero_glb_mirror_manifest_v1",
"character_id": "hero_combat",
"build_label": "q4-diligence-2026-rc1",
"gltf_path": "release-evidence/diligence/03-art/hero/hero_diligence.glb",
"export_preset": "tools/blender/gltf_export_preset_v1.json",
"vertex_count": 18432,
"glb_bytes": 15728640,
"draco": false,
"cousin_receipts": {
"gltf_export_hash_playtest": "release-evidence/art/GLTF_EXPORT_HASH_RECEIPT.json",
"resolve_archive": "release-evidence/diligence/RESOLVE_ARCHIVE_RCLONE_RECEIPT.json",
"diligence_mirror": "release-evidence/diligence/DILIGENCE_MIRROR_RECEIPT.json"
}
}
cd release-evidence/diligence/03-art/hero
sha256sum hero_diligence.glb hero_glb_mirror_manifest.json | tee hero_glb_sha256.txt
M3 pass when manifest vertex_count matches Blender outliner after export.
M4 — rclone dry-run
DATE_TAG="$(date -u +%Y-%m-%d)"
rclone copy release-evidence/diligence/03-art/hero/ \
"diligence_team:partner_mirror/${DATE_TAG}/03-art/hero/" \
--dry-run --checksum \
--include "hero_diligence.glb" --include "hero_glb_mirror_manifest.json" \
-v 2>&1 | tee "logs/rclone_hero_glb_mirror_dry_run_${DATE_TAG}.log"
Fail-closed: no live copy until dry-run log archived and M4 GREEN.
M5 — Team Drive ID crosswalk
jq -e --arg id "$(jq -r .team_drive_id release-evidence/diligence/diligence_mirror_config_v1.json)" \
'.team_drive_id == $id' release-evidence/diligence/DILIGENCE_MIRROR_RECEIPT.json
Pair jq rclone Team Drive ID sanity when cousin mirror receipt is stale.
M6 — blender_glb_mirror_receipt_v1.json
{
"schema": "blender_glb_mirror_receipt_v1",
"build_label": "q4-diligence-2026-rc1",
"hero_glb_path": "release-evidence/diligence/03-art/hero/hero_diligence.glb",
"manifest_path": "release-evidence/diligence/03-art/hero/hero_glb_mirror_manifest.json",
"sha256_log": "release-evidence/diligence/03-art/hero/hero_glb_sha256.txt",
"dry_run_log": "logs/rclone_hero_glb_mirror_dry_run_2026-11-04.log",
"team_drive_id": "0ABC…xyz",
"rclone_remote": "diligence_team",
"cousin_receipts": {
"diligence_mirror": "release-evidence/diligence/DILIGENCE_MIRROR_RECEIPT.json",
"resolve_archive": "release-evidence/diligence/RESOLVE_ARCHIVE_RCLONE_RECEIPT.json",
"gltf_export_hash_playtest": "release-evidence/art/GLTF_EXPORT_HASH_RECEIPT.json"
},
"gates": {
"M1_export_preset": "pass",
"M2_sha256_glb": "pass",
"M3_manifest": "pass",
"M4_dry_run": "pass",
"M5_team_drive_crosswalk": "pass",
"M6_receipt": "pass"
},
"blender_glb_mirror_ok": true,
"mirror_job_allowed": false
}
Pin as release-evidence/diligence/BLENDER_GLB_MIRROR_RECEIPT.json. mirror_job_allowed on cousin diligence mirror receipt stays false until hero + Resolve cousins GREEN.
BUILD_RECEIPT columns (Q4 diligence lane)
| Column | Source | Pass when |
|---|---|---|
archive_handoff_ok |
Lesson 264 cousin | true when trailer ships same packet |
blender_glb_mirror_ok |
M6 jq | true |
mirror_job_allowed |
Cousin diligence mirror | true only after hero + Resolve GREEN |
gltf_export_hash_ok |
Lesson 249 | Separate live-ops lane |
Fail-closed jq (CI tail)
jq -e '.blender_glb_mirror_ok == true' release-evidence/diligence/BLENDER_GLB_MIRROR_RECEIPT.json
jq -e '.gates.M4_dry_run == "pass"' release-evidence/diligence/BLENDER_GLB_MIRROR_RECEIPT.json
Block live rclone copy on 03-art/hero/ unless both exit 0.
Key takeaways
- Partners checksum
03-art/hero/—not trust-me email attachments. - Hash
.glb+ manifest, not.blend(M2/M3). - Dry-run before live mirror (M4)—pair evening tutorial blocks A–D for first path.
- Guide #33 preflight owns ninety-second gate; 271 owns BUILD_RECEIPT promotion.
- 12-free Blender hero GLB tools bookmark rclone + hash utilities.
- Help #32 forward owns hash mismatch after live copy—271 stops bad bytes before copy.
- Playtest hero drift is Lesson 249—do not substitute for diligence mirror.
Common mistakes
- Re-export after manifest without updating sha256 log.
- Live
rclone copywithout M4 dry-run log. - Merging
blender_glb_mirror_receipt_v1intogltf_export_hash_receipt_v1. - Hashing
.blendinstead of exported.glb. - Wrong
team_drive_id—hero on My Drive, Resolve on Team Drive (M5). - Partner zip before
archive_handoff_okcousin when trailer ships same week.
Troubleshooting
| Symptom | Lane |
|---|---|
| Partner hash mismatch | Re-run M2; check optimization pass after manifest |
| Dry-run zero files | Wrong --include glob or empty 03-art/hero/ |
team_drive_id jq fail |
jq mirror blog M1 |
| Resolve OK, hero missing | Lesson 264 cousin path drift |
| Playtest mesh OK, diligence wrong | Different build_label on playtest vs diligence paths |
Mini exercise (55 minutes)
- Export without freeze note—observe hash drift (M1 fail).
- Pass M2–M3 sha256 bundle.
- Archive M4 dry-run log; verify M5 jq crosswalk.
- File M6 receipt; BUILD_RECEIPT GREEN for
blender_glb_mirror_ok. - Confirm cousin
mirror_job_allowedstill false until Resolve cousin GREEN.
Continuity — November 2026 fest close-out + playtest triage (266–276)
| Lesson | Receipt focus |
|---|---|
| 270 | GameMaker setlive dry-run |
| 271 (this) | Blender diligence hero mirror |
| 272 | Ren'Py SteamPipe wall-clock (forward) |
Previous: Lesson 270 — GameMaker Steam setlive branch dry-run receipt
Next: Lesson 272 — Ren'Py SteamPipe upload wall-clock receipt
FAQ
Same as evening tutorial?
Evening owns blocks A–D first path; 271 owns blender_glb_mirror_receipt_v1 BUILD_RECEIPT column + fail-closed jq.
Same as Guide #33?
Guide = ninety-second preflight; 271 = course milestone with cousin crosswalk + promotion jq.
Same as Lesson 249?
249 = playtest gltf_export_hash_receipt_v1; 271 = diligence blender_glb_mirror_receipt_v1 under 03-art/hero/.
Same as Lesson 264?
264 = Resolve archive archive_handoff_ok; 271 = hero GLB beside trailer in diligence tree.
Does this enable live mirror alone?
No—cousin mirror_job_allowed on diligence mirror receipt requires hero + Resolve cousins GREEN.
Does this replace jq mirror blog?
No—blog owns whole-tree diligence_mirror_receipt_v1; 271 owns hero subtree BUILD_RECEIPT column.
Partners audit checksums in 03-art/hero/—pin export, hash GLB + manifest, dry-run mirror, crosswalk Team Drive ID, then file receipt before live copy.