---
id: ADR-CRM-REG-003
title: Policy Changes Move No Record; Staff Recalculate
product_area: crm
module: regions
revision: 2
status: proposed
design_intent: confirmed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Policy writes leave placements unchanged, increment the relevant generation and expose outstanding
  recalculation so staff choose when to apply coverage across records.
constrains:
  - DOM-CRM-REG-002
  - STATE-CRM-REG-002
  - WF-CRM-REG-004
  - WF-CRM-REG-003
  - SCR-CRM-REG-002
  - SCR-CRM-REG-003
origin: >-
  Andrew, 2026-10-08 (saving rules changes no record; staff press Recalculate) and 2026-10-11 (manual
  Recalculate with a recalculation-needed banner), cited in services-crm:docs/migrations/crm-regions/README.md
alternatives:
  - option: Automatically start traversal after every coverage save.
    why_not: >-
      The recorded choice leaves the bulk action to staff, allowing coverage to be saved without immediately
      moving existing records.
  - option: Compare change time with run start time.
    why_not: Independent clocks and timestamp precision do not establish exact change order; generations do.
consequences:
  - The saved-policy view offers a needed banner with its recalculation action.
  - Later address reactions can use changed coverage while older records await traversal.
  - Even an unchanged accepted settings save increments generation and can request another run.
supersedes: []
evidence:
  - >-
    services-crm at a8d1364f: modules/regions/services/persistence/region-assignment-settings.ts
    (stampRulesChanged, recalculationNeeded); db/region-assignment-settings.table.ts (rules_generation).
---

# Policy Changes Move No Record; Staff Recalculate

## Context

Coverage edits can affect many people and organizations. The recorded product choice keeps their bulk application explicit.

## Decision

Settings and rule writes stamp policy changes without saving placements. Enabled policy compares its generation with completed-run coverage to decide whether another recalculation is outstanding.

## Alternatives Considered

Automatically start traversal after every coverage save. The recorded choice leaves the bulk action to staff, allowing coverage to be saved without immediately moving existing records.

Compare change time with run start time. Independent clocks and timestamp precision do not establish exact change order; generations do.

## Consequences

The saved-policy view offers a needed banner with its recalculation action. Later address reactions can use changed coverage while older records await traversal. Even an unchanged accepted settings save increments generation and can request another run.
