---
id: FAS-MBR-MEM-01
feature: FEAT-MBR-MEM-01
product_area: membership
module: memberships
revision: 1
status: proposed
product_intent: proposed
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
capabilities:
  - CAP-MBR-MEM-001
  - CAP-MBR-MEM-002
  - CAP-MBR-MEM-003
  - CAP-MBR-MEM-004
  - CAP-MBR-MEM-005
  - CAP-MBR-MEM-006
scenarios:
  - id: FAS-MBR-MEM-01-01
    title: Add future coverage without changing present rights
    kind: behaviour
    exercises:
      - CAP-MBR-MEM-001
      - CAP-MBR-MEM-002
      - CAP-MBR-MEM-005
    relies_on:
      - ATS-MBR-MEM-001-09
      - ATS-MBR-MEM-002-05
      - ATS-MBR-MEM-005-01
    preconditions: A person has a Student offer and an Alumni renewal offer.
    steps:
      - do: >-
          Record the Student membership, add its early Alumni renewal, and read
          both sides of the type-change date.
        expect: >-
          One holding retains both periods; the current and future dated answers
          select their respective types.
        provenance: test
        source: >-
          services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts
    expected: >-
      One holding retains both periods; the current and future dated answers
      select their respective types.
    negative: false
    data_needs: >-
      An isolated workspace, dated member fixtures, chapter and package
      configuration, and recording partner ports where the case requires them.
    bound_to:
      - TST-MBR-MEM-246
    provenance: test
    source:
      - 'services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts'
      - >-
        services-membership:modules/memberships/tests/integration/services/staff-operations.integration.spec.ts#creates
        a membership with its committed term, its enrolment and its cache
      - >-
        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
      - >-
        services-membership:modules/memberships/tests/integration/db/membership-functions.integration.spec.ts#answers
        Sam grace, lapsed, then active across the lapse and rejoin (scenario 4)
    binding_evidence:
      - suite: TST-MBR-MEM-246
        source: >-
          services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts
  - id: FAS-MBR-MEM-01-02
    title: Keep source and granted coverage consistent through correction
    kind: interaction
    exercises:
      - CAP-MBR-MEM-001
      - CAP-MBR-MEM-003
      - CAP-MBR-MEM-006
    relies_on:
      - ATS-MBR-MEM-001-09
      - ATS-MBR-MEM-003-07
      - ATS-MBR-MEM-006-01
    preconditions: A new person selects a package granting another program.
    steps:
      - do: >-
          Create the source holding, shorten its term, and inspect the source
          and granted periods and retained earlier values.
        expect: >-
          The grant stays linked to its source and the correction preserves
          earlier knowledge while contracting the mirrored coverage.
        provenance: proposed
        source: &ref_0
          - >-
            services-membership:modules/memberships/tests/integration/services/staff-operations.integration.spec.ts#creates
            a membership with its committed term, its enrolment and its cache
          - >-
            services-membership:tests/acceptance/memberships/MBR-ACC-0182.acceptance.ts#MBR-ACC-0182:
            Granted terms follow their source down but never up: shortened with
            a correction, terminated or cancelled with it, while the granted
            membership is not suspended with the primary
          - >-
            services-membership:modules/memberships/tests/integration/services/staff-operations.integration.spec.ts#creates
            the granted membership and term of a package grant in the same
            transaction
    expected: >-
      The grant stays linked to its source and the correction preserves earlier
      knowledge while contracting the mirrored coverage.
    negative: false
    data_needs: >-
      An isolated workspace, dated member fixtures, chapter and package
      configuration, and recording partner ports where the case requires them.
    bound_to: []
    provenance: proposed
    source: *ref_0
  - id: FAS-MBR-MEM-01-03
    title: 'Carry the member through lapse, drop and return'
    kind: lifecycle
    exercises:
      - CAP-MBR-MEM-001
      - CAP-MBR-MEM-002
      - CAP-MBR-MEM-003
      - CAP-MBR-MEM-005
    relies_on:
      - ATS-MBR-MEM-002-04
      - ATS-MBR-MEM-003-04
      - ATS-MBR-MEM-005-01
    preconditions: A person’s first annual coverage ends with a sixty-day grace allowance.
    steps:
      - do: >-
          Read grace and lapse, record the late drop, then add a rejoin after
          the continuity allowance and read the returned member.
        expect: >-
          The original join date stays recorded, the old term keeps its end, and
          the return starts a second continuity episode.
        provenance: test
        source: 'services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts'
    expected: >-
      The original join date stays recorded, the old term keeps its end, and the
      return starts a second continuity episode.
    negative: false
    data_needs: >-
      An isolated workspace, dated member fixtures, chapter and package
      configuration, and recording partner ports where the case requires them.
    bound_to:
      - TST-MBR-MEM-247
    provenance: test
    source:
      - 'services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts'
      - >-
        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)
      - >-
        services-membership:modules/memberships/tests/integration/services/staff-operations.integration.spec.ts#terminates
        a term from the effective date, with the reason, and the status follows
      - >-
        services-membership:modules/memberships/tests/integration/db/membership-functions.integration.spec.ts#answers
        Sam grace, lapsed, then active across the lapse and rejoin (scenario 4)
    binding_evidence:
      - suite: TST-MBR-MEM-247
        source: 'services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts'
  - id: FAS-MBR-MEM-01-04
    title: Keep every staff lifecycle write behind its own grant
    kind: permission
    exercises:
      - CAP-MBR-MEM-001
      - CAP-MBR-MEM-002
      - CAP-MBR-MEM-003
      - CAP-MBR-MEM-004
    relies_on:
      - ATS-MBR-MEM-001-01
      - ATS-MBR-MEM-002-06
      - ATS-MBR-MEM-004-01
      - ATS-MBR-MEM-005-03
      - ATS-MBR-MEM-001-15
      - ATS-MBR-MEM-002-11
      - ATS-MBR-MEM-003-14
      - ATS-MBR-MEM-004-08
    preconditions: >-
      Staff, a read-only colleague, a portal member and a different-workspace
      administrator share fixture identifiers.
    steps:
      - do: >-
          Try creation, term addition, correction, termination, suspension and
          restoration as staff, a read-only colleague, a portal member and the
          other-workspace administrator.
        expect: >-
          Staff requests alone succeed; restricted callers receive their
          permission or workspace refusal and the checked terms and event counts
          remain unchanged by refused calls.
        provenance: test
        source: >-
          services-membership:tests/acceptance/memberships/MBR-ACC-0172.acceptance.ts
    expected: >-
      Staff requests alone succeed; restricted callers receive their permission
      or workspace refusal and the checked terms and event counts remain
      unchanged by refused calls.
    negative: true
    data_needs: >-
      An isolated workspace, dated member fixtures, chapter and package
      configuration, and recording partner ports where the case requires them.
    bound_to:
      - TST-MBR-MEM-191
    provenance: test
    source:
      - >-
        services-membership:tests/acceptance/memberships/MBR-ACC-0172.acceptance.ts
      - >-
        services-membership:tests/acceptance/memberships/MBR-ACC-0162.acceptance.ts#MBR-ACC-0162
      - >-
        services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts#refuses
        a term from a caller without membership.terms.create
      - >-
        services-membership:tests/acceptance/memberships/MBR-ACC-0174.acceptance.ts#MBR-ACC-0174:
        A membership is suspended over its terms and restored to whatever the
        terms give, once each way, with no detections while suspended and the
        history showing the suspension
      - >-
        services-membership:modules/memberships/tests/integration/services/status-sweep.integration.spec.ts#answers
        the right status on each side of the expiry before any sweep runs (the
        resolver needs none)
    binding_evidence:
      - suite: TST-MBR-MEM-191
        source: >-
          services-membership:tests/acceptance/memberships/MBR-ACC-0172.acceptance.ts
  - id: FAS-MBR-MEM-01-05
    title: Restore dependent standing without rewriting period dates
    kind: regression
    exercises:
      - CAP-MBR-MEM-004
      - CAP-MBR-MEM-005
      - CAP-MBR-MEM-006
    relies_on:
      - ATS-MBR-MEM-004-03
      - ATS-MBR-MEM-005-01
      - ATS-MBR-MEM-006-04
    preconditions: An organization and its qualifying people have current mirrored periods.
    steps:
      - do: >-
          Suspend and restore the organization, read every derived holding, and
          compare term dates before and after both changes.
        expect: >-
          The children follow suspension and restoration while keeping the
          recorded periods and returning to their date-derived standing.
        provenance: proposed
        source: &ref_1
          - >-
            services-membership:modules/memberships/services/operations/staff-operations.ts:suspendChildren
          - >-
            services-membership:modules/memberships/tests/integration/db/membership-functions.integration.spec.ts#answers
            Sam grace, lapsed, then active across the lapse and rejoin (scenario
            4)
          - >-
            services-membership:modules/memberships/tests/integration/services/organization-children.integration.spec.ts#flows
            down to the contacts holding a flow-down role, mirroring the
            parent’s dates with the flow-down type
    expected: >-
      The children follow suspension and restoration while keeping the recorded
      periods and returning to their date-derived standing.
    negative: false
    data_needs: >-
      An isolated workspace, dated member fixtures, chapter and package
      configuration, and recording partner ports where the case requires them.
    bound_to: []
    provenance: proposed
    source: *ref_1
evidence:
  - >-
    rhythm-v2-docs:specs/membership/memberships/planning/features/FEAT-MBR-MEM-01-memberships-and-terms.md
  - >-
    rhythm-v2-docs:specs/membership/memberships/design/tests/: detailed
    capability scenarios and interaction cases.
  - 'services-membership:tests/e2e/s01-early-renewal-type-change.e2e.spec.ts'
  - 'services-membership:tests/e2e/s04-lapse-and-rejoin.e2e.spec.ts'
---

# Membership Holdings and Periods: Feature Acceptance Suite

## What the Feature Must Do as a Whole

This suite tests the continuity of a member’s record across staff entry, future renewal, interruption and return. Composite cases also test how source changes affect dependent coverage.

## Interactions Between Capabilities

The composite cases test the effect of a change in one capability on the records and answers of another. Detailed reliance links identify the supporting capability scenarios; an executable binding requires assertions for the complete feature case. Cases without such a binding remain proposed.

## Regression Record

| Revision | Change | Scenario | Why |
|---|---|---|---|
| 1 | initial | all | Establish cumulative feature coverage from the pinned specification and executable evidence. |
