Summary
From the #1189 productionization audit (hypothesis B-P2-02, confidence 92). A partial subscription reschedule flips the released slots to isTentative: true, completionStatus: RESCHEDULED but does not touch the parent Subscription status. Lists and dashboards therefore report the booking as fully APPROVED/SCHEDULED while one session is mid-negotiation — and proration/cancellation scopes that count sessions disagree with what the member sees.
Full reschedules of consultations do send the parent back to PENDING (see lib/booking/reschedule-withdraw.ts for the reverse flip), so the two flows already disagree with each other.
Failure mode
- Ops/support reads the subscription as fully confirmed; one session time is actually unresolved.
- Cancellation-scope and weekly-cap surfaces that count non-tentative sessions diverge from member-facing state.
Fix direction
Either (a) introduce a per-subscription "has unresolved sessions" derived flag the lists read, or (b) define (and document) a parent-status transition for partial reschedules consistent with the consultation flow. Must route through transitionSubscriptionRequest (doctrine rule 1) and be reflected in lib/booking/list-selects.ts and the cancellation scope.
Evidence
Summary
From the #1189 productionization audit (hypothesis B-P2-02, confidence 92). A partial subscription reschedule flips the released slots to
isTentative: true, completionStatus: RESCHEDULEDbut does not touch the parent Subscription status. Lists and dashboards therefore report the booking as fully APPROVED/SCHEDULED while one session is mid-negotiation — and proration/cancellation scopes that count sessions disagree with what the member sees.Full reschedules of consultations do send the parent back to PENDING (see
lib/booking/reschedule-withdraw.tsfor the reverse flip), so the two flows already disagree with each other.Failure mode
Fix direction
Either (a) introduce a per-subscription "has unresolved sessions" derived flag the lists read, or (b) define (and document) a parent-status transition for partial reschedules consistent with the consultation flow. Must route through
transitionSubscriptionRequest(doctrine rule 1) and be reflected inlib/booking/list-selects.tsand the cancellation scope.Evidence
app/api/appointments/[appointmentId]/reschedule/route.ts(slot flips only)lib/booking/cancellation-scope.ts,lib/booking/list-selects.ts