Lesson 248: Aseprite Sprite Bridge Hash Spot Receipt on BUILD_RECEIPT (2026)
Direct answer: Before July playtest scale on the CSP → Aseprite → engine lane, file sprite_bridge_hash_spot_receipt_v1.json proving cousin sprite_sheet_hash_receipt_v1 (Lesson 236) is GREEN or documented csp_cousin: n/a, bridge frame_index audit passes, Aseprite tag frame counts match csp_aseprite_bridge.json, spot sha256 on .aseprite + bridge + engine sheet re-saves identically, and engine spot play confirms one combat tag—then promote BUILD_RECEIPT sprite_bridge_hash_spot_ok. Distinct from 236 (CSP direct PNG+manifest) and Lesson 247 (UE menu minidumps).

Why this matters now (July 2027 CSP-green / Aseprite-wrong playtest frames)
July 2027 teams scale Steam playtest after Q3 capstone 244. Facilitators tag animation_wrong while sprite_sheet_hash stays GREEN—attack_light frame 3 duplicated from idle after Convert layers to frames without a bridge JSON bump. Lesson 236 owns CSP sheet hash; the Aseprite bridge spot preflight is the ninety-second checklist—248 is the BUILD_RECEIPT milestone for sprite_bridge_hash_spot.
Pair CSP import bridge for contract discipline and Lesson 239 tag animation_wrong (add alias if missing).
Beginner path (bridge spot + receipt)
| Step | Action | Success check |
|---|---|---|
| 1 | Confirm Lesson 236 cousin GREEN | K1 pass |
| 2 | Audit csp_aseprite_bridge.json frame indices |
K2 pass |
| 3 | Count Aseprite tags vs bridge | K3 pass |
| 4 | sha256sum spot bundle + re-save |
K4 pass |
| 5 | Engine stub play("attack_light") |
K5 pass |
| 6 | File receipt + BUILD_RECEIPT | bridge_hash_spot_ok: true |
Time: ~55 minutes first bridge lane; ~15 minutes when bridge JSON and import script are pinned.
Developer path (gates K1–K6)
| Gate | Check | Fail when |
|---|---|---|
| K1 | Cousin CSP sprite_sheet_hash_receipt_v1 |
Promote bridge while CSP sheet drifts |
| K2 | Bridge frame_index contiguous per tag |
Gaps or orphan file paths |
| K3 | Aseprite tag inventory | Tag rename without bridge update |
| K4 | Spot sha256 bundle + re-save match | Hash changes without pixel edits |
| K5 | Engine spot play | Idle bleed in attack clip |
| K6 | Receipt + BUILD_RECEIPT | bridge_hash_spot_ok: false |
K1 — cousin receipt crosswalk
| Field | Cousin (236) | This lesson (248) |
|---|---|---|
| Schema | sprite_sheet_hash_receipt_v1 |
sprite_bridge_hash_spot_receipt_v1 |
| Scope | CSP PNG + manifest sha256 | Aseprite tags after bridge import |
| Path | release-evidence/art/SPRITE_SHEET_HASH_RECEIPT.json |
release-evidence/art/SPRITE_BRIDGE_HASH_SPOT_RECEIPT.json |
Do not duplicate K1–K6 CSP proof inside bridge JSON—reference cousin path only.
sprite_bridge_hash_spot_receipt_v1.json
{
"schema": "sprite_bridge_hash_spot_receipt_v1",
"build_label": "playtest-july-2027-rc1",
"character_id": "hero_combat",
"aseprite_file": "art/characters/hero/hero_combat.aseprite",
"bridge_path": "art/characters/hero/csp_aseprite_bridge.json",
"engine_sheet_path": "art/characters/hero/hero_combat_engine_sheet.png",
"cousin_receipts": {
"sprite_sheet_hash": "release-evidence/art/SPRITE_SHEET_HASH_RECEIPT.json"
},
"spot_tags": ["idle", "attack_light"],
"tag_frame_audit": {
"idle": { "bridge": 4, "aseprite": 4, "match": true },
"attack_light": { "bridge": 6, "aseprite": 6, "match": true }
},
"sha256_bundle": "sha256:REPLACE_AFTER_COMPUTE",
"resave_match": true,
"engine_spot": {
"engine": "godot_4.5",
"spot_tag": "attack_light",
"frame_count_ok": true
},
"gates": {
"K1_cousin_csp_hash": "pass",
"K2_bridge_frame_audit": "pass",
"K3_aseprite_tag_inventory": "pass",
"K4_spot_sha256": "pass",
"K5_engine_spot": "pass",
"K6_build_receipt": "pass"
},
"bridge_hash_spot_ok": true,
"playtest_promotion_allowed": true
}
Pin under release-evidence/art/SPRITE_BRIDGE_HASH_SPOT_RECEIPT.json.
BUILD_RECEIPT row (K6)
| Column | Pass when |
|---|---|
sprite_bridge_hash_spot |
bridge_hash_spot_ok: true + receipt path |
sprite_sheet_hash |
Cousin Lesson 236 independent column |
palette_swap |
Aseprite palette handoff when tints wrong, frames OK |
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
sprite_bridge_hash_spot_blocked BOOLEAN NOT NULL DEFAULT false;
Thursday row review — Bridge spot line: tag audit Y/N.
Key takeaways
- 236 CSP hash ≠ 248 bridge spot—both required when using the bridge lane.
- K3 tag counts catch renumbered frames CSP hash cannot see.
- Hash
.aseprite + bridge + engine sheettogether—not.asepritealone. - Import bridge defines
frame_zero_policy. - Tag
animation_wrongvia Lesson 239. - Do not maintain direct CSP sheet and bridge sheet as dual primaries.
- Lesson 247 is crash triage—separate column.
playtest_promotion_allowedhere ≠ Q4 capstone 253—capstone wires 245–252.- Aseprite-only characters: document
csp_cousin: "n/a"in K1 with team sign-off. - Forward: Lesson 249 Blender hero GLTF hash (when published).
Common mistakes
- Filing 248 while 236 cousin still fails.
- Convert layers to frames on global timeline—mixes tags.
- 1-based
frame_indexin bridge JSON. - Merging schemas into
sprite_sheet_hash_receipt_v1. - Skipping K5 because “tags look fine” in Aseprite preview.
Troubleshooting
| Symptom | Lane |
|---|---|
| Wrong frame, CSP hash GREEN | This lesson K3–K5 |
| Wrong frame, CSP hash RED | Lesson 236 |
| Palette wrong, frames OK | Palette swap handoff |
| 3D hero mesh drift | Lesson 249 (queued) |
| Wrong depot | Lesson 201 |
Mini exercise (50 minutes)
- Import bridge with duplicated
attack_lightframe 3—confirm K3 fail. - Fix bridge + tags; pass K4 re-save match.
- Link cousin
SPRITE_SHEET_HASH_RECEIPT.json. - File receipt; BUILD_RECEIPT GREEN.
Continuity — Q4 2027 July playtest scale (245–253)
| Lesson | Receipt focus |
|---|---|
| 247 | Unreal menu minidump |
| 248 (this) | Aseprite bridge hash spot |
| 249 | Blender hero glTF export hash |
| 253 | Q4 capstone (queued) |
Previous: Lesson 247 — Unreal playtest menu minidump build_label
Next: Lesson 249 — Blender hero GLTF export hash
FAQ
Same as Lesson 236?
236 = CSP PNG + manifest hash; 248 = Aseprite bridge spot after import.
Same as bridge spot guide?
Guide = K1–K6 checklist; 248 = BUILD_RECEIPT promotion.
Same as CSP bridge chapter?
Bridge chapter = contract; 248 = receipt + BUILD_RECEIPT column.
Aseprite-only hero?
Set csp_cousin: "n/a" in receipt with written lane decision—still run K2–K6.
CSP-green with wrong combat frames is a bridge spot failure—cousin 236, tag audit, spot sha256 bundle, engine play, then sprite_bridge_hash_spot_ok on BUILD_RECEIPT.