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

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


sharixopen:knowledge:scenarios:st_request_duplicate

Различия

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

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

Следующая версия
Предыдущая версия
sharixopen:knowledge:scenarios:st_request_duplicate [2026/10/28 19:30] – [sharixknowledge] approved package sx_knowledge_api_opensharixopen:knowledge:scenarios:st_request_duplicate [2026/10/31 11:50] (текущий) – [sharixknowledge] approved package sx_knowledge_api_open
Строка 16: Строка 16:
             "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth",             "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth",
             "ShariXKnowledgeScenarios"             "ShariXKnowledgeScenarios"
 +        ],
 +        "depends_on": [
 +            "ShariXKnowledgeOpenKnowledgeModulesHandlers"
 +        ],
 +        "verified_by": [
 +            "ShariXKnowledgeVerification"
         ]         ]
     },     },
Строка 22: Строка 28:
             "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", 
-                "DUPLICATE", +                "audience_support", 
-                "BPMN"+                "audience_reviewer", 
 +                "audience_ai", 
 +                "product_sharix_open", 
 +                "material_scenario", 
 +                "topic_handlers_support", 
 +                "topic_handlers_runtime", 
 +                "st_request", 
 +                "ticket_duplicate", 
 +                "bpmn", 
 +                "ticket", 
 +                "blockly", 
 +                "generated_python"
             ]             ]
         },         },
Строка 114: Строка 131:
                 "path": "services/handler_wakeup.py",                 "path": "services/handler_wakeup.py",
                 "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"                 "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"
 +            },
 +            {
 +                "repository": "sharix-open-tickets",
 +                "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
 +                "path": "models/ticket.py",
 +                "sha256": "4768d9ef47b61bf3ae98bf2749ed142adc477978b44de29177363ba9664baa43"
             }             }
         ],         ],
Строка 129: Строка 152:
                 "external": "883013fe4b9c14150eea1248d129cb9fcb9ca3d4cdc4cacb0e40e5b8926e8b9d"                 "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": "1f8a7aa517049541619cf9408ba5d040c9312fdb14e6d12df11a93e88cb315f8",+    "content_sha256": "62a3c1335c36a3783043876a02712620d37e489ddcfc8569a4e3c7525744d41a",
     "schema": 1     "schema": 1
 } }
Строка 138: Строка 217:
 ~~NOCACHE~~ ~~NOCACHE~~
  
-**Область:** ShariX Open. **Обработчик:** ''open_st_request_duplicate'', тип ''ST_REQUEST'' (1), рабочий статус ''DUPLICATE'' (159). Опубликованная встроенная реализация изучена на 28.10.2026; Python побайтово совпадает с канонической генерацией из Blockly. Выбранная версия на сервере проверяется отдельно.+**Назначение:** [[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'' не доказывает сохранность содержания в другой заявке.+Вход — Ticket, которому уже назначен статус DUPLICATE. Обработчик: 
 + 
 +  * ждёт отдельного решения о закрытии; 
 +  * не ищет похожие заявки и не выбирает основную; 
 +  * не переносит описание, комментарии и вложения; 
 +  * не объединяет доменные результаты. 
 + 
 +Перед закрытием нужно проверить основную карточку и сохранение существенной информации. Статус DUPLICATE сам этого не подтверждает. 
 + 
 +До смены статуса пользователь: 
 + 
 +  - Открывает выбранную основную карточку. 
 +  - Сверяет описание, комментарии и вложения дубля с сохранёнными там сведениями. 
 +  - При необходимости вручную сохраняет существенную информацию в основной карточке. 
 +  - Затем принимает отдельное решение о закрытии дубля через доступный переход.
  
-Перед закрытием пользователь должен осмысленно проверить основную карточку и сохранение необходимой информации. Это действие вне текущего алгоритма; автоматического механизма слияния схема не приписывает. ''STREQ_AUTOACCEPT'' здесь не используется, автоматического закрытия по таймеру нет.+STREQ_AUTOACCEPT здесь не используется; срока автоматического закрытия нет.
  
 Каноническое имя — ''open_st_request_duplicate''. Имя ''open_st_request_dublicate'' с исторической опечаткой присутствует только как legacy-запись каталога: ''builtin_available=false'', ''blockly_editable=false''. Оно не является второй исполняемой встроенной реализацией этого сценария; создавать ещё одну LDAP/XMPP-учётку на основании такой записи не требуется. Каноническое имя — ''open_st_request_duplicate''. Имя ''open_st_request_dublicate'' с исторической опечаткой присутствует только как legacy-запись каталога: ''builtin_available=false'', ''blockly_editable=false''. Оно не является второй исполняемой встроенной реализацией этого сценария; создавать ещё одну LDAP/XMPP-учётку на основании такой записи не требуется.
Строка 150: Строка 251:
 <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" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_st_duplicate_logic" targetNamespace="urn:sharix:knowledge:handlers">+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:ns2="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:ns3="http://www.omg.org/spec/DD/20100524/DC" xmlns:ns4="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_st_duplicate_logic" targetNamespace="urn:sharix:knowledge:handlers">
   <bpmn:process id="duplicate_Process_duplicate" name="open_st_request_duplicate: ожидание внешнего решения" isExecutable="false">   <bpmn:process id="duplicate_Process_duplicate" name="open_st_request_duplicate: ожидание внешнего решения" isExecutable="false">
     <bpmn:documentation>{"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"}]}</bpmn:documentation>     <bpmn:documentation>{"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"}]}</bpmn:documentation>
