Инструменты пользователя

Инструменты сайта


sharixopen:knowledge:scenarios:st_request_waiting

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
sharixopen:knowledge:scenarios:st_request_waiting [2026/10/28 15:09] – [sharixknowledge] approved package sx_knowledge_api_opensharixopen:knowledge:scenarios:st_request_waiting [2026/10/31 11:25] (текущий) – [sharixknowledge] approved package sx_knowledge_api_open
Строка 5: Строка 5:
     "area": "open",     "area": "open",
     "type": "procedure",     "type": "procedure",
-    "title": "Ожидание новой заявки ST_REQUEST: обработчик и очередь",+    "title": "Новая ST_REQUEST: ожидание, очередь и переход в ASSIGNED",
     "status": "review",     "status": "review",
     "schema_version": 1,     "schema_version": 1,
Строка 13: Строка 13:
             "ShariXKnowledgeOpenKnowledgeDomainStrequest",             "ShariXKnowledgeOpenKnowledgeDomainStrequest",
             "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth",             "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth",
-            "ShariXKnowledgeScenarios"+            "ShariXKnowledgeScenarios", 
 +            "ShariXKnowledgeSTRequestAssignedBPMN"
         ]         ]
     },     },
Строка 20: Строка 21:
             "domain": "business_processes",             "domain": "business_processes",
             "lifecycle": "implemented",             "lifecycle": "implemented",
-            "component": "handlers",+            "component": "handlers_examples, handlers_backend, tickets",
             "parents": [             "parents": [
                 "ShariXKnowledgeScenarios"                 "ShariXKnowledgeScenarios"
             ],             ],
             "terms": [             "terms": [
-                "ST_REQUEST", +                "audience_developer", 
-                "BPMN"+                "audience_support", 
 +                "audience_reviewer", 
 +                "audience_ai", 
 +                "product_sharix_open", 
 +                "material_scenario", 
 +                "topic_handlers_support", 
 +                "topic_handlers_runtime", 
 +                "st_request", 
 +                "bpmn", 
 +                "ticket", 
 +                "blockly", 
 +                "generated_python"
             ]             ]
         },         },
Строка 32: Строка 44:
             {             {
                 "repository": "sharix-open-handlers-examples",                 "repository": "sharix-open-handlers-examples",
-                "commit": "624709bdbc9756e5c507ba318e987a12f1710a37",+                "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
                 "path": "generated_handler_blocks/open_st_request_new.json",                 "path": "generated_handler_blocks/open_st_request_new.json",
-                "sha256": "f58eda1b10a41713efecc12cd49105da30368c1e8d278b6fb74411c3be38f6ea"+                "sha256": "6b76b94236e6257f1f13dff9f41bb48c47352d5c512c9add0c5e53153c2dd6ff" 
 +            }, 
 +            { 
 +                "repository": "sharix-open-handlers-examples", 
 +                "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", 
 +                "path": "handlers/open_st_request_new.py", 
 +                "sha256": "f3cc74eccbc60431fff10e4989a4e499af85c7190b2e30cba8b097639cf1a23f" 
 +            }, 
 +            { 
 +                "repository": "sharix-open-handlers-examples", 
 +                "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", 
 +                "path": "catalog.py", 
 +                "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"
             },             },
             {             {
                 "repository": "sharix-open-handlers-backend",                 "repository": "sharix-open-handlers-backend",
-                "commit": "b13d7f455b44968785bfda5b8488b1d5adff0f5f",+                "commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
                 "path": "core/blockly_runtime.py",                 "path": "core/blockly_runtime.py",
                 "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"                 "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"
             }             }
         ],         ],
Строка 46: Строка 130:
             "format": "bpmn",             "format": "bpmn",
             "executable": false             "executable": false
 +        },
 +        "handler_process": {
 +            "handler_id": "open_st_request_new",
 +            "source_kind": "git_builtin",
 +            "canonical_python_verified": true,
 +            "reviewed_on": "2026-10-28",
 +            "model_sha256": "ee647a94c3be9e60b66e8d9e35f2b44a0e2b3c3a0c6e4af8645c308e6caf9419"
 +        },
 +        "editorial_review": {
 +            "date": "2026-10-31",
 +            "scope": "rewrite",
 +            "batch": 4,
 +            "style": "Конкретные действия, источники, условия и ограничения; определения и проверки — списками."
 +        },
 +        "source_review_20261031": {
 +            "kind": "source_analysis_not_runtime_acceptance",
 +            "sources": [
 +                {
 +                    "repository": "sharix-open-handlers-examples",
 +                    "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
 +                    "path": "catalog.py",
 +                    "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"
 +                },
 +                {
 +                    "repository": "sharix-open-handlers-examples",
 +                    "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
 +                    "path": "generated_handler_blocks/open_st_request_new.json",
 +                    "sha256": "6b76b94236e6257f1f13dff9f41bb48c47352d5c512c9add0c5e53153c2dd6ff"
 +                },
 +                {
 +                    "repository": "sharix-open-handlers-examples",
 +                    "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
 +                    "path": "handlers/open_st_request_new.py",
 +                    "sha256": "f3cc74eccbc60431fff10e4989a4e499af85c7190b2e30cba8b097639cf1a23f"
 +                },
 +                {
 +                    "repository": "sharix-open-handlers-examples",
 +                    "commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
 +                    "path": "generated_handlers/open_st_request_new.py",
 +                    "sha256": "f3cc74eccbc60431fff10e4989a4e499af85c7190b2e30cba8b097639cf1a23f"
 +                },
 +                {
 +                    "repository": "sharix-open-handlers-backend",
 +                    "commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
 +                    "path": "ticket_blockly_codegen.py",
 +                    "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"
 +                },
 +                {
 +                    "repository": "sharix-open-handlers-backend",
 +                    "commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
 +                    "path": "core/blockly_runtime.py",
 +                    "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"
 +                },
 +                {
 +                    "repository": "sharix-open-handlers-backend",
 +                    "commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
 +                    "path": "ticket_codegen_contract.json",
 +                    "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"
 +                },
 +                {
 +                    "repository": "sharix-open-tickets",
 +                    "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
 +                    "path": "signals.py",
 +                    "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"
 +                },
 +                {
 +                    "repository": "sharix-open-tickets",
 +                    "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
 +                    "path": "api/views/handler_workflow.py",
 +                    "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"
 +                }
 +            ]
 +        },
 +        "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",
 +                "bpmn",
 +                "ticket",
 +                "blockly",
 +                "generated_python"
 +            ],
 +            "registry_document": "ShariXKnowledgeClassification",
 +            "state_meaning": "lifecycle относится к описываемому коду, а status к редакции документа; implemented не означает успешный runtime тест"
 +        },
 +        "classification_review": {
 +            "date": "2026-10-31",
 +            "source": "Содержание текущей страницы и проверенный словарь классификации",
 +            "body_scope": "classification_and_navigation_only"
         }         }
     },     },
-    "content_sha256": "962d4a68591e4b5c7be3dcfba5aa392a4aa7b2f821e13d99c71c4cef8839ea32",+    "content_sha256": "aa1202a7e01025360978d122339b2e84ea37402dce1441d448f29ad878e56e1d",
     "schema": 1     "schema": 1
 } }
 </sharix-knowledge-meta> </sharix-knowledge-meta>
-====== Ожидание новой заявки ST_REQUEST: обработчик и очередь ======+====== Новая ST_REQUEST: ожидание, очередь и переход в ASSIGNED ======
 ~~NOCACHE~~ ~~NOCACHE~~
  
-**Область:** ShariX Open. **Основание:** реализация обработчика ''open_st_request_new'' и планировщика очереди, проверенная 28.10.2026 по указанным ниже версиям Git. Это описание реализованного механизма ожидания, а не проект будущего процесса.+**Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]].
  
-===== Встроенный Python и workspace: обнаруженное расхождение ===== +**Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#podderzhka|Поддержка]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]].
-У встроенного Python указанной Git-версии есть две ветви: при отключённом ''STREQ_AUTOACCEPT'' он ожидает ручного назначения, а при включённом пытается перевести заявку в ''ASSIGNED'', передать следующему обработчику и сохранить комнату. Первоначальная схема ниже была построена только по workspace и показывала лишь ожидание. Этот workspace в той же Git-версии не содержит автоматической ветви; считать его полным описанием встроенного Python нельзя.+
  
