Releases: aerol-ai/microvm
Release list
v0.7.23 — golang.org/x/net 0.57.0
Dependency bump since v0.7.22.
Highlights:
- golang.org/x/net
0.56.0→0.57.0(PR #349). - opencontainers/runtime-spec briefly landed at
1.3.0(PR #355) then was pinned back to1.2.0— no net change from v0.7.22.
No API / boot-path / cluster changes.
What's Changed
- chore(deps): bump golang.org/x/net from 0.56.0 to 0.57.0 by @dependabot in #349
- chore(deps): bump github.com/opencontainers/runtime-spec from 1.2.0 to 1.3.0 by @dependabot in #355
- chore(deps): downgrade github.com/opencontainers/runtime-spec from v1.3.0 to v1.2.0
Full Changelog: v0.7.22...v0.7.23
What's Changed
- chore(deps): bump github.com/opencontainers/runtime-spec from 1.2.0 to 1.3.0 by @dependabot[bot] in #355
- chore(deps): bump golang.org/x/net from 0.56.0 to 0.57.0 by @dependabot[bot] in #349
Full Changelog: v0.7.22...v0.7.23
v0.7.22 — reconcile re-inspect before reap (UC-20) + docs Workers build
Post-v0.7.21: stop reconcile from reaping healthy sandboxes on a stale ListManaged snapshot, and unbreak the Cloudflare Workers docs build after the astro 7 bump.
Highlights:
- UC-20 reconcile guard (PR #360) — before deleting a store row + cluster FSM placement on "container gone", re-Inspect that container. A mid-adopt / mid-start Inspect blip in containerd's bulk ListManaged no longer looks like a durable death (fixes intermittent cross-node snapshot 404). Genuine Inspect miss still reaps as before.
- Docs Workers build (PR #362) — Starlight ^0.41.4 (astro ^7 peer), Node >=22.12 pin, cross-platform
package-lockregenerate sonpm cion Linux gets@emnapi/ sharp / esbuild natives. - itest reliability (#359) —
stage_wasmwaits for each node'scloud-initbefore restarting sandboxd; hyperparam-farm retries transient capacity rejections.
What's Changed
- fix(itest): make cluster-mixed-benchmark-with-obs reliable (staging race + hyperparam retry) by @sumansaurabh in #359
- fix(service): reconcile re-inspects a container before reaping its row (UC-20) by @sumansaurabh in #360
- fix(docs): bump Starlight to 0.41 for astro 7 compat (fixes Workers build) by @sumansaurabh in #362
Full Changelog: v0.7.21...v0.7.22
What's Changed
- fix(itest): make cluster-mixed-benchmark-with-obs reliable (staging race + hyperparam retry) by @sumansaurabh in #359
- fix(docs): bump Starlight to 0.41 for astro 7 compat (fixes Workers build) by @sumansaurabh in #362
- fix(service): reconcile re-inspects a container before reaping its row (UC-20) by @sumansaurabh in #360
Full Changelog: v0.7.21...v0.7.22
v0.7.21 — containerd snapshot push :latest fallback (UC-21)
Post-v0.7.20: fix cross-node create-from-snapshot on the containerd engine, plus harness/sim reliability.
Highlights:
- UC-21 snapshot push (PR #358) —
livePushnow tries[source, source:latest]for tagless refs (same fallback as create/pull). CreateSnapshot commits<name>:latest, but the reconciler passed bare<name>; containerdGetImageis exact-match, so every cluster snapshot push failed withimage not foundand derived creates on other nodes never got the image from AOCR. Single-node was unaffected. Idempotency / boot-path unchanged. - SLESS-01 (PR #357) — serverless-wake sim prefixes
/http-echoinContainerCommandargv[0] (bare flags were exec'd as the program). - Bench — tighter per-sample teardown in
TestBenchCreateLatencyso multi-runtime sweeps don't starve placement. - Dependabot: astro 7, setup-go/node 7, containerd/api, sqlite3, x/sys, docs fonts/tailwind, tsx.
What's Changed
- fix(sims): serverless-wake http-echo needs binary in argv[0] (SLESS-01) by @sumansaurabh in #357
- fix(containerd): snapshot push resolves the :latest-tagged local image (UC-21) by @sumansaurabh in #358
- chore(deps): bump actions/setup-node from 6 to 7 by @dependabot in #345
- chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 by @dependabot in #346
- chore(deps): bump actions/setup-go from 6 to 7 by @dependabot in #347
- chore(deps): bump @fontsource/ibm-plex-sans-condensed in /docs by @dependabot in #348
- chore(deps): bump tailwindcss from 4.3.2 to 4.3.3 in /docs by @dependabot in #350
- chore(deps-dev): bump tsx from 4.22.4 to 4.23.1 in /sdk/typescript by @dependabot in #351
- chore(deps): bump @fontsource/space-mono from 5.2.9 to 5.3.0 in /docs by @dependabot in #352
- chore(deps): bump github.com/containerd/containerd/api by @dependabot in #353
- chore(deps): bump github.com/mattn/go-sqlite3 from 1.14.47 to 1.14.48 by @dependabot in #354
- chore(deps): bump astro from 6.4.8 to 7.1.3 in /docs by @dependabot in #356
Full Changelog: v0.7.20...v0.7.21
What's Changed
- fix(sims): serverless-wake http-echo needs binary in argv[0] (SLESS-01) by @sumansaurabh in #357
- chore(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in #345
- chore(deps): bump golang.org/x/sys from 0.46.0 to 0.47.0 by @dependabot[bot] in #346
- chore(deps): bump @fontsource/ibm-plex-sans-condensed from 5.2.8 to 5.3.0 in /docs by @dependabot[bot] in #348
- chore(deps): bump github.com/mattn/go-sqlite3 from 1.14.47 to 1.14.48 by @dependabot[bot] in #354
- chore(deps): bump github.com/containerd/containerd/api from 1.8.0 to 1.11.1 by @dependabot[bot] in #353
- chore(deps): bump @fontsource/space-mono from 5.2.9 to 5.3.0 in /docs by @dependabot[bot] in #352
- chore(deps-dev): bump tsx from 4.22.4 to 4.23.1 in /sdk/typescript by @dependabot[bot] in #351
- chore(deps): bump tailwindcss from 4.3.2 to 4.3.3 in /docs by @dependabot[bot] in #350
- chore(deps): bump actions/setup-go from 6 to 7 by @dependabot[bot] in #347
- fix(containerd): snapshot push resolves the :latest-tagged local image (UC-21) by @sumansaurabh in #358
- chore(deps): bump astro from 6.4.8 to 7.1.3 in /docs by @dependabot[bot] in #356
Full Changelog: v0.7.20...v0.7.21
v0.7.20 — containerd netns loopback + bench/sim hardening
Post-v0.7.19 fixes for containerd localhost networking and investor-bench reliability.
Highlights:
- containerd netns loopback —
Host.Realizebringsloup before CNI ADD. Fresh namespaces left loopback DOWN (bridge-only CNI), so127.0.0.1/ localhost TCP timed out in every containerd sandbox even when a service bound0.0.0.0. Cold create + warm-pool refill both go through this path. - SVC-01 postgres sim — TLS expose probes use
PublicURLwhenHostPortis 0 (no moredial tcp :0); init readiness pollsSELECT 1until first-bootinitdbfinishes. - UC-94 bench — destroy each runtime's sandboxes before the next so a 6×10 sweep doesn't pin ~60 sandboxes and starve tail runtimes (
no worker placement target).
Fragile area: TAP/netns allocator — regression coverage for the lo up call and failure cleanup.
What's Changed
- fix(netns): bring loopback up in containerd sandbox netns
- fix(sims): postgres-supabase TLS expose probe + init readiness (SVC-01)
- fix(bench): tear down each runtime's sandboxes before the next (UC-94)
Full Changelog: v0.7.19...v0.7.20
Full Changelog: v0.7.19...v0.7.20
v0.7.19 — containerd warm-adopt readiness attribution (UC-96)
Fix
containerd: attribute warm-adopt readiness to the unix socket (ee00f35)
A create that adopted a warm-pool (parked) container recorded the
containerd_pool hit stage but no readiness source, so its Server-Timing
header carried no readiness;desc= entry — UC-96 / UC-96c (gVisor) /
UC-96d read source="" and failed on the pool image, while a cold create
(pool miss) correctly reported socket.
ParkedListener.Adopt waits for the toolbox's ready-ack under the new
sandbox identity — the same unix-socket readiness handshake the cold path
uses — so attributing socket is honest (the agent is genuinely serving;
an immediate exec after create succeeds). This brings containerd to parity
with the docker driver, which already did this.
No boot-path latency impact (one nil-safe in-memory field set on the
pool-hit path); regression test added.
Full Changelog: v0.7.18...v0.7.19
v0.7.18 — isolate JS-bundle cluster replication + obs/bench hardening
Post-v0.7.17 follow-ups: isolate works cluster-wide via JS-bundle peer replication, plus obs-box and benchmark-matrix hardening so D2/D10 actually populate.
Highlights:
- JS-bundle replication — upload fans out to live peers (
X-Cluster-Bundle-Replicatedloop guard + owner preservation). Create-hot-path stays a local store lookup. Best-effort (down peer only logs); no-op whenEnableCluster=false. Fixes"resolve bundle: bundle not found"when create lands on a different node than upload. - Obs box — dashboards embedded as raw JSON (under EC2 16KB
user_datalimit); Pushgateway URL/SG now operator-reachable so D2 gets pushed percentiles. - Bench matrix — separate
gvisor-coldrow (hot vs cold, not one blended number); sim failures isolated so one Fatal can't abort the whole catalogue pass; Pushgateway heartbeats are fire-and-forget with a one-strike breaker (dead endpoint no longer stalls ~730s).
Cluster-correctness: no FSM/Raft/placement change; replication is idempotent (content-addressed) and loop-safe. Boot-path: create-hot-path resolver untouched.
What's Changed
- fix(obs): embed dashboards as raw JSON to stay under EC2 16KB user_data limit
- fix(obs): Pushgateway must be operator-reachable (D2 matrix was empty)
- refactor(grafana): update D2 capability matrix panels for clarity and functionality
- feat(cluster): replicate JS bundles to peers so isolate works cluster-wide
- bench(benchmark-obs): add gvisor-cold row (hot + cold, not one blended number)
- fix(sims): isolate each sim so one failure can't abort the whole use-case pass
- fix(bench): make sim Pushgateway heartbeat fire-and-forget
Full Changelog: v0.7.17...v0.7.18
Full Changelog: v0.7.17...v0.7.18
v0.7.17 — investor benchmark + observability program
Investor / HN-launch benchmark + observability program (PR #344): mixed + hetero AWS scenarios with a dedicated Prometheus/Grafana/Pushgateway obs box, 11 Grafana dashboards, a 297-row Q&A catalogue, and scrapeable create-stage / warm-pool metrics.
Highlights:
- New scenarios:
cluster-mixed-benchmark-with-obs(correctness/connectivity) andcluster-hetero-benchmark-with-obs(T7 metal flagship soak). - Create-stage latency histogram (
aerolvm_create_stage_latency_seconds_bucket) + wasm/isolate warm-pool metrics;aerolvm_sandboxes_by_runtimefor per-isolation live counts. - Containerd warm task pool deepened for tight warm p99 on the bench path; warm + cold containerd rows in latency reports.
- Dashboard fixes: sandboxd SLO datasource, per-isolation breakdown (D9/D1), cold-path efficiency panels (D4).
Boot-path note: RecordStage now exports ~10–15 stages/create (~150 ns/stage, after the create lock). No API surface change.
What's Changed
- chore(deps): bump github.com/hashicorp/memberlist from 0.5.4 to 0.6.0 by @dependabot in #317
- chore(deps-dev): bump @types/node from 26.1.0 to 26.1.1 in /sdk/typescript by @dependabot in #313
- chore(deps): bump com.fasterxml.jackson:jackson-bom from 2.22.0 to 2.22.1 in /sdk/java by @dependabot in #312
- test(isolate): AWS integration-harness coverage + create-latency benchmark by @sumansaurabh in #341
- docs: refresh README and MDX for isolate runtime + UC-94 latency by @sumansaurabh in #342
- docs: quote containerd UC-94 latency as the default OCI path by @sumansaurabh in #343
- feat(benchmark-obs): investor benchmark + observability program (mixed + hetero scenarios, Grafana, 297-row catalogue) by @sumansaurabh in #344
Full Changelog: v0.7.16...v0.7.17
What's Changed
- chore(deps): bump github.com/hashicorp/memberlist from 0.5.4 to 0.6.0 by @dependabot[bot] in #317
- chore(deps-dev): bump @types/node from 26.1.0 to 26.1.1 in /sdk/typescript by @dependabot[bot] in #313
- chore(deps): bump com.fasterxml.jackson:jackson-bom from 2.22.0 to 2.22.1 in /sdk/java by @dependabot[bot] in #312
- test(isolate): AWS integration-harness coverage + create-latency benchmark by @sumansaurabh in #341
- docs: refresh README and MDX for isolate runtime + UC-94 latency by @sumansaurabh in #342
- docs: quote containerd UC-94 latency as the default OCI path by @sumansaurabh in #343
- feat(benchmark-obs): investor benchmark + observability program (mixed + hetero scenarios, Grafana, 297-row catalogue) by @sumansaurabh in #344
Full Changelog: v0.7.16...v0.7.17
v0.7.16 — isolate per-sandbox egress attribution
Flips isolate egress from fail-closed deny-all (v0.7.15) to enforced per-sandbox allowlists via a per-slot workerd service pool (PR #340).
Still off by default (SB_ENABLE_ISOLATE=false) — activates nothing until an operator opts in.
Highlights:
- Group config pre-declares
Kper-slot egress services (EGRESS_0..); each egressing sandbox gets a slot and bindsglobalOutboundto that static service only — attribution is structural and unforgeable. - Pool size via
SB_ISOLATE_EGRESS_POOL_SIZE(default 64). Exhaustion / bind failure falls back to fail-closedEGRESS_DENY(logged, never silent). - SSRF IP-block retained (loopback / link-local / RFC1918 / metadata). Outbound is always HTTPS at the host proxy.
Known limitations (safe by default): concurrent egress-enabled isolates per tenant capped by pool size; no per-sandbox byte metering yet; plaintext-HTTP-only destinations unreachable. Jail/hardening follow-ups from v0.7.15 still apply.
What's Changed
- feat(isolate): per-sandbox egress attribution via per-slot service pool by @sumansaurabh-slice in #340
- chore(deps): bump github.com/containerd/containerd from 1.7.29 to 1.7.34 in #321
- chore(deps): bump github.com/containerd/typeurl/v2 from 2.1.1 to 2.3.0 in #322
- chore(deps): bump oras.land/oras-go/v2 from 2.6.1 to 2.6.2 in #323
- chore(deps): bump github.com/vishvananda/netlink from 1.3.0 to 1.3.1 in #315
- chore(deps): update tokio-tungstenite requirement from 0.29 to 0.30 in /sdk/rust in #318
- chore(deps-dev): bump org.junit.jupiter:junit-jupiter from 6.1.1 to 6.1.2 in /sdk/java in #320
- chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 in /sdk/typescript in #316
- chore(deps-dev): bump prettier from 3.9.4 to 3.9.5 in /docs in #319
- chore(deps): bump typescript from 5.9.3 to 7.0.2 in /docs in #314
Full Changelog: v0.7.15...v0.7.16
What's Changed
- feat(isolate): per-sandbox egress attribution via per-slot service pool by @sumansaurabh in #340
- chore(deps): bump oras.land/oras-go/v2 from 2.6.1 to 2.6.2 by @dependabot[bot] in #323
- chore(deps): bump github.com/containerd/typeurl/v2 from 2.1.1 to 2.3.0 by @dependabot[bot] in #322
- chore(deps): bump github.com/containerd/containerd from 1.7.29 to 1.7.34 by @dependabot[bot] in #321
- chore(deps): update tokio-tungstenite requirement from 0.29 to 0.30 in /sdk/rust by @dependabot[bot] in #318
- chore(deps-dev): bump prettier from 3.9.4 to 3.9.5 in /docs by @dependabot[bot] in #319
- chore(deps-dev): bump org.junit.jupiter:junit-jupiter from 6.1.1 to 6.1.2 in /sdk/java by @dependabot[bot] in #320
- chore(deps-dev): bump typescript from 6.0.3 to 7.0.2 in /sdk/typescript by @dependabot[bot] in #316
- chore(deps): bump github.com/vishvananda/netlink from 1.3.0 to 1.3.1 by @dependabot[bot] in #315
- chore(deps): bump typescript from 5.9.3 to 7.0.2 in /docs by @dependabot[bot] in #314
Full Changelog: v0.7.15...v0.7.16
v0.7.15 — V8-isolate runtime (workerd), off by default
Adds the 5th AerolVM runtime: V8-isolate (runtime: "isolate") backed by Cloudflare workerd, Phases 1–3 (PR #302).
Off by default (SB_ENABLE_ISOLATE=false; Terraform/install.sh WITH_ISOLATE=false) — activates nothing until an operator opts in.
Highlights:
- Content-addressed JS/TS bundle store +
POST /v1/js-bundlesupload catalogue; one workerd process per isolate group, dynamic per-id loading. isolateruntime +tenant_idacross all 5 SDKs; isolate health in/health.- Pre-merge review pass fixed the globalOutbound serve bug (isolates now serve), fail-closed jail, per-owner tenant grouping, group teardown/join race, egress SSRF IP-block, and more.
Known limitations (safe by default): egress is deny-all pending the §4 per-sandbox attribution redesign; the jail is fail-closed with priv-drop/chroot on Linux (seccomp/cgroup + real-host validation are follow-ups). Not yet a hardened boundary for untrusted multi-tenant code.
What's Changed
- feat(isolate): V8-isolate runtime (workerd) — Phases 1–3, off by default by @sumansaurabh-slice in #302
Full Changelog: v0.7.14...v0.7.15
v0.7.14 — gVisor works under the containerd engine
gVisor on the containerd engine — fixed and benchmarked
The first live run of runtime: "gvisor" on a containerd-engine cluster surfaced three stacked driver bugs that made every runsc create fail or hang. All fixed and live-validated in this release:
- Shim options wire type: the driver now passes containerd's well-known
runtimeoptions/v1.Options(TypeUrl: io.containerd.runsc.v1.options) — the previous custom typeurl was rejected by the shim's registry, failing every task create. - CRI sandbox annotation: every runsc container spec now carries
io.kubernetes.cri.container-type=sandbox. Without it the gvisor shim treats the container as a pod sub-container and deadlocks in task create (reproducible with plainctron containerd 1.7 and 2.x — the shim only supports the CRI classification path). - runsc config: the driver writes the
[runsc_config]section the shim actually parses (the old[runscflags]was silently ignored, so--host-uds=opennever reached runsc and the readiness socket push could not work), and rewrites stale configs on upgrade instead of keeping them forever. - Installer:
install.sh --with-gvisornow also installscontainerd-shim-runsc-v1(SHA-512-verified). Previously only dockerd got the runsc registration, so containerd-engine nodes had no shim binary at all.
Benchmarks (new)
make integration-benchmark-gvisor (containerd engine) and make integration-benchmark-gvisor-docker (docker engine, new A/B scenario). Server-side create latency, 3× t3.medium, 10 samples, 0 failures:
| engine | p50 | p90 | p99 |
|---|---|---|---|
| containerd | 284ms | 330ms | 346ms |
| docker | 389ms | 2190ms* | 2237ms* |
*docker tail = cold image pulls, not runsc. gVisor's isolation premium over runc on the same engine is ~+95–120ms at p50.
🤖 Generated with Claude Code
Full Changelog: v0.7.13...v0.7.14