Review: StoreKit 2 purchase flow in Turbo Native shell
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.