-Подготовлено исправление канонического workspace/генерации с сохранением автоматической ветви. Это описание найденного расхождения и требуемого контракта; оно не является подтверждением применения патча на конкретной установке. Для фактической работы нужно отдельно проверить выбранную локальную Python-версию.+**Темы:** [[sharixopen:knowledge:classification:topics#st_request|Обработчики → ST_REQUEST]] · [[sharixopen:knowledge:classification:topics#runtime|Обработчики → Runtime]].
  
-===== Маршрутизация встроенного Python (BPMN) =====+ 
 + 
 +Сценарий описывает open_st_request_new в ShariX Open. Его работа — обработать Ticket типа ST_REQUEST в статусе NEW: отложить локальную проверку либо запросить переход в ASSIGNED. Это анализ текущего кода; конфигурация и выбранная версия конкретного сервера проверяются отдельно. 
 + 
 +===== Какие источники определяют поведение ===== 
 +  * **Алгоритм:** handlers_examples/generated_handler_blocks/open_st_request_new.json. 
 +  * **Исполняемый Python:** handlers_examples/handlers/open_st_request_new.py. 
 +  * **Копия результата генерации:** handlers_examples/generated_handlers/open_st_request_new.py. 
 +  * **Генерация:** handlers_backend/ticket_blockly_codegen.py и ticket_codegen_contract.json. 
 +  * **Очередь, отсрочка и сетевые операции:** handlers_backend/core/blockly_runtime.py. 
 +  * **Проверка обработчика на стороне API:** tickets/api/views/handler_workflow.py и capabilities каталога. 
 + 
 +31.10.2026 Python заново получен из workspace: обе поставляемые копии совпали с результатом побайтово. Проверены хеши 11 исходников генераторов, перечисленных в контракте. Сам handler при этой проверке не запускался; серверные настройки и XMPP не проверялись. 
 + 
 +===== Ветви одного прохода ===== 
 +^ Условие ^ Что делает код ^ Что это означает ^ 
 +| Ticket имеет статус NEW, STREQ_AUTOACCEPT выключен | Записывает support_assignment и откладывает проверку на ST_REQUEST_NEW_RECHECK_SECONDS. | Ожидается внешнее назначение/изменение; worker не остаётся спать на этом Ticket. | 
 +| Ticket имеет статус NEW, STREQ_AUTOACCEPT включён | Запрашивает ASSIGNED; после успеха отправляет Ticket open_st_request_assigned и удаляет из своей очереди с delete_room=False. | Передаётся обработка следующей стадии. Конкретного сотрудника эта ветвь не выбирает и assigned_to не заполняет. | 
 +| На проверку пришёл Ticket уже с другим статусом | Убирает локальное состояние и запрашивает удаление комнаты уведомлений. | Данный handler прекращает обработку. Сам Ticket из backend не удаляется. | 
 +| Scoped API перехода вернул 404 | change_status убирает локальный снимок и возвращает False. | Ticket больше не доступен в рабочей области этого handler; повторный переход в этом проходе не выполняется. | 
 +| Переход или отправка завершились другой ошибкой | Ошибка передаётся общему runtime для его обработки отказа и повторов. | Передачу нельзя объявлять успешно завершённой по одному намерению отправки. | 
 + 
 +STREQ_AUTOACCEPT — переключатель автоматической ветви. Его имя не означает успешной проверки документа, выдачи роли или выбора сотрудника. В данном алгоритме явно выполняется переход состояния и передача Ticket; дальнейшее решение относится к следующему сценарию. 
 + 
 +===== Полный алгоритм и очередь (BPMN) ===== 
 +Схема описательная: isExecutable=false. Дорожки показывают worker и планировщик, а deferred_until обозначает вычисленный локальный срок, не отдельную настройку установки. Просмотр схемы не запускает процесс и не создаёт таймер.
 <sharix-bpmn> <sharix-bpmn>
 <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_open_st_request_new_routing" targetNamespace="urn:sharix:knowledge:processes"> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_st_new_logic" targetNamespace="urn:sharix:knowledge:handlers"> 
-  <bpmn:process id="Process_open_st_request_new_routing" name="Маршрутизация встроенного open_st_request_new" isExecutable="false"> +  <bpmn:process id="new_Process_new" name="open_st_request_new: Python и локальная очередь" isExecutable="false"> 
-    <bpmn:documentation>{"notes": ["Это описание built-in Python указанного Git; локально выбранная версия требует отдельной проверки. Детальный цикл ручного ожидания показан следующей схемой."], "sources": [{"commit": "624709bdbc9756e5c507ba318e987a12f1710a37", "path": "handlers/open_st_request_new.py", "repository": "handlers_examples", "sha256": "54f4706624cf3cc3a3d923af4c227150ddfa3c32bbfcb16b49df940ceea129d0"}]}</bpmn:documentation> +    <bpmn:documentation>{"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"}]}</bpmn:documentation> 
-    <bpmn:laneSet id="Lanes_open_st_request_new_routing"> +    <bpmn:laneSet id="new_Lanes_new"> 
-      <bpmn:lane id="Lane_handler" name="Python обработчика"> +      <bpmn:lane id="new_Lane_worker" name="Выполнение Python (один проход)"> 
-        <bpmn:flowNodeRef>received</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_start</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>status</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_status</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>auto</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_auto</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>manual</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_reason</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>manual_end</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_defer</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>wrong_cleanup</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_cleanup</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>wrong_end</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_stale_end</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>assign</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_transition</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>success</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_confirmed</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>failed</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_false_end</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>handoff</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_handoff</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>cleanup</bpmn:flowNodeRef> +        <bpmn:flowNodeRef>new_remove</bpmn:flowNodeRef> 
-        <bpmn:flowNodeRef>done</bpmn:flowNodeRef>+        <bpmn:flowNodeRef>new_success</bpmn:flowNodeRef> 
 +        <bpmn:flowNodeRef>new_api_error</bpmn:flowNodeRef> 
 +        <bpmn:flowNodeRef>new_send_error</bpmn:flowNodeRef> 
 +        <bpmn:flowNodeRef>new_retry</bpmn:flowNodeRef> 
 +      </bpmn:lane> 
 +      <bpmn:lane id="new_Lane_scheduler" name="Планировщик: между проходами, без занятого worker"> 
 +        <bpmn:flowNodeRef>new_waiting</bpmn:flowNodeRef> 
 +        <bpmn:flowNodeRef>new_due</bpmn:flowNodeRef> 
 +        <bpmn:flowNodeRef>new_revision</bpmn:flowNodeRef> 
 +        <bpmn:flowNodeRef>new_ready</bpmn:flowNodeRef>
       </bpmn:lane>       </bpmn:lane>
     </bpmn:laneSet>     </bpmn:laneSet>
-    <bpmn:startEvent id="received" name="Ticket передан обработчику"> +    <bpmn:startEvent id="new_start" name="Ticket готов к проходу"> 
-      <bpmn:outgoing>Flow_0</bpmn:outgoing>+      <bpmn:outgoing>new_Flow_0</bpmn:outgoing>
     </bpmn:startEvent>     </bpmn:startEvent>
-    <bpmn:exclusiveGateway id="status" name="Статус NEW?"> +    <bpmn:exclusiveGateway id="new_status" name="Снимок в NEW?"> 
-      <bpmn:incoming>Flow_0</bpmn:incoming> +      <bpmn:incoming>new_Flow_0</bpmn:incoming> 
-      <bpmn:outgoing>Flow_1</bpmn:outgoing> +      <bpmn:incoming>new_Flow_20</bpmn:incoming> 
-      <bpmn:outgoing>Flow_2</bpmn:outgoing>+      <bpmn:outgoing>new_Flow_1</bpmn:outgoing> 
 +      <bpmn:outgoing>new_Flow_2</bpmn:outgoing>
     </bpmn:exclusiveGateway>     </bpmn:exclusiveGateway>
-    <bpmn:exclusiveGateway id="auto" name="STREQ_AUTOACCEPT включён?"> +    <bpmn:exclusiveGateway id="new_auto" name="STREQ_AUTOACCEPT?"> 
-      <bpmn:incoming>Flow_1</bpmn:incoming> +      <bpmn:incoming>new_Flow_1</bpmn:incoming> 
-      <bpmn:outgoing>Flow_4</bpmn:outgoing> +      <bpmn:outgoing>new_Flow_4</bpmn:outgoing> 
-      <bpmn:outgoing>Flow_6</bpmn:outgoing>+      <bpmn:outgoing>new_Flow_7</bpmn:outgoing>
     </bpmn:exclusiveGateway>     </bpmn:exclusiveGateway>
