{
"id": "ShariXKnowledgeNegRequestPendingBPMN",
"page": "sharixopen:knowledge:scenarios:neg_request_pending",
"area": "open",
"type": "procedure",
"title": "NEG_REQUEST в PENDING: решение по Relationship и граница API scope",
"status": "review",
"schema_version": 1,
"relations": {
"related_to": [
"ShariXKnowledgeAccessRequestPendingBPMN",
"ShariXKnowledgeOpenKnowledgeModulesHandlers",
"ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth",
"ShariXKnowledgeScenarios",
"ShariXKnowledgeHub",
"ShariXKnowledgeNegRequestAcceptedBPMN",
"ShariXKnowledgeNegRequestDeclinedBPMN",
"ShariXKnowledgePartnerRequestScenario"
]
},
"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_object_access",
"neg_request",
"ticket_pending",
"relationship",
"api_capability",
"bpmn",
"ticket",
"blockly",
"generated_python",
"object_scope"
]
},
"diagram": {
"format": "bpmn",
"executable": false
},
"source_evidence": [
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "handlers/open_neg_request_pending.py",
"sha256": "c1ce289487c6dcf04cdf76740721e12744dd62423e29605c556e0daac1e140b2"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "generated_handler_blocks/open_neg_request_pending.json",
"sha256": "b9d64844c92e7002c77a1b2ff225bc4d72ebe3b889b85a32d664a6b7d748951e"
},
{
"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"
}
],
"handler_process": {
"handler_id": "open_neg_request_pending",
"source_kind": "git_builtin",
"canonical_python_verified": true,
"reviewed_on": "2026-10-28",
"known_contract_gaps": [
"manual notification reads relationship but catalog lacks related.relationship.read; with default scope projection the API returns 403 before notify/defer"
],
"runtime_identity_verified": false,
"generator": "tools/generate_handler_bpmn.py",
"generator_sha256": "ca837a7b9e55bf58184bdf408a8035d25667ed9c5d3068ca52380b2ff5682f95",
"models": {
"logic": "aa36b5fafe8869adef55c579ee4cf856258d77c7d58cd07d5caa13b75df5dc3a",
"external": "a9a82494e288117347748493525ae882f0f9f827cafaa07b6e194c7fc7292df1"
}
},
"diagram_view_bounds": {
"reviewed_on": "2026-10-29",
"models": [
"logic"
],
"semantics_unchanged": true,
"utility": "tools/expand_bpmn_view_bounds.py",
"utility_sha256": "f878658b0115773e34f6c3eec72eba5984d873e60d8e2a4336b3dfb2a8026d87"
},
"editorial_review": {
"date": "2026-10-31",
"scope": "rewrite",
"batch": 5,
"style": "Конкретика, перечисления, видимая и машинная навигация; закрытые детали остаются в intrawiki."
},
"source_review_20261031": {
"kind": "source_analysis_not_runtime_acceptance",
"sources": [
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "apiviews/handler_workflow.py",
"sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "handlers/open_neg_request_pending.py",
"sha256": "c1ce289487c6dcf04cdf76740721e12744dd62423e29605c556e0daac1e140b2"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "generated_handlers/open_neg_request_pending.py",
"sha256": "c1ce289487c6dcf04cdf76740721e12744dd62423e29605c556e0daac1e140b2"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "generated_handler_blocks/open_neg_request_pending.json",
"sha256": "b9d64844c92e7002c77a1b2ff225bc4d72ebe3b889b85a32d664a6b7d748951e"
},
{
"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": "core/ejabberd_muc.py",
"sha256": "35c2eba89fab36b5c444439a87beaa516b55133991136d5370418d92a18d7bcd"
},
{
"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": "signals.py",
"sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"
},
{
"repository": "sharix-open-tickets",
"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
"path": "api/handler_auth.py",
"sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"
},
{
"repository": "sharix-open-tickets",
"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14",
"path": "lib/tickets.py",
"sha256": "0d260c17947f9a186d07af2749159780e3c7354a95b4bafe9d67493663c96883"
}
]
},
"hierarchy_review": {
"date": "2026-10-31",
"canonical_parent_id": "ShariXKnowledgeScenarios",
"page_url_preserved": true,
"kind": "article_and_navigation"
},
"classification": {
"schema": "sharix.knowledge.classification.v1",
"products": [
"sharix_open"
],
"audiences": [
"developer",
"support",
"reviewer",
"ai"
],
"material": "scenario",
"topics": [
"handlers/relationships",
"security/object_access"
],
"tag_terms": [
"audience_developer",
"audience_support",
"audience_reviewer",
"audience_ai",
"product_sharix_open",
"material_scenario",
"topic_handlers_relationships",
"topic_security_object_access",
"neg_request",
"ticket_pending",
"relationship",
"api_capability",
"bpmn",
"ticket",
"blockly",
"generated_python",
"object_scope"
],
"registry_document": "ShariXKnowledgeClassification",
"state_meaning": "lifecycle относится к описываемому коду, а status к редакции документа; implemented не означает успешный runtime тест"
},
"classification_review": {
"date": "2026-10-31",
"source": "Содержание текущей страницы и проверенный словарь классификации",
"body_scope": "classification_and_navigation_only"
}
},
"content_sha256": "df7336be740bed2364862514e34b4e6f49892eaced52915a23f2d5b3cf07bfe6",
"schema": 1
}
====== NEG_REQUEST в PENDING: решение по Relationship и граница API scope ======
~~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#obektnye_prava|Доступ → Объектные права]].
**Навигация:** [[sharixopen:knowledge:start|База знаний]] → [[sharixopen:knowledge:scenarios:start|Сценарии]] → NEG_REQUEST / PENDING.
**Область:** ShariX Open. **Обработчик:** ''open_neg_request_pending'', тип ''NEG_REQUEST'' (4), рабочий статус ''PENDING'' (420). Опубликованные источники повторно обновлены из Git 31.10.2026. Python заново получен из Blockly workspace; обе поставляемые Python-копии побайтово совпали, проверены 11 исходников генераторов из контракта. Сам обработчик при анализе не исполнялся. Фактическая server identity и выбранная локальная версия отдельно не проверялись.
===== Назначение и границы =====
Обработчик сопровождает запрос на Relationship до принятия либо отказа. Он не создаёт Relationship и не активирует её. Принятие переводит Ticket в ''ACCEPTED''; требования и активация принадлежат следующему handler и backend gate. Это сценарий публичного dbsynce-домена ShariX Open. Он не описывает отдельные модели взаимоотношений ShariX Platform и не отождествляет клиента сервиса с клиентом платформы.
После проверки рабочего статуса выбирается ветвь:
* **assigned_to заполнен:** Ticket исключается из локальной очереди с удалением комнаты. Бизнес-статус не меняется; это не принятие и не передача в ACCEPTED.
* **assigned_to не заполнен:** дальнейшее решение определяется NEGREQ_AUTOACCEPT.
Scoped список фильтруется по типу/статусу. Поэтому назначенный Ticket, который сохранил PENDING, может позже снова поступить через reconciliation и снова быть исключён.
Для неназначенного Ticket:
* **NEGREQ_AUTOACCEPT включён:** запросить ACCEPTED и явно передать Ticket следующему handler.
* **NEGREQ_AUTOACCEPT выключен:** подготовить уведомление о Relationship, отправить его и ждать ручного решения. Достижимость этой ветви зависит от расхождения API capability ниже.
===== Известное расхождение опубликованных контрактов =====
Для open_neg_request_pending в catalog.py объявлены:
* ''ticket.read'';
* ''ticket.transition'';
* ''ticket.assign''.
Но подготовка ручного уведомления выполняется в таком порядке:
- build_neg_request_notification_message вызывает _get_related_relationship.
- Requester читает Relationship через dbsynce/api/handler/ticket/{ticket_id}/relationship/.
- Backend проверяет capability related.relationship.read **до** возврата объекта.
- В указанном каталоге такого capability у PENDING нет.
Чтение происходит до отправки уведомления, а не после него.
При штатной проекции исследованного каталога в ''HANDLER_API_KEY_SCOPES'' такой read заканчивается 403. Исключение доходит до общего retry/defer ''processing_error''; сообщение, ''manual_relationship_decision'' и штатный defer ручной ветви до завершения подготовки не достигаются. Отсутствие сообщения в этой ситуации не доказывает, что заявок нет или что её уже рассмотрели.
Это вывод из сопоставления свежих catalog, runtime, requester, handler auth и endpoint, а не результат вызова от имени реального ключа на конкретной установке. Сервер с иным явно настроенным scope может вести себя иначе; нужно сверить фактическую identity. Не следует обходить ошибку generic CRUD-ключом или ослаблением проверки API. Возможные направления исправления:
* согласовать узкий контракт чтения Relationship для этой операции;
* либо убрать это чтение из подготовки сообщения.
В обоих случаях нужны согласованные workspace/generation и проверки. В этой редакции документации программное исправление не выполнялось.
На BPMN оставлена как последовательность Python при успешном разрешённом read, так и явная boundary-ошибка 403. Эта страница не объявляет ручной путь безусловно работоспособным в стандартном каталоге.
===== Один проход и ожидание (BPMN) =====
{"notes": ["Git built-in и внешние контракты, без выполнения обработчика.", "BPMN isExecutable=false. End event — конец показанного прохода, не предоставление права.", "deferred_until — символ локального срока, не настройка сервера.", "Известное расхождение базового каталога: ручное уведомление требует related.relationship.read, отсутствующего у NEG_PENDING. 403 возникает до notify/defer. Фактическая server identity проверяется отдельно."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_neg_request_pending.py", "repository": "sharix-open-handlers-examples", "sha256": "c1ce289487c6dcf04cdf76740721e12744dd62423e29605c556e0daac1e140b2"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_neg_request_pending.json", "repository": "sharix-open-handlers-examples", "sha256": "b9d64844c92e7002c77a1b2ff225bc4d72ebe3b889b85a32d664a6b7d748951e"}, {"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"}]}
neg_start
neg_status
neg_assigned
neg_auto
neg_notify
neg_defer
neg_cleanup
neg_end
neg_transition
neg_confirmed
neg_handoff
neg_remove
neg_accepted
neg_missing
neg_notify_error
neg_api_error
neg_send_error
neg_retry
neg_relationship
neg_read_error
neg_wait
neg_timer
neg_revision
neg_ready
neg_Flow_0
neg_Flow_0
neg_Flow_23
neg_Flow_1
neg_Flow_2
neg_Flow_1
neg_Flow_3
neg_Flow_4
neg_Flow_3
neg_Flow_6
neg_Flow_9
METASERVICE-ADMIN, JID текущего bot и report JID; не автоматическая выдача роли.
neg_Flow_24
neg_Flow_7
NEG_REQUEST_PENDING_RECHECK_SECONDS
neg_Flow_7
neg_Flow_8
neg_Flow_2
neg_Flow_4
neg_Flow_5
neg_Flow_5
neg_Flow_9
neg_Flow_10
neg_Flow_10
neg_Flow_11
neg_Flow_12
neg_Flow_12
neg_Flow_13
neg_Flow_13
neg_Flow_14
neg_Flow_14
neg_Flow_11
При этом вызове нет durable ack. Ошибка отправки — общий retry.
neg_Flow_15
neg_Flow_16
neg_Flow_17
DEFERRED_TICKET_RECHECK_SECONDS; committed ACCEPTED не откатывается.
neg_Flow_15
neg_Flow_16
neg_Flow_17
neg_Flow_25
neg_Flow_18
neg_Flow_8
neg_Flow_18
neg_Flow_19
neg_Flow_20
neg_Flow_19
neg_Flow_21
deferred_until
neg_Flow_20
neg_Flow_22
neg_Flow_21
neg_Flow_22
neg_Flow_23
Требует related.relationship.read. В текущем базовом каталоге NEG_PENDING capability отсутствует.
neg_Flow_6
neg_Flow_24
neg_Flow_25
При отключённом autoaccept успешный read включает в уведомление:
* ID Relationship;
* ''user_who'';
* ''user_whom'';
* ''company'';
* ''neg_type'';
* сохранённый статус.
Это информационные поля связи; они не являются универсальной схемой назначения ролей и сами по себе не дают права принять Ticket. Если разрешённый read вернул 404, helper может сформировать текст «Relationship не найдена»; 403 является ошибкой и таким текстом не подменяется.
После успешного уведомления:
- Записать локальную причину manual_relationship_decision.
- Назначить повтор по NEG_REQUEST_PENDING_RECHECK_SECONDS.
- Освободить worker.
В этом пути нет durable verification ack: при повторных проходах сообщение может отправляться снова.
Автоматическая ветвь не готовит это уведомление и не выполняет данный read. Она запрашивает ACCEPTED через scoped Ticket API, передаёт Ticket в ''open_neg_request_accepted'' и убирает прежний локальный снимок с сохранением комнаты. Это не обход доменных требований активации в следующем handler. 404 при смене статуса запрашивает локальную очистку; иные ошибки API/отправки — общий retry без отката уже committed ACCEPTED.
===== Внешний пользователь и решение (BPMN) =====
{"notes": ["Git built-in и внешние контракты, без выполнения обработчика.", "BPMN isExecutable=false. End event — конец показанного прохода, не предоставление права.", "deferred_until — символ локального срока, не настройка сервера.", "Участие в XMPP комнате не выдаёт право менять Ticket. Текст сообщения не является командой смены статуса.", "Известное расхождение базового каталога: ручное уведомление требует related.relationship.read, отсутствующего у NEG_PENDING. 403 возникает до notify/defer. Фактическая server identity проверяется отдельно."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_neg_request_pending.py", "repository": "sharix-open-handlers-examples", "sha256": "c1ce289487c6dcf04cdf76740721e12744dd62423e29605c556e0daac1e140b2"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_neg_request_pending.json", "repository": "sharix-open-handlers-examples", "sha256": "b9d64844c92e7002c77a1b2ff225bc4d72ebe3b889b85a32d664a6b7d748951e"}, {"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"}]}
person_notice
person_review
person_choose
person_send
person_end
person_Flow_0
person_Flow_0
person_Flow_1
person_Flow_1
person_Flow_2
person_Flow_2
person_Flow_3
person_Flow_3
{"notes": ["Git built-in и внешние контракты, без выполнения обработчика.", "BPMN isExecutable=false. End event — конец показанного прохода, не предоставление права.", "deferred_until — символ локального срока, не настройка сервера.", "Участие в XMPP комнате не выдаёт право менять Ticket. Текст сообщения не является командой смены статуса.", "Известное расхождение базового каталога: ручное уведомление требует related.relationship.read, отсутствующего у NEG_PENDING. 403 возникает до notify/defer. Фактическая server identity проверяется отдельно."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_neg_request_pending.py", "repository": "sharix-open-handlers-examples", "sha256": "c1ce289487c6dcf04cdf76740721e12744dd62423e29605c556e0daac1e140b2"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_neg_request_pending.json", "repository": "sharix-open-handlers-examples", "sha256": "b9d64844c92e7002c77a1b2ff225bc4d72ebe3b889b85a32d664a6b7d748951e"}, {"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"}]}
backend_request
backend_acl
backend_allowed
backend_save
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
Схема ручного рассмотрения начинается только после успешной доставки/получения сообщения, а не гарантирует его при описанном расхождении scope. MUC-комната ''ticket__type_4'' использует общий helper: активные ''METASERVICE-ADMIN'' с XMPP-реквизитами, текущий bot и report JID. Это не выбор получателей по одному company/neg_type и не выдача им доступа к Ticket. Подготовка комнаты имеет собственные логируемые ошибки; успешная локальная запись о комнате не доказывает доставку всем участникам.
Пользователь изучает основание запроса и выполняет действие через разрешённую карточку/API. Ответ текстом в комнате этот handler не трактует как команду смены статуса. Из PENDING текущий lifecycle допускает ACCEPTED, DECLINED либо CLOSED; схема показывает два профильных решения. Закрытие напрямую не доказывает активацию Relationship. Авторство не даёт права принять собственную заявку: view/API проверяют объектный доступ и допустимость перехода.
После commit ''ticket.changed'' будит нового владельца, ''ticket.moved'' исключает прежний локальный снимок, при занятом worker — через pending discard. Потеря XMPP-доставки не отменяет сохранённый статус и восстанавливается periodic reconciliation.
===== Таймеры, ошибки и диагностика =====
^ Ситуация ^ Повтор / результат ^
| Ручное уведомление успешно подготовлено и отправлено | ''NEG_REQUEST_PENDING_RECHECK_SECONDS'', ''manual_relationship_decision'' |
| Нет read capability при подготовке уведомления | 403 до notify; общий ''processing_error'' |
| Иное исключение API/отправки | ''DEFERRED_TICKET_RECHECK_SECONDS'', ''processing_error'' |
| Потеря сообщения / восстановление состава | ''INTERVAL_TIME_BD_REQ'', scoped PENDING-список |
При диагностике времени и очереди учитывать:
* autoaccept берётся при создании HandlerContext; изменение окружения не доказывает изменения работающего процесса;
* defer находится в памяти и не занимает worker;
* новая authoritative revision может снять ожидание, тот же снимок — нет;
* после restart очередь получает актуальные Ticket;
* ошибка API-списка не равна подтверждённой пустой очереди.
Порядок предметной диагностики:
* **Ручной режим:** сопоставить фактические capabilities с чтением Relationship и проверить 403 в журнале.
* Отдельно установить назначение пользователя, решение по Ticket и действительную активацию Relationship.
* **Автоматический режим:** проверить сохранённый ACCEPTED, доставку следующему handler и отдельный requirements gate.
Смена имени настройки или ручное выставление active не исправляют расхождение контракта уведомления.
===== Связанные материалы =====
* [[sharixopen:knowledge:scenarios:neg_request_accepted|Следующая стадия ACCEPTED]].
* [[sharixopen:knowledge:scenarios:neg_request_declined|Отказ и контрольный срок]].
* [[sharixopen:knowledge:scenarios:partner_request|Заявка партнёра и связанные запросы]].
* [[sharixopen:knowledge:modules:handlers|Исходники и выполнение handler]].
* [[sharixopen:knowledge:operations:runtime_health|Диагностика runtime]].
===== Исходники, сверенные 31.10.2026 =====
Проверены опубликованные исходники указанных commits. Это анализ кода, а не подтверждение состояния сервера или выполнения процесса в установленной системе.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/apiviews/handler_workflow.py|sharix-open-backend: apiviews/handler_workflow.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_neg_request_pending.py|sharix-open-handlers-examples: handlers/open_neg_request_pending.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handlers/open_neg_request_pending.py|sharix-open-handlers-examples: generated_handlers/open_neg_request_pending.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_neg_request_pending.json|sharix-open-handlers-examples: generated_handler_blocks/open_neg_request_pending.json]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/catalog.py|sharix-open-handlers-examples: catalog.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/blockly_runtime.py|sharix-open-handlers-backend: core/blockly_runtime.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/requesters.py|sharix-open-handlers-backend: core/requesters.py]].
* [[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]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_blockly_codegen.py|sharix-open-handlers-backend: ticket_blockly_codegen.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/ticket_codegen_contract.json|sharix-open-handlers-backend: ticket_codegen_contract.json]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/signals.py|sharix-open-tickets: signals.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/api/handler_auth.py|sharix-open-tickets: api/handler_auth.py]].
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-tickets/src/commit/fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14/lib/tickets.py|sharix-open-tickets: lib/tickets.py]].
~~SHARIX_KNOWLEDGE_RELATED~~