{ "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~~