diff --git a/.github/releases/v1.0.0.md b/.github/releases/v1.0.0.md new file mode 100644 index 0000000..68254ae --- /dev/null +++ b/.github/releases/v1.0.0.md @@ -0,0 +1,22 @@ +First tagged release: a zero-copy shared-memory IPC framework for local AI workloads. C++17 core, lock-free SPSC data path, crash-resilient, with a frozen C ABI driven from Python and Rust. + +## Highlights + +- **Bipartite buffer (BipBuffer) ring**: every payload is physically contiguous, so the zero-copy pointer handoff is always valid. +- **Lock-free hot path**: single-writer atomic cursors published with release/acquire ordering; zero locks taken when the peer isn't parked. +- **Parking, not polling**: blocked peers sleep at ~0.05% CPU and wake in microseconds; every wait is a bounded timedwait. +- **Crash resilience**: heartbeat liveness on both platforms plus robust-mutex (`EOWNERDEAD`) recovery on Linux; a peer SIGKILLed mid-transfer leaves the survivor with a clean `PEER_DEAD` error, never a deadlock. +- **Frozen C ABI v1** with Python (cffi, zero-copy `memoryview`) and Rust (compile-time borrow enforcement) bindings. +- **New in this release**: opt-in transparent huge pages via the additive `shuttle_create_ex` + `SHUTTLE_CREATE_HUGEPAGES` (advisory `madvise` on Linux, no-op elsewhere; the frozen v1 surface is untouched). + +## Verification + +29-test suite green under AddressSanitizer and ThreadSanitizer on macOS (native Apple silicon) and Linux (glibc); the correctness suite runs in CI on ubuntu-24.04. Consolidated API reference in [docs/API.md](https://github.com/allandng/shuttle/blob/main/docs/API.md); direction triage in [docs/ROADMAP.md](https://github.com/allandng/shuttle/blob/main/docs/ROADMAP.md). + +## Benchmark honesty + +Headline figures (50 MB end-to-end in ~5 µs vs ~9 ms over Unix sockets) are development measurements on native Apple M-series hardware. The production target is Linux and the headline claim remains provisional until the harness runs on bare-metal Linux; see the README's "Benchmark honesty" section for methodology and caveats. + +## Scope + +Same-host, single-producer/single-consumer, one-way channels. Linux is the hard-guarantee platform; macOS crash recovery is best-effort by design. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3fa717f..5bc7651 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,11 +1,21 @@ -# Publish a GitHub Release when a version tag (v*) is pushed. The annotated -# tag's message becomes the release notes (--notes-from-tag), so notes are -# curated at tag time and live in git history, not in this file. +# Publish a GitHub Release. Two triggers: +# - push of a version tag (v*): the annotated tag's message becomes the +# release notes (--notes-from-tag), curated at tag time. +# - workflow_dispatch with a tag input: creates the tag at the dispatched +# ref and publishes the release, taking notes from +# .github/releases/.md when that file exists (falling back to +# GitHub's generated notes). This path exists for environments that can +# push branches but not tags. name: Release on: push: tags: ["v*"] + workflow_dispatch: + inputs: + tag: + description: "Tag to release (created at the dispatched ref if it does not exist)" + required: true permissions: contents: write @@ -15,11 +25,22 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - - name: Create GitHub release from tag annotation + - name: Create GitHub release env: GH_TOKEN: ${{ github.token }} + EVENT_NAME: ${{ github.event_name }} + INPUT_TAG: ${{ inputs.tag }} run: | - gh release create "$GITHUB_REF_NAME" \ - --verify-tag \ - --title "Shuttle $GITHUB_REF_NAME" \ - --notes-from-tag + if [ "$EVENT_NAME" = "workflow_dispatch" ]; then + NOTES=".github/releases/${INPUT_TAG}.md" + if [ -f "$NOTES" ]; then + gh release create "$INPUT_TAG" --target "$GITHUB_SHA" \ + --title "Shuttle $INPUT_TAG" --notes-file "$NOTES" + else + gh release create "$INPUT_TAG" --target "$GITHUB_SHA" \ + --title "Shuttle $INPUT_TAG" --generate-notes + fi + else + gh release create "$GITHUB_REF_NAME" --verify-tag \ + --title "Shuttle $GITHUB_REF_NAME" --notes-from-tag + fi