-    <bpmn:task id="manual" name="Цикл ручного ожидания (подробно ниже)"> +    <bpmn:serviceTask id="new_reason" name="Записать support_assignment"> 
-      <bpmn:incoming>Flow_4</bpmn:incoming> +      <bpmn:documentation>Локальная причина ожидания, не комментарий Ticket.</bpmn:documentation> 
-      <bpmn:outgoing>Flow_5</bpmn:outgoing> +      <bpmn:incoming>new_Flow_4</bpmn:incoming> 
-    </bpmn:task> +      <bpmn:outgoing>new_Flow_5</bpmn:outgoing>
-    <bpmn:endEvent id="manual_end" name="Текущий проход завершён; повтор по событию/сроку"> +
-      <bpmn:incoming>Flow_5</bpmn:incoming> +
-    </bpmn:endEvent> +
-    <bpmn:serviceTask id="wrong_cleanup" name="Убрать из очереди и удалить комнату"> +
-      <bpmn:incoming>Flow_2</bpmn:incoming> +
-      <bpmn:outgoing>Flow_3</bpmn:outgoing>+
     </bpmn:serviceTask>     </bpmn:serviceTask>
-    <bpmn:endEvent id="wrong_end" name="Обработка этим handler прекращена"> +    <bpmn:serviceTask id="new_defer" name="Назначить повтор проверки"> 
-      <bpmn:incoming>Flow_3</bpmn:incoming>+      <bpmn:documentation>ST_REQUEST_NEW_RECHECK_SECONDS; вернуть Ticket, освободив worker.</bpmn:documentation> 
 +      <bpmn:incoming>new_Flow_5</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_6</bpmn:outgoing> 
 +    </bpmn:serviceTask> 
 +    <bpmn:serviceTask id="new_cleanup" name="Убрать локальный Ticket и комнату"> 
 +      <bpmn:incoming>new_Flow_2</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_3</bpmn:outgoing> 
 +    </bpmn:serviceTask> 
 +    <bpmn:endEvent id="new_stale_end" name="Этот handler больше не владеет Ticket"> 
 +      <bpmn:incoming>new_Flow_3</bpmn:incoming>
     </bpmn:endEvent>     </bpmn:endEvent>
-    <bpmn:serviceTask id="assign" name="Запросить переход в ASSIGNED через API"> +    <bpmn:serviceTask id="new_transition" name="Scoped API: ASSIGNED"> 
-      <bpmn:incoming>Flow_6</bpmn:incoming> +      <bpmn:documentation>ticket.transition; 404 означает устаревший scope, другие ошибки — исключение.</bpmn:documentation> 
-      <bpmn:outgoing>Flow_7</bpmn:outgoing>+      <bpmn:incoming>new_Flow_7</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_8</bpmn:outgoing>
     </bpmn:serviceTask>     </bpmn:serviceTask>
-    <bpmn:exclusiveGateway id="success" name="Переход подтверждён?"> +    <bpmn:exclusiveGateway id="new_confirmed" name="Переход подтверждён?"> 
-      <bpmn:incoming>Flow_7</bpmn:incoming> +      <bpmn:incoming>new_Flow_8</bpmn:incoming> 
-      <bpmn:outgoing>Flow_8</bpmn:outgoing> +      <bpmn:outgoing>new_Flow_9</bpmn:outgoing> 
-      <bpmn:outgoing>Flow_9</bpmn:outgoing>+      <bpmn:outgoing>new_Flow_10</bpmn:outgoing>
     </bpmn:exclusiveGateway>     </bpmn:exclusiveGateway>
-    <bpmn:endEvent id="failed" name="Прекратить текущий проход без handoff"> +    <bpmn:endEvent id="new_false_end" name="404: очистка уже запрошена"> 
-      <bpmn:incoming>Flow_8</bpmn:incoming>+      <bpmn:incoming>new_Flow_9</bpmn:incoming>
     </bpmn:endEvent>     </bpmn:endEvent>
-    <bpmn:serviceTask id="handoff" name="Передать в open_st_request_assigned"> +    <bpmn:sendTask id="new_handoff" name="Передать Ticket в ASSIGNED handler"> 
-      <bpmn:incoming>Flow_9</bpmn:incoming> +      <bpmn:documentation>open_st_request_assigned; попытка отправки XMPP, не завершение следующей стадии.</bpmn:documentation> 
-      <bpmn:outgoing>Flow_10</bpmn:outgoing> +      <bpmn:incoming>new_Flow_10</bpmn:incoming> 
-    </bpmn:serviceTask> +      <bpmn:outgoing>new_Flow_11</bpmn:outgoing> 
-    <bpmn:serviceTask id="cleanup" name="Убрать из очереди; комнату сохранить"> +    </bpmn:sendTask> 
-      <bpmn:incoming>Flow_10</bpmn:incoming> +    <bpmn:serviceTask id="new_remove" name="Убрать Ticket; комнату сохранить"> 
-      <bpmn:outgoing>Flow_11</bpmn:outgoing>+      <bpmn:incoming>new_Flow_11</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_12</bpmn:outgoing>
     </bpmn:serviceTask>     </bpmn:serviceTask>
-    <bpmn:endEvent id="done" name="Дальше обрабатывает ASSIGNED"> +    <bpmn:endEvent id="new_success" name="Передача текущего handler завершена"> 
-      <bpmn:incoming>Flow_11</bpmn:incoming>+      <bpmn:incoming>new_Flow_12</bpmn:incoming>
     </bpmn:endEvent>     </bpmn:endEvent>
-    <bpmn:sequenceFlow id="Flow_0" sourceRef="received" targetRef="status" name="" /> +    <bpmn:boundaryEvent id="new_api_error" name="Ошибка API" attachedToRef="new_transition" cancelActivity="true"> 
-    <bpmn:sequenceFlow id="Flow_1" sourceRef="status" targetRef="auto" name="Да" /> +      <bpmn:outgoing>new_Flow_13</bpmn:outgoing> 
-    <bpmn:sequenceFlow id="Flow_2" sourceRef="status" targetRef="wrong_cleanup" name="Нет" /> +      <bpmn:errorEventDefinition /> 
-    <bpmn:sequenceFlow id="Flow_3" sourceRef="wrong_cleanup" targetRef="wrong_end" name="" /> +    </bpmn:boundaryEvent> 
-    <bpmn:sequenceFlow id="Flow_4" sourceRef="auto" targetRef="manual" name="Нет" /> +    <bpmn:boundaryEvent id="new_send_error" name="Ошибка отправки" attachedToRef="new_handoff" cancelActivity="true"> 
-    <bpmn:sequenceFlow id="Flow_5" sourceRef="manual" targetRef="manual_end" name="" /> +      <bpmn:outgoing>new_Flow_14</bpmn:outgoing> 
-    <bpmn:sequenceFlow id="Flow_6" sourceRef="auto" targetRef="assign" name="Да" /> +      <bpmn:errorEventDefinition /> 
-    <bpmn:sequenceFlow id="Flow_7" sourceRef="assign" targetRef="success" name="" /> +    </bpmn:boundaryEvent> 
-    <bpmn:sequenceFlow id="Flow_8" sourceRef="success" targetRef="failed" name="Нет" /> +    <bpmn:serviceTask id="new_retry" name="Ошибка: processing_error и defer"> 
-    <bpmn:sequenceFlow id="Flow_9" sourceRef="success" targetRef="handoff" name="Да" /> +      <bpmn:documentation>Общий runtime: DEFERRED_TICKET_RECHECK_SECONDS; уже committed status не откатывается.</bpmn:documentation> 
-    <bpmn:sequenceFlow id="Flow_10" sourceRef="handoff" targetRef="cleanup" name="" /> +      <bpmn:incoming>new_Flow_13</bpmn:incoming> 
-    <bpmn:sequenceFlow id="Flow_11" sourceRef="cleanup" targetRef="done" name="" />+      <bpmn:incoming>new_Flow_14</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_15</bpmn:outgoing> 
 +    </bpmn:serviceTask> 
 +    <bpmn:eventBasedGateway id="new_waiting" name="Что наступило раньше?"> 
 +      <bpmn:incoming>new_Flow_6</bpmn:incoming> 
 +      <bpmn:incoming>new_Flow_15</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_16</bpmn:outgoing> 
 +      <bpmn:outgoing>new_Flow_17</bpmn:outgoing> 
 +    </bpmn:eventBasedGateway> 
 +    <bpmn:intermediateCatchEvent id="new_due" name="Текущий срок defer наступил"> 
 +      <bpmn:incoming>new_Flow_16</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_18</bpmn:outgoing> 
 +      <bpmn:timerEventDefinition> 
 +        <bpmn:timeDate xsi:type="bpmn:tFormalExpression">deferred_until</bpmn:timeDate> 
 +      </bpmn:timerEventDefinition> 
 +    </bpmn:intermediateCatchEvent> 
 +    <bpmn:intermediateCatchEvent id="new_revision" name="Подтверждена новая ревизия Ticket"> 
 +      <bpmn:documentation>Уже получен новый authoritative snapshot. Дубликат сам по себе не снимает defer.</bpmn:documentation> 
 +      <bpmn:incoming>new_Flow_17</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_19</bpmn:outgoing> 
 +      <bpmn:messageEventDefinition /> 
 +    </bpmn:intermediateCatchEvent> 
 +    <bpmn:serviceTask id="new_ready" name="Снять defer, поставить в ready FIFO"> 
 +      <bpmn:documentation>Запуск возможен при готовом XMPP и свободном worker.</bpmn:documentation> 
 +      <bpmn:incoming>new_Flow_18</bpmn:incoming> 
 +      <bpmn:incoming>new_Flow_19</bpmn:incoming> 
 +      <bpmn:outgoing>new_Flow_20</bpmn:outgoing> 
 +    </bpmn:serviceTask> 
 +    <bpmn:sequenceFlow id="new_Flow_0" sourceRef="new_start" targetRef="new_status" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_1" sourceRef="new_status" targetRef="new_auto" name="Да" /> 
 +    <bpmn:sequenceFlow id="new_Flow_2" sourceRef="new_status" targetRef="new_cleanup" name="Нет" /> 
 +    <bpmn:sequenceFlow id="new_Flow_3" sourceRef="new_cleanup" targetRef="new_stale_end" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_4" sourceRef="new_auto" targetRef="new_reason" name="Нет" /> 
 +    <bpmn:sequenceFlow id="new_Flow_5" sourceRef="new_reason" targetRef="new_defer" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_6" sourceRef="new_defer" targetRef="new_waiting" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_7" sourceRef="new_auto" targetRef="new_transition" name="Да" /> 
 +    <bpmn:sequenceFlow id="new_Flow_8" sourceRef="new_transition" targetRef="new_confirmed" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_9" sourceRef="new_confirmed" targetRef="new_false_end" name="Нет (404)" /> 
 +    <bpmn:sequenceFlow id="new_Flow_10" sourceRef="new_confirmed" targetRef="new_handoff" name="Да" /> 
 +    <bpmn:sequenceFlow id="new_Flow_11" sourceRef="new_handoff" targetRef="new_remove" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_12" sourceRef="new_remove" targetRef="new_success" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_13" sourceRef="new_api_error" targetRef="new_retry" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_14" sourceRef="new_send_error" targetRef="new_retry" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_15" sourceRef="new_retry" targetRef="new_waiting" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_16" sourceRef="new_waiting" targetRef="new_due" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_17" sourceRef="new_waiting" targetRef="new_revision" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_18" sourceRef="new_due" targetRef="new_ready" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_19" sourceRef="new_revision" targetRef="new_ready" name="" /> 
 +    <bpmn:sequenceFlow id="new_Flow_20" sourceRef="new_ready" targetRef="new_status" name="Новый проход" />
   </bpmn:process>   </bpmn:process>
