Skip to content

release: sandy 1.6.0 — Debian trixie, Python 3.13, Node 24, Go 1.26 - #136

Merged
rappdw merged 1 commit into
mainfrom
release/1.6.0
Aug 12, 2026
Merged

release: sandy 1.6.0 — Debian trixie, Python 3.13, Node 24, Go 1.26#136
rappdw merged 1 commit into
mainfrom
release/1.6.0

Conversation

@rappdw

@rappdw rappdw commented Aug 12, 2026

Copy link
Copy Markdown
Owner

Cuts v1.6.0. Sets SANDY_VERSION=1.6.0 and adds the release notes.

Why this is a release, not a patch

Every pinned toolchain was on an unsupported or maintenance-only release:

Before After
Debian 12 bookworm — regular security support ended 2026-07-12 13 trixie
Python 3.11 3.13
Go 1.24.1 — EOL major, patch frozen since Mar 2025 1.26, newest patch resolved at build
Node 22 — Maintenance LTS 24 — Active LTS

Plus two additive features (SANDY_EFFORT #115, SANDY_SESSION_NONCE #118) and a real security fix (SANDY_ALLOW_LAN_HOSTS reporting success when iptables had rejected the rule, #119).

The part worth reading twice

The egress proxy's documented monthly --pull refresh had been silently doing nothing since ~Feb 2026. It pinned golang:1.24-bookworm, a floating minor tag, which genuinely delivered 12 patches through Go 1.24.13 — but once 1.24 left the support window there were no further pushes, so the monthly rebuild re-resolved an unchanged digest, refreshing Debian but not the Go stdlib that implements the proxy's TLS/HTTP/CONNECT I/O. Pinning a supported minor is what makes that mechanism work at all.

Upgrade consequences (documented at the top of the notes)

  1. First launch rebuilds every image — several minutes, not a hang
  2. Persistent pip --user packages become invisible to 3.13 (sandy now detects the stale tree and prints the cleanup)
  3. Native Node addons may need npm rebuild (22→24 ABI)
  4. Binaries built inside sandy now link glibc 2.41

.venv overlays are unaffected (uv-managed interpreters). No sandbox needs recreating.

Compat

Additive minor per the CLAUDE.md semver rule — new keys, no retiering or renames, schema_version stays 1. SANDY_SANDBOX_MIN_COMPAT stays 0.7.10: the Python bump moves where pip --user packages live, but the sandbox still works, so this is not a compat-floor event.

Verification

Maintainer host run reported clean: run-tests.sh, run-integration-tests.sh (85/85, with §15 down from 306s to seconds after the warm-up + seed fixes), and a SANDY_SKILL_PACKS=gstack build confirming Playwright's install-deps works on trixie — the one path CI never covers.

Post-merge

Tag v1.6.0 immediately after this merges: for a bare release version _sandy_proxy_ref returns v$SANDY_VERSION with no branch fallback, so until the tag exists a local ./sandy would try to clone a nonexistent ref. Then the GitHub release, then a follow-up bump to 1.6.1-dev.

🤖 Generated with Claude Code

Base-image modernization plus two additive features and a LAN-allowlist fix.
Every pinned toolchain was on an unsupported or maintenance-only release:

- Debian 12 bookworm left regular security support 2026-07-12 -> trixie (13),
  which brings system Python 3.11 -> 3.13. (#133)
- Go 1.24 left its two-release support window entirely, and the pin was a
  Mar-2025 patch untouched for 16 months -> 1.26, with the newest patch now
  resolved at build time instead of frozen. The egress proxy's documented
  monthly --pull refresh had been silently no-op since ~Feb 2026 (no further
  1.24.x pushes existed), so it was refreshing Debian but not the Go stdlib
  implementing its TLS/HTTP/CONNECT I/O; pinning a supported minor restores
  it. Node 22 (Maintenance LTS) -> 24 (Active LTS). (#131)
- SANDY_EFFORT pins Claude Code reasoning effort and records it in the session
  marker, so a run's effort is provable rather than inferred. (#115)
- SANDY_SESSION_NONCE lets an operator pin the attestation nonce so a harness
  can prove a run is the one it launched; env-only, so a committed workspace
  config cannot set it. (#118)
- SANDY_ALLOW_LAN_HOSTS no longer reports success when iptables rejected the
  rule — a silently missing hole is the worst direction to be wrong in. (#119)

Additive minor per the CLAUDE.md semver rule: new keys, no retiering or
renames, introspection schema_version stays 1. SANDY_SANDBOX_MIN_COMPAT stays
0.7.10 — the Python bump moves where pip --user packages live, but the sandbox
still works, so this is not a compat-floor event and no sandbox needs
recreating.

Four user-visible upgrade consequences are documented at the top of
RELEASE_NOTES.md: the first launch rebuilds every image; persistent pip --user
packages become invisible to 3.13 (sandy now detects and reports the stale
tree); native Node addons may need npm rebuild; and binaries built inside sandy
now link glibc 2.41.

Also lands the test-suite work: three macOS-only failures CI structurally
cannot see (#134) — including §68 executing the real sandy binary via a
backtick inside a double-quoted python3 -c string — and per-section timing,
section selection, a fast-model pin, and an image warm-up preflight for the
integration suite (#135).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@rappdw
rappdw merged commit ee9e33b into main Aug 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant