---
id: CAP-MBR-MEM-003
title: Correct or close a term without losing earlier knowledge
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-004'
  - 'inventory:CAP-MBR-MEM-005'
  - 'inventory:CAP-MBR-MEM-014'
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 amend an inaccurate term or close it with a reason while preserving the information available before
  the change.
outcomes:
  - Corrections retain the association’s earlier understanding for historical reporting.
  - Closures record when a period ends and why staff close it.
  - Dependent affiliations and granted periods are adjusted when the source period contracts.
concepts:
  - CON-MBR-MEM-002
  - CON-MBR-MEM-006
actors:
  - ACT-MBR-007
  - ACT-MBR-012
surfaces:
  - console
  - api
permissions:
  - key: membership.terms.correct
    where_checked: api
    scope: tenant
  - key: membership.terms.terminate
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-MBR-MEM-003-01
    proved_by: [ATS-MBR-MEM-003-01, ATS-MBR-MEM-003-14, ATS-MBR-MEM-010-10, TST-MBR-MEM-191]
    statement: >-
      Correction and termination require a principal membership’s committed term and its current version; a
      stale request returns the version now held.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-membership:modules/memberships/services/operations/staff-operations.ts:lockTerm, correctTerm,
      terminateTerm
    origin: none
  - id: BR-CAP-MBR-MEM-003-02
    proved_by: [ATS-MBR-MEM-003-02, ATS-MBR-MEM-003-12, ATS-MBR-MEM-018-09, TST-MBR-MEM-020, TST-MBR-MEM-028]
    statement: >-
      A reasoned correction updates dates, type or package while retained versions record the previous values
      and actor for earlier-known reporting.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/staff-operations.integration.spec.ts#keeps
      the old truth of a correction in the versions, recorded with the actor
    origin: none
  - id: BR-CAP-MBR-MEM-003-03
    proved_by: []
    statement: >-
      The product should reject corrections that create overlapping coverage in another program of the owner’s
      exclusivity group.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: unknown
    source: FND-MBR-MEM-010
    origin: none
  - id: BR-CAP-MBR-MEM-003-04
    proved_by: [ATS-MBR-MEM-003-03, ATS-MBR-MEM-003-09, TST-MBR-MEM-024, TST-MBR-MEM-214]
    statement: >-
      A correction trims or removes affiliations outside the amended term and rechecks the remaining set
      against changed type or package rules, without rechecking minimum counts.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: observed
    source: >-
      services-membership:modules/memberships/services/affiliations/affiliation-operations.ts:keepAffiliationsInsideTerm
    origin: none
  - id: BR-CAP-MBR-MEM-003-05
    proved_by: []
    statement: >-
      The product should extend affiliations backwards when a corrected start moves earlier so required
      chapter coverage reaches that earlier start.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: unknown
    source: FND-MBR-MEM-011
    origin: none
  - id: BR-CAP-MBR-MEM-003-06
    proved_by: [ATS-MBR-MEM-003-04, ATS-MBR-MEM-003-10, ATS-MBR-MEM-003-11, ATS-MBR-MEM-003-13, ATS-MBR-MEM-013-14, ATS-MBR-MEM-014-10, ATS-MBR-MEM-020-08, TST-MBR-MEM-028, TST-MBR-MEM-247]
    statement: >-
      Termination uses an applicable status reason and defaults its effective date to today; it shortens
      coverage to the preceding day only when that is earlier than the existing end, otherwise retaining dates
      and recording the later drop date.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: 'services-membership:modules/memberships/services/operations/staff-operations.ts:terminateTerm'
    origin: none
  - id: BR-CAP-MBR-MEM-003-07
    proved_by: [ATS-MBR-MEM-003-05, TST-MBR-MEM-014, TST-MBR-MEM-183]
    statement: >-
      Closing a term on or before its start cancels it, leaving those dates available for another effective
      term.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-membership:modules/events/tests/integration/business-events.integration.spec.ts#states
      membership.term.cancelled, not terminated, for a term that had not started
    origin: none
  - id: BR-CAP-MBR-MEM-003-08
    proved_by: [ATS-MBR-MEM-003-06, TST-MBR-MEM-214]
    statement: >-
      Termination limits affiliation coverage through the shortened term; an open-ended affiliation may retain
      its empty end because the term supplies the limit.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: observed
    source: >-
      services-membership:modules/memberships/services/affiliations/affiliation-operations.ts:keepAffiliationsInsideTerm
    origin: none
  - id: BR-CAP-MBR-MEM-003-09
    proved_by: [ATS-MBR-MEM-003-07, ATS-MBR-MEM-003-08, ATS-MBR-MEM-006-12, TST-MBR-MEM-201]
    statement: >-
      Granted mirrors follow source termination or cancellation, shorten when the source end contracts, and do
      not expand when the source end extends.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: 'services-membership:tests/acceptance/memberships/MBR-ACC-0182.acceptance.ts#MBR-ACC-0182'
    origin: >-
      the decision of 2026-10-17 on package grants
      (services-membership:modules/memberships/services/grants/apply-grants.ts header)
