{
  "document_version": "0.2-draft",
  "wire_version": "1.0",
  "source_repository": "autonymproject/autonym",
  "source_revision": "cc038ddaec9cd73b200b2e8c253a265f38ea66c9",
  "files": {
    "00-terminology.md": "ceafac055e829d54093781e12a99f6430e4fea312de8580cf48d27cc81b332e3",
    "01-scope-and-layering.md": "b5dcc218e527d39983ad8951003a1c7352d93c617003b8804ca6d81bac995628",
    "02-actors-and-trust.md": "262574ab4f5142bf3c1d3768070f87caa3bed89878cecdb791f31c05b15d2445",
    "03-identifiers-and-resolution.md": "a8f16f4cceab9633c135a6fc050a6bed0b0fd36258c22b42aa1ad609d88be4db",
    "04-data-model.md": "f2c0fe85148d138dd64001453f3aa589df1d47ef5f23cc947adaa8583f51643d",
    "05-disclosure.md": "23884a79011a6c2bf83d408d0e137b5b3065300446ad9393bc467c74b553d4b2",
    "06-authorisation.md": "7e266a48e903d7c4a038a8134a3118b021758ccec941521ddd79b3f74024d15b",
    "07-mcp.md": "a78fca48c25f53cf9a7ed09599cddc43539e38a42747afd0b6cecde9a9e1a22a",
    "08-rest.md": "93ff470107e553c543d50478c3e655b88dd7693182ad77da60273a8c3c5d2c63",
    "09-receipts-and-log.md": "5cf6da768f84efd58770033dc2f0c5871606e9e721f2f51e7e600a4f8dd583e6",
    "10-revocation-and-purge.md": "d09f96b41592fadda0644a2f299daf88e0ec55401f81342e476663df3c0abfed",
    "11-portability.md": "a8e7cfb4123910e303d5dc8caa4450468ddc10d30b96ecb6a2fa305ff8940192",
    "12-recipient-registry.md": "a0b169bbe3024d6bf7858c0a6074b486039297faaca378bdb08c79ed4cac310d",
    "13-emergency-card.md": "c2a78d674e4043911c3896a9b6cc6d73e2cf1432b1c5b81024278c9b432f1605",
    "14-connectors.md": "720fa75344f438f083cb1a828038a636554b0cfb0c446edf20c3283a55e54bee",
    "15-security.md": "036977d98ef18e35ab0350ed995a64fd51454befff0bd03c67eeb79be8202b80",
    "16-privacy-mapping.md": "cf8419a54b3a226a70d28cfba013d9496b03a7ebac89db45cfe61a0a9caaa6ff",
    "17-conformance.md": "76fe4ed1436b198e68d9bc612048ae09cb140ec2429851fc56eb44726e0cf3a8",
    "18-scope-additions.md": "0a14b2e89c4385108f331cf05d90de9745782ee137b39d247ea60419b2d01056",
    "19-change-process.md": "2929bc893028b0904eaff705275032019b511963b2502c6a105e2a6c8024392d",
    "LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
    "appendix-a-vocabulary.md": "45e12309b3a9fca0b904db912343c9f678e87bd6939eac75401b2ca154298e57",
    "appendix-b-resolved-questions.md": "d9710f7c00067a8619f75a8094735974a72c54eaf31dbc55ff9ed6902e43e501",
    "conformance/README.md": "84973b54c78be4d2faba290dbcbb5c3461a95a653408a48073cbe34d27aa2c4f",
    "conformance/profiles.json": "6e9fd5048be765a4ce8d8b127164a3bae3dbb36d458894683196d09509b2ae03",
    "errors.json": "22266c27325581c39e55d9d19a1e70fefc548f1cd6d33fd1bf80f457110c2547",
    "examples/identifiers.json": "1253f71bc3b68472e9bb6c9dfbc960f704b6268bc8d15ef47eca92d1d6e28691",
    "examples/identity-framing.json": "f383ba33594e98ff7b064e9a3cdd6329ad16705abfe315e5fd929f6c0a708a68",
    "examples/operational-errors.json": "07c6eca4ceaa3da9cb7f4fe55c60a381cec95b90968cbf639b2f8bdca4e88149",
    "examples/protocol.json": "c583a688a78a9a255cf3d905f9f397584bfce52e5d902030b3aac0f1e645f736",
    "examples/scopes.json": "a22a24b16de3dc7a9c08b51d9c7acf1797dc527c5bc93e16953bb8c231faa1d0",
    "identifiers.md": "42e54d8e822d6619aa56d30399a166d07a3a7537eb6d0da2b5d351db695d0122",
    "mcp/tools.json": "bff4254ee4cfda9102f5e5e0044431727482904cf9efaeec386d586ffc68bf49",
    "openapi/autonym-v1.yaml": "46190e056a7e9909fa6a70a559bdf32a0f55bc4b37a05f5b698e82db3333cf46",
    "schemas/capability-claim.json": "8d5db59197254a8748014cc55127702e9cfda2c3b67569c013e9f032767360eb",
    "schemas/confirmation-result.json": "fb5431d48d38363ce4f2f453768b53e54fa424d1eb6192cb3409edd5d41f9aa2",
    "schemas/confirmation.json": "827d9f7a795263b0bd8663eb537ccc8ff63a0fdf0f5a4c1c108e5c0494308c5c",
    "schemas/context-request.json": "b8c127bdbc0ff9b2a3ba057a47cccfc292c8728e7085b1e508c5e3ef10e9e4a9",
    "schemas/contribution-event.json": "747ad8ad8dcfc91dfbfaa8f2d96f4b1a3cb5a76863a3c80ad2eb30f6ef9a2faf",
    "schemas/disclosure.json": "0bd1c43eacca0760237b4582068f7aee221a5876f2d38a5e20e0efc462d172b2",
    "schemas/discovery.json": "40d83af29e5cd028faff08642e4441df997bb108ee3d8363b510dd805bbfbebc",
    "schemas/domain-list.json": "54f355edb61c12c58a74e1ce7dd4ed8e68c632a7b3b74a3a78081c1c77b9dda0",
    "schemas/encrypted-export-header.json": "afe883537c1eca113b1e09fc9d5b4287c4e80f182e784acb522fe38aac600807",
    "schemas/entry.json": "243372aa44c7cbeb5f0992b3d5142e0638e64b877a1b8ae6ebf5ffbaad236853",
    "schemas/export.json": "01a8a5738d53f8c2eddaf807c0b634a1ecc3dc5677fb96577b3ca2c8545c19ae",
    "schemas/grant-offer-redemption.json": "79151d99e0f1e518f37926880337930ae70de0848b9905e61605125287efa205",
    "schemas/grant-offer-request.json": "accdedb6082794d177ef38d681c2b405d4b9c5c7b6771745ccd1a3e84a3c1972",
    "schemas/grant-offer.json": "f7b75ee17488db7d00864bbe62b98e19953a98eb38b74e8d01e5a80eb62920c6",
    "schemas/grant.json": "b48ec34d3aac4a9a93cb96784530e4ed5174bab8224a99c82224aaf0925775f5",
    "schemas/health.json": "8e86172164016a4516804fe6244ba5bd6ae524630771d13e7446489f54d12b26",
    "schemas/identifier.json": "c5c240831edd2426c484952d2b550cc32b56c0effdd5d1de989c84734ea3e431",
    "schemas/lifecycle-request.json": "db03d3ab49ef4529e73aebafcba5a44df729be2233be7c3bdabfce71405a85e7",
    "schemas/log-event.json": "15264077de10e32e855fab7aa46eecf5f81b38fbdd18b87542996154a3173c0d",
    "schemas/problem.json": "885aa232ac2388d056be2c5ee0b536755bd6443c720827c432cee7b7cdb66f91",
    "schemas/proposal-status.json": "45ddc4d9c8c5438e83e736cff5f15157bee43df6f355311242f473eb176502f9",
    "schemas/purge-ack.json": "422e9e3d0ace0cb64833b5a05b6e775fa320528580f31d1aa0a0fb3620c923e1",
    "schemas/purge-instruction.json": "b8bb7a1dbfce37ad1f7aa3d51feeca8dcb30dcad65ca58ccf9e121c907b9c16b",
    "schemas/purge-list.json": "b17bd41c7a5376a885c6460d13d8526026057d867fdca95fe6dfd3602ef4a608",
    "schemas/readiness.json": "08d0bde8aa63ae5925d68db6cd27e754ff65619b5623d575087bff524420f7ea",
    "schemas/receipt.json": "8b633669abf38cc4c8393c382d65db855ed0781ef81ce621fce54d42ef2ff844",
    "schemas/scope-token.json": "4455b6699ff4c792a41cbc46c0bc37f14aee49bebe29801a225bc04545cb7bb0",
    "schemas/temporal.json": "8b3661ffe0b1ebfdb378c59995291dc3738ca86124c0b0b603f265cc935c5077",
    "schemas/tombstone.json": "7394046045f7a0975889722e1d27980f2f01f119e422a896ee73401e6da1b728",
    "schemas/withdrawal.json": "827d9f7a795263b0bd8663eb537ccc8ff63a0fdf0f5a4c1c108e5c0494308c5c",
    "scopes.json": "d69dfd7a27e43d0499405a1a60786d2d08c12b1eaa46039c0aacb46af5842b98",
    "scopes.md": "826ed23310f67b09b7746d7890065d0b1856d327296b30f9364b999cbe684111",
    "source-ambiguities.md": "79bcb20318850983b680bc4aa8daa22bdef09cdc2bac484e08bd9e4f77ffb03a",
    "vocab/core.json": "37be3d29ee1aa309d1d7e95d196bb3ca5aba9ab5829eae91aaa2dade870a777b"
  },
  "notice": "Complete draft publication, not a runtime implementation or certification. Synthetic proofs are not cryptographic signatures.",
  "contents": {
    "00-terminology.md": "# Terminology\n\n- **Person**: the individual who controls a record.\n- **Record**: the person's stored context, partitioned where needed and protected by the provider.\n- **Partition**: a selected portion of the record; the historical wire field is `profile_id`.\n- **Handle**: the opaque, normally pairwise address a recipient uses after consent.\n- **Entry**: a typed fact, preference or state with provenance, versions and temporal validity.\n- **Overlay**: an explicitly enabled, bounded preference targeting a standing baseline.\n- **Domain/key**: a vocabulary category and its exact admitted value definition.\n- **Level**: the permitted disclosure detail, L0 to L3; every level requires a grant.\n- **Recipient/client**: the authenticated assistant or service requesting a defined capability.\n- **Grant**: the provider's stored authority for one recipient and purpose, approved by the person.\n- **Read receipt**: the owner-visible evidence committed with a disclosure.\n- **Purge instruction**: a signed request to delete copies obtained under an ended grant.\n- **Provider**: a service implementing declared Autonym capabilities; conformance requires evidence.\n",
    "01-scope-and-layering.md": "## A1. Scope, status and layering\n\nAutonym specifies a person-controlled context record, explicit recipient grants, progressive disclosure, accountable reads and portable records. It is provider-independent: a compatible recipient implements this protocol rather than an integration unique to one host.\n\nThis is document **0.2-draft**, specifying proposed wire version **1.0**. It is a complete publication of the current draft scope, open to interoperability review. It is not a ratified standard, a released server, a certification or a promise that an integration exists. The [implementation and conformance status](conformance/README.md) distinguishes executable contract checks from missing service behaviour.\n\nRFC 2119 and RFC 8174 capitalised MUST, MUST NOT, SHOULD and MAY identify requirements. Requirements apply to the capabilities an implementation claims, with the shared security requirements applying to every capability. Every normative section maps to the stable checks in [the conformance manifest](conformance/profiles.json). Pending runtime checks mean unverified implementation, not permission to ignore a requirement.\n\n### A1.1 Normative material\n\nThe normative publication consists of A1 to A18, the core vocabulary, JSON Schemas, OpenAPI, MCP tool definitions and conformance requirements. Prose defines cross-object and stateful invariants which JSON Schema cannot express. An implementation MUST satisfy both. Synthetic examples are informative; their illustrative signature bytes are not cryptographic test vectors.\n\nUnknown fields at a defined wire boundary MUST be rejected. Keys absent from the released core vocabulary MUST be rejected unless a separately versioned future extension is negotiated; there is no permissive arbitrary-JSON entry lane.\n\n### A1.2 Layers and release boundary\n\n- The record model and vocabulary describe what is stored and the approved renderings.\n- The compiler intersects the current stored grant, request, vocabulary and temporal selection.\n- OAuth, DPoP and discovery establish recipient authority and protected-resource audiences.\n- REST and MCP carry the same objects and use the same counted read transaction.\n- Receipts, revocation, purge and portability describe the lifecycle after disclosure.\n\nThe first draft vocabulary contains 27 keys across all 17 proposed domains. This intentionally bounds the first interoperable release. Keys outside this vocabulary require a later specification. V1 defines Core, Write, Portable and Delegated provider capabilities and Read, Contribute and Reciprocal recipient capabilities.\n\nCredential presentations, recipient registries, guardian/duress operation and emergency cards are reserved extensions outside v1 conformance. Their chapters state the boundary and safety requirements for future work. Implementations MUST NOT advertise those reserved capabilities as conforming v1 features. Person-facing management UI and private management API routing are implementation choices; portable entries and owner-visible rights remain normative. The public recipient API is fully described in A8.\n\n### A1.3 Existing standards\n\nAutonym uses OAuth metadata and token formats, PKCE, DPoP, JSON Schema, JSON Web Signatures, JSON Canonicalization Scheme, Problem Details and MCP. It does not invent replacement cryptography or claim clinical, legal or identity certification from use of those standards. Links to primary specifications appear with the relevant contracts.\n\nChecks: all applicable [conformance requirements](conformance/profiles.json), particularly CLAIM-01.\n",
    "02-actors-and-trust.md": "## A2. Actors and trust model\n\nThe provider is an OAuth protected resource and normally its own authorisation server; an implementation may split these while preserving issuer and audience boundaries. The person chooses the provider and controls consent from an authenticated first-party session.\n\nClients are registered as `assistant`, `assistant_unverified`, `service`, `connector` or `self`. Registration evidence, not the client's own assertion, determines the class. Unknown public MCP clients are `assistant_unverified`; other unknown clients are conservative `service` clients. An `assistant_unverified` client may use Bearer tokens, appears with a warning at consent, has a grant expiry of at most 30 days and cannot receive persist, delegate or confirm scopes. V1 has no certified registry tiers.\n\nThe provider is trusted to store/encrypt correctly, enforce grants and preserve audit evidence. The protocol does not cryptographically prevent a malicious provider from reading information it processes. Operators must have no routine decrypt-arbitrary-records interface. Device compromise, recipient copies and off-platform misuse remain outside what a grant can prevent.\n\nThe principal threats are token theft, widened/stale authority, overspent counters, unsafe inference, hidden identifier leakage, contributor replay, expired temporary context, malicious record text, compromised URL fetches and misleading portability claims. Controls are specified in A3 to A18. Pairwise handles reduce direct linkage; L0 is not a promise of anonymity. Purge evidence is not proof of deletion. Duress and guardian controls require future designs and cannot be claimed as v1 protection.\n\nChecks: CORE-01, PAIR-01, CLAIM-01 and the cross-cutting controls in A15.\n",
    "03-identifiers-and-resolution.md": "## A3. Identifiers, handles and resolution\n\n### A3.1 Owner and recipient identifiers\n\nInternal record, partition and entry identifiers use the prefix and ULID grammar in [identifiers](identifiers.md). They are owner-management and export identifiers. The legacy wire term `profile_id` means a partition of the person's record; it is not a commercial dossier.\n\nRecipients MUST NOT receive a record DID, canonical entry ID, owner identifier, another client's handle or another client's grant identifier through ordinary reads. V1 portability uses the signed export and preserves canonical entry IDs. Person-held record keys and public DID host bindings are reserved for a separately specified extension, not a dependency of Core or Portable.\n\n### A3.2 Pairwise handles and entry aliases\n\nSyntax: `autonym:<local>@<authority>`. Newly issued pairwise locals are exactly 32 lower-case RFC 4648 base32 characters, without padding. The authority is the configured lower-case ASCII DNS hostname, with no port, user information, path or trailing dot. A valid shape example is `autonym:abcdefghijklmnopqrstuvwxyz234567@autonym.example`.\n\nEach record partition has a dedicated random 256-bit handle key. Generate the local part as the first 32 characters of lower-case, unpadded RFC 4648 base32 of HMAC-SHA256 over UTF-8 RFC 8785 canonical JSON:\n\n```json\n{\n  \"purpose\": \"autonym.handle.v1\",\n  \"client_id\": \"https://recipient.example/client\",\n  \"rotation\": \"00000000-0000-4000-8000-000000000001\"\n}\n```\n\n`client_id` is the exact registered identifier, not a normalised URL or display name. `rotation` is a newly generated lowercase UUIDv4 per recipient rotation. Check uniqueness before committing issuance. A collision requires a fresh rotation and retry. HMAC keys are never shared with recipients or exported to a new provider.\n\nRecipient entry references use `rent_` followed by all 52 base32 characters of HMAC-SHA256 under the same dedicated key, over JCS of `{purpose:\"autonym.entry.v1\", client_id, rotation, entry_id}`. The different `purpose` separates the two uses. Rotation atomically changes handles and aliases, invalidates old grants/tokens and starts required purge processing. Never expose canonical IDs through provenance, dependencies, errors, ETags or diagnostic counts.\n\nThe older 12-to-32-character parser grammar remains accepted for reading historical owner material. New wire objects use the exact 32-character contract. Public handles are optional: 3 to 30 ASCII characters, lower-case letters and digits with single internal hyphens. No leading, trailing or consecutive hyphens. Claiming one requires re-authentication, rate limits, a reserved-name list, one public name per partition, a 30-day change cooldown and a 12-month release quarantine. A public name provides a provider address for consent; it MUST NOT yield record contents, a DID or evidence that the person exists to unauthenticated enumeration. Token subjects remain pairwise.\n\nPairwise identifiers prevent identifier-based cross-recipient joins; they do not make context anonymous or prevent correlation using facts already disclosed.\n\n### A3.3 Discovery\n\n`GET /.well-known/autonym` returns [the discovery schema](schemas/discovery.json): protocol version, configured issuer and authorisation server, trusted JWKS URI, enabled REST/MCP endpoints and an honest role-specific capability declaration. Disabled surfaces are `null`. No person's identifier or record information appears in discovery. The schema example in [protocol examples](examples/protocol.json) illustrates capability claims, not a deployed service.\n\nOAuth protected-resource metadata is separate and follows A6. Clients resolve the host from a user-supplied handle or configured provider, validate HTTPS and metadata origin, and never trust request forwarding headers as the provider's identity. Every fetch of an untrusted client/provider URL must use SSRF-safe retrieval with DNS/address checks, size/time limits and revalidation at each allowed redirect.\n\n### A3.4 Migration\n\nMigration transfers an owner-approved export into a new provider. Canonical owner IDs can be preserved, but the new provider creates fresh pairwise keys, handles, aliases and authority. Imported grants are history only. The person reauthorises each recipient against the new audience.\n\nThe old provider MUST NOT redirect authenticated API or token requests to a different origin, forward credentials, or reveal the destination to contributors. Destination notifications are separately approved per recipient. An optional public-handle web redirect requires separate explicit approval and carries no credential or personal data. Purge instructions and acknowledgements continue at the old provider until settled; the new provider cannot acknowledge deletion of the old provider's disclosures.\n\nChecks: PAIR-01, CORE-01, PORT-01. Fixed synthetic [framing vectors](examples/identity-framing.json) give canonical bytes, HMAC digest, base32 and final identifiers. Independent cryptographic interoperability remains a runtime release gate.\n",
    "04-data-model.md": "## A4. Data model\n\n### A4.1 Entries and vocabulary\n\nThe exact stored/exported entry is defined by [entry.json](schemas/entry.json), with complete synthetic examples in [protocol.json](examples/protocol.json). Fields include an internal ID and immutable version, partition, domain/key, typed value, semantic kind, provenance, temporal interval, optional overlay, approved rendering, status and origin. Safety and sensitivity come from the trusted vocabulary, never contributor-supplied flags.\n\n`context_kind` is `fact`, `preference` or `state`, independent of provenance. Facts describe a declared or evidenced condition. Preferences express choices. States describe bounded current circumstances. `value_type` must match the key definition, and `value` must pass that key's closed schema. The larger type-name enum reserves future types; it does not admit unregistered keys. [The vocabulary](vocab/core.json) specifies types, cardinality, levels, renderers, flags, labels, explanations and per-level examples for every v1 key.\n\nA change creates a new immutable version. Older versions remain history under owner retention policy. `active`, `superseded` and `archived` are stored value statuses; expiry is computed from time, not a status that depends on a worker. Deletion creates a separate non-content [tombstone](schemas/tombstone.json) with ID/version/partition/domain/key and deletion time; it carries no value or evidence. Record erasure additionally follows owner retention and applicable obligations; retaining a tombstone does not permit retaining the deleted value indefinitely.\n\n### A4.2 Provenance\n\n`declared` means the person entered or explicitly confirmed the exact statement; it requires `confirmed_at`. `observed` covers sourced observations/inferences, requires source identity, occurrence and ingestion times, confidence, and a finite validity end no later than 90 days after ingestion. `derived` names every input ID, version and actual field/level used. `attested` is reserved for future credential verification and MUST be withheld from v1 recipient disclosure unless the person separately confirms a declared entry.\n\nSource identity is evidence of origin, not truth. Review of a contribution does not automatically relabel it as declared. Preserve source event identity and evidence after confirmation; never disclose that evidence merely because the confirmed preference is shareable.\n\nSpecial-category and safety-critical keys MUST NOT be observed or inferred. `inferable:false` is absolute; a domain toggle cannot override it. Imported sensitive suggestions remain protected proposals until exact confirmation in the first-party app. Confidence is not consent.\n\n### A4.3 Temporal intervals\n\nWire instants are UTC RFC 3339 instants with `Z`. Date-only entry is a UI convenience: the UI resolves the selected timezone and daylight-saving ambiguity before storing an instant. A month means the selected local calendar interval, not an assumed number of seconds. V1 has no recurrence rule.\n\nUse one provider `Clock` instant for the entire read transaction. Eligibility is `valid_from <= now < valid_until`. Null start means no lower bound; null end means no upper bound. Reject equal or reversed finite bounds. A `state` and every overlay require a finite end. Future entries do not appear early. Manual archive/disablement takes effect on the next read. Entry validity and grant validity are checked independently.\n\nStaleness is informational: `confirmed_at` older than 365 days, or 90 days for safety-critical keys, sets `stale:true`. Never infer that a stale allergy has ceased. An expired temporary fact is omitted; any independently eligible standing safety fact remains.\n\n### A4.4 Baselines and temporary overlays\n\nAn overlay is a separate preference entry with `overlay:{target_entry_id,enabled,selected}`. The target must be an active baseline in the same partition/domain/key. V1 allows overlays only for single-cardinality, non-sensitive, non-safety preferences. The person explicitly enables it; enabling it is separate from making it permanent. Overlay creation or expiry MUST NOT supersede or alter the baseline.\n\nAmong eligible enabled overlays for a baseline, one explicitly selected overlay wins. If no overlay is selected and exactly one is eligible, that one applies. If several are eligible without one selection, or several are marked selected, apply none and use the eligible baseline until the person resolves the conflict. A choice atomically clears competing selections for that target. Do not resolve these conflicts using insertion order or confidence.\n\nFasting and holiday context are additive, time-bounded states. Reduced walking after injury is a temporary safety-related fact, not permission to replace a standing requirement. A month without alcohol can temporarily replace a standing drink preference. These choices do not automatically reveal why, where or with whom.\n\nFor ordinary baseline conflicts, the person's declared value takes priority over observed/derived candidates. Multiple incompatible declarations require the person's choice before replacing the current selected baseline. Imports do not silently choose one. Many-cardinality keys retain individually eligible entries. All safety-critical keys are many-cardinality so several allergies, alerts or needs coexist; replacing one cannot remove another.\n\n### A4.5 Derivations\n\nAt disclosure, recursively validate every dependency's current version, validity, purpose, grant rights and actual fields/level used. Domain permission alone is insufficient: permission for an L1 summary does not authorise deriving from hidden L3 identifiers. Reject cycles, depth above 16, more than 256 total dependencies, absent inputs and stale versions. Recompute or withhold on any change or expiry. Never disclose dependency identifiers or raw source history through a preference read.\n\nA separately confirmed declared preference can be shared independently of raw history. That is an explicit confirmation decision; accepting a stream or trusting a contributor does not perform it.\n\nChecks: DISC-01, TEMP-01 to TEMP-03, CONTRIB-01 to CONTRIB-03, PORT-01.\n",
    "05-disclosure.md": "## A5. Disclosure and the compiler\n\n### A5.1 Levels\n\n| Level | Maximum permitted detail                                                          |\n| ----- | --------------------------------------------------------------------------------- |\n| L0    | The key's closed `l0_category` code only; no value                                |\n| L1    | Identifier-free values, including non-identifying structure and broad age bands   |\n| L2    | L1 plus first names and only the additional structure the key explicitly supports |\n| L3    | The full permitted value                                                          |\n\nNames, exact dates of birth, detailed addresses, phone/email, account/loyalty numbers, employer and institution names MUST NOT appear at L1. Free text at L1 or L2 requires the person's identifier-safe approved rendering; omit it if absent. Automatic redaction is not approval. Structure by itself does not imply a higher level: safe roles and age bands may be structured at L1. L0 is reduced detail, not anonymity or ambient permission.\n\n### A5.2 One compiler and transaction\n\nThe [context request](schemas/context-request.json) has one optional `max_level`, default L3, applied independently to each requested domain. Omitted `declared_only` is false, `min_confidence` is zero. The request cannot widen the stored grant. Explicitly ungranted domains fail without revealing whether they contain entries. Keys are the intersection of request, grant and vocabulary; unknown or ungranted keys do not reveal existence.\n\nFor each requested domain, select the highest vocabulary-supported level at or below both ceilings. If none exists, omit the entry. Effective `declared_only` is grant OR request; minimum confidence is the maximum of both. A declared-only read includes only exactly confirmed declared entries in v1. Restrict provenance evidence separately.\n\nWithin one transaction: authenticate the client, validate token audience/sender proof, lock and recheck the grant and counters, capture trusted time, select eligible baselines/overlays, enforce dependencies, render, create and sign the envelope, append its receipt, increment the counter, commit, then return. Signing failure, receipt failure or commit failure returns no successful disclosure. Concurrent reads cannot overspend a limit. All surfaces call this same transaction.\n\nSafety-critical entries sort first, then declared, observed and derived; ties sort by domain, key and recipient alias. No recipient envelope carries hidden-entry counts, omission reasons, internal IDs or full evidence. A domain list exposes only granted keys that could currently be disclosed, and has no counts.\n\n`since` is a UTC change filter, not permission to reuse indefinitely. It includes entries whose selected value or temporal eligibility changed since the instant, including baseline restoration. Always include currently eligible safety-critical entries even when older. A client must obtain a full fresh read after a previous envelope expires; a partial response does not renew missing entries.\n\n### A5.3 Signed disclosure\n\n[disclosure.json](schemas/disclosure.json) is the exact response. Entries are a flat array with domain/key and client-bound `rent_` identifiers. The signature binds provider, protected-resource audience, client, handle, grant ID/revision, purpose, read ID, issue time and absolute `valid_until`. Example bytes in [protocol.json](examples/protocol.json) are synthetic and intentionally not a verifiable signature.\n\n`valid_until` is the earliest of grant expiry, any disclosed entry/dependency expiry, the next eligible overlay/selection time boundary affecting the result, and five minutes after issue. `ttl_seconds` is the nonnegative whole-second interval to that deadline, rounded down. Even an empty response expires at the next relevant selection boundary. Use `Cache-Control:no-store`; recipients may retain transient context only until this deadline unless a separate persistence right exists.\n\nPersistence authorises retention, not continued use of an expired temporary fact as current context. A recipient must stop treating an entry as current at the signed deadline and refresh through a new authorised read. `persist_until` is null without explicit permission and never exceeds grant expiry. No onward-sharing right exists in v1.\n\n### A5.4 Signature representation\n\nSign UTF-8 [RFC 8785 canonical JSON](https://www.rfc-editor.org/rfc/rfc8785) of the complete envelope without `proof`. Reject duplicate members and non-I-JSON before canonicalisation. Use ordinary base64url payload mode with [RFC 7515 Appendix F detached compact JWS](https://www.rfc-editor.org/rfc/rfc7515#appendix-F): `protected..signature`. Protected headers are `alg:ES256`, `kid` and `typ:autonym-disclosure+jws`. Unencoded-payload mode is not used.\n\nVerification accepts only ES256 and trusted configured-provider JWKS keys matching `kid`; validate that proof metadata and protected headers agree. Reject unsupported critical headers, `alg:none`, duplicate headers and payload-supplied arbitrary key URLs. Check all signed bindings and time bounds as well as the signature. A valid signature alone does not establish current grant authority.\n\nSD-JWT credential presentations are reserved for a later version and cannot be claimed by Core implementations.\n\nChecks: DISC-01, SIGN-01, CORE-01, LOG-01, TEMP-03, CONTRIB-03.\n",
    "06-authorisation.md": "## A6. Authorisation\n\n### A6.1 Discovery and registration\n\nProviders MUST serve root and path-specific [RFC 9728](https://www.rfc-editor.org/rfc/rfc9728) metadata at `/.well-known/oauth-protected-resource`, `/.well-known/oauth-protected-resource/mcp` and `/.well-known/oauth-protected-resource/v1`, and authorisation-server metadata under RFC 8414. Metadata names the configured issuer, never an untrusted Host or forwarding header. Authorisation responses include the RFC 9207 `iss` parameter.\n\n`<origin>/mcp` and `<origin>/v1` are distinct audiences. An unauthenticated response includes a `WWW-Authenticate` challenge pointing to the requested surface's metadata. Client ID Metadata Documents are the primary unknown-MCP-client registration mechanism; static registration supports first-party clients and RFC 7591 DCR remains available for compatibility. Metadata fetching requires exact client-ID matching, redirect checks and SSRF-safe retrieval. A client cannot self-assign a trusted class or certification.\n\n### A6.2 Scopes and separate grants\n\n[scopes.json](scopes.json) and [scope grammar](scopes.md) define the existing `autonym:` syntax, ten purpose categories and exactly one purpose. A purpose alone gives no read, contribution, persistence or delegation right. Any accepted `:declared` modifier makes the entire stored grant declared-only, including wildcard combinations; use separate grants for different declaration restrictions. Explicit domain ceilings take precedence over wildcard L0. Scope parsing is syntactic; the issuance policy additionally rejects a mixed read/contribution grant.\n\nThe [grant schema](schemas/grant.json) is a discriminated `read` or `contribute` object. A read grant names domain ceilings and explicit keys, declared-only/confidence restrictions, maximum reads, retention and delegation choice. A contribution grant names an explicit domain/key allowlist, event count and confirmation permission. They have distinct IDs, approval, tokens and revocation. Neither implies the other. Contributor tokens can inspect only their current grant and their own submission status.\n\nThe stored grant is authoritative for restrictions, status, expiry, counters and revision. Token scope and copied claims are advisory. Every read, including L0 and a conditional request, rechecks it. A revision changes whenever authority changes. `expires_at` must be after issuance; read/event counts cannot exceed their maximum. Persistence cannot exceed grant expiry. A wildcard is allowed only as a read domain at L0, never for contribution or advertising; wildcard permission is expanded against the current core vocabulary and remains subject to grant review.\n\n### A6.3 Consent and tokens\n\nUse authorisation code with PKCE S256 only; reject plain/downgrade. Require exact registered redirect-URI matching, with only the RFC 8252 loopback-port exception. Codes are single-use and bound to client, redirect, resource, session and verifier. Use session-bound state, unframeable consent pages and rotating refresh tokens with replay detection. Consent shows the named recipient, purpose category and plain-language explanation, read or contribution permission, selected keys/levels, expiry, limits, retention and trust evidence. Each choice is independently revocable. Purpose changes require new consent. Refusing advertising cannot revoke an unrelated non-advertising grant. Recipient-side consent flags cannot substitute for the provider's decision.\n\nAccess tokens follow RFC 9068. Example claim fragment:\n\n```json\n{\n  \"iss\": \"https://autonym.example\",\n  \"aud\": \"https://autonym.example/v1\",\n  \"iat\": 1789948800,\n  \"exp\": 1789952400\n}\n```\n\nThese timestamps represent 21 September 2026 00:00 to 01:00 UTC. Full tokens also bind `sub` to the pairwise handle, `client_id`, `autonym_grant_id`, purpose, `jti` and required sender key. Access tokens last at most one hour and never beyond grant expiry. Refresh tokens cannot extend a grant. Check issuer, audience, signature, expiry and server-side grant on every authorised action.\n\nDPoP is required for service and connector clients and recommended for assistants. Bound tokens use `Authorization: DPoP` and a valid DPoP proof, including method/URL/access-token binding and replay controls under [RFC 9449](https://www.rfc-editor.org/rfc/rfc9449). Never accept a bound token as Bearer. An eligible unbound assistant may use Bearer; an `assistant_unverified` grant lasts at most 30 days and cannot persist, delegate or confirm. No third party receives `autonym:confirm:safety` or arbitrary declared-write authority.\n\n### A6.4 Standing rules and delegation\n\nDelegated is an optional provider capability. A standing rule is a person-approved exact match on client IDs or registry-independent approved classes, allowed purpose categories, domain/key/level limits, maximum duration, read count, declared-only/confidence and persistence. Unknown matching fields fail closed. The provider records the rule version, creates a real child grant and notifies the person. V1 standing rules cannot issue advertising or contribution grants automatically.\n\nA read grant may delegate only if its stored `allow_delegation` is true. The child can only narrow purpose, domains, keys, ceilings, confidence, expiry, retention and read limits. The child consumes a reserved portion of its parent's remaining read budget; no child can multiply authority. Revoke/expire the parent and all descendants become unusable. Depth is at most one; children cannot delegate again.\n\nAt the token endpoint, [RFC 8693 token exchange](https://www.rfc-editor.org/rfc/rfc8693) requires `grant_type=urn:ietf:params:oauth:grant-type:token-exchange`, `subject_token`, `subject_token_type=urn:ietf:params:oauth:token-type:access_token`, `requested_token_type=urn:autonym:params:oauth:token-type:grant-offer`, `scope`, `resource`, `autonym_recipient`, `autonym_purpose_text`, `autonym_expires_in` and `autonym_max_reads`. Authenticate the delegate and recheck its current grant. Missing or widening parameters fail; no default broadening is permitted.\n\nThe response is `{access_token:<opaque-offer>,issued_token_type:\"urn:autonym:params:oauth:token-type:grant-offer\",token_type:\"N_A\",expires_in:300}`. The opaque offer contains at least 256 random bits, is stored hashed, expires after five minutes or parent expiry, and is not a resource token. The recipient redeems it through the RFC 6749 extension grant `grant_type=urn:autonym:params:oauth:grant-type:grant-offer`, `grant_code` and exact `resource`, authenticated as the target client with its own DPoP key. Bind offer to target, audience and proposed child restrictions. Check parent, budget and one-use state again atomically at redemption. Invalid, used or expired offers return OAuth `invalid_grant`. The resulting access token has `act.client_id` naming the delegate. This exchange contract is an Autonym choice, not a claim that RFC 8693 defines grant offers.\n\n### A6.5 Revocation\n\n`POST /oauth/revoke` follows RFC 7009 for tokens. The owner's grant-revocation action atomically invalidates all associated authority and descendants, records the event and enqueues required purge instructions. Revocation takes effect on the next attempted action, including retries and cached/conditional reads. No background token-expiry job is the enforcement boundary.\n\nChecks: CORE-01, CONSENT-01, ADS-01, DELEGATE-01, TRANSPORT-01, PURGE-01.\n\n### A6.6 Client lifecycle credentials\n\nPurge polling/acknowledgement continues after record grants end. A registered confidential recipient uses OAuth client credentials with private-key authentication and DPoP to request only `scope=autonym:lifecycle:purge` and resource `<origin>/v1`. This is a client lifecycle token, not a record grant: its JWT has `autonym_token_kind:lifecycle`, `client_id`, issuer/audience, `cnf.jkt`, `iat`, `exp` and `jti`, but no handle or grant ID. Maximum lifetime is five minutes. It is valid only on the two purge routes and can access only that client's instructions. It cannot satisfy a record-grant check, discover records or create grants. The lifecycle scope is deliberately outside the record-grant scope parser and never appears in a consent grant. Public clients without a registered private key cannot use polling credentials; the provider uses registered callback delivery or the owner's visible manual follow-up, recording unavailable acknowledgement assurance.\n",
    "07-mcp.md": "## A7. MCP surface\n\nThe normative target is MCP revision [2026-07-28](https://modelcontextprotocol.io/specification/2026-07-28/changelog), Streamable HTTP, server name `autonym`. This specifies an implementation requirement; the reference repository does not yet expose this surface.\n\nThe server is stateless, with no initialise/initialized handshake or `Mcp-Session-Id`, and MUST implement [server/discover](https://modelcontextprotocol.io/specification/2026-07-28/server/discover). Requests carry protocol version/capabilities in `_meta`. Require `Mcp-Method` on every request and `Mcp-Name` on `tools/call`, `resources/read` and `prompts/get`. Decode and validate headers against the body under the [transport rules](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/streamable-http); mismatches fail. Roots, Sampling and Logging are not adopted. Legacy revisions are unsupported unless separately declared and tested; no legacy compatibility is claimed by this draft.\n\n### A7.1 Tools\n\nThe complete input and output definitions are generated in [tools.json](mcp/tools.json).\n\n| Tool                | Authority                                                                                                  | Accounting                                      |\n| ------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |\n| `get_grant`         | The authenticated current grant only                                                                       | No read                                         |\n| `list_domains`      | Read grant                                                                                                 | No read; eligible granted keys only             |\n| `get_context`       | Read grant                                                                                                 | One atomic counted read                         |\n| `propose_entry`     | Separate contribution grant                                                                                | One accepted unique event                       |\n| `confirm_entry`     | Contribution grant with ordinary confirmation permission; sensitive acceptance only in the first-party app | Exact-statement review                          |\n| `withdraw_proposal` | The contributor's own proposal                                                                             | No read; cannot undo an independent declaration |\n\nTool lists are fixed and public. Grant-dependent resource lists are private. Use the revision's list-cache fields. Resource reads use `ttlMs:0` and `cacheScope:\"private\"`; these transport hints never extend signed context validity.\n\n`get_context` returns the A5 signed disclosure in structured content and the same JSON as text content. It must not produce an unsigned alternative value. The provider rechecks the stored grant for every tool call. Tool errors use `isError:true` with the registered Problem Details object; JSON-RPC protocol errors follow MCP.\n\n### A7.2 Confirmation\n\nV1 `confirm_entry` always returns `review_required` with an HTTPS first-party review URL. It never accepts a contributor assertion as confirmation. The URL locates the authenticated person's review screen; it is not a bearer credential and reveals no proposal value before login. The server creates a one-use review session of at most five minutes bound to the owner session, proposal ID/version, source client and exact JCS statement `{domain,key,value_type,value,context_kind,temporal}` hash. The app displays that exact statement and rechecks the binding before committing confirmation. Any proposal change invalidates the session. Third-party callers receive only their own proposal status afterward. Sensitive acceptance is always first-party.\n\nMulti Round-Trip Requests and assistant-attested confirmation are reserved for a separately specified future extension. A contributor's confirmation permission in v1 only permits requesting the first-party review link; it never permits writing a declaration directly.\n\n### A7.3 Resources and briefing\n\n`autonym://context/{domain}` maps to a single-domain context request under the same grant and compiler, counts as one read, and returns the signed JSON object. No grant means no read.\n\nThe `autonym_briefing` prompt requests `agent` and `communication` at L1 through one compiler transaction. Both domains must be granted; no fallback ambient read exists. It counts once, returns a text message containing the signed disclosure JSON, and labels any human-readable summary as derived from that object. A summary cannot extend validity or add entries. The recipient must apply normal instruction/safety boundaries to contributed text; context is data, not authority to override system or tool policy.\n\nChecks: TRANSPORT-01, CORE-01, SIGN-01, LOG-01, CONTRIB-01.\n",
    "08-rest.md": "## A8. REST API\n\nThe complete recipient contract is [OpenAPI 3.1](openapi/autonym-v1.yaml), generated from the same schema definitions as MCP. The file uses JSON syntax, which is valid YAML. This is a draft contract, not a deployed endpoint. Public discovery is unauthenticated; every recipient action is authenticated and authorised.\n\nUse HTTPS, exact `<origin>/v1` audience, and `Autonym-Version:1.0` on protocol responses. DPoP-bound tokens require `Authorization:DPoP` plus the DPoP header. Bearer is accepted only for the eligible unbound assistant case in A6. Reject repeated scalar query parameters, malformed values, unknown fields and unknown protocol versions. Comma-separated domain/key lists have no empty items or duplicates. Maximum body size is 64 KiB, including nested values. A context response has at most 1,000 entries; reject an over-limit request without a partial unmarked disclosure.\n\n| Method | Path                               | Result                                                      |\n| ------ | ---------------------------------- | ----------------------------------------------------------- |\n| GET    | `/.well-known/autonym`             | Provider discovery                                          |\n| GET    | `/v1/grant`                        | Current authenticated grant                                 |\n| GET    | `/v1/domains`                      | Eligible granted domains/keys, without counts               |\n| GET    | `/v1/context`                      | Signed disclosure, one counted read                         |\n| GET    | `/v1/context/{domain}`             | Same, with conditional-request support                      |\n| POST   | `/v1/proposals`                    | Contribution event acknowledgement                          |\n| GET    | `/v1/proposals/{id}`               | Own proposal status only                                    |\n| POST   | `/v1/proposals/{id}/confirm`       | Exact-statement confirmation/review                         |\n| DELETE | `/v1/proposals/{id}`               | Withdraw own proposal                                       |\n| GET    | `/v1/purge-instructions`           | At most 100 outstanding signed instructions for this client |\n| POST   | `/v1/purge-instructions/{jti}/ack` | Purge acknowledgement                                       |\n\nThe path ID and body ID must match wherever both occur. Unknown or foreign proposal IDs return the same `proposal_not_found`. Contribution retries are identified by authenticated event ID as specified in A14. Other mutating requests require a client-scoped UUIDv4 `Idempotency-Key`, canonical-payload equality, and 30-day deduplication. Always recheck authority before replaying a stored response; a retry after revocation cannot retrieve protected results.\n\n### A8.1 Conditional reads\n\nAn ETag is a quoted opaque HMAC under a dedicated provider key of JCS containing the client, grant ID/revision, canonical request filters, sorted selected alias/version/level triples, temporal selection epoch and the previous envelope deadline. Store its association with that exact signed envelope and response hash. Never use a content-only ETag.\n\nA matching `If-None-Match` may return `304` only while the prior envelope is still valid, its entire selection and authority still match, and the grant has not exhausted its read limit. This writes a `read_not_modified` event and counts towards rate limits but does not increment `reads_used`. It cannot extend a signed deadline. At or after any time boundary return a new counted signed response if permitted, or the relevant error. Revocation, counter checks and dependency checks cannot be bypassed through `304`. Responses use `Cache-Control:no-store`; this conditional facility is only for a recipient's explicitly held, still-valid transient object.\n\n### A8.2 Errors and limits\n\n[errors.json](errors.json) is the closed registry, and [problem.json](schemas/problem.json) is the exact RFC 9457 representation. No rejected value, record content, credential or existence hint appears in an error. Authentication/token-endpoint errors retain their OAuth-defined representation. `handle_moved` is deliberately removed; API migration does not redirect credentials or disclose a destination.\n\nThe provider enforces at least per-client and per-grant rate limits and responds `429` with `Retry-After`. Default ceiling is 60 authorised requests per minute per grant and 600 per minute per client; a provider may lower these published operational limits, but cannot silently increase consent limits. Body-size, rate and authentication failures do not consume read counts. Only committed fresh disclosures consume reads.\n\nOwner management must support reviewing entries/proposals/grants/history, temporal activation, correction, revocation, export/import and deletion with re-authentication for sensitive changes. The earlier `/v1/me/*` list was illustrative. Private UI routes are outside this recipient interoperability contract; it does not grant recipients management authority.\n\nChecks: TRANSPORT-01, TEMP-03, CORE-01, LOG-01, CONTRIB-02, PURGE-01.\n",
    "09-receipts-and-log.md": "## A9. Read receipts and the log\n\nEvery fresh disclosure commits a [receipt](schemas/receipt.json) before returning. Its read ID matches the signed envelope. It records grant, client, purpose, trusted time, surface, canonical request, internal entry/version/level references and response hash. Internal references are owner-only; recipient-facing evidence uses the signed disclosure and its pairwise references.\n\n`response_hash` is `sha256:` plus lower-case hexadecimal SHA-256 of the exact JCS UTF-8 envelope without `proof`, the same bytes signed in A5. The receipt's `hash` covers its JCS form excluding `hash` and `proof`, including `prev_hash`. The first event uses null previous hash. Sign the complete receipt excluding `proof` using the A5 ES256 method and protected `typ:autonym-receipt+jws`.\n\nThe owner log is append-only and hash-chained per record partition. Non-read events use `{event_id,at,kind,actor_client_id,subject_id,details,prev_hash,hash}`. `kind` is one of `grant_created`, `grant_revoked`, `grant_expired`, `rule_applied`, `delegation_redeemed`, `proposal_decided`, `overlay_enabled`, `overlay_disabled`, `overlay_selected`, `read_not_modified`, `purge_issued`, `purge_acknowledged`, `operator_action` or `migration_imported`. `details` contains only decision codes and relevant opaque IDs, never entry values, utterances or tokens. Non-read event schemas are defined in the supplementary contracts. These events use the same hash rule and are included with receipts in export.\n\nGrant/counter updates and log append occur in the disclosure transaction. Failure cannot leave a successful unlogged read. A `304` appends an event referencing its previous read ID and response hash, without a fresh disclosure or counter increment.\n\nOwners can inspect reads, consent changes, temporal activation, withdrawals and purge state. Operational logs and telemetry have a separate allowlist and never contain context values, approved renderings, source evidence, uploaded content, credentials or tokens. A cryptographic chain reveals tampering relative to a trusted checkpoint; a host controlling all keys and checkpoints is not magically unable to rewrite history. Owners should be able to export signed checkpoints.\n\nISO/IEC 27560 is a useful consent-record reference, but this draft does not claim certified mapping to its unavailable full text. The explicit fields here are the wire contract.\n\nChecks: LOG-01, ADS-02, SIGN-01, PORT-01.\n",
    "10-revocation-and-purge.md": "## A10. Revocation and purge\n\nEnding a grant stops future reads immediately. It does not remotely erase a recipient's existing copy. A provider issues a signed purge instruction for every ended grant with persistence rights; notices for transient grants may also be sent. The person can see delivery and acknowledgement state.\n\nThe payload follows [purge-instruction.json](schemas/purge-instruction.json), signed as compact JWT with ES256 and protected `typ:autonym-purge+jwt` and trusted `kid`. It binds provider issuer, pairwise subject, recipient audience, instruction ID, issue/expiry timestamps, grant ID and deadline. The reason is identical for revocation and expiry:\n\n```json\n{ \"reason\": \"grant_ended\" }\n```\n\n`scope:all` means copies obtained under that grant, including derived recipient copies. No explanation of why it ended is disclosed. Default acknowledgement deadline is seven days after issue; JWT validity is 30 days. Fetching an outstanding expired notice issues a fresh signed delivery with the same instruction ID/deadline, not a new erasure obligation.\n\nDelivery uses registered HTTPS `autonym_purge_uri` through the SSRF-safe client. Retry after 1 minute, 5 minutes, 30 minutes, 2 hours, 12 hours and then daily until acknowledgement or 30 days. Each attempt revalidates destination ownership and DNS/address safety. A recipient may poll outstanding notices using authenticated client credentials bound to its registration; this lifecycle channel does not require a still-active read grant and confers no record-read authority. Do not drop a notice merely because the triggering grant expired.\n\n[purge-ack.json](schemas/purge-ack.json) binds instruction ID, time and `purged`, `not_held` or `legal_hold`, plus a bounded explanation. Sign it with the recipient's registered key where one exists, using `typ:autonym-purge-ack+jws`; otherwise record the authenticated but unsigned assurance explicitly. Validate client/instruction binding. An acknowledgement is evidence of the recipient's assertion, not independent proof of erasure. `legal_hold` records an exception claim, not completed purge.\n\nMissing acknowledgement past the deadline remains visible to the person. The default status-retention period is 12 months, subject to a shorter period required by applicable law or necessity, or the owner's shorter lawful retention choice. Any longer retention needs the specific lawful justification and safeguards in A16.5. Do not expose it to other recipients. No registry standing or certification is inferred in v1.\n\nChecks: PURGE-01, ADS-02, SIGN-01, CORE-01.\n",
    "11-portability.md": "## A11. Portability\n\n### A11.1 Export and import\n\n[export.json](schemas/export.json) defines `autonym-export/1.0`: export time, origin, entries and included versions, non-content deletion tombstones, proposal events/acknowledgements, historical grants, read receipts, non-read log events, public verification keys, inactive policy history, unsupported-category report and proof. The owner chooses current versions or complete retained history. The export manifest says which was chosen. Owner-only wrappers bind every historical grant, receipt, log event, proposal and policy to its partition ID; validate those IDs against the partition list. Preserve canonical IDs, temporal intervals, overlay targets, semantic kinds, provenance, evidence references and original origin. Evidence references may be unavailable at the new host; report that explicitly, never treat missing evidence as verified.\n\nSign the JCS export excluding `proof` with the originating provider's ES256 key and protected `typ:autonym-export+jws`. Exported public keys preserve verifiability of historical artefacts; they do not become trusted active signing keys at the destination. The owner's authenticated export operation establishes the source, with explicit source trust on import. Do not follow arbitrary key URLs from the file. Never export private keys, access/refresh tokens, passkeys, client secrets or executable credentials.\n\nThe importer validates size, schema, signatures, vocabulary, IDs, versions, temporal constraints, dependency cycles and relationships before changing the destination. Maximum decoded v1 import is 64 MiB and 100,000 entries/events of each supported kind. Reject duplicate IDs/versions with differing content. Identical retransmission is idempotent. Imports use a staged preview listing unsupported categories and conflicts. The person chooses whether to omit unsupported material or cancel; no silent data loss is permitted. Committing entries, selection and provenance is atomic for the accepted import.\n\nImported grants, rules, delegations and consent events are immutable history, never executable authority. The destination creates fresh keys, handles and client-bound grants after new consent. An old token MUST fail at the new provider. Unverified credentials remain archived and non-disclosable. A legacy value with no core key mapping is reported as unsupported, not coerced into a broad text field.\n\n### A11.2 Optional encrypted export\n\nThe unencrypted signed JSON contract is required for Portable; passphrase encryption is an optional, fully specified format. Use compact [JWE](https://www.rfc-editor.org/rfc/rfc7516) with `alg:dir`, `enc:A256GCM`, `typ:autonym-export+jwe` and `cty:application/autonym-export+json`. Plaintext is UTF-8 of the signed export. Use a new random 96-bit GCM IV and 128-bit authentication tag as required by JWE.\n\nDerive a 32-byte key with [Argon2id RFC 9106](https://www.rfc-editor.org/rfc/rfc9106#section-4), version 19, memory 65,536 KiB, three iterations, four lanes and a fresh random 16-byte salt. The UTF-8 passphrase is used exactly as entered, without normalisation or truncation. The protected header contains `crit:[\"autonym_kdf\"]` and `autonym_kdf:{name:\"argon2id\",v:19,m:65536,t:3,p:4,salt:<base64url-unpadded>}`. This authenticated critical extension is the sole v1 KDF parameter set. Argon2id is not a JOSE `alg`.\n\nReject unsupported/missing KDF fields, salt size, algorithms, duplicate JSON members and excess encrypted size before allocating Argon2 memory. Limit concurrent derivations. Verify GCM before parsing or exposing plaintext, then verify export signatures and semantics. Authentication failure returns a generic invalid-export result, without distinguishing wrong passphrase from tampering. Use maintained Argon2/JWE libraries; do not implement these primitives in application code.\n\n### A11.3 Honest portability\n\nA provider claiming Portable supports both export and import for its stated categories and demonstrates round-trip preservation, conflict reporting and no authority transfer. A recipient claiming Reciprocal supports receiving and returning the person's stated data categories; it need not transfer proprietary model weights or ranking algorithms. Raw history and confirmed preferences are separate selections. Named media services are examples, not integration claims.\n\nChecks: PORT-01, SIGN-01, CLAIM-01, TEMP-01 to TEMP-03.\n",
    "12-recipient-registry.md": "## A12. Recipient registry and trust\n\nA registry can provide evidence about a recipient, but cannot grant access to a person's record. The provider's stored grant remains authoritative. Names, logos, registration metadata and client assertions are not certification.\n\nFor v1, capability discovery uses [capability-claim.json](schemas/capability-claim.json) and explicitly states `assurance:self-declared`, role, protocol/document version, data categories, directions, limitations and test evidence. A provider must not turn self-declaration into a verified/certified badge or trusted client class. The person sees the recipient's registered identity and available evidence during consent.\n\nThe earlier Trust capability, registry tiers, signed registry attestations and registry-mediated governance are reserved for a later version. No v1 tier can be purchased or inferred from passing a structural schema check. A future registry extension must specify issuer trust, verification, expiry, suspension, appeal, purge evidence and independent assessment before certification claims become valid.\n\nRegistry unavailability cannot silently increase permission. If a future grant depends on active trust evidence, unverifiable, expired or suspended evidence fails closed. In v1, a suspended or disabled client cannot read even with an otherwise active grant. No recipient registry may expose another recipient relationship or the person's destination provider.\n\nChecks: CLAIM-01, CORE-01, ADS-01. Trust certification is outside v1, with no issued certificates.\n",
    "13-emergency-card.md": "## A13. Emergency information\n\nEmergency cards are outside the v1 interoperable capability set. A normal v1 `safety` or `medical` purpose still requires a current recipient grant, the same compiler and a receipt. There is no anonymous emergency override, special URL that bypasses consent, or promise of emergency-service availability.\n\nThe future design direction is an explicitly person-selected clinical subset carried using a separately verified health-link standard. That work must establish clinical mappings, offline disclosure, key distribution, expiry, revocation limitations, consent and device access before release. This draft does not invent a SMART Health Link or IPS wire format or claim compliance with those standards.\n\nAn implementation offering a separate experimental emergency card must clearly distinguish it from v1 conformance. Offline scans cannot reliably be logged or remotely revoked, and the person must be told before creating one. Never label an offline disclosure as a logged Autonym read or make an emergency-care reliability claim from this protocol.\n\nChecks: CLAIM-01. Clinical interoperability and offline-card acceptance are explicitly outside v1 scope.\n",
    "14-connectors.md": "## A14. Contributions and connectors\n\n### A14.1 Authority and transport\n\nV1 uses authenticated HTTPS push: one event per `POST /v1/proposals`, or the identical `propose_entry` MCP tool. Maximum event body is 64 KiB. Batches, background polling, streaming subscriptions and vendor-specific export formats are outside v1. A connector repeatedly pushes within its bounded, separately revocable contribution grant; continuity does not imply perpetual permission.\n\nGrant constraints are an exact domain/key allowlist, purpose, expiry, maximum accepted unique events and optional ordinary confirmation permission. A read grant cannot contribute; a contribution grant cannot read context, enumerate records, list other recipients or discover migration destinations. The current-grant endpoint is restricted to the authenticated grant and exposes no linked grants.\n\n### A14.2 Events and deduplication\n\n[contribution-event.json](schemas/contribution-event.json) defines a discriminated `create`, `correct` or `withdraw` event. `event_id` is a contributor-scoped opaque ASCII identifier of 1 to 128 letters, digits, underscores or hyphens. Record the authenticated client as source; reject a body-supplied source client or ingestion time. The provider sets ingestion time from its trusted Clock. Occurrence time can describe past activity but must not exceed ingestion by more than five minutes; it does not backdate authority.\n\nUniqueness is `(record partition, authenticated client, event_id)`, independent of a refreshed grant. Hash the canonical submitted payload with SHA-256 for comparison. An identical authorised retry returns the original acknowledgement; a differing payload under the same ID returns `idempotency_conflict`. A new correction uses a new event ID and names its predecessor. Accept and acknowledge transactionally, after rechecking current grant activity and limits. Identical retries do not consume another event allowance, but still require active authority and rate limits.\n\nRetain deduplication identities and payload digests for the stream lifetime plus 30 days. Revocation ends that stream; reopening requires a fresh stream namespace communicated in the new contribution grant. A stream namespace is a UUIDv4 and is included in every event. The provider never accepts the old namespace under a new stream grant. Retired namespaces retain a non-content tombstone so old events cannot reappear after deduplication expiry. Digests and metadata remain protected, not public diagnostics.\n\n### A14.3 Corrections, withdrawal and provenance\n\nCorrections/withdrawals may target only a previous event from the same client, stream and record. The full predecessor chain is bounded to 100 and cannot branch silently: a correction must reference the current head or fail `proposal_decided`. Source withdrawal stops disclosure of the contributed observation and invalidates dependent derivations. It cannot delete the person's independently confirmed declaration; instead flag the changed evidence for the person's review.\n\nEvent category distinguishes `user_supplied`, `activity`, `observation` and `inference`. Preserve it even after acceptance. Approval of a batch, client or general stream is not confirmation of a statement. Becoming `declared` requires explicit confirmation of the exact value and protected statement hash. The first-party app handles all sensitive or safety-critical proposals; all v1 confirmation occurs in the first-party app; third parties can request review only. `inferable:false`, safety and special-category prohibitions cannot be overridden by enabling a domain.\n\nRejected suggestions must not repeatedly resurface: suppress identical `(client,domain,key,canonical value digest)` proposals for 90 days unless the person explicitly reopens the suggestion or supplies a new declaration. Evidence references are opaque pointers, not permission for the server to fetch arbitrary URLs. External evidence retrieval needs separate safe-fetch and owner consent rules.\n\n### A14.4 Separation of history and preference\n\nContributing viewing activity does not imply permission to read a person's other preferences. Another service may request reviewed preferences, raw history or both, with separate key selection. Derivations obey A4's recursive input-rights rule. An independently confirmed preference can be shared without history, while original source evidence remains protected.\n\nChecks: CONTRIB-01 to CONTRIB-03, CONSENT-01, TEMP-03, CORE-01.\n",
    "15-security.md": "## A15. Security requirements\n\nThe protocol minimises disclosure; it does not make a trusted host harmless or guarantee deletion by a recipient. Treat record contents and contributor text as untrusted data. They cannot override recipient system instructions, tool permissions or safety boundaries.\n\n### A15.1 Authority and isolation\n\nEvery recipient action requires current server-side authority. Enforce issuer, exact audience, client binding, expiry, DPoP where required, grant revision, domain/key/level constraints, purpose, temporal validity and limits. Recheck inside the transaction. Deny missing, unknown or incompatible state. The privacy boundary covers errors, discovery, provenance, identifiers, metrics and conditional requests as well as entry values.\n\nUse client-bound handles and entry aliases. A contributor cannot enumerate other recipients or learn where the person migrated. L0 categories are closed and reveal no direct value; combinations may still identify a person or imply sensitive information. Providers SHOULD refuse a wildcard L0 grant to a client already holding L2 or higher in any domain, and explain its actual grant selection to the person.\n\n### A15.2 Signed objects\n\nRequired signatures cover successful disclosure envelopes, owner-verifiable read receipts, export envelopes, purge instructions and purge acknowledgements where the recipient has a registered key. Reserved future host-binding formats must define their own signed object before use. TLS is still mandatory.\n\nHTTP `204`/`304`, operational health/readiness, errors, lists and discovery are not signed disclosure envelopes. MCP wraps the same signed object rather than an unsigned equivalent. This boundary replaces the earlier ambiguous phrase “every response signed”. Signature verification includes configured trust, protected type/algorithm, complete signed bindings, strict canonicalisation and deadline checks; see A5.\n\n### A15.3 Implementation controls\n\n- Use maintained cryptographic libraries and secure platform primitives. Private keys and encrypted record contents must be isolated from operational support access. Administrative actions are logged to affected owner history without exposing values.\n- Rate-limit by client, grant and unauthenticated origin. Bound nested JSON, body size, dependency depth, exports, cryptographic work and retries. Fail closed on unavailable key storage or grant state.\n- Fetch client-supplied URLs only through SSRF-safe retrieval, checking resolved addresses and redirects and blocking private/link-local destinations unless an explicitly isolated local mode is configured. No credential forwarding across origins.\n- Keep values, renderings, utterances, evidence, uploads, credentials and tokens out of operational logs, traces, metrics, emails and job payloads. Owner history is separately protected.\n- Protect first-party changes with authenticated sessions, CSRF controls, fresh re-authentication for sensitive actions and visible audit history. Never expose a route that decrypts arbitrary records for operators.\n\nV1 excludes guardian-managed advertising and reserves general guardian/duress functionality. These need independent abuse, safeguarding and control-transfer designs before release. A plausible-looking “duress record” is not a security guarantee and must not be claimed from this draft.\n\nChecks: all security-relevant checks in the [manifest](conformance/profiles.json). Cryptographic interoperability, concurrency, storage and live authorisation remain runtime release gates.\n",
    "16-privacy-mapping.md": "## A16. Privacy and legal mapping\n\n### A16.1 What the protocol supports\n\nThis subsection is informative. Protocol mechanisms can support privacy obligations; they do not establish lawful processing, legal compliance or certification. Roles, purposes, jurisdiction, safeguards and actual operation matter. A16.2 to A16.8 define deployment requirements for providers and recipients claiming conformance. They add no wire fields and do not turn conformance into legal approval.\n\n| Mechanism                                | What it can support                                       | What it does not establish                                                                            |\n| ---------------------------------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |\n| Consent screen and grant                 | Recording a specific decision and facilitating withdrawal | Valid freely given, informed consent or the correct lawful basis in every situation                   |\n| Revocation                               | Stopping future provider-mediated access                  | Erasure of existing recipient copies or withdrawal of every other legal basis                         |\n| Read log                                 | Evidence useful for an access response                    | All information required by an access right                                                           |\n| Correction and versioning                | Rectifying active data and retaining necessary history    | Rectification merely because an old and new version both exist                                        |\n| Purge notice and acknowledgement         | Requesting deletion and recording a recipient's assertion | Completed erasure, removal of backups, or absence of an applicable exception                          |\n| Export/import                            | Transfer of the specified user-data categories            | That every item falls within a statutory portability right or may be disclosed despite others' rights |\n| Sensitive-key and inference restrictions | Data minimisation and additional technical controls       | A lawful condition for processing special-category data                                               |\n| Pairwise identifiers and short validity  | Privacy by design and reduced linkability                 | Anonymity, impossibility of inference or prevention of off-platform misuse                            |\n\nThe EU GDPR provisions most directly relevant include Articles 7, 9, 15, 16, 17, 20 and 25. Read their conditions and exceptions in the [official regulation](https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng). UK applicability must be evaluated separately using current legislation and [ICO consent guidance](https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/lawful-basis/consent/); it is not assumed identical to EU rules.\n\nThe [EU Data Governance Act](https://eur-lex.europa.eu/eli/reg/2022/868/oj/eng) has its own scope, notification requirements and conditions, including Articles 11 and 12. A technical registry badge cannot confer data-intermediation status. Advertising eligibility rules in A18 are protocol restrictions, not a declaration that an advertising use is lawful.\n\nThe [international privacy guide](https://autonym.dev/international-privacy) gives dated, informative jurisdiction notes and primary sources. It is not a substitute for the deployment assessment below and is not incorporated as normative law.\n\n### A16.2 Applicability, roles and lawful processing\n\nBefore collecting, storing, accepting a contribution, deriving or disclosing personal data, each deploying provider and recipient MUST document the applicable jurisdictions, its actual legal roles, purposes, data categories and lawful conditions for those operations. The assessment MUST consider the people served, establishment, targeting, sector and actual processing, rather than relying solely on nationality, IP address or hosting location. Where a required condition is absent or unresolved, the affected operation MUST remain disabled. Independently lawful operations need not be disabled.\n\nProtocol actors do not determine legal roles. The assessment MUST distinguish independent, joint and processor relationships where applicable, including account administration, security logs, hosting and recipient use. Encryption and a person's household use do not automatically exempt a commercial provider. Required notices, agreements and evidence of the selected lawful conditions MUST be in place before the relevant processing.\n\nA grant is a technical permission, not itself a lawful basis. Where consent is relied on, the implementation MUST retain proportionate evidence of the actual notice and version, language, purposes, parties, categories, affirmative action, time and withdrawal route. It MUST satisfy any applicable explicit, separate, written or representative-consent formality and permit refusal and withdrawal without prohibited detriment. Withdrawal MUST be as easy as giving consent where the law requires it. Grant acceptance MUST NOT waive statutory rights or authorise a purpose that the protocol prohibits.\n\nRequired indirect-collection notices MUST be handled at the legally required time. Data in a pending or rejected contribution has already been collected; a confirmation queue is not an exemption. Compliance records MUST remain protected and MUST NOT expand discovery or disclose additional personal data to recipients.\n\nCheck: PRIVACY-01.\n\n### A16.3 Sensitive data, necessity and further use\n\nThe provider and recipient MUST assess legal sensitivity for the actual data, source, inference and combination in each applicable jurisdiction. Vocabulary flags and disclosure levels are technical controls, not an exhaustive legal classification. A low-resolution rendering can remain personal or sensitive data. Implementations MUST NOT relabel data, lower its disclosure level or describe it as a preference to evade a legal restriction.\n\nCollection, storage and disclosure MUST be limited to the purpose and necessity permitted by applicable law. Operations governed by a grant MUST also remain within that grant’s purpose and authority. Where processing requires a special condition, that condition MUST be established before the affected data is accepted or used. Consent MUST NOT be treated as overriding a statutory prohibition or strict necessity requirement. Unsupported categories and uses MUST remain disabled for the affected deployment.\n\nModel training, advertising, enrichment and other further uses MUST NOT be inferred from permission to read, contribute or host a record. Any further use MUST satisfy its own applicable legal conditions and the protocol's purpose and authority limits; fresh consent cannot override a protocol prohibition.\n\nCheck: PRIVACY-02.\n\n### A16.4 International flows\n\nBefore an international flow begins, the deploying parties MUST document its source, destination, parties, purposes and data categories, including hosting, backups, remote access, subprocessors and onward disclosure. They MUST establish any required transfer mechanism, assessment, contract, notice, separate permission, filing, representation or localisation arrangement for that flow. A grant, encrypted transport, chosen hosting region or an agreement designed for another jurisdiction is not sufficient evidence by itself.\n\nThe assessment MUST record which flows an instrument covers, applicable conditions and a review point. A material change of destination, recipient, access arrangement or legal protection MUST trigger reassessment before the changed flow proceeds. A flow whose required safeguards are no longer satisfied MUST be suspended without silently selecting a different destination.\n\nCheck: PRIVACY-03.\n\n### A16.5 Rights, retention and erasure\n\nEach deploying party MUST provide an accessible route for applicable access, correction, deletion, restriction, objection and portability requests, authorised representatives, complaints and appeals. Identity verification MUST be proportionate. It MUST NOT require a new account where applicable law prohibits doing so. The party MUST track the applicable deadline, any permitted extension, outcome, reasons and challenge route. A protocol export or read log alone MUST NOT be represented as a complete statutory response.\n\nCorrection MUST stop superseded information from being presented as current and communicate corrections or restrictions to recipients where required. Keeping both versions is not sufficient. Disputed or restricted data MUST be prevented from entering uses that the restriction prohibits.\n\nRetention rules MUST cover entries, history, contributions, receipts, logs, caches, exports and backups. Grant expiry and revocation MUST NOT be treated as deletion. Append-only audit design MUST NOT imply indefinite personal-data retention. Implementations MUST use bounded history and proportionate evidence, with a tested deletion or effective cryptographic-erasure process where appropriate. Restoring a backup MUST reapply deletions and restrictions before restored data becomes available for processing.\n\nRevocation, consent withdrawal, restriction and erasure MUST be handled as distinct actions with their actual effects explained. A10's default seven-day acknowledgement period is a protocol target, not a universal legal deadline. A recipient's purge acknowledgement MUST be described as its assertion, not proof that every copy has disappeared. Missing acknowledgements and incomplete deletion MUST have a tracked follow-up process.\n\nAny retained data under a legal exception or hold MUST have a specific documented ground, restricted access and use, a review or end condition, and any legally required explanation and challenge route. Such retention MUST NOT be reported as erasure or become an implicit new grant.\n\nCheck: PRIVACY-04.\n\n### A16.6 Advertising choices and children\n\nA18's advertising restrictions are an upper bound, not legal authorisation. Before enabling that optional capability, the deploying parties MUST assess whether the arrangement constitutes regulated sale, sharing, targeted advertising or another restricted use, including non-monetary consideration. The capability MUST remain disabled wherever a required condition cannot be met.\n\nImplementations MUST honour applicable objections, opt-outs and recognised preference signals, including signals received after a grant was issued, before the next affected disclosure or use. A grant MUST NOT silently override a valid opt-out. The absence of a signal is not consent. Any legally permitted later opt-in MUST be handled through the required informed process. V1 defines no universal transport for these signals; an implementation without a reliable way to receive and enforce applicable choices MUST keep the affected advertising use disabled. Device access, cookies and direct marketing require their own assessment.\n\nV1's reserved guardian mechanisms do not establish a child-consent or capacity framework. A deployment directed to children, or otherwise within applicable child-protection duties, MUST establish the required age, capacity, representative authority and child-specific safeguards through a separately specified and verified process before enabling affected processing. Until that process exists, the deployment MUST restrict its supported audience and affected functions accordingly, using proportionate measures. It MUST NOT claim that a generic checkbox establishes parental authority. Child and guardian advertising remains excluded by A18.\n\nCheck: PRIVACY-05.\n\n### A16.7 Accountability and regulated services\n\nEach deploying party MUST establish the impact assessments, security measures, contracts, records, registrations, permits, licences, prior authorisations, officers and representatives required for its actual activity. Where an approval is required before processing or a transfer, the party MUST establish that it has been granted and covers the intended activity, rather than treating an application or personal consent as approval. It MUST track conditions, expiry and renewal, and stop the affected operation when required permission is absent or expires. It MUST maintain and exercise an incident process with jurisdiction-specific triggers, reporting routes and deadlines. Unauthorised disclosures, including misuse by an authorised recipient, MUST be assessed; incident handling MUST NOT assume that every law uses the same threshold or a 72-hour deadline.\n\nA recipient using data for a decision subject to explanation, objection, review or human-intervention rights MUST provide the applicable process and information. A read receipt explains an access event, not the reasoning or consequences of a subsequent decision.\n\nParties MUST assess any activity-specific regime, including data intermediation, registered consent-management services and sector health or financial rules, before claiming that status. A technical provider, consent screen or registry entry MUST NOT be described as a legally registered or certified service without the required legal conditions, registration and any structural safeguards.\n\nCheck: PRIVACY-06.\n\n### A16.8 Evidence and claims\n\nA deployment claiming conformance MUST hold evidence for PRIVACY-01 to PRIVACY-06 identifying the tested build, jurisdictions, supported uses and categories, assessment date, responsible reviewer, restrictions, operational procedures and observed results. Evidence MUST include representative exercises of the relevant consent, rights, transfer, retention, opt-out and incident processes. Legal applicability decisions require accountable review; automated schema checks cannot make them.\n\nThe deployment MUST reassess material changes in law, purpose, audience, data or flows. Public claims MUST state their scope and limitations without publishing personal data, privileged advice or confidential security details. A checklist, pending test or published contract MUST NOT be presented as an operating safeguard. No conformance statement under A17 may be labelled a legal compliance certificate.\n\nChecks: PRIVACY-01 to PRIVACY-06 and CLAIM-01.\n",
    "17-conformance.md": "## A17. Conformance and change process\n\n### A17.1 Provider and recipient roles\n\n[The conformance manifest](conformance/profiles.json) defines exact required check groups and dependencies. Shared security, data-minimisation and A16 deployment requirements apply to every claimed capability. PRIVACY-01 to PRIVACY-06 require operational evidence for the deployment's stated jurisdictions and uses; passing them is not a legal compliance certificate.\n\n| Role      | Capability | Required behaviour                                                                                                       |\n| --------- | ---------- | ------------------------------------------------------------------------------------------------------------------------ |\n| Provider  | Core       | Pairwise identity, typed record, temporal compiler, consent, one or both public surfaces, receipts, revocation and purge |\n| Provider  | Write      | Core plus separate contributions, protected confirmation and correction/replay handling                                  |\n| Provider  | Portable   | Core plus export and import, preservation/unsupported reporting and migration without authority transfer                 |\n| Provider  | Delegated  | Core plus bounded standing rules and one-use target-bound grant offers                                                   |\n| Recipient | Read       | Correct grant use, signature/binding/expiry verification, permitted retention and purge                                  |\n| Recipient | Contribute | Separate contribution authority, provenance, retries and own-event correction/withdrawal                                 |\n| Recipient | Reciprocal | Read and Contribute plus inbound/outbound transfer for the same stated categories                                        |\n\nAdvertising is optional and additionally requires ADS-01 and ADS-02. Verified credential presentations, Trust registries and emergency cards are reserved, unclaimable v1 extensions. “Read” does not mean Portable. An export-only implementation cannot claim Portable or Reciprocal.\n\n### A17.2 Claims and evidence\n\nUse [capability-claim.json](schemas/capability-claim.json): role, wire/document version, capabilities, exact domain/key categories, directions, limitations, evidence URLs/timestamps and `assurance:self-declared`. Provider capability names and recipient capability names cannot be interchanged. Directions must match actual behaviour and the declared capabilities. A Read-only claim cannot advertise contribution or transfer. Every claimed direction has at least one supported category; categories may differ for reading and contribution. Portable/Reciprocal covers both export and import for every category named in that claim. Evidence identifies a reproducible test suite version, tested build and result for every required check.\n\nThe draft establishes no certification authority and issues no badges. Independent certification requires a separately published governance and assessment process. A self-declared implementation can accurately publish its evidence and limitations, but cannot say “certified” because its JSON parsed or because a provider supports a similar capability.\n\nContract checks in the reference repository validate schemas, vocabulary examples, scope syntax and selected pure policy invariants. They do not exercise a running recipient service. Full runtime checks in the manifest remain pending and must pass before a conforming implementation is claimed. Failure reports must identify check ID, expected behaviour and observed behaviour without exposing personal values.\n\n### A17.3 Changes\n\nDocument version `0.2-draft` is distinct from proposed wire version `1.0`. After wire release, breaking changes require a new version/URL prefix, an ADR, migration guidance and explicit approval. Additive core keys require full value/rendering definitions, sensitivity review, examples and conformance coverage. Unknown keys stay rejected until the new vocabulary version is negotiated.\n\nThe [versioning and change process](19-change-process.md) describes review, compatibility and published editions. Each edition includes the specification text, machine-readable contracts, examples and conformance requirements.\n\nChecks: CLAIM-01 and all checks required by the declared capabilities.\n",
    "18-scope-additions.md": "# A18. Consent, temporary context and reciprocal portability\n\nThis chapter defines consent, temporary context and reciprocal portability for document 0.2-draft, together with A4, A6, A14 and A17. See [implementation status](conformance/README.md) for supported service capabilities.\n\n## A18.1 Consent and advertising\n\nThe deployment requirements in [A16](16-privacy-mapping.md) also apply. Advertising requires the local-law and opt-out controls in PRIVACY-05 as well as ADS-01 and ADS-02.\n\nRead and contribution permissions require separate grants, approval and revocation. One named recipient, one purpose category and a plain-language purpose explanation are required. A recipient's consent manager may initiate a flow, but only the provider's stored active grant authorises access. Recommendation/personalisation permission MUST NOT be repurposed for advertising. Declining advertising MUST leave independent non-advertising permissions intact.\n\nAdvertising is optional and off by default. V1 permits only explicitly person-confirmed `viewing.genre_affinity`, `reading.genres` and `music.genres`, validated against their closed core enums. All other keys are ineligible. No inferred preferences, free text, activity history, extensions, wildcard domains, sensitive or safety information, identifiers, location, financial, employment or proxy categories enter this lane. A declared value derived from sensitive source material is not made eligible by relabelling it. Providers MUST require the person to choose the offered ordinary preference directly and prohibit sensitive targeting/inference by recipient policy.\n\nAn advertising read grant requires independent first-party consent, a self-directed adult-owned record, an active eligible named recipient, explicit key selection, declared-only mode, maximum L1, exactly one permitted read, expiry within 24 hours, no persistence, delegation or onward-sharing right. If adult/self-directed eligibility cannot be established, deny the feature; do not collect extra identity documents simply to enable advertising. Child/guardian-managed records are excluded. Recipient suspension stops reads immediately. Retain context only for the current interaction and never past the signed five-minute maximum; a new interaction needs fresh permission.\n\nThe consent view shows selected context, recipient, advertising purpose, expiry and no-retention terms. Refusal is an ordinary choice. No resale, advertising identifier, cross-recipient correlation, provider monetisation of contents or undisclosed ad-exchange disclosure is implied. Contextual ads that read no record need no Autonym read grant. Off-platform misuse cannot be prevented once data is disclosed; recipient terms and independent assurance remain necessary. These rules are not a legal-compliance certificate.\n\nEvery advertising read has the same signed envelope and receipt as other reads. Withdrawal and purge state are visible to the person. Purge acknowledgement is an assertion, not proof that every copy has gone.\n\n## A18.2 Temporary context\n\nThe precise representation is A4's semantic kind, UTC interval and optional baseline-targeting overlay. A temporary overlay requires a finite end and explicit activation. A fasting period or holiday is a bounded additive state; a month without alcohol is a drink-preference overlay. Grant expiry and entry expiry are independent.\n\nThe provider captures one trusted instant per transaction. Start is inclusive and end exclusive. Future context is withheld until its start; expired or disabled context stops on the next read without waiting for a cleanup job. The person's timezone is resolved when turning dates into instants. V1 deliberately omits recurrence; the person confirms each new interval.\n\nAn overlay never rewrites the standing preference. When it ends, the eligible baseline returns. It cannot weaken a safety fact. Conflicting overlays require the person's choice; absent an unambiguous selection, use the baseline. Turning a temporary preference into a lasting one is a separate explicit action.\n\nDependencies, derived values and caches cannot preserve an expired temporary state. Disclosure validity includes the next relevant time boundary; a bodyless conditional response cannot renew it. Permanent history, deletion and a recipient's previously received copy are separate lifecycle questions.\n\n## A18.3 Contribution and reciprocal portability\n\nA contribution grant is bounded permission to submit proposals, not to read or overwrite the record. V1 HTTPS push has a strict event schema, authenticated source identity, stream namespace, idempotent event IDs, finite limits, correction/withdrawal rules and replay tombstones. A14 defines the full contract. No continuous subscription survives revocation.\n\nDistinguish user-supplied preferences, activity, observations and inference. Review does not automatically create a declaration: the person confirms the exact statement, while provenance and protected evidence remain intact. A contributor cannot alter an independent declaration or learn who later reads its contribution.\n\nA person can share reviewed preferences, raw history or both. Preferences do not automatically expose history. Derivations require permission for every actual input field and level; a separately confirmed declaration may be shared independently.\n\nPortability requires bidirectional transfer for the categories claimed, preservation of meaning and temporal/provenance data, validation, unsupported-data reporting and tests. Exports do not transfer executable tokens, grants or private keys. Provider migration requires fresh provider/audience-valid consent. The old contributor does not learn the destination by default.\n\n## A18.4 Capability claims and acceptance\n\nA17 defines provider Core/Write/Portable/Delegated separately from recipient Read/Contribute/Reciprocal. Discovery identifies role, version, exact categories, directions, evidence and limitations. V1 assurance is self-declared; there is no issued certification or badge. No export means no full portability claim.\n\nChecks: CONSENT-01, ADS-01/02, TEMP-01/02/03, CONTRIB-01/02/03, PORT-01 and CLAIM-01 in the [conformance manifest](conformance/profiles.json). SCOPE-10 and structural/pure policy tests execute now; service authorisation, temporal selection, cryptography, transactions and integrations remain implementation gates.\n",
    "19-change-process.md": "# Versioning and changes\n\nThe current document version is `0.2-draft`; the proposed wire version is `1.0`. Document versions identify editions of the specification. Wire versions identify the protocol used by compatible implementations.\n\n## Draft status\n\nThe draft is open to review and interoperability testing. Published requirements and implementation status are separate: the [implementation and conformance status](conformance/README.md) records which contracts have executable checks and which service capabilities remain in development.\n\n## Reviewing changes\n\nChanges are reviewed with their effects on privacy, consent, security and compatibility. A protocol change includes the corresponding normative text, schemas, examples and conformance requirements. Implementations follow the requirements for the version they claim.\n\nNew vocabulary keys need a complete value definition, supported disclosure levels, rendering rules, sensitivity review, examples and conformance coverage. Keys remain unavailable until their vocabulary version is supported and negotiated.\n\n## Compatibility\n\nAfter the wire protocol is released, breaking changes require a new wire version and URL prefix, an approved architecture decision record and migration guidance. Additive changes retain existing consent and disclosure limits. Reserved extensions need their own complete contracts and evidence before implementations can claim support.\n\n## Published editions\n\nEach edition includes the specification text, machine-readable contracts, examples and conformance requirements. Downloadable bundles include a source revision and checksums so implementations can identify the exact edition they use.\n\nSee [conformance requirements](17-conformance.md) for capability claims and evidence.\n",
    "LICENSE": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n",
    "appendix-a-vocabulary.md": "## Appendix A. Core vocabulary\n\nThe normative [core vocabulary](vocab/core.json) contains 27 keys across 17 domains. Each key has a closed value schema, semantic kind, cardinality, supported levels, closed L0 category, safety/sensitivity/inference flags, advertising eligibility, label, explanation and example renderer output at every supported level.\n\n| Domain        | V1 keys                                                              |\n| ------------- | -------------------------------------------------------------------- |\n| identity      | `display_name`, `age_band`, `pronouns`                               |\n| contact       | `email`                                                              |\n| household     | `pets`                                                               |\n| dining        | `diet`, `allergy`, `drink_preference`, `fasting`, `cuisine_affinity` |\n| health        | `medical_alert`                                                      |\n| accessibility | `mobility_need`                                                      |\n| travel        | `seat_preference`, `trip_context`                                    |\n| viewing       | `genre_affinity`, `watched_history`                                  |\n| reading       | `genres`                                                             |\n| music         | `genres`                                                             |\n| shopping      | `delivery_preference`                                                |\n| home          | `temperature_preference`                                             |\n| work          | `communication_style`                                                |\n| finance       | `currency`                                                           |\n| education     | `learning_style`                                                     |\n| communication | `tone`, `preferred_language`                                         |\n| agent         | `verbosity`, `never_do`                                              |\n\nRenderer operations are closed: `category` emits only the L0 code; `identity` emits the already-validated value; `pick_first` emits only `first`; `approved_override_or_omit` emits the person's approved identifier-safe L1 rendering or omits the entry. L2 free text uses the same safe rendering. No generic redactor or language model supplies a substitute. Stored type describes the source; a rendered entry's type describes the actual rendering (for example `text` for L0 or an approved override).\n\nSafety and special-category values cannot be inferred. Advertising is limited to person-confirmed `viewing.genre_affinity`, `reading.genres` and `music.genres`, with the additional A18 controls. The vocabulary's closed lists deliberately exclude broad free text from that lane.\n\nAll other keys from earlier proposals, including clinical coding, account/loyalty details and arbitrary extensions, remain candidates outside this release. Import must report unsupported values before committing. This is an explicit first-release boundary, not a permissive catch-all schema. No semantic compatibility with IPS, SNOMED, ISO 24751 or other domain standards is claimed without a separately reviewed mapping.\n\nChecks: DISC-01, ADS-01, CONTRIB-01, PORT-01.\n",
    "appendix-b-resolved-questions.md": "## Appendix B. Design principles\n\n- Every disclosure level needs a grant, including L0. There is no ambient read or default permission.\n- L1 may contain safe structure, roles and age bands. Identifiers still require their permitted higher level.\n- The stored grant wins over token scope and request filters. A request can only narrow it.\n- Read and contribution authority are separate, independently approved and revoked.\n- Temporary context is a bounded overlay or additive state; expiry restores the baseline without a destructive edit.\n- Advertising is optional, off by default, one read within 24 hours, limited to three confirmed entertainment-preference keys, with no retention, delegation or onward right.\n- Each recipient gets its own handle and entry references. Canonical IDs and raw derivation evidence remain private.\n- Portability transfers data and history, not executable credentials or consent authority.\n- Provider and recipient claims are distinct. No implementation or certification follows from publishing a schema.\n- The 27-key first vocabulary is closed. Broader candidates, credential presentations, emergency cards, registries and guardian/duress operation require later specifications.\n\nThe [interpretation notes](source-ambiguities.md) link these principles to their requirements. See [versioning and changes](19-change-process.md) for the review and compatibility process.\n",
    "conformance/README.md": "# Implementation and conformance status\n\nDocument 0.2-draft publishes complete contracts for its declared v1 scope. No recipient service or conformance certification is claimed.\n\n| Layer                                                                                                                             | Status                                                                       |\n| --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |\n| Operational health/readiness, scope parsing, prefixed IDs and app shell                                                           | Implemented and tested in the reference repository                           |\n| Entry/grant/disclosure/contribution/receipt/purge/export/discovery schemas                                                        | Specified, generated and structurally tested                                 |\n| 27-key vocabulary and closed rendering definitions                                                                                | Specified and generated; examples and selected pure policy checks tested     |\n| Temporal interval helper, supported-level selection and advertising grant structure                                               | Executable pure checks; not an authorised runtime compiler                   |\n| Full stored-grant authorisation and OAuth/DPoP server                                                                             | Pending implementation and runtime evidence                                  |\n| Transactional compiler, overlay selection, signed receipts and concurrency                                                        | Pending implementation and runtime evidence                                  |\n| Public REST/MCP, contribution/replay processing and purge outbox                                                                  | Pending implementation and runtime evidence                                  |\n| Cryptographic signing/verifying, encrypted export/import and delegation                                                           | Contract specified; cryptographic/interoperability tests and runtime pending |\n| Role-specific conformance runner and certification                                                                                | Requirements published; no running endpoint suite or certificates            |\n| Jurisdiction assessment, rights/retention operations, transfer safeguards, opt-out and governance checks PRIVACY-01 to PRIVACY-06 | Requirements specified; deployment evidence and runtime enforcement pending  |\n| Registry, credentials, emergency cards, guardian/duress                                                                           | Reserved outside v1 conformance                                              |\n\nThe [conformance manifest](profiles.json) has stable IDs, expected behaviours, capability dependencies and explicit pending runtime evidence. Current schema tests carry a `-SCHEMA` suffix where they cover only part of a stateful requirement. SCOPE-01 to SCOPE-10 and ID-01 to ID-05 remain syntax/identifier checks, not grant or recipient certification.\n\nAll normative MUST/SHOULD statements map to their section's check IDs. Runtime checks are pending because no recipient endpoint exists; this is not an exception permitting weaker behaviour. A release must supply real authentication, storage, concurrency, cryptographic and cross-surface evidence, with failures reported as expected versus observed. No logo or badge substitutes for that evidence.\n",
    "conformance/profiles.json": "{\n  \"document_version\": \"0.2-draft\",\n  \"wire_version\": \"1.0\",\n  \"certified_profiles\": [],\n  \"profiles\": [\n    {\n      \"role\": \"provider\",\n      \"name\": \"Core\",\n      \"checks\": [\n        \"CORE-01\",\n        \"PAIR-01\",\n        \"DISC-01\",\n        \"TEMP-01\",\n        \"TEMP-02\",\n        \"TEMP-03\",\n        \"SIGN-01\",\n        \"CONSENT-01\",\n        \"LOG-01\",\n        \"PURGE-01\",\n        \"CLAIM-01\",\n        \"TRANSPORT-01\",\n        \"PRIVACY-01\",\n        \"PRIVACY-02\",\n        \"PRIVACY-03\",\n        \"PRIVACY-04\",\n        \"PRIVACY-05\",\n        \"PRIVACY-06\"\n      ]\n    },\n    {\n      \"role\": \"provider\",\n      \"name\": \"Write\",\n      \"requires\": [\n        \"Core\"\n      ],\n      \"checks\": [\n        \"CONTRIB-01\",\n        \"CONTRIB-02\",\n        \"CONTRIB-03\"\n      ]\n    },\n    {\n      \"role\": \"provider\",\n      \"name\": \"Portable\",\n      \"requires\": [\n        \"Core\"\n      ],\n      \"checks\": [\n        \"PORT-01\"\n      ]\n    },\n    {\n      \"role\": \"provider\",\n      \"name\": \"Delegated\",\n      \"requires\": [\n        \"Core\"\n      ],\n      \"checks\": [\n        \"DELEGATE-01\"\n      ]\n    },\n    {\n      \"role\": \"recipient\",\n      \"name\": \"Read\",\n      \"checks\": [\n        \"CORE-01\",\n        \"DISC-01\",\n        \"TEMP-03\",\n        \"SIGN-01\",\n        \"PURGE-01\",\n        \"CLAIM-01\",\n        \"TRANSPORT-01\",\n        \"PRIVACY-01\",\n        \"PRIVACY-02\",\n        \"PRIVACY-03\",\n        \"PRIVACY-04\",\n        \"PRIVACY-05\",\n        \"PRIVACY-06\"\n      ]\n    },\n    {\n      \"role\": \"recipient\",\n      \"name\": \"Contribute\",\n      \"checks\": [\n        \"CONSENT-01\",\n        \"CONTRIB-01\",\n        \"CONTRIB-02\",\n        \"CLAIM-01\",\n        \"PRIVACY-01\",\n        \"PRIVACY-02\",\n        \"PRIVACY-03\",\n        \"PRIVACY-04\",\n        \"PRIVACY-05\",\n        \"PRIVACY-06\"\n      ]\n    },\n    {\n      \"role\": \"recipient\",\n      \"name\": \"Reciprocal\",\n      \"requires\": [\n        \"Read\",\n        \"Contribute\"\n      ],\n      \"checks\": [\n        \"PORT-01\",\n        \"CLAIM-01\"\n      ]\n    }\n  ],\n  \"optional_features\": [\n    {\n      \"name\": \"advertising\",\n      \"checks\": [\n        \"ADS-01\",\n        \"ADS-02\"\n      ]\n    }\n  ],\n  \"checks\": [\n    {\n      \"id\": \"PRIVACY-01\",\n      \"section\": \"A16.2/A16.8\",\n      \"requirement\": \"Deployment-specific applicability, actual roles, lawful conditions, notices and consent evidence before processing; unresolved uses disabled.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PRIVACY-02\",\n      \"section\": \"A16.3/A16.8\",\n      \"requirement\": \"Local sensitivity, inference and necessity assessment; prohibited categories and further uses stay disabled despite grant consent.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PRIVACY-03\",\n      \"section\": \"A16.4/A16.8\",\n      \"requirement\": \"Document every international flow and its required safeguards before enabling it; reassess changed destinations and suspend unsupported flows.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PRIVACY-04\",\n      \"section\": \"A16.5/A16.8\",\n      \"requirement\": \"Exercise rights, local deadlines, correction, bounded retention, backup restoration, legal holds and recipient deletion follow-up.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PRIVACY-05\",\n      \"section\": \"A16.6/A16.8\",\n      \"requirement\": \"Enforce applicable opt-outs and preference signals after grant issue; advertising and child processing disabled without required safeguards.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PRIVACY-06\",\n      \"section\": \"A16.7/A16.8\",\n      \"requirement\": \"Evidence required governance and granted, in-scope regulatory permissions with expiry/renewal controls; incident exercises, local deadlines, decision rights and regulatory status.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"CORE-01\",\n      \"section\": \"A3/A6\",\n      \"requirement\": \"No read without a currently active, audience-bound grant; test revocation and exhausted counters under concurrency.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PAIR-01\",\n      \"section\": \"A3\",\n      \"requirement\": \"Different clients receive different handles and entry aliases; rotation changes both; no canonical identifiers escape.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"DISC-01\",\n      \"section\": \"A5\",\n      \"requirement\": \"Intersect restrictions, sparse levels, approved text, no omission counters, no identifiers below their allowed level.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"TEMP-01\",\n      \"section\": \"A4/A18\",\n      \"requirement\": \"Before/start/end/after, null bounds, invalid intervals and independent grant expiry using one Clock instant.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"TEMP-02\",\n      \"section\": \"A4/A18\",\n      \"requirement\": \"Explicit activation and conflict selection; baseline restores; standing safety facts survive.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"TEMP-03\",\n      \"section\": \"A5/A8\",\n      \"requirement\": \"Dependencies, cached and conditional responses cannot outlive source or grant rights.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"SIGN-01\",\n      \"section\": \"A5/A15\",\n      \"requirement\": \"Tampering, duplicate members, untrusted keys, algorithms and expired signed objects are rejected.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"CONSENT-01\",\n      \"section\": \"A6/A18\",\n      \"requirement\": \"Separate read/contribute grants, purpose changes need approval, recipient flags cannot authorise.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"ADS-01\",\n      \"section\": \"A18\",\n      \"requirement\": \"Default off; eligible adult-owned confirmed enum keys only; max L1, one read, 24 hours, no retention or delegation.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"ADS-02\",\n      \"section\": \"A9/A18\",\n      \"requirement\": \"Receipts and withdrawal evidence; no implied onward right or linkage to other recipients.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"CONTRIB-01\",\n      \"section\": \"A14/A18\",\n      \"requirement\": \"Write-only cannot read; read-only cannot write; declarations require exact confirmation.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"CONTRIB-02\",\n      \"section\": \"A14\",\n      \"requirement\": \"Origin, retry, collision, correction/withdrawal, tombstones, revoked retries and atomic acknowledgements.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"CONTRIB-03\",\n      \"section\": \"A4/A18\",\n      \"requirement\": \"Raw history and preferences separately selected; recursively enforce actual dependency field rights.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"LOG-01\",\n      \"section\": \"A9\",\n      \"requirement\": \"Counter, receipt and disclosure commit atomically; verify chain; operational logs contain no entry values.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PURGE-01\",\n      \"section\": \"A10\",\n      \"requirement\": \"Grant ending stops reads, signed notices retry/poll, acks and missing deadlines visible; no why leakage.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"PORT-01\",\n      \"section\": \"A11\",\n      \"requirement\": \"Two-way round trip, temporal/provenance preservation, unsupported report, no executable imported authority.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"CLAIM-01\",\n      \"section\": \"A17\",\n      \"requirement\": \"Role/version/category/evidence bound claims; no certification or full portability from schema checks alone.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"DELEGATE-01\",\n      \"section\": \"A6\",\n      \"requirement\": \"Target-bound, one-use five-minute offers; parent/child restrictions and revocation checked atomically.\",\n      \"runtime_evidence\": \"pending\"\n    },\n    {\n      \"id\": \"TRANSPORT-01\",\n      \"section\": \"A7/A8\",\n      \"requirement\": \"REST/MCP return the same signed object; headers, DPoP, audience, limits and errors match contracts.\",\n      \"runtime_evidence\": \"pending\"\n    }\n  ]\n}\n",
    "errors.json": "{\n  \"scope\": \"operations-and-draft-recipient-protocol\",\n  \"errors\": {\n    \"invalid_scope\": {\n      \"status\": 400,\n      \"title\": \"Invalid scope\"\n    },\n    \"purpose_missing\": {\n      \"status\": 400,\n      \"title\": \"Purpose is required\"\n    },\n    \"invalid_request\": {\n      \"status\": 400,\n      \"title\": \"Invalid request\"\n    },\n    \"not_found\": {\n      \"status\": 404,\n      \"title\": \"Not found\"\n    },\n    \"idempotency_conflict\": {\n      \"status\": 409,\n      \"title\": \"Idempotency key already used\"\n    },\n    \"payload_too_large\": {\n      \"status\": 413,\n      \"title\": \"Request too large\"\n    },\n    \"rate_limited\": {\n      \"status\": 429,\n      \"title\": \"Try again later\"\n    },\n    \"internal_error\": {\n      \"status\": 500,\n      \"title\": \"Request could not be completed\"\n    },\n    \"not_ready\": {\n      \"status\": 503,\n      \"title\": \"Service is not ready\"\n    },\n    \"domain_not_granted\": {\n      \"status\": 403,\n      \"title\": \"Domain is not granted\"\n    },\n    \"level_exceeded\": {\n      \"status\": 403,\n      \"title\": \"Disclosure level is not granted\"\n    },\n    \"grant_revoked\": {\n      \"status\": 403,\n      \"title\": \"Grant is no longer active\"\n    },\n    \"grant_expired\": {\n      \"status\": 403,\n      \"title\": \"Grant has expired\"\n    },\n    \"grant_exhausted\": {\n      \"status\": 403,\n      \"title\": \"Grant limit reached\"\n    },\n    \"dpop_required\": {\n      \"status\": 401,\n      \"title\": \"Sender proof is required\"\n    },\n    \"dpop_invalid\": {\n      \"status\": 401,\n      \"title\": \"Sender proof is invalid\"\n    },\n    \"safety_write_forbidden\": {\n      \"status\": 403,\n      \"title\": \"First-party confirmation is required\"\n    },\n    \"inference_forbidden\": {\n      \"status\": 403,\n      \"title\": \"Inference is not permitted\"\n    },\n    \"proposal_not_found\": {\n      \"status\": 404,\n      \"title\": \"Proposal was not found\"\n    },\n    \"proposal_decided\": {\n      \"status\": 409,\n      \"title\": \"Proposal has already been decided\"\n    },\n    \"value_rejected\": {\n      \"status\": 422,\n      \"title\": \"Value does not match the vocabulary\"\n    },\n    \"capability_not_granted\": {\n      \"status\": 403,\n      \"title\": \"Capability is not granted\"\n    },\n    \"advertising_ineligible\": {\n      \"status\": 403,\n      \"title\": \"Advertising permission is unavailable\"\n    }\n  }\n}\n",
    "examples/identifiers.json": "[\n  {\n    \"prefix\": \"acc_\",\n    \"id\": \"acc_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"rec_\",\n    \"id\": \"rec_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"prf_\",\n    \"id\": \"prf_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"ent_\",\n    \"id\": \"ent_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"gr_\",\n    \"id\": \"gr_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"rd_\",\n    \"id\": \"rd_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"prp_\",\n    \"id\": \"prp_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"cl_\",\n    \"id\": \"cl_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"evt_\",\n    \"id\": \"evt_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"pi_\",\n    \"id\": \"pi_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"rule_\",\n    \"id\": \"rule_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"dp_\",\n    \"id\": \"dp_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"imp_\",\n    \"id\": \"imp_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  },\n  {\n    \"prefix\": \"exp_\",\n    \"id\": \"exp_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n  }\n]\n",
    "examples/identity-framing.json": "[\n  {\n    \"key_hex\": \"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\",\n    \"input\": {\n      \"purpose\": \"autonym.handle.v1\",\n      \"client_id\": \"https://recipient.example/client\",\n      \"rotation\": \"00000000-0000-4000-8000-000000000001\"\n    },\n    \"canonical_utf8\": \"{\\\"client_id\\\":\\\"https://recipient.example/client\\\",\\\"purpose\\\":\\\"autonym.handle.v1\\\",\\\"rotation\\\":\\\"00000000-0000-4000-8000-000000000001\\\"}\",\n    \"hmac_sha256_hex\": \"bfb0de298b0bc4e0876aa25fabfad963a620e0a744e839608bbb6ff59cce5b49\",\n    \"base32\": \"x6yn4kmlbpcobb3kujp2x6wzmotcbyfhitudsyelxnx7lhgolneq\",\n    \"result\": \"autonym:x6yn4kmlbpcobb3kujp2x6wzmotcbyfh@autonym.example\"\n  },\n  {\n    \"key_hex\": \"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\",\n    \"input\": {\n      \"purpose\": \"autonym.entry.v1\",\n      \"client_id\": \"https://recipient.example/client\",\n      \"rotation\": \"00000000-0000-4000-8000-000000000001\",\n      \"entry_id\": \"ent_01JAB3K9Q7X2M5N8P0R1S4T6V7\"\n    },\n    \"canonical_utf8\": \"{\\\"client_id\\\":\\\"https://recipient.example/client\\\",\\\"entry_id\\\":\\\"ent_01JAB3K9Q7X2M5N8P0R1S4T6V7\\\",\\\"purpose\\\":\\\"autonym.entry.v1\\\",\\\"rotation\\\":\\\"00000000-0000-4000-8000-000000000001\\\"}\",\n    \"hmac_sha256_hex\": \"6b785b5a3109d624a3dee0ad96248c5e8368f3fc0fb54628466a01daadcd966f\",\n    \"base32\": \"nn4fwwrrbhlcji664cwzmjeml2bwr474b62umkcgnia5vlonszxq\",\n    \"result\": \"rent_nn4fwwrrbhlcji664cwzmjeml2bwr474b62umkcgnia5vlonszxq\"\n  }\n]\n",
    "examples/operational-errors.json": "[\n  {\n    \"type\": \"urn:autonym:error:invalid_scope\",\n    \"status\": 400,\n    \"title\": \"Invalid scope\",\n    \"code\": \"invalid_scope\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:purpose_missing\",\n    \"status\": 400,\n    \"title\": \"Purpose is required\",\n    \"code\": \"purpose_missing\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:invalid_request\",\n    \"status\": 400,\n    \"title\": \"Invalid request\",\n    \"code\": \"invalid_request\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:not_found\",\n    \"status\": 404,\n    \"title\": \"Not found\",\n    \"code\": \"not_found\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:idempotency_conflict\",\n    \"status\": 409,\n    \"title\": \"Idempotency key already used\",\n    \"code\": \"idempotency_conflict\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:payload_too_large\",\n    \"status\": 413,\n    \"title\": \"Request too large\",\n    \"code\": \"payload_too_large\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:rate_limited\",\n    \"status\": 429,\n    \"title\": \"Try again later\",\n    \"code\": \"rate_limited\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:internal_error\",\n    \"status\": 500,\n    \"title\": \"Request could not be completed\",\n    \"code\": \"internal_error\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:not_ready\",\n    \"status\": 503,\n    \"title\": \"Service is not ready\",\n    \"code\": \"not_ready\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:domain_not_granted\",\n    \"status\": 403,\n    \"title\": \"Domain is not granted\",\n    \"code\": \"domain_not_granted\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:level_exceeded\",\n    \"status\": 403,\n    \"title\": \"Disclosure level is not granted\",\n    \"code\": \"level_exceeded\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:grant_revoked\",\n    \"status\": 403,\n    \"title\": \"Grant is no longer active\",\n    \"code\": \"grant_revoked\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:grant_expired\",\n    \"status\": 403,\n    \"title\": \"Grant has expired\",\n    \"code\": \"grant_expired\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:grant_exhausted\",\n    \"status\": 403,\n    \"title\": \"Grant limit reached\",\n    \"code\": \"grant_exhausted\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:dpop_required\",\n    \"status\": 401,\n    \"title\": \"Sender proof is required\",\n    \"code\": \"dpop_required\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:dpop_invalid\",\n    \"status\": 401,\n    \"title\": \"Sender proof is invalid\",\n    \"code\": \"dpop_invalid\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:safety_write_forbidden\",\n    \"status\": 403,\n    \"title\": \"First-party confirmation is required\",\n    \"code\": \"safety_write_forbidden\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:inference_forbidden\",\n    \"status\": 403,\n    \"title\": \"Inference is not permitted\",\n    \"code\": \"inference_forbidden\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:proposal_not_found\",\n    \"status\": 404,\n    \"title\": \"Proposal was not found\",\n    \"code\": \"proposal_not_found\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:proposal_decided\",\n    \"status\": 409,\n    \"title\": \"Proposal has already been decided\",\n    \"code\": \"proposal_decided\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:value_rejected\",\n    \"status\": 422,\n    \"title\": \"Value does not match the vocabulary\",\n    \"code\": \"value_rejected\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:capability_not_granted\",\n    \"status\": 403,\n    \"title\": \"Capability is not granted\",\n    \"code\": \"capability_not_granted\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  {\n    \"type\": \"urn:autonym:error:advertising_ineligible\",\n    \"status\": 403,\n    \"title\": \"Advertising permission is unavailable\",\n    \"code\": \"advertising_ineligible\",\n    \"request_id\": \"00000000-0000-4000-8000-000000000001\"\n  }\n]\n",
    "examples/protocol.json": "{\n  \"example_notice\": \"Synthetic examples. Proof bytes are placeholders, never valid signatures or evidence of implementation.\",\n  \"read_grant\": {\n    \"id\": \"gr_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n    \"revision\": 1,\n    \"handle\": \"autonym:abcdefghijklmnopqrstuvwxyz234567@autonym.example\",\n    \"client_id\": \"https://recipient.example/client\",\n    \"purpose\": {\n      \"category\": \"recommendation\",\n      \"text\": \"Choose a programme for this visit\"\n    },\n    \"issued_at\": \"2026-09-21T00:00:00Z\",\n    \"expires_at\": \"2026-09-22T00:00:00Z\",\n    \"status\": \"active\",\n    \"kind\": \"read\",\n    \"read\": [\n      {\n        \"domain\": \"viewing\",\n        \"keys\": [\n          \"genre_affinity\"\n        ],\n        \"max_level\": \"L1\"\n      }\n    ],\n    \"declared_only\": true,\n    \"min_confidence\": 1,\n    \"max_reads\": 1,\n    \"reads_used\": 0,\n    \"persist_until\": null,\n    \"allow_delegation\": false,\n    \"onward_share\": false\n  },\n  \"contribution_grant\": {\n    \"id\": \"gr_01JAB3K9Q7X2M5N8P0R1S4T6V8\",\n    \"revision\": 1,\n    \"handle\": \"autonym:abcdefghijklmnopqrstuvwxyz234567@autonym.example\",\n    \"client_id\": \"https://recipient.example/client\",\n    \"purpose\": {\n      \"category\": \"recommendation\",\n      \"text\": \"Choose a programme for this visit\"\n    },\n    \"issued_at\": \"2026-09-21T00:00:00Z\",\n    \"expires_at\": \"2026-09-22T00:00:00Z\",\n    \"status\": \"active\",\n    \"kind\": \"contribute\",\n    \"contribute\": [\n      {\n        \"domain\": \"viewing\",\n        \"keys\": [\n          \"genre_affinity\"\n        ]\n      }\n    ],\n    \"max_events\": 100,\n    \"events_used\": 0,\n    \"allow_confirmation\": false,\n    \"stream_id\": \"00000000-0000-4000-8000-000000000001\"\n  },\n  \"advertising_grant\": {\n    \"id\": \"gr_01JAB3K9Q7X2M5N8P0R1S4T6V9\",\n    \"revision\": 1,\n    \"handle\": \"autonym:abcdefghijklmnopqrstuvwxyz234567@autonym.example\",\n    \"client_id\": \"https://recipient.example/client\",\n    \"purpose\": {\n      \"category\": \"advertising\",\n      \"text\": \"Choose one advert during this visit\"\n    },\n    \"issued_at\": \"2026-09-21T00:00:00Z\",\n    \"expires_at\": \"2026-09-22T00:00:00Z\",\n    \"status\": \"active\",\n    \"kind\": \"read\",\n    \"read\": [\n      {\n        \"domain\": \"viewing\",\n        \"keys\": [\n          \"genre_affinity\"\n        ],\n        \"max_level\": \"L1\"\n      }\n    ],\n    \"declared_only\": true,\n    \"min_confidence\": 1,\n    \"max_reads\": 1,\n    \"reads_used\": 0,\n    \"persist_until\": null,\n    \"allow_delegation\": false,\n    \"onward_share\": false\n  },\n  \"entry\": {\n    \"id\": \"ent_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n    \"version\": 1,\n    \"profile_id\": \"prf_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n    \"domain\": \"dining\",\n    \"key\": \"drink_preference\",\n    \"value_type\": \"enum\",\n    \"value\": \"no_alcohol\",\n    \"context_kind\": \"preference\",\n    \"provenance\": {\n      \"kind\": \"declared\",\n      \"source_client_id\": null,\n      \"source_event_id\": null,\n      \"recorded_at\": \"2026-09-21T00:00:00Z\",\n      \"occurred_at\": null,\n      \"confidence\": null,\n      \"confirmed_at\": \"2026-09-21T00:00:00Z\",\n      \"evidence_refs\": [],\n      \"derived_from\": []\n    },\n    \"temporal\": {\n      \"valid_from\": \"2026-10-01T00:00:00Z\",\n      \"valid_until\": \"2026-11-01T00:00:00Z\"\n    },\n    \"overlay\": {\n      \"target_entry_id\": \"ent_01JAB3K9Q7X2M5N8P0R1S4T6V8\",\n      \"enabled\": true,\n      \"selected\": true\n    },\n    \"rendering_overrides\": {},\n    \"status\": \"active\",\n    \"created_at\": \"2026-09-21T00:00:00Z\",\n    \"updated_at\": \"2026-09-21T00:00:00Z\",\n    \"origin_host\": \"https://autonym.example\"\n  },\n  \"export\": {\n    \"format\": \"autonym-export/1.0\",\n    \"exported_at\": \"2026-09-21T00:00:00Z\",\n    \"origin_host\": \"https://autonym.example\",\n    \"history_mode\": \"current\",\n    \"partitions\": [\n      {\n        \"id\": \"prf_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n        \"label\": \"Personal record\"\n      }\n    ],\n    \"entries\": [\n      {\n        \"id\": \"ent_01JAB3K9Q7X2M5N8P0R1S4T6V8\",\n        \"version\": 1,\n        \"profile_id\": \"prf_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n        \"domain\": \"dining\",\n        \"key\": \"drink_preference\",\n        \"value_type\": \"enum\",\n        \"value\": \"no_preference\",\n        \"context_kind\": \"preference\",\n        \"provenance\": {\n          \"kind\": \"declared\",\n          \"source_client_id\": null,\n          \"source_event_id\": null,\n          \"recorded_at\": \"2026-09-21T00:00:00Z\",\n          \"occurred_at\": null,\n          \"confidence\": null,\n          \"confirmed_at\": \"2026-09-21T00:00:00Z\",\n          \"evidence_refs\": [],\n          \"derived_from\": []\n        },\n        \"temporal\": {\n          \"valid_from\": null,\n          \"valid_until\": null\n        },\n        \"overlay\": null,\n        \"rendering_overrides\": {},\n        \"status\": \"active\",\n        \"created_at\": \"2026-09-21T00:00:00Z\",\n        \"updated_at\": \"2026-09-21T00:00:00Z\",\n        \"origin_host\": \"https://autonym.example\"\n      },\n      {\n        \"id\": \"ent_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n        \"version\": 1,\n        \"profile_id\": \"prf_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n        \"domain\": \"dining\",\n        \"key\": \"drink_preference\",\n        \"value_type\": \"enum\",\n        \"value\": \"no_alcohol\",\n        \"context_kind\": \"preference\",\n        \"provenance\": {\n          \"kind\": \"declared\",\n          \"source_client_id\": null,\n          \"source_event_id\": null,\n          \"recorded_at\": \"2026-09-21T00:00:00Z\",\n          \"occurred_at\": null,\n          \"confidence\": null,\n          \"confirmed_at\": \"2026-09-21T00:00:00Z\",\n          \"evidence_refs\": [],\n          \"derived_from\": []\n        },\n        \"temporal\": {\n          \"valid_from\": \"2026-10-01T00:00:00Z\",\n          \"valid_until\": \"2026-11-01T00:00:00Z\"\n        },\n        \"overlay\": {\n          \"target_entry_id\": \"ent_01JAB3K9Q7X2M5N8P0R1S4T6V8\",\n          \"enabled\": true,\n          \"selected\": true\n        },\n        \"rendering_overrides\": {},\n        \"status\": \"active\",\n        \"created_at\": \"2026-09-21T00:00:00Z\",\n        \"updated_at\": \"2026-09-21T00:00:00Z\",\n        \"origin_host\": \"https://autonym.example\"\n      }\n    ],\n    \"tombstones\": [],\n    \"grants_history\": [\n      {\n        \"profile_id\": \"prf_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n        \"grant\": {\n          \"id\": \"gr_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n          \"revision\": 1,\n          \"handle\": \"autonym:abcdefghijklmnopqrstuvwxyz234567@autonym.example\",\n          \"client_id\": \"https://recipient.example/client\",\n          \"purpose\": {\n            \"category\": \"recommendation\",\n            \"text\": \"Choose a programme for this visit\"\n          },\n          \"issued_at\": \"2026-09-21T00:00:00Z\",\n          \"expires_at\": \"2026-09-22T00:00:00Z\",\n          \"status\": \"active\",\n          \"kind\": \"read\",\n          \"read\": [\n            {\n              \"domain\": \"viewing\",\n              \"keys\": [\n                \"genre_affinity\"\n              ],\n              \"max_level\": \"L1\"\n            }\n          ],\n          \"declared_only\": true,\n          \"min_confidence\": 1,\n          \"max_reads\": 1,\n          \"reads_used\": 0,\n          \"persist_until\": null,\n          \"allow_delegation\": false,\n          \"onward_share\": false\n        }\n      },\n      {\n        \"profile_id\": \"prf_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n        \"grant\": {\n          \"id\": \"gr_01JAB3K9Q7X2M5N8P0R1S4T6V8\",\n          \"revision\": 1,\n          \"handle\": \"autonym:abcdefghijklmnopqrstuvwxyz234567@autonym.example\",\n          \"client_id\": \"https://recipient.example/client\",\n          \"purpose\": {\n            \"category\": \"recommendation\",\n            \"text\": \"Choose a programme for this visit\"\n          },\n          \"issued_at\": \"2026-09-21T00:00:00Z\",\n          \"expires_at\": \"2026-09-22T00:00:00Z\",\n          \"status\": \"active\",\n          \"kind\": \"contribute\",\n          \"contribute\": [\n            {\n              \"domain\": \"viewing\",\n              \"keys\": [\n                \"genre_affinity\"\n              ]\n            }\n          ],\n          \"max_events\": 100,\n          \"events_used\": 0,\n          \"allow_confirmation\": false,\n          \"stream_id\": \"00000000-0000-4000-8000-000000000001\"\n        }\n      }\n    ],\n    \"receipts\": [],\n    \"log_events\": [],\n    \"public_keys\": [],\n    \"policy_history\": [],\n    \"proposals\": [],\n    \"unsupported\": [],\n    \"proof\": {\n      \"type\": \"jws\",\n      \"alg\": \"ES256\",\n      \"kid\": \"example-only\",\n      \"jws\": \"ZXhhbXBsZQ..bm90LWEtc2lnbmF0dXJl\"\n    }\n  },\n  \"lifecycle_request\": {\n    \"grant_type\": \"client_credentials\",\n    \"scope\": \"autonym:lifecycle:purge\",\n    \"resource\": \"https://autonym.example/v1\"\n  },\n  \"discovery\": {\n    \"autonym_version\": \"1.0\",\n    \"issuer\": \"https://autonym.example\",\n    \"authorization_server\": \"https://autonym.example\",\n    \"jwks_uri\": \"https://autonym.example/.well-known/jwks.json\",\n    \"rest_endpoint\": null,\n    \"mcp_endpoint\": null,\n    \"capabilities\": {\n      \"autonym_version\": \"1.0\",\n      \"document_version\": \"0.2-draft\",\n      \"categories\": [],\n      \"limitations\": [\n        \"Synthetic discovery example; no runtime capability is asserted\"\n      ],\n      \"assurance\": \"self-declared\",\n      \"evidence\": [],\n      \"role\": \"provider\",\n      \"capabilities\": []\n    }\n  },\n  \"contribution\": {\n    \"event_id\": \"event_001\",\n    \"occurred_at\": \"2026-09-21T00:00:00Z\",\n    \"stream_id\": \"00000000-0000-4000-8000-000000000001\",\n    \"domain\": \"viewing\",\n    \"key\": \"genre_affinity\",\n    \"value_type\": \"list\",\n    \"value\": [\n      \"comedy\"\n    ],\n    \"context_kind\": \"preference\",\n    \"temporal\": {\n      \"valid_from\": null,\n      \"valid_until\": null\n    },\n    \"category\": \"user_supplied\",\n    \"evidence_refs\": [],\n    \"operation\": \"create\"\n  },\n  \"disclosure\": {\n    \"autonym_version\": \"1.0\",\n    \"provider\": \"https://autonym.example\",\n    \"audience\": \"https://autonym.example/v1\",\n    \"client_id\": \"https://recipient.example/client\",\n    \"handle\": \"autonym:abcdefghijklmnopqrstuvwxyz234567@autonym.example\",\n    \"grant_id\": \"gr_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n    \"grant_revision\": 1,\n    \"read_id\": \"rd_01JAB3K9Q7X2M5N8P0R1S4T6V7\",\n    \"purpose\": \"recommendation\",\n    \"issued_at\": \"2026-09-21T00:00:00Z\",\n    \"valid_until\": \"2026-09-21T00:05:00Z\",\n    \"ttl_seconds\": 300,\n    \"persist_until\": null,\n    \"entries\": [\n      {\n        \"id\": \"rent_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n        \"version\": 1,\n        \"domain\": \"viewing\",\n        \"key\": \"genre_affinity\",\n        \"level\": \"L1\",\n        \"value_type\": \"list\",\n        \"value\": [\n          \"comedy\"\n        ],\n        \"context_kind\": \"preference\",\n        \"safety_critical\": false,\n        \"provenance\": {\n          \"kind\": \"declared\",\n          \"confirmed\": true\n        },\n        \"stale\": false\n      }\n    ],\n    \"proof\": {\n      \"type\": \"jws\",\n      \"alg\": \"ES256\",\n      \"kid\": \"example-only\",\n      \"jws\": \"ZXhhbXBsZQ..bm90LWEtc2lnbmF0dXJl\"\n    }\n  },\n  \"capabilities\": {\n    \"autonym_version\": \"1.0\",\n    \"document_version\": \"0.2-draft\",\n    \"categories\": [\n      {\n        \"domain\": \"viewing\",\n        \"keys\": [\n          \"genre_affinity\"\n        ],\n        \"directions\": [\n          \"read\"\n        ]\n      }\n    ],\n    \"limitations\": [\n      \"Synthetic schema example; no implementation or certification is asserted\"\n    ],\n    \"assurance\": \"self-declared\",\n    \"evidence\": [],\n    \"role\": \"recipient\",\n    \"capabilities\": [\n      \"Read\"\n    ]\n  }\n}\n",
    "examples/scopes.json": "[\n  {\n    \"scope\": \"autonym:read:dining:L1 autonym:read:accessibility:L1 autonym:purpose:booking\"\n  },\n  {\n    \"scope\": \"autonym:read:agent:L1 autonym:read:communication:L1 autonym:propose autonym:purpose:personalisation\"\n  },\n  {\n    \"scope\": \"autonym:read:*:L0:declared autonym:purpose:research\"\n  },\n  {\n    \"scope\": \"autonym:read:viewing:L1:declared autonym:purpose:advertising\"\n  }\n]\n",
    "identifiers.md": "# Typed record identifiers\n\nThis implements the prefixed ULIDs in [A4.1](04-data-model.md) and the additional entity types in the service design. It does not implement public or pairwise handles, access tokens, account recovery or any authentication mechanism. Identifiers are not secrets or proof of authority; they encode a creation timestamp.\n\nThe single source of truth is `packages/schema/src/identifiers.ts`. The [generated schema](schemas/identifier.json) accepts any supported type; callers MUST use `idSchemaFor(prefix)` at a boundary that expects one particular type. [Synthetic examples](examples/identifiers.json) are generated from the same prefix enum.\n\n| Prefix | Entity            |\n| ------ | ----------------- |\n| acc_   | Account           |\n| rec_   | Record            |\n| prf_   | Record partition  |\n| ent_   | Entry             |\n| gr_    | Grant             |\n| rd_    | Read              |\n| prp_   | Proposal          |\n| cl_    | Client            |\n| evt_   | Chain event       |\n| pi_    | Purge instruction |\n| rule_  | Standing rule     |\n| dp_    | Delegation policy |\n| imp_   | Import job        |\n| exp_   | Export job        |\n\nThe wire representation MUST use the exact lower-case prefix and underscore followed by 26 upper-case Crockford Base32 characters. The first ULID character MUST be 0-7; the remaining alphabet excludes I, L, O and U. Whitespace, abbreviated ids, alternative case, look-alike substitutions and trailing bytes are rejected rather than normalised. The canonical upper-case representation removes aliases at storage and authorisation boundaries. This is an explicit Autonym wire constraint; generic ULID tools may also accept lower-case text.\n\n`createId(prefix, timestampMilliseconds)` uses the maintained `ulid` library's default platform CSPRNG and requires an explicit integral Unix timestamp from 1 through 281474976710655 inclusive. A service supplies its Clock value; the helper MUST NOT use ambient time, Math.random or a custom PRNG. Zero is valid in the wire format, but generation deliberately rejects zero: the pinned library treats it as a request for ambient time. Invalid prefixes/timestamps or missing secure randomness fail with a fixed `IdentifierError`, containing no input or underlying library error. These are local helper failures, not new transport error codes.\n\nGeneration is random within a millisecond, not monotonic. Database uniqueness constraints and conflict handling remain required in the persistence package; sample generation is not proof that collisions are impossible. No timestamp or id is suitable as a bearer credential. Pairwise recipient identifiers remain a separate privacy contract.\n\nID-01 checks every prefix and canonical boundaries, including ULID overflow. ID-02 checks explicit time with ambient time and Math.random made unavailable. ID-03 checks invalid generation input. ID-04 checks 10,000 generated ids against the type and timestamp. ID-05 bundles the public schema package for a real Chromium browser, exercises scope parsing and generation, and proves generation fails without WebCrypto. The browser harness is built separately and is absent from the application image.\n\nThe rest of the entry model and its value shapes are still pending; adding id validation does not settle those contracts or make the service able to store records.\n",
    "mcp/tools.json": "{\n  \"autonym_version\": \"1.0\",\n  \"specification_revision\": \"2026-07-28\",\n  \"status\": \"specified-not-implemented\",\n  \"tools\": [\n    {\n      \"name\": \"get_grant\",\n      \"description\": \"Describe only the authenticated current grant.\",\n      \"inputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {},\n        \"additionalProperties\": false\n      },\n      \"outputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"revision\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"handle\": {\n                \"type\": \"string\",\n                \"maxLength\": 294,\n                \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n              },\n              \"client_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 2048\n              },\n              \"purpose\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"category\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"booking\",\n                      \"recommendation\",\n                      \"safety\",\n                      \"fulfilment\",\n                      \"personalisation\",\n                      \"research\",\n                      \"care\",\n                      \"medical\",\n                      \"employment\",\n                      \"advertising\"\n                    ]\n                  },\n                  \"text\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 4096\n                  }\n                },\n                \"required\": [\n                  \"category\",\n                  \"text\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"issued_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"expires_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"status\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"active\",\n                  \"revoked\",\n                  \"expired\"\n                ]\n              },\n              \"kind\": {\n                \"type\": \"string\",\n                \"const\": \"read\"\n              },\n              \"read\": {\n                \"minItems\": 1,\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"domain\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        {\n                          \"type\": \"string\",\n                          \"const\": \"*\"\n                        }\n                      ]\n                    },\n                    \"keys\": {\n                      \"anyOf\": [\n                        {\n                          \"minItems\": 1,\n                          \"maxItems\": 128,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                          }\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"max_level\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"L0\",\n                        \"L1\",\n                        \"L2\",\n                        \"L3\"\n                      ]\n                    }\n                  },\n                  \"required\": [\n                    \"domain\",\n                    \"keys\",\n                    \"max_level\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"declared_only\": {\n                \"type\": \"boolean\"\n              },\n              \"min_confidence\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1\n              },\n              \"max_reads\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 100000\n              },\n              \"reads_used\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"persist_until\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"allow_delegation\": {\n                \"type\": \"boolean\"\n              },\n              \"onward_share\": {\n                \"type\": \"boolean\",\n                \"const\": false\n              }\n            },\n            \"required\": [\n              \"id\",\n              \"revision\",\n              \"handle\",\n              \"client_id\",\n              \"purpose\",\n              \"issued_at\",\n              \"expires_at\",\n              \"status\",\n              \"kind\",\n              \"read\",\n              \"declared_only\",\n              \"min_confidence\",\n              \"max_reads\",\n              \"reads_used\",\n              \"persist_until\",\n              \"allow_delegation\",\n              \"onward_share\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"revision\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"handle\": {\n                \"type\": \"string\",\n                \"maxLength\": 294,\n                \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n              },\n              \"client_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 2048\n              },\n              \"purpose\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"category\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"booking\",\n                      \"recommendation\",\n                      \"safety\",\n                      \"fulfilment\",\n                      \"personalisation\",\n                      \"research\",\n                      \"care\",\n                      \"medical\",\n                      \"employment\",\n                      \"advertising\"\n                    ]\n                  },\n                  \"text\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 4096\n                  }\n                },\n                \"required\": [\n                  \"category\",\n                  \"text\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"issued_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"expires_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"status\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"active\",\n                  \"revoked\",\n                  \"expired\"\n                ]\n              },\n              \"kind\": {\n                \"type\": \"string\",\n                \"const\": \"contribute\"\n              },\n              \"contribute\": {\n                \"minItems\": 1,\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"domain\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    },\n                    \"keys\": {\n                      \"minItems\": 1,\n                      \"maxItems\": 128,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"domain\",\n                    \"keys\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"max_events\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 100000\n              },\n              \"events_used\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"allow_confirmation\": {\n                \"type\": \"boolean\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              }\n            },\n            \"required\": [\n              \"id\",\n              \"revision\",\n              \"handle\",\n              \"client_id\",\n              \"purpose\",\n              \"issued_at\",\n              \"expires_at\",\n              \"status\",\n              \"kind\",\n              \"contribute\",\n              \"max_events\",\n              \"events_used\",\n              \"allow_confirmation\",\n              \"stream_id\"\n            ],\n            \"additionalProperties\": false\n          }\n        ],\n        \"$id\": \"urn:autonym:schema:grant:1.0:0.2-draft\"\n      },\n      \"annotations\": {\n        \"readOnlyHint\": true,\n        \"destructiveHint\": false,\n        \"openWorldHint\": false\n      }\n    },\n    {\n      \"name\": \"list_domains\",\n      \"description\": \"List eligible granted domains and keys without hidden counts.\",\n      \"inputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {},\n        \"additionalProperties\": false\n      },\n      \"outputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"domains\": {\n            \"maxItems\": 32,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"domain\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"max_level\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"L0\",\n                    \"L1\",\n                    \"L2\",\n                    \"L3\"\n                  ]\n                },\n                \"keys\": {\n                  \"maxItems\": 128,\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  }\n                }\n              },\n              \"required\": [\n                \"domain\",\n                \"max_level\",\n                \"keys\"\n              ],\n              \"additionalProperties\": false\n            }\n          }\n        },\n        \"required\": [\n          \"domains\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:domain-list:1.0:0.2-draft\"\n      },\n      \"annotations\": {\n        \"readOnlyHint\": true,\n        \"destructiveHint\": false,\n        \"openWorldHint\": false\n      }\n    },\n    {\n      \"name\": \"get_context\",\n      \"description\": \"Read the permitted context in one counted transaction.\",\n      \"inputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"domains\": {\n            \"minItems\": 1,\n            \"maxItems\": 32,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n            }\n          },\n          \"max_level\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"L0\",\n              \"L1\",\n              \"L2\",\n              \"L3\"\n            ]\n          },\n          \"keys\": {\n            \"minItems\": 1,\n            \"maxItems\": 128,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n            }\n          },\n          \"declared_only\": {\n            \"type\": \"boolean\"\n          },\n          \"min_confidence\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1\n          },\n          \"since\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          }\n        },\n        \"required\": [\n          \"domains\"\n        ],\n        \"additionalProperties\": false\n      },\n      \"outputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"autonym_version\": {\n            \"type\": \"string\",\n            \"const\": \"1.0\"\n          },\n          \"provider\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"audience\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"client_id\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 2048\n          },\n          \"handle\": {\n            \"type\": \"string\",\n            \"maxLength\": 294,\n            \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n          },\n          \"grant_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"grant_revision\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"read_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"purpose\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"booking\",\n              \"recommendation\",\n              \"safety\",\n              \"fulfilment\",\n              \"personalisation\",\n              \"research\",\n              \"care\",\n              \"medical\",\n              \"employment\",\n              \"advertising\"\n            ]\n          },\n          \"issued_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"valid_until\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"ttl_seconds\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 300\n          },\n          \"persist_until\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"entries\": {\n            \"maxItems\": 1000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^rent_[a-z2-7]{52}$\"\n                },\n                \"version\": {\n                  \"type\": \"integer\",\n                  \"exclusiveMinimum\": 0,\n                  \"maximum\": 9007199254740991\n                },\n                \"domain\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"key\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"level\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"L0\",\n                    \"L1\",\n                    \"L2\",\n                    \"L3\"\n                  ]\n                },\n                \"value_type\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"text\",\n                    \"number\",\n                    \"boolean\",\n                    \"enum\",\n                    \"list\",\n                    \"coded\",\n                    \"coded_list\",\n                    \"date\",\n                    \"date_range\",\n                    \"age_band\",\n                    \"person_ref\",\n                    \"structured\",\n                    \"credential\"\n                  ]\n                },\n                \"value\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                },\n                \"context_kind\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"fact\",\n                    \"preference\",\n                    \"state\"\n                  ]\n                },\n                \"safety_critical\": {\n                  \"type\": \"boolean\"\n                },\n                \"provenance\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"kind\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"declared\",\n                        \"observed\",\n                        \"derived\",\n                        \"attested\"\n                      ]\n                    },\n                    \"confirmed\": {\n                      \"type\": \"boolean\"\n                    }\n                  },\n                  \"required\": [\n                    \"kind\",\n                    \"confirmed\"\n                  ],\n                  \"additionalProperties\": false\n                },\n                \"stale\": {\n                  \"type\": \"boolean\"\n                }\n              },\n              \"required\": [\n                \"id\",\n                \"version\",\n                \"domain\",\n                \"key\",\n                \"level\",\n                \"value_type\",\n                \"value\",\n                \"context_kind\",\n                \"safety_critical\",\n                \"provenance\",\n                \"stale\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"proof\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"jws\"\n              },\n              \"alg\": {\n                \"type\": \"string\",\n                \"const\": \"ES256\"\n              },\n              \"kid\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 256\n              },\n              \"jws\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"alg\",\n              \"kid\",\n              \"jws\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"autonym_version\",\n          \"provider\",\n          \"audience\",\n          \"client_id\",\n          \"handle\",\n          \"grant_id\",\n          \"grant_revision\",\n          \"read_id\",\n          \"purpose\",\n          \"issued_at\",\n          \"valid_until\",\n          \"ttl_seconds\",\n          \"persist_until\",\n          \"entries\",\n          \"proof\"\n        ],\n        \"additionalProperties\": false,\n        \"$defs\": {\n          \"__schema0\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\"\n              },\n              {\n                \"type\": \"number\"\n              },\n              {\n                \"type\": \"boolean\"\n              },\n              {\n                \"type\": \"null\"\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"propertyNames\": {\n                  \"type\": \"string\"\n                },\n                \"additionalProperties\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              }\n            ]\n          }\n        },\n        \"$id\": \"urn:autonym:schema:disclosure:1.0:0.2-draft\"\n      },\n      \"annotations\": {\n        \"readOnlyHint\": true,\n        \"destructiveHint\": false,\n        \"openWorldHint\": false\n      }\n    },\n    {\n      \"name\": \"propose_entry\",\n      \"description\": \"Submit one idempotent event under a separate contribution grant.\",\n      \"inputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              },\n              \"occurred_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              },\n              \"domain\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"key\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"value_type\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"text\",\n                  \"number\",\n                  \"boolean\",\n                  \"enum\",\n                  \"list\",\n                  \"coded\",\n                  \"coded_list\",\n                  \"date\",\n                  \"date_range\",\n                  \"age_band\",\n                  \"person_ref\",\n                  \"structured\",\n                  \"credential\"\n                ]\n              },\n              \"value\": {\n                \"$ref\": \"#/$defs/__schema0\"\n              },\n              \"context_kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"fact\",\n                  \"preference\",\n                  \"state\"\n                ]\n              },\n              \"temporal\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"valid_from\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"valid_until\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\n                  \"valid_from\",\n                  \"valid_until\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"category\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"user_supplied\",\n                  \"activity\",\n                  \"observation\",\n                  \"inference\"\n                ]\n              },\n              \"evidence_refs\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                }\n              },\n              \"operation\": {\n                \"type\": \"string\",\n                \"const\": \"create\"\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"occurred_at\",\n              \"stream_id\",\n              \"domain\",\n              \"key\",\n              \"value_type\",\n              \"value\",\n              \"context_kind\",\n              \"temporal\",\n              \"category\",\n              \"evidence_refs\",\n              \"operation\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              },\n              \"occurred_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              },\n              \"domain\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"key\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"value_type\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"text\",\n                  \"number\",\n                  \"boolean\",\n                  \"enum\",\n                  \"list\",\n                  \"coded\",\n                  \"coded_list\",\n                  \"date\",\n                  \"date_range\",\n                  \"age_band\",\n                  \"person_ref\",\n                  \"structured\",\n                  \"credential\"\n                ]\n              },\n              \"value\": {\n                \"$ref\": \"#/$defs/__schema0\"\n              },\n              \"context_kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"fact\",\n                  \"preference\",\n                  \"state\"\n                ]\n              },\n              \"temporal\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"valid_from\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"valid_until\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\n                  \"valid_from\",\n                  \"valid_until\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"category\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"user_supplied\",\n                  \"activity\",\n                  \"observation\",\n                  \"inference\"\n                ]\n              },\n              \"evidence_refs\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                }\n              },\n              \"operation\": {\n                \"type\": \"string\",\n                \"const\": \"correct\"\n              },\n              \"predecessor_event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"occurred_at\",\n              \"stream_id\",\n              \"domain\",\n              \"key\",\n              \"value_type\",\n              \"value\",\n              \"context_kind\",\n              \"temporal\",\n              \"category\",\n              \"evidence_refs\",\n              \"operation\",\n              \"predecessor_event_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              },\n              \"occurred_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              },\n              \"operation\": {\n                \"type\": \"string\",\n                \"const\": \"withdraw\"\n              },\n              \"predecessor_event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"occurred_at\",\n              \"stream_id\",\n              \"operation\",\n              \"predecessor_event_id\"\n            ],\n            \"additionalProperties\": false\n          }\n        ],\n        \"$defs\": {\n          \"__schema0\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\"\n              },\n              {\n                \"type\": \"number\"\n              },\n              {\n                \"type\": \"boolean\"\n              },\n              {\n                \"type\": \"null\"\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"propertyNames\": {\n                  \"type\": \"string\"\n                },\n                \"additionalProperties\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              }\n            ]\n          }\n        }\n      },\n      \"outputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"proposal_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"event_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n          },\n          \"ingested_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"pending\",\n              \"accepted\",\n              \"rejected\",\n              \"withdrawn\"\n            ]\n          }\n        },\n        \"required\": [\n          \"proposal_id\",\n          \"event_id\",\n          \"ingested_at\",\n          \"status\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:proposal-status:1.0:0.2-draft\"\n      },\n      \"annotations\": {\n        \"readOnlyHint\": false,\n        \"destructiveHint\": true,\n        \"openWorldHint\": false\n      }\n    },\n    {\n      \"name\": \"confirm_entry\",\n      \"description\": \"Request exact-statement confirmation or first-party app review.\",\n      \"inputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"proposal_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          }\n        },\n        \"required\": [\n          \"proposal_id\"\n        ],\n        \"additionalProperties\": false\n      },\n      \"outputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"const\": \"review_required\"\n          },\n          \"review_url\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        },\n        \"required\": [\n          \"status\",\n          \"review_url\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:confirmation-result:1.0:0.2-draft\"\n      },\n      \"annotations\": {\n        \"readOnlyHint\": false,\n        \"destructiveHint\": true,\n        \"openWorldHint\": false\n      }\n    },\n    {\n      \"name\": \"withdraw_proposal\",\n      \"description\": \"Withdraw only the authenticated contributor’s own proposal.\",\n      \"inputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"proposal_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          }\n        },\n        \"required\": [\n          \"proposal_id\"\n        ],\n        \"additionalProperties\": false\n      },\n      \"outputSchema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"proposal_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"event_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n          },\n          \"ingested_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"pending\",\n              \"accepted\",\n              \"rejected\",\n              \"withdrawn\"\n            ]\n          }\n        },\n        \"required\": [\n          \"proposal_id\",\n          \"event_id\",\n          \"ingested_at\",\n          \"status\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:proposal-status:1.0:0.2-draft\"\n      },\n      \"annotations\": {\n        \"readOnlyHint\": false,\n        \"destructiveHint\": true,\n        \"openWorldHint\": false\n      }\n    }\n  ]\n}\n",
    "openapi/autonym-v1.yaml": "{\n  \"openapi\": \"3.1.0\",\n  \"info\": {\n    \"title\": \"Autonym recipient API\",\n    \"version\": \"0.2-draft\",\n    \"description\": \"Draft wire version 1.0. No recipient runtime is claimed. DPoP is required except for explicitly eligible unbound assistant grants (A6).\"\n  },\n  \"servers\": [\n    {\n      \"url\": \"https://autonym.example\"\n    }\n  ],\n  \"x-implementation-status\": \"not-implemented\",\n  \"paths\": {\n    \"/.well-known/autonym\": {\n      \"get\": {\n        \"operationId\": \"discover\",\n        \"security\": [],\n        \"parameters\": [],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/discovery\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/grant\": {\n      \"get\": {\n        \"operationId\": \"getGrant\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/grant\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/domains\": {\n      \"get\": {\n        \"operationId\": \"listDomains\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/domain-list\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/context\": {\n      \"get\": {\n        \"operationId\": \"getContext\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"domains\",\n            \"in\": \"query\",\n            \"required\": true,\n            \"style\": \"form\",\n            \"explode\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"minItems\": 1,\n              \"maxItems\": 32,\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              }\n            }\n          },\n          {\n            \"name\": \"max_level\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"string\",\n              \"enum\": [\n                \"L0\",\n                \"L1\",\n                \"L2\",\n                \"L3\"\n              ]\n            }\n          },\n          {\n            \"name\": \"keys\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"style\": \"form\",\n            \"explode\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"minItems\": 1,\n              \"maxItems\": 128,\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              }\n            }\n          },\n          {\n            \"name\": \"declared_only\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"boolean\"\n            }\n          },\n          {\n            \"name\": \"min_confidence\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"number\",\n              \"minimum\": 0,\n              \"maximum\": 1\n            }\n          },\n          {\n            \"name\": \"since\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"string\",\n              \"format\": \"date-time\",\n              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/disclosure\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/context/{domain}\": {\n      \"get\": {\n        \"operationId\": \"getDomainContext\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"domain\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          },\n          {\n            \"name\": \"max_level\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"string\",\n              \"enum\": [\n                \"L0\",\n                \"L1\",\n                \"L2\",\n                \"L3\"\n              ]\n            }\n          },\n          {\n            \"name\": \"keys\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"style\": \"form\",\n            \"explode\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"minItems\": 1,\n              \"maxItems\": 128,\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              }\n            }\n          },\n          {\n            \"name\": \"declared_only\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"boolean\"\n            }\n          },\n          {\n            \"name\": \"min_confidence\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"number\",\n              \"minimum\": 0,\n              \"maximum\": 1\n            }\n          },\n          {\n            \"name\": \"since\",\n            \"in\": \"query\",\n            \"required\": false,\n            \"schema\": {\n              \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n              \"type\": \"string\",\n              \"format\": \"date-time\",\n              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n            }\n          },\n          {\n            \"name\": \"If-None-Match\",\n            \"in\": \"header\",\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/disclosure\"\n                }\n              }\n            }\n          },\n          \"304\": {\n            \"description\": \"Authorised, still-valid previous envelope; logged but not a new read.\"\n          },\n          \"default\": {\n            \"description\": \"Error\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/proposals\": {\n      \"post\": {\n        \"operationId\": \"proposeEntry\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/contribution-event\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/proposal-status\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/proposals/{id}\": {\n      \"get\": {\n        \"operationId\": \"getProposal\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/proposal-status\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"operationId\": \"withdrawProposal\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/proposal-status\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/proposals/{id}/confirm\": {\n      \"post\": {\n        \"operationId\": \"confirmEntry\",\n        \"security\": [\n          {\n            \"OAuth\": [],\n            \"DPoP\": []\n          },\n          {\n            \"EligibleAssistantBearer\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"id\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/confirmation\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/confirmation-result\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/purge-instructions\": {\n      \"get\": {\n        \"operationId\": \"listPurgeInstructions\",\n        \"security\": [\n          {\n            \"LifecycleOAuth\": [\n              \"autonym:lifecycle:purge\"\n            ],\n            \"DPoP\": []\n          }\n        ],\n        \"parameters\": [],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"instructions\": {\n                      \"maxItems\": 100,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"pattern\": \"^[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+$\"\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"instructions\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    },\n    \"/v1/purge-instructions/{jti}/ack\": {\n      \"post\": {\n        \"operationId\": \"acknowledgePurge\",\n        \"security\": [\n          {\n            \"LifecycleOAuth\": [\n              \"autonym:lifecycle:purge\"\n            ],\n            \"DPoP\": []\n          }\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"jti\",\n            \"in\": \"path\",\n            \"required\": true,\n            \"schema\": {\n              \"type\": \"string\"\n            }\n          }\n        ],\n        \"requestBody\": {\n          \"required\": true,\n          \"content\": {\n            \"application/json\": {\n              \"schema\": {\n                \"$ref\": \"#/components/schemas/purge-ack\"\n              }\n            }\n          }\n        },\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Success. This is a specified contract, not an implemented endpoint.\",\n            \"content\": {\n              \"application/json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/purge-ack\"\n                }\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"RFC 9457 error; OAuth errors follow OAuth.\",\n            \"content\": {\n              \"application/problem+json\": {\n                \"schema\": {\n                  \"$ref\": \"#/components/schemas/problem\"\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  \"components\": {\n    \"schemas\": {\n      \"entry\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"version\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"domain\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"key\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"value_type\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"text\",\n              \"number\",\n              \"boolean\",\n              \"enum\",\n              \"list\",\n              \"coded\",\n              \"coded_list\",\n              \"date\",\n              \"date_range\",\n              \"age_band\",\n              \"person_ref\",\n              \"structured\",\n              \"credential\"\n            ]\n          },\n          \"value\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          },\n          \"context_kind\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"fact\",\n              \"preference\",\n              \"state\"\n            ]\n          },\n          \"provenance\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"declared\",\n                  \"observed\",\n                  \"derived\",\n                  \"attested\"\n                ]\n              },\n              \"source_client_id\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 2048\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"source_event_id\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 128\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"recorded_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"occurred_at\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"confidence\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"confirmed_at\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"evidence_refs\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                }\n              },\n              \"derived_from\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"entry_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"version\": {\n                      \"type\": \"integer\",\n                      \"exclusiveMinimum\": 0,\n                      \"maximum\": 9007199254740991\n                    },\n                    \"level\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"L0\",\n                        \"L1\",\n                        \"L2\",\n                        \"L3\"\n                      ]\n                    },\n                    \"fields\": {\n                      \"minItems\": 1,\n                      \"maxItems\": 64,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"maxLength\": 256\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"entry_id\",\n                    \"version\",\n                    \"level\",\n                    \"fields\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              }\n            },\n            \"required\": [\n              \"kind\",\n              \"source_client_id\",\n              \"source_event_id\",\n              \"recorded_at\",\n              \"occurred_at\",\n              \"confidence\",\n              \"confirmed_at\",\n              \"evidence_refs\",\n              \"derived_from\"\n            ],\n            \"additionalProperties\": false\n          },\n          \"temporal\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"valid_from\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"valid_until\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              }\n            },\n            \"required\": [\n              \"valid_from\",\n              \"valid_until\"\n            ],\n            \"additionalProperties\": false\n          },\n          \"overlay\": {\n            \"anyOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"target_entry_id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                  },\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"selected\": {\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"required\": [\n                  \"target_entry_id\",\n                  \"enabled\",\n                  \"selected\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"rendering_overrides\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"L1\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 4096\n              }\n            },\n            \"additionalProperties\": false\n          },\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"active\",\n              \"superseded\",\n              \"archived\"\n            ]\n          },\n          \"created_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"updated_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"origin_host\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"version\",\n          \"profile_id\",\n          \"domain\",\n          \"key\",\n          \"value_type\",\n          \"value\",\n          \"context_kind\",\n          \"provenance\",\n          \"temporal\",\n          \"overlay\",\n          \"rendering_overrides\",\n          \"status\",\n          \"created_at\",\n          \"updated_at\",\n          \"origin_host\"\n        ],\n        \"additionalProperties\": false,\n        \"$defs\": {\n          \"__schema0\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\"\n              },\n              {\n                \"type\": \"number\"\n              },\n              {\n                \"type\": \"boolean\"\n              },\n              {\n                \"type\": \"null\"\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"propertyNames\": {\n                  \"type\": \"string\"\n                },\n                \"additionalProperties\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              }\n            ]\n          }\n        },\n        \"$id\": \"urn:autonym:schema:entry:1.0:0.2-draft\"\n      },\n      \"temporal\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"valid_from\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"valid_until\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          }\n        },\n        \"required\": [\n          \"valid_from\",\n          \"valid_until\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:temporal:1.0:0.2-draft\"\n      },\n      \"grant\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"revision\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"handle\": {\n                \"type\": \"string\",\n                \"maxLength\": 294,\n                \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n              },\n              \"client_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 2048\n              },\n              \"purpose\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"category\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"booking\",\n                      \"recommendation\",\n                      \"safety\",\n                      \"fulfilment\",\n                      \"personalisation\",\n                      \"research\",\n                      \"care\",\n                      \"medical\",\n                      \"employment\",\n                      \"advertising\"\n                    ]\n                  },\n                  \"text\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 4096\n                  }\n                },\n                \"required\": [\n                  \"category\",\n                  \"text\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"issued_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"expires_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"status\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"active\",\n                  \"revoked\",\n                  \"expired\"\n                ]\n              },\n              \"kind\": {\n                \"type\": \"string\",\n                \"const\": \"read\"\n              },\n              \"read\": {\n                \"minItems\": 1,\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"domain\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        {\n                          \"type\": \"string\",\n                          \"const\": \"*\"\n                        }\n                      ]\n                    },\n                    \"keys\": {\n                      \"anyOf\": [\n                        {\n                          \"minItems\": 1,\n                          \"maxItems\": 128,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                          }\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"max_level\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"L0\",\n                        \"L1\",\n                        \"L2\",\n                        \"L3\"\n                      ]\n                    }\n                  },\n                  \"required\": [\n                    \"domain\",\n                    \"keys\",\n                    \"max_level\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"declared_only\": {\n                \"type\": \"boolean\"\n              },\n              \"min_confidence\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1\n              },\n              \"max_reads\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 100000\n              },\n              \"reads_used\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"persist_until\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"allow_delegation\": {\n                \"type\": \"boolean\"\n              },\n              \"onward_share\": {\n                \"type\": \"boolean\",\n                \"const\": false\n              }\n            },\n            \"required\": [\n              \"id\",\n              \"revision\",\n              \"handle\",\n              \"client_id\",\n              \"purpose\",\n              \"issued_at\",\n              \"expires_at\",\n              \"status\",\n              \"kind\",\n              \"read\",\n              \"declared_only\",\n              \"min_confidence\",\n              \"max_reads\",\n              \"reads_used\",\n              \"persist_until\",\n              \"allow_delegation\",\n              \"onward_share\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"revision\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"handle\": {\n                \"type\": \"string\",\n                \"maxLength\": 294,\n                \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n              },\n              \"client_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 2048\n              },\n              \"purpose\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"category\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"booking\",\n                      \"recommendation\",\n                      \"safety\",\n                      \"fulfilment\",\n                      \"personalisation\",\n                      \"research\",\n                      \"care\",\n                      \"medical\",\n                      \"employment\",\n                      \"advertising\"\n                    ]\n                  },\n                  \"text\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 4096\n                  }\n                },\n                \"required\": [\n                  \"category\",\n                  \"text\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"issued_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"expires_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"status\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"active\",\n                  \"revoked\",\n                  \"expired\"\n                ]\n              },\n              \"kind\": {\n                \"type\": \"string\",\n                \"const\": \"contribute\"\n              },\n              \"contribute\": {\n                \"minItems\": 1,\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"domain\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    },\n                    \"keys\": {\n                      \"minItems\": 1,\n                      \"maxItems\": 128,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"domain\",\n                    \"keys\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"max_events\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 100000\n              },\n              \"events_used\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"allow_confirmation\": {\n                \"type\": \"boolean\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              }\n            },\n            \"required\": [\n              \"id\",\n              \"revision\",\n              \"handle\",\n              \"client_id\",\n              \"purpose\",\n              \"issued_at\",\n              \"expires_at\",\n              \"status\",\n              \"kind\",\n              \"contribute\",\n              \"max_events\",\n              \"events_used\",\n              \"allow_confirmation\",\n              \"stream_id\"\n            ],\n            \"additionalProperties\": false\n          }\n        ],\n        \"$id\": \"urn:autonym:schema:grant:1.0:0.2-draft\"\n      },\n      \"context-request\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"domains\": {\n            \"minItems\": 1,\n            \"maxItems\": 32,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n            }\n          },\n          \"max_level\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"L0\",\n              \"L1\",\n              \"L2\",\n              \"L3\"\n            ]\n          },\n          \"keys\": {\n            \"minItems\": 1,\n            \"maxItems\": 128,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n            }\n          },\n          \"declared_only\": {\n            \"type\": \"boolean\"\n          },\n          \"min_confidence\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1\n          },\n          \"since\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          }\n        },\n        \"required\": [\n          \"domains\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:context-request:1.0:0.2-draft\"\n      },\n      \"disclosure\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"autonym_version\": {\n            \"type\": \"string\",\n            \"const\": \"1.0\"\n          },\n          \"provider\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"audience\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"client_id\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 2048\n          },\n          \"handle\": {\n            \"type\": \"string\",\n            \"maxLength\": 294,\n            \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n          },\n          \"grant_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"grant_revision\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"read_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"purpose\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"booking\",\n              \"recommendation\",\n              \"safety\",\n              \"fulfilment\",\n              \"personalisation\",\n              \"research\",\n              \"care\",\n              \"medical\",\n              \"employment\",\n              \"advertising\"\n            ]\n          },\n          \"issued_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"valid_until\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"ttl_seconds\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 300\n          },\n          \"persist_until\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"entries\": {\n            \"maxItems\": 1000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^rent_[a-z2-7]{52}$\"\n                },\n                \"version\": {\n                  \"type\": \"integer\",\n                  \"exclusiveMinimum\": 0,\n                  \"maximum\": 9007199254740991\n                },\n                \"domain\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"key\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"level\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"L0\",\n                    \"L1\",\n                    \"L2\",\n                    \"L3\"\n                  ]\n                },\n                \"value_type\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"text\",\n                    \"number\",\n                    \"boolean\",\n                    \"enum\",\n                    \"list\",\n                    \"coded\",\n                    \"coded_list\",\n                    \"date\",\n                    \"date_range\",\n                    \"age_band\",\n                    \"person_ref\",\n                    \"structured\",\n                    \"credential\"\n                  ]\n                },\n                \"value\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                },\n                \"context_kind\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"fact\",\n                    \"preference\",\n                    \"state\"\n                  ]\n                },\n                \"safety_critical\": {\n                  \"type\": \"boolean\"\n                },\n                \"provenance\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"kind\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"declared\",\n                        \"observed\",\n                        \"derived\",\n                        \"attested\"\n                      ]\n                    },\n                    \"confirmed\": {\n                      \"type\": \"boolean\"\n                    }\n                  },\n                  \"required\": [\n                    \"kind\",\n                    \"confirmed\"\n                  ],\n                  \"additionalProperties\": false\n                },\n                \"stale\": {\n                  \"type\": \"boolean\"\n                }\n              },\n              \"required\": [\n                \"id\",\n                \"version\",\n                \"domain\",\n                \"key\",\n                \"level\",\n                \"value_type\",\n                \"value\",\n                \"context_kind\",\n                \"safety_critical\",\n                \"provenance\",\n                \"stale\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"proof\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"jws\"\n              },\n              \"alg\": {\n                \"type\": \"string\",\n                \"const\": \"ES256\"\n              },\n              \"kid\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 256\n              },\n              \"jws\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"alg\",\n              \"kid\",\n              \"jws\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"autonym_version\",\n          \"provider\",\n          \"audience\",\n          \"client_id\",\n          \"handle\",\n          \"grant_id\",\n          \"grant_revision\",\n          \"read_id\",\n          \"purpose\",\n          \"issued_at\",\n          \"valid_until\",\n          \"ttl_seconds\",\n          \"persist_until\",\n          \"entries\",\n          \"proof\"\n        ],\n        \"additionalProperties\": false,\n        \"$defs\": {\n          \"__schema0\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\"\n              },\n              {\n                \"type\": \"number\"\n              },\n              {\n                \"type\": \"boolean\"\n              },\n              {\n                \"type\": \"null\"\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"propertyNames\": {\n                  \"type\": \"string\"\n                },\n                \"additionalProperties\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              }\n            ]\n          }\n        },\n        \"$id\": \"urn:autonym:schema:disclosure:1.0:0.2-draft\"\n      },\n      \"contribution-event\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              },\n              \"occurred_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              },\n              \"domain\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"key\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"value_type\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"text\",\n                  \"number\",\n                  \"boolean\",\n                  \"enum\",\n                  \"list\",\n                  \"coded\",\n                  \"coded_list\",\n                  \"date\",\n                  \"date_range\",\n                  \"age_band\",\n                  \"person_ref\",\n                  \"structured\",\n                  \"credential\"\n                ]\n              },\n              \"value\": {\n                \"$ref\": \"#/$defs/__schema0\"\n              },\n              \"context_kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"fact\",\n                  \"preference\",\n                  \"state\"\n                ]\n              },\n              \"temporal\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"valid_from\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"valid_until\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\n                  \"valid_from\",\n                  \"valid_until\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"category\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"user_supplied\",\n                  \"activity\",\n                  \"observation\",\n                  \"inference\"\n                ]\n              },\n              \"evidence_refs\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                }\n              },\n              \"operation\": {\n                \"type\": \"string\",\n                \"const\": \"create\"\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"occurred_at\",\n              \"stream_id\",\n              \"domain\",\n              \"key\",\n              \"value_type\",\n              \"value\",\n              \"context_kind\",\n              \"temporal\",\n              \"category\",\n              \"evidence_refs\",\n              \"operation\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              },\n              \"occurred_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              },\n              \"domain\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"key\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"value_type\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"text\",\n                  \"number\",\n                  \"boolean\",\n                  \"enum\",\n                  \"list\",\n                  \"coded\",\n                  \"coded_list\",\n                  \"date\",\n                  \"date_range\",\n                  \"age_band\",\n                  \"person_ref\",\n                  \"structured\",\n                  \"credential\"\n                ]\n              },\n              \"value\": {\n                \"$ref\": \"#/$defs/__schema0\"\n              },\n              \"context_kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"fact\",\n                  \"preference\",\n                  \"state\"\n                ]\n              },\n              \"temporal\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"valid_from\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"valid_until\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\n                  \"valid_from\",\n                  \"valid_until\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"category\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"user_supplied\",\n                  \"activity\",\n                  \"observation\",\n                  \"inference\"\n                ]\n              },\n              \"evidence_refs\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                }\n              },\n              \"operation\": {\n                \"type\": \"string\",\n                \"const\": \"correct\"\n              },\n              \"predecessor_event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"occurred_at\",\n              \"stream_id\",\n              \"domain\",\n              \"key\",\n              \"value_type\",\n              \"value\",\n              \"context_kind\",\n              \"temporal\",\n              \"category\",\n              \"evidence_refs\",\n              \"operation\",\n              \"predecessor_event_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              },\n              \"occurred_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"stream_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n              },\n              \"operation\": {\n                \"type\": \"string\",\n                \"const\": \"withdraw\"\n              },\n              \"predecessor_event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"occurred_at\",\n              \"stream_id\",\n              \"operation\",\n              \"predecessor_event_id\"\n            ],\n            \"additionalProperties\": false\n          }\n        ],\n        \"$defs\": {\n          \"__schema0\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\"\n              },\n              {\n                \"type\": \"number\"\n              },\n              {\n                \"type\": \"boolean\"\n              },\n              {\n                \"type\": \"null\"\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"propertyNames\": {\n                  \"type\": \"string\"\n                },\n                \"additionalProperties\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              }\n            ]\n          }\n        },\n        \"$id\": \"urn:autonym:schema:contribution-event:1.0:0.2-draft\"\n      },\n      \"proposal-status\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"proposal_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"event_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n          },\n          \"ingested_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"pending\",\n              \"accepted\",\n              \"rejected\",\n              \"withdrawn\"\n            ]\n          }\n        },\n        \"required\": [\n          \"proposal_id\",\n          \"event_id\",\n          \"ingested_at\",\n          \"status\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:proposal-status:1.0:0.2-draft\"\n      },\n      \"confirmation\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"proposal_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          }\n        },\n        \"required\": [\n          \"proposal_id\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:confirmation:1.0:0.2-draft\"\n      },\n      \"confirmation-result\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"const\": \"review_required\"\n          },\n          \"review_url\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        },\n        \"required\": [\n          \"status\",\n          \"review_url\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:confirmation-result:1.0:0.2-draft\"\n      },\n      \"domain-list\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"domains\": {\n            \"maxItems\": 32,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"domain\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"max_level\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"L0\",\n                    \"L1\",\n                    \"L2\",\n                    \"L3\"\n                  ]\n                },\n                \"keys\": {\n                  \"maxItems\": 128,\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  }\n                }\n              },\n              \"required\": [\n                \"domain\",\n                \"max_level\",\n                \"keys\"\n              ],\n              \"additionalProperties\": false\n            }\n          }\n        },\n        \"required\": [\n          \"domains\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:domain-list:1.0:0.2-draft\"\n      },\n      \"receipt\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"event_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"read_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"grant_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"client_id\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 2048\n          },\n          \"at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"purpose\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"booking\",\n              \"recommendation\",\n              \"safety\",\n              \"fulfilment\",\n              \"personalisation\",\n              \"research\",\n              \"care\",\n              \"medical\",\n              \"employment\",\n              \"advertising\"\n            ]\n          },\n          \"surface\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"rest\",\n              \"mcp_tool\",\n              \"mcp_resource\",\n              \"mcp_briefing\"\n            ]\n          },\n          \"request\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"domains\": {\n                \"minItems\": 1,\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                }\n              },\n              \"max_level\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"L0\",\n                  \"L1\",\n                  \"L2\",\n                  \"L3\"\n                ]\n              },\n              \"keys\": {\n                \"minItems\": 1,\n                \"maxItems\": 128,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                }\n              },\n              \"declared_only\": {\n                \"type\": \"boolean\"\n              },\n              \"min_confidence\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1\n              },\n              \"since\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              }\n            },\n            \"required\": [\n              \"domains\"\n            ],\n            \"additionalProperties\": false\n          },\n          \"returned\": {\n            \"maxItems\": 1000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"entry_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"version\": {\n                  \"type\": \"integer\",\n                  \"exclusiveMinimum\": 0,\n                  \"maximum\": 9007199254740991\n                },\n                \"level\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"L0\",\n                    \"L1\",\n                    \"L2\",\n                    \"L3\"\n                  ]\n                }\n              },\n              \"required\": [\n                \"entry_id\",\n                \"version\",\n                \"level\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"response_hash\": {\n            \"type\": \"string\",\n            \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n          },\n          \"prev_hash\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"hash\": {\n            \"type\": \"string\",\n            \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n          },\n          \"proof\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"jws\"\n              },\n              \"alg\": {\n                \"type\": \"string\",\n                \"const\": \"ES256\"\n              },\n              \"kid\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 256\n              },\n              \"jws\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"alg\",\n              \"kid\",\n              \"jws\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"event_id\",\n          \"read_id\",\n          \"grant_id\",\n          \"client_id\",\n          \"at\",\n          \"purpose\",\n          \"surface\",\n          \"request\",\n          \"returned\",\n          \"response_hash\",\n          \"prev_hash\",\n          \"hash\",\n          \"proof\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:receipt:1.0:0.2-draft\"\n      },\n      \"log-event\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"event_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"kind\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"grant_created\",\n              \"grant_revoked\",\n              \"grant_expired\",\n              \"rule_applied\",\n              \"delegation_redeemed\",\n              \"proposal_decided\",\n              \"overlay_enabled\",\n              \"overlay_disabled\",\n              \"overlay_selected\",\n              \"read_not_modified\",\n              \"purge_issued\",\n              \"purge_acknowledged\",\n              \"operator_action\",\n              \"migration_imported\"\n            ]\n          },\n          \"actor_client_id\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 2048\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"subject_id\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 256\n          },\n          \"details\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"decision\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"approved\",\n                      \"rejected\",\n                      \"enabled\",\n                      \"disabled\",\n                      \"selected\",\n                      \"unchanged\",\n                      \"completed\",\n                      \"failed\"\n                    ]\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"ids\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                }\n              },\n              \"response_hash\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              }\n            },\n            \"required\": [\n              \"decision\",\n              \"ids\",\n              \"response_hash\"\n            ],\n            \"additionalProperties\": false\n          },\n          \"prev_hash\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"hash\": {\n            \"type\": \"string\",\n            \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n          }\n        },\n        \"required\": [\n          \"event_id\",\n          \"at\",\n          \"kind\",\n          \"actor_client_id\",\n          \"subject_id\",\n          \"details\",\n          \"prev_hash\",\n          \"hash\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:log-event:1.0:0.2-draft\"\n      },\n      \"purge-instruction\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"iss\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"sub\": {\n            \"type\": \"string\",\n            \"maxLength\": 294,\n            \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n          },\n          \"aud\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 2048\n          },\n          \"jti\": {\n            \"type\": \"string\",\n            \"pattern\": \"^pi_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"iat\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"exp\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"autonym_grant_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"reason\": {\n            \"type\": \"string\",\n            \"const\": \"grant_ended\"\n          },\n          \"scope\": {\n            \"type\": \"string\",\n            \"const\": \"all\"\n          },\n          \"deadline\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          }\n        },\n        \"required\": [\n          \"iss\",\n          \"sub\",\n          \"aud\",\n          \"jti\",\n          \"iat\",\n          \"exp\",\n          \"autonym_grant_id\",\n          \"reason\",\n          \"scope\",\n          \"deadline\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:purge-instruction:1.0:0.2-draft\"\n      },\n      \"purge-ack\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"instruction_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^pi_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"attestation\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"purged\",\n              \"not_held\",\n              \"legal_hold\"\n            ]\n          },\n          \"at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"note\": {\n            \"type\": \"string\",\n            \"maxLength\": 2048\n          },\n          \"proof\": {\n            \"anyOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"jws\"\n                  },\n                  \"alg\": {\n                    \"type\": \"string\",\n                    \"const\": \"ES256\"\n                  },\n                  \"kid\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 256\n                  },\n                  \"jws\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n                  }\n                },\n                \"required\": [\n                  \"type\",\n                  \"alg\",\n                  \"kid\",\n                  \"jws\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          }\n        },\n        \"required\": [\n          \"instruction_id\",\n          \"attestation\",\n          \"at\",\n          \"note\",\n          \"proof\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:purge-ack:1.0:0.2-draft\"\n      },\n      \"capability-claim\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"oneOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"autonym_version\": {\n                \"type\": \"string\",\n                \"const\": \"1.0\"\n              },\n              \"document_version\": {\n                \"type\": \"string\",\n                \"const\": \"0.2-draft\"\n              },\n              \"categories\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"domain\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    },\n                    \"keys\": {\n                      \"minItems\": 1,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                      }\n                    },\n                    \"directions\": {\n                      \"minItems\": 1,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"read\",\n                          \"contribute\",\n                          \"export\",\n                          \"import\"\n                        ]\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"domain\",\n                    \"keys\",\n                    \"directions\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"limitations\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 4096\n                }\n              },\n              \"assurance\": {\n                \"type\": \"string\",\n                \"const\": \"self-declared\"\n              },\n              \"evidence\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"check_id\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 64\n                    },\n                    \"url\": {\n                      \"type\": \"string\",\n                      \"format\": \"uri\"\n                    },\n                    \"tested_at\": {\n                      \"type\": \"string\",\n                      \"format\": \"date-time\",\n                      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                    }\n                  },\n                  \"required\": [\n                    \"check_id\",\n                    \"url\",\n                    \"tested_at\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"role\": {\n                \"type\": \"string\",\n                \"const\": \"provider\"\n              },\n              \"capabilities\": {\n                \"maxItems\": 4,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"Core\",\n                    \"Write\",\n                    \"Portable\",\n                    \"Delegated\"\n                  ]\n                }\n              }\n            },\n            \"required\": [\n              \"autonym_version\",\n              \"document_version\",\n              \"categories\",\n              \"limitations\",\n              \"assurance\",\n              \"evidence\",\n              \"role\",\n              \"capabilities\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"autonym_version\": {\n                \"type\": \"string\",\n                \"const\": \"1.0\"\n              },\n              \"document_version\": {\n                \"type\": \"string\",\n                \"const\": \"0.2-draft\"\n              },\n              \"categories\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"domain\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    },\n                    \"keys\": {\n                      \"minItems\": 1,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                      }\n                    },\n                    \"directions\": {\n                      \"minItems\": 1,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"read\",\n                          \"contribute\",\n                          \"export\",\n                          \"import\"\n                        ]\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"domain\",\n                    \"keys\",\n                    \"directions\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"limitations\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 4096\n                }\n              },\n              \"assurance\": {\n                \"type\": \"string\",\n                \"const\": \"self-declared\"\n              },\n              \"evidence\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"check_id\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 64\n                    },\n                    \"url\": {\n                      \"type\": \"string\",\n                      \"format\": \"uri\"\n                    },\n                    \"tested_at\": {\n                      \"type\": \"string\",\n                      \"format\": \"date-time\",\n                      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                    }\n                  },\n                  \"required\": [\n                    \"check_id\",\n                    \"url\",\n                    \"tested_at\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"role\": {\n                \"type\": \"string\",\n                \"const\": \"recipient\"\n              },\n              \"capabilities\": {\n                \"maxItems\": 3,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"Read\",\n                    \"Contribute\",\n                    \"Reciprocal\"\n                  ]\n                }\n              }\n            },\n            \"required\": [\n              \"autonym_version\",\n              \"document_version\",\n              \"categories\",\n              \"limitations\",\n              \"assurance\",\n              \"evidence\",\n              \"role\",\n              \"capabilities\"\n            ],\n            \"additionalProperties\": false\n          }\n        ],\n        \"$id\": \"urn:autonym:schema:capability-claim:1.0:0.2-draft\"\n      },\n      \"discovery\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"autonym_version\": {\n            \"type\": \"string\",\n            \"const\": \"1.0\"\n          },\n          \"issuer\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"authorization_server\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"jwks_uri\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"rest_endpoint\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"format\": \"uri\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"mcp_endpoint\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\",\n                \"format\": \"uri\"\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"capabilities\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"autonym_version\": {\n                    \"type\": \"string\",\n                    \"const\": \"1.0\"\n                  },\n                  \"document_version\": {\n                    \"type\": \"string\",\n                    \"const\": \"0.2-draft\"\n                  },\n                  \"categories\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"domain\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        \"keys\": {\n                          \"minItems\": 1,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                          }\n                        },\n                        \"directions\": {\n                          \"minItems\": 1,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                              \"read\",\n                              \"contribute\",\n                              \"export\",\n                              \"import\"\n                            ]\n                          }\n                        }\n                      },\n                      \"required\": [\n                        \"domain\",\n                        \"keys\",\n                        \"directions\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"limitations\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 4096\n                    }\n                  },\n                  \"assurance\": {\n                    \"type\": \"string\",\n                    \"const\": \"self-declared\"\n                  },\n                  \"evidence\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"check_id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 64\n                        },\n                        \"url\": {\n                          \"type\": \"string\",\n                          \"format\": \"uri\"\n                        },\n                        \"tested_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        }\n                      },\n                      \"required\": [\n                        \"check_id\",\n                        \"url\",\n                        \"tested_at\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"role\": {\n                    \"type\": \"string\",\n                    \"const\": \"provider\"\n                  },\n                  \"capabilities\": {\n                    \"maxItems\": 4,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"Core\",\n                        \"Write\",\n                        \"Portable\",\n                        \"Delegated\"\n                      ]\n                    }\n                  }\n                },\n                \"required\": [\n                  \"autonym_version\",\n                  \"document_version\",\n                  \"categories\",\n                  \"limitations\",\n                  \"assurance\",\n                  \"evidence\",\n                  \"role\",\n                  \"capabilities\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"autonym_version\": {\n                    \"type\": \"string\",\n                    \"const\": \"1.0\"\n                  },\n                  \"document_version\": {\n                    \"type\": \"string\",\n                    \"const\": \"0.2-draft\"\n                  },\n                  \"categories\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"domain\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        \"keys\": {\n                          \"minItems\": 1,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                          }\n                        },\n                        \"directions\": {\n                          \"minItems\": 1,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                              \"read\",\n                              \"contribute\",\n                              \"export\",\n                              \"import\"\n                            ]\n                          }\n                        }\n                      },\n                      \"required\": [\n                        \"domain\",\n                        \"keys\",\n                        \"directions\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"limitations\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 4096\n                    }\n                  },\n                  \"assurance\": {\n                    \"type\": \"string\",\n                    \"const\": \"self-declared\"\n                  },\n                  \"evidence\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"check_id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 64\n                        },\n                        \"url\": {\n                          \"type\": \"string\",\n                          \"format\": \"uri\"\n                        },\n                        \"tested_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        }\n                      },\n                      \"required\": [\n                        \"check_id\",\n                        \"url\",\n                        \"tested_at\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"role\": {\n                    \"type\": \"string\",\n                    \"const\": \"recipient\"\n                  },\n                  \"capabilities\": {\n                    \"maxItems\": 3,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"Read\",\n                        \"Contribute\",\n                        \"Reciprocal\"\n                      ]\n                    }\n                  }\n                },\n                \"required\": [\n                  \"autonym_version\",\n                  \"document_version\",\n                  \"categories\",\n                  \"limitations\",\n                  \"assurance\",\n                  \"evidence\",\n                  \"role\",\n                  \"capabilities\"\n                ],\n                \"additionalProperties\": false\n              }\n            ]\n          }\n        },\n        \"required\": [\n          \"autonym_version\",\n          \"issuer\",\n          \"authorization_server\",\n          \"jwks_uri\",\n          \"rest_endpoint\",\n          \"mcp_endpoint\",\n          \"capabilities\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:discovery:1.0:0.2-draft\"\n      },\n      \"export\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"format\": {\n            \"type\": \"string\",\n            \"const\": \"autonym-export/1.0\"\n          },\n          \"exported_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"origin_host\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"history_mode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"current\",\n              \"all_retained\"\n            ]\n          },\n          \"partitions\": {\n            \"maxItems\": 100,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"label\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 4096\n                }\n              },\n              \"required\": [\n                \"id\",\n                \"label\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"entries\": {\n            \"maxItems\": 100000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"version\": {\n                  \"type\": \"integer\",\n                  \"exclusiveMinimum\": 0,\n                  \"maximum\": 9007199254740991\n                },\n                \"profile_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"domain\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"key\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"value_type\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"text\",\n                    \"number\",\n                    \"boolean\",\n                    \"enum\",\n                    \"list\",\n                    \"coded\",\n                    \"coded_list\",\n                    \"date\",\n                    \"date_range\",\n                    \"age_band\",\n                    \"person_ref\",\n                    \"structured\",\n                    \"credential\"\n                  ]\n                },\n                \"value\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                },\n                \"context_kind\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"fact\",\n                    \"preference\",\n                    \"state\"\n                  ]\n                },\n                \"provenance\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"kind\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"declared\",\n                        \"observed\",\n                        \"derived\",\n                        \"attested\"\n                      ]\n                    },\n                    \"source_client_id\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 2048\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"source_event_id\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 128\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"recorded_at\": {\n                      \"type\": \"string\",\n                      \"format\": \"date-time\",\n                      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                    },\n                    \"occurred_at\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"confidence\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"number\",\n                          \"minimum\": 0,\n                          \"maximum\": 1\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"confirmed_at\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"evidence_refs\": {\n                      \"maxItems\": 32,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"minLength\": 1,\n                        \"maxLength\": 256\n                      }\n                    },\n                    \"derived_from\": {\n                      \"maxItems\": 32,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"entry_id\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                          },\n                          \"version\": {\n                            \"type\": \"integer\",\n                            \"exclusiveMinimum\": 0,\n                            \"maximum\": 9007199254740991\n                          },\n                          \"level\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                              \"L0\",\n                              \"L1\",\n                              \"L2\",\n                              \"L3\"\n                            ]\n                          },\n                          \"fields\": {\n                            \"minItems\": 1,\n                            \"maxItems\": 64,\n                            \"type\": \"array\",\n                            \"items\": {\n                              \"type\": \"string\",\n                              \"maxLength\": 256\n                            }\n                          }\n                        },\n                        \"required\": [\n                          \"entry_id\",\n                          \"version\",\n                          \"level\",\n                          \"fields\"\n                        ],\n                        \"additionalProperties\": false\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"kind\",\n                    \"source_client_id\",\n                    \"source_event_id\",\n                    \"recorded_at\",\n                    \"occurred_at\",\n                    \"confidence\",\n                    \"confirmed_at\",\n                    \"evidence_refs\",\n                    \"derived_from\"\n                  ],\n                  \"additionalProperties\": false\n                },\n                \"temporal\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"valid_from\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"valid_until\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    }\n                  },\n                  \"required\": [\n                    \"valid_from\",\n                    \"valid_until\"\n                  ],\n                  \"additionalProperties\": false\n                },\n                \"overlay\": {\n                  \"anyOf\": [\n                    {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"target_entry_id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                        },\n                        \"enabled\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"selected\": {\n                          \"type\": \"boolean\"\n                        }\n                      },\n                      \"required\": [\n                        \"target_entry_id\",\n                        \"enabled\",\n                        \"selected\"\n                      ],\n                      \"additionalProperties\": false\n                    },\n                    {\n                      \"type\": \"null\"\n                    }\n                  ]\n                },\n                \"rendering_overrides\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"L1\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 4096\n                    }\n                  },\n                  \"additionalProperties\": false\n                },\n                \"status\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"active\",\n                    \"superseded\",\n                    \"archived\"\n                  ]\n                },\n                \"created_at\": {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\",\n                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                },\n                \"updated_at\": {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\",\n                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                },\n                \"origin_host\": {\n                  \"type\": \"string\",\n                  \"format\": \"uri\"\n                }\n              },\n              \"required\": [\n                \"id\",\n                \"version\",\n                \"profile_id\",\n                \"domain\",\n                \"key\",\n                \"value_type\",\n                \"value\",\n                \"context_kind\",\n                \"provenance\",\n                \"temporal\",\n                \"overlay\",\n                \"rendering_overrides\",\n                \"status\",\n                \"created_at\",\n                \"updated_at\",\n                \"origin_host\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"tombstones\": {\n            \"maxItems\": 100000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"version\": {\n                  \"type\": \"integer\",\n                  \"exclusiveMinimum\": 0,\n                  \"maximum\": 9007199254740991\n                },\n                \"profile_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"domain\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"key\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"deleted_at\": {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\",\n                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                }\n              },\n              \"required\": [\n                \"id\",\n                \"version\",\n                \"profile_id\",\n                \"domain\",\n                \"key\",\n                \"deleted_at\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"grants_history\": {\n            \"maxItems\": 100000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"profile_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"grant\": {\n                  \"oneOf\": [\n                    {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                        },\n                        \"revision\": {\n                          \"type\": \"integer\",\n                          \"exclusiveMinimum\": 0,\n                          \"maximum\": 9007199254740991\n                        },\n                        \"handle\": {\n                          \"type\": \"string\",\n                          \"maxLength\": 294,\n                          \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n                        },\n                        \"client_id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 2048\n                        },\n                        \"purpose\": {\n                          \"type\": \"object\",\n                          \"properties\": {\n                            \"category\": {\n                              \"type\": \"string\",\n                              \"enum\": [\n                                \"booking\",\n                                \"recommendation\",\n                                \"safety\",\n                                \"fulfilment\",\n                                \"personalisation\",\n                                \"research\",\n                                \"care\",\n                                \"medical\",\n                                \"employment\",\n                                \"advertising\"\n                              ]\n                            },\n                            \"text\": {\n                              \"type\": \"string\",\n                              \"minLength\": 1,\n                              \"maxLength\": 4096\n                            }\n                          },\n                          \"required\": [\n                            \"category\",\n                            \"text\"\n                          ],\n                          \"additionalProperties\": false\n                        },\n                        \"issued_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        \"expires_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        \"status\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"active\",\n                            \"revoked\",\n                            \"expired\"\n                          ]\n                        },\n                        \"kind\": {\n                          \"type\": \"string\",\n                          \"const\": \"read\"\n                        },\n                        \"read\": {\n                          \"minItems\": 1,\n                          \"maxItems\": 32,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"object\",\n                            \"properties\": {\n                              \"domain\": {\n                                \"anyOf\": [\n                                  {\n                                    \"type\": \"string\",\n                                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                                  },\n                                  {\n                                    \"type\": \"string\",\n                                    \"const\": \"*\"\n                                  }\n                                ]\n                              },\n                              \"keys\": {\n                                \"anyOf\": [\n                                  {\n                                    \"minItems\": 1,\n                                    \"maxItems\": 128,\n                                    \"type\": \"array\",\n                                    \"items\": {\n                                      \"type\": \"string\",\n                                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                                    }\n                                  },\n                                  {\n                                    \"type\": \"null\"\n                                  }\n                                ]\n                              },\n                              \"max_level\": {\n                                \"type\": \"string\",\n                                \"enum\": [\n                                  \"L0\",\n                                  \"L1\",\n                                  \"L2\",\n                                  \"L3\"\n                                ]\n                              }\n                            },\n                            \"required\": [\n                              \"domain\",\n                              \"keys\",\n                              \"max_level\"\n                            ],\n                            \"additionalProperties\": false\n                          }\n                        },\n                        \"declared_only\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"min_confidence\": {\n                          \"type\": \"number\",\n                          \"minimum\": 0,\n                          \"maximum\": 1\n                        },\n                        \"max_reads\": {\n                          \"type\": \"integer\",\n                          \"exclusiveMinimum\": 0,\n                          \"maximum\": 100000\n                        },\n                        \"reads_used\": {\n                          \"type\": \"integer\",\n                          \"minimum\": 0,\n                          \"maximum\": 9007199254740991\n                        },\n                        \"persist_until\": {\n                          \"anyOf\": [\n                            {\n                              \"type\": \"string\",\n                              \"format\": \"date-time\",\n                              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                            },\n                            {\n                              \"type\": \"null\"\n                            }\n                          ]\n                        },\n                        \"allow_delegation\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"onward_share\": {\n                          \"type\": \"boolean\",\n                          \"const\": false\n                        }\n                      },\n                      \"required\": [\n                        \"id\",\n                        \"revision\",\n                        \"handle\",\n                        \"client_id\",\n                        \"purpose\",\n                        \"issued_at\",\n                        \"expires_at\",\n                        \"status\",\n                        \"kind\",\n                        \"read\",\n                        \"declared_only\",\n                        \"min_confidence\",\n                        \"max_reads\",\n                        \"reads_used\",\n                        \"persist_until\",\n                        \"allow_delegation\",\n                        \"onward_share\"\n                      ],\n                      \"additionalProperties\": false\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                        },\n                        \"revision\": {\n                          \"type\": \"integer\",\n                          \"exclusiveMinimum\": 0,\n                          \"maximum\": 9007199254740991\n                        },\n                        \"handle\": {\n                          \"type\": \"string\",\n                          \"maxLength\": 294,\n                          \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n                        },\n                        \"client_id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 2048\n                        },\n                        \"purpose\": {\n                          \"type\": \"object\",\n                          \"properties\": {\n                            \"category\": {\n                              \"type\": \"string\",\n                              \"enum\": [\n                                \"booking\",\n                                \"recommendation\",\n                                \"safety\",\n                                \"fulfilment\",\n                                \"personalisation\",\n                                \"research\",\n                                \"care\",\n                                \"medical\",\n                                \"employment\",\n                                \"advertising\"\n                              ]\n                            },\n                            \"text\": {\n                              \"type\": \"string\",\n                              \"minLength\": 1,\n                              \"maxLength\": 4096\n                            }\n                          },\n                          \"required\": [\n                            \"category\",\n                            \"text\"\n                          ],\n                          \"additionalProperties\": false\n                        },\n                        \"issued_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        \"expires_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        \"status\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"active\",\n                            \"revoked\",\n                            \"expired\"\n                          ]\n                        },\n                        \"kind\": {\n                          \"type\": \"string\",\n                          \"const\": \"contribute\"\n                        },\n                        \"contribute\": {\n                          \"minItems\": 1,\n                          \"maxItems\": 32,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"object\",\n                            \"properties\": {\n                              \"domain\": {\n                                \"type\": \"string\",\n                                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                              },\n                              \"keys\": {\n                                \"minItems\": 1,\n                                \"maxItems\": 128,\n                                \"type\": \"array\",\n                                \"items\": {\n                                  \"type\": \"string\",\n                                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                                }\n                              }\n                            },\n                            \"required\": [\n                              \"domain\",\n                              \"keys\"\n                            ],\n                            \"additionalProperties\": false\n                          }\n                        },\n                        \"max_events\": {\n                          \"type\": \"integer\",\n                          \"exclusiveMinimum\": 0,\n                          \"maximum\": 100000\n                        },\n                        \"events_used\": {\n                          \"type\": \"integer\",\n                          \"minimum\": 0,\n                          \"maximum\": 9007199254740991\n                        },\n                        \"allow_confirmation\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"stream_id\": {\n                          \"type\": \"string\",\n                          \"format\": \"uuid\",\n                          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                        }\n                      },\n                      \"required\": [\n                        \"id\",\n                        \"revision\",\n                        \"handle\",\n                        \"client_id\",\n                        \"purpose\",\n                        \"issued_at\",\n                        \"expires_at\",\n                        \"status\",\n                        \"kind\",\n                        \"contribute\",\n                        \"max_events\",\n                        \"events_used\",\n                        \"allow_confirmation\",\n                        \"stream_id\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  ]\n                }\n              },\n              \"required\": [\n                \"profile_id\",\n                \"grant\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"receipts\": {\n            \"maxItems\": 100000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"profile_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"receipt\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"event_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"read_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"grant_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"client_id\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 2048\n                    },\n                    \"at\": {\n                      \"type\": \"string\",\n                      \"format\": \"date-time\",\n                      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                    },\n                    \"purpose\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"booking\",\n                        \"recommendation\",\n                        \"safety\",\n                        \"fulfilment\",\n                        \"personalisation\",\n                        \"research\",\n                        \"care\",\n                        \"medical\",\n                        \"employment\",\n                        \"advertising\"\n                      ]\n                    },\n                    \"surface\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"rest\",\n                        \"mcp_tool\",\n                        \"mcp_resource\",\n                        \"mcp_briefing\"\n                      ]\n                    },\n                    \"request\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"domains\": {\n                          \"minItems\": 1,\n                          \"maxItems\": 32,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                          }\n                        },\n                        \"max_level\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"L0\",\n                            \"L1\",\n                            \"L2\",\n                            \"L3\"\n                          ]\n                        },\n                        \"keys\": {\n                          \"minItems\": 1,\n                          \"maxItems\": 128,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                          }\n                        },\n                        \"declared_only\": {\n                          \"type\": \"boolean\"\n                        },\n                        \"min_confidence\": {\n                          \"type\": \"number\",\n                          \"minimum\": 0,\n                          \"maximum\": 1\n                        },\n                        \"since\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        }\n                      },\n                      \"required\": [\n                        \"domains\"\n                      ],\n                      \"additionalProperties\": false\n                    },\n                    \"returned\": {\n                      \"maxItems\": 1000,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"object\",\n                        \"properties\": {\n                          \"entry_id\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                          },\n                          \"version\": {\n                            \"type\": \"integer\",\n                            \"exclusiveMinimum\": 0,\n                            \"maximum\": 9007199254740991\n                          },\n                          \"level\": {\n                            \"type\": \"string\",\n                            \"enum\": [\n                              \"L0\",\n                              \"L1\",\n                              \"L2\",\n                              \"L3\"\n                            ]\n                          }\n                        },\n                        \"required\": [\n                          \"entry_id\",\n                          \"version\",\n                          \"level\"\n                        ],\n                        \"additionalProperties\": false\n                      }\n                    },\n                    \"response_hash\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                    },\n                    \"prev_hash\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"hash\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                    },\n                    \"proof\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"type\": {\n                          \"type\": \"string\",\n                          \"const\": \"jws\"\n                        },\n                        \"alg\": {\n                          \"type\": \"string\",\n                          \"const\": \"ES256\"\n                        },\n                        \"kid\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 256\n                        },\n                        \"jws\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n                        }\n                      },\n                      \"required\": [\n                        \"type\",\n                        \"alg\",\n                        \"kid\",\n                        \"jws\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"required\": [\n                    \"event_id\",\n                    \"read_id\",\n                    \"grant_id\",\n                    \"client_id\",\n                    \"at\",\n                    \"purpose\",\n                    \"surface\",\n                    \"request\",\n                    \"returned\",\n                    \"response_hash\",\n                    \"prev_hash\",\n                    \"hash\",\n                    \"proof\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"required\": [\n                \"profile_id\",\n                \"receipt\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"log_events\": {\n            \"maxItems\": 100000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"profile_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"event\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"event_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"at\": {\n                      \"type\": \"string\",\n                      \"format\": \"date-time\",\n                      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                    },\n                    \"kind\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"grant_created\",\n                        \"grant_revoked\",\n                        \"grant_expired\",\n                        \"rule_applied\",\n                        \"delegation_redeemed\",\n                        \"proposal_decided\",\n                        \"overlay_enabled\",\n                        \"overlay_disabled\",\n                        \"overlay_selected\",\n                        \"read_not_modified\",\n                        \"purge_issued\",\n                        \"purge_acknowledged\",\n                        \"operator_action\",\n                        \"migration_imported\"\n                      ]\n                    },\n                    \"actor_client_id\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"minLength\": 1,\n                          \"maxLength\": 2048\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"subject_id\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 256\n                    },\n                    \"details\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"decision\": {\n                          \"anyOf\": [\n                            {\n                              \"type\": \"string\",\n                              \"enum\": [\n                                \"approved\",\n                                \"rejected\",\n                                \"enabled\",\n                                \"disabled\",\n                                \"selected\",\n                                \"unchanged\",\n                                \"completed\",\n                                \"failed\"\n                              ]\n                            },\n                            {\n                              \"type\": \"null\"\n                            }\n                          ]\n                        },\n                        \"ids\": {\n                          \"maxItems\": 32,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"minLength\": 1,\n                            \"maxLength\": 256\n                          }\n                        },\n                        \"response_hash\": {\n                          \"anyOf\": [\n                            {\n                              \"type\": \"string\",\n                              \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                            },\n                            {\n                              \"type\": \"null\"\n                            }\n                          ]\n                        }\n                      },\n                      \"required\": [\n                        \"decision\",\n                        \"ids\",\n                        \"response_hash\"\n                      ],\n                      \"additionalProperties\": false\n                    },\n                    \"prev_hash\": {\n                      \"anyOf\": [\n                        {\n                          \"type\": \"string\",\n                          \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                        },\n                        {\n                          \"type\": \"null\"\n                        }\n                      ]\n                    },\n                    \"hash\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                    }\n                  },\n                  \"required\": [\n                    \"event_id\",\n                    \"at\",\n                    \"kind\",\n                    \"actor_client_id\",\n                    \"subject_id\",\n                    \"details\",\n                    \"prev_hash\",\n                    \"hash\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"required\": [\n                \"profile_id\",\n                \"event\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"public_keys\": {\n            \"maxItems\": 100,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"kty\": {\n                  \"type\": \"string\",\n                  \"const\": \"EC\"\n                },\n                \"crv\": {\n                  \"type\": \"string\",\n                  \"const\": \"P-256\"\n                },\n                \"x\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[A-Za-z0-9_-]{43}$\"\n                },\n                \"y\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[A-Za-z0-9_-]{43}$\"\n                },\n                \"kid\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                },\n                \"alg\": {\n                  \"type\": \"string\",\n                  \"const\": \"ES256\"\n                },\n                \"use\": {\n                  \"type\": \"string\",\n                  \"const\": \"sig\"\n                }\n              },\n              \"required\": [\n                \"kty\",\n                \"crv\",\n                \"x\",\n                \"y\",\n                \"kid\",\n                \"alg\",\n                \"use\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"policy_history\": {\n            \"maxItems\": 10000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"profile_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"id\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                },\n                \"kind\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"rule\",\n                    \"delegation\"\n                  ]\n                },\n                \"executable\": {\n                  \"type\": \"boolean\",\n                  \"const\": false\n                },\n                \"description\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 4096\n                },\n                \"related_grant_ids\": {\n                  \"maxItems\": 1000,\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                  }\n                }\n              },\n              \"required\": [\n                \"profile_id\",\n                \"id\",\n                \"kind\",\n                \"executable\",\n                \"description\",\n                \"related_grant_ids\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"proposals\": {\n            \"maxItems\": 100000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"profile_id\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                },\n                \"source_client_id\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 2048\n                },\n                \"event\": {\n                  \"oneOf\": [\n                    {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"event_id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                        },\n                        \"occurred_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        \"stream_id\": {\n                          \"type\": \"string\",\n                          \"format\": \"uuid\",\n                          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                        },\n                        \"domain\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        \"key\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        \"value_type\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"text\",\n                            \"number\",\n                            \"boolean\",\n                            \"enum\",\n                            \"list\",\n                            \"coded\",\n                            \"coded_list\",\n                            \"date\",\n                            \"date_range\",\n                            \"age_band\",\n                            \"person_ref\",\n                            \"structured\",\n                            \"credential\"\n                          ]\n                        },\n                        \"value\": {\n                          \"$ref\": \"#/$defs/__schema0\"\n                        },\n                        \"context_kind\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"fact\",\n                            \"preference\",\n                            \"state\"\n                          ]\n                        },\n                        \"temporal\": {\n                          \"type\": \"object\",\n                          \"properties\": {\n                            \"valid_from\": {\n                              \"anyOf\": [\n                                {\n                                  \"type\": \"string\",\n                                  \"format\": \"date-time\",\n                                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                                },\n                                {\n                                  \"type\": \"null\"\n                                }\n                              ]\n                            },\n                            \"valid_until\": {\n                              \"anyOf\": [\n                                {\n                                  \"type\": \"string\",\n                                  \"format\": \"date-time\",\n                                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                                },\n                                {\n                                  \"type\": \"null\"\n                                }\n                              ]\n                            }\n                          },\n                          \"required\": [\n                            \"valid_from\",\n                            \"valid_until\"\n                          ],\n                          \"additionalProperties\": false\n                        },\n                        \"category\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"user_supplied\",\n                            \"activity\",\n                            \"observation\",\n                            \"inference\"\n                          ]\n                        },\n                        \"evidence_refs\": {\n                          \"maxItems\": 32,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"minLength\": 1,\n                            \"maxLength\": 256\n                          }\n                        },\n                        \"operation\": {\n                          \"type\": \"string\",\n                          \"const\": \"create\"\n                        }\n                      },\n                      \"required\": [\n                        \"event_id\",\n                        \"occurred_at\",\n                        \"stream_id\",\n                        \"domain\",\n                        \"key\",\n                        \"value_type\",\n                        \"value\",\n                        \"context_kind\",\n                        \"temporal\",\n                        \"category\",\n                        \"evidence_refs\",\n                        \"operation\"\n                      ],\n                      \"additionalProperties\": false\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"event_id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                        },\n                        \"occurred_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        \"stream_id\": {\n                          \"type\": \"string\",\n                          \"format\": \"uuid\",\n                          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                        },\n                        \"domain\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        \"key\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        \"value_type\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"text\",\n                            \"number\",\n                            \"boolean\",\n                            \"enum\",\n                            \"list\",\n                            \"coded\",\n                            \"coded_list\",\n                            \"date\",\n                            \"date_range\",\n                            \"age_band\",\n                            \"person_ref\",\n                            \"structured\",\n                            \"credential\"\n                          ]\n                        },\n                        \"value\": {\n                          \"$ref\": \"#/$defs/__schema0\"\n                        },\n                        \"context_kind\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"fact\",\n                            \"preference\",\n                            \"state\"\n                          ]\n                        },\n                        \"temporal\": {\n                          \"type\": \"object\",\n                          \"properties\": {\n                            \"valid_from\": {\n                              \"anyOf\": [\n                                {\n                                  \"type\": \"string\",\n                                  \"format\": \"date-time\",\n                                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                                },\n                                {\n                                  \"type\": \"null\"\n                                }\n                              ]\n                            },\n                            \"valid_until\": {\n                              \"anyOf\": [\n                                {\n                                  \"type\": \"string\",\n                                  \"format\": \"date-time\",\n                                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                                },\n                                {\n                                  \"type\": \"null\"\n                                }\n                              ]\n                            }\n                          },\n                          \"required\": [\n                            \"valid_from\",\n                            \"valid_until\"\n                          ],\n                          \"additionalProperties\": false\n                        },\n                        \"category\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"user_supplied\",\n                            \"activity\",\n                            \"observation\",\n                            \"inference\"\n                          ]\n                        },\n                        \"evidence_refs\": {\n                          \"maxItems\": 32,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"minLength\": 1,\n                            \"maxLength\": 256\n                          }\n                        },\n                        \"operation\": {\n                          \"type\": \"string\",\n                          \"const\": \"correct\"\n                        },\n                        \"predecessor_event_id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                        }\n                      },\n                      \"required\": [\n                        \"event_id\",\n                        \"occurred_at\",\n                        \"stream_id\",\n                        \"domain\",\n                        \"key\",\n                        \"value_type\",\n                        \"value\",\n                        \"context_kind\",\n                        \"temporal\",\n                        \"category\",\n                        \"evidence_refs\",\n                        \"operation\",\n                        \"predecessor_event_id\"\n                      ],\n                      \"additionalProperties\": false\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"event_id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                        },\n                        \"occurred_at\": {\n                          \"type\": \"string\",\n                          \"format\": \"date-time\",\n                          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                        },\n                        \"stream_id\": {\n                          \"type\": \"string\",\n                          \"format\": \"uuid\",\n                          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                        },\n                        \"operation\": {\n                          \"type\": \"string\",\n                          \"const\": \"withdraw\"\n                        },\n                        \"predecessor_event_id\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                        }\n                      },\n                      \"required\": [\n                        \"event_id\",\n                        \"occurred_at\",\n                        \"stream_id\",\n                        \"operation\",\n                        \"predecessor_event_id\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  ]\n                },\n                \"acknowledgement\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"proposal_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"event_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                    },\n                    \"ingested_at\": {\n                      \"type\": \"string\",\n                      \"format\": \"date-time\",\n                      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                    },\n                    \"status\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"pending\",\n                        \"accepted\",\n                        \"rejected\",\n                        \"withdrawn\"\n                      ]\n                    }\n                  },\n                  \"required\": [\n                    \"proposal_id\",\n                    \"event_id\",\n                    \"ingested_at\",\n                    \"status\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"required\": [\n                \"profile_id\",\n                \"source_client_id\",\n                \"event\",\n                \"acknowledgement\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"unsupported\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"category\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                },\n                \"reason\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 4096\n                }\n              },\n              \"required\": [\n                \"category\",\n                \"reason\"\n              ],\n              \"additionalProperties\": false\n            }\n          },\n          \"proof\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"jws\"\n              },\n              \"alg\": {\n                \"type\": \"string\",\n                \"const\": \"ES256\"\n              },\n              \"kid\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 256\n              },\n              \"jws\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"alg\",\n              \"kid\",\n              \"jws\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"format\",\n          \"exported_at\",\n          \"origin_host\",\n          \"history_mode\",\n          \"partitions\",\n          \"entries\",\n          \"tombstones\",\n          \"grants_history\",\n          \"receipts\",\n          \"log_events\",\n          \"public_keys\",\n          \"policy_history\",\n          \"proposals\",\n          \"unsupported\",\n          \"proof\"\n        ],\n        \"additionalProperties\": false,\n        \"$defs\": {\n          \"__schema0\": {\n            \"anyOf\": [\n              {\n                \"type\": \"string\"\n              },\n              {\n                \"type\": \"number\"\n              },\n              {\n                \"type\": \"boolean\"\n              },\n              {\n                \"type\": \"null\"\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              },\n              {\n                \"type\": \"object\",\n                \"propertyNames\": {\n                  \"type\": \"string\"\n                },\n                \"additionalProperties\": {\n                  \"$ref\": \"#/$defs/__schema0\"\n                }\n              }\n            ]\n          }\n        },\n        \"$id\": \"urn:autonym:schema:export:1.0:0.2-draft\"\n      },\n      \"tombstone\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"version\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"domain\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"key\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"deleted_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"version\",\n          \"profile_id\",\n          \"domain\",\n          \"key\",\n          \"deleted_at\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:tombstone:1.0:0.2-draft\"\n      },\n      \"withdrawal\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"proposal_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          }\n        },\n        \"required\": [\n          \"proposal_id\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:withdrawal:1.0:0.2-draft\"\n      },\n      \"purge-list\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"instructions\": {\n            \"maxItems\": 100,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"pattern\": \"^[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+$\"\n            }\n          }\n        },\n        \"required\": [\n          \"instructions\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:purge-list:1.0:0.2-draft\"\n      },\n      \"grant-offer-request\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"grant_type\": {\n            \"type\": \"string\",\n            \"const\": \"urn:ietf:params:oauth:grant-type:token-exchange\"\n          },\n          \"subject_token\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 16384\n          },\n          \"subject_token_type\": {\n            \"type\": \"string\",\n            \"const\": \"urn:ietf:params:oauth:token-type:access_token\"\n          },\n          \"requested_token_type\": {\n            \"type\": \"string\",\n            \"const\": \"urn:autonym:params:oauth:token-type:grant-offer\"\n          },\n          \"scope\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 8192\n          },\n          \"resource\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          },\n          \"autonym_recipient\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 2048\n          },\n          \"autonym_purpose_text\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 4096\n          },\n          \"autonym_expires_in\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"autonym_max_reads\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          }\n        },\n        \"required\": [\n          \"grant_type\",\n          \"subject_token\",\n          \"subject_token_type\",\n          \"requested_token_type\",\n          \"scope\",\n          \"resource\",\n          \"autonym_recipient\",\n          \"autonym_purpose_text\",\n          \"autonym_expires_in\",\n          \"autonym_max_reads\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:grant-offer-request:1.0:0.2-draft\"\n      },\n      \"grant-offer\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"access_token\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[A-Za-z0-9_-]{43,512}$\"\n          },\n          \"issued_token_type\": {\n            \"type\": \"string\",\n            \"const\": \"urn:autonym:params:oauth:token-type:grant-offer\"\n          },\n          \"token_type\": {\n            \"type\": \"string\",\n            \"const\": \"N_A\"\n          },\n          \"expires_in\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 300\n          }\n        },\n        \"required\": [\n          \"access_token\",\n          \"issued_token_type\",\n          \"token_type\",\n          \"expires_in\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:grant-offer:1.0:0.2-draft\"\n      },\n      \"grant-offer-redemption\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"grant_type\": {\n            \"type\": \"string\",\n            \"const\": \"urn:autonym:params:oauth:grant-type:grant-offer\"\n          },\n          \"grant_code\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[A-Za-z0-9_-]{43,512}$\"\n          },\n          \"resource\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        },\n        \"required\": [\n          \"grant_type\",\n          \"grant_code\",\n          \"resource\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:grant-offer-redemption:1.0:0.2-draft\"\n      },\n      \"encrypted-export-header\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"alg\": {\n            \"type\": \"string\",\n            \"const\": \"dir\"\n          },\n          \"enc\": {\n            \"type\": \"string\",\n            \"const\": \"A256GCM\"\n          },\n          \"typ\": {\n            \"type\": \"string\",\n            \"const\": \"autonym-export+jwe\"\n          },\n          \"cty\": {\n            \"type\": \"string\",\n            \"const\": \"application/autonym-export+json\"\n          },\n          \"crit\": {\n            \"type\": \"array\",\n            \"prefixItems\": [\n              {\n                \"type\": \"string\",\n                \"const\": \"autonym_kdf\"\n              }\n            ],\n            \"items\": false,\n            \"minItems\": 1,\n            \"maxItems\": 1\n          },\n          \"autonym_kdf\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"name\": {\n                \"type\": \"string\",\n                \"const\": \"argon2id\"\n              },\n              \"v\": {\n                \"type\": \"number\",\n                \"const\": 19\n              },\n              \"m\": {\n                \"type\": \"number\",\n                \"const\": 65536\n              },\n              \"t\": {\n                \"type\": \"number\",\n                \"const\": 3\n              },\n              \"p\": {\n                \"type\": \"number\",\n                \"const\": 4\n              },\n              \"salt\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{22}$\"\n              }\n            },\n            \"required\": [\n              \"name\",\n              \"v\",\n              \"m\",\n              \"t\",\n              \"p\",\n              \"salt\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"alg\",\n          \"enc\",\n          \"typ\",\n          \"cty\",\n          \"crit\",\n          \"autonym_kdf\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:encrypted-export-header:1.0:0.2-draft\"\n      },\n      \"lifecycle-request\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"grant_type\": {\n            \"type\": \"string\",\n            \"const\": \"client_credentials\"\n          },\n          \"scope\": {\n            \"type\": \"string\",\n            \"const\": \"autonym:lifecycle:purge\"\n          },\n          \"resource\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        },\n        \"required\": [\n          \"grant_type\",\n          \"scope\",\n          \"resource\"\n        ],\n        \"additionalProperties\": false,\n        \"$id\": \"urn:autonym:schema:lifecycle-request:1.0:0.2-draft\"\n      },\n      \"problem\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"anyOf\": [\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:invalid_scope\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Invalid scope\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 400\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"invalid_scope\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:purpose_missing\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Purpose is required\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 400\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"purpose_missing\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:invalid_request\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Invalid request\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 400\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"invalid_request\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:not_found\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Not found\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 404\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"not_found\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:idempotency_conflict\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Idempotency key already used\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 409\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"idempotency_conflict\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:payload_too_large\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Request too large\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 413\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"payload_too_large\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:rate_limited\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Try again later\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 429\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"rate_limited\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:internal_error\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Request could not be completed\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 500\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"internal_error\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:not_ready\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Service is not ready\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 503\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"not_ready\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:domain_not_granted\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Domain is not granted\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"domain_not_granted\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:level_exceeded\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Disclosure level is not granted\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"level_exceeded\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:grant_revoked\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Grant is no longer active\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"grant_revoked\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:grant_expired\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Grant has expired\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"grant_expired\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:grant_exhausted\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Grant limit reached\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"grant_exhausted\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:dpop_required\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Sender proof is required\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 401\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"dpop_required\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:dpop_invalid\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Sender proof is invalid\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 401\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"dpop_invalid\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:safety_write_forbidden\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"First-party confirmation is required\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"safety_write_forbidden\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:inference_forbidden\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Inference is not permitted\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"inference_forbidden\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:proposal_not_found\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Proposal was not found\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 404\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"proposal_not_found\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:proposal_decided\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Proposal has already been decided\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 409\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"proposal_decided\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:value_rejected\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Value does not match the vocabulary\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 422\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"value_rejected\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:capability_not_granted\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Capability is not granted\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"capability_not_granted\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          },\n          {\n            \"type\": \"object\",\n            \"properties\": {\n              \"type\": {\n                \"type\": \"string\",\n                \"const\": \"urn:autonym:error:advertising_ineligible\"\n              },\n              \"title\": {\n                \"type\": \"string\",\n                \"const\": \"Advertising permission is unavailable\"\n              },\n              \"status\": {\n                \"type\": \"number\",\n                \"const\": 403\n              },\n              \"code\": {\n                \"type\": \"string\",\n                \"const\": \"advertising_ineligible\"\n              },\n              \"request_id\": {\n                \"type\": \"string\",\n                \"format\": \"uuid\",\n                \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n              }\n            },\n            \"required\": [\n              \"type\",\n              \"title\",\n              \"status\",\n              \"code\",\n              \"request_id\"\n            ],\n            \"additionalProperties\": false\n          }\n        ],\n        \"$id\": \"urn:autonym:schema:problem:1.0:0.2-draft\"\n      }\n    },\n    \"securitySchemes\": {\n      \"LifecycleOAuth\": {\n        \"type\": \"oauth2\",\n        \"flows\": {\n          \"clientCredentials\": {\n            \"tokenUrl\": \"https://autonym.example/oauth/token\",\n            \"scopes\": {\n              \"autonym:lifecycle:purge\": \"Only this registered client’s outstanding purge lifecycle\"\n            }\n          }\n        }\n      },\n      \"OAuth\": {\n        \"type\": \"http\",\n        \"scheme\": \"DPoP\",\n        \"bearerFormat\": \"JWT\"\n      },\n      \"DPoP\": {\n        \"type\": \"apiKey\",\n        \"in\": \"header\",\n        \"name\": \"DPoP\"\n      },\n      \"EligibleAssistantBearer\": {\n        \"type\": \"http\",\n        \"scheme\": \"bearer\",\n        \"bearerFormat\": \"JWT\"\n      }\n    }\n  }\n}\n",
    "schemas/capability-claim.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"oneOf\": [\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"autonym_version\": {\n          \"type\": \"string\",\n          \"const\": \"1.0\"\n        },\n        \"document_version\": {\n          \"type\": \"string\",\n          \"const\": \"0.2-draft\"\n        },\n        \"categories\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"domain\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"keys\": {\n                \"minItems\": 1,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                }\n              },\n              \"directions\": {\n                \"minItems\": 1,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"read\",\n                    \"contribute\",\n                    \"export\",\n                    \"import\"\n                  ]\n                }\n              }\n            },\n            \"required\": [\n              \"domain\",\n              \"keys\",\n              \"directions\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"limitations\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 4096\n          }\n        },\n        \"assurance\": {\n          \"type\": \"string\",\n          \"const\": \"self-declared\"\n        },\n        \"evidence\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"check_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 64\n              },\n              \"url\": {\n                \"type\": \"string\",\n                \"format\": \"uri\"\n              },\n              \"tested_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              }\n            },\n            \"required\": [\n              \"check_id\",\n              \"url\",\n              \"tested_at\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"role\": {\n          \"type\": \"string\",\n          \"const\": \"provider\"\n        },\n        \"capabilities\": {\n          \"maxItems\": 4,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"Core\",\n              \"Write\",\n              \"Portable\",\n              \"Delegated\"\n            ]\n          }\n        }\n      },\n      \"required\": [\n        \"autonym_version\",\n        \"document_version\",\n        \"categories\",\n        \"limitations\",\n        \"assurance\",\n        \"evidence\",\n        \"role\",\n        \"capabilities\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"autonym_version\": {\n          \"type\": \"string\",\n          \"const\": \"1.0\"\n        },\n        \"document_version\": {\n          \"type\": \"string\",\n          \"const\": \"0.2-draft\"\n        },\n        \"categories\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"domain\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"keys\": {\n                \"minItems\": 1,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                }\n              },\n              \"directions\": {\n                \"minItems\": 1,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"read\",\n                    \"contribute\",\n                    \"export\",\n                    \"import\"\n                  ]\n                }\n              }\n            },\n            \"required\": [\n              \"domain\",\n              \"keys\",\n              \"directions\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"limitations\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 4096\n          }\n        },\n        \"assurance\": {\n          \"type\": \"string\",\n          \"const\": \"self-declared\"\n        },\n        \"evidence\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"check_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 64\n              },\n              \"url\": {\n                \"type\": \"string\",\n                \"format\": \"uri\"\n              },\n              \"tested_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              }\n            },\n            \"required\": [\n              \"check_id\",\n              \"url\",\n              \"tested_at\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"role\": {\n          \"type\": \"string\",\n          \"const\": \"recipient\"\n        },\n        \"capabilities\": {\n          \"maxItems\": 3,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"Read\",\n              \"Contribute\",\n              \"Reciprocal\"\n            ]\n          }\n        }\n      },\n      \"required\": [\n        \"autonym_version\",\n        \"document_version\",\n        \"categories\",\n        \"limitations\",\n        \"assurance\",\n        \"evidence\",\n        \"role\",\n        \"capabilities\"\n      ],\n      \"additionalProperties\": false\n    }\n  ]\n}\n",
    "schemas/confirmation-result.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"status\": {\n      \"type\": \"string\",\n      \"const\": \"review_required\"\n    },\n    \"review_url\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    }\n  },\n  \"required\": [\n    \"status\",\n    \"review_url\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/confirmation.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"proposal_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    }\n  },\n  \"required\": [\n    \"proposal_id\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/context-request.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"domains\": {\n      \"minItems\": 1,\n      \"maxItems\": 32,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\",\n        \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n      }\n    },\n    \"max_level\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ]\n    },\n    \"keys\": {\n      \"minItems\": 1,\n      \"maxItems\": 128,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\",\n        \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n      }\n    },\n    \"declared_only\": {\n      \"type\": \"boolean\"\n    },\n    \"min_confidence\": {\n      \"type\": \"number\",\n      \"minimum\": 0,\n      \"maximum\": 1\n    },\n    \"since\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    }\n  },\n  \"required\": [\n    \"domains\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/contribution-event.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"oneOf\": [\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"event_id\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n        },\n        \"occurred_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"stream_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n        },\n        \"domain\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n        },\n        \"key\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n        },\n        \"value_type\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"text\",\n            \"number\",\n            \"boolean\",\n            \"enum\",\n            \"list\",\n            \"coded\",\n            \"coded_list\",\n            \"date\",\n            \"date_range\",\n            \"age_band\",\n            \"person_ref\",\n            \"structured\",\n            \"credential\"\n          ]\n        },\n        \"value\": {\n          \"$ref\": \"#/$defs/__schema0\"\n        },\n        \"context_kind\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"fact\",\n            \"preference\",\n            \"state\"\n          ]\n        },\n        \"temporal\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"valid_from\": {\n              \"anyOf\": [\n                {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\",\n                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                },\n                {\n                  \"type\": \"null\"\n                }\n              ]\n            },\n            \"valid_until\": {\n              \"anyOf\": [\n                {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\",\n                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                },\n                {\n                  \"type\": \"null\"\n                }\n              ]\n            }\n          },\n          \"required\": [\n            \"valid_from\",\n            \"valid_until\"\n          ],\n          \"additionalProperties\": false\n        },\n        \"category\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"user_supplied\",\n            \"activity\",\n            \"observation\",\n            \"inference\"\n          ]\n        },\n        \"evidence_refs\": {\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 256\n          }\n        },\n        \"operation\": {\n          \"type\": \"string\",\n          \"const\": \"create\"\n        }\n      },\n      \"required\": [\n        \"event_id\",\n        \"occurred_at\",\n        \"stream_id\",\n        \"domain\",\n        \"key\",\n        \"value_type\",\n        \"value\",\n        \"context_kind\",\n        \"temporal\",\n        \"category\",\n        \"evidence_refs\",\n        \"operation\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"event_id\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n        },\n        \"occurred_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"stream_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n        },\n        \"domain\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n        },\n        \"key\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n        },\n        \"value_type\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"text\",\n            \"number\",\n            \"boolean\",\n            \"enum\",\n            \"list\",\n            \"coded\",\n            \"coded_list\",\n            \"date\",\n            \"date_range\",\n            \"age_band\",\n            \"person_ref\",\n            \"structured\",\n            \"credential\"\n          ]\n        },\n        \"value\": {\n          \"$ref\": \"#/$defs/__schema0\"\n        },\n        \"context_kind\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"fact\",\n            \"preference\",\n            \"state\"\n          ]\n        },\n        \"temporal\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"valid_from\": {\n              \"anyOf\": [\n                {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\",\n                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                },\n                {\n                  \"type\": \"null\"\n                }\n              ]\n            },\n            \"valid_until\": {\n              \"anyOf\": [\n                {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\",\n                  \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                },\n                {\n                  \"type\": \"null\"\n                }\n              ]\n            }\n          },\n          \"required\": [\n            \"valid_from\",\n            \"valid_until\"\n          ],\n          \"additionalProperties\": false\n        },\n        \"category\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"user_supplied\",\n            \"activity\",\n            \"observation\",\n            \"inference\"\n          ]\n        },\n        \"evidence_refs\": {\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 256\n          }\n        },\n        \"operation\": {\n          \"type\": \"string\",\n          \"const\": \"correct\"\n        },\n        \"predecessor_event_id\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n        }\n      },\n      \"required\": [\n        \"event_id\",\n        \"occurred_at\",\n        \"stream_id\",\n        \"domain\",\n        \"key\",\n        \"value_type\",\n        \"value\",\n        \"context_kind\",\n        \"temporal\",\n        \"category\",\n        \"evidence_refs\",\n        \"operation\",\n        \"predecessor_event_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"event_id\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n        },\n        \"occurred_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"stream_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n        },\n        \"operation\": {\n          \"type\": \"string\",\n          \"const\": \"withdraw\"\n        },\n        \"predecessor_event_id\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n        }\n      },\n      \"required\": [\n        \"event_id\",\n        \"occurred_at\",\n        \"stream_id\",\n        \"operation\",\n        \"predecessor_event_id\"\n      ],\n      \"additionalProperties\": false\n    }\n  ],\n  \"$defs\": {\n    \"__schema0\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\"\n        },\n        {\n          \"type\": \"number\"\n        },\n        {\n          \"type\": \"boolean\"\n        },\n        {\n          \"type\": \"null\"\n        },\n        {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        },\n        {\n          \"type\": \"object\",\n          \"propertyNames\": {\n            \"type\": \"string\"\n          },\n          \"additionalProperties\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        }\n      ]\n    }\n  }\n}\n",
    "schemas/disclosure.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"autonym_version\": {\n      \"type\": \"string\",\n      \"const\": \"1.0\"\n    },\n    \"provider\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"audience\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"client_id\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 2048\n    },\n    \"handle\": {\n      \"type\": \"string\",\n      \"maxLength\": 294,\n      \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n    },\n    \"grant_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"grant_revision\": {\n      \"type\": \"integer\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991\n    },\n    \"read_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"purpose\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"booking\",\n        \"recommendation\",\n        \"safety\",\n        \"fulfilment\",\n        \"personalisation\",\n        \"research\",\n        \"care\",\n        \"medical\",\n        \"employment\",\n        \"advertising\"\n      ]\n    },\n    \"issued_at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"valid_until\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"ttl_seconds\": {\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 300\n    },\n    \"persist_until\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"entries\": {\n      \"maxItems\": 1000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^rent_[a-z2-7]{52}$\"\n          },\n          \"version\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"domain\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"key\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"level\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"L0\",\n              \"L1\",\n              \"L2\",\n              \"L3\"\n            ]\n          },\n          \"value_type\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"text\",\n              \"number\",\n              \"boolean\",\n              \"enum\",\n              \"list\",\n              \"coded\",\n              \"coded_list\",\n              \"date\",\n              \"date_range\",\n              \"age_band\",\n              \"person_ref\",\n              \"structured\",\n              \"credential\"\n            ]\n          },\n          \"value\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          },\n          \"context_kind\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"fact\",\n              \"preference\",\n              \"state\"\n            ]\n          },\n          \"safety_critical\": {\n            \"type\": \"boolean\"\n          },\n          \"provenance\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"declared\",\n                  \"observed\",\n                  \"derived\",\n                  \"attested\"\n                ]\n              },\n              \"confirmed\": {\n                \"type\": \"boolean\"\n              }\n            },\n            \"required\": [\n              \"kind\",\n              \"confirmed\"\n            ],\n            \"additionalProperties\": false\n          },\n          \"stale\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"version\",\n          \"domain\",\n          \"key\",\n          \"level\",\n          \"value_type\",\n          \"value\",\n          \"context_kind\",\n          \"safety_critical\",\n          \"provenance\",\n          \"stale\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"proof\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"jws\"\n        },\n        \"alg\": {\n          \"type\": \"string\",\n          \"const\": \"ES256\"\n        },\n        \"kid\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 256\n        },\n        \"jws\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"alg\",\n        \"kid\",\n        \"jws\"\n      ],\n      \"additionalProperties\": false\n    }\n  },\n  \"required\": [\n    \"autonym_version\",\n    \"provider\",\n    \"audience\",\n    \"client_id\",\n    \"handle\",\n    \"grant_id\",\n    \"grant_revision\",\n    \"read_id\",\n    \"purpose\",\n    \"issued_at\",\n    \"valid_until\",\n    \"ttl_seconds\",\n    \"persist_until\",\n    \"entries\",\n    \"proof\"\n  ],\n  \"additionalProperties\": false,\n  \"$defs\": {\n    \"__schema0\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\"\n        },\n        {\n          \"type\": \"number\"\n        },\n        {\n          \"type\": \"boolean\"\n        },\n        {\n          \"type\": \"null\"\n        },\n        {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        },\n        {\n          \"type\": \"object\",\n          \"propertyNames\": {\n            \"type\": \"string\"\n          },\n          \"additionalProperties\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        }\n      ]\n    }\n  }\n}\n",
    "schemas/discovery.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"autonym_version\": {\n      \"type\": \"string\",\n      \"const\": \"1.0\"\n    },\n    \"issuer\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"authorization_server\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"jwks_uri\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"rest_endpoint\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"format\": \"uri\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"mcp_endpoint\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"format\": \"uri\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"capabilities\": {\n      \"oneOf\": [\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"autonym_version\": {\n              \"type\": \"string\",\n              \"const\": \"1.0\"\n            },\n            \"document_version\": {\n              \"type\": \"string\",\n              \"const\": \"0.2-draft\"\n            },\n            \"categories\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"domain\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  },\n                  \"keys\": {\n                    \"minItems\": 1,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    }\n                  },\n                  \"directions\": {\n                    \"minItems\": 1,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"read\",\n                        \"contribute\",\n                        \"export\",\n                        \"import\"\n                      ]\n                    }\n                  }\n                },\n                \"required\": [\n                  \"domain\",\n                  \"keys\",\n                  \"directions\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"limitations\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 4096\n              }\n            },\n            \"assurance\": {\n              \"type\": \"string\",\n              \"const\": \"self-declared\"\n            },\n            \"evidence\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"check_id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 64\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\"\n                  },\n                  \"tested_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  }\n                },\n                \"required\": [\n                  \"check_id\",\n                  \"url\",\n                  \"tested_at\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"role\": {\n              \"type\": \"string\",\n              \"const\": \"provider\"\n            },\n            \"capabilities\": {\n              \"maxItems\": 4,\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"Core\",\n                  \"Write\",\n                  \"Portable\",\n                  \"Delegated\"\n                ]\n              }\n            }\n          },\n          \"required\": [\n            \"autonym_version\",\n            \"document_version\",\n            \"categories\",\n            \"limitations\",\n            \"assurance\",\n            \"evidence\",\n            \"role\",\n            \"capabilities\"\n          ],\n          \"additionalProperties\": false\n        },\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"autonym_version\": {\n              \"type\": \"string\",\n              \"const\": \"1.0\"\n            },\n            \"document_version\": {\n              \"type\": \"string\",\n              \"const\": \"0.2-draft\"\n            },\n            \"categories\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"domain\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  },\n                  \"keys\": {\n                    \"minItems\": 1,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    }\n                  },\n                  \"directions\": {\n                    \"minItems\": 1,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"read\",\n                        \"contribute\",\n                        \"export\",\n                        \"import\"\n                      ]\n                    }\n                  }\n                },\n                \"required\": [\n                  \"domain\",\n                  \"keys\",\n                  \"directions\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"limitations\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 4096\n              }\n            },\n            \"assurance\": {\n              \"type\": \"string\",\n              \"const\": \"self-declared\"\n            },\n            \"evidence\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"check_id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 64\n                  },\n                  \"url\": {\n                    \"type\": \"string\",\n                    \"format\": \"uri\"\n                  },\n                  \"tested_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  }\n                },\n                \"required\": [\n                  \"check_id\",\n                  \"url\",\n                  \"tested_at\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"role\": {\n              \"type\": \"string\",\n              \"const\": \"recipient\"\n            },\n            \"capabilities\": {\n              \"maxItems\": 3,\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"Read\",\n                  \"Contribute\",\n                  \"Reciprocal\"\n                ]\n              }\n            }\n          },\n          \"required\": [\n            \"autonym_version\",\n            \"document_version\",\n            \"categories\",\n            \"limitations\",\n            \"assurance\",\n            \"evidence\",\n            \"role\",\n            \"capabilities\"\n          ],\n          \"additionalProperties\": false\n        }\n      ]\n    }\n  },\n  \"required\": [\n    \"autonym_version\",\n    \"issuer\",\n    \"authorization_server\",\n    \"jwks_uri\",\n    \"rest_endpoint\",\n    \"mcp_endpoint\",\n    \"capabilities\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/domain-list.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"domains\": {\n      \"maxItems\": 32,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"domain\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"max_level\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"L0\",\n              \"L1\",\n              \"L2\",\n              \"L3\"\n            ]\n          },\n          \"keys\": {\n            \"maxItems\": 128,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n            }\n          }\n        },\n        \"required\": [\n          \"domain\",\n          \"max_level\",\n          \"keys\"\n        ],\n        \"additionalProperties\": false\n      }\n    }\n  },\n  \"required\": [\n    \"domains\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/encrypted-export-header.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"alg\": {\n      \"type\": \"string\",\n      \"const\": \"dir\"\n    },\n    \"enc\": {\n      \"type\": \"string\",\n      \"const\": \"A256GCM\"\n    },\n    \"typ\": {\n      \"type\": \"string\",\n      \"const\": \"autonym-export+jwe\"\n    },\n    \"cty\": {\n      \"type\": \"string\",\n      \"const\": \"application/autonym-export+json\"\n    },\n    \"crit\": {\n      \"type\": \"array\",\n      \"prefixItems\": [\n        {\n          \"type\": \"string\",\n          \"const\": \"autonym_kdf\"\n        }\n      ],\n      \"items\": false,\n      \"minItems\": 1,\n      \"maxItems\": 1\n    },\n    \"autonym_kdf\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\",\n          \"const\": \"argon2id\"\n        },\n        \"v\": {\n          \"type\": \"number\",\n          \"const\": 19\n        },\n        \"m\": {\n          \"type\": \"number\",\n          \"const\": 65536\n        },\n        \"t\": {\n          \"type\": \"number\",\n          \"const\": 3\n        },\n        \"p\": {\n          \"type\": \"number\",\n          \"const\": 4\n        },\n        \"salt\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]{22}$\"\n        }\n      },\n      \"required\": [\n        \"name\",\n        \"v\",\n        \"m\",\n        \"t\",\n        \"p\",\n        \"salt\"\n      ],\n      \"additionalProperties\": false\n    }\n  },\n  \"required\": [\n    \"alg\",\n    \"enc\",\n    \"typ\",\n    \"cty\",\n    \"crit\",\n    \"autonym_kdf\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/entry.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"version\": {\n      \"type\": \"integer\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991\n    },\n    \"profile_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"domain\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n    },\n    \"key\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n    },\n    \"value_type\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"text\",\n        \"number\",\n        \"boolean\",\n        \"enum\",\n        \"list\",\n        \"coded\",\n        \"coded_list\",\n        \"date\",\n        \"date_range\",\n        \"age_band\",\n        \"person_ref\",\n        \"structured\",\n        \"credential\"\n      ]\n    },\n    \"value\": {\n      \"$ref\": \"#/$defs/__schema0\"\n    },\n    \"context_kind\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"fact\",\n        \"preference\",\n        \"state\"\n      ]\n    },\n    \"provenance\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"kind\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"declared\",\n            \"observed\",\n            \"derived\",\n            \"attested\"\n          ]\n        },\n        \"source_client_id\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"minLength\": 1,\n              \"maxLength\": 2048\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"source_event_id\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"minLength\": 1,\n              \"maxLength\": 128\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"recorded_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"occurred_at\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"format\": \"date-time\",\n              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"confidence\": {\n          \"anyOf\": [\n            {\n              \"type\": \"number\",\n              \"minimum\": 0,\n              \"maximum\": 1\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"confirmed_at\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"format\": \"date-time\",\n              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"evidence_refs\": {\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 256\n          }\n        },\n        \"derived_from\": {\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"entry_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"version\": {\n                \"type\": \"integer\",\n                \"exclusiveMinimum\": 0,\n                \"maximum\": 9007199254740991\n              },\n              \"level\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"L0\",\n                  \"L1\",\n                  \"L2\",\n                  \"L3\"\n                ]\n              },\n              \"fields\": {\n                \"minItems\": 1,\n                \"maxItems\": 64,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"maxLength\": 256\n                }\n              }\n            },\n            \"required\": [\n              \"entry_id\",\n              \"version\",\n              \"level\",\n              \"fields\"\n            ],\n            \"additionalProperties\": false\n          }\n        }\n      },\n      \"required\": [\n        \"kind\",\n        \"source_client_id\",\n        \"source_event_id\",\n        \"recorded_at\",\n        \"occurred_at\",\n        \"confidence\",\n        \"confirmed_at\",\n        \"evidence_refs\",\n        \"derived_from\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"temporal\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"valid_from\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"format\": \"date-time\",\n              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"valid_until\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"format\": \"date-time\",\n              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        }\n      },\n      \"required\": [\n        \"valid_from\",\n        \"valid_until\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"overlay\": {\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"target_entry_id\": {\n              \"type\": \"string\",\n              \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n            },\n            \"enabled\": {\n              \"type\": \"boolean\"\n            },\n            \"selected\": {\n              \"type\": \"boolean\"\n            }\n          },\n          \"required\": [\n            \"target_entry_id\",\n            \"enabled\",\n            \"selected\"\n          ],\n          \"additionalProperties\": false\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"rendering_overrides\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"L1\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 4096\n        }\n      },\n      \"additionalProperties\": false\n    },\n    \"status\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"active\",\n        \"superseded\",\n        \"archived\"\n      ]\n    },\n    \"created_at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"updated_at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"origin_host\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    }\n  },\n  \"required\": [\n    \"id\",\n    \"version\",\n    \"profile_id\",\n    \"domain\",\n    \"key\",\n    \"value_type\",\n    \"value\",\n    \"context_kind\",\n    \"provenance\",\n    \"temporal\",\n    \"overlay\",\n    \"rendering_overrides\",\n    \"status\",\n    \"created_at\",\n    \"updated_at\",\n    \"origin_host\"\n  ],\n  \"additionalProperties\": false,\n  \"$defs\": {\n    \"__schema0\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\"\n        },\n        {\n          \"type\": \"number\"\n        },\n        {\n          \"type\": \"boolean\"\n        },\n        {\n          \"type\": \"null\"\n        },\n        {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        },\n        {\n          \"type\": \"object\",\n          \"propertyNames\": {\n            \"type\": \"string\"\n          },\n          \"additionalProperties\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        }\n      ]\n    }\n  }\n}\n",
    "schemas/export.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"format\": {\n      \"type\": \"string\",\n      \"const\": \"autonym-export/1.0\"\n    },\n    \"exported_at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"origin_host\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"history_mode\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"current\",\n        \"all_retained\"\n      ]\n    },\n    \"partitions\": {\n      \"maxItems\": 100,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"label\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 4096\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"label\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"entries\": {\n      \"maxItems\": 100000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"version\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"domain\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"key\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"value_type\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"text\",\n              \"number\",\n              \"boolean\",\n              \"enum\",\n              \"list\",\n              \"coded\",\n              \"coded_list\",\n              \"date\",\n              \"date_range\",\n              \"age_band\",\n              \"person_ref\",\n              \"structured\",\n              \"credential\"\n            ]\n          },\n          \"value\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          },\n          \"context_kind\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"fact\",\n              \"preference\",\n              \"state\"\n            ]\n          },\n          \"provenance\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"declared\",\n                  \"observed\",\n                  \"derived\",\n                  \"attested\"\n                ]\n              },\n              \"source_client_id\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 2048\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"source_event_id\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 128\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"recorded_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"occurred_at\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"confidence\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"confirmed_at\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"evidence_refs\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"minLength\": 1,\n                  \"maxLength\": 256\n                }\n              },\n              \"derived_from\": {\n                \"maxItems\": 32,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"entry_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"version\": {\n                      \"type\": \"integer\",\n                      \"exclusiveMinimum\": 0,\n                      \"maximum\": 9007199254740991\n                    },\n                    \"level\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"L0\",\n                        \"L1\",\n                        \"L2\",\n                        \"L3\"\n                      ]\n                    },\n                    \"fields\": {\n                      \"minItems\": 1,\n                      \"maxItems\": 64,\n                      \"type\": \"array\",\n                      \"items\": {\n                        \"type\": \"string\",\n                        \"maxLength\": 256\n                      }\n                    }\n                  },\n                  \"required\": [\n                    \"entry_id\",\n                    \"version\",\n                    \"level\",\n                    \"fields\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              }\n            },\n            \"required\": [\n              \"kind\",\n              \"source_client_id\",\n              \"source_event_id\",\n              \"recorded_at\",\n              \"occurred_at\",\n              \"confidence\",\n              \"confirmed_at\",\n              \"evidence_refs\",\n              \"derived_from\"\n            ],\n            \"additionalProperties\": false\n          },\n          \"temporal\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"valid_from\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"valid_until\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              }\n            },\n            \"required\": [\n              \"valid_from\",\n              \"valid_until\"\n            ],\n            \"additionalProperties\": false\n          },\n          \"overlay\": {\n            \"anyOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"target_entry_id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                  },\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"selected\": {\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"required\": [\n                  \"target_entry_id\",\n                  \"enabled\",\n                  \"selected\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"null\"\n              }\n            ]\n          },\n          \"rendering_overrides\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"L1\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 4096\n              }\n            },\n            \"additionalProperties\": false\n          },\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"active\",\n              \"superseded\",\n              \"archived\"\n            ]\n          },\n          \"created_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"updated_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"origin_host\": {\n            \"type\": \"string\",\n            \"format\": \"uri\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"version\",\n          \"profile_id\",\n          \"domain\",\n          \"key\",\n          \"value_type\",\n          \"value\",\n          \"context_kind\",\n          \"provenance\",\n          \"temporal\",\n          \"overlay\",\n          \"rendering_overrides\",\n          \"status\",\n          \"created_at\",\n          \"updated_at\",\n          \"origin_host\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"tombstones\": {\n      \"maxItems\": 100000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"version\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"domain\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"key\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"deleted_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          }\n        },\n        \"required\": [\n          \"id\",\n          \"version\",\n          \"profile_id\",\n          \"domain\",\n          \"key\",\n          \"deleted_at\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"grants_history\": {\n      \"maxItems\": 100000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"grant\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                  },\n                  \"revision\": {\n                    \"type\": \"integer\",\n                    \"exclusiveMinimum\": 0,\n                    \"maximum\": 9007199254740991\n                  },\n                  \"handle\": {\n                    \"type\": \"string\",\n                    \"maxLength\": 294,\n                    \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n                  },\n                  \"client_id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 2048\n                  },\n                  \"purpose\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"category\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"booking\",\n                          \"recommendation\",\n                          \"safety\",\n                          \"fulfilment\",\n                          \"personalisation\",\n                          \"research\",\n                          \"care\",\n                          \"medical\",\n                          \"employment\",\n                          \"advertising\"\n                        ]\n                      },\n                      \"text\": {\n                        \"type\": \"string\",\n                        \"minLength\": 1,\n                        \"maxLength\": 4096\n                      }\n                    },\n                    \"required\": [\n                      \"category\",\n                      \"text\"\n                    ],\n                    \"additionalProperties\": false\n                  },\n                  \"issued_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  \"expires_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  \"status\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"active\",\n                      \"revoked\",\n                      \"expired\"\n                    ]\n                  },\n                  \"kind\": {\n                    \"type\": \"string\",\n                    \"const\": \"read\"\n                  },\n                  \"read\": {\n                    \"minItems\": 1,\n                    \"maxItems\": 32,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"domain\": {\n                          \"anyOf\": [\n                            {\n                              \"type\": \"string\",\n                              \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                            },\n                            {\n                              \"type\": \"string\",\n                              \"const\": \"*\"\n                            }\n                          ]\n                        },\n                        \"keys\": {\n                          \"anyOf\": [\n                            {\n                              \"minItems\": 1,\n                              \"maxItems\": 128,\n                              \"type\": \"array\",\n                              \"items\": {\n                                \"type\": \"string\",\n                                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                              }\n                            },\n                            {\n                              \"type\": \"null\"\n                            }\n                          ]\n                        },\n                        \"max_level\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"L0\",\n                            \"L1\",\n                            \"L2\",\n                            \"L3\"\n                          ]\n                        }\n                      },\n                      \"required\": [\n                        \"domain\",\n                        \"keys\",\n                        \"max_level\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"declared_only\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"min_confidence\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"max_reads\": {\n                    \"type\": \"integer\",\n                    \"exclusiveMinimum\": 0,\n                    \"maximum\": 100000\n                  },\n                  \"reads_used\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0,\n                    \"maximum\": 9007199254740991\n                  },\n                  \"persist_until\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"format\": \"date-time\",\n                        \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"allow_delegation\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"onward_share\": {\n                    \"type\": \"boolean\",\n                    \"const\": false\n                  }\n                },\n                \"required\": [\n                  \"id\",\n                  \"revision\",\n                  \"handle\",\n                  \"client_id\",\n                  \"purpose\",\n                  \"issued_at\",\n                  \"expires_at\",\n                  \"status\",\n                  \"kind\",\n                  \"read\",\n                  \"declared_only\",\n                  \"min_confidence\",\n                  \"max_reads\",\n                  \"reads_used\",\n                  \"persist_until\",\n                  \"allow_delegation\",\n                  \"onward_share\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                  },\n                  \"revision\": {\n                    \"type\": \"integer\",\n                    \"exclusiveMinimum\": 0,\n                    \"maximum\": 9007199254740991\n                  },\n                  \"handle\": {\n                    \"type\": \"string\",\n                    \"maxLength\": 294,\n                    \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n                  },\n                  \"client_id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 2048\n                  },\n                  \"purpose\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"category\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"booking\",\n                          \"recommendation\",\n                          \"safety\",\n                          \"fulfilment\",\n                          \"personalisation\",\n                          \"research\",\n                          \"care\",\n                          \"medical\",\n                          \"employment\",\n                          \"advertising\"\n                        ]\n                      },\n                      \"text\": {\n                        \"type\": \"string\",\n                        \"minLength\": 1,\n                        \"maxLength\": 4096\n                      }\n                    },\n                    \"required\": [\n                      \"category\",\n                      \"text\"\n                    ],\n                    \"additionalProperties\": false\n                  },\n                  \"issued_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  \"expires_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  \"status\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"active\",\n                      \"revoked\",\n                      \"expired\"\n                    ]\n                  },\n                  \"kind\": {\n                    \"type\": \"string\",\n                    \"const\": \"contribute\"\n                  },\n                  \"contribute\": {\n                    \"minItems\": 1,\n                    \"maxItems\": 32,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"object\",\n                      \"properties\": {\n                        \"domain\": {\n                          \"type\": \"string\",\n                          \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                        },\n                        \"keys\": {\n                          \"minItems\": 1,\n                          \"maxItems\": 128,\n                          \"type\": \"array\",\n                          \"items\": {\n                            \"type\": \"string\",\n                            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                          }\n                        }\n                      },\n                      \"required\": [\n                        \"domain\",\n                        \"keys\"\n                      ],\n                      \"additionalProperties\": false\n                    }\n                  },\n                  \"max_events\": {\n                    \"type\": \"integer\",\n                    \"exclusiveMinimum\": 0,\n                    \"maximum\": 100000\n                  },\n                  \"events_used\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0,\n                    \"maximum\": 9007199254740991\n                  },\n                  \"allow_confirmation\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"stream_id\": {\n                    \"type\": \"string\",\n                    \"format\": \"uuid\",\n                    \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                  }\n                },\n                \"required\": [\n                  \"id\",\n                  \"revision\",\n                  \"handle\",\n                  \"client_id\",\n                  \"purpose\",\n                  \"issued_at\",\n                  \"expires_at\",\n                  \"status\",\n                  \"kind\",\n                  \"contribute\",\n                  \"max_events\",\n                  \"events_used\",\n                  \"allow_confirmation\",\n                  \"stream_id\"\n                ],\n                \"additionalProperties\": false\n              }\n            ]\n          }\n        },\n        \"required\": [\n          \"profile_id\",\n          \"grant\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"receipts\": {\n      \"maxItems\": 100000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"receipt\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"read_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"grant_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"client_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 2048\n              },\n              \"at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"purpose\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"booking\",\n                  \"recommendation\",\n                  \"safety\",\n                  \"fulfilment\",\n                  \"personalisation\",\n                  \"research\",\n                  \"care\",\n                  \"medical\",\n                  \"employment\",\n                  \"advertising\"\n                ]\n              },\n              \"surface\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"rest\",\n                  \"mcp_tool\",\n                  \"mcp_resource\",\n                  \"mcp_briefing\"\n                ]\n              },\n              \"request\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"domains\": {\n                    \"minItems\": 1,\n                    \"maxItems\": 32,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    }\n                  },\n                  \"max_level\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"L0\",\n                      \"L1\",\n                      \"L2\",\n                      \"L3\"\n                    ]\n                  },\n                  \"keys\": {\n                    \"minItems\": 1,\n                    \"maxItems\": 128,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    }\n                  },\n                  \"declared_only\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"min_confidence\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"since\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  }\n                },\n                \"required\": [\n                  \"domains\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"returned\": {\n                \"maxItems\": 1000,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\",\n                  \"properties\": {\n                    \"entry_id\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n                    },\n                    \"version\": {\n                      \"type\": \"integer\",\n                      \"exclusiveMinimum\": 0,\n                      \"maximum\": 9007199254740991\n                    },\n                    \"level\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"L0\",\n                        \"L1\",\n                        \"L2\",\n                        \"L3\"\n                      ]\n                    }\n                  },\n                  \"required\": [\n                    \"entry_id\",\n                    \"version\",\n                    \"level\"\n                  ],\n                  \"additionalProperties\": false\n                }\n              },\n              \"response_hash\": {\n                \"type\": \"string\",\n                \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n              },\n              \"prev_hash\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"hash\": {\n                \"type\": \"string\",\n                \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n              },\n              \"proof\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"jws\"\n                  },\n                  \"alg\": {\n                    \"type\": \"string\",\n                    \"const\": \"ES256\"\n                  },\n                  \"kid\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 256\n                  },\n                  \"jws\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n                  }\n                },\n                \"required\": [\n                  \"type\",\n                  \"alg\",\n                  \"kid\",\n                  \"jws\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"read_id\",\n              \"grant_id\",\n              \"client_id\",\n              \"at\",\n              \"purpose\",\n              \"surface\",\n              \"request\",\n              \"returned\",\n              \"response_hash\",\n              \"prev_hash\",\n              \"hash\",\n              \"proof\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"profile_id\",\n          \"receipt\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"log_events\": {\n      \"maxItems\": 100000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"event\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"kind\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"grant_created\",\n                  \"grant_revoked\",\n                  \"grant_expired\",\n                  \"rule_applied\",\n                  \"delegation_redeemed\",\n                  \"proposal_decided\",\n                  \"overlay_enabled\",\n                  \"overlay_disabled\",\n                  \"overlay_selected\",\n                  \"read_not_modified\",\n                  \"purge_issued\",\n                  \"purge_acknowledged\",\n                  \"operator_action\",\n                  \"migration_imported\"\n                ]\n              },\n              \"actor_client_id\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"minLength\": 1,\n                    \"maxLength\": 2048\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"subject_id\": {\n                \"type\": \"string\",\n                \"minLength\": 1,\n                \"maxLength\": 256\n              },\n              \"details\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"decision\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"approved\",\n                          \"rejected\",\n                          \"enabled\",\n                          \"disabled\",\n                          \"selected\",\n                          \"unchanged\",\n                          \"completed\",\n                          \"failed\"\n                        ]\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  },\n                  \"ids\": {\n                    \"maxItems\": 32,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 256\n                    }\n                  },\n                  \"response_hash\": {\n                    \"anyOf\": [\n                      {\n                        \"type\": \"string\",\n                        \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                      },\n                      {\n                        \"type\": \"null\"\n                      }\n                    ]\n                  }\n                },\n                \"required\": [\n                  \"decision\",\n                  \"ids\",\n                  \"response_hash\"\n                ],\n                \"additionalProperties\": false\n              },\n              \"prev_hash\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"hash\": {\n                \"type\": \"string\",\n                \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n              }\n            },\n            \"required\": [\n              \"event_id\",\n              \"at\",\n              \"kind\",\n              \"actor_client_id\",\n              \"subject_id\",\n              \"details\",\n              \"prev_hash\",\n              \"hash\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"profile_id\",\n          \"event\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"public_keys\": {\n      \"maxItems\": 100,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"kty\": {\n            \"type\": \"string\",\n            \"const\": \"EC\"\n          },\n          \"crv\": {\n            \"type\": \"string\",\n            \"const\": \"P-256\"\n          },\n          \"x\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[A-Za-z0-9_-]{43}$\"\n          },\n          \"y\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[A-Za-z0-9_-]{43}$\"\n          },\n          \"kid\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 256\n          },\n          \"alg\": {\n            \"type\": \"string\",\n            \"const\": \"ES256\"\n          },\n          \"use\": {\n            \"type\": \"string\",\n            \"const\": \"sig\"\n          }\n        },\n        \"required\": [\n          \"kty\",\n          \"crv\",\n          \"x\",\n          \"y\",\n          \"kid\",\n          \"alg\",\n          \"use\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"policy_history\": {\n      \"maxItems\": 10000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"id\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 256\n          },\n          \"kind\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"rule\",\n              \"delegation\"\n            ]\n          },\n          \"executable\": {\n            \"type\": \"boolean\",\n            \"const\": false\n          },\n          \"description\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 4096\n          },\n          \"related_grant_ids\": {\n            \"maxItems\": 1000,\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\",\n              \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n            }\n          }\n        },\n        \"required\": [\n          \"profile_id\",\n          \"id\",\n          \"kind\",\n          \"executable\",\n          \"description\",\n          \"related_grant_ids\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"proposals\": {\n      \"maxItems\": 100000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"profile_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"source_client_id\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 2048\n          },\n          \"event\": {\n            \"oneOf\": [\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"event_id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                  },\n                  \"occurred_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  \"stream_id\": {\n                    \"type\": \"string\",\n                    \"format\": \"uuid\",\n                    \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                  },\n                  \"domain\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  },\n                  \"key\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  },\n                  \"value_type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"text\",\n                      \"number\",\n                      \"boolean\",\n                      \"enum\",\n                      \"list\",\n                      \"coded\",\n                      \"coded_list\",\n                      \"date\",\n                      \"date_range\",\n                      \"age_band\",\n                      \"person_ref\",\n                      \"structured\",\n                      \"credential\"\n                    ]\n                  },\n                  \"value\": {\n                    \"$ref\": \"#/$defs/__schema0\"\n                  },\n                  \"context_kind\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"fact\",\n                      \"preference\",\n                      \"state\"\n                    ]\n                  },\n                  \"temporal\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"valid_from\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\",\n                            \"format\": \"date-time\",\n                            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                          },\n                          {\n                            \"type\": \"null\"\n                          }\n                        ]\n                      },\n                      \"valid_until\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\",\n                            \"format\": \"date-time\",\n                            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                          },\n                          {\n                            \"type\": \"null\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\n                      \"valid_from\",\n                      \"valid_until\"\n                    ],\n                    \"additionalProperties\": false\n                  },\n                  \"category\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"user_supplied\",\n                      \"activity\",\n                      \"observation\",\n                      \"inference\"\n                    ]\n                  },\n                  \"evidence_refs\": {\n                    \"maxItems\": 32,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 256\n                    }\n                  },\n                  \"operation\": {\n                    \"type\": \"string\",\n                    \"const\": \"create\"\n                  }\n                },\n                \"required\": [\n                  \"event_id\",\n                  \"occurred_at\",\n                  \"stream_id\",\n                  \"domain\",\n                  \"key\",\n                  \"value_type\",\n                  \"value\",\n                  \"context_kind\",\n                  \"temporal\",\n                  \"category\",\n                  \"evidence_refs\",\n                  \"operation\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"event_id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                  },\n                  \"occurred_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  \"stream_id\": {\n                    \"type\": \"string\",\n                    \"format\": \"uuid\",\n                    \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                  },\n                  \"domain\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  },\n                  \"key\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  },\n                  \"value_type\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"text\",\n                      \"number\",\n                      \"boolean\",\n                      \"enum\",\n                      \"list\",\n                      \"coded\",\n                      \"coded_list\",\n                      \"date\",\n                      \"date_range\",\n                      \"age_band\",\n                      \"person_ref\",\n                      \"structured\",\n                      \"credential\"\n                    ]\n                  },\n                  \"value\": {\n                    \"$ref\": \"#/$defs/__schema0\"\n                  },\n                  \"context_kind\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"fact\",\n                      \"preference\",\n                      \"state\"\n                    ]\n                  },\n                  \"temporal\": {\n                    \"type\": \"object\",\n                    \"properties\": {\n                      \"valid_from\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\",\n                            \"format\": \"date-time\",\n                            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                          },\n                          {\n                            \"type\": \"null\"\n                          }\n                        ]\n                      },\n                      \"valid_until\": {\n                        \"anyOf\": [\n                          {\n                            \"type\": \"string\",\n                            \"format\": \"date-time\",\n                            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                          },\n                          {\n                            \"type\": \"null\"\n                          }\n                        ]\n                      }\n                    },\n                    \"required\": [\n                      \"valid_from\",\n                      \"valid_until\"\n                    ],\n                    \"additionalProperties\": false\n                  },\n                  \"category\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"user_supplied\",\n                      \"activity\",\n                      \"observation\",\n                      \"inference\"\n                    ]\n                  },\n                  \"evidence_refs\": {\n                    \"maxItems\": 32,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"minLength\": 1,\n                      \"maxLength\": 256\n                    }\n                  },\n                  \"operation\": {\n                    \"type\": \"string\",\n                    \"const\": \"correct\"\n                  },\n                  \"predecessor_event_id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                  }\n                },\n                \"required\": [\n                  \"event_id\",\n                  \"occurred_at\",\n                  \"stream_id\",\n                  \"domain\",\n                  \"key\",\n                  \"value_type\",\n                  \"value\",\n                  \"context_kind\",\n                  \"temporal\",\n                  \"category\",\n                  \"evidence_refs\",\n                  \"operation\",\n                  \"predecessor_event_id\"\n                ],\n                \"additionalProperties\": false\n              },\n              {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"event_id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                  },\n                  \"occurred_at\": {\n                    \"type\": \"string\",\n                    \"format\": \"date-time\",\n                    \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n                  },\n                  \"stream_id\": {\n                    \"type\": \"string\",\n                    \"format\": \"uuid\",\n                    \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n                  },\n                  \"operation\": {\n                    \"type\": \"string\",\n                    \"const\": \"withdraw\"\n                  },\n                  \"predecessor_event_id\": {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n                  }\n                },\n                \"required\": [\n                  \"event_id\",\n                  \"occurred_at\",\n                  \"stream_id\",\n                  \"operation\",\n                  \"predecessor_event_id\"\n                ],\n                \"additionalProperties\": false\n              }\n            ]\n          },\n          \"acknowledgement\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"proposal_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n              },\n              \"event_id\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n              },\n              \"ingested_at\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\",\n                \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n              },\n              \"status\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"pending\",\n                  \"accepted\",\n                  \"rejected\",\n                  \"withdrawn\"\n                ]\n              }\n            },\n            \"required\": [\n              \"proposal_id\",\n              \"event_id\",\n              \"ingested_at\",\n              \"status\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"required\": [\n          \"profile_id\",\n          \"source_client_id\",\n          \"event\",\n          \"acknowledgement\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"unsupported\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"category\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          },\n          \"reason\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 4096\n          }\n        },\n        \"required\": [\n          \"category\",\n          \"reason\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"proof\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"jws\"\n        },\n        \"alg\": {\n          \"type\": \"string\",\n          \"const\": \"ES256\"\n        },\n        \"kid\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 256\n        },\n        \"jws\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"alg\",\n        \"kid\",\n        \"jws\"\n      ],\n      \"additionalProperties\": false\n    }\n  },\n  \"required\": [\n    \"format\",\n    \"exported_at\",\n    \"origin_host\",\n    \"history_mode\",\n    \"partitions\",\n    \"entries\",\n    \"tombstones\",\n    \"grants_history\",\n    \"receipts\",\n    \"log_events\",\n    \"public_keys\",\n    \"policy_history\",\n    \"proposals\",\n    \"unsupported\",\n    \"proof\"\n  ],\n  \"additionalProperties\": false,\n  \"$defs\": {\n    \"__schema0\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\"\n        },\n        {\n          \"type\": \"number\"\n        },\n        {\n          \"type\": \"boolean\"\n        },\n        {\n          \"type\": \"null\"\n        },\n        {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        },\n        {\n          \"type\": \"object\",\n          \"propertyNames\": {\n            \"type\": \"string\"\n          },\n          \"additionalProperties\": {\n            \"$ref\": \"#/$defs/__schema0\"\n          }\n        }\n      ]\n    }\n  }\n}\n",
    "schemas/grant-offer-redemption.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"grant_type\": {\n      \"type\": \"string\",\n      \"const\": \"urn:autonym:params:oauth:grant-type:grant-offer\"\n    },\n    \"grant_code\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[A-Za-z0-9_-]{43,512}$\"\n    },\n    \"resource\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    }\n  },\n  \"required\": [\n    \"grant_type\",\n    \"grant_code\",\n    \"resource\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/grant-offer-request.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"grant_type\": {\n      \"type\": \"string\",\n      \"const\": \"urn:ietf:params:oauth:grant-type:token-exchange\"\n    },\n    \"subject_token\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 16384\n    },\n    \"subject_token_type\": {\n      \"type\": \"string\",\n      \"const\": \"urn:ietf:params:oauth:token-type:access_token\"\n    },\n    \"requested_token_type\": {\n      \"type\": \"string\",\n      \"const\": \"urn:autonym:params:oauth:token-type:grant-offer\"\n    },\n    \"scope\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 8192\n    },\n    \"resource\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"autonym_recipient\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 2048\n    },\n    \"autonym_purpose_text\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 4096\n    },\n    \"autonym_expires_in\": {\n      \"type\": \"integer\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991\n    },\n    \"autonym_max_reads\": {\n      \"type\": \"integer\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991\n    }\n  },\n  \"required\": [\n    \"grant_type\",\n    \"subject_token\",\n    \"subject_token_type\",\n    \"requested_token_type\",\n    \"scope\",\n    \"resource\",\n    \"autonym_recipient\",\n    \"autonym_purpose_text\",\n    \"autonym_expires_in\",\n    \"autonym_max_reads\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/grant-offer.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"access_token\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[A-Za-z0-9_-]{43,512}$\"\n    },\n    \"issued_token_type\": {\n      \"type\": \"string\",\n      \"const\": \"urn:autonym:params:oauth:token-type:grant-offer\"\n    },\n    \"token_type\": {\n      \"type\": \"string\",\n      \"const\": \"N_A\"\n    },\n    \"expires_in\": {\n      \"type\": \"integer\",\n      \"minimum\": 1,\n      \"maximum\": 300\n    }\n  },\n  \"required\": [\n    \"access_token\",\n    \"issued_token_type\",\n    \"token_type\",\n    \"expires_in\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/grant.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"oneOf\": [\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"type\": \"string\",\n          \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n        },\n        \"revision\": {\n          \"type\": \"integer\",\n          \"exclusiveMinimum\": 0,\n          \"maximum\": 9007199254740991\n        },\n        \"handle\": {\n          \"type\": \"string\",\n          \"maxLength\": 294,\n          \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n        },\n        \"client_id\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 2048\n        },\n        \"purpose\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"category\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"booking\",\n                \"recommendation\",\n                \"safety\",\n                \"fulfilment\",\n                \"personalisation\",\n                \"research\",\n                \"care\",\n                \"medical\",\n                \"employment\",\n                \"advertising\"\n              ]\n            },\n            \"text\": {\n              \"type\": \"string\",\n              \"minLength\": 1,\n              \"maxLength\": 4096\n            }\n          },\n          \"required\": [\n            \"category\",\n            \"text\"\n          ],\n          \"additionalProperties\": false\n        },\n        \"issued_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"expires_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"status\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"active\",\n            \"revoked\",\n            \"expired\"\n          ]\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"const\": \"read\"\n        },\n        \"read\": {\n          \"minItems\": 1,\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"domain\": {\n                \"anyOf\": [\n                  {\n                    \"type\": \"string\",\n                    \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                  },\n                  {\n                    \"type\": \"string\",\n                    \"const\": \"*\"\n                  }\n                ]\n              },\n              \"keys\": {\n                \"anyOf\": [\n                  {\n                    \"minItems\": 1,\n                    \"maxItems\": 128,\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                    }\n                  },\n                  {\n                    \"type\": \"null\"\n                  }\n                ]\n              },\n              \"max_level\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"L0\",\n                  \"L1\",\n                  \"L2\",\n                  \"L3\"\n                ]\n              }\n            },\n            \"required\": [\n              \"domain\",\n              \"keys\",\n              \"max_level\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"declared_only\": {\n          \"type\": \"boolean\"\n        },\n        \"min_confidence\": {\n          \"type\": \"number\",\n          \"minimum\": 0,\n          \"maximum\": 1\n        },\n        \"max_reads\": {\n          \"type\": \"integer\",\n          \"exclusiveMinimum\": 0,\n          \"maximum\": 100000\n        },\n        \"reads_used\": {\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"maximum\": 9007199254740991\n        },\n        \"persist_until\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"format\": \"date-time\",\n              \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"allow_delegation\": {\n          \"type\": \"boolean\"\n        },\n        \"onward_share\": {\n          \"type\": \"boolean\",\n          \"const\": false\n        }\n      },\n      \"required\": [\n        \"id\",\n        \"revision\",\n        \"handle\",\n        \"client_id\",\n        \"purpose\",\n        \"issued_at\",\n        \"expires_at\",\n        \"status\",\n        \"kind\",\n        \"read\",\n        \"declared_only\",\n        \"min_confidence\",\n        \"max_reads\",\n        \"reads_used\",\n        \"persist_until\",\n        \"allow_delegation\",\n        \"onward_share\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"type\": \"string\",\n          \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n        },\n        \"revision\": {\n          \"type\": \"integer\",\n          \"exclusiveMinimum\": 0,\n          \"maximum\": 9007199254740991\n        },\n        \"handle\": {\n          \"type\": \"string\",\n          \"maxLength\": 294,\n          \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n        },\n        \"client_id\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 2048\n        },\n        \"purpose\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"category\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"booking\",\n                \"recommendation\",\n                \"safety\",\n                \"fulfilment\",\n                \"personalisation\",\n                \"research\",\n                \"care\",\n                \"medical\",\n                \"employment\",\n                \"advertising\"\n              ]\n            },\n            \"text\": {\n              \"type\": \"string\",\n              \"minLength\": 1,\n              \"maxLength\": 4096\n            }\n          },\n          \"required\": [\n            \"category\",\n            \"text\"\n          ],\n          \"additionalProperties\": false\n        },\n        \"issued_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"expires_at\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        \"status\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"active\",\n            \"revoked\",\n            \"expired\"\n          ]\n        },\n        \"kind\": {\n          \"type\": \"string\",\n          \"const\": \"contribute\"\n        },\n        \"contribute\": {\n          \"minItems\": 1,\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"domain\": {\n                \"type\": \"string\",\n                \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n              },\n              \"keys\": {\n                \"minItems\": 1,\n                \"maxItems\": 128,\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n                }\n              }\n            },\n            \"required\": [\n              \"domain\",\n              \"keys\"\n            ],\n            \"additionalProperties\": false\n          }\n        },\n        \"max_events\": {\n          \"type\": \"integer\",\n          \"exclusiveMinimum\": 0,\n          \"maximum\": 100000\n        },\n        \"events_used\": {\n          \"type\": \"integer\",\n          \"minimum\": 0,\n          \"maximum\": 9007199254740991\n        },\n        \"allow_confirmation\": {\n          \"type\": \"boolean\"\n        },\n        \"stream_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$\"\n        }\n      },\n      \"required\": [\n        \"id\",\n        \"revision\",\n        \"handle\",\n        \"client_id\",\n        \"purpose\",\n        \"issued_at\",\n        \"expires_at\",\n        \"status\",\n        \"kind\",\n        \"contribute\",\n        \"max_events\",\n        \"events_used\",\n        \"allow_confirmation\",\n        \"stream_id\"\n      ],\n      \"additionalProperties\": false\n    }\n  ]\n}\n",
    "schemas/health.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"status\": {\n      \"type\": \"string\",\n      \"const\": \"ok\"\n    }\n  },\n  \"required\": [\n    \"status\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/identifier.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"anyOf\": [\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^acc_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^rec_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^cl_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^pi_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^rule_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^dp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^imp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^exp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    }\n  ]\n}\n",
    "schemas/lifecycle-request.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"grant_type\": {\n      \"type\": \"string\",\n      \"const\": \"client_credentials\"\n    },\n    \"scope\": {\n      \"type\": \"string\",\n      \"const\": \"autonym:lifecycle:purge\"\n    },\n    \"resource\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    }\n  },\n  \"required\": [\n    \"grant_type\",\n    \"scope\",\n    \"resource\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/log-event.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"event_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"kind\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"grant_created\",\n        \"grant_revoked\",\n        \"grant_expired\",\n        \"rule_applied\",\n        \"delegation_redeemed\",\n        \"proposal_decided\",\n        \"overlay_enabled\",\n        \"overlay_disabled\",\n        \"overlay_selected\",\n        \"read_not_modified\",\n        \"purge_issued\",\n        \"purge_acknowledged\",\n        \"operator_action\",\n        \"migration_imported\"\n      ]\n    },\n    \"actor_client_id\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 2048\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"subject_id\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 256\n    },\n    \"details\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"decision\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"enum\": [\n                \"approved\",\n                \"rejected\",\n                \"enabled\",\n                \"disabled\",\n                \"selected\",\n                \"unchanged\",\n                \"completed\",\n                \"failed\"\n              ]\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        },\n        \"ids\": {\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 256\n          }\n        },\n        \"response_hash\": {\n          \"anyOf\": [\n            {\n              \"type\": \"string\",\n              \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n            },\n            {\n              \"type\": \"null\"\n            }\n          ]\n        }\n      },\n      \"required\": [\n        \"decision\",\n        \"ids\",\n        \"response_hash\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"prev_hash\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"hash\": {\n      \"type\": \"string\",\n      \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n    }\n  },\n  \"required\": [\n    \"event_id\",\n    \"at\",\n    \"kind\",\n    \"actor_client_id\",\n    \"subject_id\",\n    \"details\",\n    \"prev_hash\",\n    \"hash\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/problem.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"anyOf\": [\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:invalid_scope\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Invalid scope\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 400\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"invalid_scope\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:purpose_missing\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Purpose is required\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 400\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"purpose_missing\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:invalid_request\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Invalid request\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 400\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"invalid_request\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:not_found\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Not found\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 404\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"not_found\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:idempotency_conflict\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Idempotency key already used\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 409\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"idempotency_conflict\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:payload_too_large\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Request too large\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 413\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"payload_too_large\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:rate_limited\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Try again later\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 429\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"rate_limited\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:internal_error\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Request could not be completed\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 500\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"internal_error\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:not_ready\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Service is not ready\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 503\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"not_ready\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:domain_not_granted\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Domain is not granted\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"domain_not_granted\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:level_exceeded\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Disclosure level is not granted\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"level_exceeded\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:grant_revoked\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Grant is no longer active\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"grant_revoked\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:grant_expired\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Grant has expired\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"grant_expired\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:grant_exhausted\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Grant limit reached\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"grant_exhausted\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:dpop_required\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Sender proof is required\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 401\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"dpop_required\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:dpop_invalid\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Sender proof is invalid\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 401\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"dpop_invalid\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:safety_write_forbidden\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"First-party confirmation is required\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"safety_write_forbidden\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:inference_forbidden\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Inference is not permitted\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"inference_forbidden\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:proposal_not_found\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Proposal was not found\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 404\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"proposal_not_found\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:proposal_decided\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Proposal has already been decided\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 409\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"proposal_decided\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:value_rejected\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Value does not match the vocabulary\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 422\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"value_rejected\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:capability_not_granted\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Capability is not granted\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"capability_not_granted\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    },\n    {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"urn:autonym:error:advertising_ineligible\"\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"const\": \"Advertising permission is unavailable\"\n        },\n        \"status\": {\n          \"type\": \"number\",\n          \"const\": 403\n        },\n        \"code\": {\n          \"type\": \"string\",\n          \"const\": \"advertising_ineligible\"\n        },\n        \"request_id\": {\n          \"type\": \"string\",\n          \"format\": \"uuid\",\n          \"pattern\": \"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"title\",\n        \"status\",\n        \"code\",\n        \"request_id\"\n      ],\n      \"additionalProperties\": false\n    }\n  ]\n}\n",
    "schemas/proposal-status.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"proposal_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"event_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[A-Za-z0-9_-]{1,128}$\"\n    },\n    \"ingested_at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"status\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"pending\",\n        \"accepted\",\n        \"rejected\",\n        \"withdrawn\"\n      ]\n    }\n  },\n  \"required\": [\n    \"proposal_id\",\n    \"event_id\",\n    \"ingested_at\",\n    \"status\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/purge-ack.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"instruction_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^pi_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"attestation\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"purged\",\n        \"not_held\",\n        \"legal_hold\"\n      ]\n    },\n    \"at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"note\": {\n      \"type\": \"string\",\n      \"maxLength\": 2048\n    },\n    \"proof\": {\n      \"anyOf\": [\n        {\n          \"type\": \"object\",\n          \"properties\": {\n            \"type\": {\n              \"type\": \"string\",\n              \"const\": \"jws\"\n            },\n            \"alg\": {\n              \"type\": \"string\",\n              \"const\": \"ES256\"\n            },\n            \"kid\": {\n              \"type\": \"string\",\n              \"minLength\": 1,\n              \"maxLength\": 256\n            },\n            \"jws\": {\n              \"type\": \"string\",\n              \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n            }\n          },\n          \"required\": [\n            \"type\",\n            \"alg\",\n            \"kid\",\n            \"jws\"\n          ],\n          \"additionalProperties\": false\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    }\n  },\n  \"required\": [\n    \"instruction_id\",\n    \"attestation\",\n    \"at\",\n    \"note\",\n    \"proof\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/purge-instruction.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"iss\": {\n      \"type\": \"string\",\n      \"format\": \"uri\"\n    },\n    \"sub\": {\n      \"type\": \"string\",\n      \"maxLength\": 294,\n      \"pattern\": \"^autonym:[a-z2-7]{32}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$\"\n    },\n    \"aud\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 2048\n    },\n    \"jti\": {\n      \"type\": \"string\",\n      \"pattern\": \"^pi_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"iat\": {\n      \"type\": \"integer\",\n      \"minimum\": 0,\n      \"maximum\": 9007199254740991\n    },\n    \"exp\": {\n      \"type\": \"integer\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991\n    },\n    \"autonym_grant_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"reason\": {\n      \"type\": \"string\",\n      \"const\": \"grant_ended\"\n    },\n    \"scope\": {\n      \"type\": \"string\",\n      \"const\": \"all\"\n    },\n    \"deadline\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    }\n  },\n  \"required\": [\n    \"iss\",\n    \"sub\",\n    \"aud\",\n    \"jti\",\n    \"iat\",\n    \"exp\",\n    \"autonym_grant_id\",\n    \"reason\",\n    \"scope\",\n    \"deadline\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/purge-list.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"instructions\": {\n      \"maxItems\": 100,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\",\n        \"pattern\": \"^[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+\\\\.[A-Za-z0-9_-]+$\"\n      }\n    }\n  },\n  \"required\": [\n    \"instructions\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/readiness.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"status\": {\n      \"type\": \"string\",\n      \"const\": \"ready\"\n    }\n  },\n  \"required\": [\n    \"status\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/receipt.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"event_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^evt_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"read_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^rd_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"grant_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^gr_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"client_id\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 2048\n    },\n    \"at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    },\n    \"purpose\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"booking\",\n        \"recommendation\",\n        \"safety\",\n        \"fulfilment\",\n        \"personalisation\",\n        \"research\",\n        \"care\",\n        \"medical\",\n        \"employment\",\n        \"advertising\"\n      ]\n    },\n    \"surface\": {\n      \"type\": \"string\",\n      \"enum\": [\n        \"rest\",\n        \"mcp_tool\",\n        \"mcp_resource\",\n        \"mcp_briefing\"\n      ]\n    },\n    \"request\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"domains\": {\n          \"minItems\": 1,\n          \"maxItems\": 32,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          }\n        },\n        \"max_level\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"L0\",\n            \"L1\",\n            \"L2\",\n            \"L3\"\n          ]\n        },\n        \"keys\": {\n          \"minItems\": 1,\n          \"maxItems\": 128,\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\",\n            \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n          }\n        },\n        \"declared_only\": {\n          \"type\": \"boolean\"\n        },\n        \"min_confidence\": {\n          \"type\": \"number\",\n          \"minimum\": 0,\n          \"maximum\": 1\n        },\n        \"since\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        }\n      },\n      \"required\": [\n        \"domains\"\n      ],\n      \"additionalProperties\": false\n    },\n    \"returned\": {\n      \"maxItems\": 1000,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"entry_id\": {\n            \"type\": \"string\",\n            \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n          },\n          \"version\": {\n            \"type\": \"integer\",\n            \"exclusiveMinimum\": 0,\n            \"maximum\": 9007199254740991\n          },\n          \"level\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"L0\",\n              \"L1\",\n              \"L2\",\n              \"L3\"\n            ]\n          }\n        },\n        \"required\": [\n          \"entry_id\",\n          \"version\",\n          \"level\"\n        ],\n        \"additionalProperties\": false\n      }\n    },\n    \"response_hash\": {\n      \"type\": \"string\",\n      \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n    },\n    \"prev_hash\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"hash\": {\n      \"type\": \"string\",\n      \"pattern\": \"^sha256:[a-f0-9]{64}$\"\n    },\n    \"proof\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"type\": \"string\",\n          \"const\": \"jws\"\n        },\n        \"alg\": {\n          \"type\": \"string\",\n          \"const\": \"ES256\"\n        },\n        \"kid\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 256\n        },\n        \"jws\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[A-Za-z0-9_-]+\\\\.\\\\.[A-Za-z0-9_-]+$\"\n        }\n      },\n      \"required\": [\n        \"type\",\n        \"alg\",\n        \"kid\",\n        \"jws\"\n      ],\n      \"additionalProperties\": false\n    }\n  },\n  \"required\": [\n    \"event_id\",\n    \"read_id\",\n    \"grant_id\",\n    \"client_id\",\n    \"at\",\n    \"purpose\",\n    \"surface\",\n    \"request\",\n    \"returned\",\n    \"response_hash\",\n    \"prev_hash\",\n    \"hash\",\n    \"proof\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/scope-token.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"anyOf\": [\n    {\n      \"type\": \"string\",\n      \"pattern\": \"^autonym:read:(?:[A-Za-z0-9_.-]{1,128}:L[0-3]|\\\\*:L0)(?::declared)?(?![\\\\s\\\\S])\"\n    },\n    {\n      \"type\": \"string\",\n      \"enum\": [\n        \"autonym:propose\",\n        \"autonym:confirm\",\n        \"autonym:confirm:safety\",\n        \"autonym:write:declared\",\n        \"autonym:persist\",\n        \"autonym:delegate\",\n        \"autonym:log:read\",\n        \"autonym:manage\"\n      ]\n    },\n    {\n      \"type\": \"string\",\n      \"enum\": [\n        \"autonym:purpose:booking\",\n        \"autonym:purpose:recommendation\",\n        \"autonym:purpose:safety\",\n        \"autonym:purpose:fulfilment\",\n        \"autonym:purpose:personalisation\",\n        \"autonym:purpose:research\",\n        \"autonym:purpose:care\",\n        \"autonym:purpose:medical\",\n        \"autonym:purpose:employment\",\n        \"autonym:purpose:advertising\"\n      ]\n    }\n  ],\n  \"description\": \"One scope token. A grant scope set also requires parseScopes semantic validation.\"\n}\n",
    "schemas/temporal.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"valid_from\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    },\n    \"valid_until\": {\n      \"anyOf\": [\n        {\n          \"type\": \"string\",\n          \"format\": \"date-time\",\n          \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n        },\n        {\n          \"type\": \"null\"\n        }\n      ]\n    }\n  },\n  \"required\": [\n    \"valid_from\",\n    \"valid_until\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/tombstone.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^ent_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"version\": {\n      \"type\": \"integer\",\n      \"exclusiveMinimum\": 0,\n      \"maximum\": 9007199254740991\n    },\n    \"profile_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^prf_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    },\n    \"domain\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n    },\n    \"key\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z][a-z0-9_.-]{0,63}$\"\n    },\n    \"deleted_at\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\",\n      \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n    }\n  },\n  \"required\": [\n    \"id\",\n    \"version\",\n    \"profile_id\",\n    \"domain\",\n    \"key\",\n    \"deleted_at\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "schemas/withdrawal.json": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"proposal_id\": {\n      \"type\": \"string\",\n      \"pattern\": \"^prp_[0-7][0-9A-HJKMNP-TV-Z]{25}(?![\\\\s\\\\S])\"\n    }\n  },\n  \"required\": [\n    \"proposal_id\"\n  ],\n  \"additionalProperties\": false\n}\n",
    "scopes.json": "{\n  \"scope\": \"grammar-only\",\n  \"purposes\": [\n    \"booking\",\n    \"recommendation\",\n    \"safety\",\n    \"fulfilment\",\n    \"personalisation\",\n    \"research\",\n    \"care\",\n    \"medical\",\n    \"employment\",\n    \"advertising\"\n  ],\n  \"capabilities\": [\n    \"autonym:propose\",\n    \"autonym:confirm\",\n    \"autonym:confirm:safety\",\n    \"autonym:write:declared\",\n    \"autonym:persist\",\n    \"autonym:delegate\",\n    \"autonym:log:read\",\n    \"autonym:manage\"\n  ],\n  \"levels\": [\n    \"L0\",\n    \"L1\",\n    \"L2\",\n    \"L3\"\n  ],\n  \"wildcard_max_level\": \"L0\",\n  \"limits\": {\n    \"bytes\": 16384,\n    \"tokens\": 128,\n    \"domain\": 128\n  },\n  \"semantic_contract\": \"scopes.md\",\n  \"recipient_endpoints_implemented\": false\n}\n",
    "scopes.md": "# Scope grammar implementation\n\nThis implements the grammar in [A6.2](06-authorisation.md), not an authorisation server. No recipient route accepts these scopes yet. Scopes from a token MUST NOT replace the stored grant as authority (A6.2; read-path verification remains pending).\n\nThe source of truth is `packages/schema/src/scope/index.ts`. [scopes.json](scopes.json) publishes the closed purpose/capability sets and limits; [scope-token.json](schemas/scope-token.json) validates one token; [examples](examples/scopes.json) are generated and round-trip through the parser. A token schema does not validate a complete grant. Complete sets MUST pass the semantic checks below.\n\n## Parsing and canonical form\n\n`parseScopes(string)` returns a canonical token array; `serialiseScopes(array)` revalidates and joins it. Both MUST reject unknown tokens, trailing content, invalid case and malformed boundaries with `invalid_scope`. No input is trimmed, decoded or case-folded. The separator is exactly one ASCII space. Input is limited to 16,384 ASCII bytes, 128 tokens before deduplication and 128 characters per domain. Non-ASCII input, leading/trailing spaces and all other whitespace are rejected. The domain character alphabet is the published scope grammar, including extension names and exact case. A syntactically valid domain is not automatically a registered vocabulary domain.\n\nExactly one purpose token MUST occur before deduplication. A valid token set without one fails with `purpose_missing`; two occurrences, even identical ones, fail with `invalid_scope`. An empty string also fails with `purpose_missing`. Malformed input is rejected before the purpose count. All ten purposes and eight capability strings are generated from schemas.\n\n`*` MUST appear only on L0 read scopes. No missing domain implies an L0 floor. `ceilingFor(set, domain)` returns the explicit domain ceiling, or L0 for a wildcard, or null. It revalidates the whole set and rejects a wildcard or invalid queried domain. It is a ceiling lookup only: expiry, status, read counters, confidence, purpose, declared-only and every other stored grant restriction are still required before a read.\n\nRead duplicates for the same exact domain and the same declared-only mode MUST collapse to their highest level at the first occurrence's position. Duplicate capabilities collapse to their first occurrence. Explicit domains and `*` remain distinct. Mixed unrestricted and `:declared` reads for the same domain MUST be rejected in this implementation. At grant issuance, any accepted `:declared` modifier makes the entire stored grant `declared_only:true`, including wildcard/explicit-domain combinations. Consent shows this restriction. A person wanting different declaration restrictions uses separate grants. Explicit domain ceilings take precedence over the wildcard L0 ceiling; no declaration restriction is removed. No present code treats a ceiling as permission to disclose an entry.\n\nValidation errors contain a fixed name, registered code and title, never the input or the underlying Zod issues. `invalid_scope` and `purpose_missing` are registered as status 400 Problem Details variants for later routes. The present parser throws `ScopeValidationError` locally; no new HTTP route or OAuth error mapping is introduced.\n\n## Advertising purpose\n\n`autonym:purpose:advertising` is separate from `personalisation` and `recommendation`. The parser MUST preserve that distinction and MUST NOT add read, proposal or persistence capabilities from a purpose alone. A combined advertising and personalisation set MUST be rejected by the one-purpose rule; separate consent requires separate grants. SCOPE-10 checks this grammar boundary. The [scope addendum](18-scope-additions.md) defines the draft consent requirements. Parsing a scope does not establish consent, an eligible domain or permission to disclose.\n\n## Executable checks\n\n`packages/schema/test/scopes.test.ts` supplies SCOPE-01 (source fixture), SCOPE-02 (closed purposes/capabilities), SCOPE-03 (one purpose), SCOPE-04 (wildcard and absence), SCOPE-05 (duplicates and declaration ambiguity), SCOPE-06 (exact parsing), SCOPE-07 (limits and caller boundary validation), SCOPE-08 (10,000 arbitrary inputs) and SCOPE-09 (10,000 valid sets, round trips and ceiling bounds). SCOPE-10 checks the advertising boundary. These are grammar checks, not certification of the A17 recipient capabilities.\n\nRecipient OpenAPI/MCP contracts are now generated, while endpoints and SDK implementations remain pending. Parsing is not an endpoint or a conformance claim. The separate client-lifecycle scope in A6 is not a record-grant scope.\n",
    "source-ambiguities.md": "# Interpretation notes\n\nThis guide links cross-cutting protocol rules to their normative sections. It is informative; the linked requirements define implementation behaviour.\n\n| Topic                                       | Requirement                                                                                              |\n| ------------------------------------------- | -------------------------------------------------------------------------------------------------------- |\n| Handle encoding and derivation              | A3 exact alphabet, JCS domain-separated framing, 32-character new handle, recipient entry aliases        |\n| Request disclosure ceiling                  | A5 single scalar request intersected independently with each grant-domain ceiling                        |\n| Declared-only and confidence combination    | A5 logical OR and maximum threshold                                                                      |\n| Token validity                              | A6 one-hour valid UTC example; complete token rules explicit                                             |\n| Sensitivity and inference                   | A4/A14 prohibit inference for non-inferable, sensitive and safety keys                                   |\n| Vocabulary and rendering                    | Appendix A and generated core.json define all 27 released keys; candidates rejected                      |\n| L1 versus L2 structure                      | A5 identifier-free structure allowed at L1; names only when the key explicitly allows them at L2         |\n| Sparse-level and free-text fallback         | A5 highest supported permitted level; approved text or omission                                          |\n| Signature boundaries                        | A5/A15 exact signed object boundary and representations                                                  |\n| Briefing authority and read count           | A7 shared authorised transaction, both domains required, one read                                        |\n| Advertising policy                          | A18 explicit three-key, adult-only, one-read policy                                                      |\n| Temporal representation                     | A4 explicit kind, interval, overlay target/activation/selection                                          |\n| Contributor identity, correction and replay | A14 strict event schema, authenticated source, stream namespaces and replay rules                        |\n| Role claims and certification               | A17 role/version/category evidence; self-declaration only                                                |\n| Global IDs and migration privacy            | A3 recipient-specific aliases, owner-only canonical IDs, no credential redirects                         |\n| Purge polling after grant expiry            | A10 authenticated client lifecycle channel with no record-read authority                                 |\n| Export encryption and delegated offers      | A11 exact JWE/KDF; A6 exact OAuth exchange/redemption                                                    |\n| Legal equivalence claims                    | A16.1 informative support mapping; A16.2 to A16.8 normative deployment evidence, not legal certification |\n\nSee [conformance status](conformance/README.md) for implementation and test coverage.\n",
    "vocab/core.json": "{\n  \"version\": \"1.0\",\n  \"status\": \"draft\",\n  \"l0_categories\": [\n    \"identity_context\",\n    \"contact_context\",\n    \"household_context\",\n    \"dining_context\",\n    \"health_context\",\n    \"accessibility_context\",\n    \"travel_context\",\n    \"viewing_context\",\n    \"reading_context\",\n    \"music_context\",\n    \"shopping_context\",\n    \"home_context\",\n    \"work_context\",\n    \"finance_context\",\n    \"education_context\",\n    \"communication_context\",\n    \"agent_context\"\n  ],\n  \"keys\": [\n    {\n      \"domain\": \"identity\",\n      \"key\": \"display_name\",\n      \"label\": \"Display name\",\n      \"explanation\": \"The name the person chooses to share\",\n      \"value_type\": \"structured\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"identity_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"first\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 1024\n          },\n          \"full\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 1024\n          }\n        },\n        \"required\": [\n          \"first\",\n          \"full\"\n        ],\n        \"additionalProperties\": false\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"identity_context\"\n        },\n        \"L2\": {\n          \"operation\": \"pick_first\",\n          \"example\": {\n            \"first\": \"Alex\"\n          }\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": {\n            \"first\": \"Alex\",\n            \"full\": \"Alex Example\"\n          }\n        }\n      }\n    },\n    {\n      \"domain\": \"identity\",\n      \"key\": \"age_band\",\n      \"label\": \"Age band\",\n      \"explanation\": \"A broad age range\",\n      \"value_type\": \"age_band\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"identity_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"under_13\",\n          \"13_17\",\n          \"18_24\",\n          \"25_34\",\n          \"35_44\",\n          \"45_54\",\n          \"55_64\",\n          \"65_plus\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"identity_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"35_44\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"35_44\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"35_44\"\n        }\n      }\n    },\n    {\n      \"domain\": \"identity\",\n      \"key\": \"pronouns\",\n      \"label\": \"Pronouns\",\n      \"explanation\": \"How to refer to the person\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"identity_context\",\n      \"safety_critical\": false,\n      \"special_category\": true,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"they_them\",\n          \"she_her\",\n          \"he_him\",\n          \"use_name\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"identity_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"they_them\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"they_them\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"they_them\"\n        }\n      }\n    },\n    {\n      \"domain\": \"contact\",\n      \"key\": \"email\",\n      \"label\": \"Email\",\n      \"explanation\": \"An address explicitly selected for contact\",\n      \"value_type\": \"text\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L3\"\n      ],\n      \"l0_category\": \"contact_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"maxLength\": 254,\n        \"format\": \"email\",\n        \"pattern\": \"^(?:[A-Za-z0-9_'+\\\\-]+\\\\.)*[A-Za-z0-9_'+\\\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\\\-]*\\\\.)+[A-Za-z]{2,}$\"\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"contact_context\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"alex@example.invalid\"\n        }\n      }\n    },\n    {\n      \"domain\": \"household\",\n      \"key\": \"pets\",\n      \"label\": \"Pets\",\n      \"explanation\": \"Animal categories relevant to a request\",\n      \"value_type\": \"list\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"household_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"minItems\": 1,\n        \"maxItems\": 16,\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"cat\",\n            \"dog\",\n            \"bird\",\n            \"fish\",\n            \"small_animal\",\n            \"other\"\n          ]\n        }\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"household_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"cat\"\n          ]\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"cat\"\n          ]\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"cat\"\n          ]\n        }\n      }\n    },\n    {\n      \"domain\": \"dining\",\n      \"key\": \"diet\",\n      \"label\": \"Diet\",\n      \"explanation\": \"A declared food preference without an inferred reason\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"dining_context\",\n      \"safety_critical\": false,\n      \"special_category\": true,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"no_preference\",\n          \"vegetarian\",\n          \"vegan\",\n          \"pescatarian\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"dining_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"vegetarian\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"vegetarian\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"vegetarian\"\n        }\n      }\n    },\n    {\n      \"domain\": \"dining\",\n      \"key\": \"allergy\",\n      \"label\": \"Allergy\",\n      \"explanation\": \"A confirmed allergen and severity\",\n      \"value_type\": \"structured\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"many\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"dining_context\",\n      \"safety_critical\": true,\n      \"special_category\": true,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"allergen\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"celery\",\n              \"cereals_with_gluten\",\n              \"crustaceans\",\n              \"eggs\",\n              \"fish\",\n              \"lupin\",\n              \"milk\",\n              \"molluscs\",\n              \"mustard\",\n              \"peanuts\",\n              \"sesame\",\n              \"soybeans\",\n              \"sulphites\",\n              \"tree_nuts\"\n            ]\n          },\n          \"severity\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"mild\",\n              \"moderate\",\n              \"severe\",\n              \"unknown\"\n            ]\n          }\n        },\n        \"required\": [\n          \"allergen\",\n          \"severity\"\n        ],\n        \"additionalProperties\": false\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"dining_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": {\n            \"allergen\": \"tree_nuts\",\n            \"severity\": \"severe\"\n          }\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": {\n            \"allergen\": \"tree_nuts\",\n            \"severity\": \"severe\"\n          }\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": {\n            \"allergen\": \"tree_nuts\",\n            \"severity\": \"severe\"\n          }\n        }\n      }\n    },\n    {\n      \"domain\": \"dining\",\n      \"key\": \"drink_preference\",\n      \"label\": \"Drink preference\",\n      \"explanation\": \"A drink choice, including a temporary period without alcohol\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"dining_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"no_preference\",\n          \"no_alcohol\",\n          \"water\",\n          \"tea\",\n          \"coffee\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"dining_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"no_alcohol\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"no_alcohol\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"no_alcohol\"\n        }\n      }\n    },\n    {\n      \"domain\": \"dining\",\n      \"key\": \"fasting\",\n      \"label\": \"Fasting\",\n      \"explanation\": \"A person-declared current fasting period without its reason\",\n      \"value_type\": \"boolean\",\n      \"context_kind\": \"state\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"dining_context\",\n      \"safety_critical\": false,\n      \"special_category\": true,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"boolean\"\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"dining_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": true\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": true\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": true\n        }\n      }\n    },\n    {\n      \"domain\": \"dining\",\n      \"key\": \"cuisine_affinity\",\n      \"label\": \"Cuisine preference\",\n      \"explanation\": \"Preferred broad cuisines\",\n      \"value_type\": \"list\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"dining_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"minItems\": 1,\n        \"maxItems\": 16,\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"japanese\",\n            \"levantine\",\n            \"italian\",\n            \"indian\",\n            \"mexican\",\n            \"thai\",\n            \"french\",\n            \"other\"\n          ]\n        }\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"dining_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"japanese\"\n          ]\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"japanese\"\n          ]\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"japanese\"\n          ]\n        }\n      }\n    },\n    {\n      \"domain\": \"health\",\n      \"key\": \"medical_alert\",\n      \"label\": \"Medical alert\",\n      \"explanation\": \"An exact person-confirmed statement for safety\",\n      \"value_type\": \"text\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"many\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"health_context\",\n      \"safety_critical\": true,\n      \"special_category\": true,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"minLength\": 1,\n        \"maxLength\": 1024\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"health_context\"\n        },\n        \"L1\": {\n          \"operation\": \"approved_override_or_omit\",\n          \"example\": \"Ask before making a purchase\"\n        },\n        \"L2\": {\n          \"operation\": \"approved_override_or_omit\",\n          \"example\": \"Ask before making a purchase\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"Synthetic medical alert\"\n        }\n      }\n    },\n    {\n      \"domain\": \"accessibility\",\n      \"key\": \"mobility_need\",\n      \"label\": \"Mobility need\",\n      \"explanation\": \"A confirmed accessibility requirement\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"many\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"accessibility_context\",\n      \"safety_critical\": true,\n      \"special_category\": true,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"step_free\",\n          \"wheelchair_space\",\n          \"short_distances\",\n          \"seated_waiting\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"accessibility_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"step_free\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"step_free\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"step_free\"\n        }\n      }\n    },\n    {\n      \"domain\": \"travel\",\n      \"key\": \"seat_preference\",\n      \"label\": \"Seat preference\",\n      \"explanation\": \"Preferred seating where available\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"travel_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"no_preference\",\n          \"aisle\",\n          \"window\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"travel_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"aisle\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"aisle\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"aisle\"\n        }\n      }\n    },\n    {\n      \"domain\": \"travel\",\n      \"key\": \"trip_context\",\n      \"label\": \"Trip context\",\n      \"explanation\": \"A bounded current travel situation without location\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"state\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"travel_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"holiday\",\n          \"business\",\n          \"family_visit\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"travel_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"holiday\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"holiday\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"holiday\"\n        }\n      }\n    },\n    {\n      \"domain\": \"viewing\",\n      \"key\": \"genre_affinity\",\n      \"label\": \"Viewing genres\",\n      \"explanation\": \"Person-selected broad entertainment genres\",\n      \"value_type\": \"list\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"viewing_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": true,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"minItems\": 1,\n        \"maxItems\": 16,\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"comedy\",\n            \"drama\",\n            \"animation\",\n            \"science_fiction\",\n            \"documentary\",\n            \"adventure\"\n          ]\n        }\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"viewing_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"comedy\"\n          ]\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"comedy\"\n          ]\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"comedy\"\n          ]\n        }\n      }\n    },\n    {\n      \"domain\": \"viewing\",\n      \"key\": \"watched_history\",\n      \"label\": \"Viewing activity\",\n      \"explanation\": \"A single contributed viewing event kept separate from preferences\",\n      \"value_type\": \"structured\",\n      \"context_kind\": \"fact\",\n      \"cardinality\": \"many\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L3\"\n      ],\n      \"l0_category\": \"viewing_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": false,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"object\",\n        \"properties\": {\n          \"title\": {\n            \"type\": \"string\",\n            \"minLength\": 1,\n            \"maxLength\": 1024\n          },\n          \"occurred_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"pattern\": \"^(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))T(?:(?:[01]\\\\d|2[0-3]):[0-5]\\\\d:[0-5]\\\\d(?:\\\\.\\\\d+)?(?:Z))$\"\n          },\n          \"completed\": {\n            \"type\": \"boolean\"\n          }\n        },\n        \"required\": [\n          \"title\",\n          \"occurred_at\",\n          \"completed\"\n        ],\n        \"additionalProperties\": false\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"viewing_context\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": {\n            \"title\": \"Synthetic programme\",\n            \"occurred_at\": \"2026-09-21T00:00:00Z\",\n            \"completed\": true\n          }\n        }\n      }\n    },\n    {\n      \"domain\": \"reading\",\n      \"key\": \"genres\",\n      \"label\": \"Reading genres\",\n      \"explanation\": \"Person-selected broad reading genres\",\n      \"value_type\": \"list\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"reading_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": true,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"minItems\": 1,\n        \"maxItems\": 16,\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"fiction\",\n            \"mystery\",\n            \"adventure\",\n            \"science\",\n            \"biography\"\n          ]\n        }\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"reading_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"mystery\"\n          ]\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"mystery\"\n          ]\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"mystery\"\n          ]\n        }\n      }\n    },\n    {\n      \"domain\": \"music\",\n      \"key\": \"genres\",\n      \"label\": \"Music genres\",\n      \"explanation\": \"Person-selected broad music genres\",\n      \"value_type\": \"list\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"music_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": true,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"minItems\": 1,\n        \"maxItems\": 16,\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"classical\",\n            \"jazz\",\n            \"rock\",\n            \"electronic\",\n            \"pop\",\n            \"folk\"\n          ]\n        }\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"music_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"jazz\"\n          ]\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"jazz\"\n          ]\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": [\n            \"jazz\"\n          ]\n        }\n      }\n    },\n    {\n      \"domain\": \"shopping\",\n      \"key\": \"delivery_preference\",\n      \"label\": \"Delivery preference\",\n      \"explanation\": \"A preferred delivery mode without an address\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"shopping_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"collection\",\n          \"home_delivery\",\n          \"no_preference\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"shopping_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"collection\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"collection\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"collection\"\n        }\n      }\n    },\n    {\n      \"domain\": \"home\",\n      \"key\": \"temperature_preference\",\n      \"label\": \"Temperature preference\",\n      \"explanation\": \"Preferred temperature in degrees Celsius\",\n      \"value_type\": \"number\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"home_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"number\",\n        \"minimum\": 10,\n        \"maximum\": 35\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"home_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": 20\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": 20\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": 20\n        }\n      }\n    },\n    {\n      \"domain\": \"work\",\n      \"key\": \"communication_style\",\n      \"label\": \"Work communication style\",\n      \"explanation\": \"Preferred working communication\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"work_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"written\",\n          \"spoken\",\n          \"brief\",\n          \"detailed\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"work_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"written\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"written\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"written\"\n        }\n      }\n    },\n    {\n      \"domain\": \"finance\",\n      \"key\": \"currency\",\n      \"label\": \"Currency\",\n      \"explanation\": \"Preferred currency; no account or transaction information\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"finance_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"GBP\",\n          \"EUR\",\n          \"USD\",\n          \"CAD\",\n          \"AUD\",\n          \"JPY\",\n          \"CHF\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"finance_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"GBP\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"GBP\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"GBP\"\n        }\n      }\n    },\n    {\n      \"domain\": \"education\",\n      \"key\": \"learning_style\",\n      \"label\": \"Learning preference\",\n      \"explanation\": \"The person’s preferred presentation, not a diagnostic claim\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"education_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"examples\",\n          \"text\",\n          \"audio\",\n          \"diagrams\",\n          \"practice\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"education_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"examples\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"examples\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"examples\"\n        }\n      }\n    },\n    {\n      \"domain\": \"communication\",\n      \"key\": \"tone\",\n      \"label\": \"Tone\",\n      \"explanation\": \"Preferred conversational tone\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"communication_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"neutral\",\n          \"formal\",\n          \"informal\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"communication_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"neutral\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"neutral\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"neutral\"\n        }\n      }\n    },\n    {\n      \"domain\": \"communication\",\n      \"key\": \"preferred_language\",\n      \"label\": \"Preferred language\",\n      \"explanation\": \"A language tag selected by the person\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"communication_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"en-GB\",\n          \"en-US\",\n          \"fr\",\n          \"de\",\n          \"es\",\n          \"it\",\n          \"ja\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"communication_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"en-GB\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"en-GB\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"en-GB\"\n        }\n      }\n    },\n    {\n      \"domain\": \"agent\",\n      \"key\": \"verbosity\",\n      \"label\": \"Verbosity\",\n      \"explanation\": \"Preferred answer length\",\n      \"value_type\": \"enum\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"agent_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"enum\": [\n          \"brief\",\n          \"balanced\",\n          \"detailed\"\n        ]\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"agent_context\"\n        },\n        \"L1\": {\n          \"operation\": \"identity\",\n          \"example\": \"brief\"\n        },\n        \"L2\": {\n          \"operation\": \"identity\",\n          \"example\": \"brief\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"brief\"\n        }\n      }\n    },\n    {\n      \"domain\": \"agent\",\n      \"key\": \"never_do\",\n      \"label\": \"Never do\",\n      \"explanation\": \"A person-confirmed instruction; recipient safety rules still apply\",\n      \"value_type\": \"text\",\n      \"context_kind\": \"preference\",\n      \"cardinality\": \"one\",\n      \"supported_levels\": [\n        \"L0\",\n        \"L1\",\n        \"L2\",\n        \"L3\"\n      ],\n      \"l0_category\": \"agent_context\",\n      \"safety_critical\": false,\n      \"special_category\": false,\n      \"inferable\": true,\n      \"advertising_eligible\": false,\n      \"value_schema\": {\n        \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n        \"type\": \"string\",\n        \"minLength\": 1,\n        \"maxLength\": 1024\n      },\n      \"renderers\": {\n        \"L0\": {\n          \"operation\": \"category\",\n          \"example\": \"agent_context\"\n        },\n        \"L1\": {\n          \"operation\": \"approved_override_or_omit\",\n          \"example\": \"Ask before making a purchase\"\n        },\n        \"L2\": {\n          \"operation\": \"approved_override_or_omit\",\n          \"example\": \"Ask before making a purchase\"\n        },\n        \"L3\": {\n          \"operation\": \"identity\",\n          \"example\": \"Ask before making a purchase\"\n        }\n      }\n    }\n  ]\n}\n"
  }
}
