{
  "schemaVersion": 1,
  "id": "P49-C05",
  "title": "Почтовые события: ключ операции и конфликт повторного payload",
  "author": {
    "id": "P49",
    "name": "Григорий Никитин"
  },
  "specialty": "Проверка качества ИИ-помощников",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P49-C05",
    "title": "Агент обработки писем",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Повтор события E14 и исправленное письмо выглядят похоже, но требуют разных решений. Слияние по теме теряет редакцию, обработка каждого доставки создает дубликаты.",
  "decision": "Я связал ключ события с неизменяемой парой message ID и версии вложения. Повтор возвращает сохраненный исход. При другом payload под прежним ключом обработка останавливается; E15 получает собственную запись.",
  "constraint": "Почта никуда не отправляется. Проверяется обработчик событий на открытом наборе и сохраненные решения в памяти.",
  "steps": [
    "Зафиксировать вход и ожидаемое поведение до запуска.",
    "Выполнить обработчик на обычном и конфликтном сценарии.",
    "Сохранить фактический журнал и повторяемую проверку."
  ],
  "inspection": [
    "Два выполнения, один повтор и один конфликт содержимого — проверено.",
    "Третий одинаковый eventId не запускает обработку повторно — проверено.",
    "Новый message ID под прежним событием отклоняется — проверено."
  ],
  "sample": {
    "headers": [
      "Событие",
      "Письмо",
      "Версия",
      "Решение"
    ],
    "rows": [
      [
        "E14",
        "M7",
        "v1",
        "Выполнено"
      ],
      [
        "E14",
        "M7",
        "v1",
        "Сохраненный результат"
      ],
      [
        "E14",
        "M7",
        "v2",
        "Конфликт payload"
      ],
      [
        "E15",
        "M7",
        "v2",
        "Выполнено"
      ]
    ]
  },
  "sampleNote": "Авторский набор событий и полные тексты. Все решения выполняются локальным кодом, внешняя модель не вызывается.",
  "caseStudy": {
    "role": "Инженер проверки сценариев и доступа",
    "contribution": "Я реализовал проверку ключа события, версии и содержимого и сохранил различие повтора и конфликта.",
    "objective": "Одинаковое событие не выполняется дважды; измененное вложение с прежним ID дает конфликт, а новая версия — отдельную операцию.",
    "problem": "Повтор события E14 и исправленное письмо выглядят похоже, но требуют разных решений. Слияние по теме теряет редакцию, обработка каждого доставки создает дубликаты.",
    "result": "E14/v1 выполнен один раз, одинаковый повтор вернул сохраненный исход. E14/v2 остановлен как конфликт содержимого, E15/v2 выполнен отдельно. Фокус проверки — ключ события и версия вложения; транспортная потеря ответа не моделируется.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "E14 с v2 не является повтором v1",
        "text": "Первое E14 для M7/v1 выполняется, второе возвращает сохранённый результат. Следующая строка использует тот же E14, но v2, и получает конфликт. Я сохранил три исхода рядом: именно изменение данных под знакомым ключом показывает, почему одного списка обработанных ID недостаточно."
      }
    ]
  },
  "deliverable": {
    "type": "app",
    "entry": "/catalogue/deliverables/p49-c05/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p49-c05/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p49-c05/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      }
    ],
    "summary": "E14/v1 выполнен один раз, одинаковый повтор вернул сохраненный исход. E14/v2 остановлен как конфликт содержимого, E15/v2 выполнен отдельно. Фокус проверки — ключ события и версия вложения; транспортная потеря ответа не моделируется."
  },
  "takeaway": "E14/v1 выполнен один раз, одинаковый повтор вернул сохраненный исход. E14/v2 остановлен как конфликт содержимого, E15/v2 выполнен отдельно. Фокус проверки — ключ события и версия вложения; транспортная потеря ответа не моделируется.",
  "capabilities": [
    "completed_app"
  ],
  "externalConnections": []
}
