---
id: ATS-PFM-ELG-004
scope: CAP-PFM-ELG-004
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-004-01
    title: Enforce publication authority
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-01
    preconditions: 'Workspace personas, a roleless caller and an outside-customer user are available.'
    steps: Attempt publication and rollback as each.
    expected: Only publish-authorized callers succeed; others leave the rule unchanged.
    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 publish to a writer without the publish permission, 403
      - TST-PFM-ELG-411
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0153.spec.ts#ELIG-ACC-0153
      - TST-PFM-ELG-185
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
      the publish to a writer without the publish permission, 403
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        the publish to a writer without the publish permission, 403
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#refuses
        the publish to a writer without the publish 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-004-02
    title: Distinguish errors from warnings
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-02
    preconditions: 'Drafts contain three errors, a warning alone and an unlicensed condition.'
    steps: Attempt to publish each.
    expected: >-
      Errors and unlicensed use block publication with explanations; the warning-only release
      succeeds.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
        a draft with a problem, naming its code, and leaves it a draft
      - TST-PFM-ELG-435
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
        a condition type of an application the tenant is not licensed for
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0134.spec.ts#ELIG-ACC-0134
      - TST-PFM-ELG-166
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0156.spec.ts#ELIG-ACC-0156
      - TST-PFM-ELG-188
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
      a draft with a problem, naming its code, and leaves it a draft
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
        a draft with a problem, naming its code, and leaves it a draft
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
        a draft with a problem, naming its code, and leaves it a 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-004-03
    title: Record the next immutable release
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-03
    preconditions: Version one and a later draft exist.
    steps: Publish and inspect history.
    expected: Version two becomes the rule’s publication and version one becomes superseded.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#answers
        the first publish as version 1, published, superseding nothing and with no diff
      - TST-PFM-ELG-435
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        the next draft as version 2 and supersedes version 1
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#names
        version 2 as the definition’s published version
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#answers
      the first publish as version 1, published, superseding nothing and with no diff
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#answers
        the first publish as version 1, published, superseding nothing and with no diff
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#answers
        the first publish as version 1, published, superseding nothing and with no diff
    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-004-04
    title: Validate effective periods
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-04
      - INV-DOM-PFM-ELG-001-04
    preconditions: An open-ended first version is available.
    steps: 'Schedule the next version after ending the first, then request overlap.'
    expected: >-
      Disjoint versions retain their periods and the overlap fails with the conflicting release
      named.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/versions.integration.spec.js#keeps
        the earlier version published for its own range when the new range does not overlap it
      - TST-PFM-ELG-462
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/versions.integration.spec.js#refuses
        a publish whose range overlaps a published version other than the last one, naming it, and
        leaves the draft
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0131.spec.ts#ELIG-ACC-0131
      - TST-PFM-ELG-163
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0133.spec.ts#ELIG-ACC-0133
      - TST-PFM-ELG-165
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/persistence/versions.integration.spec.js#keeps
      the earlier version published for its own range when the new range does not overlap it
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/versions.integration.spec.js#keeps
        the earlier version published for its own range when the new range does not overlap it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/versions.integration.spec.js#keeps
        the earlier version published for its own range when the new range does not overlap 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-004-05
    title: Check real dates
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-05
    preconditions: A draft is available.
    steps: 'Use an impossible February start, an impossible April end and a valid leap day.'
    expected: Impossible dates fail with their field named; the leap day succeeds.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#refuses
        a draft with effective_from 2027-02-31, 400, naming the field
      - TST-PFM-ELG-413
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#refuses
        a publish with effective_until 2027-04-31, 400, naming the field
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#accepts
        2028-02-29, a day that exists (negative control)
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#refuses
      a draft with effective_from 2027-02-31, 400, naming the field
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#refuses
        a draft with effective_from 2027-02-31, 400, naming the field
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-governance-repairs.e2e.spec.js#refuses
        a draft with effective_from 2027-02-31, 400, naming the field
    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-004-06
    title: Protect incompatible followers
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-06
    preconditions: A reader-only purpose follows a rule whose draft adds an organization subject.
    steps: Publish normally and then force publication.
    expected: >-
      The first attempt names the incompatible use; forcing suspends and audits it while a pin
      remains active.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        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
      - TST-PFM-ELG-434
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#publishes
        with allow_unfit_followers, answering the binding it suspended and why
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#suspends
        the following binding and records the suspension in its audit trail
      - >-
        react-console:acceptance/eligibility/playwright/journeys/bindings/ELIG-ACC-0230.spec.ts#ELIG-ACC-0230
      - TST-PFM-ELG-089
    provenance: test
    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
    category: rule
    action_evidence:
      provenance: test
      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
    assertion_evidence:
      provenance: test
      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
    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-004-07
    title: Invalidate following reference plans
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-07
    preconditions: >-
      An outer rule includes a middle rule that follows another; a separate rule pins the changed
      rule.
    steps: Publish the innermost rule and evaluate both consumers.
    expected: 'The follower uses the new expression and plan, while the direct pin retains its plan.'
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#finds
        every rule that inlines C at any depth, and none that pins a version of C
      - TST-PFM-ELG-434
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#keeps
        the stored plan of a rule pinning a version of C itself, whose rule did not change
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#answers
        A’s binding a new plan hash, so the old plan’s If-None-Match no longer matches
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0146.spec.ts#ELIG-ACC-0146
      - TST-PFM-ELG-178
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#finds
      every rule that inlines C at any depth, and none that pins a version of C
    category: invariant
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#finds
        every rule that inlines C at any depth, and none that pins a version of C
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#finds
        every rule that inlines C at any depth, and none that pins a version of C
    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-004-08
    title: Restore through a fresh version
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-08
    preconditions: Two publications and unrelated draft work exist.
    steps: Restore the first expression.
    expected: >-
      The third release copies its expression, summary and dependencies with a rollback note,
      preserving the draft.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        version 1’s rule as version 3 with the rollback note, superseding version 2
      - TST-PFM-ELG-435
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#answers
        the dependencies copied from version 1
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/versions.integration.spec.js#leaves
        the pending draft a draft
      - TST-PFM-ELG-462
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0137.spec.ts#ELIG-ACC-0137
      - TST-PFM-ELG-169
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
      version 1’s rule as version 3 with the rollback note, superseding version 2
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        version 1’s rule as version 3 with the rollback note, superseding version 2
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        version 1’s rule as version 3 with the rollback note, superseding version 2
    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-004-09
    title: Resolve competing releases
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-09
    preconditions: Two publishers target one draft.
    steps: Issue both publication requests together.
    expected: One release results and the loser receives its version and time.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        it once
      - TST-PFM-ELG-435
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
        the loser with StaleObject naming the winner’s version and when it was published, not
        IllegalOperation
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0148.spec.ts#ELIG-ACC-0148
      - TST-PFM-ELG-180
      - >-
        react-console:acceptance/eligibility/playwright/journeys/adversarial/ELIG-ACC-0690.spec.ts#ELIG-ACC-0690
      - TST-PFM-ELG-003
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
      it once
    category: concurrency
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        it once
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        it once
    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-004-10
    title: Validate the expression actually released
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-10
      - INV-DOM-PFM-ELG-001-05
    preconditions: A publication request races a colleague’s draft save.
    steps: Submit both operations and inspect released and draft expressions.
    expected: >-
      The release corresponds to its validated expression; supported conflict outcomes never publish
      an unvalidated expression.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0149.spec.ts#ELIG-ACC-0149
      - TST-PFM-ELG-181
      - >-
        react-console:acceptance/eligibility/playwright/journeys/adversarial/ELIG-ACC-0691.spec.ts#ELIG-ACC-0691
      - TST-PFM-ELG-004
    provenance: test
    source: >-
      react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0149.spec.ts#ELIG-ACC-0149
    category: concurrency
    action_evidence:
      provenance: test
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0149.spec.ts#ELIG-ACC-0149
    assertion_evidence:
      provenance: test
      source: >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0149.spec.ts#ELIG-ACC-0149
    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-004-11
    title: Compare versions in both directions
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-11
    preconditions: Two numbered versions and a draft exist.
    steps: 'List history, compare both directions and request an absent version.'
    expected: >-
      History is newest first; comparisons carry readable changes and counts, reversing
      consistently; the absent version returns not found.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#lists
        the versions newest first
      - TST-PFM-ELG-411
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/diff.integration.spec.js#answers
        every change from version 1 to the draft, version 2, with its sentence and the counts
      - TST-PFM-ELG-432
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/diff.integration.spec.js#answers
        the reverse diff with the addition as a removal
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0138.spec.ts#ELIG-ACC-0138
      - TST-PFM-ELG-170
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#lists the
      versions newest first
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#lists
        the versions newest first
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#lists
        the versions newest first
    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-004-12
    title: Audit writes and omit refusals
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-12
      - INV-DOM-PFM-ELG-001-09
    preconditions: A rule and binding are available.
    steps: 'Create, draft, publish and update a binding, then attempt a refused release.'
    expected: Each successful write has one attributable event with relevant versions; the refusal has none.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#records
        the publish with its versions and the size of its diff
      - TST-PFM-ELG-435
      - >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#records
        every write to the definition in order: the create, the publish, the draft and the second
        publish
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0157.spec.ts#ELIG-ACC-0157
      - TST-PFM-ELG-189
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#records
      the publish with its versions and the size of its diff
    category: invariant
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#records
        the publish with its versions and the size of its diff
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#records
        the publish with its versions and the size of its diff
    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-004-13
    title: Keep repairable drafts out of release
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-001-04
      - BR-CAP-PFM-ELG-004-02
    exercises:
      - CAP-PFM-ELG-004
      - CAP-PFM-ELG-001
    preconditions: A writer has a draft with validation errors.
    steps: 'Save the draft, attempt publication, repair its errors and publish with authority.'
    expected: >-
      Only the repaired expression appears as a released version; the earlier refusal leaves the
      draft available.
    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#answers
      the draft’s problem, saved rather than refused;
      services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
      a condition type of an application the tenant is not licensed for
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#answers
        the draft’s problem, saved rather than refused;
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
        a condition type of an application the tenant is not licensed for
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-definitions.e2e.spec.js#answers
        the draft’s problem, saved rather than refused;
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#refuses
        a condition type of an application the tenant is not licensed for
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-004-14
    title: Move a following reference through replacement
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-03
      - BR-CAP-PFM-ELG-005-05
    exercises:
      - CAP-PFM-ELG-004
      - CAP-PFM-ELG-005
    preconditions: An obsolete rule is referenced by another released rule and a replacement is ready.
    steps: >-
      Transfer its following references, inspect the referencing rule history and attempt archive of
      the old rule.
    expected: >-
      The referencing rule gains a release using the replacement; any retained pins still prevent
      archive.
    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/publish.integration.spec.js#publishes
      the next draft as version 2 and supersedes version 1;
      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
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        the next draft as version 2 and supersedes version 1;
        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
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#publishes
        the next draft as version 2 and supersedes version 1;
        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
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-004-15
    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-004
      - CAP-PFM-ELG-007
    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-004-16
    title: Refresh an answer after publication
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-07
      - BR-CAP-PFM-ELG-010-02
    exercises:
      - CAP-PFM-ELG-004
      - CAP-PFM-ELG-010
    preconditions: A following use has a cached eligible display answer.
    steps: Publish a draft that changes the subject to ineligible and evaluate the same use again.
    expected: >-
      The next answer names the new expression and reports ineligible instead of the earlier cached
      answer.
    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/publish-followers.integration.spec.js#finds
      every rule that inlines C at any depth, and none that pins a version of C;
      services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers from
      the data again once the publish has flushed the definition’s decisions
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#finds
        every rule that inlines C at any depth, and none that pins a version of C;
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers
        from the data again once the publish has flushed the definition’s decisions
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish-followers.integration.spec.js#finds
        every rule that inlines C at any depth, and none that pins a version of C;
        services-platform:modules/eligibility/tests/e2e/eligibility-evaluate.e2e.spec.js#answers
        from the data again once the publish has flushed the definition’s decisions
    binding_scope: This sequence is proposed and has no executable proof binding.
  - id: ATS-PFM-ELG-004-17
    title: Bind publication to the examined draft
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-004-12
      - BR-CAP-PFM-ELG-011-07
    exercises:
      - CAP-PFM-ELG-004
      - CAP-PFM-ELG-011
    preconditions: A completed simulation exists for a draft.
    steps: >-
      Change the draft, attempt publication citing that simulation, then simulate the new draft and
      publish citing its result.
    expected: >-
      The obsolete result is refused; the matching completed result is recorded with the accepted
      release.
    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/publish.integration.spec.js#records
      the publish with its versions and the size of its diff;
      services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#refuses
      a publish naming a simulation of another version of the draft
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#records
        the publish with its versions and the size of its diff;
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#refuses
        a publish naming a simulation of another version of the draft
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/governance/publish.integration.spec.js#records
        the publish with its versions and the size of its diff;
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#refuses
        a publish naming a simulation of another version of the draft
    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 and
    plans/PLAT-M11-plan.md; docs/proposals/eligibility/17-decision-register.md;
    aws/platform.service.ts (ELIGIBILITY_PERMISSIONS); modules/eligibility/lifecycle.ts,
    services/governance/publish.ts, diff.ts, change-trail.ts, services/persistence/versions.ts
    (requireDraftStillOpen), services/compile/plan-cache.ts,
    services/invalidation/on-definition-published.ts, db/eligibility-versions.table.ts,
    eligibility-plans.table.ts; docs/debt/eligibility-published-range-exclusion.md; rule-level
    source and test references
  - >-
    react-console: components/eligibility/governance/publish-dialog.tsx, version-history.tsx,
    version-diff.tsx, lib/eligibility/status.ts; acceptance/eligibility/journeys/governance/*.json
    and adversarial/ELIG-ACC-0690, 0691.
related_coverage:
  - capability: CAP-PFM-ELG-001
    scenario: ATS-PFM-ELG-004-13
  - capability: CAP-PFM-ELG-005
    scenario: ATS-PFM-ELG-004-14
  - capability: CAP-PFM-ELG-007
    scenario: ATS-PFM-ELG-004-15
  - capability: CAP-PFM-ELG-010
    scenario: ATS-PFM-ELG-004-16
  - capability: CAP-PFM-ELG-011
    scenario: ATS-PFM-ELG-004-17
coverage:
  rule: covered
  transition: 'gap: FND-PFM-ELG-056'
  validation: covered
  permission: 'gap: FND-PFM-ELG-056'
  edge: 'gap: FND-PFM-ELG-056'
  failure: 'gap: FND-PFM-ELG-056'
  boundary: covered
  concurrency: covered
  invariant: 'gap: FND-PFM-ELG-056'
  interaction: covered
invariant_gaps:
  - invariant: INV-DOM-PFM-ELG-001-03
    finding: FND-PFM-ELG-056
    source: 'services-platform:modules/eligibility/lifecycle.ts:VERSION_TRANSITIONS'
  - invariant: INV-DOM-PFM-ELG-001-08
    finding: FND-PFM-ELG-056
    source: >-
      services-platform:modules/eligibility/db/eligibility-definitions.table.ts:eligibility_definitions_replaced_by_check
transition_coverage:
  - model: STATE-PFM-ELG-002
    from: draft
    to: draft
    trigger: >-
      saveEligibilityDefinitionDraft, createEligibilityDefinition when expression is supplied,
      duplicateEligibilityDefinition
    source: 'services-platform:modules/eligibility/services/model/authoring.ts:saveDefinitionDraft'
    scenario: ATS-PFM-ELG-001-05
  - model: STATE-PFM-ELG-002
    from: draft
    to: published
    trigger: publishEligibilityDefinition
    source: 'services-platform:modules/eligibility/services/governance/publish.ts:publishDefinition'
    scenario: ATS-PFM-ELG-004-03
  - model: STATE-PFM-ELG-002
    from: published
    to: superseded
    trigger: Later overlapping publication or rollback
    source: 'services-platform:docs/eligibility.md#2. The lifecycle rules'
    scenario: ATS-PFM-ELG-004-03
  - model: STATE-PFM-ELG-002
    from: published
    to: retired
    trigger: retireVersion through persistence only
    finding: FND-PFM-ELG-056
    source: 'services-platform:modules/eligibility/services/persistence/versions.ts:retireVersion'
  - model: STATE-PFM-ELG-002
    from: superseded
    to: retired
    trigger: retireVersion through persistence only
    finding: FND-PFM-ELG-056
    source: 'services-platform:modules/eligibility/lifecycle.ts:VERSION_TRANSITIONS'
permission_coverage:
  - key: platform.eligibility.publish
    finding: FND-PFM-ELG-056
    reason: A capability-level authority scenario does not prove every operation protected by this key.
  - key: platform.eligibility.read
    finding: FND-PFM-ELG-056
    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: >-
    Publication audit failure and post-commit role queue failure need injected-failure scenarios.
    Persistence-only retirement paths and guard failures are not covered as complete lifecycle
    transitions.
---

# Release, schedule and restore rule versions: 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-004-01` | `ATS-PFM-ELG-004-01` |
| `BR-CAP-PFM-ELG-004-02` | `ATS-PFM-ELG-004-02`, `ATS-PFM-ELG-004-13` |
| `BR-CAP-PFM-ELG-004-03` | `ATS-PFM-ELG-004-03`, `ATS-PFM-ELG-004-14` |
| `BR-CAP-PFM-ELG-004-04` | `ATS-PFM-ELG-004-04` |
| `BR-CAP-PFM-ELG-004-05` | `ATS-PFM-ELG-004-05` |
| `BR-CAP-PFM-ELG-004-06` | `ATS-PFM-ELG-004-06`, `ATS-PFM-ELG-004-15` |
| `BR-CAP-PFM-ELG-004-07` | `ATS-PFM-ELG-004-07`, `ATS-PFM-ELG-004-16` |
| `BR-CAP-PFM-ELG-004-08` | `ATS-PFM-ELG-004-08` |
| `BR-CAP-PFM-ELG-004-09` | `ATS-PFM-ELG-004-09` |
| `BR-CAP-PFM-ELG-004-10` | `ATS-PFM-ELG-004-10` |
| `BR-CAP-PFM-ELG-004-11` | `ATS-PFM-ELG-004-11` |
| `BR-CAP-PFM-ELG-004-12` | `ATS-PFM-ELG-004-12`, `ATS-PFM-ELG-004-17` |

## Interactions With Related Capabilities

Keep repairable drafts out of release. Save the draft, attempt publication, repair its errors and publish with authority.

Move a following reference through replacement. Transfer its following references, inspect the referencing rule history and attempt archive of the old rule.

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

Refresh an answer after publication. Publish a draft that changes the subject to ineligible and evaluate the same use again.

Bind publication to the examined draft. Change the draft, attempt publication citing that simulation, then simulate the new draft and publish citing its result.
