We Recovered a Steam Demo Crash Rate Spike After October Fest Without Rolling Back Build - 2026 Case Study

November D+2 after October Next Fest: #support fills with "crashes at main menu." Post-fest analytics #2 logged refund rate YELLOW—but the dashboard still showed fest-week download totals, so leadership asked whether the spike was real. Retention challenge Night 3 went RED on smoke. Engineering's first instinct: roll back to pre-fest trunk and apologize. Marketing's instinct: hotfix tonight and hope players notice. Neither matched what the logs showed—a config toggle left enabled for fest-only telemetry that crashed on trunk build_id after branch unset #1.
This case study is a recovery narrative with no invented crash percentages, no fake player quotes, and no fabricated Steam analytics screenshots. It gives you a failure signature, a C1–C6 recovery ladder, and post_fest_crash_recovery_receipt_v1.json so future you can grep what went wrong—and prove you fixed forward without nuking the fest RC binary players already downloaded.
Pair retention challenge #3, 5-day crash log cousin, analytics listicle #2, forward #9 post-fest patch exception opinion, Help #50 forward.
Non-repetition note: Wrong default branch case study owns branch pointer drift B1–B6. February setlive mismatch owns depot label after RC GREEN. Retention challenge #3 owns five-night accountability R1–R5. This URL owns post-fest crash spike recovery forward without rollback C1–C6.
Why this matters now (November 2026 post-October fest)
- Analytics batch lag lies — Fest-week download totals hide D+2 refund and crash clusters.
- Rollback is expensive — Players who already installed fest RC lose progress narrative; partners ask why bytes changed.
- Config toggles survive fest — Fest-only code paths left enabled on trunk cause hour-one menu crashes.
- Receipt theater after fest — Teams flip
post_fest_retention_okwithout repro folders. - Forward fix needs evidence — Post-fest patch opinion forward #9 requires numbered rows—not panic uploads.
Direct answer: Recover post-fest crash spikes using symptom timeline (C1), repro log folder (C2), batch-lag audit (C3), root-cause isolation (C4), forward fix without rollback (C5), installed smoke + master receipt (C6).
Beginner quick start (what recovered means here)
"Recovered without rollback" means:
- You proved the crash reproduced on current trunk
build_id—not only on stale fest branch lore. - You separated analytics lag from real refund/crash signal (C3).
- You isolated root cause to a change that could ship forward (config toggle, not full binary revert).
- You filed repro logs under
crash-repro/D+3/per retention challenge R3. - You verified installed smoke after forward fix—same
build_idlineage, incremented patch label. - You latched
crash_recovery_ok: trueon BUILD_RECEIPT with master receipt path.
Success check: Two clean installs reach main menu; refund rate trends down D+4…D+5; fest RC build remains in history jsonl—not deleted from Steamworks.
The failure signature (typical signals)
| Channel | Typical wording / symptom |
|---|---|
| Steam discussion | "Game crashes immediately after splash / at main menu." |
Discord #support |
"Worked during fest, broken now?" |
| Refund export | Rate crosses analytics #2 warn threshold D+2 |
| Internal | "post_fest_retention_ok true but R3 smoke RED" |
| Logs | Same stack trace on Windows + Steam Deck after unset |
Starting state (what was wrong)
| Layer | Expected | Observed |
|---|---|---|
| Branch unset | branch_unset_ok: true, trunk on default |
GREEN |
| Analytics | Refund lane logged | YELLOW D+2 |
| Retention R3 | Smoke clean | RED — menu crash |
| Player experience | Playable demo post-fest | Instant crash at menu load |
| Team reflex | Roll back fest build | Would orphan installed fest RC bytes |
This is not a "fest build was bad" story alone—the fest RC passed October capstone. Trunk carried a fest-only telemetry flag left enabled after unset.
Root cause pattern (synthesized)
| Mechanic | What drifted |
|---|---|
| Fest-only config | ENABLE_FEST_TELEMETRY_OVERLAY left true on trunk |
| Unset without smoke | Branch returned; trunk smoke skipped until R3 RED |
| Analytics lag | D+1 dashboard still showed fest downloads—masked crash cluster |
| Rollback pressure | Leadership wanted revert; logs showed toggle not binary corruption |
Timeline C1–C6 (recovery ladder)
| Stage | Gate | Focus | Output |
|---|---|---|---|
| C1 | Symptom timeline | Refund + support + R3 RED alignment | symptom_timeline_v1.json |
| C2 | Repro log folder | Player.log + crash dump | crash-repro/D+3/repro_steps.md |
| C3 | Batch lag audit | Separate lag from real spike | analytics_lag_audit_v1.json |
| C4 | Root cause isolation | Toggle vs code path decision tree | root_cause_isolation_v1.json |
| C5 | Forward fix | Patch forward, no rollback | forward_fix_receipt_v1.json |
| C6 | Master receipt + latch | Installed smoke + BUILD_RECEIPT | post_fest_crash_recovery_receipt_v1.json |
C1 — Symptom timeline (beginner path)
Goal: Align support tickets, refund export, and retention R3 on one UTC window—stop arguing "is it real?"
Steps
- Export D+1…D+3 rows from
post_fest_daily_export_2026.csv. - Copy retention challenge night-3 card R3 status.
- Collect three support ticket timestamps (redact PII)—menu crash wording.
- File
symptom_timeline_v1.json:
{
"schema": "symptom_timeline_v1",
"build_id": "2026-11-01-trunk01",
"fest_end_utc": "2026-11-03T06:00:00Z",
"signals": [
{"utc": "2026-11-04T14:00:00Z", "source": "refund_export", "note": "rate crossed warn"},
{"utc": "2026-11-05T09:00:00Z", "source": "retention_R3", "note": "smoke RED menu crash"},
{"utc": "2026-11-05T11:00:00Z", "source": "support", "note": "3 tickets same stack"}
]
}
Pass criteria for C1
- At least two independent signals (refund + smoke or support) within 48h post-fest.
C2 — Repro log folder (working dev)
Goal: One repro folder per 5-day crash log cousin discipline—not screenshots only.
Steps
- Create
release-evidence/post-fest/crash-recovery-2026/crash-repro/D+3/. - Clean Steam install trunk build; reproduce menu crash.
- Save
Player.log, mini-dump if available,repro_steps.md(OS, GPU, steps 1–5). - Hash log file optional; path in receipt sufficient for v1.
repro_steps.md template
# Menu crash repro — D+3 post-fest
build_id: 2026-11-01-trunk01
OS: Windows 11 / Steam Deck (list both if confirmed)
Steps:
1. Install from Steam library (clean)
2. Launch demo
3. Observe crash at main menu load (before first input)
Expected: main menu interactive
Actual: instant exit / crash dialog
Log: Player.log attached
Pass criteria for C2
- Repro succeeds on clean install; log path recorded in C2 evidence index.
C3 — Analytics batch lag audit
Goal: Prove the spike is not only delayed fest-week reporting.
Steps
- Note Steamworks export generated_at_utc on D+2 refund CSV.
- Compare to C1 symptom timestamps—if tickets precede export batch, lag is partial not total.
- File
analytics_lag_audit_v1.json:
{
"schema": "analytics_lag_audit_v1",
"export_generated_at_utc": "2026-11-05T08:00:00Z",
"earliest_support_signal_utc": "2026-11-05T09:00:00Z",
"lag_partial": true,
"real_spike_confirmed": true,
"notes": "R3 smoke RED confirms beyond lag"
}
Pass criteria for C3
real_spike_confirmed: truewhen smoke + support align even if downloads dashboard lags.
C4 — Root cause isolation (hotfix vs toggle vs rollback)
Goal: Decision tree before anyone runs steamcmd rollback.
| Question | If yes | If no |
|---|---|---|
| Same crash on fest RC branch replay? | Binary issue—consider rollback path | Continue trunk path |
| Stack mentions fest-only symbol? | Toggle/config likely | Code regression |
| Change since unset only config? | Forward toggle fix (C5) | Deeper code fix |
| Crash only on Deck? | Input/glyph path—pair Deck guides | General path |
Steps
- Grep stack trace for fest-only flags (
FEST_,NEXTFEST_, project-specific). - Diff config between fest RC tag and trunk commit.
- File
root_cause_isolation_v1.jsonwithroot_cause_class: "fest_config_toggle_left_enabled".
Pass criteria for C4
- Documented root cause class + evidence path—not "we think it's networking."
C5 — Forward fix without rollback
Goal: Ship minimal fix on trunk lineage—increment build_label, do not delete fest Steam build.
Steps
- Disable fest-only telemetry overlay in config (or
#ifdefguard). - Bump
build_labelto2026.11.05-trunk02—document in BUILD_RECEIPT. - Run same-day smoke locally before depot upload.
- Upload + promote per branch unset trunk path—not fest RC rollback.
- Reference forward #9 POSTFEST-PATCH-001 row when patch ships.
- File
forward_fix_receipt_v1.json:
{
"schema": "forward_fix_receipt_v1",
"from_build_id": "2026-11-01-trunk01",
"to_build_id": "2026-11-05-trunk02",
"rollback_avoided": true,
"fix_class": "config_toggle_disable",
"patch_exception_id": "POSTFEST-PATCH-001"
}
Pass criteria for C5
- New build on default branch; fest RC build ID remains in Steamworks history; no branch revert to fest-only RC.
C6 — Installed smoke + master receipt
Goal: Latch only after two clean installs post-fix.
Steps
- Two consecutive clean installs reach main menu + five minutes idle.
- Append jsonl row to
post_fest_branch_unset_log.jsonlor daily export with newbuild_id. - File master receipt:
{
"schema": "post_fest_crash_recovery_receipt_v1",
"post_fest_week": "2026-11-first-week",
"build_id_before": "2026-11-01-trunk01",
"build_id_after": "2026-11-05-trunk02",
"root_cause_class": "fest_config_toggle_left_enabled",
"gates": {
"C1": true,
"C2": true,
"C3": true,
"C4": true,
"C5": true,
"C6": true
},
"retention_challenge_path": "release-evidence/post-fest/retention-challenge-2026/receipts/post_fest_retention_challenge_receipt_v1.json",
"crash_repro_path": "release-evidence/post-fest/crash-recovery-2026/crash-repro/D+3/",
"crash_recovery_ok": true,
"notes": ""
}
- Update BUILD_RECEIPT:
{
"crash_recovery_ok": true,
"post_fest_crash_recovery_receipt_path": "release-evidence/post-fest/crash-recovery-2026/receipts/post_fest_crash_recovery_receipt_v1.json"
}
verify_post_fest_crash_recovery.sh
#!/usr/bin/env bash
set -euo pipefail
R="${1:-release-evidence/post-fest/crash-recovery-2026/receipts/post_fest_crash_recovery_receipt_v1.json}"
jq -e '.schema == "post_fest_crash_recovery_receipt_v1"' "$R" >/dev/null
jq -e '.crash_recovery_ok == true' "$R" >/dev/null
jq -e '.gates.C1 and .gates.C2 and .gates.C3 and .gates.C4 and .gates.C5 and .gates.C6' "$R" >/dev/null
REPRO="$(jq -r '.crash_repro_path' "$R")"
test -d "$REPRO"
test -f "$REPRO/repro_steps.md"
echo "post_fest_crash_recovery verify: OK"
Pass criteria for C6
- Verify script exit 0; refund rate trends toward GREEN on D+4 export (document in notes—even one day improvement counts as recovery signal).
Proof table (sample GREEN row)
| Field | Value | Source |
|---|---|---|
build_id_before |
2026-11-01-trunk01 | BUILD_RECEIPT |
build_id_after |
2026-11-05-trunk02 | forward fix receipt |
| Root cause | fest config toggle | C4 isolation |
| Rollback avoided | true | C5 |
| R3 before | RED | retention challenge |
| Smoke after | 2x clean | C6 |
crash_recovery_ok |
true | master receipt |
Decision tree — rollback vs forward fix (beginner)
Crash reports D+2?
├─ No → watch analytics; do not patch
└─ Yes → R3 smoke RED?
├─ No → FAQ/store copy issue; not this case study
└─ Yes → Repro in C2?
├─ No → keep collecting logs
└─ Yes → Fest-only flag in stack?
├─ Yes → C5 forward toggle fix (this URL)
└─ No → evaluate rollback vs code hotfix with forward #9 exception
Facilitator stand-up script (C5 + C6)
## Post-fest crash recovery — stand-up (20 min max)
- C1: symptom timeline filed (refund + R3 + support)
- C2: crash-repro/D+3/ with Player.log
- C3: real_spike_confirmed true (not lag only)
- C4: root_cause_class fest_config_toggle_left_enabled
- C5: forward fix trunk02 — rollback_avoided true
- C6: post_fest_crash_recovery_receipt_v1.json + crash_recovery_ok
No public "fixed" until C6 smoke twice clean.
Moderation comms templates
Hold (before C5):
"We see post-fest crash reports and are reproducing on trunk build. We are not rolling back the fest build—we are isolating root cause and will ship a forward fix with receipt evidence."
Post-fix (after C6):
"Forward fix 2026.11.05-trunk02 addresses menu crash on trunk. Fest RC build remains in history. If crashes persist, send Player.log path from repro folder template."
Integration with November cluster
| Cousin | Relationship |
|---|---|
| Retention challenge #3 | R3 RED triggered this recovery |
| Analytics #2 | C1/C3 use refund export + lag audit |
| 5-day crash log | C2 folder structure cousin |
| Branch unset #1 | C5 promotes on trunk after unset |
| Forward #9 patch opinion | POSTFEST-PATCH-001 on C5 |
| Forward #7 jq weekly | After C6 GREEN |
| Help #50 forward | Runtime crash recovery fix format |
Scenarios A–G
A — R3 GREEN but refunds YELLOW
C1 may pass on refunds alone—run C2 anyway before patch; smoke may miss Deck-only crash.
B — Analytics says no spike, support says yes
C3 real_spike_confirmed via smoke repro—trust installed truth over delayed CSV.
C — Team demands rollback
C4 isolation proves toggle—C5 forward fix is smaller blast radius; document rollback_avoided: true.
D — Crash only on Steam Deck
Add Deck repro to C2; glyph/input path may differ—still forward fix if config shared.
E — Patch ships without POSTFEST-PATCH-001
Violates forward #9 policy—add exception row before C6 latch.
F — Two forward fixes same week
Increment build_id twice; append jsonl correction rows—do not edit prior lines.
G — Partner diligence zip
Attach C1–C6 receipts + repro logs redacted—no player Steam IDs.
Common mistakes
- Rolling back fest RC when trunk config caused crash.
- Setting
crash_recovery_okwithout C2 repro folder. - Trusting D+1 download dashboard over R3 smoke RED.
- Shipping binary hotfix when toggle disable suffices.
- Skipping second clean install on C6.
- Deleting fest build from Steamworks "to clean up."
RED / YELLOW / GREEN routing
| Color | Condition | Action |
|---|---|---|
| RED | C2 cannot repro | Keep collecting; do not patch blind |
| YELLOW | Repro yes, root cause unclear | Complete C4 before C5 |
| GREEN | C1–C6 pass | Resume retention challenge R4/R5; forward jq #7 |
Enterprise notes
- Incident record: Link master receipt to ticket system ID in
notes. - Telemetry: Disable fest overlay in prod config schema with lint rule.
- Partner comms: "Forward fix" language—not "rollback" unless C4 demands it.
D+4 verification habit (post-recovery)
After C6 latches, schedule one D+4 export row in the same CSV habit as analytics #2: compare refund lane to pre-fix D+2, confirm support ticket volume drops, and append a one-line note to post_fest_crash_recovery_receipt_v1.json notes field. If refunds stay YELLOW while smoke is GREEN, re-open C4—do not declare victory on smoke alone. This closes the loop for partner diligence without inventing crash-rate percentages Steam does not publish in first-week exports.
Key takeaways
- Post-fest crash spikes need C1–C6—not rollback reflex and hope.
- Analytics lag can hide D+2 clusters—smoke repro beats dashboard alone.
- Forward config toggle fix often beats nuking fest RC bytes.
- C2 repro folder is mandatory—pair retention R3.
crash_recovery_oklatches only after C6 two-clean-install smoke.- Pair 5-day crash log for folder discipline.
- Pair analytics #2 for refund threshold context.
- POSTFEST-PATCH opinion #9 P1–P6 required on C5 ship—POSTFEST-PATCH-001 minimum.
- Distinct from wrong-branch B1–B6 and setlive mismatch recovery cousins.
- Forward #12 capstone indexes
crash_recovery_okin child crosswalk.
FAQ
Should we ever rollback after fest?
When C4 proves binary corruption on trunk and forward fix fails smoke—document exception; rollback is last resort not first.
How is this different from retention challenge R3?
R3 is accountability gate; this URL is full recovery narrative C1–C6 when R3 stays RED.
Do we need exact crash rate percentages?
No—invented metrics forbidden; use refund warn threshold + repro + smoke.
Can we skip C3 if refunds obvious?
C3 still documents lag audit for partner diligence—even if quick pass.
What about Help #50?
Forward help fix owns runtime unblocker; this URL owns recovery story + receipts.
Related reads
- 5-Night Post-October Fest Demo Retention Response Challenge
- 14 Free Post-October Fest Steam Analytics Refund and Demo Uninstall Tools
- 5-Day Demo Crash Log Challenge Before Next Fest
- Your First SteamFest Branch Unset and Default Branch Return Receipt
- We Recovered Wrong Steam Default Branch After Localization Capstone GREEN
- Stop Shipping Post-Fest Hotfix Patches Without Numbered Post-Fest Patch Exception List — forward #9
- 25 Free Live-Ops Analytics Tools Indie Games 2026 Edition
- Official docs: Steamworks Sales Reports
Closing
Post-fest week is when crash reports arrive faster than analytics dashboards update—and when "roll it back" sounds safer than "fix it forward." Run gates C1–C6, keep the fest RC build in history, and let crash_recovery_ok mean you reproduced the menu crash, isolated the fest-only toggle, and shipped trunk02 with receipts—not that you panicked and deleted the proof. When retention challenge resumes on R4, the team answers "what did we learn?" with a grep-friendly folder—not a shrug.