Skip to content

iOS rules

  • Never hand-edit .pbxproj or .xcodeproj/ contents beyond MARKETING_VERSION. Use scripts/bump-marketing-version.sh for that exception; for file membership, check XcodeGen first, then synchronized groups, otherwise ask for Xcode changes. The ios-project-development skill carries the procedure.
  • Never modify .xcworkspace; changing dependencies, deployment targets or .entitlements requires explicit user permission.
  • Build data stays in the worktree: pass -d "$(git rev-parse --show-toplevel)/DerivedData" to FlowDeck build/run/test/clean, or the same path via -derivedDataPath to raw Xcode queries and builds. Never share DerivedData across worktrees. Create .metadata_never_index before any build-output directory is populated; preserve the DerivedData* naming.
  • Interactive build/run/test and simulator mutations use FlowDeck; CI’s raw Xcode commands are deliberate. Read ios-build-verification before selecting tests: partial selection can silently drop parameterized cases. Verify actual results and counts, not merely exit status. Tests over 300 seconds are hung; stop and investigate.
  • FlowDeck streams stdout only. scripts/sim-os-log.sh is the sanctioned exception for read-only os_log from the run’s own simulator; mutation stays with flowdeck. Disclose the command and why stdout was insufficient in the PR body. Details: ios-build-verification.
  • App-runtime public keys live in gitignored Secrets.xcconfig; examples alone must never feed a release. Declare release secret names and formats in the manifest. CI/server credentials (including RevenueCat sk_…) never enter the app.
  • Only the app’s Info.plist may carry those keys (scripts/verify-bundle-secrets.sh).
  • Use ios-secrets-setup for wiring and scripts/write-release-config.sh for release config. Release only a SHA with successful completed CI; tags must point to a commit reachable from the default branch. Read ios-release-guide.
  • Release archives use the configured archive volume, never the checkout; missing storage must fail, not fall back. ASC processing delays are not proof an upload failed; do not blindly retry a non-idempotent upload.
  • ios-project-development: file membership, architecture, Swift Testing, SwiftData, DocC and subscription-skill routing.
  • ios-ci-configuration: product matrices, extra/watch test targets, runner placement, editor hooks and local/CI parity.
  • ios-build-verification: FlowDeck commands, selector traps, runtimes, simulator logs and worktree troubleshooting.
  • ios-release-guide: App Store requirements, archive location, upload recovery.
  • ios-secrets-setup: runtime vs server secrets and release provenance.
  • ios-ui-verification: accessibility-tree interaction, contrast, SwiftUI API pitfalls, concurrency and battery/performance guidance.