Let a missing optional effect degrade without hiding a missing core asset
Analysis
By Juliet Ramos, Playable Production Editor — 2 min read
View author profile
Let a missing optional effect degrade without hiding a missing core asset. A runnable teaching fixture with synthetic cases, a broken branch, and explicit untested cells.
One failed decorative load should not necessarily block the game, but a missing essential asset should. This fixture makes asset criticality explicit instead of applying one rule to every promise.
This edition is a laboratory fixture. Node and the companion HTML page execute the authored functions against synthetic cases. No physical device panel was run, no ad network reviewed the build, and no campaign result is inferred from a passing test.
What the documentation actually supplies
MDN: optional assets is the governing reference for the browser primitive. MDN documents Promise.allSettled as returning each promise's outcome after all have settled, including fulfilments and rejections. The application must decide what those outcomes mean for readiness. The fixture policy around that primitive is ours.
The failure the fixture isolates
The fixture creates promises from declared asset outcomes, then checks failures against required flags. The broken branch treats any rejection as fatal. The corrected branch can become ready without an optional effect while remaining blocked when the essential gameplay asset fails.
The broken branch is retained so a producer can see the exact mistake, not only the repaired output.
| Case | Input | Expected (fixed) | Broken output |
|---|---|---|---|
| optional effect missing | `[{"required":true,"ok":true},{"required":false,"ok":false}]` | `"ready"` | `"blocked"` |
| core asset missing | `[{"required":true,"ok":false},{"required":false,"ok":true}]` | `"blocked"` | `"blocked"` |
| all loaded | `[{"required":true,"ok":true}]` | `"ready"` | `"ready"` |
All 3 fixed-branch cases matched the spec when executed in Node on 19 September 2026.
What a pass does not prove
A pass proves readiness classification for the supplied manifest. It does not show that the game can actually render without the optional asset; that fallback must exist and be exercised. Marking an asset optional without removing downstream assumptions only postpones the crash until after the loading screen.
Untested cells in this edition: physical devices, host SDKs, network packaging limits, store-opening callbacks, and campaign performance. Those remain empty on purpose.
Next check on a real build
Audit every asset's consumers before assigning criticality. Provide a visible, lightweight fallback for optional decoration and a recoverable error for missing core content. Test offline or failed-loading conditions in the real host separately; this laboratory deliberately uses synthetic promises rather than making network requests.
Open the runnable fixture to re-execute the cases in a browser. Download the case record to keep inputs, expectations and limits with a QA ticket.
Background in the archive: Playable ad device testing matrix and Playable spec sheet before you build. Those guides describe practice; they are not a substitute for this fixture and this check does not recertify their every claim.
Featured
Related posts
measurement
playable ads
·1 min read
Playable completers vs video viewers: downstream payer quality
measurement
playable ads
·3 min read
Stop simulation time while the document is hidden
measurement
playable ads
·3 min read
Fit the whole playable stage inside a narrow viewport
measurement
playable ads
·2 min read
Require both intersection and document visibility before advancing
More from the Measurement desk
measurement
·2 min read
Airbridge adds Amazon Ads as an app measurement channel
measurement
·2 min read
When to freeze a cohort for payback review (and when not to)
measurement
media buying
·1 min read
Using predicted LTV in bids: disclosure checklist for the UA team
measurement
media buying
·1 min read