[SCITT] Re: Closing omission from the receiver's vantage — what a record must carry

Henri Sirkkavaara <hello@vaara.io> Thu, 20 August 2026 05:33 UTC

Return-Path: <hello@vaara.io>
X-Original-To: scitt@mail2.ietf.org
Delivered-To: scitt@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id 1E13912CAD72E for <scitt@mail2.ietf.org>; Wed, 19 Aug 2026 22:33:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1787203981; bh=bpnse4oyj6bS8nJxh25D60kMdt6ypdIX5+toncICFds=; h=Date:To:From:Cc:Subject:In-Reply-To:References; b=TwaSA+DkRpb3saZctiSGvnvlJOumXW8EefTFebAWeO3av1L0Q3hSxIHvnvWIq76XD f90AgmdXV9XnTROD+GLQYJt80da1HRVVMhEDCebFS5514w+cUXdNNbOVnh11ZMXkqz 0LRkWTN9AzpDuJkAsyPIWfpVc+IAZw1wQqKWaQfk=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.796
X-Spam-Level:
X-Spam-Status: No, score=-2.796 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=vaara.io
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4_Q_oaTn_vzh for <scitt@mail2.ietf.org>; Wed, 19 Aug 2026 22:32:59 -0700 (PDT)
Received: from mail-4317.protonmail.ch (mail-4317.protonmail.ch [185.70.43.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id AB1F012CAD727 for <scitt@ietf.org>; Wed, 19 Aug 2026 22:32:59 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vaara.io; s=protonmail; t=1787203978; x=1787463178; bh=bpnse4oyj6bS8nJxh25D60kMdt6ypdIX5+toncICFds=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=XS0HsXpfy+VQuw/NnyQKyuijjOp8dXL3loduFkGbCCyb94rq+0ko25aoOQg2U7vFr ZzLSl6BMExYDBNQdoN3+xOmiSfQPES1tcQfyTdIzf0zZesSvjWYwcOHbqudBBBI7OA b0m5fq9V9hUzxogSszbyrETPVnUxTdD/63HTWe07dHZXD1247ea0WnrLASmJEX4sZg OFCDu9C+rELf/JHWHvD/bY8Ik7Ve2x5Hxq2WnVs+b1sIfDIa2XZKakn21RfG9Mw4uM IzZ5XPFXAHIV1PyPYQ/HURy4nzQxa3p6YdbrgYMyOgIj98t2HIVmNxq8rP+bkElB8P FZQ853JpGSc5Q==
Date: Thu, 20 Aug 2026 05:32:54 +0000
To: Walter Hawkins <wdhawkins46@gmail.com>
From: Henri Sirkkavaara <hello@vaara.io>
Message-ID: <G291Rgu5pZ2v3GWOaxuoG0PVYvTTzkjdx8Yg6w_RncBbuBGYX1PvhYtIHg-IuMS9yf1uUKC7mf8KlXd-fE1f0yJkCUZo1jzx4vNYode61o8=@vaara.io>
In-Reply-To: <CALc05oEEg_BVvy6UCDBBgyrV8ASvLuJYWxNoES3k9jgE22mccA@mail.gmail.com>
References: <CALc05oEEg_BVvy6UCDBBgyrV8ASvLuJYWxNoES3k9jgE22mccA@mail.gmail.com>
Feedback-ID: 189084408:user:proton
X-Pm-Message-ID: c7b9973113b860050e23e4d30fbabe2617e1c79a
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="b1=_wrZPKXzUbsJLe1zTXaCW81slnA4XhKHEORmH1TEfME"
Message-ID-Hash: VOTLVUMEBKIFDOGO3MMCIMTZ3WA2L37R
X-Message-ID-Hash: VOTLVUMEBKIFDOGO3MMCIMTZ3WA2L37R
X-MailFrom: hello@vaara.io
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
CC: hello@vaara.io, Todd.Gibson@t-mobile.com, scitt@ietf.org
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [SCITT] Re: Closing omission from the receiver's vantage — what a record must carry
List-Id: "Supply Chain Integrity, Transparency, and Trust" <scitt.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/scitt/mtFedaatC5GJqQcBTm_p-P3TN_0>
List-Archive: <https://mailarchive.ietf.org/arch/browse/scitt>
List-Help: <mailto:scitt-request@ietf.org?subject=help>
List-Owner: <mailto:scitt-owner@ietf.org>
List-Post: <mailto:scitt@ietf.org>
List-Subscribe: <mailto:scitt-join@ietf.org>
List-Unsubscribe: <mailto:scitt-leave@ietf.org>

Walter, Joel, Todd, Pablo,

Yes, willing.

One correction to the opener before it hardens, and it is my own sentence. "An issuer-assigned, gap-free sequence with a running count makes a short set provably short from the bytes alone" holds for a set with a hole in it and fails for a set cut at the end. Emek cloned the tree at befdced and ran the three cases. He is correct.

The property splits into rungs, and each licenses a different claim:

1. A signed seq catches a missing sequence number inside the held range, with no second party. 2. A pinned terminal seal catches a dropped tail from the held set alone. In our implementation that is a block of the form {"sealed": true, "total": N}, and verify_contiguity computes expected as max(max_seq + 1, max_running, sealed_total). On a five-record run with the last two dropped it reports missing 3 and 4. Without the seal it reports ok. 3. A suffix that suppresses the seal as well sits outside held-set-alone detection and needs an external anchor over the run.

Rung 2 is already in the code and I stated the property one rung short of what it does. Emek's reading of runningCount belongs in any shared text too: verify_contiguity requires runningCount == seq + 1 for every held record, so it is a per-record consistency invariant that catches an edited count. It never speaks about records outside the held set, because it is pinned to the seq of the record it rides on. Expected is decided by the sequence alone.

That sharpens the composition you are drawing. The receiver's vantage stops being optional at rung 3, because the party who can suppress the seal is the party assigning the sequence.

Joel, your fourth item is one we do not have. Our coverage component names the observation boundary a decision was made under and travels inside the signed payload, but it carries no publisher-assigned version of the corpus the answer was computed against. When a sanctions list issues a delta, a verdict that moves for that reason looks identical in our records to a verdict that moved because policy changed. I would put it in the statement as a fourth thing a record must let a receiver resolve, and I would have to add the field before I could point at one.
Code for rungs 1 and 2 is src/vaara/credential/_contiguity.py and src/vaara/credential/_authorization_receipt.py in github.com/vaaraio/vaara, and the vectors are under tests/vectors with checkers that import none of our code.

Henri Sirkkavaara
Vaara - Runtime execution layer for AI agents
Built to see over the noise.
vaara.ioHelsinki, Finland

On Wednesday, August 19th, 2026 at 23:53, Walter Hawkins <wdhawkins46@gmail.com> wrote:

> Henri, Todd,
>
> Opening this as its own thread, off all three of our drafts, because the piece it's about belongs to none of them and touches all of them.
>
> The gap is the one Henri named and Todd occupies from the other side: closing omission needs a party who knows an answer was owed. A hash-chained receipt makes deletion and reordering detectable and leaves omission open — a payment that never entered the chain leaves no gap to find. A sender-side attestation can't help either, because the party that can suppress the record is the same party producing the attestation. The only actor in the loop who knows a payment was owed, and cannot be made to un-know it, is the one receiving the money. Todd's PRVO-2 is that actor, and the 21.20% fictitious-settlement figure is what makes the vantage concrete rather than theoretical.
>
> So the question worth answering here, and I think it's a small one: what does a record have to carry for a party in the receiving position to use it, resolving all of it without ever contacting the executor? Henri put the shape better than I would have — three things:
>
> 1. which authorization governed this payment,
> 2. what bound was in force when it settled, and
> 3. whether the set of records claiming to cover this payment is complete.
>
> The third is where the two failure modes separate cleanly, and why this composes instead of competing. An issuer-assigned, gap-free sequence with a running count — Henri's completeness component — makes a short set provably short from the bytes alone, no second party required. It catches a record removed from a set. It says nothing about a record never created, because that is issuer-assigned, and the issuer sits on the side that benefits from the omission. The receiver catches exactly that: the executor can suppress a record; it cannot suppress the arrival of money. Two failure modes, two parties, and neither party covers both — which is the whole argument for treating the receiver as a distinct evidence vantage rather than folding it into any one draft.
>
> The natural enumerator on the receiver's side is the settlement rail: records bound to the settled transaction's own digest, one per payee leg, so an absent party enumerates from the rail instead of from a list the executor hands them, and a missing leg is visible to whoever holds it. That is the part I would rather pull out of my x402 profile and specify here, where it is not subordinate to one payment-authorization draft.
>
> What I would propose we produce, if you are both willing: a short statement of the receiver as an evidence vantage — the three things a record must let it resolve, the completeness component and its stated limit, and what a rail profile has to say for the rail's own records to serve the enumeration. Not a fourth draft competing with the three we have; the shared substrate the other three can each reference.
>
> Henri, the completeness component and its limit are yours to state. Todd, the fraud side — why the receiver's knowledge is the input the sending side cannot manufacture — is what keeps this grounded in a real failure rather than a neat construction. I will bring the rail-enumeration binding and a testnet EVM rail to exercise it against real settled transactions.
>
> Walter