scenarios:
  - id: SC-CAP-MBR-MEM-003-01
    given: Lee’s term was entered with an October start that should have been in September.
    when: Staff correct the start to 1 September and explain the change.
    then: >-
      A current-known read returns September; a read using knowledge from before the change still returns
      October.
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/db/membership-functions.integration.spec.ts#keeps
      answering what was known before the correction with a known_at before it
  - id: SC-CAP-MBR-MEM-003-02
    given: A member has an effective term.
    when: Staff close it from a chosen date using a termination reason.
    then: The term ends on the preceding day and its membership status is recomputed.
    provenance: test
    source: >-
      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
edge_cases: []
constraints:
  - 'Reasons contain 1–500 characters, and optional notes contain no more than 2,000.'
depends_on:
  - CAP-MBR-MEM-001
related:
  - CAP-MBR-MEM-006
  - CAP-MBR-MEM-007
  - CAP-MBR-MEM-018
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/affiliations/affiliation-operations.ts
      - modules/memberships/db/memberships-versions.table.ts
      - modules/memberships/db/membership-terms-versions.table.ts
      - modules/memberships/tests/integration/services/staff-operations.integration.spec.ts
      - modules/memberships/tests/integration/db/membership-functions.integration.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
      - acceptance/membership/reports/defects/history.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-001, 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]
exercised_by: [FAS-MBR-MEM-01-02, FAS-MBR-MEM-01-03, FAS-MBR-MEM-01-04]
suites: [TST-MBR-MEM-014, TST-MBR-MEM-020, TST-MBR-MEM-024, TST-MBR-MEM-028, TST-MBR-MEM-183, TST-MBR-MEM-191, TST-MBR-MEM-201, TST-MBR-MEM-214, TST-MBR-MEM-247]
---

# Correct or close a term without losing earlier knowledge

## Purpose

Staff need to repair mistaken periods and record departures without discarding earlier knowledge. Preserved history lets the association explain why an earlier report differed from a report produced after the correction.

## How It Works

Staff read the term before choosing a correction or closure. They submit its version alongside the change. A correction accepts the replacement dates, type or package and records an explanation. A closure instead identifies a status reason and the date from which coverage is to stop. Rhythm updates the membership’s derived position after the write. Staff can inspect both the resulting period and the earlier recorded values. Chapter coverage and granted mirrors have their own consequences when the period changes. The recorded findings identify two remaining concerns: corrections do not enforce exclusivity across programs, and moving a start backwards does not extend the chapter rows backwards with it.

## Relationships

- Membership creation establishes the principal record whose terms staff amend.
- Membership history supplies earlier-known reads and the record of changes.
- Organizational and granted membership coverage explains changes to dependent periods.
