Review: Admin detail page Apple subscription UI
Verdict: READY
Round 2 re-review after round 1 refinements.
Template Completeness
- [x] Type — Feature
- [x] Lineage — Child of #66, sub-ticket C of 4
- [x] Repo — ldraney/westside-basketball
- [x] User Story — present, well-formed
- [x] Context — present, explains dependency chain clearly
- [x] File Targets — present with modify and do-not-touch lists
- [x] Feature Flag — "none" with rationale (admin-only UI)
- [x] Acceptance Criteria — 2 items, clear and testable
- [x] Test Expectations — 2 integration tests, run command provided
- [x] Constraints — present, documents all dependencies and patterns
- [x] Checklist — present
- [x] Related — present, links parent, dependency, and sub-ticket
Traceability
- [x] story:WS-S35 label — "As an admin, I want to set and manage subscription pricing on a player's detail page so that I control what each family pays for their program tier"
- [x] story note verified — WS-S35 found in project-westside-basketball user-stories section under Admin (Marcus)
- [x] arch:app-store label — App Store Billing architecture component
- [x] arch note verified — arch-app-store note exists (ID 2224, slug "arch-app-store"), covers webhook endpoint, subscription UI, iOS StoreKit, data model, and dependency chain
- [x] Forgejo issue — ldraney/westside-basketball#82, state: open
File Targets
- [x]
app/views/admin/players/show.html.erb— does NOT exist yet (confirmed: onlyindex.html.erbin that directory). Expected because #58 creates it. Ticket correctly documents this dependency. - [x]
app/models/player.rb— correctly listed as do-not-touch. No apple_subscription fields exist yet; those come from #79 (Apple subscription model + migration). - [x]
app/views/admin/players/index.html.erb— correctly listed as do-not-touch (list page badges are in a sibling sub-ticket).
Repo Placement
OK — issue filed on ldraney/westside-basketball, all file targets are in the same repo. Single-repo change.
Dependencies
- #58 (Admin player detail page — product payment matrix and contact info) — board item ID 1609, column: next_up, sprint:6. Creates
show.html.erband theshowcontroller action. Must merge first. Currently admin/players routes only expose:index. - #79 (Apple subscription model + migration) — board item ID 1636, column: backlog. Adds
apple_subscription_statusenum,original_transaction_id,expires_at,grace_period_expires_atto Player model. Must merge first. Currently Player model has zero Apple fields. - #66 (Subscription status on admin player detail page) — board item ID 1611, column: next_up, sprint:6. Parent ticket (decomposed). This is sub-ticket C of 4.
- Both dependencies documented in the issue body (Context and Constraints sections) and in board labels (
depends:58,depends:79). Dependency chain is consistent.
Acceptance Criteria
2 acceptance criteria — both agent-verifiable:
- "Admin detail page shows Apple subscription badge with status, expiry date, and grace period info" — verifiable via integration test rendering the view with fixture data.
- "Admin detail page includes pricing management section for Apple subscriptions" — verifiable via integration test checking for the section DOM element.
Test command is valid:
bundle exec rails test test/controllers/admin/players_controller_test.rb — the test file exists at that path.Blast Radius
- Existing Stripe subscription helpers in
application_helper.rb(subscription_badge_variant,subscription_badge_label) may need parallel Apple equivalents. The ticket scope (adding Apple badge + pricing to the detail page) is narrow and should not conflict. - No downstream consumers of the detail page exist yet (page is being created by #58).
- Delinquency report controller references
subscription_status(Stripe) — this ticket does not touch it. No blast radius concern.
Decomposition Assessment
1 file target to modify, 2 acceptance criteria, single repo. Estimated agent work well under 5 minutes. No decomposition needed.
Recommendation
No action needed. Scope is solid: all 12 template sections present, traceability complete (story note WS-S35 and arch note arch-app-store both verified in pal-e-docs), dependencies correctly documented and reflected in board labels, file targets accurately describe the current codebase state. The "sub-ticket A" reference maps correctly to #79 via
depends:79. Points (1) are appropriate — adding UI elements to an existing page with existing model fields once both dependencies merge.