# V2 Platform Entitlement Verification

Phase 72.21.1.12 adds a platform entitlement verification surface for checking
that the current platform account owns the base game and requested DLC before
content loads. `FV2PlatformEntitlementVerificationPolicy` owns provider route
coverage, `FV2PlatformEntitlementContentRequirement` describes the content gate,
`FV2PlatformEntitlementReceipt` carries cached ownership proof, and
`FV2PlatformEntitlementVerificationPlan` decides whether content can load or a
platform SDK entitlement query must run first.

## Operations

`PlanPlatformEntitlementVerification` supports:

- `VerifyBaseGameOwnership` checks the configured `Game.Oshun.V2.Base` SKU
  before base content loads.
- `VerifyDlcOwnership` checks the current platform DLC SKU before optional
  content loads.
- `VerifyContentBundleAccess` is reserved for bundled base-game plus DLC access
  checks where the platform returns one signed entitlement result.

## Provider Routes

| Provider             | Native entitlement surface              | Base-game command                    | DLC command                           | Receipt command                              |
| -------------------- | --------------------------------------- | ------------------------------------ | ------------------------------------- | -------------------------------------------- |
| Steamworks           | `ISteamApps/ISteamUser`                 | `ISteamApps::BIsSubscribedApp`       | `ISteamApps::BIsDlcInstalled`         | `ISteamUser::GetAuthSessionTicket`           |
| Epic Online Services | `EOS_Ecom`                              | `EOS_Ecom_QueryOwnership`            | `EOS_Ecom_QueryEntitlements`          | `EOS_Ecom_QueryOwnershipToken`               |
| GOG Galaxy           | `galaxy::api::IApps/galaxy::api::IUser` | `galaxy::api::IApps::IsProductOwned` | `galaxy::api::IApps::IsDlcOwned`      | `galaxy::api::IApps::GetDLCProductIDByIndex` |
| PlayStation SDK      | `V2PlayStationEntitlementInterface`     | `PsnEntitlements.QueryGameLicense`   | `PsnEntitlements.QueryContentLicense` | `PsnEntitlements.ValidateSignedReceipt`      |
| Xbox GDK             | `V2XboxGdkEntitlementInterface`         | `XboxEntitlements.QueryGameLicense`  | `XboxEntitlements.QueryDlcLicense`    | `XboxEntitlements.ValidateSignedReceipt`     |

Console routes remain public stubs in `V2OnlineServices`. Proprietary
PlayStation and Xbox headers or symbols stay in restricted platform SDK modules.

## Rules

The default policy requires Steamworks, EOS, GOG Galaxy, PlayStation SDK, and
Xbox GDK route coverage. Each route must support base-game ownership, DLC
ownership, signed receipt validation, and a fail-closed command. Console routes
must be NDA-isolated and certification-scoped.

Content loading is fail-closed. A valid signed receipt for the current platform
and platform account allows the content load. A missing or expired receipt
blocks the content load and queues
`EV2PlatformSdkRequestType::QueryEntitlements` when the native platform
entitlement API is reachable. Wrong-account, wrong-platform, unsigned, and
unavailable-platform-API cases block the load without treating the content as
owned.

## Verification

Run:

```bash
python3 V2/ue/Tools/check-v2-platform-entitlement-verification.py
```

The checker validates the C++ API, contract, automation spec, CI workflow, Horde
gate, documentation, and TODO evidence for Section 72.21.1.12.
