3.9.0 - Pendulum's last swing
Released on October 21, 2026
Breaking Changes ⚠️
- Drop Python 3.10 support by @devin-ai-integration[bot] in #23324
- Remove deprecated Runner execution paths by @desertaxle in #23496
- Deprecate Pendulum datetime behavior on Python 3.11–3.12 by @devin-ai-integration[bot] in #23328
New Features 🎉
- Add Python 3.15 support by @devin-ai-integration[bot] in #23400
Enhancements ➕➕
- Add opt-in clearing for empty deployment schedules by @mifuha in #23412
- Cut CPU spent delivering events and API logs by @desertaxle in #23473
- Open a run's artifacts directly from the Artifacts tab and run graph in ui-v2 by @JonasFockstedt in #23339
- Read automations with action types this version doesn't know by @nathandpeterson in #23426
- Recover cancellation and suspension observers from websocket outages by @devin-ai-integration[bot] in #23421
Bug Fixes 🐞
- Keep the runner healthcheck healthy while the API is in maintenance by @jimid27 in #23325
- Skip duplicate worker submissions of runs that already hold a limit slot by @devin-ai-integration[bot] in #23341
- Fix prefect.yaml creation when optional contents is omitted by @MuhammadWaleed12 in #23334
- Check out pinned
commit_shawhen a git checkout already exists by @devin-ai-integration[bot] in #23374 - Preserve pytz timezone names in
RRuleSchedule.from_rrule()by @devin-ai-integration[bot] in #23396 - Fix
visit_collectionreturning another object's cached result after id reuse by @novain-shibu in #23404 - Make
*args/**kwargsoptional collections in flow parameter schemas by @devin-ai-integration[bot] in #23418 - Return run input from async
pause_flow_runwhen pause is rejected by @devin-ai-integration[bot] in #23435 - Allow
Task.with_options(tags=[])to clear existing tags by @devin-ai-integration[bot] in #23444 - Delete every deployment with
prefect deployment delete --allby @devin-ai-integration[bot] in #23440 - Unwrap
FieldInfodefaults for unmapped parameters intask.map()by @devin-ai-integration[bot] in #23369 - Count expect events that race or precede a proactive trigger's window by @chrisguidry in #23445
- Respect
--hoursinwork-pool previewandwork-queue preview --poolby @LuisFigueroaG in #23300 - Raise
ValueErrorfor negative timeout inpause_flow_runby @kingsley-123 in #22761 - Fix
prefect deploydropping list items templated from step outputs by @MohammadHijjawi97 in #23381 - Copy hook lists in
with_optionsfor tasks and flows by @spicysharkco in #23442 - Return empty list from
extract_instanceswhen there is no match by @udsy19 in #23427 - Fix
timeout=0raising aTimeoutErrorinPrefectFutureList.resultby @uinstinct in #23408 - Fix silently skipped task retries in
retry_condition_fnby @uinstinct in #23397 - Fix overlapping action branches in the automation JSON schema by @devin-ai-integration[bot] in #23448
- Use
min_lengthandmax_lengthon request bodies so the server imports on FastAPI 0.155 by @bunchesofdonald in #23476 - Make flow run activity cells navigable by @VivekVRobo in #23352
- Render run graph artifact icons instead of black boxes in ui-v2 by @JonasFockstedt in #23348
Integrations & Dependencies 🤝
- Bump
source-map-jsfrom 1.2.1 to 1.2.2 in /ui by @dependabot[bot] in #23315 - Bump
postcss-selector-parserfrom 6.1.2 to 6.1.4 in /ui by @dependabot[bot] in #23288 - Bump
serovalfrom 1.6.2 to 1.6.8 in /ui-v2 by @dependabot[bot] in #23314 - Bump
snowflake-connector-pythonfrom 4.7.1 to 4.7.3 by @dependabot[bot] in #23316 - Bump
werkzeugfrom 3.1.6 to 3.1.9 by @dependabot[bot] in #23317 - Bump
makofrom 1.3.12 to 1.4.2 by @dependabot[bot] in #23318 - Bump
multidictfrom 6.7.0 to 6.9.1 by @dependabot[bot] in #23319 - Bump
uvfrom 0.12.10 to 0.12.18 in /scripts/proxy-test by @dependabot[bot] in #23365 - Bump
cairosvgfrom 2.9.0 to 2.9.1 by @dependabot[bot] in #23363 - Bump
source-map-jsfrom 1.2.1 to 1.2.2 in /ui-v2 by @dependabot[bot] in #23364 - Bump
dompurifyfrom 3.4.12 to 3.4.16 in /ui-v2 by @dependabot[bot] in #23362 - Bump
aiohttpfrom 3.14.3 to 3.14.4 by @dependabot[bot] in #23462 - Bump
follow-redirectsfrom 1.16.0 to 1.16.1 in /ui by @dependabot[bot] in #23480 - Bump
vitefrom 8.2.2 to 8.3.4 in /ui by @dependabot[bot] in #23485 - Cap
fastapibelow 0.151 by @bunchesofdonald in #23478 - Update
certifianduvfor the eMudhra CA compromise by @desertaxle in #23483
Development & Tidiness 🧹
- Keep the patched test clock timezone-aware on Python 3.12 by @chrisguidry in #23465
- Wait for the events client to confirm events before asserting in checkpoint tests by @bunchesofdonald in #23477
- Guard internal call sites against Pendulum deprecation warnings by @devin-ai-integration[bot] in #23497
- Replace dead Sanity logo URLs in bundled collection metadata by @mattiamatrix in #23409
Documentation 📓
- Fix broken in-page anchors in the events reference by @wznhf78gyf-bot in #23331
- Fix
itemstype in the base job template customization docs by @rjafarau in #23388 - Document
UnknownActionfor automations and transfer skips by @devin-ai-integration[bot] in #23446 - Document held expect events for proactive triggers with
afterby @devin-ai-integration[bot] in #23467
Full Changelog: 3.8.8...3.9.0