Review: Admin detail page Apple subscription UI

review-1638-2026-06-27 Review

review ready

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: only index.html.erb in 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.erb and the show controller 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_status enum, original_transaction_id, expires_at, grace_period_expires_at to 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.