Phase 0
Evidence registry & contracts
Requirements registry
| Requirement | Status | Evidence |
|---|---|---|
| Team capacity value 21 means open-ended (rendered '20+') | confirmed | campvine-main: views/pages/program-registration.php:75; client/programs/programs-manage.php:422 |
| Finix payment path exists alongside Stripe | confirmed | campvine-main: views/pages/checkout.php, private-lesson-checkout.php, company-donation.php |
| Explicit provider → Finix (brand ready) → Stripe fallback | confirmed | Supplied brief (source-confirmed); ordering in adapter quote() |
| Age eligibility on session start date | confirmed | Supplied brief |
| Private-lesson hold defaults to 20 minutes | confirmed | Supplied brief; production expiry must come from server |
| Self / family / team registration types | confirmed | Supplied brief |
| Discount revalidated & usage reserved at checkout | confirmed | Supplied brief |
| Insurance lifecycle independent of registration/payment | confirmed | Supplied brief |
| Editing restricted: archived, recurring, membership, legacy payment plan | confirmed | Supplied brief |
| CMS collections (staff … subscribers) | confirmed | Supplied brief; cms.campvine-main (Laravel) |
| Team registrations go to operator review (demo) | inferred | Demo-only behavior; acceptance rules unverified |
| Waitlisted submissions are not charged (demo) | unknown | Payment timing for waitlist not established |
| Service boundaries: discovery, accounts, registrations, finance, lessons, sites, reporting | proposed | src/services/contracts.ts |
| Demo processing fee 3% | proposed | Synthetic value only — real fees from backend |
| Cancellation windows, refunds, taxes, transfer fees, coupon stacking, payment schedules | unknown | Not supplied — dependent actions disabled |
| Permission keys for delegated employees | unknown | Demo uses illustrative feature names |
| Waitlist promotion order / automatic acceptance | unknown | Not modeled |
| Impersonation safeguards (scope, expiry, audit) | unknown | Support mode disabled |
| CMS drafts / versioning / approvals | unknown | Not assumed |
| Company-specific exceptions | unknown | Must be enumerated before migration |
Entity map
Company ─┬─ Brand ─── Program ─── Session ─── RegistrationOption
│ (active · listing · archived — independent)
│
Account ─┼─ Participant (reusable profile)
│ └─ snapshot ─▶ Registration (self | family | team)
│ ├─ status · payment · waiver · insurance (independent)
│ ├─ ledger · answers · notes · history
│ └─ Team (name lock, capacity; 21 = open-ended)
├─ Membership (own lifecycle) ├─ Private lesson: Slot ─ Hold ─ Reservation
└─ Donation (own lifecycle)
CMS Site (owner-enforced) ─ Pages/Sections/Nav/Media/Collections ─ external program/team IDsPermission / scope matrix (illustrative — keys unverified)
| Capability | Parent | Director owner | Delegated employee | Platform admin |
|---|---|---|---|---|
| Discovery & register | ✓ | ✓ | ✓ | ✓ |
| Family dashboard (own) | ✓ | — | — | — |
| Operator registrations | — | All brands | Assigned brands | Platform view TBD |
| Finance / refunds | Own balance | ✓ (rules TBD) | If feature granted | TBD |
| Users & permissions | — | ✓ | If granted | Sub-admins TBD |
| Branded sites | — | Owned sites | If granted | TBD |
| Platform admin | — | — | — | ✓ (permissions TBD) |
Backend contracts required (proposed)
Discovery
GET programs (public, active, non-archived) with sessions, options, authoritative price & availability labels, destination kind
Eligibility
POST check(participant, session) → eligible, reason, rule source
Accounts
GET account gates (email verified, profile complete); participants CRUD with legacy IDs
Quote
POST quote → line items, discounts, credits, fees, insurance, due-now, future payments, provider + reason, currency
Submit
POST registration (idempotency key) → raw status, payment status, forms outstanding, allowed actions
Registration read
GET registration → snapshot, team, independent statuses, ledger, answers, notes, history, allowedActions with reasons
Operator scope
Server-enforced brand + feature scope applied to every list/read
Lessons
POST hold → holdId, serverNow, expiresAt; POST checkout(hold) → reservation | expired | declined
Insurance
Quote/purchase/endorsement + webhook status feed, separate from payment
CMS
Sites by owner; pages/sections/navigation/media/collections; external program/team ID mapping
Prioritized gaps
- Registration status transitions & waitlist promotion rules
- Payment timing, schedules, recurring charges, fees, taxes
- Cancellation & refund entitlements
- Delegated-employee permission keys and platform sub-admin scope
- Company-specific exceptions inventory
- Insurance provider contract & webhook states
- Impersonation safeguards