Functional Requirements
Sensing & Reasoning Layers

Scope of this doc: what the system watches, how it decides something is a real risk, and what it hands off to engineering to build. The action layer (email, dashboard, CRM sync) is covered in separate specs.

1. Sensing Layer: what we're monitoring

The system pulls four signal categories per partner, refreshed monthly (weekly if real-time infra is available).

SignalDefinitionSource systemWhy it matters
Slots listedNumber of bookable slots a partner has made available this cyclePartner AppDrop in listings is often the first sign a partner is disengaging, before payout even moves
Slots bookedNumber of listed slots actually booked by usersBooking engineUtilization rate = booked ÷ listed. Low utilization can be a partner problem (bad listing, pricing) or a demand problem (city-level)
Attendance confirmedBookings that converted to an actual check-inPartner App check-in logDistinguishes "booked but ghosted" from real usage
Payout per cycleTotal amount paid to the partner this cycle, and its trend over the last 3 cyclesPayments / Finance systemThe commercial signal, ties directly to whether the partner has a reason to stay

Derived inputs (computed, not raw):

Update cadence: monthly cycle, computed in the last week of the month for that month's data. Weekly cadence is a v2 consideration once alert volume and false-positive rate are validated at monthly cadence.

2. Reasoning Layer: how risk is decided

This is not a single threshold rule. It's a two-step check: detect, then verify.

Step 1: Detection (per partner, per cycle)

A partner is provisionally flagged if any of the following hold:

These are partner-specific thresholds, not fleet-wide averages, because a small yoga studio and a large multi-court sports facility have very different normal ranges.

Step 2: Verification (before it becomes a flag a human sees)

Before a provisional flag is surfaced, the system checks it against context to reduce false positives:

Only flags that clear verification get routed to the action layer.

Tiering logic (A to E)

Every partner is tiered using two inputs:

A high payout-per-slot partner in a low-demand city carries different risk than the same payout-per-slot partner in a saturated metro, so tiering accounts for both rather than payout alone.

Open input: tier boundaries (what payout-per-slot range defines Tier A vs. B, etc.) need to be set using actual FITPASS payout data before this ships. This is flagged as an open input, not a resolved threshold.

3. What's explicitly not in scope for the reasoning layer, v1

4. Engineering handoff summary