{
  "skill_name": "contacts-framework",
  "evals": [
    {
      "id": 1,
      "prompt": "Our iOS 26 carpool app shows the user's contacts so they can invite riders. Some testers chose to share only a handful of contacts and now say the list is nearly empty and there is no way to add more. How should the app treat this permission state and let them share more?",
      "expected_output": "Identifies the .limited authorization state, treats it like .authorized for proceeding, explains that the app sees and edits just the shared contacts plus any it created itself, and offers ContactAccessButton or the contactAccessPicker modifier so people can share more. Distinguishes managing limited access from picking a contact with CNContactPickerViewController.",
      "assertions": [
        "Lets the app continue in the .limited state just as in .authorized",
        "Explains that .limited reaches shared contacts and contacts the app itself created, nothing else",
        "Offers ContactAccessButton or contactAccessPicker to expand access",
        "Separates limited-access management from one-off selection with the contact picker"
      ]
    },
    {
      "id": 2,
      "prompt": "Here is our plan for a CRM contact list: fetch CNContactCompleteNameKey for names, CNContactImageDataKey for the round avatars, and CNContactNoteKey to show a note preview in each row. Anything wrong?",
      "expected_output": "Rejects CNContactCompleteNameKey in favour of CNContactFormatter.descriptorForRequiredKeys(for: .fullName) or individual name keys, swaps the full image for CNContactThumbnailImageDataKey in list avatars, and points out that reading notes (CNContactNoteKey) is gated by an Apple-approved entitlement, com.apple.developer.contacts.notes, granted before App Store distribution.",
      "assertions": [
        "Replaces CNContactCompleteNameKey with the formatter descriptor or individual name keys",
        "Uses thumbnail image data rather than full-resolution image data for list avatars",
        "Ties CNContactNoteKey to the com.apple.developer.contacts.notes entitlement",
        "Notes that the notes entitlement needs Apple approval before public distribution"
      ]
    },
    {
      "id": 3,
      "prompt": "We want users to pick one email address from their contacts without granting us Contacts access, and we also want to sync incrementally by calling store.enumerateChanges(matching:) when the address book changes. Sketch both parts.",
      "expected_output": "Uses CNContactPickerViewController, which works without any Contacts permission and hands back just the chosen item, configuring predicateForEnablingContact and predicateForSelectionOfProperty (and displayedPropertyKeys) before presenting it. Rejects enumerateChanges(matching:) as nonexistent, explains the change-history enumerator is an Objective-C selector unavailable in Swift, and recommends refetching on CNContactStoreDidChange or wrapping an Objective-C bridge.",
      "assertions": [
        "States that the picker needs no Contacts authorization and returns only what was selected",
        "Sets predicateForEnablingContact and predicateForSelectionOfProperty before presentation",
        "Rejects enumerateChanges(matching:) as an API that does not exist",
        "Says change history comes from an Objective-C selector that Swift cannot call",
        "Recommends refetching on CNContactStoreDidChange or an isolated Objective-C bridge"
      ]
    }
  ]
}
