Skip to content
Closed
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d957ba8
fix(ci): make public development self-contained
mamayer19 Aug 28, 2026
58ff00a
feat(release): add public package release authority
mamayer19 Aug 28, 2026
abb2350
feat(docker): publish the complete public image source closure
mamayer19 Aug 28, 2026
4aaec79
feat(helm): fan out the public chart release
mamayer19 Aug 28, 2026
a366326
test(release): prove the public setup contract
mamayer19 Aug 28, 2026
a5b6ec8
fix(ci): validate exported source archives
mamayer19 Aug 28, 2026
2dd9b0b
fix(ci): close public path and Candle coverage gaps
mamayer19 Aug 28, 2026
ba2e1c0
fix(release): harden public release authority
mamayer19 Aug 28, 2026
f41d480
fix(ci): validate exported public trees without git
mamayer19 Aug 28, 2026
8e152bc
fix(release): harden native audio bootstrap
mamayer19 Aug 28, 2026
f9c796b
fix(release): publish retained image and native artifacts
mamayer19 Sep 3, 2026
981cd8c
feat(release): bind public package publication to tested original art…
mamayer19 Sep 3, 2026
713a387
ci: require public development checks on every pull request
mamayer19 Sep 3, 2026
472e914
fix(deps): update yanked chacha20 patch
mamayer19 Sep 3, 2026
35d492b
docs: describe public CI and release operations
mamayer19 Sep 3, 2026
15d7ad2
fix(release): prevent stale recovery from rolling back aliases
mamayer19 Sep 3, 2026
13e1204
ci: audit the standalone Rust dependency graph
mamayer19 Sep 3, 2026
c6f8086
docs: clarify historical release recovery
mamayer19 Sep 3, 2026
f4f3ebc
fix(release): publish from exact protected release events
mamayer19 Sep 3, 2026
fb20e5f
fix(release): preserve npm latest during historical recovery
mamayer19 Sep 3, 2026
7d3f42c
docs: explain protected release-event publication
mamayer19 Sep 3, 2026
0842145
chore: merge public v0.7.3 foundation
mamayer19 Sep 4, 2026
a089699
fix(release): bind public v0.7.3 setup
mamayer19 Sep 4, 2026
8f7d4b8
docs(telemetry): use public dispatch terminology
mamayer19 Sep 4, 2026
85b2528
test(ci): stabilize offline Python checks
mamayer19 Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/actionlint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
self-hosted-runner:
labels:
- blacksmith-2vcpu-ubuntu-2404
- blacksmith-4vcpu-ubuntu-2404
- blacksmith-8vcpu-ubuntu-2404
- blacksmith-16vcpu-ubuntu-2404
8 changes: 8 additions & 0 deletions .github/release-matrix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"bundles": ["default", "ctranslate2", "sglang", "transformers5"],
"platforms": ["cuda12", "cpu"],
"include": [
{ "platform": "cuda13", "bundle": "sglang-cu130" },
{ "platform": "cuda13", "bundle": "tensorrt-llm" }
]
}
241 changes: 241 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
name: CI

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
policy:
name: CI / Policy
runs-on: blacksmith-2vcpu-ubuntu-2404
timeout-minutes: 15
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: >-
mise exec -- uv run --frozen --project . pytest -q
tools/ci/tests/test_required_ci.py tools/ci/tests/test_public_tree.py
- run: mise exec -- python tools/ci/check_public_tree.py
- run: >-
mise exec -- actionlint
-ignore '^unexpected key "queue" for "concurrency" section\. expected one of "cancel-in-progress", "group"$'

bootstrap:
name: CI / Fresh bootstrap
runs-on: blacksmith-8vcpu-ubuntu-2404
timeout-minutes: 60
env:
UV_NO_CACHE: "1"
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
install: false
- run: bash tools/ci/fresh_bootstrap.bash

python:
name: CI / Python
runs-on: blacksmith-8vcpu-ubuntu-2404
timeout-minutes: 60
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: mise exec -- uv lock --check --project .
- run: mise run sync
- run: mise run lint
- run: mise run typecheck
- name: Offline public unit tests
env:
HF_HUB_OFFLINE: "1"
TRANSFORMERS_OFFLINE: "1"
run: mise run test
- run: mise run test-integrations -- --python-only
- name: Public tooling syntax and tests
run: |
mise exec -- uv run --frozen --project . --no-sync ruff format --check tools/ci
mise exec -- uv run --frozen --project . --no-sync ruff check --select E,F,I,UP,B tools/ci
mise exec -- uv run --frozen --project . --no-sync ruff check --select E9,F63,F7,F82 tools/mise_tasks
mise exec -- uv run --frozen --project . --no-sync pytest -q tools/ci/tests --ignore tools/ci/tests/test_required_ci.py --ignore tools/ci/tests/test_public_tree.py

