| Internet-Draft | Physical-Site Engagement Receipt | September 2026 |
| Wilder | Expires 6 March 2027 | [Page] |
- Workgroup:
- SCITT
- Internet-Draft:
- draft-wilder-scitt-physical-site-engage-receipt-02
- Published:
- Intended Status:
- Standards Track
- Expires:
A SCITT Profile for Physical-Site Engagement Receipts
Abstract
This document defines a SCITT profile for Physical-Site Engagement Receipts (PSER): tamper-evident, signed, offline-verifiable records that describe an autonomous or human-directed physical engagement at a specific real-world site governed by a defined operating envelope. Each receipt is a SCITT Signed Statement as defined by the SCITT architecture, encoded as a COSE Single Signer message, carrying a JCS-canonicalized JSON payload with a five-artifact vocabulary describing (1) the Site, (2) the Operator and Actor, (3) the Engagement Window and Envelope, (4) the Attestation Evidence from a Trusted Execution Environment (TEE), and (5) the Adapter Write-In recording that the receipt was posted into an out-of-band operations layer. A Physical-Site Engagement Receipt is registerable in any conforming SCITT Transparency Service, obtaining a Receipt that proves the Statement's inclusion in that Service's verifiable data structure. Registration does not establish that the Issuer registered every receipt it issued.¶
This profile deliberately makes a NARROW, checkable claim -- "this is a tamper-evident, signature-verifiable record that a specific engagement occurred at a specific site under a specific envelope, and its evidence was sealed by a specific TEE" -- and explicitly does NOT claim that the engagement was safe, correct, or wise, that the site conditions were as described, or that any downstream operational outcome followed. Compliance verdicts derived from the receipt (SLA credit, insurance underwriting, regulatory audit) are the responsibility of the relying party and its policies, not of this profile.¶
The profile is designed around a three-party trust model in which no single party can unilaterally forge or repudiate a receipt: the Site Owner controls physical access to the TEE hardware and keeps it running (they can unplug the box, and cannot forge what it signs); the TEE silicon vendor attests the key material inside the TEE through its hardware root of trust (silicon vouches for the key); and the Issuer writes the vocabulary, registers Signed Statements with a Transparency Service, and posts the resulting receipt into the site's operations layer via a WRITE_ONLY adapter. This separation is normative in this profile: implementations MUST NOT collapse these three roles into a single custodian, and relying parties MUST NOT trust a receipt that lacks any one of them.¶
Status of This Memo
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 6 March 2027.¶
Copyright Notice
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
1. Introduction
Autonomous mobile robots, semi-autonomous physical equipment, and human-directed physical work crews increasingly operate at regulated real-world sites -- warehouses, common-interest communities, industrial facilities, healthcare campuses, and public infrastructure. Relying parties -- site owners, insurers, regulators, dispatchers, and downstream operations platforms -- need portable, verifiable evidence of what physically happened at a site, distinct from the digital-artifact supply-chain evidence addressed by [RFC9943] and distinct from the per-action AI-agent evidence addressed by [I-D.noa-scitt-ai-agent-receipt] and [I-D.mih-scitt-agent-action-capsule].¶
This profile fills that gap by defining the SCITT Statement content for one physical-site engagement: a bounded interval during which a specific actor operates at a specific site under a stated envelope, with the evidence sealed inside a TEE and the receipt subsequently written into whatever operations layer the site already uses (property-management system, maintenance ticketing, insurance underwriting API, regulatory portal).¶
The profile's defensibility, and its value to relying parties, comes from combining four elements that no single vendor category currently ships together:¶
-
Site-hosted TEE trust anchor. The signing key is bound to hardware physically located at the site under the site owner's control. Cloud-hosted transparency services can issue strong receipts, but the signing authority lives inside the cloud provider's environment; this profile REQUIRES that the authority live on the Site Owner's premises, attested by the TEE silicon vendor, and neither extractable by the Site Owner nor by the Issuer. This statement describes direct-witness mode. In delegated-witness mode (Section 4.3) the key that produces the COSE signature is the Issuer's own and need not be site-resident; what remains site-resident is the TEE that issues the delegation credential, and a relying party evaluating such a receipt obtains a weaker property than the one described here. A Verifier MUST determine which mode applies from the Issuer's manifest before relying on the non-extractability property, and MUST NOT assume direct-witness mode where the manifest does not state it.¶
-
Physical-work evidence vocabulary. The five-artifact schema (Site, Actor, Engagement, Attestation, Adapter Write-In) binds the receipt to what physically happened, not merely to a software event. This vocabulary is defined in Section 4 and is stricter than a general-purpose SCITT Statement.¶
-
WRITE_ONLY adapter into existing operations layers. Verified evidence is posted into the systems the buyer already uses -- property-management, maintenance, warehouse-management, claims, and asset-management platforms -- as recorded by the
adapterfield in Section 4. This profile explicitly does NOT define a new operations dashboard; it defines how receipts enter the operations layers a site already runs.¶ -
Transparency-service registration. Neither the Issuer's
chainnor the TEE establishes that a presented history is complete, or that it is the only history. A withheld suffix is internally consistent at every link, and a TEE establishes that it wrote the state it attests, not that that state is the most recent. Registration in a SCITT Transparency Service supplies the external reference against which relying parties and auditors can test those questions. A TEE on customer premises without external witnessing is therefore insufficient; SCITT registration is REQUIRED by this profile (Section 5).¶
Physical-Site Engagement Receipts are complementary to, and compose with,
existing SCITT-AI drafts. An AI agent that dispatches a physical robot MAY
emit an Agent Action Capsule per [I-D.mih-scitt-agent-action-capsule]
describing the dispatch decision, and the physical engagement that follows
MAY be recorded as one or more Physical-Site Engagement Receipts under this
profile, correlated via the SCITT sub claim.¶
1.1. Requirements Notation
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
1.2. Non-goals
This revision does not:¶
-
Attest that the engagement was safe, correct, effective, or compliant with any specific regulation.¶
-
Attest that the site conditions were as recorded.¶
-
Attest that no unrecorded engagement occurred outside the instrumented boundary.¶
-
Specify a deterministic offline REPLAY of any engagement decision.¶
-
Define the operations-layer schemas the Adapter Write-In targets.¶
-
Define billing, SLA-credit, or insurance-pricing rules that a relying party may derive from a stream of receipts.¶
-
Attest anything about the internal state, intent, or decision process of a human participant in an engagement, or about signals conveyed by a direct neural or brain-computer interface. This profile records that a bounded physical engagement occurred at a Site and identifies the parties that can attest to it. A direct neural interface is not an engagement performed by an Actor at a Site under Section 2, and this document defines no member, no value, and no extension point for one.¶
These non-goals are NORMATIVE: implementations and relying parties MUST NOT imply the stronger claims from a receipt.¶
2. Terminology
This document uses the terms defined in [RFC9943] (Signed Statement, Statement, Issuer, Subject, Transparency Service, Registration Policy, Receipt) and [RFC9942] (Verifiable Data Structure, Verifiable Data Structure Proof). In addition:¶
- Site:
-
The bounded real-world location at which the engagement occurred, identified by a stable Site Identifier under the Issuer's registration authority. The Site is the physical analog of a SCITT Subject.¶
- Site Envelope:
-
The operating constraints in force at the Site during the engagement -- permitted actor classes, permitted engagement types, geospatial bounds, temporal bounds, and referenced site-rule documents. The Site Envelope is identified by a stable envelope identifier and a content digest.¶
- Site Owner:
-
The party that controls physical access to the TEE hardware producing receipts for a Site, and that is responsible for that hardware's continued operation there. The Site Owner is defined by those two capabilities and not by title, by legal ownership of the premises, or by any contractual label: the party holding them may or may not be the party named on the deed. The Site Owner is one of the three parties REQUIRED to participate in every receipt under Section 7.7. The Site Owner has no capability to author, alter, or suppress the content of a receipt, and none to extract the signing key material.¶
- Actor:
-
The physical entity that performed the engagement -- an autonomous robot, a semi-autonomous asset, a human operator, or a human-led crew -- identified by a stable actor identifier under the Issuer's registration authority.¶
- Operator:
-
The organization or individual responsible for the Actor during the engagement, distinct from the Issuer of the receipt when a third-party witness signs.¶
- Engagement:
-
A bounded interval, delimited by an Engagement Window, during which the Actor performed physical work at the Site under the Site Envelope.¶
- Engagement Window:
-
The time interval [start, end] of the Engagement, expressed in RFC 3339 UTC, with the same clock basis as the TEE-sealed evidence.¶
- Attestation Evidence:
-
The output of a TEE that observed the Actor and the Engagement, including a platform attestation, a measured-boot chain, and a digest over the sealed evidence bundle. The bundle itself is opaque to the Transparency Service.¶
- Adapter Write-In:
-
The record that the Signed Statement (or a reference to it) was posted into an out-of-band operations layer, together with the operation-layer system identifier, endpoint identifier, and a post-time digest of the operations-layer acknowledgement. The Adapter Write-In is what makes the receipt useful to the site's existing workflow without requiring the operations layer to be modified.¶
- Physical-Site Engagement Receipt (PSER):
-
A SCITT Signed Statement under this profile, carrying a canonical JSON payload conforming to Section 4, with the profile identifier
wilder.pser/0.4and a SCITT Receipt attached as defined in [RFC9942].¶ - Chain-Verifier:
-
A relying party, or a party acting on a relying party's behalf, that is presented with two or more Physical-Site Engagement Receipts as one contiguous chain and evaluates the chain-level properties defined in Section 4. Chain-Verifier is a role, not a distinct principal: any verifier MAY act as a Chain-Verifier, and the obligations this profile places on a Chain-Verifier apply only to a presentation of two or more receipts. A verifier presented with a single receipt incurs none of them.¶
3. Profile identifier and media types
The profile identifier for this document is wilder.pser/0.4 and MUST appear
as the value of the top-level spec member of the payload defined in
Section 4.¶
The COSE content_type (protected header label 3, [RFC9052]) for a
Physical-Site Engagement Receipt Statement is
application/pser+json; profile=wilder.pser/0.4. IANA registration of this
media type is requested in Section 6.¶
The application/scitt-statement+cose and application/scitt-receipt+cose
media types from [RFC9943] apply unchanged to Statements and Receipts under
this profile.¶
4. Receipt structure
A Physical-Site Engagement Receipt is a SCITT Signed Statement per
[RFC9943] Section 6, encoded as a COSE_Sign1 per [RFC9052]. The payload
is a JSON object serialized with JCS [RFC8785] and carried as the
COSE_Sign1 payload.¶
The following is a complete example instance. It is not a schema: every value
is literal, the whole object parses as JSON, and the chain.hash value is the
digest this profile specifies over the rest of the object. Normative member
definitions are in Section 4.1; where this example and Section 4.1 disagree,
Section 4.1 governs.¶
This figure is emitted by the reference implementation and asserted byte-identical to it in that implementation's continuous integration. It is not maintained by hand.¶
Its values are illustrative. The digests are placeholders, the identifiers are
synthetic, and the teeClass value is one conforming registry entry chosen so
the example round-trips. This profile does not prefer, presume, or depend on
any particular confidential-compute environment, and no value in this figure
should be read as a statement about deployed hardware.¶
{
"actor": {
"class": "AUTONOMOUS",
"id": "actor:robot-alpha-01",
"operator": "operator:wilder-robotics"
},
"adapter": {
"ackDigest": "sha256:4444444444444444444444444444444444444444444444444444444444444444",
"ackProvenance": "THIRD_PARTY",
"endpoint": "endpoint:res-001",
"mode": "WRITE_ONLY",
"postedAt": "2026-10-15T14:00:05Z",
"system": "example.ticketing"
},
"attestation": {
"measuredBoot": {
"chain": "sha256:98a6efd412bb768ea7f090e8228401c11bc72a7caae44170395445c097d5ffa1",
"components": [
{
"digest": "sha256:2222222222222222222222222222222222222222222222222222222222222222",
"name": "bl1"
}
]
},
"platformEvidence": {
"digest": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"encoding": "opaque/1"
},
"sealedEvidence": {
"digest": "sha256:3333333333333333333333333333333333333333333333333333333333333333",
"encoding": "opaque/1",
"sizeBytes": 4096
},
"teeClass": "arm.cca",
"validity": {
"notAfter": "2026-10-15T15:00:00Z",
"notBefore": "2026-10-15T13:00:00Z"
},
"witnessKey": "key:tee:res-001-witness-01"
},
"chain": {
"hash": "sha256:d67bb655b9ce091c8add39be6e41d1a4585ac482304b8bcef1548aec7d2c9dd7",
"prevHash": null,
"seq": 0
},
"engagement": {
"envelopeConformance": "WITHIN",
"evidenceDigest": "sha256:1111111111111111111111111111111111111111111111111111111111111111",
"id": "eng:res-001:20261015-140000",
"outcomeClass": "COMPLETED",
"type": "patrol",
"window": {
"end": "2026-10-15T14:00:00Z",
"start": "2026-10-15T13:30:00Z"
}
},
"id": "uuid:00000000-0000-4000-8000-000000000001",
"issuerAffiliation": "NOT_DISCLOSED",
"site": {
"class": "residential",
"envelope": {
"digest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
"geobounds": null,
"id": "env:res-001:2026-Q4",
"temporal": {
"ends": null,
"starts": "2026-10-01T00:00:00Z"
}
},
"id": "site:res-001"
},
"spec": "wilder.pser/0.4",
"ts": "2026-10-15T14:00:00Z"
}
4.1. Field semantics
4.1.1. spec (REQUIRED, string)
MUST be wilder.pser/0.4 for receipts conforming to this document. A verifier
MUST reject any Statement with a different spec value as out of scope of
this profile.¶
4.1.2. id (REQUIRED, string)
A globally unique identifier for the receipt, assigned by the Issuer. RECOMMENDED
form is a URN or a uuid: prefix. id MUST NOT be reused within an Issuer.¶
4.1.3. ts (REQUIRED, string)
RFC 3339 UTC timestamp at which the Issuer sealed the receipt. This is the
receipt-issuance time; it MAY differ from engagement.window.end.¶
4.1.4. issuerAffiliation (REQUIRED, string)
States whether the Issuer and the Site Owner are affiliated principals. The admissible values are exactly:¶
-
AFFILIATED: the Issuer and the Site Owner are the same principal, or are principals under common control, or one controls the other.¶ -
INDEPENDENT: the Issuer and the Site Owner are principals under neither common control nor the control of one by the other.¶ -
NOT_DISCLOSED: the relationship is not stated in the receipt.¶
The member is REQUIRED because the alternative is worse. An absent member would
itself have to be assigned a meaning, and every available meaning is wrong: read
as INDEPENDENT it manufactures a disclosure nobody made, and read as
AFFILIATED it accuses an Issuer of a relationship it may not have. Requiring
the member makes NOT_DISCLOSED a stated position rather than an inference drawn
from silence.¶
The value states the Issuer's own claim about itself. This profile does not define a mechanism by which a Verifier establishes the claim to be true, and a Verifier MUST NOT report a verified receipt as evidence that the stated relationship holds. What verification establishes is that the claim was made, by the Issuer, inside a receipt bound by the signature and the chain, and therefore that it cannot later be revised without the revision being visible. That is a narrower property than truth and it is the property this member carries.¶
A Verifier MUST NOT read NOT_DISCLOSED as INDEPENDENT. Silence about a
relationship is not a denial of one, and a relying party told otherwise has been
supplied a claim no principal authored. This is the one collapse the member
exists to prevent, and it is the direction that overstates the receipt.¶
A Verifier MUST NOT read a value outside the admissible set as AFFILIATED and
MUST NOT normalize it to NOT_DISCLOSED. A Verifier that encounters an
unrecognized value MUST preserve the value as received and MUST surface it to
the relying party as unrecognized, distinct from all three admissible values.
This revision does not require a Verifier to reject a receipt on that basis,
because a value it does not recognize may be defined by a later revision; it
requires that the Verifier never silently resolve the ambiguity. The value set
is closed in this revision and is not registry-governed. A later revision that
adds a value does so additively, without redefining an existing one.¶
The relationship this member describes is a standing one between two principals
rather than a property of a single engagement, but standing relationships
change. Receipts presented as one chain may therefore disagree about it without
either receipt being defective. The chain-level obligation, which is to surface
such a change rather than to reject the presentation or to resolve it in favour
of either value, is stated with the other Chain-Verifier obligations under
chain.¶
This member is distinct from, and does not substitute for, the manifest disclosure required of an Issuer that registers with a Transparency Service it operates or that is operated by an affiliated principal (Section 5). That obligation concerns the relationship between the Issuer and the Transparency Service; this member concerns the relationship between the Issuer and the Site Owner. An Issuer may be independent of the Site Owner and still operate its own Transparency Service, or be affiliated with the Site Owner and register with an unaffiliated one. Neither value can be inferred from the other.¶
4.1.5. site (REQUIRED, object)
Identifies the physical location.¶
-
site.id(REQUIRED, string): stable site identifier under the Issuer's registration authority. This is the physical analog of a Subject and SHOULD be used as the value of the CWTsubclaim in the protected header (see Section 4.2).¶ -
site.class(REQUIRED, string): coarse site classification. Registry- governed; see Section 6.¶ -
site.envelope.id(REQUIRED, string): stable identifier of the operating envelope in force during the engagement.¶ -
site.envelope.digest(REQUIRED, string): JSON-DIGEST (SHA-256 of the JCS serialization) of the full envelope document. The full document MUST NOT appear in the public receipt; it is bound by digest only.¶ -
site.envelope.geobounds(OPTIONAL, string): opaque reference to geospatial bounds. Any geospatial detail beyond the reference is bound by the envelope digest, not published.¶ -
site.envelope.temporal(OPTIONAL, object): temporal window during which this envelope was in force.nullvalues indicate "open-ended in that direction."¶
4.1.7. engagement (REQUIRED, object)
-
engagement.id(REQUIRED, string): stable identifier of the engagement.¶ -
engagement.window.startandengagement.window.end(REQUIRED, string): RFC 3339 UTC bounds of the engagement.endMUST be >=start. Both MUST share a clock basis withattestation.sealedEvidence(see Section 4.4).¶ -
engagement.type(REQUIRED, string): coarse engagement classification (e.g.patrol,service,inspection,delivery,installation,maintenance,presence). Registry-governed; see Section 6.¶ -
engagement.outcomeClass(REQUIRED, string): one ofCOMPLETED,ABORTED,REFUSED,ERRORED,OBSERVED_ONLY.OBSERVED_ONLYrecords that the Issuer witnessed the actor at the site but did not participate in dispatch.¶ -
engagement.envelopeConformance(REQUIRED, string): one ofWITHIN,EXCEEDED_TEMPORAL,EXCEEDED_GEO,EXCEEDED_ACTOR,UNKNOWN. The Issuer MUST NOT claimWITHINunless it evaluated conformance against the envelope digest.¶ -
engagement.evidenceDigest(REQUIRED, string): JSON-DIGEST of the engagement's internal evidence structure. The internal structure is opaque to this profile and MUST NOT appear in the receipt.¶
4.1.8. attestation (REQUIRED, object)
Binds the receipt to the TEE that observed the engagement. This is the mechanism that distinguishes a Physical-Site Engagement Receipt from a bare signed timestamp: the sealed evidence attests that the Issuer observed the engagement from inside a hardware-rooted, remotely attestable environment.¶
-
attestation.teeClass(REQUIRED, string): TEE class identifier. Registry-governed; see Section 6. The TEE Class registry is REQUESTED by this document and has NOT yet been allocated by IANA. Until allocation, the admissible values are exactly the initial values listed in Section 6:intel.tdx,amd.sev-snp,arm.cca,nvidia.h100-cc,nvidia.jetson-thor-cc,aws.nitro-enclave. A Verifier MUST reject ateeClassvalue outside that set.¶A confidential-compute environment absent from that set is not accommodated by this revision, and an implementer on such an environment has no conforming value to emit. The extension route is the registration policy in Section 6: "Specification Required". A new value is added by publishing a specification that defines the
platformEvidenceformat the class admits, and requesting registration against it. Once the registry is allocated, that route does not require a revision of this document.¶ -
attestation.platformEvidence(REQUIRED, object): reference to the platform-native attestation document, in a format defined by the TEE class. The document itself MAY be conveyed by reference (URI + digest) or inline; when conveyed inline it SHOULD be in the unprotected header of the enclosing Signed Statement, not in the payload.¶ -
attestation.platformEvidence.digest(REQUIRED, string): digest of the platform-native attestation document.¶ -
attestation.platformEvidence.encoding(REQUIRED, string): opaque encoding label for that document. The set of labels a given TEE class admits is defined by that TEE class.¶ -
attestation.measuredBoot(REQUIRED, object): the measured-boot state of the environment that produced the receipt.¶ -
attestation.measuredBoot.chain(REQUIRED, string): JSON-DIGEST of the measured-boot chain.¶ -
attestation.measuredBoot.components(REQUIRED, array): the measurements the chain digest commits to, in boot order. Each element is an object with aname(REQUIRED, string) naming the measured component and adigest(REQUIRED, string) carrying its measurement. Verifiers MUST NOT infer any meaning fromnamebeyond identification.¶ -
attestation.sealedEvidence.digest(REQUIRED, string): digest of the sealed evidence bundle.¶ -
attestation.sealedEvidence.sizeBytes(REQUIRED, int): size of the sealed bundle in bytes. Included to enable bounded-storage verifiers to reject bundles they cannot process.¶ -
attestation.sealedEvidence.encoding(REQUIRED, string): opaque encoding label. Registry-governed; see Section 6.¶ -
attestation.witnessKey(REQUIRED, string): key identifier of the TEE signing key. This MAY differ from the Issuer'sisswhen the TEE operates as a delegated witness.¶ -
attestation.validity(REQUIRED, object): the interval over which the attestation of the producing environment is asserted to hold.¶ -
attestation.validity.notBefore(REQUIRED, string): RFC 3339 UTC timestamp at which the attestation becomes valid.¶ -
attestation.validity.notAfter(REQUIRED, string): RFC 3339 UTC timestamp after which the attestation is no longer valid.notAfterMUST be strictly later thannotBefore; a Verifier MUST reject a receipt whosenotAfteris equal to or precedes itsnotBefore. A zero-length interval asserts validity for an instant of zero duration and has no legitimate producer. This revision does not require a Verifier to testtsagainst the interval.¶
4.1.9. adapter (REQUIRED, object)
Records that the receipt (or a reference to it) was written into an out-of-band operations layer. This is the profile's core insight: a receipt that no operations system can see is not useful, and modifying the operations system to consume receipts natively is out of scope for most regulated sites. The Adapter Write-In makes the receipt observably present in the site's existing workflow.¶
-
adapter.system(REQUIRED, string): operations-layer system identifier (e.g. a property-management system, maintenance ticketing platform, regulatory portal, insurance underwriting API). Registry-governed; see Section 6.¶ -
adapter.endpoint(REQUIRED, string): opaque endpoint identifier within the system. Its interpretation is defined by the target system, not by this profile.¶ -
adapter.postedAt(REQUIRED, string): RFC 3339 UTC timestamp at which the write-in was posted.¶ -
adapter.ackDigest(REQUIRED, string): JSON-DIGEST of the operations- layer's acknowledgement response. If the operations layer returns no structured acknowledgement, the digest is taken over an Issuer-defined minimal ack object; the object schema is specified in the Issuer's manifest and is bound by the receipt's Merkle inclusion, not published.¶ -
adapter.ackProvenance(REQUIRED, string): identifies which party authored the acknowledgement thatadapter.ackDigestcommits to.adapter.ackDigestalone cannot carry this: the digest of an acknowledgement authored by an independent operations layer and the digest of one authored by the Issuer itself are indistinguishable to a Verifier, and the two have materially different evidentiary weight. The admissible values are exactly:¶-
THIRD_PARTY: the acknowledgement was returned by the operations layer named inadapter.system, which is a principal distinct from the Issuer.¶ -
ISSUER_ASSERTED: the operations layer returned no structured acknowledgement, and the digest is taken over the Issuer-defined minimal ack object described underadapter.ackDigest. The Issuer is the author of the acknowledged content.¶ -
NONE: no acknowledgement was obtained from any party.¶
A Verifier MUST NOT read a value outside that set as
THIRD_PARTY, and MUST NOT normalize it toNONE. Doing either reintroduces the collapse this member exists to prevent, in the direction that overstates the receipt. A Verifier that encounters an unrecognized value MUST preserve the value as received and MUST surface it to the relying party as unrecognized, distinct from all three admissible values. This revision does not require a Verifier to reject a receipt on that basis, because a value it does not recognize may be defined by a later revision; it requires that the Verifier never silently resolve the ambiguity in the receipt's favour.¶The value set is closed in this revision and is not registry-governed. A later revision that adds a value does so additively, without redefining an existing one.¶
-
-
adapter.mode(REQUIRED, string): MUST beWRITE_ONLYin this revision. Read-in modes are explicitly out of scope; see Section 7.¶
4.1.10. chain (REQUIRED, object)
Hash-chains successive receipts by the same Issuer so that a verifier can detect broken hash links, sequence discontinuities, and modification, substitution or reordering among the receipts presented as one contiguous chain. The chain does NOT establish that its last presented receipt is the Issuer's latest: a prover that withholds a suffix presents a prefix that is internally consistent at every link. See Section 7.¶
The construction is defined normatively in this document. It follows the convention established in [I-D.noa-scitt-ai-agent-receipt] Section 5, which is cited for provenance only: no conformance requirement of this profile depends on that document.¶
-
chain.seq(REQUIRED, int): non-negative sequence number within the Issuer's chain for the identified Subject. The first receipt in a chain MUST carrychain.seq0.¶ -
chain.prevHash(REQUIRED, string or null): the value of the immediately preceding receipt'schain.hash, ornullfor the first receipt. A receipt whosechain.seqis 0 MUST carrynull; a receipt whosechain.seqis nonzero MUST carry the preceding receipt'schain.hashvalue. Note that this is a digest over the preceding receipt EXCLUDING itschain.hashmember, per the definition ofchain.hashbelow; it is not a digest over the preceding receipt as transmitted.¶ -
chain.hash(REQUIRED, string): JSON-DIGEST of the receipt's canonical form with thechain.hashmember absent. An Issuer computes this value over the complete receipt includingchain.seqandchain.prevHash, then inserts it; a verifier recomputes it by removing the member before canonicalizing.chain.hashis never an input to its own computation.¶
A Chain-Verifier presented with two or more receipts as one contiguous chain
MUST check, for each adjacent pair, that the later receipt's chain.seq is
exactly one greater than the earlier receipt's, and that the later receipt's
chain.prevHash equals the earlier receipt's chain.hash. A verifier that
does not perform both checks MUST NOT report the presentation as a verified
chain. These are chain-level obligations; an Issuer producing individual
receipts is unaffected by them.¶
A Chain-Verifier MUST additionally compare issuerAffiliation across each
adjacent pair. Where two receipts presented as one chain carry different values,
the Chain-Verifier MUST surface the change to the relying party, identified by
the chain.seq of the receipt carrying the later value. A change in
issuerAffiliation does not by itself invalidate the presentation, and a
Chain-Verifier MUST NOT report the presentation as unverified on that basis
alone.¶
The two preceding checks are structural. chain.seq and chain.prevHash are
wholly under the Issuer's control, so a violation of either admits no honest
explanation. issuerAffiliation is not structural: it states a relationship
between two principals in the world outside the receipt, and such relationships
change. An Issuer independent of a Site Owner at one engagement may be acquired
by that Site Owner before the next. Reporting that as an unverified chain would
place an ordinary corporate event in the same category as tampering, and the
only conforming response available to the Issuer would be to begin a new chain,
which resets chain.seq and chain.prevHash and so severs the record either
side of the change. That is the continuity the chain exists to carry.¶
What a Chain-Verifier MUST NOT do is reduce the presentation to a single affiliation value. In particular it MUST NOT adopt the value carried by the latest receipt as the value of the chain. Adopting the later value would allow a chain to be relabelled after the fact by appending a single receipt, with nothing in the presentation showing that the label had previously said something else. Each reported value remains attached to the receipts that carry it.¶
A conforming three-receipt chain, the sequence-gap and broken-link cases these
checks are required to reject, and a two-receipt presentation whose members
disagree about issuerAffiliation and which is required to verify with the
change surfaced, are published as test data in the reference implementation
repository. Implementers are advised to confirm that an honest complete chain
verifies under their implementation before relying on any of these checks.¶
4.2. COSE header requirements
The protected header of a Signed Statement under this profile MUST include the CWT Claims header parameter (label 15, [RFC9597]), carrying at least:¶
-
iss(CWT claim label 1): a URI identifying the Issuer.¶ -
sub(CWT claim label 2): the value ofsite.idfrom the payload, so that SCITT registration policies can be expressed over the standardsubclaim.¶
The protected header content_type (label 3) MUST be
application/pser+json; profile=wilder.pser/0.4.¶
The Signed Statement's payload MUST be the JCS serialization of the JSON object defined in Section 4. Detached payloads are NOT PERMITTED under this revision.¶
4.3. Attestation binding
The attestation.witnessKey field carries the identity of the TEE signer.
This profile permits two attestation-binding modes, which MUST be conveyed
in the Issuer's manifest and MAY be recorded in the CWT Claims Set:¶
-
Direct-witness mode: the Issuer's
isskey is itself the TEE signer.attestation.witnessKeymatchesiss.¶ -
Delegated-witness mode: the Issuer's
isskey is distinct from the TEE signer, and the TEE has issued a delegation credential authorizing the Issuer to sign this receipt on the TEE's behalf. The delegation credential is bound by theattestation.sealedEvidence.digestand MUST be resolvable from the Issuer's manifest.¶
4.4. Clock basis
All timestamps in a Physical-Site Engagement Receipt MUST share a single clock basis: the clock the TEE observed at the time it sealed the evidence bundle. Implementations MUST NOT mix wall-clock timestamps with TEE-observed timestamps within a single receipt. Verifiers MUST derive elapsed-time computations from the receipt's own bytes, not from the verifier's local wall clock.¶
5. SCITT registration and Receipt attachment
A Physical-Site Engagement Receipt Signed Statement is registered with a
SCITT Transparency Service per [RFC9943] Section 6.3. The TS applies its
Registration Policy against the protected header (in particular iss, sub,
and content_type) before registering.¶
Upon successful registration, the TS returns a Receipt as defined in
[RFC9942]. The Receipt is attached to the Signed Statement's unprotected
header as an element of the receipts array (CBOR label 394), producing a
SCITT Transparent Statement per [RFC9943] Section 7.¶
The same Signed Statement MAY be registered in multiple Transparency Services and MAY carry multiple attached Receipts, one per Transparency Service, per [RFC9943] Section 6.3.¶
Registration is mandatory in this profile. An Issuer MUST register every Physical-Site Engagement Receipt it issues with at least one Transparency Service. A relying party MUST NOT accept a Physical-Site Engagement Receipt as conforming to this profile unless at least one attached Receipt from a Transparency Service that relying party trusts verifies per [RFC9942]. Verifying an attached Receipt does not demonstrate that the Issuer registered every receipt it issued; a relying party that requires that assurance MUST obtain it from the Transparency Service's own audit and consistency mechanisms, not from an individual attached Receipt.¶
Requiring registration does not require a relying party to be online when it verifies. An attached Receipt is a Verifiable Data Structure Proof per [RFC9942], checkable from the presented bytes together with the Transparency Service's verification key, both of which MAY be held locally. The offline-verifiable property stated in Section 2 is preserved: what registration adds is a reference obtained before verification, not a network dependency during it. This revision defines no conforming mode of operation in which no Transparency Service is reachable at issuance time.¶
An Issuer MAY register with a Transparency Service it operates itself, or
that is operated by a principal affiliated with it. Where it does so, the
Issuer MUST disclose that relationship in its manifest, and a relying party
MUST NOT treat such a registration as evidence obtained from outside the
Issuer for the purposes of Section 7. That obligation is separate from the
issuerAffiliation member of Section 4.1, which states the relationship
between the Issuer and the Site Owner rather than between the Issuer and the
Transparency Service; neither can be inferred from the other.¶
Registration with a Transparency Service operated by an unaffiliated principal is the only case in which an attached Receipt supplies a reference external to the party whose completeness is in question. This profile does not prohibit the affiliated case, because a self-operated Transparency Service still binds the Issuer to a consistent published history and still admits third-party auditing; it requires that the weaker standing of that case be visible rather than implied.¶
6. IANA considerations
This document requests the following IANA actions.¶
6.1. Media type registration
Register application/pser+json per [RFC6838], with the required
profile parameter and profile value wilder.pser/0.4.¶
6.2. COSE Header Parameters
This document does not register new COSE header parameter labels. It uses only labels defined in [RFC9052], [RFC9597], and [RFC9943].¶
6.3. New IANA registries
This document requests the establishment of the following registries under a new "SCITT Physical-Site Engagement Receipt Profile" registry group, with policy "Specification Required":¶
-
Site Class -- values of
site.class. Initial values:residential,industrial,healthcare,infra,other.¶ -
Engagement Type -- values of
engagement.type. Initial values:patrol,service,inspection,delivery,installation,maintenance,presence.¶ -
TEE Class -- values of
attestation.teeClass. Initial values:intel.tdx,amd.sev-snp,arm.cca,nvidia.h100-cc,nvidia.jetson-thor-cc,aws.nitro-enclave.¶ -
Sealed Evidence Encoding -- values of
attestation.sealedEvidence.encoding. Initial values:opaque/1.¶ -
Operations-Layer System -- values of
adapter.system. New values follow avendor.productlowercase snake_case naming convention.¶
7. Security considerations
7.1. What this profile does NOT attest
Per Section 1 and the NORMATIVE non-goals stated there, a Physical-Site Engagement Receipt does NOT attest that:¶
-
The engagement was safe, correct, effective, or compliant with any specific regulation.¶
-
The site conditions were as recorded.¶
-
No unrecorded engagement occurred outside the instrumented boundary.¶
-
The operations layer targeted by the Adapter Write-In will use, act on, or preserve the receipt correctly.¶
Relying parties MUST NOT infer these claims from a receipt.¶
7.2. Equivocation and tail-truncation
The chain field defined in Section 4 makes in-band tampering
detectable: modification, substitution, reordering, or omission of receipts
interior to a presented chain breaks a chain.prevHash link, chain.seq
contiguity, or a signature. This property holds against parties that do not
hold the Issuer's signing key. An Issuer that holds the key can sign an
alternative, internally consistent chain omitting receipts at any position.¶
The chain field does NOT detect tail truncation -- the withholding of the
most recent receipts -- in any presentation. A truncated chain is internally
consistent at every link, and no property of the presented bytes reveals the
withholding, because no receipt commits to a successor that did not exist
when it was signed. This is not a limitation of the hash or signature
algorithms: the presented bytes are identical whether or not a suffix exists.
The chain field likewise does NOT detect equivocation, in which an Issuer
signs two divergent chains for the same Subject.¶
Detecting either condition REQUIRES evidence obtained from outside the presentation. Registration of a Signed Statement in a SCITT Transparency Service [RFC9943] supplies such evidence to relying parties and auditors that check against that Service. Registration does not by itself establish completeness: a conforming Transparency Service does not compel an Issuer to register every Signed Statement it issues ([RFC9943], Section 9.3), and a Receipt proves the inclusion of one Signed Statement rather than the absence of others ([RFC9942]). A Transparency Service therefore does not detect these conditions itself; it supplies the reference against which other parties can.¶
A relying party that retains the highest chain.seq receipt it has verified
for a chain holds such a reference. A later presentation whose head precedes
that receipt, or which presents a different chain.hash at that chain.seq,
is evidence of truncation or equivocation relative to it. Relying parties
SHOULD retain these anchors. Detection reaches only as far as the anchor's
own age: a presentation ending after the retained anchor is not thereby shown
to be complete, and a presentation ending before it is not by itself proof of
misbehaviour, since it may be an earlier honest observation.¶
This profile does not define what a relying party does upon detecting such a mismatch, how long anchors are retained, or what evidentiary weight a mismatch carries. Those are matters for the relying party's own policy. A relying party that reproduces this section in a contract, underwriting rule, or adjudication SHOULD state its own remedy; this document supplies a detection property, not a remedy.¶
7.3. Adapter Write-In is write-only in this revision
The Adapter Write-In records that the receipt was posted into an operations
layer. It does NOT permit the operations layer to write back into the
receipt or the TEE. The adapter.mode field is fixed to WRITE_ONLY in
this revision; a future revision MAY define a WRITE_READ mode with
additional security machinery. Implementations that reverse this direction
in a way that permits the operations layer to modify Issuer or TEE state
are NOT conforming to this profile.¶
7.4. TEE compromise
A compromised TEE can produce receipts that are cryptographically valid
under this profile but describe engagements that did not occur or did not
occur as described. Detection of TEE compromise is out of scope of this
profile and depends on the platform-native attestation supply chain
identified by attestation.teeClass. Relying parties SHOULD consult
[RFC9943] Section 9 for guidance on Issuer participation and key
management, and the TEE vendor's own security guidance for the specific
teeClass.¶
7.5. Witness key lifecycle
A witness key signs inside a TEE that is physically hosted at a Site the Issuer may not control. The parties that can act on a suspected compromise of such a key are therefore not the same as those that can act on a compromise of a key the signer holds itself, and this document states which party may make which assertion. This revision addresses assertions about a specific witness key. Compromise of a TEE class or platform is addressed in Section 7.4 and is not a key lifecycle event under this section.¶
7.5.1. The two assertion classes
This document defines two distinct assertions about a witness key. They are named rather than numbered so that a later revision may define a third without redefining either.¶
-
Cessation. An assertion that the identified witness key MUST NOT be relied upon to produce further receipts. Cessation is forward-looking only.¶
-
Retroactive impeachment. An assertion that receipts already produced by the identified witness key SHOULD NOT be relied upon, in whole or over a stated interval. Retroactive impeachment reaches backward, and it is the stronger of the two.¶
Authority over each is asymmetric, and the asymmetry follows the capabilities the trust model already grants in Section 7.7:¶
-
Cessation MAY be asserted by the Site Owner or by the Issuer, independently of one another. Neither party requires the other's concurrence. This grants no new capability: the Site Owner can already stop production of receipts by powering the hardware off or refusing to host it (Section 7.7), and an explicit cessation assertion only makes that existing capability legible to a relying party instead of leaving it to be inferred from an absence of receipts.¶
-
Retroactive impeachment MAY be asserted by the Issuer only. The Site Owner controls whether receipts are produced but not their content (Section 7.7), and an impeachment is an assertion about content that has already been produced and registered. Extending it to the Site Owner would grant a party with no authorship capability an authority over authored records that the trust model deliberately withholds.¶
7.5.2. Scope by attestation-binding mode
The two classes apply in both attestation-binding modes of Section 4.3, and mean different things in each. An implementation MUST determine the mode before interpreting an assertion.¶
-
In direct-witness mode,
attestation.witnessKeymatchesiss, so both classes concern a single key and the Site Owner's cessation authority and the Issuer's impeachment authority attach to the same key material.¶ -
In delegated-witness mode,
attestation.witnessKeyis distinct fromiss. An assertion MUST identify the key it covers. An assertion covering the TEE signing key does not, by itself, assert anything about the Issuer'sisskey, and an assertion coveringissdoes not, by itself, assert anything about the TEE signing key. A Verifier MUST NOT extend either to the other, and MUST NOT treat an assertion whose covered key cannot be determined as covering both.¶
7.5.3. Verifier behaviour
Neither assertion deletes, invalidates, or suppresses a registered receipt. Registration is append-only and this document defines no mechanism by which a registered Signed Statement is withdrawn from a Transparency Service. A Verifier presented with a receipt for which it holds a relevant assertion:¶
-
MUST surface the assertion to the relying party rather than resolving it internally;¶
-
MUST identify which party made the assertion;¶
-
MUST identify which of the two classes was asserted;¶
-
MUST NOT suppress, discard, or downgrade the receipt on the basis of the assertion alone.¶
Neither assertion is self-authenticating, and this document does not adjudicate a disputed one. Where the Site Owner and the Issuer disagree, the profile supplies a detection property and not a remedy, in the same sense as Section 7.2. Adjudication is a matter for the relying party's own policy and for whatever legal or contractual regime governs the parties, and this document deliberately declines to make that determination on a relying party's behalf.¶
7.5.4. No payload member in this revision
This revision defines no payload member carrying either assertion. An assertion about a witness key is a separate Signed Statement about a key, not a field inside a receipt about an engagement, and placing it in the receipt payload would require a receipt to be reissued in order to change a fact about its signer. Its content type and payload shape are deferred to a subsequent revision, and this revision states that they are deferred rather than reserving a member for them.¶
7.6. Revocation decision clock
A receipt validly signed at time T whose witness key becomes subject to an
assertion at a later time presents an ordering question, and the ordering MUST NOT be decided from a timestamp the signer supplied. ts,
adapter.postedAt, and attestation.validity are all authored by the party
whose key is in question, and a signer able to forge a signature is able to
choose those values.¶
Registration is mandatory in this profile (Section 5), so every conforming receipt carries at least one attached Receipt from a Transparency Service, obtained from a party other than the signer. A Verifier that orders a receipt against an assertion MUST derive the ordering from the registration of each, as evidenced by their attached Receipts, and MUST NOT derive it from any timestamp inside the receipt payload.¶
This revision does not define an encoding for a Transparency Service's registration time, and does not require a Transparency Service to supply one. Where the Verifier cannot establish from the attached Receipts that one registration preceded the other, the ordering is undetermined, and the Verifier MUST surface it as undetermined rather than selecting an order. It MUST NOT fall back to a payload timestamp for this purpose, and MUST NOT substitute its own local clock. Stating this plainly is deliberate: a relying party writing policy against this profile needs to know that the profile carries the timebase requirement and does not yet carry the mechanism.¶
7.7. Three-party trust model
The trust model described in this section applies to deployments where the TEE that produces receipts is physically hosted at the Site. In such deployments, the site owner both controls physical access to the TEE hardware and is the party responsible for its continued operation. This profile revision does not address deployments in which the TEE travels with a mobile Actor (for example, a TEE integrated into a mobile robot's compute platform), where the party controlling the attester's physical platform is distinct from the party controlling the Site. Such on-device attester topologies are expected to be addressed in a subsequent revision.¶
The security posture of this profile REQUIRES that three distinct parties participate in every receipt, and that no single party can produce a valid receipt alone:¶
-
The site owner physically controls the TEE hardware. They can power it off, unplug it, or refuse to host it, but they CANNOT extract the signing key material or forge signatures with it. The site owner therefore controls whether receipts are produced at all, but not their content.¶
-
The TEE silicon vendor provides the hardware root of trust that binds the signing key to a specific attested platform. Detection of a compromised or counterfeit TEE relies on this supply chain and is out of scope of this profile.¶
-
The Issuer (typically the operator of a witness service) writes the Statement payload, causes the TEE to sign, registers the resulting Signed Statement with a Transparency Service, and performs the Adapter Write-In. The Issuer CANNOT sign without a live TEE. An Issuer that registers a receipt cannot prevent a relying party or auditor checking the Transparency Service from observing an equivocated chain. An Issuer that withholds a receipt from registration is not detected by this mechanism, which is why registration is mandatory in this profile (Section 5).¶
An implementation that collapses two or more of these roles into a single principal (for example, a cloud service that owns the TEE hardware AND signs AND registers with its own Transparency Service) is NOT conforming to this profile, and relying parties MUST NOT treat receipts from such an implementation as offering the trust properties defined here.¶
Customer-controlled signing keys held outside a TEE are explicitly WEAKER than the model in this profile and MUST NOT be represented as equivalent. A site owner with direct access to the signing key can backdate, forge, or suppress receipts unilaterally, and no relying party -- insurer, regulator, or counterparty -- can distinguish an authentic receipt from a fabricated one in that setting.¶
7.8. Identity attribution
Identity attribution above the key level -- linking iss, actor.id, and
site.id to real-world legal or natural persons -- requires an out-of-band
identity manifest. This profile does not specify the identity manifest
format.¶
7.9. Privacy
Site identifiers, actor identifiers, and engagement types MAY be sensitive. Issuers SHOULD publish only the digests of envelope documents and internal evidence structures, as this profile requires. Issuers MAY additionally choose to encrypt the Statement payload under a per-relying-party key and publish only the Signed Statement's Receipt to a public Transparency Service, following the guidance in [RFC9943] Section 6.2 for sensitive Statements.¶
8. Implementation status
This section records the status of known implementations of the protocol defined by this specification at the time of posting, and is based on a proposal described in [RFC7942]. The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs. This section is to be removed before publishing as an RFC.¶
Reference implementation. pask-workspace, Rust, five crates
(pask-wire, pask-attest, pask-site, pask-adapter, pask-wire-cli).
Maturity: prototype. Coverage of this profile is partial and the gaps below are
normative requirements this revision states and the implementation does not yet
meet.¶
-
Transparency Service registration is not implemented. No crate registers a Signed Statement with any Transparency Service, and none consumes an attached Receipt. Consequently every receipt this implementation has produced to date is non-conforming under Section 6 of this document, and no end-to-end verification path exists.¶
-
All three Chain-Verifier obligations of Section 4.1 are implemented in
pask-wireand exercised in continuous integration against the conforming and non-conforming chain test data referenced in Section 4.1, including theissuerAffiliationcomparison added in this revision, which returns the points at which the value changed rather than a pass or fail. This corrects the statement in-01, which reported the two checks it defined as unimplemented and was accurate when filed.¶ -
Single-receipt structure, COSE encoding, JCS canonicalization, the field semantics of Section 4.1 and the attestation binding of Section 4.3 are implemented and exercised in continuous integration. The example figure in Section 4 is emitted by the implementation and asserted byte-identical to it.¶
-
The crate disagreement reported in
-01is resolved.-01recorded thatpask-wireadmittednotAfter == notBeforewherepask-attestrequired strictly greater, and that the document did not state which was correct. Section 4.1 of this document now states the rule, and both crates enforce it.¶ -
adapter.ackProvenanceis implemented inpask-wireandpask-site, including the requirement that an unrecognized value be preserved as received and surfaced as unrecognized rather than read asTHIRD_PARTYor normalized toNONE. A conformance vector for that case ships with the implementation.¶ -
The witness key lifecycle assertions of Section 7.6 are not implemented. No crate emits, consumes, or orders an assertion about a witness key. The section states normative Verifier behaviour that the implementation does not yet exhibit.¶
The author is aware of no other implementation of this profile.¶
9. Complementary positioning
This profile is orthogonal to:¶
-
[RFC9943] (SCITT architecture) -- addresses digital supply chains; this profile addresses physical-site engagements.¶
-
[I-D.noa-scitt-ai-agent-receipt] -- addresses per-action AI-agent receipts; this profile addresses per-engagement physical receipts. An AI agent that dispatches a physical engagement MAY emit both, correlated via
sub.¶ -
[I-D.mih-scitt-agent-action-capsule] -- addresses agent-action disposition (executed, blocked, denied, errored); this profile addresses what physically occurred after dispatch and does not carry disposition semantics.¶
This profile does NOT invent a new wire format. A Physical-Site Engagement Receipt is a SCITT Signed Statement (COSE_Sign1) and verifies in any conforming COSE implementation and composes with any SCITT Transparency Service.¶
10. References
10.1. Normative References
- [RFC8785]
- Rundgren, A., Jordan, B., and S. Erdtman, "JSON Canonicalization Scheme (JCS)", RFC 8785, DOI 10.17487/RFC8785, , <https://www.rfc-editor.org/info/rfc8785>.
- [RFC9052]
- Schaad, J., "CBOR Object Signing and Encryption (COSE): Structures and Process", STD 96, RFC 9052, DOI 10.17487/RFC9052, , <https://www.rfc-editor.org/info/rfc9052>.
- [RFC9597]
- Looker, T. and M.B. Jones, "CBOR Web Token (CWT) Claims in COSE Headers", RFC 9597, DOI 10.17487/RFC9597, , <https://www.rfc-editor.org/info/rfc9597>.
- [RFC9942]
- Steele, O., Birkholz, H., Delignat-Lavaud, A., and C. Fournet, "CBOR Object Signing and Encryption (COSE) Receipts", RFC 9942, DOI 10.17487/RFC9942, , <https://www.rfc-editor.org/info/rfc9942>.
- [RFC9943]
- Birkholz, H., Delignat-Lavaud, A., Fournet, C., Deshpande, Y., and S. Lasker, "An Architecture for Trustworthy and Transparent Digital Supply Chains", RFC 9943, DOI 10.17487/RFC9943, , <https://www.rfc-editor.org/info/rfc9943>.
- [RFC2119]
- Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
- [RFC8174]
- Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
10.2. Informative References
- [RFC7942]
- Sheffer, Y. and A. Farrel, "Improving Awareness of Running Code: The Implementation Status Section", BCP 205, RFC 7942, DOI 10.17487/RFC7942, , <https://www.rfc-editor.org/info/rfc7942>.
- [I-D.noa-scitt-ai-agent-receipt]
- Toraman, T., "A SCITT Profile for AI-Agent Action Receipts", Work in Progress, Internet-Draft, draft-noa-scitt-ai-agent-receipt-01, , <https://datatracker.ietf.org/doc/html/draft-noa-scitt-ai-agent-receipt-01>.
- [I-D.mih-scitt-agent-action-capsule]
- Mih, S., "An Agent Action Capsule Profile for SCITT", Work in Progress, Internet-Draft, draft-mih-scitt-agent-action-capsule-04, , <https://datatracker.ietf.org/doc/html/draft-mih-scitt-agent-action-capsule-04>.
- [RFC6838]
- Freed, N., Klensin, J., and T. Hansen, "Media Type Specifications and Registration Procedures", BCP 13, RFC 6838, DOI 10.17487/RFC6838, , <https://www.rfc-editor.org/info/rfc6838>.
Appendix A. Change log
A.1. Changes in -02
-
Corrected two internally inconsistent statements about the Site Owner that -00 and -01 both carried. The overview described the Site Owner as owning the hardware, while the trust model described the same party by capability; the overview now uses the capability language, matching the definition added to Section 2 in this revision.¶
-
Bounded the introduction's non-extractability statement to direct-witness mode. -01 stated as a profile-wide REQUIREMENT that the signing authority be neither extractable by the Site Owner nor by the Issuer, while normatively defining a delegated-witness mode in which the Issuer signs with its own key. The statement is now scoped to the mode it describes, the weaker property of the other mode is stated, and a Verifier is required to determine the mode from the manifest rather than assume it.¶
This revision closes the reviewer-identified gap in the Adapter Write-In,
states a witness key lifecycle that -01 did not address, and records one
scope boundary that -01 left to internal doctrine. It adds two payload
members and bumps the profile identifier; it removes nothing.¶
-
adapter.ackProvenance(REQUIRED) is added and the profile identifier and media-type parameter move fromwilder.pser/0.3towilder.pser/0.4.-01carriedadapter.ackDigestwith no way for a Verifier to tell an acknowledgement authored by an independent operations layer from one authored by the Issuer under the fallback in that member's own definition. The two are now distinguishable in the receipt rather than in out-of-band context. The member is REQUIRED rather than optional because an absent value would itself have to be assigned a meaning, which reintroduces the collapse.¶ -
A Verifier MUST NOT resolve an unrecognized
adapter.ackProvenancevalue in the receipt's favour. It is preserved as received and surfaced as unrecognized, and is neither read asTHIRD_PARTYnor normalized toNONE.¶ -
issuerAffiliation(REQUIRED) is added, stating whether the Issuer and the Site Owner are affiliated principals, with the three valuesAFFILIATED,INDEPENDENTandNOT_DISCLOSED.-01gave a relying party no way to tell from a receipt whether the party that signed it had an interest in what it said, while requiring in Section 7.7 that the roles not be collapsed. The member is REQUIRED for the same reasonadapter.ackProvenanceis: an absent value would have to be assigned a meaning, and every candidate meaning either manufactures a disclosure or makes an accusation.¶ -
A Verifier MUST NOT read
NOT_DISCLOSEDasINDEPENDENT, and MUST NOT read an unrecognized value asAFFILIATEDor normalize it toNOT_DISCLOSED. The profile records the Issuer's claim about itself and defines no mechanism for verifying it; a verified receipt is evidence that the claim was made and bound, not that it is true.¶ -
A third Chain-Verifier obligation is added, and it is deliberately not a rejection. Where receipts presented as one chain carry different
issuerAffiliationvalues, the change MUST be surfaced and identified by sequence number, and the presentation remains verifiable. Unlikechain.seqandchain.prevHash, which are wholly under the Issuer's control and admit no honest violation, affiliation is a relationship in the world outside the receipt and can legitimately change. What is prohibited is reducing a presentation to a single affiliation value, and in particular adopting the latest receipt's value, which is what would permit a chain to be relabelled after the fact by appending one receipt.¶ -
Site Owner is added to Section 2, defined by capability rather than by title.
-01used the term in prose at three places in Section 7.7 without defining it, and this revision is the first to assign it a normative capability.¶ -
A witness key lifecycle is stated (Section 7.5), defining two named assertion classes. Cessation may be asserted by the Site Owner or the Issuer independently; retroactive impeachment may be asserted by the Issuer only. Neither deletes, invalidates, or suppresses a registered receipt. Both are scoped against the two attestation-binding modes of Section 4.3, and in delegated-witness mode an assertion MUST identify the key it covers.¶
-
No payload member carries either assertion in this revision. The content type and payload shape of an assertion about a key are deferred, and this revision states the deferral rather than reserving a member.¶
-
A revocation decision clock is stated (Section 7.6), requiring the ordering of a receipt against an assertion to be derived from registration rather than from any signer-supplied timestamp, and requiring an ordering that cannot be established to be surfaced as undetermined rather than guessed.¶
-
Compromise of a TEE class or platform is stated not to be a key lifecycle event and remains out of scope (Section 7.4).¶
-
A scope boundary is added to Section 1.2: the profile attests nothing about the internal state, intent, or decision process of a human participant, nor about signals conveyed by a direct neural or brain-computer interface. No member, value, or extension point is defined for one.¶
-
Two implementation-status statements in
-01are corrected. The Chain-Verifier checks defined by-01are now implemented, and the crate disagreement over a zero-length attestation validity interval is resolved with the rule stated in Section 4.1.¶
A.2. Changes in -01
This revision made two groups of changes. The first reconciles the profile
identifier and four attestation members with the reference implementation and
changes how the example figure in Section 4 is produced. The second corrects
statements in -00 that were found to be wrong or unsupported, and adds
normative requirements that -00 implied without stating. Both groups are
enumerated below. Every normative change in this revision appears in one of
them.¶
A.2.1. Reconciliation with the reference implementation
-
The profile identifier and media-type parameter are
wilder.pser/0.4. A producer built againstwilder.pser/0.2is rejected on version validation rather than on an unknown member.¶ -
attestation.measuredBootChain(string) is replaced byattestation.measuredBoot, an object carrying the chain digest and the component sequence that hashes to it.¶ -
attestation.platformEvidenceis an object carrying a digest and an encoding label, rather than a bare string.¶ -
attestation.validityis added and is REQUIRED. It carriesnotBeforeandnotAfter.notAfterMUST be strictly later thannotBefore; a zero-length interval is rejected. This revision does not require a Verifier to testtsagainst the interval, and says so rather than implying a check that does not happen.¶ -
The TEE Class registry is stated to be requested and not yet allocated, and the route by which a value is added is stated explicitly, so that an implementer on an unlisted confidential-compute environment has a documented path rather than only a rejection.¶
-
The TEE Class registry values name confidential-compute environments rather than instruction set architectures.¶
-
The Section 4 example is a complete, literal instance emitted by the reference implementation, and is asserted byte-identical to that implementation in its continuous integration. The -00 figure was a schema template rendered in a JSON code block and did not parse as JSON.¶
A.2.2. Corrections and added normative requirements
-
The claim that the hash chain detects tail truncation is withdrawn. The
chainfield does not detect the withholding of the most recent receipts in any presentation, and does not detect equivocation. Section 7.2 is rewritten to state what the chain does and does not establish, and to attribute detection of either condition to evidence obtained from outside the presentation. The Abstract no longer asserts truncation detection, and the corresponding Section 1 scope bullet is rewritten. An appeal to TEE attestation as establishing recency is removed as unsound: a TEE establishes that it wrote the state it attests, not that that state is the most recent.¶ -
The
chainconstruction is now specified normatively in this document.-00deferred part of it to [I-D.noa-scitt-ai-agent-receipt]; that document is now cited for provenance only, and no conformance requirement of this profile depends on it.¶ -
chain.seqis stated as non-negative rather than monotonic, and the first receipt in a chain MUST carrychain.seq0.-00used "monotonic", which does not constrain a single receipt and did not state the head value.¶ -
Two chain-level verification requirements are added. A Chain-Verifier presented with two or more receipts as one contiguous chain MUST check
chain.seqcontiguity and MUST check that eachchain.prevHashequals the preceding receipt'schain.hash.-00described these properties as holding without requiring any party to check them. Chain-Verifier is defined in Section 2.¶ -
chain.prevHashis redefined to remove an inconsistency that made the chain check unsatisfiable.-00and an earlier draft of this revision definedchain.prevHashas a digest of "the immediately preceding receipt", while definingchain.hashas a digest taken with thechain.hashmember absent. Read literally, those two definitions do not produce equal values, so the adjacent-pair check added above would have rejected every honest chain.chain.prevHashnow carries the preceding receipt'schain.hashvalue by reference to that member rather than by an independent digest definition, and the exclusion is restated in both places. This was found by constructing a three-receipt chain and evaluating the requirement against it.¶ -
Registration is now mandatory. An Issuer MUST register every receipt it issues with at least one Transparency Service, and a relying party MUST NOT accept a receipt as conforming without a verifying attached Receipt from a Transparency Service it trusts.
-00described registration as REQUIRED in its scope discussion without stating the requirement normatively. Where the Transparency Service is operated by the Issuer or an affiliate, that relationship MUST be disclosed and MUST NOT be treated as evidence external to the Issuer.¶ -
A relying party SHOULD retain the highest verified
chain.seqper chain as an anchor. The limits of that anchor, and the absence of any remedy defined by this profile, are stated explicitly.¶ -
Section 7.5 no longer states that an Issuer cannot prevent an equivocated chain from being detected once registered. An Issuer that does not register is not detected by that mechanism; the mandatory-registration requirement is the response to that gap.¶
Acknowledgments
The author thanks the SCITT WG for RFCs 9942 and 9943, and the authors of [I-D.noa-scitt-ai-agent-receipt] and [I-D.mih-scitt-agent-action-capsule] for establishing the SCITT-AI receipt idiom on which this profile builds.¶
The author thanks GitHub user giskard09 for a detailed public review of the
-01 adapter and verifier semantics. That review identified that
adapter.ackDigest was structurally unable to distinguish an acknowledgement
authored by an independent operations layer from one authored by the Issuer,
and pressed for the distinction to be carried in the receipt rather than left
to out-of-band context. The adapter.ackProvenance member defined in
Section 4 is the result. The requirement that a value outside its closed set
be surfaced as unrecognized, rather than read as THIRD_PARTY or normalized to
NONE, is also his.¶