---
title: Membership structure planning examination
examined_at: '2026-10-23'
examiner: codex
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
branch: agent/membership-structure-plan-exam-1
---

# Membership Structure Planning Examination

## Scope and method

This examination reviews the planning layer against the two pinned source revisions. It separates observed implementation, executable test assertions, documented decisions and reasoned inferences. No source repository changes or service test execution form part of this examination.

The examination covers 61 existing module artifacts and the shared actor artifact: one charter, one identifier ledger, one findings register, six features, six concepts, twenty capabilities, twenty acceptance test sets and five journeys, plus five actor rows. The finished layer contains 191 rule rows, twenty capability examples, 118 acceptance scenarios, 27 journey steps, thirteen journey assertions and 49 concept facets. All six concepts have the prescribed six sections and fall within the required word range.

Structured source references were opened at the pinned revisions and checked for their cited files, symbols, test titles and decision records. The final artifact audit inspected 1,059 structured citations before this report was added; it found no unresolved missing source file among the concrete source references. Twenty-four annotated decision citations combine a heading with explanatory decision text rather than a literal single anchor; their underlying heading, date and decision text were checked separately. Manual acceptance citations now name the full executable suite title. Historical catalogue pass labels are retained as historical evidence and are not treated as a fresh passing test run.

Route schemas, persistence functions, declared tables, local migration records, console routes, permission declarations and cited tests establish the planning description. Migration SQL and the external decision register are outside the registered readable scope, and the drafting brief is absent from the starting documentation revision. Database declarations are evidence of declared constraints, not certification that every deployment has installed them. Those limits remain explicit findings.

Every prose section and human-readable row field was rewritten by OpenAI. The comparison with the starting draft found no unchanged sentence-length value in the audited title, statement, condition, action, expectation, outcome, meaning, note, definition, goal or actor-description fields. Technical identities, evidence paths, pins and historical references remain stable except for the verification changes below. Verification commits precede the separate artifact rewrite commits; subsequent verification corrections have their own commits.

## Coverage

Coverage means a named operation, declared table or evidence file has a planning home or an explicit finding. It does not mean every case has an executed passing assertion.

| Measure | Covered / total | Uncovered or boundary items |
|---|---|---|
| Workspace HTTP operations | 56 / 56 | None; three public health routes excluded |
| Declared structure and configuration tables | 25 / 25 | None |
| Scoped service permission keys | 7 / 7 | None; console vocabulary mapping remains open |
| Structure and term test specification files | 16 / 16 | None; source inspection only |
| Scoped end-to-end files | 7 / 7 | None; other membership-operation files excluded |
| Structure acceptance catalogue entries | 37 / 37 | None |
| Configuration acceptance catalogue entries indexed in planning or findings | 42 / 43 | Application processes are named only in the module boundary |
| Catalogue entries within this module’s behavioral scope | 78 / 78 | Application processes and configuration revisions belong to membership operations |
| Earlier inventory capabilities inherited by this module | 28 / 30 | Application processes and configuration history belong to membership operations |
| Hosted administration screens | 0 / 0 | No such screens in the permitted console scope |
| Owned state machines, queues and schedules | 0 / 0 | Sweep scheduling and dispatch belong to membership operations |
| Required rule proofs with a scenario | 118 / 149 | 31 rules, listed below |
| Required rule proofs with a bound test example | 104 / 149 | 45 rules, listed below |

The charter’s coverage catalogue maps every scoped operation and table to a capability. Existing capability homes absorb the four newly identified variants: program ordering-profile inheritance, package filtering after paging, fixed term-window arithmetic and validated structural bulk loading. The six concepts remain broad nouns with facets, and the twenty capabilities remain within the module’s target range; this pass requires no capability or concept retirement.

### Rules without a scenario

Finding `FND-MBR-STR-036` records all 31 missing scenarios:

- `BR-CAP-MBR-STR-001-09`
- `BR-CAP-MBR-STR-001-10`
- `BR-CAP-MBR-STR-002-12`
- `BR-CAP-MBR-STR-004-02`
- `BR-CAP-MBR-STR-005-03`
- `BR-CAP-MBR-STR-005-04`
- `BR-CAP-MBR-STR-005-05`
- `BR-CAP-MBR-STR-005-07`
- `BR-CAP-MBR-STR-006-05`
- `BR-CAP-MBR-STR-006-08`
- `BR-CAP-MBR-STR-007-07`
- `BR-CAP-MBR-STR-009-06`
- `BR-CAP-MBR-STR-009-11`
- `BR-CAP-MBR-STR-009-12`
- `BR-CAP-MBR-STR-011-04`
- `BR-CAP-MBR-STR-011-06`
- `BR-CAP-MBR-STR-012-09`
- `BR-CAP-MBR-STR-012-10`
- `BR-CAP-MBR-STR-012-11`
- `BR-CAP-MBR-STR-013-04`
- `BR-CAP-MBR-STR-013-07`
- `BR-CAP-MBR-STR-015-09`
- `BR-CAP-MBR-STR-015-13`
- `BR-CAP-MBR-STR-016-12`
- `BR-CAP-MBR-STR-017-04`
- `BR-CAP-MBR-STR-017-06`
- `BR-CAP-MBR-STR-018-08`
- `BR-CAP-MBR-STR-019-07`
- `BR-CAP-MBR-STR-020-07`
- `BR-CAP-MBR-STR-020-09`
- `BR-CAP-MBR-STR-020-10`

### Rules without a bound test example

Findings `FND-MBR-STR-033`, `FND-MBR-STR-035` and `FND-MBR-STR-036` distinguish missing bindings, partial compound assertions and newly required proof:

- `BR-CAP-MBR-STR-001-02`
- `BR-CAP-MBR-STR-001-03`
- `BR-CAP-MBR-STR-001-04`
- `BR-CAP-MBR-STR-001-09`
- `BR-CAP-MBR-STR-001-10`
- `BR-CAP-MBR-STR-002-12`
- `BR-CAP-MBR-STR-004-02`
- `BR-CAP-MBR-STR-005-03`
- `BR-CAP-MBR-STR-005-04`
- `BR-CAP-MBR-STR-005-05`
- `BR-CAP-MBR-STR-005-07`
- `BR-CAP-MBR-STR-006-03`
- `BR-CAP-MBR-STR-006-04`
- `BR-CAP-MBR-STR-006-05`
- `BR-CAP-MBR-STR-006-08`
- `BR-CAP-MBR-STR-007-07`
- `BR-CAP-MBR-STR-008-02`
- `BR-CAP-MBR-STR-009-06`
- `BR-CAP-MBR-STR-009-11`
- `BR-CAP-MBR-STR-009-12`
- `BR-CAP-MBR-STR-010-01`
- `BR-CAP-MBR-STR-010-02`
- `BR-CAP-MBR-STR-010-03`
- `BR-CAP-MBR-STR-011-04`
- `BR-CAP-MBR-STR-011-06`
- `BR-CAP-MBR-STR-012-09`
- `BR-CAP-MBR-STR-012-10`
- `BR-CAP-MBR-STR-012-11`
- `BR-CAP-MBR-STR-013-01`
- `BR-CAP-MBR-STR-013-03`
- `BR-CAP-MBR-STR-013-04`
- `BR-CAP-MBR-STR-013-07`
- `BR-CAP-MBR-STR-015-09`
- `BR-CAP-MBR-STR-015-13`
- `BR-CAP-MBR-STR-016-12`
- `BR-CAP-MBR-STR-017-01`
- `BR-CAP-MBR-STR-017-02`
- `BR-CAP-MBR-STR-017-04`
- `BR-CAP-MBR-STR-017-06`
- `BR-CAP-MBR-STR-018-08`
- `BR-CAP-MBR-STR-019-07`
- `BR-CAP-MBR-STR-020-05`
- `BR-CAP-MBR-STR-020-07`
- `BR-CAP-MBR-STR-020-09`
- `BR-CAP-MBR-STR-020-10`

## Changes by artifact

Each listed artifact receives new final text even where no semantic correction is necessary. Rule identities, scenario identities and historical references are preserved. The field-change ledger following this section records every changed protected field relative to the starting revision.

### Charter, features, concepts and shared actors

| Artifact | Change |
|---|---|
| `MOD-MBR-STR` | Rewrites purpose and boundary, separates source coverage from acceptance proof, and regenerates the final feature, capability and journey index. |
| `FEAT-MBR-STR-01` | Rewrites the grouping description and final title without adding behavior. |
| `FEAT-MBR-STR-02` | Rewrites the grouping description and final title without adding behavior. |
| `FEAT-MBR-STR-03` | Rewrites the grouping description and final title without adding behavior. |
| `FEAT-MBR-STR-04` | Rewrites the grouping description and final title without adding behavior. |
| `FEAT-MBR-STR-05` | Rewrites the grouping description and final title without adding behavior. |
| `FEAT-MBR-STR-06` | Rewrites the grouping description and final title without adding behavior. |
| `CON-MBR-STR-001` | Rewrites all six sections and facets; limits merger immutability to structural state. |
| `CON-MBR-STR-002` | Rewrites all six sections and facets; retains the distinction between structural retirement and still-writable subsidiary records. |
| `CON-MBR-STR-003` | Rewrites all six sections and facets; corrects the identity-binding relationship source to the program declaration. |
| `CON-MBR-STR-004` | Rewrites all six sections and facets; preserves the Accounting product boundary and partial policy enforcement. |
| `CON-MBR-STR-005` | Rewrites all six sections and facets; describes grace as a status allowance and avoids making committed term state expire automatically. |
| `CON-MBR-STR-006` | Rewrites all six sections and facets; distinguishes ordinary configuration version checks from structural and bulk-load safeguards. |
| `ACT-MBR-001` | Rewrites role, goals and broad actions; removes unsupported console administration surfaces. |
| `ACT-MBR-002` | Rewrites role, goals and broad actions; removes unsupported console administration surfaces. |
| `ACT-MBR-003` | Rewrites role, goals and broad actions. |
| `ACT-MBR-004` | Rewrites role, goals and broad actions. |
| `ACT-MBR-005` | Rewrites role, goals and broad actions. |
| `ID_REGISTRY` | Allocates five findings and four rule rows before writing; updates next-free counters and final artifact labels without renumbering. |
| `FINDINGS` | Rewrites every finding and product question, corrects policy-set reference claims and approval scope, and adds the five examination findings. |
| `MOD-MBR-STR` product-area row | Changes planning status to planning examined; source scope remains fixed. |

