There is no release pipeline. No tags, no CI publish workflow, no registries, no prebuilt artifacts. This file records where the version lives and what a first release would have to add.
The single source of truth is include/langid.h:
#define LANGID_VERSION_MAJOR 0
#define LANGID_VERSION_MINOR 1
#define LANGID_VERSION_PATCH 0The top-level CMakeLists.txt parses those three macros before project()
to set the CMake project version and the shared-library VERSION /
SOVERSION, and langid_version() returns the same string. Nothing else
declares a version, so a bump is a one-line edit and a reconfigure. Pre-1.0
the SOVERSION is MAJOR.MINOR, encoding the policy that the ABI may break on
a minor.
langid_version_commit() reports the short git SHA captured at configure
time (unknown outside a git tree). It is a snapshot: reconfigure to refresh
it.
Condensed from transcribe.cpp's RELEASING.md, which is the model to follow
when the time comes.
- A remote. Nothing has ever been pushed.
- An ABI digest. transcribe.cpp installs a
transcribe.abihashalongside the header and validates it before dlopen. langid.cpp has no equivalent; the install rules leave a marked hole for it (cmake/langid-install.cmake). - A version-consistency check. transcribe.cpp's
scripts/release/prepare.pywrites the version into ~15 files and--checkverifies the tree. langid.cpp declares it in exactly one place today, so this is only needed once there are binding manifests (Cargo.toml, package.json, pyproject.toml, lockfiles) to keep in step. - Published GGUFs. The model is Apache-2.0 and convertible from the
pinned upstream revision, but no converted file is hosted anywhere.
A release needs a home for them and the sha256 manifest already in
docs/model.md. - A
publish.ymltriggered by av[0-9]*tag, building per-platform artifacts. The tag run must not be the gate: branch CI onmainis, because a tag run does not re-run the drift checks. - Real-model CI.
LANGID_BUILD_REAL_MODEL_TESTSand the validation gates need a GGUF that CI can fetch. Today they are local-only. - A CHANGELOG.
- Names claimed on whatever registries the bindings target
(
langid-cpp/@langid-cpp/<tuple>were unclaimed as of PLAN-v1).
- Branch, bump
include/langid.h, reconfigure, commit. - Green branch CI on the PR:
native-ci(cpp-tests on Linux and macOS, cpp-tests-sanitized, shared-build with the install + link smoke) andclang-format. - Locally, against the F32 GGUF:
uv run scripts/validate.py all --family ecapa_tdnnand the dataset gate (scripts/eval/compare.py, seedocs/validation.md). Neither runs in CI. - Merge, then tag the merged commit on
mainand push the tag. The tag string must equal the version in the header. - Update
docs/accuracy.mdanddocs/latency.mdif any measurement moved.
A langid.cpp release never bumps ggml on its own. ggml moves when
transcribe.cpp moves, and a langid release names the transcribe.cpp tag whose
ggml it mirrors. See docs/distribution.md.