Native Recipe Behavior Notes
Purpose: Key gotchas, thresholds, and runtime constraints per Recipe Subcommand. Read when: Activating a Recipe via subcommand dispatch and the "Read First" reference is loaded.
Each entry is a 1-line summary — load the Recipe's "Read First" reference (see SKILL.md ## Recipes table) for full implementation detail.
| Recipe | Behavior |
|---|---|
swiftui |
iOS Swift 6.3 + @Observable + SwiftData/Core Data, T1 offline default, Liquid Glass on iOS 26 (chrome only). Concurrency: Xcode 26 default MainActor isolation ⇒ @MainActor implicit; mark off-main work @concurrent, helpers nonisolated, cross-actor types Sendable. List (not LazyVStack) for 1,000+ items; AsyncImage has no cache. Close with the SwiftUI VERIFY Gate (patterns.md) — strict-concurrency build + no main-thread blocking + chrome-only glass + #Preview. |
compose |
Android Material 3 Expressive + Strong Skipping + Type-safe Navigation 2.8+, targetSdk 35/36, edge-to-edge day 1. Stability: Strong Skipping default ⇒ pass List<T> by reference; ImmutableList only on a measured recomposition problem (not reflexive). collectAsStateWithLifecycle() + key={it.id} mandatory. 16KB native libs (useLegacyPackaging=false). Close with the Compose VERIFY Gate (patterns.md) — lifecycle collect + measured stability + no deprecated M3 + edge-to-edge/predictive-back + Baseline Profile. |
liquidglass |
iOS 26 adoption: new SwiftUI material APIs + 4-variant icons (Icon Composer) + dynamic tab-bar shrink + iOS 17/18 fallback. VERIFY: .glassEffect() on chrome only (never content); iOS 17/18 fallback path renders without glass; 4-variant icons exported via Icon Composer; recompiled on Xcode 26 (2026-04-28 submission deadline). |
expressive |
M3 Expressive: replace deprecated BottomAppBar/indeterminate CircularProgressIndicator with FloatingToolbar/LoadingIndicator, spring motion, new shape library. VERIFY: zero deprecated BottomAppBar/indeterminate CircularProgressIndicator; spring motion on dismiss/shape-morph/predictive-back; BOM 2026.05 (M3 1.4+) pinned. |
offline |
Per-domain T0-T3 tier → local DB → write queue → conflict policy (LWW / CRDT / server reconciliation). VERIFY: each domain's tier (T0-T3) is explicit not implicit; write queue is idempotent + retry-capped; conflict policy chosen (not defaulted); flush wired on network restore. |
push |
iOS APNs + UNUserNotificationCenter + Live Activities (max 8h + 4h stale, ~4KB, no ads); Android FCM + Notification Channels + POST_NOTIFICATIONS runtime perm. Soft pre-prompt mandatory. VERIFY: soft pre-prompt before the system prompt (iOS first-denial is sticky); cadence ≤ ~1 user-visible/10 min (>3/day → opt-out risk); silent push never used for analytics; token-refresh PATCH wired. |
deeplink |
Universal Links (AASA) + App Links (assetlinks.json) + Coordinator/NavController routing. Firebase Dynamic Links retired. Custom scheme = fallback only. VERIFY: AASA + assetlinks.json reachable at /.well-known/ with android:autoVerify="true"; Universal/App Link is primary (custom scheme fallback only); cold-start AND warm (onOpenURL/onNewIntent) both route; deferred deep link for post-install. |
bg |
iOS BGTaskScheduler, Android WorkManager/JobScheduler. ~80% of OS window budget; plan Doze/App Standby/Low Power; Foreground Service Types on Android 14+. VERIFY: work completes within budget (iOS ~30s refresh / Android ≤10 min expedited); constraints set (network/charging); Foreground Service Type declared (Android 14+); tested under Doze/Low Power. |
passkey |
Passkey (FIDO2/WebAuthn) default for new flows. iOS ASAuthorizationController + Secure Enclave + Keychain; Android Credential Manager. Sign in with Apple alongside any third-party social. VERIFY: Passkey is the default path for new sign-up; keys in Secure Enclave/Keychain (iOS) / Credential Manager (Android); Sign in with Apple offered whenever a third-party social login is (App Store 4.8); graceful fallback on unsupported devices. |
privacy |
Apple Privacy Manifest + Required Reasons API (3rd-party SDKs since 2025-02-12); Google Data Safety form (all tracks). Hand off to Cloak. VERIFY: PrivacyInfo.xcprivacy Required Reasons declared for the app and every 3rd-party SDK; Data Safety form accurate on all tracks; DPIA / data-flow handed to Cloak. |
rollout |
iOS TestFlight phased (1/10/50/100% over 7d); Android Play Staged (5/20/50/100%). Halt + hotfix on regression; server-driven flags as primary kill switch. VERIFY: server feature flag is the primary kill switch (native code is slow-rollback, store-mediated); halt criteria (crash-free %) defined before launch; hotfix path rehearsed; OTA-of-native is out of scope (CodePush/Shorebird are RN/Flutter only). |
store |
Pre-submission compliance: Privacy Manifest, Data Safety, 5-tier Age Rating (in effect since 2026-01-31), DSA, DMA, Sign in with Apple, AI disclosure (5.1.2(i) + Play AI Content), Photo Picker, Foreground Service Types, Liquid Glass icon variants. VERIFY: every applicable item present pre-submission — Age Rating refreshed to the 5-tier system, Privacy Manifest + Data Safety, Sign in with Apple, AI disclosure, Photo Picker scope, Foreground Service Types, icon variants. |
cli |
Terminal automation. iOS: xcrun-cli.md (simctl/devicectl/xctrace/xcresulttool/notarytool/atos). Android: adb-cli.md (pm/am/logcat/dumpsys/pair/Perfetto/monkey). adb reference includes iOS↔Android command map. VERIFY: commands are non-interactive + reproducible; artifacts captured to file (xcresult/Perfetto/logcat), not stdout-only; no hardcoded device/UDID — resolve dynamically. |
visualloop |
Agent-in-the-loop screen work against a named target (reference image / token set / numeric spec). SPECIFY → IMPLEMENT → BUILD → OBSERVE → SCORE → ADJUST, ≤ 3 passes then escalate. Observe by accessibility tree first, pixels only for spacing/color/type. Tool layer: Xcode 26.3+ xcrun mcpbridge (RenderPreview) / XcodeBuildMCP (headless) / mobile-mcp / Android Studio Agent Mode + Match UI to Target Image. VERIFY: target is a named artifact, not "make it nice"; accept decision comes from a numeric diff (ImageMagick RMSE) with a threshold set before the loop; dynamic regions masked before scoring; one screen per loop; BUILD success gates OBSERVE (never score a stale binary); per-pass metric reported — an unscored visual claim is UNVERIFIED. |