Pay Phone · Logic Resolutions v1 · 07/17/2026 · a ruling on every open finding
Recommended rulings — 108 items resolved.
Every gap, contradiction, and decision from the logic report now has a recommended ruling. Read the 10 gating decisions first — they cascade and resolve most of the individual gaps beneath them. RULE = a product decision I’m recommending; FIX = mechanical/sample-data cleanup that just gets done; DEFER = real but post-launch or needs counsel. Approve the ten (or amend by number) and the logic is sound enough to write production code against.
The 10 gating decisions
Each is a recommended ruling with rationale. If you disagree with any, say so by number; silence = adopted.
D1Scheduling: time-based, not a fixed slot grid
Kill the fixed :00/:10/:20 grid. A session is a continuous block (Tue 7:00–9:00 PM). When a fan picks a service, the booking screen generates real start times for THAT duration from whatever contiguous time is still free, plus a 2-min reset buffer between calls. Capacity is expressed in TIME, shown to the fan as “next openings,” never as a raw slot count. A 2-hour block therefore holds ~10 ten-min calls, ~8 twenty-min, or a mix — computed, never hardcoded. This single ruling dissolves the 12/18/24-slot contradictions and the “7:45 isn’t on the grid” problem.
D2The join window + fair-timer, made symmetric and fair
The rule in one sentence: you’re protected from the OTHER party’s lateness, never rewarded for your own. Celeb joins late → timer doesn’t start until they’re in, fan gets their full paid duration, and the schedule absorbs it via the drift queue (D1 buffers + a “running ~X min behind” banner to later fans). Fan joins late → the call still ends at its scheduled end; the fan eats their own late minutes, after a 60-second grace. No-show thresholds: celeb no-show fires at 5:00 past start (fan auto-refunded); fan no-show fires at the scheduled END of their window (celeb paid in full). Print both numbers in the cancel policy.
D3Off-hours requests: authorize, don’t capture
When a fan requests a slot outside standing hours, Stripe AUTHORIZES the card (no charge yet) and the fan lands on a real “Pending — waiting on Dre” screen. The celeb has until 24h before the slot, or 24h from the request, whichever comes first, to accept. Accept → capture + confirm. Expire or decline → authorization released, fan notified, zero charge. This closes the “money held indefinitely” hole and gives the fan a state that currently doesn’t exist.
D4Number privacy vs. the audience list: both are true — say both
Keep the exportable audience list (it’s the manager pitch). Fix the copy so it stops overclaiming. Canonical checkout line: “Dre never sees your number for calling — every call runs on Pay Phone. You’ll join Dre’s contact list so he can text you when new times open. Unsubscribe anytime.” Two distinct facts: never shared for DIALING (switchboard, absolute) and added to their drop list (disclosed, opt-out). The absolute-privacy line stays on the CALL surfaces; the list disclosure appears at the list-join moment (checkout).
D5Partial call / tech failure: fault-based, GMV-preserving
Three buckets. (a) Platform fault — server/infra drops the room: fan 100% refunded, celeb paid in full, platform eats it (detected server-side, no dispute). (b) One-party connection fault — if under 50% of paid time was delivered, fan gets a FREE REBOOK (not cash — keeps GMV and the relationship); 50%+ delivered, the call stands. (c) Call was fine but the recording was lost: call stands, fan gets an automatic make-good (a free 5-min Quick Call credit) because the recording was a promised deliverable. This is the single biggest blank in the spec today; it must exist at launch.
D6Recording retention: one clear triangle
Fan’s downloaded file: theirs forever, on their device. Streaming/re-download link: 90 days. Celeb archive: persists while the account is active (cheap cold storage — a real talent perk); on account closure, 90-day export grace, then purge. Platform moderation copy: 90 days, then purged unless a Trust & Safety case is open. Write this verbatim into ToS §5 so the three “forever / 90-day / yours” claims stop contradicting each other.
D7Follow is FREE at launch; paid membership is v1.1
Resolve the ledger-vs-journey conflict in favor of the journey as drawn. Free watching IS the growth engine — the drop-list is top-of-funnel and you never tax the top of the funnel at launch. Ship free watch now. The paid membership tier becomes a per-celeb opt-in dial (the OnlyFans “free page vs paid page” model already in the ledger), web-checkout, as the first fast-follow. This keeps “no interaction is free” intact — the RING is free, every CALL is still paid — and defers the monetization that would slow acquisition.
D8Extension price = per-minute rate of the booked service
One formula, and it already matches the mockup: extension price = (booked service price ÷ its minutes) × extension length. Dre’s 10-min call is $100 → $10/min → +5 min = $50 (exactly what S19 shows). Sol’s $150/10-min → $75 for +5, or a +10 extension = $150 (explains the $125–$150 admin figures once the sample data is swept). Celeb consent: an Hours toggle “Allow extensions when my next opening is free,” default ON, plus an in-call decline. Extensions split 80/5/15 like everything else.
D9Instant payout stays; new payphones carry a 30-day reserve
Keep instant payout — it’s the supply-side magic and must not change. Protect against chargebacks/reports with a rolling reserve on NEW payphones only: hold 10% for the first 30 days (or first $2,000 earned, whichever clears first), then release and switch to full instant payout. Established celebs with clean history carry no reserve. This is standard Stripe Connect practice and it funds every fan-side remedy (D5, chargebacks, conduct refunds) WITHOUT ever clawing back a celeb. Disclosed in the talent agreement.
D10Adopt one canonical dataset, then sweep every artifact
Lock a single consistent example night and propagate it everywhere; managers do the math and will catch any drift. Canonical: Dre Vaughn, Tuesday 7:00–9:00 PM, 10 openings, 8 booked / 2 open; at 7:41 PM, 3 calls done = $240 earned tonight (not $1,340); “Fully booked week” shown as “$2,400 in bookings · $1,920 to you” (gross vs. net, both stated); payday screen = Jordan’s real call (10-min $100 + 5-min ext $50 = $150 · your 80% = $120); admin net revenue = 15% of GMV minus Stripe fees (formula, not a magic number); one booking ID per email outcome. Emoji purge (E2 subject, admin sidebar) and the “line”→“payphone” sweep ride along.
A. Booking lifecycle
#2RULEOff-hours = authorize at request, capture on accept (see D3). Never capture an unconfirmed booking.
#3RULERequest TTL = min(24h from request, 24h before slot). Auto-release the authorization on expiry; fan sees Pending state.
#8RULEExtension card declines mid-call: the +time simply isn’t added, a quiet inline “couldn’t add time” shows, call ends on schedule. No retry loop, celeb not interrupted.
#11RULEBoth no-show collapses to CELEB no-show: if the celeb isn’t there we can’t prove the fan wouldn’t have shown → fan refunded 100%, celeb not paid. Celeb absence always wins.
#14RULEReschedule dead-end → full refund. If no open slot within 30 days, or the payphone is paused/suspended/closed, the credit auto-converts to a cash refund.
#15RULEA rescheduled booking is FINAL: no cancel-for-refund, no second reschedule — UNLESS the celeb cancels it, which triggers a full refund. Kills the reschedule-gaming loop.
#18RULEChargebacks are funded by the D9 reserve; if the reserve is short, platform eats it. NEVER claw back a celeb — preserves the ‘no clawbacks’ promise. T&S reviews every dispute.
#19RULESlot is soft-held for 8 min the moment checkout opens; abandoned/failed checkout releases the hold. See D-race (#55).
B. Timing edges
#20RULEResolved by D1: no grid. A 20-min booking consumes a contiguous 20-min window + buffer from the session’s free time.
#21RULEResolved by D1+D8: extensions draw from the next contiguous free minutes, not a ‘slot.’ If under 5 free min follow, the extension isn’t offered.
#22RULECorrect and intended: a truly sold-out session offers no extensions. The upsell appearing only when capacity exists is honest, not a bug. Sweep the sample data so ‘sold out’ nights don’t also show extensions.
#23RULEJOIN WINDOW DEFINED (D2): celeb no-show at 5:00 past start; fan no-show at scheduled window end; 60-sec grace for a late fan before their clock starts burning. These three numbers go in the cancel policy.
#24RULEA late fan is capped at their scheduled end — they never eat into the next fan’s time. The ‘timer held for her’ archive line is the 60-sec grace, not unlimited.
#25RULEDrift queue (D1): a late start shifts later calls; each affected fan gets a ‘Dre is running ~X min behind’ push + lobby banner. Buffers absorb small drift; large drift can bump the last opening to a refund.
#26RULECeleb’s wait obligation = the 5:00 no-show threshold from the fan’s side too: celeb must stay until 5:00 past start before a fan no-show pays out.
#29RULEStore all times UTC; display in each viewer’s local tz. A standard tz library handles DST automatically — the 24h deadline is computed on the stored instant, so it can’t drift.
#30RULEA celeb’s standing hours anchor to their HOME timezone set at onboarding (shown on their public page). Traveling doesn’t move their hours.
#31RULEExtension tap must complete before 0:00; a tap after time expires is rejected with ‘call ended.’ No mid-air bridging.
#32FIX‘7:45’ example is fine once D1 kills the grid — start times are real, not grid-aligned. Sweep any copy implying a fixed grid.
C. Money edges
#34RULEONE extension formula (D8): per-minute rate of the booked service × minutes. Sweep S19/ADM so every extension figure derives from it.
#35RULEExtension splits 80/5/15 and settles on CALL completion (one settlement for base + extension together).
#36RULEConduct-kill mid-extension: the fan forfeits the entire charge including the extension; celeb is paid the full base + extension. Same as any conduct kill.
#37RULE‘Platform eats the Stripe fee on refunds’ must appear in ops docs + the talent agreement, not just the ledger. Not fan-facing (fans see a clean full refund).
#38RULEManager 5 pts applies identically to hours, drops, and extensions. On a conduct-forfeit (no celeb payout to share), the manager earns nothing — they’re paid on delivered revenue only.
#39RULEDefine it: instant payout is PER-CALL at completion. So the label reads ‘landed’ for finished calls and ‘tonight so far’ as a running sum — never ‘on the way’ for money already delivered.
#40FIXS20 payday is a $250 relic. Correct to Jordan’s real call: 10-min $100 + 5-min ext $50 = $150 · your 80% = $120. Fix ‘today so far’ to match D10 canonical ($240 tonight, pre-this-call).
#41RULEThe estimator hook must show gross AND net: ‘Up to $2,400/week in bookings · $1,920 to you.’ Never label a gross number ‘to you.’ This is the most-scrutinized celeb number — honesty here builds trust, and $1,920/wk still sells.
#42FIXADM net revenue: platform = 15% of GMV minus Stripe fees. On $18,400 GMV: $2,760 − ~$570 fees ≈ $2,190. Replace the impossible $3,090 with the formula-derived figure.
#43FIX@dre net-to-us: 15% of $18,700 = $2,805 − Stripe fees. Show the fee line explicitly so the delta isn’t a mystery.
#44RULEPARTIAL-CALL POLICY (D5) fills this blank: platform fault → full refund + celeb paid; connection fault <50% → free rebook; recording-only loss → make-good credit.
#45RULEReschedule honors the ORIGINAL price and service. A price change between booking and reschedule doesn’t apply; must be the same duration.
#46RULERefund to an expired card: Stripe routes to the replacement card on file; if none, we email the fan to add a payout method (ACH/PayPal fallback). Standard Stripe refund fallback.
#47RULEConduct ‘Refund fan (not warranted)’ button is for operator discretion on borderline cases; funded by the D9 reserve, celeb keeps their pay. Rare, logged, reason-coded.
#50RULECeleb cancel with a same-night extension chain: refund every captured piece (base + any extensions) for that booking. Simple sum.
#51DEFERTaxes/1099: Stripe Connect issues 1099-Ks automatically at threshold. Note it in the talent agreement; no product work for v1.
D. Hours / drops / menu
#52RULEExisting bookings are ALWAYS honored. Editing hours only changes FUTURE availability; removing a window that has a booking warns the celeb and leaves the booking intact.
#53RULEDeleting/re-pricing a menu item hides it from new bookings; existing bookings keep their booked service + price.
#54RULEDrops and hours draw from ONE calendar, so the system physically can’t double-sell the same minutes. A drop over standing hours just fills the same time — allowed, deduped.
#55RULECheckout soft-hold (8 min) prevents the race: first to complete Apple Pay wins; the other sees ‘that time was just taken’ + instant re-pick, authorization released, no charge.
#56RULEOff-hours request TTL + fan Pending screen (D3) — both currently missing, both required.
#57RULEPause = stop NEW sales, honor all paid future bookings. Celeb can’t pause away money a fan already paid.
#58RULESuspend (T&S) = stop new sales AND auto-refund every paid future booking with a neutral ‘this payphone is unavailable’ note to fans. Harsher than pause, operator-only, reason-coded.
#60RULESlot granularity resolved by D1: start times generate from the chosen service’s duration against free time, not a fixed grid.
#61RULEWhole-session cancel = one action that bulk-refunds every booking in it, texts the list, and offers each fan first dibs on the next session. Needs a screen (see H).
E. Identity / account
#62RULEChange-number flow: verify the NEW number by OTP while signed in on the OLD one (or via email recovery). Add the row to the You tab. Required for both sides.
#63RULECeleb change-number = same verified-OTP flow, plus manager re-confirmation. Payphone ownership stays with the celeb; if the manager relationship ends, the celeb keeps the payphone, manager loses the rev-share attribution.
#64RULENumber recycling mitigation: any OTP login from a NEW device also requires the email on file (or a card last-4). Blocks a recycled-number takeover of saved card/recordings. Standard for phone-first apps.
#65RULEOne number = one account, by design. Acknowledge it in help copy; a shared phone shares the account. Fine for launch.
#66RULEWeb-number-A / app-number-B: the app offers ‘Booked with a different number? Find my booking’ → verify the other number → merge. Prevents the empty-app panic 10 min before a call.
#67RULERole isn’t global — it’s per-context. A celeb’s account can BOTH run their payphone AND book others as a fan; the app shows the fan surfaces to everyone, the celeb surfaces only to claimed payphones. ‘Role by number’ in 7c means ‘your OWN payphone is recognized,’ not ‘you’re locked out of fan mode.’
#68RULEManager permissions matrix (define now): CAN — edit menu/hours/drops, view roster stats, message. CANNOT without per-action celeb consent — cancel bookings, change payout bank, export fan PII. Payouts always land in the CELEB’s Stripe, never the manager’s. This is the B2B product; spec it before build.
#69RULEResolved by D4: keep the export, fix the copy to state both facts. The list-join disclosure appears at checkout, the never-shared-for-calling promise stays on call surfaces.
#70RULEBan enforcement = card fingerprint + device signal, not just number (numbers are cheap via VoIP). A banned fan’s paid future bookings are refunded and cancelled.
#71RULENOT a contradiction: 17+ is Apple’s maximum age rating (there is no ‘18+’ App Store category), while ToS enforces 18+. Add an 18+ attestation checkbox at checkout. Document the mapping.
F. Call / recording
#72RULEAdd an explicit celeb recording-consent moment at go-live (screen 6/7): ‘Every call is recorded for both sides’ with an accept. The side whose likeness IS the product must consent in the flow, not just in ToS.
#73DEFERTwo-party-consent: the mutual REC disclosure likely satisfies CA; flag for counsel with the draft ToS/Privacy. Legal review, not build.
#74RULERecording-loss make-good (D5c): call stands, fan auto-issued a free 5-min credit. If the lost recording was needed as dispute evidence, the join log + transcript stand in and T&S rules conservatively for the fan.
#75RULERetention triangle resolved by D6; write it into ToS §5 verbatim.
#76DEFERModeration participant: the ‘monitored’ disclosure covers it; confirm the exact wording with counsel. The bot is invisible to both parties and doesn’t break 1:1.
#77RULECeleb extension consent = the Hours toggle (D8) + an in-call decline. A celeb with a hard stop turns the toggle off; the +time offer never appears to their fans.
#78RULEA fan report FREEZES that call’s instant payout into review (funded stays in the D9 reserve) until T&S rules. This is why the reserve exists — it makes post-call fan remedies fundable without clawbacks.
#80RULEObjecting to recording after paying = a standard cancel (>24h full refund, <24h reschedule). Recording is non-negotiable and consented at checkout, so there’s no special refund path.
G. Cross-artifact consistency (mostly the D10 sweep)
#81FIXS20 $250/$200/$1,540 → $150/$120/$240 canonical (D10).
#82FIXPick 10 openings for the canonical Tue session; propagate to S5/S7d/S8/S9/APV2. One number everywhere.
#83FIXSession capacity must obey D1 time math (120 min ÷ (service+buffer)). No ‘23 calls in 2 hours.’
#84FIXAt 7:41 PM (41 min in), at most ~3 calls done — fix ‘13 of 18.’
#85FIXAdmin drop event: use Sol’s real list size (44,210), not Dre’s 12,483.
#86FIXOne fan per slot in sample data — Jordan XOR Casey at 7:20, not both.
#87FIXOne booking ID per outcome across emails — E5 (completed) and E6 (refunded) can’t share #PP-88214.
#88FIXE5 duration must match the archive (15:00 with extension, or drop the extension from the canonical Jordan call — pick one).
#90FIXAll extension figures derive from D8; sweep the three mismatched ones.
#92RULEAdd conduct-forfeiture to the CHECKOUT fine print (it’s legally load-bearing and currently only on CP/HIW).
#93RULEResolved by D7: free watch at launch; the journey is correct, the ledger’s paid-follow becomes the documented v1.1.
#94FIX18+/17+ is the correct mapping (see #71); document, don’t ‘fix.’
#95RULESurface ‘captured at booking / split on completion’ in ToS §3 (fan-facing) and the manager agreement (celeb/manager-facing), not just the ledger.
#96FIXPurge emoji: E2 subject (💰) and admin sidebar (👥 🛡 ⚙) violate the design law. Replace with the stroke set.
#97FIX‘line’→‘payphone’ sweep across site, all 6 emails, admin, both prototypes, v4 mockups. Journey + guide already done.
#98FIXHIW step 2 must say ‘the celebrity sets the lengths and prices,’ not hardcode ‘5/10/20.’
H. Missing screens — build order
#100RULEFan refund/report UI — PRIORITY 1 (paired with D5/D9). Draw next.
#111RULEFan web ‘my bookings’ page (magic-link auth) — PRIORITY 1. The no-app promise breaks at the first cancel without it.
#102RULECeleb cancel-a-booking flow — PRIORITY 2 (E2 already tells them ‘do it in the app’).
#103RULEReschedule picker — PRIORITY 2 (button + email link already point at it).
#104RULEFan Pending-request screen — PRIORITY 2 (required by D3).
#106RULECeleb recording-consent moment — PRIORITY 2 (D-72), one screen in onboarding.
#61RULEWhole-session cancel — PRIORITY 2 (bulk refund + list notify).
#105RULEManager dashboard — PRIORITY 2 (the B2B product; permissions per #68). Bigger effort, plan after the two P1s.
#108RULESold-out waitlist (‘text me if a slot frees’) — PRIORITY 3, captures demand scarcity throws away.
#107RULEBanned-fan experience — PRIORITY 3 (neutral copy, outstanding bookings refunded, no appeal at launch).
#110RULECeleb rates/blocks a fan — PRIORITY 3 (the fan already has a ★ rating shown; add the celeb-side capture).
#109DEFERAccount deletion / data rights — with counsel + Privacy v1; recordings are the OTHER party’s evidence, so deletion anonymizes rather than erases.
#112DEFERSupport SLA + in-product help — email + a help row at launch; formal SLA later.
#113RULEAndroid — same React Native/Expo build as iOS, same screens; confirm it’s in the build plan (it is, per push architecture).
#114RULEPayment-failure / 3DS / slot-hold states — part of the checkout build (D3/#55).
#115DEFERMembership/paid-follow product — v1.1 per D7; no v1 screens.
#116RULETalent agreement — the doc that carries reserve (D9), rev-share, taxes, extension terms. Draft with counsel before onboarding real talent.
#117DEFERCeleb archive export at scale + on-departure — covered by D6 retention; bulk export is a v1.1 nicety.
#118RULE‘Open a payphone manually’ (admin) = ops force-opens a session for a celeb (e.g. a special event the manager arranged). Define as an admin action.
#119DEFERManager bulk tooling (invite 50, batch hours) — v1.1; the 10 launch managers can be onboarded hands-on.
What ‘approve’ unlocks: I lock these into the ledger as the canonical spec, run the FIX sweep across every artifact (sample data, emoji, ‘line’→’payphone’), then draw the Priority-1 missing screens (fan refund/report + fan web ‘my bookings’). After that the product has no undefined behavior in any flow a fan or celeb can reach — which is the bar for dev mode.