---
id: ATS-MBR-STR-007
scope: CAP-MBR-STR-007
product_area: membership
module: structure
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-MBR-STR-007-01
    title: Link creation rejects missing relationship information
    level: api
    proves:
      - BR-CAP-MBR-STR-007-01
    preconditions: >-
      An isolated Membership-licensed workspace contains the relevant records, with caller permissions
      selected for the case.
    steps: 'Try an unknown kind, blank organization reference and malformed start date.'
    expected: Each invalid request leaves the link collection unchanged.
    negative: true
    data_needs: The FAA example records or equivalent records prepared within the isolated workspace.
    bound_to:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a
        chapter cannot have
      - TST-MBR-STR-081
    provenance: test
    source: >-
      services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a
      chapter cannot have
    category: validation
  - id: ATS-MBR-STR-007-02
    title: A link cannot end before it begins
    level: api
    proves:
      - BR-CAP-MBR-STR-007-02
    preconditions: >-
      An isolated Membership-licensed workspace contains the relevant records, with caller permissions
      selected for the case.
    steps: Submit a relationship whose end precedes its start.
    expected: The request fails without adding the relationship.
    negative: true
    data_needs: The FAA example records or equivalent records prepared within the isolated workspace.
    bound_to:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a
        chapter cannot have
      - TST-MBR-STR-081
    provenance: test
    source: >-
      services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a
      chapter cannot have
    category: validation
  - id: ATS-MBR-STR-007-03
    title: Legal succession permits one organization at a time
    level: api
    proves:
      - BR-CAP-MBR-STR-007-03
      - AS-JNY-MBR-STR-001-02
      - INV-DOM-MBR-STR-002-04
    preconditions: >-
      An isolated Membership-licensed workspace contains the relevant records, with caller permissions
      selected for the case.
    steps: >-
      Add a legal organization, attempt another open tie, then close the first and begin the successor
      next day.
    expected: The overlapping tie fails and the dated succession succeeds.
    negative: true
    data_needs: The FAA example records or equivalent records prepared within the isolated workspace.
    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 scenario
        11: Atlanta Chapter's incorporation, linked with dates
      - TST-MBR-STR-100
      - TST-MBR-STR-080
    provenance: test
    source: >-
      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
    category: invariant
  - id: ATS-MBR-STR-007-04
    title: Ending permits shortening but not extension
    level: api
    proves:
      - BR-CAP-MBR-STR-007-04
    preconditions: >-
      An isolated Membership-licensed workspace contains the relevant records, with caller permissions
      selected for the case.
    steps: 'End a relationship, shorten that date and attempt a later ending.'
    expected: The first two saves succeed; extension fails and history remains.
    negative: true
    data_needs: The FAA example records or equivalent records prepared within the isolated workspace.
    bound_to:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario
        11: Atlanta Chapter's incorporation, linked with dates
      - TST-MBR-STR-080
    provenance: test
    source: >-
      services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario 11:
      Atlanta Chapter's incorporation, linked with dates
    category: transition
  - id: ATS-MBR-STR-007-05
    title: Customer relationship purposes have readable identity
    level: api
    proves:
      - BR-CAP-MBR-STR-007-06
    preconditions: >-
      An isolated Membership-licensed workspace contains the relevant records, with caller permissions
      selected for the case.
    steps: Create Sponsoring University by name and repeat its creation.
    expected: The first derives a readable reference and the second reports an existing kind.
    negative: true
    data_needs: The FAA example records or equivalent records prepared within the isolated workspace.
    bound_to:
      - >-
        services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process
        › creates a relationship type with an id derived from its name
      - >-
        services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process
        › refuses a relationship type id the tenant has, 409 relationship_type_id_taken
      - TST-MBR-STR-100
    provenance: test
    source: >-
      services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process ›
      creates a relationship type with an id derived from its name
    category: rule
  - id: ATS-MBR-STR-007-06
    title: Relationship versions identify the actor
    level: api
    proves:
      - BR-CAP-MBR-STR-007-09
    preconditions: >-
      An isolated Membership-licensed workspace contains the relevant records, with caller permissions
      selected for the case.
    steps: 'Create a link and subsequently end it, then inspect its retained versions.'
    expected: The versions distinguish creation and ending with actor attribution.
    negative: false
    data_needs: The FAA example records or equivalent records prepared within the isolated workspace.
    bound_to:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030 who
        changed what and when
      - TST-MBR-STR-087
    provenance: test
    source: >-
      services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030 who changed
      what and when
    category: invariant
  - id: ATS-MBR-STR-007-07
    title: Retired relationship purposes still accept links
    category: edge
    level: api
    proves:
      - BR-CAP-MBR-STR-007-07
    preconditions: An isolated workspace contains the records and current versions needed for the case.
    steps: Prepare an inactive relationship purpose and add a dated organization link using it.
    expected: >-
      The link saves and identifies that purpose; there is no rename or retirement request in the exposed
      purpose operations.
    negative: true
    data_needs: Separate fixture records for the accepted and refused operations.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-membership:modules/structure/services/persistence/organizational-unit-relationship-types.ts:createOrganizationalUnitRelationshipType
  - id: ATS-MBR-STR-007-08
    title: Merge retains writable organization context
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-STR-003-07
      - BR-CAP-MBR-STR-007-08
    preconditions: An isolated workspace contains the records and current versions needed for the case.
    steps: >-
      Merge a source with an organization link, read the follow-up result and add another link to the
      merged source.
    expected: Existing links stay on the source and the later link saves without transferring to the survivor.
    negative: false
    data_needs: Separate fixture records for the accepted and refused operations.
    bound_to:
      - TST-MBR-STR-077
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#the link and the
        settings replace both answer 200
    provenance: test
    source:
      - >-
        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:modules/structure/services/persistence/organizational-unit-organizations.ts:linkOrganization
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0018.acceptance.ts#the link and the
        settings replace both answer 200
    exercises:
      - CAP-MBR-STR-007
      - CAP-MBR-STR-003
  - id: ATS-MBR-STR-007-09
    title: Provisioning preserves customer relationship purposes
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-STR-007-06
      - BR-CAP-MBR-STR-020-01
    preconditions: An isolated workspace contains the records and current versions needed for the case.
    steps: 'Provision, add a customer relationship purpose and provision again.'
    expected: The standard purposes remain present once and the customer purpose retains its values.
    negative: false
    data_needs: Separate fixture records for the accepted and refused operations.
    bound_to: []
    provenance: proposed
    source:
      - >-
        services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process
        › creates a relationship type with an id derived from its name
      - >-
        services-membership:modules/structure/tests/integration/services/lifecycle/structure-participant.integration.spec.ts#the
        structure participant in the database › seeds the four relationship types at provisioning
    exercises:
      - CAP-MBR-STR-007
      - CAP-MBR-STR-020
  - id: ATS-MBR-STR-007-10
    title: Workspace authority gates this capability
    category: permission
    level: api
    proves:
      - BR-CAP-MBR-STR-019-01
    preconditions: An isolated workspace contains the records and current versions needed for the case.
    steps: >-
      Exercise the capability’s exposed operations with its read-only and management callers, then repeat
      with application access removed, an unlicensed workspace and an unavailable workspace.
    expected: >-
      Each named operation requires its declared authority; admission failures occur before any record or
      calculated result is exposed.
    negative: true
    data_needs: Separate fixture records for the accepted and refused operations.
    bound_to: []
    provenance: proposed
    source:
      - >-
        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:modules/configuration/aws/api/configuration.routes.ts:configurationModuleRoutes
      - >-
        services-membership:tests/e2e/terms-api.e2e.spec.ts#the terms API, end to end in process ›
        refuses a caller who holds no key in the tenant
    exercises:
      - CAP-MBR-STR-007
      - CAP-MBR-STR-019