Строка 246: Строка 347:
     <bpmn:participant id="duplicate_Pool_duplicate" name="open_st_request_duplicate: ожидание внешнего решения" processRef="duplicate_Process_duplicate" />     <bpmn:participant id="duplicate_Pool_duplicate" name="open_st_request_duplicate: ожидание внешнего решения" processRef="duplicate_Process_duplicate" />
   </bpmn:collaboration>   </bpmn:collaboration>
-  <bpmndi:BPMNDiagram id="Diagram_st_duplicate_logic"> +  <ns2:BPMNDiagram id="Diagram_st_duplicate_logic"> 
-    <bpmndi:BPMNPlane id="Plane_st_duplicate_logic" bpmnElement="Collaboration_st_duplicate_logic"> +    <ns2:BPMNPlane id="Plane_st_duplicate_logic" bpmnElement="Collaboration_st_duplicate_logic"> 
-      <bpmndi:BPMNShape id="duplicate_DI_Pool_duplicate" bpmnElement="duplicate_Pool_duplicate" isHorizontal="true"> +      <ns2:BPMNShape id="duplicate_DI_Pool_duplicate" bpmnElement="duplicate_Pool_duplicate" isHorizontal="true"> 
-        <dc:Bounds x="0.0" y="0.0" width="1590" height="770" /> +        <ns3:Bounds x="0.0" y="0.0" width="1690.0" height="770.0" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_Lane_worker" bpmnElement="duplicate_Lane_worker" isHorizontal="true"> +      <ns2:BPMNShape id="duplicate_DI_Lane_worker" bpmnElement="duplicate_Lane_worker" isHorizontal="true"> 
-        <dc:Bounds x="30.0" y="0.0" width="1560" height="385.0" /> +        <ns3:Bounds x="30.0" y="0.0" width="1660.0" height="385.0" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_Lane_queue" bpmnElement="duplicate_Lane_queue" isHorizontal="true"> +      <ns2:BPMNShape id="duplicate_DI_Lane_queue" bpmnElement="duplicate_Lane_queue" isHorizontal="true"> 
-        <dc:Bounds x="30.0" y="385.0" width="1560" height="385.0" /> +        <ns3:Bounds x="30.0" y="385.0" width="1660.0" height="385.0" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_start" bpmnElement="duplicate_start"> +      <ns2:BPMNShape id="duplicate_DI_start" bpmnElement="duplicate_start"> 
-        <dc:Bounds x="132.0" y="92.0" width="36" height="36" /> +        <ns3:Bounds x="132.0" y="92.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_status" bpmnElement="duplicate_status"> +      <ns2:BPMNShape id="duplicate_DI_status" bpmnElement="duplicate_status"> 
-        <dc:Bounds x="365.0" y="85.0" width="50" height="50" /> +        <ns3:Bounds x="365.0" y="85.0" width="50" height="50" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_reason" bpmnElement="duplicate_reason"> +      <ns2:BPMNShape id="duplicate_DI_reason" bpmnElement="duplicate_reason"> 
-        <dc:Bounds x="575.0" y="75.0" width="150" height="70" /> +        <ns3:Bounds x="575.0" y="75.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_defer" bpmnElement="duplicate_defer"> +      <ns2:BPMNShape id="duplicate_DI_defer" bpmnElement="duplicate_defer"> 
-        <dc:Bounds x="835.0" y="75.0" width="150" height="70" /> +        <ns3:Bounds x="835.0" y="75.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_cleanup" bpmnElement="duplicate_cleanup"> +      <ns2:BPMNShape id="duplicate_DI_cleanup" bpmnElement="duplicate_cleanup"> 
-        <dc:Bounds x="315.0" y="265.0" width="150" height="70" /> +        <ns3:Bounds x="315.0" y="265.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_end" bpmnElement="duplicate_end"> +      <ns2:BPMNShape id="duplicate_DI_end" bpmnElement="duplicate_end"> 
-        <dc:Bounds x="632.0" y="282.0" width="36" height="36" /> +        <ns3:Bounds x="632.0" y="282.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_defer_error" bpmnElement="duplicate_defer_error"> +      <ns2:BPMNShape id="duplicate_DI_defer_error" bpmnElement="duplicate_defer_error"> 
-        <dc:Bounds x="942.0" y="127.0" width="36" height="36" /> +        <ns3:Bounds x="942.0" y="127.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_error" bpmnElement="duplicate_error"> +      <ns2:BPMNShape id="duplicate_DI_error" bpmnElement="duplicate_error"> 
-        <dc:Bounds x="1095.0" y="265.0" width="150" height="70" /> +        <ns3:Bounds x="1095.0" y="265.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_wait" bpmnElement="duplicate_wait"> +      <ns2:BPMNShape id="duplicate_DI_wait" bpmnElement="duplicate_wait"> 
-        <dc:Bounds x="885.0" y="515.0" width="50" height="50" /> +        <ns3:Bounds x="885.0" y="515.0" width="50" height="50" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_timer" bpmnElement="duplicate_timer"> +      <ns2:BPMNShape id="duplicate_DI_timer" bpmnElement="duplicate_timer"> 
-        <dc:Bounds x="1152.0" y="452.0" width="36" height="36" /> +        <ns3:Bounds x="1152.0" y="452.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_revision" bpmnElement="duplicate_revision"> +      <ns2:BPMNShape id="duplicate_DI_revision" bpmnElement="duplicate_revision"> 
-        <dc:Bounds x="1152.0" y="652.0" width="36" height="36" /> +        <ns3:Bounds x="1152.0" y="652.0" width="36" height="36" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNShape id="duplicate_DI_ready" bpmnElement="duplicate_ready"> +      <ns2:BPMNShape id="duplicate_DI_ready" bpmnElement="duplicate_ready"> 
-        <dc:Bounds x="1355.0" y="505.0" width="150" height="70" /> +        <ns3:Bounds x="1355.0" y="505.0" width="150" height="70" /> 
-      </bpmndi:BPMNShape> +      </ns2:BPMNShape> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_0" bpmnElement="duplicate_Flow_0"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_0" bpmnElement="duplicate_Flow_0"> 
-        <di:waypoint x="168.0" y="110.0" /> +        <ns4:waypoint x="168.0" y="110.0" /> 
-        <di:waypoint x="365.0" y="110.0" /> +        <ns4:waypoint x="365.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_1" bpmnElement="duplicate_Flow_1"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_1" bpmnElement="duplicate_Flow_1"> 
-        <di:waypoint x="415.0" y="110.0" /> +        <ns4:waypoint x="415.0" y="110.0" /> 
-        <di:waypoint x="575.0" y="110.0" /> +        <ns4:waypoint x="575.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_2" bpmnElement="duplicate_Flow_2"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_2" bpmnElement="duplicate_Flow_2"> 
-        <di:waypoint x="390.0" y="135.0" /> +        <ns4:waypoint x="390.0" y="135.0" /> 
-        <di:waypoint x="390.0" y="265.0" /> +        <ns4:waypoint x="390.0" y="265.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_3" bpmnElement="duplicate_Flow_3"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_3" bpmnElement="duplicate_Flow_3"> 
-        <di:waypoint x="465.0" y="300.0" /> +        <ns4:waypoint x="465.0" y="300.0" /> 
-        <di:waypoint x="632.0" y="300.0" /> +        <ns4:waypoint x="632.0" y="300.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_4" bpmnElement="duplicate_Flow_4"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_4" bpmnElement="duplicate_Flow_4"> 
-        <di:waypoint x="725.0" y="110.0" /> +        <ns4:waypoint x="725.0" y="110.0" /> 
-        <di:waypoint x="835.0" y="110.0" /> +        <ns4:waypoint x="835.0" y="110.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_5" bpmnElement="duplicate_Flow_5"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_5" bpmnElement="duplicate_Flow_5"> 
-        <di:waypoint x="910.0" y="145.0" /> +        <ns4:waypoint x="910.0" y="145.0" /> 
-        <di:waypoint x="910.0" y="515.0" /> +        <ns4:waypoint x="910.0" y="515.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_6" bpmnElement="duplicate_Flow_6"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_6" bpmnElement="duplicate_Flow_6"> 
-        <di:waypoint x="978.0" y="145.0" /> +        <ns4:waypoint x="978.0" y="145.0" /> 
-        <di:waypoint x="1020.0" y="145.0" /> +        <ns4:waypoint x="1020.0" y="145.0" /> 
-        <di:waypoint x="1170.0" y="145.0" /> +        <ns4:waypoint x="1170.0" y="145.0" /> 
-        <di:waypoint x="1170.0" y="265.0" /> +        <ns4:waypoint x="1170.0" y="265.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_7" bpmnElement="duplicate_Flow_7"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_7" bpmnElement="duplicate_Flow_7"> 
-        <di:waypoint x="1245.0" y="300.0" /> +        <ns4:waypoint x="1245.0" y="300.0" /> 
-        <di:waypoint x="1290.0" y="300.0" /> +        <ns4:waypoint x="1290.0" y="300.0" /> 
-        <di:waypoint x="1290.0" y="410.0" /> +        <ns4:waypoint x="1290.0" y="410.0" /> 
-        <di:waypoint x="910.0" y="410.0" /> +        <ns4:waypoint x="910.0" y="410.0" /> 
-        <di:waypoint x="910.0" y="515.0" /> +        <ns4:waypoint x="910.0" y="515.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_8" bpmnElement="duplicate_Flow_8"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_8" bpmnElement="duplicate_Flow_8"> 
-        <di:waypoint x="935.0" y="540.0" /> +        <ns4:waypoint x="935.0" y="540.0" /> 
-        <di:waypoint x="1043.5" y="540.0" /> +        <ns4:waypoint x="1043.5" y="540.0" /> 
-        <di:waypoint x="1043.5" y="470.0" /> +        <ns4:waypoint x="1043.5" y="470.0" /> 
-        <di:waypoint x="1152.0" y="470.0" /> +        <ns4:waypoint x="1152.0" y="470.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_9" bpmnElement="duplicate_Flow_9"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_9" bpmnElement="duplicate_Flow_9"> 
-        <di:waypoint x="935.0" y="540.0" /> +        <ns4:waypoint x="935.0" y="540.0" /> 
-        <di:waypoint x="1043.5" y="540.0" /> +        <ns4:waypoint x="1043.5" y="540.0" /> 
-        <di:waypoint x="1043.5" y="670.0" /> +        <ns4:waypoint x="1043.5" y="670.0" /> 
-        <di:waypoint x="1152.0" y="670.0" /> +        <ns4:waypoint x="1152.0" y="670.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_10" bpmnElement="duplicate_Flow_10"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_10" bpmnElement="duplicate_Flow_10"> 
-        <di:waypoint x="1188.0" y="470.0" /> +        <ns4:waypoint x="1188.0" y="470.0" /> 
-        <di:waypoint x="1271.5" y="470.0" /> +        <ns4:waypoint x="1271.5" y="470.0" /> 
-        <di:waypoint x="1271.5" y="540.0" /> +        <ns4:waypoint x="1271.5" y="540.0" /> 
-        <di:waypoint x="1355.0" y="540.0" /> +        <ns4:waypoint x="1355.0" y="540.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_11" bpmnElement="duplicate_Flow_11"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_11" bpmnElement="duplicate_Flow_11"> 
-        <di:waypoint x="1188.0" y="670.0" /> +        <ns4:waypoint x="1188.0" y="670.0" /> 
-        <di:waypoint x="1271.5" y="670.0" /> +        <ns4:waypoint x="1271.5" y="670.0" /> 
-        <di:waypoint x="1271.5" y="540.0" /> +        <ns4:waypoint x="1271.5" y="540.0" /> 
-        <di:waypoint x="1355.0" y="540.0" /> +        <ns4:waypoint x="1355.0" y="540.0" /> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-      <bpmndi:BPMNEdge id="duplicate_DI_Flow_12" bpmnElement="duplicate_Flow_12"> +      <ns2:BPMNEdge id="duplicate_DI_Flow_12" bpmnElement="duplicate_Flow_12"> 
-        <di:waypoint x="1505.0" y="540.0" /> +        <ns4:waypoint x="1505.0" y="540.0" /> 
-        <di:waypoint x="1650.0" y="540.0" /> +        <ns4:waypoint x="1650.0" y="540.0" /> 
-        <di:waypoint x="1650.0" y="25.0" /> +        <ns4:waypoint x="1650.0" y="25.0" /> 
-        <di:waypoint x="390.0" y="25.0" /> +        <ns4:waypoint x="390.0" y="25.0" /> 
-        <di:waypoint x="390.0" y="85.0" /> +        <ns4:waypoint x="390.0" y="85.0" /> 
-        <bpmndi:BPMNLabel> +        <ns2:BPMNLabel> 
-          <dc:Bounds x="1330.0" y="5.0" width="180" height="26" /> +          <ns3:Bounds x="1330.0" y="5.0" width="180" height="26" /> 
-        </bpmndi:BPMNLabel> +        </ns2:BPMNLabel> 
-      </bpmndi:BPMNEdge> +      </ns2:BPMNEdge> 
-    </bpmndi:BPMNPlane> +    </ns2:BPMNPlane> 
-  </bpmndi:BPMNDiagram>+  </ns2:BPMNDiagram>
 </bpmn:definitions> </bpmn:definitions>
 </sharix-bpmn> </sharix-bpmn>
  
