Itch Steam Dual-Depot Dress Rehearsal Channel Label Mismatch - How to Fix
Problem: During October 2026 upload peak (and September dress rehearsals), itch HTML5 shows 2026-09-11-rc02 while Steam demo HUD / description still says 2026-09-04-rc01, so channel_label_match is false, verify_dual_sku_dress_rehearsal.sh fails, and dual_sku_rehearsal_ok stays false even though both uploads “succeeded.”
Who is affected now: Micro-studios shipping itch + Steam fest demos after dual-depot evening and Godot dual-depot Guide #50. This is recovery after label drift, not triple HTML5 channel_label_match (itch+GX+Steam), not wishlist-split recovery (discovery after GREEN bytes), and not VDF LF parse failures.
Fastest safe fix: Freeze promotions → pick one candidate build_id / build_label → rewrite shared VERSION / HUD source → re-export itch Web + Steam desktop → Butler + Steamworks upload → dual smoke screenshots → rewrite dual_sku_dress_rehearsal_receipt_v1.json with channel_label_match: true → latch dual_sku_rehearsal_ok.
Direct answer
Dual-SKU label mismatch means the two storefronts no longer advertise the same player-visible token. Fix the shared label writer, re-ship both channels from the same git SHA, then re-prove D3–D6—do not flip dual_sku_rehearsal_ok because Butler and steamcmd both exited 0.
Why this issue spikes before October upload peak
- Separate CI stamps — itch job uses
GITHUB_SHAshort; Steam job uses calendarrcNNfrom another workflow. - Itch-only mid-week push — marketing repushes HTML5 without Steam re-export.
- HUD painted on Steam only — Project Settings version updated; Web export preset still embeds old string.
- Store copy drift — Steam description edited by hand; itch page notes ignored.
- GREEN rehearsal went stale — Thursday row review still shows last week’s
channel_label_match: trueafter a Tuesday itch-only upload.
Symptoms and search phrases
- “dual_sku_rehearsal_ok false channel_label_match”
- itch HTML5 build label different from Steam demo
verify_dual_sku_dress_rehearsal.shfails after Butler push- Thursday BUILD_RECEIPT R6 RED dual SKU
- Godot Web export version ≠ Windows depot footer
- October Next Fest itch and Steam not the same build
Root causes (check in order)
- Two label writers — no single
build_labelsource for Web + desktop presets. - D1 violated — rehearsal spans two
build_idvalues silently. - D3 skipped — receipt flipped without HUD / store token table.
- D4/D5 stale — Butler version new; Steam
buildidold (or reverse). - Wrong cousin — treating triple-HTML5 help as dual itch+Steam only.
- Intentional scope gap — feature parity differs but version token should still match (visible build label opinion).
Beginner path (first 30 minutes)
Prerequisites: itch page + Steam demo depot access, Godot (or your engine) dual export presets, jq, write access to release-evidence/dual-sku/, Guide #50 open.
- Prove the failure:
REC="release-evidence/dual-sku/*/DUAL_SKU_DRESS_REHEARSAL_RECEIPT.json"
jq -e '.channel_label_match == true and .dual_sku_rehearsal_ok == true' $REC
# expect fail
Screenshot itch page / in-game HUD and Steam demo HUD — write both tokens on a sticky note.
-
Choose one recovery
build_label(usually today’s candidate, e.g.2026-09-18-rc03). Update Project Settings / VERSION file / HUD Label from one source both presets read. -
Re-export Web and Windows Desktop (or Linux) from the same git commit. Do not reuse yesterday’s Steam zip with today’s itch WASM.
-
Push itch (Butler) and Steam depot; record Butler status + Steamworks
buildidunderrelease-evidence/dual-sku/<label>/. -
Dual smoke on installed paths (private window itch + Steam client) →
smoke/itch_menu.png+smoke/steam_menu.pngshowing the same token. -
Rewrite receipt + BUILD_RECEIPT (below). Do not promote October fest while tokens disagree.
Developer path (recovery gates)
| Step | Action | Pass when |
|---|---|---|
| R1 | Confirm dual itch+Steam lane (not triple HTML5 / not wishlist case) | Correct cousin |
| R2 | Lock one build_id + shared label writer |
Single source for both presets |
| R3 | Re-export + re-upload both channels | Butler + Steam bytes from same SHA |
| R4 | Dual smoke screenshots | Identical player-visible token |
| R5 | Rewrite dual_sku_dress_rehearsal_receipt_v1 |
channel_label_match: true |
| R6 | Latch BUILD_RECEIPT + verify script | dual_sku_rehearsal_ok: true |
R1 — Pick the correct cousin
| Symptom | Lane |
|---|---|
| itch + GX + Steam three channels | Triple HTML5 channel_label_match help |
| Bytes GREEN, wishlists still split | Wishlist-split case study |
| steamcmd VDF parse / CRLF | VDF LF Guide |
| itch WASM stale after Butler | itch WASM MIME help |
| Labels disagree on itch + Steam only | This article (R2–R6) |
R2 — Shared label writer (Godot sketch)
# autoload or boot HUD — both Web and desktop read the same constant/file
const BUILD_LABEL := "2026-09-18-rc03"
Also set Project Settings → Application → Config/Version to the same string. Export presets must not override with divergent custom features unless documented as EXC-00N.
R5 — Receipt rewrite
{
"schema": "dual_sku_dress_rehearsal_receipt_v1",
"rehearsal_label": "october-next-fest-2026-dual-sku",
"locked_utc": "2026-09-18T19:30:00Z",
"build_id": "2026-09-18-rc03",
"build_label": "2026-09-18-rc03",
"git_commit": "abc123def",
"channel_label_match": true,
"recovery": {
"reason": "itch-only mid-week push drifted Steam label",
"previous_itch_label": "2026-09-11-rc02",
"previous_steam_label": "2026-09-04-rc01",
"recovered_utc": "2026-09-18T19:30:00Z"
},
"proof": {
"butler_status_path": "release-evidence/dual-sku/october-next-fest-2026-dual-sku/butler_html5.txt",
"steam_buildid_path": "release-evidence/dual-sku/october-next-fest-2026-dual-sku/steam_buildid.txt",
"smoke_dir": "release-evidence/dual-sku/october-next-fest-2026-dual-sku/smoke"
},
"gates": {
"D1_build_id": "pass",
"D2_channels": "pass",
"D3_label_match": "pass",
"D4_byte_proof": "pass",
"D5_dual_smoke": "pass",
"D6_receipt": "pass"
},
"dual_sku_rehearsal_ok": true
}
R6 — BUILD_RECEIPT + verify
{
"dual_sku_rehearsal_ok": true,
"channel_label_match": true,
"dual_sku_dress_rehearsal_receipt": "release-evidence/dual-sku/october-next-fest-2026-dual-sku/DUAL_SKU_DRESS_REHEARSAL_RECEIPT.json"
}
./scripts/verify_dual_sku_dress_rehearsal.sh \
release-evidence/dual-sku/october-next-fest-2026-dual-sku/DUAL_SKU_DRESS_REHEARSAL_RECEIPT.json
Verify
- itch private-window menu and Steam client menu show the same
build_label. jq -e '.channel_label_match == true'on the recovery receipt.jq -e '.dual_sku_rehearsal_ok == true'on BUILD_RECEIPT.- Thursday row review R6 no longer RED for this candidate.
Prevent
- One shared label writer for itch + Steam export jobs (Guide #50 D3).
- Re-run D1–D6 after any mid-week single-channel upload.
- Pair prevention with dual-depot evening before October peak.
- Keep visible build label discipline on both surfaces.
Related GamineAI reads
- Godot itch + Steam dual-depot dress rehearsal (Guide #50)
- itch + Steam dual-depot dress rehearsal evening
- BUILD_RECEIPT channel_label_match triple HTML5
- Wishlist-split after itch diluted Steam
- VDF LF steamcmd preflight
- itch WASM MIME / cache
- Thursday BUILD_RECEIPT row review
- Official: itch Butler · Steamworks Builds
October peak is the wrong week to learn itch and Steam advertised different builds—normalize one build_label, re-export both channels, dual-smoke, rewrite dual_sku_dress_rehearsal_receipt_v1, then latch dual_sku_rehearsal_ok only when channel_label_match is honestly true.