### Capabilities

| Artifact | Verification correction in addition to full rewrite |
|---|---|
| `CAP-MBR-STR-001` | Required proof now includes the removal of parent choices and structural retirement effects. |
| `CAP-MBR-STR-002` | Rule 07 limits complete parent history to the recorded first placement and locates its enforcement in persistence. Tree rebuilding now requires proof. |
| `CAP-MBR-STR-003` | Rule 04 distinguishes started, unstarted and cancelled affiliations using the merger record. Rule 09 limits the source freeze to structural changes. The minimum-count refusal replaces an incorrectly described maximum-count refusal. |
| `CAP-MBR-STR-004` | Retirement effects now require proof; no reactivation operation is invented. |
| `CAP-MBR-STR-005` | Rule 06 separates paged routes from unpaged tree-history and subsidiary lists. Cursor validation means decoding and shape validation. Historical calculations, search and group counts now require proof. |
| `CAP-MBR-STR-006` | Rule 02 identifies the unit kind as fixed after creation. Replacement examples retain required code and name, reset omitted ordinary optional fields and preserve unsubmitted custom values. Cross-record reference and custom-value behavior now require proof. |
| `CAP-MBR-STR-007` | Organization-link state checks now require proof. The rewrite preserves unresolved duplicates, inactive-kind use and writes on inactive units as observed limits. |
| `CAP-MBR-STR-008` | Rule 07 treats ordering-profile fallback as documented product intent; local storage does not prove checkout resolution. No enforcement location is asserted for that compound documented rule. |
| `CAP-MBR-STR-009` | Rule 01 loses an unsupported decision origin. Rules 03 and 04 cite API and table-declaration enforcement rather than unestablished service enforcement. Rule 07 loses its overly broad ordering-decision origin. New rule 12 isolates documented ordering-profile inheritance and does not assert local execution. Exclusivity and replacement effects now require proof. |
| `CAP-MBR-STR-010` | Rule 02 permits an empty kind list when the binding model does not require affiliation kinds. |
| `CAP-MBR-STR-011` | Exclusivity and reference-sensitive deletion now require proof. |
| `CAP-MBR-STR-012` | New rule 11 covers activity filtering after page selection. Reference-sensitive deletion and extensible custom-value behavior now require proof. |
| `CAP-MBR-STR-013` | Cross-record grant validation and embedded replacement effects now require proof. Unit-rule examples describe the actual submitted override fixture. |
| `CAP-MBR-STR-014` | Rule 02 permits at most one selector on each side, including neither selector. It no longer requires exactly one. |
| `CAP-MBR-STR-015` | Rule 04 treats an omitted reinstatement period as zero and retains continuation through the paid end. Rule 06 preserves the December-to-January renewal exception. New rule 13 covers equal window boundaries and fixed end-date calculations. Never-ending terms now require proof. |
| `CAP-MBR-STR-016` | Rule 01 drops an unverified database enforcement claim. Rule 05 retains the latest begun continuity episode through lapse. Rule 06 documents preservation of a supplied original join date. Rule 09 distinguishes pure cache-change calculation from persistence or access-right loading. Sweep decisions now require proof. |
| `CAP-MBR-STR-017` | Reference-sensitive deletion and type replacement effects now require proof. |
| `CAP-MBR-STR-018` | Rule 08 describes empty filtered pages with a continuing cursor. The acceptance example tests immutable existing identities and duplicate creation rather than permanent reservation after deletion. |
| `CAP-MBR-STR-019` | Rule 04 excludes public health routes from workspace authorization claims. Rule 07 points to the exact console declaration line and now requires proof. |
| `CAP-MBR-STR-020` | New rule 10 groups bulk-load kind invariance, active parent and kind checks, event suppression and final depth validation. Lifecycle cleanup and metadata effects now require proof. |

### Acceptance test sets

| Artifact | Verification correction in addition to full rewrite |
|---|---|
| `ATS-MBR-STR-001` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-002` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-003` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. Corrects the affiliation-transfer fixture to the membership pair actually used by the test. |
| `ATS-MBR-STR-004` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-005` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. Describes malformed cursor refusal rather than authentication of a previously issued cursor. |
| `ATS-MBR-STR-006` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-007` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-008` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-009` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-010` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-011` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-012` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-013` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-014` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-015` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-016` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. Separates last-day grace status from paid-term expiry detection; limits generated check-constraint proof to declaration evidence. |
| `ATS-MBR-STR-017` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-018` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. Replaces permanent identity reservation with the immutable-existing-identity and duplicate-create assertions the suite contains. |
| `ATS-MBR-STR-019` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |
| `ATS-MBR-STR-020` | Rewrites every scenario title, step and expected result; preserves proof identity and evidence strength. |

Executable manual suite references are expanded to their full literal titles in the affected acceptance sets, capability examples and journeys. This fixes citation precision without upgrading evidence levels or claiming a new test result.

### Journeys

| Artifact | Verification correction in addition to full rewrite |
|---|---|
| `JNY-MBR-STR-001` | Removes unsupported display-order and organization-link expectations from the cited create fixture. |
| `JNY-MBR-STR-002` | Marks the initial and historical reporting compositions inferred, with notes explaining the adjacent test evidence; limits the failure example to its actual future-date refusal. |
| `JNY-MBR-STR-003` | Uses the membership read performed by the source fixture and limits assertions to the tested transfer and merged-source replacement refusal. |
| `JNY-MBR-STR-004` | Limits initial-version readability to initial creation and moves the stale-version failure to the update step. |
| `JNY-MBR-STR-005` | Marks scheduled execution and episode continuity inferred; distinguishes engine expiry detection from consumer persistence and deduplication. |

### Protected-field change ledger

Array positions below are zero-based locations in the starting and final frontmatter. A dash means that the row or field did not previously exist. Full values are included so changes to source, provenance, origin, enforcement and proof obligations can be reviewed independently of the prose rewrite. All protected fields absent from this ledger remain unchanged.

