## procrastinate-org/procrastinate — 3.8.1…3.9.0

_87 commits._

### Features
- **Add WorkerMiddleware type and worker registration + validation** (4f71956)
- **Add task middleware** (f4b059c)
- **Merge pull request #1554 from procrastinate-org/devcontainer-add-github-cli** (518d5a8)
- **Add GitHub CLI feature to devcontainer** (e69e61d)

### Fixes
- **Merge pull request #1569 from procrastinate-org/fix-renovate-rebase-loop** (fa929b5)
- **Merge pull request #1564 from procrastinate-org/fix-worker-stop-race** (2c3df1a)
- **Fix Renovate blockers: ignore pre-commit.ci commits and re-pin benchmark action** (5983c53)
- **Fix worker stop request lost during startup and de-flake shutdown tests** (0826080)
- **Merge pull request #1562 from procrastinate-org/fix-task-decorator-docs** (896abfd)
- **Fix App.task / Blueprint.task not rendering in the API reference** (d956178)
- **Fix stop() after the worker loop has closed** (1df29a5)

### Backend
- **Update all dependencies (#1580)** (28462ad)
- **Update all dependencies to v7 (#1581)** (9d7ee55)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (3537733)
- **Update all dependencies to v7** (727c7de)
- **Update all dependencies** (4133f7d)
- **Merge pull request #1579 from procrastinate-org/worker-middleware-feature** (3d82ddb)
- **Raise MiddlewareKindMismatch for a sync worker middleware** (b3eb4d1)
- **Frame Django DB cleanup as a built-in use and link the integration** (7a36eff)
- **Restructure middleware how-to around both middleware kinds** (032edae)
- **Scope the MiddlewareKindMismatch note to task middleware** (6a4a9da)
- **Document worker middleware** (7d4c5eb)
- **Test worker-middleware failure, abort, retry, stop, and defaults semantics** (bc06d0a)
- **Wrap each job run with the worker-middleware chain** (03c1141)
- **Lock file maintenance (#1576)** (b7072d2)
- **Merge pull request #1578 from procrastinate-org/deflake-test-polling** (3fae034)
- **Deflake test_polling** (00d9948)
- **Merge pull request #1577 from procrastinate-org/django-db-cleanup-middleware** (2088173)
- **contrib/django: auto-close Django DB connections around each task** (c341945)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (27a46f7)
- **Lock file maintenance** (5d7ba88)
- **Merge pull request #1575 from procrastinate-org/cleanup-pyproject-toml** (6ca02dc)
- **Rename ruff extend-ignore to ignore** (b67bbb6)
- **Reorder pyproject.toml sections to group tool tables** (6a92ca8)
- **Merge pull request #1574 from procrastinate-org/deflake-sync-parallel-test** (f9d35c5)
- **Shorten sleep to 0.2s and drop explanatory comment** (a3f206f)
- **Deflake test_sync_task_runs_in_parallel** (fa5a038)
- **Merge pull request #1511 from EdwardBetts/replace-migra-with-results** (0c55c6a)
- **Loosen results pin and drop obsolete setuptools renovate rule** (2c7e983)
- **Merge branch 'main' into replace-migra-with-results** (815d932)
- **Lock file maintenance (#1573)** (1937caa)
- **Lock file maintenance** (a7cdb55)
- **Merge pull request #1572 from procrastinate-org/chore/pin-setuptools-renovate** (aa5691c)
- **Stop Renovate from proposing setuptools major updates** (2b4d093)
- **Pin dependencies (#1570)** (0667ca2)
- **Pin dependencies** (3d4631a)
- **Merge pull request #1503 from procrastinate-org/renovate/lock-file-maintenance** (ab45abb)
- **De-flake test_run_log_actions** (a8fc726)
- **Pin Python 3.14 for static-typing CI job** (d3b556a)
- **Pin setuptools<81 to keep pkg_resources available** (f80148e)
- **Use Generator return types for context managers** (307aea7)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (84333fb)
- **Lock file maintenance** (1294c04)
- **Remove gitIgnoredAuthors to stop Renovate/pre-commit.ci force-push loop** (8ed42e0)
- **Merge pull request #1566 from procrastinate-org/renovate-config-fixes** (6dab3ac)
- **Pin all GitHub Action digests via Renovate preset** (64b3c69)
- **Update all dependencies (#1567)** (510a7fd)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (30b701a)
- **Update all dependencies** (ffdf014)
- **Update all dependencies (#1565)** (ab23735)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (9ef2791)
- **Update all dependencies** (f114a7f)
- **Merge pull request #1532 from procrastinate-org/renovate/all** (5947a8d)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (93dfaf3)
- **Update all dependencies** (cf08773)
- **De-flake test_stop_worker and drop a dead sleep** (016f85f)
- **De-flake abort acceptance tests** (9b4dc48)
- **Merge pull request #1556 from procrastinate-org/middleware-feature** (55c19e5)
- **Address review feedback on task middleware** (1d23019)
- **Remove task-middleware design spec and plan** (5f87e01)
- **Merge pull request #1549 from procrastinate-org/dependabot/uv/idna-3.15** (79ffbb7)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (1f4f0ea)
- **Bump idna from 3.11 to 3.15** (4bab528)
- **Merge pull request #1542 from procrastinate-org/renovate/major-all** (cceb33e)
- **Update ghcr.io/devcontainers/features/node Docker tag to v2** (013a549)
- **Merge pull request #1545 from procrastinate-org/renovate/pypi-django-vulnerability** (171687e)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (1db1212)
- **Update dependency django to v6.0.5 [SECURITY]** (3bf00ab)
- **Merge pull request #1541 from procrastinate-org/renovate/major-all** (76bd841)
- **Update astral-sh/setup-uv action to v8** (8b550b7)
- **Merge pull request #1539 from procrastinate-org/dependabot/uv/pytest-9.0.3** (b20be02)
- **Bump pytest from 9.0.2 to 9.0.3** (0349f7d)
- **Merge pull request #1538 from procrastinate-org/renovate/pypi-django-vulnerability** (689a9c8)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (3a83c7c)
- **Update dependency django to v6.0.4 [SECURITY]** (282f3c4)
- **[pre-commit.ci] auto fixes from pre-commit.com hooks** (b49a292)
- **Replace deprecated migra with results** (85ba34d)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/procrastinate-org/procrastinate?utm_source=github-action)._