SILO 20261015: Superseded Draft Record
Status: Superseded by Server 20261018. RELEASE.2026-10-15T00-00-00Z was briefly published at 2026-10-15 13:52:28 (UTC+8), then reverted to Draft and superseded by Server 20261018, which includes the complete October repair and component stack. This page archives the candidate source scope and acceptance test results; use 20261018 for all deployments and upgrades.
- Historical tag:
RELEASE.2026-10-15T00-00-00Z - Package version:
20261015000000.0.0 - Candidate source:
7a3ca0f82100cce06289a465f54139da2639f642(full diff against Server 20260916)
Object Lock repairs
- SN-2026-015 — Retention authorization (#234): every
PutObjectRetentionrequest requiress3:PutObjectRetention, evaluated with request-body Object Lock condition keys before reading object state. Shortening, clearing, or changing the mode of activeGOVERNANCEretention additionally requires the explicit bypass header ands3:BypassGovernanceRetention(which does not override aDenyons3:PutObjectRetention). Clearing retention evaluates remaining days as0, and distant future dates no longer saturate duration arithmetic. - SN-2026-016 — Protected version writes (#235): caller-selected write
versionIdparameters require trusted replication credentials (s3:ReplicateObject). Directorynullversions and persisted multipart targets are checked under the destination write lock before overwrite (including uploads initiated before upgrading or recovered from legacy staging state), enforcing activeGOVERNANCE,COMPLIANCE, and legal-hold protections; unreadable lock metadata fails closed. - Release gate (#237): the release workflow runs the Object Lock race regression suite as a build prerequisite, covering slow-body directory overwrites, preflight read failures, legacy multipart completions against
COMPLIANCE, and recovered-upload UUID collisions.
See the security advisory and repair design for full details.
Other changes since 20260916
| Change | User-visible effect |
|---|---|
| #233 | Clear absent fields when decoding reused legacy xl.meta headers and keep scanner update/final responses mutually exclusive (see stale metadata reuse). |
| #225 | Align checksum error messages with AWS S3, including Content-MD5 capitalization. |
| #220 | Fix the inverted TargetIDSet.IsEmpty check for Lambda notification target sets and add regression coverage. |
fa565ec9f |
Upgrade to Go 1.27.2, updated golangci-lint, and golang.org/x/net v0.60.0 across module requirements and pinned Docker build stages. |
Component identities
| Component | Selected version |
|---|---|
| Server | RELEASE.2026-10-15T00-00-00Z (package 20261015000000.0.0) |
| Embedded Console | v2.4.1 (source 1360e26d976d) |
| mcli | RELEASE.2026-09-16T00-00-00Z (source e952aa78f10a) |
| Shared package | github.com/pgsty/silo-pkg/v3 v3.14.1 |
| Upstream S3 SDK | github.com/minio/minio-go/v7 v7.3.1-0.20260915093545-32e1f32cb176 |
| Go toolchain | Go 1.27.2 |
Upgrade requirements
- Upgrade all writers and replication peers: upgrade every Server node and all replication sites accepting S3 writes so unpatched peers cannot accept unauthorized retention changes or in-place overwrites.
- Review retention policies: policies granting
s3:BypassGovernanceRetentionwithouts3:PutObjectRetention, or relying on bypass to evade retention condition keys, now receive403 AccessDenied. - Caller-selected
versionIdrestriction: ordinary S3 writes (including root-signed requests) cannot specify a targetversionId; trusted replication preserves version IDs, andmcli batch replicateinto SILO requiress3:ReplicateObjecton the destination credentials. - Fail-closed lock checks: locked directory objects and locked multipart targets cannot be overwritten; if lock metadata is unreadable, restore drive health before retrying.
- Audit historical state: review prior audit logs for unexpected retention changes before the upgrade (when upgrading from releases prior to 20260916, also follow the September upgrade requirements).
Candidate artifact acceptance
The following CI workflows and verification checks passed against 7a3ca0f82100cce06289a465f54139da2639f642:
| Check | Result | Workflow run |
|---|---|---|
| Main Go CI | Passed | Run 38686240587 |
| Vulnerability check (VulnCheck) | Passed | Run 38686240625 |
| Release build and Object Lock gate | Passed | Run 38686425467 |
| Finalize release packages | Passed | Run 38687734395 |
- Static artifact verification: verified all 36 release assets, 34 build provenance attestations, static version/commit identities across all 6 Linux/macOS/Windows
amd64/arm64binaries, payloads across all 6 RPM/DEB/APK packages, and both RPM signatures (see historical archive checksums and package checksums). - macOS arm64 runtime acceptance (110/110 passed):
| Scenario | Passed |
|---|---|
| Fresh installation, full Object Lock API suite | 49/49 |
| In-place upgrade over data created by the official 20260916 binary | 12/12 |
| Full Object Lock API suite after upgrade | 49/49 |
(Across those runs, all 65 rejected operations left the complete target object state unchanged; Windows and macOS amd64 binaries were verified statically.)
Docker images
Docker publication run 38689158028 built and attested the multi-platform (linux/amd64 and linux/arm64) images from the same release commit:
| Variant | Version tag | Multi-platform index digest |
|---|---|---|
| Classic | RELEASE.2026-10-15T00-00-00Z |
sha256:aaac6bce13eb99316b3c88bd20143fc3c38ab607585256a411a095c44ee57f62 |
| Distroless | RELEASE.2026-10-15T00-00-00Z-distroless |
sha256:70cac541c5a928be5cd16d6b8732d85ac06e891a0e3d9956a745381330692fc6 |
All four platform-specific images (whose /usr/bin/silo binaries matched the official Linux archive binaries byte for byte) passed /minio/health/ready probes and the full Object Lock API suite (196/196 passed, with all 120 rejected operations preserving object content, version identity, ETag, retention, legal hold, and version listings):
| Image | Runtime environment | API checks | Binary comparison |
|---|---|---|---|
Classic linux/arm64 |
Native ARM64 on Docker Desktop ARM64 | 49/49 | Byte-identical to Linux arm64 archive |
Classic linux/amd64 |
AMD64 emulation on Docker Desktop ARM64 | 49/49 | Byte-identical to Linux amd64 archive |
Distroless linux/arm64 |
Native ARM64 on Docker Desktop ARM64 | 49/49 | Byte-identical to Linux arm64 archive |
Distroless linux/amd64 |
AMD64 emulation on Docker Desktop ARM64 | 49/49 | Byte-identical to Linux amd64 archive |
Combined with the native macOS arm64 installation and upgrade suite, candidate runtime acceptance passed 306/306 checks.