chore(release): prepare v0.19.0 #53

Merged
xavierk merged 4 commits from release/v0.19.0 into main 2026-11-06 20:23:15 +00:00
Owner

Description

Prepares the first Voculinux release, v0.19.0 (xbps 0.19.0_1). The tag is v0.19.0, with no phase suffix. Three commits:

  • feat(model): the whisper.cpp ladder's free-memory thresholds are hard-coded per backend from the #19 installed-build measurement (Vulkan q8_0 1644 / q5_0 1359 MiB; CUDA q8_0 1690 / q5_0 1404 MiB).
  • feat(void): packaging/void/publish-release.sh publishes a built, verified out-dir to the Gitea release API. build-release.sh release now refuses an uncommitted checkout and records BUILT_FROM (tag and commit). The xbps workflow is manual dispatch only, because its only runner is ARM64 and cannot build the release. Docs describe the local sequence.
  • chore(release): version bump (version.py, Void template version and _tag, web, README, UPDATE, SECURITY), CHANGELOG entry, pyproject.toml project URLs on git.bongbetic.com.

Nothing here tags, builds or publishes. After merge, the maintainer creates and pushes the annotated tag on the verified origin/main commit (git push origin refs/tags/v0.19.0, never --tags), builds in a clean checkout of the tag, runs publish-release.sh --dry-run, then publishes. docs/RELEASE_PROCESS.md Step 7 and Step 8 and packaging/void/README.md "Releasing" have the exact sequence.

Related issue

Refs #16 (the Void spec) and #19 (the measured thresholds).

Type of change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation
  • Refactor
  • Tests
  • Packaging / CI

Checklist

  • Code follows project style (Black, isort, flake8): checked with the pinned tool versions from requirements/dev.txt
  • Documentation updated when user-facing behavior or install steps change
  • Tests added or updated for the change
  • Local tests pass: the related files pass offline. Void, workflow, ladder, config and rename-sweep files: 406 passed. Packaging and version files: 689 passed, 4 skipped. The full suite is not run, as on main
  • Conventional commit message style

