Lesson 254: DaVinci HDR Tonemap SDR Steam Capture Receipt on BUILD_RECEIPT (2026)
Direct answer: Before October 2026 Steam gallery slots ship, file hdr_steam_capture_export_receipt_v1.json proving a Resolve SDR master exists after tone-map (not raw HDR timeline export), sdr_master_sha256 matches the mezzanine you downscale, five store-slot PNG hashes match steam_capture_slots_v1.json, and hdr_steam_capture_ok promotes on BUILD_RECEIPT—then run screenshot safe-zones. Distinct from Lesson 251 (playtest highlight TC map) and the blog’s screenshot_tone_receipt_v1 (engine/ffmpeg proof ladder).

Why this matters now (October 2026 store captures from HDR timelines)
October 2026 teams still grade in HDR on Resolve 20.x timelines, then upload SDR PNGs to Steam—skipping tone-map before downscale recreates false bloom on HUD edges even when safe-zone composition passes. Lesson 251 owns playtest highlight reels; 254 owns store stills exported from the same Resolve project without re-using social H.264 mezzanine as gallery truth.
The Resolve HDR tonemap → SDR Steam capture preflight is the ninety-second gate—254 is the BUILD_RECEIPT milestone. Pair GIF vs WebM deliverable discipline for motion slots (separate receipt lane).
Beginner path (Resolve SDR master → slot hashes → receipt)
| Step | Action | Success check |
|---|---|---|
| 1 | Export SDR master from Resolve Deliver (tone-map on) | H1 pass + SHA-256 logged |
| 2 | Downscale once with gamma-correct filter (ffmpeg or Deliver) | H2 no double tone-map |
| 3 | Fill steam_capture_slots_v1.json for slots 1–5 |
H3 five paths + hashes |
| 4 | Phone-width readability spot (360px) | H4 HUD edges crisp |
| 5 | Cross-check cousin screenshot_tone_receipt if engine path exists |
H5 optional link |
| 6 | File receipt + BUILD_RECEIPT | hdr_steam_capture_ok: true |
Time: ~52 minutes first October pass; ~15 minutes when Deliver preset + slot template exist.
Developer path (gates H1–H6)
| Gate | Check | Fail when |
|---|---|---|
| H1 | sdr_master_path on disk |
HDR .exr only, no SDR master |
| H2 | Single tone-map pass documented | Engine SDR + Resolve tonemap (double map) |
| H3 | steam_capture_slots_v1.json complete |
Missing slot hash or wrong dimensions |
| H4 | 360px width HUD spot | Bloom eats UI outlines |
| H5 | Cousin screenshot_tone_receipt_v1 path optional |
Engine proof contradicts Resolve hash |
| H6 | Receipt + BUILD_RECEIPT | Promote before H3 GREEN |
H1 — cousin receipt crosswalk
| Field | Cousin (blog tone) | Cousin (251 handoff) | This lesson (254) |
|---|---|---|---|
| Schema | screenshot_tone_receipt_v1 |
trailer_handoff_receipt_v1 |
hdr_steam_capture_export_receipt_v1 |
| Scope | Engine/ffmpeg proof ladder | Playtest TC ↔ OBS map | Resolve SDR master → Steam PNG slots |
| Path | marketing-and-demo/hdr-false-bloom/... |
playtest/trailer/TRAILER_HANDOFF_RECEIPT.json |
marketing-and-demo/steam/HDR_STEAM_CAPTURE_EXPORT_RECEIPT.json |
| Order | Parallel art pass | Before 243 consent | Before store-metadata freeze |
Do not merge screenshot_tone booleans into hdr_steam_capture_export—reference cousin_receipts only.
steam_capture_slots_v1.json
{
"schema": "steam_capture_slots_v1",
"build_label": "october-fest-2026-rc2",
"sdr_master_path": "deliver/sdr_master_october-fest-2026-rc2.mov",
"sdr_master_sha256": "def456…",
"tone_map_preset": "resolve_steam_sdr_v1",
"slots": [
{
"slot_id": 1,
"steam_role": "header",
"png_path": "deliver/steam/slot01_header_1920x1080.png",
"png_sha256": "aa11…",
"width": 1920,
"height": 1080
},
{
"slot_id": 2,
"steam_role": "main",
"png_path": "deliver/steam/slot02_main_1920x1080.png",
"png_sha256": "bb22…",
"width": 1920,
"height": 1080
}
]
}
hdr_steam_capture_export_receipt_v1.json
{
"schema": "hdr_steam_capture_export_receipt_v1",
"build_label": "october-fest-2026-rc2",
"sdr_master_path": "deliver/sdr_master_october-fest-2026-rc2.mov",
"sdr_master_sha256": "def456…",
"slots_manifest_path": "deliver/steam/steam_capture_slots_v1.json",
"slot_count": 5,
"double_tone_map_detected": false,
"phone_width_hud_spot_pass": true,
"cousin_receipts": {
"screenshot_tone": "release-evidence/marketing-and-demo/hdr-false-bloom/screenshot_tone_receipt_v1.json",
"trailer_handoff": "release-evidence/playtest/trailer/TRAILER_HANDOFF_RECEIPT.json",
"gif_deliverable_slot": "deliver/gif_deliverable_slot_receipt_v1.json"
},
"gates": {
"H1_sdr_master": "pass",
"H2_single_tonemap": "pass",
"H3_slot_hashes": "pass",
"H4_phone_hud_spot": "pass",
"H5_cousin_tone": "skipped",
"H6_build_receipt": "pass"
},
"hdr_steam_capture_ok": true,
"store_gallery_promotion_allowed": true
}
Pin under release-evidence/marketing-and-demo/steam/HDR_STEAM_CAPTURE_EXPORT_RECEIPT.json.
BUILD_RECEIPT row (H6)
| Column | Pass when |
|---|---|
hdr_steam_capture |
hdr_steam_capture_ok: true |
trailer_handoff |
Cousin Lesson 251 independent column |
screenshot_tone |
Blog/engine cousin optional column |
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
hdr_steam_capture_blocked BOOLEAN NOT NULL DEFAULT false;
Thursday row review — HDR Steam capture line: SDR master hash + slot 1–5 Y/N.
Key takeaways
- Store stills ≠ playtest handoff—Lesson 251 is OBS highlight TC; 254 is gallery SDR export.
- Tone-map before downscale—HDR false bloom art pass owns ffmpeg proof; 254 owns Resolve Deliver truth.
steam_capture_slots_v1.jsonis source of truth for five PNG hashes.- Run safe-zones five gates after 254 GREEN.
- Lesson 253 closed July scale—254 opens October ops arc 254–265.
- GIF vs WebM preflight — motion slots, not still captures.
store_gallery_promotion_allowedhere ≠ October capstone 265.- Forward: Lesson 255 Deck letterbox BUILD_RECEIPT (queued).
- Store page QA resources — localization after visuals GREEN.
- Top 20 receipts hub — HDR capture row in marketing→public map.
Common mistakes
- Uploading HDR timeline export directly to Steam—H1 fails without SDR master.
- Running engine tonemap and Resolve tonemap without documenting H2—double curve washout.
- Reusing 251 mezzanine path for slot hashes—playtest video ≠ store PNG lineage.
- Skipping H4 because desktop looks fine—360px Deck/browser preview fails.
- Merging
hdr_steam_capture_export_receiptintoscreenshot_tone_receiptschemas.
Troubleshooting
| Symptom | Lane |
|---|---|
| HUD glow returns after resize | H2 double tone-map or wrong ffmpeg format |
| Slots hash mismatch | Re-export from same sdr_master_sha256 |
| Highlights fine, store wrong | Skipped 254—used social export |
| Playtest reel fine, gallery wrong | 251 GREEN ≠ 254 GREEN |
| Safe zones fail after receipt | Run composition blog—separate gate |
Mini exercise (45 minutes)
- Export HDR-only still—confirm H1 fail.
- Export SDR master + log SHA-256.
- Build
steam_capture_slots_v1.jsonfor two slots. - Downscale with single gamma-correct pass.
- File receipt; BUILD_RECEIPT GREEN.
Continuity — October–Q4 2026 fest ops truth (254–265)
| Lesson | Receipt focus |
|---|---|
| 253 | Q4 July playtest scale capstone (closed) |
| 254 (this) | DaVinci HDR → SDR Steam captures |
| 255 | Godot Deck letterbox reset (queued) |
| 265 | October ops capstone (queued) |
Previous: Lesson 253 — Q4 playtest scale capstone
Next: Lesson 255 — Godot Deck letterbox Gamescope reset (publish on next Course-Create pass)
FAQ
Same as the HDR false bloom blog?
Blog = screenshot_tone_receipt_v1 + ffmpeg ladder; 254 = Resolve SDR master + slot hash manifest on BUILD_RECEIPT.
Same as Lesson 251?
251 = playtest trailer handoff to OBS; 254 = store gallery stills from Resolve.
Same as the DaVinci guide chapter?
Guide = H1–H6 checklist; 254 = BUILD_RECEIPT promotion.
Need all five slots before fest?
Team policy—receipt slot_count must match manifest; partial sets fail H3 when required_slots: 5.
October store galleries fail when HDR timelines export without an SDR master—tone-map once, hash five slots, then hdr_steam_capture_ok before metadata freeze.