From b0dae8def35e559965dc829476b82fd21423160c Mon Sep 17 00:00:00 2001
From: Jalil
Date: Tue, 10 Nov 2026 16:16:21 -0800
Subject: [PATCH] chore(release): prepare v0.1.0-alpha.3
Moves the Unreleased changelog under 0.1.0-alpha.3 with a summary, what did
not run for this release, and what changes for someone upgrading from
alpha.2. Updates the version in the README, the single-VM guide and the
website.
Sets the chart's appVersion to 0.1.0-alpha.3. It named 0.1.0, an image tag
that was never published, so installing the chart from a checkout could not
pull its image; the air-gapped and day-2 guides named the same tag and the
chart version 0.2.0 (it is 0.3.0).
Co-Authored-By: Claude Fable 5.2
Signed-off-by: Jalil
---
CHANGELOG.md | 40 +++++++++++++++++++++++++++++-
README.md | 2 +-
deploy/helm/differently/Chart.yaml | 2 +-
docs/deploy/air-gapped.md | 16 ++++++------
docs/deploy/day-2.md | 2 +-
docs/deploy/kubernetes.md | 2 +-
docs/deploy/single-vm.md | 6 ++---
docs/maintaining.md | 6 +++--
site/src/pages/index.astro | 2 +-
9 files changed, 59 insertions(+), 19 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8779609..4c98a61 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,43 @@ All notable changes are recorded here. The format follows
## [Unreleased] — on `pre-release`
+## [0.1.0-alpha.3] — 2026-11-10
+
+Third alpha, published as a GitHub pre-release. Not for production. It is
+mostly a correctness release: a review of the code found ten defects in
+placement, the scheduler, the reconciler and the clients, and each is fixed
+with a test that fails on the old behaviour. The default build is cut to the
+adapters that have run against real backends, and the release workflow now
+runs the checks before it publishes.
+
+What has not run for this release: the end-to-end suite and the live adapter
+tests. They last ran on the code before these changes (see `Verified` under
+0.1.0-alpha.2 and the sections below). The fixes are covered by in-process
+tests and, for the store, by the Postgres conformance job in CI.
+
+Upgrading from 0.1.0-alpha.2:
+
+- A config file or API call that names one of the 13 experimental adapter
+ kinds is refused by the published image (first section below).
+- A client that lists sandboxes by status needs to add `pausing`.
+- `PATCH /v1/sandboxes/{id}` with `ttlSeconds: 0` answers 400; use `DELETE`.
+
+### Documentation and CI
+
+- The SDK READMEs install the SDKs from this repository. Neither is
+ published: `pip install differently` installs an unrelated project of that
+ name, and `npm install @differently/sdk` finds nothing. Their method
+ tables no longer list `admin.agents.list`, which does not exist.
+- `make vet` and CI compile and vet the end-to-end and live test files
+ (`-tags "e2e live"`), which no job runs, so they cannot stop compiling
+ unnoticed.
+- The release workflow runs gofmt, vet, the Go tests (default and
+ experimental builds) and the Helm lint before it publishes binaries, the
+ chart or images.
+- The chart's `appVersion` names this release, so installing the chart from
+ a checkout pulls an image that exists. It used to name `0.1.0`, which was
+ never published; the air-gapped and day-2 guides named the same tag.
+
### Changed (breaking): the default build holds only the verified adapters
The published image, the release binaries and `make build` now contain the
@@ -549,6 +586,7 @@ OpenSandbox server on its Docker runtime.
beyond unit and in-process API tests: no live provider account, real
cluster or multi-replica run yet.
-[Unreleased]: https://github.com/different-ai/differently/compare/v0.1.0-alpha.2...pre-release
+[Unreleased]: https://github.com/different-ai/differently/compare/v0.1.0-alpha.3...pre-release
+[0.1.0-alpha.3]: https://github.com/different-ai/differently/releases/tag/v0.1.0-alpha.3
[0.1.0-alpha.2]: https://github.com/different-ai/differently/releases/tag/v0.1.0-alpha.2
[0.1.0-alpha.1]: https://github.com/different-ai/differently/releases/tag/v0.1.0-alpha.1
diff --git a/README.md b/README.md
index 17065ac..7afd4f1 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ Apache-2.0, fully self-hosted, no telemetry. Built by the
▶ Watch the 36-second intro
-> **Pre-release ([`v0.1.0-alpha.2`](https://github.com/different-ai/differently/releases)).**
+> **Pre-release ([`v0.1.0-alpha.3`](https://github.com/different-ai/differently/releases)).**
> The whole platform is implemented and tested end to end against real
> OpenSandbox servers (Docker, Kubernetes and Fast Sandbox microVM
> runtimes). It isn't ready for production workloads yet: see
diff --git a/deploy/helm/differently/Chart.yaml b/deploy/helm/differently/Chart.yaml
index ff2b2fa..c411d22 100644
--- a/deploy/helm/differently/Chart.yaml
+++ b/deploy/helm/differently/Chart.yaml
@@ -6,7 +6,7 @@ description: >-
OpenSandbox server, installed separately, as its default private pool.
type: application
version: 0.3.0
-appVersion: "0.1.0"
+appVersion: "0.1.0-alpha.3"
kubeVersion: ">=1.29.0-0"
home: https://github.com/different-ai/differently
sources:
diff --git a/docs/deploy/air-gapped.md b/docs/deploy/air-gapped.md
index 9106fcf..2a3d51c 100644
--- a/docs/deploy/air-gapped.md
+++ b/docs/deploy/air-gapped.md
@@ -22,8 +22,8 @@ network, is for its documentation to answer; it has not been checked here.
| Image | Needed for |
|---|---|
-| `ghcr.io/different-ai/differently-server:0.1.0` | Control plane, migrations, preflight |
-| `ghcr.io/different-ai/differently-cli:0.1.0` | `helm test` only |
+| `ghcr.io/different-ai/differently-server:0.1.0-alpha.3` | Control plane, migrations, preflight |
+| `ghcr.io/different-ai/differently-cli:0.1.0-alpha.3` | `helm test` only |
| `docker.io/library/postgres:17` | Only with the evaluation-only `postgresql.embedded` |
| `docker.io/library/busybox:1.37` | Only for the `kubectl debug` checks in these guides |
| OpenSandbox's server, `execd` and other component images | Your OpenSandbox installation; see step 3 |
@@ -35,9 +35,9 @@ Copy by digest so the internal tags point at exactly what you reviewed. Use
```sh
REG=registry.internal.example.com
for img in differently-server differently-cli; do
- skopeo copy --all docker://ghcr.io/different-ai/$img:0.1.0 docker://$REG/different-ai/$img:0.1.0
+ skopeo copy --all docker://ghcr.io/different-ai/$img:0.1.0-alpha.3 docker://$REG/different-ai/$img:0.1.0-alpha.3
done
-skopeo inspect docker://$REG/different-ai/differently-server:0.1.0 | jq -r .Digest
+skopeo inspect docker://$REG/different-ai/differently-server:0.1.0-alpha.3 | jq -r .Digest
```
`global.imageRegistry` replaces only the registry part of each image, so keep
@@ -48,9 +48,9 @@ production.
## 2. Mirror the chart
```sh
-helm package deploy/helm/differently # differently-0.2.0.tgz
-helm push differently-0.2.0.tgz oci://$REG/charts # or copy the .tgz across the gap
-helm show chart oci://$REG/charts/differently --version 0.2.0
+helm package deploy/helm/differently # differently-0.3.0.tgz
+helm push differently-0.3.0.tgz oci://$REG/charts # or copy the .tgz across the gap
+helm show chart oci://$REG/charts/differently --version 0.3.0
```
## 3. Mirror and configure OpenSandbox
@@ -102,7 +102,7 @@ networkPolicy:
```
```sh
-helm install dly oci://$REG/charts/differently --version 0.2.0 -n differently -f values-airgap.yaml
+helm install dly oci://$REG/charts/differently --version 0.3.0 -n differently -f values-airgap.yaml
```
With providers disabled, the server NetworkPolicy has no TCP 443 egress rule;
diff --git a/docs/deploy/day-2.md b/docs/deploy/day-2.md
index 0982ef9..e19c80a 100644
--- a/docs/deploy/day-2.md
+++ b/docs/deploy/day-2.md
@@ -164,7 +164,7 @@ spec:
securityContext: {runAsNonRoot: true, runAsUser: 65532, seccompProfile: {type: RuntimeDefault}}
containers:
- name: migrate
- image: ghcr.io/different-ai/differently-server:0.1.0
+ image: ghcr.io/different-ai/differently-server:0.1.0-alpha.3
args: ["migrate", "--config", "/etc/differently/config.yaml"]
env:
- name: DIFFERENTLY_DATABASE_URL
diff --git a/docs/deploy/kubernetes.md b/docs/deploy/kubernetes.md
index 59f4a45..94ed3e9 100644
--- a/docs/deploy/kubernetes.md
+++ b/docs/deploy/kubernetes.md
@@ -9,7 +9,7 @@ Cloud-specific notes are in [aws.md](aws.md), [gcp.md](gcp.md) and
[bare-metal.md](bare-metal.md).
Status: **documented**. These steps have not been run on a real cluster or
-against a live OpenSandbox server. The chart (version 0.2.0) passes `helm lint`
+against a live OpenSandbox server. The chart (version 0.3.0) passes `helm lint`
and `helm template` locally for the value sets in `deploy/helm/differently/ci/`.
The examples use namespace `differently`, release `dly` and the chart from
diff --git a/docs/deploy/single-vm.md b/docs/deploy/single-vm.md
index 610de48..ab20cb2 100644
--- a/docs/deploy/single-vm.md
+++ b/docs/deploy/single-vm.md
@@ -10,7 +10,7 @@ command that creates the VM differs.
> OpenSandbox 1.2.0 and Differently `v0.1.0-alpha.1`. A sandbox ran within
> about 2 s, and the end-to-end suite passed 12/12 against this setup; with
> a snapshot registry, the ingress gateway and egress policy added
-> (2026-10-29), it passed 14/14. The commands below install `v0.1.0-alpha.2`,
+> (2026-10-29), it passed 14/14. The commands below install `v0.1.0-alpha.3`,
> which has not itself been installed on this setup yet. The AWS, Google
> Cloud and bare-metal commands are the equivalent steps, not yet run there.
@@ -156,7 +156,7 @@ Use the chart and images from the
[latest release](https://github.com/different-ai/differently/releases):
```bash
-VERSION=0.1.0-alpha.2
+VERSION=0.1.0-alpha.3
curl -fsSLO https://github.com/different-ai/differently/releases/download/v$VERSION/differently-$VERSION.tgz
kubectl create namespace differently
@@ -201,7 +201,7 @@ kubectl -n differently port-forward svc/differently-server 8080:8080 &
```
From your laptop, tunnel to it (`ssh -L 8080:localhost:8080 `) and use
-the CLI from the same release (`differently_v0.1.0-alpha.2__.tar.gz`):
+the CLI from the same release (`differently_v0.1.0-alpha.3__.tar.gz`):
```bash
export DIFFERENTLY_URL=http://localhost:8080 DIFFERENTLY_API_KEY="$(cat operator-token)"
diff --git a/docs/maintaining.md b/docs/maintaining.md
index 1c4e096..1f5d2fc 100644
--- a/docs/maintaining.md
+++ b/docs/maintaining.md
@@ -209,8 +209,10 @@ What the releases so far have shown:
(`git tag -s vX.Y.Z-alpha.N -m vX.Y.Z-alpha.N `); the release
workflow takes every version from the tag. `checksums.txt` covers the
binary archives, not the chart.
-- A release prep PR changes the CHANGELOG and the version strings in the
- docs and on the website (`site/src/pages/index.astro`). Merge it and push
+- A release prep PR changes the CHANGELOG, the chart's `appVersion`
+ (`deploy/helm/differently/Chart.yaml`, the image tag a checkout install
+ pulls) and the version strings in the docs and on the website
+ (`site/src/pages/index.astro`). Merge it and push
the tag one after the other, so the website never names a release that
is not published yet.
- `main` follows `pre-release` through a PR titled
diff --git a/site/src/pages/index.astro b/site/src/pages/index.astro
index 9cd9010..8f93e7c 100644
--- a/site/src/pages/index.astro
+++ b/site/src/pages/index.astro
@@ -5,7 +5,7 @@ import { Code } from 'astro:components';
const base = import.meta.env.BASE_URL.replace(/\/$/, '');
const repo = 'https://github.com/different-ai/differently';
const releases = `${repo}/releases`;
-const version = 'v0.1.0-alpha.2';
+const version = 'v0.1.0-alpha.3';
// Launch video slot. Set videoSrc to a video URL (and optionally a poster image and a
// WebVTT captions file) to show it under the hero. While videoSrc is '' nothing renders.