-  <bpmn:collaboration id="Collaboration_open_st_request_new_routing"> +  <bpmn:collaboration id="Collaboration_st_new_logic"> 
-    <bpmn:participant id="Pool_open_st_request_new_routing" name="Маршрутизация встроенного open_st_request_new" processRef="Process_open_st_request_new_routing" />+    <bpmn:participant id="new_Pool_new" name="open_st_request_new: Python и локальная очередь" processRef="new_Process_new" />
   </bpmn:collaboration>   </bpmn:collaboration>
-  <bpmndi:BPMNDiagram id="Diagram_open_st_request_new_routing"> +  <bpmndi:BPMNDiagram id="Diagram_st_new_logic"> 
-    <bpmndi:BPMNPlane id="Plane_open_st_request_new_routing" bpmnElement="Collaboration_open_st_request_new_routing"> +    <bpmndi:BPMNPlane id="Plane_st_new_logic" bpmnElement="Collaboration_st_new_logic"> 
-      <bpmndi:BPMNShape id="DI_Pool_open_st_request_new_routing" bpmnElement="Pool_open_st_request_new_routing" isHorizontal="true"> +      <bpmndi:BPMNShape id="new_DI_Pool_new" bpmnElement="new_Pool_new" isHorizontal="true"> 
-        <dc:Bounds x="0" y="0" width="1420" height="560" />+        <dc:Bounds x="0.0" y="0.0" width="1880" height="880" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_Lane_handler" bpmnElement="Lane_handler" isHorizontal="true"> +      <bpmndi:BPMNShape id="new_DI_Lane_worker" bpmnElement="new_Lane_worker" isHorizontal="true"> 
-        <dc:Bounds x="30" y="0" width="1390" height="560" />+        <dc:Bounds x="30.0" y="0.0" width="1850" height="550.0" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_received" bpmnElement="received"> +      <bpmndi:BPMNShape id="new_DI_Lane_scheduler" bpmnElement="new_Lane_scheduler" isHorizontal="true"> 
-        <dc:Bounds x="142.0" y="82.0" width="36" height="36" />+        <dc:Bounds x="30.0" y="550.0" width="1850" height="330.0" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_status" bpmnElement="status"> +      <bpmndi:BPMNShape id="new_DI_start" bpmnElement="new_start"> 
-        <dc:Bounds x="335.0" y="75.0" width="50" height="50" />+        <dc:Bounds x="142.0" y="102.0" width="36" height="36" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_auto" bpmnElement="auto"> +      <bpmndi:BPMNShape id="new_DI_status" bpmnElement="new_status"> 
-        <dc:Bounds x="555.0" y="75.0" width="50" height="50" />+        <dc:Bounds x="325.0" y="95.0" width="50" height="50" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_manual" bpmnElement="manual"> +      <bpmndi:BPMNShape id="new_DI_auto" bpmnElement="new_auto"> 
-        <dc:Bounds x="745.0" y="65.0" width="150" height="70" />+        <dc:Bounds x="535.0" y="95.0" width="50" height="50" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_manual_end" bpmnElement="manual_end"> +      <bpmndi:BPMNShape id="new_DI_reason" bpmnElement="new_reason"> 
-        <dc:Bounds x="1022.0" y="82.0" width="36" height="36" />+        <dc:Bounds x="725.0" y="85.0" width="150" height="70" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_wrong_cleanup" bpmnElement="wrong_cleanup"> +      <bpmndi:BPMNShape id="new_DI_defer" bpmnElement="new_defer"> 
-        <dc:Bounds x="285.0" y="245.0" width="150" height="70" />+        <dc:Bounds x="965.0" y="85.0" width="150" height="70" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_wrong_end" bpmnElement="wrong_end"> +      <bpmndi:BPMNShape id="new_DI_cleanup" bpmnElement="new_cleanup"> 
-        <dc:Bounds x="342.0" y="402.0" width="36" height="36" />+        <dc:Bounds x="275.0" y="265.0" width="150" height="70" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_assign" bpmnElement="assign"> +      <bpmndi:BPMNShape id="new_DI_stale_end" bpmnElement="new_stale_end"> 
-        <dc:Bounds x="505.0" y="245.0" width="150" height="70" />+        <dc:Bounds x="542.0" y="282.0" width="36" height="36" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_success" bpmnElement="success"> +      <bpmndi:BPMNShape id="new_DI_transition" bpmnElement="new_transition"> 
-        <dc:Bounds x="795.0" y="255.0" width="50" height="50" />+        <dc:Bounds x="725.0" y="265.0" width="150" height="70" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_failed" bpmnElement="failed"> +      <bpmndi:BPMNShape id="new_DI_confirmed" bpmnElement="new_confirmed"> 
-        <dc:Bounds x="1022.0" y="262.0" width="36" height="36" />+        <dc:Bounds x="1015.0" y="275.0" width="50" height="50" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_handoff" bpmnElement="handoff"> +      <bpmndi:BPMNShape id="new_DI_false_end" bpmnElement="new_false_end"> 
-        <dc:Bounds x="745.0" y="425.0" width="150" height="70" />+        <dc:Bounds x="1022.0" y="442.0" width="36" height="36" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_cleanup" bpmnElement="cleanup"> +      <bpmndi:BPMNShape id="new_DI_handoff" bpmnElement="new_handoff"> 
-        <dc:Bounds x="965.0" y="425.0" width="150" height="70" />+        <dc:Bounds x="1205.0" y="265.0" width="150" height="70" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="DI_done" bpmnElement="done"> +      <bpmndi:BPMNShape id="new_DI_remove" bpmnElement="new_remove"> 
-        <dc:Bounds x="1242.0" y="442.0" width="36" height="36" />+        <dc:Bounds x="1445.0" y="265.0" width="150" height="70" />
       </bpmndi:BPMNShape>       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="DI_Flow_0" bpmnElement="Flow_0"> +      <bpmndi:BPMNShape id="new_DI_success" bpmnElement="new_success"> 
