Your First GameMaker Steam setlive Branch Dry-Run Receipt Before Fest Promotion in One Evening - 2026
gm_steam_partner_ok is true. Wednesday smoke was GREEN. You run setlive on the fest branch—and players still download last week's default build. Steamworks shows upload success. Your Discord says "we're live." The demo is not.
December 2026 GameMaker teams pass partner sanity and export gates then fail setlive because the branch pointer never moved from default to nextfest-dec-2026. 12 setlive preflight checks own the printable checklist—this Tutorials & Beginner-First guide closes the GameMaker branch dry-run gap in one evening: screenshot Steamworks Branches, run staging build_app against the fest branch VDF, file gm_steam_setlive_dry_run_receipt_v1.json, set setlive_dry_run_ok on BUILD_RECEIPT before real setlive.
Non-repetition note: 12 setlive checks owns twelve-check listicle; Lesson 262 owns P1–P6 partner identity; export evening owns G1–G5 folder; setlive dry-run preflight (Guide) owns ninety-second S1–S6; Lesson 270 forward owns BUILD_RECEIPT milestone. This URL is the beginner evening path between partner receipt and fest promotion.
Why this matters now (December 2026)
- Partner ≠ branch —
DepotOwnedByOtherAccountis fixed; wrong branch is the new Thursday burn. - GameMaker upload cadence — Teams upload Friday;
setliveMonday without dry-run on fest branch name. - Playtest vs fest — Playtest isolation requires
surface: fest_publicand branch screenshot proof. - Visible build label — Label opinion fails when branch points at old
build_label. - Receipt chain —
gm_steam_partner_ok→setlive_dry_run_ok→setlive_allowedmust be ordered.
Direct answer: Screenshot fest branch in Steamworks; run staging build_app with VDF whose branch key matches screenshot; archive log; file gm_steam_setlive_dry_run_receipt_v1.json with S1–S6 pass; set setlive_dry_run_ok: true before production setlive.
Who this is for and what you get
| Audience | You will be able to… |
|---|---|
| Beginner GameMaker Steam exporter | Capture branch screenshot + dry-run log |
| Solo dev | Stop promoting default by habit |
| Producer | Gate setlive on receipt |
| Working dev | Wire staging app ID + jq fail-closed |
Time: ~90–120 minutes first evening; 15 minutes per promotion after template.
Prerequisites: Lesson 262 P5 GREEN or equivalent gm_steam_partner_ok; fest branch name in runbook; steamcmd access.
What you will have after one evening
- Steamworks Branches screenshot (
fest_branch_screenshot.png) - Staging
app_build_fest.vdfwith explicit branch key build_app_staging_dry_run_<date>.loggm_steam_setlive_dry_run_receipt_v1.jsonpassing S1–S6- BUILD_RECEIPT columns
setlive_dry_run_ok,fest_branch release-evidence/steam/gamemaker-setlive/README.md
Beginner checkbox
| # | Bad habit | Fix tonight |
|---|---|---|
| 1 | setlive on default |
S1 screenshot proves fest branch |
| 2 | Skip staging dry-run | S2 log before production |
| 3 | VDF branch typo | S4 crosswalk screenshot ↔ VDF |
| 4 | Partner receipt stale | Re-run 262 if actor changed |
| 5 | Promote without receipt | S6 before setlive |
Evening overview (four blocks)
| Block | Minutes | Output |
|---|---|---|
| A — Branch screenshot | 20–25 | S1 PNG |
| B — Staging VDF | 25–35 | Fest branch in app_build |
| C — Dry-run log | 25–35 | S2 staging log |
| D — Receipt + BUILD_RECEIPT | 20–30 | JSON + columns |
Run after partner P5 and before production setlive—pair Thursday row review.
Gates S1–S6
Align with setlive dry-run preflight (Guide).
| Gate | Check | Fail when |
|---|---|---|
| S1 | Branches tab screenshot | Fest branch not shown or name mismatch |
| S2 | Staging build_app dry-run |
Auth fail or branch parse error |
| S3 | build_label on BUILD_RECEIPT matches smoke |
Drift vs Wednesday receipt |
| S4 | VDF "branch" matches screenshot |
Typo nextfest-dec vs nextfest-dec-2026 |
| S5 | Fail-closed jq | setlive without setlive_dry_run_ok |
| S6 | Receipt filed | Missing JSON |
Promotion rule: setlive_allowed is true only when S1–S6 pass, gm_steam_partner_ok true, and Wednesday smoke S4–S6 GREEN on same build_label.
Branch pointer vs depot upload (beginner mental model)
Many first-time Steam exporters confuse uploading bytes to a depot with moving the live branch pointer. They are different operations:
| Action | What changes | What players see |
|---|---|---|
| Depot upload | New build ID exists in Steamworks | Often nothing until branch points at it |
setlive / branch promotion |
Branch pointer moves to a build ID | Download updates on that branch |
| Default branch | Store page default install target | Most fest traffic if you never promote fest branch |
GameMaker teams export Friday, upload successfully, and celebrate in Discord—while default still serves last month’s jam build. The fix is not re-exporting; it is proving tonight that your VDF SetLive (or equivalent branch key in your runbook) targets nextfest-dec-2026 (or your documented fest name) before you run production setlive.
Pair depot and branch discipline when Unity or Godot teammates share the same Steamworks app—branch names must be one runbook string, not three Slack variants.
Sample BUILD_RECEIPT row (after S6)
{
"build_label": "nextfest-dec-2026-rc3",
"engine": "gamemaker_2024",
"surface": "fest_public",
"fest_branch": "nextfest-dec-2026",
"gm_steam_partner_ok": true,
"setlive_dry_run_ok": true,
"setlive_allowed": true,
"gm_steam_setlive_dry_run_receipt_path": "release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json",
"demo_smoke": {
"promotion_allowed": true,
"receipt_path": "release-evidence/03-builds/demo_smoke_receipt_v1.json"
}
}
Thursday row review should diff fest_branch and setlive_dry_run_ok alongside build_label—a GREEN smoke with setlive_dry_run_ok: false means you uploaded a good binary to the wrong promotion story.
Multi-depot GameMaker teams (working dev)
Some GameMaker projects ship Windows demo depot + optional content depot. For dry-run:
- List every depot ID in
gm_steam_setlive_dry_run_receipt_v1.jsonunderdepot_ids. - Confirm all depots in VDF match Steamworks Depots tab (cousin of Lesson 262 P4).
- Run one staging dry-run that includes every mapped depot—partial mapping passes locally and fails at
setlive.
Document depot_ids in receipt so producers do not promote after only the exe depot uploaded.
Block A — Steamworks Branches screenshot (S1)
- Steamworks → App Admin → SteamPipe → Branches.
- Locate fest branch (e.g.
nextfest-dec-2026)—notdefaultunless runbook says so. - Screenshot showing branch name, build ID (if assigned), description.
- Save
release-evidence/steam/gamemaker-setlive/fest_branch_screenshot_2026-12-09.png.
Pin branch name in README—every VDF and BUILD_RECEIPT row uses exact string.
Cross-read depot and branch discipline for multi-engine teams.
Block B — Staging VDF with fest branch (S4)
GameMaker teams often maintain app_build_demo.vdf. For dry-run, copy to staging and set branch explicitly:
"AppBuild"
{
"AppID" "1234560"
"Desc" "GameMaker fest staging dry-run"
"BuildOutput" "C:\\build\\steam\\output"
"Depots"
{
"1234561"
{
"FileMapping"
{
"LocalPath" "C:\\build\\gamemaker\\SteamDemo\\*"
"DepotPath" "."
"recursive" "1"
}
}
}
"SetLive" "nextfest-dec-2026"
}
S4 pass: "SetLive" string byte-identical to S1 screenshot branch name.
Staging app pattern: Some teams use separate staging App ID—if so, document in receipt staging_app_id and never run production setlive against staging VDF. This tutorial assumes same app, fest branch dry-run only.
Pair Godot VDF LF evening when Linux CI parses VDF—GameMaker on Windows still benefits from LF if CI uploads.
Block C — Staging dry-run (S2)
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_2026-12-09.log
| Log signal | Action |
|---|---|
DepotOwnedByOtherAccount |
Return to Lesson 262 |
| Branch / SetLive error | Fix S4 VDF |
| Build finished OK | Proceed S3/S6 |
| Queue idle after OK | Wall-clock trend—not branch failure |
S2 note: Dry-run proves branch + depot mapping—not that players downloaded yet.
Block D — gm_steam_setlive_dry_run_receipt_v1.json
{
"schema": "gm_steam_setlive_dry_run_receipt_v1",
"build_label": "nextfest-dec-2026-rc3",
"engine": "gamemaker_2024",
"app_id": "1234560",
"fest_branch": "nextfest-dec-2026",
"fest_branch_screenshot": "release-evidence/steam/gamemaker-setlive/fest_branch_screenshot_2026-12-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-12-09.log",
"surface": "fest_public",
"cousin_receipts": {
"gm_steam_partner": "release-evidence/steam/GM_STEAM_PARTNER_RECEIPT.json",
"gm_steam_export": "release-evidence/gamemaker/gamemaker_steam_export_receipt_v1.json",
"depot_owner_checklist": "release-evidence/steam/depot_owner_receipt_v1.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
}
BUILD_RECEIPT columns
| Column | Example |
|---|---|
setlive_dry_run_ok |
true |
fest_branch |
nextfest-dec-2026 |
gm_steam_setlive_dry_run_receipt_path |
release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json |
gm_steam_partner_ok |
true (cousin) |
surface |
fest_public |
Lesson 270 forward wires promotion gates.
S5 — Fail-closed jq
jq -e '.setlive_dry_run_ok == true' release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json
jq -e '.fest_branch == "nextfest-dec-2026"' release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json
Block production setlive script unless both exit 0.
Developer path — promotion week order
| Step | Artifact | Owner |
|---|---|---|
| 1 | Export G1–G5 | Export evening |
| 2 | Partner P1–P6 | Lesson 262 |
| 3 | Upload to depot | Engineering |
| 4 | This dry-run | Release owner |
| 5 | Wednesday smoke | Producer |
| 6 | Production setlive |
Release owner |
| 7 | Thursday row diff | Thursday review |
Relationship to checklist vs partner vs export
| Artifact | Role |
|---|---|
| This tutorial | One-evening branch dry-run |
| 12 setlive checks | Printable 12-check list |
| Lesson 262 | Partner identity |
| Export evening | Folder sanity |
| Partner preflight | P1–P6 ninety-second |
| Resource #25 | steamcmd validation tools |
Common mistakes
setliveon default — S1 screenshot catches.- Branch name in Discord ≠ VDF — S4 crosswalk.
- Skipping staging — production
setlivewithout S2 log. - Partner OK but wrong surface —
playtest_inviteon BUILD_RECEIPT. - Old
build_labelon branch — S3 vs smoke receipt. - Confusing queue delay with branch fail — Wall-clock trend.
- Filing receipt before dry-run completes — S2 log must exist.
Troubleshooting
| Symptom | Lane |
|---|---|
| Players get old build | Wrong branch—re-check S1/S4 |
SetLive invalid |
Branch not created in Steamworks |
| Dry-run OK, smoke RED | Binary lane—not branch |
DepotOwnedByOtherAccount |
Lesson 262 |
| VDF parse Linux CI | Godot VDF LF cousin |
Promotion week calendar (Friday → Monday)
| Day | Owner | Task | Gate |
|---|---|---|---|
| Friday | Engineering | Export + depot upload | G1–G5 + upload log |
| Friday PM | Release | S1 branch screenshot | S1 |
| Saturday | Release | Staging VDF + dry-run | S2, S4 |
| Sunday | Producer | File receipt + BUILD_RECEIPT | S3, S6 |
| Monday AM | QA | Wednesday smoke early if fest is Tuesday | Smoke S4–S6 |
| Monday PM | Release | Production setlive |
Only if all GREEN |
Solo studios compress Saturday–Sunday into this one evening—the calendar still matters so you do not run production setlive before smoke proves the same build_label you filed in the receipt.
If your fest goes live Tuesday, run smoke Monday even when upload was Friday—branch pointer discipline does not replace binary boot proof.
Worked example — Friday upload, Monday setlive
| Step | Action | Result |
|---|---|---|
| 1 | Upload depot Friday | Build ID assigned |
| 2 | Screenshot nextfest-dec-2026 |
S1 pass |
| 3 | Staging dry-run | S2 log OK |
| 4 | build_label matches smoke |
S3 pass |
| 5 | File receipt | setlive_dry_run_ok: true |
| 6 | Production setlive |
Players get rc3 |
Lesson learned: Upload succeeded to depot—but setlive never targeted fest branch until dry-run proved VDF SetLive string.
Discord stand-up one-liner
gm_steam_partner_ok+setlive_dry_run_okonnextfest-dec-2026—staging log clean, production setlive after smoke.
Proof table
| Row | Evidence | Pass |
|---|---|---|
| Branch screenshot | S1 PNG | Name visible |
| Staging log | S2 file | No ownership error |
| BUILD_RECEIPT label | S3 | Matches smoke |
| VDF SetLive | S4 | Matches screenshot |
| jq | S5 | Exit 0 |
| Receipt | S6 | setlive_dry_run_ok: true |
Seven scenarios (A–G)
| ID | Situation | Correct response |
|---|---|---|
| A | First fest setlive |
Run full S1–S6 tonight |
| B | Partner fail | Fix 262 before branch |
| C | Branch typo | S4 before re-upload |
| D | Smoke RED | No setlive |
| E | Queue hours after OK | Wall-clock trend |
| F | Contractor changed branch | New S1 screenshot |
| G | Skipped receipt | Roll back pointer |
Staging vs production setlive script (sketch)
#!/usr/bin/env bash
set -euo pipefail
RECEIPT="release-evidence/steam/gamemaker-setlive/GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json"
jq -e '.setlive_dry_run_ok == true' "$RECEIPT"
# production setlive only after Wednesday smoke GREEN
# steamcmd +app_set_config ... +commit ...
Document production commands in runbook—this post owns receipt discipline, not every SteamPipe flag.
Cousin receipt chain (GameMaker Steam lane)
gamemaker_steam_export_receipt_v1.json → export G1–G5
gm_steam_partner_receipt_v1.json → partner P5
gm_steam_setlive_dry_run_receipt_v1.json → setlive_dry_run_ok (this evening)
depot_owner_receipt_v1.json → twelve-check listicle cousin
Keep build_label aligned across all four for Thursday row review.
Facilitator README snippet
## Before GameMaker fest setlive
1. Confirm `gm_steam_partner_ok: true` (Lesson 262 / partner preflight).
2. Screenshot Steamworks Branches tab for `nextfest-dec-2026`.
3. Run staging `build_app` with VDF `SetLive` matching screenshot.
4. File GM_STEAM_SETLIVE_DRY_RUN_RECEIPT.json with S1–S6 pass.
5. Wednesday smoke GREEN on same `build_label`.
6. Production `setlive` only when jq gates pass.
Tools and sibling reads
- 12 setlive checks
- GameMaker export evening
- Lesson 262
- Playtest isolation
- Visible build label
- Steamworks uploading docs
- 10-free steamcmd validation resources
Key takeaways
- Partner receipt ≠ branch pointer—dry-run proves
SetLivetarget. - One evening wires screenshot, staging log, receipt, BUILD_RECEIPT columns.
- S4 VDF branch string must match S1 screenshot exactly.
- Fail-closed jq before production
setlive. - 12 setlive checks check 7 pairs this tutorial for GameMaker.
- Lesson 262 must be GREEN before S2.
- Guide preflight holds ninety-second S1–S6; this post holds evening blocks.
surface: fest_publicrequired with fest branch—not playtest invite.- Thursday row review diffs
fest_branchcolumn. - Blender hero glTF diligence evening when mirror week is next.
FAQ
Is staging App ID required?
No—document if you use one; never mix staging VDF with production setlive.
Same as depot_owner_receipt?
Listicle cousin—gm_steam_setlive_dry_run is GameMaker branch-specific evening path.
Can Godot teams use this JSON?
Schema is GameMaker lane—use same S1–S6 spirit with engine-specific paths.
How does this relate to Lesson 270?
Lesson 270 promotes receipt into BUILD_RECEIPT—run this evening first.
What if branch already has old build?
setlive moves pointer—dry-run still proves VDF targets correct branch name.
Does dry-run replace Wednesday smoke?
No—smoke proves binary; dry-run proves branch discipline.
Conclusion
December GameMaker fest promotion fails quietly when setlive targets the wrong branch. One evening: screenshot Branches, staging dry-run, crosswalk VDF, file receipt, set setlive_dry_run_ok—then run production setlive after smoke.
Next reads: setlive dry-run preflight (Guide), 12 setlive checks, Lesson 262, Lesson 270 forward, export evening.
Pin fest branch screenshot beside your app_build VDF before Monday setlive—not after players report the wrong demo build.