Python 3.15 rc3 in CI: test your Sume job poll logic before Oct 9

Python 3.15.0rc3 is out and the final is planned for Oct 9. Add a CI job that runs a stdlib unittest on your Sume status-poll decision function.

4 min readSume
All posts

Add a CI job on Python 3.15.0rc3 that runs a plain unittest against the one function that decides what your Sume poller does next. The rc3 announcement says 3.15.0rc3 was released on October 2, 2026, with the final release planned for October 9, 2026. It also says there are no ABI changes from this point, and that it is a preview, not for production use.

That makes it the right week for a cheap check. You are not moving production; you are finding out now whether your own code behaves the same on the interpreter you will get next week. A poll-decision function is a good candidate because it is pure: a status document goes in, an action and a wait come out, and no network is needed.

What to put under test

Sume's GET /v1/jobs/{id}/status returns a document with status, terminal, result_ready and next_poll_after_seconds, described in the jobs and results docs. The wait hint is null once a job is terminal, which is a classic crash for loops that sleep on it unconditionally. Treat the wait as a hint with a floor, not a promise: if the server asks for a longer pause, wait longer, and if it sends nothing, fall back to your own minimum. A test that feeds each shape of document through your decision function catches that class of bug on every Python version you support.

Python 3.15 release candidate facts and the Sume fields under test (read 2026-10-08)
ItemValueSource
3.15.0rc3 releasedOct 2, 2026Python blog
3.15.0 final plannedOct 9, 2026Python blog
ABINo changes from rc3 onwardPython blog
Status when terminalnext_poll_after_seconds is nullSume jobs docs
Done and readyterminal true and result_ready true, then GET /resultSume jobs docs

Steps

  • Pull the decision into a function with no I/O, as below, so the test needs no mock server. Pass the floor in as a parameter so a test can change it.
  • Run python -m unittest in your matrix on 3.14 and on the 3.15 release candidate. Mark the 3.15 row as allowed to fail until the final lands.
  • After October 9, switch the row to the final release and make it required.
  • Keep a second, slower test elsewhere that calls the real API with a cheap request, after reading the quick start for key setup.

Sample

This file defines the decision function and four tests. We ran it on Python 3.14.7; it uses only the standard library and syntax that is valid on 3.14, so it should behave the same on 3.15. We have not run it on 3.15 itself.

import unittest
def next_step(doc: dict, floor: float = 2.0) -> tuple[str, float]:
    data = doc["data"]
    if data["terminal"]:
        return ("fetch_result" if data["result_ready"] else "stop", 0.0)
    wait = data.get("next_poll_after_seconds") or floor
    return ("poll", max(float(wait), floor))


class NextStepTest(unittest.TestCase):
    def doc(self, **kw):
        base = {"terminal": False, "result_ready": False, "next_poll_after_seconds": None}
        return {"data": base | kw}

    def test_waits_for_server_hint(self):
        self.assertEqual(next_step(self.doc(next_poll_after_seconds=7)), ("poll", 7.0))

    def test_floor_when_hint_missing(self):
        self.assertEqual(next_step(self.doc()), ("poll", 2.0))

    def test_completed_fetches_result(self):
        done = self.doc(terminal=True, result_ready=True)
        self.assertEqual(next_step(done), ("fetch_result", 0.0))

    def test_failed_stops(self):
        self.assertEqual(next_step(self.doc(terminal=True)), ("stop", 0.0))


if __name__ == "__main__":
    unittest.main()

What Sume does not do

Sume does not certify any Python version. The docs describe the HTTP API, and any client that can send HTTPS requests works. The runtime claims in this post come from the Python announcement, and the status fields come from the Sume docs. If your poller depends on a library, test that library on 3.15 too, because wheels are the more common source of surprises than your own code.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume