Review: StoreKit 2 purchase flow in Turbo Native shell

review-1642-2026-06-27 Review

review approved

Verdict: APPROVED

Re-review of board item #1642 (round 2). Issue body is complete, traceability is solid, scope is well-bounded for a single agent pass.

Template Completeness

  • [x] Type
  • [x] Lineage
  • [x] Repo
  • [x] User Story
  • [x] Context
  • [x] File Targets
  • [x] Feature Flag
  • [x] Acceptance Criteria
  • [x] Test Expectations
  • [x] Constraints
  • [x] Checklist
  • [x] Related

Traceability

  • [x] story:WS-S34 label — "As a parent, I want to subscribe to my child's team program through the iOS app so that Apple handles monthly billing and automatically enforces the delinquency gate if I fall behind on payments"
  • [x] story note verified — found in project-westside-basketball user-stories section under Parent
  • [x] arch:app-store label — App Store Billing architecture
  • [x] arch note verified — arch-app-store note exists in pal-e-docs (ID 2224), documents iOS StoreKit Purchase Flow component and references parent #78
  • [x] Forgejo issue — ldraney/westside-basketball#85, state: open

File Targets

  • [x] westside-basketball-ios/Store/SubscriptionManager.swift — new file (repo created by depends:81)
  • [x] westside-basketball-ios/Store/SubscriptionView.swift — new file (repo created by depends:81)
  • [x] westside-basketball-ios/PathConfiguration.swift — new file (repo created by depends:81)
All targets are new files in a repo that does not yet exist. The issue correctly documents this and specifies the dependency on #81 (repo creation). File paths follow standard iOS/Swift conventions. Exclusions (Rails backend, Fastlane config) are clearly stated.

Repo Placement

OK — Issue filed on westside-basketball because westside-basketball-ios does not exist yet (depends on #81). Issue body documents this and instructs to transfer after #81 completes. Acceptable interim placement.

Dependencies

  • #81 (Create westside-basketball-ios repo) — backlog. Required: provides the repo this ticket works in.
  • #84 (Fastlane IaC for subscription product) — backlog. Required: the subscription product must exist in App Store Connect before StoreKit can load it.
  • #78 (parent, decomposed) — backlog. This ticket is Sub-ticket C of the decomposition.
  • #86 (Fastlane SSH build pipeline) — backlog. Depends on THIS ticket (depends:85 in labels). Downstream consumer.
All dependencies are documented in the issue body and board labels. Dependency chain is correct: #81 → #84 → #85 → #86.

Acceptance Criteria

4 criteria, all manually verifiable in Xcode sandbox environment. Clear and specific:
  • Product loading — verifiable via StoreKit sandbox
  • Purchase sheet presentation — verifiable via navigation interception test
  • Transaction completion + receipt sending — verifiable via sandbox + server logs
  • End-to-end sandbox test — integration verification
Test expectations include StoreKit Configuration file for unit testing. Reasonable scope.

Blast Radius

Low. Native iOS code in a new repo. No shared code with sibling services. Receipt sending touches the Rails webhook endpoint (#65) but the issue explicitly excludes server-side validation from scope. Boundary is clean.

Decomposition Assessment

No decomposition needed. 3 file targets in 1 repo, 4 acceptance criteria, estimated agent work well under 5 minutes. Single-focus: StoreKit 2 purchase flow implementation.

Recommendation

No action needed.