{
  "reference_version": "1.0.0",
  "ucp_version": "v2026-08-25",
  "mapping": [
    {
      "stabile_source": "Program name",
      "ucp_path": "loyalty.<key>.name",
      "schema_def": "loyalty_membership.name",
      "data_class": "public",
      "transformation": "Merchant-configured display name, unchanged.",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Shop domain",
      "ucp_path": "loyalty map key",
      "schema_def": "loyalty (propertyNames)",
      "data_class": "public",
      "transformation": "Reverse-domain of the merchant domain + \".rewards\" (harborpine.example → example.harborpine.rewards).",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Earn rate, minimum spend, first-order bonus",
      "ucp_path": "loyalty.<key>.tiers[].benefits[]",
      "schema_def": "membership_tier_benefit",
      "data_class": "public",
      "transformation": "Rendered as display-ready benefit descriptions under a single \"Member\" tier.",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Cart projected earning (base + first-order bonus)",
      "ucp_path": "loyalty.<key>.rewards[].earning_forecast",
      "schema_def": "earning_forecast",
      "data_class": "public",
      "transformation": "Integer points (decimal_places 0). Breakdown rules link to benefits by benefit_id. floor(subtotal × earn rate); 0 under the minimum.",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Points currency",
      "ucp_path": "loyalty.<key>.rewards[].currency",
      "schema_def": "reward_currency",
      "data_class": "public",
      "transformation": "Business-specific name and code; decimal_places omitted (0).",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Under-minimum explanation",
      "ucp_path": "messages[] (warning, membership_benefit_ineligible)",
      "schema_def": "message_warning",
      "data_class": "public",
      "transformation": "buildProgramVisibility explanation text, path pointing at the membership.",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Verification state",
      "ucp_path": "loyalty.<key>.provisional",
      "schema_def": "loyalty_membership.provisional",
      "data_class": "public",
      "transformation": "true for an unverified claim; false only after authenticated resolution.",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Authorized member status",
      "ucp_path": "loyalty.<key>.tiers[]",
      "schema_def": "membership_tier",
      "data_class": "buyer_authorized",
      "transformation": "Single-status program → one \"Member\" tier. Synthetic in this reference.",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Masked member identifier",
      "ucp_path": "loyalty.<key>.display_id",
      "schema_def": "loyalty_membership.display_id",
      "data_class": "buyer_authorized",
      "transformation": "Masked, last four only; set only when provisional is false. Synthetic here.",
      "contract_status": "released UCP"
    },
    {
      "stabile_source": "Redemption thresholds (500 points → $5)",
      "ucp_path": "not standardized",
      "schema_def": null,
      "data_class": "public",
      "transformation": "Described as benefit text only; the redemption itself has no UCP operation.",
      "contract_status": "Stabile-specific"
    },
    {
      "stabile_source": "Points balance / available points",
      "ucp_path": "not standardized",
      "schema_def": null,
      "data_class": "stabile_operational",
      "transformation": "Deferred by the extension to a payment instrument or future redemption capability.",
      "contract_status": "Stabile-specific"
    },
    {
      "stabile_source": "Reward code, point hold, settlement, expiry release",
      "ucp_path": "not standardized",
      "schema_def": null,
      "data_class": "stabile_operational",
      "transformation": "See the lifecycle fixture.",
      "contract_status": "Stabile-specific"
    }
  ]
}
