Problem and current evidence
The documented MinIO Client workflow says mc cat prints an uploaded object, but it failed in the 22 September 2026 MVP validation of v0.1.0-beta.1 (c21017aa36400e2b2c2f92c62b2dc9af0098c136). mc ls, mc stat, and mc cp upload succeeded. mc cat on a 128 KiB object exited 1 with Last-Modified time format is invalid and returned zero bytes. AWS CLI downloaded that same object with the expected SHA-256. rclone also read object bytes correctly, but reported Failed to read last modified.
This is a client compatibility failure on a documented core download path, not evidence of lost object data. The tested MinIO Client was RELEASE.2026-09-19T15-24-59Z; the S3 endpoint was SynapS3, with no AWS S3 service involved.
Reproduce
With a SynapS3 bucket and mc alias configured as in docs/en/getting-started/s3-clients.md, upload an object of at least 127 bytes:
mc cp fixture.bin synaps3/demo/fixture.bin
mc stat synaps3/demo/fixture.bin
mc cat synaps3/demo/fixture.bin > downloaded.bin
Expected: the final command exits 0 and downloaded.bin matches fixture.bin. Observed on the release: it exits 1 with the error above and produces an empty file.
Likely implementation seam
At current main (f9efc927612e348f3e33cf96da6bb29e0502f905), internal/app/runtime.go serves S3 through VersityGW and internal/backend/object.go constructs its GetObjectOutput. That output omits LastModified, while HeadObjectOutput includes it. internal/objectreader/reader.go already supplies the stored version's LastModified for both cache and provider reads. Capture the actual GET and HEAD response headers to confirm the wire-level cause before changing the response.
Scope and completion
- Add a failing regression check at the S3 HTTP boundary for a valid
Last-Modified header on GET, including a specific versionId; compare it with HEAD at HTTP-date precision. Existing backend tests in internal/backend/object_test.go and the tests/system harness are possible places to extend.
- Correct the shared GET response path so both cached and provider-backed reads return metadata for the version actually served. Keep the existing streaming body and read fallback behavior.
- Re-run the documented MinIO Client upload and
mc cat download with matching SHA-256, including a read after cache eviction. Confirm rclone reads matching bytes without the last-modified warning.
- Recheck
docs/en/getting-started/s3-clients.md, docs/zh/getting-started/s3-clients.md, and the English and Chinese S3 compatibility matrices. Update them only if the verified behavior or instructions differ. Run the relevant Go tests and the repository's make verify-fast PR check.
Out of scope: Filecoin storage or replica repair, unrelated S3 API extensions, and a broader client compatibility audit.
Problem and current evidence
The documented MinIO Client workflow says
mc catprints an uploaded object, but it failed in the 22 September 2026 MVP validation ofv0.1.0-beta.1(c21017aa36400e2b2c2f92c62b2dc9af0098c136).mc ls,mc stat, andmc cpupload succeeded.mc caton a 128 KiB object exited 1 withLast-Modified time format is invalidand returned zero bytes. AWS CLI downloaded that same object with the expected SHA-256. rclone also read object bytes correctly, but reportedFailed to read last modified.This is a client compatibility failure on a documented core download path, not evidence of lost object data. The tested MinIO Client was
RELEASE.2026-09-19T15-24-59Z; the S3 endpoint was SynapS3, with no AWS S3 service involved.Reproduce
With a SynapS3 bucket and
mcalias configured as indocs/en/getting-started/s3-clients.md, upload an object of at least 127 bytes:mc cp fixture.bin synaps3/demo/fixture.bin mc stat synaps3/demo/fixture.bin mc cat synaps3/demo/fixture.bin > downloaded.binExpected: the final command exits 0 and
downloaded.binmatchesfixture.bin. Observed on the release: it exits 1 with the error above and produces an empty file.Likely implementation seam
At current
main(f9efc927612e348f3e33cf96da6bb29e0502f905),internal/app/runtime.goserves S3 through VersityGW andinternal/backend/object.goconstructs itsGetObjectOutput. That output omitsLastModified, whileHeadObjectOutputincludes it.internal/objectreader/reader.goalready supplies the stored version'sLastModifiedfor both cache and provider reads. Capture the actual GET and HEAD response headers to confirm the wire-level cause before changing the response.Scope and completion
Last-Modifiedheader on GET, including a specificversionId; compare it with HEAD at HTTP-date precision. Existing backend tests ininternal/backend/object_test.goand thetests/systemharness are possible places to extend.mc catdownload with matching SHA-256, including a read after cache eviction. Confirm rclone reads matching bytes without the last-modified warning.docs/en/getting-started/s3-clients.md,docs/zh/getting-started/s3-clients.md, and the English and Chinese S3 compatibility matrices. Update them only if the verified behavior or instructions differ. Run the relevant Go tests and the repository'smake verify-fastPR check.Out of scope: Filecoin storage or replica repair, unrelated S3 API extensions, and a broader client compatibility audit.