We Recovered Wrong Steam Default Branch After Localization Capstone GREEN - 2026 Case Study

October 2026 is when micro-studios finally finish a localization capstone and feel safe. Then they run a “promotion” step that actually targets the wrong Steam branch, and players keep downloading the wrong bytes.
This is the pattern we recovered from:
- Localization capstone is GREEN (strings are aligned, weekly annex indexed).
- Teams treat that as a permission slip for the upload window and promotion steps.
- The Steam promotion command targets
default(or an equivalent fallback branch) instead of the fest-day / RC / upload target branch. setliveappears to succeed, but the player-installed footer still shows the older branch’sbuild_label.- The team “fixed it” by editing
BUILD_RECEIPTbooleans, not by fixing the actual live branch pointer.
This case study is a recovery narrative with no invented download counts, no fake player quotes, and no fabricated refund percentages. It gives you a failure signature, a B1–B6 recovery ladder, and the default_branch_recovery_receipt_v1.json gates so future you can grep what went wrong.
Pair Localization capstone #11, October upload dress rehearsal challenge, and the cousin February setlive mismatch case study. Forward the prevention habit with 12 pre-flight checks before steamcmd setlive, and for GameMaker-specific dry-run receipt structure see Course Lesson 270.
Non-repetition note:
February setlive mismatch owns label/depot mismatch after RC label receipt passed. This URL owns wrong Steam branch pointer after localization capstone GREEN—the “receipt theater” failure mode where the team believes upload permission equals live pointer truth.
Why this matters now (October 2026 upload week)
- Localization GREEN is not promotion truth. The capstone validates strings and weekly indexing, not which Steam branch is live.
defaultis a trap branch.defaultcan look “good enough” in a rushed promotion window because it often hosts old-but-working binaries.- Receipt theater scales with team size. Once
BUILD_RECEIPTsaysoctober_upload_window_allowed: true, people stop reading the Steam branch UI and start editing booleans. - Dry-run discipline gets skipped. Teams treat setlive dry-run as “required only when RC label drift is suspected,” but wrong branch pointer is a separate class of drift.
- Players prove the truth, not scripts. The only safe claim is when installed footer
build_labelmatches what you promoted and what you recorded.
Direct answer: Recover wrong Steam default promotions using:
- a player-installed label capture (B1),
- a Steam branch / setlive string audit (B2),
- a depot manifest audit against upload receipts (B3),
- a setlive dry-run on the correct target branch (B4),
- a production re-promote plus installed smoke (B5),
- and a master receipt
default_branch_recovery_receipt_v1.jsonwith B1–B6 gates (B6).
Beginner quick start (what recovered means here)
In this pattern, “recovered” means you made the installed game match the truth you intended:
- You reproduced the mismatch: player-installed footer
build_label!= BUILD_RECEIPTbuild_label. - You identified that setlive targeted the wrong branch pointer (usually
default). - You audited depot manifest against the upload receipt (so you know which bytes were actually live).
- You re-promoted by running dry-run on the correct target branch first.
- You verified installed behavior (smoke on an installed library build).
- You filed
default_branch_recovery_receipt_v1.jsonand set the recovery latch in BUILD_RECEIPT.
Success check: Two consecutive clean installs show the same installed footer label, and the BUILD_RECEIPT recovery latch points to your master recovery receipt.
The failure signature (typical signals)
| Channel | Typical wording / symptom |
|---|---|
| Steam discussion | “Steam says update happened, but it still looks like the old build label.” |
Discord #builds |
“Localization is GREEN; why is the new strings not showing?” |
| Internal | “setlive exited 0, so it must be right.” |
| Installed client | Footer build_label remains from default branch promotion, not from intended upload target. |
Starting state (what was wrong)
| Layer | Expected | Observed |
|---|---|---|
| Localization capstone | Capstone receipt is GREEN | GREEN (strings + weekly annex ok) |
| Upload window | october_upload_window_allowed: true |
True in BUILD_RECEIPT |
| Steam promotion | setlive targets upload target branch (fest/RC) | setlive targets default |
| Player-installed label | footer matches intended promoted build | footer shows old build_label |
This is not a “localization is broken” story. Localization evidence was fine. The live branch pointer was wrong.
Root cause pattern (synthesized)
| Mechanic | What drifted |
|---|---|
| Branch pointer slip | default promoted instead of intended upload target branch |
| Dry-run skipped | no staging dry-run proof for the correct target branch |
| Receipt theater | BUILD_RECEIPT flags flipped before installed footer proof |
| Depot bytes confusion | bytes live on default branch despite capstone GREEN |
Timeline B1–B6 (recovery ladder)
| Stage | Gate | Focus | Output |
|---|---|---|---|
| B1 | D1 | Player-installed label capture | player_visible_label_before.txt |
| B2 | D2 | Steam branch / setlive string audit | branch_setlive_audit_v1.json |
| B3 | D3 | Depot manifest audit vs upload receipt | default_branch_manifest_audit_v1.json |
| B4 | D4 | Setlive dry-run on correct target branch | engine dry-run log receipt |
| B5 | D5 | Production re-promote + installed smoke | installed_smoke_receipt_v1.json |
| B6 | D6 | Master receipt + BUILD_RECEIPT latch | default_branch_recovery_receipt_v1.json |
B1 — Player-installed label reproduction (beginner path)
Goal: Prove the mismatch on a clean Steam install. This is the one step that stops “it should be green” arguments.
Steps
- Use a clean Steam install (no staging editor copies).
- Capture the installed footer or any visible UI label that maps to
build_label. - Compare against your recorded BUILD_RECEIPT value.
- Save evidence:
release-evidence/october-upload/default-branch-recovery-2026/player_visible_label_before.txt
Quick command template
jq -r '.build_label' release-evidence/build/BUILD_RECEIPT.json
Then compare the string you saw installed with the BUILD_RECEIPT build_label.
Pass criteria for B1
- You can show installed label mismatch (not just “we think we promoted the right build”).
B2 — Steam branch / setlive string audit (working dev)
Goal: Prove what the promotion step actually targeted.
In a wrong-branch recovery, you can have a perfect localization capstone and still promote the wrong branch pointer.
Steps
- Capture a Steamworks branch UI screenshot showing the target branch for this promotion.
- Capture the setlive command inputs you used:
- branch key / branch name string
- target depot IDs (if you recorded them)
- Write an audit receipt:
release-evidence/october-upload/default-branch-recovery-2026/receipts/branch_setlive_audit_v1.json
{
"schema": "branch_setlive_audit_v1",
"observed_player_label_before": "REPLACE_ME",
"intended_branch_key": "REPLACE_ME",
"observed_setlive_target_branch_key": "default",
"promotion_timestamp": "REPLACE_ME_ISO8601"
}
Pass criteria for B2
- The receipt clearly identifies that the live pointer drifted via a wrong branch target (typically
default).
B2 evidence checklist (so you don’t re-litigate in Slack)
Before anyone says “Steam must be slow,” collect the three anchors below. In wrong-branch recoveries, they answer almost every question:
| Anchor | What to capture | Saved as |
|---|---|---|
| Branch UI proof | Screenshot (Steamworks branch name column) showing default or the observed target |
.../snapshots/steam-branch-ui.png |
| Promotion inputs | The exact setlive target branch key / string that the command used | .../receipts/branch_setlive_inputs.txt |
| Receipt context | The capstone receipt ID you believe “enabled upload” (so you can separate permission from pointer truth) | .../receipts/capstone_latch_ref.txt |
Fail note: if you only capture the setlive command but not the branch UI, your evidence can still be correct but your story can still collapse under moderation pressure.
Common B2 failure modes
- The branch UI screenshot is of the wrong moment (after someone re-ran setlive). Timestamp it or store the snapshot immediately.
- The setlive command string differs from what the dry-run used (typo in branch key). B4 prevents this by forcing the same target string twice.
- People copy
defaultas a default value in scripts. Scripts are fine—receipt evidence is mandatory.
B3 — Depot manifest audit (evidence against upload receipt)
Goal: Tie the branch pointer to the actual bytes by auditing depots against the upload receipt.
Steps
- Load your depot upload receipt from the upload-night evidence:
- depot upload log receipt from SteamPipe depot upload log evening
- Compare expected depot contents against what’s live under the wrong branch pointer.
- File:
release-evidence/october-upload/default-branch-recovery-2026/receipts/default_branch_manifest_audit_v1.json
{
"schema": "default_branch_manifest_audit_v1",
"observed_branch_key": "default",
"upload_receipt": "release-evidence/steam/steampipe_depot_upload_receipt_v1.json",
"mismatch_confirmed": true,
"notes": "bytes mismatch vs intended upload target build"
}
Pass criteria for B3
- You now have evidence that the wrong branch pointer corresponds to the wrong bytes.
B3 bytes mapping (working dev)
In this failure mode, you do not need complicated forensics. You need a comparison that answers: “Which bytes did players actually get under default?”
Compare three surfaces that should be aligned if promotion truth is correct:
| Surface | Source | What you extract | Why |
|---|---|---|---|
| Intended upload bytes | your upload receipt from the steampipe depot upload evening (#1) | the depot contents hash / expected build ID mapping | expected reality |
| Live bytes under wrong pointer | manifest audit for the promoted branch key (default) |
live depot list + build ID mapping | observed reality |
| Installed player bytes | installed smoke run on a clean library client | visible build_label and one localization string spot |
“what matters” reality |
B3 is where you lock the narrative: if B3 says “mismatch_confirmed,” do not soften the response. Players need the truth before you promise fixes.
Pass criteria for B3
mismatch_confirmed: trueAND you can point at the exact evidence artifacts used for that conclusion.
B4 — Setlive dry-run on the correct target branch (promotion preflight)
Goal: Stop repeating the mistake by proving the correct target branch in staging before production.
For GameMaker-specific receipt shape, Course Lesson 270 provides the dry-run receipt discipline.
For the underlying SteamPipe mechanics, keep the official reference nearby: Uploading builds with SteamPipe.
Steps
- Run engine-specific setlive dry-run on the correct target branch.
- Ensure:
- the dry-run log shows the same branch key you intend
- depot identity and
build_labelintent match your upload evidence
- If you rely on a partner identity config, include the guide preflight first:
Pass criteria for B4
- Dry-run receipt shows the correct target branch and expected build label intent.
B4 dry-run log requirements (what to grep)
Your dry-run evidence must include, verbatim:
- the intended target branch key/string,
- the intended promoted
build_labelintent (or equivalent), - and a “no wrong depot identity” signal (engine-specific: depot ownership / partner identity checks).
If the dry-run shows the correct target branch, but production promotes the wrong pointer again, treat that as a pipeline rerouting issue (not a Steam outage). That is a different recovery ticket than this one.
B5 — Production re-promote + installed smoke (prove the truth)
Goal: After production setlive, verify on installed Steam client, not Editor/staging.
Steps
- Re-run production setlive with the corrected target branch pointer.
- Capture the production log evidence (timestamp + output).
- Run the installed smoke:
- confirm installed footer label matches BUILD_RECEIPT
build_label - optionally validate one visible localization string (since capstone GREEN should surface expected changes)
- confirm installed footer label matches BUILD_RECEIPT
- File:
release-evidence/october-upload/default-branch-recovery-2026/receipts/installed_smoke_receipt_v1.json
Pass criteria for B5
- Installed footer label matches what you intended to promote.
B5 localization spot check (still capstone GREEN, but verify visibility)
Localization capstone GREEN is about the content pipeline. Still, in the wrong-branch story you must confirm the player-visible surface matches the intended strings for the branch you fixed.
For B5, do a “minimal surface check”:
- open one menu or screen that displays a previously identified string,
- confirm at least one of the changed phrases matches the intended locale behavior,
- record what you saw in
release-evidence/october-upload/default-branch-recovery-2026/notes/string_spot_check.md.
Do not claim full translation verification in a recovery post. B5 proves the branch pointer truth, and the spot check prevents the next class of “wrong bytes, right receipts” loop.
Facilitator stand-up script (B5 + B6 filing block)
Use this as the comms-to-evidence template during recovery:
## Oct upload wrong-default recovery — stand-up (20 min max)
- B1: installed footer mismatch observed (path attached)
- B2: Steam branch UI + setlive target string captured (evidence attached)
- B3: depot manifest audit mismatch_confirmed true (receipt path attached)
- B4: dry-run on correct target branch shows intended build_label intent
- B5: installed smoke after production setlive shows matching footer label
- B6: default_branch_recovery_receipt_v1.json filed and BUILD_RECEIPT latch updated
No public “fixed” until B5; no receipt theater substitutes.
Moderation comms templates (hold vs post-fix)
Hold (before B4/B5):
“We have localization capstone GREEN, but player installs may still be on the wrong Steam branch pointer. We are collecting B1–B3 evidence and will only confirm ‘fixed’ after installed smoke (B5).”
Post-fix (after B5, before B6 sharing):
“Installed footer label matches the intended promoted build_label. Recovery receipt default_branch_recovery_receipt_v1.json is filed and BUILD_RECEIPT latch updated. If you still see old text, capture your local footer screenshot and the session branch key we used.”
B6 — Master receipt + BUILD_RECEIPT latch
Goal: File the recovery receipt once, so partner/on-call can grep it later without asking “which branch was live?”
default_branch_recovery_receipt_v1.json template
{
"schema": "default_branch_recovery_receipt_v1",
"fest_window": "2026-10-next-fest-upload-week",
"default_branch_key": "default",
"intended_branch_key": "REPLACE_ME",
"observed_player_label_before": "REPLACE_ME",
"intended_build_label": "REPLACE_ME",
"root_cause_class": "wrong_branch_pointer",
"nights": [
{"gate": "B1", "pass": true},
{"gate": "B2", "pass": true},
{"gate": "B3", "pass": true},
{"gate": "B4", "pass": true},
{"gate": "B5", "pass": true},
{"gate": "B6", "pass": true}
],
"default_branch_recovery_ok": true,
"evidence_dir": "release-evidence/october-upload/default-branch-recovery-2026/"
}
BUILD_RECEIPT latch snippet
Update your root BUILD_RECEIPT with a recovery latch:
{
"default_branch_recovery_ok": true,
"default_branch_recovery_receipt": "release-evidence/october-upload/default-branch-recovery-2026/receipts/default_branch_recovery_receipt_v1.json"
}
Pass criteria for B6
- Receipt verifies and BUILD_RECEIPT points to it.
verify_default_branch_recovery.sh (pattern)
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-release-evidence/october-upload/default-branch-recovery-2026/receipts/default_branch_recovery_receipt_v1.json}"
jq -e '.schema == "default_branch_recovery_receipt_v1"' "$REC" >/dev/null
jq -e '.nights | length == 6' "$REC" >/dev/null
jq -e '[.nights[].pass] | all' "$REC" >/dev/null
jq -e '.default_branch_recovery_ok == true' "$REC" >/dev/null
echo "default_branch_recovery verify: OK"
Proof table (what “GREEN” means)
| Gate | Evidence | GREEN when |
|---|---|---|
| B1 | player_visible_label_before.txt |
Installed footer label != BUILD_RECEIPT before fix |
| B2 | branch_setlive_audit_v1.json |
Audit identifies promotion target branch (default) |
| B3 | default_branch_manifest_audit_v1.json |
Depot bytes mismatch confirmed vs intended target |
| B4 | engine dry-run log/receipt | Dry-run targets correct branch pointer |
| B5 | installed_smoke_receipt_v1.json |
Installed footer matches intended build_label |
| B6 | master receipt + BUILD_RECEIPT latch | default_branch_recovery_ok: true |
Scenarios A–G (what looks similar, but isn’t)
A — Localization capstone GREEN but setlive targeted wrong branch
This exact class: capstone is fine; branch pointer is wrong. Recovery needs B1–B6.
B — default promotion because fest target label “looked fine” in Steamworks UI
Still wrong: UI might show the right label even when players see old bytes. Trust installed smoke.
C — Dry-run skipped “for speed” during upload week
B4 exists so you do not repeat B2/B3 evidence work.
D — CDN delay vs pointer slip
CDN delay changes bytes while label may look similar; branch pointer slip changes the intended branch mapping. Audit both.
E — “We fixed BUILD_RECEIPT so it’s fixed”
Receipt theater: BUILD_RECEIPT booleans are not promotion truth. Installed smoke is mandatory.
F — HOTFIX without exception list
If you consider a HOTFIX, follow the numbered exception policy (separate from this case study). In Oct you still need the recovery receipt narrative.
G — Player label mismatch that is not wrong bytes
Sometimes label rendering differs per platform. If installed footer is inconsistent, still file B1 evidence and stop promotion until resolved.
Prevention checklist (before next setlive)
| Prevent step | What it prevents |
|---|---|
| Branch pointer audit (B2-style) before production promote | default promoted by accident |
| Engine dry-run receipt (B4-style) | no staging proof for target branch |
| Installed footer smoke on every recovery | receipt theater |
| Keep capstone receipt separate from promotion truth | localization GREEN mistaken for live pointer truth |
| Pair this with Steam label mismatch help as a quick sanity review | label mismatch class guidance |
Integration with October upload-week cluster rows
| Cluster row | Role in this recovery narrative |
|---|---|
| Localization capstone #11 | Provides capstone GREEN context; does not prove branch pointer |
| October upload dress rehearsal challenge (#3) | Helps keep evidence diffs and receipt discipline during upload week |
| SteamPipe depot upload log evening (#1) | Provides depot upload receipt anchors for B3 audits |
| 12 setlive checks | Prevention gate so future B2 slips don’t happen silently |
| Lesson 270 | GameMaker dry-run receipt milestone for B4 |
Related GamineAI reads
- Localization capstone #11 — capstone GREEN context |
- October upload dress rehearsal challenge — five-night upload evidence ladder |
- October store last-minute metadata freeze trend playbook — policy for what to stop editing and when |
- February setlive mismatch case study — cousin recovery narrative |
- 12 pre-flight checks before steamcmd setlive — promotion gate |
- GameMaker setlive dry-run receipt (Lesson 270) |
- Help: Steam depot promoted build label mismatch fix |
Key takeaways
- Localization capstone GREEN is not the same thing as live Steam branch pointer truth.
- This URL’s recovery is B1–B6 and produces one grep-able master receipt:
default_branch_recovery_receipt_v1.json. - The mismatch must be proven on a player-installed Steam client (B1 and B5).
- The branch pointer target must be audited (B2) and tied to depot bytes (B3).
- Dry-run is prevention, not paperwork: B4 stops the “repeat the same mistake faster” loop.
- Do not flip BUILD_RECEIPT booleans as a substitute for installed footer proof.
FAQ
Is this the same as RC label mismatch recovery?
No. RC label mismatch is about label receipts passing while live depots differ. This is about a wrong Steam branch pointer after capstone GREEN.
What if setlive exit code is 0?
Exit code can be 0 while you targeted the wrong branch pointer. Trust B1 + B5 installed smoke evidence.
Do we need a new capstone receipt on recovery?
No. Capstone validates localization and weekly indexing. Recovery validates promotion truth and live branch pointer behavior.
Can CDN delay mimic this?
It can delay bytes, but pointer slip changes the mapping. Use B2 + B3 receipts and always smoke on installed client.
What ships next?
After you recover the branch pointer, the next coordination step is usually store publish readiness and metadata discipline. (This URL is intentionally recovery-first, not store-first.)