QVAC-23454 infra: fold @qvac/inference publish into publish-sdk.yml - #3826
Merged
Conversation
Ship inference via the SDK release workflow (build + GPR + npm + inference-v* tag), drop the standalone trigger-reusable-lib-inference workflow, and point lockstep skill publish refs at publish-sdk.yml only.
Contributor
Review StatusCurrent Status: ✅ APPROVED |
Contributor
License compliance — cleanNo new dependency license findings in this PR. Warn-only (shadow) mode — this check does not block merges yet. Updated automatically by the canonical license compliance workflow. NOTICE presence (advisory)Missing NOTICE (advisory, does not block):
|
Contributor
Workflow security (shadow mode)zizmor found 1108 finding(s) in Findings are annotated inline on the changed files and listed in the job summary. Reproduce locally: pipx run zizmor==1.27.0 --offline .github/ |
arun-mani-j
previously approved these changes
Aug 13, 2026
Proletter
reviewed
Aug 13, 2026
simon-iribarren
previously approved these changes
Aug 13, 2026
Without needing `build`, a version-drift release could still publish @qvac/inference and create inference-v* while sdk/bare/python stay blocked.
opaninakuffo
dismissed stale reviews from simon-iribarren and arun-mani-j
via
August 13, 2026 11:31
cba3b6e
arun-mani-j
approved these changes
Aug 13, 2026
Proletter
approved these changes
Aug 13, 2026
opaninakuffo
added a commit
that referenced
this pull request
Aug 13, 2026
…re/python) (#3843) * chore: align packages/inference with release-inference-0.17.0 Match the published @qvac/inference@0.17.0 tree before the 0.17.1 lockstep cut. Version stays 0.17.0 until the release bump. * QVAC-22706 doc: make embedded Python examples standalone (#3724) * QVAC-22706 doc: make embedded Python examples standalone - Inline the `print_progress` download printer into the 13 examples the docs embed, mirroring how the TypeScript examples repeat their helpers inline - Drop `packages/sdk-python/examples/_common.py`; nothing imports it now - Copying an embedded block into a fresh workspace previously raised `ModuleNotFoundError: No module named '_common'` — the import only resolved in-repo, where the script's own directory is on `sys.path` - Add check 5 to `docs/website/scripts/test-code-examples.ts`: parse every embedded Python example with Python's `ast` and fail on imports that resolve to a sibling file the docs never show - Add `tests/python-examples-standalone.test.ts` so the check runs in CI, which `test:examples` does not - Read imports off the AST rather than by regex: several examples document their own API with `from tetherto.qvac_sdk import ...` inside a docstring * QVAC-22706 doc: fix missing commas in translate TSDoc example - Add the two missing commas after `to: "es"` in the `translate` @example - Regenerate the API reference so the published example parses - The malformed example shipped to users as a copyable snippet; check 4 of `test:examples` flagged it, but no workflow runs that script * QVAC-22706 test: prove examples standalone by running them isolated - Replace the import-inspection check with a real run: each embedded example is copied alone into a temp dir and executed there, so the examples directory is off `sys.path` and a sibling helper cannot resolve - Stub installed packages inside the child, so the run needs no SDK, no worker and no model download, and a missing third-party package cannot mask a repo-local import further down the file - Execute under a non-`__main__` run name so imports and module-level code run while the entry point does not - Catches what static inspection could not: `importlib.import_module("_common")` and `sys.path`-hack imports, both covered by new tests - Drop `python_module_imports.py`; the isolated run subsumes it * QVAC-22706 test: drop MDX scanning, run every example in the directory - Remove the fence-matching and file= extraction: the contract belongs to the examples directory, not to whichever pages embed a file today - Check every `.py` in `packages/sdk-python/examples`, so a file embedded later is already covered - Drop the regex unit tests that came with the scanning; what remains tests behaviour of the isolated run * QVAC-22706 test: close two gaps in the isolation check Deferred imports: - Running the module only exercises top-level imports; the `__main__` entry point is deliberately not run, so `def main(): from _common import x` passed - Read the IMPORT_NAME operands off the compiled code objects, at any nesting depth, so nesting and control flow cannot hide a sibling import - Deferred imports of installed packages stay legal — vla.py defers numpy Cross-language result contract: - `missing-module` and `syntax-error` are produced only by the python runner and arrive over stdout; the TypeScript side was casting that payload unchecked - Validate it instead, so a renamed kind fails loudly rather than degrading the failure message with nothing going red * QVAC-22706 test: move the standalone guard into the python package Addresses review on #3724. Coverage (opaninakuffo): - docs-website-pr-checks only triggers on `docs/website/**`, so an examples-only PR never ran the guard protecting those very files - Move it to `packages/sdk-python/tests/test_examples_standalone.py`, picked up by the existing `pytest tests/` step in pr-checks-sdk-python, which triggers on `packages/sdk-python/**`. No workflow change needed - One parametrized case per example, so a failure names the file - docs `test:examples` keeps check 5 as a convenience view, calling the same runner — one implementation of the isolation logic Imports of a deleted sibling: - Stubbing everything outside the current sibling list fabricated `_common` when `_common.py` no longer existed, passing a file a reader cannot run - Stub only what pyproject declares, so anything undeclared and unresolvable fails whether or not the file is still on disk except BaseException (code-quality bot): - Narrow to `except Exception` so SystemExit and KeyboardInterrupt propagate Contradictory CheckResult: - checkPythonStandalone returned passed:false with skipped:true; the runner filters skipped out of the tally so it was never observed, but passed:true reads honestly --------- Co-authored-by: Opanin Akuffo <46673050+opaninakuffo@users.noreply.github.com> * QVAC-21810 feat: self-contained per-platform tetherto-qvac-sdk wheels via GitHub release (#3754) * feat: self-contained per-platform tetherto-qvac-sdk wheels via GitHub release - add build-sdk-python-fat-wheels.yml: workflow_dispatch (manual, attach to a chosen release tag) + workflow_call build of the fat per-platform wheels, uploaded to the sdk-v<version> release with `gh release upload --clobber` - wire attach-fat-wheels into publish-sdk.yml after publish-release, so a release-* publish attaches wheels automatically - build_wheel.py: prune addon prebuilds to the target platform (npm packages ship every platform, ~4.5 GB) and drive the wheel tag via hatch_build.py; add --plat-name and a lowered macOS floor default - hatch_build.py: stamp py3-none-<plat> when QVAC_WHEEL_PLAT is set; the thin PyPI build stays pure py3-none-any - README: lead with the turnkey `pip install -f <release>` install and document the upgrade / --force-reinstall behavior - test the _bundle resolver tier - ship darwin-arm64, linux-x64, linux-arm64, win32-x64 (darwin-x64 omitted: no in-repo runtime validation for 4 of 11 addons) * chore: prune addon test fixtures and docs from the bundled wheel - drop test/tests/__tests__/testAssets/fixtures/benchmark/docs/coverage/.github from each bundled addon; the npm packages over-publish them (asr-ggml alone ships a 28 MB test audio .raw) - darwin-arm64 wheel 146 MB -> 102 MB; native prebuilds and each addon's own weights/ are kept, so the worker + inference are unaffected * chore: clearer build_wheel CLI flags (--platform, --out-dir) - rename --plat-name -> --platform and --out -> --out-dir; add help text for --sdk-dir / --out-dir / --platform - update build-sdk-python-fat-wheels.yml matrix key + build step to match * fix: scope build_wheel non-runtime-dir prune to each package root - test/docs/fixtures/coverage/.github were dropped at every directory level, reaching into other packages' runtime internals (zod/src/.../tests, tinyld/dist/benchmark) - now dropped only when a direct child of a package root; .git and nested node_modules stay every-level (structural), prebuild host-prune stays scoped to the root-level prebuilds/ dir - validated against the production closure: root-level test/ dirs still pruned (~49 MB, asr-ggml/decoder-audio/...), nested runtime dirs now kept; wheel still 102 MB and the bundled worker still spawns * chore: address zizmor findings in the fat-wheels workflow - set persist-credentials: false on both checkout steps (the git credential is not needed; release uploads use GH_TOKEN) -- fixes artipacked - pass matrix.platform to the build step via env instead of interpolating it into the run block -- fixes template-injection * test: fat-wheel e2e workflow + install-mode-aware worker resolution - add on-pr-sdk-python-wheel-e2e.yml: build the fat wheel per platform on the self-hosted GPU runners, install it into a CLEAN venv, and run the full real-worker suite against the installed bundle -- proving the shipped artifact (incl. Vulkan/HIP .so backends loading from the pruned bundle). Triggers: workflow_dispatch (run on any branch pre-merge) + test-wheel-e2e PR label. Covers the GPU trio (darwin-arm64, linux-x64, win32-x64); linux-arm64 has no arm64 GPU runner and stays covered by the per-addon integration tests - _worker_env: resolve worker/bare from an installed wheel's _bundle when the imported package carries one, else the sibling @qvac/sdk checkout. No env toggle; an editable/source install has no _bundle, so the dev flow is unchanged - unify the real-worker tests onto _worker_env's WORKER_PATH so the whole suite honors the bundle; keep each file's SDK_DIR for the e2e fixtures it reads - neutralize the ambient bundle in the resolver-tier unit tests (autouse fixture) so they stay install-independent - validated locally: dev and installed-wheel modes both 153 passed (fast leg) * fix: address fat-wheel review comments for win32 bare and backfill Resolve bare.exe in Client() production paths, build fat wheels from github.sha so pre-tooling tags don't die on argparse, add zero-config Client() coverage, and align the e2e gating label name. * chore: black-format test_client.py for sdk-python CI --------- Co-authored-by: opaninakuffo <opaninakuffo@outlook.com> Co-authored-by: Opanin Akuffo <46673050+opaninakuffo@users.noreply.github.com> * QVAC-23454 chore: anchor SDK-pod release tooling on @qvac/inference (#3796) * chore: cover @qvac/inference in the NOTICE generator skill Signed-off-by: Arun Mani J <j.arunmani@proton.me> * chore: include packages/inference in SDK changelog PR scan Signed-off-by: Arun Mani J <j.arunmani@proton.me> * chore: anchor SDK-pod version lockstep on @qvac/inference Signed-off-by: Arun Mani J <j.arunmani@proton.me> * chore: retire the bare-sdk dep-parity check from SDK pod checks Signed-off-by: Arun Mani J <j.arunmani@proton.me> --------- Signed-off-by: Arun Mani J <j.arunmani@proton.me> Co-authored-by: Opanin Akuffo <46673050+opaninakuffo@users.noreply.github.com> * QVAC-23454 infra: fold @qvac/inference publish into publish-sdk.yml (#3826) * infra: fold @qvac/inference publish into publish-sdk.yml Ship inference via the SDK release workflow (build + GPR + npm + inference-v* tag), drop the standalone trigger-reusable-lib-inference workflow, and point lockstep skill publish refs at publish-sdk.yml only. * fix: gate build-inference on lockstep build job Without needing `build`, a version-drift release could still publish @qvac/inference and create inference-v* while sdk/bare/python stay blocked. * chore: release @qvac/sdk 0.17.1 (lockstep inference/sdk/bare/python) Bump the inference anchor and lockstep clients to 0.17.1, refresh NOTICEs, and ship sdk changelog + docs release notes for the patch cut. * fix: Windows fat-wheel build + bare-rpc destroy teardown (#3832) Resolve npm via shutil.which for win32 fat wheels, and schedule OutgoingStream.destroy on the RPC task set so peer STREAM DESTROY actually closes the stream. * doc: note #3832 in sdk 0.17.1 changelog and release notes Record the Windows fat-wheel and bare-rpc destroy fixes in the raw changelog, CHANGELOG_LLM, root aggregate, and docs release notes. --------- Signed-off-by: Arun Mani J <j.arunmani@proton.me> Co-authored-by: Lauri Piisang <lauri.piisang@gmail.com> Co-authored-by: Arun Mani J <49952138+arun-mani-j@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🎯 What problem does this PR solve?
@qvac/inferencestill published from a standalone workflow, so arelease-sdk-*cut did not reliably ship the engine with sdk / bare-sdk / python despite version lockstep (QVAC-23454 chore: anchor SDK-pod release tooling on @qvac/inference #3796).📝 How does it solve it?
build-inference,publish-gpr-inference, andpublish-npm-inferencetopublish-sdk.yml(prebuilt dist +NPM_CONFIG_IGNORE_SCRIPTSsoprepare/tscdoes not re-run at publish).publish-pypiandpublish-release(sdk-v*) on inference npm success alongside sdk / bare-sdk.create-tag-inferenceforinference-v*after inference npm publish..github/workflows/trigger-reusable-lib-inference.yml.qv-sdk-lockstep-syncpublish references topublish-sdk.ymlonly; inference commits stay in the sdk changelog scan.🧪 How was it tested?
trigger-reusable-lib-inferencein-repo on this branch.