Explorer/State Machine Docs/Intake

Intake State Machine

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

Application

States

StateDescriptionSLA clock
draft Created but not yet filed; regulatory clock has not started stopped
submitted Formally filed; regulatory clock starts; caseworker task and automated screening initiated running
under_review Caseworker is actively reviewing; clock is running toward the 30/45-day deadline running
pending_approval Determination awaiting supervisor approval; clock paused per agency policy stopped
withdrawn Household withdrew; open tasks cancelled and household notified. Terminal. stopped
closed Intake complete; case management creates a benefit case if approved. Terminal. stopped

Actions

ActionActorsTransitionSteps
submit API →
Formally submits a draft application, starting the regulatory processing clock
Applicant, Case Worker draftsubmitted
  • Record when the application was formally submitted sets submittedAt
  • Emit intake.application.submitted — starts the regulatory clock; triggers caseworker task creation, confirmation notice, and person matching
open API →
System marks a submitted application as under active caseworker review
System submittedunder_review
complete-review API →
Caseworker signals data collection is complete and the application is ready for determination
Case Worker, Supervisor no state change
submit-for-approval API →
System routes the application to supervisor review when state-configured approval thresholds are met
System under_reviewpending_approval
approve-determination API →
Supervisor approves the determination; closes the application and triggers NOA and case creation
Supervisor pending_approvalclosed
  • Record when the intake phase closed sets closedAt
  • Emit intake.application.closed — signals intake is complete; triggers case creation
reject-determination API →
Supervisor rejects the determination and returns the application to the caseworker for revision
Supervisor pending_approvalunder_review
  • Emit intake.determination.rejected — signals the determination was rejected; workflow returns the caseworker task to in_progress via return-to-worker
close API →
Marks a reviewed application as closed after all determinations are complete
Case Worker, Supervisor, System under_reviewclosed
  • Record when the intake phase closed sets closedAt
  • Emit intake.application.closed — signals intake is complete; triggers case creation
withdraw API →
Applicant or caseworker withdraws the application before a decision is made
Applicant, Case Worker, Supervisor submittedorunder_reviewwithdrawn
  • Record when the application was withdrawn sets withdrawnAt
  • Emit intake.application.withdrawn — triggers open task cancellation and withdrawal notice

Event Subscriptions

EventEmitted byHandler steps
workflow.task.claimed Workflow/Task
  • Transition the application from submitted to under_review when a caseworker claims the intake review task
  • Create an Interview record when a caseworker claims an application_review task; SNAP requires an interview before determination (7 CFR § 273.2(e))
intake.application.submitted Intake/Application
  • Create electronic Verifications per member (identity, citizenship, immigration) and per income source (income), and document Verifications at the household level for the given program. Residency is a SNAP-required household-level obligation (7 CFR § 273.2(f)(1)(iii)) — no electronic check exists, so it is created as document-type.
  • Create electronic Verifications per member (identity, citizenship, immigration) and per income source (income), and document Verifications at the household level for the given program. Residency is a SNAP-required household-level obligation (7 CFR § 273.2(f)(1)(iii)) — no electronic check exists, so it is created as document-type.
data_exchange.call.completed unknown
  • Transition the Verification based on the service call result; on inconclusive/partial/error, creates a document fallback per ex parte rules (42 CFR § 435.911)
scheduling.appointment.scheduled unknown
  • Append the appointmentId to Interview.appointments when an appointment is scheduled against an interview subject. Non-interview appointments (subjectType != interview) are ignored.
document_management.document_version.uploaded unknown
  • Satisfy the Verification and record the uploaded document version as evidence; trigger only fires when metadata.intake.verificationId resolves to a known Verification
eligibility.determination.created unknown
  • For each:
    eligibility.application.decision_completed Eligibility/Decision
    • Write eligibility outcome to ApplicationMember.programDeterminations. Informational write-back only — does not trigger application close. Medicaid RTE results may arrive before intake closes; SNAP results typically arrive after.
    eligibility.application.determination_completed Eligibility/Determination
    • If false:
      • Route to supervisor approval when state-configured thresholds are met; states replace this condition with their CEL threshold expression via rules overlay

      Else:
      • Close the application when all determinations are in and no supervisor approval is required
    eligibility.application.expedited Eligibility/Determination
    • Set isExpedited on the application when eligibility screening confirms expedited criteria are met
    client_management.person.match_resolved unknown
    • Set personId and personMatch on ApplicationMember; personId is set only on confirmed matches
    intake.member_income.created unknown
    • If $application.status is not "draft" and $application.status is not "withdrawn" and $application.status is not "closed":
      • If "snap" in $application.programsAppliedFor:
        • {"POST":"intake/applications/verifications","body":{"applicationId":"$application.id","sourceId":"$this.data.id","sourceType":"income","category":"income","verificationType":"electronic"}}
    intake.application_member.created unknown
    • If $application.status is not "draft" and $application.status is not "withdrawn" and $application.status is not "closed":
      • If "snap" in $application.programsAppliedFor:
        • {"POST":"intake/applications/verifications","body":{"applicationId":"$application.id","sourceId":"$this.data.id","sourceType":"member","category":"identity","verificationType":"electronic"}}
      • If "medicaid" in $application.programsAppliedFor:
        • {"POST":"intake/applications/verifications","body":{"applicationId":"$application.id","sourceId":"$this.data.id","sourceType":"member","category":"citizenship","verificationType":"electronic"}}
        • {"POST":"intake/applications/verifications","body":{"applicationId":"$application.id","sourceId":"$this.data.id","sourceType":"member","category":"immigration","verificationType":"electronic"}}
    communication.notice.sent unknown
    • {"PATCH":"intake/applications/verifications/$verification.id","body":{"documentRequests":{"$push":{"noticeId":"$this.subject","type":"$this.data.type","sentAt":"$this.time"}}}}

    Verification

    States

    StateDescriptionSLA clock
    pending Verification item created; electronic check or document request not yet complete stopped
    inconclusive Electronic check returned insufficient data; document fallback triggered (42 CFR § 435.940) stopped
    satisfied Verified — via electronic check, document review, or interview. Terminal. stopped
    waived Verification requirement waived by state policy. Terminal. stopped
    cannot_verify Verification could not be completed after all attempts; caseworker decides next step. Terminal. stopped

    Actions

    ActionActorsTransitionSteps
    satisfy API →
    System marks an obligation as satisfied after receiving conclusive service call or document evidence
    System pendingorinconclusivesatisfied
    mark-inconclusive API →
    System records that a service call returned inconclusive, triggering document fallback
    System pendinginconclusive
    waive API →
    Caseworker grants a waiver for an obligation that cannot be satisfied through normal means
    Case Worker, Supervisor pendingorinconclusivewaived
    mark-cannot-verify API →
    Caseworker closes an obligation when all available verification methods are exhausted
    Case Worker, Supervisor pendingorinconclusivecannot_verify

    Event Subscriptions

    EventEmitted byHandler steps
    intake.verification.created unknown
    • Route each electronic Verification to its required service calls by category; document-type Verifications are skipped by initiateServiceCall