12 Pre-Flight Checks Before steamcmd setlive on October Fest Branch Promotion - 2026
Thursday lunch: someone runs setlive on the October fest branch. Steamworks shows queued. Discord celebrates. Friday morning: DepotOwnedByOtherAccount in the upload log—or worse, players install a build from last week's playtest depot because the branch pointer never moved.
October 2026 micro-studios share laptops with contractors, run steamcmd from CI secrets scraped off a producer's personal Steam machine, and promote during the same week as Addressables group moves. Green upload badges lie when partner identity, branch name, and BUILD_RECEIPT build_id disagree. This Listicles & Resource Roundups post is a printable twelve-check gate before steamcmd setlive—not another store-metadata FAQ audit.
Non-repetition note: Depot and branch discipline owns naming policy; GameMaker partner preflight owns P1–P6 GameMaker lane; Wednesday demo smoke owns binary golden path. This URL owns setlive promotion checklist + depot_owner_receipt_v1.json.
Why this matters now (October 2026)
DepotOwnedByOtherAccountspikes when contractors share laptops—personal Steam vs studio partner.- Fest crunch defer lists — Founder time-box worksheet says stop burning Thursday on wrong partner—not queue retries.
- Multi-engine teams — Unity, Godot, GameMaker share one Steamworks app; identity drift is engine-agnostic.
- CI + human setlive — Runner
config.vdf≠ producer laptop ≠ IDE session. - Receipt culture — Thursday row review needs
steam_partner_idandsetlive_allowedcolumns—not vibes.
Direct answer: Run checks 1–12 in order; file depot_owner_receipt_v1.json; set setlive_allowed: true only when no DepotOwnedByOtherAccount in dry-run log and Wednesday smoke S4–S6 are GREEN on the same build_label.
Who this checklist is for
| Audience | You will use this list to… |
|---|---|
| Beginner | Print one page and check boxes before clicking setlive |
| Producer | Block promotion when check 8 or 11 fails |
| Engineer | Wire dry-run logs + receipt JSON in CI |
| Contractor | Prove partner login before touching app_build_*.vdf |
Time: ~20 minutes first fest promotion; ~8 minutes when screenshots and VDF paths are pinned.
Beginner path — print this page
Copy into release-evidence/steam/SETLIVE_PREFLIGHT_CHECKLIST.md:
# setlive preflight — October fest (12 checks)
Date: __________ build_label: __________ App ID: __________
[ ] 1. BUILD_RECEIPT build_id matches target branch build
[ ] 2. Wednesday demo smoke S4–S6 GREEN (same build_label)
[ ] 3. Steamworks App Admin screenshot < 7 days old
[ ] 4. steamcmd config.vdf = studio partner (not personal)
[ ] 5. app_build VDF App ID matches Steamworks
[ ] 6. Depot IDs in VDF match Steamworks Depots tab
[ ] 7. Branch name = documented fest branch (not default)
[ ] 8. build_app dry-run log — no DepotOwnedByOtherAccount
[ ] 9. surface = fest_public (not playtest_invite) on receipt
[ ] 10. Player-visible build_label on promoted binary
[ ] 11. Thursday BUILD_RECEIPT row review pass
[ ] 12. depot_owner_receipt_v1.json filed — setlive_allowed true
Approver: __________ UTC: __________
Fail-closed: Any unchecked box → no setlive until fixed or producer waiver documented on BUILD_RECEIPT.
Developer path — receipt + CI tail
- Archive
build_appdry-run log beside VDF. - Pin Steamworks admin screenshot under
release-evidence/steam/. - Write
depot_owner_receipt_v1.jsonmapping checks 1–12. - Add BUILD_RECEIPT columns:
steam_partner_id,setlive_allowed,depot_owner_receipt_path. jq -e '.setlive_allowed == true'in CI beforesetlivestep runs.- Pair Lesson 270 forward for GameMaker-specific
setlivedry-run receipt cousin.
The twelve pre-flight checks
Check 1 — BUILD_RECEIPT build_id matches branch target
Open BUILD_RECEIPT and Steamworks Builds tab side by side.
| Field | Must match |
|---|---|
build_id / build_label |
Build you intend to assign to fest branch |
git.commit |
Commit that produced the depot content (if tracked) |
| Upload log row | Same buildid as Steamworks |
Fail: Receipt still lists last Tuesday's playtest build while VDF points at today's hotfix.
Check 2 — Wednesday demo smoke GREEN (S4–S6)
Wednesday smoke proves installed binary golden path—not compile-only CI.
| Gate | Block setlive when RED |
|---|---|
| S4 | Golden path start |
| S5 | 60s continuous play |
| S6 | Clean quit |
Pair Tuesday CSV ingest for async blocker counts—P0 > 0 blocks promotion unless waived.
Check 3 — Steamworks App Admin screenshot (< 7 days)
Capture before fest week:
- Steamworks → Users & Permissions → your app.
- Screenshot showing App ID, depot list, upload actor as App Admin.
- Save
release-evidence/steam/steamworks_app_admin_<appid>_<date>.png.
Red flag: Upload actor is Marketing-only or different legal entity than depot owner.
Check 4 — config.vdf partner login (not personal Steam)
| OS | Typical path |
|---|---|
| Windows | %ProgramFiles(x86)%\Steam\config\config.vdf |
| Linux CI | ~/.steam/steam/config/config.vdf |
Pass: Account name matches studio partner login in screenshot (check 3).
Fail: Personal @gmail or jam-game account from 2024.
CI rule: One mounted config.vdf secret per app—never reuse producer laptop personal Steam on ubuntu-latest. Cousin: GameMaker partner preflight P2.
Check 5 — app_build_*.vdf App ID crosswalk
"appid" "1234560"
Must match Steamworks App ID exactly—no transposed digits from contractor copy-paste.
Check 6 — Depot ID crosswalk
| Source | Field |
|---|---|
| Steamworks Depots tab | Depot ID |
| VDF | "depot" "1234561" |
Cross-read depot and branch discipline. Godot/Linux CI: verify VDF line endings before steamcmd parse (Help #31 forward).
Check 7 — Branch name = documented fest branch
| Wrong | Right |
|---|---|
default when fest uses nextfest-oct-2026 |
Branch name in BUILD_RECEIPT + runbook |
| Playtest branch pointer | fest_public demo branch per isolation playbook |
Screenshot Steamworks Branches tab; pin beside receipt.
Check 8 — build_app dry-run log (no DepotOwnedByOtherAccount)
Run before setlive:
steamcmd +login "$STEAM_PARTNER_USER" "$STEAM_PARTNER_PASS" \
+run_app_build_http /path/to/app_build_demo.vdf \
+quit 2>&1 | tee release-evidence/steam/build_app_dry_run_<date>.log
| Log line | Meaning |
|---|---|
DepotOwnedByOtherAccount |
Stop — checks 3–4–6 |
OK / build finished |
Proceed to check 12 |
| Auth churn / 2FA loop | Dedicated server login pattern per Steamworks uploading |
Help #27 forward owns fix lane for DepotOwnedByOtherAccount—this checklist catches it before setlive.
Check 9 — surface = fest_public on BUILD_RECEIPT
Playtest isolation fails when receipt says playtest_invite but you promote fest demo branch.
Pass: surface: fest_public + branch screenshot matches fest SKU.
Check 10 — Player-visible build_label on binary
Visible build label opinion requires players can report the same string as BUILD_RECEIPT—setlive without label correlation wastes support after promotion.
Check 11 — Thursday BUILD_RECEIPT row review pass
Thursday row review diffs build_id, surface, demo_smoke.promotion_allowed, and new steam_partner_id column.
Rule: Smoke GREEN + receipt RED → no setlive.
Check 12 — depot_owner_receipt_v1.json filed
{
"schema": "depot_owner_receipt_v1",
"build_label": "nextfest-oct-2026-rc5",
"app_id": "1234560",
"depot_ids": ["1234561"],
"fest_branch": "nextfest-oct-2026",
"steam_partner_id": "studio_partner_login",
"steamworks_admin_screenshot": "release-evidence/steam/steamworks_app_admin_1234560_2026-10-22.png",
"config_vdf_account": "studio_partner_login",
"build_app_dry_run_log": "release-evidence/steam/build_app_dry_run_2026-10-22.log",
"cousin_receipts": {
"demo_smoke": "release-evidence/03-builds/demo_smoke_receipt_v1.json",
"gm_steam_partner": "release-evidence/steam/GM_STEAM_PARTNER_RECEIPT.json"
},
"checks": {
"01_build_receipt_crosswalk": "pass",
"02_wednesday_smoke": "pass",
"03_app_admin_screenshot": "pass",
"04_config_vdf_partner": "pass",
"05_app_id_vdf": "pass",
"06_depot_id_vdf": "pass",
"07_fest_branch_name": "pass",
"08_build_app_dry_run": "pass",
"09_surface_fest_public": "pass",
"10_visible_build_label": "pass",
"11_thursday_row_review": "pass",
"12_receipt_filed": "pass"
},
"depot_owned_by_other_account": false,
"setlive_allowed": true
}
Pin under release-evidence/steam/DEPOT_OWNER_RECEIPT.json.
Minimum six-check stack (when time-boxed)
From fest week capacity worksheet—if you only have ten minutes:
| Priority | Check | Why |
|---|---|---|
| Must | 8 | DepotOwnedByOtherAccount |
| Must | 4 | Wrong partner login |
| Must | 2 | Binary smoke |
| Must | 7 | Wrong branch |
| Should | 3 | Admin proof |
| Should | 12 | Receipt audit trail |
Defer checks 5–6–9–10–11 only with producer waiver row—document on BUILD_RECEIPT.
Weekly ritual map (setlive week)
| Day | Ritual | This checklist |
|---|---|---|
| Tuesday | CSV ingest | Blockers scoped |
| Wednesday PM | Demo smoke | Check 2 |
| Thursday AM | Row review | Check 11 |
| Thursday PM | build_app dry-run | Check 8 |
| Thursday PM | setlive (if 1–12 pass) | Check 12 |
Engine-specific pointers (checks 5–6–8)
| Engine | Extra note |
|---|---|
| Unity | IL2CPP build in VDF content root—not Editor folder |
| Godot | Export preset path + VDF LF on Linux CI |
| GameMaker | Export sanity G2 + partner P1–P6 |
| Ren'Py | Wall-clock upload ≠ auth fail—cousin SteamPipe queue trend |
Common mistakes
- setlive from personal Steam on contractor laptop (check 4).
- Skipping dry-run because "upload worked last month" (check 8).
- Default branch promotion during fest week (check 7).
- Smoke on rc4, setlive rc3 (check 1).
- Marketing role actor on App Admin screenshot (check 3).
- No receipt before Discord announcement (check 12).
- Confusing queue delay with auth failure — grep log for
DepotOwnedByOtherAccountfirst.
CI jq gate (optional tail before setlive step)
#!/usr/bin/env bash
set -euo pipefail
REC="release-evidence/steam/DEPOT_OWNER_RECEIPT.json"
jq -e '.setlive_allowed == true' "$REC"
jq -e '.depot_owned_by_other_account == false' "$REC"
jq -e '.checks."08_build_app_dry_run" == "pass"' "$REC"
echo "setlive preflight OK"
Wire after Library cache bust jq gate on Addressables strip weeks—different failure class.
Seven scenarios (A–G)
| ID | Situation | Correct response |
|---|---|---|
| A | Dry-run shows DepotOwnedByOtherAccount |
Stop; run checks 3–4–6; Help #27 forward |
| B | Smoke GREEN on rc5, setlive targets rc4 | Fix check 1 BUILD_RECEIPT crosswalk |
| C | Contractor "upload worked" without log | Require check 8 log archive |
| D | Queue hours long, no error in log | SteamPipe wall-clock trend—do not skip check 8 |
| E | Marketing user on screenshot | Fail check 3; invite App Admin |
| F | playtest_invite surface on receipt |
Fail check 9; fix isolation map |
| G | Receipt filed before dry-run | Re-order: log first, then check 12 JSON |
Worked example — Thursday fest promotion afternoon
Context: build_label=nextfest-oct-2026-rc5, Unity Windows depot, contractor ran upload Tuesday.
| Time | Action | Check |
|---|---|---|
| 09:00 | Thursday row review | 11 |
| 10:00 | Verify Tuesday CSV P0=0 | scope |
| 11:00 | Re-read Wednesday smoke log | 2 |
| 13:00 | Fresh App Admin screenshot | 3 |
| 13:15 | Grep config.vdf on CI runner |
4 |
| 13:30 | VDF App/depot crosswalk | 5–6 |
| 14:00 | build_app dry-run + tee log |
8 |
| 14:30 | File depot_owner_receipt_v1.json |
12 |
| 15:00 | setlive (human or CI) |
all pass |
Lesson: Skipping 13:00 screenshot saved zero minutes—DepotOwnedByOtherAccount at 15:05 cost the rest of Thursday per defer list.
BUILD_RECEIPT wiring (producer one-pager)
Add these fields beside demo_smoke and library_cache_bust_ok on fest promotion rows:
{
"build_id": "nextfest-oct-2026-rc5",
"steam_partner_id": "studio_partner_login",
"setlive_allowed": true,
"depot_owner_receipt_path": "release-evidence/steam/DEPOT_OWNER_RECEIPT.json",
"fest_branch": "nextfest-oct-2026",
"notes": "Checks 1-12 pass 2026-10-22; dry-run log build_app_dry_run_2026-10-22.log"
}
Thursday row review diffs setlive_allowed against last promoted row—if last week was false and this week is true without new receipt path, R4–R7 fail.
Relationship to October ops cluster siblings
| Sibling | Angle |
|---|---|
| Cache bust tutorial | CI Library/ stale—not partner identity |
| Tuesday CSV ingest | Async blocker counts before smoke |
| Whisper tag extraction | VOD triage—not Steam upload |
| SteamPipe wall-clock trend | Queue wall-clock narrative—symptom differs from check 8 |
| Lesson 262 | GameMaker gm_steam_partner_receipt BUILD_RECEIPT milestone |
Order on strip + promote week: Addressables cache bust → Tuesday CSV → Wednesday smoke → Thursday row review → this checklist → setlive.
Contractor laptop policy (checks 3–4–8)
Pin in facilitator / contractor SOW:
| Rule | Why |
|---|---|
| No personal Steam login on upload machines | check 4 |
Studio config.vdf or server login only on CI |
check 4 |
| App Admin screenshot weekly during fest month | check 3 |
| Dry-run log attached to invoice milestone | check 8 |
No setlive without producer sign-off on checklist |
check 12 |
Pair multi-channel facilitator contract for who may run Steam commands.
Proof table
| Row | Evidence | Pass |
|---|---|---|
| Partner identity | Screenshot + config.vdf | Same login |
| Depot ownership | Dry-run log | No DepotOwnedByOtherAccount |
| Binary truth | Smoke receipt | S4–S6 GREEN |
| Branch truth | Branch screenshot | Matches check 7 |
| Audit | depot_owner_receipt_v1.json |
setlive_allowed: true |
Tools and sibling reads
- 18-free Steamworks resources
- Resource #25 forward — partner bookmark refresh
- Lesson 262 — GameMaker partner receipt
- jq + bash rclone mirror ID sanity — parallel Q4 diligence lane during fest week
- BUILD_RECEIPT beginner
- Official: Steamworks uploading builds, steamcmd
Key takeaways
- Twelve checks before
setlive—printable for producers, machine-readable in receipt JSON. DepotOwnedByOtherAccountis partner identity—check 8 before queue panic.- Wednesday smoke (check 2) and setlive (check 12) are different gates.
depot_owner_receipt_v1.jsonproves checks ran—not Slack celebration.- BUILD_RECEIPT needs
steam_partner_id+setlive_allowedcolumns. - GameMaker partner preflight deepens checks 3–4–8 for GM teams.
- Founder time-box defers wrong-partner Thursdays—this list prevents them.
- Thursday row review is check 11—non-optional.
- Help #27 forward fixes
DepotOwnedByOtherAccount; this list prevents it. - SteamPipe queue wall-clock trend covers queue wait—different failure mode.
FAQ
Can we setlive from Steamworks UI instead of steamcmd?
Yes—checks 1–3–7–9–10–11 still apply; file receipt with setlive_method: steamworks_ui.
What if dry-run passes but setlive fails?
Compare branch name and build ID assignment—check 7 and Steamworks Builds tab lag.
Contractor without App Admin?
Fail check 3—invite admin or have studio account run check 8.
Does this replace VDF LF preflight?
No—Linux CI parse errors are Help #31 cousin; run after checks 5–6 pass in UI.
Where does Lesson 270 fit?
GameMaker setlive dry-run BUILD_RECEIPT milestone—pairs checks 7–8 for GM.
Conclusion
setlive is not a victory lap—it is a pointer update that must match partner identity, branch name, smoke receipt, and BUILD_RECEIPT rows. Run twelve checks, archive dry-run logs, file depot_owner_receipt_v1.json, then promote.
Next reads: Thursday row review, Wednesday demo smoke, GameMaker partner preflight, Depot branch discipline.
Found this useful? Print the twelve-check block into release-evidence/steam/ before your next October fest promotion—not after DepotOwnedByOtherAccount burns Thursday.