0024. evalsi ships Linux platform wheels that bundle evalsid
- Status: Accepted, 2026-10-12
Context
Section titled “Context”pip install evalsi gave the SDK and CLI, but evalsi serve, code evaluators (through evalsid sandbox run) and Wasm plugins all need the Go evalsid binary, which a Python user had to fetch from the release archive or build. Decision 0006 left bundling it as a later option.
Decision
Section titled “Decision”- Platform wheels of
evalsi, not a second package. For Linux amd64 and arm64 the release addsevalsi-<v>-py3-none-manylinux_2_17_<arch>.whl: the pure wheel plusevalsi/_bin/evalsidandevalsi/_bin/bwrap, both from that architecture’s release archive and executable.evalsidprefers abwrapbeside itself, so the sandbox’s namespaced rung needs nothing from the host. The archive’s licence notices for bubblewrap go into the wheel’slicenses/bundled. Themanylinux_2_17tag only says “Linux on this architecture”: the binaries are static Go and static bubblewrap, with no glibc dependency. - The pure wheel and the sdist stay. pip picks the more specific platform wheel on a matching machine and the pure wheel everywhere else (macOS, Windows, other architectures);
--no-binary evalsibuilds the pure package from the sdist. Nothing else about the package differs. - Lookup order:
EVALSID, then the bundled binary, thenPATH(evalsi._binaries.evalsid_path). The environment variable is an explicit choice and always wins. The bundle comes beforePATHbecause it is the same release as the Python package, so the worker protocol matches; a differentevalsidonPATHis a different release more often than a deliberate choice.evalsi evalsid-pathprints the one in use. - Built from the archive, not rebuilt.
scripts/platform_wheel.py(standard library only) takes the pure wheel andevalsi_<version>_linux_<arch>.tar.gz, refuses a version mismatch (a tag0.5.0-rc1matches the wheel’s0.5.0rc1), flipsRoot-Is-Purelib, sets the tag and writes a validRECORD. The release workflow runs it per architecture after the binaries and the pure wheel; the PyPI job and the GitHub release include the results. evalsidis not put onPATH. A console script namedevalsidwould shadow, inside a virtualenv, anevalsidsomeone installed on purpose, and the pure wheel could not have one. Useevalsi serveor$(evalsi evalsid-path).
Consequences
Section titled “Consequences”- A Linux install of
evalsigrows by the size ofevalsidandbwrap(tens of megabytes, compressed): the price of “nothing else to install”. Anyone who wants the small package uses--no-binaryor installs it where only the SDK is needed. - macOS and Windows are not covered: there is no release archive for them, and the sandbox is Linux-only.
evalsiditself builds elsewhere, so a darwin wheel would be possible later without changing the lookup. - Untested until a tag: the
wheelsjob and the PyPI upload of platform wheels run only in the release workflow. CI covers the script, the lookup order, and a wheel built from the real amd64 archive, installed and used to run the sandbox.