Review: iOS StoreKit subscription purchase flow + Fastlane IaC (re-review)

review-1635-2026-06-27 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Re-review of review-1635-2026-06-27. Previous review flagged repo mismatch, arch note gap, and decomposition. Scope refinement addressed body issues; decomposition still required.

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- "Depends on #65 (webhook infrastructure). Sibling of #66 (admin subscription UI). Requires new iOS repo."
  • [x] Repo -- ldraney/westside-basketball-ios (NEW, with transfer note) -- FIXED from previous review
  • [x] User Story -- WS-S34
  • [x] Context -- Turbo Native + StoreKit 2 + Fastlane IaC + Apple delinquency gate + iOS-only decision + prerequisites listed
  • [x] File Targets -- all reference new iOS repo (Fastfile, Appfile, Swift StoreKit, API key reference)
  • [x] Feature Flag -- "none" (appropriate for core iOS subscription flow)
  • [x] Acceptance Criteria -- 7 criteria listed
  • [x] Test Expectations -- unit + integration + run command
  • [x] Constraints -- 6 constraints listed (including "Repo must be westside-basketball-ios")
  • [x] Checklist -- present
  • [x] Related -- lists #65, #66, project page, previous review note, iOS pipeline memory
All required sections for Feature template are present. No gaps.

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 heading
  • [x] arch:app-store label -- present on board item
  • [x] arch note verified -- arch-app-store note exists in pal-e-docs, correctly covers westside-basketball components including iOS StoreKit (#78), Rails webhook (#65), and subscription UI (#66) -- FIXED from previous review (was arch:ios pointing to landscaping-assistant)
  • [x] Forgejo issue -- ldraney/westside-basketball#78, open
All three traceability legs present and verified. Previous arch note gap resolved.

File Targets

  • [~] fastlane/Fastfile -- CANNOT VERIFY: target repo westside-basketball-ios does not exist yet. Path is logically correct for Fastlane convention.
  • [~] fastlane/Appfile -- CANNOT VERIFY: same as above. Standard Fastlane path.
  • [~] Swift StoreKit 2 integration files -- CANNOT VERIFY: repo does not exist. Description is directionally correct for StoreKit 2 in a Turbo Native app.
  • [~] App Store Connect API key reference -- CANNOT VERIFY: references pal-e-services terraform, which is a separate repo. Issue correctly notes "separate ticket needed."
  • [x] Files NOT to touch -- correctly excludes westside-basketball (Rails) repo. #65 covers webhook, #66 covers UI.
File targets cannot be verified because the target repo does not exist. This is expected and documented. Paths are logically correct for the intended architecture.

Repo Placement

FIXED. Issue now correctly identifies ldraney/westside-basketball-ios as the target repo. Includes clear note explaining why the issue is temporarily filed on westside-basketball with transfer instructions. This resolves the primary finding from the previous review.
However, AC #6 ("App Store Connect API key managed in pal-e-services terraform") is explicitly cross-repo work. This AC should be a separate pal-e-services issue, not part of this ticket.

Dependencies

  • depends:65 (board item #1610) -- "Configure App Store Connect subscription product and billing grace period" -- currently in next_up, sprint:6. Rails webhook endpoint. #78 needs the server notifications URL from #65.
  • Sibling #66 (board item #1611) -- "Subscription status on admin player detail page" -- currently in next_up, sprint:6. No ordering dependency.
  • Prerequisite: iOS repo creation -- documented in Context as "Prerequisites not yet tracked." Repo westside-basketball-ios does not exist. Must be created before any work starts.
  • Prerequisite: Apple Developer Program -- documented in Context. Status unknown. Required for App Store Connect API access and sandbox testing.
  • Prerequisite: pal-e-services terraform -- documented in Context and in AC #6. Needs its own issue in pal-e-services repo.
Dependencies are now documented in the issue body (improvement from previous review). The depends:65 label correctly captures the primary dependency.

Acceptance Criteria

7 acceptance criteria. Assessment:
  • AC 1-3 (Fastlane config): Testable via Fastlane commands. Require App Store Connect API access but are automatable.
  • AC 4-5 (StoreKit purchase): Require physical device or simulator + sandbox Apple ID + running Rails webhook (#65). Partially automatable.
  • AC 6 (pal-e-services terraform): Cross-repo. This is work in pal-e-services, not the iOS repo. Should be a separate issue.
  • AC 7 (SSH pipeline): Requires MacBook SSH access. Not automatable by a standard agent.
AC count (7) exceeds the 5-criterion decomposition threshold. AC #6 is explicitly cross-repo. Several ACs require external infrastructure an agent cannot easily verify.

Blast Radius

Moderate but well-contained. The arch-app-store note documents the full system architecture. Key interactions:
  • Rails webhook (#65) receives Apple notifications -- covered by separate ticket
  • Admin UI (#66) displays subscription status -- covered by separate ticket
  • Existing Stripe webhooks unaffected -- Apple flow runs in parallel
  • Other Turbo Native apps (landscaping-assistant) use same Fastlane pattern but have own repos -- no cross-contamination

Decomposition Assessment

NEEDS DECOMPOSITION.
  • File targets across repos: iOS repo (new) + pal-e-services terraform = 2 repos. Exceeds threshold.
  • Acceptance criteria: 7. Exceeds 5-criterion threshold.
  • Estimated agent work: Well over 5 minutes. Creating Turbo Native shell, Fastlane config (3 ACs), StoreKit 2 integration (2 ACs), plus separate pal-e-services terraform work.
  • Recommended decomposition:
[DECOMPOSE] 7 AC across 2 repos (iOS new + pal-e-services), estimated well over 5 minutes. Route to skill-decompose-ticket.
Note: The refinement comment on the issue acknowledged decomposition is still needed. The body fixes addressed repo placement and arch note gaps but decomposition was intentionally deferred to this re-review.

Improvements Since Previous Review

  • FIXED: Repo placement -- now targets westside-basketball-ios with transfer note
  • FIXED: Arch note -- arch:app-store label with arch-app-store note in pal-e-docs (replaces arch:ios gap)
  • IMPROVED: Prerequisites documented in Context section
  • IMPROVED: File targets explicitly scoped to new iOS repo
  • REMAINING: Decomposition still needed (7 AC, 2 repos, well over 5 min)

Recommendation

  • [BODY] Remove AC #6 ("App Store Connect API key managed in pal-e-services terraform") from this ticket -- it is cross-repo work that belongs in a separate pal-e-services issue.
  • [DECOMPOSE] 7 AC across 2 repos (iOS new + pal-e-services). Even after removing the pal-e-services AC, the remaining 6 ACs span repo creation + Fastlane config + StoreKit integration + SSH pipeline = well over 5 minutes. Route to skill-decompose-ticket with the 5-part decomposition above.