-В своём рабочем статусе handler записывает локальную причину ''support_duplicate_closure'' и назначает повтор по ''ST_REQUEST_DUPLICATE_RECHECK_SECONDS''. Пустой reason в Blockly-примитиве defer использует уже сохранённую причину. Это состояние runtime и запись журнала, а не комментарий в Ticket и не уведомление пользователю.+Один проход в своём рабочем статусе: 
 + 
 +  - Записать локальную причину support_duplicate_closure. 
 +  - Назначить defer по ST_REQUEST_DUPLICATE_RECHECK_SECONDS. Пустой reason использует ранее сохранённую причину. 
 +  - Завершить проход и освободить worker. 
 + 
 +Причина относится к runtime и журналу. Она не добавляет комментарий в Ticket и не уведомляет пользователя.
  
 Worker после прохода освобождается. Когда срок ''deferred_until'' наступает либо получена новая authoritative revision, Ticket становится готов к повторной проверке; одинаковый снимок не сбрасывает ожидание. Фактический запуск зависит от свободного worker и соединения XMPP. Defer хранится в памяти; после рестарта состав очереди сверяется с backend заново. Worker после прохода освобождается. Когда срок ''deferred_until'' наступает либо получена новая authoritative revision, Ticket становится готов к повторной проверке; одинаковый снимок не сбрасывает ожидание. Фактический запуск зависит от свободного worker и соединения XMPP. Defer хранится в памяти; после рестарта состав очереди сверяется с backend заново.
