Releases: jmagly/agentic-sandbox
v2026.5.17
[2026.5.17] — 2026-05-24
Release-critical CI runner hardening patch. This release supersedes v2026.5.16, whose signed tag was pushed but whose tag CI failed before repository checkout because the
teroknorDocker runner could not pulldocker.gitea.com/runner-images:ubuntu-latestfor the pre-release validation job. It keeps the v2026.5.16 documentation sync and moves release-critical tag jobs onto the already-proventitanrelease runner.
Fixed
- Release-critical jobs no longer depend on the teroknor Docker runner image pull (#369):
prerelease-gate,release-binaries-mutsu,release-attach, andgithub-release-syncnow run ontitan, matching the build/test/docker/E2E release lane that was already active in the same tag pipeline. The non-blocking security scan remains onteroknorwithcontinue-on-error: true.
Documentation
- Release announcement:
docs/releases/v2026.5.17.mddocuments the blocked v2026.5.16 tag, the release workflow hardening, and the superseding release path.
Operator notes
agentic-mgmt,sandboxctl, andagent-clientbump to2026.5.17.- v2026.5.16 is superseded: the tag was signed and pushed to both Gitea and GitHub, but tag CI run 639 failed before checkout in
Pre-release Validationdue to an upstream runner image pull HTTP 500. Do not treat v2026.5.16 as the clean published release. - No runtime behavior change beyond v2026.5.16: this patch carries the documentation sync from v2026.5.16 plus release workflow hardening so publication can run from a fixed tagged commit.
- Release publication gate remains intact: Gitea release attachment, crates.io publication, GitHub release mirroring, and public registry mirroring still wait for release-blocking tag CI and E2E.
Issues closed
- #369 - release-critical tag jobs depend on teroknor docker runner image pull.
- #370 - prepare v2026.5.17 to supersede blocked v2026.5.16 tag.
v2026.5.3
First artifact-bearing release. This is the release the v2026.5.1 and v2026.5.2 source-only notices pointed at. The release pipeline now produces versioned binary tarballs (x86_64-linux-gnu + x86_64-linux-musl + aarch64-apple-darwin + aarch64-unknown-linux-gnu) with SHA256SUMS, version-stamped container images, and (when operator secrets are provisioned) cargo publish, multi-registry push, SBOM, and signed artifacts. CI is green on
titan/teroknor/mutsu— never on the workstation runner.
Release pipeline went from "creates a release page in 3 seconds, no artifacts" to a full multi-architecture build with explicit gates. The bulk of this release is CI work, plus one runtime-visible dependency swap (rustls).
Highlights
| What changed | Why you care |
|---|---|
| Release pipeline produces real artifacts | Tag push → prerelease-gate validates → 4 platform builds run in parallel → tarballs + SHA256SUMS attach to the Gitea release. Aarch64 builds happen on a Mac Mini via SSH-from-Linux-runner. |
| HTTP + WebSocket stacks switched to rustls | reqwest and tokio-tungstenite no longer pull native-tls / system OpenSSL. Pure-Rust TLS stack; cleanly cross-compiles. No runtime behavior change for clients. |
| CI runner re-routing | Every workflow job now targets titan (heavy build) or teroknor (light/network) by explicit label. Zero runs-on: self-hosted remains — workstation runners stop receiving CI work. |
| Per-release container tags | Internal registry now carries :v<version> tags on every release alongside :latest and :<sha>. Pinning to a release is finally possible. |
| Single-shot version bump tooling | scripts/bump-version.sh <version> updates 3 Cargo.toml + 3 Cargo.lock + inserts new CHANGELOG section + footer link in one command. Replaces the manual edit dance. |
Added
release-binariesmatrix inci.yaml(#297) — tag-only job that buildsagentic-mgmt,agent-client,sandboxctlforx86_64-unknown-linux-gnu(full set), andagent-client+sandboxctlforx86_64-unknown-linux-musl(themanagementcrate is excluded for musl —agentic-mgmthard-links to system libvirt and no musl-compatible libvirt sysroot exists; same exclusion as aarch64-linux). Packages each asagentic-sandbox-vX.Y.Z-<arch>-<libc>.tar.gz, generates per-file.sha256sidecars plus an aggregatedSHA256SUMS, uploads as workflow artifacts.release-binaries-mutsujob —aarch64-apple-darwin(native Mac build) andaarch64-unknown-linux-gnu(cross-compiled viacargo-zigbuild) built by SSHing from a Linux runner to mutsu (Apple M4). Matches the provenfortemi/publish-sidecar.ymlpattern; avoids the known reverse-proxy / gRPC task-fetch failure mode of nativeruns-on: mutsu. Gated onMUTSU_SSH_KEYsecret with skip-with-warning when absent. Both mutsu tarballs excludeagentic-mgmt— it hard-links to libvirt via thevirtFFI crate, and neither macOS nor aarch64-linux has a usable libvirt sysroot on the build host. Tarballs include aMGMT_EXCLUDED.txtnote.release-attachjob — consolidates release creation intoci.yaml. Downloads matrix artifacts, aggregates a canonicalSHA256SUMS, re-verifies Cargo + CHANGELOG (defense-in-depth), creates the Gitea release, attaches every tarball + checksum file as release assets. Replacesgitea-release.yaml(deleted).prerelease-gatejob (#295) — verifies all threeCargo.tomlversions match the tag base ANDCHANGELOG.mdhas a matching## [<version>]section. Tag-only; gatesrelease-binariesandrelease-binaries-mutsu.:v<version>container tags (#305) —dockerjob now emits:latest,:<sha>, AND:v<version>on tag pushes for all 6 images (mgmt, agent-client, agent, claude, codex, opencode).tags: ['v*']added toci.yamltriggers (#304) — the full pipeline now runs against the tag commit, not just the prior branch commit.cargo-publishjob (#296, secret-gated) — publishesagent-rs,management,clito crates.io in dep order with--dry-runfirst. Skip-with-warning whenCARGO_REGISTRY_TOKENnot configured.multi-registry-pushjob (#299, secret-gated per registry) — mirrors all 6 release-tagged images toghcr.io/<owner>/*andquay.io/<user>/*. Each registry gates independently on its credentials.sign-and-sbomjob (#300, secret-gated per capability) — GPG-signs binary tarballs (.ascdetached), cosign-signs container images, generates per-tarball SBOM (CycloneDX via syft). Each capability gates independently.github-release-syncjob (#306, secret-gated) — idempotentgh release create/editmirroring the Gitea release tojmagly/agentic-sandboxwith tarballs + notes.scripts/bump-version.sh(#301) — CalVer validation (no leading zeros), dirty-tree refusal, idempotency check, updates 3 Cargo.toml + 3 Cargo.lock, inserts new CHANGELOG section with placeholders, updates Unreleased compare-link and inserts the new version's compare-link.docs/releases/runbook.md— end-to-end release procedure with required-secrets table, rollback procedure, and runner-assignment table.docs/architecture/release-pipeline-audit.md— full inventory of every.gitea/workflows/*.{yml,yaml}workflow, ASCII diagram of the tag-push flow, 4-phase remediation plan, and acceptance criteria for a "fixed" pipeline.docs/architecture/aarch64-build-runner-plan.md— mutsu (Mac Mini) inventory, three architectural options (native Mac + cross-build / Linux VM on Mac / port runtime to macOS), recommendation, and bootstrap procedure.- Ubuntu 24.04.3 pinned in
iso-pins.json— sha256 verified against the GPG-signedSHA256SUMSfromreleases.ubuntu.com.
Changed
- HTTP client stack:
reqwestswitched fromnative-tlstorustls(#311, commitc39c6c9).cli,management, andagentic-sandbox-executornow usereqwest = { default-features = false, features = ["json", "rustls-tls"] }. tonic 0.12'stlsfeature was already rustls-backed — no change there. - WebSocket client:
tokio-tungsteniteswitched fromnative-tlstorustls-tls-webpki-roots(commitc39c6c9). Drops the implicit system OpenSSL dep that blocked aarch64-linux cross-compile. agentic-sandbox-executorpinsopenssl = { version = "0.10", features = ["vendored"] }(commit8c03411) — josekit hard-depends on openssl for JOSE primitives. The vendored feature compiles OpenSSL from source as part of the build (~30s overhead per cold build), which letscargo zigbuildcross-compile cleanly to aarch64-linux.- All CI workflows re-routed off
runs-on: self-hosted(commit898bad7). Every job in every workflow file now targetstitan(heavy: build, docker, e2e, cosign) orteroknor(light: validation, network, SSH out) by explicit label. The workstation runner (grissom) is excluded from CI by design. gitea-release.yamldeleted — its responsibility is nowrelease-attachinsideci.yaml. Single linear workflow instead ofworkflow_runcross-workflow handoff.executor-build.ymldeleted (#308) —Makefile test-unitupdated tocargo test --workspaceso executor-crate coverage flows through normalci.yaml test.docsite-deploy.ymlpush.tags: ['v*']trigger re-enabled (#307) with secret guards on every step; missing secrets → skip with warning.- Lint job moved from
teroknortotitan(commit2ec9f4e) —cargo fmt --checkneeds the Rust toolchain. - E2E job conditional:
if: false— skipped on every push (branch AND tag) until #312 ships and the Ubuntu 24.04 qcow2 is staged on titan. This is a temporary workaround so v2026.5.3 (and any patch releases between now and #312) can ship without the broken-bootstrap blocker. When #312 lands, restore: firstif: startsWith(github.ref, 'refs/tags/v')for a tag-only gate, then drop theif:entirely. - README + getting-started clone URL switched to the GitHub mirror in v2026.5.2; carried forward here.
Fixed
build/dockerskip-on-branch regression (commit6928b7d) — Phase 1 (#295) addedprerelease-gateto theirneeds:list.prerelease-gateis tag-only, and Gitea/GitHub Actions propagate skipped needs as skips downstream. Removedprerelease-gatefrombuildanddocker; the release-* jobs that genuinely need the gate (and are themselves tag-only) keep it.actions/setup-python@v5.6.0has no prebuilt for Ubuntu 25.10 (titan's OS, commite5497e5). Dropped the action; e2e now uses titan's system Python 3.13 in a/tmp/e2e-venvvenv (PEP 668 compliant).pin-iso.shfingerprint regex (commit5af3b88) — gpg formats the 40-char fingerprint as two halves of 5 hex-groups separated by two spaces (e.g.B374 2BC0). The original([A-F0-9]{4} ){9}[A-F0-9]{4}regex required single spaces and silently captured an emptysigner_fp, causing the script to abort without writing the pinned sha256.release-binariespackaging step: honors$CARGO_TARGET_DIR(set on mutsu via launchd env) when present; falls back to per-crate<crate>/target/otherwise. Usessha256sum 2>/dev/null || shasum -a 256so macOS (no GNUsha256sum) works alongside Linux.
Documentation
- New:
docs/releases/runbook.md,docs/architecture/release-pipeline-audit.md,docs/architecture/aarch64-build-runner-plan.md(see Added). docs/releases/runbook.mdextended with a CI runner assignments table mapping each runner to the work it gets (titanfor heavy,teroknorfor light,grissomexplicitly excluded) and a Required secrets table mapping each secret to the job it activates.docs/architecture/release-pipeline-audit.mdPhase 1-4 status flipped to landed with per-issue commit references.docs/architecture/aarch64-build-runner-plan.mdupdated to reflect the switch from native act_...