Distribution contracts

Package and verify supported distribution formats.

Manual for v0.9.5. Stable release: v0.9.5.

The octet 0.9.5 release's version-pinned GitHub page records immutable native assets, signatures, exact-source qualification and actual channel availability. The release notes distinguish shipped scope from unrun acceptance. Pi compatibility is excluded: the release catalog contains five optional executable bundles, not the experimental adapter.

The planned npm channel is @skaft/octet@0.9.5 (launcher plus four signed platform packages, with provenance). Homebrew, crates.io and SDK registries remain separate, unpublished channels. Native publication does not publish them.

The repository is now skaft-software/octet. The immutable v0.7.0 assets keep their original skaft-software/ygg signing identity, and v0.7.1 and later use the new identity. Existing clone and release-asset URLs redirect to the same repository. Don't recreate the old name.

Package identities#

This release's distribution target is 0.9.5. The distribution version does not change independent API and schema versions. The 0.7.6 release keeps its historical version-matched assets and channel evidence.

Surface Source identity
Product and native commands lowercase octet; octet, octet-host
Core crates octet-ai, octet-agent, octet-coding-agent, octet-migrate-types
Product library octet_sdk
Python distribution / import octet-extension-sdk / octet_extension
Canonical TypeScript source package @skaft-software/octet-extension-api-v03
Executable bundles octet-codemode, octet-computer-use, octet-mcp, octet-subagents, octet-web-search
Product environment and roots OCTET_*, ~/.octet, project .octet; packaged docs share/octet
Product, SDK and five shipped executable-bundle distribution versions 0.9.5; installed compatibility requires_octet = "=0.9.5"
Independent contracts current extension API 0.4, retained 0.1 / 0.2 and canonical 0.3; native-host protocol 1; schema revisions remain independent
Source/release repository skaft-software/octet; v0.7.0 signatures retain skaft-software/ygg
Website https://octet.skaft.org; deployment is separate from native publication

Current extension authoring and the five shipped executable-bundle manifests target API 0.4, the feature-negotiated wire the Python Extension runtime supports alongside the retained 0.1 and 0.2. Canonical API 0.3 stays a separate supported wire, and the generated 0.3 types aren't a complete 0.3 process runtime. The minimal canonical process example and independent Aider adapter keep version 0.1.0 with exact =0.8.0 host pins. The Pi adapter remains experimental source-only work; neither its stock bundle nor configured local bridge is shipped in v0.9.5. Renaming first-party wire fields such as octet_version doesn't renumber APIs or keep old-name aliases. Historical releases, measurements, upstream copyrights, Pi pins, independent example versions and mismatch fixtures keep their original scope.

Channel selection#

The release workflows don't publish every source package automatically:

Channel Release path Publication boundary
Native archives and shell installer release-octet.yml Signed, version-pinned GitHub release assets. Verify public installation after upload.
Five executable bundles release-serve.yml Separate exact-version octet-codemode, octet-computer-use, octet-mcp, octet-subagents and octet-web-search archives. Install and update never enable them or persist trust grants.
npm CLI release-octet.yml with publish_npm=true Five @skaft/octet* packages, platform-first. Needs verified registry ownership and trusted publishers for all five. Disabled by default.
Cargo installation Build the canonical Git tag No crates.io publication needed. The public tag and its complete source must exist.
crates.io Not provided by the current workflows Don't advertise registry installation. Publishing the CLI and dependency graph and verifying registry ownership is separate work.
Homebrew homebrew-formula.yml A separate signed-asset handoff and protected tap pull request. Not automatic with the binary release.
Python and TypeScript SDK registries Not provided by the CLI release workflow The five-package CLI job doesn't publish the source SDKs or generated bindings to PyPI or npm.

Native publication uses the matching octet-binaries-vX.Y.Z tooling tag at the canonical release commit. Its metadata generator requires that ref, and the protected environment must admit the tag without removing required reviewers.

Cargo can build the published canonical tag's exact source (Rust 1.88+; ripgrep is optional, with grep as the content-search fallback):

sh
cargo install --locked --git https://github.com/skaft-software/octet --tag v0.9.5 --bins octet-coding-agent

Use this command only after the canonical v0.9.5 tag is published. cargo install octet and registry-based cargo install octet-coding-agent aren't the supported Cargo path.

The planned npm channel has five @skaft/octet* packages (launcher plus four platform packages), built from verified release assets with trusted publishers and registry provenance verification. 0.9.5 is not published to npm. Only after verified publication, pin the version to reproduce one exact release:

sh
npm install --global --ignore-scripts --no-audit --no-fund @skaft/octet@0.9.5

npm install -g @skaft/octet tracks the latest dist-tag instead; it is not an installation of an exact version. Published versions are immutable, so a pinned install can't be silently replaced.

Unsigned dogfood candidates#

Manually dispatching ci.yml on a reviewed ref builds unsigned, commit-scoped artifacts for Linux x64, macOS Intel and Apple silicon, and native Windows x64. It does not tag or publish a release, update a registry, or sign assets:

