Skip to content

ci: per-engine CI lanes for parakeet-cpp and tts-cpp (QIP PR 0)#93

Open
ogad-tether wants to merge 7 commits into
masterfrom
feat/engines-ci
Open

ci: per-engine CI lanes for parakeet-cpp and tts-cpp (QIP PR 0)#93
ogad-tether wants to merge 7 commits into
masterfrom
feat/engines-ci

Conversation

@ogad-tether

@ogad-tether ogad-tether commented Jul 17, 2026

Copy link
Copy Markdown

What

PR 0 of the repo-reorg QIP (#94 — the plan itself; approve there). This PR is the CI scaffold and lands independently of the QIP's approval:

  • .github/workflows/parakeet-ci.yml / tts-ci.yml — the first CI in this repo that builds and tests our engines. Per PR (path-filtered):
    1. Build qvac-ext-ggml@speech CPU-only (shallow clone, actions/cache keyed by branch-tip SHA; same fork the ggml-speech vcpkg port ships).
    2. Build the engine + all test harnesses against it (PARAKEET_USE_SYSTEM_GGML=ON / tts already mandates system ggml).
    3. ctest -LE 'gpu|perf' --output-on-failure — model-dependent tests auto-DISABLE to "Not Run" per the existing harness design, so the lane is green with committed fixtures only.
  • GPU lanes stubbed behind workflow_dispatch (runs-on: [self-hosted, gpu]) until GPU runners exist. Hosted macos-14 exposes Metal, so trialling -L gpu there is a cheap follow-up.
  • tts-cpp/CMakeLists.txt fix — the lane's very first run caught a real bug: test-campplus / test-campplus-backward-parity compile src/campplus.cpp without src/backend_selection.cpp, where tts_cpp::detail::init_cpu_backend() lives. Apple's toolchain tolerated it; GNU ld fails with an undefined reference — Linux-with-tests had never been built by any CI before. Fixed by mirroring test-voice-embedding's source list.

Why now

Engine regressions currently surface days later in tetherto/qvac e2e (3-PR propagation). This front-loads build breaks and unit/fixture regressions to the PR itself. The workflows land against today's paths (parakeet-cpp/, tts-cpp/); the reorg PRs (#94) only touch the path filters.

Validation

  • Local (macOS arm64, ggml @ d7e27ac7): parakeet + tts build clean; tts lane 68/68 pass, parakeet lane green (1 test runnable model-free, parity suites "Not Run" pending staged GGUF fixtures).
  • CI on this PR: parakeet CI green on both OSes first try; tts CI green on macOS, caught the Linux link bug above (fixed here).

Not in this PR (per QIP #94)

  • The reorg itself (PRs 1–3) — awaiting QIP approval
  • port-smoke.yml (needs registry portfiles), whisper build job (upstream build.yml still covers it until PR 2), GGUF fixture hosting for the parity suites

🤖 Generated with Claude Code

… QIP (PR 0)

Nothing in this repo's CI built or tested our engines until now — real
verification happened three repos downstream in tetherto/qvac. This adds
path-filtered workflows that, per PR:

- build qvac-ext-ggml@speech (CPU-only, cached by branch-tip SHA — the
  same fork the ggml-speech vcpkg port ships)
- build each engine + all test harnesses against it as system ggml
- run the non-GPU ctest lanes (`-LE 'gpu|perf'`); model-dependent tests
  auto-DISABLE to "Not Run" per the existing harness design

Validated locally on macOS arm64: tts lane 68/68 pass, parakeet lane
green (1 runnable test model-free; parity suites need staged GGUF
fixtures — follow-up documented in the QIP). GPU lanes are stubbed
behind workflow_dispatch until self-hosted GPU runners exist.

docs/QIP-speech-repo-reorg.md is the reorg proposal this is "PR 0" of
(symmetric engines/ layout, upstream vendored as a minimally-divergent
git subtree under third_party/). The workflows land against today's
paths; the reorg PRs only touch the path filters.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Review Status

Current Status: ❌ PENDING
Approvals so far: none

Pending reviews: Needs 1 Management or Team Lead, and 1 more from Management, Team Lead, or Member.

… QIP to #94

First run of the new tts CI lane caught a real cross-platform bug:
test-campplus and test-campplus-backward-parity compile src/campplus.cpp
(which calls tts_cpp::detail::init_cpu_backend()) without
src/backend_selection.cpp, where that symbol lives. Apple's toolchain
happened to optimize the reference away; GNU ld on Linux fails with an
undefined reference — and Linux-with-tests was never built by any CI
until now. Mirror the source list test-voice-embedding already uses.

Also drop docs/QIP-speech-repo-reorg.md from this branch — the QIP now
has its own approval PR (#94); this PR is CI + fixes only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ogad-tether ogad-tether changed the title ci: per-engine CI lanes for parakeet-cpp and tts-cpp + repo-reorg QIP (PR 0) ci: per-engine CI lanes for parakeet-cpp and tts-cpp (QIP PR 0) Jul 17, 2026
…ads)

On ubuntu the test binaries resolve libqvac-speech-ggml.so via their
build RUNPATH, but RUNPATH is not consulted for that library's own
transitive dependencies (libqvac-speech-ggml-cpu.so.0 et al), so 35 tts
tests failed at exec with "cannot open shared object file". macOS is
unaffected (@rpath resolution walks the executable's rpath stack for
the whole load chain). Point LD_LIBRARY_PATH at the ggml install dir
for the ctest step in both lanes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ogad-tether
ogad-tether marked this pull request as ready for review July 17, 2026 09:12
@ogad-tether
ogad-tether requested review from a team as code owners July 17, 2026 09:12
ogad-tether and others added 2 commits July 17, 2026 10:30
…e engines

engines-cross-ci.yml: engine x platform matrix complementing the
linux/mac lanes —
- windows-2022: MSVC, static system ggml, full build + non-GPU ctest
- android: NDK arm64-v8a compile smoke (no device to run tests on)
- ios: device arm64 compile smoke, Metal embedded (flags mirror
  build-xcframework.sh)

iOS recipe validated locally (ggml + both engines compile clean against
the iphoneos 26.2 SDK). On-device e2e remains downstream in
tetherto/qvac; these lanes front-load cross-compile/link breaks ahead
of the repo-reorg moves (QIP #94).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…amples in cross lanes

The new Windows lane's first run caught 9 test files calling POSIX
setenv/unsetenv, which MSVC's CRT doesn't provide — add
test/test_env_portable.h (same-named _putenv_s shims on _MSC_VER,
plain <cstdlib> elsewhere) and include it where used.

Also -DPARAKEET_BUILD_EXAMPLES=OFF in the windows/android/ios lanes:
the live-mic examples hand GCC-style warning flags to cl.exe and use
mic-capture APIs that don't exist on the iOS device SDK; examples are
dev conveniences, not part of the cross-platform surface.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
test-gguf-stream and test-lavasr-enhancer-ggml consulted only TMPDIR
with a hard "/tmp" fallback — Windows sets TEMP/TMP and has no /tmp, so
both failed on the new Windows lane. Add test_tmpdir() to
test_env_portable.h (TMPDIR -> TEMP -> TMP -> "/tmp") and use it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Comment thread .github/workflows/parakeet-ci.yml Outdated
Comment thread tts-cpp/test/test_env_portable.h Outdated
Comment thread .github/workflows/parakeet-ci.yml
…env shim, GPU flags in gpu stubs

- All ggml provisioning steps now fetch the exact SHA the cache key was
  derived from (git init + fetch --depth 1 <sha> + checkout FETCH_HEAD)
  instead of cloning the branch tip with a swallowed checkout — the tip
  advancing between ls-remote and clone could poison the cache with a
  commit the key never described. Applies to parakeet-ci, tts-ci and
  all three engines-cross-ci jobs.
- test_env_portable.h: the MSVC setenv shim now honors overwrite=0
  (existing variable left untouched, return 0) instead of silently
  diverging from POSIX.
- GPU stub jobs: build ggml with -DGGML_VULKAN=ON (the backend the
  -L gpu suites target; Metal is default-on on Apple hosts) so a
  dispatch run can't falsely pass against a CPU-only ggml; flag set to
  be revisited when the runner fleet exists.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ogad-tether added a commit that referenced this pull request Jul 17, 2026
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ogad-tether
ogad-tether requested a review from GustavoA1604 July 17, 2026 16:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants