{
"id": "ShariXKnowledgeServiceRequestPendingBPMN",
"page": "sharixopen:knowledge:scenarios:service_request_pending",
"area": "open",
"type": "procedure",
"title": "SERVICE_REQUEST в PENDING: партии кандидатов и назначение победителя",
"status": "review",
"schema_version": 1,
"relations": {
"related_to": [
"ShariXKnowledgeServiceRequestBookedBPMN",
"ShariXKnowledgeServiceRequestAssignedBPMN",
"ShariXKnowledgeServiceRequestTemplateBPMN",
"ShariXKnowledgeOpenKnowledgeModulesHandlers",
"ShariXKnowledgeScenarios"
],
"depends_on": [
"ShariXKnowledgeOpenKnowledgeModulesHandlers",
"ShariXKnowledgeOpenKnowledgeModulesBackenddbsynce"
],
"verified_by": [
"ShariXKnowledgeVerification"
]
},
"extensions": {
"taxonomy": {
"domain": "business_processes",
"lifecycle": "implemented",
"component": "handlers_examples, handlers_backend, dbsynce",
"parents": [
"ShariXKnowledgeScenarios"
],
"terms": [
"audience_developer",
"audience_integrator",
"audience_support",
"audience_reviewer",
"audience_ai",
"product_sharix_open",
"material_scenario",
"topic_orders_assignment",
"topic_orders_lifecycle",
"topic_handlers_runtime",
"service_request",
"ticket_pending",
"provider_offer",
"order_round",
"candidate_batch",
"matching_cursor",
"bpmn",
"order",
"ticket",
"blockly",
"generated_python"
]
},
"diagram": {
"format": "bpmn",
"executable": false
},
"source_evidence": [
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "handlers/open_service_request_pending.py",
"sha256": "8521aac05e4d6b39e7afe7e3fd23e01bf889efc28156f0fc24758bd4c47d1649"
},
{
"repository": "sharix-open-handlers-examples",
"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb",
"path": "generated_handler_blocks/open_service_request_pending.json",
"sha256": "350202d5ae40afb1aea68d95e6117cd35b9ed851c9e0142b019dac5de321145f"
},
{
"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/order_action_messages.py",
"sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"
},
{
"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/handler_auth.py",
"sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"
},
{
"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_order_workflow.py",
"sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "apiviews/open_api.py",
"sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/order_handler_relay.py",
"sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/handler_order_context.py",
"sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/order_workflow_policy.py",
"sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/order_actions.py",
"sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/order_permissions.py",
"sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "urls.py",
"sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/order_lifecycle.py",
"sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/order_provider_requirements.py",
"sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "core/order_rounds.py",
"sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"
},
{
"repository": "sharix-open-handlers-backend",
"commit": "50baf376e224d915a87d63240f3f339b3dda9afa",
"path": "settings_schema.py",
"sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/order_matching.py",
"sha256": "74d09c8d9a9970eceba0b7b2324a8beb0e9e315dbf72ac8139493fafbbd69a6d"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "services/provider_availability.py",
"sha256": "933d2a029ebbed4cb4e6b9154bb30a5798f445a0c8d9fe0d5fbd6ea3d1f485c5"
},
{
"repository": "sharix-open-backend",
"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093",
"path": "lib/platform_matching.py",
"sha256": "14814da9f7afa91ab4d39834c5e7b739fdb74359b8df0c4be97fde885e2b92c7"
}
],
"handler_process": {
"handler_id": "open_service_request_pending",
"source_kind": "git_builtin",
"canonical_python_verified": true,
"reviewed_on": "2026-10-28",
"generator": "tools/generate_handler_bpmn.py",
"generator_sha256": "488101a6be2f8f43d63ce966760be9f1c3664c88d88bed17ce0d6bfee9563cae",
"models": {
"logic": "fc3fa0f1ec5a8317f82149ab728ff3537d6d51b1238095d6b09d95ce14a4855a",
"candidates": "5e2d2af585bf14e06f82714164a58088988aff715a6dc737380129d691dd9192",
"round": "d6ce0c03d3a803364f441d404a510049b35b8c27783c177c34b93113d0f13f0a"
}
},
"classification": {
"schema": "sharix.knowledge.classification.v1",
"products": [
"sharix_open"
],
"audiences": [
"developer",
"integrator",
"support",
"reviewer",
"ai"
],
"material": "scenario",
"topics": [
"orders/assignment",
"orders/lifecycle",
"handlers/runtime"
],
"tag_terms": [
"audience_developer",
"audience_integrator",
"audience_support",
"audience_reviewer",
"audience_ai",
"product_sharix_open",
"material_scenario",
"topic_orders_assignment",
"topic_orders_lifecycle",
"topic_handlers_runtime",
"service_request",
"ticket_pending",
"provider_offer",
"order_round",
"candidate_batch",
"matching_cursor",
"bpmn",
"order",
"ticket",
"blockly",
"generated_python"
],
"registry_document": "ShariXKnowledgeClassification",
"state_meaning": "implemented — описана проверенная реализация исходников; серверный runtime отдельно; review — состояние текста"
},
"editorial_review": {
"date": "2026-10-31",
"scope": "Конкретизация действий, условий, результатов и диагностики; перечисления; исходные BPMN сохранены",
"current_source_records_verified": 27,
"original_source_evidence_recheck": "После git fetch все исходные commits/SHA-256 совпали; дополнительные функциональные источники включены в source_evidence",
"canonical_regeneration": {
"kind": "ticket",
"compared_python_paths": [
"handlers/open_service_request_pending.py",
"generated_handlers/open_service_request_pending.py"
],
"generator_sources_verified": 11,
"handler_executed": false
},
"runtime_checked": false,
"clarification": "Повтор PENDING может использовать cached context; новый GET не гарантируется на каждом проходе; новая authoritative revision и processing_error очищают кэш"
}
},
"content_sha256": "f11c3292b45e3ab672b8e936cc749fa6d2d38ebd949e17425023043d66b89bed",
"schema": 1
}
====== SERVICE_REQUEST в PENDING: партии кандидатов и назначение победителя ======
~~NOCACHE~~
**Назначение:** [[sharixopen:knowledge:classification:materials#scenarij_processa|Сценарий процесса]]. **Продукт:** [[sharixopen:knowledge:classification:products#sharix_open|ShariX Open]].
**Для кого:** [[sharixopen:knowledge:classification:audiences#razrabotchik|Разработчик]] · [[sharixopen:knowledge:classification:audiences#integrator|Интегратор]] · [[sharixopen:knowledge:classification:audiences#podderzhka|Поддержка]] · [[sharixopen:knowledge:classification:audiences#recenzent_i_prijomschik|Рецензент и приёмщик]] · [[sharixopen:knowledge:classification:audiences#nejroset|Нейросеть]].
**Темы:** [[sharixopen:knowledge:classification:topics#naznachenie|Заказы → Назначение]] · [[sharixopen:knowledge:classification:topics#zhiznennyj_cikl|Заказы → Жизненный цикл]] · [[sharixopen:knowledge:classification:topics#runtime|Обработчики → Runtime]].
**Область:** ShariX Open. **Обработчик:** ''open_service_request_pending'', тип ''SERVICE_REQUEST'' (2), статус ''PENDING''. 31.10.2026 исходники повторно получены из Git. Обе Python-копии совпали с новой канонической генерацией Blockly; проверены 11 исходников генераторов. Сам обработчик и его внешние действия не запускались. Выбранная версия и работающая установка проверяются отдельно.
===== Назначение и границы =====
Подбор для заказа без provider:
- Получить от backend допустимую партию.
- Параллельно отправить предложения.
- Выбрать первый допустимый положительный ответ в раунде.
- Отдельным backend action повторить проверки, сохранить provider и PENDING → ACCEPTED.
Согласие участника само по себе не переводит заказ в ASSIGNED или PRE_START.
Схемы BPMN описательные, ''isExecutable=false''. Исполняется проверенный Python, сгенерированный из Blockly; Wiki не исполняет XML и не заменяет runtime. Внешний человек, доставка сообщений, API и таймеры показаны отдельно от бизнес-решения.
===== Порядок решений текущего прохода (BPMN) =====
{"notes": ["ShariX Open, опубликованный Python совпадает с renderer Blockly; isExecutable=false.", "Общий deadline поиска проверяется до winner раунда.", "Раунд, курсор и цикл — в памяти; ответ человека не равен назначению в БД."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_pending.py", "repository": "sharix-open-handlers-examples", "sha256": "8521aac05e4d6b39e7afe7e3fd23e01bf889efc28156f0fc24758bd4c47d1649"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_pending.json", "repository": "sharix-open-handlers-examples", "sha256": "350202d5ae40afb1aea68d95e6117cd35b9ed851c9e0142b019dac5de321145f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"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/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_matching.py", "repository": "sharix-open-backend", "sha256": "74d09c8d9a9970eceba0b7b2324a8beb0e9e315dbf72ac8139493fafbbd69a6d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "services/provider_availability.py", "repository": "sharix-open-backend", "sha256": "933d2a029ebbed4cb4e6b9154bb30a5798f445a0c8d9fe0d5fbd6ea3d1f485c5"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/platform_matching.py", "repository": "sharix-open-backend", "sha256": "14814da9f7afa91ab4d39834c5e7b739fdb74359b8df0c4be97fde885e2b92c7"}]}
pending_start
pending_deadline
pending_move
pending_moved
pending_end_move
pending_outcome
pending_accept
pending_accepted
pending_end_accept
pending_retry_winner
pending_terminal
pending_forget
pending_round
pending_send
pending_recipients
pending_defer
pending_end
pending_empty
pending_error
pending_retry
pending_Flow_0
pending_Flow_0
pending_Flow_1
pending_Flow_5
pending_Flow_1
pending_Flow_2
pending_Flow_2
pending_Flow_3
pending_Flow_4
pending_Flow_3
pending_Flow_4
pending_Flow_5
pending_Flow_6
pending_Flow_10
pending_Flow_6
pending_Flow_7
pending_Flow_7
pending_Flow_8
pending_Flow_9
pending_Flow_8
pending_Flow_9
pending_Flow_10
pending_Flow_11
pending_Flow_12
pending_Flow_11
pending_Flow_13
pending_Flow_12
pending_Flow_13
pending_Flow_14
pending_Flow_15
pending_Flow_14
pending_Flow_16
pending_Flow_16
pending_Flow_17
pending_Flow_18
pending_Flow_15
pending_Flow_17
pending_Flow_19
pending_Flow_19
pending_Flow_18
pending_Flow_20
pending_Flow_20
В начале processing:
* проверяется рабочий PENDING;
* берётся current_service_request_order_context, а при отсутствии кэша загружается scoped context;
* записывается provider_matching_batch;
* чужой статус запрашивает очистку Ticket/комнаты;
* 404 context очищает устаревший scope, отсутствие/неоднозначность Orders даёт ошибку API.
Новый GET не гарантируется на каждом повторе. Кэш очищается, в частности, при новой ревизии/смене статуса authoritative Ticket, processing_error и уборке локального состояния. При изменении дат/заказа важно проверить, какой context и ревизию использует текущая очередь.
Сначала проверяется общий предел поиска: для ASAP — ''asap_deadline'', для планового заказа — ''pre_start_at''. Если срок наступил, handler пробует ''move-pending-to-pre-forcemajeur''. При успехе/stale текущая очередь освобождается. При обработанном отрицательном результате выполнение проходит дальше; исключение API прерывает проход и попадает в общий defer.
Лишь затем рассматривается раунд:
* ''winner'' → ''accept-pending-provider''. При неуспехе сохраняется тот же победитель, defer по ''SERVICE_REQUEST_PENDING_RECHECK_SECONDS''; новая партия пока не выбирается.
* Иной терминальный исход, например ''timed_out'' или ''no_winner'', удаляет раунд и кэш партии, но **сохраняет cursor/cycle поиска**.
* Если раунда нет, создаётся следующая партия и выполняется одна попытка отправки. Нет адресатов — обычный RECHECK, без автоматического объявления полного форс-мажора.
* При существующем раунде defer назначается до его ''expires_at''; без даты — по RECHECK. Ответ/событие может сделать Ticket готовым раньше.
В отличие от ASSIGNED здесь нет отдельной повторной проверки winner сразу после send. Ответы, включая разобранные после отправки queued intents, учитываются последующим проходом. Общий предел поиска всё равно проверяется первым: даже полученное в пределах TTL согласие не обещает назначения после наступления общего deadline.
===== Откуда берутся кандидаты (BPMN) =====
{"notes": ["ShariX Open, опубликованный Python совпадает с renderer Blockly; isExecutable=false.", "Общий deadline поиска проверяется до winner раунда.", "Раунд, курсор и цикл — в памяти; ответ человека не равен назначению в БД.", "Размер партии задаёт backend. Пустой хвост cursor запускает свежий цикл.", "Platform — необязательный внешний порт ранжирования; окончательные кандидаты остаются локально допустимыми."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_pending.py", "repository": "sharix-open-handlers-examples", "sha256": "8521aac05e4d6b39e7afe7e3fd23e01bf889efc28156f0fc24758bd4c47d1649"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_pending.json", "repository": "sharix-open-handlers-examples", "sha256": "350202d5ae40afb1aea68d95e6117cd35b9ed851c9e0142b019dac5de321145f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"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/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_matching.py", "repository": "sharix-open-backend", "sha256": "74d09c8d9a9970eceba0b7b2324a8beb0e9e315dbf72ac8139493fafbbd69a6d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "services/provider_availability.py", "repository": "sharix-open-backend", "sha256": "933d2a029ebbed4cb4e6b9154bb30a5798f445a0c8d9fe0d5fbd6ea3d1f485c5"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/platform_matching.py", "repository": "sharix-open-backend", "sha256": "14814da9f7afa91ab4d39834c5e7b739fdb74359b8df0c4be97fde885e2b92c7"}]}
batch_start
batch_cursor
batch_local
batch_rank
batch_refresh
batch_sort
batch_page
batch_empty
batch_cycle
batch_wait
batch_offers
batch_save
batch_Flow_0
batch_Flow_0
batch_Flow_1
batch_Flow_1
batch_Flow_10
batch_Flow_2
batch_Flow_2
batch_Flow_3
batch_Flow_3
batch_Flow_4
batch_Flow_4
batch_Flow_5
batch_Flow_5
batch_Flow_6
batch_Flow_6
batch_Flow_7
batch_Flow_9
batch_Flow_11
batch_Flow_9
batch_Flow_10
batch_Flow_11
batch_Flow_7
batch_Flow_8
batch_Flow_8
Scoped ''order.candidates'' доступен handler текущего PENDING. Размер партии задаёт **backend** через ''SERVICE_REQUEST_PENDING_BATCH_SIZE''. Параметры cycle/batch/request/TTL в ответе не означают, что backend сохраняет раунды или резервирует кандидатов.
Локальный подбор учитывает:
* услугу и компанию;
* активность Provider и пользователя;
* роль METASERVICE-PROVIDER;
* ресурсные и другие hard eligibility-условия;
* конфликтующие активные заказы;
* доступность и корректный JID.
До ограничения размера партии остаётся один приоритетный Provider на bare JID. Несколько старых предложений одного пользователя не должны занимать всю партию.
Для ASAP сначала идут непосредственные online-предложения, затем gap-предложения по меньшему оставшемуся ожиданию. В одной ASAP-партии не смешиваются разные dispatch groups. Для планового заказа gap допустим, если исполнитель сможет быть готов не позднее ''time_start''.
==== Необязательное внешнее ранжирование ====
Публичный порт может получить порядок кандидатов от подключённого внешнего провайдера:
* ответ уточняет порядок, но не выдаёт исполнителю разрешение и не резервирует доступность;
* после внешнего HTTP локальный набор строится заново;
* неизвестные, чужие по метасервису и уже недопустимые provider id отбрасываются;
* для ASAP сохраняется порядок локальных dispatch groups;
* при недоступном/неподходящем ranking используется локальный порядок.
Метка Platform на границе BPMN обозначает внешнего участника. Внутренние алгоритмы закрытого компонента уточняют у ответственных за Platform; здесь описан только публичный контракт ShariX Open.
==== Партии и циклы ====
Состояние обхода партий:
* after_provider_id — cursor;
* номер партии;
* номер цикла;
* has_more — признак продолжения списка.
После исчерпания списка начинается новый цикл с нулевым cursor. Исчезнувший из допустимого порядка cursor даёт пустой хвост: runtime сбрасывает его и может сделать один дополнительный запрос с начала. Пустой начальный список означает RECHECK.
Для непустой партии runtime создаёт новые offer UUID и общий ''expires_at = now + OFFER_TTL''. Cursor и цикл находятся в памяти процесса; отказ от завершённого раунда их не сбрасывает, а рестарт/full cleanup — сбрасывает. Это не постоянный журнал уже уведомлённых исполнителей и не гарантия отсутствия повторных предложений после рестарта.
===== Человек, окно ответа и окончательное назначение (BPMN) =====
{"notes": ["ShariX Open, опубликованный Python совпадает с renderer Blockly; isExecutable=false.", "Общий deadline поиска проверяется до winner раунда.", "Раунд, курсор и цикл — в памяти; ответ человека не равен назначению в БД.", "first_accept / parallel / одна попытка; TTL не равен общему сроку поиска.", "Backend подтверждает текущий scope, отсутствие provider, hard eligibility, concurrency и requirements."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_pending.py", "repository": "sharix-open-handlers-examples", "sha256": "8521aac05e4d6b39e7afe7e3fd23e01bf889efc28156f0fc24758bd4c47d1649"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_pending.json", "repository": "sharix-open-handlers-examples", "sha256": "350202d5ae40afb1aea68d95e6117cd35b9ed851c9e0142b019dac5de321145f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"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/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_matching.py", "repository": "sharix-open-backend", "sha256": "74d09c8d9a9970eceba0b7b2324a8beb0e9e315dbf72ac8139493fafbbd69a6d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "services/provider_availability.py", "repository": "sharix-open-backend", "sha256": "933d2a029ebbed4cb4e6b9154bb30a5798f445a0c8d9fe0d5fbd6ea3d1f485c5"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/platform_matching.py", "repository": "sharix-open-backend", "sha256": "14814da9f7afa91ab4d39834c5e7b739fdb74359b8df0c4be97fde885e2b92c7"}]}
round_start
round_send
round_wait
round_response
round_validate
round_decision
round_winner
round_deadline
round_backend
round_ok
round_assigned
round_retry
round_force
round_timer
round_next
round_Flow_0
round_Flow_0
round_Flow_1
round_Flow_1
round_Flow_7
round_Flow_2
round_Flow_14
round_Flow_2
round_Flow_3
round_Flow_3
round_Flow_4
round_Flow_4
round_Flow_5
round_Flow_6
round_Flow_7
round_Flow_5
round_Flow_8
round_Flow_8
round_Flow_9
round_Flow_10
round_Flow_9
round_Flow_11
round_Flow_11
round_Flow_12
round_Flow_13
round_Flow_12
round_Flow_13
round_Flow_10
round_Flow_14
round_Flow_15
round_expires_at
round_Flow_6
round_Flow_15
{"notes": ["ShariX Open, опубликованный Python совпадает с renderer Blockly; isExecutable=false.", "Общий deadline поиска проверяется до winner раунда.", "Раунд, курсор и цикл — в памяти; ответ человека не равен назначению в БД.", "first_accept / parallel / одна попытка; TTL не равен общему сроку поиска.", "Backend подтверждает текущий scope, отсутствие provider, hard eligibility, concurrency и requirements."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_pending.py", "repository": "sharix-open-handlers-examples", "sha256": "8521aac05e4d6b39e7afe7e3fd23e01bf889efc28156f0fc24758bd4c47d1649"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_pending.json", "repository": "sharix-open-handlers-examples", "sha256": "350202d5ae40afb1aea68d95e6117cd35b9ed851c9e0142b019dac5de321145f"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "catalog.py", "repository": "sharix-open-handlers-examples", "sha256": "e3dcb72b7e620e2837adacd7af053f35b04cdff475789496d9c114e17d57dfde"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/blockly_runtime.py", "repository": "sharix-open-handlers-backend", "sha256": "3e222150cbff315077c6c9b160d46e59856cedf6d6591d213e958c63cb2f2428"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/requesters.py", "repository": "sharix-open-handlers-backend", "sha256": "965a348cea477722bbaf4c8c6b06023eb238b71664a332f7ea8c90bfe72ea808"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_action_messages.py", "repository": "sharix-open-handlers-backend", "sha256": "046c262c0aabb02104fefca4e887324f99df22731e7726063f614aaf8839ca5c"}, {"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/handler_auth.py", "repository": "sharix-open-tickets", "sha256": "ac76dc45aaa9742e5e1da0b98aae914bb2e287048d33e97b4a245a6997bc8425"}, {"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_order_workflow.py", "repository": "sharix-open-backend", "sha256": "35624ded6e67110437a25dd07caef214a04251eb0136194ae939fa32fef17e84"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/open_api.py", "repository": "sharix-open-backend", "sha256": "cb8fdda304d29c2cc5c0fc938759a13c60022871b7b93d77883d521820021ad3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_handler_relay.py", "repository": "sharix-open-backend", "sha256": "e49a7876169403970d995af464357e2134af19a398372c55db2a5b40681d731e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/handler_order_context.py", "repository": "sharix-open-backend", "sha256": "f3c0731e74d30dbe5e59bd53040a06ee108f14f7aad04771e65d741cffeb7179"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_workflow_policy.py", "repository": "sharix-open-backend", "sha256": "3266c6ecab490a0e19c8bbc02041387b86fe4b14068750e545ba9bde8bf51326"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_actions.py", "repository": "sharix-open-backend", "sha256": "27ce243408a46f1b700d94bf78a25c68ef21d51078bb03627174e4a424d82ef0"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_permissions.py", "repository": "sharix-open-backend", "sha256": "9c1636daa80c4da68c3ae5cf347e279127d142eeff91e969559e8bd54ca3d81d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "urls.py", "repository": "sharix-open-backend", "sha256": "61ffd2f0563291da2dcc9488a5443cb5e2c0395108740a6700034cfd90548158"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_lifecycle.py", "repository": "sharix-open-backend", "sha256": "66dd2c4db9da3aaf90cb080946c1920a4f9953d62d1e6c9e224dd52564c4d661"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_provider_requirements.py", "repository": "sharix-open-backend", "sha256": "392f1f9180a098a4749b5fe5b7948e34530ccdb2befed646e538cdb7a5ddcada"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "core/order_rounds.py", "repository": "sharix-open-handlers-backend", "sha256": "e27a9190374c3888930f60e26686c11f69069bbbefd4511d21ad7267301321eb"}, {"commit": "50baf376e224d915a87d63240f3f339b3dda9afa", "path": "settings_schema.py", "repository": "sharix-open-handlers-backend", "sha256": "8ea8494405c6808834f4be7b171ffb8a969e1dd9b1654d36a8c21fbc9e3599c3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/order_matching.py", "repository": "sharix-open-backend", "sha256": "74d09c8d9a9970eceba0b7b2324a8beb0e9e315dbf72ac8139493fafbbd69a6d"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "services/provider_availability.py", "repository": "sharix-open-backend", "sha256": "933d2a029ebbed4cb4e6b9154bb30a5798f445a0c8d9fe0d5fbd6ea3d1f485c5"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/platform_matching.py", "repository": "sharix-open-backend", "sha256": "14814da9f7afa91ab4d39834c5e7b739fdb74359b8df0c4be97fde885e2b92c7"}]}
providers_notice
providers_choose
providers_reply
providers_end
providers_Flow_0
providers_Flow_0
providers_Flow_1
providers_Flow_1
providers_Flow_2
providers_Flow_2
Для PENDING код жёстко выбирает **first_accept / parallel / одну попытку**. Интервал и окно ответа равны ''SERVICE_REQUEST_PENDING_OFFER_TTL_SECONDS''. Это отличается от настраиваемых стратегий ASSIGNED. Сообщение ''order.action.required'' предлагает accept/decline и ''popup_policy=fullscreen_offer''; параметр popup не доказывает, что приложение показало окно человеку.
Ответ поступает напрямую через XMPP либо через доверенный web relay. Проверяются actor/JID, round/order/ticket/status, принадлежность участника, допустимое действие, offer id при наличии, срок и повтор. Первый допустимый accept даёт winner, все отрицательные — no_winner, истечение TTL — timed_out. Отклонённый/поздний/повторный ответ не является новым согласием. Квитанция ''order.action.response-result'' о приёме ответа ещё не подтверждает запись назначения.
''handler-intents'' с HTTP 202 подтверждает передачу intent, а не изменение заказа. В проекте также зарегистрирован прямой пользовательский ''actions'' API с отдельными каноническими проверками: нельзя утверждать, что любой интерфейсный путь обязательно проходит этот раунд. Маршруты и различие описаны в [[sharixopen:knowledge:scenarios:service_request_template|TEMPLATE]].
==== Повторные backend-проверки ====
Accept-pending-provider под lock проверяет:
* текущий PENDING и отсутствие уже назначенного provider;
* существование кандидата и hard eligibility;
* отсутствие конфликтующего активного заказа;
* готовность обязательных проверок выбранного исполнителя.
Подготовка требований может создать недостающие действия и вернуть requirements_pending без назначения. Это не положительный результат по одному winner раунда.
При успехе provider сохраняется и выполняется канонический переход ACCEPTED; неуспешный переход очищает только что назначенный provider. Этот action не повторяет буквально весь availability/online-фильтр подбора и не проверяет общий deadline: нельзя приписывать ему такие гарантии. Общий срок проверяет runtime.
Доменный отказ назначения оставляет winner для следующей попытки. Поэтому ожидание внешней проверки либо устойчивый конфликт победителя может удерживать ту же кандидатуру до устранения причины или наступления общего срока поиска. Ответы других кандидатов не заменяют её автоматически новым победителем.
==== Что получают остальные ====
После success **или stale** action runtime пытается отправить остальным участникам раунда ''response-result'' с кодом ''lost''. Ошибка отдельного send логируется. Поскольку stale тоже запускает эту рассылку, само сообщение «заказ принял другой исполнитель» не является доказательством, какой provider записан в БД: проверяйте фактический Orders и Ticket.
При включённом ''SERVICE_REQUEST_PENDING_RECORD_OFFER_EVENTS'' могут записываться offer-события для доставленных send получателей. Регистрация попытки и успешный XMPP-send не доказывают прочтение/подтверждение приложением. Round registry, ответы и offer id остаются процессной памятью, без exactly-once гарантии.
===== Два разных срока =====
^ Срок ^ Расчёт / действие ^
| Общее окно ASAP-поиска | ''time_placed + SERVICE_REQUEST_ASAP_SEARCH_MAX_SECONDS'' → попытка PRE_FORCEMAJEUER |
| Плановое начало подготовки | ''planned_start − SERVICE_REQUEST_PRE_START_DURATION_SECONDS'' → попытка PRE_FORCEMAJEUER |
| Окно одной партии | ''runtime now + SERVICE_REQUEST_PENDING_OFFER_TTL_SECONDS'' → timed_out, затем новая партия |
| Повтор при пустом списке / отказе winner | ''SERVICE_REQUEST_PENDING_RECHECK_SECONDS'' |
Точное техническое имя следующего статуса — ''PRE_FORCEMAJEUER''. Это ещё не окончательный FORCEMAJEUR: дальнейшие действия принадлежат следующему handler. Narrow move проверяет текущий PENDING и отсутствие provider под lock; контроль даты выполняется до вызова в runtime, не повторяется этим backend action. Без/при некорректной контрольной дате timing-проверка не объявляет срок наступившим.
===== Диагностика и восстановление =====
Порядок диагностики:
- Прочитать текущие Orders/Ticket/provider и используемый timing context.
- Проверить допустимых кандидатов и их JID.
- Сверить cursor/cycle, TTL партии и общий deadline поиска.
- Разделить send failure, timeout, отклонение ответа и winner.
- Прочитать capabilities и ответ назначения уже выбранного победителя.
Provider_matching_batch — локальная причина, не доказательство успешной рассылки. При неопределённом ответе назначения сначала перечитать каноническое состояние.
API 401/403/5xx и транспортные исключения не равны отказу человека и идут в ''processing_error'' с ''DEFERRED_TICKET_RECHECK_SECONDS''. При 404 scope runtime освобождает устаревшее локальное состояние. После сохранённого перехода нового владельца будит ''ticket.changed'', прежний получает ''ticket.moved''; periodic reconciliation по ''INTERVAL_TIME_BD_REQ'' восстанавливает состав при потере события. Не исправляйте расхождение повторной ручной отправкой старого offer id.
===== Проверенные источники =====
Git SHA/SHA-256 и модели закреплены в metadata и BPMN. При анализе handler и бизнес-API не исполнялись. Сборщик повторно сверяет закреплённые Git-файлы; общий автоматический hook всех обновлений Wiki пока не завершён.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/handlers/open_service_request_pending.py|sharix-open-handlers-examples / handlers/open_service_request_pending.py]] — Git 76e0c693b628ed4a1fa34515a3f8abdff26149bb.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-examples/src/commit/76e0c693b628ed4a1fa34515a3f8abdff26149bb/generated_handler_blocks/open_service_request_pending.json|sharix-open-handlers-examples / generated_handler_blocks/open_service_request_pending.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/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/core/order_action_messages.py|sharix-open-handlers-backend / core/order_action_messages.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/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/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_order_workflow.py|sharix-open-backend / apiviews/handler_order_workflow.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/apiviews/open_api.py|sharix-open-backend / apiviews/open_api.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_handler_relay.py|sharix-open-backend / lib/order_handler_relay.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/handler_order_context.py|sharix-open-backend / lib/handler_order_context.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_workflow_policy.py|sharix-open-backend / lib/order_workflow_policy.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_actions.py|sharix-open-backend / lib/order_actions.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_permissions.py|sharix-open-backend / lib/order_permissions.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/urls.py|sharix-open-backend / urls.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_lifecycle.py|sharix-open-backend / lib/order_lifecycle.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_provider_requirements.py|sharix-open-backend / lib/order_provider_requirements.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/core/order_rounds.py|sharix-open-handlers-backend / core/order_rounds.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-handlers-backend/src/commit/50baf376e224d915a87d63240f3f339b3dda9afa/settings_schema.py|sharix-open-handlers-backend / settings_schema.py]] — Git 50baf376e224d915a87d63240f3f339b3dda9afa.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/order_matching.py|sharix-open-backend / lib/order_matching.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/services/provider_availability.py|sharix-open-backend / services/provider_availability.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
* [[https://git.sharix-app.org/ShariX_Open/sharix-open-backend/src/commit/778a3280cee115ba0efe3fdff7b0e708b0c10093/lib/platform_matching.py|sharix-open-backend / lib/platform_matching.py]] — Git 778a3280cee115ba0efe3fdff7b0e708b0c10093.
===== Связанные материалы =====
* [[sharixopen:knowledge:scenarios:service_request_booked|BOOKED: вход в поиск]]
* [[sharixopen:knowledge:scenarios:service_request_assigned|ASSIGNED: подтверждение уже назначенного исполнителя]]
* [[sharixopen:knowledge:scenarios:start|Индекс сценариев]]
~~SHARIX_KNOWLEDGE_RELATED~~