Notes for reviewers

  • Decision for the maintainer: CPU thresholds. CPU and unknown backends keep the Vulkan thresholds. Issue #19 proposes a separate RAM rule (1563 MiB) and a floor-first default for CPU-only machines. That is not implemented here.
  • Workflow publish step. .gitea/workflows/xbps-release.yml still has its own publish step, which duplicates publish-release.sh. It stays inline because the workflow is dispatch-only and cannot run on the current runner. The two must change together until one is removed.
  • First-run default. config_manager now calls the GPU backend probe, which lazily imports recognition_manager and preloads the ggml libraries. The preload is idempotent and the engine does it anyway; it only runs on the unpinned first-run default.
  • CHANGELOG date is 2026-11-07. Adjust it when the tag is made.
  • main moved to 85cbc37 (#51, tray before the model loads) after this branch was cut. It touches main.py, recognition_manager.py, settings_dialog.py, tray_indicator.py and their tests, and none of this branch's files. The PR is mergeable.
  • Pre-existing, not from this PR: mypy src/ reports one error (ui/dictation_overlay.py:252) on origin/main with the same tooling. The settings GTK tests fail identically on origin/main (163 in both runs). Lock and export checks pass with uv 0.13.7.
## Description Prepares the first Voculinux release, v0.19.0 (xbps `0.19.0_1`). The tag is `v0.19.0`, with no phase suffix. Three commits: - `feat(model)`: the whisper.cpp ladder's free-memory thresholds are hard-coded per backend from the #19 installed-build measurement (Vulkan q8_0 1644 / q5_0 1359 MiB; CUDA q8_0 1690 / q5_0 1404 MiB). - `feat(void)`: `packaging/void/publish-release.sh` publishes a built, verified out-dir to the Gitea release API. `build-release.sh release` now refuses an uncommitted checkout and records `BUILT_FROM` (tag and commit). The xbps workflow is manual dispatch only, because its only runner is ARM64 and cannot build the release. Docs describe the local sequence. - `chore(release)`: version bump (`version.py`, Void template `version` and `_tag`, web, README, UPDATE, SECURITY), CHANGELOG entry, `pyproject.toml` project URLs on git.bongbetic.com. Nothing here tags, builds or publishes. After merge, the maintainer creates and pushes the annotated tag on the verified `origin/main` commit (`git push origin refs/tags/v0.19.0`, never `--tags`), builds in a clean checkout of the tag, runs `publish-release.sh --dry-run`, then publishes. `docs/RELEASE_PROCESS.md` Step 7 and Step 8 and `packaging/void/README.md` "Releasing" have the exact sequence. ## Related issue Refs #16 (the Void spec) and #19 (the measured thresholds). ## Type of change - [x] Bug fix - [x] New feature - [ ] Breaking change - [x] Documentation - [ ] Refactor - [x] Tests - [x] Packaging / CI ## Checklist - [x] Code follows project style (Black, isort, flake8): checked with the pinned tool versions from `requirements/dev.txt` - [x] Documentation updated when user-facing behavior or install steps change - [x] Tests added or updated for the change - [x] Local tests pass: the related files pass offline. Void, workflow, ladder, config and rename-sweep files: 406 passed. Packaging and version files: 689 passed, 4 skipped. The full suite is not run, as on `main` - [x] Conventional commit message style ## Notes for reviewers - **Decision for the maintainer: CPU thresholds.** CPU and unknown backends keep the Vulkan thresholds. Issue #19 proposes a separate RAM rule (1563 MiB) and a floor-first default for CPU-only machines. That is not implemented here. - **Workflow publish step.** `.gitea/workflows/xbps-release.yml` still has its own publish step, which duplicates `publish-release.sh`. It stays inline because the workflow is dispatch-only and cannot run on the current runner. The two must change together until one is removed. - **First-run default.** `config_manager` now calls the GPU backend probe, which lazily imports `recognition_manager` and preloads the ggml libraries. The preload is idempotent and the engine does it anyway; it only runs on the unpinned first-run default. - **CHANGELOG date** is 2026-11-07. Adjust it when the tag is made. - **`main` moved** to 85cbc37 (#51, tray before the model loads) after this branch was cut. It touches `main.py`, `recognition_manager.py`, `settings_dialog.py`, `tray_indicator.py` and their tests, and none of this branch's files. The PR is mergeable. - **Pre-existing, not from this PR:** `mypy src/` reports one error (`ui/dictation_overlay.py:252`) on `origin/main` with the same tooling. The settings GTK tests fail identically on `origin/main` (163 in both runs). Lock and export checks pass with uv 0.13.7.
xavierk added 3 commits 2026-11-06 20:17:01 +00:00
The whisper.cpp ladder keyed both GPU backends to one provisional pair of
thresholds. Issue #19 (comment 12913) measured each rung's transcribe-time
VRAM delta on the installed build. The thresholds are those deltas plus the
512 MiB desktop headroom:

- vulkan: q8_0 1644 MiB, q5_0 1359 MiB (was 1644 and 1358)
- cuda:   q8_0 1690 MiB, q5_0 1404 MiB

select_ladder_rung and resolve_startup_rung take the installed build's
backend. CPU and unknown backends keep the Vulkan thresholds; the RAM rule
proposed in #19 is not implemented.

The first-run default in config_manager now reads the memory of the
installed build (VRAM for a GPU build, RAM otherwise). It used to read VRAM
whenever an NVIDIA card was present, even on a CPU build.
The release is built on the maintainer's x86_64 Void host, not in CI. The
bongbetic-ci runner is ARM64 and cannot build the glibc x86_64 package. A tag
push no longer starts the xbps workflow: it is manual dispatch only, and its
header says why.

- build-release.sh release refuses an uncommitted or untracked checkout before
  any container starts. It writes BUILT_FROM (the tag and the commit it was
  built from), which nothing recorded before.
- publish-release.sh TAG --out-dir DIR publishes a built out-dir to the Gitea
  release API in the workflow's order. It refuses unless origin's tag peels to
  the BUILT_FROM commit, the sdist digest matches, and the client key is the
  committed one. --dry-run runs every check and prints the planned calls
  without sending one. The token comes from GITEA_TOKEN or the tea login and is
  never printed.
- Tests run both scripts offline against a local bare origin and a stateful
  Gitea stand-in.
- docs/RELEASE_PROCESS.md and packaging/void/README.md describe the local
  sequence: merge, annotated tag by ref, clean build, dry-run, publish, checksum.
chore(release): prepare v0.19.0
CI / security (pull_request) Successful in 1m13s
CI / lint (pull_request) Successful in 24s
CI / ai-review (pull_request) Successful in 7s
6c09812271
The first Voculinux release. It has no phase suffix, so the tag is v0.19.0
and the xbps version is 0.19.0_1.

- src/vocalinux/version.py, the Void template (version and _tag), the web
  softwareVersion and package version, the README badge and current-release
  blurb
- docs/UPDATE.md: What's New in v0.19.0, and the source checkout tag
- CHANGELOG.md: v0.19.0 entry from v0.18.5..main, the fork's changes and the
  upstream fixes carried after 0.18.5
- SECURITY.md: 0.19.x is the supported line
- pyproject.toml: project URLs point at git.bongbetic.com/xavierk/voculinux
xavierk added 1 commit 2026-11-06 20:21:07 +00:00
docs(release): correct v0.19.0 changelog references and README link
CI / security (pull_request) Successful in 1m11s
CI / lint (pull_request) Successful in 22s
CI / ai-review (pull_request) Successful in 7s
8f84829d34
- README: the current-release line links to the signed repository section.
- CHANGELOG: each (#N) matches its commit subject. #37 is the build from the
  tag, #39 the pysocks template and its version floors. Internal tickets are
  named as tickets.
- publish-release.sh: the gates-passed line names the commit the out-dir was
  built from, and keeps the same gate wording.
xavierk merged commit 731b919865 into main 2026-11-06 20:23:15 +00:00
Sign in to join this conversation.