{ "id": "ShariXKnowledgeReportHandlerBPMN", "page": "sharixopen:knowledge:scenarios:report_handler", "area": "open", "type": "procedure", "title": "Сборщик служебных отчётов open_report_handler", "status": "review", "schema_version": 1, "relations": { "related_to": [ "ShariXKnowledgeBasicBotBPMN", "ShariXKnowledgeOpenKnowledgeModulesHandlers", "ShariXKnowledgeScenarios" ], "depends_on": [ "ShariXKnowledgeOpenKnowledgeModulesHandlers" ], "verified_by": [ "ShariXKnowledgeVerification" ] }, "extensions": { "taxonomy": { "domain": "operations", "lifecycle": "implemented", "component": "handlers_examples, handlers_backend", "parents": [ "ShariXKnowledgeScenarios" ], "terms": [ "audience_developer", "audience_operator", "audience_administrator", "audience_support", "audience_ai", "product_sharix_open", "material_scenario", "topic_operations_diagnostics", "topic_handlers_blockly", "topic_handlers_runtime", "first_party_handler", "xmpp", "handler_reports", "bpmn", "blockly", "generated_python" ] }, "diagram": { "format": "bpmn", "executable": false }, "source_evidence": [ { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_report_handler.py", "sha256": "9607c7f5b6f91632027095f5b3ebf64961ff8fd9c4624e80b5a39c6742ce61d5" }, { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_report_handler.json", "sha256": "b4c158eca9cc5e7fc671629a01d367edcd351ecdbce446544fd6a1d103f0323c" }, { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde" }, { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "first_party_operations/open_report_handler.py", "sha256": "2caef84ded62efccbc6771b62e66e849b961ebcc62586083ea8f26f5cb918237" }, { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "config.py", "sha256": "7b23db9ed283d3bbc3cf2cfbd5d41c629f6be507c3ca38c611572d08a75743a4" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "first_party_blockly_codegen.py", "sha256": "7f4dc6607ad62f3150c58de6341b758ebe97f81bd936c9ec033b7d86fed44640" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/first_party_handler_runtime.py", "sha256": "fb5ee98561b029de9291e73c2a08205cc9fc2b7b239abffe4a4bb24f56093bdb" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "main.py", "sha256": "66b7df94fedbec931ed4cb2d4e1afd9cf0386e14ed0932e22b15eb301cd792d7" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "runtime_provider.py", "sha256": "c311d3b0721d18d8eccc9cd7fba155108bf285df3002507ee915ee73b797a2f4" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/JabberBot.py", "sha256": "7fbd4d1f41bc867109b73dbb632efcfae920269a1aaf6da0e577cc70838820f1" } ], "handler_process": { "handler_id": "open_report_handler", "source_kind": "git_builtin", "canonical_python_verified": true, "reviewed_on": "2026-10-29", "generator": "tools/generate_handler_bpmn.py", "generator_sha256": "488101a6be2f8f43d63ce966760be9f1c3664c88d88bed17ce0d6bfee9563cae", "models": { "receive": "eb08050185a42990f69c21974bae43137ba76296839f26acafbc7c8a8cbbd744", "cycle": "f1999e6af8d5ef7efd7bd4b7c76db0bd3dab7f2ee55af870c05ee2961583d998" }, "canonical_renderer": "handlers_backend/first_party_blockly_codegen.py", "typed_operations": [ "aggregate_handler_reports" ] }, "classification": { "schema": "sharix.knowledge.classification.v1", "products": [ "sharix_open" ], "audiences": [ "developer", "operator", "administrator", "support", "ai" ], "material": "scenario", "topics": [ "operations/diagnostics", "handlers/blockly", "handlers/runtime" ], "tag_terms": [ "audience_developer", "audience_operator", "audience_administrator", "audience_support", "audience_ai", "product_sharix_open", "material_scenario", "topic_operations_diagnostics", "topic_handlers_blockly", "topic_handlers_runtime", "first_party_handler", "xmpp", "handler_reports", "bpmn", "blockly", "generated_python" ], "registry_document": "ShariXKnowledgeClassification", "state_meaning": "implemented — описана проверенная реализация исходников; серверный runtime отдельно; review — состояние текста" }, "editorial_review": { "date": "2026-10-31", "scope": "Конкретизация действий, условий, результатов и диагностики; перечисления; исходные BPMN сохранены", "current_source_records_verified": 10, "original_source_evidence_recheck": "После git fetch все исходные commits/SHA-256 совпали; дополнительные функциональные источники включены в source_evidence", "canonical_regeneration": { "kind": "first_party", "compared_python_paths": [ "handlers/open_report_handler.py" ], "generator_sources_verified": 11, "handler_executed": false }, "runtime_checked": false } }, "content_sha256": "3ca60e6210baf10cc92f0d9a5470122c77c819a2f4b52f4217e29f4680e93204", "schema": 1 } ====== Сборщик служебных отчётов open_report_handler ====== ~~NOCACHE~~ **Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]]. **Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#operator_razvjortyvanija|Оператор развёртывания]] · [[sharixopen:knowledge:classification:audiences#administrator|Администратор]] · [[sharixopen:knowledge:classification:audiences#podderzhka|Поддержка]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]]. **Темы:** [[sharixopen:knowledge:classification:topics#diagnostika|Эксплуатация → Диагностика]] · [[sharixopen:knowledge:classification:topics#blockly|Обработчики → Blockly]] · [[sharixopen:knowledge:classification:topics#runtime|Обработчики → Runtime]]. **Область:** ShariX Open. **Обработчик:** ''open_report_handler'', системный first-party handler без типа/рабочего статуса Ticket. 31.10.2026 исходники повторно получены из Git. First-party Python совпал с каноническим renderer; отдельно проверены операция aggregate_handler_reports и общий launcher. Сам обработчик и его внешние действия не запускались. Выбранная версия и работающая установка проверяются отдельно. ===== Назначение и канонический контракт ===== Сборщик выполняет две независимые части: * входящий callback добавляет разрешённые XMPP-тексты в память по отправителю; * длительный цикл периодически пересылает сводку техническому адресату. Это не постоянный журнал ошибок, очередь Deck или редакторское согласование. Доставка каждому сотруднику не реализована. В Blockly зафиксирована typed operation ''aggregate_handler_reports''. Сгенерированный Python вызывает binding; runtime сверяет точную последовательность с каталогом builtin и загружает ''first_party_operations/open_report_handler.py''. При несовпадении контракт отклоняется. В runtime исполняется Python; Blockly JSON не интерпретируется. Код operation и общий launcher включены в закреплённые источники, поскольку wrapper сам по себе не описывает фильтры, память и ошибки пересылки. BPMN описательные, isExecutable=false. Два вида показывают независимый входящий callback и длительный цикл отправки с таймером остановки/повтора. ===== Получение и локальный буфер (BPMN) ===== {"notes": ["BPMN isExecutable=false; typed operation aggregate_handler_reports из Blockly, Python сверён канонически.", "Буфер reports — память под lock, не durable outbox.", "Успешный send-call не равен доставке/прочтению; повтор после неизвестного результата может дублировать отчёт."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_report_handler.py", "repository": "sharix-open-handlers-examples", "sha256": "9607c7f5b6f91632027095f5b3ebf64961ff8fd9c4624e80b5a39c6742ce61d5"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_report_handler.json", "repository": "sharix-open-handlers-examples", "sha256": "b4c158eca9cc5e7fc671629a01d367edcd351ecdbce446544fd6a1d103f0323c"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "first_party_operations/open_report_handler.py", "repository": "sharix-open-handlers-examples", "sha256": "2caef84ded62efccbc6771b62e66e849b961ebcc62586083ea8f26f5cb918237"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "config.py", "repository": "sharix-open-handlers-examples", "sha256": "7b23db9ed283d3bbc3cf2cfbd5d41c629f6be507c3ca38c611572d08a75743a4"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "first_party_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "7f4dc6607ad62f3150c58de6341b758ebe97f81bd936c9ec033b7d86fed44640"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/first_party_handler_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "fb5ee98561b029de9291e73c2a08205cc9fc2b7b239abffe4a4bb24f56093bdb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "main.py", "repository": "sharix-open-handlers-backend", "sha256": "66b7df94fedbec931ed4cb2d4e1afd9cf0386e14ed0932e22b15eb301cd792d7"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "runtime_provider.py", "repository": "sharix-open-handlers-backend", "sha256": "c311d3b0721d18d8eccc9cd7fba155108bf285df3002507ee915ee73b797a2f4"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/JabberBot.py", "repository": "sharix-open-handlers-backend", "sha256": "7fbd4d1f41bc867109b73dbb632efcfae920269a1aaf6da0e577cc70838820f1"}]} inbox_start inbox_type inbox_allow inbox_append inbox_end inbox_ignore inbox_Flow_0 inbox_Flow_0 inbox_Flow_1 inbox_Flow_2 inbox_Flow_1 inbox_Flow_3 inbox_Flow_5 inbox_Flow_3 inbox_Flow_4 inbox_Flow_4 inbox_Flow_2 inbox_Flow_5 Входной фильтр: - Пропустить только chat/normal. - Отбросить resource и получить bare JID. - Сверить его с listen_to: handler ids каталога без самого open_report_handler и технический UID 5101 в EJ_HOST. - Пропустить body, отличный от None. Каталог может включать материализованные contributions установки. Произвольный JID не становится разрешённым из-за слова «ошибка» в тексте. После допуска сообщения: - Под lock добавить строку в список отправителя. - Записать лог recorded. - Позднее включить строку в snapshot сводки. Callback не разбирает severity/JSON, не выполняет команды и не меняет Ticket. Event-id дедупликации нет; повторная доставка может стать ещё одной строкой. Буфер — process memory. Он не хранится в БД или durable outbox; рестарт способен потерять неотправленное. Лог recorded подтверждает запись в локальную память текущего процесса, не пересылку получателю. ===== Сводка, пересылка и интервал (BPMN) ===== {"notes": ["BPMN isExecutable=false; typed operation aggregate_handler_reports из Blockly, Python сверён канонически.", "Буфер reports — память под lock, не durable outbox.", "Успешный send-call не равен доставке/прочтению; повтор после неизвестного результата может дублировать отчёт."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_report_handler.py", "repository": "sharix-open-handlers-examples", "sha256": "9607c7f5b6f91632027095f5b3ebf64961ff8fd9c4624e80b5a39c6742ce61d5"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_report_handler.json", "repository": "sharix-open-handlers-examples", "sha256": "b4c158eca9cc5e7fc671629a01d367edcd351ecdbce446544fd6a1d103f0323c"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "first_party_operations/open_report_handler.py", "repository": "sharix-open-handlers-examples", "sha256": "2caef84ded62efccbc6771b62e66e849b961ebcc62586083ea8f26f5cb918237"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "config.py", "repository": "sharix-open-handlers-examples", "sha256": "7b23db9ed283d3bbc3cf2cfbd5d41c629f6be507c3ca38c611572d08a75743a4"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "first_party_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "7f4dc6607ad62f3150c58de6341b758ebe97f81bd936c9ec033b7d86fed44640"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/first_party_handler_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "fb5ee98561b029de9291e73c2a08205cc9fc2b7b239abffe4a4bb24f56093bdb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "main.py", "repository": "sharix-open-handlers-backend", "sha256": "66b7df94fedbec931ed4cb2d4e1afd9cf0386e14ed0932e22b15eb301cd792d7"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "runtime_provider.py", "repository": "sharix-open-handlers-backend", "sha256": "c311d3b0721d18d8eccc9cd7fba155108bf285df3002507ee915ee73b797a2f4"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/JabberBot.py", "repository": "sharix-open-handlers-backend", "sha256": "7fbd4d1f41bc867109b73dbb632efcfae920269a1aaf6da0e577cc70838820f1"}]} aggregate_start aggregate_stop aggregate_exit aggregate_snapshot aggregate_empty aggregate_format aggregate_send aggregate_delivered aggregate_restore aggregate_wait aggregate_repeat aggregate_Flow_0 aggregate_Flow_0 aggregate_Flow_1 aggregate_Flow_2 aggregate_Flow_1 aggregate_Flow_2 aggregate_Flow_3 aggregate_Flow_3 aggregate_Flow_4 aggregate_Flow_7 aggregate_Flow_4 aggregate_Flow_5 aggregate_Flow_5 aggregate_Flow_6 aggregate_Flow_6 aggregate_Flow_8 aggregate_Flow_10 aggregate_Flow_8 aggregate_Flow_9 aggregate_Flow_7 aggregate_Flow_9 aggregate_Flow_10 aggregate_Flow_11 interval_time_report aggregate_Flow_11 Итерация отправки после XMPP connection preflight: - Проверить exit_event. - Под lock снять копию reports и очистить исходный буфер. - Пока snapshot отправляется, принимать новые сообщения в отдельный текущий буфер. - При непустом snapshot сформировать и отправить сводку. Первая итерация начинается сразу; полный INTERVAL_TIME_REPORT до неё не ожидается. Отправка сводки: * формат — JID и списки сообщений; * транспорт — XMPP chat; * получатели — proceed_to без собственного JID; * в текущей operation единственный адресат — фиксированный 5101@EJ_HOST. Этот адресат не вычисляется из METASERVICE-ADMIN/staff, Ticket.group или авторов сообщений. Изменение получателя требует правки соответствующего контракта/конфигурации. Результат send обрабатывается так: * хотя бы один вызов без исключения устанавливает delivered=true; * если таких вызовов нет, snapshot под lock возвращается в начало текущих списков перед новыми сообщениями; * при хотя бы одном успешном вызове snapshot для остальных адресатов не восстанавливается. Это не receipt и не прочтение. Сейчас адресат один; алгоритм не является индивидуальным durable retry для будущего списка получателей. После итерации выполняется ''exit_event.wait(INTERVAL_TIME_REPORT)''. Это прерываемое ожидание: сигнал остановки не обязан ждать весь интервал. Затем цикл повторяется. Пустой snapshot не порождает сообщение «No reports available»: отправка в start_handler выполняется только при непустом наборе, хотя formatter имеет такую строку для отдельного вызова. ===== Ошибки и границы доставки ===== Исключение send отдельному адресату логируется, цикл продолжает остальных. Полный неуспех восстанавливает snapshot в память и ждёт следующей итерации. Неопределённый сетевой результат способен привести к повтору сводки: код не реализует exactly-once или durable квитанцию по сообщению. Ошибки вне обработанного send-контекста могут завершить operation и перейти к общей политике рестартов launcher. Восстановленный в память snapshot всё равно не защищён от рестарта процесса. Нормальная остановка прекращает цикл, после чего launcher закрывает XMPP. Здесь нет отдельной обязательной финальной flush-сводки при остановке. ===== Диагностика ===== Порядок диагностики: - Проверить тип сообщения и bare JID по актуальному allowlist. - Подтвердить добавление в reports, учитывая время жизни процесса. - Найти снятый snapshot и момент итерации INTERVAL_TIME_REPORT. - Проверить фиксированного адресата и исход send. - Отдельно подтвердить фактическое получение. Лог recorded относится к локальной памяти, а наличие строк в файловом журнале другого handler не доказывает отправки агрегатору. Успешный запуск общего runtime ещё не доказывает, что каждый handler отправляет отчёты в этот JID. Наличие сообщений в обычных файловых логах также не означает, что они были отправлены агрегатору. Для надёжного архива нужны предусмотренные системы журналирования; этот handler не заменяет их. ===== Проверенные источники ===== Git SHA/SHA-256 и модели закреплены в metadata/BPMN; упаковка повторно сверяет файлы. Handler и тестовые сообщения при анализе не запускались; секретные runtime config не читались. Общий автоматический hook Wiki пока не завершён. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_report_handler.py|sharix-open-handlers-examples / handlers/open_report_handler.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_report_handler.json|sharix-open-handlers-examples / generated_handler_blocks/open_report_handler.json]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/catalog.py|sharix-open-handlers-examples / catalog.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/first_party_operations/open_report_handler.py|sharix-open-handlers-examples / first_party_operations/open_report_handler.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/config.py|sharix-open-handlers-examples / config.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/first_party_blockly_codegen.py|sharix-open-handlers-backend / first_party_blockly_codegen.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/first_party_handler_runtime.py|sharix-open-handlers-backend / core/first_party_handler_runtime.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/main.py|sharix-open-handlers-backend / main.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/runtime_provider.py|sharix-open-handlers-backend / runtime_provider.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/JabberBot.py|sharix-open-handlers-backend / core/JabberBot.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. ===== Связанные материалы ===== * [[sharixopen:knowledge:scenarios:basic_bot|Диагностический XMPP-бот]] * [[sharixopen:knowledge:modules:handlers|Модуль обработчиков]] * [[sharixopen:knowledge:scenarios:start|Индекс сценариев]] ~~SHARIX_KNOWLEDGE_RELATED~~