ak.schema.recovery_receipt.v1
ak.schema.recovery_receipt.v1 · file: schemas/recovery-receipt.schema.json Replacement-device-signed terminal intent for one RecoveryTransaction. It binds the two exact producer Event ids, recovery session/policy/proof snapshot and resulting device generation expectation. It is signed before authority admission and therefore does not contain a RealmCommit id; successful completion is proven separately by the coordinator-signed recovery completion attestation and its CommittedEventRef values.
* $ · object
Replacement-device-signed terminal intent for one RecoveryTransaction. It binds the two exact producer Event ids, recovery session/policy/proof snapshot and resulting device generation expectation. It is signed before authority admission and therefore does not contain a RealmCommit id; successful completion is proven separately by the coordinator-signed recovery completion attestation and its CommittedEventRef values.
allOf · allOf[0] ·
?allOf · allOf[1] ·
?* schema ·
const "ak.schema.recovery_receipt.v1"enum:
"ak.schema.recovery_receipt.v1"* receipt_id ·
stringpattern:
^ak:receipt:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$* transaction_id ·
stringRecoveryTransaction that reserved this receipt id. It MUST equal the transaction whose binding.terminal_receipt_id is this receipt_id, which is what lets a verifier holding only the receipt resolve the authorizing transaction; binding.terminal_receipt_id alone is one-way. See zh/identity/security-transactions.md section 2.
pattern:
^ak:transaction:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$* transaction_request_digest ·
string · $ref #/$defs/digestStable request_digest of the RecoveryTransaction. It is signed by the replacement device so the terminal attestation cannot be rebound to a different transaction plan even if an identifier is substituted.
pattern:
^(sha256|blake3):[0-9a-f]{64}$* prepared_plan_digest ·
string · $ref #/$defs/digestDigest of the closed typed prepared_plan stored by the RecoveryTransaction. It MUST equal transaction.prepared_plan_digest and is signed to prevent substituting different prepared bytes under the same reserved ids.
pattern:
^(sha256|blake3):[0-9a-f]{64}$* account_id · object · $ref ./common-ids.schema.json#/$defs/account_id
Complete protocol identity for a principal at one Station, including human, Agent, Applet-managed Ghost and integration accounts. It does not imply a human login, provisioning workflow, credential class or authorization. Equality is byte-for-byte equality of both canonical did_core_id components; neither component may be inferred from a DID Document, route, session audience, current service, handle, or local database key. Accounts with the same principal_id at different station_id values are permanently distinct. Principal equality MUST NOT establish account equivalence or any permission inheritance, merging, delegation, substitution or recovery relationship. Account-scoped authority requires independent authorization for the exact AccountId. Permanent loss of a Station does not permit its accounts or PCR lineages to migrate to or revive at another Station; Realm takeover and RealmCommit recovery do not waive this boundary. See models/common-fields.md section 4.2.
* principal_id ·
$ref #/$defs/did_core_id · $ref #/$defs/did_core_id* station_id ·
$ref #/$defs/did_core_id · $ref #/$defs/did_core_id* recovery_session_id ·
stringStable session identifier used by every proof transcript, backup decrypt proof, and MLS Welcome replay during this recovery. A byte-identical resubmission of an already accepted receipt is idempotent and MUST return the stored receipt; only a SECOND, DIFFERENT receipt for the same session id and exact account is a conflict. Rejecting the byte-identical replay would make a lost response unrecoverable, which zh/identity/security-transactions.md section 1 invariants 3 and 4 forbid.
pattern:
^ak:recovery_session:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$* policy_id ·
stringpattern:
^ak:policy:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$* policy_version ·
integer* trust_domain ·
string · $ref ./common-ids.schema.json#/$defs/trust_domainpattern:
^ak:trust_domain:[a-z0-9][a-z0-9._\-:]{0,127}$* new_device_id ·
stringpattern:
^ak:device:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$* identity_model ·
const "pcr_policy"enum:
"pcr_policy"* recovery_authority_kind ·
string (enum)did_root is valid only when the accepted PCR policy explicitly enabled that optional factor.
enum:
"pcr_policy" "did_root"* previous_model_generation_ref ·
integerPCR device generation snapshotted at recovery-session creation.
* result_model_generation_ref ·
integerAccepted monotonic PCR device generation after completion.
* authorization_event_id ·
stringpattern:
^ak:event:[A-Za-z0-9_-]{44}$* reanchor_event_id ·
stringpattern:
^ak:event:[A-Za-z0-9_-]{44}$* proof_summary · object
* kind ·
string (enum)enum:
"did_root" "recovery_unlock" "device_quorum" "trusted_recovery_service"* proof_digest ·
string · $ref #/$defs/digestCanonical-JSON digest of the proof transcript used to satisfy the active recovery policy. Auditors recompute against the originating proof event to verify.
pattern:
^(sha256|blake3):[0-9a-f]{64}$quorum_participant_count ·
integerRequired for device_quorum; equals the number of distinct participating member devices.
* unlocked_backups · array<object>
items · object
* backup_kind ·
string (enum)enum:
"secret_storage"* backup_id ·
stringpattern:
^ak:backup:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$* series_id ·
stringpattern:
^ak:backup_series:[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$* ciphertext_digest ·
string · $ref #/$defs/digestpattern:
^(sha256|blake3):[0-9a-f]{64}$* welcome_count ·
integerNumber of MLS Welcomes successfully replayed for the recovering device.
welcome_realm_summaries · array<object>
items · object
* realm_id ·
string · $ref ./common-ids.schema.json#/$defs/realm_idRetyped ak.realm.create Event token. It therefore carries the same fixed current-v1 0x01/SHA-256 content-address identity and is not selected by Realm state.
pattern:
^ak:realm:[A-Za-z0-9_-]{44}$* mls_group_id ·
string · $ref ./common-ids.schema.json#/$defs/mls_group_idRFC 9420 group_id as base64url_no_pad(SHA-256(UTF8("ak.mls.group_id.v1") || 0x00 || canonical_effective_scope_key_bytes(effective_scope))), so exactly 43 characters. Derived by the reducer and the SDK from the effective scope alone; actors never submit it. The v1 formula is the only one: the earlier reversible base64url of the scope key bytes MUST NOT be accepted alongside it. See zh/models/realm-and-space.md section 2.2.
pattern:
^[A-Za-z0-9_-]{43}$* epoch ·
integer* outcome ·
string (enum)enum:
"completed" "partial" "aborted_by_user" "policy_denied" "evidence_insufficient" "service_defined"outcome_reason_code ·
stringFree-form reason code; MUST be present when outcome != 'completed'.
* started_at ·
string (date-time) · format=date-time · $ref #/$defs/timestampCanonical Arkret-owned absolute instant. UTC Z form with exactly three millisecond digits. Whole seconds MUST use .000Z; offsets, missing/finer fractions, lowercase separators, leap seconds, and invalid Gregorian calendar dates are forbidden. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9]{3}Z$* completed_at ·
string (date-time) · format=date-time · $ref #/$defs/timestampCanonical Arkret-owned absolute instant. UTC Z form with exactly three millisecond digits. Whole seconds MUST use .000Z; offsets, missing/finer fractions, lowercase separators, leap seconds, and invalid Gregorian calendar dates are forbidden. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9]{3}Z$* auth_data · object
* verification_method ·
string · $ref ./common-ids.schema.json#/$defs/did_urlArkret verification-method DID URL profile (identity/did-usage-and-verification.md section 2.2): lowercase method name, no query, required fragment, fragment limited to ASCII [A-Za-z0-9._:-]. Every verification_method-family field and every kid/key_ref a schema declares to be a DID URL MUST resolve to exactly this definition; values compare byte-for-byte with no URI normalization or percent-decoding.
pattern:
^did:[a-z0-9]+:[^\s#?]+#[A-Za-z0-9._:-]+$* signature_algorithm ·
string (enum)v1 fixes the recovery-strand replacement device possession proof to Ed25519 (zh/crypto-media/device-lifecycle.md sections 5.2 and 14; transaction binding in zh/identity/security-transactions.md section 2). The three-algorithm set in zh/identity/key-management.md section 7.9 belongs to recovery_policy.method signing entries.alg and MUST NOT be reused as a reason to widen this one.
enum:
"Ed25519"* signature ·
stringbase64url signature over UTF8('ak.identity.recovery_receipt.signature.v1\n') followed by RFC 8785 JCS of all present top-level receipt members except auth_data. The closed receipt shape fixes the projection; absent optional members are omitted and every present optional member is authenticated.
pattern:
^[A-Za-z0-9_-]+$(^x_[a-z][a-z0-9_]{0,63}$) ·
anySource
- registry row:
spec/v1/artifacts/registry/schema-registry.json - schema document:
spec/v1/artifacts/schemas/recovery-receipt.schema.json