evidence:
  - 'services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts'
  - 'services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts'
  - 'services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts'
  - 'services-membership:tests/e2e/structure-api.e2e.spec.ts'
  - >-
    services-membership:modules/structure/services/persistence/organizational-unit-organizations.ts:linkOrganization
  - >-
    services-membership:modules/structure/services/persistence/organizational-unit-organizations.ts:requireDates
  - >-
    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:modules/structure/services/persistence/organizational-unit-organizations.ts:unlinkOrganization
  - 'services-membership:modules/structure/aws/api/structure-requests.ts:linkBody'
  - >-
    services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process ›
    creates a relationship type with an id derived from its name
  - >-
    services-membership:modules/structure/services/persistence/organizational-unit-relationship-types.ts:createOrganizationalUnitRelationshipType
  - 'services-membership:docs/migrations/structure/README.md#Tables and migrations'
  - 'react-console:acceptance/membership/journeys/structure/MBR-ACC-0017.json'
  - >-
    services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a
    chapter cannot have
  - >-
    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/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario 11:
    Atlanta Chapter's incorporation, linked with dates
  - >-
    services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030 who changed
    what and when
  - >-
    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:modules/structure/tests/integration/services/lifecycle/structure-participant.integration.spec.ts#the
    structure participant in the database › seeds the four relationship types at provisioning
  - membership.structure.read
  - membership.structure.manage
  - membership.application.access
  - >-
    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:modules/configuration/aws/api/configuration.routes.ts:configurationModuleRoutes'
  - >-
    services-membership:tests/e2e/terms-api.e2e.spec.ts#the terms API, end to end in process › refuses a
    caller who holds no key in the tenant
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: covered
  edge: covered
  failure: 'gap: FND-MBR-STR-060'
  boundary: 'gap: FND-MBR-STR-060'
  concurrency: 'gap: FND-MBR-STR-060'
  invariant: covered
  interaction: covered
