---
id: CAP-PFM-ELG-006
title: Maintain the application-declared rule vocabulary
feature: FEAT-PFM-ELG-01
product_area: platform
module: eligibility
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CAP-ELIG-REG-001
  - CAP-ELIG-REG-002
  - CAP-ELIG-REG-003
  - CAP-ELIG-REG-004
  - CAP-ELIG-REG-005
  - CAP-ELIG-REG-006
  - CAP-ELIG-REG-007
  - CAP-ELIG-REG-008
  - CAP-ELIG-REG-009
  - CAP-ELIG-REG-011
  - CAP-ELIG-REG-014
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-platform:docs/proposals/eligibility/17-decision-register.md#D-05'
  - 'services-platform:docs/proposals/eligibility/17-decision-register.md#D-07'
  - 'services-platform:docs/milestones/plans/PLAT-M11-plan.md#2. Scope'
purpose: >-
  Applications supply the vocabulary that rule authors use. Registration keeps
  that vocabulary aligned with what applications can actually evaluate.
outcomes:
  - The builder exposes condition declarations for licensed applications.
  - Published expressions protect their declared conditions from withdrawal.
concepts:
  - CON-PFM-ELG-001
  - CON-PFM-ELG-002
actors:
  - ACT-PFM-024
  - ACT-PFM-023
surfaces:
  - console
  - api
  - job
preconditions: []
postconditions: []
permissions:
  - key: platform.eligibility.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-PFM-ELG-006-01
    proved_by: [ATS-PFM-ELG-006-01, ATS-PFM-ELG-006-11, TST-PFM-ELG-326, TST-PFM-ELG-465]
    statement: >-
      Applications register complete condition and purpose declarations during
      deployment, and Platform rejects an invalid declaration set with its
      problems without persisting any part.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/registry/register-eligibility-registration.integration.spec.js#answers
      a refused manifest with ok false and the refusal, rather than throwing
    origin: 'services-platform:docs/proposals/eligibility/17-decision-register.md#D-05'
  - id: BR-CAP-PFM-ELG-006-02
    proved_by: [ATS-PFM-ELG-006-02, TST-PFM-ELG-465]
    statement: >-
      Condition declarations must use compatible operators, their application’s
      registered datasets and functions, valid subject fields and registered
      choice sources.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/registry/register-eligibility-registration.integration.spec.js#names
      an operator the value type cannot take
    origin: none
  - id: BR-CAP-PFM-ELG-006-03
    proved_by: [ATS-PFM-ELG-006-03, ATS-PFM-ELG-006-11, TST-PFM-ELG-324, TST-PFM-ELG-325, TST-PFM-ELG-465]
    statement: >-
      Changed declarations require a higher version; an equal or lower version
      is rejected, while an identical redeployment performs no write.
    kind: validation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/registry/register-eligibility-registration.integration.spec.js#refuses
      a declaration changed at the same version, saying to bump it, and writes
      nothing
    origin: none
  - id: BR-CAP-PFM-ELG-006-04
    proved_by: [ATS-PFM-ELG-006-04, ATS-PFM-ELG-006-10, ATS-PFM-ELG-007-19, TST-PFM-ELG-322, TST-PFM-ELG-465]
    statement: >-
      Omitted declarations are withdrawn unless a published rule uses the
      condition or a binding uses the purpose anywhere, in which case
      registration fails with the affected workspace and rule identified.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    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
    origin: none
  - id: BR-CAP-PFM-ELG-006-05
    proved_by: [ATS-PFM-ELG-006-05, TST-PFM-ELG-321, TST-PFM-ELG-415]
    statement: >-
      Deprecated conditions continue to evaluate and appear only when explicitly
      requested; withdrawn conditions never appear in the authoring catalogue.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-registry.e2e.spec.js#never
      lists a withdrawn type, even with deprecated ones included
    origin: none
  - id: BR-CAP-PFM-ELG-006-06
    proved_by: [ATS-PFM-ELG-001-19, ATS-PFM-ELG-006-06, ATS-PFM-ELG-006-09, TST-PFM-ELG-323, TST-PFM-ELG-465]
    statement: >-
      Renamed conditions preserve their former keys as aliases for existing
      published expressions.
    kind: invariant
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/registry/register-eligibility-registration.integration.spec.js#folds
      a renamed type into its successor rather than withdrawing it, so the old
      key keeps resolving
    origin: none
  - id: BR-CAP-PFM-ELG-006-07
    proved_by: [ATS-PFM-ELG-006-07, TST-PFM-ELG-320, TST-PFM-ELG-415]
    statement: >-
      Authoring catalogues include only licensed application conditions and
      purposes, support subject-kind filtering and omit internal queries and
      provider functions.
    kind: permission
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-registry.e2e.spec.js#lists
      the active types of the tenant’s applications in key order, without a
      deprecated or withdrawn one or an unlicensed application’s
    origin: 'services-platform:docs/proposals/eligibility/17-decision-register.md#D-07'
  - id: BR-CAP-PFM-ELG-006-08
    proved_by: [ATS-PFM-ELG-006-08, TST-PFM-ELG-466]
    statement: >-
      Each process retains its evaluation catalogue for 60 seconds and
      invalidates that snapshot after its own successful registration.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/registry/registry-snapshot.integration.spec.js#keeps
      answering what it read for 60 seconds, though a type was written since
    origin: none
  - id: BR-CAP-PFM-ELG-006-09
    proved_by: []
    statement: >-
      Condition and purpose declarations have no staff-facing mutation route and
      change through application deployments.
    kind: permission
    enforced_at:
      - api
    must_prove: false
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/registry/ELIG-ACC-0015.spec.ts#ELIG-ACC-0015
    origin: none
  - id: BR-CAP-PFM-ELG-006-10
    proved_by: []
    statement: >-
      Platform declares testing, population, simulation and decision purposes
      plus date and portal-role conditions; portal-role evaluation awaits a
      user-to-contact relationship.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: documented
    source: >-
      services-platform:docs/eligibility.md#6.1 The manifest and the
      registration function
    origin: none