typescript:
name: CI / TypeScript
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: mise exec -- pnpm install --frozen-lockfile
- run: mise run ts -- build
- run: mise run ts -- typecheck
- run: mise run ts -- lint
- run: mise run ts -- test

rust:
name: CI / Rust
runs-on: blacksmith-8vcpu-ubuntu-2404
timeout-minutes: 90
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: mise run sync
- run: mise run rust-fmt -- --check
- run: mise run rust-check
- run: mise run rust-clippy
- run: mise run gateway-deny
- name: Audit standalone Rust worker dependencies
run: >-
mise exec -- cargo-deny --locked
--manifest-path packages/sie_server_rust/Cargo.toml --all-features
--config deny.toml check
- run: mise exec -- cargo fmt --manifest-path packages/sie_server_rust/Cargo.toml -- --check
- run: mise exec -- cargo check --manifest-path packages/sie_server_rust/Cargo.toml --locked --all-targets
- run: mise exec -- cargo clippy --manifest-path packages/sie_server_rust/Cargo.toml --locked --all-targets -- -D warnings
- run: mise exec -- uv run --frozen --project . --no-sync python tools/ci/rust_tests.py
- name: Preserve diagnostics
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: rust-logs
path: .cache/ci-logs/
retention-days: 30
if-no-files-found: ignore

contracts:
name: CI / Contracts
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 25
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: mise run sync
- run: mise exec -- python tools/check_ipc_types_parity.py
- run: mise exec -- python tools/check_response_chunk_protocol.py
- run: tests/parity/run_parity.sh

helm:
name: CI / Helm
runs-on: blacksmith-2vcpu-ubuntu-2404
timeout-minutes: 25
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: mise run helm -- dependencies
- run: mise run helm -- lint --set payloadStore.enabled=false
- run: mise run helm -- template --set payloadStore.enabled=false >/dev/null
- run: |
destination="$(mktemp -d)"
mise exec -- helm package deploy/helm/sie-cluster --destination "$destination"
git diff --exit-code -- deploy/helm/sie-cluster/Chart.lock

live-sdk:
name: CI / Live SDK CPU
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 30
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: mise run sync
- run: mise exec -- pnpm install --frozen-lockfile
- run: mise run ts -- build
- run: mise exec -- uv run --frozen --project . --no-sync python tools/ci/live_sdk.py
- run: >-
mise exec -- uv run --frozen --project . --no-sync pytest -q
packages/sie_server/tests/fake_stack/test_sdk_surface.py
-m integration
- name: Preserve diagnostics
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: live-sdk-logs
path: .cache/ci-logs/
retention-days: 30
if-no-files-found: ignore

cpu-stack:
name: CI / CPU containers
runs-on: blacksmith-8vcpu-ubuntu-2404
timeout-minutes: 180
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
cache: false
- run: mise run sync
- run: mise exec -- uv run --frozen --project . --no-sync python -m tools.ci.cpu_stack_smoke
- name: Preserve diagnostics
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: cpu-stack-logs
path: .cache/ci-logs/
retention-days: 30
if-no-files-found: ignore

python-distributions:
name: CI / Python distributions
uses: ./.github/workflows/release-python.yml
with:
source_ref: ${{ github.sha }}
build_only: true

npm-distributions:
name: CI / npm distributions
uses: ./.github/workflows/release-npm.yml
with:
source_ref: ${{ github.sha }}
build_only: true

required:
name: CI / Required
if: ${{ always() }}
needs: [policy, bootstrap, python, typescript, rust, contracts, helm, live-sdk, cpu-stack, python-distributions, npm-distributions]
runs-on: blacksmith-2vcpu-ubuntu-2404
timeout-minutes: 5
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
- env:
NEEDS: ${{ toJSON(needs) }}
run: python3 tools/ci/required_ci.py
139 changes: 139 additions & 0 deletions .github/workflows/release-audio.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
name: Release native audio asset

on:
workflow_call:
inputs:
version:
required: true
type: string
tag_name:
required: true
type: string
sha:
required: true
type: string
publish:
required: true
type: boolean

permissions:
contents: read

defaults:
run:
shell: bash

