Skip to content

CAP-MBR-MEM-018See how a membership changed and what it was on any date

Markdown

CAP-MBR-MEM-018

See how a membership changed and what it was on any date

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
Every change is attributable to a named person or process.A past state can be reconstructed exactly as the association knew it at the time.
Surfaces
consoleapi
Intent sources
services-membership:README.md#2026-10-18 — Final acceptanceservices-membership:docs/migrations/history/README.md

Controls

37 controls apply, from the corpus control catalogue.

TC-AVL-002 TC-AVL-003 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-LOG-002 TC-LOG-003 TC-LOG-004 TC-LOG-005 TC-PI-001 TC-PI-005 TC-PRV-001 TC-PRV-002 TC-SEC-001 TC-SEC-004 TC-TEN-001 TC-TEN-002 TC-TEN-003 TC-TEN-004

Permissions

KeyChecked atScope
membership.memberships.historyapitenant
membership.members.readapirecord

Business Rules

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

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Every committed change to a membership, its terms, their affiliations and its custom field values is recorded at commit as one revision, naming the person by the name they had then and where the change came from; a change of the stored status alone, or a change undone in the same save, records nothing.
no proof recorded yet
lifecycledatabasetest
services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#records nothing for a change of the cached status alone, nor for a change undone in the same save
02must prove
Confirmed
A write that names neither its source nor its actor is refused at commit, together with the business write.
no proof recorded yet
invariantdatabasetest
services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#refuses at commit a write that names no source and no actor, and the write with it (a program, which has no versions)
03must prove
Confirmed
A membership's history is a timeline, newest first, a page at a time, that can be narrowed by operation and by person; each revision opens section by section (membership, terms, affiliations, custom fields), and the people who changed it can be listed once each.
no proof recorded yet
policyapi, servicetest
04must prove
Confirmed
A term has its own history too, recording the same changes as the membership's terms section.
no proof recorded yet
policyapi, servicetest
05must prove
Confirmed
Reading history needs the history key as well as the membership-read key, so past values can be withheld from someone who may read the membership as it stands.
origin: services-crm:docs/record-history.md#Authorization (cited by services-membership:aws/membership.service.ts)
no proof recorded yet
permissionapitest
services-membership:tests/e2e/history-api.e2e.spec.ts#refuses the history to a reader of memberships who does not hold membership.memberships.history
06must prove
Confirmed
A membership as of a date, as known at an instant, answers its term, type, package and status then, its affiliations with each unit's name, parent and ancestors then, its custom fields as recorded at the end of the date, its committee seats when Committees keeps their history (otherwise marked unavailable), and its contact as it is now, marked as captured.
no proof recorded yet
calculationservice, databasetest
services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers Jo’s chapters on the date with each unit’s name, parent and ancestors then
07must prove
Confirmed
Asked without an instant, the past-date answer equals what the live read gives for that date.
no proof recorded yet
invariantservice, databasetest
services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers every FAA membership as the live read does, known now and as recorded now
08must prove
Confirmed
A backdated correction is visible only to a reader asking as known after it; one asking as known before it gets the earlier answer.
no proof recorded yet
calculationservice, databasetest
services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers the term as it was known before the correction, with a known_at before it
09
Confirmed
Changes to programs, types, packages, status reasons and change policies are recorded as revisions of their records, and history labels them by what they are called today.
lifecycledatabasetest
services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#records a change to the configuration as a revision of its record
10must prove
Confirmed
History shows every business fact a change touched, including a suspension's reason and a purchase's Commerce references, and attributes Commerce's changes consistently.
no proof recorded yet
policyserviceunknown
11must prove
Confirmed
An "as known at" instant is honoured at the precision the history records.
no proof recorded yet
calculationapiunknown
12
Confirmed
History is read by workspace-wide staff only; officers do not see their members' history, and a member's own history is the business log of their own read.
permissionservicedocumented
services-membership:docs/migrations/scope/README.md#What differs from 06 §4, or could not be done as specified

Scenarios

IdGivenWhenThenProvenance
01A registrar created a membership, corrected its term and suspended it.Staff open its history.Three revisions appear newest first, the correction under Terms and the suspension under Membership, each with its person.test
services-membership:tests/e2e/history-api.e2e.spec.ts#files the correction under the Terms section and the suspension under the Membership section
02Robin's start was corrected on 5 February from 1 February to 1 January.Staff ask what Robin held on 15 January as known on 1 February, and as known now.As known on 1 February Robin held nothing; as known now Robin held the corrected term.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.