{
"id": "ShariXKnowledgeNegRequestAcceptedBPMN",
"page": "sharixopen:knowledge:scenarios:neg_request_accepted",
"area": "open",
"type": "procedure",
"title": "NEG_REQUEST в ACCEPTED: активация Relationship и срок закрытия",
"status": "review",
"schema_version": 1,
"relations": {
"related_to": [
"ShariXKnowledgeNegRequestPendingBPMN",
"ShariXKnowledgeAccessRequestAcceptedBPMN",
"ShariXKnowledgeSTRequestDoneBPMN",
"ShariXKnowledgeOpenKnowledgeModulesHandlers",
"ShariXKnowledgeScenarios"
]
},
"extensions": {
"taxonomy": {
"domain": "business_processes",
"lifecycle": "implemented",
"component": "handlers_examples, handlers_backend, dbsynce",
"parents": [
"ShariXKnowledgeScenarios"
],
"terms": [
"audience_developer",
"audience_support",
"audience_reviewer",
"audience_ai",
"product_sharix_open",
"material_scenario",
"topic_handlers_relationships",
"topic_security_requirements",
"neg_request",
"ticket_accepted",
"relationship",
"requirements",
"bpmn",
"ticket",
"blockly",
"generated_python"
]
},
"diagram": {
"format": "bpmn",
"executable": false
},
"source_evidence": [
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "handlers/open_neg_request_accepted.py",
"sha256": "48d25651729124cee187718f06d76b0cdc94e32dc3ca872270a5fb9f70c08aae"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "generated_handler_blocks/open_neg_request_accepted.json",
"sha256": "250918c2a8974e2bb4d81243d6583b406cdb71e56a2552a2006bba552b68a89c"
},
{
"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/handler_operations.py",
"sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "core/ejabberd_muc.py",
"sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"
},
{
"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": "api/views/handler_workflow.py",
"sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"
},
{
"repository": "sharix-open-tickets",
"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
"path": "api/handler_auth.py",
"sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"
},
{
"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": "signals.py",
"sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"
},
{
"repository": "sharix-open-tickets",
"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
"path": "services/handler_wakeup.py",
"sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "apiviews/handler_workflow.py",
"sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/activation.py",
"sha256": "f78d4e219a5b83c7952bd366a4e7a711589b1d382af653a0c453c0524e4220f7"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/requirement_actions.py",
"sha256": "717ef0f3e02ff8e6da103b5fdbae584b01d84d177f6e62ae677a1c5a366b71de"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/requirement_checks.py",
"sha256": "5a73a6e71307e734f0c0e480fd14a825a7a22242811e2523b7f25157224cf34c"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/document_drafts.py",
"sha256": "383b117f01fdd9d16de3ceb9afb1ccf0bf3104c4966b23e987b8a90e9a46f071"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/verification_workflow.py",
"sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "models/relationship.py",
"sha256": "873f27666a7d03b8058958b752d0e69d17d3433daf72f901fa88275cf10f43aa"
}
],
"handler_process": {
"handler_id": "open_neg_request_accepted",
"source_kind": "git_builtin",
"canonical_python_verified": true,
"reviewed_on": "2026-10-28",
"generator": "tools/generate_handler_bpmn.py",
"generator_sha256": "ca837a7b9e55bf58184bdf408a8035d25667ed9c5d3068ca52380b2ff5682f95",
"models": {
"logic": "1a47f18a23a46fa59dc9487b7c51895452482cea724283dff4e791880e7a882b",
"waiting": "a3114e93fb8d7c2fef190c25e9559b1839f864aacf89c0053a91e4376232734d",
"gate": "2eec17eb6408566fbff8097042749a2e9c345fe1ba40a8aaee3354a18988fa27"
}
},
"classification": {
"schema": "sharix.knowledge.classification.v1",
"products": [
"sharix_open"
],
"audiences": [
"developer",
"support",
"reviewer",
"ai"
],
"material": "scenario",
"topics": [
"handlers/relationships",
"security/requirements"
],
"tag_terms": [
"audience_developer",
"audience_support",
"audience_reviewer",
"audience_ai",
"product_sharix_open",
"material_scenario",
"topic_handlers_relationships",
"topic_security_requirements",
"neg_request",
"ticket_accepted",
"relationship",
"requirements",
"bpmn",
"ticket",
"blockly",
"generated_python"
],
"registry_document": "ShariXKnowledgeClassification",
"state_meaning": "lifecycle относится к описываемому коду, а status к редакции документа; implemented не означает успешный runtime тест"
},
"classification_review": {
"date": "2026-10-31",
"source": "Содержание текущей страницы и проверенный словарь классификации",
"body_scope": "rewrite"
},
"source_review_20261031": {
"kind": "source_analysis_not_runtime_acceptance",
"evidence_field": "extensions.source_evidence",
"checked_on": "2026-10-31",
"all_original_evidence_hashes_match_fresh_git": true,
"canonical_generation": "Both runnable and generated copies match; no handler executed."
}
},
"content_sha256": "eef48c5b15663a00e305d472ebe4abbc4da6aed8fbba2d92bced83a66ac8b64f",
"schema": 1
}
====== NEG_REQUEST в ACCEPTED: активация Relationship и срок закрытия ======
~~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#neg_request|Обработчики → NEG_REQUEST]] · [[sharixopen:knowledge:classification:topics#trebovanija|Доступ → Требования]].
**Область:** ShariX Open. **Обработчик:** ''open_neg_request_accepted'', тип ''NEG_REQUEST'' (4), рабочий статус ''ACCEPTED'' (421). 31.10.2026 опубликованные исходники повторно получены из Git. Обе Python-копии заново сопоставлены с результатом генерации Blockly; проверены 11 исходников генераторов. Сам handler не исполнялся. Выбранную версию, конфигурацию и внешние подключения сервера проверяют отдельно.
===== Назначение и границы =====
Handler сопровождает уже одобренный запрос на публичную ''dbsynce.Relationship'': проверяет обязательные требования, запрашивает активацию и затем ждёт контрольного срока закрытия Ticket. Он не создаёт отсутствующую связь и не считает ACCEPTED доказательством выполненных requirements. ''NEGREQ_AUTOACCEPT'' здесь не проверяется.
Relationship этого сценария — направленная запись публичного dbsynce со следующими данными:
* ''user_who'' — инициирующая сторона;
* ''user_whom'' — связанная сторона;
* ''neg_type'' — тип отношения;
* ''company'' — контекст компании, если задан;
* ''ticket_status'' — ссылка на сопровождающий Ticket.
Это не Permissions и не универсальная выдача LDAP-роли. Отдельные модели взаимоотношений Platform здесь не рассматриваются; permission-specific синхронизация Client/CorpClient из ACCESS_REQUEST в этой ветви не выполняется.
Ключевое отличие от ACCESS_REQUEST/ACCEPTED: **Relationship активируется до ожидания срока закрытия**. Контрольный срок относится к Ticket и не задерживает саму активацию, если requirements и backend gate успешно пройдены.
BPMN имеют ''isExecutable=false''. Просмотрщик Wiki не исполняет обработчик: runtime запускает выбранный проверенный Python, сгенерированный из Blockly. End event завершает показанную операцию; defer-узлы заканчивают проход и передают ожидание планировщику.
===== Решения одного прохода (BPMN) =====
{"notes": ["BPMN isExecutable=false. Генератор не исполняет handler.", "ACCEPTED — одобрение запроса, а не уже активное взаимоотношение.", "deferred_until — символ текущего локального срока; не имя параметра.", "После подтверждённой активации есть grace закрытия по NEG_REQUEST_DECLINED_CLEANUP_GRACE_DAYS от Ticket.updated_at; активация не ждёт grace."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_neg_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "48d25651729124cee187718f06d76b0cdc94e32dc3ca872270a5fb9f70c08aae"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_neg_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "250918c2a8974e2bb4d81243d6583b406cdb71e56a2552a2006bba552b68a89c"}, {"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/handler_operations.py", "repository": "sharix-open-handlers-backend", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "repository": "sharix-open-handlers-backend", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"}, {"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": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/activation.py", "repository": "sharix-open-backend", "sha256": "f78d4e219a5b83c7952bd366a4e7a711589b1d382af653a0c453c0524e4220f7"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_actions.py", "repository": "sharix-open-backend", "sha256": "717ef0f3e02ff8e6da103b5fdbae584b01d84d177f6e62ae677a1c5a366b71de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_checks.py", "repository": "sharix-open-backend", "sha256": "5a73a6e71307e734f0c0e480fd14a825a7a22242811e2523b7f25157224cf34c"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/document_drafts.py", "repository": "sharix-open-backend", "sha256": "383b117f01fdd9d16de3ceb9afb1ccf0bf3104c4966b23e987b8a90e9a46f071"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_workflow.py", "repository": "sharix-open-backend", "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "models/relationship.py", "repository": "sharix-open-backend", "sha256": "873f27666a7d03b8058958b752d0e69d17d3433daf72f901fa88275cf10f43aa"}]}
negaccepted_start
negaccepted_status
negaccepted_lookup
negaccepted_exists
negaccepted_requirements
negaccepted_met
negaccepted_activate
negaccepted_active
negaccepted_close
negaccepted_confirmed
negaccepted_remove
negaccepted_done
negaccepted_stale
negaccepted_stale_end
negaccepted_missing
negaccepted_missing_wait
negaccepted_need
negaccepted_need_wait
negaccepted_inconsistent
negaccepted_activation_wait
negaccepted_not_found
negaccepted_lookup_error
negaccepted_requirements_error
negaccepted_activate_error
negaccepted_close_error
negaccepted_retry
negaccepted_age
negaccepted_grace
negaccepted_Flow_0
negaccepted_Flow_0
negaccepted_Flow_1
negaccepted_Flow_2
negaccepted_Flow_1
negaccepted_Flow_4
negaccepted_Flow_4
negaccepted_Flow_5
negaccepted_Flow_6
negaccepted_Flow_5
negaccepted_Flow_8
negaccepted_Flow_8
negaccepted_Flow_9
negaccepted_Flow_10
negaccepted_Flow_9
negaccepted_Flow_12
negaccepted_Flow_12
negaccepted_Flow_13
negaccepted_Flow_14
negaccepted_Flow_24
negaccepted_Flow_16
negaccepted_Flow_16
negaccepted_Flow_17
negaccepted_Flow_18
negaccepted_Flow_17
negaccepted_Flow_19
negaccepted_Flow_19
negaccepted_Flow_2
negaccepted_Flow_3
negaccepted_Flow_3
negaccepted_Flow_6
negaccepted_Flow_7
NEG_REQUEST_INCONSISTENCY_RECHECK_SECONDS; локально related_relationship_missing, в журнале defer related_relationship_inconsistent.
negaccepted_Flow_7
negaccepted_Flow_10
negaccepted_Flow_11
NEG_REQUEST_INCONSISTENCY_RECHECK_SECONDS
negaccepted_Flow_11
negaccepted_Flow_14
negaccepted_Flow_15
negaccepted_Flow_15
negaccepted_Flow_18
negaccepted_Flow_20
negaccepted_Flow_21
negaccepted_Flow_22
negaccepted_Flow_23
DEFERRED_TICKET_RECHECK_SECONDS. Ошибки уведомлений также попадают сюда.
negaccepted_Flow_20
negaccepted_Flow_21
negaccepted_Flow_22
negaccepted_Flow_23
NEG_REQUEST_DECLINED_CLEANUP_GRACE_DAYS; минимум 0 дней.
negaccepted_Flow_13
negaccepted_Flow_24
negaccepted_Flow_25
min(updated_at+grace_days, now+DEFERRED_TICKET_RECHECK_SECONDS). Вернуть Ticket без деактивации Relationship.
negaccepted_Flow_25
* Чужой статус — запросить удаление локального Ticket и комнаты.
* Relationship не найдена — ALERT администраторам, локальная причина ''related_relationship_missing'', повтор по ''NEG_REQUEST_INCONSISTENCY_RECHECK_SECONDS''. В журнал defer в этой ветви передаётся строка ''related_relationship_inconsistent''; она не переписывает сохранённую локальную причину.
* Requirements не выполнены — уведомить автора и администраторов, записать ''requirements_pending'' и назначить тот же именованный повтор. Связь этим handler не активируется, Ticket остаётся ACCEPTED.
* Requirements выполнены — запросить каноническую активацию Relationship. Обработанный отрицательный результат вызывает ALERT, ''related_relationship_inconsistent'' и повтор через 900 секунд; это текущая константа Python.
* Активация подтверждена — проверить срок от ''Ticket.updated_at''. При наступившем сроке запросить CLOSED, затем убрать локальный Ticket/комнату. До наступления срока — ''neg_request_close_grace'' и короткий defer.
В workspace используется typed block ''sx_activate_related_relationship''. Его каноническое раскрытие в Python включает guard неуспешной активации с ALERT/900-секундным повтором; этот исход показан на схеме и не пропущен при описании одного action-блока.
===== Требования и backend gate (BPMN) =====
{"notes": ["BPMN isExecutable=false. Генератор не исполняет handler.", "ACCEPTED — одобрение запроса, а не уже активное взаимоотношение.", "deferred_until — символ текущего локального срока; не имя параметра.", "GET requirements здесь имеет side effects подготовки действий.", "Ни прямой status=0, ни исходный ok не обходят повторный gate.", "После подтверждённой активации есть grace закрытия по NEG_REQUEST_DECLINED_CLEANUP_GRACE_DAYS от Ticket.updated_at; активация не ждёт grace."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_neg_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "48d25651729124cee187718f06d76b0cdc94e32dc3ca872270a5fb9f70c08aae"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_neg_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "250918c2a8974e2bb4d81243d6583b406cdb71e56a2552a2006bba552b68a89c"}, {"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/handler_operations.py", "repository": "sharix-open-handlers-backend", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "repository": "sharix-open-handlers-backend", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"}, {"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": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/activation.py", "repository": "sharix-open-backend", "sha256": "f78d4e219a5b83c7952bd366a4e7a711589b1d382af653a0c453c0524e4220f7"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_actions.py", "repository": "sharix-open-backend", "sha256": "717ef0f3e02ff8e6da103b5fdbae584b01d84d177f6e62ae677a1c5a366b71de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_checks.py", "repository": "sharix-open-backend", "sha256": "5a73a6e71307e734f0c0e480fd14a825a7a22242811e2523b7f25157224cf34c"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/document_drafts.py", "repository": "sharix-open-backend", "sha256": "383b117f01fdd9d16de3ceb9afb1ccf0bf3104c4966b23e987b8a90e9a46f071"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_workflow.py", "repository": "sharix-open-backend", "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "models/relationship.py", "repository": "sharix-open-backend", "sha256": "873f27666a7d03b8058958b752d0e69d17d3433daf72f901fa88275cf10f43aa"}]}
gate_start
gate_scope
gate_ensure
gate_evaluate
gate_response
gate_request
gate_lock
gate_gate
gate_ok
gate_save
gate_event
gate_end
gate_deny
gate_Flow_0
gate_Flow_0
gate_Flow_1
Обязательные черновики документов и попытки проверок, связанные ST_REQUEST при наличии настроенной очереди.
gate_Flow_1
gate_Flow_2
gate_Flow_2
gate_Flow_3
gate_Flow_3
gate_Flow_4
gate_Flow_4
gate_Flow_5
gate_Flow_5
gate_Flow_6
gate_Flow_6
gate_Flow_7
gate_Flow_8
status=0 через канонический gate. Здесь нет permission-specific синхронизации Client/CorpClient и выдачи LDAP-роли.
gate_Flow_7
gate_Flow_9
gate_Flow_9
gate_Flow_10
gate_Flow_10
gate_Flow_8
Связь читается через ''dbsynce/api/handler/ticket/{ticket_id}/relationship/'' по ''ticket_status_id''. Требуются handler identity, актуальный scope и ''related.relationship.read''. В отличие от рассмотренного расхождения PENDING, каталог этой стадии объявляет read/status для Relationship. 404 read может означать отсутствие связи либо выход Ticket из scope; несколько связанных записей дают конфликт 409, а не выбор одной наугад.
GET ''requirements/?model=relationship'' требует ''related.requirements.read''. Перед read-only оценкой он вызывает ''ensure_requirement_actions'': подготавливает/переиспользует обязательные черновики документов и попытки проверок с соответствующими ST_REQUEST там, где это предусмотрено настройками. Наличие запроса проверки не означает, что он пройден. Необязательные требования не навязываются, а отсутствие определения/очереди не превращается в успех.
При первоначальном ''ok'' runtime запрашивает ''relationship/'' с ''action=set_status'', ''status=0''. Backend проверяет ''related.relationship.status'', scope и единственность связи, блокирует Ticket/Relationship и снова запускает канонический ''activate_object_if_requirements_met''. Прямой status=0 проходит тот же gate; первоначальный ok не является разрешением обойти повторную оценку. При успехе сохраняются active и связь с Ticket, затем Event операции.
У этого процесса три самостоятельных результата:
* активация Relationship;
* доставка уведомлений;
* перевод Ticket в CLOSED.
Ошибка последующего закрытия Ticket не откатывает уже active Relationship. Если требования позднее не выполнены, текущий handler сам не деактивирует связь: он остаётся в ветви ожидания. Состояние нужно читать в сохранённой Relationship, а не выводить из текста уведомления.
===== Контрольный срок и внешний цикл требований (BPMN) =====
{"notes": ["BPMN isExecutable=false. Генератор не исполняет handler.", "ACCEPTED — одобрение запроса, а не уже активное взаимоотношение.", "deferred_until — символ текущего локального срока; не имя параметра.", "После подтверждённой активации есть grace закрытия по NEG_REQUEST_DECLINED_CLEANUP_GRACE_DAYS от Ticket.updated_at; активация не ждёт grace."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_neg_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "48d25651729124cee187718f06d76b0cdc94e32dc3ca872270a5fb9f70c08aae"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_neg_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "250918c2a8974e2bb4d81243d6583b406cdb71e56a2552a2006bba552b68a89c"}, {"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/handler_operations.py", "repository": "sharix-open-handlers-backend", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "repository": "sharix-open-handlers-backend", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"}, {"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": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/activation.py", "repository": "sharix-open-backend", "sha256": "f78d4e219a5b83c7952bd366a4e7a711589b1d382af653a0c453c0524e4220f7"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_actions.py", "repository": "sharix-open-backend", "sha256": "717ef0f3e02ff8e6da103b5fdbae584b01d84d177f6e62ae677a1c5a366b71de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_checks.py", "repository": "sharix-open-backend", "sha256": "5a73a6e71307e734f0c0e480fd14a825a7a22242811e2523b7f25157224cf34c"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/document_drafts.py", "repository": "sharix-open-backend", "sha256": "383b117f01fdd9d16de3ceb9afb1ccf0bf3104c4966b23e987b8a90e9a46f071"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_workflow.py", "repository": "sharix-open-backend", "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "models/relationship.py", "repository": "sharix-open-backend", "sha256": "873f27666a7d03b8058958b752d0e69d17d3433daf72f901fa88275cf10f43aa"}]}
queue_start
queue_wait
queue_timer
queue_revision
queue_ready
queue_again
queue_Flow_0
queue_Flow_0
queue_Flow_1
queue_Flow_2
Для срока закрытия: ближайшая короткая проверка, не обязательно весь grace. При новом снимке срок пересчитывается.
queue_Flow_1
queue_Flow_3
deferred_until
queue_Flow_2
queue_Flow_4
queue_Flow_3
queue_Flow_4
queue_Flow_5
queue_Flow_5
{"notes": ["BPMN isExecutable=false. Генератор не исполняет handler.", "ACCEPTED — одобрение запроса, а не уже активное взаимоотношение.", "deferred_until — символ текущего локального срока; не имя параметра.", "После подтверждённой активации есть grace закрытия по NEG_REQUEST_DECLINED_CLEANUP_GRACE_DAYS от Ticket.updated_at; активация не ждёт grace."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_neg_request_accepted.py", "repository": "sharix-open-handlers-examples", "sha256": "48d25651729124cee187718f06d76b0cdc94e32dc3ca872270a5fb9f70c08aae"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_neg_request_accepted.json", "repository": "sharix-open-handlers-examples", "sha256": "250918c2a8974e2bb4d81243d6583b406cdb71e56a2552a2006bba552b68a89c"}, {"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/handler_operations.py", "repository": "sharix-open-handlers-backend", "sha256": "28620658501c375f556e24437871620b84a17a88d0b62b2d1a3cc5deb2f14b1e"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/ejabberd_muc.py", "repository": "sharix-open-handlers-backend", "sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"}, {"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": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/activation.py", "repository": "sharix-open-backend", "sha256": "f78d4e219a5b83c7952bd366a4e7a711589b1d382af653a0c453c0524e4220f7"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_actions.py", "repository": "sharix-open-backend", "sha256": "717ef0f3e02ff8e6da103b5fdbae584b01d84d177f6e62ae677a1c5a366b71de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_checks.py", "repository": "sharix-open-backend", "sha256": "5a73a6e71307e734f0c0e480fd14a825a7a22242811e2523b7f25157224cf34c"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/document_drafts.py", "repository": "sharix-open-backend", "sha256": "383b117f01fdd9d16de3ceb9afb1ccf0bf3104c4966b23e987b8a90e9a46f071"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_workflow.py", "repository": "sharix-open-backend", "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "models/relationship.py", "repository": "sharix-open-backend", "sha256": "873f27666a7d03b8058958b752d0e69d17d3433daf72f901fa88275cf10f43aa"}]}
checks_start
checks_result
checks_complete
checks_ok
checks_wake
checks_done
checks_not_yet
checks_Flow_0
Отдельный ручной либо автоматический ST_REQUEST-процесс; он раскрыт на связанных страницах. Загрузка черновика и проверенная версия — разные факты.
checks_Flow_0
checks_Flow_1
checks_Flow_1
checks_Flow_2
checks_Flow_2
checks_Flow_3
checks_Flow_4
Для NEG_REQUEST обновить Ticket.updated_at и после commit отправить ticket.changed, не активировать relationship прямо в ST_REQUEST.
checks_Flow_3
checks_Flow_5
checks_Flow_5
checks_Flow_4
Для контрольного срока используются:
* **NEG_REQUEST_DECLINED_CLEANUP_GRACE_DAYS** — точное имя настройки даже в ACCEPTED; слово DECLINED не меняет её фактическое использование;
* ''Ticket.updated_at'' — начало отсчёта;
* ''updated_at + grace_days'' — конечная граница, минимум настройки 0 дней;
* минимум этой границы и ''now + DEFERRED_TICKET_RECHECK_SECONDS'' — следующий локальный defer;
* ''neg_request_close_grace'' — локальная причина и строка журнала.
До истечения grace Relationship уже может быть active, а Ticket оставаться ACCEPTED. При каждом повторном проходе Python снова выполняет поиск, проверку requirements и запрос активации прежде, чем дойти до проверки срока. Здесь нет marker «активировать только один раз», аналогичного completed у профильных ST_REQUEST. Нельзя считать повторный Event новой заявкой на взаимоотношение.
Новая authoritative revision может снять defer и изменить контрольную дату; дубликат того же снимка — нет. Если updated_at отсутствует/не разбирается, проверка возраста возвращает false, а helper срока не устанавливает корректный defer; такие данные требуют разбора, а не признания grace истёкшим.
Внешний процесс документов/RequirementCheck раскрыт в [[sharixopen:knowledge:scenarios:st_request_inprocess|ST_REQUEST/IN_PROCESS]] и [[sharixopen:knowledge:scenarios:st_request_done|DONE]]. Его complete пересчитывает потребителей. Для NEG_REQUEST удовлетворение требований вызывает ''resume_approved_activation'', который обновляет ревизию Ticket и после commit будит текущий handler через ''ticket.changed''. Активация остаётся явной в Blockly текущего handler, а не скрыто выполняется этим callback. Если требования ещё не удовлетворены, ожидание продолжается.
===== Ошибки и уведомления =====
Обработанные отрицательные ответы операции активации дают false и ветвь 900 секунд; 401/403/429, 5xx и ошибки read/requirements API вызывают исключение и общий ''processing_error'' с ''DEFERRED_TICKET_RECHECK_SECONDS''. Изменение данных между первоначальной оценкой и повторным gate может объяснять разные результаты. Таймер сам по себе не исправляет постоянную ошибку данных или scope.
404 при запросе CLOSED запрашивает локальную очистку как при устаревшем контексте. Иные ошибки закрытия не отменяют уже сохранённый active. После commit канонический backend отправляет события смены владельца; Ticket в CLOSED больше не имеет отдельного NEG handler. Потерю событий восстанавливает scoped periodic reconciliation.
Автор уведомляется через текущий local-Django helper и его XMPP-реквизиты. Администраторы получают MUC-сообщение по общим правилам [[sharixopen:knowledge:scenarios:neg_request_pending|NEG/PENDING]]. В этих уведомлениях нет durable verification ack, повторные проходы могут повторять сообщения; send не доказывает прочтение и не выдаёт доступ к Ticket.
===== Настройки и диагностика =====
^ Состояние ^ Повтор ^
| Relationship отсутствует | ''NEG_REQUEST_INCONSISTENCY_RECHECK_SECONDS''; локально ''related_relationship_missing'', журнал ''related_relationship_inconsistent'' |
| Требования не выполнены | ''NEG_REQUEST_INCONSISTENCY_RECHECK_SECONDS'', ''requirements_pending'' |
| Активация не подтверждена | 900 секунд, ''related_relationship_inconsistent'' |
| Active, но срок закрытия ещё не истёк | ''NEG_REQUEST_DECLINED_CLEANUP_GRACE_DAYS'' от updated_at; короткий defer, ''neg_request_close_grace'' |
| Общее исключение | ''DEFERRED_TICKET_RECHECK_SECONDS'', ''processing_error'' |
| Сверка состава | ''INTERVAL_TIME_BD_REQ'' |
Defer хранится в памяти и освобождает worker. При рестарте runtime заново получает актуальный снимок. Ошибку scoped списка нельзя считать подтверждённой пустой очередью.
При диагностике записать отдельно:
* одобрение и текущий статус Ticket;
* фактическую Relationship, её направление и тип;
* результат requirements;
* ответ операции активации;
* актуальный updated_at и рассчитанный срок;
* результат отдельного перехода CLOSED.
Active при ACCEPTED до контрольного срока может быть штатным. Допустимые переходы ACCEPTED → DECLINED/CLOSED не подменяют доменное действие над Relationship.
===== Проверенные источники =====
Git SHA/SHA-256 и параметры моделей закреплены в metadata и documentation BPMN. Код handler при анализе не исполнялся; изменение источников требует повторного сопоставления.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_neg_request_accepted.py|sharix-open-handlers-examples / handlers/open_neg_request_accepted.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_neg_request_accepted.json|sharix-open-handlers-examples / generated_handler_blocks/open_neg_request_accepted.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/handler_operations.py|sharix-open-handlers-backend / core/handler_operations.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/ejabberd_muc.py|sharix-open-handlers-backend / core/ejabberd_muc.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/api/views/handler_workflow.py|sharix-open-tickets / api/views/handler_workflow.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/api/handler_auth.py|sharix-open-tickets / api/handler_auth.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/signals.py|sharix-open-tickets / signals.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/services/handler_wakeup.py|sharix-open-tickets / services/handler_wakeup.py]] — Git fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/apiviews/handler_workflow.py|sharix-open-backend / apiviews/handler_workflow.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/activation.py|sharix-open-backend / lib/activation.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/requirement_actions.py|sharix-open-backend / lib/requirement_actions.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/requirement_checks.py|sharix-open-backend / lib/requirement_checks.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/document_drafts.py|sharix-open-backend / lib/document_drafts.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/verification_workflow.py|sharix-open-backend / lib/verification_workflow.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/models/relationship.py|sharix-open-backend / models/relationship.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
===== Связанные материалы =====
* [[sharixopen:knowledge:scenarios:neg_request_pending|PENDING: решение и scope уведомления]]
* [[sharixopen:knowledge:scenarios:access_request_accepted|ACCESS/ACCEPTED: другой объект и порядок закрытия]]
* [[sharixopen:knowledge:scenarios:st_request_done|Завершение профильной проверки]]
* [[sharixopen:knowledge:scenarios:start|Все сценарии]]
~~SHARIX_KNOWLEDGE_RELATED~~