Строка 570: Строка 677:
 </sharix-bpmn> </sharix-bpmn>
  
-Пользователь должен иметь доступ к конкретному Ticket и право смены статуса. Авторство само по себе такого права не даёт. Канонические view/API проверяют объектный доступ и разрешённый переход lifecycle до сохранения; связанные с заказом Ticket не должны обходить жизненный цикл заказа через общую форму.+Для внешнего решения проверяются отдельно:
  
-Из ''DUPLICATE'' текущий lifecycle разрешает только ''CLOSED''. Это закрытие существующего Ticket, а не удаление записи или перенос её содержимого. Прямого перехода в ''REOPENED'' из этой стадии в изученном lifecycle нет; схема его не предлагает.+  * право чтения конкретного Ticket; 
 +  * право менять его статус; 
 +  * разрешённый переход текущего lifecycle; 
 +  * доменная граница: связанный заказ должен изменяться через действия заказа.
  
-После commit backend публикует события изменения владельца. ''ticket.moved'' направляется прежнему handler и исключает локальный снимок; если worker уже выполняется, применяется pending discard до его завершения. Для новой стадии с зарегистрированным handler предназначен ''ticket.changed''. Для ''CLOSED'' отдельного ''open_st_request_closed'' в каталоге нет.+Авторство обращения само по себе не даёт права смены статуса. 
 + 
 +Для 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-состояния. XMPP-доставка best effort и не является частью транзакции сохранения Ticket. Потерю сообщения восстанавливает scoped periodic reconciliation по ''INTERVAL_TIME_BD_REQ''. Успешный список без Ticket позволяет убрать прежний снимок; ошибка списка не должна трактоваться как пустая очередь. Новый локальный проход не заменяет проверку актуального backend-состояния.
