Skip to content

CAP-MBR-MEM-002Extend an existing membership through a staff term

Markdown

CAP-MBR-MEM-002

Extend an existing membership through a staff term

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationPartially observed

KindCapabilityProduct areaMembershipModuleMemberships, Applications and Membership BillingRevision1

Read atservices-membership 5994c270react-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
Additional staff terms retain the existing membership identity.The lifecycle record distinguishes enrolment, renewal, reinstatement and rejoin.Continuity reflects gaps without replacing the original join date.
Surfaces
consoleapi
Intent sources
services-membership:README.md#2026-10-18 — Final acceptanceservices-membership:docs/migrations/membership-core/README.md#The operations and their keys

Controls

44 controls apply, from the corpus control catalogue.

TC-AVL-002 TC-AVL-003 TC-AVL-004 TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-AZ-005 TC-AZ-006 TC-CHG-001 TC-CHG-002 TC-CHG-003 TC-CHG-004 TC-CRY-001 TC-CRY-002 TC-CRY-003 TC-DAT-001 TC-DAT-002 TC-DAT-003 TC-DAT-007 TC-IAM-001 TC-IAM-002 TC-IAM-004 TC-IAM-005 TC-IAM-006 TC-LOG-002 TC-LOG-003 TC-LOG-004 TC-LOG-005 TC-MON-001 TC-MON-002 TC-MON-004 TC-PI-001 TC-PI-002 TC-PI-003 TC-PI-004 TC-PI-005 TC-PRV-001 TC-PRV-002 TC-SEC-001 TC-SEC-004 TC-TEN-001 TC-TEN-002 TC-TEN-003

Permissions

KeyChecked atScope
membership.terms.createapitenant

Business Rules

9 rules, 8 to be proved before approval. A rule's product intent is derived from its origin: 9 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Only principal memberships accept direct staff terms; flow-down and assigned memberships receive their terms through their parent, while a package-granted term may belong to a principal membership.
no proof recorded yet
policyserviceobserved
02must prove
Confirmed
When dates are omitted, the selected package computes the next period from the latest effective term and its continuation settings.
no proof recorded yet
calculationserviceobserved
03must prove
Confirmed
A first effective term is an enrolment; a later term is a renewal if it leaves no uncovered day, a reinstatement if its uncovered days fit the package window, and otherwise a rejoin.
✓ A 437-day gap exceeds a 60-day reinstatement allowance and is classified as a rejoin.✗ A start on the day immediately following the previous end is classified as a renewal.
no proof recorded yet
calculationservicetest
services-membership:modules/memberships/tests/unit/term-events.spec.ts#is a rejoin for a term starting after the reinstatement window (scenario 4: 437 days)
04must prove
Confirmed
A rejoin whose gap exceeds the program’s continuity allowance begins another continuity episode and retains the original join date.
no proof recorded yet
calculationservice, databasetest
services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#keeps the original join date and restarts continuity at the rejoin (a gap of 437 days is more than 60)
05must prove
Confirmed
A later term can select a different type and package within the program without changing the earlier term or the type returned for dates it covers.
no proof recorded yet
policyservicetest
services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts#leaves the Student term untouched and current today, with the renewal recorded as renewed
06must prove
Confirmed
The product should prevent concurrent additions from committing overlapping terms in different programs of the same exclusivity group.
no proof recorded yet
invariantserviceunknown
07must prove
Confirmed
The product should treat simultaneous undated renewal requests as one renewal rather than two successive periods.
no proof recorded yet
invariantserviceunknown
08must prove
Confirmed
The API refuses callers without term-creation authority before running the term write.
no proof recorded yet
permissionapitest
services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts#refuses a term from a caller without membership.terms.create
09
Confirmed
The lifecycle event for a staff term retains the supplied reason.
policyserviceobserved

Scenarios

IdGivenWhenThenProvenance
01Maria’s Student term covers the period through 30 June 2027.Staff select an Alumni package for a further term and omit its dates.The Alumni period begins on 1 July 2027; date-specific reads retain Student for the earlier period.observed
02Sam returns 437 days after the end of his earlier, dropped term.Staff record the returning member’s next term.The membership has two continuity episodes while retaining its original join date.test

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.