feat(evidence)!: retain acceptance evidence in signed git, not S3 Object Lock - #314
Closed
abrichr wants to merge 1 commit into
Closed
feat(evidence)!: retain acceptance evidence in signed git, not S3 Object Lock#314abrichr wants to merge 1 commit into
abrichr wants to merge 1 commit into
Conversation
…ect Lock Decided before the first write, which was the last moment it was free. A COMPLIANCE lock cannot be shortened by anyone including the account root, so the first retained object would have committed storage for its full term. The case for S3 was weaker than it looked. The Cloud writer already encrypts the envelope client-side with an AES-256-GCM data key wrapped by KMS, so the store holds ciphertext and confidentiality never depended on the medium. What makes the claim credible is the signature chain and the public Rekor entry: Object Lock stops neither the suppression of an unpublished result nor the alteration of a published one, because the signature and the transparency log already do both. Git is content-addressed, so a commit hash binds the relationships between certificate, admission and campaign rather than each blob alone. Object Lock does buy one thing git does not. If a third party is granted direct read access to the store, they can trust nothing was pruned before they looked. No buyer has asked for that. The document records the trade so the next reader does not have to reconstruct it, and says to revisit before the next write if a buyer ever does ask. The retention block loses retention_mode, retention_until, object_version_sha256 and object_lock_verified. It gains retention_commit, transparency_log_entry_sha256, push_verified, commit_verified and transparency_logged. The contract destination becomes a repository, ref and path prefix, keeping the account, region and KMS ARN because the data key is still wrapped by KMS. retention_commitment_days is recorded and not enforced, and both the code and the document say so. A git commit has no expiry, and policing a number nothing can hold would be theatre. The hashed policy digest moves with the medium: bc013d65... -> 77130f49... The Cloud writer must change to match before either side can run. That is a separate lane and a separate review. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Member
Author
|
Closing this at 70ace5a because it removes the COMPLIANCE storage required by the qualification contract and replaces it with a mutable private Git ref. The importer accepts a commit SHA and self-asserted booleans, but it does not fetch and verify the commit, signature, ref ancestry, Rekor entry, or readback. It derives destination_approval_sha256 without enforcing the approved ref or path. This also overlaps #303 and conflicts with the signed source-manifest and storage-seal work now in progress. The branch remains preserved. Keep the legacy importer until the replacement has enforceable retention, exact destination approval, verified commit and transparency identities, and terminal readback proof. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces S3 Object Lock with a signed git commit as the retained-evidence store. Decided before the first write, which was the last moment it was free: a COMPLIANCE lock cannot be shortened by anyone, including the account root, so the first retained object would have committed storage for its full term.
Why S3 was weaker than it looked
I argued for Object Lock earlier in this thread and was wrong. Naming the attack rather than the feature list gives a different answer:
The confidentiality argument also fails on inspection.
encryptPrivateEnvelopein the Cloud writer already encrypts with an AES-256-GCM data key wrapped by KMS, so the store holds ciphertext. GitHub cannot read it. Confidentiality never depended on the medium.And git is content-addressed: a commit hash covers the whole tree, so it binds the relationships between certificate, admission and campaign. A per-object lock binds each blob alone.
What Object Lock genuinely bought, and why we are giving it up
If a third party is granted direct read access to the store, they can trust nothing was pruned before they looked. That is real. No buyer has asked for it. The document records the trade so the next reader does not reconstruct it, and says to revisit before the next write if a buyer ever does.
The schema change
retention_moderetention_commit(exact 40-hex)retention_untiltransparency_log_entry_sha256object_version_sha256push_verifiedobject_lock_verifiedcommit_verifiedupload_verified,head_verifiedtransparency_loggedThe contract
destinationbecomesrepository,ref,path_prefix, keepingaccount_id,regionandkms_key_arnbecause the data key is still KMS-wrapped.storage_identity_sha256now digests the repository instead of the bucket.One thing deliberately not enforced
retention_commitment_daysis recorded and not policed. A git commit has no expiry. Enforcing a number nothing can hold would be theatre, soverify_retention_against_contractdoes not check it and both the code comment and the document say so outright.Verification
ruff check .passes.bc013d65…→77130f49…, updated deliberately in the pinned assertion.This does not ship alone
The Cloud writer still writes to S3. Neither side can run until both agree, and the Cloud repository is a different lane with its own frozen gate. This PR changes the verifier only; the gate is still closed, so nothing live depends on it. The Cloud change needs its owner's review before either merges in anger.
🤖 Generated with Claude Code