-        <di:waypoint x="178.0" y="100.0" /> +        <dc:Bounds x="1702.0" y="282.0" width="36" height="36" /> 
-        <di:waypoint x="335.0" y="100.0" />+      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNShape id="new_DI_api_error" bpmnElement="new_api_error"> 
 +        <dc:Bounds x="832.0" y="317.0" width="36" height="36" /> 
 +      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNShape id="new_DI_send_error" bpmnElement="new_send_error"> 
 +        <dc:Bounds x="1312.0" y="317.0" width="36" height="36" /> 
 +      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNShape id="new_DI_retry" bpmnElement="new_retry"> 
 +        <dc:Bounds x="1205.0" y="445.0" width="150" height="70" /> 
 +      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNShape id="new_DI_waiting" bpmnElement="new_waiting"> 
 +        <dc:Bounds x="1015.0" y="635.0" width="50" height="50" /> 
 +      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNShape id="new_DI_due" bpmnElement="new_due"> 
 +        <dc:Bounds x="1262.0" y="602.0" width="36" height="36" /> 
 +      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNShape id="new_DI_revision" bpmnElement="new_revision"> 
 +        <dc:Bounds x="1262.0" y="762.0" width="36" height="36" /> 
 +      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNShape id="new_DI_ready" bpmnElement="new_ready"> 
 +        <dc:Bounds x="1445.0" y="625.0" width="150" height="70" /> 
 +      </bpmndi:BPMNShape> 
 +      <bpmndi:BPMNEdge id="new_DI_Flow_0" bpmnElement="new_Flow_0"> 
 +        <di:waypoint x="178.0" y="120.0" /> 
 +        <di:waypoint x="325.0" y="120.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_1" bpmnElement="Flow_1"> +      <bpmndi:BPMNEdge id="new_DI_Flow_1" bpmnElement="new_Flow_1"> 
-        <di:waypoint x="385.0" y="100.0" /> +        <di:waypoint x="375.0" y="120.0" /> 
-        <di:waypoint x="555.0" y="100.0" />+        <di:waypoint x="535.0" y="120.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_2" bpmnElement="Flow_2"> +      <bpmndi:BPMNEdge id="new_DI_Flow_2" bpmnElement="new_Flow_2"> 
-        <di:waypoint x="360.0" y="125.0" /> +        <di:waypoint x="350.0" y="145.0" /> 
-        <di:waypoint x="360.0" y="245.0" />+        <di:waypoint x="350.0" y="265.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_3" bpmnElement="Flow_3"> +      <bpmndi:BPMNEdge id="new_DI_Flow_3" bpmnElement="new_Flow_3"> 
-        <di:waypoint x="360.0" y="315.0" /> +        <di:waypoint x="425.0" y="300.0" /> 
-        <di:waypoint x="360.0" y="402.0" />+        <di:waypoint x="542.0" y="300.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_4" bpmnElement="Flow_4"> +      <bpmndi:BPMNEdge id="new_DI_Flow_4" bpmnElement="new_Flow_4"> 
-        <di:waypoint x="605.0" y="100.0" /> +        <di:waypoint x="585.0" y="120.0" /> 
-        <di:waypoint x="745.0" y="100.0" />+        <di:waypoint x="725.0" y="120.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_5" bpmnElement="Flow_5"> +      <bpmndi:BPMNEdge id="new_DI_Flow_5" bpmnElement="new_Flow_5"> 
-        <di:waypoint x="895.0" y="100.0" /> +        <di:waypoint x="875.0" y="120.0" /> 
-        <di:waypoint x="1022.0" y="100.0" />+        <di:waypoint x="965.0" y="120.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_6" bpmnElement="Flow_6"> +      <bpmndi:BPMNEdge id="new_DI_Flow_6" bpmnElement="new_Flow_6"> 
-        <di:waypoint x="580.0" y="125.0" /> +        <di:waypoint x="1115.0" y="120.0" /> 
-        <di:waypoint x="580.0" y="245.0" />+        <di:waypoint x="1780.0" y="120.0" /> 
 +        <di:waypoint x="1780.0" y="565.0" /> 
 +        <di:waypoint x="1040.0" y="565.0" /> 
 +        <di:waypoint x="1040.0" y="635.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_7" bpmnElement="Flow_7"> +      <bpmndi:BPMNEdge id="new_DI_Flow_7" bpmnElement="new_Flow_7"> 
-        <di:waypoint x="655.0" y="280.0" /> +        <di:waypoint x="585.0" y="120.0" /> 
-        <di:waypoint x="795.0" y="280.0" />+        <di:waypoint x="655.0" y="120.0" /> 
 +        <di:waypoint x="655.0" y="300.0" /> 
 +        <di:waypoint x="725.0" y="300.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_8" bpmnElement="Flow_8"> +      <bpmndi:BPMNEdge id="new_DI_Flow_8" bpmnElement="new_Flow_8"> 
