---
id: CAP-MBR-MEM-002
title: Extend an existing membership through a staff term
feature: FEAT-MBR-MEM-01
product_area: membership
module: memberships
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: partially-observed
supersedes:
  - 'inventory:CAP-MBR-MEM-003'
  - 'inventory:CAP-MBR-MEM-007'
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-membership:README.md#2026-10-18 — Final acceptance'
  - 'services-membership:docs/migrations/membership-core/README.md#The operations and their keys'
purpose: >-
  Staff add another period of membership without checkout and distinguish a continuing member from one who
  returns after a gap.
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.
concepts:
  - CON-MBR-MEM-001
  - CON-MBR-MEM-002
actors:
  - ACT-MBR-007
surfaces:
  - console
  - api
permissions:
  - key: membership.terms.create
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-MBR-MEM-002-01
    statement: >-
      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.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-membership:modules/memberships/services/operations/staff-operations.ts:refuseChild'
    origin: none
  - id: BR-CAP-MBR-MEM-002-02
    statement: >-
      When dates are omitted, the selected package computes the next period from the latest effective term and
      its continuation settings.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-membership:modules/memberships/services/operations/staff-operations.ts:datesOf'
    origin: none
  - id: BR-CAP-MBR-MEM-002-03
    statement: >-
      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.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      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)
    origin: none
    examples:
      positive: A 437-day gap exceeds a 60-day reinstatement allowance and is classified as a rejoin.
      negative: A start on the day immediately following the previous end is classified as a renewal.
  - id: BR-CAP-MBR-MEM-002-04
    statement: >-
      A rejoin whose gap exceeds the program’s continuity allowance begins another continuity episode and
      retains the original join date.
    kind: calculation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      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)
    origin: none
  - id: BR-CAP-MBR-MEM-002-05
    statement: >-
      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.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      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
    origin: none
  - id: BR-CAP-MBR-MEM-002-06
    statement: >-
      The product should prevent concurrent additions from committing overlapping terms in different programs
      of the same exclusivity group.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: unknown
    source: FND-MBR-MEM-008
    origin: none
  - id: BR-CAP-MBR-MEM-002-07
    statement: >-
      The product should treat simultaneous undated renewal requests as one renewal rather than two successive
      periods.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: unknown
    source: FND-MBR-MEM-009
    origin: none
  - id: BR-CAP-MBR-MEM-002-08
    statement: The API refuses callers without term-creation authority before running the term write.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts#refuses a term from a caller
      without membership.terms.create
    origin: none
  - id: BR-CAP-MBR-MEM-002-09
    statement: The lifecycle event for a staff term retains the supplied reason.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: 'services-membership:modules/memberships/services/operations/staff-operations.ts:addTerm'
    origin: none
scenarios:
  - id: SC-CAP-MBR-MEM-002-01
    given: Maria’s Student term covers the period through 30 June 2027.
    when: Staff select an Alumni package for a further term and omit its dates.
    then: The Alumni period begins on 1 July 2027; date-specific reads retain Student for the earlier period.
    provenance: observed
    source: 'services-membership:modules/memberships/services/operations/staff-operations.ts:addTerm'
  - id: SC-CAP-MBR-MEM-002-02
    given: 'Sam returns 437 days after the end of his earlier, dropped term.'
    when: Staff record the returning member’s next term.
    then: The membership has two continuity episodes while retaining its original join date.
    provenance: test
    source: 'services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#answers two continuity episodes'
edge_cases: []
constraints: []
depends_on:
  - CAP-MBR-MEM-001
related:
  - CAP-MBR-MEM-007
  - CAP-MBR-MEM-009
journeys:
  - JNY-MBR-MEM-001
open_questions: []
evidence:
  - repository: services-membership
    source_sha: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
    paths:
      - modules/memberships/services/operations/staff-operations.ts
      - modules/memberships/services/operations/term-events.ts
      - modules/memberships/tests/unit/term-events.spec.ts
      - modules/memberships/tests/integration/services/staff-operations.integration.spec.ts
      - tests/e2e/s01-early-renewal-type-change.e2e.spec.ts
      - tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts
      - tests/acceptance/memberships
  - repository: react-console
    source_sha: baf6dae382d6f41dce976c7f848667ccc37e076f
    paths:
      - acceptance/membership/reports/defects/memberships.md
controls: [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]
---

# Extend an existing membership through a staff term

## Purpose

Staff use this capability for complimentary periods, payments handled elsewhere and returning members. It keeps the member’s existing record as the reference for the next period.

## How It Works

Staff begin with a principal membership and select the type and optional package for another term. They provide a reason for the addition. Explicit dates describe a chosen period; omitted dates delegate the calculation to the package. The package’s continuation settings matter when a member returns late. Rhythm records the resulting kind of addition in the lifecycle log. Staff can then inspect membership on the dates before and after the new period begins. Affiliations and package grants are handled by the related capabilities. Concurrent requests need particular care: the recorded findings identify gaps in protection across exclusive programs and against duplicate undated renewals.

## Relationships

- Establishing a membership supplies the record that receives the next term.
- Chapter and section affiliations describe the units carried into a further period.
- Membership checkout provides the purchase-driven route to a later term.
