| |
| sharixopen:knowledge:scenarios:access_request_accepted [2026/10/28 19:44] – [sharixknowledge] approved package sx_knowledge_api_open | sharixopen:knowledge:scenarios:access_request_accepted [2026/10/31 14:26] (текущий) – [sharixknowledge] approved package sx_knowledge_api_open |
|---|
| "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth", | "ShariXKnowledgeOpenKnowledgeOperationsRuntimehealth", |
| "ShariXKnowledgeScenarios" | "ShariXKnowledgeScenarios" |
| | ], |
| | "depends_on": [ |
| | "ShariXKnowledgeOpenKnowledgeModulesHandlers", |
| | "ShariXKnowledgeOpenKnowledgeModulesBackenddbsynce" |
| | ], |
| | "verified_by": [ |
| | "ShariXKnowledgeVerification" |
| ] | ] |
| }, | }, |
| "domain": "business_processes", | "domain": "business_processes", |
| "lifecycle": "implemented", | "lifecycle": "implemented", |
| "component": "handlers", | "component": "handlers_examples, handlers_backend, dbsynce, tickets", |
| "parents": [ | "parents": [ |
| "ShariXKnowledgeScenarios" | "ShariXKnowledgeScenarios" |
| ], | ], |
| "terms": [ | "terms": [ |
| "ACCESS_REQUEST", | "audience_developer", |
| "ACCEPTED", | "audience_administrator", |
| "Permissions", | "audience_support", |
| | "audience_reviewer", |
| | "audience_ai", |
| | "product_sharix_open", |
| | "material_scenario", |
| | "topic_handlers_permissions", |
| | "topic_security_permissions", |
| | "topic_security_requirements", |
| | "access_request", |
| | "ticket_accepted", |
| | "permissions", |
| "requirements", | "requirements", |
| "BPMN" | "activation_gate", |
| | "bpmn", |
| | "ticket", |
| | "blockly", |
| | "generated_python" |
| ] | ] |
| }, | }, |
| "path": "lib/verification_workflow.py", | "path": "lib/verification_workflow.py", |
| "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644" | "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644" |
| | }, |
| | { |
| | "repository": "sharix-open-tickets", |
| | "commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", |
| | "path": "models/ticket.py", |
| | "sha256": "4768d9ef47b61bf3ae98bf2749ed142adc477978b44de29177363ba9664baa43" |
| } | } |
| ], | ], |
| "gate": "7bf93bbfeea74a220b533c29f1c8a4ecbc9fb344bafdfbb3673f8dab262a5b49" | "gate": "7bf93bbfeea74a220b533c29f1c8a4ecbc9fb344bafdfbb3673f8dab262a5b49" |
| } | } |
| | }, |
| | "classification": { |
| | "schema": "sharix.knowledge.classification.v1", |
| | "products": [ |
| | "sharix_open" |
| | ], |
| | "audiences": [ |
| | "developer", |
| | "administrator", |
| | "support", |
| | "reviewer", |
| | "ai" |
| | ], |
| | "material": "scenario", |
| | "topics": [ |
| | "handlers/permissions", |
| | "security/permissions", |
| | "security/requirements" |
| | ], |
| | "tag_terms": [ |
| | "audience_developer", |
| | "audience_administrator", |
| | "audience_support", |
| | "audience_reviewer", |
| | "audience_ai", |
| | "product_sharix_open", |
| | "material_scenario", |
| | "topic_handlers_permissions", |
| | "topic_security_permissions", |
| | "topic_security_requirements", |
| | "access_request", |
| | "ticket_accepted", |
| | "permissions", |
| | "requirements", |
| | "activation_gate", |
| | "bpmn", |
| | "ticket", |
| | "blockly", |
| | "generated_python" |
| | ], |
| | "registry_document": "ShariXKnowledgeClassification", |
| | "state_meaning": "implemented — описана проверенная реализация исходников; серверный runtime отдельно; review — состояние текста" |
| | }, |
| | "editorial_review": { |
| | "date": "2026-10-31", |
| | "scope": "Конкретизация действий, условий, результатов и диагностики; перечисления; исходные BPMN сохранены", |
| | "current_source_records_verified": 25, |
| | "original_source_evidence_recheck": "После git fetch все исходные commits/SHA-256 совпали; дополнительные функциональные источники включены в source_evidence", |
| | "canonical_regeneration": { |
| | "kind": "ticket", |
| | "compared_python_paths": [ |
| | "handlers/open_access_request_accepted.py", |
| | "generated_handlers/open_access_request_accepted.py" |
| | ], |
| | "generator_sources_verified": 11, |
| | "handler_executed": false |
| | }, |
| | "runtime_checked": false |
| } | } |
| }, | }, |
| "content_sha256": "2767a7b3e349b0b5b67cebdc15a71e3d547ad8ddce61dd6e2d6c608dc5187df6", | "content_sha256": "e17e8ff016aad4b776f21e767b0e75ac98a9d57e86f25c2f3332b6e1c891f787", |
| "schema": 1 | "schema": 1 |
| } | } |
| ~~NOCACHE~~ | ~~NOCACHE~~ |
| |
| **Область:** ShariX Open. **Обработчик:** ''open_access_request_accepted'', тип ''ACCESS_REQUEST'' (3), рабочий статус ''ACCEPTED'' (321). Опубликованный Python на 28.10.2026 побайтово проверен реальным renderer его Blockly workspace. Схемы отражают встроенную реализацию; выбранная локальная версия и состояние runtime проверяются отдельно. | **Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]]. |
| | |
| | **Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#administrator|Администратор]] · [[sharixopen:knowledge:classification:audiences#podderzhka|Поддержка]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]]. |
| | |
| | **Темы:** [[sharixopen:knowledge:classification:topics#access_request|Обработчики → ACCESS_REQUEST]] · [[sharixopen:knowledge:classification:topics#polnomochija|Доступ → Полномочия]] · [[sharixopen:knowledge:classification:topics#trebovanija|Доступ → Требования]]. |
| | |
| | |
| | |
| | **Область:** ShariX Open. **Обработчик:** ''open_access_request_accepted'', тип ''ACCESS_REQUEST'' (3), рабочий статус ''ACCEPTED'' (321). 31.10.2026 исходники повторно получены из Git. Обе Python-копии совпали с новой канонической генерацией Blockly; проверены 11 исходников генераторов. Сам обработчик и его внешние действия не запускались. Выбранная версия и работающая установка проверяются отдельно. |
| |
| ===== Назначение и границы ===== | ===== Назначение и границы ===== |
| ''ACCEPTED'' означает, что запрос одобрен, но permission ещё должна пройти требования и активацию. Обработчик не создаёт отсутствующую Permissions, не считает одобрение заменой документов/проверок и не закрывает Ticket до успешного ответа операции активации. ''ACCREQ_AUTOACCEPT'' здесь не проверяется: стадия уже одобрена, а требования действуют независимо от способа принятия PENDING. | ACCEPTED означает одобренный запрос. Для active permission ещё требуются: |
| | |
| | * существующая связанная Permissions; |
| | * выполненные обязательные требования; |
| | * успешный ответ канонической активации. |
| | |
| | Отсутствующая permission этим handler не создаётся. ACCREQ_AUTOACCEPT здесь не проверяется: требования действуют независимо от способа принятия PENDING. |
| | |
| | Порядок runtime: |
| | |
| | - Прочитать связанную permission. |
| | - Проверить requirements. |
| | - Запросить активацию с повторным backend gate. |
| | - Только после успеха запросить CLOSED. |
| |
| Runtime последовательно читает связанную permission, проверяет requirements, запрашивает активацию и только затем ''CLOSED''. Между этими запросами нет одной общей транзакции. Backend повторно проверяет требования внутри канонического activation gate; предварительный ''ok'' не разрешает пропустить эту проверку. | Общей транзакции этих запросов нет. Предварительный ok не позволяет пропустить повторную оценку внутри активации. |
| |
| BPMN имеют ''isExecutable=false''. Wiki не запускает код: runtime выполняет выбранный проверенный Python из Blockly. End event завершает показанную операцию; defer-узел на первой схеме завершает текущий проход и передаёт ожидание планировщику. | BPMN имеют ''isExecutable=false''. Wiki не запускает код: runtime выполняет выбранный проверенный Python из Blockly. End event завершает показанную операцию; defer-узел на первой схеме завершает текущий проход и передаёт ожидание планировщику. |
| * Операция активации вернула обработанный отрицательный результат — уведомить администраторов, записать ''related_permission_inconsistent'' и отложить на 900 секунд. Это текущая константа Python, а не отдельный параметр окружения. | * Операция активации вернула обработанный отрицательный результат — уведомить администраторов, записать ''related_permission_inconsistent'' и отложить на 900 секунд. Это текущая константа Python, а не отдельный параметр окружения. |
| |
| Связанная permission определяется по ''ticket_status_id''. API читает максимум две записи: отсутствие — 404, несколько — конфликт 409 для ручной проверки данных, а не выбор произвольной permission. 404 этого read-пути может означать также выход Ticket из scope; runtime возвращает «не найдена», не доказывая физического отсутствия permission. Актуальный статус нужно сверить отдельно. | Связь ищется по ticket_status_id с чтением максимум двух записей: |
| | |
| | * **Нет записи:** 404. |
| | * **Несколько записей:** 409, требуется разбор данных. |
| | * **Ticket вышел из scope:** read также может вернуть 404. |
| | |
| | По одному 404 нельзя доказать физическое отсутствие permission. Сначала сверить актуальный Ticket и его рабочую область. |
| |
| ===== Backend: подготовка действий и повторный gate (BPMN) ===== | ===== Backend: подготовка действий и повторный gate (BPMN) ===== |
| GET ''dbsynce/api/handler/ticket/{ticket_id}/requirements/?model=permission'' требует capability ''related.requirements.read'' и текущий Ticket scope. В этой реализации GET не является чистым чтением: перед оценкой он вызывает ''ensure_requirement_actions''. Канонический evaluator остаётся read-only, а orchestration подготавливает недостающие обязательные черновики документов, попытки RequirementCheck и связанные профильные ST_REQUEST там, где это предусмотрено настройками. | GET ''dbsynce/api/handler/ticket/{ticket_id}/requirements/?model=permission'' требует capability ''related.requirements.read'' и текущий Ticket scope. В этой реализации GET не является чистым чтением: перед оценкой он вызывает ''ensure_requirement_actions''. Канонический evaluator остаётся read-only, а orchestration подготавливает недостающие обязательные черновики документов, попытки RequirementCheck и связанные профильные ST_REQUEST там, где это предусмотрено настройками. |
| |
| Действия создаются/переиспользуются по доменным правилам. Необязательные требования не навязываются. Отсутствующая CheckDefinition или неподходящая конфигурация очереди не превращаются в успех; для ручных проверок соответствующая очередь должна быть настроена. Platform-level проверка не должна молча попадать в сервисную очередь. Публичный интеграционный порт может подготовить сведения о встрече; это организация, а не результат проверки. | Подготовка действий соблюдает доменные правила: |
| | |
| | * создаёт или переиспользует необходимые действия; |
| | * не навязывает необязательные требования; |
| | * не считает отсутствие CheckDefinition успехом; |
| | * требует правильно настроенной очереди для ручной проверки; |
| | * направляет проверку в очередь, соответствующую её области. |
| | |
| | Необязательный публичный порт может подготовить сведения о встрече. Это организация, а не положительный результат проверки. |
| |
| После ''ok=true'' runtime запрашивает ''dbsynce/api/handler/ticket/{ticket_id}/permission/'' с действием ''set_status'' и ''status=0''. Backend проверяет capability ''related.permission.status'', scope, единственность связи и блокирует строки Ticket/permission. Установка active через совместимый ''set_status'' проходит тот же ''activate_object_if_requirements_met'', что и явная activate-операция: повторная подготовка действий и новая оценка обязательных требований. Прямой ''status=0'' не является обходом gate. | После ''ok=true'' runtime запрашивает ''dbsynce/api/handler/ticket/{ticket_id}/permission/'' с действием ''set_status'' и ''status=0''. Backend проверяет capability ''related.permission.status'', scope, единственность связи и блокирует строки Ticket/permission. Установка active через совместимый ''set_status'' проходит тот же ''activate_object_if_requirements_met'', что и явная activate-операция: повторная подготовка действий и новая оценка обязательных требований. Прямой ''status=0'' не является обходом gate. |
| |
| При успехе permission получает active, дату проверки и, при наличии ''assigned_to'', соответствующего ''checked_by''. Для ''METASERVICE-CLIENT'' и ''CORP-CLIENT'' синхронизируются подходящие записи Client/CorpClient с учётом связи Ticket. Permissions остаётся источником права; доменные записи не подменяют её. Backend фиксирует Event и возвращает результат операции. Доступ к конкретным интерфейсам далее определяется их ACL. | Успешная активация сохраняет: |
| | |
| | * active у permission; |
| | * дату проверки; |
| | * checked_by из assigned_to, когда он задан; |
| | * Event операции. |
| | |
| | Для METASERVICE-CLIENT и CORP-CLIENT синхронизируются соответствующие Client/CorpClient с учётом связи Ticket. Источником права остаётся Permissions; доступ к интерфейсам определяется их ACL. |
| |
| ===== Внешний цикл выполнения требований и пробуждение (BPMN) ===== | ===== Внешний цикл выполнения требований и пробуждение (BPMN) ===== |
| 404 при переходе в ''CLOSED'' запрашивает локальную очистку как для устаревшего scope. Если permission уже активировалась, а закрытие Ticket не удалось, активное право не откатывается. Следующий проход заново проверяет ту же связь и gate; он не должен считаться созданием нового права. Для диагностики различайте статус Ticket, status/check_date/checked_by permission, requirements и Event операции. | 404 при переходе в ''CLOSED'' запрашивает локальную очистку как для устаревшего scope. Если permission уже активировалась, а закрытие Ticket не удалось, активное право не откатывается. Следующий проход заново проверяет ту же связь и gate; он не должен считаться созданием нового права. Для диагностики различайте статус Ticket, status/check_date/checked_by permission, requirements и Event операции. |
| |
| Автор уведомляется через текущий legacy helper с локальным Django-поиском пользователя и XMPP-реквизитов. Отсутствие пользователя/реквизитов логируется. Администраторы получают сообщение в MUC-комнату по правилам [[sharixopen:knowledge:scenarios:access_request_pending|PENDING]]: активные ''METASERVICE-ADMIN'', текущий bot и report JID. Это не адресный reviewer API профильных ST_REQUEST и не выдача прав на Ticket. В этих уведомлениях нет durable verification ack; повторные проходы допускают повтор сообщения, а успешный send не доказывает прочтение. | Уведомления этой ветви: |
| | |
| | * **Автор:** legacy helper с локальным Django-поиском пользователя и XMPP-реквизитов; отсутствие получателя логируется. |
| | * **Администраторы:** MUC-комната по правилам [[sharixopen:knowledge:scenarios:access_request_pending|PENDING]] — активные METASERVICE-ADMIN, текущий bot и report JID. |
| | |
| | Это не адресный reviewer API профильных ST_REQUEST. Durable verification ack здесь нет, повторные проходы допускают повтор сообщения; send не доказывает прочтения. |
| |
| ===== Интервалы и внешнее решение ===== | ===== Интервалы и внешнее решение ===== |
| |
| ===== Диагностика ===== | ===== Диагностика ===== |
| Сначала проверьте, какая permission связана с Ticket и единственна ли эта связь, какие requirements реально missing и созданы ли конкретные действия для их выполнения. Затем — состояние внешних проверок, обратный wakeup, результат повторного activation gate и отдельный переход CLOSED. Ручное изменение одного статуса Ticket не заменяет эти операции. Если permission уже active, а последующая оценка выявляет missing, этот handler сам её не деактивирует: он остаётся в ветви ожидания требований. Формулировка уведомления «право пока не активировано» не заменяет чтение фактического status permission; такое расхождение требует отдельного разбора. | Порядок диагностики: |
| | |
| | - Проверить единственную permission, связанную с Ticket. |
| | - Прочитать реально missing requirements и созданные действия. |
| | - Проверить состояния внешних проверок и обратный wakeup. |
| | - Прочитать результат повторного activation gate. |
| | - Отдельно проверить CLOSED и Event операции. |
| | |
| | Если permission уже active, а требования стали missing, текущий handler сам её не деактивирует: он ждёт. Текст уведомления «право пока не активировано» не заменяет чтение фактического status. |
| |
| ===== Проверенные источники ===== | ===== Проверенные источники ===== |