Review: Port multi-step registration form from westside-app

review-1370-2026-06-06 Review

review needs-refinement

Verdict: NEEDS_REFINEMENT

Template Completeness

  • [x] Type — Feature
  • [x] Lineage — Standalone, discovered during session review
  • [x] Repo — ldraney/westside-ror
  • [x] User Story — present and well-formed
  • [x] Context — thorough description of old SvelteKit flow and current state
  • [x] File Targets — present with create/modify/don't-touch sections
  • [x] Acceptance Criteria — 10 criteria listed
  • [x] Test Expectations — system and unit tests specified
  • [x] Constraints — patterns, references, and design language specified
  • [x] Checklist — present
  • [x] Related — present

Traceability

  • [x] story:consolidation label — present on board item
  • [ ] story note MISSING — [SCOPE] project-westside-ror note does not exist in pal-e-docs; cannot verify user story entry in user-stories section. Create project page with user stories section.
  • [x] arch:rails label — present on board item
  • [ ] arch note MISSING — [SCOPE] No arch-rails note found in pal-e-docs. Create architecture note arch-rails for Rails component.
  • [x] Forgejo issue — https://forgejo.tail5b443a.ts.net/ldraney/westside-ror/issues/38, open

File Targets

  • [x] config/routes.rb — verified exists; no register routes present yet, ready for modification
  • [x] app/controllers/public_controller.rb — verified exists; no register/create_registration actions yet
  • [x] app/views/welcome/index.html.erb — verified exists; hero CTA currently links to /teams (line 13), confirmed needs change
  • [x] app/assets/stylesheets/application.css — verified exists; 1709 lines currently
  • [x] app/views/public/_interest_form.html.erb — verified exists; correctly listed as "do not touch"
  • [ ] app/models/registration.rb — ISSUE: issue says "create" but file already exists with belongs_to :tenant and belongs_to :player. The registrations table already exists in the schema with columns: amount_cents, payment_status, player_id, registration_type, signup_method, stripe_checkout_session_id, stripe_payment_intent_id, tenant_id. [BODY] Change from "create" to "modify" and document which columns/validations to add.
  • [ ] db/migrate/*_create_registrations.rb — ISSUE: registrations table already exists. Migration should add missing columns (e.g., waiver fields, promo code) rather than create table. [BODY] Rename to "add registration form fields" migration.
  • [x] app/views/public/register.html.erb — confirmed does not exist yet, correct to create
  • [x] westside-app source files — verified: +page.svelte (536 lines) and app.css both exist at referenced paths

Repo Placement

OK — issue is filed on ldraney/westside-ror and all file targets are within that repo. The westside-app reference is read-only source material, not a target.

Dependencies

  • Stripe webhook infrastructure (PR #31) — merged, in place. Webhook controller handles checkout.session.completed.
  • Existing Stimulus patterns — program_controller.js and inline_fee_controller.js provide patterns to follow.
  • Board item #1371 (Spike: audit westside-app vs westside-ror feature parity) — same story:consolidation label, in backlog. Not a blocking dependency but related; the audit spike would inform whether this registration port is complete.
  • No items in in_progress block this ticket.
  • Player model already has has_many :registrations association.
  • Parent model has waiver_signed, waiver_signed_at, waiver_signed_ip fields — waiver may need to update parent record, not just registration.

Acceptance Criteria

10 acceptance criteria — mostly verifiable by an agent, but some concerns:
  • "Matches the old SvelteKit flow" — subjective without pixel-level spec; the 536-line Svelte source is the reference but visual parity is hard to test automatically.
  • "Mobile-first and matches existing site design" — again subjective; testable only via screenshot comparison.
  • Stripe checkout redirect testing requires Stripe test mode configuration — not specified in constraints.
  • "Progress bar tracks current section via scroll position" — requires a new Stimulus controller (not listed in file targets). [BODY] Add app/javascript/controllers/registration_progress_controller.js to file targets.
  • "Age gate toggles" — requires another Stimulus controller. [BODY] Add app/javascript/controllers/age_gate_controller.js to file targets.

Blast Radius

  • Parent model has waiver fields (waiver_signed, waiver_signed_at, waiver_signed_ip) — registration waiver should update these. Not mentioned in issue.
  • The interest form on /teams stays as-is (correctly noted in issue).
  • No other controllers or views reference /register currently.
  • The registrations table is already referenced by Player (has_many) and Tenant (has_many) — new registration creation flow must respect these associations.

Decomposition Assessment

NEEDS DECOMPOSITION — route to skill-decompose-ticket.
  • 10 acceptance criteria (threshold: >5)
  • 7+ file targets to create/modify across views, models, controllers, JS, CSS, migrations, routes
  • Estimated agent work: 15-25 minutes (port 536-line Svelte component, port ~500 lines CSS, create 2+ Stimulus controllers, add model validations, add routes, add controller actions, write tests)
  • Natural decomposition into: (1) route + controller + basic view, (2) form UI with Stimulus controllers, (3) waiver section, (4) Stripe payment integration, (5) CSS port, (6) hero CTA update + tests

Recommendations

  • [BODY] Fix file target: app/models/registration.rb — change from "create" to "modify"; document which validations and columns to add to existing model/table.
  • [BODY] Fix file target: db/migrate/*_create_registrations.rb — rename to "add registration form fields" migration since table already exists.
  • [BODY] Add missing file targets: app/javascript/controllers/registration_progress_controller.js and app/javascript/controllers/age_gate_controller.js (or a combined registration_controller.js).
  • [BODY] Document that parent model waiver fields (waiver_signed, waiver_signed_at, waiver_signed_ip) should be updated during registration waiver step.
  • [SCOPE] Create project page project-westside-ror with user-stories section including "consolidation" story.
  • [SCOPE] Create architecture note arch-rails for the Rails component.
  • [DECOMPOSE] 10 AC, 7+ files, estimated 15-25 min agent work. Route to skill-decompose-ticket for sub-ticket creation.