---
id: ADR-MBR-MEM-002
title: Compute Dated Standing and Cache Lists
product_area: membership
module: memberships
revision: 1
status: proposed
design_intent: proposed
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Terms, applicable grace and suspension determine standing; term writes and
  scheduled sweeps refresh the separate list cache.
constrains:
  - DOM-MBR-MEM-001
  - DOM-MBR-MEM-002
  - STATE-MBR-MEM-001
  - WF-MBR-MEM-008
origin: >-
  The membership architecture's lifecycle chapter (sections 2 and 3), as the
  term engine and sweep record it
alternatives:
  - option: Store status as the truth and change it by events
    why_not: >-
      Event-only status can become stale after missed work and cannot
      reconstruct arbitrary business dates reliably.
  - option: Compute on every read and store nothing
    why_not: >-
      Uncached filtering would repeat period resolution across every candidate
      record.
consequences:
  - A stale cache does not change the dated rights calculation.
  - >-
    Stored-status filters can lag; today-status filtering explicitly recomputes
    standing.
  - >-
    Missing sweep history triggers a full refresh rather than replay of every
    elapsed boundary.
supersedes: []
evidence:
  - >-
    services-membership at 5994c270: modules/terms/services/status.ts, sweep.ts,
    holding-cache.ts; modules/memberships/services/membership-caches.ts,
    sweep/status-sweep.ts
---

# Compute Dated Standing and Cache Lists

## Context

Staff need dated coverage answers while lists need efficient filtering across many members. The cache therefore serves a different purpose from the rights resolver.

## Decision

Terms, applicable grace and suspension determine standing; term writes and scheduled sweeps refresh the separate list cache.

## Alternatives Considered

Store status as the truth and change it by events: Event-only status can become stale after missed work and cannot reconstruct arbitrary business dates reliably.

Compute on every read and store nothing: Uncached filtering would repeat period resolution across every candidate record.

## Consequences

A stale cache does not change the dated rights calculation. Stored-status filters can lag; today-status filtering explicitly recomputes standing. Missing sweep history triggers a full refresh rather than replay of every elapsed boundary.
