| Internet-Draft | Physical-Site Engagement Receipt | September 2026 |
| Wilder | Expires 18 March 2027 | [Page] |
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.¶
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 18 March 2027.¶
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.¶
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.4) 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
attestation.bindingMode in the receipt before relying on the
non-extractability property, and MUST NOT assume direct-witness mode.
A receipt carrying no attestation.bindingMode is rejected on version
validation under Section 4 and no mode is inferred for 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 adapter field 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 chain nor 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.¶
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.¶
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.¶
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:¶
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.¶
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.¶
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.8. The Site Owner has no capability to author, alter, or suppress the content of a receipt, and none to extract the signing key material.¶
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.¶
The organization or individual responsible for the Actor during the engagement, distinct from the Issuer of the receipt when a third-party witness signs.¶
A bounded interval, delimited by an Engagement Window, during which the Actor performed physical work at the Site under the Site Envelope.¶
The time interval [start, end] of the Engagement, expressed in RFC 3339 UTC, with the same clock basis as the TEE-sealed 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.¶
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.¶
A SCITT Signed Statement under this profile, carrying a canonical JSON
payload conforming to Section 4, with the profile identifier
wilder.pser/0.6 and a SCITT Receipt attached as defined in
[RFC9942].¶
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.¶
The profile identifier for this document is wilder.pser/0.6 and MUST appear
as the value of the top-level spec member of the payload defined in
Section 4. The media type parameter profile carries the same value.¶
A receipt declaring wilder.pser/0.5 remains subject to the published
requirements of that earlier profile version. An implementation supporting
both profile versions evaluates each receipt under its declared version's
requirements. Unknown or unsupported versions are reported as unsupported,
not treated as known versions with failed checks.¶
The COSE content_type (protected header label 3, [RFC9052]) for a
Physical-Site Engagement Receipt Statement is
application/pser+json; profile=wilder.pser/0.6. 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.¶
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 illustrative. Its digests are placeholders, the identifiers are
synthetic, and the teeClass value is one conforming registry entry chosen so
the example round-trips. The chain.hash value is computed over the
canonicalized payload with chain.hash absent. 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": {
"bindingMode": "DIRECT_WITNESS",
"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:9c5e4ef37e741d096118adfdb1fe46dcd72dd0f6960a11888d7a1815cf817e1e",
"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.6",
"ts": "2026-10-15T14:00:00Z"
}
spec (REQUIRED, string)
MUST be wilder.pser/0.6 for receipts conforming to this document. A
verifier MUST reject a Statement with a spec value outside the supported
set as out of scope of this profile. An implementation supporting multiple
profile versions evaluates each receipt under its declared version's
requirements. A receipt declaring wilder.pser/0.5 remains subject to the
published requirements of that earlier profile version.¶
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.¶
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.¶
For a receipt declaring wilder.pser/0.6, the Verifier MUST check
notBefore <= ts <= notAfter using parsed instants and inclusive endpoints.
The comparison checks whether the asserted receipt-issuance timestamp lies
within the asserted attestation-validity interval. It does not independently
establish the actual time of issuance or whether the engagement occurred
within that interval. A timestamp at either endpoint passes this check only;
it does not establish overall receipt conformance.¶
This containment requirement does not apply to a receipt declaring
wilder.pser/0.5. An implementation supporting both profile versions
evaluates each under its declared version's requirements. A verifier-selected
clock-skew tolerance MUST NOT alter the profile's containment interval.¶
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 affiliation disclosure required of an Issuer that registers with a Transparency Service it operates or that is operated by an affiliated principal (Section 5), which is an Issuer-published fact resolved under Section 4.3 rather than a member of this payload. 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.¶
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 CWT sub claim 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. null values indicate "open-ended in that
direction."¶
engagement (REQUIRED, object)
engagement.id (REQUIRED, string): stable identifier of the engagement.¶
engagement.window.start and engagement.window.end (REQUIRED, string):
RFC 3339 UTC bounds of the engagement. end MUST be >= start. Both MUST
share a clock basis with attestation.sealedEvidence (see
Section 4.6).¶
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 of COMPLETED,
ABORTED, REFUSED, ERRORED, OBSERVED_ONLY. OBSERVED_ONLY records
that the Issuer witnessed the actor at the site but did not participate
in dispatch.¶
engagement.envelopeConformance (REQUIRED, string): one of WITHIN,
EXCEEDED_TEMPORAL, EXCEEDED_GEO, EXCEEDED_ACTOR, UNKNOWN. The
Issuer MUST NOT claim WITHIN unless 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.¶
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. Verification of the Signed Statement and its attached Receipt alone does not establish hardware provenance. That property additionally depends on obtaining and validating the platform attestation evidence and its binding to the relevant key under the relying party's trust policy.¶
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.
A Verifier MUST reject a teeClass value outside that set.¶
These descriptions identify the environments named by the existing values.
They do not, by themselves, define a complete evidence-format binding or
establish implementation support. Evidence encoding, versioning, trust
inputs, and appraisal requirements are addressed by the applicable evidence
specification and the profile's attestation model
(attestation.platformEvidence, Section 4).¶
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
a name (REQUIRED, string) naming the measured component and a digest
(REQUIRED, string) carrying its measurement. Verifiers MUST NOT infer any
meaning from name beyond 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's iss when the TEE
operates as a delegated witness.¶
Under the wilder.pser/0.6 DIRECT_WITNESS naming convention,
attestation.witnessKey and the protected CWT iss value MUST be
textually equal. A successful comparison establishes this naming
convention only. It does not establish that the signature-verification
key is authentically associated with either identifier or that genuine
TEE hardware produced the signature. This convention does not require a
global one-to-one mapping between all issuer identifiers and keys,
prohibit key rotation, or redefine issuer identity as key material. The
actual DIRECT_WITNESS relationship still concerns the key that produced
the signature and the TEE signing key. Authenticated key association and
hardware provenance require their respective evidence and trust
mechanisms; they are not supplied by label equality. This naming
restriction MUST NOT be silently applied as a changed conformance rule
for wilder.pser/0.5.¶
attestation.bindingMode (REQUIRED, string): the attestation-binding mode
under which this receipt was produced, as defined in
Section 4.4. The admissible values are exactly:¶
DIRECT_WITNESS: the key that produced the COSE signature is the TEE
signing key. attestation.bindingMode is DIRECT_WITNESS only where
attestation.witnessKey and iss denote the same key.¶
DELEGATED_WITNESS: the key that produced the COSE signature is the
Issuer's own, and a TEE-issued delegation credential authorizes it.¶
A Verifier MUST reject a bindingMode value outside that set, and MUST
reject a receipt asserting DIRECT_WITNESS in which attestation.witnessKey
and iss denote different keys. The value is closed in this revision and is
not registry-governed.¶
This member is REQUIRED, and carries in the receipt a fact that -02 required
a Verifier to obtain from the Issuer out of band. The mode was fixed at the
moment the receipt was signed and was known to the signer; obtaining it from a
separately published document made a per-receipt fact depend on a document
that describes an Issuer rather than a receipt, and made the weaker of the two
properties in Section 2 unavailable from the presented bytes. An absent
value is not assigned a meaning, because assigning one reintroduces the
assumption this member exists to prevent.¶
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. notAfter MUST be strictly
later than notBefore; a Verifier MUST reject a receipt whose notAfter is
equal to or precedes its notBefore. A zero-length interval asserts
validity for an instant of zero duration and has no legitimate producer.
For a receipt declaring wilder.pser/0.6, a Verifier MUST reject the
receipt when the asserted ts is outside the asserted [notBefore,
notAfter] interval, using parsed instants and inclusive endpoints. This
checks consistency of the recorded instants, not independently established
real-world issuance time. The published wilder.pser/0.5 profile did not
require timestamp containment; that historical requirement remains
unchanged.¶
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. That object is bound by the receipt's Merkle inclusion
and is not published, so no Verifier can obtain it and none is required to.
This is not a resolution obligation under Section 4.3: a Verifier
checks that adapter.ackProvenance is ISSUER_ASSERTED and treats the
acknowledged content as authored by the Issuer. -02 located the object's
schema in an Issuer-published document, which stated an obligation against a
document defined to be unfetchable.¶
adapter.ackProvenance (REQUIRED, string): identifies which party authored
the acknowledgement that adapter.ackDigest commits to. adapter.ackDigest
alone 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 in adapter.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 under adapter.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 to NONE. 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 be WRITE_ONLY in this revision.
Read-in modes are explicitly out of scope; see Section 7.¶
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 carry chain.seq 0.¶
chain.prevHash (REQUIRED, string or null): the value of the
immediately preceding receipt's chain.hash, or null for the first
receipt. A receipt whose chain.seq is 0 MUST carry null; a receipt
whose chain.seq is nonzero MUST carry the preceding receipt's
chain.hash value. Note that this is a digest over the preceding
receipt EXCLUDING its chain.hash member, per the definition of
chain.hash below; it is not a digest over the preceding receipt as
transmitted.¶
chain.hash (REQUIRED, string): JSON-DIGEST of the receipt's canonical
form with the chain.hash member absent. An Issuer computes this value
over the complete receipt including chain.seq and chain.prevHash, then
inserts it; a verifier recomputes it by removing the member before
canonicalizing. chain.hash is 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.¶
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 of site.id from the payload, so
that SCITT registration policies can be expressed over the standard sub
claim.¶
The protected header content_type (label 3) MUST be
application/pser+json; profile=wilder.pser/0.6.¶
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.¶
Two obligations in this profile require a Verifier to obtain a fact the Issuer publishes rather than carries in the receipt: the delegation credential of Section 4.4, and the Transparency Service affiliation disclosure of Section 5. Both are disclosures about the Issuer. Neither is an identity claim, and neither is required to evaluate a receipt produced in direct-witness mode by an Issuer registering with an unaffiliated Transparency Service.¶
This revision does not specify a serialization format for these facts, and does
not define a document that carries them. -02 referred to an "Issuer's
manifest" in four normative requirements without defining one, so a Verifier was
four times required to read something the profile never described. Naming the
obligations and their resolution behaviour, and leaving the encoding to a
subsequent revision or companion document, is deliberate: a format fixed before
any has been deployed is more likely to be repudiated by the next revision than
refined by it.¶
An Issuer-published fact is resolved as follows.¶
The Issuer MUST make the fact retrievable at a stable identifier under its own
control, and that identifier MUST be discoverable from iss.¶
A Verifier MAY cache a resolved fact. A cached answer MUST NOT survive a change in the signing key it was resolved for; on such a change the Verifier MUST re-resolve.¶
Where a fact does not resolve, whether because it is unreachable, absent, or unreadable, the fact is undetermined.¶
Undetermined is a third outcome, not a synonym for either answer. A Verifier MUST surface an undetermined fact as undetermined. It MUST NOT resolve an undetermined fact to whichever value favours the Issuer, and MUST NOT report that a fact was absent where it was never successfully retrieved: those two states are distinct and a relying party's policy may treat them differently. A Verifier MUST NOT reject a receipt solely because an Issuer-published fact is undetermined; whether an undetermined fact is disqualifying is a policy question for the relying party and is out of scope for this profile. What the profile requires is that the relying party be told.¶
Conformance vectors accompanying this revision MUST include, for each Issuer-published fact, at least one case in which resolution fails, and the expected outcome of such a case MUST NOT be acceptance.¶
The attestation.witnessKey field carries the identity of the TEE signer.
This profile permits two attestation-binding modes. The mode under which a
receipt was produced MUST be carried in that receipt, in
attestation.bindingMode (Section 4), and MAY additionally be recorded in
the CWT Claims Set. It is not obtained from any Issuer-published document:¶
Direct-witness mode: the signing key associated with the Issuer identified
by iss is the TEE signing key. Under wilder.pser/0.6,
attestation.witnessKey and the protected CWT iss value MUST be textually
equal under the naming convention defined in this profile. That comparison
establishes identifier consistency only; it does not establish authenticated
association with the key used to verify the signature or genuine hardware
provenance. The published wilder.pser/0.5 requirement to reject a
DIRECT_WITNESS receipt whose identifiers denote different keys remains part
of that earlier profile. The new 0.6 string comparison neither changes the
earlier profile nor supplies the missing authenticated-key-association
mechanism. The reference implementation's broader assurance limitation is
recorded in Section 8.¶
Delegated-witness mode: the Issuer's iss key 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 the attestation.sealedEvidence.digest and is an
Issuer-published fact resolved under Section 4.3. Where it does not
resolve, the authorization of the signing key is undetermined and the
Verifier proceeds as required by that section. Delegated signing does not
itself establish evidence appraisal.¶
This revision retains the existing attestation payload structure and introduces
neither an attestation.quote member nor an attestationResult member. The
payload carries references, digests, and attestation-related claims;
measuredBoot also carries the listed component measurements. The existing
allowance for the platform attestation document to be supplied by reference or
inline in the enclosing Signed Statement's unprotected header is unchanged.¶
A relying party may appraise obtained Evidence itself or use a separate Verifier channel. A digest commits to particular evidence bytes; it is not, by itself, a retrieval address, a retrieval mechanism, or evidence appraisal. Obtaining evidence whose digest matches a receipt is distinct from validating that evidence and its binding to the relevant key.¶
An entity performs the RATS Verifier role only when it appraises Evidence using the applicable trust inputs and appraisal policy and produces an Attestation Result. A single entity may perform several roles, but their combination must be stated rather than inferred from the signing mode.¶
Verification of the Signed Statement and attached Receipt alone does not establish hardware provenance. The choice of any additional in-receipt Attestation Result representation remains open. Its format, authentication, evidence/key binding, freshness, and failure behavior are not specified by this revision. Option D (retain evidence references and additionally support an optional Attestation Result) is a future design direction, not an added -04 payload member. These functional distinctions follow the RATS role definitions ([RFC9334]).¶
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.¶
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.¶
This revision specifies the candidate-entry byte encoding for inclusion-proof verification. For this profile, the presented object MUST be a COSE_Sign1 with four array elements: protected-header byte string, unprotected-header map, attached-payload byte string, and signature byte string. The payload MUST be present as a byte string; a null payload indicating detached content is not permitted. The input may be an untagged COSE_Sign1 or a COSE_Sign1 wrapped in tag 18. Other tag wrappers are not accepted by this derivation.¶
The verifier derives the candidate entry as the untagged four-element array
[P, {}, M, S], where P, M, and S are the original protected-header, payload,
and signature byte-string contents. The candidate entry MUST use the core
deterministic encoding requirements of [RFC8949], Section 4.2.1, for the
outer array, empty map, and byte-string framing. The contents of P, M, and S
are preserved unchanged; this requirement does not instruct the verifier to
parse and reserialize those contents. The outer array is definite-length, the
empty map is encoded as 0xa0, and the three byte strings use the shortest
definite-length encodings of their lengths.¶
This derivation MUST preserve P, M, and S by content. It MUST NOT parse and reserialize their contents to construct the candidate entry. The original outer CBOR length encodings and any permitted outer tag are not preserved. These derivation rules do not waive separate COSE header, signature, payload, or profile validation. Parsing a header for validation is distinct from rewriting its bytes for hashing. This follows RFC 9943 Section 6.3, which requires the unprotected header of a Signed Statement to be set to an empty map before inclusion in the Statement Sequence.¶
Transmitted envelopes use COSE tag 18 ([RFC9052]), and attached receipts are encoded as byte strings containing tagged Receipt objects per [RFC9942] Section 4.3. The untagged candidate entry is a profile-internal representation used for hashing; it is not the transmitted wire form. A Transparency Service that hashes a different representation (for example, the tag-18 form) cannot satisfy this profile unless it commits to the candidate-entry representation specified here. This is the profile imposing a requirement on a party it does not control: an existing TS that hashes the tagged form cannot satisfy the profile without adaptation.¶
A Transparency Service used to satisfy this profile's inclusion requirement MUST issue a Receipt whose inclusion proof commits to the candidate-entry representation specified in this section. The applicable registration path and the verifier MUST use the same derivation and serialization rule. Emptying the unprotected map alone does not establish agreement on the remaining serialized bytes. The service's internal storage format is not prescribed, but the candidate-entry bytes against which its proof verifies are prescribed. Registration and verification alignment MUST be demonstrated by byte-exact fixtures, including derivation from the presented Transparent Statement without access to retained producer-side bytes.¶
Attaching, removing, or modifying receipts in the unprotected header does
not change the candidate entry: candidate_entry(S) ==
candidate_entry(attach_receipt(S, R)) for any receipt R. This is the
property that makes inclusion proofs portable: the proof covers the
registered statement, not whatever receipts happen to be attached to it at
verification time.¶
The profile's inclusion requirement is satisfied only when at least one attached Receipt has both a valid Transparency Service signature under an accepted service key and a valid inclusion proof for the derived candidate entry. A Receipt that is invalid, unsupported, or associated with an untrusted service does not count toward that requirement. A structurally parseable additional Receipt whose cryptographic verification fails MUST NOT, solely by its presence, defeat another attached Receipt that satisfies the inclusion requirement. A separately identified local policy may impose stricter acceptance conditions. This rule does not relax validation of the enclosing COSE structure or malformed attachment containers. Receipt signature verification, inclusion-proof verification, and issuer-signature verification are separate checks. Satisfying the inclusion requirement does not establish full PSER conformance; every other applicable profile requirement still applies. An absent proof and an invalid, unsupported, or untrusted proof are not reported as successful inclusion.¶
For RFC9162_SHA256, the leaf hash is
SHA256(0x00 || candidate_entry), using the leaf construction in
[RFC9162], Section 2.1.1. Receipt representation and verification follow
the applicable RFC9162_SHA256 procedures in [RFC9942]. This formula is
not applied by default to another or unknown VDS. Verification of another
supported VDS uses that VDS's specified procedure. This paragraph does not
add a PSER-wide prohibition on other SCITT VDS types. The current reference
implementation's support is limited to RFC9162_SHA256; unsupported VDS
values are reported as unsupported and cannot count as successfully verified
evidence.¶
This specification does not prescribe how a Transparency Service stores the entry internally. Interoperability requires only that the inclusion proof verifies when the verifier uses the candidate entry derived from the presented Transparent Statement.¶
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 as an Issuer-published fact resolved
under Section 4.3, and a relying party MUST NOT treat such a
registration as evidence obtained from outside the Issuer for the purposes of
Section 7. Where the disclosure does not resolve, the standing of the
registration is undetermined; a Verifier MUST NOT resolve it to the
unaffiliated case, which is the Issuer-favourable one. 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.¶
This document requests the following IANA actions.¶
Register application/pser+json per [RFC6838], with the required
profile parameter identifying the applicable PSER profile version.
This document specifies the value wilder.pser/0.6. The value
wilder.pser/0.5 identifies the profile specified by published revision
-03 and retains that revision's requirements.¶
A version-shaped value does not by itself identify a supported profile. Unknown or unsupported values are reported as unsupported and are not interpreted using the rules of another version.¶
This document does not register new COSE header parameter labels. It uses only labels defined in [RFC9052], [RFC9597], and [RFC9943].¶
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.¶
These descriptions identify the environments named by the existing values. They do not, by themselves, define a complete evidence-format binding or establish implementation support.¶
intel.tdx: Intel Trust Domain Extensions, a VM-level isolation
primitive.¶
amd.sev-snp: AMD Secure Encrypted Virtualization with Secure Nested
Paging, a VM-level isolation primitive.¶
arm.cca: Arm Confidential Compute Architecture, a hardware
isolation framework.¶
nvidia.h100-cc: NVIDIA H100 in Confidential Computing mode, a
device-level isolation primitive.¶
nvidia.jetson-thor-cc: existing product-named identifier associated
with NVIDIA Jetson Thor. Retained provisionally and unchanged; this
profile does not establish the exact confidential-compute capability,
evidence format, or appraisal binding represented by this value.¶
aws.nitro-enclave: AWS Nitro Enclave, a cloud-provider isolation
primitive.¶
A confidential-compute environment absent from the admissible set is not conforming and is not silently folded into an existing value. The registry is the route by which one becomes conforming, and its governance is stated above. This revision clarifies existing identifiers with descriptive context. It does not add, remove, or rename any value, and it does not resolve the evidence-format question for any value.¶
Sealed Evidence Encoding -- values of
attestation.sealedEvidence.encoding.
Initial values: opaque/1.¶
Operations-Layer System -- values of adapter.system. New values
follow a vendor.product lowercase snake_case naming convention.¶
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.¶
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.¶
This revision does not define an interoperable corrective-statement wire format
or impose correction-related requirements on wilder.pser/0.6 conformance. An
informative corrective-statement design is recorded in Appendix A
for discussion. A correction does not reset the original's
attestation.validity interval. Conflicting corrections are surfaced, not
resolved. No automatic winning history is computed.¶
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.¶
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.¶
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.5 and is not a key lifecycle event under this section.¶
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.8:¶
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.8), 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.8), 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.¶
The two classes apply in both attestation-binding modes of Section 4.4, and mean different things in each. An implementation MUST determine the mode before interpreting an assertion.¶
In direct-witness mode, attestation.witnessKey matches iss, 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.witnessKey is distinct from
iss. An assertion MUST identify the key it covers. An assertion covering
the TEE signing key does not, by itself, assert anything about the Issuer's
iss key, and an assertion covering iss does 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.¶
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.¶
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.¶
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.¶
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 not addressed here because a prerequisite is not yet in place, and naming that prerequisite is more useful than restating the deferral.¶
A travelling TEE is a delegated-witness deployment: the platform is controlled by a party other than the Site Owner, so the authorization to sign on the TEE's behalf must be evaluated by a Verifier rather than assumed from physical custody of the hardware. That evaluation depends on resolving the delegation credential, which this revision defines as an Issuer-published fact (Section 4.3) whose serialization is not yet specified. Until the encoding of that fact is fixed, a mobile-attester topology cannot be described in a way two implementations would evaluate identically, and specifying the topology first would produce a mode that reads as normative and cannot be conformed to.¶
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.¶
This profile addresses two affiliation relationships. issuerAffiliation
(Section 4) states the relationship between the Issuer and the Site Owner. The
disclosure of Section 5 states the relationship between the Issuer
and the Transparency Service. Neither states the relationship between the Site
Owner and the Transparency Service, and this revision provides no member and no
Issuer-published fact that carries it.¶
The gap is not covered by the other two. An Issuer independent of both the Site Owner and the Transparency Service satisfies both existing disclosures, while a Site Owner that operates the Transparency Service the Issuer registers with still obtains, at the registration step, the ability to suppress or withhold entries concerning its own site. The external reference that Section 5 requires is then external to the Issuer but not to the party whose conduct at the site is in question, which is the party a relying party is usually evaluating.¶
A relying party that requires registration evidence external to the Site Owner cannot establish that property from a receipt conforming to this revision, and MUST obtain the relationship out of band. Stating this is deliberate: a policy author reading Section 5 could otherwise conclude that an unaffiliated-Issuer registration establishes independence from the site, which it does not.¶
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 binding document. This profile does not specify that document's
format. -02 called it an identity manifest, which collided with the unrelated
Issuer-published facts of Section 4.3; the two were never the same
document and the shared name implied they were.¶
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.¶
This section records the status of known implementations of the protocol defined by this specification and follows the approach described in [RFC7942]. It is intended to assist review of the specification and does not imply IETF endorsement. This section is to be removed before publication as an RFC.¶
Reference implementation. pask-workspace, maintained by Wilder Robotics,
is a prototype Rust workspace with six crates: pask-wire, pask-attest,
pask-site, pask-adapter, pask-wire-cli, and pask-ts-client. Source:
https://github.com/wilder-robotics/pask-workspace.¶
The implementation assessment is based on merged source through commit
83d4b56e49a3b09d088bddd0802c81b73ac34664, which incorporates the changes from
PRs #68 and #69. The source revision containing this draft additionally
provides a wilder.pser/0.6 example generator and tests that compare the
active draft's payload figure byte-for-byte with its output. The existing
wilder.pser/0.5 generator and regression fixtures are retained.¶
Version support and implemented checks. The implementation supports
wilder.pser/0.5 and wilder.pser/0.6. It selects and checks the protected
content type against the declared payload version. For 0.6, it implements
receipt-issuance timestamp containment within the recorded attestation
validity interval and the DIRECT_WITNESS exact-string identifier convention.
Those additional checks are not imposed retroactively on 0.5.¶
Candidate-entry derivation preserves the contents of the protected-header,
payload, and signature byte strings and constructs the deterministic
untagged outer array [P, {}, M, S]. The implementation also provides
RFC9162_SHA256 leaf hashing and inclusion-proof/signature verification, and
reads attached Receipts in byte-string form. Its reader additionally accepts
specified legacy forms for compatibility; accepting those forms does not
establish transmitted-envelope conformance.¶
Receipt-chain verification checks the relationships between presented
payloads and reports affiliation changes. Submission code exists in
pask-ts-client. A test-only recipient path exercises derivation, Receipt
extraction, and proof selection with controlled keys and independent expected
vectors. It is not an exported application-level aggregate verifier.¶
Remaining limitations. The implementation does not establish authenticated association between the signature-verification key and the claimed witness or Issuer identifiers for either supported version. The 0.6 label comparison does not close the historical 0.5 key-association gap or establish hardware provenance. Vendor-evidence appraisal and the witness-key lifecycle assertions remain incomplete. Timestamp containment checks recorded-time consistency, not independently established real-world issuance time.¶
Sender wire-format handling and full SCITT Receipt-envelope/claims validation remain tracked as issues #70 and #71, respectively. Application-facing aggregate verification and complete cryptographic interoperability against an independent Transparency Service remain open. The disclosed test paths do not establish production readiness or complete profile conformance.¶
Corrective-statement production and verification are not implemented. The informative appendix records a design for discussion, not a frozen corrective wire format or an implemented feature (Appendix A).¶
Licensing. pask-wire, pask-attest, and pask-wire-cli are Apache-2.0.
pask-site, pask-adapter, and pask-ts-client are AGPL-3.0-only.¶
The author is aware of no other implementation of this profile.¶
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.¶
This appendix is informative and records a corrective-statement design for
discussion. It does not define an interoperable corrective-statement wire format
or impose additional requirements on wilder.pser/0.6 engagement receipts. The
corrective content type, versioning, and signed-statement reference encodings
remain unresolved. No correction implementation or completeness of correction
discovery is claimed.¶
A correction is a SCITT Signed Statement registered with a Transparency Service.
It is not a PSER engagement receipt. It carries its own content_type, distinct
from application/pser+json; profile=wilder.pser/0.6. It does not carry the
PSER spec member. It has its own versioning arrangement.¶
The correction payload would carry:¶
target (required, string): identifies the original signed assertion
being corrected. Encoding is not frozen in this revision. The reference
encoding is unresolved and coordinated with issue #67. The reference
mechanism must work for both engagement receipts and corrective statements.¶
kind (required, string): the kind of corrective assertion. Admissible
values:¶
AMENDMENT: the signer asserts that its own earlier statement was wrong,
incomplete, or should no longer be relied upon. Same iss as the original
is allowed. If a different iss is used, continuity or authorization must
be established before the verifier reports it as that issuer's amendment.¶
CHALLENGE: the signer disputes another issuer's identified statement.
Different iss is expected. Different issuer identifiers do not establish
organizational independence or authority.¶
CORROBORATION: the signer supports a specified amendment or challenge.
NOT labeled "independent support." Independence is reported separately when
supported by evidence or policy.¶
content (required, object): the corrective assertion. Would carry:¶
ts (required, string): RFC 3339 UTC timestamp at which the correction
was signed.¶
amends (optional, object): identifies a specific earlier correction
being withdrawn or replaced. Would carry:¶
ref (required, string): reference to the earlier correction. Same
encoding as target.¶
operation (required, string): WITHDRAW or REPLACE.¶
Withdrawal and replacement authority is checked against the statement
being changed (the earlier correction), not just against the original
receipt. Both WITHDRAW and REPLACE operations require this check. A
claimed withdrawal or replacement is attributable as an action by the
earlier statement's issuer only when that identity or authorization
relationship is established. Otherwise it remains another party's
assertion about that statement.¶
supports (required for CORROBORATION, string): reference to a
specific amendment or challenge being corroborated. Same encoding as
target. Every CORROBORATION identifies the specific statement it
supports.¶
The signer declares the kind. The verifier reports which identity and
relationship checks were established. The relying party assigns evidentiary
weight. No universal different-iss requirement applies. Same-iss amendments
are allowed. Different issuer identifiers do not establish organizational
independence or authority.¶
In this proposed model, a CHALLENGE would be evaluated against the public key
of the statement being challenged. Where both relevant signatures have been
successfully verified and a supported comparison establishes that the
verification keys are the same, the verifier would report that the declared
CHALLENGE fails the proposed distinct-key/kind-consistency condition. It would
preserve the signed declared kind and report the reason separately. The
statement's signature and any inclusion proof may still verify; the
kind-consistency failure would not rewrite either signed record, silently
convert the CHALLENGE to an AMENDMENT, or automatically invalidate the
original. It would not determine the truth of the disputed facts.¶
Kind consistency and its supporting key-relationship result would appear as explicit, machine-readable findings in the primary result for each evaluated corrective statement, and a failure or unestablished required relationship would be visible in the main report summary. They would not be available only as optional metadata. A broad summary that a correction is verified would not conceal a failed or unestablished required kind-consistency check. When a referenced statement, a successful signature verification, or the required comparison inputs are unavailable, the relationship would be reported as unestablished with a reason, not as different keys or as a successful consistency result. Issuer-signature, inclusion, kind-consistency, authority, original-statement, and local-policy findings would remain distinguishable.¶
For CORROBORATION, the verifier would report the signing-key relationship to
the statement named by supports and to the original anchor separately. Reuse
of the supported statement's key would not count as an additional distinct-key
source. Reuse of the original anchor's key alone would not force amendment
classification. Different keys would not, by themselves, establish
organizational independence.¶
These paragraphs describe proposed reporting behavior. They do not finalize an
output schema, field names, diagnostic-code registry, or corrective-statement
wire format, and do not add a correction-processing requirement to
wilder.pser/0.6 engagement receipts.¶
An illustrative reporting example, not a specified schema:¶
Corrective statement C1, challenging original O1 Declared kind: CHALLENGE C1 signature: verified O1 signature: verified C1 inclusion evidence: verified under accepted service key Signing-key relationship C1/O1: same verified public key Kind consistency: failed - same-key CHALLENGE Organizational independence: not established by these checks Effect on O1: no automatic invalidation or modification Local policy: evaluated separately¶
When O1 is unavailable, the key relationship and required kind consistency are unestablished with a reason. That is not portrayed as "different keys" or a successful challenge. These are proposed reporting examples, not claims that correction verification is implemented.¶
The verifier evaluates presented statements and their direct references. It does not recursively discover corrections. It does not compute a "winning" history. Where processing limits or missing references prevent a relationship from being checked, the verifier reports that limitation rather than inventing a final disposition. Availability, verification, and search coverage are reported as distinct questions. No automatic winning history is computed.¶
This design is presented as a proposal. Reference encoding for target,
amends, and supports is not frozen and is coordinated with issue #67. The
reference implementation does not produce or verify correction records.
Discovery of corrections from an original receipt is not specified in this
revision. "Original-only" means no correction was presented; it does not mean
no correction exists. A correction does not reset the original's
attestation.validity interval. A correction's ts is not constrained by the
original's validity window.¶
This revision introduces wilder.pser/0.6 as the profile version carrying the
timestamp containment requirement and the DIRECT_WITNESS identifier-consistency
convention. wilder.pser/0.5 retains its published meaning; its profile does
not require timestamp containment or the naming convention. A receipt
declaring wilder.pser/0.5 is not subject to these rules, regardless of when
it was produced.¶
This revision specifies the candidate-entry byte encoding for inclusion-proof
verification, replacing the -03 disclosure that deferred this to an agreed
convention. The candidate entry is the untagged four-element array [P, {}, M,
S] derived from the presented Transparent Statement. Registration and
verification alignment is required, not assumed. Transmitted envelopes use COSE
tag 18; the untagged candidate entry is a profile-internal representation. A
Transparency Service that hashes a different representation cannot satisfy this
profile unless it commits to the candidate-entry representation specified here.¶
The at-least-one-trusted-proof acceptance rule is specified: the profile's inclusion requirement is satisfied only when at least one attached Receipt has both a valid Transparency Service signature under an accepted service key and a valid inclusion proof for the derived candidate entry. A structurally parseable additional Receipt whose cryptographic verification fails does not defeat another attached Receipt that satisfies the requirement. The aggregate verification logic exists only as a test helper; application integration remains open.¶
The TEE Class registry descriptions are clarified with informative context. No values are added, removed, or renamed. The evidence-format question for each value remains unresolved.¶
This revision does not introduce an attestationResult member into the
normative payload. The evidence-model question remains open. The complete
explanation of retained evidence mechanisms, external appraisal, and the
digest-versus-retrieval distinction is incorporated. Delegated signing does not
itself establish evidence appraisal.¶
This revision presents the corrective statement design as an informative
appendix proposal. The correction payload type, signing rule, correction kinds,
relationship model, processing rule, and verifier behavior are defined.
Reference encoding for target, amends, and supports is not frozen and is
coordinated with issue #67. The reference implementation does not produce or
verify correction records. Every CORROBORATION identifies the specific
statement it supports. Same-key CHALLENGE inconsistency is reported
separately. Withdrawal and replacement authority is checked against the
statement being changed. A correction does not reset the original's
attestation.validity interval.¶
This revision resolves a defect in -02 in which one undefined noun carried
four unrelated obligations. -02 placed four normative requirements on a
Verifier against "the Issuer's manifest" while stating, in its own identity
attribution section, that it did not specify that document's format. A Verifier
was therefore required four times to read a document the profile never
described. The four obligations were not variants of one thing, and are not
resolved by defining one document.¶
It adds one REQUIRED payload member and bumps the profile identifier from
wilder.pser/0.4 to wilder.pser/0.5. It removes nothing and narrows no
existing requirement.¶
attestation.bindingMode (REQUIRED) is added, carrying the
attestation-binding mode in the receipt. In -02 a Verifier was required to
obtain the mode from an Issuer-published document before it could rely on the
non-extractability property stated in the introduction. The mode is a
per-receipt fact fixed at signing time and known to the signer, and locating
it outside the receipt made a property of the presented bytes depend on a
network retrieval. The introduction's requirement now reads against the
member. The value set is closed and a DIRECT_WITNESS receipt whose
attestation.witnessKey and iss differ is rejected.¶
The acknowledgement-object obligation is withdrawn as a Verifier
requirement and restated as wording. -02 located the minimal ack object's
schema in the Issuer's manifest in the same sentence that defined the object
as bound by Merkle inclusion and not published. A document defined to be
unfetchable cannot carry an obligation a Verifier can discharge. No mechanism
changes; adapter.ackProvenance already distinguishes the case.¶
Section 4.3 is added, naming the two obligations that are
genuine external retrievals and stating how they resolve. Both are disclosures
about the Issuer rather than identity claims. The section fixes a stable
Issuer-controlled identifier discoverable from iss, permits caching, voids a
cached answer on a signing-key change, and defines a failure to resolve as
undetermined.¶
Undetermined is stated as a third outcome. A Verifier MUST NOT resolve an undetermined fact to the Issuer-favourable value, MUST NOT report a fact as absent where it was never successfully retrieved, and MUST NOT reject a receipt solely on the ground that a fact is undetermined. This follows the treatment already given to undetermined registration ordering in Section 7.7. The distinction between a fact checked and found absent and a fact never checked is load-bearing: collapsing the two lets a Verifier report to a relying party something it has no basis to state.¶
No serialization format is specified for Issuer-published facts. This revision defines the obligations and their resolution behaviour and defers the encoding. Fixing a format before one has been deployed invites repudiation in the following revision rather than refinement.¶
Conformance vectors accompanying this revision MUST include a failing resolution case for each Issuer-published fact, and the expected outcome of such a case MUST NOT be acceptance.¶
The mobile-attester deferral in Section 7.8 now names its
prerequisite. -02 recorded that on-device attester topologies were
expected to be addressed in a subsequent revision without stating what they
waited on. A travelling TEE is a delegated-witness deployment, so it depends
on resolving the delegation credential, whose encoding this revision
deliberately leaves open.¶
Section 7.9 is added, recording that the profile carries no disclosure of the relationship between the Site Owner and the Transparency Service. An Issuer unaffiliated with both satisfies the two existing disclosures while a Site-Owner-operated Transparency Service retains the ability to withhold entries concerning its own site. The gap is recorded rather than closed.¶
Editorial: the identity attribution section no longer calls its out-of-band document a manifest. It was never the same document as the Issuer-published facts above, and the shared name implied it was.¶
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 from wilder.pser/0.3 to wilder.pser/0.4.
-01 carried adapter.ackDigest with 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.ackProvenance value
in the receipt's favour. It is preserved as received and surfaced as
unrecognized, and is neither read as THIRD_PARTY nor normalized to NONE.¶
issuerAffiliation (REQUIRED) is added, stating whether the Issuer and
the Site Owner are affiliated principals, with the three values
AFFILIATED, INDEPENDENT and NOT_DISCLOSED. -01 gave 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.8 that the roles
not be collapsed. The member is REQUIRED for the same reason
adapter.ackProvenance is: 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_DISCLOSED as INDEPENDENT, and MUST NOT
read an unrecognized value as AFFILIATED or normalize it to
NOT_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
issuerAffiliation values, the change MUST be surfaced and identified by
sequence number, and the presentation remains verifiable. Unlike chain.seq
and chain.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. -01 used the term in prose at three places in
Section 7.8 without defining it, and this revision is the first to assign
it a normative capability.¶
A witness key lifecycle is stated (Section 7.6), 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.4, 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.7), 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.5).¶
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 -01 are corrected. The
Chain-Verifier checks defined by -01 are now implemented, and the crate
disagreement over a zero-length attestation validity interval is resolved
with the rule stated in Section 4.1.¶
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.¶
The profile identifier and media-type parameter are wilder.pser/0.4. A
producer built against wilder.pser/0.2 is rejected on version validation
rather than on an unknown member.¶
attestation.measuredBootChain (string) is replaced by
attestation.measuredBoot, an object carrying the chain digest and the
component sequence that hashes to it.¶
attestation.platformEvidence is an object carrying a digest and an
encoding label, rather than a bare string.¶
attestation.validity is added and is REQUIRED. It carries notBefore and
notAfter. notAfter MUST be strictly later than notBefore; a
zero-length interval is rejected. This revision does not require a Verifier
to test ts against 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.¶
The claim that the hash chain detects tail truncation is withdrawn. The
chain field 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 chain construction is now specified normatively in this document.
-00 deferred 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.seq is stated as non-negative rather than monotonic, and the
first receipt in a chain MUST carry chain.seq 0. -00 used "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.seq contiguity and MUST check that each chain.prevHash equals the
preceding receipt's chain.hash. -00 described these properties as
holding without requiring any party to check them. Chain-Verifier is
defined in Section 2.¶
chain.prevHash is redefined to remove an inconsistency that made the
chain check unsatisfiable. -00 and an earlier draft of this revision
defined chain.prevHash as a digest of "the immediately preceding
receipt", while defining chain.hash as a digest taken with the
chain.hash member 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.prevHash now carries the preceding
receipt's chain.hash value 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. -00 described 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.seq per 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.¶
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.¶