Explorer/State Machine Docs/Eligibility

Eligibility State Machine

Domain: eligibility · API spec: eligibility-openapi.yaml

Determination

States

StateDescriptionSLA clock
in_progress Eligibility determination underway; awaiting program-level decisions running
completed All program decisions resolved; eligibility determination finalized stopped
withdrawn Determination closed because the associated application was withdrawn stopped

Actions

ActionActorsTransitionSteps
flag-expedited API →
System flags a Determination as qualifying for expedited SNAP processing
System no state change
  • Record that the household qualifies for expedited SNAP processing sets expeditedFlagged
  • Emit eligibility.application.expedited — Intake stores the flag; Workflow switches the intake task to the expedited SLA track (7 CFR § 273.2(i))
complete API →
System marks a Determination as complete after all program Decisions are resolved
System in_progresscompleted
withdraw API →
System withdraws a Determination when the associated application is withdrawn
System in_progresswithdrawn

Event Subscriptions

EventEmitted byHandler steps
intake.application.submitted Intake/Application
  • Create a Determination for the submitted application
intake.application.review_completed Intake/Application
  • Call the final determination adapter for each remaining pending Decision (42 CFR § 435.912)
eligibility.application.decision_completed Eligibility/Decision
  • If $pendingDecision is null:
    • Complete the Determination when all program Decisions are resolved
intake.application.withdrawn Intake/Application
  • If id is set:
    • Withdraw the Determination; already-resolved Decisions are preserved as the audit record

Decision

States

StateDescriptionSLA clock
pending Program eligibility decision awaiting automatic or caseworker review running
approved Member approved for the program based on eligibility criteria stopped
denied Member denied for the program based on eligibility criteria stopped
ineligible Member found categorically ineligible for the program stopped

Actions

ActionActorsTransitionSteps
approve API →
System approves a Decision after automatic or caseworker review
System pendingapproved
  • Record when the Decision was finalized sets decidedAt
  • Record whether the Decision was reached automatically or by a caseworker sets path
  • Emit eligibility.application.decision_completed — Intake records the outcome per member; Determination checks if all Decisions are resolved
deny API →
System denies a Decision based on failing eligibility criteria
System pendingdenied
  • sets decidedAt
  • sets path
  • Store the machine-readable denial reason; required for the Notice of Action and appeal basis (7 CFR § 273.2(h), 42 CFR § 435.917) sets denialReasonCode
  • Emit eligibility.application.decision_completed
mark-ineligible API →
System marks a Decision as categorically ineligible
System pendingineligible

Event Subscriptions

EventEmitted byHandler steps
eligibility.decision.created unknown
  • Match on $object.program:
    • When snap:
      • Call the SNAP expedited screening adapter; if criteria are met, the adapter triggers flag-expedited on the Determination (7 CFR § 273.2(i))
    • When medicaid:
      • Initiate async data exchange for Medicaid ex parte — MAGI income check (FDSH FTI) and existing enrollment check (FDSH Medicare/VCI) (42 CFR § 435.940, 42 CFR § 435.916)
data_exchange.call.completed unknown
  • Call the Medicaid ex parte adapter when all data exchange results for a Decision are in; adapter triggers approve, deny, or mark-ineligible (42 CFR § 435.911)