Context
CI previously ran the test matrix against both Python 3.12 (production via Dockerfile) and Python 3.14. The 3.14 leg was removed in commit c10f87f's follow-up because the pinned runtime stack is not 3.14-compatible:
certbot==2.10.0 pulls acme==3.3.0 which requires josepy<2, so we are stuck on josepy==1.13.0.
josepy==1.13.0 raises at class definition time under Python 3.14's PEP 649 deferred annotation evaluation:
ValueError: Field `alg` in JSONObject `Header` has no type annotation.
- Dockerfile ships on Python 3.12 so production is unaffected.
Running a CI leg against a stack we don't support would either (a) silently skip the tests that actually hit the import, or (b) fail forever. Neither is useful.
Why this is not just a CI cleanup
The underlying stack upgrade is the same one gating Path A of the 'Zero-Domain Certificates' analysis (IP certificates / Let's Encrypt shortlived profile), which requires certbot>=5.3. That upgrade cascades into:
certbot==2.10.0 → 5.x
acme + josepy → matching 5.x-compatible versions
- ~23
certbot-dns-* plugins pinned to ==2.10.0 matching certbot — each one needs a version that works against certbot 5.x, or a replacement
- Full DNS provider matrix re-test
So this issue and Path A share the same upgrade surface.
Definition of done
.github/workflows/ci.yml matrix includes a Python 3.14 leg again.
- The 3.14 leg is green end-to-end against the (upgraded) requirements pins.
tests/test_edgedns_credentials_format.py::test_certbot_credentials_parser_reads_all_four_keys runs (not skipped) on both 3.12 and 3.14.
- Dockerfile may or may not switch to 3.14 at the same time — decision taken in this issue.
Link
- Removal commit / reasoning: see follow-up commit after
c10f87f
- Path A spike analysis: private notes (summary: certbot 5.3+ required for IP certs, same upgrade blocker)
Context
CI previously ran the test matrix against both Python 3.12 (production via Dockerfile) and Python 3.14. The 3.14 leg was removed in commit
c10f87f's follow-up because the pinned runtime stack is not 3.14-compatible:certbot==2.10.0pullsacme==3.3.0which requiresjosepy<2, so we are stuck onjosepy==1.13.0.josepy==1.13.0raises at class definition time under Python 3.14's PEP 649 deferred annotation evaluation:Running a CI leg against a stack we don't support would either (a) silently skip the tests that actually hit the import, or (b) fail forever. Neither is useful.
Why this is not just a CI cleanup
The underlying stack upgrade is the same one gating Path A of the 'Zero-Domain Certificates' analysis (IP certificates / Let's Encrypt
shortlivedprofile), which requirescertbot>=5.3. That upgrade cascades into:certbot==2.10.0→5.xacme+josepy→ matching 5.x-compatible versionscertbot-dns-*plugins pinned to==2.10.0matching certbot — each one needs a version that works against certbot 5.x, or a replacementSo this issue and Path A share the same upgrade surface.
Definition of done
.github/workflows/ci.ymlmatrix includes a Python 3.14 leg again.tests/test_edgedns_credentials_format.py::test_certbot_credentials_parser_reads_all_four_keysruns (not skipped) on both 3.12 and 3.14.Link
c10f87f