Skip to content

chore: raise Python floor to >=3.12 (CQ-01 / CAL-02) - #72

Merged
ChelseaKR merged 3 commits into
mainfrom
chore/requires-python-312
Aug 22, 2026
Merged

chore: raise Python floor to >=3.12 (CQ-01 / CAL-02)#72
ChelseaKR merged 3 commits into
mainfrom
chore/requires-python-312

Conversation

@ChelseaKR

Copy link
Copy Markdown
Owner

Bumps requires-python to >=3.12 ahead of Python 3.10 EOL (Oct 2026, STANDARDS dated obligation CAL-02) per CODE-QUALITY-STANDARD CQ-01. Aligns ruff target-version / mypy python_version / classifiers / CI matrix, and regenerates uv.lock for the new floor.

🤖 Generated with Claude Code

@ChelseaKR

Copy link
Copy Markdown
Owner Author

BLOCKED — conflicts with accepted ADR 0001 and with the held v0.9.0 release scope; also incomplete as a floor change. Owner: @ChelseaKR (maintainer decision).

Why blocked (policy, not mechanics):

  • docs/adr/0001-python-311-floor.md (accepted, backfilled 2026-07-09) states: requires-python = ">=3.11" stands; the floor rises only when a runtime dependency forces it or 3.11 leaves upstream support, and the change gets its own ADR and a minor-version release note. Neither trigger holds today: uv.lock on main still resolves for 3.11 (no dependency forces 3.12), and Python 3.11 security support runs to October 2027. The PR's cited driver — CAL-02 / Python 3.10 EOL (Oct 2026) — does not apply, because the current floor is already 3.11. ADR 0001 is the repo's declared, justified deviation from CODE-QUALITY-STANDARD CQ-01 ("a high floor costs exactly the adopters the tool exists for"), so merging this reverses a documented product decision without superseding it.
  • Sequencing vs. the v0.9.0 hold: v0.9.0 release prep is intentionally held on upstream docs: clarify v2.1.0 conformance requirements MobilityData/transit-operational-data-standard#156 (still open as of 2026-07-31), with the v0.9 gate scope already closed by fix: close v0.9 conformance and release gates #69. Merging now folds a user-facing floor raise into that held release's Unreleased scope. If the raise is wanted, it sequences most cleanly as a deliberate post-v0.9.0 (v0.10.0) item.
  • Incomplete even if approved: no superseding ADR; README.md:37 and CONTRIBUTING.md:10 still say "Requires Python 3.11 or newer"; no CHANGELOG entry for a user-facing support change (ADR 0001 explicitly requires the release note).

Mechanics are otherwise clean (verified today): MERGEABLE, merges clean into main via git merge-tree (branch is 1 docs-only commit behind — #78), all 13 checks green on the branch head 1061eb9 (test matrix correctly reduced to 3.12/3.13), .python-version on main is already 3.12, and Dockerfile/action.yml pin 3.13 so they are unaffected.

If you decide the raise should happen: add a superseding ADR (e.g. docs/adr/000X-python-312-floor.md marking 0001 superseded), update README/CONTRIBUTING/CHANGELOG, rebase, and this becomes merge-ready. I have not made those changes because they presuppose reversing ADR 0001, which is yours to call.

@ChelseaKR
ChelseaKR force-pushed the chore/requires-python-312 branch from 1061eb9 to 3dbea49 Compare August 21, 2026 21:23
ChelseaKR and others added 3 commits August 21, 2026 14:28
Bumps requires-python to >=3.12 ahead of Python 3.10 EOL (Oct 2026,
STANDARDS dated obligation CAL-02) per CODE-QUALITY-STANDARD CQ-01.
Aligns ruff target-version / mypy python_version / classifiers / CI
matrix, and regenerates uv.lock for the new floor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Rebasing onto main picked up #128's pip 26.2.1 bump; re-running `uv lock`
after the Python floor change keeps both together and drops a leftover
numpy build now unreachable at the >=3.12 floor.
@ChelseaKR
ChelseaKR force-pushed the chore/requires-python-312 branch from 3dbea49 to 57fb242 Compare August 21, 2026 21:28
@ChelseaKR
ChelseaKR merged commit c9185f8 into main Aug 22, 2026
17 checks passed
@ChelseaKR
ChelseaKR deleted the chore/requires-python-312 branch August 22, 2026 04:28
ChelseaKR added a commit that referenced this pull request Aug 22, 2026
#72 (raise Python floor to >=3.12) merged without the three things a
2026-07-31 review said it needed first: a superseding ADR for 0001 (which
still said the floor stays 3.11 unless dependency-forced or 3.11 leaves
support), and updated README.md/CONTRIBUTING.md (both still said "Requires
Python 3.11 or newer" against a pyproject.toml that now requires >=3.12).

Adds docs/adr/0006-python-312-floor.md, marks 0001 superseded, syncs
README/CONTRIBUTING, adds a CHANGELOG Unreleased entry, and updates
CONFORMANCE-GAPS.md's CQ-01 note (closed directly against the standard now,
not via 0001's declared deviation).

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
ChelseaKR added a commit that referenced this pull request Aug 22, 2026
v0.9.1 was tagged and signed (commit edd2ea1) but its GitHub Release object
was never created, so pypi-publish.yml never ran: PyPI's latest published
version stayed 0.9.0 (#136). Sixteen PRs landed on main after that tag,
including validator-behavior changes (fail-closed unreadable-file handling
in TODS-E301/E303 and companion-GTFS reference checks, diff/batch coverage-
manifest fixes, a new TODS-E207 rule) and a Python floor raise to >=3.12
(#72), so re-publishing the number 0.9.1 would misdescribe what ships.

0.10.0, not 1.0.0: the repo is still Beta (README, pyproject classifiers)
and docs/v1-contract-audit.md reserves v1.0.0 for a conformance-only
release after the contract snapshot has gone unchanged for a full cycle --
this release adds a rule and changes coverage-manifest behavior, so it does
not qualify. Per REL-05 (pre-1.0 SemVer may break in MINOR), the Python
floor bump alone justifies the MINOR bump over a PATCH.

Bumps pyproject.toml, CITATION.cff, uv.lock, the two stale @v0.9.1 pins in
README.md, and the .pre-commit-hooks.yaml example pin. Converts CHANGELOG's
Unreleased section into a dated v0.10.0 section explaining the version
jump. Updates WVR-002's project_version to 0.10.0 so the playground-pin
waiver keeps naming the exact, current gap (pin stays 0.9.0 until the
follow-up PR repins it post-publish); the waiver itself is retired once
this release is confirmed on PyPI, not in this PR.

v0.9.1's tag is left signed and unmoved; it is simply not the version
anyone should install.

Signed-off-by: Chelsea Kelly-Reif <3114598+ChelseaKR@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant