App Intents Code Review
Quick Reference
| Issue Type | Reference | |------------|-----------| | AppIntent protocol, perform(), return types | references/intent-structure.md | | AppEntity, EntityQuery, identifiers | references/entities.md | | AppShortcutsProvider, phrases, discovery | references/shortcuts.md | | @Parameter, validation, dynamic options | references/parameters.md |
Review Checklist
- [ ]
perform()marked with@MainActorif accessing UI/main thread resources - [ ]
perform()completes within 30-second timeout (no heavy downloads/processing) - [ ] Custom errors conform to
CustomLocalizedStringResourceConvertible - [ ]
EntityQuery.entities(for:)handles missing identifiers gracefully - [ ]
EntityStringQueryused if Siri voice input needed (not plainEntityQuery) - [ ]
suggestedEntities()returns reasonable defaults for disambiguation - [ ]
AppShortcutphrases include.applicationNameparameter - [ ] Non-optional
@Parameterhas sensible defaults or usesrequestValue() - [ ]
@IntentParameterDependencynot used on iOS 16 targets (crashes) - [ ] Phrases localized in
AppShortcuts.strings, notLocalizable.strings - [ ] App Intents defined in app bundle, not Swift Package (pre-iOS 17)
- [ ]
isDiscoverable = falsefor internal/widget-only intents
When to Load References
- AppIntent protocol implementation -> intent-structure.md
- Entity queries, identifiers, Spotlight -> entities.md
- App Shortcuts, phrases, discovery -> shortcuts.md
- Parameter validation, dynamic options -> parameters.md
Review Questions
- Does
perform()handle timeout limits for long-running operations? - Are entity queries self-contained (no
@Dependencyinjection in Siri context)? - Do phrases read naturally and include the app name?
- Are SwiftData models passed by
persistentModelID, not directly? - Would migrating from SiriKit break existing user shortcuts?
Hard gates (before reporting)
Complete in order for each finding you intend to report. Do not advance until the pass condition is satisfied.
- Location artifact — The finding includes
[FILE:LINE](or a line range) copied from the current file contents; the path resolves in this repo. - Scope read — You read the full surrounding type: the
AppIntent/AppEntity/EntityQuery/AppShortcutsProvider(or equivalent) that contains the flagged code, not only a diff hunk or snippet. - Platform or integration claim (only if the finding depends on minimum iOS, Swift Package vs app target,
@IntentParameterDependencyavailability, SiriKit migration, orisDiscoverable/ extension placement) — You name one concrete artifact you inspected (for exampleIPHONEOS_DEPLOYMENT_TARGETor target membership in the Xcode project,Package.swiftplatforms, entitlements, or where the intent file lives) or you drop or downgrade the finding to an open question. - Protocol — Pre-report steps in review-verification-protocol are satisfied for this item (no finding if they are not).
Use the issue format [FILE:LINE] ISSUE_TITLE for each reported finding. Hard gate 4 is the full pre-report checklist for this skill’s review type.