Rules
134
Confirmed & tested
122/122
User stories
125
Snapshot roadmap items
66
Reviewed Brain snapshot and code are in sync
Rule coverage
| Rule | Status | Implemented in | Tested in |
|---|---|---|---|
| ACC-001 Permissions are evaluated in the active club context | confirmed | domain/staff.ts | domain/staff.test.ts |
| ACC-002 Club notes are never global | proposed | — | — |
| ACC-003 Reception cannot change subscriptions or platform settings | confirmed | domain/staff.ts | domain/staff.test.ts |
| OPS-004 Platform staff provisioning is administrator-only and audited | confirmed | domain/staff-audit.ts, domain/staff.ts | domain/staff-audit.test.ts, domain/staff.test.ts, test/platform-staff-database.test.ts |
| OPS-005 Every server endpoint has an accepted permission classification | confirmed | domain/permissions.ts | test/permission-acceptance.test.ts |
| ACC-004 Only club managers and platform admins manage staff roles | confirmed | domain/role-matrix.ts, domain/staff.ts | domain/role-matrix.test.ts, domain/staff.test.ts |
| AI-001 The assistant only knows its own portal | confirmed | domain/assistant.ts | domain/assistant.test.ts, test/assistant-privacy-database.test.ts |
| AI-002 Assistant conversations are private | confirmed | domain/assistant.ts | domain/assistant.test.ts, test/assistant-privacy-database.test.ts |
| AI-003 Thread titles come from the first question | confirmed | domain/assistant.ts | domain/assistant.test.ts |
| AI-004 The assistant knows the screen you are on | confirmed | domain/assistant.ts | domain/assistant.test.ts |
| AI-005 Club websites have a public concierge in the booking button | confirmed | domain/visitor-assistant.ts | domain/visitor-assistant.test.ts |
| AI-006 The platform website has a sales concierge | confirmed | domain/visitor-assistant.ts | domain/visitor-assistant.test.ts |
| AI-007 Website assistants are limited per visitor | confirmed | domain/visitor-assistant.ts | domain/visitor-assistant.test.ts |
| BOOK-001 Capacity can never be oversold | confirmed | domain/capacity.ts, domain/teesheet.ts, lib/booking.functions.ts, lib/teesheet.functions.ts | domain/capacity.test.ts, domain/teesheet.test.ts, test/booking-database.test.ts |
| BOOK-002 Holds expire automatically | confirmed | domain/booking-policy.ts, domain/capacity.ts, domain/checkout-recovery.ts | domain/booking-policy.test.ts, domain/capacity.test.ts, domain/checkout-recovery.test.ts, test/booking-database.test.ts |
| BOOK-003 18 holes may need a linked second-nine start | confirmed | domain/routes.ts | domain/routes.test.ts |
| BOOK-004 Closures block new bookings, never delete existing ones | confirmed | domain/closures.ts, lib/booking.functions.ts, lib/closures.functions.ts, lib/teesheet.functions.ts | domain/closures.test.ts, test/booking-database.test.ts |
| BOOK-005 Partial cancellation keeps the group | confirmed | domain/reservations.ts | domain/reservations.test.ts |
| BOOK-006 Phone bookings record source and actor | confirmed | domain/teesheet.ts, lib/teesheet.functions.ts | domain/teesheet.test.ts |
| BOOK-007 Public availability exposes no personal data | confirmed | domain/booking.ts, lib/booking.functions.ts | domain/booking.test.ts, test/booking-database.test.ts |
| BOOK-008 Reservation moves reserve capacity atomically | confirmed | domain/reservations.ts | domain/reservations.test.ts, test/booking-database.test.ts |
| BOOK-009 Account history requires proven ownership | confirmed | domain/reservations.ts, lib/booking-account.server.ts, lib/booking.functions.ts, lib/checkout.functions.ts, lib/payments.functions.ts | domain/reservations.test.ts, lib/booking-account.server.test.ts, test/booking-database.test.ts |
| BOOK-010 Check-ins stay within the active group | confirmed | domain/reservations.ts | domain/reservations.test.ts |
| BOOK-011 Club-local time and historical booking terms | confirmed | domain/booking-changes.ts, domain/booking-policy.ts | domain/booking-changes.test.ts, domain/booking-policy.test.ts, test/booking-database.test.ts |
| BOOK-012 Linked second-nine allocations are atomic and player-chosen | confirmed | domain/linked-routes.ts | domain/linked-routes.test.ts, test/booking-database.test.ts |
| BOOK-015 Tee booking is one step-by-step flow with optional steps | confirmed | domain/booking-steps.ts | domain/booking-steps.test.ts |
| CMS-001 Unpublished media stays private | confirmed | domain/cms.ts, domain/media.ts | domain/cms.test.ts, domain/media.test.ts |
| CMS-002 Hole media links to a specific course and hole | confirmed | domain/cms.ts, lib/cms.functions.ts | domain/cms.test.ts |
| CMS-010 Club managers and marketing curate course media | confirmed | domain/media.ts | domain/media.test.ts |
| CMS-011 Public navigation lists only published pages | confirmed | domain/platform-cms.ts | test/platform-cms-database.test.ts, test/platform-cms-homepage.test.ts, test/platform-cms-nav.test.ts |
| CMS-014 Platform pages are built from editable sections | confirmed | domain/platform-cms.ts | test/platform-cms-sections.test.ts |
| CMS-015 Website demo requests become sales leads with recorded consent | confirmed | domain/platform-cms.ts | test/platform-cms-sections.test.ts |
| BRAIN-001 Every portal screen and role has traceable story coverage | confirmed | domain/story-coverage.ts | domain/story-coverage.test.ts |
| CRM-001 Won deals convert to onboarding, records are kept | confirmed | domain/crm.ts | domain/crm.test.ts |
| CRM-002 Every stage change is recorded | confirmed | domain/crm.ts | domain/crm.test.ts |
| CRM-007 Churn risk signals and follow-ups are staff-driven | confirmed | domain/churn.ts | domain/churn.test.ts |
| CRM-008 Pipelines are kanban lanes | confirmed | domain/club-crm.ts, domain/crm.ts, domain/kanban.ts | domain/club-crm.test.ts, domain/crm-kanban.test.ts, domain/kanban.test.ts |
| CRM-009 Sales activities and follow-up tasks are recorded, duplicates flagged | confirmed | domain/crm.ts | domain/crm-activities.test.ts |
| CRM-010 Club domain checks are recorded signals, never certification | confirmed | domain/domain-checks.ts, lib/onboarding.functions.ts | domain/domain-checks.test.ts, test/onboarding-database.test.ts |
| CRM-011 A deal carries multiple contacts | confirmed | domain/crm.ts | domain/crm.test.ts, test/prospect-contacts-database.test.ts |
| FIN-001 Platform billing is restricted to administrators and finance | confirmed | domain/finance.ts | domain/finance.test.ts |
| FIN-002 Invoice history preserves amounts and payment status | confirmed | domain/finance.ts | domain/finance.test.ts |
| FIN-003 Billing exports preserve exact amounts and currency | confirmed | domain/finance.ts | domain/finance.test.ts |
| GUEST-001 Guests can book without an account | confirmed | domain/booking.ts, lib/booking.functions.ts | domain/booking.test.ts |
| GUEST-002 A booking reference alone exposes no personal data | confirmed | domain/guest.ts, lib/booking-changes.functions.ts, lib/pricing.functions.ts | domain/guest.test.ts |
| CRM-006 Onboarding tasks record progress without certifying launch | confirmed | domain/onboarding.ts | domain/onboarding.test.ts, test/onboarding-database.test.ts |
| EVENT-003 Event co-creation starts from an explicitly reviewed private brief | confirmed | domain/event-planning.ts | domain/event-planning.test.ts |
| UX-005 Player outlook counts only account-owned confirmed bookings | confirmed | domain/player-outlook.ts, lib/player-outlook.functions.ts | domain/player-outlook.test.ts |
| UX-004 Club dashboard summarises today and the next seven local calendar days | confirmed | domain/dashboard-window.ts, lib/reservations.functions.ts | domain/dashboard-window.test.ts |
| UX-003 Portal entry and navigation use the existing dashboards | confirmed | domain/portal-navigation.ts | domain/portal-navigation.test.ts |
| EVENT-002 Shared event plans support offering and operations | confirmed | domain/event-plan.ts | domain/event-plan.test.ts, test/event-plans-database.test.ts |
| CMS-013 Google Fonts can be previewed and added to club website selectors | confirmed | domain/website-options.ts | domain/website-options.test.ts, test/website-services-database.test.ts |
| UX-002 Portal entry is the dashboard with today and next-seven-day analytics | confirmed | domain/platform-outlook.ts, lib/admin.functions.ts | domain/platform-outlook.test.ts, test/platform-outlook-read.test.ts |
| WEATHER-001 Club dashboard weather follows the active club location | confirmed | domain/weather.ts, lib/club-location-search.server.ts, lib/weather.server.ts | domain/weather.test.ts, lib/club-location-search.server.test.ts, lib/weather.server.test.ts, test/weather-database.test.ts |
| REP-005 Reporting periods and definitions are explicit | proposed | — | — |
| CRM-003 Customer lifecycle changes are traceable | proposed | — | — |
| CRM-004 Sales work has ownership and activity history | proposed | — | — |
| PROD-001 Roadmap changes preserve traceability | proposed | — | — |
| CMS-003 Platform pages publish authorised snapshots | confirmed | domain/platform-cms.ts | domain/platform-cms.test.ts, test/platform-cms-database.test.ts |
| BRAND-001 Brand overrides remain scoped | confirmed | domain/branding.ts | domain/branding.test.ts, test/branding-database.test.ts |
| OPS-001 Platform roles require explicit authorisation | confirmed | domain/role-matrix.ts | domain/role-matrix.test.ts, test/support-access-database.test.ts |
| OPS-002 Support access is scoped and revocable | confirmed | domain/role-matrix.ts | domain/role-matrix.test.ts, test/support-access-database.test.ts |
| OPS-003 Operational recovery is safe and observable | confirmed | domain/operations.ts | domain/operations.test.ts, test/ops-health-database.test.ts, test/payment-attempt-database.test.ts, test/payment-events.test.ts, test/payment-persistence.test.ts |
| OPS-006 Payment notifications process once under concurrency | confirmed | — | test/payment-claim-database.test.ts, test/payment-events.test.ts |
| REP-006 Operational views retain club and money context | proposed | — | — |
| COURSE-001 Availability configuration preserves existing bookings | confirmed | domain/scheduling.ts, lib/booking.functions.ts, lib/course-schedule.functions.ts | domain/scheduling.test.ts, test/booking-database.test.ts |
| BOOK-013 Attendance and reservation edits have history | proposed | — | — |
| PRICE-004 Rate eligibility and precedence are declared | confirmed | domain/rates.ts | domain/rates.test.ts, test/checkout-start.test.ts, test/member-checkout-database.test.ts, test/rate-quotes-database.test.ts, test/rate-rules-database.test.ts |
| RENT-001 Rental inventory covers the whole occupied interval | confirmed | domain/rentals.ts, lib/pricing.functions.ts | domain/rentals.test.ts |
| RENT-002 Rental handover and pricing remain traceable | confirmed | domain/rentals.ts | domain/rentals.test.ts |
| CRM-005 Club contact records are scoped and deduplicated | confirmed | domain/club-crm.ts | domain/club-crm.test.ts, test/club-crm-database.test.ts |
| MEM-001 Membership entitlement is club and date specific | confirmed | domain/membership.ts | domain/membership.test.ts, test/member-checkout-database.test.ts |
| MEM-006 Membership billing and renewal policy is club-configured per type | confirmed | domain/membership-billing.ts | domain/membership-billing.test.ts, test/membership-billing-database.test.ts |
| MEM-002 Membership administration retains history | confirmed | domain/membership.ts | domain/membership.test.ts |
| CMS-004 Club websites publish club-scoped revisions | confirmed | domain/club-website.ts | domain/club-website.test.ts, test/club-website-database.test.ts |
| CMS-006 Base templates create independent club drafts | confirmed | domain/club-website.ts | domain/club-website.test.ts |
| CMS-007 Content blocks have a usable editing interface | confirmed | domain/club-website.ts | domain/club-website.test.ts, test/club-website-database.test.ts |
| CMS-008 SEO settings belong to published page revisions | confirmed | domain/club-website.ts | domain/club-website.test.ts |
| CMS-009 Styling and code injection cannot compromise the portal | confirmed | domain/club-website.ts, domain/tbls.ts | domain/club-website.test.ts, test/club-website-database.test.ts, test/tbls.test.ts |
| DOM-001 Domain linking verifies ownership and serving readiness | confirmed | domain/club-domains.ts | domain/club-domains.test.ts |
| DOM-002 Domain linking lifecycle is propose, verify, confirm, then monitor | confirmed | domain/club-domains.ts, lib/club-domains.functions.ts | domain/club-domains.test.ts, test/club-domains-database.test.ts |
| PAY-009 Reconciliation distinguishes records from provider actions | confirmed | domain/club-finance.ts | domain/club-finance.test.ts |
| COMMS-001 Operational messages are separate from marketing | confirmed | domain/communications.ts | domain/communications.test.ts, test/club-comms-database.test.ts, test/club-templates-database.test.ts, test/communications-templates.test.ts |
| SET-001 Club settings are validated and scoped | confirmed | domain/club-settings.ts | domain/club-settings.test.ts, test/club-settings-database.test.ts |
| COACH-001 Coaching availability has scoped capacity | proposed | — | — |
| EVENT-001 Event places and tee blocks share inventory | proposed | — | — |
| SHOP-001 Clubhouse orders stay within approved integration scope | confirmed | domain/club-shop.ts | domain/club-shop.test.ts |
| SHOP-002 Voucher and loyalty policy is set per club | confirmed | domain/club-shop.ts | domain/club-shop.test.ts, test/club-shop-database.test.ts |
| SHOP-003 Restaurant integration runs through the TBLS.app APIs | confirmed | domain/tbls-dining.ts, lib/tbls.functions.ts, lib/tbls.server.ts | domain/tbls-dining.test.ts |
| SHOP-004 Club restaurant pages show the live TBLS menu | confirmed | components/club-site/ClubLiveMenu.tsx, domain/tbls-dining.ts, lib/tbls.functions.ts | domain/tbls-dining.test.ts |
| SHOP-005 Golfers can add a post-round table to a confirmed tee booking | confirmed | domain/tbls-dining.ts, lib/tbls.functions.ts | domain/tbls-dining.test.ts |
| SHOP-006 Each club links its own TBLS restaurant | confirmed | domain/tbls-dining.ts, lib/tbls.functions.ts | domain/tbls-dining.test.ts |
| SHOP-007 Player day-of-play card shows the linked post-round table | confirmed | domain/tbls-dining.ts, lib/player-outlook.functions.ts | domain/tbls-dining.test.ts |
| SHOP-008 Club CRM contacts show a consent-aware TBLS dining insight | confirmed | domain/tbls-dining.ts, lib/tbls.functions.ts | domain/tbls-dining.test.ts |
| SHOP-009 Club pro shop catalogue and orders | confirmed | domain/proshop.ts | domain/proshop.test.ts, test/proshop-database.test.ts |
| PLAYER-001 Personal overview requires ownership | confirmed | domain/player-outlook.ts, domain/player-profile.ts | domain/player-outlook.test.ts, domain/player-profile.test.ts |
| BOOK-014 Player changes obey accepted terms | confirmed | components/BookingSelfServiceActions.tsx, domain/booking-changes.ts, lib/booking-changes.functions.ts | domain/booking-changes.test.ts, test/booking-database.test.ts |
| CAL-001 Calendar exports use recorded booking instants | confirmed | components/BookingSelfServiceActions.tsx, domain/calendar.ts, lib/booking-changes.functions.ts | domain/calendar.test.ts, test/booking-database.test.ts |
| PROF-001 Player edits cannot grant privileges | confirmed | domain/player-profile.ts | domain/player-profile.test.ts, test/phone-verification-database.test.ts |
| MEM-003 Benefits show provenance and validity | proposed | — | — |
| MEM-004 Membership account linking requires a matching club record | confirmed | domain/membership.ts | domain/membership.test.ts, test/membership-link-database.test.ts |
| PAY-010 Player payment records require ownership | confirmed | domain/club-finance.ts | domain/club-finance.test.ts |
| CMS-005 Discovery shows current published facts | confirmed | domain/media.ts | domain/media.test.ts |
| PRIV-001 Privacy preferences retain club-specific consent | confirmed | domain/communications.ts | domain/communications.test.ts |
| PRIV-002 Data requests verify identity and retention obligations | proposed | — | — |
| PRIV-003 Privacy requests are recorded, never self-serve executed | confirmed | domain/privacy-requests.ts | domain/privacy-requests.test.ts, test/privacy-requests-database.test.ts |
| COACH-002 Lesson and event booking requires eligible availability | proposed | — | — |
| UX-001 Booking remains usable without pointer or video | confirmed | domain/checkout-recovery.ts | domain/checkout-recovery.test.ts |
| PRICE-001 Price and terms shown before confirming | confirmed | domain/pricing.ts | domain/pricing.test.ts, test/rate-quotes-database.test.ts |
| PRICE-003 Green fees are per player and per round format | confirmed | domain/pricing.ts | domain/pricing.test.ts |
| PRICE-002 Overrides need permission and a reason | confirmed | domain/rates.ts | domain/rates.test.ts, test/rate-rules-database.test.ts |
| PRICE-005 Deposit policy is chosen per rate | confirmed | domain/deposits.ts | test/deposits.test.ts |
| PAY-001 Refunds never exceed what was captured | confirmed | domain/payments.ts | domain/payments.test.ts |
| PAY-002 Online payment is a per-club opt-in | confirmed | — | test/booking-database.test.ts |
| PAY-003 The charged amount is the frozen held quote | confirmed | domain/payments.ts | domain/payments.test.ts |
| PAY-004 Payment success is confirmed by signed provider notification | confirmed | domain/checkout-recovery.ts | domain/checkout-recovery.test.ts, test/booking-database.test.ts, test/payment-events.test.ts |
| PAY-005 Club balance is succeeded payments minus recorded refunds | confirmed | domain/payments.ts | domain/payments.test.ts |
| PAY-006 A paid platform subscription activates club access | confirmed | domain/subscriptions.ts | domain/subscriptions.test.ts |
| PAY-007 Cancellation keeps access until the paid period ends | confirmed | domain/subscriptions.ts | domain/subscriptions.test.ts |
| PAY-008 Plan changes are immediate and pro-rated | confirmed | domain/subscriptions.ts | domain/subscriptions.test.ts |
| PAY-011 Failure notifications are idempotent and never silently accepted | confirmed | — | test/payment-events.test.ts |
| REP-001 MRR is monthly-normalised recurring revenue | confirmed | domain/reporting.ts | domain/reporting.test.ts |
| REP-002 Occupancy counts player places | confirmed | domain/reporting.ts | domain/reporting.test.ts |
| REP-003 Utilisation is reported separately from occupancy | confirmed | domain/reporting.ts | domain/reporting.test.ts |
| REP-004 SaaS revenue separate from club booking revenue | confirmed | domain/dashboard.ts | domain/dashboard.test.ts |
| REP-007 Subscription invoice reconciliation | confirmed | domain/dashboard.ts | domain/dashboard.test.ts |
| PROD-002 All platform staff collaborate on the persisted roadmap | confirmed | domain/kanban.ts, domain/roadmap.ts | domain/kanban.test.ts, domain/roadmap.test.ts, test/roadmap-database.test.ts |
| PROD-003 Customer requests link to roadmap items | confirmed | components/CustomerRequestsPanel.tsx, domain/roadmap.ts, lib/roadmap.functions.ts | domain/roadmap.test.ts, test/customer-requests-database.test.ts |
| PROD-004 Released items require recorded release evidence | confirmed | domain/roadmap.ts, lib/roadmap.functions.ts | domain/roadmap.test.ts, test/release-evidence-database.test.ts |
| CMS-012 Club website typography and button shape are scoped | confirmed | domain/club-website.ts, domain/website-options.ts | domain/club-website.test.ts, domain/website-options.test.ts, test/website-services-database.test.ts |
| MEM-005 Membership applications are requests, not active memberships | confirmed | domain/website-options.ts | domain/website-options.test.ts, test/website-services-database.test.ts |
| COURSE-002 Course conditions are staff-recorded and date-scoped | confirmed | domain/website-options.ts | domain/website-options.test.ts |
| SERVICE-001 Open coaching slots have scoped agendas and atomic registrations | confirmed | domain/services.ts | domain/services.test.ts, test/website-services-database.test.ts |
| SERVICE-002 Event registrations share a protected service allocation boundary | confirmed | domain/services.ts | domain/services.test.ts, test/service-payment-start.test.ts, test/website-services-database.test.ts |