| Artifact | Field | Before | After |
|---|---|---|---|
| `specs/membership/structure/FINDINGS.md` | `finding_evidence.2.source` | ["react-console:lib/authz/permissions.ts:permissions.membership","services-membership:aws/membership.service.ts:MEMBERSHIP_PERMISSION_SETS"] | ["react-console:lib/authz/permissions.ts:82","services-membership:aws/membership.service.ts:MEMBERSHIP_PERMISSION_SETS"] |
| `ATS-MBR-STR-001` | `scenarios.0.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001 staff define, rename, retire and delete kinds of unit"] |
| `ATS-MBR-STR-001` | `scenarios.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001" | "services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001 staff define, rename, retire and delete kinds of unit" |
| `ATS-MBR-STR-001` | `scenarios.4.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0003.acceptance.ts#MBR-ACC-0003"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0003.acceptance.ts#MBR-ACC-0003 a tree rule chapters rely on cannot be withdrawn until they move"] |
| `ATS-MBR-STR-001` | `scenarios.4.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0003.acceptance.ts#MBR-ACC-0003" | "services-membership:tests/acceptance/structure/MBR-ACC-0003.acceptance.ts#MBR-ACC-0003 a tree rule chapters rely on cannot be withdrawn until they move" |
| `ATS-MBR-STR-001` | `scenarios.5.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001 staff define, rename, retire and delete kinds of unit"] |
| `ATS-MBR-STR-001` | `scenarios.5.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001" | "services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001 staff define, rename, retire and delete kinds of unit" |
| `ATS-MBR-STR-001` | `scenarios.6.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0004.acceptance.ts#MBR-ACC-0004"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0004.acceptance.ts#MBR-ACC-0004 retiring the Section kind freezes every section in place"] |
| `ATS-MBR-STR-001` | `scenarios.6.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0004.acceptance.ts#MBR-ACC-0004" | "services-membership:tests/acceptance/structure/MBR-ACC-0004.acceptance.ts#MBR-ACC-0004 retiring the Section kind freezes every section in place" |
| `ATS-MBR-STR-001` | `scenarios.7.bound_to` | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses to delete a unit type in use, 409 unit_type_in_use","services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0084: a structure delete a program’s reference blocks › refuses deleting a unit type a program lists 409 unit_type_in_use, and keeps it","services-membership:tests/acceptance/structure/MBR-ACC-0037.acceptance.ts#MBR-ACC-0037"] | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses to delete a unit type in use, 409 unit_type_in_use","services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0084: a structure delete a program’s reference blocks › refuses deleting a unit type a program lists 409 unit_type_in_use, and keeps it","services-membership:tests/acceptance/structure/MBR-ACC-0037.acceptance.ts#MBR-ACC-0037 what other parts of Membership name in the structure"] |
| `ATS-MBR-STR-002` | `scenarios.0.bound_to` | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a parent of a type not allowed, 409 parent_type_not_allowed","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a root of a type that may not be one","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses, in the database itself, a parent of a type not allowed (the constraint trigger)","services-membership:tests/acceptance/structure/MBR-ACC-0010.acceptance.ts#MBR-ACC-0010"] | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a parent of a type not allowed, 409 parent_type_not_allowed","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a root of a type that may not be one","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses, in the database itself, a parent of a type not allowed (the constraint trigger)","services-membership:tests/acceptance/structure/MBR-ACC-0010.acceptance.ts#MBR-ACC-0010 every illegal placement of a new unit is refused"] |
| `ATS-MBR-STR-002` | `scenarios.1.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a move under the unit’s own descendant as a cycle","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a move under the unit itself as a cycle","services-membership:modules/structure/tests/integration/services/tree/tree-scale.integration.spec.ts#the tree at scale › serialises two concurrent moves of one tenant by the tree lock, the second validating against the first’s closure","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a move under the unit’s own descendant, 409 move_creates_cycle","services-membership:tests/acceptance/structure/MBR-ACC-0016.acceptance.ts#MBR-ACC-0016"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a move under the unit’s own descendant as a cycle","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a move under the unit itself as a cycle","services-membership:modules/structure/tests/integration/services/tree/tree-scale.integration.spec.ts#the tree at scale › serialises two concurrent moves of one tenant by the tree lock, the second validating against the first’s closure","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a move under the unit’s own descendant, 409 move_creates_cycle","services-membership:tests/acceptance/structure/MBR-ACC-0016.acceptance.ts#MBR-ACC-0016 two staff reorganise the same chapters at once"] |
| `ATS-MBR-STR-002` | `scenarios.2.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a new child under an inactive unit","services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › refuses an inactive parent","services-membership:tests/acceptance/structure/MBR-ACC-0014.acceptance.ts#MBR-ACC-0014"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the refusals › refuses a new child under an inactive unit","services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › refuses an inactive parent","services-membership:tests/acceptance/structure/MBR-ACC-0014.acceptance.ts#MBR-ACC-0014 every move the tree refuses"] |
| `ATS-MBR-STR-002` | `scenarios.3.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0014.acceptance.ts#MBR-ACC-0014"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0014.acceptance.ts#MBR-ACC-0014 every move the tree refuses"] |
| `ATS-MBR-STR-002` | `scenarios.3.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0014.acceptance.ts#MBR-ACC-0014" | "services-membership:tests/acceptance/structure/MBR-ACC-0014.acceptance.ts#MBR-ACC-0014 every move the tree refuses" |
| `ATS-MBR-STR-002` | `scenarios.4.bound_to` | ["services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › refuses a move that would put the subtree at the depth cap, before any write","services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › refuses the whole edit when the rebuilt tree reaches depth 32 (a cycle past validation)","services-membership:tests/acceptance/structure/MBR-ACC-0015.acceptance.ts#MBR-ACC-0015"] | ["services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › refuses a move that would put the subtree at the depth cap, before any write","services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › refuses the whole edit when the rebuilt tree reaches depth 32 (a cycle past validation)","services-membership:tests/acceptance/structure/MBR-ACC-0015.acceptance.ts#MBR-ACC-0015 thirty-one levels, a moved subtree and a second root"] |
| `ATS-MBR-STR-002` | `scenarios.5.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › refuses a move dated before the current parent began","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › refuses a move dated after today","services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › records the history from the tenant’s business date","services-membership:tests/acceptance/structure/MBR-ACC-0033.acceptance.ts#MBR-ACC-0033"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › refuses a move dated before the current parent began","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › refuses a move dated after today","services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › records the history from the tenant’s business date","services-membership:tests/acceptance/structure/MBR-ACC-0033.acceptance.ts#MBR-ACC-0033 today is New York's today"] |
| `ATS-MBR-STR-002` | `scenarios.6.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › closes the open row at the day before the new one and keeps one open row per unit","services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › closes the open row at the day before the new one and keeps one open row per unit","services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013 a backdated move and a same-day correction"] |
| `ATS-MBR-STR-002` | `scenarios.7.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013 a backdated move and a same-day correction"] |
| `ATS-MBR-STR-002` | `scenarios.7.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013" | "services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013 a backdated move and a same-day correction" |
| `ATS-MBR-STR-002` | `scenarios.8.bound_to` | ["services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › locks, validates against the current closure, changes the parent, records history, rebuilds, updates depths and checks the cap, in that order","services-membership:modules/structure/tests/integration/services/tree/tree-scale.integration.spec.ts#the tree at scale › leaves a closure equal to a fresh walk of the parents after the concurrent moves","services-membership:modules/structure/tests/integration/services/tree/tree-scale.integration.spec.ts#the tree at scale › answers the moved subtree under its new parent","services-membership:modules/structure/tests/unit/services/tree-statements.spec.ts#the tree statements › the closure rebuild › walks every unit down from itself at depth 0, one level per step, under the cap of 32, in every statement but the depths","services-membership:modules/structure/tests/unit/services/tree-statements.spec.ts#the tree statements › the closure rebuild › removes the tenant’s pairs the walk no longer has, at their depth, and only the tenant’s","services-membership:tests/acceptance/structure/MBR-ACC-0034.acceptance.ts#MBR-ACC-0034"] | ["services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › move › locks, validates against the current closure, changes the parent, records history, rebuilds, updates depths and checks the cap, in that order","services-membership:modules/structure/tests/integration/services/tree/tree-scale.integration.spec.ts#the tree at scale › leaves a closure equal to a fresh walk of the parents after the concurrent moves","services-membership:modules/structure/tests/integration/services/tree/tree-scale.integration.spec.ts#the tree at scale › answers the moved subtree under its new parent","services-membership:modules/structure/tests/unit/services/tree-statements.spec.ts#the tree statements › the closure rebuild › walks every unit down from itself at depth 0, one level per step, under the cap of 32, in every statement but the depths","services-membership:modules/structure/tests/unit/services/tree-statements.spec.ts#the tree statements › the closure rebuild › removes the tenant’s pairs the walk no longer has, at their depth, and only the tenant’s","services-membership:tests/acceptance/structure/MBR-ACC-0034.acceptance.ts#MBR-ACC-0034 a 500-unit, six-level structure"] |
| `ATS-MBR-STR-002` | `scenarios.10.bound_to` | ["services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#scenario 9: organizational restructuring › rewrites no affiliation: Jo’s row is the same row, version and unit","services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#scenario 9: organizational restructuring › shows Jo under the Western Region and the Pacific Zone today, and no longer under the Eastern Region","services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#scenario 9: organizational restructuring › still holds Atlanta among the Eastern Region’s descendants as of the period end","services-membership:tests/acceptance/structure/MBR-ACC-0012.acceptance.ts#MBR-ACC-0012"] | ["services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#scenario 9: organizational restructuring › rewrites no affiliation: Jo’s row is the same row, version and unit","services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#scenario 9: organizational restructuring › shows Jo under the Western Region and the Pacific Zone today, and no longer under the Eastern Region","services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#scenario 9: organizational restructuring › still holds Atlanta among the Eastern Region’s descendants as of the period end","services-membership:tests/acceptance/structure/MBR-ACC-0012.acceptance.ts#MBR-ACC-0012 scenario 9: Atlanta moves to the Pacific Zone"] |
| `ATS-MBR-STR-003` | `scenarios.0.bound_to` | ["services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › merge › refuses a survivor below the merged unit","services-membership:tests/acceptance/structure/MBR-ACC-0019.acceptance.ts#MBR-ACC-0019"] | ["services-membership:modules/structure/tests/unit/services/tree-edits.spec.ts#the tree edits › merge › refuses a survivor below the merged unit","services-membership:tests/acceptance/structure/MBR-ACC-0019.acceptance.ts#MBR-ACC-0019 merges refused, all or none, backdated, of an inactive unit, in a chain"] |
| `ATS-MBR-STR-003` | `scenarios.1.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › merge › moves the children under the survivor, marks the unit merged and lists what it left","services-membership:tests/acceptance/structure/MBR-ACC-0019.acceptance.ts#MBR-ACC-0019"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › merge › moves the children under the survivor, marks the unit merged and lists what it left","services-membership:tests/acceptance/structure/MBR-ACC-0019.acceptance.ts#MBR-ACC-0019 merges refused, all or none, backdated, of an inactive unit, in a chain"] |
| `ATS-MBR-STR-003` | `scenarios.2.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › merge › moves the children under the survivor, marks the unit merged and lists what it left","services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › merge › moves the children under the survivor, marks the unit merged and lists what it left","services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018 Savannah Chapter is merged into Atlanta"] |
| `ATS-MBR-STR-003` | `scenarios.6.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018 Savannah Chapter is merged into Atlanta"] |
| `ATS-MBR-STR-003` | `scenarios.6.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018" | "services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018 Savannah Chapter is merged into Atlanta" |
| `ATS-MBR-STR-004` | `scenarios.0.bound_to` | ["services-membership:modules/structure/tests/integration/services/tree/unit-merge.integration.spec.ts#the tree edits affiliations bind › delete and deactivate › deactivates it instead","services-membership:tests/acceptance/structure/MBR-ACC-0020.acceptance.ts#MBR-ACC-0020"] | ["services-membership:modules/structure/tests/integration/services/tree/unit-merge.integration.spec.ts#the tree edits affiliations bind › delete and deactivate › deactivates it instead","services-membership:tests/acceptance/structure/MBR-ACC-0020.acceptance.ts#MBR-ACC-0020 deactivating a chapter freezes it, and there is no way back"] |
| `ATS-MBR-STR-004` | `scenarios.3.bound_to` | ["services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0084: a structure delete a program’s reference blocks › refuses deleting a unit a program is owned by 409 unit_in_use, and keeps it","services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0012: a structure delete an identity-bound membership blocks › refuses deleting a unit a membership is identified by 409 unit_in_use naming the reference, and keeps it","services-membership:tests/acceptance/structure/MBR-ACC-0037.acceptance.ts#MBR-ACC-0037"] | ["services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0084: a structure delete a program’s reference blocks › refuses deleting a unit a program is owned by 409 unit_in_use, and keeps it","services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0012: a structure delete an identity-bound membership blocks › refuses deleting a unit a membership is identified by 409 unit_in_use naming the reference, and keeps it","services-membership:tests/acceptance/structure/MBR-ACC-0037.acceptance.ts#MBR-ACC-0037 what other parts of Membership name in the structure"] |
| `ATS-MBR-STR-005` | `scenarios.1.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers the descendants as of 2026-06-30 equal to the tree recorded that day","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers the descendants as of 2027-06-30 equal to the tree recorded that day","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers the descendants as of 2027-12-31 equal to the tree recorded that day","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers nothing for a known_at before the moves were recorded, beyond the tree as it was then known","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › answers an as-of date’s descendants from the parent history","services-membership:modules/structure/tests/unit/services/tree-statements.spec.ts#the tree statements › the as-of tree › reads the parent history’s versions known at the instant and effective on the date, with plain comparisons","services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers the descendants as of 2026-06-30 equal to the tree recorded that day","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers the descendants as of 2027-06-30 equal to the tree recorded that day","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers the descendants as of 2027-12-31 equal to the tree recorded that day","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › answers nothing for a known_at before the moves were recorded, beyond the tree as it was then known","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › answers an as-of date’s descendants from the parent history","services-membership:modules/structure/tests/unit/services/tree-statements.spec.ts#the tree statements › the as-of tree › reads the parent history’s versions known at the instant and effective on the date, with plain comparisons","services-membership:tests/acceptance/structure/MBR-ACC-0013.acceptance.ts#MBR-ACC-0013 a backdated move and a same-day correction"] |
| `ATS-MBR-STR-005` | `scenarios.2.bound_to` | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › pages the flat list by code with a cursor","services-membership:tests/acceptance/structure/MBR-ACC-0009.acceptance.ts#MBR-ACC-0009"] | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › pages the flat list by code with a cursor","services-membership:tests/acceptance/structure/MBR-ACC-0009.acceptance.ts#MBR-ACC-0009 browsing a 120-unit structure"] |
| `ATS-MBR-STR-005` | `scenarios.3.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the published functions › answers membership.unit_descendants to rhythm_table_reader in its tenant","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the published functions › answers membership.unit_ancestors to rhythm_table_reader in its tenant","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the published functions › answers nothing of a tenant other than the reader’s own","services-membership:tests/acceptance/structure/MBR-ACC-0026.acceptance.ts#MBR-ACC-0026"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the published functions › answers membership.unit_descendants to rhythm_table_reader in its tenant","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the published functions › answers membership.unit_ancestors to rhythm_table_reader in its tenant","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the published functions › answers nothing of a tenant other than the reader’s own","services-membership:tests/acceptance/structure/MBR-ACC-0026.acceptance.ts#MBR-ACC-0026 another association's structure does not exist"] |
| `ATS-MBR-STR-005` | `scenarios.4.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › row-level security › reads nothing of another tenant’s unit by id","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › row-level security › shows another tenant none of the units","services-membership:tests/acceptance/structure/MBR-ACC-0026.acceptance.ts#MBR-ACC-0026"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › row-level security › reads nothing of another tenant’s unit by id","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › row-level security › shows another tenant none of the units","services-membership:tests/acceptance/structure/MBR-ACC-0026.acceptance.ts#MBR-ACC-0026 another association's structure does not exist"] |
| `ATS-MBR-STR-006` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0032.acceptance.ts#MBR-ACC-0032"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0032.acceptance.ts#MBR-ACC-0032 a client that thinks PUT is a patch, and a unit deleted behind the service"] |
| `ATS-MBR-STR-006` | `scenarios.1.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0032.acceptance.ts#MBR-ACC-0032" | "services-membership:tests/acceptance/structure/MBR-ACC-0032.acceptance.ts#MBR-ACC-0032 a client that thinks PUT is a patch, and a unit deleted behind the service" |
| `ATS-MBR-STR-006` | `scenarios.4.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0031.acceptance.ts#MBR-ACC-0031"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0031.acceptance.ts#MBR-ACC-0031 every kind of custom field on a chapter"] |
| `ATS-MBR-STR-006` | `scenarios.4.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0031.acceptance.ts#MBR-ACC-0031" | "services-membership:tests/acceptance/structure/MBR-ACC-0031.acceptance.ts#MBR-ACC-0031 every kind of custom field on a chapter" |
| `ATS-MBR-STR-006` | `scenarios.5.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0007.acceptance.ts#MBR-ACC-0007"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0007.acceptance.ts#MBR-ACC-0007 replacing a chapter: whole row for columns, patch for custom fields"] |
| `ATS-MBR-STR-006` | `scenarios.5.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0007.acceptance.ts#MBR-ACC-0007" | "services-membership:tests/acceptance/structure/MBR-ACC-0007.acceptance.ts#MBR-ACC-0007 replacing a chapter: whole row for columns, patch for custom fields" |
| `ATS-MBR-STR-006` | `scenarios.6.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the versions › writes a version of the unit for its creation, its update and its move, each with the actor of its context","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the versions › refuses the application role a direct write to a version table","services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the versions › writes a version of the unit for its creation, its update and its move, each with the actor of its context","services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the versions › refuses the application role a direct write to a version table","services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030 who changed what and when"] |
| `ATS-MBR-STR-007` | `scenarios.0.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a chapter cannot have"] |
| `ATS-MBR-STR-007` | `scenarios.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022" | "services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a chapter cannot have" |
| `ATS-MBR-STR-007` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a chapter cannot have"] |
| `ATS-MBR-STR-007` | `scenarios.1.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022" | "services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a chapter cannot have" |
| `ATS-MBR-STR-007` | `scenarios.2.bound_to` | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › links an organization as the unit’s legal entity","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a second open legal entity, 409 legal_entity_already_open","services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021"] | ["services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › links an organization as the unit’s legal entity","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a second open legal entity, 409 legal_entity_already_open","services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario 11: Atlanta Chapter's incorporation, linked with dates"] |
| `ATS-MBR-STR-007` | `scenarios.3.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario 11: Atlanta Chapter's incorporation, linked with dates"] |
| `ATS-MBR-STR-007` | `scenarios.3.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021" | "services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario 11: Atlanta Chapter's incorporation, linked with dates" |
| `ATS-MBR-STR-007` | `scenarios.5.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030 who changed what and when"] |
| `ATS-MBR-STR-007` | `scenarios.5.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030" | "services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030 who changed what and when" |
| `ATS-MBR-STR-008` | `scenarios.4.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023 a chapter's financial settings"] |
| `ATS-MBR-STR-008` | `scenarios.4.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023" | "services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023 a chapter's financial settings" |
| `ATS-MBR-STR-008` | `scenarios.5.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023 a chapter's financial settings"] |
| `ATS-MBR-STR-008` | `scenarios.5.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023" | "services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023 a chapter's financial settings" |
| `ATS-MBR-STR-009` | `scenarios.0.bound_to` | ["services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses an identity-bound program without its identity unit type 400 naming identity_unit_type_id","services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120"] | ["services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses an identity-bound program without its identity unit type 400 naming identity_unit_type_id","services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120: Scenario 11 through the route: an identity-bound Chapter Membership program names its chapter unit type and its owning unit, refuses the wrong structure references in plain words and the missing identity type raw, and Kim holds a National and an Atlanta membership side by side"] |
| `ATS-MBR-STR-009` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120: Scenario 11 through the route: an identity-bound Chapter Membership program names its chapter unit type and its owning unit, refuses the wrong structure references in plain words and the missing identity type raw, and Kim holds a National and an Atlanta membership side by side"] |
| `ATS-MBR-STR-009` | `scenarios.1.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120" | "services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120: Scenario 11 through the route: an identity-bound Chapter Membership program names its chapter unit type and its owning unit, refuses the wrong structure references in plain words and the missing identity type raw, and Kim holds a National and an Atlanta membership side by side" |
| `ATS-MBR-STR-009` | `scenarios.2.bound_to` | ["services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses a grace period of 2^31 days 400 naming grace_days, beyond what the column stores","services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092","services-membership:tests/acceptance/configuration/MBR-ACC-0119.acceptance.ts#MBR-ACC-0119"] | ["services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses a grace period of 2^31 days 400 naming grace_days, beyond what the column stores","services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092: Changing a grace period moves every existing member at once: a type override wins over the program, zero is not blank, and even an as-of answer for a past date follows today's setting","services-membership:tests/acceptance/configuration/MBR-ACC-0119.acceptance.ts#MBR-ACC-0119: Scenario 4 in configuration terms: Sam's grace, lapse, drop and rejoin follow the program's 60-day grace and 60-day continuity gap and the package's 180-day reinstatement, and widening the continuity gap afterwards merges his two episodes into one"] |
| `ATS-MBR-STR-011` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092","services-membership:tests/acceptance/configuration/MBR-ACC-0097.acceptance.ts#MBR-ACC-0097"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092: Changing a grace period moves every existing member at once: a type override wins over the program, zero is not blank, and even an as-of answer for a past date follows today's setting","services-membership:tests/acceptance/configuration/MBR-ACC-0097.acceptance.ts#MBR-ACC-0097: A type's flow-down settings and benefits flag are configured and felt downstream: a firm's Corporate membership reaches its billing contacts, and a type without benefits makes its members active without benefits"] |
| `ATS-MBR-STR-011` | `scenarios.1.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092" | "services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092: Changing a grace period moves every existing member at once: a type override wins over the program, zero is not blank, and even an as-of answer for a past date follows today's setting" |
| `ATS-MBR-STR-012` | `scenarios.0.bound_to` | ["services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a package create that names no product id: there is no name to make one from","services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a package whose product Accounting does not have, 400","services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a package on a product of another type, 400","services-membership:tests/acceptance/configuration/MBR-ACC-0099.acceptance.ts#MBR-ACC-0099"] | ["services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a package create that names no product id: there is no name to make one from","services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a package whose product Accounting does not have, 400","services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a package on a product of another type, 400","services-membership:tests/acceptance/configuration/MBR-ACC-0099.acceptance.ts#MBR-ACC-0099: A package is created as the extension of a product Accounting already holds: no id, an unknown product, a product of another type and the product's own fields are each refused, and the created package answers the product's name, status, visibility and audiences"] |
| `ATS-MBR-STR-012` | `scenarios.2.bound_to` | ["services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › lists packages with the product’s fields and filters is_active by the product’s status","services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a renewal term on a package whose product Accounting deactivated","services-membership:tests/acceptance/configuration/MBR-ACC-0091.acceptance.ts#MBR-ACC-0091"] | ["services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › lists packages with the product’s fields and filters is_active by the product’s status","services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the API › refuses a renewal term on a package whose product Accounting deactivated","services-membership:tests/acceptance/configuration/MBR-ACC-0091.acceptance.ts#MBR-ACC-0091: A package follows its Accounting product: when Accounting deactivates, retires or deletes the product the package answers that status, sells no term and writes nothing in Membership"] |
| `ATS-MBR-STR-013` | `scenarios.3.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104: A package's unit rules override the program's counts: the Regular package demands a chapter the program leaves optional, a Section-only package names a type the program does not list, a region is refused, and clearing the rules hands control back to the program"] |
| `ATS-MBR-STR-013` | `scenarios.3.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104" | "services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104: A package's unit rules override the program's counts: the Regular package demands a chapter the program leaves optional, a Section-only package names a type the program does not list, a region is refused, and clearing the rules hands control back to the program" |
| `ATS-MBR-STR-013` | `scenarios.4.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104","services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#the term affiliations in the database › refuses a Regular term with no chapter: the package needs one (unit_minimum)","services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#the term affiliations in the database › refuses a second chapter on a Student term: the package allows one (unit_maximum)"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104: A package's unit rules override the program's counts: the Regular package demands a chapter the program leaves optional, a Section-only package names a type the program does not list, a region is refused, and clearing the rules hands control back to the program","services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#the term affiliations in the database › refuses a Regular term with no chapter: the package needs one (unit_minimum)","services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#the term affiliations in the database › refuses a second chapter on a Student term: the package allows one (unit_maximum)"] |
| `ATS-MBR-STR-013` | `scenarios.4.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104" | "services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104: A package's unit rules override the program's counts: the Regular package demands a chapter the program leaves optional, a Section-only package names a type the program does not list, a region is refused, and clearing the rules hands control back to the program" |
| `ATS-MBR-STR-014` | `scenarios.0.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106: Change policy sets are kept exactly as written: every policy field round-trips with its defaults, the list is rewritten whole with new ids, two hundred policies fit and the two-hundred-and-first does not, a policy naming both a type and a package on one side is refused raw, and ids nobody checks are accepted"] |
| `ATS-MBR-STR-014` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106" | "services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106: Change policy sets are kept exactly as written: every policy field round-trips with its defaults, the list is rewritten whole with new ids, two hundred policies fit and the two-hundred-and-first does not, a policy naming both a type and a package on one side is refused raw, and ids nobody checks are accepted" |
| `ATS-MBR-STR-014` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106: Change policy sets are kept exactly as written: every policy field round-trips with its defaults, the list is rewritten whole with new ids, two hundred policies fit and the two-hundred-and-first does not, a policy naming both a type and a package on one side is refused raw, and ids nobody checks are accepted"] |
| `ATS-MBR-STR-014` | `scenarios.1.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106" | "services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106: Change policy sets are kept exactly as written: every policy field round-trips with its defaults, the list is rewritten whole with new ids, two hundred policies fit and the two-hundred-and-first does not, a policy naming both a type and a package on one side is refused raw, and ids nobody checks are accepted" |
| `ATS-MBR-STR-015` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0101.acceptance.ts#MBR-ACC-0101"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0101.acceptance.ts#MBR-ACC-0101: A package update is judged on the record as it will be after the change: switching the basis alone is refused, switching it with the dependent fields is accepted, and the renewal, reinstatement, seat and proration settings round-trip, clear and bound correctly"] |
| `ATS-MBR-STR-015` | `scenarios.1.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0101.acceptance.ts#MBR-ACC-0101" | "services-membership:tests/acceptance/configuration/MBR-ACC-0101.acceptance.ts#MBR-ACC-0101: A package update is judged on the record as it will be after the change: switching the basis alone is refused, switching it with the dependent fields is accepted, and the renewal, reinstatement, seat and proration settings round-trip, clear and bound correctly" |
| `ATS-MBR-STR-018` | `scenarios.0.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0081.acceptance.ts#MBR-ACC-0081","services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0081.acceptance.ts#MBR-ACC-0081: Readable ids are made from names, names keep their accents and length, and the longest id the grammar allows is accepted","services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082: Ids an administrator types are validated, never repaired: spaces, reserved words, a name that yields nothing, a taken id and an id changed on update are all refused with nothing written"] |
| `ATS-MBR-STR-018` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0081.acceptance.ts#MBR-ACC-0081" | "services-membership:tests/acceptance/configuration/MBR-ACC-0081.acceptance.ts#MBR-ACC-0081: Readable ids are made from names, names keep their accents and length, and the longest id the grammar allows is accepted" |
| `ATS-MBR-STR-018` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082: Ids an administrator types are validated, never repaired: spaces, reserved words, a name that yields nothing, a taken id and an id changed on update are all refused with nothing written"] |
| `ATS-MBR-STR-018` | `scenarios.1.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082" | "services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082: Ids an administrator types are validated, never repaired: spaces, reserved words, a name that yields nothing, a taken id and an id changed on update are all refused with nothing written" |
| `ATS-MBR-STR-018` | `scenarios.2.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0083.acceptance.ts#MBR-ACC-0083","services-membership:tests/acceptance/configuration/MBR-ACC-0084.acceptance.ts#MBR-ACC-0084"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0083.acceptance.ts#MBR-ACC-0083: Every change and delete carries the version read: the version climbs by one per save, a stale save or delete is refused, and a missing version is refused before anything is read","services-membership:tests/acceptance/configuration/MBR-ACC-0084.acceptance.ts#MBR-ACC-0084: Two administrators edit the Regular package at the same time: the first save wins, the second is told to re-read, and the grants she re-sends get new ids"] |
| `ATS-MBR-STR-018` | `scenarios.2.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0083.acceptance.ts#MBR-ACC-0083" | "services-membership:tests/acceptance/configuration/MBR-ACC-0083.acceptance.ts#MBR-ACC-0083: Every change and delete carries the version read: the version climbs by one per save, a stale save or delete is refused, and a missing version is refused before anything is read" |
| `ATS-MBR-STR-018` | `scenarios.3.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0085.acceptance.ts#MBR-ACC-0085"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0085.acceptance.ts#MBR-ACC-0085: An update changes only the keys it names: null clears, an empty string is null, whitespace-only text is refused, unknown keys are refused, and an owned list is replaced only when sent"] |
| `ATS-MBR-STR-018` | `scenarios.3.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0085.acceptance.ts#MBR-ACC-0085" | "services-membership:tests/acceptance/configuration/MBR-ACC-0085.acceptance.ts#MBR-ACC-0085: An update changes only the keys it names: null clears, an empty string is null, whitespace-only text is refused, unknown keys are refused, and an owned list is replaced only when sent" |
| `ATS-MBR-STR-018` | `scenarios.4.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0086.acceptance.ts#MBR-ACC-0086","services-membership:tests/acceptance/configuration/MBR-ACC-0118.acceptance.ts#MBR-ACC-0118"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0086.acceptance.ts#MBR-ACC-0086: Nothing that another record points at can be deleted: program, type, package, status reason and policy set are each refused while in use, then deleted with their owned rows once free","services-membership:tests/acceptance/configuration/MBR-ACC-0118.acceptance.ts#MBR-ACC-0118: References other applications hold: a billing template that drops members names a program and a terminated reason and blocks their deletion, while a Committees eligibility rule naming a type is invisible to Membership and the type can be deleted from under it"] |
| `ATS-MBR-STR-018` | `scenarios.4.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0086.acceptance.ts#MBR-ACC-0086" | "services-membership:tests/acceptance/configuration/MBR-ACC-0086.acceptance.ts#MBR-ACC-0086: Nothing that another record points at can be deleted: program, type, package, status reason and policy set are each refused while in use, then deleted with their owned rows once free" |
| `ATS-MBR-STR-018` | `scenarios.5.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0116.acceptance.ts#MBR-ACC-0116","services-membership:tests/acceptance/structure/MBR-ACC-0035.acceptance.ts#MBR-ACC-0035"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0116.acceptance.ts#MBR-ACC-0116: A refused save in the middle of a series keeps the valid saves before it and loses nothing after it is corrected: the record never holds half a body, and a create that fails on its children leaves no record at all","services-membership:tests/acceptance/structure/MBR-ACC-0035.acceptance.ts#MBR-ACC-0035 a refusal after valid work"] |
| `ATS-MBR-STR-018` | `scenarios.5.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0116.acceptance.ts#MBR-ACC-0116" | "services-membership:tests/acceptance/configuration/MBR-ACC-0116.acceptance.ts#MBR-ACC-0116: A refused save in the middle of a series keeps the valid saves before it and loses nothing after it is corrected: the record never holds half a body, and a create that fails on its children leaves no record at all" |
| `ATS-MBR-STR-018` | `scenarios.7.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089: Two associations with identically named configuration never see each other: the same ids live in both workspaces and a cross-workspace read, update or delete answers not found"] |
| `ATS-MBR-STR-018` | `scenarios.7.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089" | "services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089: Two associations with identically named configuration never see each other: the same ids live in both workspaces and a cross-workspace read, update or delete answers not found" |
| `ATS-MBR-STR-019` | `scenarios.0.bound_to` | ["services-membership:tests/unit/route-authorization.spec.ts#route authorization: every Membership operation names its permission › requires membership.structure.read of every structure read and membership.structure.manage of every change","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › serves a reader the reads","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a reader a change, 403","services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025"] | ["services-membership:tests/unit/route-authorization.spec.ts#route authorization: every Membership operation names its permission › requires membership.structure.read of every structure read and membership.structure.manage of every change","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › serves a reader the reads","services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › refuses a reader a change, 403","services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025 one structure change, seven people"] |
| `ATS-MBR-STR-019` | `scenarios.1.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0088.acceptance.ts#MBR-ACC-0088"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0088.acceptance.ts#MBR-ACC-0088: Who may read and who may change configuration: the administrator does both, read-only staff and a standard user only read, and a chapter officer or a portal member reaches nothing because the keys are workspace-level"] |
| `ATS-MBR-STR-019` | `scenarios.1.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0088.acceptance.ts#MBR-ACC-0088" | "services-membership:tests/acceptance/configuration/MBR-ACC-0088.acceptance.ts#MBR-ACC-0088: Who may read and who may change configuration: the administrator does both, read-only staff and a standard user only read, and a chapter officer or a portal member reaches nothing because the keys are workspace-level" |
| `ATS-MBR-STR-019` | `scenarios.2.bound_to` | ["services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025","services-membership:tests/acceptance/configuration/MBR-ACC-0088.acceptance.ts#MBR-ACC-0088"] | ["services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025 one structure change, seven people","services-membership:tests/acceptance/configuration/MBR-ACC-0088.acceptance.ts#MBR-ACC-0088: Who may read and who may change configuration: the administrator does both, read-only staff and a standard user only read, and a chapter officer or a portal member reaches nothing because the keys are workspace-level"] |
| `ATS-MBR-STR-019` | `scenarios.2.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025" | "services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025 one structure change, seven people" |
| `ATS-MBR-STR-019` | `scenarios.4.bound_to` | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › row-level security › shows another tenant none of the units","services-membership:tests/acceptance/structure/MBR-ACC-0026.acceptance.ts#MBR-ACC-0026","services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089"] | ["services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › row-level security › shows another tenant none of the units","services-membership:tests/acceptance/structure/MBR-ACC-0026.acceptance.ts#MBR-ACC-0026 another association's structure does not exist","services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089: Two associations with identically named configuration never see each other: the same ids live in both workspaces and a cross-workspace read, update or delete answers not found"] |
| `ATS-MBR-STR-020` | `scenarios.4.bound_to` | ["services-membership:tests/acceptance/configuration/MBR-ACC-0110.acceptance.ts#MBR-ACC-0110"] | ["services-membership:tests/acceptance/configuration/MBR-ACC-0110.acceptance.ts#MBR-ACC-0110: A migration loads programs, types and packages in bulk: an insert is the record the route would have made, an upsert converges by id or by the producer's source key, a package needs its product first, and a malformed item is rejected naming its field while the others proceed"] |
| `ATS-MBR-STR-020` | `scenarios.4.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0110.acceptance.ts#MBR-ACC-0110" | "services-membership:tests/acceptance/configuration/MBR-ACC-0110.acceptance.ts#MBR-ACC-0110: A migration loads programs, types and packages in bulk: an insert is the record the route would have made, an upsert converges by id or by the producer's source key, a package needs its product first, and a malformed item is rejected naming its field while the others proceed" |
| `CAP-MBR-STR-001` | `rules.8.must_prove` | false | true |
| `CAP-MBR-STR-001` | `rules.9.must_prove` | false | true |
| `CAP-MBR-STR-001` | `scenarios.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001" | "services-membership:tests/acceptance/structure/MBR-ACC-0001.acceptance.ts#MBR-ACC-0001 staff define, rename, retire and delete kinds of unit" |
| `CAP-MBR-STR-001` | `edge_cases.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0003.acceptance.ts#MBR-ACC-0003" | "services-membership:tests/acceptance/structure/MBR-ACC-0003.acceptance.ts#MBR-ACC-0003 a tree rule chapters rely on cannot be withdrawn until they move" |
| `CAP-MBR-STR-002` | `rules.6.enforced_at` | ["service","database"] | ["service"] |
| `CAP-MBR-STR-002` | `rules.6.provenance` | "test" | "observed" |
| `CAP-MBR-STR-002` | `rules.6.source` | "services-membership:modules/structure/tests/integration/services/persistence/organizational-units.integration.spec.ts#organizational units in the database › the parent history and the as-of tree › closes the open row at the day before the new one and keeps one open row per unit" | "services-membership:modules/structure/services/persistence/organizational-units.ts:recordParentChange" |
| `CAP-MBR-STR-002` | `rules.11.must_prove` | false | true |
| `CAP-MBR-STR-003` | `rules.3.provenance` | "test" | "documented" |
| `CAP-MBR-STR-003` | `rules.3.source` | "services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#a unit merge moves its members: Savannah into Atlanta › ends Pat’s Savannah affiliation yesterday and continues it in Atlanta as primary from today" | "services-membership:docs/migrations/unit-merge/README.md#The behaviour" |
| `CAP-MBR-STR-004` | `rules.1.must_prove` | false | true |
| `CAP-MBR-STR-004` | `scenarios.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0020.acceptance.ts#MBR-ACC-0020" | "services-membership:tests/acceptance/structure/MBR-ACC-0020.acceptance.ts#MBR-ACC-0020 deactivating a chapter freezes it, and there is no way back" |
| `CAP-MBR-STR-005` | `rules.2.must_prove` | false | true |
| `CAP-MBR-STR-005` | `rules.3.must_prove` | false | true |
| `CAP-MBR-STR-005` | `rules.4.must_prove` | false | true |
| `CAP-MBR-STR-005` | `rules.5.provenance` | "test" | "observed" |
| `CAP-MBR-STR-005` | `rules.5.source` | "services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process › pages the flat list by code with a cursor" | "services-membership:modules/structure/aws/api/structure.routes.ts:structureRoutes" |
| `CAP-MBR-STR-005` | `rules.6.must_prove` | false | true |
| `CAP-MBR-STR-006` | `rules.4.must_prove` | false | true |
| `CAP-MBR-STR-006` | `rules.7.must_prove` | false | true |
| `CAP-MBR-STR-006` | `scenarios.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0006.acceptance.ts#MBR-ACC-0006" | "services-membership:tests/acceptance/structure/MBR-ACC-0006.acceptance.ts#MBR-ACC-0006 a complete chapter, recorded and read back" |
| `CAP-MBR-STR-006` | `edge_cases.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0032.acceptance.ts#MBR-ACC-0032" | "services-membership:tests/acceptance/structure/MBR-ACC-0032.acceptance.ts#MBR-ACC-0032 a client that thinks PUT is a patch, and a unit deleted behind the service" |
| `CAP-MBR-STR-007` | `rules.6.must_prove` | false | true |
| `CAP-MBR-STR-007` | `scenarios.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021" | "services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario 11: Atlanta Chapter's incorporation, linked with dates" |
| `CAP-MBR-STR-008` | `rules.6.enforced_at` | ["service"] | [] |
| `CAP-MBR-STR-008` | `rules.6.provenance` | "observed" | "documented" |
| `CAP-MBR-STR-008` | `rules.6.source` | "services-membership:modules/structure/services/persistence/organizational-unit-financial-settings.ts:setFinancialSettings" | "services-membership:docs/migrations/packages-as-products/README.md#Ordering profiles (added the same day, from Commerce's decision Andrew approved at about 15:45 UTC)" |
| `CAP-MBR-STR-009` | `rules.0.origin` | "services-membership:README.md (D-02, approved 2026-10-17: how a program relates to organizational units)" | "none" |
| `CAP-MBR-STR-009` | `rules.2.enforced_at` | ["service"] | ["api","database"] |
| `CAP-MBR-STR-009` | `rules.3.enforced_at` | ["service"] | ["api","database"] |
| `CAP-MBR-STR-009` | `rules.5.must_prove` | false | true |
| `CAP-MBR-STR-009` | `rules.5.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0093.acceptance.ts#MBR-ACC-0093" | "services-membership:tests/acceptance/configuration/MBR-ACC-0093.acceptance.ts#MBR-ACC-0093: Putting two programs into one exclusivity group refuses new overlapping memberships from then on while members who already hold both keep them, and removing the group opens them again" |
| `CAP-MBR-STR-009` | `rules.6.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0121.acceptance.ts#MBR-ACC-0121" | "services-membership:tests/acceptance/configuration/MBR-ACC-0121.acceptance.ts#MBR-ACC-0121: The settings Commerce reads flow into the purchase plan and never into an amount: the program's same-order switch, ordering profile, cancellation policy and fee product, and the package's reinstatement audience, enrolment proration and auto-renew default each appear where the participant promises them, and a change is reflected on the next prepare" |
| `CAP-MBR-STR-009` | `rules.6.origin` | "services-membership:docs/migrations/packages-as-products/README.md#Ordering profiles (Commerce's decision approved by Andrew on 2026-10-18)" | "none" |
| `CAP-MBR-STR-009` | `rules.10.must_prove` | false | true |
| `CAP-MBR-STR-009` | `rules.11.id` | — | "BR-CAP-MBR-STR-009-12" |
| `CAP-MBR-STR-009` | `rules.11.enforced_at` | — | [] |
| `CAP-MBR-STR-009` | `rules.11.must_prove` | — | true |
| `CAP-MBR-STR-009` | `rules.11.provenance` | — | "documented" |
| `CAP-MBR-STR-009` | `rules.11.source` | — | "services-membership:docs/migrations/packages-as-products/README.md#Ordering profiles (added the same day, from Commerce's decision Andrew approved at about 15:45 UTC)" |
| `CAP-MBR-STR-009` | `rules.11.origin` | — | "services-membership:docs/migrations/packages-as-products/README.md#Ordering profiles (Commerce's decision approved by Andrew on 2026-10-18)" |
| `CAP-MBR-STR-009` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120" | "services-membership:tests/acceptance/configuration/MBR-ACC-0120.acceptance.ts#MBR-ACC-0120: Scenario 11 through the route: an identity-bound Chapter Membership program names its chapter unit type and its owning unit, refuses the wrong structure references in plain words and the missing identity type raw, and Kim holds a National and an Atlanta membership side by side" |
| `CAP-MBR-STR-009` | `edge_cases.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092" | "services-membership:tests/acceptance/configuration/MBR-ACC-0092.acceptance.ts#MBR-ACC-0092: Changing a grace period moves every existing member at once: a type override wins over the program, zero is not blank, and even an as-of answer for a past date follows today's setting" |
| `CAP-MBR-STR-010` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `CAP-MBR-STR-011` | `rules.3.must_prove` | false | true |
| `CAP-MBR-STR-011` | `rules.5.must_prove` | false | true |
| `CAP-MBR-STR-011` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0097.acceptance.ts#MBR-ACC-0097" | "services-membership:tests/acceptance/configuration/MBR-ACC-0097.acceptance.ts#MBR-ACC-0097: A type's flow-down settings and benefits flag are configured and felt downstream: a firm's Corporate membership reaches its billing contacts, and a type without benefits makes its members active without benefits" |
| `CAP-MBR-STR-012` | `rules.6.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0115.acceptance.ts#MBR-ACC-0115" | "services-membership:tests/acceptance/configuration/MBR-ACC-0115.acceptance.ts#MBR-ACC-0115: The renewal window and the reinstatement period decide what a member may buy, read live from the package: narrowing the window shuts an open renewal, widening the reinstatement period turns a rejoin back into a reinstatement, a blank period means no reinstatement at all, and the default renewal package is the one the configuration names" |
| `CAP-MBR-STR-012` | `rules.8.must_prove` | false | true |
| `CAP-MBR-STR-012` | `rules.9.must_prove` | false | true |
| `CAP-MBR-STR-012` | `rules.10.id` | — | "BR-CAP-MBR-STR-012-11" |
| `CAP-MBR-STR-012` | `rules.10.enforced_at` | — | ["service"] |
| `CAP-MBR-STR-012` | `rules.10.must_prove` | — | true |
| `CAP-MBR-STR-012` | `rules.10.provenance` | — | "observed" |
| `CAP-MBR-STR-012` | `rules.10.source` | — | "services-membership:modules/configuration/services/persistence/membership-packages.ts:listMembershipPackages" |
| `CAP-MBR-STR-012` | `rules.10.origin` | — | "none" |
| `CAP-MBR-STR-013` | `rules.3.must_prove` | false | true |
| `CAP-MBR-STR-013` | `rules.6.must_prove` | false | true |
| `CAP-MBR-STR-013` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0111.acceptance.ts#MBR-ACC-0111" | "services-membership:tests/acceptance/configuration/MBR-ACC-0111.acceptance.ts#MBR-ACC-0111: The well-known FAA configuration every developer and integration run starts from reads back exactly as the seed describes it, its packages' products exist with the right audiences, and a second seed run changes nothing" |
| `CAP-MBR-STR-013` | `edge_cases.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104" | "services-membership:tests/acceptance/configuration/MBR-ACC-0104.acceptance.ts#MBR-ACC-0104: A package's unit rules override the program's counts: the Regular package demands a chapter the program leaves optional, a Section-only package names a type the program does not list, a region is refused, and clearing the rules hands control back to the program" |
| `CAP-MBR-STR-014` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106" | "services-membership:tests/acceptance/configuration/MBR-ACC-0106.acceptance.ts#MBR-ACC-0106: Change policy sets are kept exactly as written: every policy field round-trips with its defaults, the list is rewritten whole with new ids, two hundred policies fit and the two-hundred-and-first does not, a policy naming both a type and a package on one side is refused raw, and ids nobody checks are accepted" |
| `CAP-MBR-STR-015` | `rules.3.provenance` | "test" | "observed" |
| `CAP-MBR-STR-015` | `rules.3.source` | "services-membership:modules/terms/tests/unit/term-rules.spec.ts#term rules: the rules of 1.0 beyond its spec cases › continues a terminated term on the last day of its window" | "services-membership:modules/terms/services/term-rules.ts:startingPoint" |
| `CAP-MBR-STR-015` | `rules.5.provenance` | "test" | "observed" |
| `CAP-MBR-STR-015` | `rules.5.source` | "services-membership:modules/terms/tests/unit/term-rules.spec.ts#term rules: fixed term ends › places a renewal starting the day after a window’s end in that window (RB-2585)" | "services-membership:modules/terms/services/term-rules.ts:fixedWindowProbe" |
| `CAP-MBR-STR-015` | `rules.8.must_prove` | false | true |
| `CAP-MBR-STR-015` | `rules.12.id` | — | "BR-CAP-MBR-STR-015-13" |
| `CAP-MBR-STR-015` | `rules.12.enforced_at` | — | ["service"] |
| `CAP-MBR-STR-015` | `rules.12.must_prove` | — | true |
| `CAP-MBR-STR-015` | `rules.12.provenance` | — | "observed" |
| `CAP-MBR-STR-015` | `rules.12.source` | — | "services-membership:modules/terms/services/term-rules.ts:fixedTermEnd" |
| `CAP-MBR-STR-015` | `rules.12.origin` | — | "none" |
| `CAP-MBR-STR-016` | `rules.0.enforced_at` | ["service","database"] | ["service"] |
| `CAP-MBR-STR-016` | `rules.4.provenance` | "test" | "observed" |
| `CAP-MBR-STR-016` | `rules.4.source` | "services-membership:modules/terms/tests/unit/status.spec.ts#continuity episodes: §8 › keeps the run when the gap equals the allowance (starts_on = ends_on + gap + 1)" | "services-membership:modules/terms/services/status.ts:continuousSinceOf" |
| `CAP-MBR-STR-016` | `rules.5.provenance` | "test" | "documented" |
| `CAP-MBR-STR-016` | `rules.5.source` | "services-membership:modules/terms/tests/unit/holding-cache.spec.ts#the holding cache › takes the join date from the first effective term, a pending or cancelled one never" | "services-membership:modules/terms/services/holding-cache.ts:firstJoinDateOf" |
| `CAP-MBR-STR-016` | `rules.8.provenance` | "test" | "observed" |
| `CAP-MBR-STR-016` | `rules.8.source` | "services-membership:modules/terms/tests/unit/holding-cache.spec.ts#the holding cache › answers only the columns that differ" | "services-membership:modules/terms/services/holding-cache.ts:holdingCacheChanges" |
| `CAP-MBR-STR-016` | `rules.11.must_prove` | false | true |
| `CAP-MBR-STR-017` | `rules.3.must_prove` | false | true |
| `CAP-MBR-STR-017` | `rules.5.must_prove` | false | true |
| `CAP-MBR-STR-018` | `rules.7.must_prove` | false | true |
| `CAP-MBR-STR-018` | `rules.7.provenance` | "test" | "observed" |
| `CAP-MBR-STR-018` | `rules.7.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0117.acceptance.ts#MBR-ACC-0117" | "services-membership:modules/configuration/services/persistence/membership-packages.ts:listMembershipPackages" |
| `CAP-MBR-STR-018` | `scenarios.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0084.acceptance.ts#MBR-ACC-0084" | "services-membership:tests/acceptance/configuration/MBR-ACC-0084.acceptance.ts#MBR-ACC-0084: Two administrators edit the Regular package at the same time: the first save wins, the second is told to re-read, and the grants she re-sends get new ids" |
| `CAP-MBR-STR-019` | `rules.6.must_prove` | false | true |
| `CAP-MBR-STR-019` | `rules.6.source` | "react-console:lib/authz/permissions.ts:permissions.membership" | "react-console:lib/authz/permissions.ts:82" |
| `CAP-MBR-STR-019` | `edge_cases.0.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025" | "services-membership:tests/acceptance/structure/MBR-ACC-0025.acceptance.ts#MBR-ACC-0025 one structure change, seven people" |
| `CAP-MBR-STR-020` | `rules.6.must_prove` | false | true |
| `CAP-MBR-STR-020` | `rules.8.must_prove` | false | true |
| `CAP-MBR-STR-020` | `rules.9.id` | — | "BR-CAP-MBR-STR-020-10" |
| `CAP-MBR-STR-020` | `rules.9.enforced_at` | — | ["service"] |
| `CAP-MBR-STR-020` | `rules.9.must_prove` | — | true |
| `CAP-MBR-STR-020` | `rules.9.provenance` | — | "observed" |
| `CAP-MBR-STR-020` | `rules.9.source` | — | "services-membership:modules/structure/services/tree/tree-loads.ts:loadUnit" |
| `CAP-MBR-STR-020` | `rules.9.origin` | — | "none" |
| `CON-MBR-STR-003` | `relationships.0.source` | "services-membership:modules/configuration/db/program-unit-types.table.ts" | "services-membership:modules/configuration/db/programs.table.ts:programs" |
| `JNY-MBR-STR-001` | `steps.2.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0006.acceptance.ts#MBR-ACC-0006" | "services-membership:tests/acceptance/structure/MBR-ACC-0006.acceptance.ts#MBR-ACC-0006 a complete chapter, recorded and read back" |
| `JNY-MBR-STR-001` | `steps.4.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023" | "services-membership:tests/acceptance/structure/MBR-ACC-0023.acceptance.ts#MBR-ACC-0023 a chapter's financial settings" |
| `JNY-MBR-STR-002` | `steps.0.provenance` | "test" | "inferred" |
| `JNY-MBR-STR-002` | `steps.2.provenance` | "test" | "inferred" |
| `JNY-MBR-STR-002` | `steps.4.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0012.acceptance.ts#MBR-ACC-0012" | "services-membership:tests/acceptance/structure/MBR-ACC-0012.acceptance.ts#MBR-ACC-0012 scenario 9: Atlanta moves to the Pacific Zone" |
| `JNY-MBR-STR-003` | `steps.2.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018" | "services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018 Savannah Chapter is merged into Atlanta" |
| `JNY-MBR-STR-003` | `assertions.2.source` | "services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018" | "services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#MBR-ACC-0018 Savannah Chapter is merged into Atlanta" |
| `JNY-MBR-STR-004` | `steps.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `JNY-MBR-STR-004` | `steps.1.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `JNY-MBR-STR-004` | `steps.2.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `JNY-MBR-STR-004` | `steps.3.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `JNY-MBR-STR-004` | `steps.4.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `JNY-MBR-STR-004` | `steps.5.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `JNY-MBR-STR-004` | `failures.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0084.acceptance.ts#MBR-ACC-0084" | "services-membership:tests/acceptance/configuration/MBR-ACC-0084.acceptance.ts#MBR-ACC-0084: Two administrators edit the Regular package at the same time: the first save wins, the second is told to re-read, and the grants she re-sends get new ids" |
| `JNY-MBR-STR-004` | `assertions.0.source` | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080" | "services-membership:tests/acceptance/configuration/MBR-ACC-0080.acceptance.ts#MBR-ACC-0080: An administrator builds an association's membership configuration from nothing and a first member is enrolled on it" |
| `JNY-MBR-STR-005` | `steps.1.provenance` | "test" | "inferred" |
| `JNY-MBR-STR-005` | `alternates.0.provenance` | "test" | "inferred" |

