jcp: an erasure path that neither breaks the chain nor loses the joules (re-land) #77
Loading…
Reference in a new issue
No description provided.
Delete branch "jcp/erasure-tombstone-v2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Re-land of #74, rebuilt on current
mainafter the environment-binding change landed. The original branch conflicted at a shared test-insertion point, and rebuilding was cleaner than resolving text that did not split at function boundaries.No receipt chain in open-standards had a redaction primitive. Chains are append-only by construction — right for evidence, wrong for a deployment that must honour a data-subject erasure request.
Why erasure has to be forward-only
The chain links on envelope bytes: each entry's
previs the content id of the one before it. An entry cannot be edited or removed, because either breaks every link after it — and a chain that no longer verifies is not evidence of anything, including of the erasure.So
ReceiptLog::eraseappends ajcp.tombstone/1entry. The erased envelope stops being retained; its content id is unchanged, so links still resolve.The joules stay, deliberately
Every energy total and facility rollup over this log is a sum across its entries. An erasure that dropped the cost would silently shrink all of them — and the shrinkage would be indistinguishable from a genuine efficiency gain. A conservation break arriving through the back door of a privacy feature.
Joules and a provenance label are not personal data. The payload hash, resource, subject and action are — and a test asserts none of them appear. The
authorityfield is a request reference, never the requesting party's identity: a tombstone naming the subject would re-introduce the datum the erasure removed.Verification
278 jcp-rs tests pass · conformance passes all classes · the chain test compares the sealed payload byte-for-byte against the expected chained wire rather than re-parsing it.
🤖 Generated with Claude Code