> ## Documentation Index
> Fetch the complete documentation index at: /docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 3.9

> Release notes for Prefect 3.9.0 and 3.9.1, including Python 3.15 support, custom state discovery and filters, and the end of Python 3.10 support.

## 3.9.2 - It’s okay to let go of a lock that already let go of you

*Released on November 06, 2026*

**Enhancements ➕➕**

* Reduce deployment writes from queue polling by [@chuqCTC](https://github.com/chuqCTC) in [#23130](https://github.com/PrefectHQ/prefect/pull/23130)

**Bug Fixes 🐞**

* Render list-of-lists table artifacts in `ArtifactDataView` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23359](https://github.com/PrefectHQ/prefect/pull/23359)
* Preserve datetime instants when changing timezone by [@ashutosh8021](https://github.com/ashutosh8021) in [#23682](https://github.com/PrefectHQ/prefect/pull/23682)
* Show an invalid name error from `prefect deployment` commands for malformed names by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23680](https://github.com/PrefectHQ/prefect/pull/23680)
* Fix `[object Object]` displayed in parameters fields by [@uinstinct](https://github.com/uinstinct) in [#23723](https://github.com/PrefectHQ/prefect/pull/23723)
* Align positional-only argument defaults in source-parsed signatures by [@udsy19](https://github.com/udsy19) in [#23428](https://github.com/PrefectHQ/prefect/pull/23428)
* Preserve `init=False` dataclass fields in `visit_collection` by [@Kayvan-Zahiri](https://github.com/Kayvan-Zahiri) in [#23270](https://github.com/PrefectHQ/prefect/pull/23270)
* Release async-acquired locks in `RedisLockManager.release_lock` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23654](https://github.com/PrefectHQ/prefect/pull/23654)
* Keep recent runs visible in V2 deployment activity charts by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23640](https://github.com/PrefectHQ/prefect/pull/23640)
* Drop task run events for missing flow runs instead of failing the batch by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23664](https://github.com/PrefectHQ/prefect/pull/23664)
* Don't crash completed runs when lease renewal gets 410 after terminal state by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23659](https://github.com/PrefectHQ/prefect/pull/23659)
* Replace stuck readiness tasks when a poll would mark something ready by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23644](https://github.com/PrefectHQ/prefect/pull/23644)
* Return 422 instead of 503/500 for invalid values in request bodies by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23619](https://github.com/PrefectHQ/prefect/pull/23619)
* Preserve literal artifact content in CLI JSON output by [@RoryGlenn](https://github.com/RoryGlenn) in [#23692](https://github.com/PrefectHQ/prefect/pull/23692)
* Preserve literal markup and emoji aliases in all CLI JSON/YAML output by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23695](https://github.com/PrefectHQ/prefect/pull/23695)
* Fix v1 UI ignoring `PREFECT_SERVER_UI_SHOW_PROMOTIONAL_CONTENT` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23710](https://github.com/PrefectHQ/prefect/pull/23710)
* Accept the same flow state hook signatures in the engine and the runner by [@CassianoE](https://github.com/CassianoE) in [#23715](https://github.com/PrefectHQ/prefect/pull/23715)
* Keep deployment schedule parameter overrides on partial schedule updates by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23719](https://github.com/PrefectHQ/prefect/pull/23719)
* Tolerate release of expired locks in `MemoryLockManager` and `FileSystemLockManager` by [@Wilson0511](https://github.com/Wilson0511) in [#23725](https://github.com/PrefectHQ/prefect/pull/23725)
* Keep inherited sync client open for tasks submitted via `ThreadPoolTaskRunner` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23749](https://github.com/PrefectHQ/prefect/pull/23749)
* Fall back to UTC when the browser reports no time zone in ui-v2 by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23738](https://github.com/PrefectHQ/prefect/pull/23738)
* Fix `GitRepository.pull_code()` ignoring `directories` changes on an existing sparse checkout by [@CassianoE](https://github.com/CassianoE) in [#23712](https://github.com/PrefectHQ/prefect/pull/23712)
* Preserve JSON Schema references in flow parameters by [@ska2704](https://github.com/ska2704) in [#23432](https://github.com/PrefectHQ/prefect/pull/23432)
* Disable Rich markup by default in `exit_with_error` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23763](https://github.com/PrefectHQ/prefect/pull/23763)
* Fix IndexError in `prefect block type inspect`/`ls` on empty description by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23762](https://github.com/PrefectHQ/prefect/pull/23762)
* Fix 500 from flow run resume when run input has an integer beyond 64 bits by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23617](https://github.com/PrefectHQ/prefect/pull/23617)
* Treat database and connection pool timeouts as client retryable exceptions by [@Tyagiquamar](https://github.com/Tyagiquamar) in [#23741](https://github.com/PrefectHQ/prefect/pull/23741)
* Stop flow run heartbeats before proposing a terminal state by [@chrisguidry](https://github.com/chrisguidry) in [#23784](https://github.com/PrefectHQ/prefect/pull/23784)
* Fix automation trigger "Format" button submitting the wizard form by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23776](https://github.com/PrefectHQ/prefect/pull/23776)
* Return False from `still_connected` after a websocket disconnect message by [@chuqCTC](https://github.com/chuqCTC) in [#23781](https://github.com/PrefectHQ/prefect/pull/23781)
* Fix `RemoteFileSystem` uploading all files when ignore file excludes everything by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23786](https://github.com/PrefectHQ/prefect/pull/23786)
* Log pull step failures to the API in the workspace resolver by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23783](https://github.com/PrefectHQ/prefect/pull/23783)
* Remove a failed script from `sys.modules` in `load_script_as_module` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23772](https://github.com/PrefectHQ/prefect/pull/23772)
* Surface import errors when the placeholder flow fallback cannot find a non-`def` entrypoint by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23773](https://github.com/PrefectHQ/prefect/pull/23773)
* Fix `visit_collection` for `defaultdict`, `Counter`, `deque`, and `frozenset` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23794](https://github.com/PrefectHQ/prefect/pull/23794)
* Keep automations loaded while the triggers service reloads them by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23778](https://github.com/PrefectHQ/prefect/pull/23778)
* Let `*` match an empty string in `prefect deploy --name` patterns by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23771](https://github.com/PrefectHQ/prefect/pull/23771)
* Skip locked rows when sweeping held events by [@chuqCTC](https://github.com/chuqCTC) in [#23757](https://github.com/PrefectHQ/prefect/pull/23757)

**Integrations & Dependencies 🤝**

* Bump `pyasn1` from 0.6.4 to 0.6.5 by [@dependabot](https://github.com/dependabot)\[bot] in [#23708](https://github.com/PrefectHQ/prefect/pull/23708)
* Bump `follow-redirects` from 1.16.1 to 1.16.2 in /ui by [@dependabot](https://github.com/dependabot)\[bot] in [#23707](https://github.com/PrefectHQ/prefect/pull/23707)
* Bump `@vitest/mocker` and `vitest` in /ui by [@dependabot](https://github.com/dependabot)\[bot] in [#23717](https://github.com/PrefectHQ/prefect/pull/23717)
* Bump `pydocket` to >=0.27.2 by [@chrisguidry](https://github.com/chrisguidry) in [#23729](https://github.com/PrefectHQ/prefect/pull/23729)
* Bump `oauthlib` from 4.0.0 to 4.0.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#23787](https://github.com/PrefectHQ/prefect/pull/23787)

**Development & Tidiness 🧹**

* Fix flaky `test_results_with_timeout` racing a 10ms SIGALRM by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23423](https://github.com/PrefectHQ/prefect/pull/23423)
* Fix flaky server signal forwarding tests by using OS-assigned ports by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23716](https://github.com/PrefectHQ/prefect/pull/23716)
* Fix flaky `FlowRunCard` test by trimming generated flow run names in ui-v2 mocks by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23713](https://github.com/PrefectHQ/prefect/pull/23713)
* Stop credential-obfuscation git clone tests from hitting GitHub by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23660](https://github.com/PrefectHQ/prefect/pull/23660)
* Add coverage and protocol docs for releasing expired locks by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23726](https://github.com/PrefectHQ/prefect/pull/23726)
* Drop two asserts that cannot run inside `pytest.raises` blocks by [@dylanpulver](https://github.com/dylanpulver) in [#23760](https://github.com/PrefectHQ/prefect/pull/23760)
* Tidy up GitHub Actions workflows by [@gaker](https://github.com/gaker) in [#23761](https://github.com/PrefectHQ/prefect/pull/23761)

**Documentation 📓**

* Send referrers on outbound links and add missing page descriptions by [@madureira-gabriel](https://github.com/madureira-gabriel) in [#23728](https://github.com/PrefectHQ/prefect/pull/23728)
* Note `init=False` dataclass fields keep resolved values in tasks by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23764](https://github.com/PrefectHQ/prefect/pull/23764)
* Document reserved event name prefixes by [@bunchesofdonald](https://github.com/bunchesofdonald) in [#23795](https://github.com/PrefectHQ/prefect/pull/23795)

**Full Changelog**: [https://github.com/PrefectHQ/prefect/compare/3.9.1...3.9.2](https://github.com/PrefectHQ/prefect/compare/3.9.1...3.9.2)

***

## 3.9.1 - This hour is a rerun

*Released on October 30, 2026*

**Enhancements ➕➕**

* Add custom state discovery and filters by [@desertaxle](https://github.com/desertaxle) in [#23490](https://github.com/PrefectHQ/prefect/pull/23490)
* Add Run action to the React flows list menu and flow page by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23354](https://github.com/PrefectHQ/prefect/pull/23354)
* Allow sorting task runs by duration by [@nolantonio](https://github.com/nolantonio) in [#23275](https://github.com/PrefectHQ/prefect/pull/23275)
* Allow dismissing the V1 UI sidebar shortcut by [@zzstoatzz](https://github.com/zzstoatzz) in [#23626](https://github.com/PrefectHQ/prefect/pull/23626)
* Enforce duration input minimum by [@uinstinct](https://github.com/uinstinct) in [#23122](https://github.com/PrefectHQ/prefect/pull/23122)
* Cache `get_timezones()` by [@tylerjthomas9](https://github.com/tylerjthomas9) in [#23531](https://github.com/PrefectHQ/prefect/pull/23531)
* Share orchestration clients across automation actions by [@fatih-acar](https://github.com/fatih-acar) in [#23255](https://github.com/PrefectHQ/prefect/pull/23255)
* Restore advisory Cloud API compatibility checks by [@desertaxle](https://github.com/desertaxle) in [#23624](https://github.com/PrefectHQ/prefect/pull/23624)
* Show plain IDs instead of `UUID(...)` reprs in CLI messages by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23650](https://github.com/PrefectHQ/prefect/pull/23650)
* Align date picker popover to the start instead of center by [@uinstinct](https://github.com/uinstinct) in [#23655](https://github.com/PrefectHQ/prefect/pull/23655)

**Bug Fixes 🐞**

* Prevent state persistence error from failing success flow by [@uinstinct](https://github.com/uinstinct) in [#22745](https://github.com/PrefectHQ/prefect/pull/22745)
* Skip unset Pydantic private attributes when rebuilding models in `visit_collection` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23515](https://github.com/PrefectHQ/prefect/pull/23515)
* Retry flows that return a failed state when `retries` is configured by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23535](https://github.com/PrefectHQ/prefect/pull/23535)
* Preserve literal markup and emoji aliases in variable CLI JSON output by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23530](https://github.com/PrefectHQ/prefect/pull/23530)
* Resolve numeric string dict keys in `get_from_dict` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23454](https://github.com/PrefectHQ/prefect/pull/23454)
* Begin SQLite write transaction before reading automation buckets by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23471](https://github.com/PrefectHQ/prefect/pull/23471)
* Fix forked child processes exiting with code 1 because of QueueService at-exit drain by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23464](https://github.com/PrefectHQ/prefect/pull/23464)
* Serialize context on every `ProcessPoolTaskRunner.submit()` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23376](https://github.com/PrefectHQ/prefect/pull/23376)
* Schedule `astop` on SIGTERM instead of dropping the coroutine by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23346](https://github.com/PrefectHQ/prefect/pull/23346)
* Keep flows search input focused while filtering by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23338](https://github.com/PrefectHQ/prefect/pull/23338)
* Keep daily `IntervalSchedule` wall-clock time across DST when start is after the change by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23205](https://github.com/PrefectHQ/prefect/pull/23205)
* Allow the provisioned ECS execution role to create CloudWatch log groups by [@Sagargupta16](https://github.com/Sagargupta16) in [#23557](https://github.com/PrefectHQ/prefect/pull/23557)
* Fix `GitRepository.pull_code()` re-cloning a shallow clone on every new commit by [@CassianoE](https://github.com/CassianoE) in [#23351](https://github.com/PrefectHQ/prefect/pull/23351)
* Substitute `apply_values` placeholders in a single pass by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23494](https://github.com/PrefectHQ/prefect/pull/23494)
* Percent-encode path values in `url_for` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23493](https://github.com/PrefectHQ/prefect/pull/23493)
* Read automation buckets in a single query to avoid refresh race by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23604](https://github.com/PrefectHQ/prefect/pull/23604)
* Delete every automation with `prefect automation delete --all` by [@cf3901646](https://github.com/cf3901646) in [#23521](https://github.com/PrefectHQ/prefect/pull/23521)
* Apply both `any_` and `not_any_` in flow run state filters by [@spicysharkco](https://github.com/spicysharkco) in [#23459](https://github.com/PrefectHQ/prefect/pull/23459)
* Fix JSON flow results with `data` or `result` keys reading back wrong by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23377](https://github.com/PrefectHQ/prefect/pull/23377)
* Preserve deployment concurrency lease ID on forced flow run state changes by [@darshjoshi](https://github.com/darshjoshi) in [#23304](https://github.com/PrefectHQ/prefect/pull/23304)
* Fix `filter_files` aborting on a directory symlink cycle by [@aayushbaluni](https://github.com/aayushbaluni) in [#23307](https://github.com/PrefectHQ/prefect/pull/23307)
* Preserve cron start bounds in repeated DST hours by [@zzstoatzz](https://github.com/zzstoatzz) in [#23634](https://github.com/PrefectHQ/prefect/pull/23634)
* Recover cron occurrences shifted through DST gaps by [@zzstoatzz](https://github.com/zzstoatzz) in [#23636](https://github.com/PrefectHQ/prefect/pull/23636)
* Exit non-zero from `flow-run execute` when a crash cannot be reported by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23393](https://github.com/PrefectHQ/prefect/pull/23393)
* Skip repeated cron occurrences during scheduler refills by [@zzstoatzz](https://github.com/zzstoatzz) in [#23652](https://github.com/PrefectHQ/prefect/pull/23652)
* Stop extra cron runs during DST refills on Python 3.11 and 3.12 by [@desertaxle](https://github.com/desertaxle) in [#23672](https://github.com/PrefectHQ/prefect/pull/23672)
* Fall back to placeholder for any `jsonable_encoder` error in `Flow.serialize_parameters` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23630](https://github.com/PrefectHQ/prefect/pull/23630)
* Fix 500 from flow run list endpoints when a parameter exceeds 64 bits by [@DEVJHAWAR11](https://github.com/DEVJHAWAR11) in [#23429](https://github.com/PrefectHQ/prefect/pull/23429)
* Reset pause keys when a blocking pause is rescheduled by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23399](https://github.com/PrefectHQ/prefect/pull/23399)
* Read until final state after terminal event in `wait_for_flow_run` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23669](https://github.com/PrefectHQ/prefect/pull/23669)
* Display zero and false enum selections in the UI by [@ashutosh8021](https://github.com/ashutosh8021) in [#23656](https://github.com/PrefectHQ/prefect/pull/23656)
* Publish duration lower bounds only where validation enforces them by [@gaker](https://github.com/gaker) in [#23507](https://github.com/PrefectHQ/prefect/pull/23507)
* Read metric triggers on metrics this version doesn't know by [@nathandpeterson](https://github.com/nathandpeterson) in [#23513](https://github.com/PrefectHQ/prefect/pull/23513)
* Fix duplicate retries label in deployments custom run by [@uinstinct](https://github.com/uinstinct) in [#23343](https://github.com/PrefectHQ/prefect/pull/23343)
* Show a not-found error from `prefect flow-run inspect` for missing runs by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23329](https://github.com/PrefectHQ/prefect/pull/23329)
* Show a not-found error from `prefect deployment run --id` for missing deployments by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23586](https://github.com/PrefectHQ/prefect/pull/23586)
* Show an invalid ID error from `prefect deployment run --id` for malformed IDs by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23621](https://github.com/PrefectHQ/prefect/pull/23621)
* Show an invalid slug error from `prefect block inspect` and `block delete` for extra slashes by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23670](https://github.com/PrefectHQ/prefect/pull/23670)
* Read every global concurrency limit in `prefect transfer` by [@spicysharkco](https://github.com/spicysharkco) in [#23456](https://github.com/PrefectHQ/prefect/pull/23456)
* Add `url` property to client-side `ReceivedEvent` by [@ethanstoner](https://github.com/ethanstoner) in [#23181](https://github.com/PrefectHQ/prefect/pull/23181)
* Prevent incorrect cached task results by preserving DataFrame column order by [@uinstinct](https://github.com/uinstinct) in [#23303](https://github.com/PrefectHQ/prefect/pull/23303)
* Raise `ObjectUnsupported` from the async `create_work_pool` when the plan doesn't allow the pool by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23610](https://github.com/PrefectHQ/prefect/pull/23610)
* Fix task returning another task's cached results by [@uinstinct](https://github.com/uinstinct) in [#23468](https://github.com/PrefectHQ/prefect/pull/23468)
* Make date range span relative instead of absolute by [@uinstinct](https://github.com/uinstinct) in [#23086](https://github.com/PrefectHQ/prefect/pull/23086)
* Fix returned failed states being cached as successful task results by [@uinstinct](https://github.com/uinstinct) in [#23523](https://github.com/PrefectHQ/prefect/pull/23523)
* Fix date changing when clicking pm in date selector by [@uinstinct](https://github.com/uinstinct) in [#23622](https://github.com/PrefectHQ/prefect/pull/23622)
* Fix "use default value" doing nothing in parameter inputs by [@uinstinct](https://github.com/uinstinct) in [#23657](https://github.com/PrefectHQ/prefect/pull/23657)

**Integrations & Dependencies 🤝**

* Make the server compatible with SQLAlchemy 2.1 by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23201](https://github.com/PrefectHQ/prefect/pull/23201)
* Lock current `prefect-redis` and `prefect-kubernetes` for the Docker image by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23537](https://github.com/PrefectHQ/prefect/pull/23537)
* Bump stale integration pins in `uv.lock` and keep them current on release by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23527](https://github.com/PrefectHQ/prefect/pull/23527)
* Upgrade cyclopts to 5.3.2 and keep CLI exit codes and command names by [@gaker](https://github.com/gaker) in [#23646](https://github.com/PrefectHQ/prefect/pull/23646)
* Refresh the Python and UI dependency lockfiles by [@gaker](https://github.com/gaker) in [#23666](https://github.com/PrefectHQ/prefect/pull/23666)
* Move the remaining Node 20 pins to Node 22 by [@znicholasbrown](https://github.com/znicholasbrown) in [#23509](https://github.com/PrefectHQ/prefect/pull/23509)
* Update Node to the October 2026 security releases by [@znicholasbrown](https://github.com/znicholasbrown) in [#23508](https://github.com/PrefectHQ/prefect/pull/23508)
* Bump vite from 8.2.2 to 8.3.4 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23488](https://github.com/PrefectHQ/prefect/pull/23488)
* Bump opentelemetry-api from 1.44.0 to 1.45.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#23539](https://github.com/PrefectHQ/prefect/pull/23539)
* Bump zod from 4.5.4 to 4.6.7 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23547](https://github.com/PrefectHQ/prefect/pull/23547)
* Bump graphql-core from 3.2.7 to 3.2.12 by [@dependabot](https://github.com/dependabot)\[bot] in [#23542](https://github.com/PrefectHQ/prefect/pull/23542)
* Bump pillow from 12.3.0 to 13.0.0 by [@dependabot](https://github.com/dependabot)\[bot] in [#23541](https://github.com/PrefectHQ/prefect/pull/23541)
* Bump virtualenv from 21.7.13 to 21.14.9 by [@dependabot](https://github.com/dependabot)\[bot] in [#23540](https://github.com/PrefectHQ/prefect/pull/23540)
* Bump virtualenv from 21.14.9 to 21.14.13 by [@dependabot](https://github.com/dependabot)\[bot] in [#23584](https://github.com/PrefectHQ/prefect/pull/23584)
* Bump storybook from 10.6.0 to 10.6.3 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23549](https://github.com/PrefectHQ/prefect/pull/23549)
* Bump lodash-es and mermaid in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23551](https://github.com/PrefectHQ/prefect/pull/23551)
* Bump dompurify from 3.4.16 to 3.4.17 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23548](https://github.com/PrefectHQ/prefect/pull/23548)
* Bump undici from 8.11.2 to 8.12.3 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23581](https://github.com/PrefectHQ/prefect/pull/23581)
* Bump fast-uri from 3.1.7 to 3.1.9 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23582](https://github.com/PrefectHQ/prefect/pull/23582)
* Bump msgpack from 1.2.1 to 1.2.3 by [@dependabot](https://github.com/dependabot)\[bot] in [#23633](https://github.com/PrefectHQ/prefect/pull/23633)
* Bump qs from 6.16.0 to 6.17.0 in /ui by [@dependabot](https://github.com/dependabot)\[bot] in [#23632](https://github.com/PrefectHQ/prefect/pull/23632)

**Development & Tidiness 🧹**

* Fix flaky `TestRemoteFileSystem` tree-project tests by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23554](https://github.com/PrefectHQ/prefect/pull/23554)
* Fix flaky worker channel tests racing a 1s wall-clock deadline by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23450](https://github.com/PrefectHQ/prefect/pull/23450)
* Fix flaky `TestWorkerLogging` test caused by logging leak from `prefect config` CLI tests by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23297](https://github.com/PrefectHQ/prefect/pull/23297)
* Fix flaky `StateFilter` discovery cap search test by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23556](https://github.com/PrefectHQ/prefect/pull/23556)
* Fix flaky `date_diff_seconds` from-now tests by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23451](https://github.com/PrefectHQ/prefect/pull/23451)
* Fix background worker shutdown hang when worker cancellation is lost by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23511](https://github.com/PrefectHQ/prefect/pull/23511)
* Ignore Python 3.15 multi-threaded fork warning in forked child service test by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23562](https://github.com/PrefectHQ/prefect/pull/23562)
* Fix flaky events E2E tests by filtering by exact resource IDs by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23579](https://github.com/PrefectHQ/prefect/pull/23579)
* Fix flaky `TestProcessPoolTaskRunner::test_submit_remains_non_blocking` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23605](https://github.com/PrefectHQ/prefect/pull/23605)
* Fix flaky `TestFlowRunLogs` tests by filtering logs by flow run by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23611](https://github.com/PrefectHQ/prefect/pull/23611)
* Refresh and verify Docker image CA trust stores by [@zzstoatzz](https://github.com/zzstoatzz) in [#23517](https://github.com/PrefectHQ/prefect/pull/23517)
* Document SQLite `BEGIN IMMEDIATE` contract in server AGENTS.md by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23560](https://github.com/PrefectHQ/prefect/pull/23560)
* Document `_pendulum_call` contract in `src/prefect` AGENTS.md by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23499](https://github.com/PrefectHQ/prefect/pull/23499)

**Documentation 📓**

* Document Python 3.15 support and ISO duration inputs for `within` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23498](https://github.com/PrefectHQ/prefect/pull/23498)
* Document flow retries for returned Failed states by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23543](https://github.com/PrefectHQ/prefect/pull/23543)
* Document microbatch task runs and partial success in `PrefectDbtRunner` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23361](https://github.com/PrefectHQ/prefect/pull/23361)
* Correct the reverse-proxy UI settings table by [@himanshuchawla0807-gif](https://github.com/himanshuchawla0807-gif) in [#23479](https://github.com/PrefectHQ/prefect/pull/23479)
* Document `event.url` in automation templates by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23607](https://github.com/PrefectHQ/prefect/pull/23607)
* Set canonical URLs to [www.prefect.io](http://www.prefect.io) by [@maximearmstrong](https://github.com/maximearmstrong) in [#23641](https://github.com/PrefectHQ/prefect/pull/23641)
* Link to the docs at [www.prefect.io/docs](http://www.prefect.io/docs) by [@maximearmstrong](https://github.com/maximearmstrong) in [#23642](https://github.com/PrefectHQ/prefect/pull/23642)
* Fix broken docs links and stop redirecting missing pages to the homepage by [@maximearmstrong](https://github.com/maximearmstrong) in [#23651](https://github.com/PrefectHQ/prefect/pull/23651)

**Full Changelog**: [https://github.com/PrefectHQ/prefect/compare/3.9.0...3.9.1](https://github.com/PrefectHQ/prefect/compare/3.9.0...3.9.1)

***

## 3.9.0 - Pendulum's last swing

*Released on October 21, 2026*

**Breaking Changes ⚠️**

* Drop Python 3.10 support by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23324](https://github.com/PrefectHQ/prefect/pull/23324)
* Remove deprecated Runner execution paths by [@desertaxle](https://github.com/desertaxle) in [#23496](https://github.com/PrefectHQ/prefect/pull/23496)
* Deprecate Pendulum datetime behavior on Python 3.11–3.12 by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23328](https://github.com/PrefectHQ/prefect/pull/23328)

**New Features 🎉**

* Add Python 3.15 support by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23400](https://github.com/PrefectHQ/prefect/pull/23400)

**Enhancements ➕➕**

* Add opt-in clearing for empty deployment schedules by [@mifuha](https://github.com/mifuha) in [#23412](https://github.com/PrefectHQ/prefect/pull/23412)
* Cut CPU spent delivering events and API logs by [@desertaxle](https://github.com/desertaxle) in [#23473](https://github.com/PrefectHQ/prefect/pull/23473)
* Open a run's artifacts directly from the Artifacts tab and run graph in ui-v2 by [@JonasFockstedt](https://github.com/JonasFockstedt) in [#23339](https://github.com/PrefectHQ/prefect/pull/23339)
* Read automations with action types this version doesn't know by [@nathandpeterson](https://github.com/nathandpeterson) in [#23426](https://github.com/PrefectHQ/prefect/pull/23426)
* Recover cancellation and suspension observers from websocket outages by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23421](https://github.com/PrefectHQ/prefect/pull/23421)

**Bug Fixes 🐞**

* Keep the runner healthcheck healthy while the API is in maintenance by [@jimid27](https://github.com/jimid27) in [#23325](https://github.com/PrefectHQ/prefect/pull/23325)
* Skip duplicate worker submissions of runs that already hold a limit slot by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23341](https://github.com/PrefectHQ/prefect/pull/23341)
* Fix prefect.yaml creation when optional contents is omitted by [@MuhammadWaleed12](https://github.com/MuhammadWaleed12) in [#23334](https://github.com/PrefectHQ/prefect/pull/23334)
* Check out pinned `commit_sha` when a git checkout already exists by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23374](https://github.com/PrefectHQ/prefect/pull/23374)
* Preserve pytz timezone names in `RRuleSchedule.from_rrule()` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23396](https://github.com/PrefectHQ/prefect/pull/23396)
* Fix `visit_collection` returning another object's cached result after id reuse by [@novain-shibu](https://github.com/novain-shibu) in [#23404](https://github.com/PrefectHQ/prefect/pull/23404)
* Make `*args`/`**kwargs` optional collections in flow parameter schemas by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23418](https://github.com/PrefectHQ/prefect/pull/23418)
* Return run input from async `pause_flow_run` when pause is rejected by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23435](https://github.com/PrefectHQ/prefect/pull/23435)
* Allow `Task.with_options(tags=[])` to clear existing tags by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23444](https://github.com/PrefectHQ/prefect/pull/23444)
* Delete every deployment with `prefect deployment delete --all` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23440](https://github.com/PrefectHQ/prefect/pull/23440)
* Unwrap `FieldInfo` defaults for unmapped parameters in `task.map()` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23369](https://github.com/PrefectHQ/prefect/pull/23369)
* Count expect events that race or precede a proactive trigger's window by [@chrisguidry](https://github.com/chrisguidry) in [#23445](https://github.com/PrefectHQ/prefect/pull/23445)
* Respect `--hours` in `work-pool preview` and `work-queue preview --pool` by [@LuisFigueroaG](https://github.com/LuisFigueroaG) in [#23300](https://github.com/PrefectHQ/prefect/pull/23300)
* Raise `ValueError` for negative timeout in `pause_flow_run` by [@kingsley-123](https://github.com/kingsley-123) in [#22761](https://github.com/PrefectHQ/prefect/pull/22761)
* Fix `prefect deploy` dropping list items templated from step outputs by [@MohammadHijjawi97](https://github.com/MohammadHijjawi97) in [#23381](https://github.com/PrefectHQ/prefect/pull/23381)
* Copy hook lists in `with_options` for tasks and flows by [@spicysharkco](https://github.com/spicysharkco) in [#23442](https://github.com/PrefectHQ/prefect/pull/23442)
* Return empty list from `extract_instances` when there is no match by [@udsy19](https://github.com/udsy19) in [#23427](https://github.com/PrefectHQ/prefect/pull/23427)
* Fix `timeout=0` raising a `TimeoutError` in `PrefectFutureList.result` by [@uinstinct](https://github.com/uinstinct) in [#23408](https://github.com/PrefectHQ/prefect/pull/23408)
* Fix silently skipped task retries in `retry_condition_fn` by [@uinstinct](https://github.com/uinstinct) in [#23397](https://github.com/PrefectHQ/prefect/pull/23397)
* Fix overlapping action branches in the automation JSON schema by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23448](https://github.com/PrefectHQ/prefect/pull/23448)
* Use `min_length` and `max_length` on request bodies so the server imports on FastAPI 0.155 by [@bunchesofdonald](https://github.com/bunchesofdonald) in [#23476](https://github.com/PrefectHQ/prefect/pull/23476)
* Make flow run activity cells navigable by [@VivekVRobo](https://github.com/VivekVRobo) in [#23352](https://github.com/PrefectHQ/prefect/pull/23352)
* Render run graph artifact icons instead of black boxes in ui-v2 by [@JonasFockstedt](https://github.com/JonasFockstedt) in [#23348](https://github.com/PrefectHQ/prefect/pull/23348)

**Integrations & Dependencies 🤝**

* Bump `source-map-js` from 1.2.1 to 1.2.2 in /ui by [@dependabot](https://github.com/dependabot)\[bot] in [#23315](https://github.com/PrefectHQ/prefect/pull/23315)
* Bump `postcss-selector-parser` from 6.1.2 to 6.1.4 in /ui by [@dependabot](https://github.com/dependabot)\[bot] in [#23288](https://github.com/PrefectHQ/prefect/pull/23288)
* Bump `seroval` from 1.6.2 to 1.6.8 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23314](https://github.com/PrefectHQ/prefect/pull/23314)
* Bump `snowflake-connector-python` from 4.7.1 to 4.7.3 by [@dependabot](https://github.com/dependabot)\[bot] in [#23316](https://github.com/PrefectHQ/prefect/pull/23316)
* Bump `werkzeug` from 3.1.6 to 3.1.9 by [@dependabot](https://github.com/dependabot)\[bot] in [#23317](https://github.com/PrefectHQ/prefect/pull/23317)
* Bump `mako` from 1.3.12 to 1.4.2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23318](https://github.com/PrefectHQ/prefect/pull/23318)
* Bump `multidict` from 6.7.0 to 6.9.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#23319](https://github.com/PrefectHQ/prefect/pull/23319)
* Bump `uv` from 0.12.10 to 0.12.18 in /scripts/proxy-test by [@dependabot](https://github.com/dependabot)\[bot] in [#23365](https://github.com/PrefectHQ/prefect/pull/23365)
* Bump `cairosvg` from 2.9.0 to 2.9.1 by [@dependabot](https://github.com/dependabot)\[bot] in [#23363](https://github.com/PrefectHQ/prefect/pull/23363)
* Bump `source-map-js` from 1.2.1 to 1.2.2 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23364](https://github.com/PrefectHQ/prefect/pull/23364)
* Bump `dompurify` from 3.4.12 to 3.4.16 in /ui-v2 by [@dependabot](https://github.com/dependabot)\[bot] in [#23362](https://github.com/PrefectHQ/prefect/pull/23362)
* Bump `aiohttp` from 3.14.3 to 3.14.4 by [@dependabot](https://github.com/dependabot)\[bot] in [#23462](https://github.com/PrefectHQ/prefect/pull/23462)
* Bump `follow-redirects` from 1.16.0 to 1.16.1 in /ui by [@dependabot](https://github.com/dependabot)\[bot] in [#23480](https://github.com/PrefectHQ/prefect/pull/23480)
* Bump `vite` from 8.2.2 to 8.3.4 in /ui by [@dependabot](https://github.com/dependabot)\[bot] in [#23485](https://github.com/PrefectHQ/prefect/pull/23485)
* Cap `fastapi` below 0.151 by [@bunchesofdonald](https://github.com/bunchesofdonald) in [#23478](https://github.com/PrefectHQ/prefect/pull/23478)
* Update `certifi` and `uv` for the eMudhra CA compromise by [@desertaxle](https://github.com/desertaxle) in [#23483](https://github.com/PrefectHQ/prefect/pull/23483)

**Development & Tidiness 🧹**

* Keep the patched test clock timezone-aware on Python 3.12 by [@chrisguidry](https://github.com/chrisguidry) in [#23465](https://github.com/PrefectHQ/prefect/pull/23465)
* Wait for the events client to confirm events before asserting in checkpoint tests by [@bunchesofdonald](https://github.com/bunchesofdonald) in [#23477](https://github.com/PrefectHQ/prefect/pull/23477)
* Guard internal call sites against Pendulum deprecation warnings by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23497](https://github.com/PrefectHQ/prefect/pull/23497)
* Replace dead Sanity logo URLs in bundled collection metadata by [@mattiamatrix](https://github.com/mattiamatrix) in [#23409](https://github.com/PrefectHQ/prefect/pull/23409)

**Documentation 📓**

* Fix broken in-page anchors in the events reference by [@wznhf78gyf-bot](https://github.com/wznhf78gyf-bot) in [#23331](https://github.com/PrefectHQ/prefect/pull/23331)
* Fix `items` type in the base job template customization docs by [@rjafarau](https://github.com/rjafarau) in [#23388](https://github.com/PrefectHQ/prefect/pull/23388)
* Document `UnknownAction` for automations and transfer skips by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23446](https://github.com/PrefectHQ/prefect/pull/23446)
* Document held expect events for proactive triggers with `after` by [@devin-ai-integration](https://github.com/devin-ai-integration)\[bot] in [#23467](https://github.com/PrefectHQ/prefect/pull/23467)

**Full Changelog**: [https://github.com/PrefectHQ/prefect/compare/3.8.8...3.9.0](https://github.com/PrefectHQ/prefect/compare/3.8.8...3.9.0)

***
