跳转到内容

ak.schema.recovery_receipt.v1

← Schemas

Arkret Recovery Receipt
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 · string
pattern: ^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 · string
RecoveryTransaction 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/digest
Stable 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/digest
Digest 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 · string
Stable 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 · string
pattern: ^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_domain
pattern: ^ak:trust_domain:[a-z0-9][a-z0-9._\-:]{0,127}$
* new_device_id · string
pattern: ^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 · integer
PCR device generation snapshotted at recovery-session creation.
* result_model_generation_ref · integer
Accepted monotonic PCR device generation after completion.
* authorization_event_id · string
pattern: ^ak:event:[A-Za-z0-9_-]{44}$
* reanchor_event_id · string
pattern: ^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/digest
Canonical-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 · integer
Required 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 · string
pattern: ^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 · string
pattern: ^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/digest
pattern: ^(sha256|blake3):[0-9a-f]{64}$
* welcome_count · integer
Number 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_id
Retyped 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_id
RFC 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 · string
Free-form reason code; MUST be present when outcome != 'completed'.
* started_at · string (date-time) · format=date-time · $ref #/$defs/timestamp
Canonical 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/timestamp
Canonical 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_url
Arkret 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 · string
base64url 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}$) · any

Source