Skip to content

DOM-MBR-STR-003Membership Program

Markdown

DOM-MBR-STR-003

Membership Program

Markdown
  • DocumentDraft
  • ImplementationPartially observed

Planning

Specified by
CON-MBR-STR-003

Design

Owned by
SVC-MBR-STR-configuration

KindDomain objectProduct areaMembershipModuleOrganizational Structure, Membership Configuration and TermsRevision1

Read atservices-membership 5994c270react-console baf6dae3

Relationships

ToCardinalityOwnershipCrosses a serviceOn archive or delete
DOM-MBR-STR-001Each program has zero or many required unit kinds and zero or one identifying kindConfiguration owns program requirements and kind references; structure owns the referenced kind catalogue.yes
DOM-MBR-STR-002many programs to zero or one owning unitThe program stores and owns its optional administering-unit reference.yes
DOM-MBR-STR-004Each program has many packages; each package uses one type of its own programPackages own their program and classification pointers; database references prevent moving a used type into another program.no
DOM-MBR-STR-005A program and type supplies grace and continuity inputs for each membershipThe engine consumes current allowances through domain hooks without taking ownership of program records.yes

Invariants

InvariantProtectsEnforced atProvenance
INV-DOM-MBR-STR-003-01
Identity binding requires an identifying kind, and any kind or owning unit referenced by a program belongs to its workspace.
service, databasetest
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses an identity-bound program without its identity unit type 400 naming identity_unit_type_id
INV-DOM-MBR-STR-003-02
Each membership type references one program, and a package reference prevents changing that type to another program.
databasetest
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses moving a type a package names to another program 400 naming program_id, and leaves it where it was
INV-DOM-MBR-STR-003-03
Enabled flow-down requires a target type that exists in the same program.
databasetest
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses flow-down enabled without a target type 400 naming flowdown_type_id, and writes no type
INV-DOM-MBR-STR-003-04
Only affiliation-bound programs accept nonempty requirement lists; each kind exists, accepts affiliations, appears once and has a maximum at least its minimum.
serviceobserved
INV-DOM-MBR-STR-003-05
Requirement replacement cannot drop a kind used by a non-cancelled program term's affiliation whose end is absent or today or later.
serviceobserved
INV-DOM-MBR-STR-003-06
Stored grace and continuity values are bounded nonnegative whole numbers.
api, service, databasetest
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses a grace period of 2^31 days 400 naming grace_days, beyond what the column stores
INV-DOM-MBR-STR-003-07
Programs, requirements and membership types have no declared custom-field capability.
apidocumented
services-membership:AGENTS.md#Custom Fields Are Opt-In Per Entity: R2-ARCH-001 (Andrew, 2026-10-19)

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.