{"id":"customer-product-entitlement-lookup-contract","status":"customer-product-entitlement-lookup-ready","issue":141,"parentIssue":16,"route":"/products/entitlements","apiRoute":"/api/products/entitlements","sourceDataRoute":"/products/source-data","authBoundary":"checkout-intent-bearer-reference","lookupInput":"checkoutIntentId","redaction":{"buyerEmailIncluded":false,"buyerEmailHashIncluded":false,"rawStripeIdsIncluded":false,"sourceStripeEventIdsIncluded":false,"rawR2KeysIncluded":false,"signedUrlsIncluded":false,"metadataJsonIncluded":false,"downloadTokensIncluded":false},"privateFieldsExcluded":["buyerEmail","buyerEmailHash","buyerUserId","ownerUserId","sourceStripeEventId","stripeCheckoutSessionId","stripePaymentIntentId","stripeSubscriptionId","metadataJson","privateR2ObjectKeys","signedUrls"],"writeBoundary":"Issue #141 exposes a checkout-intent-scoped customer entitlement lookup with product, access-rule, and fulfillment status only. Issue #143 can create one-use download tokens for active file entitlements, issue #146 can stream a seeded private R2-backed fixture through Bumpgrade, issue #147 revalidates current entitlement and trusted checkout state at redemption, and issue #187 can show subscription-backed membership entitlement state after trusted Stripe Billing events. Private R2 keys, signed URLs, protected lessons, private buyer data, entitlement mutation, revocation, arbitrary asset uploads, Customer Portal actions, and live fulfillment automation remain future authenticated confirmed-write APIs.","source":"missing","loadError":null,"checkoutIntentId":null,"checkout":null,"counts":{"entitlements":0,"activeEntitlements":0,"fulfillmentTasks":0},"entitlements":[]}