coverage_notes:
  failure: >-
    No dedicated scenario establishes this category across the capability’s declared operations and
    design obligations.
  boundary: >-
    No dedicated scenario establishes this category across the capability’s declared operations and
    design obligations.
  concurrency: >-
    No dedicated scenario establishes this category across the capability’s declared operations and
    design obligations.
unproved_rules: []
coverage_obligations:
  permissions:
    - key: membership.structure.read
      scenario_ids:
        - ATS-MBR-STR-019-01
      local_scenario_ids:
        - ATS-MBR-STR-007-10
      coverage: partial
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
      note: >-
        These cases establish declared authority or representative admission; exhaustive operation and
        caller combinations remain open.
    - key: membership.structure.manage
      scenario_ids:
        - ATS-MBR-STR-019-01
      local_scenario_ids:
        - ATS-MBR-STR-007-10
      coverage: partial
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
      note: >-
        These cases establish declared authority or representative admission; exhaustive operation and
        caller combinations remain open.
    - key: membership.application.access
      scenario_ids:
        - ATS-MBR-STR-019-04
      local_scenario_ids:
        - ATS-MBR-STR-007-10
      coverage: partial
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
      note: >-
        These cases establish declared authority or representative admission; exhaustive operation and
        caller combinations remain open.
  state_models:
    - id: STATE-MBR-STR-003
      transitions:
        - from: open
          to: ended
          trigger: Staff supply the link's last day.
          provenance: unknown
          source: FND-MBR-STR-060
          scenario_ids:
            - ATS-MBR-STR-007-04
          coverage: specified
          gap: null
        - from: ended
          to: ended
          trigger: Staff repeat or shorten the last day.
          provenance: unknown
          source: FND-MBR-STR-060
          scenario_ids:
            - ATS-MBR-STR-007-04
          coverage: specified
          gap: null
      gap: FND-MBR-STR-060
  related:
    - capability: CAP-MBR-STR-003
      scenario: ATS-MBR-STR-007-08
      provenance: proposed
    - capability: CAP-MBR-STR-020
      scenario: ATS-MBR-STR-007-09
      provenance: proposed
  invariants:
    - id: INV-DOM-MBR-STR-002-01
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
    - id: INV-DOM-MBR-STR-002-02
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
    - id: INV-DOM-MBR-STR-002-03
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
    - id: INV-DOM-MBR-STR-002-04
      scenario_ids:
        - ATS-MBR-STR-007-03
      coverage: specified
      gap: null
      provenance: documented
      source:
        - >-
          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
    - id: INV-DOM-MBR-STR-002-05
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
    - id: INV-DOM-MBR-STR-002-06
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
    - id: INV-DOM-MBR-STR-002-07
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
    - id: INV-DOM-MBR-STR-002-08
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
    - id: INV-DOM-MBR-STR-002-09
      scenario_ids: []
      coverage: gap
      gap: FND-MBR-STR-060
      provenance: unknown
      source: FND-MBR-STR-060
  workflows: []
  workflow_interactions: []