-        <di:waypoint x="845.0" y="280.0" /> +        <di:waypoint x="875.0" y="300.0" /> 
-        <di:waypoint x="1022.0" y="280.0" />+        <di:waypoint x="1015.0" y="300.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_9" bpmnElement="Flow_9"> +      <bpmndi:BPMNEdge id="new_DI_Flow_9" bpmnElement="new_Flow_9"> 
-        <di:waypoint x="820.0" y="305.0" /> +        <di:waypoint x="1040.0" y="325.0" /> 
-        <di:waypoint x="820.0" y="425.0" />+        <di:waypoint x="1040.0" y="442.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_10" bpmnElement="Flow_10"> +      <bpmndi:BPMNEdge id="new_DI_Flow_10" bpmnElement="new_Flow_10"> 
-        <di:waypoint x="895.0" y="460.0" /> +        <di:waypoint x="1065.0" y="300.0" /> 
-        <di:waypoint x="965.0" y="460.0" />+        <di:waypoint x="1205.0" y="300.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_11" bpmnElement="Flow_11"> +      <bpmndi:BPMNEdge id="new_DI_Flow_11" bpmnElement="new_Flow_11"> 
-        <di:waypoint x="1115.0" y="460.0" /> +        <di:waypoint x="1355.0" y="300.0" /> 
-        <di:waypoint x="1242.0" y="460.0" />+        <di:waypoint x="1445.0" y="300.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-    </bpmndi:BPMNPlane> +      <bpmndi:BPMNEdge id="new_DI_Flow_12" bpmnElement="new_Flow_12"> 
-  </bpmndi:BPMNDiagram> +        <di:waypoint x="1595.0" y="300.0" /> 
-</bpmn:definitions> +        <di:waypoint x="1702.0" y="300.0" />
-</sharix-bpmn> +
- +
-При неподтверждённом переходе обработчик возвращает ''None'' и не делает handoff. При успешном переходе он вызывает ''send_to_handler'' и удаляет Ticket из своей локальной очереди с ''delete_room=False''. End events обозначают окончание текущего прохода/обработки этим handler, а не безусловное завершение всей заявки. +
- +
-===== Назначение и границы ручного ожидания ===== +
-Процесс начинается, когда Ticket уже передан обработчику ''open_st_request_new''. Он показывает, как обработчик проверяет свой рабочий статус, фиксирует причину ожидания и передаёт повторную проверку планировщику. Две дорожки обозначают программные компоненты: обработчик и планировщик его очереди. Действия заявителя или сотрудника сюда не включены: из значения ''support_assignment'' нельзя вывести полный сценарий ручного согласования. +
- +
-BPMN используется для описания. Просмотр схемы в Wiki не запускает обработчик и не создаёт таймер. В XML установлен ''isExecutable=false''; ''scheduled_recheck_at'' — условное обозначение вычисленного срока, а не имя настройки установки. +
- +
-===== Подробный цикл ручного ожидания (BPMN) ===== +
-<sharix-bpmn> +
-<?xml version="1.0" encoding="UTF-8"?> +
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_open_st_request_new" targetNamespace="urn:sharix:knowledge:processes"> +
-  <bpmn:process id="Process_open_st_request_new" name="Ожидание заявки: open_st_request_new" isExecutable="false"> +
-    <bpmn:documentation>{"notes": ["Схема описывает указанный обработчик ожидания; действия сотрудника вне этого workspace не выводятся из имени waiting_reason.", "Таймер — ожидание элемента очереди, а не блокирующий sleep обработчика. Новое внешнее событие снимает defer досрочно. Срок берётся из действующей настройки; числовое значение не предполагается. scheduled_recheck_at — символическое обозначение рассчитанного срока. После перезапуска локальная очередь восстанавливается из backend."], "sources": [{"commit": "624709bdbc9756e5c507ba318e987a12f1710a37", "path": "generated_handler_blocks/open_st_request_new.json", "repository": "sharix-open-handlers-examples", "sha256": "f58eda1b10a41713efecc12cd49105da30368c1e8d278b6fb74411c3be38f6ea"}, {"commit": "b13d7f455b44968785bfda5b8488b1d5adff0f5f", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}]}</bpmn:documentation> +
-    <bpmn:laneSet id="Lanes_open_st_request_new"> +
-      <bpmn:lane id="Lane_handler" name="Обработчик open_st_request_new"> +
-        <bpmn:flowNodeRef>received</bpmn:flowNodeRef> +
-        <bpmn:flowNodeRef>status</bpmn:flowNodeRef> +
-        <bpmn:flowNodeRef>reason</bpmn:flowNodeRef> +
-        <bpmn:flowNodeRef>defer</bpmn:flowNodeRef> +
-        <bpmn:flowNodeRef>remove</bpmn:flowNodeRef> +
-        <bpmn:flowNodeRef>removed</bpmn:flowNodeRef> +
-      </bpmn:lane> +
-      <bpmn:lane id="Lane_queue" name="Планировщик очереди (handlers_backend)"> +
-        <bpmn:flowNodeRef>waiting</bpmn:flowNodeRef> +
-        <bpmn:flowNodeRef>due</bpmn:flowNodeRef> +
-        <bpmn:flowNodeRef>changed</bpmn:flowNodeRef> +
-      </bpmn:lane> +
-    </bpmn:laneSet> +
-    <bpmn:startEvent id="received" name="Ticket передан обработчику"> +
-      <bpmn:outgoing>Flow_0</bpmn:outgoing> +
-    </bpmn:startEvent> +
-    <bpmn:exclusiveGateway id="status" name="Статус NEW?"> +
-      <bpmn:incoming>Flow_0</bpmn:incoming> +
-      <bpmn:incoming>Flow_8</bpmn:incoming> +
-      <bpmn:incoming>Flow_9</bpmn:incoming> +
-      <bpmn:outgoing>Flow_1</bpmn:outgoing> +
-      <bpmn:outgoing>Flow_3</bpmn:outgoing> +
-    </bpmn:exclusiveGateway> +
-    <bpmn:serviceTask id="reason" name="Указать причину ожидания"> +
-      <bpmn:documentation>waiting_reason=support_assignment</bpmn:documentation> +
-      <bpmn:incoming>Flow_1</bpmn:incoming> +
-      <bpmn:outgoing>Flow_2</bpmn:outgoing> +
-    </bpmn:serviceTask> +
-    <bpmn:serviceTask id="defer" name="Запланировать повторную проверку"> +
-      <bpmn:documentation>Настройка: ST_REQUEST_NEW_RECHECK_SECONDS</bpmn:documentation> +
-      <bpmn:incoming>Flow_2</bpmn:incoming> +
-      <bpmn:outgoing>Flow_5</bpmn:outgoing> +
-    </bpmn:serviceTask> +
-    <bpmn:serviceTask id="remove" name="Убрать Ticket из очереди и удалить комнату"> +
-      <bpmn:incoming>Flow_3</bpmn:incoming> +
-      <bpmn:outgoing>Flow_4</bpmn:outgoing> +
-    </bpmn:serviceTask> +
-    <bpmn:endEvent id="removed" name="Обработка прекращена"> +
-      <bpmn:incoming>Flow_4</bpmn:incoming> +
-    </bpmn:endEvent> +
-    <bpmn:eventBasedGateway id="waiting" name="Ожидать событие"> +
-      <bpmn:incoming>Flow_5</bpmn:incoming> +
-      <bpmn:outgoing>Flow_6</bpmn:outgoing> +
-      <bpmn:outgoing>Flow_7</bpmn:outgoing> +
-    </bpmn:eventBasedGateway> +
-    <bpmn:intermediateCatchEvent id="due" name="Срок повторной проверки"> +
-      <bpmn:documentation>Настройка: ST_REQUEST_NEW_RECHECK_SECONDS</bpmn:documentation> +
-      <bpmn:incoming>Flow_6</bpmn:incoming> +
-      <bpmn:outgoing>Flow_8</bpmn:outgoing> +
-      <bpmn:timerEventDefinition> +
-        <bpmn:timeDate xsi:type="bpmn:tFormalExpression">scheduled_recheck_at</bpmn:timeDate> +
-      </bpmn:timerEventDefinition> +
-    </bpmn:intermediateCatchEvent> +
-    <bpmn:intermediateCatchEvent id="changed" name="Новое внешнее событие Ticket"> +
-      <bpmn:incoming>Flow_7</bpmn:incoming> +
-      <bpmn:outgoing>Flow_9</bpmn:outgoing> +
-      <bpmn:messageEventDefinition /> +
-    </bpmn:intermediateCatchEvent> +
-    <bpmn:sequenceFlow id="Flow_0" sourceRef="received" targetRef="status" name="" /> +
-    <bpmn:sequenceFlow id="Flow_1" sourceRef="status" targetRef="reason" name="Да" /> +
-    <bpmn:sequenceFlow id="Flow_2" sourceRef="reason" targetRef="defer" name="" /> +
-    <bpmn:sequenceFlow id="Flow_3" sourceRef="status" targetRef="remove" name="Нет" /> +
-    <bpmn:sequenceFlow id="Flow_4" sourceRef="remove" targetRef="removed" name="" /> +
-    <bpmn:sequenceFlow id="Flow_5" sourceRef="defer" targetRef="waiting" name="" /> +
-    <bpmn:sequenceFlow id="Flow_6" sourceRef="waiting" targetRef="due" name="" /> +
-    <bpmn:sequenceFlow id="Flow_7" sourceRef="waiting" targetRef="changed" name="" /> +
-    <bpmn:sequenceFlow id="Flow_8" sourceRef="due" targetRef="status" name="Вернуть в готовую очередь" /> +
-    <bpmn:sequenceFlow id="Flow_9" sourceRef="changed" targetRef="status" name="Разбудить досрочно" /> +
-  </bpmn:process> +
-  <bpmn:collaboration id="Collaboration_open_st_request_new"> +
-    <bpmn:participant id="Pool_open_st_request_new" name="Ожидание заявки: open_st_request_new" processRef="Process_open_st_request_new" /> +
-  </bpmn:collaboration> +
-  <bpmndi:BPMNDiagram id="Diagram_open_st_request_new"> +
-    <bpmndi:BPMNPlane id="Plane_open_st_request_new" bpmnElement="Collaboration_open_st_request_new"> +
-      <bpmndi:BPMNShape id="DI_Pool_open_st_request_new" bpmnElement="Pool_open_st_request_new" isHorizontal="true"> +
-        <dc:Bounds x="0" y="0" width="1190" height="550" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_Lane_handler" bpmnElement="Lane_handler" isHorizontal="true"> +
-        <dc:Bounds x="30" y="0" width="1160" height="275.0" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_Lane_queue" bpmnElement="Lane_queue" isHorizontal="true"> +
-        <dc:Bounds x="30" y="275.0" width="1160" height="275.0" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_received" bpmnElement="received"> +
-        <dc:Bounds x="152.0" y="82.0" width="36" height="36" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_status" bpmnElement="status"> +
-        <dc:Bounds x="345.0" y="75.0" width="50" height="50" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_reason" bpmnElement="reason"> +
-        <dc:Bounds x="495.0" y="65.0" width="150" height="70" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_defer" bpmnElement="defer"> +
-        <dc:Bounds x="715.0" y="65.0" width="150" height="70" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_remove" bpmnElement="remove"> +
-        <dc:Bounds x="495.0" y="185.0" width="150" height="70" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_removed" bpmnElement="removed"> +
-        <dc:Bounds x="692.0" y="202.0" width="36" height="36" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_waiting" bpmnElement="waiting"> +
-        <dc:Bounds x="765.0" y="335.0" width="50" height="50" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_due" bpmnElement="due"> +
-        <dc:Bounds x="1012.0" y="312.0" width="36" height="36" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNShape id="DI_changed" bpmnElement="changed"> +
-        <dc:Bounds x="1012.0" y="432.0" width="36" height="36" /> +
-      </bpmndi:BPMNShape> +
-      <bpmndi:BPMNEdge id="DI_Flow_0" bpmnElement="Flow_0"> +
-        <di:waypoint x="188.0" y="100.0" /> +
-        <di:waypoint x="345.0" y="100.0" />+
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_1" bpmnElement="Flow_1"> +      <bpmndi:BPMNEdge id="new_DI_Flow_13" bpmnElement="new_Flow_13"> 
-        <di:waypoint x="395.0" y="100.0" /> +        <di:waypoint x="868.0" y="335.0" /> 
-        <di:waypoint x="495.0" y="100.0" />+        <di:waypoint x="900.0" y="335.0" /> 
 +        <di:waypoint x="900.0" y="400.0" /> 
 +        <di:waypoint x="1280.0" y="400.0" /> 
 +        <di:waypoint x="1280.0" y="445.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_2" bpmnElement="Flow_2"> +      <bpmndi:BPMNEdge id="new_DI_Flow_14" bpmnElement="new_Flow_14"> 
