---
id: ATS-MBR-MEM-015
scope: CAP-MBR-MEM-015
product_area: membership
module: memberships
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-MBR-MEM-015-01
    title: 'A grant reaches its unit and the units below, never a sibling or parent'
    level: unit
    proves:
      - BR-CAP-MBR-MEM-015-01
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: 'Evaluate what ALL, NONE, a region grant and a chapter grant reach.'
        expect: >-
          ALL every unit, NONE nothing, a region its chapters, a chapter neither
          its sibling nor its parent.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
            every unit and every chain with ALL
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
            nothing with NONE
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
            a unit below a granted one through the closure (a region officer, a
            chapter)
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#does
            not reach a sibling or a parent of the granted unit
    expected: >-
      ALL every unit, NONE nothing, a region its chapters, a chapter neither its
      sibling nor its parent.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-039
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
      every unit and every chain with ALL
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
          every unit and every chain with ALL
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
          nothing with NONE
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
          a unit below a granted one through the closure (a region officer, a
          chapter)
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#does
          not reach a sibling or a parent of the granted unit
  - id: ATS-MBR-MEM-015-02
    title: A membership's units on a date come from its ties and identity in force
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-02
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Compute the chain for affiliation-only, identity-only, both,
          transferred, pending and cancelled cases on three dates; compare the
          database with the rule.
        expect: >-
          The database and the rule agree for every membership; pending and
          cancelled terms add nothing.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#agrees
            with the in-memory rule for every membership, on three dates, with
            grace on and off
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#holds
            an affiliation’s unit and its ancestors on a day its term covers
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#follows
            a transfer by date: as of 2027-02-01 the new unit, as of 2026-10-15
            the old one
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#ignores
            pending and cancelled terms
    expected: >-
      The database and the rule agree for every membership; pending and
      cancelled terms add nothing.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-039
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#agrees
      with the in-memory rule for every membership, on three dates, with grace
      on and off
    category: rule
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#agrees
          with the in-memory rule for every membership, on three dates, with
          grace on and off
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#holds
          an affiliation’s unit and its ancestors on a day its term covers
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#follows
          a transfer by date: as of 2027-02-01 the new unit, as of 2026-10-15
          the old one
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#ignores
          pending and cancelled terms
  - id: ATS-MBR-MEM-015-03
    title: Officers' lists are complete pages of their own members
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-03
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          List as ALL, Eastern, Atlanta, Western and NONE, whole and a page at a
          time.
        expect: 'Each set''s members exactly, the same however paged.'
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#lists
            exactly the memberships IN{eastern} reaches, the same in one page
            and a page at a time
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#lists
            exactly the memberships IN{atl} reaches, the same in one page and a
            page at a time
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#fills
            every page from the memberships in scope (the predicate is in the
            WHERE, not after the LIMIT)
          - >-
            services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#lists
            the Eastern members for Dana: Jo, and not Sam
    expected: 'Each set''s members exactly, the same however paged.'
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-250
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#lists
      exactly the memberships IN{eastern} reaches, the same in one page and a
      page at a time
    category: boundary
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#lists
          exactly the memberships IN{eastern} reaches, the same in one page and
          a page at a time
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#lists
          exactly the memberships IN{atl} reaches, the same in one page and a
          page at a time
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#fills
          every page from the memberships in scope (the predicate is in the
          WHERE, not after the LIMIT)
      - suite: TST-MBR-MEM-250
        source: >-
          services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#lists
          the Eastern members for Dana: Jo, and not Sam
  - id: ATS-MBR-MEM-015-04
    title: Out-of-scope members are not found; visible members mark each tie
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-04
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: The Atlanta officer reads Jo and Sam; the Eastern officer reads Jo.
        expect: >-
          Atlanta sees Jo with Savannah out of scope and does not find Sam;
          Eastern sees both ties in scope.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#reads
            Jo for the Atlanta officer, the Savannah affiliation marked out of
            scope
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#marks
            both of Jo’s affiliations in scope for the Eastern officer
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            the Atlanta officer Sam as not found
          - >-
            services-membership:tests/e2e/s08-cross-chapter-restrictions.e2e.spec.ts#reads
            Jo, the Savannah affiliation shown and marked out of scope
    expected: >-
      Atlanta sees Jo with Savannah out of scope and does not find Sam; Eastern
      sees both ties in scope.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-251
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#reads
      Jo for the Atlanta officer, the Savannah affiliation marked out of scope
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#reads
          Jo for the Atlanta officer, the Savannah affiliation marked out of
          scope
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#marks
          both of Jo’s affiliations in scope for the Eastern officer
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          the Atlanta officer Sam as not found
      - suite: TST-MBR-MEM-251
        source: >-
          services-membership:tests/e2e/s08-cross-chapter-restrictions.e2e.spec.ts#reads
          Jo, the Savannah affiliation shown and marked out of scope
  - id: ATS-MBR-MEM-015-05
    title: Members in grace stay in scope only when the workspace says so
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-05
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Read Gil, in grace, with the roster rule off and on, and after grace
          ends.
        expect: >-
          Out with the rule off; in, in his term's last-day units, with it on;
          out once grace ends.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#leaves
            a member in grace out when the roster rule excludes grace
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#keeps
            a member in grace, in the units of the term’s last day, when the
            roster rule includes grace
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#drops
            a member whose grace has run out, even with grace included
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#adds
            Gil to the Atlanta officer’s list when the roster rule includes
            grace
    expected: >-
      Out with the rule off; in, in his term's last-day units, with it on; out
      once grace ends.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-039
      - TST-MBR-MEM-031
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#leaves
      a member in grace out when the roster rule excludes grace
    category: boundary
    binding_evidence:
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#leaves
          a member in grace out when the roster rule excludes grace
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#keeps
          a member in grace, in the units of the term’s last day, when the
          roster rule includes grace
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#drops
          a member whose grace has run out, even with grace included
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#adds
          Gil to the Atlanta officer’s list when the roster rule includes grace
  - id: ATS-MBR-MEM-015-06
    title: 'Each tie change checks its own units, visibility first'
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-07
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          The Atlanta officer ends Jo's Savannah row, transfers Atlanta to San
          Francisco, makes Atlanta primary over Savannah, and ends a row of a
          member not yet in force.
        expect: >-
          The first three requests are refused for the inaccessible units; the
          not-yet-visible member is not found before version checking. Staff
          bypass officer reach but remain subject to version and affiliation
          checks.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            the Atlanta officer ending Jo’s Savannah row, out_of_scope naming
            Savannah
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            the Atlanta officer a transfer of the Atlanta row to San Francisco,
            naming San Francisco
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            set_primary of the Atlanta row while the Savannah row would lose the
            flag
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            the Atlanta officer ending the Atlanta row as not found, and leaves
            the row
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#answers
            not_found, not allowed, for a membership whose chain the set does
            not reach although the set holds the named unit
    expected: >-
      The first three requests are refused for the inaccessible units; the
      not-yet-visible member is not found before version checking. Staff bypass
      officer reach but remain subject to version and affiliation checks.
    negative: true
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-039
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
      the Atlanta officer ending Jo’s Savannah row, out_of_scope naming Savannah
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          the Atlanta officer ending Jo’s Savannah row, out_of_scope naming
          Savannah
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          the Atlanta officer a transfer of the Atlanta row to San Francisco,
          naming San Francisco
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          set_primary of the Atlanta row while the Savannah row would lose the
          flag
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          the Atlanta officer ending the Atlanta row as not found, and leaves
          the row
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#answers
          not_found, not allowed, for a membership whose chain the set does not
          reach although the set holds the named unit
  - id: ATS-MBR-MEM-015-07
    title: No officer reaches a workspace-level operation
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-08
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          An officer with broad unit grants terminates, creates, suspends,
          sweeps and configures.
        expect: Each is refused before it is handled.
        provenance: test
        source:
          - >-
            services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#does
            not reach a staff operation: terminating Jo’s term is refused before
            the handler
          - >-
            services-membership:tests/e2e/s08-cross-chapter-restrictions.e2e.spec.ts#refuses
            the tenant-level cancel (terminate) of Jo’s term 403 before the
            handler
          - >-
            services-membership:tests/acceptance/security/MBR-ACC-0473.acceptance.ts#MBR-ACC-0473
    expected: Each is refused before it is handled.
    negative: true
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-250
      - TST-MBR-MEM-251
      - TST-MBR-MEM-233
    provenance: test
    source: >-
      services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#does not
      reach a staff operation: terminating Jo’s term is refused before the
      handler
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-250
        source: >-
          services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#does
          not reach a staff operation: terminating Jo’s term is refused before
          the handler
      - suite: TST-MBR-MEM-251
        source: >-
          services-membership:tests/e2e/s08-cross-chapter-restrictions.e2e.spec.ts#refuses
          the tenant-level cancel (terminate) of Jo’s term 403 before the
          handler
      - suite: TST-MBR-MEM-233
        source: >-
          services-membership:tests/acceptance/security/MBR-ACC-0473.acceptance.ts#MBR-ACC-0473
  - id: ATS-MBR-MEM-015-08
    title: 'Scope settings are replaced whole at the version read, within their bound'
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-09
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Replace the settings, collide two administrators, and send an
          oversized document.
        expect: >-
          The first applies, the stale one is refused, the oversized one is
          refused naming the bound.
        provenance: proposed
        source: >-
          services-membership:tests/e2e/database-refusals.e2e.spec.ts#refuses
          100 roles of 50 hundred-character fields 400 naming the 32768-byte
          bound, and saves nothing
    expected: >-
      The first applies, the stale one is refused, the oversized one is refused
      naming the bound.
    negative: true
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to: []
    provenance: proposed
    source: >-
      services-membership:tests/e2e/database-refusals.e2e.spec.ts#refuses 100
      roles of 50 hundred-character fields 400 naming the 32768-byte bound, and
      saves nothing
    category: validation
    binding_gap: FND-MBR-MEM-103
  - id: ATS-MBR-MEM-015-09
    title: Authority starts and ends with the appointment
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-10
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Read the roster during an appointment's grace, after it ends, and as
          the successor before and after their start.
        expect: 'Answered, refused, refused, answered.'
        provenance: test
        source:
          - >-
            services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#answers
            Lee’s roster while the assignment is within its grace
          - >-
            services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#refuses
            Lee’s roster once the exclusive valid_until has passed
          - >-
            services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#refuses
            the successor before the assignment’s valid_from
          - >-
            services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#answers
            the successor from the assignment’s valid_from, with no end yet
    expected: 'Answered, refused, refused, answered.'
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-255
    provenance: test
    source: >-
      services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#answers
      Lee’s roster while the assignment is within its grace
    category: boundary
    binding_evidence:
      - suite: TST-MBR-MEM-255
        source: >-
          services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#answers
          Lee’s roster while the assignment is within its grace
      - suite: TST-MBR-MEM-255
        source: >-
          services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#refuses
          Lee’s roster once the exclusive valid_until has passed
      - suite: TST-MBR-MEM-255
        source: >-
          services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#refuses
          the successor before the assignment’s valid_from
      - suite: TST-MBR-MEM-255
        source: >-
          services-membership:tests/e2e/s12-expiring-appointment.e2e.spec.ts#answers
          the successor from the assignment’s valid_from, with no end yet
  - id: ATS-MBR-MEM-015-10
    title: Apply grace scope on the resolved membership date
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-005-01
      - BR-CAP-MBR-MEM-015-05
    interacts_with:
      - CAP-MBR-MEM-005
    workflows: []
    relies_on:
      - ATS-MBR-MEM-005-01
      - ATS-MBR-MEM-015-05
    preconditions: An officer reaches a chapter whose member has just expired.
    steps:
      - do: >-
          Read and list the member with grace scope disabled and enabled, then
          move beyond the grace end.
        expect: >-
          Enabled grace includes the member during grace; the member leaves that
          reach after grace ends.
        provenance: proposed
        source: &ref_0
          - >-
            services-membership:modules/memberships/tests/integration/db/membership-functions.integration.spec.ts#answers
            Sam grace, lapsed, then active across the lapse and rejoin (scenario
            4)
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#leaves
            a member in grace out when the roster rule excludes grace
    expected: >-
      Enabled grace includes the member during grace; the member leaves that
      reach after grace ends.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_0
  - id: ATS-MBR-MEM-015-11
    title: Check every affected chapter before a primary change
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-007-09
      - BR-CAP-MBR-MEM-015-07
    interacts_with:
      - CAP-MBR-MEM-007
    workflows:
      - WF-MBR-MEM-009
    relies_on:
      - ATS-MBR-MEM-007-09
      - ATS-MBR-MEM-015-06
    preconditions: An officer reaches only one of a member’s two chapters.
    steps:
      - do: >-
          Try to make that chapter primary when the other would lose its flag,
          then repeat as an officer reaching both.
        expect: >-
          The first request changes neither row; the second can change the
          primary designation.
        provenance: proposed
        source: &ref_1
          - >-
            services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#makes
            an affiliation the primary of its type and the other one no longer
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            the Atlanta officer ending Jo’s Savannah row, out_of_scope naming
            Savannah
    expected: >-
      The first request changes neither row; the second can change the primary
      designation.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_1
  - id: ATS-MBR-MEM-015-12
    title: Change officer visibility through the surviving unit
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-008-08
      - BR-CAP-MBR-MEM-015-04
    interacts_with:
      - CAP-MBR-MEM-008
    workflows:
      - WF-MBR-MEM-009
    relies_on:
      - ATS-MBR-MEM-008-08
      - ATS-MBR-MEM-015-04
    preconditions: The surviving chapter officer cannot read a source-chapter member.
    steps:
      - do: >-
          Merge the source chapter into the survivor, then read the moved member
          and list both chapters.
        expect: >-
          The surviving officer can read the moved member and the current
          survivor roster includes that member.
        provenance: proposed
        source: &ref_2
          - >-
            services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#shows Alex
            Jo and not Pat before the merge
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#reads
            Jo for the Atlanta officer, the Savannah affiliation marked out of
            scope
    expected: >-
      The surviving officer can read the moved member and the current survivor
      roster includes that member.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_2
  - id: ATS-MBR-MEM-015-13
    title: Use the same reach for reading and updating a member
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-04
      - BR-CAP-MBR-MEM-016-01
    interacts_with:
      - CAP-MBR-MEM-016
    workflows: []
    relies_on:
      - ATS-MBR-MEM-015-04
      - ATS-MBR-MEM-016-01
    preconditions: >-
      An officer can read one member but cannot reach a sibling chapter’s
      member.
    steps:
      - do: >-
          Read both, then request allowed contact changes for both through the
          recording CRM port.
        expect: >-
          Only the reachable member’s allowed change reaches CRM; the other
          reads and updates as not found.
        provenance: proposed
        source: &ref_3
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#reads
            Jo for the Atlanta officer, the Savannah affiliation marked out of
            scope
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            a field outside the list, field_not_allowed naming it, and sends
            nothing
    expected: >-
      Only the reachable member’s allowed change reaches CRM; the other reads
      and updates as not found.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_3
  - id: ATS-MBR-MEM-015-14
    title: Capture export inclusion from officer reach
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-03
      - BR-CAP-MBR-MEM-017-01
    interacts_with:
      - CAP-MBR-MEM-017
    workflows:
      - WF-MBR-MEM-023
    relies_on:
      - ATS-MBR-MEM-015-03
      - ATS-MBR-MEM-017-01
    preconditions: An officer reaches a chapter containing a multi-chapter member.
    steps:
      - do: >-
          List the officer’s roster, request its export, then withdraw the
          officer’s appointment before generation.
        expect: >-
          The export retains the originally captured membership set and adds no
          member outside that set.
        provenance: proposed
        source: &ref_4
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#lists
            exactly the memberships IN{eastern} reaches, the same in one page
            and a page at a time
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
            the ids the requester’s set reaches at request time
    expected: >-
      The export retains the originally captured membership set and adds no
      member outside that set.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_4