rule_coverage:
  - rule: BR-CAP-MBR-STR-007-01
    scenarios:
      - ATS-MBR-STR-007-01
    gap: null
    provenance: documented
    source:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a
        chapter cannot have
  - rule: BR-CAP-MBR-STR-007-02
    scenarios:
      - ATS-MBR-STR-007-02
    gap: null
    provenance: documented
    source:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0022.acceptance.ts#MBR-ACC-0022 links a
        chapter cannot have
  - rule: BR-CAP-MBR-STR-007-03
    scenarios:
      - ATS-MBR-STR-007-03
    gap: null
    provenance: documented
    source:
      - >-
        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
  - rule: BR-CAP-MBR-STR-007-04
    scenarios:
      - ATS-MBR-STR-007-04
    gap: null
    provenance: documented
    source:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0021.acceptance.ts#MBR-ACC-0021 scenario
        11: Atlanta Chapter's incorporation, linked with dates
  - rule: BR-CAP-MBR-STR-007-06
    scenarios:
      - ATS-MBR-STR-007-05
      - ATS-MBR-STR-007-09
    gap: null
    provenance: documented
    source:
      - >-
        services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process
        › creates a relationship type with an id derived from its name
      - >-
        services-membership:tests/e2e/structure-api.e2e.spec.ts#the structure API, end to end in process
        › creates a relationship type with an id derived from its name
      - >-
        services-membership:modules/structure/tests/integration/services/lifecycle/structure-participant.integration.spec.ts#the
        structure participant in the database › seeds the four relationship types at provisioning
  - rule: BR-CAP-MBR-STR-007-07
    scenarios:
      - ATS-MBR-STR-007-07
    gap: null
    provenance: documented
    source:
      - >-
        services-membership:modules/structure/services/persistence/organizational-unit-relationship-types.ts:createOrganizationalUnitRelationshipType
  - rule: BR-CAP-MBR-STR-007-09
    scenarios:
      - ATS-MBR-STR-007-06
    gap: null
    provenance: documented
    source:
      - >-
        services-membership:tests/acceptance/structure/MBR-ACC-0030.acceptance.ts#MBR-ACC-0030 who
        changed what and when
narrative_sources:
  - section: Coverage
    provenance: documented
    source:
      - CAP-MBR-STR-007
      - FND-MBR-STR-060
  - section: Interactions With Related Capabilities
    provenance: proposed
    source:
      - ATS-MBR-STR-007-08
      - ATS-MBR-STR-007-09
---

# Describe a unit’s dated relationships with organizations: Capability Test Specification

## Coverage

The coverage map distinguishes specified examples from missing proof. A covered category means an expected case is specified; executable bindings and their run results remain separate evidence. Each required rule has a proof link or an explicit coverage finding in the structured rule ledger.

| Required Rule | Scenario or Finding |
|---|---|
| `BR-CAP-MBR-STR-007-01` | `ATS-MBR-STR-007-01` |
| `BR-CAP-MBR-STR-007-02` | `ATS-MBR-STR-007-02` |
| `BR-CAP-MBR-STR-007-03` | `ATS-MBR-STR-007-03` |
| `BR-CAP-MBR-STR-007-04` | `ATS-MBR-STR-007-04` |
| `BR-CAP-MBR-STR-007-06` | `ATS-MBR-STR-007-05`, `ATS-MBR-STR-007-09` |
| `BR-CAP-MBR-STR-007-07` | `ATS-MBR-STR-007-07` |
| `BR-CAP-MBR-STR-007-09` | `ATS-MBR-STR-007-06` |

## Interactions With Related Capabilities

Merge retains writable organization context. Merge a source with an organization link, read the follow-up result and add another link to the merged source.

Provisioning preserves customer relationship purposes. Provision, add a customer relationship purpose and provision again.