scenarios:
  - id: SC-CAP-PFM-ELG-006-01
    given: An application registers a renamed condition with its former key.
    when: A workspace evaluates an unchanged publication using the earlier name.
    then: The alias continues to resolve the condition.
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/registry/ELIG-ACC-0011.spec.ts#ELIG-ACC-0011
  - id: SC-CAP-PFM-ELG-006-02
    given: An application submits no conditions despite existing published uses.
    when: Deployment attempts registration.
    then: Those dependencies reject withdrawal without changing the catalogue.
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/registry/ELIG-ACC-0016.spec.ts#ELIG-ACC-0016
edge_cases: []
constraints: []
depends_on: []
related:
  - CAP-PFM-ELG-001
  - CAP-PFM-ELG-007
journeys: []
open_questions: []
evidence:
  - >-
    services-platform: docs/eligibility.md;
    docs/milestones/PLAT-M11-eligibility-rules.md and plans/PLAT-M11-plan.md;
    docs/proposals/eligibility/17-decision-register.md; aws/platform.service.ts
    (ELIGIBILITY_PERMISSIONS); modules/eligibility/aws/api/eligibility.routes.ts
    (condition_types, consumer_kinds), services/registry/**
    (registration-manifest.ts, register-eligibility-registration.ts,
    registry-snapshot.ts, registry-catalog.ts), eligibility-registration.ts,
    aws/lambda/REGISTRATION.handler.ts, db/eligibility-condition-types.table.ts,
    eligibility-consumer-kinds.table.ts; rule-level source and test references
  - >-
    react-console: components/eligibility/builder/condition-picker.tsx,
    lib/eligibility/registry-provider.tsx;
    acceptance/eligibility/journeys/registry/*.json.
controls: [TC-AVL-001, TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-CHG-001, TC-CHG-002, TC-CHG-003, TC-CHG-004, TC-CHG-005, TC-CHG-006, TC-DAT-001, TC-DAT-002, TC-DAT-003, TC-IAM-001, TC-IAM-006, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-VEN-001, TC-VEN-002, TC-VEN-003]
exercised_by: [FAS-PFM-ELG-01-01, FAS-PFM-ELG-01-05]
suites: [TST-PFM-ELG-320, TST-PFM-ELG-321, TST-PFM-ELG-322, TST-PFM-ELG-323, TST-PFM-ELG-324, TST-PFM-ELG-325, TST-PFM-ELG-326, TST-PFM-ELG-415, TST-PFM-ELG-465, TST-PFM-ELG-466]
---
# Maintain the application-declared rule vocabulary

## Purpose

Applications supply the vocabulary that rule authors use. Registration keeps that vocabulary aligned with what applications can actually evaluate.

## How It Works

An application deploys its complete declaration set. Platform checks ownership and compatibility before accepting it. Invalid sets return their problems without partial registration. An unchanged deployment leaves the catalogue alone. A changed declaration requires a new version. Deprecation lets existing expressions continue while steering authors toward current choices. Aliases preserve renamed conditions. Withdrawal fails when stored uses still depend on the declaration. Authors see the licensed vocabulary rather than its query implementation.

## Relationships

Application declarations supply the authoring vocabulary and the purposes used to check consumer compatibility.
