{
  "version": 1,
  "synthetic": true,
  "data_classification": "synthetic",
  "description": "Синтетическая матрица ActionPulse: доверенный источник, source-scoped transport identity, канонический продуктовый факт и частичный отказ пакета.",
  "project_id": 42,
  "identity_version": 2,
  "browser_allowlist": [
    "checkout_started",
    "signup_completed"
  ],
  "identity_vectors": [
    {
      "id": "browser-checkout-business-identity",
      "delivery": {
        "credential_kind": "browser",
        "event": "checkout_started",
        "event_id": "11111111-1111-4111-8111-111111111111",
        "user_id": "demo-user-001",
        "props": {
          "business_event_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
        }
      },
      "expected_ingest_id": "6478d224c43628c5afd6a9bed77bf9c51368187f7398dac538900530fdef27ab",
      "expected_logical_event_id": "129511150e05fe7f5e63ce2765d2dc3f944c425c098d1b65ba676e3893b7f0ce"
    },
    {
      "id": "server-payment-business-identity",
      "delivery": {
        "credential_kind": "server",
        "event": "order_paid",
        "event_id": "22222222-2222-4222-8222-222222222222",
        "user_id": "demo-user-001",
        "props": {
          "business_event_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
        }
      },
      "expected_ingest_id": "d9acd10c8c09965370c0a0daaee87de71ce5d19149185535de099dab3b0f7be3",
      "expected_logical_event_id": "27253eb471150ab083ddccffd0376e67980dce1e4dcdac644f4fc78eedd76ec7"
    },
    {
      "id": "server-checkout-event-fallback",
      "delivery": {
        "credential_kind": "server",
        "event": "checkout_started",
        "event_id": "22222222-2222-4222-8222-222222222222",
        "user_id": "demo-user-001",
        "props": {}
      },
      "expected_ingest_id": "d9acd10c8c09965370c0a0daaee87de71ce5d19149185535de099dab3b0f7be3",
      "expected_logical_event_id": "102f1b8c1404c6ac84a1edb915c8ff85df4a2643afc280871c8c6a5cf16f6f8d"
    }
  ],
  "source_matrix": [
    {
      "event": "checkout_started",
      "credential_kind": "browser",
      "result": "accepted",
      "meaning": "Браузер зафиксировал начало оформления, а не оплату."
    },
    {
      "event": "signup_completed",
      "credential_kind": "browser",
      "result": "accepted",
      "meaning": "Браузер зафиксировал шаг регистрации, а не создание аккаунта."
    },
    {
      "event": "registered",
      "credential_kind": "server",
      "result": "accepted",
      "meaning": "Сервер подтвердил существование аккаунта."
    },
    {
      "event": "order_paid",
      "credential_kind": "server",
      "result": "accepted",
      "meaning": "Сервер подтвердил оплату заказа."
    },
    {
      "event": "payment_succeeded",
      "credential_kind": "server",
      "result": "accepted",
      "meaning": "Сервер подтвердил результат платёжной операции."
    },
    {
      "event": "refund",
      "credential_kind": "server",
      "result": "accepted",
      "meaning": "Сервер подтвердил возврат средств."
    },
    {
      "event": "order_paid",
      "credential_kind": "browser",
      "result": "credential_event_forbidden",
      "meaning": "Браузерный источник не вправе подтверждать оплату."
    }
  ],
  "cases": [
    {
      "id": "same-source-retry",
      "description": "Повтор подтверждённой оплаты с тем же event_id остаётся одним продуктовым фактом.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "server",
          "event": "order_paid",
          "event_id": "11111111-1111-4111-8111-111111111111",
          "user_id": "demo-user-001",
          "props": {}
        },
        {
          "credential_kind": "server",
          "event": "order_paid",
          "event_id": "11111111-1111-4111-8111-111111111111",
          "user_id": "demo-user-001",
          "props": {}
        }
      ],
      "expected": {
        "accepted_deliveries": 2,
        "rejected_deliveries": 0,
        "physical_identities": 1,
        "logical_facts": 1,
        "authoritative_payment_facts": 1,
        "canonical_winners": ["order_paid:server"],
        "rejected_codes": []
      }
    },
    {
      "id": "same-event-id-cross-source",
      "description": "Одинаковый event_id у браузера и сервера создаёт две transport identity; одинаковое имя даёт общий fallback logical ID.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "checkout_started",
          "event_id": "22222222-2222-4222-8222-222222222222",
          "user_id": "demo-user-001",
          "props": {}
        },
        {
          "credential_kind": "server",
          "event": "checkout_started",
          "event_id": "22222222-2222-4222-8222-222222222222",
          "user_id": "demo-user-001",
          "props": {}
        }
      ],
      "expected": {
        "accepted_deliveries": 2,
        "rejected_deliveries": 0,
        "physical_identities": 2,
        "logical_facts": 1,
        "authoritative_payment_facts": 0,
        "canonical_winners": ["checkout_started:server"],
        "rejected_codes": []
      }
    },
    {
      "id": "business-id-server-wins",
      "description": "Один event name и общий корректный business_event_id сводят два источника к серверной канонической версии.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "checkout_started",
          "event_id": "33333333-3333-4333-8333-333333333333",
          "user_id": "demo-user-001",
          "props": {
            "business_event_id": "AAAAAAAA-AAAA-4AAA-8AAA-AAAAAAAAAAAA"
          }
        },
        {
          "credential_kind": "server",
          "event": "checkout_started",
          "event_id": "44444444-4444-4444-8444-444444444444",
          "user_id": "demo-user-001",
          "props": {
            "business_event_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa"
          }
        }
      ],
      "expected": {
        "accepted_deliveries": 2,
        "rejected_deliveries": 0,
        "physical_identities": 2,
        "logical_facts": 1,
        "authoritative_payment_facts": 0,
        "canonical_winners": ["checkout_started:server"],
        "rejected_codes": []
      }
    },
    {
      "id": "checkout-and-confirmed-payment",
      "description": "Общий business_event_id связывает операцию, но checkout_started и order_paid остаются разными фактами.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "checkout_started",
          "event_id": "11111111-1111-4111-8111-111111111111",
          "user_id": "demo-user-001",
          "session_id": "demo-session-001",
          "props": {
            "business_event_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "order_id": "demo-order-001"
          }
        },
        {
          "credential_kind": "server",
          "event": "order_paid",
          "event_id": "22222222-2222-4222-8222-222222222222",
          "user_id": "demo-user-001",
          "session_id": "demo-session-001",
          "props": {
            "business_event_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
            "order_id": "demo-order-001"
          }
        }
      ],
      "expected": {
        "accepted_deliveries": 2,
        "rejected_deliveries": 0,
        "physical_identities": 2,
        "logical_facts": 2,
        "authoritative_payment_facts": 1,
        "canonical_winners": ["checkout_started:browser", "order_paid:server"],
        "rejected_codes": []
      }
    },
    {
      "id": "missing-business-id-duplicates-fact",
      "description": "Разные event_id и отсутствующий business_event_id оставляют два одинаковых по смыслу продуктовых факта.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "checkout_started",
          "event_id": "55555555-5555-4555-8555-555555555555",
          "user_id": "demo-user-001",
          "props": {}
        },
        {
          "credential_kind": "server",
          "event": "checkout_started",
          "event_id": "66666666-6666-4666-8666-666666666666",
          "user_id": "demo-user-001",
          "props": {}
        }
      ],
      "expected": {
        "accepted_deliveries": 2,
        "rejected_deliveries": 0,
        "physical_identities": 2,
        "logical_facts": 2,
        "authoritative_payment_facts": 0,
        "canonical_winners": ["checkout_started:browser", "checkout_started:server"],
        "rejected_codes": []
      }
    },
    {
      "id": "invalid-business-id-does-not-reconcile",
      "description": "Некорректный business_event_id игнорируется: событие не отклоняется, но логического объединения нет.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "checkout_started",
          "event_id": "77777777-7777-4777-8777-777777777777",
          "user_id": "demo-user-001",
          "props": {
            "business_event_id": "demo-order-001"
          }
        },
        {
          "credential_kind": "server",
          "event": "checkout_started",
          "event_id": "88888888-8888-4888-8888-888888888888",
          "user_id": "demo-user-001",
          "props": {
            "business_event_id": "demo-order-001"
          }
        }
      ],
      "expected": {
        "accepted_deliveries": 2,
        "rejected_deliveries": 0,
        "physical_identities": 2,
        "logical_facts": 2,
        "authoritative_payment_facts": 0,
        "canonical_winners": ["checkout_started:browser", "checkout_started:server"],
        "rejected_codes": []
      }
    },
    {
      "id": "regenerated-event-id-overcounts-payment",
      "description": "Новый event_id при повторной отправке оплаты без business_event_id создаёт два продуктовых факта.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "server",
          "event": "order_paid",
          "event_id": "99999999-9999-4999-8999-999999999999",
          "user_id": "demo-user-001",
          "props": {}
        },
        {
          "credential_kind": "server",
          "event": "order_paid",
          "event_id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
          "user_id": "demo-user-001",
          "props": {}
        }
      ],
      "expected": {
        "accepted_deliveries": 2,
        "rejected_deliveries": 0,
        "physical_identities": 2,
        "logical_facts": 2,
        "authoritative_payment_facts": 2,
        "canonical_winners": ["order_paid:server", "order_paid:server"],
        "rejected_codes": []
      }
    },
    {
      "id": "browser-payment-is-forbidden",
      "description": "Браузер не может создать подтверждённый факт оплаты.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "order_paid",
          "event_id": "cccccccc-cccc-4ccc-8ccc-cccccccccccc",
          "user_id": "demo-user-001",
          "props": {}
        }
      ],
      "expected": {
        "accepted_deliveries": 0,
        "rejected_deliveries": 1,
        "physical_identities": 0,
        "logical_facts": 0,
        "authoritative_payment_facts": 0,
        "canonical_winners": [],
        "rejected_codes": ["credential_event_forbidden"]
      }
    },
    {
      "id": "source-metadata-cannot-grant-server-authority",
      "description": "Подмена context.source не превращает браузерный ключ в доверенный серверный источник.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "order_paid",
          "event_id": "dddddddd-dddd-4ddd-8ddd-dddddddddddd",
          "user_id": "demo-user-001",
          "context": {
            "source": "server"
          },
          "props": {}
        }
      ],
      "expected": {
        "accepted_deliveries": 0,
        "rejected_deliveries": 1,
        "physical_identities": 0,
        "logical_facts": 0,
        "authoritative_payment_facts": 0,
        "canonical_winners": [],
        "rejected_codes": ["credential_event_forbidden"]
      }
    },
    {
      "id": "http-202-partially-rejected-batch",
      "description": "HTTP 202 не заменяет проверку accepted/rejected: браузерный checkout принят, браузерная оплата отклонена.",
      "http_status": 202,
      "deliveries": [
        {
          "credential_kind": "browser",
          "event": "checkout_started",
          "event_id": "eeeeeeee-eeee-4eee-8eee-eeeeeeeeeeee",
          "user_id": "demo-user-001",
          "props": {}
        },
        {
          "credential_kind": "browser",
          "event": "order_paid",
          "event_id": "ffffffff-ffff-4fff-8fff-ffffffffffff",
          "user_id": "demo-user-001",
          "props": {}
        }
      ],
      "expected": {
        "accepted_deliveries": 1,
        "rejected_deliveries": 1,
        "physical_identities": 1,
        "logical_facts": 1,
        "authoritative_payment_facts": 0,
        "canonical_winners": ["checkout_started:browser"],
        "rejected_codes": ["credential_event_forbidden"]
      }
    }
  ]
}
