---
id: ATS-PFM-ELG-007
scope: CAP-PFM-ELG-007
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-007-01
    title: Authorize binding management
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-01
    preconditions: 'Workspace personas, roleless and staff callers and outside customers are available.'
    steps: 'Create, edit and remove bindings as each.'
    expected: Only callers with binding-management authority succeed.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        the bindings routes to a caller without the bindings permission, 403
      - TST-PFM-ELG-411
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0224.spec.ts#ELIG-ACC-0224
      - TST-PFM-ELG-083
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
      the bindings routes to a caller without the bindings permission, 403
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        the bindings routes to a caller without the bindings permission, 403
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        the bindings routes to a caller without the bindings permission, 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-007-02
    title: Reject incompatible purposes
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-02
      - INV-DOM-PFM-ELG-002-04
    preconditions: 'Purposes provide different subjects, facts and provider support.'
    steps: Attempt each expression against each purpose.
    expected: 'Compatible pairs succeed and incompatible pairs name the missing subject, fact or condition.'
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a consumer kind the registry does not have, and writes nothing
      - TST-PFM-ELG-428
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a kind of another application than the binding’s
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a rule that needs a subject the kind does not supply
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a type that cannot run in batch for a population kind
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a function type for a kind that decides in SQL only
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0212.spec.ts#ELIG-ACC-0212
      - TST-PFM-ELG-071
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0213.spec.ts#ELIG-ACC-0213
      - TST-PFM-ELG-072
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
      a consumer kind the registry does not have, and writes nothing
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a consumer kind the registry does not have, and writes nothing
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a consumer kind the registry does not have, and writes nothing
    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-007-03
    title: Validate configured parameter values
    level: unit
    proves:
      - BR-CAP-PFM-ELG-007-03
    preconditions: A rule declares typed parameters and defaults.
    steps: 'Supply unknown, absent-required, mistyped, unsupported-choice and out-of-range values.'
    expected: 'Each invalid parameter is named, and an omitted defaultable value is filled.'
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#refuses a value for a
        parameter the rule does not declare
      - TST-PFM-ELG-468
      - >-
        services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#refuses a required
        parameter left out
      - >-
        services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#accepts a required
        parameter left out when it has a default
      - >-
        services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#refuses a number above
        the declared maximum
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0214.spec.ts#ELIG-ACC-0214
      - TST-PFM-ELG-073
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#refuses a value for a
      parameter the rule does not declare
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#refuses a value for a
        parameter the rule does not declare
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#refuses a value for a
        parameter the rule does not declare
    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-007-04
    title: Reject invalid new pins
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-04
      - INV-DOM-PFM-ELG-002-02
      - INV-DOM-PFM-ELG-002-03
    preconditions: 'A rule has publications, a draft and a retired release.'
    steps: 'Request missing, draft, foreign and retired pins and read an existing pin after retirement.'
    expected: New invalid pins fail while the previously stored pin remains.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a pin of the definition’s draft
      - TST-PFM-ELG-442
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a pin of another definition’s version
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a pinned binding that names no version
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        to move the pin to a retired version
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#keeps
        a pin of a version retired after it was pinned
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0216.spec.ts#ELIG-ACC-0216
      - TST-PFM-ELG-075
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0233.spec.ts#ELIG-ACC-0233
      - TST-PFM-ELG-092
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
      a pin of the definition’s draft
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a pin of the definition’s draft
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a pin of the definition’s draft
    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-007-05
    title: Use declared failure defaults
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-05
    preconditions: A purpose defaults to closed.
    steps: 'Bind without a policy, with each valid policy and with an unsupported one.'
    expected: The default and explicit choices are retained; the unsupported policy fails.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#takes
        the consumer kind’s default fail policy when the request names none
      - TST-PFM-ELG-428
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a fail policy outside the three
      - TST-PFM-ELG-442
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#creates
        the binding with the consumer kind’s default fail policy
      - TST-PFM-ELG-411
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#takes
      the consumer kind’s default fail policy when the request names none
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#takes
        the consumer kind’s default fail policy when the request names none
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#takes
        the consumer kind’s default fail policy when the request names none
    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-007-06
    title: Prevent repeated and obsolete uses
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-06
      - INV-DOM-PFM-ELG-002-01
    preconditions: A consumer has a binding and other rules are deprecated or archived.
    steps: Duplicate the binding and bind the obsolete rules.
    expected: Every request fails without a write.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a second binding of the same consumer to the same definition
      - TST-PFM-ELG-442
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a new binding of a deprecated definition
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a binding of an archived definition, and writes none
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
      a second binding of the same consumer to the same definition
    category: invariant
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a second binding of the same consumer to the same definition
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a second binding of the same consumer to the same definition
    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-007-07
    title: Protect binding updates from stale readers
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-07
      - INV-DOM-PFM-ELG-002-04
    preconditions: Two administrators read one binding version.
    steps: Submit their successive updates.
    expected: The later obsolete update requests a reload and preserves the accepted change.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a change at a version that is no longer current
      - TST-PFM-ELG-428
      - >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a change to parameters the rule does not declare, and leaves the binding as it was
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0219.spec.ts#ELIG-ACC-0219
      - TST-PFM-ELG-078
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
      a change at a version that is no longer current
    category: concurrency
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a change at a version that is no longer current
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a change at a version that is no longer current
    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-007-08
    title: Apply suspension immediately
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-08
      - INV-DOM-PFM-ELG-002-05
    preconditions: A kiosk has a rule binding.
    steps: 'Suspend and evaluate, resume and evaluate, then archive and retry activation.'
    expected: 'Suspension refuses, valid resumption answers and archive prevents further activation.'
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
      - TST-PFM-ELG-076
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        to make a suspended binding of an archived definition active again
      - TST-PFM-ELG-442
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
    category: transition
    action_evidence:
      provenance: test
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
    assertion_evidence:
      provenance: test
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
    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-007-09
    title: Remove plans while preserving history
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-09
      - INV-DOM-PFM-ELG-002-06
    preconditions: A binding has compiled plans and retained answers.
    steps: 'Delete it, inspect history and archive its rule.'
    expected: 'Plans are removed, decisions remain and dependency-free archive succeeds.'
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
        the binding’s plans with it
      - TST-PFM-ELG-442
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#deletes
        the binding and answers its id
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0221.spec.ts#ELIG-ACC-0221
      - TST-PFM-ELG-080
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
      the binding’s plans with it
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
        the binding’s plans with it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
        the binding’s plans with it
    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-007-10
    title: Bound and page binding discovery
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-10
    preconditions: A rule has many consumers across applications.
    steps: 'Read cursor pages and filtered consumer references at 100, 101 and no required filter.'
    expected: 'Pages avoid duplicates, 100 references pass and excessive or unqualified requests fail.'
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#honours
        limit=2 and answers next_cursor
      - TST-PFM-ELG-413
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
        400 naming the limit for more than 100 values, on both routes
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#accepts
        exactly 100 values (the boundary)
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        a list that names neither a definition nor a consumer, 400
      - TST-PFM-ELG-411
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0220.spec.ts#ELIG-ACC-0220
      - TST-PFM-ELG-079
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#honours
      limit=2 and answers next_cursor
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#honours
        limit=2 and answers next_cursor
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#honours
        limit=2 and answers next_cursor
    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-007-11
    title: Use service identity in dispatch
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-11
    preconditions: A registered consumer principal is available.
    steps: 'Create, inspect, edit and delete through dispatch, then try a web caller.'
    expected: Dispatch succeeds as the service and web access is denied.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#registers
        the binding, recorded as made by the service principal
      - TST-PFM-ELG-412
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#changes the
        binding at the version read
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        console caller a service route over HTTP, as a mismatched context
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#refuses a
        principal the registry does not hold
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#registers the
      binding, recorded as made by the service principal
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#registers
        the binding, recorded as made by the service principal
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#registers
        the binding, recorded as made by the service principal
    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-007-12
    title: Revalidate complete plan changes
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-12
    preconditions: A binding has a previously read plan tag.
    steps: 'Request unchanged content, then change a reference, failure policy and portal wording.'
    expected: Unchanged requests return not modified; each relevant change yields a new tag.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
        304 to its own tag while nothing changed (premise of the cases below)
      - TST-PFM-ELG-413
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
        a new tag, 200, when a definition the rule references is published
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
        a new tag, 200, when the binding’s fail policy changes
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
        a new tag, 200, when the definition’s portal message changes
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0222.spec.ts#ELIG-ACC-0222
      - TST-PFM-ELG-081
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
      304 to its own tag while nothing changed (premise of the cases below)
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
        304 to its own tag while nothing changed (premise of the cases below)
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
        304 to its own tag while nothing changed (premise of the cases below)
    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-007-13
    title: Separate staff and service plan detail
    level: api
    proves:
      - BR-CAP-PFM-ELG-007-13
      - INV-DOM-PFM-ELG-002-07
    preconditions: An analyst and consumer service can read the plan.
    steps: Fetch the same SQL-backed plan as both.
    expected: Staff retain tree and hash without queries or templates; the service receives full detail.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#redacts the
        sql, function, cache, batch and explain internals of the plan for a console caller
        (DEF-ELIG-0005)
      - TST-PFM-ELG-412
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers a
        service principal the whole plan, the predicate requests and the registry’s sql included
        (DEF-ELIG-0005)
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0223.spec.ts#ELIG-ACC-0223
      - TST-PFM-ELG-082
      - >-
        react-console:acceptance/eligibility/playwright/journeys/registry/ELIG-ACC-0023.spec.ts#ELIG-ACC-0023
      - TST-PFM-ELG-335
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#redacts the
      sql, function, cache, batch and explain internals of the plan for a console caller
      (DEF-ELIG-0005)
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#redacts the
        sql, function, cache, batch and explain internals of the plan for a console caller
        (DEF-ELIG-0005)
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#redacts the
        sql, function, cache, batch and explain internals of the plan for a console caller
        (DEF-ELIG-0005)
    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-007-14
    title: Promote a product-private expression
    level: browser
    proves:
      - BR-CAP-PFM-ELG-007-14
    preconditions: A product editor can select a shared rule.
    steps: 'Select it, replace it with a private expression and share that expression.'
    expected: >-
      The private expression enters the shared library only on promotion, with no expression stored
      on the product.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0234.spec.ts#ELIG-ACC-0234
      - TST-PFM-ELG-093
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0234.spec.ts#ELIG-ACC-0234
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0234.spec.ts#ELIG-ACC-0234
    assertion_evidence:
      provenance: test
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0234.spec.ts#ELIG-ACC-0234
    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-007-15
    title: Promote private product work without detaching it
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-001-11
      - BR-CAP-PFM-ELG-007-14
    exercises:
      - CAP-PFM-ELG-007
      - CAP-PFM-ELG-001
    preconditions: A product has a private rule and an active use.
    steps: >-
      Share the rule with publication authority and inspect the shared library and the product
      connection.
    expected: The rule appears in the shared library and the product retains the same connection.
    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-definitions.e2e.spec.js#refuses a
      writer without the publish permission the promotion of a private definition, 403;
      react-console:components/eligibility/embeds/eligibility-card.tsx:EligibilityCard
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        a writer without the publish permission the promotion of a private definition, 403;
        react-console:components/eligibility/embeds/eligibility-card.tsx:EligibilityCard
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        a writer without the publish permission the promotion of a private definition, 403;
        react-console:components/eligibility/embeds/eligibility-card.tsx:EligibilityCard
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-007-16
    title: Discover a newly connected consumer
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-002-07
      - BR-CAP-PFM-ELG-007-09
    exercises:
      - CAP-PFM-ELG-007
      - CAP-PFM-ELG-002
    preconditions: A published rule has no uses.
    steps: 'Connect a consumer, inspect usage, remove the use and inspect usage again.'
    expected: >-
      Usage identifies the consumer and its version choice while connected and removes that entry
      after deletion.
    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/governance/usage.integration.spec.js#groups
      the bindings by consumer kind in kind order, each labelled from the registry and counted;
      services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
      the binding’s plans with it
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/usage.integration.spec.js#groups
        the bindings by consumer kind in kind order, each labelled from the registry and counted;
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
        the binding’s plans with it
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/usage.integration.spec.js#groups
        the bindings by consumer kind in kind order, each labelled from the registry and counted;
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
        the binding’s plans with it
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-007-17
    title: Suspend an incompatible follower during release
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-06
      - BR-CAP-PFM-ELG-007-08
    exercises:
      - CAP-PFM-ELG-007
      - CAP-PFM-ELG-004
    preconditions: >-
      A following use is compatible with the current release but not with the proposed draft; a pin
      remains compatible.
    steps: 'Attempt normal publication, force it, inspect both uses and evaluate each.'
    expected: >-
      The refusal precedes any release; the forced release suspends the follower and leaves the pin
      usable.
    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/governance/publish-followers.integration.spec.js#refuses
      the publish as unfit_followers, naming the binding and what its kind does not supply;
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#refuses
        the publish as unfit_followers, naming the binding and what its kind does not supply;
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#refuses
        the publish as unfit_followers, naming the binding and what its kind does not supply;
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-007-18
    title: Keep pins while moving following uses
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-005-05
      - BR-CAP-PFM-ELG-007-04
    exercises:
      - CAP-PFM-ELG-007
      - CAP-PFM-ELG-005
    preconditions: An obsolete rule has one following use and one pinned use; its replacement fits both purposes.
    steps: 'Move uses to the replacement, inspect both connections and evaluate them.'
    expected: >-
      The follower changes rule without a duplicate consumer use; the pin retains its earlier rule
      and expression.
    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/governance/lifecycle.integration.spec.js#lists
      the pinned binding for a person to move, and leaves it on the deprecated definition;
      services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
      a pin of the definition’s draft
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/lifecycle.integration.spec.js#lists
        the pinned binding for a person to move, and leaves it on the deprecated definition;
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a pin of the definition’s draft
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/lifecycle.integration.spec.js#lists
        the pinned binding for a person to move, and leaves it on the deprecated definition;
        services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
        a pin of the definition’s draft
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-007-19
    title: Protect a purpose while a consumer uses it
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-006-04
      - BR-CAP-PFM-ELG-007-02
    exercises:
      - CAP-PFM-ELG-007
      - CAP-PFM-ELG-006
    preconditions: An application purpose has an active consumer connection.
    steps: >-
      Deploy a manifest omitting that purpose, inspect the registry, remove the connection and
      deploy the manifest again.
    expected: >-
      The first deployment fails without partial registry writes; the second can withdraw the unused
      purpose.
    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/registry/register-eligibility-registration.integration.spec.js#refuses
      to withdraw a type a published version of a tenant uses, naming the tenant and the definition,
      and writes nothing;
      services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
      a rule that needs a subject the kind does not supply
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/registry/register-eligibility-registration.integration.spec.js#refuses
        to withdraw a type a published version of a tenant uses, naming the tenant and the
        definition, and writes nothing;
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a rule that needs a subject the kind does not supply
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/registry/register-eligibility-registration.integration.spec.js#refuses
        to withdraw a type a published version of a tenant uses, naming the tenant and the
        definition, and writes nothing;
        services-platform:modules/eligibility/tests/integration/services/bindings/consumer-bindings.integration.spec.js#refuses
        a rule that needs a subject the kind does not supply
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-007-20
    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-007
      - CAP-PFM-ELG-008
    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.
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/bindings.routes.ts, eligibility-service.routes.ts,
    services/bindings/consumer-bindings.ts, binding-fit.ts, lifecycle.ts,
    services/compile/binding-plan.ts, services/persistence/bindings.ts, plans.ts,
    db/eligibility-bindings.table.ts, eligibility-plans.table.ts; rule-level source and test
    references
  - >-
    react-console: components/eligibility/embeds/** (eligibility-card.tsx, private-rule-editor.tsx,
    shared-rule-picker.tsx, use-consumer-binding.ts),
    components/accounting-config/products/product-inert-section.tsx (product-card host);
    acceptance/eligibility/journeys/bindings/*.json.
related_coverage:
  - capability: CAP-PFM-ELG-001
    scenario: ATS-PFM-ELG-007-15
  - capability: CAP-PFM-ELG-002
    scenario: ATS-PFM-ELG-007-16
  - capability: CAP-PFM-ELG-004
    scenario: ATS-PFM-ELG-007-17
  - capability: CAP-PFM-ELG-005
    scenario: ATS-PFM-ELG-007-18
  - capability: CAP-PFM-ELG-006
    scenario: ATS-PFM-ELG-007-19
  - capability: CAP-PFM-ELG-008
    scenario: ATS-PFM-ELG-007-20
coverage:
  rule: covered
  transition: 'gap: FND-PFM-ELG-059'
  validation: covered
  permission: 'gap: FND-PFM-ELG-059'
  edge: 'gap: FND-PFM-ELG-059'
  failure: 'gap: FND-PFM-ELG-059'
  boundary: covered
  concurrency: covered
  invariant: covered
  interaction: covered
invariant_gaps: []
transition_coverage:
  - model: STATE-PFM-ELG-003
    from: active
    to: suspended
    trigger: >-
      Forced publishEligibilityDefinition or republishEligibilityDefinitionVersion with incompatible
      followers
    source: >-
      services-platform:modules/eligibility/services/bindings/consumer-bindings.ts:suspendUnfitBinding
    scenario: ATS-PFM-ELG-004-06
  - model: STATE-PFM-ELG-003
    from: active
    to: suspended
    trigger: updateEligibilityBinding or updateEligibilityBindingForService requesting suspension
    source: 'services-platform:modules/eligibility/services/bindings/consumer-bindings.ts:changeBinding'
    scenario: ATS-PFM-ELG-007-08
  - model: STATE-PFM-ELG-003
    from: suspended
    to: active
    trigger: updateEligibilityBindingForService or updateEligibilityBinding requesting reactivation
    source: 'services-platform:modules/eligibility/lifecycle.ts:bindingCompatibilityRefusal'
    scenario: ATS-PFM-ELG-007-08
  - model: STATE-PFM-ELG-003
    from: active
    to: deleted
    trigger: deleteEligibilityBindingForService or deleteEligibilityBinding
    source: 'services-platform:modules/eligibility/services/bindings/consumer-bindings.ts:unbind'
    scenario: ATS-PFM-ELG-007-09
  - model: STATE-PFM-ELG-003
    from: suspended
    to: deleted
    trigger: deleteEligibilityBindingForService or deleteEligibilityBinding
    finding: FND-PFM-ELG-059
    source: 'services-platform:modules/eligibility/services/bindings/consumer-bindings.ts:unbind'
permission_coverage:
  - key: platform.eligibility-bindings.manage
    finding: FND-PFM-ELG-059
    reason: A capability-level authority scenario does not prove every operation protected by this key.
  - key: platform.eligibility.read
    finding: FND-PFM-ELG-059
    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: >-
    Binding creation and publication lock races, failed consumer dispatch and every active or
    suspended deletion path need complete cases. Product changes can lose their former connection
    after a refused replacement.
---

# Connect a rule to an application decision: 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-007-01` | `ATS-PFM-ELG-007-01` |
| `BR-CAP-PFM-ELG-007-02` | `ATS-PFM-ELG-007-02`, `ATS-PFM-ELG-007-19` |
| `BR-CAP-PFM-ELG-007-03` | `ATS-PFM-ELG-007-03` |
| `BR-CAP-PFM-ELG-007-04` | `ATS-PFM-ELG-007-04`, `ATS-PFM-ELG-007-18` |
| `BR-CAP-PFM-ELG-007-05` | `ATS-PFM-ELG-007-05` |
| `BR-CAP-PFM-ELG-007-06` | `ATS-PFM-ELG-007-06` |
| `BR-CAP-PFM-ELG-007-07` | `ATS-PFM-ELG-007-07` |
| `BR-CAP-PFM-ELG-007-08` | `ATS-PFM-ELG-007-08`, `ATS-PFM-ELG-007-17`, `ATS-PFM-ELG-007-20` |
| `BR-CAP-PFM-ELG-007-09` | `ATS-PFM-ELG-007-09`, `ATS-PFM-ELG-007-16` |
| `BR-CAP-PFM-ELG-007-10` | `ATS-PFM-ELG-007-10` |
| `BR-CAP-PFM-ELG-007-11` | `ATS-PFM-ELG-007-11` |
| `BR-CAP-PFM-ELG-007-12` | `ATS-PFM-ELG-007-12` |
| `BR-CAP-PFM-ELG-007-13` | `ATS-PFM-ELG-007-13` |
| `BR-CAP-PFM-ELG-007-14` | `ATS-PFM-ELG-007-14`, `ATS-PFM-ELG-007-15` |

## Interactions With Related Capabilities

Promote private product work without detaching it. Share the rule with publication authority and inspect the shared library and the product connection.

Discover a newly connected consumer. Connect a consumer, inspect usage, remove the use and inspect usage again.

Suspend an incompatible follower during release. Attempt normal publication, force it, inspect both uses and evaluate each.

Keep pins while moving following uses. Move uses to the replacement, inspect both connections and evaluate them.

Protect a purpose while a consumer uses it. Deploy a manifest omitting that purpose, inspect the registry, remove the connection and deploy the manifest again.

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