Context
ADR 0013 (require Python >=3.12) deliberately deferred the ruff modernization to keep the security/floor diff reviewable:
Deferred to a dedicated style: commit: bumping ruff target-version from py39 to py312 and the resulting X | None (UP045) modernization across ~52 sites, kept out of this change to keep the security/floor diff reviewable.
That commit never landed. pyproject.toml still has target-version = "py39" (with the now-contradictory comment # Assume Python 3.9+) alongside requires-python = ">=3.12". The 2026-07 architecture-doc review (PR #82) removed the deferral sentence from ADR 0013; this issue is the tracking that replaces it.
Work
One mechanical style: commit, per ADR 0013's original intent.
Context
ADR 0013 (require Python >=3.12) deliberately deferred the ruff modernization to keep the security/floor diff reviewable:
That commit never landed.
pyproject.tomlstill hastarget-version = "py39"(with the now-contradictory comment# Assume Python 3.9+) alongsiderequires-python = ">=3.12". The 2026-07 architecture-doc review (PR #82) removed the deferral sentence from ADR 0013; this issue is the tracking that replaces it.Work
[tool.ruff]target-versionfrom"py39"to"py312"inpyproject.toml# Assume Python 3.9+commentOptional[X]→X | None) modernization across the codebase (~52 sites at time of ADR 0013; recount at execution)ruff checkclean,ruff formatclean)One mechanical
style:commit, per ADR 0013's original intent.