01must proveConfirmed | Only affiliation-bound programs accept units on their terms or through subsequent affiliation additions. no proof recorded yet | validation | service, database | test |
02must proveConfirmed | A selected unit must be active, permit member affiliation through its type, and have a type allowed by the effective program and package rules. no proof recorded yet | validation | service | observed services-membership:modules/memberships/services/affiliations/affiliation-operations.ts:requireAffiliableUnit, refuseUnlessValid |
03must proveConfirmed | Counts stay within each type’s maximum across the term and meet its minimum from the operation’s effective day, with package counts overriding program counts. ✓ A Regular package allowing one to three chapters accepts Atlanta and Savannah.✗ Ending the only required chapter is rejected for failing the minimum. no proof recorded yet | invariant | service | test |
04must proveConfirmed | Unless multiple primaries are permitted, each type has at most one primary on a date; an addition without an explicit choice becomes primary only if none of that type is primary on its start day. no proof recorded yet | invariant | service | observed |
05must proveConfirmed | A term cannot hold overlapping affiliations to the same unit. no proof recorded yet | invariant | service, database | test |
06must proveConfirmed | Direct staff or officer additions and transfers into a unit with an active package-specific or catch-all dues product are refused with the required Commerce amendment kind. no proof recorded yet | policy | service | test |
07must proveConfirmed | New staff terms use their named units from the term start; later terms with omitted affiliations inherit eligible active units held at the previous end, while an explicit empty list still faces the minimum rules. origin: RS-1115 (services-membership:docs/migrations/membership-core/README.md#P2b) no proof recorded yet | policy | service | observed |
08must proveConfirmed | Ending defaults to yesterday and must shorten the current span; the day immediately before its start withdraws the row unless a later transfer continues it, while an earlier end date is invalid. no proof recorded yet | lifecycle | service | observed |
09must proveConfirmed | Making a row primary clears overlapping same-type primary rows for their whole spans unless multiple primaries are allowed. no proof recorded yet | lifecycle | service | observed services-membership:modules/memberships/services/affiliations/affiliation-operations.ts:losingPrimaryOf, setPrimaryAffiliation |
10must proveConfirmed | Ending, transferring or changing the primary designation requires the current version of the affected affiliation row; additions do not submit an affiliation version. no proof recorded yet | validation | service | observed services-membership:modules/memberships/services/affiliations/affiliation-operations.ts:addAffiliationSchema, lockAffiliation |
11must proveConfirmed | An affiliation addition waits for a concurrent unit merge holding the unit lock and then rejects a unit whose committed status is merged. no proof recorded yet | invariant | service, database | test |
12must proveConfirmed | Unit rosters apply dated affiliations and optional descendants from the requested date’s tree, returning a matching member only once. no proof recorded yet | calculation | service | test |
13must proveConfirmed | The product should accept a reduction that restores compliance after a package maximum is tightened below existing holdings. no proof recorded yet | policy | service | unknown |
14must proveConfirmed | The product should expose member chapter changes under the configured portal allowance while leaving staff free of that member-only restriction. no proof recorded yet | policy | service | unknown |