---
id: TST-MBR-MEM-039
title: Pure officer reach and field allowance decisions
kind: unit
product_area: membership
module: memberships
revision: 1
status: draft
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
repository: services-membership
files:
  - modules/memberships/tests/unit/unit-scope.spec.ts
implements:
  - ATS-MBR-MEM-015-01
  - ATS-MBR-MEM-015-02
  - ATS-MBR-MEM-015-05
  - ATS-MBR-MEM-015-06
  - ATS-MBR-MEM-016-02
  - ATS-MBR-MEM-016-05
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 1
isolation: Literal fixtures local to each test.
verification_notes: >-
  Bindings describe the assertions reviewed at the pinned commit; the suite is
  not executed by this documentation job.
coverage_gap: null
evidence:
  - 'services-membership:modules/memberships/tests/unit/unit-scope.spec.ts'
assertion_anchors:
  - scenario: ATS-MBR-MEM-015-01
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
      every unit and every chain with ALL
  - scenario: ATS-MBR-MEM-015-01
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#reaches
      nothing with NONE
  - scenario: ATS-MBR-MEM-015-01
    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)
  - scenario: ATS-MBR-MEM-015-01
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#does
      not reach a sibling or a parent of the granted unit
  - scenario: ATS-MBR-MEM-015-02
    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
  - scenario: ATS-MBR-MEM-015-02
    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
  - scenario: ATS-MBR-MEM-015-02
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#ignores
      pending and cancelled terms
  - scenario: ATS-MBR-MEM-015-05
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#leaves
      a member in grace out when the roster rule excludes grace
  - scenario: ATS-MBR-MEM-015-05
    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
  - scenario: ATS-MBR-MEM-015-05
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#drops
      a member whose grace has run out, even with grace included
  - scenario: ATS-MBR-MEM-015-06
    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
  - scenario: ATS-MBR-MEM-016-02
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
      the fields of the role that granted the key for a unit in the chain
  - scenario: ATS-MBR-MEM-016-02
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#unions
      the lists of two roles that reach the membership
  - scenario: ATS-MBR-MEM-016-02
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
      nothing through a unit-scoped role with no list
  - scenario: ATS-MBR-MEM-016-02
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
      every field through a tenant-wide role with no list (staff)
  - scenario: ATS-MBR-MEM-016-02
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
      nothing with no applied grant
  - scenario: ATS-MBR-MEM-016-05
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
      staff an enrolment of no unit
---

# Pure officer reach and field allowance decisions

## Verification Boundary

The suite exercises pure membership decisions against literal inputs and expected outputs.

## What This Suite Proves

The structured bindings identify the capability and feature cases whose reviewed assertions this suite executes. Source anchors preserve the evidence for each binding.

## What It Does Not Prove

A pure-rule pass does not prove persistence, permission enforcement through the API or a complete business lifecycle. Registration records existing code and leaves execution and conformance unverified.

## Real Dependencies and Test Doubles

The decision functions and schemas are real. Literal inputs and checked-in fixtures supply their data; this boundary does not call live owners.

## Must Not Be Doubled

Keep the decision function or schema under test real; replacing its result would remove the proof.
