AT Protocol lexicons check shape. These rules cover what a shape cannot express. A record that passes lexicon validation but breaks one of these rules is valid AT Protocol and is not a conformant governed crossing record.
Status: draft, applying to the org.governedcrossing.temp.* lexicons.
Controlled fields (recordType, governanceEvent, boundType, provenanceStatus, lineageAnchorType) are open lists in the lexicons. A conformant record uses only values registered for the seam:CrossingRecord vocabulary. lineageAnchorType values witness-signed and timestamp-signed are defined but not yet usable; author-declared is the current value.
boundType must match what the architecture can actually enforce. Claiming more control than exists is not permitted; claiming less is also an error.
crossingIntent is present if and only if recordType is crossing-intent; crossingCompletion if and only if it is crossing-completion.crossing-completion carries chainReference naming its crossing-intent.provenanceStatusBasis is present when provenanceStatus is not asserted.supersededBy is present when provenanceStatus is superseded.chainDepth and lineageAnchorType are present when chainReference is present.org.governedcrossing.temp.defs#signature, role: emitter). The lexicon leaves signatures optional only because the Attestation Specification requires records to validate with or without signatures.signatures removed and a $sig object inserted. $sig is the signature object without its signature field, plus repository.$sig.repository to the record’s emittedBy DID for every signature and proof, wherever the copy is housed. The specification uses the DID of the repository housing the record; the two are the same only for signatures on a public copy held in the emitter’s own repository. Commitments, and signatures on the emitter’s own copy or on a delivered copy, verify only when the verifier is given emittedBy as the repository DID. A standard verifier that takes the repository from where a copy is housed will reject them.emittedBy, and no copy can be passed off as another party’s record. The profile does not prevent copying: a counterparty that publishes a privately delivered record publishes a verifiable record, because crossing records are deliberately non-repudiable. Others should reference records, not copy them.role (counterparty, institution). Every signer signs the same record content under its own $sig. For inline countersignatures, key and role enter the signed CID, so each inline signer’s CID is different. Remote countersignatures whose proof records have the same type and fields share a CID and are told apart by their reference URI.com.atproto.repo.strongRef) countersignatures are for public crossings only.role is outside this vocabulary.Every conformant record carries salt: at least 16 bytes, generated fresh at random for each record at emission and never reused. The salt keeps a predictable record, or a reference to one, from being confirmed by guessing. Reuse cannot be detected by third parties; a reused salt lets any counterparty that received one record confirm guesses about the emitter’s other records.
crossing-completion must be emitted whenever the emitter observes that the crossing act succeeded, including after crossingTimeoutHorizon or after recovering from a failure.crossingTimeoutHorizon. A later completion changes that: the crossing is then complete.org.governedcrossing.temp.commitment) to the crossing-completion in its own repository, after the completion is emitted. Commitments are optional and make no claim that every crossing is committed. No commitment is made to a crossing-intent, and none yet for other record types.cid is computed over the committed record with signatures removed and $sig set to the commitment record without cid, plus repository = the committed record’s emittedBy. It is a different CID from the emitter’s inline-signature CID.commitment.emittedBy equals the DID of the repository housing the commitment.chainReference names the upstream record by recordId (the canonical record’s own identifier, not an AT-URI of a copy) and by its link CID: the CIDv1 (DAG-CBOR, sha2-256) of the record with signatures, every $type key at any depth, provenanceStatus, provenanceStatusBasis and supersededBy removed, and no $sig inserted. The link CID is a content address, not a signature or proof, and is never verified as one. Re-signing, key rotation, additional signatures, namespace changes and status changes leave it unchanged.
A change in who can see data, where the data itself does not move, is not yet covered by these lexicons. A design for recording it is in progress. Until it is published, an access change is not recorded with crossing-intent and crossing-completion records, which describe data that moves.
A record never contains the content that crossed; only digests and references.