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).

Lesson hero for GameMaker Steam setlive branch dry-run receipt

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

  1. Steamworks → App AdminSteamPipeBranches.
  2. Locate fest branch (e.g. nextfest-nov-2026)—not default unless runbook says so.
  3. Screenshot showing branch name + build ID (if assigned).
  4. 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

  1. Upload ≠ setlive—prove branch pointer before promotion.
  2. Screenshot + VDF string must match byte-for-byte (S1/S4).
  3. Staging dry-run before production setlive (S2).
  4. Run setlive evening tutorial before this milestone if team never pinned fest branch.
  5. Guide #32 preflight owns ninety-second gate; 270 owns BUILD_RECEIPT promotion.
  6. 12 setlive checks own printable checklist—270 owns receipt column.
  7. Help #27 forward owns DepotOwnedByOtherAccount fix—branch lane is separate.
  8. 12-free GameMaker Steam resources bookmark export folder cousin.

Common mistakes

  • setlive on default while screenshot shows fest branch (S1 fail).
  • Typo in SetLive string—nextfest-nov vs nextfest-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_ok cousin receipt.
  • Merging gm_steam_setlive_dry_run_receipt with gm_steam_partner_receipt schemas.

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)

  1. Pin fest branch in README—log S1 screenshot path.
  2. Run S2 staging dry-run—grep log for errors.
  3. Crosswalk S3 build_label against Wednesday smoke receipt.
  4. Compare S4 VDF SetLive to screenshot spelling.
  5. Wire S5 jq gate in release workflow tail.
  6. 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.