## Findings and decisions left open

All 38 findings remain open planning inputs; this examination does not close them by rewriting their wording. The following ledger identifies each disagreement or limit and retains its finding identity.

| Finding | Unresolved matter | Kind |
|---|---|---|
| `FND-MBR-STR-001` | The external Membership decision register is unavailable in this job. Product authority is therefore limited to specific decisions reproduced in the permitted repository; the general acceptance and an approval summary do not confirm every rule. | undocumented |
| `FND-MBR-STR-002` | The permitted console scope contains no structure administration screen. Its Members page and Commerce member-pricing settings do not provide this module’s setup workflows, leaving service evidence without browser workflow proof. | inconsistency |
| `FND-MBR-STR-003` | The console and service use different Membership permission vocabularies. A direct match is unsupported until the product supplies and verifies the mapping used by future administration screens. | inconsistency |
| `FND-MBR-STR-004` | Inactive units have no reactivation operation. A detail replacement discards a submitted status, allowing the request to succeed without the attempted reopening. | defect |
| `FND-MBR-STR-005` | Combination leaves the source unit beneath its existing parent and retains its open parent period. Product has not settled whether a merged source should remain in the current branch. | undocumented |
| `FND-MBR-STR-006` | A placement correction on its first effective day replaces the current history row. Earlier values survive only in versions, and deletion checks can consequently lose the source unit’s former-parent reference. | defect |
| `FND-MBR-STR-007` | Repeated non-legal organization-link creation can retain duplicates with no removal operation. Repeating an unchanged ending also creates another version. | defect |
| `FND-MBR-STR-008` | Organization and finance writes remain available for inactive and merged units. Relationship-purpose records have no rename or retirement operation, and inactivity does not prevent their use in new links. | debt |
| `FND-MBR-STR-009` | Organization, ordering-profile, default-dues and dues-package references are stored without complete existence validation. The default dues reference has no consumer, leaving configuration errors to surface outside these writes. | debt |
| `FND-MBR-STR-010` | Membership cannot remove or deactivate a mistakenly created dues extension. Staff can change its package association or manage availability through its Accounting product. | debt |
| `FND-MBR-STR-011` | Several validation refusals use codes describing missing records or already-ended links rather than malformed input. Unit-code validation also differs from configuration-kind reserved-word handling. | inconsistency |
| `FND-MBR-STR-012` | Structure and configuration have different replacement and paging contracts. Ordinary structure omissions restore defaults, configuration omissions retain values, and oversized page requests are refused by one concern and capped by the other. | inconsistency |
| `FND-MBR-STR-013` | Retained settings include unused committee, geography, welcome, grace-benefit, competing-holding, portal, suggestion and presentation choices. Policy sets likewise have no operational change consumer; storing these choices does not establish their promised experiences. | undocumented |
| `FND-MBR-STR-014` | Changing a program away from affiliation binding does not remove its earlier category list or affiliations. Existing relationships also survive category retirement or disabled affiliation eligibility, leaving transition behavior for Product to settle. | undocumented |
| `FND-MBR-STR-015` | The recorded acceptance describes different activity checks for staff term creation and Commerce selling, including enrolment-related behavior on inactive programs. Those consumer differences require membership-module follow-up. | inconsistency |
| `FND-MBR-STR-016` | Stored lock flags are not exposed or honored by the examined ordinary structure and configuration operations. | debt |
| `FND-MBR-STR-017` | Replacing grants or policy cases reallocates their row identities. Policy case references to types, packages and fee products are not existence-checked, although the package’s policy-set reference is checked. | debt |
| `FND-MBR-STR-018` | Package requirements may introduce categories absent from program defaults. Grant configuration also omits target-program activity, owner-kind and exclusivity checks; the intended compatibility contract remains unsettled. | undocumented |
| `FND-MBR-STR-019` | A first purchase immediately after a fixed window closes can use the preceding window. In the documented April example this yields a June ending, demonstrating that the renewal-derived boundary adjustment also affects new members. | defect |
| `FND-MBR-STR-020` | The term-calculation commentary still treats the February ending as undecided, although the local acceptance record and test name reproduce Andrew’s choice of the actual last day. | inconsistency |
| `FND-MBR-STR-021` | Recorded eligibility behavior and the term engine disagree on absent reinstatement allowances, with legacy unlimited interpretation adding a migration concern. The engine itself treats absence as zero days after the end. | inconsistency |
| `FND-MBR-STR-022` | Fixed windows may overlap and the first matching configured window decides the result without an overlap refusal. | undocumented |
| `FND-MBR-STR-023` | Unknown-reference collections return empty answers, historical placement returns current names and codes, and knowledge-time input bypasses a dedicated instant validator. Consumers need these limits stated explicitly. | undocumented |
| `FND-MBR-STR-024` | Relocation has no repeat-request key and applies immediately. A repeated successful request becomes a current-parent refusal, and future-effective restructuring remains unavailable. | debt |
| `FND-MBR-STR-025` | Purge preserves applied seed bookkeeping, preventing the standard relationship purposes from being restored by later provisioning. The recorded development-seed issue also describes failure to converge a unit moved beyond its fixed setup date. | defect |
| `FND-MBR-STR-026` | Data-job submission wiring is recorded as incomplete. Structure loads also differ from ordinary placement checks, and supported configuration loads exclude program requirements, action reasons and policy sets. | debt |
| `FND-MBR-STR-027` | The source record reports missing deployment registration for structure objects and datasets. The blocked acceptance case does not establish a successfully executed query. | debt |
| `FND-MBR-STR-028` | The Accounting integration record leaves product-type registration and display order incomplete. Membership’s product-write port has an implementation and test double but no module caller. | debt |
| `FND-MBR-STR-029` | The earlier acceptance catalogue is not a reliable description of every pinned behavior. Merge identity transfer, named database refusals and lifecycle admission checks have changed since parts of that inventory were recorded. | inconsistency |
| `FND-MBR-STR-030` | Acceptance suites are executable through a manual Mocha invocation rather than an ordinary npm test tier. Their recorded earlier run includes failures and blocked cases, so the bindings identify evidence to inspect without asserting a fresh pass. | debt |
| `FND-MBR-STR-031` | The catalogue reports overlapping values between workspace and program number sequences. Product must decide whether cross-program uniqueness is required before the memberships module changes numbering. | inconsistency |
| `FND-MBR-STR-032` | Reason use remains editable while references exist. The recorded cancellation mismatch also uses termination wording, making action explanations inconsistent. | undocumented |
| `FND-MBR-STR-033` | Some required scenarios have no bound proof of their complete behavior. The existing proposed scenarios describe needed checks, while partial examples and earlier failed or blocked acceptance cases do not establish complete proof. | debt |
| `FND-MBR-STR-034` | The drafting brief named in the job is absent from the starting documentation commit. Its instructions cannot be independently compared with the draft in this examination. | undocumented |
| `FND-MBR-STR-035` | Bound tests provide specific examples rather than universal proof of compound statements. Manual acceptance suites and earlier execution reports need to be assessed separately from coverage bindings. | debt |
| `FND-MBR-STR-036` | Additional refusal, calculation and cross-record-write rules now require proof. Cases without a scenario are listed in the affected-rule ledger; existing scenarios without bindings also remain open proof work. | debt |
| `FND-MBR-STR-037` | Only submitted grants receive the own-program check. Changing a package’s program while retaining grants can leave an own-program grant without revalidation, requiring a regression case and a settled compatibility policy. | defect |
| `FND-MBR-STR-038` | The registered source scope excludes migration SQL and the external decision register. Declarations, local migration records and integration assertions support the planning description, while complete deployed-trigger and external-decision certification remain outside this pass. | undocumented |

