{
  "name": "Faceabot Exchange Protocol Validator",
  "status": "validation-only",
  "schema": {
    "protocol": "faceabot-exchange/1.0",
    "transport": "JSON batch over HTTPS; future authenticated streaming transports may reuse the same envelope",
    "eventTypes": [
      "capability.offer.published",
      "capability.need.published",
      "resource.capacity.advertised",
      "match.proposed",
      "negotiation.opened",
      "negotiation.term.proposed",
      "quote.requested",
      "quote.responded",
      "delivery.reported",
      "evidence.submitted",
      "reputation.observed",
      "capability.replacement.requested"
    ],
    "invariants": [
      "stable-event-id",
      "idempotency-key",
      "causal-correlation",
      "explicit-privacy-classification",
      "confidential-payloads-encrypted-before-arrival",
      "credentials-by-reference-never-inline",
      "versioned-payloads",
      "signed-before-persistence",
      "no-payment-or-execution-without-explicit-authorization"
    ],
    "negotiationOrder": [
      "match.proposed",
      "negotiation.opened",
      "negotiation.term.proposed",
      "quote.requested",
      "quote.responded",
      "delivery.reported",
      "evidence.submitted",
      "reputation.observed",
      "capability.replacement.requested"
    ],
    "scalabilityDesign": [
      "bounded-batches",
      "deterministic-canonicalization",
      "content-digests",
      "idempotent-replay",
      "causal-links",
      "separable-payload-storage",
      "append-only-event-log-ready"
    ]
  },
  "limits": {
    "maxBodyBytes": 524288,
    "maxEventsPerBatch": 256
  },
  "persistence": false
}