prefect-client 3.9.1.dev2__tar.gz → 3.9.1.dev4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/PKG-INFO +4 -4
  2. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/pyproject.toml +3 -3
  3. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/AGENTS.md +10 -1
  4. prefect_client-3.9.1.dev4/src/prefect/_build_info.py +5 -0
  5. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/services.py +3 -2
  6. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/notifications.py +2 -4
  7. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/AGENTS.md +1 -0
  8. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/schemas/automations.py +11 -3
  9. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/flow_engine.py +20 -2
  10. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/provisioners/ecs.py +86 -19
  11. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/runner.py +10 -4
  12. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/storage.py +18 -7
  13. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/__init__.py +2 -0
  14. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/background_workers.py +25 -19
  15. prefect_client-3.9.1.dev4/src/prefect/server/api/observed_states.py +32 -0
  16. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/server.py +1 -0
  17. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/ui/flow_runs.py +1 -1
  18. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/task_runners.py +28 -12
  19. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/types/_datetime.py +18 -3
  20. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/collections.py +30 -8
  21. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/templating/AGENTS.md +1 -0
  22. prefect_client-3.9.1.dev2/src/prefect/_build_info.py +0 -5
  23. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/.gitignore +0 -0
  24. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/LICENSE +0 -0
  25. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/README.md +0 -0
  26. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/hatch_build.py +0 -0
  27. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/.prefectignore +0 -0
  28. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/__init__.py +0 -0
  29. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/__main__.py +0 -0
  30. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/__init__.py +0 -0
  31. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/_launchers.py +0 -0
  32. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/bundles/__init__.py +0 -0
  33. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/bundles/execute.py +0 -0
  34. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/plugins/__init__.py +0 -0
  35. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/plugins/apply.py +0 -0
  36. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
  37. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/plugins/manager.py +0 -0
  38. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/plugins/spec.py +0 -0
  39. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/sla/__init__.py +0 -0
  40. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/sla/client.py +0 -0
  41. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_experimental/sla/objects.py +0 -0
  42. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_flow_run_suspension.py +0 -0
  43. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/__init__.py +0 -0
  44. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/_logging.py +0 -0
  45. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/_observation_delivery.py +0 -0
  46. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/__init__.py +0 -0
  47. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/ci_detection.py +0 -0
  48. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/client.py +0 -0
  49. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/device_id.py +0 -0
  50. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/emit.py +0 -0
  51. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/enabled.py +0 -0
  52. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/events.py +0 -0
  53. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/milestones.py +0 -0
  54. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/notice.py +0 -0
  55. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/analytics/service.py +0 -0
  56. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/ast_utils.py +0 -0
  57. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/attempt_control.py +0 -0
  58. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/buildx.py +0 -0
  59. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/__init__.py +0 -0
  60. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
  61. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/backports.py +0 -0
  62. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/blocks.py +0 -0
  63. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  64. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/deprecated_paths.py +0 -0
  65. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/migration.py +0 -0
  66. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/compatibility/starlette.py +0 -0
  67. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/__init__.py +0 -0
  68. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/api.py +0 -0
  69. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/calls.py +0 -0
  70. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  71. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  72. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/inspection.py +0 -0
  73. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/primitives.py +0 -0
  74. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/threads.py +0 -0
  75. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/concurrency/waiters.py +0 -0
  76. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/control_listener.py +0 -0
  77. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/deprecated.py +0 -0
  78. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/engine.py +0 -0
  79. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/git.py +0 -0
  80. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/infrastructure_exit_codes.py +0 -0
  81. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/installation.py +0 -0
  82. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/integrations.py +0 -0
  83. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/launchers.py +0 -0
  84. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/lazy.py +0 -0
  85. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/metrics.py +0 -0
  86. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/observability.py +0 -0
  87. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/observers.py +0 -0
  88. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/plugins/__init__.py +0 -0
  89. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/plugins/apply.py +0 -0
  90. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/plugins/collections.py +0 -0
  91. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/plugins/diagnostics.py +0 -0
  92. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/plugins/manager.py +0 -0
  93. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/plugins/spec.py +0 -0
  94. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/plugins/startup.py +0 -0
  95. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/pydantic/__init__.py +0 -0
  96. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/pydantic/schemas.py +0 -0
  97. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  98. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  99. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/pydantic/validated_func.py +0 -0
  100. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/pytz.py +0 -0
  101. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/result_records.py +0 -0
  102. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/retries.py +0 -0
  103. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/schema.py +0 -0
  104. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/schemas/__init__.py +0 -0
  105. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/schemas/_registry.py +0 -0
  106. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/schemas/bases.py +0 -0
  107. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/schemas/fields.py +0 -0
  108. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/schemas/serializers.py +0 -0
  109. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/schemas/validators.py +0 -0
  110. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
  111. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/server_maintenance.py +0 -0
  112. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/states.py +0 -0
  113. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/testing.py +0 -0
  114. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/urls.py +0 -0
  115. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/uuid7.py +0 -0
  116. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/version_checking.py +0 -0
  117. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/versioning.py +0 -0
  118. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/waiters.py +0 -0
  119. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_internal/websockets.py +0 -0
  120. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/__init__.py +0 -0
  121. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/fetcher.py +0 -0
  122. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/generator.py +0 -0
  123. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/models.py +0 -0
  124. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/naming.py +0 -0
  125. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/renderer.py +0 -0
  126. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/schema_converter.py +0 -0
  127. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/templates/__init__.py +0 -0
  128. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
  129. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/types.py +0 -0
  130. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_sdk/unions.py +0 -0
  131. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_vendor/croniter/__init__.py +0 -0
  132. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/_vendor/croniter/croniter.py +0 -0
  133. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/agent.py +0 -0
  134. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/analytics/__init__.py +0 -0
  135. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/artifacts.py +0 -0
  136. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/assets/__init__.py +0 -0
  137. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/assets/core.py +0 -0
  138. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/assets/materialize.py +0 -0
  139. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/automations.py +0 -0
  140. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/AGENTS.md +0 -0
  141. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/__init__.py +0 -0
  142. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/abstract.py +0 -0
  143. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/core.py +0 -0
  144. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/fields.py +0 -0
  145. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/redis.py +0 -0
  146. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/system.py +0 -0
  147. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/blocks/webhook.py +0 -0
  148. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/bundles/__init__.py +0 -0
  149. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/bundles/_file_collector.py +0 -0
  150. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/bundles/_ignore_filter.py +0 -0
  151. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/bundles/_path_resolver.py +0 -0
  152. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/bundles/_zip_builder.py +0 -0
  153. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/bundles/_zip_extractor.py +0 -0
  154. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/bundles/execute.py +0 -0
  155. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/cache_policies.py +0 -0
  156. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/AGENTS.md +0 -0
  157. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/__init__.py +0 -0
  158. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/attribution.py +0 -0
  159. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/base.py +0 -0
  160. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/cloud.py +0 -0
  161. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/collections.py +0 -0
  162. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/constants.py +0 -0
  163. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/__init__.py +0 -0
  164. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
  165. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
  166. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
  167. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_automations/client.py +0 -0
  168. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
  169. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
  170. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
  171. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
  172. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
  173. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
  174. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
  175. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
  176. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
  177. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_deployments/client.py +0 -0
  178. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_events/__init__.py +0 -0
  179. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_events/client.py +0 -0
  180. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
  181. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
  182. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
  183. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_flows/client.py +0 -0
  184. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
  185. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_logs/client.py +0 -0
  186. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
  187. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_variables/client.py +0 -0
  188. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
  189. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
  190. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/base.py +0 -0
  191. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/orchestration/routes.py +0 -0
  192. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/__init__.py +0 -0
  193. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/actions.py +0 -0
  194. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/events.py +0 -0
  195. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/filters.py +0 -0
  196. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/objects.py +0 -0
  197. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/responses.py +0 -0
  198. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/schedules.py +0 -0
  199. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/sorting.py +0 -0
  200. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/schemas/worker_channel.py +0 -0
  201. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/subscriptions.py +0 -0
  202. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/types/__init__.py +0 -0
  203. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  204. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/client/utilities.py +0 -0
  205. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/AGENTS.md +0 -0
  206. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/__init__.py +0 -0
  207. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/_asyncio.py +0 -0
  208. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/_events.py +0 -0
  209. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/_leases.py +0 -0
  210. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/_sync.py +0 -0
  211. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/asyncio.py +0 -0
  212. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/context.py +0 -0
  213. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/services.py +0 -0
  214. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/sync.py +0 -0
  215. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/v1/__init__.py +0 -0
  216. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/v1/_asyncio.py +0 -0
  217. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/v1/_events.py +0 -0
  218. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/v1/asyncio.py +0 -0
  219. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/v1/context.py +0 -0
  220. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/v1/services.py +0 -0
  221. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/concurrency/v1/sync.py +0 -0
  222. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/context.py +0 -0
  223. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/AGENTS.md +0 -0
  224. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/__init__.py +0 -0
  225. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/base.py +0 -0
  226. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/deployments.py +0 -0
  227. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/flow_runs.py +0 -0
  228. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/runner.py +0 -0
  229. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/schedules.py +0 -0
  230. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/steps/__init__.py +0 -0
  231. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/steps/core.py +0 -0
  232. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/steps/pull.py +0 -0
  233. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/deployments/steps/utility.py +0 -0
  234. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/docker/__init__.py +0 -0
  235. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/docker/_buildx.py +0 -0
  236. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/docker/docker_image.py +0 -0
  237. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/engine.py +0 -0
  238. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/__init__.py +0 -0
  239. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/actions.py +0 -0
  240. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/clients.py +0 -0
  241. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/filters.py +0 -0
  242. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/related.py +0 -0
  243. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/schemas/__init__.py +0 -0
  244. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  245. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/schemas/events.py +0 -0
  246. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/schemas/labelling.py +0 -0
  247. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/subscribers.py +0 -0
  248. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/utilities.py +0 -0
  249. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/events/worker.py +0 -0
  250. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/exceptions.py +0 -0
  251. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/filesystems.py +0 -0
  252. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/flow_runs.py +0 -0
  253. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/flows.py +0 -0
  254. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/futures.py +0 -0
  255. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/__init__.py +0 -0
  256. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/base.py +0 -0
  257. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  258. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  259. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
  260. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  261. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  262. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/input/__init__.py +0 -0
  263. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/input/actions.py +0 -0
  264. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/input/run_input.py +0 -0
  265. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/locking/__init__.py +0 -0
  266. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/locking/_filelock.py +0 -0
  267. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/locking/filesystem.py +0 -0
  268. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/locking/memory.py +0 -0
  269. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/locking/protocol.py +0 -0
  270. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/AGENTS.md +0 -0
  271. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/__init__.py +0 -0
  272. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/clients.py +0 -0
  273. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/configuration.py +0 -0
  274. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/filters.py +0 -0
  275. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/formatters.py +0 -0
  276. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/handlers.py +0 -0
  277. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/highlighters.py +0 -0
  278. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/loggers.py +0 -0
  279. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/logging/logging.yml +0 -0
  280. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/main.py +0 -0
  281. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/plugins.py +0 -0
  282. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/py.typed +0 -0
  283. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/results.py +0 -0
  284. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/AGENTS.md +0 -0
  285. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/__init__.py +0 -0
  286. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_cancel_finalizer.py +0 -0
  287. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_cancellation_manager.py +0 -0
  288. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_control_channel.py +0 -0
  289. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_deployment_registry.py +0 -0
  290. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_event_emitter.py +0 -0
  291. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_flow_resolver.py +0 -0
  292. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_flow_run_executor.py +0 -0
  293. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_hook_runner.py +0 -0
  294. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_limit_manager.py +0 -0
  295. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_process_manager.py +0 -0
  296. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_scheduled_run_poller.py +0 -0
  297. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_starter_bundle.py +0 -0
  298. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_starter_direct.py +0 -0
  299. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_starter_engine.py +0 -0
  300. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_state_proposer.py +0 -0
  301. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_uv_command.py +0 -0
  302. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_workspace_hook_runner.py +0 -0
  303. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_workspace_resolver.py +0 -0
  304. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_workspace_runtime.py +0 -0
  305. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_workspace_runtime_bootstrap.py +0 -0
  306. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_workspace_starter.py +0 -0
  307. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/_workspace_supervisor.py +0 -0
  308. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runner/server.py +0 -0
  309. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runtime/__init__.py +0 -0
  310. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runtime/deployment.py +0 -0
  311. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runtime/flow_run.py +0 -0
  312. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/runtime/task_run.py +0 -0
  313. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/schedules.py +0 -0
  314. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/serializers.py +0 -0
  315. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/_ui_static.py +0 -0
  316. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/admin.py +0 -0
  317. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/artifacts.py +0 -0
  318. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/automations.py +0 -0
  319. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/block_capabilities.py +0 -0
  320. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/block_documents.py +0 -0
  321. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/block_schemas.py +0 -0
  322. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/block_types.py +0 -0
  323. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/clients.py +0 -0
  324. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/collections.py +0 -0
  325. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  326. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/concurrency_limits.py +0 -0
  327. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
  328. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/csrf_token.py +0 -0
  329. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/dependencies.py +0 -0
  330. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/deployments.py +0 -0
  331. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/events.py +0 -0
  332. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/flow_run_states.py +0 -0
  333. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/flow_runs.py +0 -0
  334. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/flows.py +0 -0
  335. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/logs.py +0 -0
  336. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/middleware.py +0 -0
  337. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/root.py +0 -0
  338. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/run_history.py +0 -0
  339. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/saved_searches.py +0 -0
  340. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  341. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/task_run_states.py +0 -0
  342. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/task_runs.py +0 -0
  343. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/task_workers.py +0 -0
  344. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/templates.py +0 -0
  345. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/ui/__init__.py +0 -0
  346. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/ui/flows.py +0 -0
  347. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/ui/schemas.py +0 -0
  348. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/ui/task_runs.py +0 -0
  349. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/validation.py +0 -0
  350. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/variables.py +0 -0
  351. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/work_queues.py +0 -0
  352. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/server/api/workers.py +0 -0
  353. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/AGENTS.md +0 -0
  354. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/__init__.py +0 -0
  355. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/_types.py +0 -0
  356. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/base.py +0 -0
  357. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/constants.py +0 -0
  358. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/context.py +0 -0
  359. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/legacy.py +0 -0
  360. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/__init__.py +0 -0
  361. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/_defaults.py +0 -0
  362. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/api.py +0 -0
  363. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/cli.py +0 -0
  364. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/client.py +0 -0
  365. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/cloud.py +0 -0
  366. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/deployments.py +0 -0
  367. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/events.py +0 -0
  368. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/experiments.py +0 -0
  369. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/flows.py +0 -0
  370. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/internal.py +0 -0
  371. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/logging.py +0 -0
  372. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/plugins.py +0 -0
  373. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/results.py +0 -0
  374. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/root.py +0 -0
  375. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/runner.py +0 -0
  376. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/__init__.py +0 -0
  377. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/api.py +0 -0
  378. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/concurrency.py +0 -0
  379. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/database.py +0 -0
  380. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/deployments.py +0 -0
  381. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/docket.py +0 -0
  382. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/ephemeral.py +0 -0
  383. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/events.py +0 -0
  384. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
  385. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/logs.py +0 -0
  386. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/root.py +0 -0
  387. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/services.py +0 -0
  388. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/tasks.py +0 -0
  389. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/ui.py +0 -0
  390. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/server/worker_channel.py +0 -0
  391. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/tasks.py +0 -0
  392. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/telemetry.py +0 -0
  393. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/testing.py +0 -0
  394. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/models/worker.py +0 -0
  395. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/profiles.py +0 -0
  396. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/profiles.toml +0 -0
  397. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/settings/sources.py +0 -0
  398. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/states.py +0 -0
  399. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/task_engine.py +0 -0
  400. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/task_runs.py +0 -0
  401. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/task_worker.py +0 -0
  402. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/tasks.py +0 -0
  403. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/telemetry/__init__.py +0 -0
  404. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/telemetry/run_telemetry.py +0 -0
  405. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/transactions.py +0 -0
  406. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/types/__init__.py +0 -0
  407. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/types/_concurrency.py +0 -0
  408. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/types/_datetime_deprecations.py +0 -0
  409. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/types/entrypoint.py +0 -0
  410. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/types/names.py +0 -0
  411. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/AGENTS.md +0 -0
  412. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/__init__.py +0 -0
  413. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/annotations.py +0 -0
  414. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/asyncutils/AGENTS.md +0 -0
  415. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/asyncutils/__init__.py +0 -0
  416. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/callables/AGENTS.md +0 -0
  417. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/callables/__init__.py +0 -0
  418. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/compat.py +0 -0
  419. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/context.py +0 -0
  420. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/dispatch.py +0 -0
  421. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/dockerutils.py +0 -0
  422. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/engine/AGENTS.md +0 -0
  423. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/engine/__init__.py +0 -0
  424. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/filesystem/AGENTS.md +0 -0
  425. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/filesystem/__init__.py +0 -0
  426. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/generics.py +0 -0
  427. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/hashing.py +0 -0
  428. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/importtools.py +0 -0
  429. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/math.py +0 -0
  430. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/names.py +0 -0
  431. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/processutils/AGENTS.md +0 -0
  432. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/processutils/__init__.py +0 -0
  433. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/pydantic.py +0 -0
  434. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/render_swagger.py +0 -0
  435. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/schema_tools/AGENTS.md +0 -0
  436. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  437. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  438. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/schema_tools/validation.py +0 -0
  439. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/services.py +0 -0
  440. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/slugify.py +0 -0
  441. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/templating/__init__.py +0 -0
  442. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/text.py +0 -0
  443. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/timeout.py +0 -0
  444. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/urls.py +0 -0
  445. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/utilities/visualization.py +0 -0
  446. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/variables.py +0 -0
  447. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/AGENTS.md +0 -0
  448. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/__init__.py +0 -0
  449. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/_cleanup.py +0 -0
  450. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/_cleanup_handlers.py +0 -0
  451. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/_worker_channel/__init__.py +0 -0
  452. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/_worker_channel/_protocol.py +0 -0
  453. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/_worker_channel/_state.py +0 -0
  454. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/_worker_channel/_sync.py +0 -0
  455. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/_worker_channel/_transport.py +0 -0
  456. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/base.py +0 -0
  457. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/block.py +0 -0
  458. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/cloud.py +0 -0
  459. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/process.py +0 -0
  460. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/server.py +0 -0
  461. {prefect_client-3.9.1.dev2 → prefect_client-3.9.1.dev4}/src/prefect/workers/utilities.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: prefect-client