The seven existing product questions also remain open:

| Question | Decision needed |
|---|---|
| `OQ-MBR-STR-001` | How should a merged source appear in current structure? |
| `OQ-MBR-STR-002` | Can an inactive unit reopen under its existing identity? |
| `OQ-MBR-STR-003` | What should happen to stored grace-benefit and competing-holding choices? |
| `OQ-MBR-STR-004` | Should package preparation permit an inactive backing product? |
| `OQ-MBR-STR-005` | Which fixed window should cover a new purchase immediately after closing? |
| `OQ-MBR-STR-006` | Which meaning should an absent reinstatement allowance carry? |
| `OQ-MBR-STR-007` | How much product authority does the final build acceptance provide? |

The examination adds the following evidence limits: the missing brief, partial compound proof in manual suites, additional required proof gaps, retained grants not revalidated when a package changes program, and unreadable migration or external decision sources. Their finding identities were allocated before their statements were added.

## Validation

Dependency installation succeeds. Corpus conformance reports zero errors. The documentation tool test suite passes all four tests. These commands validate artifact structure and checker behavior; they do not execute the Membership service or its manual acceptance suites.

## Verdict for Andrew

The layer is a faithful, sourced planning description of the permitted module at the pinned commits, with unsupported claims narrowed and the remaining evidence limits recorded. Its weakest areas are acceptance proof, absent administration screens and incomplete access to product decisions and deployed database enforcement. Before design begins, Andrew should resolve the material product questions, confirm the proposed rules and obtain the missing scenarios and executable proof for the recorded gaps.
