Lesson 228: FMOD WebGL Snapshot Fest Demo Receipt (2026)
Direct answer: Before you paste the January 2027 itch HTML5 fest link into a public thread, require a GREEN Lesson 203 fmod_webgl_snapshot_receipt_v1.json, pass gesture + registration smoke on a cold browser tab, then file fmod_webgl_fest_snapshot_receipt_v1.json so BUILD_RECEIPT fmod_webgl_fest_snapshot promotes only when exploration (not combat) auditions in the first 90 seconds on itch_public.

Why this matters now (January 2027 itch HTML5 fest demos)
January 2027 teams finish Windows Wwise rows and press-key scope then promote the same build_label to itch. Facilitators open the demo in Chrome guest mode—combat music is loud because snapshots never registered after gesture, or the menu loop still runs the Combat snapshot from a debug session. Lesson 203 proves boot order; this lesson proves fest-session behavior on the storefront players actually click.
The FMOD 2.03 WebGL snapshot playbook and WebGL silent first scene help fix integration regressions; gesture parity preflight, bank-load preflight, and summer playtest desktop vs WebGL spot preflight are the ninety-second editor gates—228 is the live-ops fest promotion milestone on BUILD_RECEIPT.
Beginner path (cold-tab fest smoke)
| Step | Action | Success check |
|---|---|---|
| 1 | Confirm Lesson 203 receipt GREEN | promotion_allowed: true on child JSON |
| 2 | Open itch URL in new guest profile | No cached AudioContext |
| 3 | Wait 3 s pre-click | Menu bed silent or very low (F2) |
| 4 | Click game canvas once | Meters move; exploration snapshot |
| 5 | Stay on menu 90 s | No accidental Combat snapshot |
| 6 | File fmod_webgl_fest_snapshot_receipt_v1.json |
fest_snapshot_pass: true |
| 7 | BUILD_RECEIPT row | fmod_webgl_fest_snapshot GREEN |
Time: ~68 minutes first fest lane; ~12 minutes when 203 + parity guides are pinned.
Developer path (gates F1–F6)
| Gate | Check | Fail when |
|---|---|---|
| F1 | Child fmod_webgl_snapshot_receipt_v1 |
Missing or promotion_allowed: false |
| F2 | Cold-tab pre-gesture silence policy | Loud combat before click (false “working”) |
| F3 | Post-gesture exploration snapshot | Combat duck on menu without input |
| F4 | itch_public + build_label |
Wrong surface or label vs Lesson 201 |
| F5 | Desktop/WebGL duck parity | WebGL > 1.5 dB off desktop combat audition |
| F6 | Fest receipt + BUILD_RECEIPT | itch link public without F1–F5 |
Child receipt crosswalk (F1)
| Field | Child (203) | Fest wrapper (228) |
|---|---|---|
| Schema | fmod_webgl_snapshot_receipt_v1 |
fmod_webgl_fest_snapshot_receipt_v1 |
| Gates | W1–W6 | F1–F6 |
| Scope | Boot registration | 90 s menu fest session |
| Surface | webgl generic |
itch_public required |
Do not duplicate W3/W4 proof inside the fest receipt—reference the child path:
"child_receipts": {
"fmod_webgl_snapshot": "release-evidence/audio/FMOD_WEBGL_SNAPSHOT_RECEIPT.json"
}
fmod_webgl_fest_snapshot_receipt_v1.json
{
"schema": "fmod_webgl_fest_snapshot_receipt_v1",
"build_label": "fest-demo-2027-01-14-rc1",
"surface": "itch_public",
"fest_url": "https://YOURGAME.itch.io/demo",
"fmod_studio_version": "2.03.xx",
"child_receipts": {
"fmod_webgl_snapshot": "release-evidence/audio/FMOD_WEBGL_SNAPSHOT_RECEIPT.json"
},
"fest_session_probe": {
"browser": "chrome_guest",
"pre_gesture_silent": true,
"post_gesture_snapshot": "exploration",
"menu_loop_seconds": 90,
"combat_snapshot_heard": false
},
"parity": {
"desktop_combat_duck_db": -6.1,
"webgl_combat_duck_db": -5.7,
"delta_db": 0.4,
"within_tolerance": true
},
"gates": {
"F1_child_snapshot": "pass",
"F2_cold_tab_pre_gesture": "pass",
"F3_menu_exploration": "pass",
"F4_itch_label": "pass",
"F5_parity": "pass",
"F6_build_receipt": "pass"
},
"fest_snapshot_pass": true,
"fest_promotion_allowed": true
}
Pin under release-evidence/audio/FMOD_WEBGL_FEST_SNAPSHOT_RECEIPT.json.
Fest menu loop script (F3)
| Second | Expected snapshot parameter | Fail when |
|---|---|---|
| 0–3 | None / menu bed only | Combat bed audible |
| 3 (click) | Gesture unlock | No meter movement |
| 4–90 | Exploration = 1 | Combat = 1 without gameplay |
| 90+ | Optional combat audition | Combat before facilitator click-to-start |
Archive fest_audio_smoke.log with build_label, surface, and FMOD bus meter CSV export.
BUILD_RECEIPT row (F6)
| Column | Pass when |
|---|---|
fmod_webgl_fest_snapshot |
Fest receipt path + fest_snapshot_pass: true |
fmod_webgl_snapshot |
Child 203 receipt still GREEN |
channel_label_match |
Lesson 201 if GX/Steam also ship |
ALTER TABLE release_publish_gate ADD COLUMN IF NOT EXISTS
fmod_webgl_fest_snapshot_blocked BOOLEAN NOT NULL DEFAULT false;
CI verify_fmod_webgl_fest_snapshot_v1 fails when fest_url is non-empty in publish manifest and fest_snapshot_pass is false.
Relationship to Lesson 203 (not a repeat)
| Question | Lesson 203 | Lesson 228 (this) |
|---|---|---|
| When? | After FMOD 2.03 integration upgrade | Before public itch fest link |
| Proves? | Banks → snapshots → gesture boot | Fest menu session + child receipt |
| Receipt | fmod_webgl_snapshot_receipt_v1 |
fmod_webgl_fest_snapshot_receipt_v1 |
| Surface | Generic webgl |
itch_public only |
If 203 is RED, do not file 228—fix boot order first via bank-load preflight.
Key takeaways
- 203 GREEN is mandatory—fest receipt wraps boot proof, does not replace it.
- Cold guest tab catches cached AudioContext false positives.
- First 90 s must sound like your storefront menu, not combat debug.
itch_publicsurface ties to triple-channel labels.- Gesture parity preflight satisfies F5 when filed same
build_label. - Wednesday demo smoke should include guest-tab audio capture.
- Q1 capstone 229 wires 228 with 224–227.
- Windows audio is Lesson 226—do not conflate middleware receipts.
Common mistakes
- Promoting itch while 203 receipt still shows
Awake()registration fail. - Testing in the same browser profile that already clicked “Start”.
- Leaving Combat snapshot parameter at 1 in menu scene.
- Proving duck on desktop only for a fest HTML5 URL.
fest_urluses GX embed host but receipt saysitch_public.- Skipping Bevy wasm build_label when Rust wasm SKU ships same fest week.
Troubleshooting
| Symptom | Lane |
|---|---|
| Silent after click | WebGL first-scene help + 203 W4 |
| Loud combat on menu | F3 parameter reset; check debug Combat=1 |
| Child receipt missing | Re-run Lesson 203 milestone |
| Parity fail | Gesture parity preflight or playtest spot preflight |
| Wrong storefront audio | Lesson 201 |
| Banks stripped from build | FMOD banks missing help |
Mini exercise (68 minutes)
- Break F3 (leave Combat=1); confirm
fest_snapshot_pass: false. - Fix menu snapshot; pass cold-tab F2–F3.
- Attach child 203 JSON path; verify F1 crosswalk.
- Run F5 parity row; document exception if > 1.5 dB.
- Commit fest receipt; set BUILD_RECEIPT
fmod_webgl_fest_snapshotGREEN.
Continuity — Q1 2027 post-fest recovery (224–229)
| Lesson | Receipt focus |
|---|---|
| 224–227 | VOD, Ren'Py, Wwise, review keys |
| 228 (this) | FMOD WebGL fest snapshot |
| 229 | Q1 capstone |
Previous: Lesson 227 — Steam review-key press demo scope
Next: Lesson 229 — Q1 post-fest capstone receipt — Q1 arc 224–229 closed.
FAQ
Same as Lesson 203?
203 is boot registration; 228 is fest promotion with child receipt + 90 s menu policy.
Same as gesture parity guide?
Guide is ninety-second F5 evidence; this lesson files BUILD_RECEIPT fest row.
Godot FMOD bridge?
Same F1–F6 semantics; swap Unity hooks—fest receipt schema unchanged.
A loud combat bed on the itch menu is a fest refund mood—203 GREEN, cold-tab click, exploration for 90 seconds, then fmod_webgl_fest_snapshot_receipt.