Lesson 270: GameMaker Steam setlive Branch Dry-Run Receipt on BUILD_RECEIPT (2026)
Direct answer: Before November 2026 GameMaker teams run production setlive, promote gm_steam_setlive_dry_run_receipt_v1.json with S1–S6 gates—capture a Steamworks Branches screenshot, run a staging build_app dry-run, crosswalk build_label on BUILD_RECEIPT, prove VDF SetLive string matches the screenshot byte-for-byte, and fail-close setlive_dry_run_ok before branch promotion. Pair setlive dry-run preflight (Guide #32), setlive evening tutorial, and cousin Lesson 262 (partner identity—not branch pointer).

Why this matters now (November GameMaker branch promotion)
November 2026 GameMaker teams pass Lesson 262 P1–P6 partner identity, upload a green depot Friday, and leave default serving last month's jam build because nobody proved the fest branch pointer before setlive. Depot upload ≠ branch promotion—players on nextfest-nov-2026 see nothing until SetLive targets the documented fest string.
Lesson 269 wires Godot VDF LF on BUILD_RECEIPT; 270 wires GameMaker setlive dry-run so Wednesday smoke and Thursday row review diff a real branch story—not a silent default promotion.
Beginner path (screenshot → dry-run → receipt)
| Step | Action | Success check |
|---|---|---|
| 1 | Screenshot Steamworks Branches tab | Fest branch name visible (S1) |
| 2 | Run staging build_app dry-run |
Log OK; no auth/branch parse error (S2) |
| 3 | Crosswalk build_label on BUILD_RECEIPT |
Matches Wednesday smoke receipt (S3) |
| 4 | Compare VDF "SetLive" to screenshot |
Byte-identical branch string (S4) |
| 5 | Wire fail-closed jq before setlive |
S5 blocks when receipt false |
| 6 | File receipt + BUILD_RECEIPT column | setlive_dry_run_ok: true |
Time: ~50 minutes first fest branch pin; ~12 minutes when branch name is documented in README.
Developer path (gates S1–S6)
| Gate | Check | Fail when |
|---|---|---|
| S1 | Branches tab screenshot | Fest branch missing or typo |
| S2 | Staging build_app dry-run |
Auth, depot, or branch parse error |
| S3 | build_label crosswalk |
Smoke receipt label drift |
| S4 | VDF SetLive vs screenshot |
nextfest-dec vs nextfest-dec-2026 |
| S5 | Fail-closed promotion jq | setlive without setlive_dry_run_ok |
| S6 | Receipt + BUILD_RECEIPT | Promote before S5 GREEN |
Align with Guide #32 preflight—guide = ninety-second gate; 270 = BUILD_RECEIPT milestone with promotion jq.
Cousin receipt crosswalk
| Field | Cousin (partner Lesson 262) | Cousin (evening tutorial) | This lesson (270) |
|---|---|---|---|
| Schema | gm_steam_partner_receipt_v1 |
blocks A–D evening path | gm_steam_setlive_dry_run_receipt_v1 |
| Scope | Partner identity + depot ownership | First-evening branch dry-run | BUILD_RECEIPT setlive column |
| Path | release-evidence/steam/ |
release-evidence/steam/gamemaker-setlive/ |
release-evidence/steam/gamemaker-setlive/ |
Do not merge schemas—reference paths in cousin_receipts only.
S1 — Steamworks Branches screenshot
- Steamworks → App Admin → SteamPipe → Branches.
- Locate fest branch (e.g.
nextfest-nov-2026)—notdefaultunless runbook says so. - Screenshot showing branch name + build ID (if assigned).
- Save
release-evidence/steam/gamemaker-setlive/fest_branch_screenshot_<date>.png.
Producer rule: Pin exact branch string in release-evidence/steam/gamemaker-setlive/README.md—every VDF and BUILD_RECEIPT row uses same spelling.
S2 — Staging dry-run log
steamcmd +login "$STEAM_PARTNER_USER" "$STEAM_PARTNER_PASS" \
+run_app_build "C:\build\steam\app_build_fest_staging.vdf" \
+quit 2>&1 | tee release-evidence/steam/gamemaker-setlive/build_app_staging_dry_run.log
| Log signal | Lane |
|---|---|
DepotOwnedByOtherAccount |
Lesson 262 P1–P6 |
| Branch / SetLive error | Fix S4 VDF |
| Build finished OK | Proceed S3/S6 |
| Queue idle after OK | Wall-clock trend |
S3 — build_label crosswalk
jq -r '.build_label' release-evidence/BUILD_RECEIPT.json
jq -r '.build_label' release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json
Must match Wednesday smoke receipt build_label.
S4 — VDF SetLive branch string
"SetLive" "nextfest-nov-2026"
Pass: string byte-identical to S1 screenshot branch name.
Pair Godot VDF LF Lesson 269 when Linux CI parses multi-engine VDF on same runner.
S5 — Fail-closed jq (CI tail)
jq -e '.setlive_dry_run_ok == true' release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json
jq -e '.fest_branch == "nextfest-nov-2026"' release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json
Block production setlive script unless both exit 0.
S6 — gm_steam_setlive_dry_run_receipt_v1.json
{
"schema": "gm_steam_setlive_dry_run_receipt_v1",
"build_label": "nextfest-nov-2026-rc3",
"engine": "gamemaker_2024",
"app_id": "1234560",
"fest_branch": "nextfest-nov-2026",
"fest_branch_screenshot": "release-evidence/steam/gamemaker-setlive/fest_branch_screenshot_2026-11-09.png",
"staging_vdf_path": "build/steam/app_build_fest_staging.vdf",
"staging_dry_run_log": "release-evidence/steam/gamemaker-setlive/build_app_staging_dry_run_2026-11-09.log",
"surface": "fest_public",
"cousin_receipts": {
"gm_steam_partner": "release-evidence/steam/GM_STEAM_PARTNER_RECEIPT.json",
"vdf_lf": "release-evidence/steam/vdf-lf/VDF_LINE_ENDING_RECEIPT.json"
},
"gates": {
"S1_branch_screenshot": "pass",
"S2_staging_dry_run": "pass",
"S3_build_label_crosswalk": "pass",
"S4_vdf_branch_match": "pass",
"S5_fail_closed": "pass",
"S6_receipt": "pass"
},
"setlive_dry_run_ok": true,
"setlive_allowed": true
}
Pin under release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json.
BUILD_RECEIPT columns (November lane)
| Column | Source | Pass when |
|---|---|---|
gm_steam_partner_ok |
Lesson 262 cousin | true |
setlive_dry_run_ok |
S5 jq | true |
setlive_allowed |
S6 receipt | true only after smoke GREEN |
vdf_lf_ok |
Lesson 269 cousin | true when Godot lane active |
Key takeaways
- Upload ≠ setlive—prove branch pointer before promotion.
- Screenshot + VDF string must match byte-for-byte (S1/S4).
- Staging dry-run before production
setlive(S2). - Run setlive evening tutorial before this milestone if team never pinned fest branch.
- Guide #32 preflight owns ninety-second gate; 270 owns BUILD_RECEIPT promotion.
- 12 setlive checks own printable checklist—270 owns receipt column.
- Help #27 forward owns
DepotOwnedByOtherAccountfix—branch lane is separate. - 12-free GameMaker Steam resources bookmark export folder cousin.
Common mistakes
setliveondefaultwhile screenshot shows fest branch (S1 fail).- Typo in
SetLivestring—nextfest-novvsnextfest-nov-2026(S4). - Green depot upload without branch promotion—players see old build.
- Skipping S2 because "upload worked last week."
- Promoting without
gm_steam_partner_okcousin receipt. - Merging
gm_steam_setlive_dry_run_receiptwithgm_steam_partner_receiptschemas.
Troubleshooting
| Symptom | Lane |
|---|---|
| Players get old fest build | Re-check S1/S4 branch string |
DepotOwnedByOtherAccount |
Lesson 262 |
| Auth vs queue delay | Wall-clock trend |
| Linux CI VDF parse | Lesson 269 |
Wrong build_label on smoke |
S3 crosswalk BUILD_RECEIPT |
Mini exercise (50 minutes)
- Pin fest branch in README—log S1 screenshot path.
- Run S2 staging dry-run—grep log for errors.
- Crosswalk S3
build_labelagainst Wednesday smoke receipt. - Compare S4 VDF
SetLiveto screenshot spelling. - Wire S5 jq gate in release workflow tail.
- File receipt; BUILD_RECEIPT GREEN for
setlive_dry_run_ok.
Continuity — November 2026 fest close-out + playtest triage (266–276)
| Lesson | Receipt focus |
|---|---|
| 269 | Godot VDF LF |
| 270 (this) | GameMaker setlive dry-run |
| 271 | Blender diligence mirror (forward) |
Previous: Lesson 269 — Godot export VDF LF line ending steamcmd receipt
Next: Lesson 271 — Blender diligence hero GLB rclone mirror receipt
FAQ
Same as evening tutorial?
Evening owns blocks A–D first path; 270 owns gm_steam_setlive_dry_run_receipt_v1 BUILD_RECEIPT column + S5 jq.
Same as Guide #32?
Guide = ninety-second preflight; 270 = course milestone with promotion jq + cousin crosswalk.
Same as Lesson 262?
262 = partner identity P1–P6; 270 = branch dry-run S1–S6 after partner GREEN.
Same as 12 setlive checks?
Checklist owns partner + branch discipline; 270 owns receipt JSON on BUILD_RECEIPT.
Does this replace Wednesday smoke?
No—binary smoke is separate; 270 stops false-green branch promotion before setlive.
Does this replace Lesson 269?
No—269 = Godot VDF LF; 270 = GameMaker setlive. Multi-engine studios file both.
Fest players never see your Friday upload until branch screenshot, VDF SetLive, and dry-run receipt agree—then promote.