Kevin Hu
02/16/2026, 7:43 PMMarvin
02/16/2026, 7:44 PMNate
02/16/2026, 7:46 PM» uvx prefect deployment schedule ls solux-update/circadian-lights -o json | jq
[
{
"id": "567baee9-f1f1-47fa-835e-cd1d03f5a0a4",
"created": "2026-01-11T13:18:05.830849Z",
"updated": "2026-02-16T18:35:01.742773Z",
"deployment_id": "a55ef035-4c74-4667-89a9-d730e5c10f3e",
"schedule": "interval: 0:15:00s",
"active": true,
"max_scheduled_runs": null,
"parameters": {},
"slug": null
}
]Marvin
02/16/2026, 7:47 PMKevin Hu
02/16/2026, 7:54 PMschedules:
- cron: "0 10 * * 1-5"
timezone: "UTC"
- cron: "0 7-23 * * 1-5"
timezone: "America/New_York"
- cron: "0 */6 * * 0,6"
timezone: "America/New_York"
schedule json
[
{
"id": "8f70ba01-f4d8-4496-890c-03753dd40255",
"created": "2026-02-11T22:02:55.786018Z",
"updated": "2026-02-16T19:21:35.572219Z",
"deployment_id": "0b3db108-7608-413e-9aaf-004ed05e7f3a",
"schedule": "cron: 0 7-23 * * 1-5",
"active": true,
"max_scheduled_runs": null,
"parameters": {},
"slug": null
},
{
"id": "bc0a6eee-efa1-47ca-8342-e8e4ecc92903",
"created": "2026-02-11T22:02:55.786026Z",
"updated": "2026-02-11T22:02:55.786028Z",
"deployment_id": "0b3db108-7608-413e-9aaf-004ed05e7f3a",
"schedule": "cron: 0 */6 * * 0,6",
"active": true,
"max_scheduled_runs": null,
"parameters": {},
"slug": null
},
{
"id": "626bb6ef-745c-4c87-b9d4-661cd20762cb",
"created": "2026-02-11T22:02:55.786003Z",
"updated": "2026-02-11T22:02:55.786011Z",
"deployment_id": "0b3db108-7608-413e-9aaf-004ed05e7f3a",
"schedule": "cron: 0 10 * * 1-5",
"active": true,
"max_scheduled_runs": null,
"parameters": {},
"slug": null
}
]Kevin Hu
02/16/2026, 7:55 PMMarvin
02/17/2026, 12:09 PMMarvin
02/17/2026, 12:16 PMprefect deployment schedule ls -o json replaces the full schedule object with a human-readable string like cron: 0 7-23 * * 1-5, so the timezone isn’t shown there. Your prefect.yaml shows the correct timezones, and the API does store them.
- Your three schedules aren’t identical and shouldn’t collide by cron/time alone:
- 0 10 * * 1-5 (UTC)
- 0 7-23 * * 1-5 (America/New_York)
- 0 */6 * * 0,6 (America/New_York)
What we know so far
- I don’t see a confirmed, open 3.6.16 bug that exactly matches “three schedules stop producing upcoming runs until toggled”. However, there has been recent work around multiple schedules and schedule slug handling. I want to dig deeper with a repro if you’re open to it.
- There’s a somewhat-related prior report about multiple schedules not producing upcoming runs when they share the same cron (older 3.x), which your setup does not, but the symptoms are similar: Multiple schedules with the same cron expression are not properly executed.
- 3.6.17 release notes added schedule slug rename support (“replaces”): PR #20460 and the 3.6.16→3.6.17 diff is here: Full changelog.
A few targeted questions to help us narrow it down
- Prefect Cloud or self-hosted Prefect Server?
- Did all three schedules stall, or just one of them? Roughly when did “Upcoming Runs” stop advancing (timestamp + timezone)?
- Did you recently rename schedules (or change schedule names) before this occurred?
- After toggling off/on, did all three schedules begin producing runs again?
Ways to verify timezones and schedule state
- Python client (shows full schedule objects including timezone):
import anyio
from prefect.client.orchestration import get_client
async def main(deployment_id: str):
async with get_client() as client:
schedules = await client.read_deployment_schedules(deployment_id)
for s in schedules:
print(s.id, s.schedule, getattr(s.schedule, "timezone", None), s.active)
anyio.run(main, "<your-deployment-id>")
- CLI (lists schedules, though timezone isn’t shown):
prefect deployment schedule ls "<flow-name>/<deployment-name>" -o json
- Toggle (your current workaround, confirmed to “reset” upcoming runs):
prefect deployment schedule pause "<flow-name>/<deployment-name>"
prefect deployment schedule resume "<flow-name>/<deployment-name>"
Short-term mitigations to try
- Keep all three schedules active but stagger by a minute to rule out any edge-case de-duplication:
- e.g., change one to run at minute 1 or 2 past the hour temporarily and see if the stall recurs.
- If you renamed schedules recently, avoid chained/swap renames for now; keep names/slugs unique and change them one at a time.
If you can share:
- Cloud vs self-hosted
- The last “good” upcoming run timestamp and the first “missing” one
- Whether only one schedule stalled or all three
…I can open a GitHub issue with a minimal repro using your cron expressions and track it with the team. If you’d prefer to file it directly, we’ll jump on it — please include your YAML schedules and the “toggling schedules restored upcoming runs” detail.Kevin Hu
02/17/2026, 1:41 PMMarvin
02/17/2026, 1:41 PMMarvin
02/17/2026, 1:43 PMcron: 0 7-23 * * 1-5) and drops timezone. The API does store your timezones (UTC and America/New_York) as you defined in prefect.yaml; to see them programmatically, use the client/REST API instead of -o json.
If you’d like, I can track this for you and ping when the patch release is live; otherwise, once 3.6.18 (or the 3.6.x release that includes the fix) is out, upgrading should resolve it without further changes to your schedules.Kevin Hu
02/17/2026, 1:46 PMMarvin
02/17/2026, 1:46 PMMarvin
02/17/2026, 1:47 PMprefect version)
- Whether any schedule names/slugs were renamed recently
- Approximate timestamp/timezone when Upcoming Runs stopped advancing
- Whether all three schedules stalled, or just one/twoKevin Hu
02/17/2026, 1:51 PMMarvin
02/17/2026, 1:51 PMMarvin
02/17/2026, 1:51 PM