evidence:
  - >-
    services-membership at 5994c270e8a37a30f848e99ba5b5ee6b87c08893: the
    capability sources and the bound test files.
  - >-
    rhythm-v2-docs:specs/membership/memberships/design/: domain objects, state
    models and workflows reviewed for coverage.
coverage:
  rule: 'gap: FND-MBR-MEM-097'
  transition: 'gap: FND-MBR-MEM-097'
  validation: covered
  permission: 'gap: FND-MBR-MEM-097'
  edge: 'gap: FND-MBR-MEM-097'
  failure: 'gap: FND-MBR-MEM-097'
  boundary: covered
  concurrency: 'gap: FND-MBR-MEM-097'
  invariant: 'gap: FND-MBR-MEM-097'
  interaction: covered
coverage_notes:
  transition: >-
    The scenarios do not enumerate every applicable object transition; the
    finding preserves the remaining transition matrix.
  permission: >-
    The finding records named permissions without a complete positive and
    negative proof.
  invariant: >-
    Existing invariant examples do not cover every applicable domain-object
    constraint.
  interaction: >-
    Every related capability and each cross-capability workflow has an explicit
    composite scenario. Unbound composites remain proposed.
---

# Give officers their own units' members and nothing else: Capability Test Specification

## Coverage

| Rule | Scenario or Finding |
|---|---|
| `BR-CAP-MBR-MEM-015-01` | `ATS-MBR-MEM-015-01` |
| `BR-CAP-MBR-MEM-015-02` | `ATS-MBR-MEM-015-02` |
| `BR-CAP-MBR-MEM-015-03` | `ATS-MBR-MEM-015-03`, `ATS-MBR-MEM-015-14` |
| `BR-CAP-MBR-MEM-015-04` | `ATS-MBR-MEM-015-04`, `ATS-MBR-MEM-015-12`, `ATS-MBR-MEM-015-13` |
| `BR-CAP-MBR-MEM-015-05` | `ATS-MBR-MEM-015-05`, `ATS-MBR-MEM-015-10` |
| `BR-CAP-MBR-MEM-015-06` | no scenario: `FND-MBR-MEM-051` |
| `BR-CAP-MBR-MEM-015-07` | `ATS-MBR-MEM-015-06`, `ATS-MBR-MEM-015-11` |
| `BR-CAP-MBR-MEM-015-08` | `ATS-MBR-MEM-015-07` |
| `BR-CAP-MBR-MEM-015-09` | `ATS-MBR-MEM-015-08` |
| `BR-CAP-MBR-MEM-015-10` | `ATS-MBR-MEM-015-09` |
| `BR-CAP-MBR-MEM-015-11` | no scenario: `FND-MBR-MEM-052` |

## Interactions With Related Capabilities

The interaction cases test how a shared holding, period, chapter connection or recorded change affects related work. Each case names its related capabilities and workflows in frontmatter. A composite case remains proposed until executable assertions establish every part of its expected outcome.
