{
  "schemaVersion": 1,
  "id": "P56-C06",
  "title": "Автоматизация: событие, повтор и очередь ошибки",
  "author": {
    "id": "P56",
    "name": "Наталья Зорина"
  },
  "specialty": "Практические корпоративные курсы",
  "projectStatus": "concept",
  "source": {
    "document": "catalogue_60_personas.md",
    "briefId": "P56-C06",
    "title": "Курс по автоматизации",
    "kind": "editorial_concept",
    "data": "synthetic"
  },
  "context": "Участник должен отличить новый заказ от повторной доставки события и некорректного входа. Иначе красивая схема создает двойную работу.",
  "decision": "Я дала контракт события, полный набор входов и ожидаемые типы действий. Участник разбирает основу обработки: что создать, что признать повтором и где сохранить ошибку. Эти решения можно затем перенести в конкретную систему.",
  "constraint": "Исходные документы учебные и полностью приложены. Задание оценивает конкретные действия на этом наборе, а не квалификацию человека в целом.",
  "steps": [
    "Прочитать полный исходный материал и короткий разбор правила.",
    "Ввести ответы в поля задания и получить объяснение по каждому пункту.",
    "Исправить конкретный пропуск; эталон доступен отдельно после попытки."
  ],
  "inspection": [
    "Пустая попытка не получает оценку за невыполненное действие — проверено.",
    "Эталонная попытка проходит все предметные критерии — проверено.",
    "Один правдоподобный неверный ответ не получает полный балл — проверено."
  ],
  "sample": {
    "headers": [
      "Пункт",
      "Вопрос",
      "Ответ",
      "Результат",
      "Разбор"
    ],
    "rows": [
      [
        "1",
        "Новых действий (число)",
        "Не заполнен",
        "Нужен ответ",
        "Заполните ответ по исходному материалу, затем проверьте попытку."
      ],
      [
        "2",
        "Повторов (число)",
        "Не заполнен",
        "Нужен ответ",
        "Заполните ответ по исходному материалу, затем проверьте попытку."
      ],
      [
        "3",
        "Ошибочный вход: ID строки",
        "Не заполнен",
        "Нужен ответ",
        "Заполните ответ по исходному материалу, затем проверьте попытку."
      ],
      [
        "4",
        "Куда E3: очередь разбора / удалить",
        "Не заполнен",
        "Нужен ответ",
        "Заполните ответ по исходному материалу, затем проверьте попытку."
      ]
    ]
  },
  "sampleNote": "Авторский контрольный набор; не клиентские документы и не результаты внешней модели.",
  "caseStudy": {
    "role": "Методист практического обучения",
    "contribution": "Я написала урок о контракте событий, подготовила входные сообщения и проверку повтора и конфликта.",
    "objective": "Четыре события проходят мысленный разбор по полному контракту; ответы можно проверить сразу по журналу.",
    "problem": "Участник должен отличить новый заказ от повторной доставки события и некорректного входа. Иначе красивая схема создает двойную работу.",
    "result": "Полный урок проверяет повтор, обязательное поле и сохранение ошибки на четырех событиях. Правильный ответ: два действия, один повтор, E3 в очередь разбора.",
    "deliverables": [
      "index.html",
      "source.json",
      "source.csv",
      "result.json",
      "result.csv",
      "engine.js",
      "checks.json",
      "style.css",
      "lesson.txt",
      "answer-key.json"
    ],
    "blocks": [
      {
        "type": "text",
        "title": "Одинаковый eventId нужно сравнить с данными",
        "text": "В контракте обязательны eventId, orderId и положительный amount. Упражнение сначала проверяет полноту сообщения, затем различает тот же eventId с прежними и изменёнными данными. Так ученик разбирает две отдельные причины отказа и не сводит обработку событий к единственной проверке наличия ID."
      },
      {
        "type": "text",
        "title": "Короткий урок",
        "text": "Ключ события отделен от ID заказа. Повтор одинакового ключа не создает второе действие. Обязательное поле проверяется до записи. Некорректный вход попадает в очередь разбора с причиной, а не пропадает. Новая версия может стать отдельным событием при новом ключе."
      },
      {
        "type": "text",
        "title": "Задание",
        "text": "По контракту посчитайте новые действия, повторы и ошибки; укажите ID некорректного события."
      },
      {
        "type": "table",
        "title": "Полные исходные материалы",
        "lead": "",
        "table": {
          "headers": [
            "ID",
            "Текст"
          ],
          "rows": [
            [
              "CONTRACT",
              "Поля eventId, orderId, amount обязательны. amount — положительное число. Одинаковый eventId с тем же payload возвращает прежний результат."
            ],
            [
              "E1",
              "eventId=EV1; orderId=O7; amount=1200"
            ],
            [
              "E2",
              "eventId=EV1; orderId=O7; amount=1200"
            ],
            [
              "E3",
              "eventId=EV2; orderId=O8; amount отсутствует"
            ],
            [
              "E4",
              "eventId=EV3; orderId=O9; amount=500"
            ]
          ]
        }
      }
    ]
  },
  "deliverable": {
    "type": "course",
    "entry": "/catalogue/deliverables/p56-c06/index.html",
    "label": "Открыть работающий материал",
    "files": [
      {
        "path": "/catalogue/deliverables/p56-c06/index.html",
        "name": "index.html",
        "mimeType": "text/html"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/source.json",
        "name": "source.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/source.csv",
        "name": "source.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/result.json",
        "name": "result.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/result.csv",
        "name": "result.csv",
        "mimeType": "text/csv"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/engine.js",
        "name": "engine.js",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/verify.cjs",
        "name": "verify.cjs",
        "mimeType": "text/javascript"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/checks.json",
        "name": "checks.json",
        "mimeType": "application/json"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/style.css",
        "name": "style.css",
        "mimeType": "text/css"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/lesson.txt",
        "name": "lesson.txt",
        "mimeType": "text/plain"
      },
      {
        "path": "/catalogue/deliverables/p56-c06/answer-key.json",
        "name": "answer-key.json",
        "mimeType": "application/json"
      }
    ],
    "summary": "Полный урок проверяет повтор, обязательное поле и сохранение ошибки на четырех событиях. Правильный ответ: два действия, один повтор, E3 в очередь разбора."
  },
  "takeaway": "Полный урок проверяет повтор, обязательное поле и сохранение ошибки на четырех событиях. Правильный ответ: два действия, один повтор, E3 в очередь разбора.",
  "capabilities": [
    "completed_course"
  ],
  "externalConnections": []
}
