---
id: CAP-PFM-ELG-007
title: Connect a rule to an application decision
feature: FEAT-PFM-ELG-02
product_area: platform
module: eligibility
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CAP-ELIG-BND-001
  - CAP-ELIG-BND-002
  - CAP-ELIG-BND-003
  - CAP-ELIG-BND-004
  - CAP-ELIG-BND-005
  - CAP-ELIG-BND-006
  - CAP-ELIG-BND-007
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-platform:docs/milestones/plans/PLAT-M11-plan.md#1. Objective'
  - 'services-platform:docs/milestones/plans/PLAT-M11-plan.md#D4'
  - 'services-platform:docs/milestones/plans/PLAT-M11-plan.md#D6'
  - 'services-platform:docs/milestones/plans/PLAT-M11-plan.md#D7'
  - 'services-platform:docs/proposals/eligibility/17-decision-register.md#D-08'
purpose: >-
  A rule use connects a reusable expression to a concrete decision.
  Compatibility checks help applications avoid questions they cannot answer.
outcomes:
  - >-
    Consumer records retain their selected expression, inputs and uncertainty
    policy.
  - Compatibility checks prevent creating a use that cannot evaluate.
concepts:
  - CON-PFM-ELG-002
actors:
  - ACT-PFM-023
  - ACT-PFM-024
surfaces:
  - console
  - api
preconditions: []
postconditions: []
permissions:
  - key: platform.eligibility-bindings.manage
    where_checked: api
    scope: tenant
  - key: platform.eligibility.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-ELG-007-01
    proved_by: [ATS-PFM-ELG-007-01, TST-PFM-ELG-083, TST-PFM-ELG-411]
    statement: >-
      Platform’s console binding routes require binding-management authority and
      do not separately verify permission to edit the referenced consumer
      record.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: observed
    source: >-
      services-platform:modules/eligibility/aws/api/bindings.routes.ts:bindingsRoutes
    origin: none
  - id: BR-CAP-PFM-ELG-007-02
    proved_by: [ATS-PFM-ELG-006-10, ATS-PFM-ELG-007-02, ATS-PFM-ELG-007-19, TST-PFM-ELG-071, TST-PFM-ELG-072, TST-PFM-ELG-428]
    statement: >-
      A binding requires an application-owned registered purpose, compatible
      required subjects and facts, batch-capable conditions for populations and
      no provider conditions for SQL-only purposes, including referenced
      expressions.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      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
    origin: none
  - id: BR-CAP-PFM-ELG-007-03
    proved_by: [ATS-PFM-ELG-007-03, TST-PFM-ELG-073, TST-PFM-ELG-468]
    statement: >-
      Binding parameters must be declared, satisfy their types, collection
      forms, choices and bounds, and supply every required value without a
      default.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/unit/binding-fit.spec.js#refuses
      a value for a parameter the rule does not declare
    origin: none
  - id: BR-CAP-PFM-ELG-007-04
    proved_by: [ATS-PFM-ELG-005-11, ATS-PFM-ELG-007-04, ATS-PFM-ELG-007-18, TST-PFM-ELG-075, TST-PFM-ELG-092, TST-PFM-ELG-442]
    statement: >-
      Bindings follow the published expression or pin a published or superseded
      version of that rule; absent, draft, foreign or newly retired pins fail,
      while existing retired pins remain stored.
    kind: validation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#refuses
      a pin of the definition’s draft
    origin: none
  - id: BR-CAP-PFM-ELG-007-05
    proved_by: [ATS-PFM-ELG-007-05, TST-PFM-ELG-411, TST-PFM-ELG-428, TST-PFM-ELG-442]
    statement: >-
      A binding inherits its purpose’s failure policy unless it explicitly
      selects closed, open with review or defer.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    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
    origin: 'services-platform:docs/proposals/eligibility/17-decision-register.md#D-08'
  - id: BR-CAP-PFM-ELG-007-06
    proved_by: [ATS-PFM-ELG-007-06, TST-PFM-ELG-442]
    statement: >-
      Each consumer can bind a rule once, and deprecated or archived rules
      reject new bindings.
    kind: invariant
    enforced_at:
      - service
      - database
    must_prove: true
    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
    origin: none
  - id: BR-CAP-PFM-ELG-007-07
    proved_by: [ATS-PFM-ELG-007-07, TST-PFM-ELG-078, TST-PFM-ELG-428]
    statement: >-
      Binding updates recheck compatibility and require the version read,
      rejecting stale updates without changing the binding.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    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
    origin: none
  - id: BR-CAP-PFM-ELG-007-08
    proved_by: [ATS-PFM-ELG-004-15, ATS-PFM-ELG-007-08, ATS-PFM-ELG-007-17, ATS-PFM-ELG-007-20, ATS-PFM-ELG-008-16, TST-PFM-ELG-076, TST-PFM-ELG-442]
    statement: >-
      Suspended bindings reject evaluation rather than returning an ineligible
      result, and bindings of archived rules cannot be resumed.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0217.spec.ts#ELIG-ACC-0217
    origin: none
  - id: BR-CAP-PFM-ELG-007-09
    proved_by: [ATS-PFM-ELG-002-11, ATS-PFM-ELG-007-09, ATS-PFM-ELG-007-16, TST-PFM-ELG-080, TST-PFM-ELG-442]
    statement: Deleting a binding removes its plans while preserving recorded decisions.
    kind: lifecycle
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/persistence/bindings.integration.spec.js#takes
      the binding’s plans with it
    origin: none
  - id: BR-CAP-PFM-ELG-007-10
    proved_by: [ATS-PFM-ELG-007-10, TST-PFM-ELG-079, TST-PFM-ELG-411, TST-PFM-ELG-413]
    statement: >-
      Binding lists require a rule or consumer application, support consumer
      filtering and cursors and accept no more than 100 consumer references in
      one request.
    kind: validation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      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
    origin: none
  - id: BR-CAP-PFM-ELG-007-11
    proved_by: [ATS-PFM-ELG-007-11, TST-PFM-ELG-412]
    statement: >-
      Consumer applications manage bindings through service-only dispatch under
      their own principal, with that service recorded as the actor.
    kind: permission
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#registers
      the binding, recorded as made by the service principal
    origin: none
  - id: BR-CAP-PFM-ELG-007-12
    proved_by: [ATS-PFM-ELG-007-12, TST-PFM-ELG-081, TST-PFM-ELG-413]
    statement: >-
      Plan responses carry a version tag affected by rule versions, failure
      policy, portal wording and referenced expressions, with a matching tag
      returning not modified.
    kind: calculation
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#answers
      a new tag, 200, when the binding’s fail policy changes
    origin: none
  - id: BR-CAP-PFM-ELG-007-13
    proved_by: [ATS-PFM-ELG-007-13, TST-PFM-ELG-082, TST-PFM-ELG-335, TST-PFM-ELG-412]
    statement: >-
      Console plan responses omit internal queries, provider details and
      explanation templates, while consumer services receive the complete plan.
    kind: permission
    enforced_at:
      - service
    must_prove: true
    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)
    origin: none
  - id: BR-CAP-PFM-ELG-007-14
    proved_by: [ATS-PFM-ELG-001-20, ATS-PFM-ELG-007-14, ATS-PFM-ELG-007-15, TST-PFM-ELG-093]
    statement: >-
      The product editor’s eligibility card maintains a Platform binding to a
      shared or product-private rule without storing the rule on the product;
      private rules stay outside the shared catalogue until promoted.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: observed
    source: >-
      react-console:components/eligibility/embeds/eligibility-card.tsx:EligibilityCard
    origin: 'services-platform:docs/milestones/plans/PLAT-M11-plan.md#D6'
