entitlement-grant · git:20260912.eef1cca · 2026-09-12 · sha256 3d24f13840e01375

entitlement-grant git:20260912.eef1ccaA

Immutable. This exact content never changes and is served at /api/v1/blob/3d24f13840e01375.

---
name: entitlement-grant
description: >
  Grant, restore, and revoke what was paid for. Use when a purchase
  succeeds and the item is missing, when debug VIP leaks into story-slot,
  or when restore is a dead button. Stacks on game-monetization.
---

# Entitlement grant

Ask the column.

| Column | Lands how |
|---|---|
| durable-unlock | once, restore-safe (remove-ads, act, cosmetic) |
| consumable-stack | count += N, no restore |
| time-pass | start → expiry, server or signed clock |
| battle-track | season id + tier |

## Order

```
store says ok → verify receipt → write entitlement → refresh HUD / inventory
restore tap → same verify → same write (idempotent)
```

Client-only "I bought it" flags are not durable-unlock.
Debug VIP writes lab-slot only (save-integrity). It is not a receipt.

## Iron rules

- Restore exists on the wall and in settings for every durable-unlock SKU.
- A second grant of the same durable id is a no-op, not a duplicate item.
- Consumable-stack does not use restore. Say so on the SKU card.
- Expiry uses a trusted clock. Local date rollback does not extend a pass.
- Failed verify: keep the pending UI, do not grant, do not eat the receipt.
- Combat columns do not read entitlements to shorten hitstop or cancels.

## Accept

Kill the app after a sandbox purchase; the unlock is still there. Restore on a second device grants once. A debug flag does not survive a story-slot load.