Skip to content

QVAC-23454 infra: fold @qvac/inference publish into publish-sdk.yml - #3826

Merged
opaninakuffo merged 3 commits into
mainfrom
feat/fold-inference-into-publish-sdk
Aug 13, 2026
Merged

QVAC-23454 infra: fold @qvac/inference publish into publish-sdk.yml#3826
opaninakuffo merged 3 commits into
mainfrom
feat/fold-inference-into-publish-sdk

Conversation

@opaninakuffo

@opaninakuffo opaninakuffo commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

🎯 What problem does this PR solve?

📝 How does it solve it?

  • Add build-inference, publish-gpr-inference, and publish-npm-inference to publish-sdk.yml (prebuilt dist + NPM_CONFIG_IGNORE_SCRIPTS so prepare/tsc does not re-run at publish).
  • Gate publish-pypi and publish-release (sdk-v*) on inference npm success alongside sdk / bare-sdk.
  • Add create-tag-inference for inference-v* after inference npm publish.
  • Delete .github/workflows/trigger-reusable-lib-inference.yml.
  • Update qv-sdk-lockstep-sync publish references to publish-sdk.yml only; inference commits stay in the sdk changelog scan.

🧪 How was it tested?

  • Reviewed job wiring against the prior inference publish workflow (build → artifact → GPR/npm with ignore-scripts → tag).
  • Confirmed no remaining references to trigger-reusable-lib-inference in-repo on this branch.
  • No live npm/GPR publish dry-run (release-path change).

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.
@opaninakuffo
opaninakuffo requested review from a team as code owners August 13, 2026 10:37
@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Review Status

Current Status: ✅ APPROVED
Approvals so far: Team Lead: 1, Member: 1

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

License compliance — clean

No 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):

  • ./.github/actions/release-merge-guard
  • ./docs/website
  • ./packages/ggml-coload-smoke
  • ./packages/fabric/test/integration
  • ./packages/inference-addon-cpp/mobile
  • ./packages/sdk/e2e
  • ./packages/llm-llamacpp/benchmarks/performance
  • ./packages/llm-llamacpp/benchmarks/server
  • ./packages/vla-ggml/sim/server
  • ./packages/embed-llamacpp/benchmarks/performance
  • ./packages/embed-llamacpp/benchmarks/server
  • ./packages/asr-ggml/benchmarks/server

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Workflow security (shadow mode)

zizmor found 1108 finding(s) in .github/ (highest severity: high). This check is warn-only and does not block the merge.

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
arun-mani-j previously approved these changes Aug 13, 2026
Comment thread .github/workflows/publish-sdk.yml Outdated
Without needing `build`, a version-drift release could still publish
@qvac/inference and create inference-v* while sdk/bare/python stay blocked.
@opaninakuffo
opaninakuffo merged commit 4dd6892 into main Aug 13, 2026
29 checks passed
@opaninakuffo
opaninakuffo deleted the feat/fold-inference-into-publish-sdk branch August 13, 2026 11:45
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>
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.

4 participants