Your First Steam Crash Symbolicate Receipt JSON Before October Fest Promotion in One Evening - 2026
A player posts “game crashed on launch” in Discord. You ask for logs. They send a screenshot of Task Manager. Your engineer opens the minidump, sees 0x00007FF8A2C41E9A repeated twelve times, and patches a guess. October 2026 fest traffic turns that guess into a refund thread tied to the wrong depot.
October 2026 is the first fest cycle where many micro-studios already run BUILD_RECEIPT and Wednesday demo smoke—but still promote builds whose crash folders contain hash-only stacks. Partners and players attach .dmp files with no build_label. Refund dashboards tag rows crash while engineering cannot name the function.
This Tutorials & Beginner-First guide closes that gap in one evening: locate one Steam-era minidump (or your engine’s equivalent), run one symbolication pass, file crash_symbolicate_receipt_v1.json, and wire crash_symbolicate_ok on BUILD_RECEIPT before the next fest branch promotion.
Non-repetition note: 5-day crash-log challenge owns folder discipline; Lesson 214 owns the course milestone. This URL is the beginner evening path for Steam-first teams who have never filed a symbolication receipt. Pair refund signal dashboard so crash-tagged refund rows join readable stacks—not mystery hashes.
Why this matters now (October 2026)
- Fest install spikes multiply minidumps per hour—symbol upload lag becomes visible in week one.
- Multi-channel uploads (playtest isolation) mean identical stack hashes from different
build_labelvalues. - Refund language cites “crash on update” while stacks stay anonymous—refund dashboard triage stalls.
- Q4 diligence asks for receipt folders, not Discord clips—top-20 receipts hub lists
crash_symbolicate_receipt_v1as a spine row. - Steam Deck / Proton lanes add silent-failure cousins—symbolication still needs
build_labeleven when audio fails first (Deck Verified refresh).
Direct answer: Create release-evidence/crash/, copy one minidump, symbolicated top frames into SYMBOLICATED_STACK.txt, file crash_symbolicate_receipt_v1.json with promotion_allowed: true only when S1–S6 pass, then set BUILD_RECEIPT crash_symbolicate_ok: true before October promotion.
Who this is for and what you get
| Audience | You will be able to… |
|---|---|
| Beginner with first Steam demo | Find where Windows stores your crash dump |
| Solo engineer | Stop promoting while stacks are hash-only |
| Producer | Show partners one receipt row—not a thread |
| Working dev | Pin symbol upload to build_label in CI |
Time: ~2.5–4 hours first evening (includes symbol upload wait); 10 minutes per new build after.
Prerequisites: A Windows playtest or fest build that can crash once, BUILD_RECEIPT or written build_label, symbol backend account (Steam crash handler, Sentry, or local breakpad folder).
What you will have after one evening
release-evidence/crash/with README path notes- One minidump (or crash report export) archived under
minidumps/ SYMBOLICATED_STACK.txtwith function names (not only RVAs)crash_symbolicate_receipt_v1.jsonpassing S1–S6- BUILD_RECEIPT column
crash_symbolicate_okdocumented - Optional
SYMBOL_SERVER_PIN.jsonpin file (Lesson 214 cousin) - Discord pin: “attach minidump +
build_label, not screenshot-only”
Beginner path (first evening)
- Create
release-evidence/crash/README.mdwith your game’s log paths. - Reproduce one controlled crash on the build you plan to promote (internal menu hook only).
- Copy the newest
.dmpfrom the Steam crash folder (table below). - Upload symbols for that build to your backend once.
- Open the symbolicated view—confirm you see a function name you recognize.
- Paste receipt JSON template; set
promotion_allowedfrom gate table. - Add
crash_symbolicate_okto BUILD_RECEIPT; run Wednesday smoke on the samebuild_label.
Do not integrate Sentry, Backtrace, and Steam in one evening. Pick one backend.
Developer path (fest prep stack)
- Automate symbol upload in CI immediately after IL2CPP / link step.
- Inject
build_labelfrom the sameVERSIONfile as multi-channel facilitator contract. - Join crash exports to
upload_log.csvonbuild_id. - Fail promotion when
jq -e '.promotion_allowed == true'fails on receipt. - Feed
crashrefund tags from refund dashboard into the samebuild_labelpartition. - Forward Help #12 (Deck MangoHud idle GPU) only after audio/output lane is ruled out—GPU peg ≠ missing symbols.
Evening overview (four blocks)
| Block | Minutes | Output |
|---|---|---|
| A — Locate dump | 30–45 | One .dmp + build_label note |
| B — Upload symbols | 45–90 | Upload ID logged in pin file |
| C — Symbolicate | 30–60 | SYMBOLICATED_STACK.txt |
| D — Receipt + BUILD_RECEIPT | 30–45 | JSON + boolean column |
If symbol upload queues overnight, finish A and pin file tonight; C–D tomorrow—but do not promote until S4 passes.
Gates S1–S6 (promotion discipline)
| Gate | Check | Fail when |
|---|---|---|
| S1 | Symbol upload exists for this build_label |
New EXE, old symbols |
| S2 | build_label visible in crash metadata or sidecar |
Anonymous 1.0.0 only |
| S3 | surface matches playtest scope map |
playtest crash tagged fest_public |
| S4 | Top stack frame is a named function | RVA-only lines |
| S5 | Test crash hook removed from fest binary | BUILD_RECEIPT_TEST_CRASH in prod |
| S6 | crash_symbolicate_receipt_v1.json archived |
Missing receipt on promotion |
Promotion rule: promotion_allowed is true only when S1–S6 are pass. One fail → hotfix symbols, not store copy.
Where Steam and Windows hide minidumps (beginner table)
| Source | Typical path | Notes |
|---|---|---|
| Steam crash dumps | %VALVE%\steamapps\common\<Game>\ or user-selected folder |
Varies by title; check steam://settings crash reporting |
| Windows LocalCrashDumps | %LOCALAPPDATA%\CrashDumps\ |
.dmp after WER if enabled |
| Unity Player.log | %USERPROFILE%\AppData\LocalLow\<Company>\<Product>\ |
Log path ≠ minidump—copy both |
| Godot | user:// export path in export template |
Enable verbose; use OS crash folder on desktop exports |
| Unreal | Saved\Crashes\ in project or packaged Saved |
Pair Lesson 247 for menu lane |
Document your path in release-evidence/crash/README.md—players will not guess.
Symbolicate backends (pick one tonight)
Steam crash handler / breakpad folder
Many Steam-shipped Unity IL2CPP titles upload symbols through Steamworks crash reporting. Pass S4 when the Steam backend shows symbolicated frames for a test crash.
Beginner check: Trigger test crash → wait for report → open partner crash UI → confirm function names.
Sentry (or similar SaaS)
Upload debug files per release. Tag events with build_label custom tag. Pass S2 when the tag appears on the test event.
# Example: tag only — do not paste DSN into receipts
sentry-cli releases new "$BUILD_LABEL"
sentry-cli upload-dif --include-sources ./symbols
Local breakpad / llvm-symbolizer
Acceptable for internal playtests before SaaS wiring:
llvm-symbolizer -e YourGame.exe 0x00007FF8A2C41E9A
Archive stdout into SYMBOLICATED_STACK.txt. Not a substitute for player-field symbol servers at scale—document backend: local_dev_only in receipt.
build_label on the minidump (S2)
Crash metadata must answer: which depot crashed?
Unity: Application.version from the same file as BUILD_RECEIPT build_label.
Sidecar when SDK is thin:
{
"schema": "crash_context_v1",
"build_label": "fest-demo-2026-10-rc3",
"surface": "fest_public",
"minidump_sha256": "sha256:…",
"captured_at_utc": "2026-05-27T20:15:00Z"
}
Store beside the .dmp in release-evidence/crash/minidumps/2026-05-27-test/. Never put Steam IDs or emails in sidecars.
crash_symbolicate_receipt_v1.json (copy tonight)
{
"schema": "crash_symbolicate_receipt_v1",
"build_label": "fest-demo-2026-10-rc3",
"surface": "fest_public",
"symbol_server_pin": "release-evidence/crash/SYMBOL_SERVER_PIN.json",
"backend": "steam_crash_handler",
"test_crash": {
"trigger": "BUILD_RECEIPT_TEST_CRASH",
"minidump_path": "release-evidence/crash/minidumps/2026-05-27-test/crash.dmp",
"symbolicated_stack_path": "release-evidence/crash/SYMBOLICATED_STACK.txt",
"top_frame_named": true
},
"gates": {
"S1_symbol_upload_for_label": true,
"S2_build_label_on_metadata": true,
"S3_surface_match": true,
"S4_named_frame": true,
"S5_test_hook_removed_in_fest": true,
"S6_receipt_archived": true
},
"promotion_allowed": true,
"human_signoff": {
"role": "engineer",
"utc": "2026-05-27T21:00:00Z"
}
}
Set promotion_allowed to false if any gate is false—fix symbols, not marketing copy.
BUILD_RECEIPT wiring (developer)
Add to your BUILD_RECEIPT row (names may vary—stay consistent with top-20 hub):
{
"build_label": "fest-demo-2026-10-rc3",
"crash_symbolicate_ok": true,
"crash_symbolicate_receipt_path": "release-evidence/crash/crash_symbolicate_receipt_v1.json",
"symbol_server_pin_path": "release-evidence/crash/SYMBOL_SERVER_PIN.json"
}
Thursday row review should diff crash_symbolicate_ok across promotions—flipping false→true without a receipt path is a red flag.
Join refunds, playtest CSV, and smoke
| Signal | Tool | Action when crash spikes |
|---|---|---|
Refund row tag crash |
Refund dashboard | Partition by build_label |
| Discord thread | 18 playtest tools | Require minidump link |
| Binary boot | Wednesday smoke | Smoke green ≠ symbolicate green |
| Evidence hygiene | Friday Block 5 | Archive receipt weekly |
Forward: refund↔BUILD_RECEIPT correlation trend playbook assumes this receipt exists.
Engine quick reference (working dev)
| Engine | Symbol upload | Test crash (internal only) | Strip before fest |
|---|---|---|---|
| Unity IL2CPP | Steam / Unity Cloud | throw new Exception("BUILD_RECEIPT_TEST_CRASH") |
Remove dev menu |
| Godot 4.x | Sentry / breakpad | assert(false) behind flag |
Disable debug export |
| Unreal 5.6 | Crash Reporter + symbols | Force menu crash | Lesson 247 |
| GameMaker | OS minidump + external symbolicate | Controlled crash build | Separate fest depot |
| NW.js / Electron | Often OS-level only | Document limitation in receipt | Set backend: os_wer |
Honesty beats pretending every engine gets Steam-grade symbol servers on night one.
PowerShell: find newest .dmp (Block A helper)
$search = @(
"$env:LOCALAPPDATA\CrashDumps",
"$env:USERPROFILE\AppData\LocalLow"
)
Get-ChildItem -Path $search -Filter *.dmp -Recurse -ErrorAction SilentlyContinue |
Sort-Object LastWriteTime -Descending |
Select-Object -First 5 FullName, LastWriteTime, Length
Copy the relevant file into release-evidence\crash\minidumps\YYYY-MM-DD-test\.
Bash: receipt gate check (CI sketch)
#!/usr/bin/env bash
set -euo pipefail
RECEIPT="${1:?crash_symbolicate_receipt_v1.json}"
jq -e '
.schema == "crash_symbolicate_receipt_v1"
and .promotion_allowed == true
and (.gates.S4_named_frame == true)
' "$RECEIPT" >/dev/null
echo "crash_symbolicate promotion gate: OK"
Wire into promotion script after validate-packet optional guards.
SYMBOL_SERVER_PIN.json (optional cousin file)
{
"schema": "symbol_server_pin_v1",
"build_label": "fest-demo-2026-10-rc3",
"engine": "unity_il2cpp",
"backend": "steam_crash_handler",
"symbol_upload_id": "steam-upload-2026-05-27-abc",
"executable_sha256": "sha256:…",
"uploaded_at_utc": "2026-05-27T20:00:00Z"
}
Receipt points here; pin file changes every promotion.
Common mistakes (read before promoting)
- Promoting after smoke only — Wednesday proves boot, not symbolicated crashes.
- Symbols for commit A, EXE from commit B — S1 fails silently until refunds arrive.
- Screenshot of Event Viewer — not a substitute for
.dmp. - Leaving test crash menu in fest build — S5 fail; players trigger it intentionally.
- Mixing playtest and fest_public tags — S3 fail; wrong depot fixes.
- Filing receipt without archiving path — partners cannot find
05-operations/receipts/copy. - Skipping refund join — engineering fixes crash while store copy still promises co-op.
Proof folder layout
release-evidence/crash/
README.md
SYMBOL_SERVER_PIN.json
crash_symbolicate_receipt_v1.json
SYMBOLICATED_STACK.txt
minidumps/
2026-05-27-test/
crash.dmp
crash_context_v1.json
Zip release-evidence/crash/ for partner asks—grep-friendly.
Worked example (fictional, no invented metrics)
Studio: Solo dev shipping fest-demo-2026-10-rc3 on a Unity IL2CPP Windows depot.
Block A — 35 minutes: Internal build shows build_label in corner debug overlay (added for fest support). Dev triggers menu test crash. Newest .dmp appears under %LOCALAPPDATA%\CrashDumps\. Copied to minidumps/2026-05-27-test/ with sidecar JSON listing surface: fest_public.
Block B — 70 minutes: Steam symbol upload queued after IL2CPP build; SYMBOL_SERVER_PIN.json records symbol_upload_id. Executable SHA256 matches zip in 01-build/.
Block C — 40 minutes: Partner crash UI shows BUILD_RECEIPT_TEST_CRASH in frame 3—not anonymous RVA only. Saved text export to SYMBOLICATED_STACK.txt.
Block D — 25 minutes: Receipt JSON gates all true; BUILD_RECEIPT row sets crash_symbolicate_ok: true. Thursday row review diffs against rc2 where crash_symbolicate_ok was false due to missing upload.
Next morning: Refund dashboard row tags crash for rc2—team closes ticket as already fixed in rc3 with stack proof attached. No argument about whether the fix shipped.
This narrative is a pattern—your times and frame numbers will differ.
Gate failure triage (when S* fails)
| Failed gate | Likely cause | First fix | Re-verify |
|---|---|---|---|
| S1 | Symbols not uploaded for this label | Re-run upload job on CI artifact | New test crash |
| S2 | Version string hardcoded | Read VERSION file at boot |
Sidecar JSON |
| S3 | Wrong depot promoted | Check playtest isolation map | Metadata only |
| S4 | Wrong symbol arch (x86 vs x64) | Re-upload matching EXE | Symbolicate again |
| S5 | Test menu in fest SKU | Strip hook; rebuild depot | Receipt S5 true |
| S6 | Receipt only on engineer laptop | Copy to 05-operations/receipts/ |
Archive path in zip |
Do not mark S4 pass because a wiki page says symbolication works—pass requires your named frame in your artifact file.
October promotion week calendar (suggested)
| Day | Action | Receipt touchpoint |
|---|---|---|
| Mon | File symbol pin after CI build | SYMBOL_SERVER_PIN.json |
| Tue | Discord CSV ingest ritual (blog backlog #12—when published) tags blockers | Cross-check crash tags |
| Wed | Wednesday smoke on candidate label | Same build_label |
| Thu | Row review | Diff crash_symbolicate_ok |
| Fri | Friday Block 5 | Zip crash folder snapshot |
| Promo eve | Set promotion_allowed only if S1–S6 pass |
Archive receipt in partner packet |
Calendar is role discipline, not superstition—skipping Thu is how rc2 and rc4 swap without anyone noticing.
Multi-channel note (GX, itch, Steam)
HTML5 and browser demos may never produce Windows minidumps. For those surfaces:
- Set
crash_symbolicate_ok: n/awith documented reason in BUILD_RECEIPT comments, or - Use wasm panic / console capture receipts (Lesson 245 Bevy lane pattern).
Do not mark Steam Windows crash_symbolicate_ok: true because the itch tab “felt fine.” Each surface gets its own receipt column or explicit n/a.
Partner and diligence packet sentence
When Q4 diligence (blog backlog #10) asks for crash evidence, attach:
crash_symbolicate_receipt_v1.jsonSYMBOLICATED_STACK.txt(redact player paths if needed)- One-page README listing symbol backend and retention policy
Sentence for cover email: “Crash reports for build fest-demo-2026-10-rc3 are symbolicated per attached receipt; anonymous hash-only stacks are not used for promotion decisions.”
Key takeaways
- October fest traffic ships minidumps faster than Discord can organize them—receipts beat threads.
- One evening is enough for one backend, one test crash, one symbolicated stack.
- S1–S6 gates decide
promotion_allowed—not vibes. build_labelon metadata is as important as symbol upload.- BUILD_RECEIPT
crash_symbolicate_oklinks crashes to promotions audibly. - Refund dashboard
crashtags need symbolicated stacks to become engineering work. - Lesson 214 extends tonight into course capstone depth.
- Forward blog #5 (refund correlation playbook) builds on this receipt—file it first.
- Deck/Proton issues may look like crashes—rule out silent audio before blaming symbols.
- Thursday row review should catch
crash_symbolicate_okflips without receipts.
FAQ
Do I need a paid crash service?
Not on night one. Steam crash reporting or a single Sentry project is enough to pass S4. Scale later.
Can I promote if no player has crashed yet?
Yes—use a controlled test crash on the candidate build. Receipt test_crash documents it. Do not wait for fest traffic to learn symbol upload failed.
What if symbolication shows only GameAssembly.dll?
Symbols did not upload for that build_label. Fix S1, re-upload, re-crash—do not patch gameplay blindly.
Does this replace the 5-day crash-log challenge?
No. Crash-log challenge trains daily folders; this tutorial trains symbolication receipt on BUILD_RECEIPT.
How does this relate to Lesson 214?
Lesson 214 is the course milestone with X1–X6 and telemetry crosswalk. This blog is the one-evening onboarding path.
Should facilitators collect minidumps?
Yes—add to multi-channel facilitator contract: attach .dmp + build_label, not clips alone.
What about Linux or Deck-only repro?
Archive whatever the backend accepts (core dump, log bundle). Set backend honestly in receipt. Pair 16 ProtonDB and Deck log export tools for Linux/Deck layers when Windows minidumps are absent.
Can AI symbolicate for me?
Use AI on already symbolicated excerpts for triage summaries—do not paste raw minidumps into public LLMs. Security policy first.
What if Steam crash reporting is disabled for our title?
Enable it for Windows depots before fest, or switch tonight to Sentry with debug files. Receipt backend must match reality—auditors notice when the JSON says steam_crash_handler but the project never uploaded symbols there.
How long do we keep minidumps?
Retention policy belongs in release-evidence/crash/README.md: many teams keep 30 days of playtest dumps and one symbolicated exemplar per promoted build_label in the partner packet. GDPR: strip Windows usernames from paths when zipping for external share.
Standing meeting script (60 seconds)
Read aloud before promoting a fest branch:
- “What is the
build_label?” - “Is
crash_symbolicate_oktrue on BUILD_RECEIPT?” - “Where is
SYMBOLICATED_STACK.txtfor the test crash?” - “Did Thursday diff show any receipt path change?”
- “Are refund
crashtags for an older label already explained?”
If any answer is “I don’t know,” promotion waits—not because crashes are fashionable, but because unreadable stacks waste the first October weekend.
Related reading
- BUILD_RECEIPT beginner pipeline
- Refund signal dashboard
- Wednesday demo smoke ritual
- Thursday BUILD_RECEIPT row review
- Top 20 evidence receipts hub
- Lesson 214 — crash symbolicate + build_label
- Lesson 215 — refund dashboard on BUILD_RECEIPT
- 5-day crash-log challenge
- 18 playtest feedback tools
- Outbound: Steamworks documentation (crash reporting and depots—verify current partner paths)
Next in cluster: 16 ProtonDB / Deck log export tools (published); October refund↔BUILD_RECEIPT correlation trend playbook (published).