{
  "skill_name": "storekit",
  "evals": [
    {
      "id": 1,
      "name": "ios26-subscription-paywall",
      "prompt": "Write the StoreKit 2 side of an iOS 26 SwiftUI meditation app that sells a monthly and a yearly plan. I need product loading, buying, entitlement checks, restore, reacting to changes made outside the app, Ask to Buy, and refunds.",
      "expected_output": "Sells through SubscriptionStoreView, StoreView or a PurchaseAction button as the preferred path instead of only calling product.purchase(options:). Iterates Transaction.updates from app launch in a task that cannot throw, and names what it brings in: renewals, refunds, approvals of Ask to Buy requests, and transactions a previous run never finished. Checks every VerificationResult before granting and finishes only after delivery. Explains the reach of Transaction.currentEntitlements: it lists permanent unlocks, auto-renewing plans that are active or in their grace period, and non-renewing passes, and it keeps no record of consumables. Handles .pending and .userCancelled, removes refunded or revoked access, offers restore, and links Terms of Service and the Privacy Policy on the paywall.",
      "files": [],
      "expectations": [
        "Prefers SubscriptionStoreView, StoreView or PurchaseAction over a bare product.purchase(options:) call",
        "Starts Transaction.updates at launch in a non-throwing task and says it carries renewals, refunds, Ask to Buy approvals and leftovers from earlier runs",
        "Checks VerificationResult before granting and calls finish() after delivery",
        "Explains that currentEntitlements holds permanent unlocks, live or grace-period auto-renewing plans and non-renewing passes, and nothing about consumables",
        "Covers .pending, .userCancelled, refunds and revocations, restore, and the subscription policy links"
      ]
    },
    {
      "id": 2,
      "name": "stale-offer-apis",
      "prompt": "Review this offer code from an older branch: it reads Product.SubscriptionInfo.Status.status(for:) to find the plan state, shows every entry of winBackOffers to anyone who cancelled, applies .subscriptionPromotionalOffer(offer:signature:) on the store view, and logs transaction.offerType and transaction.offerID after purchase. Bring it up to date for iOS 26 and say how to test it.",
      "expected_output": "Changes Product.SubscriptionInfo.Status.status(for:), which does not exist, to the static Product.SubscriptionInfo.status(for:). Explains that winBackOffers is an unfiltered list and must be narrowed to the IDs in the verified renewalInfo.eligibleWinBackOfferIDs before anything is shown or bought. Moves the store view to the iOS 26 .subscriptionPromotionalOffer(offer:compactJWS:) closures, or keeps signed promotional offers separate as purchase options built with promotionalOffer(_:compactJWS:). Swaps the deprecated offerType and offerID properties for the optional offer property and its type and id. Suggests exercising promotional, win-back and code redemptions, Ask to Buy and renewal states in a StoreKit configuration file or the sandbox.",
      "files": [],
      "expectations": [
        "Uses the static Product.SubscriptionInfo.status(for:) in place of Product.SubscriptionInfo.Status.status(for:)",
        "Filters winBackOffers through verified renewalInfo.eligibleWinBackOfferIDs and calls showing all of them to every lapsed user wrong",
        "Uses the iOS 26 subscriptionPromotionalOffer closures with compactJWS, or keeps the signed purchase option path visibly apart",
        "Replaces offerType and offerID with the offer property (offer?.type, offer?.id)",
        "Suggests a StoreKit configuration file or the sandbox to exercise promotional, win-back and code offers, Ask to Buy and renewal states"
      ]
    },
    {
      "id": 3,
      "name": "scope-boundaries",
      "prompt": "Before launch our subscription app needs a privacy manifest, an ATT prompt, new screenshots after a metadata rejection, a keyword refresh for search ranking, and a check that the paywall is compliant. We also link to our website for cheaper annual plans. Which parts are StoreKit work?",
      "expected_output": "Keeps StoreKit to products, paywalls, purchase flows, verification, restore and entitlements, including the paywall compliance points. Hands the privacy manifest, ATT, the new screenshots, the metadata rejection and overall launch readiness to app-store-review, and keywords, search ranking, captions and conversion to app-store-optimization. Explains that digital features are normally sold through in-app purchase, with room for a present-day exception, a storefront-specific rule or an entitlement Apple has granted. Rejects the idea that any link to the website is an automatic rejection, and notes that reader-app provisions and the storefront decide whether the cheaper-plans link may stay.",
      "files": [],
      "expectations": [
        "Limits StoreKit to products, paywalls, purchase flows, verification, restore and entitlements",
        "Hands privacy manifests, ATT, screenshots, metadata rejections and launch readiness to app-store-review",
        "Hands keywords, ranking, screenshot captions and conversion to app-store-optimization",
        "Says digital features are normally sold through in-app purchase, with room for a current exception, a storefront rule or a granted entitlement",
        "Does not treat every external link as an automatic rejection; mentions reader-app and storefront-dependent rules"
      ]
    }
  ]
}
