{
  "registry": "uiaf-events",
  "edition": "3.1.1",
  "description": "Sole machine registry of UIAF v3 data-plane event keys, per-event event_data discriminator requirements, the closed session-reason contract, and retired event names. The payload schema's event enum, per-event event_data discriminators, and the uiaf-enums session-reason vocabulary MUST remain in CI-asserted parity with this artifact (no competing event/retired-event source exists).",
  "events": {
    "session": {
      "event_data_required": [
        "reasons"
      ],
      "reasons": [
        "session_open",
        "identity_created",
        "identity_recovered",
        "attribution_touch",
        "consent_change"
      ],
      "reasons_semantics": {
        "description": "Per-value inclusion contract. Each reason is present if and only if its condition holds for this payload; the shared reference validator enforces coherence and rejects any reason whose condition is false and any omission whose condition is true. The empty array is the honest encoding when a session is authorized by a dirty-projection identity transition but none of the five registered conditions holds.",
        "session_open": "Present iff identity.session_start is true (a new session was allocated on this load).",
        "identity_created": "Present iff identity.is_new is true (a brand-new UID was server-issued on this load).",
        "identity_recovered": "Present iff identity.resolution_method is localstorage_recovery or sessionstorage_recovery.",
        "attribution_touch": "Present iff attribution.is_new_touch is true.",
        "consent_change": "Present iff the consent projection component ({signals, status, effective, gpc, source, state_updated_at} — tier and consent_record_id excluded) differs from the stored dirty baseline. Enforced by the validator only when the caller supplies the baseline (opts.consentBaseline); with no baseline available the comparison is impossible and no unconditional check applies."
      }
    },
    "conversion": {
      "event_data_required": [
        "conversion_name",
        "conversion_id"
      ]
    },
    "identify": {
      "event_data_required": [
        "identifiers"
      ]
    }
  },
  "retired_events": [
    "page_view",
    "identity_link",
    "consent_update",
    "data_deletion_request",
    "identity_init",
    "identity_recover",
    "attribution_capture"
  ]
}
