Validation Reference
When you submit a BodyLink game, the fail-closed submission gate checks your bundle and — on rejection — names every failing check along with a one-line recommended fix. This page is the reference for those named checks. It is generated from the validator code (the validators' own remediation tables), so it cannot drift from what the gate actually emits.
Run the gate locally to get the same report the developer portal shows — see the Developer Guide for the full loop:
node scripts/validate-submission.mjs <bundle-dir> --report
Any code not listed below falls back to a generic fix — a failing check is never left without a recommended fix.
Static bundle validation checks
Each failed static validation names its check group and, per failing issue, a one-line recommended fix. The groups below are emitted in this display order. unity codes are matched by the unity. code prefix; anything unmapped falls into other.
Manifest & metadata (manifest/metadata)
| Issue code |
Recommended fix |
bundle.manifest_missing |
Add a valid bodylink.game.json at the bundle root (valid JSON). |
bundle.manifest_invalid |
Fix the bodylink.game.json so it parses and matches the manifest schema. |
bundle.manifest_file_missing |
Include bodylink.game.json in the exported bundle. |
bundle.entry_kind |
Set manifest entry.kind to "iframe" for Runtime v1 bundles. |
bundle.entry_missing |
Add manifest entry.html pointing at the bundle HTML entrypoint. |
bundle.launcher_missing |
Add a launcher block to the manifest for BodyLinkTV-ready bundles. |
bundle.launcher_field_missing |
Fill the named launcher field (description/color/gridSize/tags/howToPlay). |
bundle.launcher_metadata_missing |
Provide the required manifest metadata (id, name, version, runtimeRange). |
bundle.launcher_metadata_invalid |
Make manifest.version a valid SemVer (e.g. 1.0.0). |
bundle.manifest_version_mismatch |
Align package.json version to bodylink.game.json (the manifest is the source of truth), or run bodylink version <patch|minor|major> to bump both in lockstep. |
bundle.launcher_tracking_focus |
Set launcher.trackingFocus to one of: hand, body, none. |
bundle.launcher_tracking_preset |
Set launcher.trackingPreset to a valid preset when requiresCamera is true. |
bundle.launcher_tracking_tier |
Set launcher.trackingTier to one of: standard, high, custom. |
bundle.launcher_tracking_policy_invalid |
Make launcher.trackingPolicy an object when declared. |
bundle.launcher_tracking_custom_policy_missing |
Provide an explicit launcher.trackingPolicy for trackingTier "custom". |
bundle.launcher_tracking_policy_profile |
Set trackingPolicy.profile to a valid value (stability/latency/precise/balanced). |
bundle.launcher_tracking_pose_model |
Set trackingPolicy.poseModel to a valid value (lite/full). |
bundle.launcher_tracking_policy_tier |
Raw trackingPolicy budgets require launcher.trackingTier "custom". |
Capabilities & SDK compatibility (capabilities/sdk-compat)
| Issue code |
Recommended fix |
bundle.capability_missing |
Declare the required capabilities (iframe.bundle.v1, sdk.proxy.v1). |
bundle.tracking_invalid |
Fix the manifest tracking block so it matches the tracking schema. |
bundle.tracking_optional_invalid |
Correct the optional tracking declaration to a valid shape. |
bundle.tracking_optional_capability_missing |
Add the capability that the declared optional tracking feature requires. |
bundle.sdk_facade_missing |
Keep the SDK facade in the bundle, or externalize the SDK via the lock externalSdk descriptor. |
bundle.sdk_only_forbidden_reference |
Remove the host-internal reference; game bundles may use only the game-kit/iframe-sdk surface. |
bundle.sdk_only_unresolved_module_import |
Bundle or remove the unresolved module import; SDK-only bundles must resolve all specifiers. |
bundle.externalize_sdk_integrity_required |
Provide the SDK SRI integrity (run build:sdk-artifact) before externalizing the SDK. |
Catalog assets (catalog-assets)
| Issue code |
Recommended fix |
bundle.catalog_invalid |
Make manifest.catalog an object when declared. |
bundle.catalog_asset_missing |
Add the missing catalog asset (thumbnail and preview) as bundle-relative files. |
bundle.catalog_asset_metadata |
Declare image media metadata (type: image/*) for the catalog asset. |
Asset sizes (asset-sizes)
| Issue code |
Recommended fix |
bundle.asset_too_large |
Compress or split the file so each bundle file is under the per-file size limit. |
Bundle structure & offline safety (bundle-structure)
| Issue code |
Recommended fix |
bundle.asset_missing |
Ensure every manifest asset path resolves to an existing bundle file. |
bundle.path_empty |
Provide a non-empty bundle-relative path. |
bundle.path_not_relative |
Use a bundle-relative path (no absolute or URL-like paths). |
bundle.path_traversal |
Remove ".." traversal segments from the path. |
bundle.iframe_session |
Provide a valid manifest.iframeSession block. |
bundle.parent_origins |
Declare iframeSession.allowedParentOrigins explicitly. |
bundle.parent_origin_wildcard |
Replace the wildcard parent origin with explicit origins. |
bundle.sandbox |
Set a valid iframeSession.sandbox (allow-scripts only; never allow-same-origin). |
bundle.network_not_offline |
Set permissions.network to false for offline Runtime v1 bundles. |
bundle.html_external_reference |
Make HTML references bundle-relative; external URLs are not allowed in offline bundles. |
bundle.html_reference_missing |
Point the HTML reference at an existing bundle file. |
bundle.opaque_origin_module_script |
Drop module |