-        <di:waypoint x="645.0" y="100.0" /> +        <di:waypoint x="1348.0" y="335.0" /> 
-        <di:waypoint x="715.0" y="100.0" />+        <di:waypoint x="1400.0" y="335.0" /> 
 +        <di:waypoint x="1400.0" y="400.0" /> 
 +        <di:waypoint x="1280.0" y="400.0" /> 
 +        <di:waypoint x="1280.0" y="445.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_3" bpmnElement="Flow_3"> +      <bpmndi:BPMNEdge id="new_DI_Flow_15" bpmnElement="new_Flow_15"> 
-        <di:waypoint x="395.0" y="100.0" /> +        <di:waypoint x="1355.0" y="480.0" /> 
-        <di:waypoint x="445.0" y="100.0" /> +        <di:waypoint x="1400.0" y="520.0" /> 
-        <di:waypoint x="445.0" y="220.0" /> +        <di:waypoint x="1040.0" y="520.0" /> 
-        <di:waypoint x="495.0" y="220.0" />+        <di:waypoint x="1040.0" y="635.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_4" bpmnElement="Flow_4"> +      <bpmndi:BPMNEdge id="new_DI_Flow_16" bpmnElement="new_Flow_16"> 
-        <di:waypoint x="645.0" y="220.0" /> +        <di:waypoint x="1065.0" y="660.0" /> 
-        <di:waypoint x="692.0" y="220.0" />+        <di:waypoint x="1163.5" y="660.0" /> 
 +        <di:waypoint x="1163.5" y="620.0" /> 
 +        <di:waypoint x="1262.0" y="620.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_5" bpmnElement="Flow_5"> +      <bpmndi:BPMNEdge id="new_DI_Flow_17" bpmnElement="new_Flow_17"> 
-        <di:waypoint x="790.0" y="135.0" /> +        <di:waypoint x="1065.0" y="660.0" /> 
-        <di:waypoint x="790.0" y="335.0" />+        <di:waypoint x="1163.5" y="660.0" /> 
 +        <di:waypoint x="1163.5" y="780.0" /> 
 +        <di:waypoint x="1262.0" y="780.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_6" bpmnElement="Flow_6"> +      <bpmndi:BPMNEdge id="new_DI_Flow_18" bpmnElement="new_Flow_18"> 
-        <di:waypoint x="815.0" y="360.0" /> +        <di:waypoint x="1298.0" y="620.0" /> 
-        <di:waypoint x="913.5" y="360.0" /> +        <di:waypoint x="1371.5" y="620.0" /> 
-        <di:waypoint x="913.5" y="330.0" /> +        <di:waypoint x="1371.5" y="660.0" /> 
-        <di:waypoint x="1012.0" y="330.0" />+        <di:waypoint x="1445.0" y="660.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_7" bpmnElement="Flow_7"> +      <bpmndi:BPMNEdge id="new_DI_Flow_19" bpmnElement="new_Flow_19"> 
-        <di:waypoint x="815.0" y="360.0" /> +        <di:waypoint x="1298.0" y="780.0" /> 
-        <di:waypoint x="913.5" y="360.0" /> +        <di:waypoint x="1371.5" y="780.0" /> 
-        <di:waypoint x="913.5" y="450.0" /> +        <di:waypoint x="1371.5" y="660.0" /> 
-        <di:waypoint x="1012.0" y="450.0" />+        <di:waypoint x="1445.0" y="660.0" />
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="DI_Flow_8" bpmnElement="Flow_8"> +      <bpmndi:BPMNEdge id="new_DI_Flow_20" bpmnElement="new_Flow_20"> 
-        <di:waypoint x="1048.0" y="330.0" /> +        <di:waypoint x="1595.0" y="660.0" /> 
-        <di:waypoint x="1150" y="330" /> +        <di:waypoint x="1840.0" y="660.0" /> 
-        <di:waypoint x="1150" y="40" /> +        <di:waypoint x="1840.0" y="45.0" /> 
-        <di:waypoint x="370" y="40" /> +        <di:waypoint x="350.0" y="45.0" /> 
-        <di:waypoint x="370.0" y="75.0" />+        <di:waypoint x="350.0" y="95.0" />
         <bpmndi:BPMNLabel>         <bpmndi:BPMNLabel>
-          <dc:Bounds x="800" y="14" width="180" height="26" /> +          <dc:Bounds x="1525.0" y="15.0" width="180" height="26" />
-        </bpmndi:BPMNLabel> +
-      </bpmndi:BPMNEdge> +
-      <bpmndi:BPMNEdge id="DI_Flow_9" bpmnElement="Flow_9"> +
-        <di:waypoint x="1048.0" y="450.0" /> +
-        <di:waypoint x="1200" y="450" /> +
-        <di:waypoint x="1200" y="10" /> +
-        <di:waypoint x="370" y="10" /> +
-        <di:waypoint x="370.0" y="75.0" /> +
-        <bpmndi:BPMNLabel> +
-          <dc:Bounds x="800" y="-16" width="180" height="26" />+
         </bpmndi:BPMNLabel>         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>       </bpmndi:BPMNEdge>
Строка 439: Строка 620:
 </sharix-bpmn> </sharix-bpmn>
  
-===== Как проходит ожидание ===== +===== Как устроено ручное ожидание ===== 
-  - Обработчик получает Ticket и проверяет соответствие статусу ''NEW'', указанному в его workspace. +  - Handler сверяет текущий статус Ticket с NEW. 
-  - Если статус соответствует и ''STREQ_AUTOACCEPT'' отключён, обработчик записывает локальную причину ожидания ''support_assignment'' и назначает повторную проверку через ''ST_REQUEST_NEW_RECHECK_SECONDS''. Число секунд берётся из действующей конфигурации handlers; по одной схеме его определить нельзя. Реализация требует положительное целое значение, минимум одна секунда. +  - При выключенном STREQ_AUTOACCEPT сохраняет в памяти причину support_assignment. 
-  - Текущий проход обработчика завершается. Отложенный Ticket не занимает рабочий поток ожиданием; очередь может обрабатывать другие готовые элементы. +  - defer_ticket_for_setting читает ST_REQUEST_NEW_RECHECK_SECONDS через конфигурацию handlers; требуется положительное целое значение, минимум одна секунда. Значение конкретного сервера по этой статье не определяется. 
-  - При наступлении срока планировщик снимает отсрочку и возвращает Ticket в готовую очередь. Следующий проход снова проверяет статус. Истечение таймера означает готовность к запуску, а не гарантию запуска в ту же секунду: учитываются доступные workers и готовность XMPP. +  - Ticket получает локальный срок defer, текущий проход заканчивается, а очередь может выполнять другие готовые элементы. 
-  - Распознанное внешнее событие может сделать Ticket готовым раньше срока. Например, ''request_ticket_ready'' снимает локальную отсрочку и будит планировщик. События обновления Ticket обрабатываются с получением актуального состояния из backend. После пробуждения заново проверяется статус, решение прежнего прохода не считается вечным. +  - После срока планировщик возвращает элемент в готовую очередь. Фактическое начало зависит от доступного worker и готовности XMPP; это не обещание запуска ровно в момент срока. 
-  - Если Ticket дошёл до проверки обработчика уже с другим статусом, ветка ELSE убирает его из локальной очереди и запрашивает удаление комнаты уведомлений. Это прекращение обработки данным обработчиком; оно не означает удаления самого Ticket из backend или завершения всей заявки.+  - Распознанное внешнее событие может снять отсрочку раньше. request_ticket_ready очищает локальный defer и будит планировщик; обновлённое состояние заново участвует в решении.
  
