{ "id": "ShariXKnowledgeSTRequestAssignedBPMN", "page": "sharixopen:knowledge:scenarios:st_request_assigned", "area": "open", "type": "procedure", "title": "Назначенная заявка ST_REQUEST: ручное начало работы и автоматический переход", "status": "review", "schema_version": 1, "relations": { "related_to": [ "ShariXKnowledgeSTRequestWaitingBPMN", "ShariXKnowledgeOpenKnowledgeModulesHandlers", "ShariXKnowledgeOpenKnowledgeDomainStrequest", "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth", "ShariXKnowledgeScenarios" ], "depends_on": [ "ShariXKnowledgeOpenKnowledgeModulesHandlers" ], "verified_by": [ "ShariXKnowledgeVerification" ] }, "extensions": { "taxonomy": { "domain": "business_processes", "lifecycle": "implemented", "component": "handlers_examples, handlers_backend, tickets", "parents": [ "ShariXKnowledgeScenarios" ], "terms": [ "audience_developer", "audience_support", "audience_reviewer", "audience_ai", "product_sharix_open", "material_scenario", "topic_handlers_support", "topic_handlers_runtime", "st_request", "ticket_assigned", "bpmn", "ticket", "blockly", "generated_python" ] }, "diagram": { "format": "bpmn", "executable": false }, "source_evidence": [ { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_assigned.json", "sha256": "d49e943a8806c3130acf09f1e93cf6b4e4a7d6f7428a5d18844a8f64ff619fe6" }, { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_assigned.py", "sha256": "2be4d63c70b8469e541346aa3185bb29d04af1a87fb64fb1df118bde3ebe3c42" }, { "repository": "sharix-open-handlers-examples", "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428" }, { "repository": "sharix-open-handlers-backend", "commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/ticket.py", "sha256": "b25a66fc52790f11ba7aca48527a4a5b6640a05ffa377ab58f562955f2695499" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/permissions.py", "sha256": "a0e12d188313ae1e6a9b1502ec48c2dd7f76fffa78ecf50b5b1b33b040b290a1" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "urls.py", "sha256": "c41101b32eb1132d63bf62d5bd96d344a79fe34946dc1635dc090921beb6e3c9" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883" }, { "repository": "sharix-open-tickets", "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "models/ticket.py", "sha256": "4768d9ef47b61bf3ae98bf2749ed142adc477978b44de29177363ba9664baa43" } ], "handler_process": { "handler_id": "open_st_request_assigned", "source_kind": "git_builtin", "canonical_python_verified": true, "reviewed_on": "2026-10-28", "generator": "tools/generate_handler_bpmn.py", "generator_sha256": "f3343863fcf46b150858e2ad936c6390703a9a936bd96e4207c5729a4bf43e78", "models": { "logic": "623f5ef14449b73b43bcf8c0df4fdf45581947e01c3601e888aa3a5849427c05", "external": "c7e650b1ba01572cd30699dbf8592325783a822d0556a8c9c30eb71728966d71", "cleanup": "f88cb3844123482c917a759e6b31c82894cd156acbd652a75a883997cfc33715" } }, "classification": { "schema": "sharix.knowledge.classification.v1", "products": [ "sharix_open" ], "audiences": [ "developer", "support", "reviewer", "ai" ], "material": "scenario", "topics": [ "handlers/support", "handlers/runtime" ], "tag_terms": [ "audience_developer", "audience_support", "audience_reviewer", "audience_ai", "product_sharix_open", "material_scenario", "topic_handlers_support", "topic_handlers_runtime", "st_request", "ticket_assigned", "bpmn", "ticket", "blockly", "generated_python" ], "registry_document": "ShariXKnowledgeClassification", "state_meaning": "implemented — описана проверенная реализация исходников; серверный runtime отдельно; review — состояние текста" }, "editorial_review": { "date": "2026-10-31", "scope": "Конкретизация действий, условий, результатов и диагностики; перечисления; исходные BPMN сохранены", "current_source_records_verified": 15, "original_source_evidence_recheck": "После git fetch все исходные commits/SHA-256 совпали; дополнительные функциональные источники включены в source_evidence", "canonical_regeneration": { "kind": "ticket", "compared_python_paths": [ "handlers/open_st_request_assigned.py", "generated_handlers/open_st_request_assigned.py" ], "generator_sources_verified": 11, "handler_executed": false }, "runtime_checked": false } }, "content_sha256": "ff828567f52cfb9fcadb207cda4b0effa0072889852b3f404c8c8468977f7a9f", "schema": 1 } ====== Назначенная заявка ST_REQUEST: ручное начало работы и автоматический переход ====== ~~NOCACHE~~ **Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]]. **Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#podderzhka|Поддержка]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]]. **Темы:** [[sharixopen:knowledge:classification:topics#st_request|Обработчики → ST_REQUEST]] · [[sharixopen:knowledge:classification:topics#runtime|Обработчики → Runtime]]. **Область:** ShariX Open. **Обработчик:** ''open_st_request_assigned'', тип ''ST_REQUEST'' (1), рабочий статус ''ASSIGNED''. 31.10.2026 исходники повторно получены из Git. Обе Python-копии совпали с новой канонической генерацией Blockly; проверены 11 исходников генераторов. Сам обработчик и его внешние действия не запускались. Выбранная версия, настройки и доступность подключений конкретной установки проверяются отдельно. ===== Назначение и границы ===== Обработчик сопровождает уже назначенную стадию: * при ручном режиме освобождает worker и ждёт действия пользователя; * при автоматическом режиме запрашивает IN_PROCESS и передаёт Ticket следующему handler; * не выбирает сотрудника и не заполняет assigned_to; * не проверяет наличие назначенного человека; * не выполняет содержание обращения. Статус ''ASSIGNED'' и заполненное поле ''assigned_to'' — разные факты. Автоматическое продвижение статуса не назначает исполнителя задним числом. Техническая причина ''support_execution'' — локальная отметка runtime, а не комментарий в карточке, не поручение пользователю и не сообщение об успешно выполненной работе. На диаграммах end event означает завершение конкретного прохода, передачи или текущей операции очереди. Он не означает, что вся заявка закрыта. Схемы описательные: ''isExecutable=false'', они ничего не запускают и не создают таймеров в системе. ===== Алгоритм обработчика и локальное ожидание (BPMN) ===== {"notes": ["Описание Git built-in; реальные локальные версии сверяются отдельно.", "Worker не занят во время defer. Символ deferred_until означает текущий локальный срок.", "Граница ошибки включает ошибку API/отправки, но не отменяет уже зафиксированный переход."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_assigned.json", "repository": "sharix-open-handlers-examples", "sha256": "d49e943a8806c3130acf09f1e93cf6b4e4a7d6f7428a5d18844a8f64ff619fe6"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_assigned.py", "repository": "sharix-open-handlers-examples", "sha256": "2be4d63c70b8469e541346aa3185bb29d04af1a87fb64fb1df118bde3ebe3c42"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_new.json", "repository": "sharix-open-handlers-examples", "sha256": "6b76b94236e6257f1f13dff9f41bb48c47352d5c512c9add0c5e53153c2dd6ff"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_new.py", "repository": "sharix-open-handlers-examples", "sha256": "f3cc74eccbc60431fff10e4989a4e499af85c7190b2e30cba8b097639cf1a23f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/ticket.py", "repository": "sharix-open-tickets", "sha256": "b25a66fc52790f11ba7aca48527a4a5b6640a05ffa377ab58f562955f2695499"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/permissions.py", "repository": "sharix-open-tickets", "sha256": "a0e12d188313ae1e6a9b1502ec48c2dd7f76fffa78ecf50b5b1b33b040b290a1"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "urls.py", "repository": "sharix-open-tickets", "sha256": "c41101b32eb1132d63bf62d5bd96d344a79fe34946dc1635dc090921beb6e3c9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}]} assigned_start assigned_status assigned_auto assigned_reason assigned_defer assigned_cleanup assigned_stale_end assigned_transition assigned_confirmed assigned_false_end assigned_handoff assigned_remove assigned_success assigned_api_error assigned_send_error assigned_retry assigned_waiting assigned_due assigned_revision assigned_ready assigned_Flow_0 assigned_Flow_0 assigned_Flow_20 assigned_Flow_1 assigned_Flow_2 assigned_Flow_1 assigned_Flow_4 assigned_Flow_7 Локальная причина ожидания, не комментарий Ticket. assigned_Flow_4 assigned_Flow_5 ST_REQUEST_ASSIGNED_RECHECK_SECONDS; вернуть Ticket, освободив worker. assigned_Flow_5 assigned_Flow_6 assigned_Flow_2 assigned_Flow_3 assigned_Flow_3 ticket.transition; 404 означает устаревший scope, другие ошибки — исключение. assigned_Flow_7 assigned_Flow_8 assigned_Flow_8 assigned_Flow_9 assigned_Flow_10 assigned_Flow_9 open_st_request_inprocess; попытка отправки XMPP, не гарантия завершения следующей стадии. assigned_Flow_10 assigned_Flow_11 assigned_Flow_11 assigned_Flow_12 assigned_Flow_12 assigned_Flow_13 assigned_Flow_14 Общий runtime: DEFERRED_TICKET_RECHECK_SECONDS; уже committed status не откатывается. assigned_Flow_13 assigned_Flow_14 assigned_Flow_15 assigned_Flow_6 assigned_Flow_15 assigned_Flow_16 assigned_Flow_17 assigned_Flow_16 assigned_Flow_18 deferred_until Уже получен новый authoritative snapshot. Дубликат сам по себе не снимает defer. assigned_Flow_17 assigned_Flow_19 Запуск возможен при готовом XMPP и свободном worker. assigned_Flow_18 assigned_Flow_19 assigned_Flow_20 Сначала проверяется статус локального authoritative-снимка, который очередь получила из backend или входящего Ticket. Отдельный API GET на каждом проходе здесь не выполняется. Если снимок уже не в ''ASSIGNED'', обработчик запрашивает исключение из своей очереди и удаление комнаты уведомлений; сам Ticket в backend этим не удаляется. Ручной режим, STREQ_AUTOACCEPT выключен: - Записать локальную причину support_execution. - Назначить defer по ST_REQUEST_ASSIGNED_RECHECK_SECONDS. - Освободить текущий worker. - После срока Ticket снова может попасть в ready FIFO; новая подтверждённая ревизия может снять ожидание раньше. Фактический запуск зависит от worker и XMPP. Повтор одинакового снимка не является новым решением и не обнуляет defer. Автоматический режим: - Запросить IN_PROCESS через scoped ticket.transition. - После успешного ответа API выполнить send_to_handler в open_st_request_inprocess. - Убрать Ticket из текущей очереди с delete_room=False. Это передача следующей стадии, а не подтверждение выполнения заявки. Значение STREQ_AUTOACCEPT берётся при создании HandlerContext; сохранение нового значения в файле не доказывает его применения работающим процессом. Если scoped API вернул 404, runtime трактует снимок как больше не принадлежащий этому обработчику, запрашивает очистку и не делает handoff. Другие ошибки API и ошибки XMPP-отправки проходят через общий error recovery: фиксируется ''processing_error'', назначается defer по ''DEFERRED_TICKET_RECHECK_SECONDS'', ошибка попадает в диагностику. Если переход уже committed, ошибка отправки не возвращает статус в ''ASSIGNED''. ===== Ручное начало работы и внешние участники (BPMN) ===== {"notes": ["Ручной переход показан отдельно от автоматического.", "Все сообщения backend отправляются после commit; доставка best effort через ejabberd.", "ticket.changed адресуется новому владельцу; ticket.moved прежнему. Потерю сообщения восстанавливает periodic reconciliation."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_assigned.json", "repository": "sharix-open-handlers-examples", "sha256": "d49e943a8806c3130acf09f1e93cf6b4e4a7d6f7428a5d18844a8f64ff619fe6"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_assigned.py", "repository": "sharix-open-handlers-examples", "sha256": "2be4d63c70b8469e541346aa3185bb29d04af1a87fb64fb1df118bde3ebe3c42"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_new.json", "repository": "sharix-open-handlers-examples", "sha256": "6b76b94236e6257f1f13dff9f41bb48c47352d5c512c9add0c5e53153c2dd6ff"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_new.py", "repository": "sharix-open-handlers-examples", "sha256": "f3cc74eccbc60431fff10e4989a4e499af85c7190b2e30cba8b097639cf1a23f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/ticket.py", "repository": "sharix-open-tickets", "sha256": "b25a66fc52790f11ba7aca48527a4a5b6640a05ffa377ab58f562955f2695499"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/permissions.py", "repository": "sharix-open-tickets", "sha256": "a0e12d188313ae1e6a9b1502ec48c2dd7f76fffa78ecf50b5b1b33b040b290a1"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "urls.py", "repository": "sharix-open-tickets", "sha256": "c41101b32eb1132d63bf62d5bd96d344a79fe34946dc1635dc090921beb6e3c9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}]} person_start person_open person_request person_end person_Flow_0 person_Flow_0 person_Flow_1 person_Flow_1 person_Flow_2 person_Flow_2 {"notes": ["Ручной переход показан отдельно от автоматического.", "Все сообщения backend отправляются после commit; доставка best effort через ejabberd.", "ticket.changed адресуется новому владельцу; ticket.moved прежнему. Потерю сообщения восстанавливает periodic reconciliation."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_assigned.json", "repository": "sharix-open-handlers-examples", "sha256": "d49e943a8806c3130acf09f1e93cf6b4e4a7d6f7428a5d18844a8f64ff619fe6"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_assigned.py", "repository": "sharix-open-handlers-examples", "sha256": "2be4d63c70b8469e541346aa3185bb29d04af1a87fb64fb1df118bde3ebe3c42"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_new.json", "repository": "sharix-open-handlers-examples", "sha256": "6b76b94236e6257f1f13dff9f41bb48c47352d5c512c9add0c5e53153c2dd6ff"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_new.py", "repository": "sharix-open-handlers-examples", "sha256": "f3cc74eccbc60431fff10e4989a4e499af85c7190b2e30cba8b097639cf1a23f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/ticket.py", "repository": "sharix-open-tickets", "sha256": "b25a66fc52790f11ba7aca48527a4a5b6640a05ffa377ab58f562955f2695499"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/permissions.py", "repository": "sharix-open-tickets", "sha256": "a0e12d188313ae1e6a9b1502ec48c2dd7f76fffa78ecf50b5b1b33b040b290a1"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "urls.py", "repository": "sharix-open-tickets", "sha256": "c41101b32eb1132d63bf62d5bd96d344a79fe34946dc1635dc090921beb6e3c9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}]} backend_request backend_acl backend_allowed backend_commit backend_publish backend_done backend_reject backend_rejected backend_Flow_0 backend_Flow_0 backend_Flow_1 backend_Flow_1 backend_Flow_2 backend_Flow_5 backend_Flow_2 backend_Flow_3 backend_Flow_3 backend_Flow_4 backend_Flow_4 backend_Flow_5 backend_Flow_6 backend_Flow_6 Пользователь открывает карточку Ticket и выбирает ''IN_PROCESS'' среди доступных переходов. Страница публикуется по маршруту ''tickets/ticket//''; пользовательский API использует ''tickets/api/ticket//status''. Общий префикс установки определяется её URL-конфигурацией. Наличие видимой ссылки или знание id не заменяют доступ к Ticket и право смены статуса. Перед пользовательским переходом проверяются: * объектный доступ к Ticket; * user_can_change_ticket_status: staff/superuser, участник группы списка, назначенный пользователь либо provider связанного заказа в общем контракте Tickets; * допустимость выбранного перехода в change_ticket_status. Создание Ticket само по себе не даёт права начать обработку. Change_ticket_status проверяет lifecycle, а объектные права обязан проверить вызывающий слой. Для связанного заказа действуют его доменные ограничения. У автоматического обработчика другой вход: ''tickets/api/handler/ticket//transition'', identity API-ключа, capability ''ticket.transition'', рабочая область статуса и блокировка строки. Пользовательский и handler API нельзя считать взаимозаменяемыми по доступу. После сохранения статуса и Event и завершения commit направляются два события: * **ticket.changed:** новый IN_PROCESS адресуется open_st_request_inprocess. * **ticket.moved:** прежний ASSIGNED и новый статус адресуются open_st_request_assigned для исключения старого снимка. Это не две команды повторно выполнить одно действие. Прежний обработчик получает сигнал о смене владельца, новый — повод получить свой scoped Ticket и начать собственную стадию. Передача идёт через ejabberd; failed delivery не откатывает сохранённый Ticket. При автоматической ветке дополнительно возможен прямой XMPP Ticket snapshot от ''send_to_handler''. Runtime сопоставляет ревизии и объединяет повторные сигналы; постоянная гарантия exactly-once здесь не заявляется. При недостатке прав или недоступном переходе статус не меняется. Обработчик не должен считать сам факт отправки пользовательского запроса началом следующей стадии. Прямое изменение БД не равно этой канонической операции с её lifecycle-событиями. ===== Уборка прежней очереди и восстановление доставки (BPMN) ===== {"notes": ["Ручной переход показан отдельно от автоматического.", "Все сообщения backend отправляются после commit; доставка best effort через ejabberd.", "ticket.changed адресуется новому владельцу; ticket.moved прежнему. Потерю сообщения восстанавливает periodic reconciliation."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_assigned.json", "repository": "sharix-open-handlers-examples", "sha256": "d49e943a8806c3130acf09f1e93cf6b4e4a7d6f7428a5d18844a8f64ff619fe6"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_assigned.py", "repository": "sharix-open-handlers-examples", "sha256": "2be4d63c70b8469e541346aa3185bb29d04af1a87fb64fb1df118bde3ebe3c42"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_new.json", "repository": "sharix-open-handlers-examples", "sha256": "6b76b94236e6257f1f13dff9f41bb48c47352d5c512c9add0c5e53153c2dd6ff"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_new.py", "repository": "sharix-open-handlers-examples", "sha256": "f3cc74eccbc60431fff10e4989a4e499af85c7190b2e30cba8b097639cf1a23f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/ticket.py", "repository": "sharix-open-tickets", "sha256": "b25a66fc52790f11ba7aca48527a4a5b6640a05ffa377ab58f562955f2695499"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/permissions.py", "repository": "sharix-open-tickets", "sha256": "a0e12d188313ae1e6a9b1502ec48c2dd7f76fffa78ecf50b5b1b33b040b290a1"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "urls.py", "repository": "sharix-open-tickets", "sha256": "c41101b32eb1132d63bf62d5bd96d344a79fe34946dc1635dc090921beb6e3c9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}]} old_moved old_discard old_end old_periodic old_timer old_list old_present old_keep old_next_check old_query_error old_retry old_Flow_0 Если Ticket in-flight — pending discard до завершения worker; иначе удалить локальный снимок и комнату. old_Flow_0 old_Flow_5 old_Flow_1 old_Flow_1 old_Flow_2 old_Flow_2 old_Flow_3 next_reconciliation_at old_Flow_3 old_Flow_4 old_Flow_4 old_Flow_5 old_Flow_6 Изменившаяся authoritative revision делает Ticket ready; неизменившаяся сохраняет defer. old_Flow_6 old_Flow_7 old_Flow_7 old_Flow_9 old_Flow_8 old_Flow_8 old_Flow_9 Уборка при ticket.moved: - XMPP-обработка ставит запрос discard без синхронного API GET. - Для in-flight Ticket удаление откладывается до завершения worker. - Для свободного Ticket локальный снимок исключается сразу, запрашивается удаление комнаты. Успешная явная передача текущего handler сохраняет комнату. Очистка локальной очереди не удаляет Ticket из backend. Периодическая scoped сверка по INTERVAL_TIME_BD_REQ: * успешный список без Ticket позволяет исключить прежний снимок сразу либо после in-flight прохода; * новая ревизия обновляет снимок и снимает defer; * неизменившийся снимок сохраняет ожидание; * ошибка API сохраняет локальное состояние, логируется и оставляет следующий повтор. Недоступность API не является подтверждённым удалением заявки. Отсрочки, причины ожидания, coalescing событий и локальная очередь живут в памяти процесса. После restart authoritative-состав восстанавливается из backend; прежний deadline не является долговечным SLA-обязательством. ''deferred_until'' и ''next_reconciliation_at'' в BPMN — символические значения сроков, не новые env-ключи и не фиксированное число секунд. Служебные startup/stop-пути общего runtime не развёрнуты здесь в отдельный бизнес-процесс. ===== Диагностика ===== * Какой статус и ревизия Ticket сохранены в backend; выбран ли именно этот built-in или локальная версия обработчика. * Какое значение ''STREQ_AUTOACCEPT'' было прочитано при старте; какое значение ''ST_REQUEST_ASSIGNED_RECHECK_SECONDS'' использует текущий runtime. * Есть ли ''support_execution'', активный defer, ready FIFO, свободный worker и готовое XMPP. Эти признаки описывают разные стадии ожидания. * Не ожидается ли удаление старого снимка после ''ticket.moved'' или in-flight прохода; завершалась ли последняя scoped сверка успешно. * Не завершился ли API-переход раньше ошибки XMPP. Проверять фактический backend-статус перед повтором действия, а не выводить его из сообщения об ошибке отправки. * Для ручного перехода — доступ к Ticket, объектные права и доступный следующий статус. Авторство Ticket само по себе недостаточно. ===== Источники и актуализация ===== Ниже закреплены изученные версии. SHA-256 файлов и параметры генерации также сохранены в metadata страницы и documentation внутри BPMN. Алгоритм берётся из Blockly и его точно совпадающего Python; роли, commit-события и восстановление — из runtime, view/API/ACL и signals. Изменение этих источников требует повторного сопоставления, а не механической смены хешей. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_st_request_assigned.json|sharix-open-handlers-examples / generated_handler_blocks/open_st_request_assigned.json]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_st_request_assigned.py|sharix-open-handlers-examples / handlers/open_st_request_assigned.py]] — 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-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/blockly_runtime.py|sharix-open-handlers-backend / core/blockly_runtime.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/requesters.py|sharix-open-handlers-backend / core/requesters.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/signals.py|sharix-open-tickets / signals.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/services/handler_wakeup.py|sharix-open-tickets / services/handler_wakeup.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/utils.py|sharix-open-tickets / utils.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/views/ticket_detail.py|sharix-open-tickets / views/ticket_detail.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/api/views/handler_workflow.py|sharix-open-tickets / api/views/handler_workflow.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/api/views/ticket.py|sharix-open-tickets / api/views/ticket.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/api/permissions.py|sharix-open-tickets / api/permissions.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/urls.py|sharix-open-tickets / urls.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/lib/tickets.py|sharix-open-tickets / lib/tickets.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14. ===== Связанные материалы ===== * [[sharixopen:knowledge:scenarios:st_request_waiting|Предыдущая стадия: NEW и ожидание назначения]] * [[sharixopen:knowledge:modules:handlers|Обработчики, Blockly и граница выполнения]] * [[sharixopen:knowledge:operations:runtime_health|Диагностика runtime и обработчиков]] * [[sharixopen:knowledge:scenarios:start|Все сценарии]] ~~SHARIX_KNOWLEDGE_RELATED~~