sh
gh workflow run ci.yml --ref "$RC_REF"
gh run view "$RUN_ID" --json headSha,status,conclusion
gh run download "$RUN_ID" --name "octet-rc-${COMMIT_PREFIX}-${TARGET}" --dir dogfood

Select the run for the exact reviewed commit, require its gating checks to succeed, and compare BUILD-INFO.json with that commit and target. Unix artifacts contain the native archive plus extension-bundles/; Windows artifacts contain octet.exe, octet-host.exe, extracted extensions/, and the same bundle archives. All five official extensions are included; Pi compatibility is not. Codemode ships a target-native executable, including bin/codemode.exe on Windows. Python adapters require Python, and optional drivers and integrations require separately consented setup.

Verify the native SHA256SUMS and the bundle directory's SHA256SUMS before extracting or running anything (shasum -a 256 -c SHA256SUMS on macOS; sha256sum -c SHA256SUMS on Linux). On Windows, compare Get-FileHash -Algorithm SHA256 with each manifest. Keep the candidates in a disposable directory; don't replace an existing installation. Extracting bundles never enables them, grants trust, imports Pi configuration, or authorizes factory execution.

These are dogfood artifacts, not stable qualification. Windows multiline paste, live-provider metric accuracy and attended rendering/driver journeys remain unqualified unless recorded separately on the release page. The Windows workspace baseline is explicitly informational, not a gating full-suite pass. Pi setup parity is outside this release. See Windows testing.

Reviewed model metadata#

Release preparation refreshes and reviews the checked-in models.dev names, pricing, capabilities and source identity together. On a workspace product-version change, or an explicit CI dispatch that asks for it, CI runs the live models.dev --check gate. Stale snapshots must be refreshed and reviewed before the release source is frozen, and the check never silently rewrites release inputs.

Ordinary compilation uses checked-in metadata without network access. This gate isn't an all-provider test or live-inference qualification. Interactive sessions separately refresh checked live records at runtime, with the reviewed snapshot as their fallback and baseline. See the model-source record for metadata scope and limitations.

Homebrew#

The Homebrew formula is generated from the signed OCTET_RELEASE_METADATA.json that the protected binary-release workflow produces, and nothing in the process reads a mutable latest or the release API. The proposed tap is skaft-software/homebrew-tap, publishing the octet formula. It installs only octet and octet-host, does not require or install ripgrep, has no Linux runtime, and doesn't run an npm lifecycle hook, invoke Cargo or build from source. Content search prefers rg when available, otherwise grep. To check a formula generated from local release assets:

sh
scripts/test-homebrew-formula.sh

That offline check isn't hosted macOS acceptance, tap publication or public release verification.

How the formula is verified

The generator doesn't read a version from the package manifest. Before rendering, the workflow verifies the metadata's Sigstore bundle, the canonical tag, workflow and source identity, the OCTET_SHA256SUMS digest and both macOS archive digests. All release channels consume the same immutable native assets.

The tap is Formula/octet.rb with class Octet. Before an authorized handoff, verify channel ownership, signed metadata and hosted acceptance on macOS Apple silicon and Intel. Linux qualification follows its own native and npm gates. The formula uses the archive's versioned top-level directory. The offline check covers metadata parsing, archive checksum handoff, formula syntax, expected architecture URLs and rejection of a changed digest.

Release handoff and tap publication#

Rendering and publishing the formula need an explicit dispatch from the matching octet-binaries-vX.Y.Z tooling tag. Finishing a binary release never changes the tap, and the workflow only ever opens a protected tap pull request. If an update used a wrong or incomplete release, close the pull request unmerged and regenerate from the same immutable metadata. Never edit SHA-256 values by hand.

Handoff requirements and recovery

A release candidate needs a stable vX.Y.Z tag, a signed native checksum manifest and a signed immutable metadata document. The Homebrew workflow downloads that exact metadata and signature from the canonical release, verifies the Sigstore identity against the release workflow commit, and renders Formula/octet.rb in a clean tap checkout. It checks the formula diff and opens a protected tap pull request. It never replaces a formula on the default branch.

Configure the tap repository and GitHub App permissions in the protected release environment, never as source-controlled credentials. A missing token, a non-canonical tap repository, a metadata mismatch, a failed formula check or unavailable hosted macOS acceptance must stop the handoff without changing the tap. If a bad formula was merged, revert the tap commit and open a replacement from a newly reviewed metadata record. Never use a mutable release alias.

Other channels#

The planned v0.9.5 version-pinned shell installer targets macOS arm64 and x64 and GNU/Linux x64. The no-lifecycle npm launcher targets the same platforms plus Windows x86-64 and would publish as @skaft/octet@0.9.5. See the npm release contract for platform-first publishing and provenance checks. CLI installation with Bun is unqualified. Cargo can build and install the local checkout without a registry channel. Installing from the public canonical tag needs the version-pinned GitHub tag, not a crates.io package.