01must proveProposed | Region identifiers accept letters, digits, underscores, hyphens and vertical bars; other characters cause a refusal that describes the permitted characters. ✓ A mixed identifier containing a hyphen, underscore and vertical bar is valid.✗ An identifier containing a space is rejected. no proof recorded yet | validation | api, database | test |
02must proveProposed | A region requires a nonblank name, which is trimmed before acceptance; a name containing only spaces is rejected against the name field. no proof recorded yet | validation | api, database | test |
03must proveProposed | Creation generates an identifier when none is supplied and rejects an identifier already used by a region in the workspace. no proof recorded yet | validation | service, database | observed |
04Proposed | A region starts active when creation does not specify its active state. | invariant | database | test |
05must proveConfirmed | Replacement requires the version previously read, and patching tests that version; a missing replacement version or a stale version is rejected. no proof recorded yet | validation | api, service | test |
06must proveProposed | Replacement supplies the complete region, so an omitted description or external identifier is removed. no proof recorded yet | policy | service | test |
07must proveProposed | Region lists use character-by-character identifier order and return pages with a continuation when another page exists. no proof recorded yet | policy | api, service | test |
08must proveProposed | Region reads and writes stay within the requested workspace, even for callers with access to several workspaces, and a conflicting workspace in the request body is rejected. no proof recorded yet | invariant | api, service, database | observed |
09Proposed | Regions have no custom fields; CRM reserves custom fields for contacts and organizations. | policy | service | documented |
10must proveConfirmed | The console chooses a new region’s identifier before sending creation, allowing a retry after an ambiguous response to find the original region. no proof recorded yet | policy | console | test |
11Proposed | Console replacement retains the fields returned by the read, including the external identifier and lock, while applying the visible edits. | policy | console | observed |
12must proveProposed | Every successful replacement or patch increments the region version, including a write that leaves its fields unchanged. no proof recorded yet | lifecycle | service | observed |
13Proposed | The console uses a drawer on the right to edit a region, labels it by record kind and requests confirmation before discarding unsaved edits. origin: services-crm:docs/migrations/crm-regions/README.md#2026-10-15 — Final acceptance (console follow-ups) (Andrew approved 2026-10-15: two tabs, Test an Address dialog, drawers, a read-only Assignment Rules tab with its own editor screen and the banner) | policy | console | test |