3
- Version: 3.9.1.dev2
3
+ Version: 3.9.1.dev4
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io
@@ -50,7 +50,7 @@ Requires-Dist: pydantic-core<3.0.0,>=2.12.0
50
50
  Requires-Dist: pydantic-extra-types<3.0.0,>=2.8.2
51
51
  Requires-Dist: pydantic-settings<3.0.0,>=2.9.1
52
52
  Requires-Dist: python-dateutil<3.0.0,>=2.8.2
53
- Requires-Dist: python-slugify<9.1,>=9
53
+ Requires-Dist: python-slugify<9.2,>=9
54
54
  Requires-Dist: pytz<2027,>=2021.1
55
55
  Requires-Dist: pyyaml<7.0.0,>=5.4.1
56
56
  Requires-Dist: rfc3339-validator<0.2.0,>=0.1.4
@@ -62,9 +62,9 @@ Requires-Dist: toml>=0.10.0
62
62
  Requires-Dist: typing-extensions<5.0.0,>=4.10.0
63
63
  Requires-Dist: uvicorn!=0.29.0,>=0.14.0
64
64
  Requires-Dist: websockets<17.0,>=15.0.1
65
- Requires-Dist: whenever<0.11.0,>=0.10.5; python_version >= '3.13'
65
+ Requires-Dist: whenever<0.12.0,>=0.10.5; python_version >= '3.13'
66
66
  Provides-Extra: notifications
