{
  "skill_name": "app-clips",
  "evals": [
    {
      "id": 0,
      "name": "entitlements-and-routing",
      "prompt": "Check our App Clip setup before we build it. Parent app: com.example.bakery; clip: com.example.bakery.Clip. Experiences: the default one, plus an advanced one for each shop. Clip screens are SwiftUI; the URL routing sits in a UIKit module shared with the parent app. Which entitlements, domain settings and URL entry points do we need?",
      "expected_output": "Lists the three raw entitlements and which target holds each, confirms the bundle ID prefix rule, shows SwiftUI and UIKit routing entry points correctly, requires the full app to handle every clip URL, and covers associated domains on both targets plus the association file.",
      "files": [],
      "expectations": [
        "Assigns two raw keys to the clip (on-demand-install-capable and parent-application-identifiers, with their com.apple.developer. prefix) and associated-appclip-app-identifiers to the parent app",
        "Says the clip identifier has to begin with the parent's identifier, which com.example.bakery.Clip does",
        "Names .onContinueUserActivity(NSUserActivityTypeBrowsingWeb) as the SwiftUI hook",
        "For the UIKit module, takes the cold-launch URL from connectionOptions.userActivities and the warm-launch URL from scene(_:continue:), and explains that the willContinueUserActivityWithType callback carries no URL",
        "Requires the parent app to open every clip link, since it takes the clip's place once installed",
        "Adds appclips: to Associated Domains in both targets and hosts the association file on the domain with the clip listed"
      ]
    },
    {
      "id": 1,
      "name": "handoff-notify-locate",
      "prompt": "We are building a parking-meter App Clip. People pay at a meter by tapping an NFC tag, we want to remind them before the meter runs out, sign-in is via Sign in with Apple, and when they install the full app their account and active session should carry over. We also want to be sure they are really at the meter. How should this work?",
      "expected_output": "Uses App Groups only for non-secret data, migrates Sign in with Apple via the stored user ID and a credential-state check, explains the one-way keychain rule, configures ephemeral notifications correctly, handles relaunch without a URL, and uses location confirmation rather than continuous tracking.",
      "files": [],
      "expectations": [
        "Keeps only non-sensitive values in the App Group and rules out credentials or secrets there in so many words",
        "Saves the Apple ID user identifier for the parent app, which calls getCredentialState(forUserID:) and proceeds only when the result is .authorized",
        "Explains the keychain is one-directional: the parent app reads items the clip wrote (iOS 15.4 and later, with the linking entitlements), never the reverse",
        "Configures NSAppClipRequestEphemeralUserNotification in the clip's NSAppClip dictionary, notes the permission lasts at most 8 hours from each launch, and tests for .ephemeral status first",
        "Handles relaunches from a notification, which carry no URL, using target-content-id for pushes or targetContentIdentifier for local notifications",
        "Verifies presence at the meter with NSAppClipRequestLocationConfirmation plus the activation payload (appClipActivationPayload, APActivationPayload) rather than tracking location continuously"
      ]
    },
    {
      "id": 2,
      "name": "feasibility-boundaries",
      "prompt": "PM question about an event check-in App Clip: people scan a QR code on a poster, view the day's schedule and check in. We'd like a Live Activity for the event and some cloud-hosted data; a few people also want in-app upgrade purchases and background refresh. Can this work? Please stay non-technical.",
      "expected_output": "A boundary-level feasibility answer: size tier by iOS version and invocation type, measurement and download warnings, CloudKit read-only scope, Live Activities via a clip-only extension, the excluded capabilities named, and sibling work routed elsewhere without implementation detail.",
      "files": [],
      "expectations": [
        "Walks through the size tiers by iOS version and explains that a QR launch counts as physical, so the 100 MB tier (iOS 17+, digital launches only) does not apply unless the demo link is used",
        "Asks for a thinning-report measurement and cautions against bundling heavy media or requiring downloads before check-in",
        "Keeps CloudKit to reading the public database (iOS 16+, CloudKit-Anonymous) and rules out writes, document or key-value iCloud storage, and private or shared containers",
        "Permits a Live Activity only via a clip-owned widget extension that holds nothing else and has the App Clip Extension capability, naming the on-demand-install-capable key",
        "Lists as unavailable: in-app purchases, Background Tasks, App Intents, custom URL schemes, SKAdNetwork, App Tracking Transparency, and any persistent or background behavior",
        "Hands ActivityKit, WidgetKit, StoreKit, BackgroundTasks, CloudKit and full-app work to their owners with no API names or code"
      ]
    }
  ]
}