-===== Дополнительные пути runtime ===== +Причина ожидания и срок находятся в памяти процесса. После restart они не восстанавливаются как долговечное бизнес-обязательство: очередь получает актуальные Ticket из backend и оценивает их заново. Такой defer не заменяет журнал решений сотрудника или сохранённый SLA-таймер.
-Схема показывает основной цикл одного Ticket. Периодическая сверка очереди с backend также может обновить снимок, снять отсрочку либо исключить Ticket, который больше не входит в область данного обработчика. Поэтому не каждое изменение статуса обязательно дойдёт до ветки ELSE на картинке: runtime может убрать элемент раньше при сверке или событии удаления.+
  
-Отсрочка и причина ожидания хранятся в памяти процесса. После перезапуска прежний срок таймера не восстанавливается как сохранённое бизнес-обязательство: очередь загружает актуальные Ticket из backend и оценивает их заново. Не следует использовать этот локальный механизм как доказательство долговечного SLA-таймера или как журнал решений сотрудника.+===== Передача NEW → ASSIGNED ===== 
 +  - Обработчик вызывает scoped transition API с capability ticket.transition. 
 +  - Backend ограничивает Ticket типом и рабочим статусом handler, проверяет допустимость перехода и сохраняет Event в транзакции. 
 +  - После commit ticket.changed адресуется новому handler, а ticket.moved — прежнему. 
 +  - Сама Python-ветвь NEW после успешного перехода также отправляет Ticket в open_st_request_assigned и убирает его из своей очереди, сохраняя комнату при этой передаче.
  
-Ошибки загрузки из backend, повторные события, остановка процесса и исчерпание попыток относятся к общему runtime и не развёрнуты в отдельные ветки этой компактной схемы. Отказ API при сверке не доказывает исчезновения Ticket: runtime сохраняет локальный снимок и пишет диагностику. Эти пути нужно учитывать при поиске неисправности.+Смена Ticket.status, попытка XMPP-отправки и фактическая работа следующего handler — отдельные наблюдаемые результаты. Если отправка после смены статуса не удалась, уже сохранённый переход не становится автоматически отменённым. Подробности внешних участников и восстановления — [[sharixopen:knowledge:scenarios:st_request_assigned|сценарий ASSIGNED]].
  
-===== Что проверять при диагностике ===== +===== Сверка очереди и ошибки ===== 
-  * Соответствует ли Ticket типу и рабочему статусу обработчика; не был ли он исключён из очереди после актуальной сверки backend. +Runtime периодически сопоставляет локальный состав с backend. В результате он может:
-  * Какое значение ''ST_REQUEST_NEW_RECHECK_SECONDS'' действительно настроено у запущенного экземпляра handlers. +
-  * Есть ли причина ожидания и локальный срок defer; получал ли планировщик событие, снимающее отсрочку раньше срока. +
-  * Есть ли свободный worker и готово ли XMPP-соединение. Готовность Ticket и фактический запуск — разные моменты. +
-  * Не перезапускался ли процесс: локальные признаки предыдущего ожидания после этого нельзя считать сохранёнными. +
-  * Соответствуют ли установленные workspace и runtime версиям ниже. Схема подтверждает изученный код, но сама по себе не подтверждает состав конкретной работающей установки.+
  
-===== Проверенные источники ===== +  * обновить снимок Ticket; 
-  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/624709bdbc9756e5c507ba318e987a12f1710a37/handlers/open_st_request_new.py|Встроенный Python open_st_request_new]] — Git 624709bdbc9756e5c507ba318e987a12f1710a37; SHA-256 54f4706624cf3cc3a3d923af4c227150ddfa3c32bbfcb16b49df940ceea129d0.+  * сделать обновлённый элемент готовым; 
 +  * исключить Ticket, который больше не входит в рабочую область; 
 +  * восстановить состав после пропущенного события или перезапуска.
  
-  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/624709bdbc9756e5c507ba318e987a12f1710a37/generated_handler_blocks/open_st_request_new.json|sharix-open-handlers-examples / generated_handler_blocks/open_st_request_new.json]] — Git ''624709bdbc9756e5c507ba318e987a12f1710a37''; SHA-256 ''f58eda1b10a41713efecc12cd49105da30368c1e8d278b6fb74411c3be38f6ea''. +Поэтому изменение статуса не обязано доходить до ELSE на схеме: элемент может быть исключён раньше по событию или успешной сверке. Ошибка запроса сверки не доказывает исчезновения Ticket: runtime сохраняет локальный снимок и пишет диагностику. Ошибки загрузки, исчерпание попыток и остановка относятся к общему runtime; эта диаграмма не разворачивает все его аварийные ветви.
-  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/b13d7f455b44968785bfda5b8488b1d5adff0f5f/core/blockly_runtime.py|sharix-open-handlers-backend / core/blockly_runtime.py]] — Git ''b13d7f455b44968785bfda5b8488b1d5adff0f5f''; SHA-256 ''3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428''.+
  
-В workspace проверены ветки PROCESS/DO/ELSE и параметры ожидания. В runtime проверены ''start_handler'', ''promote_due_deferred'', ''request_ticket_ready'', ''defer_ticket_for_setting'', ''defer_ticket_for_seconds'', ''set_waiting_reason'' и обработка событий/сверки. Git-источники обновлены перед публикацией; актуальные вершины совпали с указанными версиями.+===== Что записать при разборе зависания ===== 
 +  * ID Ticket, его тип и сохранённый статус в backend. 
 +  * Фактически выбранную версию handler, workspace и Python. 
 +  * Действующие значения STREQ_AUTOACCEPT и ST_REQUEST_NEW_RECHECK_SECONDS — без секретов конфигурации. 
 +  * Был ли Ticket принят в очередь и есть ли локальные причина ожидания/срок defer. 
 +  * Какое событие или успешная сверка поступили после этого. 
 +  * Готовность XMPP и наличие свободного worker. 
 +  * Последний restart процесса: после него старые локальные признаки не считаются сохранёнными. 
 +  * Результат transition API и отдельно результат отправки следующему handler, если выполнялась автоматическая ветвь. 
 + 
 +Если статус уже ASSIGNED, разбирать его обработку нужно у следующего handler, а не повторно менять NEW по старому снимку. При 404 проверяют область и актуальный статус; права API-ключа не расширяют ради прохождения запроса.
  
 ===== Связанные материалы ===== ===== Связанные материалы =====
-  * [[sharixopen:knowledge:modules:handlers|Обработчики, Blockly и граница выполнения]] +  * [[sharixopen:knowledge:modules:handlers|Устройство обработчиков и проверка Blockly]]. 
-  * [[sharixopen:knowledge:domain:st_request|ST_REQUEST: запросы документов и проверок]] +  * [[sharixopen:knowledge:domain:st_request|Назначение ST_REQUEST]]. 
-  * [[sharixopen:knowledge:operations:runtime_health|Диагностика runtime и обработчиков]] +  * [[sharixopen:knowledge:operations:runtime_health|Диагностика runtime]]. 
-  * [[sharixopen:knowledge:scenarios:start|Сценарии использования и проверки]]+  * [[sharixopen:knowledge:scenarios:start|Указатель сценариев]]. 
 + 
 +===== Исходники, сверенные 31.10.2026 ===== 
 +Проверены опубликованные исходники указанных commits. Это анализ кода, а не подтверждение версии, конфигурации или выполнения сценария на сервере. 
 +  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/catalog.py|sharix-open-handlers-examples: catalog.py]]. 
 +  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_st_request_new.json|sharix-open-handlers-examples: generated_handler_blocks/open_st_request_new.json]]. 
 +  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_st_request_new.py|sharix-open-handlers-examples: handlers/open_st_request_new.py]]. 
 +  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handlers/open_st_request_new.py|sharix-open-handlers-examples: generated_handlers/open_st_request_new.py]]. 
 +  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_blockly_codegen.py|sharix-open-handlers-backend: ticket_blockly_codegen.py]]. 
 +  * [[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]]. 
 +  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_codegen_contract.json|sharix-open-handlers-backend: ticket_codegen_contract.json]]. 
 +  * [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/signals.py|sharix-open-tickets: signals.py]]. 
 +  * [[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]].
  
 ~~SHARIX_KNOWLEDGE_RELATED~~ ~~SHARIX_KNOWLEDGE_RELATED~~
  
sharixopen/knowledge/scenarios/st_request_waiting.1793200154.txt.gz · Последнее изменение: — sx_knowledge_api_open

© 2022 ShariX