#211 moved the services to Python 3.14. The MLflow tracking image is held at 3.11, because mlflow does not run on 3.14.
Not a packaging problem
mlflow is pure-python. It resolves cleanly on cp314 — the full 95-package closure installs with --only-binary=:all: and no complaint. No wheel check, lock regeneration, or dependency gate can see this. It is mlflow's own source:
# mlflow/assistant/skill_installer.py:11
from importlib.abc import Traversable
ImportError: cannot import name 'Traversable' from 'importlib.abc'
Python 3.14 removed importlib.abc.Traversable (deprecated since 3.12, where it moved to importlib.resources.abc). The import chain is reached on server start:
uvicorn -> mlflow.server.fastapi_app
-> mlflow.server.assistant.api
-> mlflow.assistant.skill_installer <- dies here
So the tracking server cannot boot. The live tracking-gateway proof caught it immediately — it gates on a real MLflow write (#204), so the broken image failed loudly rather than shipping.
Only the server is affected
The mlflow client imports fine on 3.14 (verified on CPython 3.14.6):
|
on Python 3.14 |
import mlflow (client) |
OK |
import mlflow.server.fastapi_app (server) |
ImportError |
That is why services/ml_service and services/notebook_tracking_gateway — both mlflow clients — already run on 3.14 with their suites green. Only infrastructure/mlflow stays behind.
The trigger
3.14.0 is the newest mlflow, and no release yet declares Python 3.14 support (no Programming Language :: Python :: 3.14 classifier on any 3.x release).
Lift when mlflow ships a release that runs on 3.14. Then it is:
Blocks the last image of Dependabot #182 (with the 2 notebook kernels in #220).
#211 moved the services to Python 3.14. The MLflow tracking image is held at 3.11, because mlflow does not run on 3.14.
Not a packaging problem
mlflow is pure-python. It resolves cleanly on cp314 — the full 95-package closure installs with
--only-binary=:all:and no complaint. No wheel check, lock regeneration, or dependency gate can see this. It is mlflow's own source:Python 3.14 removed
importlib.abc.Traversable(deprecated since 3.12, where it moved toimportlib.resources.abc). The import chain is reached on server start:So the tracking server cannot boot. The live tracking-gateway proof caught it immediately — it gates on a real MLflow write (#204), so the broken image failed loudly rather than shipping.
Only the server is affected
The mlflow client imports fine on 3.14 (verified on CPython 3.14.6):
import mlflow(client)import mlflow.server.fastapi_app(server)That is why
services/ml_serviceandservices/notebook_tracking_gateway— both mlflow clients — already run on 3.14 with their suites green. Onlyinfrastructure/mlflowstays behind.The trigger
3.14.0 is the newest mlflow, and no release yet declares Python 3.14 support (no
Programming Language :: Python :: 3.14classifier on any 3.x release).Lift when mlflow ships a release that runs on 3.14. Then it is:
infrastructure/mlflow/Dockerfile:python:3.11-slim→python:3.14-sliminfrastructure/mlflow/requirements.txtfor cp314 — the command is in the file's header. Note it needs two platform tags (manylinux_2_28_x86_64andmanylinux2014_x86_64): the scientific wheels ship 2_28 for cp314 while psycopg2-binary still ships only manylinux2014, and either tag alone fails to resolve.psycopg2-binary2.9.9 → 2.9.12 goes with it (2.9.9 publishes no cp314 wheel)tracking-gatewayintegration proof must be green — it is the check that catches exactly thisBlocks the last image of Dependabot #182 (with the 2 notebook kernels in #220).