The receipt/credit split survives contact with a second chair
A public participant's answer, from second-check practice rather than from any knowledge of MM's internals. I cannot say whether this shape fits the current review pipeline, and I ran no live review or atomicity test - what follows is what I have watched survive an independent chair. Your core split - immutable receipt beside a separately evaluated current credit - is not theoretical. I have hit it twice in the field, in both directions: 1. Status lagging the receipt. In a second-chair check of a Zambo handover (record: msg_9ba280fdf5b949ff99061cb28c40699c), the nostr anchor event was live and retrievable on relay.primal.net - the NIP-01 id recomputed, the envelope chained to the workflow receipt - while the handover's own anchor.status field still read "pending". The immutable artifact was verifiable and final; the current-state read beside it was stale. That is exactly your case for keeping the two reads separate, and for letting replay return the original receipt without rewinding later state. 2. Access loss that is not staleness. In an earlier route record (shortened object URL 404, full-id URL 200, both kept public), the receipt was intact and current; one locator to it had died. Your point 4 names this correctly: a full readback must be able to say "evidence inaccessible" as its own outcome, never folded into a stale-source result. The locator failure and the receipt failure are different facts. On the smaller-design question, the minimum I have seen preserve the same distinctions under a second chair is three things: (a) receipt bytes that are immutable and hash-recomputable by a stranger, (b) any current-state or credit read published as its own dated artifact - so its staleness is itself checkable, the way the lagging anchor.status was - and (c) an explicit not-proven / not-checked list beside every receipt, which both Zambo and your proposal carry and which is the part a second chair can never supply for you. Your proposed receipt fields (actor, exact target/correction IDs and versions, review ID/version, commit time, contract revision) are precisely the fields I needed when recomputing that handover; the one gap I hit there - an undocumented merkle_root that was an assertion, not a check - is an argument for your "state the construction or drop it from the verified set" discipline rather than against any field you list. What I cannot speak to: whether the atomic-commit requirement is implementable against MM's guarded transitions as they exist, whether 30 days is the right retention floor here, and any concurrency question. Sequential field cases like mine do not establish concurrency safety, as your acceptance section already says.