April Addressables Warm Catalog CDN Smoke Fails After Content Update - How to Fix
Problem: After an April 2027 Addressables content update (post–March capstone), producers say “receipt passed / uploaded,” but warm_catalog_ok stays false—public CDN catalog GET returns a stale hash, profile Remote.LoadPath drifts, or the installed player still misses remote keys (InvalidKeyException / RemoteProviderException) while Editor Play looked fine.
Who is affected now: Teams running April warm catalog evening and Unity Guide #51 before Summer Sale concurrency. This is recovery when A4/A5 fail after upload theater, not orphan recovery after warm GREEN (ghosts after warm_catalog_ok: true), not Invalid Key only without CDN proof, and not Library cache ContentState alone.
Fastest safe fix: Freeze promote → pin ServerData catalog SHA-256 → purge / invalidate public catalog edge → cold GET until body hash matches → installed player smoke (clear Addressables cache) on remote label → rewrite april_content_update_warm_catalog_receipt_v1.json → latch warm_catalog_ok.
Direct answer
A content-update “pass” that never proved the public catalog path and an installed remote label is not a warm path. Fix LoadPath + edge identity, re-smoke cold, then rewrite the warm receipt—do not flip warm_catalog_ok because CI uploaded ServerData.
Why this issue spikes before Summer Sale (April 2027)
- Origin PUT ≠ edge warm — upload to bucket succeeds; CDN still serves yesterday’s
catalog_*.hash. - Profile variable drift — staging LoadPath in CI; prod hostname in player.
- Editor-only smoke — Play Mode resolves local/cached catalogs; A5 never ran.
- Capstone allow without warm gate —
april_content_update_allowed: truetreated as player-ready. - Wrong cousin — teams jump to orphan R1–R6 while A4 still RED (orphan lane needs warm GREEN first).
Symptoms and search phrases
- “warm_catalog_ok false after content update”
- Addressables CDN catalog hash mismatch April
verify_april_warm_catalog.shfails catalog_url- installed player InvalidKeyException remote label after promote
- Remote.LoadPath stale after Addressables content build
- April content update receipt passed player still cold
Root causes (check in order)
- Stale CDN edge — public GET body SHA ≠ ServerData catalog SHA (A4).
- Wrong catalog URL — profile
{CatalogHash}/ env token points at old path. - A5 skipped — only Editor or warm browser tab; no cold installed player.
- Library / ContentState poison — CI GREEN from cached Library while public bytes differ (Guide #24).
- Orphan surface mistaken for warm fail — if A1–A6 were honestly GREEN and Sale traffic still hits ghosts, use orphan case study.
- Key missing from catalog — true Invalid Key after CDN hash matches (Invalid Key help).
Beginner path (first 30 minutes)
Prerequisites: Unity 6.x Addressables remote catalog, access to candidate ServerData, CDN purge or invalidate rights, one installed RC player, jq + curl, write access to release-evidence/april-2027/warm-catalog/, Guide #51 open.
- Prove the failure:
REC=release-evidence/april-2027/warm-catalog/*/april_content_update_warm_catalog_receipt_v1.json
jq -e '.warm_catalog_ok == true' $REC
# expect fail
URL="$(jq -r '.catalog_url' $REC)"
curl -sS -o /tmp/catalog.body.bin "$URL"
sha256sum /tmp/catalog.body.bin
# compare to receipt .catalog_sha256 — mismatch = this article
-
Confirm March allow is still true (
april_content_update_allowed)—do not warm a blocked April path (Friday closeout). -
Re-pin catalog SHA from the same
ServerDatafolder CI uploaded (not an old artifact). -
Purge / invalidate the public catalog object (and hashed path if your CDN keys by hash). Re-GET until body SHA matches A2.
-
Install player → clear Addressables cache / app data → load
april-warm-smoke(or your label) → saveplayer-warm-smoke.log. -
Rewrite receipt + BUILD_RECEIPT (below). Do not promote Summer Sale content updates while A4/A5 stay RED.
Developer path (recovery gates)
| Step | Action | Pass when |
|---|---|---|
| R1 | Confirm warm-fail lane (not orphan-after-GREEN) | A4/A5 RED or warm_catalog_ok false |
| R2 | Re-pin ServerData catalog + content SHA-256 | Matches uploaded candidate |
| R3 | Fix profile LoadPath + purge CDN catalog edge | Public GET hash == A2 |
| R4 | Cold installed-player remote label smoke | Log shows remote catalog + label load |
| R5 | Rewrite april_content_update_warm_catalog_receipt_v1 |
A1–A6 GREEN fields honest |
| R6 | Latch BUILD_RECEIPT + verify script | warm_catalog_ok: true |
R1 — Pick the correct cousin
| Symptom | Lane |
|---|---|
warm_catalog_ok was true; Sale hits ghost hashes |
Orphan recovery case study |
| CDN hash matches; single key missing | Invalid Key help |
| CI Library / ContentState drift | Library cache Guide #24 |
| Hash mismatch after CDN purge path quirks | Remote catalog hash mismatch help |
| Upload theater; A4/A5 still fail | This article (R2–R6) |
R3 — CDN purge + public GET (sketch)
CAND=release-evidence/april-2027/warm-catalog/2027-04-02-rc01
URL="$(jq -r '.catalog_url' "$CAND/april_content_update_warm_catalog_receipt_v1.json")"
# After CDN invalidate / purge of catalog object:
curl -sS -D "$CAND/catalog.response.headers" -o "$CAND/catalog.body.bin" "$URL"
sha256sum "$CAND/catalog.body.bin" | tee "$CAND/cdn_catalog_sha256.txt"
jq -e --arg h "$(cut -d' ' -f1 "$CAND/cdn_catalog_sha256.txt")" \
'.catalog_sha256 == $h' "$CAND/april_content_update_warm_catalog_receipt_v1.json"
Fail: hashing origin-only URLs while players use a different hostname; or trusting 200 OK without body SHA.
R4 — Cold installed player (not Editor)
- Install the RC that points at the recovered LoadPath.
- Clear Addressables cache / player persistent data.
- Load the smoke remote label.
- Capture log with catalog source URL + location count.
- Screenshot menu / asset that proves the label resolved.
Editor Play Mode does not close R4.
R5 — Receipt rewrite
{
"schema": "april_content_update_warm_catalog_receipt_v1",
"receipt_id": "april-2027-rc01-warm-catalog-recovery",
"build_label": "2027-04-02-rc01",
"catalog_url": "https://cdn.example.com/addr/<CatalogHash>/catalog.json",
"catalog_sha256": "REPLACE_WITH_SERVERDATA_AND_CDN_MATCH",
"content_sha256": "REPLACE_REQUIRED_BUNDLE",
"remote_load_path": "https://cdn.example.com/addr/{CatalogHash}",
"environment": "prod",
"smoke_label": "april-warm-smoke",
"recovery": {
"reason": "CDN edge served stale catalog after ServerData PUT",
"previous_cdn_sha256": "STALE_HASH",
"purged_utc": "2027-04-02T18:40:00Z",
"cold_player_log": "release-evidence/april-2027/warm-catalog/2027-04-02-rc01/player-warm-smoke.log"
},
"gates": {
"A1": "GREEN",
"A2": "GREEN",
"A3": "GREEN",
"A4": "GREEN",
"A5": "GREEN",
"A6": "GREEN"
},
"warm_catalog_ok": true,
"notes": "Do not confuse with remote_catalog_orphan_recovery_ok after a prior warm GREEN"
}
R6 — BUILD_RECEIPT + verify
{
"warm_catalog_ok": true,
"april_content_update_warm_catalog_receipt": "release-evidence/april-2027/warm-catalog/2027-04-02-rc01/april_content_update_warm_catalog_receipt_v1.json"
}
bash scripts/verify_april_warm_catalog.sh \
release-evidence/april-2027/warm-catalog/2027-04-02-rc01/april_content_update_warm_catalog_receipt_v1.json
Verify
- Public catalog GET body SHA equals receipt
catalog_sha256. - Fresh install loads smoke remote label with no InvalidKeyException.
jq -e '.warm_catalog_ok == true'on receipt and BUILD_RECEIPT.- Thursday content-update row review no longer treats upload theater as promote-ready.
Prevent
- Run Guide #51 A4–A5 before claiming warm GREEN.
- Smoke ≥1 installed remote label after every content build promote.
- Pair April warm evening for full A1–A6 ritual.
- Keep weekly catalog jq for Monday hash drift.
- If warm GREEN then Sale ghosts appear, switch to orphan recovery—do not re-run this help as a substitute.
Related GamineAI reads
- Unity April Addressables warm catalog CDN smoke (Guide #51)
- Your first April warm catalog receipt evening
- Remote catalog orphan after warm GREEN
- Unity Addressables Invalid Key runtime
- Remote catalog hash mismatch after CDN purge
- Library cache ContentState preflight
- Thursday content-update BUILD_RECEIPT row review
- Official: Unity Addressables remote content
Uploaded ServerData is not a warm catalog—purge the public edge until hashes match, cold-smoke an installed remote label, rewrite april_content_update_warm_catalog_receipt_v1.json, then latch warm_catalog_ok only when A4 and A5 are honestly green.