Four ideas explain almost every screen in the product.
1. One rider, one team per competition
A rider doesn't belong to a club — they belong to one team per race type. ZRL, ladder, events are tracked separately, each with its own captain and calendar. Assigning someone to a new ZRL team replaces their old ZRL team and leaves the others alone.
2. Status is the vocabulary
Every rider carries a status, and it drives what everyone else can do.
Available · Active · Unavailable · On Loan · Inactive · Unverified · Free Agent · Prospect
| Status | Meaning |
|---|---|
| Available | Can be picked — and can be borrowed by another club |
| Active | Set into a line-up. Locked, and no longer borrowable |
| Unavailable | Can't race this one |
| On Loan | Racing for another club this week |
| Inactive | On a break, still a club member, takes no roster spot |
| Unverified | Height/weight not confirmed — can't be selected |
| Free Agent | No team, claimable by any captain |
| Prospect | Signed up via a club link, not yet assigned |
3. Races carry their own rules
Roster size isn't a property of your team — it belongs to the race. Each race sets minimum starters, maximum starters and maximum bench. Step to a different round and your available spots can change.
4. The chain everything hangs off
The core mechanism
A race demands a minimum number of starters → a captain doesn't have enough available riders → the line-up won't save → they request a rider from another club → that club's captain approves → the rider joins as Active → the line-up saves → after the race, the rider returns automatically.
Once that chain makes sense, statuses, borrowing rules and roster settings stop being separate features and become one mechanism.