Строка 581: Строка 704:
 Именованный интервал — ''ST_REQUEST_DUPLICATE_RECHECK_SECONDS'', минимум одна секунда; реальное значение конкретного сервера здесь не предполагается. Обработчик не содержит фиксированного срока автоматического закрытия. Для общего восстановления используется ''DEFERRED_TICKET_RECHECK_SECONDS'', для сверки состава — ''INTERVAL_TIME_BD_REQ''. Именованный интервал — ''ST_REQUEST_DUPLICATE_RECHECK_SECONDS'', минимум одна секунда; реальное значение конкретного сервера здесь не предполагается. Обработчик не содержит фиксированного срока автоматического закрытия. Для общего восстановления используется ''DEFERRED_TICKET_RECHECK_SECONDS'', для сверки состава — ''INTERVAL_TIME_BD_REQ''.
  
-При долгом ожидании проверьте актуальный статус и ревизию Ticket, выбранную версию Python/workspace, настройку интервала, причину ожидания, наличие доступного внешнего действия и права пользователя. Затем — scoped API, ready/defer, XMPP и periodic reconciliation. Не считайте штатное ожидание внешнего решения зависанием только по тому, что Ticket не поменялся от очередного таймера.+Порядок диагностики долгого ожидания: 
 + 
 +  - Прочитать актуальные статус и ревизию Ticket. 
 +  - Сверить выбранные Python/workspace с канонической генерацией. 
 +  - Проверить именованный интервал, локальную причину и момент готовности defer. 
 +  - Проверить доступность внешнего действия и права принимающего решение. 
 +  - Проверить scoped API, ready-очередь, XMPP и periodic reconciliation. 
 + 
 +Повтор таймера без изменения статуса штатен, пока внешнее решение не принято. Неопределённый ответ записи требует чтения сохранённого состояния перед повтором.
  
 ===== Проверенные источники ===== ===== Проверенные источники =====
sharixopen/knowledge/scenarios/st_request_duplicate.1793215802.txt.gz · Последнее изменение: — sx_knowledge_api_open

© 2022 ShariX