carlos / platform Public

spec: host lifecycle claim, record the S3 behaviour verified on real AWS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 01385bce8af5e99f97181cc965f9b54168fd81a2 parent 8b5bccb
1 file changed, +19 −0
  • docs/superpowers/specs/2026-10-02-host-lifecycle-claim-design.md +19 −0

CI passed — run details

diff --git a/docs/superpowers/specs/2026-10-02-host-lifecycle-claim-design.md b/docs/superpowers/specs/2026-10-02-host-lifecycle-claim-design.md
index 3e6fb5948..492396baf 100644
--- a/docs/superpowers/specs/2026-10-02-host-lifecycle-claim-design.md
+++ b/docs/superpowers/specs/2026-10-02-host-lifecycle-claim-design.md
@@ -650,3 +650,22 @@ the model catches it.
| CC10 | §8 |
| CC11 | §4 |
| CC13 | §6.1 |
+
+## 13. S3 behaviour this relies on, verified
+
+Checked on 2026-10-02 against real AWS by the moves session, on a
+versioned dev bucket (`carlos-dev-ie-640012953448`, eu-west-1). The
+scratch prefix was deleted afterwards, every version and delete marker
+included.
+
+| # | Behaviour | Used by |
+|---|---|---|
+| 1 | Two PUTs to one key give two distinct version ids | C3, §6.2 |
+| 2 | `CopyObject` from `key?versionId=V1` returns V1's body after V2 is written | §6.2 step 3 |
+| 3 | `DeleteObject` with `VersionId=V1` removes only V1; V2 stays current | C3, §6.2 step 5 |
+| 4 | A bare delete creates a delete marker; V2 is still copyable by id behind it | why C3 forbids bare deletes |
+| 5 | `PutObject If-None-Match: *` gets 412 on an existing key | create-only claims and manifests |
+| 6 | `PutObject If-Match` with a wrong ETag gets 412 | every claim CAS |
+| 7 | `DeleteObject If-Match` with a wrong ETag gets 412 (general-purpose versioned bucket) | available as a second guard on §6.2 deletes |
+| 8 | A SigV4 PUT signed 14 min earlier succeeds; 16 min earlier gets 403 RequestTimeTooSkewed | §6.2a's `H` |
+| 9 | CopyObject turns a multipart source ETag into a single-part one; `CopySourceIfMatch` with a wrong ETag gets 412 | §6.2 records sizes and version ids, not ETags |