# 0004. Python floor policy - **Status:** Accepted - **Date:** 2026-09-10 - **Deciders:** maintainer ## Context `pyproject.toml` declares `python = "^3.10"` and the CI matrix runs 3.10 through 3.14. The README stated the floor as a number without a policy, and the family standard asks for the policy: when the floor may rise, on which version axis, and where the reason is recorded. It also warns against claiming distribution compatibility without a table. ## Options considered 1. **Track the newest Python only.** Simplest code, but excludes every long-term-support deployment and most bank estates. 2. **Follow upstream end-of-life.** Raise the floor one release after a Python version leaves upstream support, announced one release ahead. 3. **Freeze the floor at 3.10 indefinitely.** Predictable, but accrues compatibility shims forever. ## Decision Option 2. The floor rises only when a Python version reaches upstream end-of-life, in the first release opened after that date, with the change announced under "Changed" in the CHANGELOG of the release before it. On the `0.0.x` line this is still a single-step release, called out as breaking. No claim is made about any distribution's system Python; the documented install path is a virtual environment or the container image. ## Consequences - The CI matrix is the enforcement: the floor version must stay in `ci.yml` until it is dropped here first. - Each rise gets its own ADR entry appended below, so the history is in one place. | Floor | From release | Reason | | :--- | :--- | :--- | | 3.10 | current | The oldest version in the CI matrix; 3.9 reached upstream end-of-life in October 2025. |