Columna 0.13.2 — the declared Python floor and ceiling: 3.10–3.13, 64-bit
Packaging release. No engine, wire, or contract change — contract_version stays "1".
columna 0.13.2 · columna-core 0.13.2 · columna-server 0.8.1
Why
A Windows fresh-venv pass found pip install columna on Python 3.14 not failing but building — a C++ source build of datasketches, which columna-core hard-depends on for HLL. datasketches 5.x publishes no cp314 wheels on any platform and no 32-bit Windows wheels at any version. With requires-python unbounded above, pip considered us a match, found no wheel, and fell through to a compiler.
Fail closed with a named reason beats rare success for whoever happens to own a compiler.
What changed
requires-python = ">=3.10,<3.14"on all three packages. pip now refuses cleanly —no matching distribution found— before dependency resolution ever reaches datasketches.- Classifiers name 3.13, which was supported and shipped but never advertised. CI's test matrix gains 3.13 in the same change.
- The supported line is written down — "Requires Python 3.10–3.13, 64-bit." — on the install page and both front-door READMEs, each with a troubleshooting line pointing the symptom at its cause.
demo --playno longer crashes on Windows. Piping or redirecting its output died withUnicodeEncodeError: 'charmap' codec can't encodeon the opening line, before a single mood printed: Python falls back to the locale encoding (cp1252) the moment stdout is not a console, and our output is legitimately non-ASCII.columna-servernow declares UTF-8 on stdout/stderr for every subcommand. This bug was found by the new Windows CI leg on its first run.
The guard
demo wheel install now runs windows-latest / py3.13 beside ubuntu / py3.10. The class — a dependency with platform or version wheel gaps — was invisible to a Linux-only CI, which is how this survived three releases. Both legs run the same assertion file so they cannot drift into proving different things. A second guard, test_demo_play_survives_a_cp1252_stdio_locale, reproduces the Windows failure on any platform via PYTHONIOENCODING=cp1252.
The door
Python 3.14 support arrives when datasketches ships cp314 wheels, or via the optional-extras split (datasketches/duckdb optional, with a polite refusal at point of use) scoped as WP-1.1 — rowed, not rushed.