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