We Recovered a Fest-Day setlive Mismatch After February RC Label Receipt Passed - 2026 Case Study

This is a synthesized case study—a field pattern from February 2027 live fest teams who filed february_rc_branch_label_receipt_v1.json GREEN, skipped GameMaker setlive dry-run, and promoted fest-demo-2027-02-rc2 while players still downloaded rc1 bytes on fest day two. It is not a named studio turnaround. There are no invented download counts, no fake player quotes, and no fabricated refund percentages.
What follows is the failure signature, a D1–D3 recovery timeline, fest_day_setlive_recovery_receipt_v1.json with gates S1–S6, and how the pattern maps when label receipts pass but live depot pointers do not.
Pair February RC label evening, 5-night pager challenge, hour-one funnel, live week timebox, forward Help #38, Course 278 cousin.
Non-repetition note: LFS silent demo case study owns binary stub / audio banks. Mismatched save slots owns persistence keys. February RC label evening owns L1–L6 pre-upload label unity. This URL owns live fest setlive depot mismatch after label GREEN—promotion truth, not label JSON alone.
Why this matters now (February 2027 live week)
- Receipt pass ≠ live depot —
february_rc_label_okdocuments intent;setlivedocuments what players download. - Day-two HOTFIX pressure — Pager challenge P2 diffs
build_label—drift here is the smoking gun. - Launch rate collapses — Hour-one funnel scenario A (launch down, quit flat) often traces to wrong depot, not gameplay.
- Skipped dry-run — Teams treat setlive evening as October-only—live fest still needs it.
- Moderation chaos — Players report “fixed” while still on old binary—moderation templates T1 rings hollow.
Direct answer: Recovery required depot manifest audit, staging setlive dry-run log, new label receipt for rc2, installed-player smoke, and fest_day_setlive_recovery_receipt_v1.json with S1–S6 GREEN before declaring HOTFIX complete.
Beginner quick start — what recovered means here
Recovered in this pattern means:
- Reproduced player-visible
build_label≠ BUILD_RECEIPTbuild_labelon clean Steam install. - Identified
setlivetargeted wrong depot ID or branch name typo (rc1vsrc2). - Re-promoted with dry-run log + screenshot evidence.
- Filed recovery receipt; set
fest_day_setlive_recovery_ok: true. - Verified funnel
launch_raterecovers within next hour window (qualitative—not fabricated %).
Success check: Two consecutive clean installs show matching footer label and BUILD_RECEIPT string; Wednesday smoke GREEN on installed build.
The player-facing failure (typical signals)
| Channel | Typical wording |
|---|---|
| Steam discussion | “Still on old build after patch note” |
Discord #playtest |
“Footer says rc1, announcement said rc2” |
| Hour-one funnel | Launch rate drop; quit rate flat |
| Internal | “setlive succeeded”—no install check |
Internal language before fix: “Steam CDN slow” — when root cause was wrong live branch pointer.
Starting state (what was wrong)
| Layer | Symptom |
|---|---|
| BUILD_RECEIPT | build_label: fest-demo-2027-02-rc2 |
| RC label receipt | L1–L6 GREEN for rc2 before upload |
setlive |
Ran without dry-run; wrong SetLive branch string |
| Player install | Footer still shows fest-demo-2027-02-rc1 |
| Smoke | Passed on staging machine—not player library |
| Pager N2 | build_label drift flagged YELLOW—ignored for “speed” |
Gameplay on rc1 may be fine—the failure is promotion truth, not necessarily crash.
Root cause pattern (synthesized)
| Mechanic | What drifted |
|---|---|
| Branch string typo | fest-demo-2027-02-rc2 promoted; live branch still ...-rc1 |
| Wrong depot ID | setlive targeted default depot—not fest demo depot |
| Skipped dry-run | No gm_steam_setlive_dry_run_receipt_v1.json (or engine cousin) on fest day |
| Smoke on wrong surface | Editor/staging binary—not Steam client library |
| Receipt theater | Updated BUILD_RECEIPT label before setlive completed |
None require malice—only promotion discipline skipped under live fest pager load.
Timeline D1–D3 (live fest recovery pattern)
| Day | Fest day | Focus | Output |
|---|---|---|---|
| D1 | D2 | Repro + label capture | Screenshots + player_visible_label.txt |
| D2 | D2–D3 | Depot audit + dry-run | Staging log + manifest JSON |
| D3 | D3 | Re-promote + smoke + receipt | fest_day_setlive_recovery_receipt_v1.json |
Teams with pager P2 diff caught mismatch in D1; teams without took until funnel RED.
D1 — reproduction discipline (beginner path)
| Step | Action |
|---|---|
| 1 | Clean Steam install from library (not staging folder) |
| 2 | Screenshot credits/footer build_label |
| 3 | Compare to BUILD_RECEIPT build_label and RC label receipt |
| 4 | Capture appmanifest_*.acf branch key if available |
| 5 | Log hour-one funnel row—note launch_rate drop |
| 6 | Post internal L1 escalation—no public “fixed” yet |
# BUILD_RECEIPT truth
jq -r '.build_label' BUILD_RECEIPT.json
# Compare player file (facilitator pastes from screenshot OCR)
diff -u <(echo "fest-demo-2027-02-rc1") <(jq -r '.build_label' BUILD_RECEIPT.json)
Save diff output to release-evidence/steam/setlive-recovery/label-mismatch-d1.txt.
D2 — depot audit + dry-run (working dev)
SteamCMD / partner manifest checks
| Check | Command / action | Pass |
|---|---|---|
| Live branch name | Steamworks branch UI screenshot | Matches intended rc2 |
| Depot contents hash | Compare upload log vs live manifest | Bytes match upload receipt |
| Dry-run | setlive evening S1–S6 | Log shows target branch |
{
"schema": "setlive_depot_manifest_audit_v1",
"fest_window": "2027-02-next-fest-live",
"intended_build_label": "fest-demo-2027-02-rc2",
"observed_player_label": "fest-demo-2027-02-rc1",
"live_branch_key": "fest-demo-2027-02-rc1",
"intended_branch_key": "fest-demo-2027-02-rc2",
"dry_run_receipt_path": "release-evidence/steam/gm_steam_setlive_dry_run_receipt_v1.json",
"mismatch_confirmed": true
}
Engine notes:
| Engine | setlive cousin |
|---|---|
| GameMaker | setlive dry-run evening |
| Godot | VDF LF + steamcmd before promote |
| Unity | 12 setlive checks check 7 |
Worked narrative — synthesized D2 afternoon (no invented metrics)
This block is a facilitator script, not a studio press release. Times are relative to “first funnel RED on launch_rate.”
| T+0 | Signal | Action |
|---|---|---|
| T+0 | Hour-one funnel scenario A — launch_rate down, quit_rate flat | Pager owns; community holds generic “investigating” |
| T+15m | Two Discord screenshots show fest-demo-2027-02-rc1 footer |
File label-mismatch-d1.txt; do not post “fixed” |
| T+30m | BUILD_RECEIPT says rc2; RC label receipt L1–L6 GREEN from morning |
Confirms receipt theater risk—label JSON passed, live pointer did not |
| T+45m | Pager P2 diff shows build_label changed without attached dry-run path |
Root cause candidate: skipped_setlive_dry_run |
| T+60m | Steamworks branch screenshot — live key still ...-rc1 |
File setlive_depot_manifest_audit_v1.json with mismatch_confirmed: true |
| T+90m | Run setlive dry-run S1–S6 on staging | Log must show exact fest-demo-2027-02-rc2 string |
| T+120m | Production setlive with matching VDF |
Capture exit log + timestamp in evidence folder |
| T+150m | Two clean installs — footer rc2 |
S4 pass; moderation may post T1 template |
| T+180m | Wednesday smoke on library build | S5 pass; file recovery receipt |
Producer rule: If T+60m audit shows CDN hash updating but label unchanged, route to blog #6 wall-clock trend—not this recovery path.
GameMaker setlive string audit (working dev)
Wrong branch keys often differ by one character (rc1 vs rc2) or depot ID (default vs fest demo depot). Compare three surfaces byte-for-byte:
| Surface | What to capture | Common drift |
|---|---|---|
| Partner branch UI | Screenshot with branch name column | Typo in rc2 |
VDF SetLive stanza |
Paste into setlive_vdf_audit.txt |
Wrong appid depot block |
| Player footer label | Screenshot from clean install | Old branch still live |
Example audit snippet (values illustrative—replace with your App ID and depot IDs):
# setlive_vdf_audit.txt — compare dry-run vs production
AppID=1234560
DepotID=1234561
Branch=fest-demo-2027-02-rc2 # production mistakenly had rc1 here
BuildID=98765432
Pair 12 setlive checks check 7 when Unity Addressables or secondary depots participate—fest demos with DLC-sized splits promote the wrong depot while the primary EXE looks fine.
Godot and Unity cousins (same failure class)
| Engine | Pre-promote proof | Live fest note |
|---|---|---|
| Godot | VDF LF proof on Linux agent | CRLF in branch name breaks silent setlive |
| Unity | Library cache bust before upload | Wrong Addressables catalog on correct branch label |
| GameMaker | setlive dry-run evening S4 | Partner receipt screenshot ≠ SetLive target |
The recovery receipt root_cause field must name the engine-specific drift—branch_typo, wrong_depot, or skipped_dry_run—so post-fest debrief does not relitigate “Steam was slow.”
BUILD_RECEIPT columns for live fest promotion truth
Extend BUILD_RECEIPT with promotion columns orthogonal to February RC label february_rc_label_ok:
{
"build_label": "fest-demo-2027-02-rc2",
"february_rc_label_ok": true,
"february_rc_label_receipt": "release-evidence/steam/february_rc_branch_label_receipt_rc2.json",
"setlive_dry_run_ok": true,
"setlive_dry_run_receipt": "release-evidence/steam/gm_steam_setlive_dry_run_receipt_v1.json",
"fest_day_setlive_recovery_ok": false,
"fest_day_setlive_recovery_receipt": null,
"player_visible_build_label": "fest-demo-2027-02-rc1",
"player_visible_label_captured_at": "2027-02-24T13:05:00Z"
}
Latch order (fail-closed):
february_rc_label_ok— pre-upload label unity (L1–L6).setlive_dry_run_ok— staging proof before productionsetlive.- Update
build_labelon BUILD_RECEIPT only after productionsetlivelog path is attached. player_visible_build_labelfrom installed Steam library—not editor export folder.- When
player_visible_build_label !== build_label, setfest_day_setlive_recovery_ok: falseand open D1–D3. - After S1–S6 GREEN, flip
fest_day_setlive_recovery_ok: trueand attach recovery receipt path.
Thursday row review should diff player_visible_build_label during live week—not only build_label—so P2 catches receipt theater before funnel RED.
Facilitator stand-up script (D2 recovery block)
Paste into #fest-live-ops during mismatch response:
## Setlive mismatch stand-up (20 min max)
- [ ] Funnel row attached — scenario A? (launch down, quit flat)
- [ ] Player label screenshot (before) in evidence folder
- [ ] BUILD_RECEIPT build_label vs player_visible_build_label diff printed
- [ ] RC label receipt path — GREEN but live wrong? (receipt theater check)
- [ ] Depot manifest audit JSON filed — mismatch_confirmed true/false
- [ ] Dry-run receipt re-run — S1–S6 GREEN
- [ ] Production setlive log path attached with timestamp
- [ ] Two clean install labels match — S4
- [ ] Wednesday smoke on library build — S5
- [ ] fest_day_setlive_recovery_receipt_v1.json filed — S6
- [ ] Moderation: hold T1 until S4; then post fix template
Beginner path: If any box is unchecked, community stays on investigating copy—never promise a fix hour.
Moderation comms templates (hold vs post-fix)
Pair moderation listicle M4 templates:
Hold (before S4):
Thanks for the build label screenshot — we're confirming the live depot matches fest-demo-2027-02-rc2.
Please do not reinstall yet; we'll post when the live branch is verified.
Post-fix (after S4 + S5):
Live depot now serves fest-demo-2027-02-rc2.
Verify footer/credits label matches rc2 after one clean install.
If you still see rc1 after that, reply with a fresh screenshot and appmanifest acf excerpt.
Wrong template (never use):
We pushed a fix — should be live now!
That line without install proof recreates the original failure: BUILD_RECEIPT optimism ahead of player-visible truth.
D3 — re-promote, smoke, receipt (S1–S6)
| Gate | Pass criterion |
|---|---|
| S1 | Root cause documented (branch_typo / wrong_depot / skipped_dry_run) |
| S2 | New setlive dry-run GREEN |
| S3 | New february_rc_branch_label_receipt_v1.json for rc2 re-latch (do not edit pre-mismatch JSON) |
| S4 | Two clean installs—matching player + BUILD_RECEIPT labels |
| S5 | Wednesday smoke on installed library build |
| S6 | fest_day_setlive_recovery_receipt_v1.json filed; fest_day_setlive_recovery_ok: true |
fest_day_setlive_recovery_receipt_v1.json (template)
{
"schema": "fest_day_setlive_recovery_receipt_v1",
"fest_window": "2027-02-next-fest-live",
"fest_day_detected": "D2",
"generated_at": "2027-02-24T14:30:00Z",
"root_cause": "skipped_setlive_dry_run_wrong_branch_key",
"intended_build_label": "fest-demo-2027-02-rc2",
"observed_player_label_before": "fest-demo-2027-02-rc1",
"observed_player_label_after": "fest-demo-2027-02-rc2",
"evidence_paths": {
"label_mismatch_d1": "release-evidence/steam/setlive-recovery/label-mismatch-d1.txt",
"dry_run_receipt": "release-evidence/steam/gm_steam_setlive_dry_run_receipt_v1.json",
"rc_label_receipt": "release-evidence/steam/february_rc_branch_label_receipt_rc2_relatch.json",
"demo_smoke_receipt": "release-evidence/smoke/demo_smoke_receipt_v1.json"
},
"fest_day_setlive_recovery_ok": true
}
BUILD_RECEIPT:
{
"fest_day_setlive_recovery_ok": true,
"fest_day_setlive_recovery_receipt": "release-evidence/steam/FEST_DAY_SETLIVE_RECOVERY_RECEIPT.json"
}
verify_fest_day_setlive_recovery.sh
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-release-evidence/steam/FEST_DAY_SETLIVE_RECOVERY_RECEIPT.json}"
jq -e '.schema == "fest_day_setlive_recovery_receipt_v1"' "$REC" || exit 1
jq -e '.observed_player_label_before != .observed_player_label_after' "$REC" || exit 2
jq -e '.observed_player_label_after == .intended_build_label' "$REC" || exit 3
jq -e '.fest_day_setlive_recovery_ok == true' "$REC" || exit 6
echo "fest_day_setlive_recovery verify: OK"
PowerShell verify cousin (Windows facilitators)
$Rec = "release-evidence/steam/FEST_DAY_SETLIVE_RECOVERY_RECEIPT.json"
$j = Get-Content $Rec -Raw | ConvertFrom-Json
if ($j.schema -ne "fest_day_setlive_recovery_receipt_v1") { exit 1 }
if ($j.observed_player_label_before -eq $j.observed_player_label_after) { exit 2 }
if ($j.observed_player_label_after -ne $j.intended_build_label) { exit 3 }
if (-not $j.fest_day_setlive_recovery_ok) { exit 6 }
Write-Host "fest_day_setlive_recovery verify: OK"
Pin beside bash script in release-evidence/steam/README-setlive-recovery.md.
Gate triage — when to run recovery vs other cluster URLs
| Symptom | First doc | Why |
|---|---|---|
| Silent menu audio, movement OK | LFS case study | Pointer stubs—not depot |
| Save loads wrong slot | Save slot case study | Persistence keys |
| Label mismatch live vs BUILD_RECEIPT | This URL | setlive / depot pointer |
| Label mismatch pre-upload | RC label evening | L1–L6 before store |
| Downloads slow, label correct | Forward #6 wall-clock trend | Queue telemetry—not promotion |
Direct answer for search: If player-visible build_label ≠ BUILD_RECEIPT build_label after a fest-day promote, run D1–D3 here before gameplay HOTFIX.
Integration with live week cluster
| Cluster row | Role in recovery |
|---|---|
| #1 timebox | Pager cap absorbs D2–D3 repro |
| #2 funnel | Launch rate signal triggers D1 |
| #3 moderation | Hold T1 until S4 passes |
| #4 pager | P2 diff should have blocked skip |
Comms rule: Moderators post T1 before S4—never “fixed” on BUILD_RECEIPT alone.
Proof table
| Row | Evidence | GREEN when |
|---|---|---|
| P1 | Player label screenshot (before) | Mismatch confirmed |
| P2 | Depot manifest audit JSON | S1 root cause |
| P3 | setlive dry-run receipt | S2 pass |
| P4 | RC label re-latch JSON | S3 pass |
| P5 | Two install label match | S4 pass |
| P6 | Recovery receipt + verify script | S1–S6 pass |
Scenarios A–G
A — Typo rc1 vs rc2 in setlive string
Most common; dry-run S4 catches before production command.
B — Wrong depot ID (DLC depot promoted)
Manifest audit compares depot IDs from upload log.
C — GREEN label receipt but never ran setlive
BUILD_RECEIPT updated optimistically—S1 skipped_setlive.
D — Steam CDN delay vs mismatch
CDN delay: label unchanged but bytes slowly update—hash changes without label change; audit uses manifest hash, not time.
E — Pager P2 ignored
Organizational root cause—add producer waiver ID to receipt notes.
F — HOTFIX without exception list
Pair HOTFIX opinion (blog #10 forward).
G — Recovery on D3 clears funnel
Re-file hour-one row; attach recovery receipt path to funnel notes.
Post-fest debrief questions (S6 attachment)
When filing fest_day_setlive_recovery_receipt_v1.json, answer in notes for Sunday closeout row review forward:
- Did P2 diff fire before promote? If no, what waiver ID blocked pager?
- Was dry-run skipped for speed or missing staging App ID?
- Did moderation post “fixed” before S4? (comms audit)
- How many hours from funnel RED to S6 GREEN? (qualitative bucket: under 2h / 2–6h / over 6h)
- What engine-specific drift class (
branch_typo,wrong_depot,skipped_dry_run)? - Will next RC bump add
player_visible_build_labelto Thursday diff?
These six questions prevent the team from rewriting history as “CDN weirdness” and give partners an honest promotion narrative.
Prevention checklist (pre–next setlive)
[ ] february_rc_label_ok true for target rcN
[ ] setlive dry-run receipt GREEN (engine-specific)
[ ] Production setlive command matches dry-run branch string byte-for-byte
[ ] BUILD_RECEIPT build_label updated AFTER setlive success log
[ ] Clean install label check (not staging)
[ ] Wednesday smoke on installed build
[ ] Pager P2 diff shows no unexplained build_label change
Pin beside February RC label evening printable card.
Comparison pack (promotion failures)
| Failure | Symptom | Receipt |
|---|---|---|
| LFS pointer drift | Silent audio | git_lfs_pointer_drift_receipt_v1 |
| Save slot mismatch | Wrong save loads | save slot case study |
| setlive mismatch | Wrong label/binary live | fest_day_setlive_recovery_receipt_v1 |
| RC label drift (pre-live) | Upload blocked | february_rc_branch_label_receipt_v1 |
Common mistakes
Trusting setlive exit code alone — Exit 0 with wrong branch still fails S4.
Editing old RC label JSON — File new re-latch receipt (S3).
Public “fixed” before install check — Destroys moderation trust.
Smoke on developer machine — S5 requires Steam library install.
Skipping pager P2 — Label drift is early warning.
Related GamineAI reads
- February RC branch label evening
- GameMaker setlive dry-run evening
- 5-night pager challenge
- Hour-one funnel snapshot
- 12 setlive preflight checks
- Wednesday demo smoke
- Forward: SteamPipe live week wall-clock trend (blog #6)
Key takeaways
- GREEN RC label receipt does not prove live
setlivetruth—audit installs. fest_day_setlive_recovery_receipt_v1.jsongates S1–S6 for live fest promotion recovery.- D1–D3 timeline — repro, depot audit + dry-run, re-promote + smoke.
- Player-visible label must match BUILD_RECEIPT after S4—cousin L4 on RC evening.
- setlive dry-run evening is not optional on fest day two.
- Pager P2 diff catches drift—do not ignore for speed.
- Hour-one funnel launch drop + flat quit → check depot before gameplay hotfix.
- File new RC label receipt on re-latch—never edit pre-mismatch JSON.
verify_fest_day_setlive_recovery.shgives partners one exit code.- Help #38 forward owns fix lane; this owns recovery narrative.
- February live-week queue playbook when downloads slow but label matches.
- February cluster #6 consumed—Blog-Create #7 co-stream overlay safe-zone art pass next.
FAQ
Is this the same as the RC label evening tutorial?
No—evening owns pre-upload L1–L6; case study owns live fest wrong depot after GREEN.
Can CDN delay mimic this?
CDN delay updates bytes with same label; mismatch shows label divergence—audit both.
Do we need a new RC receipt on recovery?
Yes—S3 re-latch documents post-mismatch promote.
What if gameplay is actually broken on rc2?
This case study ends at promotion truth—gameplay repro is separate pager work.
What ships next in February cluster?
Blog-Create #7 — February fest stream overlay safe-zone art pass when co-stream UI clips build labels.