Lesson 255: Godot Deck Letterbox Gamescope Reset Receipt on BUILD_RECEIPT (2026)
Direct answer: Before October fest Deck reviewers file store captures, promote deck_aspect_reset_receipt_v1.json proving a Gamescope reset ritual after 1440p desktop play, user:// display-state wipe (or team-approved selective delete), and native vs scaled capture columns match on the same build_label—distinct from Lesson 218 (deck_static_menu_receipt = GPU idle + render scale, not aspect letterboxing). Pair the Deck letterbox Gamescope preflight (Guide #18) and 16 Deck log export tools.

Why this matters now (October fest Deck letterbox after desk play)
October 2026 facilitators demo on 1440p monitors Monday and capture Steam Deck screenshots Tuesday—Gamescope keeps the prior aspect / scaling session, Godot window/size/viewport sticks to desktop dimensions, and store stills show black bars or squashed HUD even when Lesson 254 HDR→SDR exports are GREEN. Lesson 218 proves menu GPU idle; 255 proves display geometry truth before gallery promotion.
The Godot Deck letterbox preflight is the ninety-second gate (D1–D6 shipped May 27, 2026)—255 is the BUILD_RECEIPT milestone.
Beginner path (desk session → reset → capture proof)
| Step | Action | Success check |
|---|---|---|
| 1 | Play 1440p desktop build 10+ min | Reproduces letterbox risk |
| 2 | Run Gamescope reset ritual (guide D2) | Flags logged in receipt |
| 3 | Wipe or selective-clear user:// display keys |
D3 pass |
| 4 | Launch installed Deck build | Same build_label |
| 5 | Capture native + scaled columns | D5 parity table filled |
| 6 | File receipt + BUILD_RECEIPT | deck_aspect_reset_ok: true |
Time: ~48 minutes first October wave; ~12 minutes when reset script + capture template exist.
Developer path (gates D1–D6)
| Gate | Check | Fail when |
|---|---|---|
| D1 | build_label on desk + Deck rows |
Mismatched labels |
| D2 | Gamescope flags documented | Mystery -W / stale nested session |
| D3 | user:// wipe ritual executed |
Old display state persists |
| D4 | Godot viewport / stretch mode audited |
canvas_items stretch from desk resolution |
| D5 | Native vs scaled capture columns | Width/height disagree > 2px |
| D6 | Receipt + BUILD_RECEIPT | Promote before D5 GREEN |
D1 — cousin receipt crosswalk
| Field | Cousin (218) | This lesson (255) |
|---|---|---|
| Schema | deck_static_menu_receipt_v1 |
deck_aspect_reset_receipt_v1 |
| Scope | GPU idle + render scale | Aspect / Gamescope reset |
| Path | release-evidence/deck/DECK_STATIC_MENU_RECEIPT.json |
release-evidence/deck/DECK_ASPECT_RESET_RECEIPT.json |
| Order | Parallel columns | Both can be required for October fest |
Do not merge schemas—reference cousin_receipts only.
gamescope_reset_v1.json (D2 snapshot)
{
"schema": "gamescope_reset_v1",
"build_label": "october-fest-2026-rc2",
"gamescope_session_cleared": true,
"flags_before": "-W 1280x800 -f --",
"flags_after": "-W 1280x800 -f --",
"nested_session_killed": true,
"proton_log_path": "release-evidence/deck/october-fest-2026-rc2/proton_log.txt"
}
capture_columns_v1.json (D5)
{
"schema": "capture_columns_v1",
"build_label": "october-fest-2026-rc2",
"native": {
"width": 1280,
"height": 800,
"png_path": "release-evidence/deck/captures/native_1280x800.png",
"png_sha256": "cc33…"
},
"scaled": {
"width": 1280,
"height": 800,
"png_path": "release-evidence/deck/captures/scaled_steam_slot.png",
"png_sha256": "dd44…"
},
"parity_delta_px": 0,
"letterbox_detected": false
}
deck_aspect_reset_receipt_v1.json
{
"schema": "deck_aspect_reset_receipt_v1",
"build_label": "october-fest-2026-rc2",
"gamescope_reset_path": "release-evidence/deck/gamescope_reset_v1.json",
"capture_columns_path": "release-evidence/deck/capture_columns_v1.json",
"user_wipe_ritual": "delete user://display_state.cfg + restart",
"godot_stretch_mode": "viewport",
"godot_viewport_size": "1280x800",
"cousin_receipts": {
"deck_static_menu": "release-evidence/deck/DECK_STATIC_MENU_RECEIPT.json",
"hdr_steam_capture": "release-evidence/marketing-and-demo/steam/HDR_STEAM_CAPTURE_EXPORT_RECEIPT.json"
},
"gates": {
"D1_build_label": "pass",
"D2_gamescope_reset": "pass",
"D3_user_wipe": "pass",
"D4_godot_viewport": "pass",
"D5_capture_columns": "pass",
"D6_build_receipt": "pass"
},
"deck_aspect_reset_ok": true,
"store_capture_promotion_allowed": true
}
Pin under release-evidence/deck/DECK_ASPECT_RESET_RECEIPT.json.
BUILD_RECEIPT row (D6)
| Column | Pass when |
|---|---|
deck_aspect_reset |
deck_aspect_reset_ok: true |
deck_static_menu |
Cousin Lesson 218 independent column |
hdr_steam_capture |
Cousin Lesson 254 independent column |
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
deck_aspect_reset_blocked BOOLEAN NOT NULL DEFAULT false;
Thursday row review — Deck aspect reset line: Gamescope + capture columns Y/N.
Key takeaways
- GPU idle ≠ aspect truth—Lesson 218 and 255 are parallel fest columns.
- Desk play before Deck capture is the repro—reset Gamescope every time.
capture_columns_v1.jsonproves native vs scaled parity before store upload.- Pair 16 Deck log tools when letterbox follows Proton regressions.
- Lesson 254 owns HDR stills—run 255 before trusting gallery PNGs on Deck.
- Deck Verified refresh — cert lane context.
- Cousin: Lesson 256 Construct CSV UTF-8 handoff—parallel October string-freeze column.
- October capstone 265 will wire 254–264—this row is D5 in that arc.
- Community playtest resources — facilitator README for capture ritual.
- Top 20 receipts hub — Deck aspect row in fest→public map.
Common mistakes
- Filing 218 while captures still letterboxed—GPU GREEN ≠ geometry GREEN.
- Skipping
user://wipe—Gamescope reset alone leaves Godot display keys (D3 fail). - Editor F5 capture instead of installed Deck build (D1/D5 fail).
- Merging
deck_aspect_reset_receiptintodeck_static_menu_receipt. - Promoting Lesson 254 PNGs taken before 255 reset.
Troubleshooting
| Symptom | Lane |
|---|---|
| Black bars only on Deck | D2/D3 Gamescope + user:// |
| Squashed HUD, no bars | D4 Godot stretch / viewport |
| Native ≠ scaled dimensions | D5 capture column audit |
| Proton crash after reset | Deck log listicle |
| Menu GPU pegged | Lesson 218 — separate column |
Mini exercise (40 minutes)
- Reproduce letterbox after 1440p desk session.
- Run Gamescope reset; log flags before/after.
- Wipe
user://display keys; relaunch installed build. - Fill
capture_columns_v1.jsonfor native + scaled. - File receipt; BUILD_RECEIPT GREEN.
Continuity — October–Q4 2026 fest ops truth (254–265)
| Lesson | Receipt focus |
|---|---|
| 254 | DaVinci HDR → SDR Steam captures |
| 255 (this) | Godot Deck letterbox / Gamescope reset |
| 256 | Construct Weblate CSV UTF-8 |
| 265 | October ops capstone (queued) |
Previous: Lesson 254 — DaVinci HDR tonemap SDR Steam capture
Next: Lesson 256 — Construct Weblate CSV UTF-8 handoff
FAQ
Same as Lesson 218?
218 = static menu + GPU idle; 255 = aspect / Gamescope reset after desk play.
Same as the Godot guide chapter?
Guide = D1–D6 checklist; 255 = BUILD_RECEIPT promotion.
Need MangoHud idle again?
Only if your gate ties both—columns are independent by default.
Unreal SKU?
Use UE Deck static lighting preflight for GPU; aspect resets are still Gamescope + capture discipline.
October Deck captures lie after 1440p desk play—reset Gamescope, wipe display state, prove native vs scaled columns, then deck_aspect_reset_ok before store gallery promotion.