---
id: JNY-MBR-MEM-001
title: "Staff carry a member through an early renewal, a lapse and a rejoin"
feature: FEAT-MBR-MEM-01
product_area: membership
module: memberships
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: partially-observed
supersedes:
  - "inventory:MBR-ACC-0165"
  - "inventory:MBR-ACC-0166"
  - "inventory:MBR-ACC-0163"
  - "inventory:MBR-ACC-0169"
  - "inventory:MBR-ACC-0530"
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
actor: ACT-MBR-007
goal: "Keep one member's membership true across the years: renewals by staff, a lapse, a drop and a return, with every date answering correctly."
capabilities:
  - CAP-MBR-MEM-001
  - CAP-MBR-MEM-002
  - CAP-MBR-MEM-003
  - CAP-MBR-MEM-005
  - CAP-MBR-MEM-018
screens: []
steps:
  - 'n': 1
    surface: "createMembership"
    action: "Record Sam's Regular membership with a staff-given reason."
    capability: CAP-MBR-MEM-001
    expected: "The membership is numbered with a committed term and an enrolment."
    provenance: test
    source: "services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#records the business events: enrolled, terminated, rejoined"
  - 'n': 2
    surface: "getMembershipAsOf"
    action: "Read Sam the day after his term ends, and after his 60 days of grace."
    capability: CAP-MBR-MEM-005
    expected: "Grace, then lapsed."
    provenance: test
    source: "services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#answers grace the day after the term ended and lapsed once the 60 days are over"
  - 'n': 3
    surface: "terminateTerm"
    action: "Drop the expired term months later with the reason \"Did Not Renew\"."
    capability: CAP-MBR-MEM-003
    expected: "The term keeps its dates and the drop is recorded with its reason."
    provenance: test
    source: "services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#drops the expired term with its reason and leaves its dates as they were"
  - 'n': 4
    surface: "createTerm"
    action: "Add a term when Sam returns 437 days after his term ended."
    capability: CAP-MBR-MEM-002
    expected: "A rejoin starting a fresh anniversary period from its own date."
    provenance: test
    source: "services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#starts the rejoin as a fresh anniversary period from its own date"
  - 'n': 5
    surface: "getMembershipAsOf"
    action: "Read Sam on a date between his two periods."
    capability: CAP-MBR-MEM-005
    expected: "Lapsed, between two continuity episodes."
    provenance: test
    source: "services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#answers lapsed on 2024-01-31, between the episodes"
  - 'n': 6
    surface: "listMembershipHistory"
    action: "Open the membership's history."
    capability: CAP-MBR-MEM-018
    expected: "Every change appears newest first with who made it."
    provenance: test
    source: "services-membership:tests/acceptance/history/MBR-ACC-0530.acceptance.ts#MBR-ACC-0530"
alternates:
  - from_step: 4
    condition: "Sam returns within the package's reinstatement window."
    path: "The new term continues from the old one's end."
    outcome: "A reinstatement, with continuity unbroken."
    provenance: test
    source: "services-membership:tests/acceptance/memberships/MBR-ACC-0169.acceptance.ts#MBR-ACC-0169"
  - from_step: 1
    condition: "A student renews early into the alumni type."
    path: "A further term of the other type is added after the current one."
    outcome: "Student rights until the switch, alumni rights from it."
    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"
failures:
  - from_step: 4
    condition: "Another coordinator adds the same term at the same moment."
    path: "The second dated term is refused as an overlap."
    outcome: "One rejoin; the loser re-reads and sees it."
    provenance: test
    source: "services-membership:tests/acceptance/memberships/MBR-ACC-0170.acceptance.ts#MBR-ACC-0170"
  - from_step: 3
    condition: "The coordinator acts on an out-of-date read of the term."
    path: "The drop is refused as a version mismatch naming the current version."
    outcome: "Nothing changes until the coordinator re-reads."
    provenance: test
    source: "services-membership:tests/acceptance/memberships/MBR-ACC-0170.acceptance.ts#MBR-ACC-0170"
rules_in_play:
  - BR-CAP-MBR-MEM-002-03
  - BR-CAP-MBR-MEM-002-04
  - BR-CAP-MBR-MEM-003-06
  - BR-CAP-MBR-MEM-005-01
  - BR-CAP-MBR-MEM-005-09
  - BR-CAP-MBR-MEM-001-06
assertions:
  - id: AS-JNY-MBR-MEM-001-01
    statement: "Sam keeps his original join date and has two continuity episodes after the rejoin."
    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)"
  - id: AS-JNY-MBR-MEM-001-02
    statement: "The membership's business log says enrolled, terminated and rejoined, in that order."
    provenance: test
    source: "services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#records the business events: enrolled, terminated, rejoined"
  - id: AS-JNY-MBR-MEM-001-03
    statement: "The dropped term's dates are exactly what they were before the drop."
    provenance: test
    source: "services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts#drops the expired term with its reason and leaves its dates as they were"
e2e_policy: optional
e2e_reason: "Membership has no console screens yet; the journey is proved end to end through the API in process. A browser test becomes required when the staff membership screens are built."
evidence:
  - "services-membership at 5994c270e8a37a30f848e99ba5b5ee6b87c08893: the cited end-to-end, integration and acceptance specs and the capabilities they exercise."
  - "react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: acceptance/membership/journeys (the absorbed journeys and their recorded execution)."
---

# Staff carry a member through an early renewal, a lapse and a rejoin

## Story

A coordinator records Sam as a Regular member. When his term runs out he is in grace, then lapsed. Months later the coordinator drops the old term with its reason. More than a year after it ended Sam comes back, and the coordinator adds a new term, which Rhythm records as a rejoin. Reading any date answers what Sam was then, his join date stays, and his history shows every step with who took it.