67
- Requires-Dist: apprise<2.0.0,>=1.13.0; extra == 'notifications'
67
+ Requires-Dist: apprise<2.1.0,>=1.13.0; extra == 'notifications'
68
68
  Description-Content-Type: text/markdown
69
69
 
70
70
  <p align="center"><img src="https://github.com/PrefectHQ/prefect/assets/3407835/c654cbc6-63e8-4ada-a92a-efd2f8f24b85" width=1000></p>
@@ -55,7 +55,7 @@ dependencies = [
55
55
  "pydantic_extra_types>=2.8.2,<3.0.0",
56
56
  "pydantic_settings>=2.9.1,<3.0.0",
57
57
  "python-dateutil>=2.8.2,<3.0.0",
58
- "python-slugify>=9,<9.1",
58
+ "python-slugify>=9,<9.2",
59
59
  "pytz>=2021.1,<2027",
60
60
  "pyyaml>=5.4.1,<7.0.0",
61
61
  "rfc3339-validator>=0.1.4,<0.2.0",
@@ -67,7 +67,7 @@ dependencies = [
67
67
  "typing_extensions>=4.10.0,<5.0.0",
68
68
  "uvicorn>=0.14.0,!=0.29.0",
69
69
  "websockets>=15.0.1,<17.0",
70
- "whenever>=0.10.5,<0.11.0; python_version>='3.13'",
70
+ "whenever>=0.10.5,<0.12.0; python_version>='3.13'",
71
71
  ]
72
72
  [project.urls]
73
73
  Changelog = "https://github.com/PrefectHQ/prefect/releases"
@@ -75,7 +75,7 @@ Documentation = "https://docs.prefect.io"
75
75
  Source = "https://github.com/PrefectHQ/prefect"
76
76
  Tracker = "https://github.com/PrefectHQ/prefect/issues"
77
77
  [project.optional-dependencies]
78
- notifications = ["apprise>=1.13.0, <2.0.0"]
78
+ notifications = ["apprise>=1.13.0, <2.1.0"]
79
79
 
80
80
 
81
81
  [tool.hatch.version]
@@ -6,6 +6,10 @@ The foundation for building and executing workflows with Python. This covers the
6
6
 
7
7
  There is no formal public/private boundary beyond the `_` prefix convention. Modules and functions prefixed with `_` are internal. Everything else is considered public and requires backward compatibility.
8
8
 
9
+ ## Runtime Parameter Defaults
10
+
11
+ Runtime flow/task parameter values must come from `utilities.callables.get_call_parameters` or `get_parameter_defaults`: raw signature defaults can be `pydantic.Field(...)` objects. These helpers unwrap `FieldInfo` defaults; schema generation intentionally retains `FieldInfo` to preserve metadata.
12
+
9
13
  ## Entry Points
10
14
 
11
15
  - `flows.py` / `tasks.py` — `@flow` and `@task` decorator definitions. The primary user-facing API.
@@ -25,7 +29,8 @@ There is no formal public/private boundary beyond the `_` prefix convention. Mod
25
29
  - **Sync and async must stay in sync.** Both `flow_engine.py` and `task_engine.py` have sync and async paths. Any behavior change must be applied to both.
26
30
  - **Event and log WebSocket subscribers are parallel implementations.** `events/clients.py::PrefectEventSubscriber` and `logging/clients.py::PrefectLogsSubscriber` duplicate the same reconnect/backoff/dedup logic, including the `reconnect_on_clean_close` option (used by `events/subscribers.py::FlowRunSubscriber` so a clean disconnect doesn't hide a terminal event). Mirror any reconnection-behavior change across both.
27
31
  - **Flow run observers own their stream recovery.** `_internal/observers.py` observers create subscribers with `reconnection_attempts=0` and delegate polling fallback, reconnect backoff, and setup deadlines to `_internal/_observation_delivery.py::ObservationDelivery`. Subscribers close any socket left by a failed or cancelled `__aenter__`, since callers never exit a context that failed to enter.
28
- - **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences between whenever 0.7.x–0.9.x and ≥ 0.10.0. The `_WHENEVER_NEW_API` flag (True when whenever ≥ 0.10.0) guards version-specific code. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Violations will silently break on whichever whenever version the helpers weren't written for.
32
+ - **Use `whenever` compat helpers for all datetime conversions on Python 3.13+.** `prefect-client` depends on `whenever` only on Python 3.13+, so modules it ships must keep `whenever` imports behind `sys.version_info >= (3, 13)`; only server code that the client build strips may import it unconditionally (see `client/AGENTS.md`). `types/_datetime.py` provides `now()`, `_whenever_to_stdlib()`, `_whenever_zdt_from_py()`, and `_whenever_pdt_from_py()` to abstract over API differences across supported whenever releases. Version-specific code is guarded by feature-detection flags (`_WHENEVER_NEW_API` for ≥ 0.10.0, `_SYSTEM_TZ` for ≥ 0.11), not version checks. Never call `DateTime.now()` or `pendulum.now()` directly — use `now()` from `types/_datetime.py` instead. Avoid no-argument `datetime.datetime.now()` because it returns a tz-naive datetime that raises `TypeError` when compared to the tz-aware datetimes produced by `now()`. Explicitly timezone-aware stdlib calls such as `datetime.now(ZoneInfo("UTC"))` are allowed when needed to preserve timezone information. Never call `ZonedDateTime.from_py_datetime()`, `PlainDateTime.from_py_datetime()`, or `.py_datetime()` directly — use the helpers instead. Likewise avoid `.assume_system_tz()`/`.to_system_tz()` (deprecated in 0.11; the warning fails tests under `filterwarnings = error`) — use `in_local_tz()` — and direct `DateTimeDelta` imports (removed in 0.11) — use the `Interval` alias. Violations will silently break on whichever whenever version the helpers weren't written for.
33
+ - **Call Pendulum-only members via `types/_datetime.py::_pendulum_call` on Python 3.11/3.12.** Prefect's `DateTime`/`Date`/`Duration` wrap Pendulum-only members (and some shared stdlib methods like `replace`) with user-facing deprecation warnings; `_pendulum_call` bypasses them so users only see warnings for their own calls. `pyproject.toml` ignores these warnings in pytest, so direct calls from Prefect code pass tests silently unless covered by the guards in `tests/test_datetime.py`.
29
34
  - **Flow and task engines advance state differently.** The flow engine makes blocking API calls to the server to propose and advance states. The task engine emits `prefect.task_run.*` events (delivered via WebSockets) but advances state locally through `set_state` calls with polling/backoff — do not assume the two engines work the same way.
30
35
  - **Flow state transitions go through the server.** The flow engine proposes states to the server, which accepts or rejects them via orchestration rules. The task engine, by contrast, manages state transitions locally via `set_state` and emits `prefect.task_run.*` events — it does not propose states to the server.
31
36
  - **`ProcessPoolTaskRunner` requires picklable data across subprocess boundaries.** `PrefectFuture` objects are not picklable and cannot be passed to worker subprocesses. Any `wait_for` futures must be waited on in the parent process and converted to `State` objects before submission. The subprocess task engine handles `State` objects via `resolve_to_final_result`, which raises `UpstreamTaskError` for non-completed upstreams.
@@ -69,3 +74,7 @@ Use `get_logger()` from `prefect.logging` instead of raw `logging.getLogger()`
69
74
  - `docker/` → `DockerImage` class for building and pushing Docker images during deployment
70
75
  - `telemetry/` → OS-level resource metric collection and run telemetry
71
76
  - `testing/` → Test utilities shipped with the SDK: `prefect_test_harness`, assertion helpers, and reusable fixtures (see testing/AGENTS.md)
77
+
78
+ ## Multi-pass Templating
79
+
80
+ When applying `utilities.templating.apply_values` in stages, use `remove_notset=False` on passes that must preserve placeholders for later values. The default drops unresolved whole-value dict entries and list items and blanks unresolved inline placeholders. This matters when deployment preparation applies environment values before build/push outputs exist; only remove unresolved values when the caller has reached its final resolution pass.
@@ -0,0 +1,5 @@
1
+ # Generated by versioningit
2
+ __version__ = "3.9.1.dev4"
3
+ __build_date__ = "2026-10-25 08:17:20.425573+00:00"
4
+ __git_commit__ = "7257ae44f0246277f4f5083ef3bb98ed7ef3fa61"
5
+ __dirty__ = False
@@ -271,8 +271,9 @@ class _QueueServiceBase(abc.ABC, Generic[T]):
271
271
 
272
272
  self._stop(at_exit=at_exit)
273
273
 
274
- assert self._done_event is not None
275
- if self._done_event.is_set():
274
+ # `_done_event` is unset if the service never started in this process, e.g.
275
+ # in a child process after `reset_for_fork`
276
+ if self._done_event is None or self._done_event.is_set():
276
277
  future: concurrent.futures.Future[bool] = concurrent.futures.Future()
277
278
  future.set_result(False)
278
279
  return future
@@ -47,7 +47,7 @@ class AbstractAppriseNotificationBlock(NotificationBlock, ABC):
47
47
  )
48
48
 
49
49
  self._apprise_client = Apprise(asset=prefect_app_data)
50
- self._apprise_client.add(servers=url.get_secret_value()) # pyright: ignore[reportUnknownMemberType]
50
+ self._apprise_client.add(url.get_secret_value()) # pyright: ignore[reportUnknownMemberType]
51
51
 
52
52
  def block_initialization(self) -> None:
53
53
  self._start_apprise_client(getattr(self, "url"))
@@ -1115,9 +1115,7 @@ class SendgridEmail(AbstractAppriseNotificationBlock):
1115
1115
  """Update apprise client with current to_emails before sending."""
1116
1116
  if hasattr(self, "_apprise_client") and self._apprise_client:
1117
1117
  self._apprise_client.clear()
1118
- self._apprise_client.add(
1119
- servers=self._build_sendgrid_url().get_secret_value()
1120
- )
1118
+ self._apprise_client.add(self._build_sendgrid_url().get_secret_value())
1121
1119
 
1122
1120
  async def anotify(
1123
1121
  self,
@@ -8,6 +8,7 @@ Client-side event system for emitting, subscribing to, and defining automations
8
8
  - Events follow the CloudEvents-inspired schema: `Event` with `Resource` and `RelatedResource`.
9
9
  - Automations combine triggers (event, metric, compound, sequence) with actions.
10
10
  - **Metric triggers are Cloud-only.** OSS's `ServerTriggerTypes` excludes `MetricTrigger`, so `POST /automations` returns 422. For "alert if a flow takes too long" on OSS, use a proactive `EventTrigger` (`after={prefect.flow-run.Running}`, terminal states in `expect`, SLO in `within`).
11
+ - **Automation schemas must read values this version doesn't know.** Cloud can add action types and metric names before a client release knows about them, so unknown actions parse as `UnknownAction` and unknown metric names stay `str` in `MetricTriggerQuery.name`. Code that reads automations must handle these variants (e.g. no `.value` on a metric name without an `isinstance` check), and `prefect transfer` skips automations that use them instead of copying them.
11
12
  - **Event name prefixes differ by backend.** OSS emits `prefect.*`; Cloud emits `prefect-cloud.*` for automation/action lifecycle events (e.g., `prefect-cloud.automation.triggered`). Cross-backend tooling that filters events must match both.
12
13
  - `DeploymentTriggerTypes` are the subset of triggers usable in `prefect.yaml` deployment definitions.
13
14
 
@@ -290,9 +290,16 @@ class MetricTriggerQuery(PrefectBaseModel):
290
290
  to Metric automations, that specify the query configurations
291
291
  and breaching conditions for the Automation"""
292
292
 
293
- name: PrefectMetric = Field(
293
+ # Prefect Cloud can add metrics before a client release knows about them.
294
+ # Reading an automation that uses one keeps its name as a string instead of
295
+ # failing, so updating the automation sends the name back unchanged.
296
+ name: Union[PrefectMetric, str] = Field(
294
297
  ...,
295
- description="The name of the metric to query.",
298
+ union_mode="left_to_right",
299
+ description=(
300
+ "The name of the metric to query. Names this version of Prefect does "
301
+ "not recognize are kept as strings."
302
+ ),
296
303
  )
297
304
  threshold: float = Field(
298
305
  ...,
@@ -357,7 +364,8 @@ class MetricTrigger(ResourceTrigger):
357
364
  return textwrap.indent(
358
365
  "\n".join(
359
366
  [
360
- f"Metric: {m.name.value} {m.operator.value} {m.threshold} for {m.range}",
367
+ f"Metric: {m.name.value if isinstance(m.name, PrefectMetric) else m.name} "
368
+ f"{m.operator.value} {m.threshold} for {m.range}",
361
369
  ]
362
370
  ),
363
371
  prefix=" " * indent,
@@ -811,7 +811,16 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
811
811
  )
812
812
  raise_if_flow_run_suspension_requested()
813
813
  self._return_value = resolved_result
814
- self.set_state(terminal_state)
814
+ state = self.set_state(terminal_state)
815
+ if terminal_state.is_failed() and state.is_scheduled():
816
+ self.logger.info(
817
+ f"Received non-final state {state.name!r} when proposing final"
818
+ f" state {terminal_state.name!r} and will attempt to run again..."
819
+ )
820
+ raise_if_flow_run_suspension_requested()
821
+ self._return_value = NotSet
822
+ self.set_state(Running())
823
+ return result
815
824
 
816
825
  link_state_to_flow_run_result(terminal_state, resolved_result)
817
826
  self._telemetry.end_span_on_success()
@@ -1534,7 +1543,16 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
1534
1543
  )
1535
1544
  raise_if_flow_run_suspension_requested()
1536
1545
  self._return_value = resolved_result
1537
- await self.set_state(terminal_state)
1546
+ state = await self.set_state(terminal_state)
1547
+ if terminal_state.is_failed() and state.is_scheduled():
1548
+ self.logger.info(
1549
+ f"Received non-final state {state.name!r} when proposing final"
1550
+ f" state {terminal_state.name!r} and will attempt to run again..."
1551
+ )
1552
+ raise_if_flow_run_suspension_requested()
1553
+ self._return_value = NotSet
1554
+ await self.set_state(Running())
1555
+ return result
1538
1556
 
1539
1557
  self._telemetry.end_span_on_success()
1540
1558
 
@@ -1005,7 +1005,25 @@ class ExecutionRoleResource:
1005
1005
  ],
1006
1006
  }
1007
1007
  )
1008
- self._requires_provisioning = None
1008
+ # `AmazonECSTaskExecutionRolePolicy` allows creating log streams and
1009
+ # putting log events, but not creating the log group that the ECS worker
1010
+ # asks for with `awslogs-create-group` when CloudWatch logs are enabled.
1011
+ self._logs_policy_name = "PrefectEcsTaskExecutionRoleLogsPolicy"
1012
+ self._logs_policy_document = json.dumps(
1013
+ {
1014
+ "Version": "2012-10-17",
1015
+ "Statement": [
1016
+ {
1017
+ "Sid": "AllowCreateLogGroup",
1018
+ "Effect": "Allow",
1019
+ "Action": "logs:CreateLogGroup",
1020
+ "Resource": "*",
1021
+ }
1022
+ ],
1023
+ }
1024
+ )
1025
+ self._requires_role_provisioning = None
1026
+ self._requires_logs_policy_provisioning = None
1009
1027
 
1010
1028
  async def get_task_count(self) -> int:
1011
1029
  """
@@ -1014,27 +1032,58 @@ class ExecutionRoleResource:
1014
1032
  Returns:
1015
1033
  int: The number of tasks to be provisioned.
1016
1034
  """
1017
- return 1 if await self.requires_provisioning() else 0
1018
-
1019
- async def requires_provisioning(self) -> bool:
1020
- """
1021
- Check if this resource requires provisioning.
1035
+ role_count = 1 if await self._role_requires_provisioning() else 0
1036
+ logs_policy_count = 1 if await self._logs_policy_requires_provisioning() else 0
1037
+ return role_count + logs_policy_count
1022
1038
 
1023
- Returns:
1024
- bool: True if provisioning is required, False otherwise.
1025
- """
1026
- if self._requires_provisioning is None:
1039
+ async def _role_requires_provisioning(self) -> bool:
1040
+ if self._requires_role_provisioning is None:
1027
1041
  try:
1028
1042
  await anyio.to_thread.run_sync(
1029
1043
  partial(
1030
1044
  self._iam_client.get_role, RoleName=self._execution_role_name
1031
1045
  )
1032
1046
  )
1033
- self._requires_provisioning = False
1047
+ self._requires_role_provisioning = False
1034
1048
  except self._iam_client.exceptions.NoSuchEntityException:
1035
- self._requires_provisioning = True
1049
+ self._requires_role_provisioning = True
1036
1050
 
1037
- return self._requires_provisioning
1051
+ return self._requires_role_provisioning
1052
+
1053
+ async def _logs_policy_requires_provisioning(self) -> bool:
1054
+ """
1055
+ Checked separately from role creation so that roles provisioned before
1056
+ the logs policy existed get it when provisioning is run again.
1057
+ """
1058
+ if self._requires_logs_policy_provisioning is None:
1059
+ if await self._role_requires_provisioning():
1060
+ self._requires_logs_policy_provisioning = True
1061
+ else:
1062
+ try:
1063
+ await anyio.to_thread.run_sync(
1064
+ partial(
1065
+ self._iam_client.get_role_policy,
1066
+ RoleName=self._execution_role_name,
1067
+ PolicyName=self._logs_policy_name,
1068
+ )
1069
+ )
1070
+ self._requires_logs_policy_provisioning = False
1071
+ except self._iam_client.exceptions.NoSuchEntityException:
1072
+ self._requires_logs_policy_provisioning = True
1073
+
1074
+ return self._requires_logs_policy_provisioning
1075
+
1076
+ async def requires_provisioning(self) -> bool:
1077
+ """
1078
+ Check if this resource requires provisioning.
1079
+
1080
+ Returns:
1081
+ bool: True if provisioning is required, False otherwise.
1082
+ """
1083
+ return (
1084
+ await self._role_requires_provisioning()
1085
+ or await self._logs_policy_requires_provisioning()
1086
+ )
1038
1087
 
1039
1088
  async def get_planned_actions(self) -> List[str]:
1040
1089
  """
@@ -1044,12 +1093,18 @@ class ExecutionRoleResource:
1044
1093
  Optional[str]: A description of the planned actions for provisioning the resource,
1045
1094
  or None if provisioning is not required.
1046
1095
  """
1047
- if await self.requires_provisioning():
1048
- return [
1096
+ actions: list[str] = []
1097
+ if await self._role_requires_provisioning():
1098
+ actions.append(
1049
1099
  "Creating an IAM role assigned to ECS tasks:"
1050
1100
  f" [blue]{self._execution_role_name}[/]"
1051
- ]
1052
- return []
1101
+ )
1102
+ if await self._logs_policy_requires_provisioning():
1103
+ actions.append(
1104
+ "Allowing the ECS task execution role to create CloudWatch log"
1105
+ f" groups: [blue]{self._logs_policy_name}[/]"
1106
+ )
1107
+ return actions
1053
1108
 
1054
1109
  async def provision(
1055
1110
  self,
@@ -1064,8 +1119,8 @@ class ExecutionRoleResource:
1064
1119
  infrastructure for.
1065
1120
  advance: A callback function to indicate progress.
1066
1121
  """
1067
- if await self.requires_provisioning():
1068
- console = current_console.get()
1122
+ console = current_console.get()
1123
+ if await self._role_requires_provisioning():
1069
1124
  console.print("Provisioning execution role")
1070
1125
  response = await anyio.to_thread.run_sync(
1071
1126
  partial(
@@ -1088,6 +1143,18 @@ class ExecutionRoleResource:
1088
1143
  partial(self._iam_client.get_role, RoleName=self._execution_role_name)
1089
1144
  )
1090
1145
 
1146
+ if await self._logs_policy_requires_provisioning():
1147
+ console.print("Adding CloudWatch logs policy to execution role")
1148
+ await anyio.to_thread.run_sync(
1149
+ partial(
1150
+ self._iam_client.put_role_policy,
1151
+ RoleName=self._execution_role_name,
1152
+ PolicyName=self._logs_policy_name,
1153
+ PolicyDocument=self._logs_policy_document,
1154
+ )
1155
+ )
1156
+ advance()
1157
+
1091
1158
  base_job_template["variables"]["properties"]["execution_role_arn"][
1092
1159
  "default"
1093
1160
  ] = response["Role"]["Arn"]
@@ -527,9 +527,15 @@ class Runner:
527
527
  Gracefully shuts down the runner when a SIGTERM is received.
528
528
  """
529
529
  self._logger.info("SIGTERM received, initiating graceful shutdown...")
530
- self.stop()
530
+ if not self.started or self.stopping or self._loop is None:
531
+ sys.exit(0)
531
532
 
532
- sys.exit(0)
533
+ # Signal handlers run on the main thread, which may or may not be the
534
+ # thread driving the runner's loop, so schedule `astop` thread-safely
535
+ # rather than blocking on it. `astop` cancels in-flight flow runs and
536
+ # the polling loops, letting `start` return.
537
+ self.stopping = True
538
+ self.execute_in_background(self.astop)
533
539
 
534
540
  async def start(
535
541
  self, run_once: bool = False, webserver: Optional[bool] = None
@@ -714,9 +720,9 @@ class Runner:
714
720
  6. FlowRunCancellingObserver — exits first
715
721
  """
716
722
  self._logger.debug("Starting runner...")
723
+ self.stopping = False
717
724
  self._tmp_dir.mkdir(parents=True, exist_ok=True)
718
- if not self._loop:
719
- self._loop = asyncio.get_event_loop()
725
+ self._loop = asyncio.get_running_loop()
720
726
 
721
727
  self._client = get_client()
722
728
 
@@ -497,16 +497,27 @@ class GitRepository:
497
497
 
498
498
  await self._checkout_commit(self._commit_sha)
499
499
 
500
- # Otherwise, pull the latest changes from the branch
500
+ # Otherwise, move the branch to the remote tip. `git pull` can't do
501
+ # this on a shallow clone: a new remote commit shares no history with
502
+ # the local one, so the merge fails on every update. Like `git pull`,
503
+ # `reset --keep` leaves local changes alone when nothing changed
504
+ # upstream and refuses when they would be overwritten.
501
505
  else:
502
- cmd += ["pull", "origin"]
506
+ fetch_cmd = cmd + ["fetch", "origin"]
503
507
  if self._branch:
504
- cmd += [self._branch]
505
- if self._include_submodules:
506
- cmd += ["--recurse-submodules"]
507
- cmd += ["--depth", "1"]
508
+ fetch_cmd += [self._branch]
509
+ fetch_cmd += ["--depth", "1"]
508
510
  try:
509
- await run_process(cmd, cwd=self.destination)
511
+ await run_process(fetch_cmd, cwd=self.destination)
512
+ await run_process(
513
+ ["git", "reset", "--keep", "FETCH_HEAD"],
514
+ cwd=self.destination,
515
+ )
516
+ if self._include_submodules:
517
+ await run_process(
518
+ cmd + ["submodule", "update", "--init", "--recursive"],
519
+ cwd=self.destination,
520
+ )
510
521
  self._logger.debug("Successfully pulled latest changes")
511
522
  except subprocess.CalledProcessError as exc:
512
523
  self._logger.error(
@@ -24,6 +24,7 @@ if TYPE_CHECKING:
24
24
  flows,
25
25
  logs,
26
26
  middleware,
27
+ observed_states,
27
28
  root,
28
29
  run_history,
29
30
  saved_searches,
@@ -58,6 +59,7 @@ __all__ = [
58
59
  "flows",
59
60
  "logs",
60
61
  "middleware",
62
+ "observed_states",
61
63
  "root",
62
64
  "run_history",
63
65
  "saved_searches",
@@ -63,25 +63,31 @@ async def background_worker(
63
63
  webserver_only: bool = False,
64
64
  ) -> AsyncGenerator[None, None]:
65
65
  worker_task: asyncio.Task[None] | None = None
66
- async with Worker(docket) as worker:
67
- # Register background task functions
68
- docket.register_collection(
69
- "prefect.server.api.background_workers:task_functions"
70
- )
66
+ try:
67
+ async with Worker(docket) as worker:
68
+ # Register background task functions
69
+ docket.register_collection(
70
+ "prefect.server.api.background_workers:task_functions"
71
+ )
71
72
 
72
- # Register and schedule enabled perpetual services
73
- await register_and_schedule_perpetual_services(
74
- docket, ephemeral=ephemeral, webserver_only=webserver_only
75
- )
73
+ # Register and schedule enabled perpetual services
74
+ await register_and_schedule_perpetual_services(
75
+ docket, ephemeral=ephemeral, webserver_only=webserver_only
76
+ )
76
77
 
77
- try:
78
- worker_task = asyncio.create_task(worker.run_forever())
79
- yield
78
+ try:
79
+ worker_task = asyncio.create_task(worker.run_forever())
80
+ yield
80
81
 
81
- finally:
82
- if worker_task:
83
- worker_task.cancel()
84
- try:
85
- await worker_task
86
- except asyncio.CancelledError:
87
- pass
82
+ finally:
83
+ if worker_task:
84
+ worker_task.cancel()
85
+ finally:
86
+ # Exiting the `Worker` context above signals the worker loop to stop and
87
+ # waits for it, so shutdown completes even if the cancellation was lost
88
+ # (e.g. `asyncio.wait_for` on Python 3.11 can swallow a cancellation).
89
+ if worker_task:
90
+ try:
91
+ await worker_task
92
+ except asyncio.CancelledError:
93
+ pass
@@ -0,0 +1,32 @@
1
+ """Routes for discovering observed state types and names."""
2
+
3
+ from typing import Annotated
4
+
5
+ from fastapi import Depends, Query
6
+
7
+ from prefect.server import models
8
+ from prefect.server.database import PrefectDBInterface, provide_database_interface
9
+ from prefect.server.schemas.observed_states import ObservedState, ObservedStateSort
10
+ from prefect.server.utilities.server import PrefectRouter
11
+
12
+ router: PrefectRouter = PrefectRouter(
13
+ prefix="/observed-states", tags=["Observed States"]
14
+ )
15
+
16
+
17
+ @router.get("")
18
+ async def read_observed_states(
19
+ db: Annotated[PrefectDBInterface, Depends(provide_database_interface)],
20
+ query: Annotated[str | None, Query(max_length=100)] = None,
21
+ order_by: ObservedStateSort = ObservedStateSort.LAST_SEEN_DESC,
22
+ limit: Annotated[int, Query(ge=1, le=200)] = 200,
23
+ ) -> list[ObservedState]:
24
+ """Discover exact state names and types from retained run transitions.
25
+
26
+ Search by case-insensitive name or type prefix. Timestamps describe retained
27
+ history; deleting runs can change them or remove a state from the results.
28
+ """
29
+ async with db.session_context() as session:
30
+ return await models.observed_states.read_observed_states(
31
+ session=session, query=query, order_by=order_by, limit=limit
32
+ )
@@ -105,6 +105,7 @@ API_ROUTERS = (
105
105
  api.task_runs.router,
106
106
  api.flow_run_states.router,
107
107
  api.task_run_states.router,
108
+ api.observed_states.router,
108
109
  api.deployments.router,
109
110
  api.saved_searches.router,
110
111
  api.logs.router,
@@ -119,7 +119,7 @@ async def count_task_runs_by_flow_run(
119
119
  results = await session.execute(query)
120
120
 
121
121
  task_run_counts_by_flow_run = {
122
- flow_run_id: task_run_count for flow_run_id, task_run_count in results.t
122
+ flow_run_id: task_run_count for flow_run_id, task_run_count in results
123
123
  }
124
124
 
125
125
  return {
@@ -40,6 +40,7 @@ from prefect.futures import (
40
40
  from prefect.logging.handlers import APILogWorker, set_api_log_sink
41
41
  from prefect.logging.loggers import get_logger, get_run_logger
42
42
  from prefect.settings.context import get_current_settings
43
+ from prefect.settings.models.root import Settings
43
44
  from prefect.utilities.annotations import allow_failure, opaque, quote, unmapped
44
45
  from prefect.utilities.callables import (
45
46
  cloudpickle_wrapped_call,
@@ -607,13 +608,23 @@ def _run_task_in_subprocess(
607
608
  """
608
609
  Wrapper function to update environment variables and settings before running a task in a subprocess.
609
610
  """
611
+ # Apply this task's environment and restore the worker's environment
612
+ # afterwards so values from one task's settings do not leak into later
613
+ # tasks run by the same worker process.
614
+ original_environ = os.environ.copy()
615
+ os.environ.update(env or {})
616
+ try:
617
+ return _run_task_with_hydrated_context(*args, **kwargs)
618
+ finally:
619
+ os.environ.clear()
620
+ os.environ.update(original_environ)
621
+
622
+
623
+ def _run_task_with_hydrated_context(*args: Any, **kwargs: Any) -> Any:
610
624
  from prefect.context import hydrated_context
611
625
  from prefect.engine import handle_engine_signals
612
626
  from prefect.task_engine import run_task_async, run_task_sync
613
627
 
614
- # Update environment variables
615
- os.environ.update(env or {})
616
-
617
628
  # Extract context from kwargs
618
629
  context = kwargs.pop("context", None)
619
630
 
@@ -871,8 +882,8 @@ class ProcessPoolTaskRunner(TaskRunner[PrefectConcurrentFuture[Any]]):
871
882
  self._subprocess_message_processor_factories: tuple[
872
883
  _SubprocessMessageProcessorFactory, ...
873
884
  ] = tuple(subprocess_message_processor_factories or ())
874
- self._cached_context: dict[str, Any] | None = None
875
885
  self._cached_env: dict[str, str] | None = None
886
+ self._cached_env_settings: Settings | None = None
876
887
 
877
888
  def duplicate(self) -> Self:
878
889
  duplicate_runner = type(self)(max_workers=self._max_workers)
@@ -1201,16 +1212,21 @@ class ProcessPoolTaskRunner(TaskRunner[PrefectConcurrentFuture[Any]]):
1201
1212
  f"Submitting task {task.name} to process pool executor..."
1202
1213
  )
1203
1214
 
1204
- # Serialize the current context for the subprocess (cached per runner lifecycle)
1205
- if self._cached_context is None:
1206
- from prefect.context import serialize_context
1215
+ from prefect.context import serialize_context
1207
1216
 
1208
- self._cached_context = serialize_context()
1217
+ # Context (tags, settings, etc.) can change between submits, so it is
1218
+ # serialized every time. The env is only rebuilt when settings change.
1219
+ context = serialize_context()
1220
+ current_settings = get_current_settings()
1221
+ if (
1222
+ self._cached_env is None
1223
+ or self._cached_env_settings is not current_settings
1224
+ ):
1209
1225
  self._cached_env = (
1210
- get_current_settings().to_environment_variables(exclude_unset=True)
1226
+ current_settings.to_environment_variables(exclude_unset=True)
1211
1227
  | os.environ
1212
1228
  )
1213
- context = self._cached_context
1229
+ self._cached_env_settings = current_settings
1214
1230
  env = self._cached_env
1215
1231
 
1216
1232
  # Submit the resolution and subprocess execution to a background thread
@@ -1261,9 +1277,9 @@ class ProcessPoolTaskRunner(TaskRunner[PrefectConcurrentFuture[Any]]):
1261
1277
  return super().map(task, parameters, wait_for)
1262
1278
 
1263
1279
  def cancel_all(self) -> None:
1264
- # Invalidate cached context and env so they are recomputed on next start
1265
- self._cached_context = None
1280
+ # Invalidate cached env so it is recomputed on next start
1266
1281
  self._cached_env = None
1282
+ self._cached_env_settings = None
1267
1283
 
1268
1284
  # Clear cancel events first to avoid resource tracking issues
1269
1285
  events_to_set = list(self._cancel_events.values())