{
"id": "ShariXKnowledgeSTRequestDuplicateBPMN",
"page": "sharixopen:knowledge:scenarios:st_request_duplicate",
"area": "open",
"type": "procedure",
"title": "ST_REQUEST-дубликат: ожидание решения о закрытии",
"status": "review",
"schema_version": 1,
"relations": {
"related_to": [
"ShariXKnowledgeSTRequestDoneBPMN",
"ShariXKnowledgeSTRequestWontfixBPMN",
"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_duplicate",
"bpmn",
"ticket",
"blockly",
"generated_python"
]
},
"diagram": {
"format": "bpmn",
"executable": false
},
"source_evidence": [
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "handlers/open_st_request_duplicate.py",
"sha256": "33f2729a9ca9b61d1f41fff06e391089860cb02fd8a2104574c0c3d5933731aa"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "generated_handler_blocks/open_st_request_duplicate.json",
"sha256": "350cd8d1e1d1014205a933dcac3871d14b82bb691d4464bfa477a706843fa637"
},
{
"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-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "ticket_blockly_codegen.py",
"sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "ticket_codegen_contract.json",
"sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"
},
{
"repository": "sharix-open-tickets",
"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
"path": "lib/tickets.py",
"sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"
},
{
"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": "signals.py",
"sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"
},
{
"repository": "sharix-open-tickets",
"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
"path": "services/handler_wakeup.py",
"sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"
},
{
"repository": "sharix-open-tickets",
"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
"path": "models/ticket.py",
"sha256": "4768d9ef47b61bf3ae98bf2749ed142adc477978b44de29177363ba9664baa43"
}
],
"handler_process": {
"handler_id": "open_st_request_duplicate",
"source_kind": "git_builtin",
"canonical_python_verified": true,
"reviewed_on": "2026-10-28",
"adapter": "tools/build_st_observer_scenario.py",
"adapter_sha256": "7bf292e35defb3f5675a29d3de3981beeaef1df3c004177ba6257d957bf6613e",
"generator": "tools/generate_handler_bpmn.py",
"generator_sha256": "ca837a7b9e55bf58184bdf408a8035d25667ed9c5d3068ca52380b2ff5682f95",
"models": {
"logic": "b0355c64ea2300c2cd0039a146133b75d39974e5cd3665deb71b5931527bb771",
"external": "883013fe4b9c14150eea1248d129cb9fcb9ca3d4cdc4cacb0e40e5b8926e8b9d"
}
},
"diagram_view_bounds": {
"reviewed_on": "2026-10-29",
"models": [
"logic"
],
"semantics_unchanged": true,
"utility": "tools/expand_bpmn_view_bounds.py",
"utility_sha256": "f878658b0115773e34f6c3eec72eba5984d873e60d8e2a4336b3dfb2a8026d87"
},
"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_duplicate",
"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": 14,
"original_source_evidence_recheck": "Все исходные commits и SHA-256 повторно совпали после git fetch; дополнительные функциональные источники включены в source_evidence",
"canonical_regeneration": {
"both_python_copies_match": true,
"generator_sources_verified": 11,
"handler_executed": false
},
"runtime_checked": false
}
},
"content_sha256": "62a3c1335c36a3783043876a02712620d37e489ddcfc8569a4e3c7525744d41a",
"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_duplicate'', тип ''ST_REQUEST'' (1), рабочий статус ''DUPLICATE'' (159). 31.10.2026 исходники повторно получены из Git: обе Python-копии совпали с новой канонической генерацией Blockly, проверены 11 исходников генераторов. Сам handler не исполнялся. Выбранная серверная версия, её настройки и работающие API/XMPP проверяются отдельно.
===== Назначение и границы =====
Вход — Ticket, которому уже назначен статус DUPLICATE. Обработчик:
* ждёт отдельного решения о закрытии;
* не ищет похожие заявки и не выбирает основную;
* не переносит описание, комментарии и вложения;
* не объединяет доменные результаты.
Перед закрытием нужно проверить основную карточку и сохранение существенной информации. Статус DUPLICATE сам этого не подтверждает.
До смены статуса пользователь:
- Открывает выбранную основную карточку.
- Сверяет описание, комментарии и вложения дубля с сохранёнными там сведениями.
- При необходимости вручную сохраняет существенную информацию в основной карточке.
- Затем принимает отдельное решение о закрытии дубля через доступный переход.
STREQ_AUTOACCEPT здесь не используется; срока автоматического закрытия нет.
Каноническое имя — ''open_st_request_duplicate''. Имя ''open_st_request_dublicate'' с исторической опечаткой присутствует только как legacy-запись каталога: ''builtin_available=false'', ''blockly_editable=false''. Оно не является второй исполняемой встроенной реализацией этого сценария; создавать ещё одну LDAP/XMPP-учётку на основании такой записи не требуется.
===== Проход и локальное ожидание (BPMN) =====
{"notes": ["Опубликованная встроенная реализация; не доказательство выбранной версии на сервере.", "Процесс isExecutable=false, никакой handler при генерации не исполняется.", "deferred_until — символ локального срока, не имя параметра окружения."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_duplicate.py", "repository": "sharix-open-handlers-examples", "sha256": "33f2729a9ca9b61d1f41fff06e391089860cb02fd8a2104574c0c3d5933731aa"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_duplicate.json", "repository": "sharix-open-handlers-examples", "sha256": "350cd8d1e1d1014205a933dcac3871d14b82bb691d4464bfa477a706843fa637"}, {"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": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"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": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}]}
duplicate_start
duplicate_status
duplicate_reason
duplicate_defer
duplicate_cleanup
duplicate_end
duplicate_defer_error
duplicate_error
duplicate_wait
duplicate_timer
duplicate_revision
duplicate_ready
duplicate_Flow_0
duplicate_Flow_0
duplicate_Flow_12
duplicate_Flow_1
duplicate_Flow_2
duplicate_Flow_1
duplicate_Flow_4
ST_REQUEST_DUPLICATE_RECHECK_SECONDS; пустой аргумент reason использует сохранённую локальную причину.
duplicate_Flow_4
duplicate_Flow_5
duplicate_Flow_2
duplicate_Flow_3
duplicate_Flow_3
duplicate_Flow_6
DEFERRED_TICKET_RECHECK_SECONDS
duplicate_Flow_6
duplicate_Flow_7
duplicate_Flow_5
duplicate_Flow_7
duplicate_Flow_8
duplicate_Flow_9
duplicate_Flow_8
duplicate_Flow_10
deferred_until
duplicate_Flow_9
duplicate_Flow_11
Дубликат ревизии не снимает defer; при новом статусе очистка в следующем проходе/по ticket.moved.
duplicate_Flow_10
duplicate_Flow_11
duplicate_Flow_12
Один проход в своём рабочем статусе:
- Записать локальную причину support_duplicate_closure.
- Назначить defer по ST_REQUEST_DUPLICATE_RECHECK_SECONDS. Пустой reason использует ранее сохранённую причину.
- Завершить проход и освободить worker.
Причина относится к runtime и журналу. Она не добавляет комментарий в Ticket и не уведомляет пользователя.
Worker после прохода освобождается. Когда срок ''deferred_until'' наступает либо получена новая authoritative revision, Ticket становится готов к повторной проверке; одинаковый снимок не сбрасывает ожидание. Фактический запуск зависит от свободного worker и соединения XMPP. Defer хранится в памяти; после рестарта состав очереди сверяется с backend заново.
При чужом статусе запрашивается удаление локального Ticket и комнаты. Одного возврата None недостаточно для удаления: runtime учитывает явный запрос очистки. Неожиданное исключение обрабатывается общим ''processing_error'' с defer по ''DEFERRED_TICKET_RECHECK_SECONDS''; автоматическое бизнес-решение вместо пользователя не принимается.
===== Внешний пользователь и смена владельца (BPMN) =====
{"notes": ["Опубликованная встроенная реализация; не доказательство выбранной версии на сервере.", "Процесс isExecutable=false, никакой handler при генерации не исполняется.", "deferred_until — символ локального срока, не имя параметра окружения.", "Изменение статуса и best-effort XMPP доставка — отдельные операции. При потере события есть periodic reconciliation."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_duplicate.py", "repository": "sharix-open-handlers-examples", "sha256": "33f2729a9ca9b61d1f41fff06e391089860cb02fd8a2104574c0c3d5933731aa"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_duplicate.json", "repository": "sharix-open-handlers-examples", "sha256": "350cd8d1e1d1014205a933dcac3871d14b82bb691d4464bfa477a706843fa637"}, {"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": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"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": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}]}
person_start
person_choose
person_send
person_end
person_Flow_0
person_Flow_0
person_Flow_1
person_Flow_1
person_Flow_2
person_Flow_2
{"notes": ["Опубликованная встроенная реализация; не доказательство выбранной версии на сервере.", "Процесс isExecutable=false, никакой handler при генерации не исполняется.", "deferred_until — символ локального срока, не имя параметра окружения.", "Изменение статуса и best-effort XMPP доставка — отдельные операции. При потере события есть periodic reconciliation."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_duplicate.py", "repository": "sharix-open-handlers-examples", "sha256": "33f2729a9ca9b61d1f41fff06e391089860cb02fd8a2104574c0c3d5933731aa"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_duplicate.json", "repository": "sharix-open-handlers-examples", "sha256": "350cd8d1e1d1014205a933dcac3871d14b82bb691d4464bfa477a706843fa637"}, {"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": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_blockly_codegen.py", "repository": "sharix-open-handlers-backend", "sha256": "bce71eab622922f8dd0954222842349799b60e18a0ab6310cc3e5f305603661e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "ticket_codegen_contract.json", "repository": "sharix-open-handlers-backend", "sha256": "0bfd2b0ebb07bd380ed3c867386536ab88ef7dfa6e13f1cd8c91d32bb02c1ae9"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "lib/tickets.py", "repository": "sharix-open-tickets", "sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"}, {"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": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}]}
backend_request
backend_acl
backend_allowed
backend_commit
backend_publish
backend_end
backend_reject
backend_Flow_0
backend_Flow_0
backend_Flow_1
backend_Flow_1
backend_Flow_2
backend_Flow_3
backend_Flow_2
backend_Flow_4
backend_Flow_4
backend_Flow_5
backend_Flow_5
backend_Flow_3
Для внешнего решения проверяются отдельно:
* право чтения конкретного Ticket;
* право менять его статус;
* разрешённый переход текущего lifecycle;
* доменная граница: связанный заказ должен изменяться через действия заказа.
Авторство обращения само по себе не даёт права смены статуса.
Для DUPLICATE текущий lifecycle содержит один исход:
* **CLOSED:** закрытие существующего Ticket.
Закрытие не удаляет запись и не переносит содержимое. Прямого перехода DUPLICATE → REOPENED нет; для восстановления работы нельзя предполагать наличие такой команды.
После commit backend направляет:
* **ticket.moved прежнему handler:** локальный снимок исключается; для выполняющегося worker удаление откладывается до завершения прохода.
* **ticket.changed новому зарегистрированному handler:** новое состояние ставится в его очередь.
У CLOSED нет отдельного open_st_request_closed в каталоге. Сохранение статуса и доставка события — разные операции.
XMPP-доставка best effort и не является частью транзакции сохранения Ticket. Потерю сообщения восстанавливает scoped periodic reconciliation по ''INTERVAL_TIME_BD_REQ''. Успешный список без Ticket позволяет убрать прежний снимок; ошибка списка не должна трактоваться как пустая очередь. Новый локальный проход не заменяет проверку актуального backend-состояния.
===== Настройки и диагностика =====
Именованный интервал — ''ST_REQUEST_DUPLICATE_RECHECK_SECONDS'', минимум одна секунда; реальное значение конкретного сервера здесь не предполагается. Обработчик не содержит фиксированного срока автоматического закрытия. Для общего восстановления используется ''DEFERRED_TICKET_RECHECK_SECONDS'', для сверки состава — ''INTERVAL_TIME_BD_REQ''.
Порядок диагностики долгого ожидания:
- Прочитать актуальные статус и ревизию Ticket.
- Сверить выбранные Python/workspace с канонической генерацией.
- Проверить именованный интервал, локальную причину и момент готовности defer.
- Проверить доступность внешнего действия и права принимающего решение.
- Проверить scoped API, ready-очередь, XMPP и periodic reconciliation.
Повтор таймера без изменения статуса штатен, пока внешнее решение не принято. Неопределённый ответ записи требует чтения сохранённого состояния перед повтором.
===== Проверенные источники =====
Алгоритм извлечён узким адаптером известной структуры Blockly и сверен реальным renderer с Python. Неизвестная структура или изменение изученных runtime/ACL-источников блокируют такую генерацию до повторного анализа. Это авторский инструмент для двух известных observer-сценариев, не общий автоматический hook обновления Wiki.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_st_request_duplicate.py|sharix-open-handlers-examples / handlers/open_st_request_duplicate.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_st_request_duplicate.json|sharix-open-handlers-examples / generated_handler_blocks/open_st_request_duplicate.json]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/catalog.py|sharix-open-handlers-examples / catalog.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-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-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_blockly_codegen.py|sharix-open-handlers-backend / ticket_blockly_codegen.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[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]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/lib/tickets.py|sharix-open-tickets / lib/tickets.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/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.
===== Связанные материалы =====
* [[sharixopen:knowledge:scenarios:st_request_done|DONE]]
* [[sharixopen:knowledge:scenarios:st_request_wontfix|WONTFIX]]
* [[sharixopen:knowledge:modules:handlers|Обработчики и канонический Python]]
* [[sharixopen:knowledge:scenarios:start|Все сценарии]]
~~SHARIX_KNOWLEDGE_RELATED~~