# 04 · Decisions only Alvaro, Nestor or Jose can make

Proposal package, 16 September 2026 (D19–D21 added 17 September for Feature M). Each decision has the default the scope, spec and plan assume. Change a default and the affected feature letter is listed so the documents can be adjusted in one pass.

| # | Decision | Owner | Options | Recommended default | Affects |
|---|---|---|---|---|---|
| D1 | Student cancels a group session | Alvaro (money) + Jose (sport) | (a) always deducted, slot lost · (b) released if > 24 h before · (c) released if a waitlisted student takes the seat | **(a) deducted.** The fixed-slot rule stands: a missed group session is lost. (c) becomes possible once the waitlist ships and can be turned on per facility. | C, B, D |
| D2 | Student cancels an individual session | Alvaro | (a) deducted · (b) released if > 24 h (`cancellation_policies.free_cancellation_hours`) | **(b) released if > 24 h**, else deducted. Mirrors the court cancellation policy that already exists. | C |
| D3 | Grace window after a package lapses | Alvaro | 0 / 3 / 7 / 14 days before removal from future rosters | **7 days from the lapse day** (`roster_grace_days`): past_due on day 3 → removal on day 10, after the day-7 freeze, so a student never loses adds and seats on the same day (red team). | B, D |
| D4 | Pause policy | Alvaro | (a) no pauses · (b) pause declared before the 26th, no charge, slots lost, seat released after grace · (c) pause with seat held and a holding fee | **(b).** Nothing is credited, the seat is released, the student returns at the next 1st. (a) was the playbook's earlier line and (c) needs a price nobody has set. | D, B |
| D5 | How the 1st is charged | Nestor + Alvaro | (a) Stripe Subscriptions with `billing_cycle_anchor` · (b) off-session PaymentIntents on a saved card · (c) the system issues the payment request on the 1st (Stripe link with card + PromptPay, or pay at club) with dunning | **(c) now, (b) later as a per-student opt-in.** Red team: Setpoint never collects a card mandate and most academy money is cash, transfer or PromptPay, so an auto-charge cannot cover most students. (a) is rejected: Stripe's proration fights the bridge rule. | D, E, G |
| D6 | WhatsApp transport | Alvaro + Nestor | (a) keep wa.me manual lane · (b) Meta WhatsApp Cloud API direct · (c) a BSP (Twilio, 360dialog) | **(b) Cloud API direct**, keeping (a) as fallback. Needs a verified Meta business, a dedicated number, and approved utility templates; the free 24 h reply window ends 1 Oct 2026, so every reminder is a paid template message (~USD 0.004-0.046 each). | F, J |
| D7 | Who may override a roster (add an uncovered student) | Jose | (a) owner and admin · (b) owner, admin, manager · (c) coaches too | **(a) owner and admin** (Alvaro, Jose). Abby records the reason but does not decide. Every override writes an audit row with the reason. | B, L |
| D8 | Who may mark attended / no-show | Jose | (a) the assigned coach and staff · (b) staff only | **(a).** Coach check-in already exists in the PWA; the manager can correct within 48 h with a reason. | C |
| D9 | Auto no-show | Jose | (a) manual only · (b) auto no-show N hours after lesson end if no check-in | **(b) with N = 12 h, only after the coach check-in habit is established** (measured: > 80 % of seats checked in for two weeks); until then manual. Historic lessons in the backfill default to attended, never no-show. | C |
| D10 | What players may see | Jose + Alvaro | (a) schedule + balance only · (b) plus attendance history · (c) plus reviewed coach feedback (Plan Step 4) | **(b) now, (c) in Step 4** once Jose confirms the feedback is written for players. | C, J |
| D11 | Growth package type | Nestor | (a) keep `session_bank` + monthly · (b) re-type to `recurring` | **(b) as a NEW template row** (`Growth (monthly)`, recurring) with students migrated to it; never re-type the existing template in place, which would change expiry semantics for past buyers (red team). | D, E |
| D12 | Lead ownership | Alvaro | (a) Abby owns every lead · (b) round-robin · (c) Alvaro for B2B, Abby for players | **(a).** One owner, 24 h reply obsession, escalation to Alvaro only for price exceptions. | I |
| D13 | Ledger switch date for Pad Thai Padel | Nestor + Alvaro | 1 Oct / 1 Nov / 1 Dec 2026 | **1 November 2026.** October runs Step 1's worklist in parallel with the old ledger; the reconciliation dry-run is reviewed by Jose in the last week of October. | C, plan |
| D14 | Push notifications | Nestor | (a) web push from the PWA · (b) email + WhatsApp only · (c) native app later via OpenRally consumer | **(b) now**, (a) when the student PWA exists; (c) is the TPS app's job, not Setpoint's. | J |
| D15 | Export retention | Nestor | CSV built on demand vs stored exports | **On demand**, streamed, no stored files, 12-month max range. | K |
| D17 | Where the ledger-mode flag lives | Nestor | facility · academy · package template | **Academy** (`academies.ledger_mode`). A facility flag splits a student who trains at two Pad Thai Padel sites. | C |
| D18 | Second weekly slot | Alvaro | (a) counts against the same sessions · (b) priced add-on (+4,000 THB per the Bangkok packages proposal) | **(b).** A 4-session plan in two slots gets 4 seats spread across the month; the second slot is sold, not implied. | B, D |
| D16 | Audit log scope | Nestor | (a) academy tables only · (b) all admin writes | **(a) now**, table designed so (b) is a config change. | L |
| D19 | Where an event (americano, first-time padel, clinic) is created | Alvaro + Nestor | (a) on TPS, imported into Setpoint read-only · (b) in Setpoint as a one-day program, mirrored to TPS · (c) both, last write wins | **(b) from a switch date, (a) until then.** One writer per event: `programs.source` says who. (c) is rejected: two writers on capacity and roster is how a full americano gets a thirteenth player. The switch date is set when PR 21 is reviewed. Sub-decision for Nestor: recurring clinics keep one roster per program (today's model) or get a per-date occurrence table; default one roster, occurrence table deferred. | M |
| D20 | Who may add a player from the PWA | Jose + Alvaro | (a) staff and manager on any card, coach on own lessons only, nobody overbooks from the phone · (b) staff and manager only · (c) any logged-in staff or coach on any card | **(a).** Matches the RLS that already lets a coach write their own `lesson_players`; events need one new policy for manager and staff (today owner/admin only). A full event waitlists; promoting past capacity is an owner/admin confirm with a reason. A player added at the desk is `Due at desk` until Abby records the payment; the software never charges them. | M |
| D21 | Default coach filter on the PWA | Jose | (a) All for everyone · (b) Me for coaches, All for staff · (c) remembered per device | **(b) with (c) on top.** A coach opens on their own day; staff open on the club; the last choice is kept on the device. | M |
