---
id: ATS-PFM-ELG-011
scope: CAP-PFM-ELG-011
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-011-01
    title: Check bulk-work authority
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-01
    preconditions: 'Read-only, population-without-query and publishing callers are available.'
    steps: Start and inspect population and simulation work.
    expected: >-
      Missing population, publish or dataset query authority fails with the required permission
      named.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-population.e2e.spec.js#refuses a
        population run to a caller without the dataset query key, 403 naming it
      - TST-PFM-ELG-414
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-population.e2e.spec.js#refuses
        an impact simulation to a caller without the dataset query key, 403 naming it
      - >-
        services-platform:modules/eligibility/tests/e2e/eligibility-population.e2e.spec.js#is
        refused to a caller with the population key alone, 403
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0435.spec.ts#ELIG-ACC-0435
      - TST-PFM-ELG-267
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0436.spec.ts#ELIG-ACC-0436
      - TST-PFM-ELG-268
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/e2e/eligibility-population.e2e.spec.js#refuses a
      population run to a caller without the dataset query key, 403 naming it
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-population.e2e.spec.js#refuses a
        population run to a caller without the dataset query key, 403 naming it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/e2e/eligibility-population.e2e.spec.js#refuses a
        population run to a caller without the dataset query key, 403 naming 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-011-02
    title: Reject unusable run requests
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-02
    preconditions: 'A broken expression, nonbatch provider and foreign dataset are available.'
    steps: Start each and request saved-query output.
    expected: 'All fail before creating either run or job, explaining why.'
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#refuses
        a rule whose provider type cannot be called in batches, and creates no run
      - TST-PFM-ELG-464
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0432.spec.ts#ELIG-ACC-0432
      - TST-PFM-ELG-264
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0433.spec.ts#ELIG-ACC-0433
      - TST-PFM-ELG-265
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0434.spec.ts#ELIG-ACC-0434
      - TST-PFM-ELG-266
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#refuses
      a rule whose provider type cannot be called in batches, and creates no run
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#refuses
        a rule whose provider type cannot be called in batches, and creates no run
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#refuses
        a rule whose provider type cannot be called in batches, and creates no run
    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-011-03
    title: Prune only safely excluded subjects
    level: unit
    proves:
      - BR-CAP-PFM-ELG-011-03
    preconditions: Expressions combine database and provider conditions.
    steps: 'Inspect eligible-only enumeration for conjunction, disjunction and negation.'
    expected: >-
      Conjunction retains safe database pruning and a provider disjunction excludes nobody in
      advance.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/unit/sql-prefix.spec.js#keeps the sql side of an
        and whose other side reads a provider
      - TST-PFM-ELG-489
      - >-
        services-platform:modules/eligibility/tests/unit/sql-prefix.spec.js#prunes no one for an or
        one of whose branches depends on a provider
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#enumerates
        only the subjects the sql prefix keeps when the run asks for the eligible alone
      - TST-PFM-ELG-464
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0442.spec.ts#ELIG-ACC-0442
      - TST-PFM-ELG-274
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/unit/sql-prefix.spec.js#keeps the sql side of an
      and whose other side reads a provider
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/sql-prefix.spec.js#keeps the sql side of an
        and whose other side reads a provider
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/unit/sql-prefix.spec.js#keeps the sql side of an
        and whose other side reads a provider
    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-011-04
    title: Persist cursor progress once
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-04
      - INV-DOM-PFM-ELG-003-07
    preconditions: A job uses two-subject pages.
    steps: Retry an old cursor and restart the job.
    expected: Retry changes no counts and restart resumes without duplicate subjects.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        a retried page once: the second attempt from the old cursor changes nothing
      - TST-PFM-ELG-464
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#restarts
        from the page cursor and counts every subject once
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
      a retried page once: the second attempt from the old cursor changes nothing
    category: concurrency
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        a retried page once: the second attempt from the old cursor changes nothing
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        a retried page once: the second attempt from the old cursor changes 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-011-05
    title: Read and compare completed output
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-05
    preconditions: Seeded contacts span all states and an earlier run exists.
    steps: 'Complete a comparison, page subjects and export.'
    expected: 'State counts, nonduplicating pages, eligibility changes and the export location are returned.'
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#succeeds
        and counts every state of the planted contacts
      - TST-PFM-ELG-464
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#answers
        the subjects newly eligible against the earlier run, and none no longer eligible
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0443.spec.ts#ELIG-ACC-0443
      - TST-PFM-ELG-275
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#succeeds
      and counts every state of the planted contacts
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#succeeds
        and counts every state of the planted contacts
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#succeeds
        and counts every state of the planted contacts
    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-011-06
    title: Inspect draft gains and losses
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-06
    preconditions: A published rule has history and a broadened draft.
    steps: Create and retrieve its simulation.
    expected: >-
      The same subjects have before/after counts and gain/loss samples with consumer and reference
      impact; nonbatch providers make it partial.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#counts
        each state before and after the change over the same subjects
      - TST-PFM-ELG-464
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#samples
        who becomes eligible and who stops being eligible
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#settles
        the simulation succeeded, linked to its run, kept thirty days
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#counts
      each state before and after the change over the same subjects
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#counts
        each state before and after the change over the same subjects
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#counts
        each state before and after the change over the same subjects
    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-011-07
    title: Match simulations to releases
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-07
    preconditions: 'Simulations include the current draft, another rule and an old draft.'
    steps: 'Publish with each, both a simulation and skip, and a skip alone.'
    expected: Only the current completed simulation or skip is accepted and audited.
    negative: true
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        the simulation and its delta on the publish that used it
      - TST-PFM-ELG-464
      - >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        a publish made without a simulation as skipped
      - >-
        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
      - >-
        react-console:acceptance/eligibility/playwright/journeys/population/ELIG-ACC-0439.spec.ts#ELIG-ACC-0439
      - TST-PFM-ELG-271
      - >-
        react-console:acceptance/eligibility/playwright/journeys/governance/ELIG-ACC-0135.spec.ts#ELIG-ACC-0135
      - TST-PFM-ELG-167
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
      the simulation and its delta on the publish that used it
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        the simulation and its delta on the publish that used it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        the simulation and its delta on the publish that used 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-011-08
    title: Expire stale bulk artifacts
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-08
    preconditions: A settled run and 30-day simulation have reached expiry.
    steps: Expire runs and attempt comparison and simulation-backed release.
    expected: >-
      The local run expires, loses its result file and cannot be compared; the expired simulation
      cannot support publication.
    negative: false
    data_needs: No fixtures beyond the described setup.
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/population-runs.integration.spec.js#expires
        the settled run once its time has come, and only in its own tenant
      - TST-PFM-ELG-458
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/population-runs.integration.spec.js#clears
        the result location of the expired run
      - >-
        services-platform:modules/eligibility/tests/integration/services/persistence/simulations.integration.spec.js#creates
        the simulation queued, kept thirty calendar days in the tenant’s zone
      - TST-PFM-ELG-460
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/persistence/population-runs.integration.spec.js#expires
      the settled run once its time has come, and only in its own tenant
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/population-runs.integration.spec.js#expires
        the settled run once its time has come, and only in its own tenant
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/persistence/population-runs.integration.spec.js#expires
        the settled run once its time has come, and only in its own tenant
    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-011-09
    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-011
      - CAP-PFM-ELG-004
    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.
  - id: ATS-PFM-ELG-011-10
    title: Queue simulation gains with release refresh
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-010-03
      - BR-CAP-PFM-ELG-011-07
    exercises:
      - CAP-PFM-ELG-011
      - CAP-PFM-ELG-010
    preconditions: A simulation identifies newly eligible subjects and a derived role already has holders.
    steps: >-
      Publish with the matching simulation and inspect queued role rechecks and the following use
      answer.
    expected: >-
      Existing holders and bounded gains are queued and the following use observes the new
      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/population/population-run.integration.spec.js#queues
      a reconcile for every subject the simulation found newly eligible when the version is
      published;
      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/population/population-run.integration.spec.js#queues
        a reconcile for every subject the simulation found newly eligible when the version is
        published;
        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/population/population-run.integration.spec.js#queues
        a reconcile for every subject the simulation found newly eligible when the version is
        published;
        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.
  - id: ATS-PFM-ELG-011-11
    title: Observe a stopped population job
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-04
      - BR-CAP-PFM-ELG-012-03
    exercises:
      - CAP-PFM-ELG-011
      - CAP-PFM-ELG-012
    preconditions: A population run exceeds its permitted size or has a failing page.
    steps: >-
      Execute the run through failure settlement and inspect the run, dependent simulation and
      failure metric.
    expected: >-
      The run and dependent simulation fail and the population alarm receives the emitted failure
      series.
    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/population/population-run.integration.spec.js#records
      a retried page once: the second attempt from the old cursor changes nothing;
      services-platform:modules/eligibility/tests/unit/alarm-inputs.spec.ts#reads the population
      run’s failure under the service its task function records it as (DEF-ELIG-0675)
    action_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        a retried page once: the second attempt from the old cursor changes nothing;
        services-platform:modules/eligibility/tests/unit/alarm-inputs.spec.ts#reads the population
        run’s failure under the service its task function records it as (DEF-ELIG-0675)
    assertion_evidence:
      provenance: proposed
      source: >-
        services-platform:modules/eligibility/tests/integration/services/population/population-run.integration.spec.js#records
        a retried page once: the second attempt from the old cursor changes nothing;
        services-platform:modules/eligibility/tests/unit/alarm-inputs.spec.ts#reads the population
        run’s failure under the service its task function records it as (DEF-ELIG-0675)
    binding_scope: This sequence is proposed and has no executable proof binding.
  - title: Purge only a workspace undergoing deletion
    category: invariant
    level: api
    proves:
      - BR-CAP-PFM-ELG-011-09
      - BR-CAP-PFM-ELG-009-08
      - INV-DOM-PFM-ELG-003-08
    preconditions: 'A run-owned workspace contains decisions, plans, uses, rules, runs and simulations.'
    steps: >-
      Attempt purge while live, move that workspace to deletion and drain the participant batches,
      then inspect its resource inventory.
    expected: >-
      The live-workspace purge is refused and the deleting workspace’s declared eligibility
      resources are emptied.
    negative: false
    data_needs: 'Run-owned fixtures, separate caller contexts and a controlled clock where required.'
    bound_to:
      - >-
        services-platform:modules/eligibility/tests/integration/services/maintenance/tenant-participant.integration.spec.js
      - TST-PFM-ELG-437
    provenance: test
    source: >-
      services-platform:modules/eligibility/tests/integration/services/maintenance/tenant-participant.integration.spec.js
    id: ATS-PFM-ELG-011-12
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/maintenance/tenant-participant.integration.spec.js
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/eligibility/tests/integration/services/maintenance/tenant-participant.integration.spec.js
    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
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/population.routes.ts, services/population/** (population-run.ts,
    population-workflow.ts, sql-prefix.ts, population-failure.ts), services/simulation/**,
    services/persistence/population-runs.ts, simulations.ts,
    aws/logic/eligibility-population.step-function.ts, db/eligibility-population-runs.table.ts,
    eligibility-simulations.table.ts, eligibility-population-jobs.table.ts, _job_steps, _job_events;
    docs/debt/eligibility-population-deployment.md; rule-level source and test references
  - >-
    react-console: components/eligibility/governance/publish-dialog.tsx, simulation-summary.tsx;
    acceptance/eligibility/journeys/population/*.json.
related_coverage:
  - capability: CAP-PFM-ELG-004
    scenario: ATS-PFM-ELG-011-09
  - capability: CAP-PFM-ELG-010
    scenario: ATS-PFM-ELG-011-10
  - capability: CAP-PFM-ELG-012
    scenario: ATS-PFM-ELG-011-11
coverage:
  rule: 'gap: FND-PFM-ELG-063'
  transition: 'gap: FND-PFM-ELG-063'
  validation: covered
  permission: 'gap: FND-PFM-ELG-063'
  edge: 'gap: FND-PFM-ELG-063'
  failure: 'gap: FND-PFM-ELG-063'
  boundary: 'gap: FND-PFM-ELG-063'
  concurrency: covered
  invariant: 'gap: FND-PFM-ELG-063'
  interaction: covered
invariant_gaps: []
transition_coverage:
  - model: STATE-PFM-ELG-004
    from: queued
    to: running
    trigger: Population job enters evaluation
    finding: FND-PFM-ELG-063
    source: >-
      services-platform:modules/eligibility/services/population/population-workflow.ts:populationWorkflow
  - model: STATE-PFM-ELG-004
    from: running
    to: running
    trigger: Population page callback
    source: >-
      services-platform:modules/eligibility/services/population/population-run.ts:evaluatePopulationPage
    scenario: ATS-PFM-ELG-011-04
  - model: STATE-PFM-ELG-004
    from: running
    to: succeeded
    trigger: Population completion after the final page
    finding: FND-PFM-ELG-063
    source: >-
      services-platform:modules/eligibility/services/population/population-run.ts:finishPopulationRun
  - model: STATE-PFM-ELG-004
    from: running
    to: failed
    trigger: 'Task exception, unallowed million-subject limit or abandoned-job settlement'
    finding: FND-PFM-ELG-063
    source: >-
      services-platform:modules/eligibility/services/population/population-failure.ts:failPopulationRunOfJob
  - model: STATE-PFM-ELG-004
    from: queued
    to: failed
    trigger: Queued job failure or abandonment
    finding: FND-PFM-ELG-063
    source: 'services-platform:modules/eligibility/lifecycle.ts:RUN_TRANSITIONS'
  - model: STATE-PFM-ELG-004
    from: succeeded
    to: expired
    trigger: Run or simulation expiry helper invocation
    source: 'services-platform:docs/debt/eligibility-population-deployment.md'
    scenario: ATS-PFM-ELG-011-08
  - model: STATE-PFM-ELG-004
    from: failed
    to: expired
    trigger: Settled-run expiry helper invocation
    finding: FND-PFM-ELG-063
    source: 'services-platform:modules/eligibility/lifecycle.ts:RUN_TRANSITIONS'
  - model: STATE-PFM-ELG-004
    from: cancelled
    to: expired
    trigger: Cancelled-run expiry helper invocation
    finding: FND-PFM-ELG-063
    source: 'services-platform:modules/eligibility/lifecycle.ts:RUN_TRANSITIONS'
  - model: STATE-PFM-ELG-004
    from: queued
    to: cancelled
    trigger: Cancellation lifecycle action without a route
    finding: FND-PFM-ELG-063
    source: 'services-platform:modules/eligibility/lifecycle.ts:RUN_TRANSITIONS'
  - model: STATE-PFM-ELG-004
    from: running
    to: cancelled
    trigger: Cancellation lifecycle action without a route
    finding: FND-PFM-ELG-063
    source: 'services-platform:modules/eligibility/lifecycle.ts:RUN_TRANSITIONS'
permission_coverage:
  - key: platform.eligibility.population
    finding: FND-PFM-ELG-063
    reason: A capability-level authority scenario does not prove every operation protected by this key.
  - key: platform.eligibility.publish
    finding: FND-PFM-ELG-063
    reason: A capability-level authority scenario does not prove every operation protected by this key.
  - key: crm.contacts.query
    finding: FND-PFM-ELG-063
    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: >-
    Bulk-work failure settlement, all terminal retention paths, cancellation route absence and
    workspace purge need complete cases. Completed simulations must be checked under racing draft
    changes and page retries.
---

# List qualifying subjects and assess a draft’s impact: 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-011-01` | `ATS-PFM-ELG-011-01` |
| `BR-CAP-PFM-ELG-011-02` | `ATS-PFM-ELG-011-02` |
| `BR-CAP-PFM-ELG-011-03` | `ATS-PFM-ELG-011-03` |
| `BR-CAP-PFM-ELG-011-04` | `ATS-PFM-ELG-011-04`, `ATS-PFM-ELG-011-11` |
| `BR-CAP-PFM-ELG-011-05` | `ATS-PFM-ELG-011-05` |
| `BR-CAP-PFM-ELG-011-06` | `ATS-PFM-ELG-011-06` |
| `BR-CAP-PFM-ELG-011-07` | `ATS-PFM-ELG-011-07`, `ATS-PFM-ELG-011-09`, `ATS-PFM-ELG-011-10` |
| `BR-CAP-PFM-ELG-011-08` | `ATS-PFM-ELG-011-08` |
| `BR-CAP-PFM-ELG-011-09` | `ATS-PFM-ELG-011-12` |

## Interactions With Related Capabilities

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

Queue simulation gains with release refresh. Publish with the matching simulation and inspect queued role rechecks and the following use answer.

Observe a stopped population job. Execute the run through failure settlement and inspect the run, dependent simulation and failure metric.
