Review: Fastlane IaC for auto-renewable subscription product
Verdict: APPROVED
Re-review of board item #1641 (Forgejo issue ldraney/westside-basketball#84). Round 1 refinements have been applied. All checks pass.
Template Completeness
- [x] Type — Feature
- [x] Lineage — Child of #78, Sub-ticket B
- [x] Repo — ldraney/westside-basketball-ios (to be created by Sub-ticket A)
- [x] User Story — present, well-formed
- [x] Context — thorough: iOS-only subscriptions decision, Fastlane IaC mandate, Apple app creation constraint documented
- [x] File Targets — 3 files to create, 1 read-only reference
- [x] Feature Flag — none (infrastructure, correct)
- [x] Acceptance Criteria — 4 criteria, all testable
- [x] Test Expectations — 2 manual tests specified
- [x] Constraints — 4 constraints listed
- [x] Checklist — present
- [x] Related — links to parent #78 and dependency #65
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 component
- [x] arch note verified — arch-app-store note exists in pal-e-docs (note ID 2224). Documents dependency chain, data model, and key decisions.
- [x] Forgejo issue — ldraney/westside-basketball#84, state: open
- [x] parent:78 label — parent issue (iOS StoreKit subscription purchase flow + Fastlane IaC)
File Targets
- [x]
fastlane/Fastfile— to be created in new repo. Cannot verify existence (repo not created yet). Correct: depends:81 gates this. - [x]
fastlane/Appfile— to be created in new repo. Same as above. - [x]
fastlane/metadata/subscription_config.json— to be created in new repo. Same as above. - [x]
~/secrets/apple-developer/api_key.json— read-only reference. Does NOT exist yet on disk. Acceptable: this secret is provisioned by sibling ticket #1643 (Terraform: App Store Connect API key secret). The Fastlane config references the path; the key needs to exist at runtime, not at config-write time.
Repo Placement
OK with caveat. Issue is filed on westside-basketball because westside-basketball-ios does not exist yet. Issue body explicitly notes: "Filed on westside-basketball because the iOS repo does not exist yet. Transfer after Sub-ticket A completes." This is correct — the repo is created by #81 (board item 1640), which is a declared dependency.
Dependencies
- depends:81 (board item 1640, "Create westside-basketball-ios repo with Turbo Native shell") — backlog, open. This ticket's files all live in the iOS repo. Correctly declared.
- depends:65 (board item 1610, "Configure App Store Connect subscription product and billing grace period") — next_up, sprint:6, open. The v2 notifications URL in Fastlane config points to this webhook endpoint. Correctly declared.
- Undeclared soft dependency: Board item 1643 ("Terraform: App Store Connect API key secret") provisions the API key referenced in the read-only file target. However, this is a soft dependency — the Fastlane config can reference the key path without the key existing at config-write time. The key just needs to exist at runtime. Not blocking.
- parent:78 (board item 1635, "iOS StoreKit subscription purchase flow + Fastlane IaC") — backlog, decomposed. Correctly declared.
Acceptance Criteria
4 acceptance criteria, all verifiable:
- [x] Fastfile lane with API key auth — agent can verify file contents
- [x] Appfile with correct identifiers — agent can verify literal values (team_id HAY64YD5PX)
- [x] Subscription product config with 16-day grace period — agent can verify JSON structure
- [x] Server Notifications v2 URL configured — agent can verify URL points to Rails webhook
All criteria are concrete and machine-verifiable. No ambiguity.
Blast Radius
Low. This ticket creates new files in a new repo. No existing code is modified. The only external coupling is the v2 notifications URL pointing to the Rails webhook endpoint (#65), which is a read-only reference. No sibling services are affected.
Decomposition Assessment
No decomposition needed. 3 file targets in 1 repo. 4 acceptance criteria. Estimated agent time well under 5 minutes. Single-pass work.
Recommendation
No action needed. Ticket is well-scoped, dependencies are declared, traceability is complete, and the work fits in a single agent pass.
Note: The soft dependency on the API key secret (#1643) is not blocking. The agent can write the config referencing the key path; the key just needs to exist before runtime. No label change required.