{
"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~~