diff --git a/.github/workflows/publish-first-cohort.yml b/.github/workflows/publish-first-cohort.yml index 9c267fd..53e462d 100644 --- a/.github/workflows/publish-first-cohort.yml +++ b/.github/workflows/publish-first-cohort.yml @@ -8,11 +8,7 @@ on: required: true type: choice options: - - v0.3.3 - npm_direct_token_published: - description: The exact authorized npm archive has been published with an operator-controlled token - required: true - type: boolean + - v0.3.4 confirm: description: I have reviewed the release evidence, package scope, and release notes required: true @@ -21,7 +17,7 @@ on: permissions: {} concurrency: - group: publish-package-release-v0.3.3 + group: publish-package-release-v0.3.4 cancel-in-progress: false jobs: @@ -43,15 +39,13 @@ jobs: id: authority env: CONFIRM: ${{ inputs.confirm }} - NPM_DIRECT_TOKEN_PUBLISHED: ${{ inputs.npm_direct_token_published }} GITHUB_TOKEN: ${{ github.token }} RELEASE_TAG: ${{ inputs.release_tag }} run: | set -euo pipefail test "$GITHUB_REF" = "refs/heads/main" test "$CONFIRM" = "true" - test "$NPM_DIRECT_TOKEN_PUBLISHED" = "true" - test "$RELEASE_TAG" = "v0.3.3" + test "$RELEASE_TAG" = "v0.3.4" git fetch --force --tags origin test "$(git cat-file -t "refs/tags/${RELEASE_TAG}")" = "tag" source_sha="$(git rev-parse "${RELEASE_TAG}^{commit}")" @@ -93,19 +87,13 @@ jobs: with: python-version: "3.12" - - name: Set up Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version: "22.14.0" - package-manager-cache: false - - name: Build and verify only the authorized distributions run: | set -euo pipefail python -m pip install --disable-pip-version-check build==1.3.0 python3 scripts/verify-publication-cohort.py scripts/verify-dotnet-lockfiles.sh - mkdir -p artifacts/publish/nuget artifacts/publish/pypi artifacts/publish/npm + mkdir -p artifacts/publish/nuget artifacts/publish/pypi for project in \ src/Vyral.Abstractions/Vyral.Abstractions.csproj \ src/Vyral.Local/Vyral.Local.csproj; do @@ -114,27 +102,18 @@ jobs: done python -m build --outdir artifacts/publish/pypi runtimes/python for package in \ - Vyral.Abstractions.0.3.3 \ - Vyral.Local.0.3.3; do + Vyral.Abstractions.0.3.4 \ + Vyral.Local.0.3.4; do test -s "artifacts/publish/nuget/${package}.nupkg" test -s "artifacts/publish/nuget/${package}.snupkg" done test -s artifacts/publish/pypi/vyral-0.1.4-py3-none-any.whl test -s artifacts/publish/pypi/vyral-0.1.4.tar.gz - npm ci --ignore-scripts --prefix clients/javascript - ( - cd clients/javascript - npm run check - npm run typecheck - npm test - npm pack --json --pack-destination ../../artifacts/publish/npm - ) - test -s artifacts/publish/npm/vyral-client-0.3.3.tgz - name: Retain immutable publication distributions uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: package-release-v0.3.3 + name: package-release-v0.3.4 path: artifacts/publish if-no-files-found: error retention-days: 30 @@ -157,7 +136,7 @@ jobs: - name: Download the authorized distributions uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: package-release-v0.3.3 + name: package-release-v0.3.4 path: dist - name: Exchange the GitHub OIDC token for a short-lived NuGet key @@ -172,8 +151,8 @@ jobs: run: | set -euo pipefail for package in \ - Vyral.Abstractions.0.3.3 \ - Vyral.Local.0.3.3; do + Vyral.Abstractions.0.3.4 \ + Vyral.Local.0.3.4; do dotnet nuget push "dist/nuget/${package}.nupkg" \ --api-key "$NUGET_API_KEY" \ --skip-duplicate \ @@ -197,7 +176,7 @@ jobs: - name: Download the authorized distributions uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: - name: package-release-v0.3.3 + name: package-release-v0.3.4 path: dist - name: Publish the Python runtime with its PyPI attestation @@ -206,42 +185,11 @@ jobs: packages-dir: dist/pypi skip-existing: true - publish-npm: - name: Verify authorized direct-token JavaScript SDK - needs: build - runs-on: ubuntu-22.04 - environment: - name: publish-npm - url: https://www.npmjs.com/package/vyral-client - permissions: - contents: read - steps: - - name: Set up Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version: "22.14.0" - package-manager-cache: false - - - name: Download the authorized distribution - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - with: - name: package-release-v0.3.3 - path: dist - - - name: Verify the exact authorized registry archive - run: | - set -euo pipefail - expected_integrity="sha512-$(openssl dgst -sha512 -binary dist/npm/vyral-client-0.3.3.tgz | base64 -w 0)" - test "$(npm view vyral-client@0.3.3 version)" = "0.3.3" - test "$(npm view vyral-client@0.3.3 repository.url)" = "git+https://github.com/univeracity/vyral.git" - test "$(npm view vyral-client@0.3.3 dist.integrity)" = "$expected_integrity" - verify: name: Verify public package availability needs: - publish-nuget - publish-pypi - - publish-npm runs-on: ubuntu-22.04 permissions: {} steps: @@ -252,9 +200,8 @@ jobs: nuget_abstractions="$(curl --fail --silent --show-error https://api.nuget.org/v3-flatcontainer/vyral.abstractions/index.json | jq -r '.versions[-1]')" || true nuget_local="$(curl --fail --silent --show-error https://api.nuget.org/v3-flatcontainer/vyral.local/index.json | jq -r '.versions[-1]')" || true pypi="$(curl --fail --silent --show-error https://pypi.org/pypi/vyral/json | jq -r '.info.version')" || true - npm_version="$(curl --fail --silent --show-error https://registry.npmjs.org/vyral-client/0.3.3 | jq -r '.version')" || true - if [[ "$nuget_abstractions" == "0.3.3" && "$nuget_local" == "0.3.3" && "$pypi" == "0.1.4" && "$npm_version" == "0.3.3" ]]; then - printf 'NuGet, PyPI and npm expose every authorized package version.\n' >> "$GITHUB_STEP_SUMMARY" + if [[ "$nuget_abstractions" == "0.3.4" && "$nuget_local" == "0.3.4" && "$pypi" == "0.1.4" ]]; then + printf 'NuGet and PyPI expose every authorized package version.\n' >> "$GITHUB_STEP_SUMMARY" exit 0 fi sleep 15 diff --git a/.github/workflows/python-runtime-qualification.yml b/.github/workflows/python-runtime-qualification.yml index 14f8ea3..fa910ef 100644 --- a/.github/workflows/python-runtime-qualification.yml +++ b/.github/workflows/python-runtime-qualification.yml @@ -168,7 +168,7 @@ jobs: raise SystemExit("The baseline runtime wheel SHA-256 is invalid.") name = Path(urlsplit(url).path).name if not re.fullmatch( - r"vyral_runtime-0\.1\.\d+-py3-none-any\.whl", + r"vyral(?:_runtime)?-0\.1\.\d+-py3-none-any\.whl", name, ): raise SystemExit( diff --git a/PUBLIC-EXPORT-MANIFEST.json b/PUBLIC-EXPORT-MANIFEST.json index 46babcf..b931385 100644 --- a/PUBLIC-EXPORT-MANIFEST.json +++ b/PUBLIC-EXPORT-MANIFEST.json @@ -114,7 +114,7 @@ { "mode": "644", "path": ".github/workflows/publish-first-cohort.yml", - "sha256": "3d0b82e48587d1852535fa5ee59c345f33f079fd51cb49c2bc71f7f8842822f1" + "sha256": "96f648f19ff95c11f5fc776bf05e85a88cf0f51b7479efa6b3790b649af7bb10" }, { "mode": "644", @@ -124,7 +124,7 @@ { "mode": "644", "path": ".github/workflows/python-runtime-qualification.yml", - "sha256": "5cbad16456871bb1c7fd0b92c5b9dae052335db39dd924b2a83bff85547e3579" + "sha256": "97b9a47c5cd4c890dcee76f7ad8369f58a6180c1fb6432b457dc997cd64d8191" }, { "mode": "644", @@ -174,7 +174,7 @@ { "mode": "644", "path": "README.md", - "sha256": "270554dc28bfc9e342495ec1148cd47f164291e6301718c8d035b434fa084593" + "sha256": "15937d55c2f41b331d646a432695a5b2e041a2edfeb5465380106775b14b7c28" }, { "mode": "644", @@ -259,12 +259,12 @@ { "mode": "644", "path": "clients/javascript/package-lock.json", - "sha256": "e0c342a0eeb730f5b0e338d4111920996bce92ca29f4892ea1295763057eb655" + "sha256": "05039b9131ad02b306d1daf1e9e5b4a43e9fbb29fd197d7399a2c53ea6d1d2e5" }, { "mode": "644", "path": "clients/javascript/package.json", - "sha256": "95a9988cc0dcaa0b08a8fda027a1b6173784fa98c177e2df437e0ada25e12e34" + "sha256": "fb9f67cba1498e9e99ac3d73c578f94ca48c14be126b1ca0aa02941f4cbf52ec" }, { "mode": "644", @@ -309,7 +309,7 @@ { "mode": "644", "path": "clients/python/pyproject.toml", - "sha256": "b85eca66154374e377f75b81ffcd85b97a4bb95f32a3a0529d6013fa995110e9" + "sha256": "7d7b1c50dce4da05a5601be877cf83f707bcc326f9e7843227a5668170d06df2" }, { "mode": "644", @@ -729,7 +729,7 @@ { "mode": "644", "path": "docs/maintainers/releasing.md", - "sha256": "d970da0ccd58caa70e64bab318dc74eb38bfb81a4547d91764cc85aa0be1a5e1" + "sha256": "604627749a92508692752d19add022f15328b9d507bc23012e9974d0ddeb4334" }, { "mode": "644", @@ -754,7 +754,7 @@ { "mode": "644", "path": "docs/reference/stability.md", - "sha256": "fff9123d0ad7e4cfd3e752b305e110649dcb8a8ce6144513d5d7021e180421cb" + "sha256": "f41793ef2e8b047ebded6b1ce81b532c8cebaf8ef39ef0a6278c7420082ada2f" }, { "mode": "644", @@ -834,7 +834,7 @@ { "mode": "644", "path": "packaging/publication-cohort.json", - "sha256": "ec434a615ff3cc70f447a320047cc7c119c634e9d7813b81860029d3b31ab455" + "sha256": "27a8198800d2a7289d680f4e9282b66a2bdfc83293457820c8851083e9773aba" }, { "mode": "644", @@ -1604,7 +1604,7 @@ { "mode": "644", "path": "samples/Vyral.CanonicalProjectionStarter/packages.lock.json", - "sha256": "0de9918c0125459a3a119222054d0ca3974d3e96d3af5a3c1bba9d711fd6996b" + "sha256": "750487da7fed82678ff22d63b2219b129f535c39e40520ffd520b450237c4302" }, { "mode": "644", @@ -1639,7 +1639,7 @@ { "mode": "644", "path": "samples/Vyral.Execution.AzureDurableFunctionsSmoke/packages.lock.json", - "sha256": "89b80ebbc7c37274b3a0bcbb9bd966d22d9d70eac15a1a3896988e59ec17cf63" + "sha256": "38fce665fc790efb8238eedd889c06ceee0e8a4d4dbb6fb090858771007997b6" }, { "mode": "644", @@ -1709,7 +1709,7 @@ { "mode": "644", "path": "samples/Vyral.Execution.TemporalSample/packages.lock.json", - "sha256": "11579f6112e2fcf91fe345189e58800eab59bc0dbba88ffd52e4b32ad59bd766" + "sha256": "3f364c42efe1fc0d451939498457e9e7236159ab6375aa7f2f0ca20e7defb6fa" }, { "mode": "644", @@ -2164,12 +2164,12 @@ { "mode": "755", "path": "scripts/verify-publication-cohort.py", - "sha256": "4aeb37ec008dfbddd887fb93f6fd64676bb16d16762e5bed1baf112bf653e944" + "sha256": "0cbfd0f03aa4df1bc42d01b6349fb13b26a52c42d12e53d9a7e969c4628099de" }, { "mode": "644", "path": "scripts/verify-publication-policy.py", - "sha256": "b58746ac44ed16bde9dfa829126a686fa05d4b1b0f1a478b715d9360cf9275a9" + "sha256": "f4817f5e111991d21bb142d0ab6679fcd700cd8f2b09eb740197a7b5df5b4513" }, { "mode": "755", @@ -2224,7 +2224,7 @@ { "mode": "644", "path": "scripts/verify-python-runtime-upgrade.py", - "sha256": "d94319490309a9a57a6fe62071f9fd98b650d4b7bd04a54a46730ff2c88e035c" + "sha256": "6498a6cfbeed6db9f422557cd9e287001ed17fe60521ef0a999264691c7fd9a1" }, { "mode": "755", @@ -2239,7 +2239,7 @@ { "mode": "755", "path": "scripts/verify-release-artifacts.sh", - "sha256": "d4c2b6105fed7b7965329918fea60758ef01b009ec6e57150efe44376f218103" + "sha256": "60b5b1eafa90d178f84111a1e7ad3a99531968a51b84e9d604c22a958ccea30b" }, { "mode": "644", @@ -2264,7 +2264,7 @@ { "mode": "755", "path": "scripts/verify-version-policy.py", - "sha256": "3a6fb1faf93cea4882ef71508a34f9c2042dff962821b28e13ea5b43a76aa778" + "sha256": "c0682f3d0e4b19d20377a888df11bfdad5937394380ce2b788b47c974f6a216d" }, { "mode": "755", @@ -2554,7 +2554,7 @@ { "mode": "644", "path": "src/Vyral.Abstractions/Vyral.Abstractions.csproj", - "sha256": "f9f7beda646381d714898cb9bc5388f05fe0e18275dba109809f509cad520373" + "sha256": "8cc6feabcab216b0626e47b80e5331b5d45d220792525d5c23932c49e6f4cd31" }, { "mode": "644", @@ -2714,7 +2714,7 @@ { "mode": "644", "path": "src/Vyral.Cli/packages.lock.json", - "sha256": "65dafecc24fc8c7ffb5989265210c35eaa4eb5a1b85ad4882ca7e04442a0b57a" + "sha256": "f90b80add36b2a6803ab812834b41bfd097a650d5ecc1e11d8b6ad1ab848bc1c" }, { "mode": "644", @@ -2764,7 +2764,7 @@ { "mode": "644", "path": "src/Vyral.Cloudflare/packages.lock.json", - "sha256": "b9b30c19c85c5b9af6a6372828c214a3fbeacd9d342aa9275f9598d74bfe5910" + "sha256": "d3ef4266bca97e74ba9972cb00f0b602fbe735dcb847b38e82faa4a481ae726d" }, { "mode": "644", @@ -3329,7 +3329,7 @@ { "mode": "644", "path": "src/Vyral.Google/packages.lock.json", - "sha256": "1b9239158dbe7ff2dc35aa5f2d3b3884d267b003853e7d3a7054c547ddca5296" + "sha256": "a8724d08d7d107324dff8ff95267c3e7ce0589985895be3287f3ccc51194d2c9" }, { "mode": "644", @@ -3349,7 +3349,7 @@ { "mode": "644", "path": "src/Vyral.HostedWorker/packages.lock.json", - "sha256": "d0c04f2baff0d8448b615e5a2f5c16bc19999e709138523a7cdb7254700f0134" + "sha256": "5de970712d4f9751d18e3f8a054b329362a1b6c8dda2032bc827dd4c06efd5a2" }, { "mode": "644", @@ -3464,7 +3464,7 @@ { "mode": "644", "path": "src/Vyral.Local/Vyral.Local.csproj", - "sha256": "8381e0f887d543463148b5502d399b9f4f67d3c4d4c3ef37a17bb254f210f35b" + "sha256": "b5a8e736e3732c90ae0d930f776c4da648056bafea9b187187fd6c22fb08cdb0" }, { "mode": "644", @@ -4044,7 +4044,7 @@ { "mode": "644", "path": "src/Vyral.Providers.Onnx/packages.lock.json", - "sha256": "e929b05bd085f19b15cb719d01512860733ffc8bfaf4cf4a5a18db8c597e314a" + "sha256": "748b17cf0a379a8f9a8fccffff1bfcff9f34726b5035cd74a8b9eb2d7b05de1a" }, { "mode": "644", @@ -4254,7 +4254,7 @@ { "mode": "644", "path": "src/Vyral.Server/packages.lock.json", - "sha256": "8e9a83ed6e9d14eb3f03dc466eebbef0867c463c5fb69c08c5f481910b04a260" + "sha256": "bad78edcf185846bd0cc275172278076bc90ced95bbb177065e8bfce84c23fa9" }, { "mode": "644", @@ -4319,7 +4319,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Aws/packages.lock.json", - "sha256": "dcb9bad152221a90dbbc4ac1b06c9b29e947dc4d51384451549f57ee167d22a6" + "sha256": "b1a825ff0cb73205e5b1e2384b36922161a5faf491d8cde027c2b585c7f0737f" }, { "mode": "644", @@ -4399,7 +4399,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Azure/packages.lock.json", - "sha256": "996fcafd9596308ff3756ada90627300703f4b67054dfe63dc6b580472eb0e36" + "sha256": "5ad1e738ae54f4a9c41c8219862289696f7c9dafbf324fffb0f3c3289590973b" }, { "mode": "644", @@ -4429,7 +4429,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Cloudflare/packages.lock.json", - "sha256": "2b613f0af07a5b2744968fb8cd198c98de1dfa28fe2ba2102a1e5c837d62708b" + "sha256": "02f5a2c4a9ee3a5a3f03b0cb745ff060725c09875596a523831c65da4cc4b7ac" }, { "mode": "644", @@ -4589,7 +4589,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Conformance/packages.lock.json", - "sha256": "cfc04e02df1ad6a2912d7500b26638b295432f9d9f054edac9f1d059fbe7a54a" + "sha256": "13a910d6371d12af1a4041708bc927d876cf127ae8648ce8ec62a40f3ef54b2a" }, { "mode": "644", @@ -4669,7 +4669,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Google/packages.lock.json", - "sha256": "db8d4fef9b392b2a941b51da6984e2e12c9e9ad7d2b1e42464a2f75bcdf015cf" + "sha256": "2d9364a2f0c8f9ad4bf2c637dcbd3197c1a04cf495ca3e99f7557258dd3a4205" }, { "mode": "644", @@ -4869,7 +4869,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Local/packages.lock.json", - "sha256": "e5ee91e72d3b77a2aeacbead62f3ca00b2e4353e34faeea79a89660a8b554f3c" + "sha256": "841c590d44cc66b27820f94f09507ae5eebabf2671f36e5e71df72a947130e25" }, { "mode": "644", @@ -4899,7 +4899,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.MySql/packages.lock.json", - "sha256": "2d70be425f8a43a1268581b23e95a17fad00ebd83172d67edbde89864b348f6d" + "sha256": "ba07c7708464f1b174ac9882ccd4c6a1e310b2537b0dedd22a6ea70f8971ceb9" }, { "mode": "644", @@ -4934,7 +4934,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Pgvector/packages.lock.json", - "sha256": "74e7bb9e91f6001c221b2f3c5396585fbf202dd5223e9cb0224e5621a4faf5bb" + "sha256": "0222065da0c28527f45c0b98e7d410a45aa1c4e98e2eb5718f73c5333551fcc6" }, { "mode": "644", @@ -5034,7 +5034,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Providers/packages.lock.json", - "sha256": "82b4c0315a224a321a7debcee45157465161cf7ccfc7c2a558ed06590c406bf6" + "sha256": "36a0abbf79bc906bdc586dff9d4ce9ef825dbd2bc46b3a01a5734b0152120e54" }, { "mode": "644", @@ -5049,7 +5049,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Temporal.WorkerHost/packages.lock.json", - "sha256": "11579f6112e2fcf91fe345189e58800eab59bc0dbba88ffd52e4b32ad59bd766" + "sha256": "3f364c42efe1fc0d451939498457e9e7236159ab6375aa7f2f0ca20e7defb6fa" }, { "mode": "644", @@ -5124,7 +5124,7 @@ { "mode": "644", "path": "tests/Vyral.Tests.Temporal/packages.lock.json", - "sha256": "86d0d3855dad81e22233671748575c6d88e8c34f9c77e94795b3d4d7e8008bd0" + "sha256": "9c6cb1f1da3d9ffaf4f24a67d17f97681e65824a50f81d202352a060e49f20b1" }, { "mode": "644", @@ -5139,7 +5139,7 @@ { "mode": "644", "path": "tools/Vyral.Benchmarks/packages.lock.json", - "sha256": "7c9ed0553dacca75646869fceb49b603d0f7c74674bac97890aee84445d27e93" + "sha256": "12b0dd4b74502234da84bd86f1fe2bec60da0c1d9d8630924bb9f302e9fecd3d" }, { "mode": "644", @@ -5164,7 +5164,7 @@ { "mode": "644", "path": "tools/Vyral.CanonicalStore.Benchmarks/packages.lock.json", - "sha256": "5ed195bff50dd7520bc1e63b810f63abeb1c12eb035e965727cf0847bf855149" + "sha256": "20d6c6a132473d6d039b55e88558889dbe6c85f8a545e2fe5cf0bfa90fc68273" }, { "mode": "644", @@ -5184,7 +5184,7 @@ { "mode": "644", "path": "tools/Vyral.OnnxJudgeCalibration/packages.lock.json", - "sha256": "24bd8e724d5ce0d756fac5cda6f964c0fa0fbbcb0ee89bbb2d35b90f1e366fd8" + "sha256": "242a0970d354c9c2f04779f97ec8b43fdf7cca67a0f7d7c9892cb6a6bc2afcb0" }, { "mode": "644", @@ -5209,5 +5209,5 @@ ], "schemaVersion": 1, "sourceDirty": false, - "treeSha256": "c8ac050a3906e5d2d1a72f0e6d22b7816cae16b696bc2b89ef2de0fb092c67a6" + "treeSha256": "eb4ace52b475676ddf43e8d56c8faf6ba130e64926eb4b87ad8289f95a436096" } diff --git a/README.md b/README.md index 6d9bf37..c3f9810 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@
-
+
@@ -204,9 +204,10 @@ also need TLS, rate limits, authenticated ingress, and deployment-specific
identity policy. See the [CanonicalStore guide](docs/concepts/canonical-store.md)
and the [deployment guide](deploy).
-The general package release is `v0.3.3` (core NuGet and JavaScript SDK `0.3.3`,
-prototype Python runtime `0.1.4`). It advances independently of the server container.
-The lightweight Python HTTP SDK is available as a release archive, not a PyPI publication.
+The general package release is `v0.3.4` (core NuGet `0.3.4`, prototype Python
+runtime `0.1.4`, and HTTP SDK archives `0.3.4`). It advances independently of the server container.
+The HTTP SDKs are available as release archives. JavaScript npm publication is deferred;
+the lightweight Python HTTP SDK remains outside PyPI publication.
The server image version described by this source is `ghcr.io/univeracity/vyral-server:0.3.6`;
verify registry availability before deploying, pin its published digest, and use the same API-key
diff --git a/clients/javascript/package-lock.json b/clients/javascript/package-lock.json
index 92d42de..e03d6cc 100644
--- a/clients/javascript/package-lock.json
+++ b/clients/javascript/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "vyral-client",
- "version": "0.3.3",
+ "version": "0.3.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "vyral-client",
- "version": "0.3.3",
+ "version": "0.3.4",
"license": "Apache-2.0",
"devDependencies": {
"typescript": "7.0.2"
diff --git a/clients/javascript/package.json b/clients/javascript/package.json
index 0f1937a..145ece9 100644
--- a/clients/javascript/package.json
+++ b/clients/javascript/package.json
@@ -1,6 +1,6 @@
{
"name": "vyral-client",
- "version": "0.3.3",
+ "version": "0.3.4",
"description": "JavaScript HTTP client for the Vyral local server",
"type": "module",
"main": "./src/index.js",
diff --git a/clients/python/pyproject.toml b/clients/python/pyproject.toml
index db3acb9..38b690c 100644
--- a/clients/python/pyproject.toml
+++ b/clients/python/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "vyral-client"
-version = "0.3.3"
+version = "0.3.4"
description = "Python HTTP client for the Vyral local server"
requires-python = ">=3.10"
readme = "README.md"
diff --git a/docs/maintainers/releasing.md b/docs/maintainers/releasing.md
index 6a7290e..e8db3f1 100644
--- a/docs/maintainers/releasing.md
+++ b/docs/maintainers/releasing.md
@@ -42,15 +42,15 @@ retained as release evidence.
rejects callbacks that lack the dispatch marker or an accepted callback identity.
4. Publish packages through a trusted-publishing or OIDC-backed registry configuration. Do not
place registry tokens in the repository or workflow files. `vyral-client@0.3.0` historically had an
- explicitly authorized, capability-scoped exception: after the release tag and canonical evidence
- exist, publish the exact packed archive from the authorized commit with a locally controlled npm
- token. Dispatch the protected publisher with `npm_direct_token_published: true`; it verifies the
- registry version, repository URL, and SHA-512 archive integrity against its independently built
- distribution. This exception does not claim npm OIDC provenance or a trusted-publisher
- relationship. The operator renewed this exact-archive exception for
- `vyral-client@0.3.3`; use the same local-token publication and protected integrity
- verification boundary. Other npm versions require new explicit authorization or
- an account configuration that permits npm trusted publishing. Do not place the token in GitHub, the repository, or a
+ explicitly authorized, capability-scoped exception. Its exact archive was published with a
+ locally controlled token after the release tag and canonical checks existed; the protected
+ workflow verified registry metadata and SHA-512 integrity against its independently built
+ distribution. That historical exception does not claim npm OIDC provenance or a trusted-publisher
+ relationship. The npm registry update for this release is deferred until
+ trusted-publisher setup is available. An updated JavaScript SDK archive can
+ still be attached to the GitHub release. Other direct-token npm versions require
+ a new explicit authorization; future trusted publishing requires the matching
+ registry configuration. Do not place the token in GitHub, the repository, or a
workflow file.
5. Attach provenance/attestations and SBOMs to the published release; publish container images with
build provenance and SBOM attestations enabled.
@@ -100,13 +100,14 @@ The exact currently authorized package cohort is recorded in
The manual [`Publish package release`](../../.github/workflows/publish-first-cohort.yml)
workflow is the only source path allowed to publish that cohort. Its filename is retained because
NuGet and PyPI trusted-publisher identities include the workflow filename. It accepts only the
-reviewed `v0.3.3` package patch, and before packaging requires a GitHub-verified signed
+reviewed `v0.3.4` package patch, and before packaging requires a GitHub-verified signed
annotated tag at current `main` plus a successful canonical Release Integrity
push run for that commit. Each registry job uses its own protected environment
and least-privilege identity. It has no automatic trigger. The patch publishes
-`Vyral.Abstractions` and `Vyral.Local` `0.3.3`, the Python runtime `0.1.4`,
-and the JavaScript HTTP SDK `vyral-client@0.3.3`. Execution registry packages
-remain unchanged. The lightweight Python HTTP SDK source is versioned `0.3.3`
+`Vyral.Abstractions` and `Vyral.Local` `0.3.4` and the Python runtime `0.1.4`.
+Updated HTTP SDK archives are attached to the GitHub release. The JavaScript
+SDK source is `vyral-client@0.3.4`; npm registry publication is deferred. Execution registry packages
+remain unchanged. The lightweight Python HTTP SDK source is versioned `0.3.4`
and packaged for GitHub release use; its PyPI distribution remains outside the cohort.
The server's `0.3.1` security correction is a deliberately separate,
@@ -137,12 +138,11 @@ manifest at each trusted registry: `Univeracity/vyral`, workflow file
GitHub Actions OIDC trusted publishing; NuGet additionally needs the
`NUGET_USERNAME` environment variable for its short-lived-key exchange. The separate
container workflow uses only the repository-scoped `GITHUB_TOKEN` with
-`packages: write`. npm uses the explicitly renewed operator-token exception
-for `vyral-client@0.3.3`: publish only the exact authorized archive after the signed
-tag and canonical checks exist, then dispatch with `npm_direct_token_published: true`.
-The protected npm environment verifies its version, repository URL and SHA-512
-integrity against an independently built archive. No npm token is placed in GitHub
-and no npm OIDC provenance is claimed.
+`packages: write`. npm remains outside this registry patch. Before its deferred
+publication, configure a trusted publisher for `vyral-client` using
+`Univeracity/vyral`, workflow filename `publish-first-cohort.yml`, environment
+`publish-npm`, and direct publishing permission. This tuple is a setup requirement,
+not a claim that npm currently accepts this repository as a publisher.
This source authorization is not a claim that any package is
already available: absent registry trust or an environment approval, the manual
job fails closed and publishes nothing.
diff --git a/docs/reference/stability.md b/docs/reference/stability.md
index 64a73f8..c34bc91 100644
--- a/docs/reference/stability.md
+++ b/docs/reference/stability.md
@@ -49,8 +49,9 @@ that was produced for 0.2. A future execution minor release must regenerate its
qualification evidence and update all related package and descriptor versions
together.
-The general GitHub package release is `v0.3.3`: core NuGet and HTTP SDK packages
-use `0.3.3`, and the prototype Python runtime uses `0.1.4`. The server container
+The general GitHub package release is `v0.3.4`: core NuGet and HTTP SDK packages
+use `0.3.4`, and the prototype Python runtime uses `0.1.4`. The HTTP SDKs
+are attached as archives; npm registry delivery is deferred. The server container
remains the separately tagged `server-v0.3.6` release. Contract catalog versions
remain `0.3.0` within this compatible patch; execution evidence remains on `0.2.0`.
diff --git a/packaging/publication-cohort.json b/packaging/publication-cohort.json
index d0f4ead..59c9696 100644
--- a/packaging/publication-cohort.json
+++ b/packaging/publication-cohort.json
@@ -5,7 +5,7 @@
{
"ecosystem": "nuget",
"name": "Vyral.Abstractions",
- "version": "0.3.3",
+ "version": "0.3.4",
"source": "src/Vyral.Abstractions/Vyral.Abstractions.csproj",
"environment": "publish-nuget",
"maturity": "public"
@@ -13,7 +13,7 @@
{
"ecosystem": "nuget",
"name": "Vyral.Local",
- "version": "0.3.3",
+ "version": "0.3.4",
"source": "src/Vyral.Local/Vyral.Local.csproj",
"environment": "publish-nuget",
"maturity": "public"
@@ -25,20 +25,13 @@
"source": "runtimes/python/pyproject.toml",
"environment": "publish-pypi",
"maturity": "prototype"
- },
- {
- "ecosystem": "npm",
- "name": "vyral-client",
- "version": "0.3.3",
- "source": "clients/javascript/package.json",
- "environment": "publish-npm",
- "maturity": "public"
}
],
"unchangedArtifacts": [
"Vyral.Primitives 0.2.0",
"Vyral.Execution 0.2.0",
- "Vyral.Execution.Local 0.2.0"
+ "Vyral.Execution.Local 0.2.0",
+ "npm vyral-client 0.3.0"
],
"excludedFromRelease": [
"cloud-provider packages",
@@ -46,16 +39,17 @@
"Temporal packages",
"Python HTTP client distribution (vyral-client)",
"prototype integrations",
- "server container"
+ "server container",
+ "npm registry distribution (vyral-client)"
],
"authorization": {
"mode": "manual-protected-environment",
- "releaseTag": "v0.3.3",
+ "releaseTag": "v0.3.4",
"workflow": ".github/workflows/publish-first-cohort.yml",
"requirements": [
"a GitHub-verified signed annotated release tag that resolves to current main",
"a successful canonical Release Integrity push run for that exact commit",
- "the exact NuGet and PyPI registry trusted-publisher relationships and verified direct-token npm archive",
+ "the exact NuGet and PyPI registry trusted-publisher relationships",
"a manual dispatch from main through the named protected environments"
],
"publishers": [
@@ -72,15 +66,8 @@
"workflowFile": "publish-first-cohort.yml",
"environment": "publish-pypi",
"authentication": "GitHub Actions OIDC trusted publishing"
- },
- {
- "ecosystem": "npm",
- "registry": "https://registry.npmjs.org",
- "workflowFile": "publish-first-cohort.yml",
- "environment": "publish-npm",
- "authentication": "operator-controlled npm token; exact archive verified by protected workflow"
}
]
},
- "authorizationBoundary": "This reviewed authorization permits only the listed package patch through the named manual workflow. It excludes unchanged execution packages, the Python HTTP client registry distribution, provider packages, and container publication. The npm 0.3.3 archive has an explicitly authorized operator-token exception; no npm token is stored in GitHub, source or workflow files, and no npm OIDC provenance is claimed."
+ "authorizationBoundary": "This reviewed authorization permits only the listed package patch through the named manual workflow. It excludes unchanged execution packages, npm registry publication, the Python HTTP client registry distribution, provider packages, and container publication. Updated HTTP SDK archives may be attached to the GitHub release; npm trusted-publisher setup and registry delivery are deferred."
}
diff --git a/samples/Vyral.CanonicalProjectionStarter/packages.lock.json b/samples/Vyral.CanonicalProjectionStarter/packages.lock.json
index 1bcd333..e86ec70 100644
--- a/samples/Vyral.CanonicalProjectionStarter/packages.lock.json
+++ b/samples/Vyral.CanonicalProjectionStarter/packages.lock.json
@@ -74,7 +74,7 @@
"SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )",
"SQLitePCLRaw.core": "[3.0.5, )",
"System.Numerics.Tensors": "[10.0.11, )",
- "Vyral.Abstractions": "[0.3.3, )"
+ "Vyral.Abstractions": "[0.3.4, )"
}
},
"vyral.primitives": {
diff --git a/samples/Vyral.Execution.AzureDurableFunctionsSmoke/packages.lock.json b/samples/Vyral.Execution.AzureDurableFunctionsSmoke/packages.lock.json
index 35e14a6..2ef12ac 100644
--- a/samples/Vyral.Execution.AzureDurableFunctionsSmoke/packages.lock.json
+++ b/samples/Vyral.Execution.AzureDurableFunctionsSmoke/packages.lock.json
@@ -419,7 +419,7 @@
"Azure.Storage.Blobs": "[12.29.2, )",
"Microsoft.Azure.Cosmos": "[3.62.1, )",
"Newtonsoft.Json": "[13.0.4, )",
- "Vyral.Abstractions": "[0.3.3, )",
+ "Vyral.Abstractions": "[0.3.4, )",
"Vyral.Execution.AzureDurable": "[0.2.0, )"
}
},
diff --git a/samples/Vyral.Execution.TemporalSample/packages.lock.json b/samples/Vyral.Execution.TemporalSample/packages.lock.json
index 06edf1f..3a01279 100644
--- a/samples/Vyral.Execution.TemporalSample/packages.lock.json
+++ b/samples/Vyral.Execution.TemporalSample/packages.lock.json
@@ -404,7 +404,7 @@
"dependencies": {
"Temporalio": "[1.18.0, )",
"Temporalio.Extensions.Hosting": "[1.18.0, )",
- "Vyral.Abstractions": "[0.3.3, )",
+ "Vyral.Abstractions": "[0.3.4, )",
"Vyral.Execution.Temporal": "[0.2.0, )"
}
},
@@ -422,7 +422,7 @@
"SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )",
"SQLitePCLRaw.core": "[3.0.5, )",
"System.Numerics.Tensors": "[10.0.11, )",
- "Vyral.Abstractions": "[0.3.3, )"
+ "Vyral.Abstractions": "[0.3.4, )"
}
},
"vyral.primitives": {
diff --git a/scripts/verify-publication-cohort.py b/scripts/verify-publication-cohort.py
index a864bfa..ce689f8 100755
--- a/scripts/verify-publication-cohort.py
+++ b/scripts/verify-publication-cohort.py
@@ -15,7 +15,7 @@
(
"nuget",
"Vyral.Abstractions",
- "0.3.3",
+ "0.3.4",
"src/Vyral.Abstractions/Vyral.Abstractions.csproj",
"publish-nuget",
"public",
@@ -23,7 +23,7 @@
(
"nuget",
"Vyral.Local",
- "0.3.3",
+ "0.3.4",
"src/Vyral.Local/Vyral.Local.csproj",
"publish-nuget",
"public",
@@ -36,19 +36,12 @@
"publish-pypi",
"prototype",
),
- (
- "npm",
- "vyral-client",
- "0.3.3",
- "clients/javascript/package.json",
- "publish-npm",
- "public",
- ),
)
UNCHANGED = (
"Vyral.Primitives 0.2.0",
"Vyral.Execution 0.2.0",
"Vyral.Execution.Local 0.2.0",
+ "npm vyral-client 0.3.0",
)
EXCLUDED = {
"cloud-provider packages",
@@ -57,15 +50,16 @@
"Python HTTP client distribution (vyral-client)",
"prototype integrations",
"server container",
+ "npm registry distribution (vyral-client)",
}
AUTHORIZATION = {
"mode": "manual-protected-environment",
- "releaseTag": "v0.3.3",
+ "releaseTag": "v0.3.4",
"workflow": ".github/workflows/publish-first-cohort.yml",
"requirements": (
"a GitHub-verified signed annotated release tag that resolves to current main",
"a successful canonical Release Integrity push run for that exact commit",
- "the exact NuGet and PyPI registry trusted-publisher relationships and verified direct-token npm archive",
+ "the exact NuGet and PyPI registry trusted-publisher relationships",
"a manual dispatch from main through the named protected environments",
),
"publishers": (
@@ -83,13 +77,6 @@
"publish-pypi",
"GitHub Actions OIDC trusted publishing",
),
- (
- "npm",
- "https://registry.npmjs.org",
- "publish-first-cohort.yml",
- "publish-npm",
- "operator-controlled npm token; exact archive verified by protected workflow",
- ),
),
}
diff --git a/scripts/verify-publication-policy.py b/scripts/verify-publication-policy.py
index 84cc6a3..2b3a4b1 100644
--- a/scripts/verify-publication-policy.py
+++ b/scripts/verify-publication-policy.py
@@ -126,7 +126,7 @@ def main() -> int:
for requirement in (
"workflow_dispatch:",
"release_tag:",
- "v0.3.3",
+ "v0.3.4",
"confirm:",
"type: boolean",
"GITHUB_TOKEN: ${{ github.token }}",
@@ -136,16 +136,11 @@ def main() -> int:
"release-integrity.yml/runs?head_sha=",
"name: publish-nuget",
"name: publish-pypi",
- "name: publish-npm",
- "name: package-release-v0.3.3",
+ "name: package-release-v0.3.4",
'SOURCE_DATE_EPOCH: "315532800"',
"NuGet/login@8d196754b4036150537f80ac539e15c2f1028841",
"pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33",
"skip-existing: true",
- "npm_direct_token_published:",
- 'test "$NPM_DIRECT_TOKEN_PUBLISHED" = "true"',
- "npm view vyral-client@0.3.3 dist.integrity",
- "expected_integrity",
"Verify public package availability",
):
if requirement not in publisher:
@@ -169,7 +164,7 @@ def main() -> int:
):
if PUBLISH_PATTERNS[label].search(publisher):
errors.append(
- f"{FIRST_COHORT_PUBLISH_WORKFLOW} may publish only the reviewed NuGet and PyPI packages and verify the authorized npm archive, not {label}"
+ f"{FIRST_COHORT_PUBLISH_WORKFLOW} may publish only the reviewed NuGet and PyPI packages, not {label}"
)
if re.search(
r"VYRAL_ENABLE_AUTOMATED_WORKFLOWS\s*[:=]\s*['\"]?true\b",
diff --git a/scripts/verify-python-runtime-upgrade.py b/scripts/verify-python-runtime-upgrade.py
index 0b51bab..e8ca8e9 100644
--- a/scripts/verify-python-runtime-upgrade.py
+++ b/scripts/verify-python-runtime-upgrade.py
@@ -155,6 +155,31 @@ def _unused_port() -> int:
return int(listener.getsockname()[1])
+def _serve_probe(root: Path, port: int, receipt_path: Path) -> int:
+ """Observe the installed CLI's runtime factory without exposing diagnostics."""
+ from unittest.mock import patch
+ from vyral_runtime.host import cli # type: ignore[import-not-found]
+
+ create_application = cli.create_host_application
+
+ def observed_application(*arguments: Any, **keywords: Any) -> Any:
+ application = create_application(*arguments, **keywords)
+ with receipt_path.open("x", encoding="utf-8") as stream:
+ json.dump(application.runtime.storage_schema_receipt.to_dict(), stream)
+ receipt_path.chmod(0o600)
+ return application
+
+ with patch.object(cli, "create_host_application", observed_application):
+ return cast(
+ int,
+ cli.main([
+ "--root", str(root), "--host", "127.0.0.1",
+ "--port", str(port), "--log-level", "warning",
+ "--require-api-key",
+ ]),
+ )
+
+
def _request(
base_url: str,
method: str,
@@ -271,25 +296,21 @@ def _host(
runtime_root: Path,
api_key: str,
log_path: Path,
-) -> Iterator[str]:
+) -> Iterator[tuple[str, dict[str, Any]]]:
port = _unused_port()
base_url = f"http://127.0.0.1:{port}"
+ receipt_path = log_path.with_name("startup-" + token_hex(8) + ".json")
environment = os.environ.copy()
environment["VYRAL_API_KEY"] = api_key
with log_path.open("ab") as log:
process = subprocess.Popen(
[
str(python),
- "-m",
- "vyral_runtime.host",
- "--root",
+ str(Path(__file__).resolve()),
+ "_serve_probe",
str(runtime_root),
- "--host",
- "127.0.0.1",
- "--port",
str(port),
- "--log-level",
- "warning",
+ str(receipt_path),
],
env=environment,
stdin=subprocess.DEVNULL,
@@ -298,7 +319,10 @@ def _host(
)
try:
_wait_for_server(process, base_url, log_path)
- yield base_url
+ yield base_url, _object(
+ json.loads(receipt_path.read_text(encoding="utf-8")),
+ "owner-local startup receipt",
+ )
finally:
if process.poll() is None:
process.terminate()
@@ -309,7 +333,7 @@ def _host(
process.wait(timeout=5)
-def _schema_details(readiness: Mapping[str, Any]) -> dict[str, Any]:
+def _verify_public_schema_readiness(readiness: Mapping[str, Any]) -> None:
checks = readiness.get("checks")
if not isinstance(checks, list):
raise RuntimeError("Readiness did not contain checks.")
@@ -320,7 +344,9 @@ def _schema_details(readiness: Mapping[str, Any]) -> dict[str, Any]:
"The storage-schema readiness check failed: "
+ json.dumps(value, sort_keys=True)
)
- return _object(value.get("details"), "storage schema details")
+ if value.get("details") not in (None, {}):
+ raise RuntimeError("Public readiness exposed local diagnostic detail.")
+ return
raise RuntimeError("Readiness omitted the storage-schema check.")
@@ -484,6 +510,33 @@ def _qualify(
json.loads(state_path.read_text(encoding="utf-8")),
"baseline state",
)
+ # Read the seeded baseline's ledger before starting the candidate. A
+ # published patch may already use schema 1; it must preserve that ledger
+ # rather than claim a migration from schema 0.
+ with sqlite3.connect(
+ (runtime_root / "vyral.sqlite").resolve().as_uri() + "?mode=ro",
+ uri=True,
+ ) as connection:
+ ledger_exists = connection.execute(
+ "SELECT 1 FROM sqlite_master WHERE type = 'table' "
+ "AND name = 'vyral_py_runtime_schema'"
+ ).fetchone()
+ baseline_ledger = (
+ connection.execute(
+ "SELECT schema_version, migrated_by_runtime_version "
+ "FROM vyral_py_runtime_schema WHERE component = ?",
+ ("portable-local",),
+ ).fetchone()
+ if ledger_exists is not None
+ else None
+ )
+ baseline_schema = 0 if baseline_ledger is None else baseline_ledger[0]
+ baseline_migrated_by = (
+ None if baseline_ledger is None else baseline_ledger[1]
+ )
+ if type(baseline_schema) is not int or baseline_schema not in (0, 1):
+ raise RuntimeError("The baseline storage schema is not qualified.")
+ expected_applied = [1] if baseline_schema == 0 else []
candidate_python = _install(
candidate_wheel,
work / "candidate-environment",
@@ -512,7 +565,7 @@ def _qualify(
runtime_root,
api_key,
log_path,
- ) as base_url:
+ ) as (base_url, first_schema):
unauthorized, _, _ = _request(
base_url,
"GET",
@@ -535,15 +588,23 @@ def _qualify(
),
"first readiness",
)
- first_schema = _schema_details(readiness)
+ _verify_public_schema_readiness(readiness)
if (
- first_schema.get("fromVersion") != 0
+ first_schema.get("fromVersion") != baseline_schema
or first_schema.get("toVersion") != 1
- or first_schema.get("appliedVersions") != [1]
- or first_schema.get("upgraded") is not True
+ or first_schema.get("appliedVersions") != expected_applied
+ or first_schema.get("upgraded") is not bool(expected_applied)
+ or first_schema.get("databasePreexisting") is not True
+ or first_schema.get("migratedByRuntimeVersion") != (
+ candidate_version
+ if baseline_schema == 0
+ else baseline_migrated_by
+ )
):
raise RuntimeError(
- "The first candidate start did not apply schema 0 -> 1."
+ "The first candidate start did not preserve the expected "
+ f"schema decision {baseline_schema} -> 1: "
+ + json.dumps(first_schema, sort_keys=True)
)
_verify_persisted_state(base_url, api_key, state)
_verify_mcp(base_url, api_key)
@@ -571,7 +632,7 @@ def _qualify(
runtime_root,
api_key,
log_path,
- ) as base_url:
+ ) as (base_url, second_schema):
readiness = _object(
_json(
base_url,
@@ -581,7 +642,7 @@ def _qualify(
),
"restart readiness",
)
- second_schema = _schema_details(readiness)
+ _verify_public_schema_readiness(readiness)
if (
second_schema.get("fromVersion") != 1
or second_schema.get("toVersion") != 1
@@ -638,6 +699,11 @@ def _qualify(
},
"environment": environment,
"storage": {
+ "observation": (
+ "owner-local startup receipt from the installed CLI factory; "
+ "public readiness remains redacted"
+ ),
+ "baselineSchemaVersion": baseline_schema,
"firstStart": first_schema,
"secondStart": second_schema,
"integrityCheck": integrity,
@@ -645,7 +711,11 @@ def _qualify(
},
"checks": [
"baseline-seed",
- "forward-schema-migration",
+ (
+ "forward-schema-migration"
+ if baseline_schema == 0
+ else "current-schema-preserved"
+ ),
"authentication-after-upgrade",
"records-after-upgrade",
"canonical-after-upgrade",
@@ -665,11 +735,13 @@ def _qualify(
print(
"python-runtime-upgrade=ok "
f"baseline={baseline_version} candidate={candidate_version} "
- "schema=0->1 restart=passed auth=passed mcp=passed"
+ f"schema={baseline_schema}->1 restart=passed auth=passed mcp=passed"
)
def main() -> int:
+ if len(sys.argv) == 5 and sys.argv[1] == "_serve_probe":
+ return _serve_probe(Path(sys.argv[2]), int(sys.argv[3]), Path(sys.argv[4]))
if len(sys.argv) == 4 and sys.argv[1] == "_seed":
return _seed_baseline(Path(sys.argv[2]), Path(sys.argv[3]))
diff --git a/scripts/verify-release-artifacts.sh b/scripts/verify-release-artifacts.sh
index 56e24e2..4b3b8e8 100755
--- a/scripts/verify-release-artifacts.sh
+++ b/scripts/verify-release-artifacts.sh
@@ -310,8 +310,8 @@ for package in packages:
package_id = value("id")
package_version = value("version")
expected_versions = {
- "Vyral.Abstractions": "0.3.3",
- "Vyral.Local": "0.3.3",
+ "Vyral.Abstractions": "0.3.4",
+ "Vyral.Local": "0.3.4",
"Vyral.Primitives": "0.2.0",
"Vyral.Execution": "0.2.0",
"Vyral.Execution.Aws": "0.2.0",
diff --git a/scripts/verify-version-policy.py b/scripts/verify-version-policy.py
index aab1085..1c94a60 100755
--- a/scripts/verify-version-policy.py
+++ b/scripts/verify-version-policy.py
@@ -13,8 +13,8 @@
ROOT = Path(__file__).resolve().parent.parent
PRODUCT_VERSION = "0.3.0"
-CORE_PACKAGE_VERSION = "0.3.3"
-SDK_PACKAGE_VERSION = "0.3.3"
+CORE_PACKAGE_VERSION = "0.3.4"
+SDK_PACKAGE_VERSION = "0.3.4"
SERVER_IMAGE_VERSION = "0.3.6"
EXECUTION_VERSION = "0.2.0"
PYTHON_RUNTIME_VERSION = "0.1.4"
diff --git a/src/Vyral.Abstractions/Vyral.Abstractions.csproj b/src/Vyral.Abstractions/Vyral.Abstractions.csproj
index ad5afa1..cf591d8 100644
--- a/src/Vyral.Abstractions/Vyral.Abstractions.csproj
+++ b/src/Vyral.Abstractions/Vyral.Abstractions.csproj
@@ -6,8 +6,8 @@