scenarios:
  - id: SC-CAP-PFM-ELG-007-01
    given: A price manager has binding authority without rule-writing authority.
    when: >-
      They connect an existing expression to several supported consumer
      purposes.
    then: Each accepted use inherits its default policy and appears in usage.
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0211.spec.ts#ELIG-ACC-0211
  - id: SC-CAP-PFM-ELG-007-02
    given: An auditor pins the initial early-bird expression while a desk follows it.
    when: A second release becomes effective.
    then: The desk changes expression and the audit use remains pinned.
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0215.spec.ts#ELIG-ACC-0215
edge_cases:
  - id: SC-CAP-PFM-ELG-007-03
    given: An expression depends on a provider.
    when: It is bound directly or by reference to a SQL-only checkout purpose.
    then: >-
      The incompatible checkout use fails; compatible price, population and page
      purposes can accept it.
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0213.spec.ts#ELIG-ACC-0213
constraints: []
depends_on:
  - CAP-PFM-ELG-006
related:
  - CAP-PFM-ELG-004
  - CAP-PFM-ELG-005
  - CAP-PFM-ELG-008
journeys:
  - JNY-PFM-ELG-002
open_questions: []
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.
controls: [TC-AVL-004, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-DAT-004, TC-LOG-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-004, TC-PI-005, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-VEN-001, TC-VEN-002, TC-VEN-003]
exercised_by: [FAS-PFM-ELG-02-01, FAS-PFM-ELG-02-02, FAS-PFM-ELG-02-03, FAS-PFM-ELG-02-04]
suites: [TST-PFM-ELG-071, TST-PFM-ELG-072, TST-PFM-ELG-073, TST-PFM-ELG-075, TST-PFM-ELG-076, TST-PFM-ELG-078, TST-PFM-ELG-079, TST-PFM-ELG-080, TST-PFM-ELG-081, TST-PFM-ELG-082, TST-PFM-ELG-083, TST-PFM-ELG-092, TST-PFM-ELG-093, TST-PFM-ELG-335, TST-PFM-ELG-411, TST-PFM-ELG-412, TST-PFM-ELG-413, TST-PFM-ELG-428, TST-PFM-ELG-442, TST-PFM-ELG-468]
---
# Connect a rule to an application decision

## Purpose

A rule use connects a reusable expression to a concrete decision. Compatibility checks help applications avoid questions they cannot answer.

## How It Works

The application or administrator selects the expression and purpose of a use. Parameter values adapt the expression where it allows variation. Following and pinning express different release choices. The failure policy determines what uncertainty means for this use. Platform checks that the purpose can provide the information required. Unsupported subjects, facts or execution modes cause refusal. Staff manage bindings under the binding permission; consumer-record editing authority is not separately checked by these Platform routes. The product card offers shared selection or a private expression. Suspension provides an immediate stop during an incident. Plans are available in different detail to staff and service callers.

## Relationships

- Maintain the application-declared rule vocabulary provides the purposes used to assess consumer compatibility.
