---
id: ATS-PFM-ELG-008
scope: CAP-PFM-ELG-008
product_area: platform
module: eligibility
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-PFM-ELG-008-01
    title: Interpret uncertainty per use
    level: unit
    proves:
      - BR-CAP-PFM-ELG-008-01
    preconditions: An expression produces an indeterminate result.
    steps: Evaluate with all three failure policies.
    expected: 'Closed denies, open-with-review admits with a flag and defer supplies no outcome.'
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed
      - TST-PFM-ELG-472
      - >-
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state eligible with review under open_with_review, in either spelling
      - >-
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#gives an
        indeterminate state no outcome under defer
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0285.spec.ts#ELIG-ACC-0285
      - TST-PFM-ELG-141
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0229.spec.ts#ELIG-ACC-0229
      - TST-PFM-ELG-088
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
      indeterminate state ineligible under closed
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-02
    title: Verify subjects before facts
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-02
      - INV-DOM-PFM-ELG-003-05
    preconditions: A fact-only expression is asked about present and absent contacts.
    steps: 'Evaluate ordinarily, transactionally and through SQL.'
    expected: >-
      Absent contacts are indeterminate with not-found reasoning and closed-policy denial; present
      contacts follow the expression.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a contact no row of the tenant has indeterminate, subject_not_found, ineligible under the
        closed policy
      - TST-PFM-ELG-430
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a batch mixing existing and missing contacts each by its own existence
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        the SQL function eligible for an existing contact and subject_not_found for a missing one
      - >-
        services-platform:modules/eligibility/tests/unit/subject-existence.spec.js#answers an
        eligible fold indeterminate, UNKNOWN, subject_not_found when a subject is missing
      - TST-PFM-ELG-490
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0288.spec.ts#ELIG-ACC-0288
      - TST-PFM-ELG-144
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
      a contact no row of the tenant has indeterminate, subject_not_found, ineligible under the
      closed policy
    category: invariant
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a contact no row of the tenant has indeterminate, subject_not_found, ineligible under the
        closed policy
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a contact no row of the tenant has indeterminate, subject_not_found, ineligible under the
        closed policy
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-03
    title: Detect omitted subjects
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-03
    preconditions: A rule requires its primary subject.
    steps: Omit it and send it empty.
    expected: Both yield a missing-subject indeterminate result and closed-policy denial.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#answers
        indeterminate with the reason subject_missing
      - TST-PFM-ELG-431
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#answers
        a slot left out the same
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#lets
        the binding’s closed fail policy decide the outcome
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#answers
      indeterminate with the reason subject_missing
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#answers
        indeterminate with the reason subject_missing
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#answers
        indeterminate with the reason subject_missing
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-04
    title: Convert read failures into results
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-04
    preconditions: One evaluation dataset fails its read.
    steps: Request a batch.
    expected: >-
      Affected entries return read-failure uncertainty under policy and unaffected entries still
      answer.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
        every evaluation indeterminate with the one reason read_failed
      - TST-PFM-ELG-429
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
        the transactional check indeterminate, read_failed, ineligible under the closed policy
      - >-
        services-platform:modules/eligibility/tests/unit/crm-declarations.spec.js#answers each
        evaluation indeterminate with the one reason read_failed
      - TST-PFM-ELG-473
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
      every evaluation indeterminate with the one reason read_failed
    category: failure
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
        every evaluation indeterminate with the one reason read_failed
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
        every evaluation indeterminate with the one reason read_failed
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-05
    title: Treat empty records as unmet conditions
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-05
    preconditions: Contacts have matching and absent addresses.
    steps: Evaluate the country condition.
    expected: The matching record qualifies and the empty address fails with not-satisfied reasoning.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#premise:
        a contact with a US address meets the rule
      - TST-PFM-ELG-431
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#answers
        a contact with no address ineligible, not_satisfied, never fact_missing
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#premise:
      a contact with a US address meets the rule
    category: edge
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#premise:
        a contact with a US address meets the rule
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#premise:
        a contact with a US address meets the rule
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-06
    title: Resolve dates relative to the question
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-06
    preconditions: A currently adult contact was under 18 in the earlier year.
    steps: 'Evaluate today, in the earlier year and around the birthday.'
    expected: The earlier answer differs appropriately and the birthday changes the result on its day.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        an as-of shift from the day asked about, so a contact adult today was not in 2015
      - TST-PFM-ELG-430
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#answers
        35 or older on the 35th birthday and after it, not the day before
      - TST-PFM-ELG-431
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0271.spec.ts#ELIG-ACC-0271
      - TST-PFM-ELG-127
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0272.spec.ts#ELIG-ACC-0272
      - TST-PFM-ELG-128
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
      an as-of shift from the day asked about, so a contact adult today was not in 2015
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        an as-of shift from the day asked about, so a contact adult today was not in 2015
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        an as-of shift from the day asked about, so a contact adult today was not in 2015
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-07
    title: Bound ordered batches
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-07
    preconditions: A directory supplies evaluation subjects.
    steps: 'Request batches of one, two, 50 and 51.'
    expected: Valid results preserve order and the excessive batch is rejected whole.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers the
        batch’s decisions in the order asked
      - TST-PFM-ELG-412
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        batch of more than 50 evaluations, 400
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0286.spec.ts#ELIG-ACC-0286
      - TST-PFM-ELG-142
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers the
      batch’s decisions in the order asked
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers the
        batch’s decisions in the order asked
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers the
        batch’s decisions in the order asked
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-08
    title: Apply caller admission
    level: unit
    proves:
      - BR-CAP-PFM-ELG-008-08
    preconditions: 'Purposes admit portal, console or system contexts.'
    steps: 'Request each as members, staff and services.'
    expected: Admission follows purpose rules with read authority required for staff and services.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        console caller holding the read key a binding whose consumer kind takes system callers only,
        403
      - TST-PFM-ELG-412
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        portal member a binding whose consumer kind takes no portal callers, 403
      - >-
        services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#refuses a
        service caller a kind that declares no system callers
      - TST-PFM-ELG-477
      - >-
        services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#needs the
        engine’s read key for a kind that declares no key of its own
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0226.spec.ts#ELIG-ACC-0226
      - TST-PFM-ELG-085
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
      console caller holding the read key a binding whose consumer kind takes system callers only,
      403
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        console caller holding the read key a binding whose consumer kind takes system callers only,
        403
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        console caller holding the read key a binding whose consumer kind takes system callers only,
        403
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-09
    title: Constrain portal questions
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-09
    preconditions: Members include linked and unlinked accounts.
    steps: 'Ask about self, another subject or actor, stronger consistency and an unlinked account.'
    expected: Only the self display question succeeds and its facts remain asserted.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#fills
        actorContact from the member’s own contact
      - TST-PFM-ELG-412
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        portal member an evaluation of another contact, 403
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        portal member another contact named as the actor, 403
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        portal member an authorization evaluation, 403
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        portal caller whose sign-in is linked to no contact, 403
      - >-
        services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#makes every
        fact asserted, whatever trust it claimed
      - TST-PFM-ELG-477
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0298.spec.ts#ELIG-ACC-0298
      - TST-PFM-ELG-154
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#fills
      actorContact from the member’s own contact
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#fills
        actorContact from the member’s own contact
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#fills
        actorContact from the member’s own contact
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-10
    title: Reject excessive explanation requests
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-10
    preconditions: Portal and staff callers have differing read authority.
    steps: Request all explanation levels.
    expected: >-
      Basic levels are available; administrator and full require read authority and exclude portal,
      with no silent downgrade.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#refuses a
        portal caller the full explanation even with the read permission
      - TST-PFM-ELG-477
      - >-
        services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#refuses a
        console caller without the read permission the admin explanation
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        portal member the admin explanation, 403
      - TST-PFM-ELG-412
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0284.spec.ts#ELIG-ACC-0284
      - TST-PFM-ELG-140
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#refuses a portal
      caller the full explanation even with the read permission
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#refuses a
        portal caller the full explanation even with the read permission
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/evaluate-for-caller.spec.js#refuses a
        portal caller the full explanation even with the read permission
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-11
    title: Explain with permitted labels
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-11
    preconditions: 'Inactive status, a country value and closed-policy uncertainty are represented.'
    steps: 'Request administrator, full and portal explanations.'
    expected: >-
      Status names explain held and required values, full detail includes the country and the
      uncertain portal result uses configured wording.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#gives
        the portal the definition’s message for an indeterminate decision under the closed policy
      - TST-PFM-ELG-430
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#says
        the status an inactive contact holds and the status the rule requires
      - TST-PFM-ELG-431
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/plat-m11-evaluation.integration.spec.js#keeps
        the country out of the portal sentence, which is generic for an address
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0270.spec.ts#ELIG-ACC-0270
      - TST-PFM-ELG-126
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#gives
      the portal the definition’s message for an indeterminate decision under the closed policy
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#gives
        the portal the definition’s message for an indeterminate decision under the closed policy
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#gives
        the portal the definition’s message for an indeterminate decision under the closed policy
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-12
    title: Share transactional visibility
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-12
    preconditions: A contact is inserted inside an open transaction.
    steps: 'Evaluate there and through SQL, then try a person’s transactional web request.'
    expected: >-
      The in-process result sees the row and records atomically, SQL agrees and the web request
      fails.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#sees
        a contact inserted earlier in the same transaction
      - TST-PFM-ELG-430
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#records
        the transactional decision in the caller’s transaction
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        the SQL function’s states the TypeScript path answers for the planted contacts
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        transactional evaluation, naming evaluateInTransaction, 400
      - TST-PFM-ELG-412
      - >-
        react-console:acceptance/eligibility/playwright/journeys/evaluation/ELIG-ACC-0304.spec.ts#ELIG-ACC-0304
      - TST-PFM-ELG-160
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#sees
      a contact inserted earlier in the same transaction
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#sees
        a contact inserted earlier in the same transaction
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#sees
        a contact inserted earlier in the same transaction
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-13
    title: Bound provider work
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-13
    preconditions: A provider declares batching and timeout support.
    steps: 'Evaluate multiple subjects, delay it and cause five failures.'
    expected: >-
      Declared batches apply, timeout produces uncertainty and the open circuit stops further
      provider calls.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#asks
        the provider in batches of its declared size with the batch payload
      - TST-PFM-ELG-430
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a provider past its timeout indeterminate, provider_timeout
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#opens
        the circuit after five failures and calls the provider no more while it is open
      - >-
        react-console:acceptance/eligibility/playwright/journeys/observability/ELIG-ACC-0662.spec.ts#ELIG-ACC-0662
      - TST-PFM-ELG-249
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#asks
      the provider in batches of its declared size with the batch payload
    category: failure
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#asks
        the provider in batches of its declared size with the batch payload
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#asks
        the provider in batches of its declared size with the batch payload
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-14
    title: Prevent data-reader writes
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-14
    preconditions: The eligibility reader has reporting access.
    steps: Evaluate without a direct CRM grant and attempt contact mutation as the reader.
    expected: Reporting access supplies evaluation data and every mutation is rejected.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#is
        a member of the query reader that inherits its privileges
      - TST-PFM-ELG-430
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a sql condition over crm.contacts with no grant to the eligibility reader in crm
      - >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#cannot
        insert into, update or delete from crm.contacts
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#is
      a member of the query reader that inherits its privileges
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#is
        a member of the query reader that inherits its privileges
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#is
        a member of the query reader that inherits its privileges
    binding_scope: >-
      The cited tests contribute their reachable assertions; the binding does not establish
      execution or every step of this scenario.
    binding_limitations:
      - FND-PFM-ELG-074
  - id: ATS-PFM-ELG-008-15
    title: Compare trial and consumer answers
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-003-01
      - BR-CAP-PFM-ELG-008-01
    exercises:
      - CAP-PFM-ELG-008
      - CAP-PFM-ELG-003
    preconditions: One valid expression and subject are available to a reader and a consumer.
    steps: Try the expression and evaluate a binding to that expression with the same subject and day.
    expected: >-
      The condition states agree; only the bound request is eligible for recording and uncertainty
      policy.
    negative: false
    data_needs: Run-owned records and a controlled clock where timing changes the result.
    bound_to: []
    provenance: proposed
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers the
      version’s decision with the trace, never recorded;
      services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
      indeterminate state ineligible under closed
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers the
        version’s decision with the trace, never recorded;
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers the
        version’s decision with the trace, never recorded;
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-008-16
    title: Apply availability before uncertainty policy
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-08
      - BR-CAP-PFM-ELG-008-01
    exercises:
      - CAP-PFM-ELG-008
      - CAP-PFM-ELG-007
    preconditions: A valid following use has a cached answer.
    steps: >-
      Suspend the use, attempt evaluation under each failure policy, then reactivate compatibly and
      evaluate again.
    expected: >-
      Suspension produces a refusal rather than an ineligible answer; compatible reactivation
      permits evaluation.
    negative: true
    data_needs: Run-owned records and a controlled clock where timing changes the result.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217;
      services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
      indeterminate state ineligible under closed
    action_evidence:
      provenance: proposed
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217;
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed
    assertion_evidence:
      provenance: proposed
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217;
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-008-17
    title: Record a consequential uncertain answer
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-02
      - BR-CAP-PFM-ELG-009-07
    exercises:
      - CAP-PFM-ELG-008
      - CAP-PFM-ELG-009
    preconditions: A bound authorization request has a missing workspace subject.
    steps: >-
      Evaluate under closed policy and inspect the returned decision and history before completing
      the caller operation.
    expected: >-
      The returned decision can be read immediately with its uncertain state, denial outcome and
      subject reason.
    negative: false
    data_needs: Run-owned records and a controlled clock where timing changes the result.
    bound_to: []
    provenance: proposed
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
      a contact no row of the tenant has indeterminate, subject_not_found, ineligible under the
      closed policy;
      services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#records
      a display decision after answering it, at a sample rate of one
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a contact no row of the tenant has indeterminate, subject_not_found, ineligible under the
        closed policy;
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#records
        a display decision after answering it, at a sample rate of one
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#answers
        a contact no row of the tenant has indeterminate, subject_not_found, ineligible under the
        closed policy;
        services-platform:modules/eligibility/tests/integration/services/evaluate/hosted-evaluate.integration.spec.js#records
        a display decision after answering it, at a sample rate of one
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-008-18
    title: Keep display caching separate from authority
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-01
      - BR-CAP-PFM-ELG-010-01
    exercises:
      - CAP-PFM-ELG-008
      - CAP-PFM-ELG-010
    preconditions: A display answer is cached before its subject changes.
    steps: >-
      Evaluate display and authorization requests before the cache expires, then repeat after
      expiry.
    expected: >-
      Authorization reads the changed data immediately and display refreshes at expiry; cache hits
      add no decision.
    negative: false
    data_needs: Run-owned records and a controlled clock where timing changes the result.
    bound_to: []
    provenance: proposed
    source: >-
      services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
      indeterminate state ineligible under closed;
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#never answers
      an authorization evaluation from the cache
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed;
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#never
        answers an authorization evaluation from the cache
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/unit/compile-and-evaluate.spec.js#makes an
        indeterminate state ineligible under closed;
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#never
        answers an authorization evaluation from the cache
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-008-19
    title: Observe read failure and circuit refusal
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-008-04
      - BR-CAP-PFM-ELG-012-02
    exercises:
      - CAP-PFM-ELG-008
      - CAP-PFM-ELG-012
    preconditions: A batch has a failing provider entry and a healthy entry.
    steps: >-
      Evaluate the batch repeatedly through the circuit threshold and inspect results and
      diagnostics.
    expected: >-
      The failing entry is uncertain, the healthy entry remains answered and circuit diagnostics
      contain no fact payload.
    negative: true
    data_needs: Run-owned records and a controlled clock where timing changes the result.
    bound_to: []
    provenance: proposed
    source: >-
      services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
      every evaluation indeterminate with the one reason read_failed;
      services-platform:modules/eligibility/tests/unit/alarm-inputs.spec.ts#reads the circuit
      refusals under both services that evaluate: the API function’s and the population task’s
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
        every evaluation indeterminate with the one reason read_failed;
        services-platform:modules/eligibility/tests/unit/alarm-inputs.spec.ts#reads the circuit
        refusals under both services that evaluate: the API function’s and the population task’s
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/evaluate/crm-conditions.integration.spec.js#answers
        every evaluation indeterminate with the one reason read_failed;
        services-platform:modules/eligibility/tests/unit/alarm-inputs.spec.ts#reads the circuit
        refusals under both services that evaluate: the API function’s and the population task’s
    binding_scope: This sequence is proposed and has no executable proof binding.