jobs:
build:
runs-on: blacksmith-8vcpu-ubuntu-2404
container: quay.io/pypa/manylinux_2_28_x86_64@sha256:4dc41da7df20400310c80d162a2fe2d2c2f3d9734d8dec20f6b9843711618deb
timeout-minutes: 30
outputs:
filename: ${{ steps.contract.outputs.filename }}
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
ref: ${{ inputs.sha }}
persist-credentials: false
- uses: jdx/mise-action@c37c93293d6b742fc901e1406b8f764f6fb19dac # v2
with:
version: 2026.7.11
install: false
cache: false
- name: Install pinned native build tools
run: |
mise --no-config install python@3.12.12 uv@0.5.31 zig@0.13.0 rust@1.97.0
test "$(mise --no-config exec python@3.12.12 uv@0.5.31 zig@0.13.0 rust@1.97.0 -- rustc --version | cut -d' ' -f2)" = 1.97.0
test "$(mise --no-config exec python@3.12.12 uv@0.5.31 zig@0.13.0 rust@1.97.0 -- cargo --version | cut -d' ' -f2)" = 1.97.0
test "$(mise --no-config exec python@3.12.12 uv@0.5.31 zig@0.13.0 rust@1.97.0 -- zig version)" = 0.13.0
- id: contract
name: Validate exact release identity and asset filename
env:
RELEASE_VERSION: ${{ inputs.version }}
RELEASE_TAG: ${{ inputs.tag_name }}
RELEASE_SHA: ${{ inputs.sha }}
run: |
set -euo pipefail
test "$RELEASE_TAG" = "v$RELEASE_VERSION"
test "$(git rev-parse HEAD)" = "$RELEASE_SHA"
filename="$(mise --no-config exec python@3.12.12 uv@0.5.31 zig@0.13.0 rust@1.97.0 -- python -c 'import runpy; print(runpy.run_path("packages/sie_audio_prep/build_wheel.py")["AUDIO_WHEEL_FILENAME"])')"
test "$filename" = "sie_audio_prep-$RELEASE_VERSION-cp312-abi3-manylinux_2_28_x86_64.whl"
echo "filename=$filename" >> "$GITHUB_OUTPUT"
- name: Build and validate exact Linux wheel
run: >-
mise --no-config exec python@3.12.12 uv@0.5.31 zig@0.13.0 rust@1.97.0 --
python tools/ci/build_audio_prep_release_asset.py --out dist
- name: Record exact tested wheel and original run provenance
run: >-
mise --no-config exec python@3.12.12 -- python -m tools.ci.release_artifact stamp
--directory dist --kind audio --version '${{ inputs.version }}' --tag-name '${{ inputs.tag_name }}'
--source-revision '${{ inputs.sha }}' --run-id '${{ github.run_id }}'
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: audio-prep-${{ inputs.version }}
path: dist/
if-no-files-found: error
retention-days: 30

publish:
needs: build
if: >-
inputs.publish == true &&
vars.PUBLIC_RELEASE_PUBLISHING_ENABLED == 'true' &&
github.event_name == 'release' &&
github.event.action == 'published' &&
github.event.release.draft == false &&
github.event.release.prerelease == false &&
github.ref_protected == true &&
github.ref == format('refs/tags/{0}', inputs.tag_name) &&
github.repository == 'superlinked/sie' &&
github.sha == inputs.sha
runs-on: blacksmith-8vcpu-ubuntu-2404
timeout-minutes: 15
environment: github-release
permissions:
contents: write
steps:
- uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
ref: ${{ inputs.sha }}
fetch-depth: 1
persist-credentials: false
- name: Validate trusted publication context and tag binding
env:
RELEASE_VERSION: ${{ inputs.version }}
RELEASE_TAG: ${{ inputs.tag_name }}
RELEASE_SHA: ${{ inputs.sha }}
PUBLIC_RELEASE_PUBLISHING_ENABLED: ${{ vars.PUBLIC_RELEASE_PUBLISHING_ENABLED }}
GH_TOKEN: ${{ github.token }}
run: >-
python3 tools/ci/release_guard.py publish --source-ref "$RELEASE_SHA"
--version "$RELEASE_VERSION" --tag-name "$RELEASE_TAG"
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: audio-prep-${{ inputs.version }}
path: artifact
- name: Attach and verify exact GitHub Release asset
env:
AUDIO_WHEEL_FILENAME: ${{ needs.build.outputs.filename }}
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: ${{ inputs.tag_name }}
run: |
set -euo pipefail
wheel="artifact/$AUDIO_WHEEL_FILENAME"
test -f "$wheel"
python3 -m tools.ci.release_artifact check --directory artifact --kind audio --version '${{ inputs.version }}' --tag-name '${{ inputs.tag_name }}' --source-revision '${{ inputs.sha }}' --run-id '${{ github.run_id }}'
python3 -c 'import runpy,sys; runpy.run_path("packages/sie_audio_prep/build_wheel.py")["_validate_wheel"](__import__("pathlib").Path(sys.argv[1]))' "$wheel"
tools/ci/upload_audio_prep_release_asset.bash "$wheel"

complete:
if: always() && inputs.publish
needs: [build, publish]
runs-on: blacksmith-2vcpu-ubuntu-2404
timeout-minutes: 5
steps:
- name: Require every release build and publisher to succeed
env:
RESULTS: ${{ toJSON(needs) }}
run: |
python3 -c 'import json,os; results=json.loads(os.environ["RESULTS"]); failed={name: job["result"] for name,job in results.items() if job["result"] != "success"}; print(failed); assert not failed'
Loading
Loading