Journey: The 3730 periodic-report calendar closes a nonfiling case
On this page
A legacy extended-certification SNAP household (the P11 cohort — certified before the 2026-03-02 periodic-reporting phase-out) reaches its periodic-report due month and never files. The 3730 calendar runs itself: the 15th of the prior month stages the informational letter, the 5th of the due month — with no complete Form 528 on file — mints the termination action whose adequate notice IS the combined reminder/termination letter (no further notice is ever sent), and month-end the enact sweep closes the case. The renewals terminal consumer stamps the cycle terminated. Regulatory basis: 7 CFR 273.12(a)(5)(iii); PAMMS SNAP 3730 (notice on the 15th prior, combined notice on the 5th, closure by the end of the due month per the SOP and Chart 3730.1).
Reproducibility tier: Clock-driven harness. This journey is CALENDAR
machinery — its beats are scheduler passes under an advancing fleet logical
clock (ADR-033 test-clock builds), not worker clicks. The certification and
enrollment are created through the worker UI and every outcome is verified on
worker-portal screens, but the month-jumps (advanceTo the 15th, the 5th,
month-end) and the scheduler/sweep passes between them are driven by the
paired spec against the test-clock API. A live demo therefore replays the
spec; there is no hand-followable path through three months of wall-clock
time. Test-clock builds only — the clock endpoints do not exist in production
binaries.
This walkthrough is paired with the automated spec
tests/e2e/specs/journey-snap-periodic-report-calendar.spec.ts, covering
scenario snap.change.periodic-report-nonfiler-termination (journey tier).
The screenshots below are captured by that spec. See Verify it yourself to run it.
Personas & credentials
| Persona | Credentials / identity | Role in the journey |
|---|---|---|
Applicant |
N/A for this journey. The household exists as harness-constructed facts (one working-age adult with reported wages and a seeded mailing address — the 3730 letters are postal, and the render-time recipient gate refuses a head with no usable mailing address rather than mailing a placeholder). The applicant never acts: the whole point is what happens when they do nothing. |
The nonfiling household whose case the calendar closes. |
Caseworker |
Worker portal, Keycloak login |
Creates the cohort certification and enrollment through the UI, and observes each calendar beat on the case’s Notices and Determination tabs. |
Bring-up & reset
cargo xtask dev start --profile full # full devstack, test-clock build
cargo xtask e2e --devstack-profile full journey-snap-periodic-report-calendar.spec.ts
The spec resets the fleet clocks in a finally block, so a failed run never
leaves the devstack living in the future.
The calendar at a glance
The materialized cycle stores three dates the scheduler acts on (all derived from the certification’s midpoint due month):
| Date | 3730 name | What fires |
|---|---|---|
15th of the month before the due month |
Initial notice |
The scheduler stages the informational periodic-report letter
(deliberately not action-bound); the cycle moves |
5th of the due month |
Combined reminder / termination notice |
No complete Form 528 on file → the pass creates the termination action (adequate-notice exempt, 3730:98-108); the routed combined letter becomes the action’s dispatched evidence. That letter IS the final notice. |
End of the due month |
Closure (SOP / Chart 3730.1) |
The enrollment enact sweep executes the termination; the renewals terminal
consumer stamps the cycle |
The walkthrough, step by step
| # | Screen | Action | Expected | Screenshot |
|---|---|---|---|---|
01 |
Caseworker |
Actions → Create certification for the cohort household: start 2026-03-01 (one day before the phase-out cutover — as late as the P11 cohort allows), 12 months, then Create enrollment for the same period (the 5th-of-month trigger needs a live enrollment to terminate). |
The certification and enrollment show on the Determination tab; the household is in the legacy periodic-reporting cohort. |
|
02 |
(scheduler) |
No screenshot — API beat. The first scheduler pass materializes the cycle with its stored 3730 calendar (15th-of-prior / 5th-of-due / month-end dates). |
|
|
03 |
Caseworker |
Clock → the 15th of the month before the due month; scheduler pass. Open the case’s Notices tab. |
The informational periodic-report letter is staged (postal, to the seeded
mailing address); the cycle reads |
|
04 |
Caseworker |
Clock → the 5th of the due month; scheduler pass. No Form 528 was filed. Open the Determination tab. |
A termination action with |
|
05 |
Caseworker |
Clock → month-end; enact sweep. Re-open the Determination tab. |
The case is closed by the end of the due month; the renewals cycle reads
|
|
Verify it yourself
cargo xtask e2e --devstack-profile full journey-snap-periodic-report-calendar.spec.ts
The spec builds the cohort case through the worker UI, advances the fleet
logical clock through the three calendar beats, and asserts the cycle’s
scheduled → notice_sent → terminated progression plus the action’s
dispatched-evidence gate at each step. Fresh screenshots land in
test-results/e2e/walkthroughs/journey-snap-periodic-report-calendar/.
Honest-scope notes
-
The applicant portal shows the letters but offers no Form 528 filing affordance — the filing path (which would avert the termination) is the
snap.change.periodic-report-timely-filingscenario’s concern, not this one. -
Step 02’s materialization is invisible in the UI by design — the cycle’s calendar is scheduler state; workers see its consequences (letters, the action, the closure), not the cycle row itself.
-
A begun due-month at cutover is tombstoned, not walked — the spec pins the cohort start one day before the 2026-03-02 phase-out so the midpoint due month has not begun at first scan (
calendar_elapsed_at_cutoveris the honest tombstone for calendars already in flight).