evidence:
  - >-
    services-platform: docs/eligibility.md; docs/milestones/PLAT-M11-eligibility-rules.md,
    PLAT-M12-eligibility-who-qualifies.md, PLAT-M13-eligibility-roles-and-permissions.md,
    plans/PLAT-M11-plan.md; docs/proposals/eligibility/17-decision-register.md;
    modules/eligibility/aws/api/evaluate.routes.ts, eligibility-service.routes.ts,
    services/evaluate/** (hosted-evaluate.ts, pipeline.ts, subjects.ts, subject-existence.ts,
    failed-reads.ts, policy.ts, providers.ts, circuit-breaker.ts, in-process.ts, in-transaction.ts,
    evaluate-for-caller.ts, explain-sentences.ts, explanation-names.ts), services/compile/**;
    migration 20261018010635_eligibility_check; rule-level source and test references
  - >-
    react-console: acceptance/eligibility/journeys/evaluation/*.json and matching browser
    specifications; acceptance/eligibility/inventory/capabilities.json (area EVL).
related_coverage:
  - capability: CAP-PFM-ELG-003
    scenario: ATS-PFM-ELG-008-15
  - capability: CAP-PFM-ELG-007
    scenario: ATS-PFM-ELG-008-16
  - capability: CAP-PFM-ELG-009
    scenario: ATS-PFM-ELG-008-17
  - capability: CAP-PFM-ELG-010
    scenario: ATS-PFM-ELG-008-18
  - capability: CAP-PFM-ELG-012
    scenario: ATS-PFM-ELG-008-19
coverage:
  rule: covered
  transition: 'gap: FND-PFM-ELG-060'
  validation: covered
  permission: 'gap: FND-PFM-ELG-060'
  edge: covered
  failure: covered
  boundary: covered
  concurrency: 'gap: FND-PFM-ELG-060'
  invariant: 'gap: FND-PFM-ELG-060'
  interaction: covered
invariant_gaps: []
transition_coverage: []
permission_coverage:
  - key: platform.eligibility.read
    finding: FND-PFM-ELG-060
    reason: A capability-level authority scenario does not prove every operation protected by this key.
  - key: platform.security-self.read
    finding: FND-PFM-ELG-060
    reason: A capability-level authority scenario does not prove every operation protected by this key.
coverage_notes:
  meaning: >-
    Covered means a detailed scenario exists; it does not mean the scenario ran or every executable
    assertion conforms.
  gaps: >-
    The hosted evaluator lacks a complete cache, history and diagnostic failure chain. The cold
    transactional dataset cache and SQL-only history path limit equivalence with in-process
    evaluation.
---

# Determine eligibility with an explanation: Capability Test Specification

## Coverage

The scenarios check observable outcomes against the cited contracts. The coverage map retains partial proof and unresolved design boundaries as findings.

| Required Rule | Scenarios |
|---|---|
| `BR-CAP-PFM-ELG-008-01` | `ATS-PFM-ELG-008-01`, `ATS-PFM-ELG-008-15`, `ATS-PFM-ELG-008-16`, `ATS-PFM-ELG-008-18` |
| `BR-CAP-PFM-ELG-008-02` | `ATS-PFM-ELG-008-02`, `ATS-PFM-ELG-008-17` |
| `BR-CAP-PFM-ELG-008-03` | `ATS-PFM-ELG-008-03` |
| `BR-CAP-PFM-ELG-008-04` | `ATS-PFM-ELG-008-04`, `ATS-PFM-ELG-008-19` |
| `BR-CAP-PFM-ELG-008-05` | `ATS-PFM-ELG-008-05` |
| `BR-CAP-PFM-ELG-008-06` | `ATS-PFM-ELG-008-06` |
| `BR-CAP-PFM-ELG-008-07` | `ATS-PFM-ELG-008-07` |
| `BR-CAP-PFM-ELG-008-08` | `ATS-PFM-ELG-008-08` |
| `BR-CAP-PFM-ELG-008-09` | `ATS-PFM-ELG-008-09` |
| `BR-CAP-PFM-ELG-008-10` | `ATS-PFM-ELG-008-10` |
| `BR-CAP-PFM-ELG-008-11` | `ATS-PFM-ELG-008-11` |
| `BR-CAP-PFM-ELG-008-12` | `ATS-PFM-ELG-008-12` |
| `BR-CAP-PFM-ELG-008-13` | `ATS-PFM-ELG-008-13` |
| `BR-CAP-PFM-ELG-008-14` | `ATS-PFM-ELG-008-14` |

## Interactions With Related Capabilities

Compare trial and consumer answers. Try the expression and evaluate a binding to that expression with the same subject and day.

Apply availability before uncertainty policy. Suspend the use, attempt evaluation under each failure policy, then reactivate compatibly and evaluate again.

Record a consequential uncertain answer. Evaluate under closed policy and inspect the returned decision and history before completing the caller operation.

Keep display caching separate from authority. Evaluate display and authorization requests before the cache expires, then repeat after expiry.

Observe read failure and circuit refusal. Evaluate the batch repeatedly through the circuit threshold and inspect results and diagnostics.
