3.9.2 - It’s okay to let go of a lock that already let go of you
Released on November 06, 2026
Enhancements ➕➕
Bug Fixes 🐞
- Render list-of-lists table artifacts in
ArtifactDataViewby @devin-ai-integration[bot] in #23359 - Preserve datetime instants when changing timezone by @ashutosh8021 in #23682
- Show an invalid name error from
prefect deploymentcommands for malformed names by @LuisFigueroaG in #23680 - Fix
[object Object]displayed in parameters fields by @uinstinct in #23723 - Align positional-only argument defaults in source-parsed signatures by @udsy19 in #23428
- Preserve
init=Falsedataclass fields invisit_collectionby @Kayvan-Zahiri in #23270 - Release async-acquired locks in
RedisLockManager.release_lockby @devin-ai-integration[bot] in #23654 - Keep recent runs visible in V2 deployment activity charts by @devin-ai-integration[bot] in #23640
- Drop task run events for missing flow runs instead of failing the batch by @devin-ai-integration[bot] in #23664
- Don't crash completed runs when lease renewal gets 410 after terminal state by @devin-ai-integration[bot] in #23659
- Replace stuck readiness tasks when a poll would mark something ready by @devin-ai-integration[bot] in #23644
- Return 422 instead of 503/500 for invalid values in request bodies by @devin-ai-integration[bot] in #23619
- Preserve literal artifact content in CLI JSON output by @RoryGlenn in #23692
- Preserve literal markup and emoji aliases in all CLI JSON/YAML output by @devin-ai-integration[bot] in #23695
- Fix v1 UI ignoring
PREFECT_SERVER_UI_SHOW_PROMOTIONAL_CONTENTby @devin-ai-integration[bot] in #23710 - Accept the same flow state hook signatures in the engine and the runner by @CassianoE in #23715
- Keep deployment schedule parameter overrides on partial schedule updates by @devin-ai-integration[bot] in #23719
- Tolerate release of expired locks in
MemoryLockManagerandFileSystemLockManagerby @Wilson0511 in #23725 - Keep inherited sync client open for tasks submitted via
ThreadPoolTaskRunnerby @devin-ai-integration[bot] in #23749 - Fall back to UTC when the browser reports no time zone in ui-v2 by @devin-ai-integration[bot] in #23738
- Fix
GitRepository.pull_code()ignoringdirectorieschanges on an existing sparse checkout by @CassianoE in #23712 - Preserve JSON Schema references in flow parameters by @ska2704 in #23432
- Disable Rich markup by default in
exit_with_errorby @devin-ai-integration[bot] in #23763 - Fix IndexError in
prefect block type inspect/lson empty description by @devin-ai-integration[bot] in #23762 - Fix 500 from flow run resume when run input has an integer beyond 64 bits by @devin-ai-integration[bot] in #23617
- Treat database and connection pool timeouts as client retryable exceptions by @Tyagiquamar in #23741
- Stop flow run heartbeats before proposing a terminal state by @chrisguidry in #23784
- Fix automation trigger "Format" button submitting the wizard form by @devin-ai-integration[bot] in #23776
- Return False from
still_connectedafter a websocket disconnect message by @chuqCTC in #23781 - Fix
RemoteFileSystemuploading all files when ignore file excludes everything by @devin-ai-integration[bot] in #23786 - Log pull step failures to the API in the workspace resolver by @devin-ai-integration[bot] in #23783
- Remove a failed script from
sys.modulesinload_script_as_moduleby @devin-ai-integration[bot] in #23772 - Surface import errors when the placeholder flow fallback cannot find a non-
defentrypoint by @devin-ai-integration[bot] in #23773 - Fix
visit_collectionfordefaultdict,Counter,deque, andfrozensetby @devin-ai-integration[bot] in #23794 - Keep automations loaded while the triggers service reloads them by @devin-ai-integration[bot] in #23778
- Let
*match an empty string inprefect deploy --namepatterns by @devin-ai-integration[bot] in #23771 - Skip locked rows when sweeping held events by @chuqCTC in #23757
Integrations & Dependencies 🤝
- Bump
pyasn1from 0.6.4 to 0.6.5 by @dependabot[bot] in #23708 - Bump
follow-redirectsfrom 1.16.1 to 1.16.2 in /ui by @dependabot[bot] in #23707 - Bump
@vitest/mockerandvitestin /ui by @dependabot[bot] in #23717 - Bump
pydocketto >=0.27.2 by @chrisguidry in #23729 - Bump
oauthlibfrom 4.0.0 to 4.0.1 by @dependabot[bot] in #23787
Development & Tidiness 🧹
- Fix flaky
test_results_with_timeoutracing a 10ms SIGALRM by @devin-ai-integration[bot] in #23423 - Fix flaky server signal forwarding tests by using OS-assigned ports by @devin-ai-integration[bot] in #23716
- Fix flaky
FlowRunCardtest by trimming generated flow run names in ui-v2 mocks by @devin-ai-integration[bot] in #23713 - Stop credential-obfuscation git clone tests from hitting GitHub by @devin-ai-integration[bot] in #23660
- Add coverage and protocol docs for releasing expired locks by @devin-ai-integration[bot] in #23726
- Drop two asserts that cannot run inside
pytest.raisesblocks by @dylanpulver in #23760 - Tidy up GitHub Actions workflows by @gaker in #23761
Documentation 📓
- Send referrers on outbound links and add missing page descriptions by @madureira-gabriel in #23728
- Note
init=Falsedataclass fields keep resolved values in tasks by @devin-ai-integration[bot] in #23764 - Document reserved event name prefixes by @bunchesofdonald in #23795
Full Changelog: 3.9.1...3.9.2