Инструменты пользователя

Инструменты сайта


sharixopen:knowledge:scenarios:service_request_prestart

Это старая версия документа!


SERVICE_REQUEST в PRE_START: начало выполнения и внешние действия

Область: ShariX Open. Обработчик: open_service_request_prestart, тип SERVICE_REQUEST (2), статус PRE_START. Проверено 29.10.2026: опубликованный Python побайтово совпадает с каноническим результатом генерации Blockly workspace. Это анализ закреплённых источников, не проверка выбранной версии и параметров конкретного сервера.

Назначение и границы

После подготовки handler сопровождает начало выполнения PRE_START→PROCESS. Он принимает отдельные queued web intents раньше временной ветки, а после планового начала либо стартует автоматически, либо приглашает назначенного исполнителя подтвердить start. Отсутствие ответа не превращается этим Python в автоматический отказ или форс-мажор.

Схемы BPMN описательные, isExecutable=false. Runtime исполняет проверенный Python из Blockly; Wiki не является исполняемым process engine. Человеческое подтверждение, доставка сообщения и сохранённый PROCESS — разные события.

Порядок решений (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_service_prestart_logic" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="prestart_Process_prestart" name="PRE_START: внешнее действие, контроль времени и начало выполнения" isExecutable="false">
    <bpmn:documentation>{"notes": ["ShariX Open; описательная BPMN, isExecutable=false.", "Immediate web intent обрабатывается до planned_start.", "У PRE_START раунда expires_at=None; лимит попыток не означает бизнес-отказ.", "Python побайтово сверён с каноническим Blockly renderer."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_prestart.py", "repository": "sharix-open-handlers-examples", "sha256": "1c799d0642143898813d478c5575451bf633e49043e0724e9a28040090b8a827"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_prestart.json", "repository": "sharix-open-handlers-examples", "sha256": "69757546299d7f48e300875f7a64b9cb09383c78ddf40ebe7cc85c14fea170c5"}, {"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_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}]}</bpmn:documentation>
    <bpmn:laneSet id="prestart_Lanes_prestart">
      <bpmn:lane id="prestart_Lane_worker" name="Один проход; обычные defer освобождают worker">
        <bpmn:flowNodeRef>prestart_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_intent</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_intent_ok</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_exit</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_context</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_due</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_auto</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_planned</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_planned_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_round</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_outcome</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_actual</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_actual_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_forget</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_send</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_wait</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>prestart_defer</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="prestart_start" name="Свой статус PRE_START">
      <bpmn:outgoing>prestart_Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:serviceTask id="prestart_intent" name="Обработать один queued start / problem intent">
      <bpmn:incoming>prestart_Flow_0</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_1</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="prestart_intent_ok" name="Успех / stale?">
      <bpmn:incoming>prestart_Flow_1</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_2</bpmn:outgoing>
      <bpmn:outgoing>prestart_Flow_3</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:endEvent id="prestart_exit" name="Освободить текущую очередь">
      <bpmn:incoming>prestart_Flow_2</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="prestart_context" name="Загрузить context; reason provider_start">
      <bpmn:incoming>prestart_Flow_3</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_4</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="prestart_due" name="planned_start наступил?">
      <bpmn:incoming>prestart_Flow_4</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_5</bpmn:outgoing>
      <bpmn:outgoing>prestart_Flow_6</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:exclusiveGateway id="prestart_auto" name="AUTO_PROCESS включён?">
      <bpmn:incoming>prestart_Flow_5</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_7</bpmn:outgoing>
      <bpmn:outgoing>prestart_Flow_9</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="prestart_planned" name="start-pre-start, planned time">
      <bpmn:incoming>prestart_Flow_7</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_8</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="prestart_planned_end" name="Успех/stale: освободить; неуспех: RECHECK">
      <bpmn:incoming>prestart_Flow_8</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="prestart_round" name="Текущий winner/no_winner и лимит попыток">
      <bpmn:incoming>prestart_Flow_9</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_10</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="prestart_outcome" name="Результат проверки?">
      <bpmn:incoming>prestart_Flow_10</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_11</bpmn:outgoing>
      <bpmn:outgoing>prestart_Flow_13</bpmn:outgoing>
      <bpmn:outgoing>prestart_Flow_16</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="prestart_actual" name="start-pre-start, actual time">
      <bpmn:incoming>prestart_Flow_11</bpmn:incoming>
      <bpmn:incoming>prestart_Flow_17</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_12</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="prestart_actual_end" name="Успех/stale: выход; неуспех RECHECK, порог → reset">
      <bpmn:incoming>prestart_Flow_12</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="prestart_forget" name="Забыть no_winner / исчерпанный раунд">
      <bpmn:incoming>prestart_Flow_13</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_14</bpmn:outgoing>
      <bpmn:outgoing>prestart_Flow_15</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sendTask id="prestart_send" name="Отправить попытку start; проверить результат снова">
      <bpmn:incoming>prestart_Flow_15</bpmn:incoming>
      <bpmn:incoming>prestart_Flow_16</bpmn:incoming>
      <bpmn:outgoing>prestart_Flow_17</bpmn:outgoing>
      <bpmn:outgoing>prestart_Flow_18</bpmn:outgoing>
    </bpmn:sendTask>
    <bpmn:endEvent id="prestart_wait" name="Иной исход: NOTIFICATION_INTERVAL">
      <bpmn:incoming>prestart_Flow_18</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:endEvent id="prestart_defer" name="До даты / после исчерпания: RECHECK">
      <bpmn:incoming>prestart_Flow_6</bpmn:incoming>
      <bpmn:incoming>prestart_Flow_14</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="prestart_Flow_0" sourceRef="prestart_start" targetRef="prestart_intent" name="" />
    <bpmn:sequenceFlow id="prestart_Flow_1" sourceRef="prestart_intent" targetRef="prestart_intent_ok" name="" />
    <bpmn:sequenceFlow id="prestart_Flow_2" sourceRef="prestart_intent_ok" targetRef="prestart_exit" name="Да" />
    <bpmn:sequenceFlow id="prestart_Flow_3" sourceRef="prestart_intent_ok" targetRef="prestart_context" name="Нет" />
    <bpmn:sequenceFlow id="prestart_Flow_4" sourceRef="prestart_context" targetRef="prestart_due" name="" />
    <bpmn:sequenceFlow id="prestart_Flow_5" sourceRef="prestart_due" targetRef="prestart_auto" name="Да" />
    <bpmn:sequenceFlow id="prestart_Flow_6" sourceRef="prestart_due" targetRef="prestart_defer" name="Нет" />
    <bpmn:sequenceFlow id="prestart_Flow_7" sourceRef="prestart_auto" targetRef="prestart_planned" name="Да" />
    <bpmn:sequenceFlow id="prestart_Flow_8" sourceRef="prestart_planned" targetRef="prestart_planned_end" name="" />
    <bpmn:sequenceFlow id="prestart_Flow_9" sourceRef="prestart_auto" targetRef="prestart_round" name="Нет" />
    <bpmn:sequenceFlow id="prestart_Flow_10" sourceRef="prestart_round" targetRef="prestart_outcome" name="" />
    <bpmn:sequenceFlow id="prestart_Flow_11" sourceRef="prestart_outcome" targetRef="prestart_actual" name="winner" />
    <bpmn:sequenceFlow id="prestart_Flow_12" sourceRef="prestart_actual" targetRef="prestart_actual_end" name="" />
    <bpmn:sequenceFlow id="prestart_Flow_13" sourceRef="prestart_outcome" targetRef="prestart_forget" name="no_winner / лимит" />
    <bpmn:sequenceFlow id="prestart_Flow_14" sourceRef="prestart_forget" targetRef="prestart_defer" name="Лимит" />
    <bpmn:sequenceFlow id="prestart_Flow_15" sourceRef="prestart_forget" targetRef="prestart_send" name="no_winner" />
    <bpmn:sequenceFlow id="prestart_Flow_16" sourceRef="prestart_outcome" targetRef="prestart_send" name="Иное" />
    <bpmn:sequenceFlow id="prestart_Flow_17" sourceRef="prestart_send" targetRef="prestart_actual" name="winner" />
    <bpmn:sequenceFlow id="prestart_Flow_18" sourceRef="prestart_send" targetRef="prestart_wait" name="Иное; no_winner сначала забыть" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_service_prestart_logic">
    <bpmn:participant id="prestart_Pool_prestart" name="PRE_START: внешнее действие, контроль времени и начало выполнения" processRef="prestart_Process_prestart" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_service_prestart_logic">
    <bpmndi:BPMNPlane id="Plane_service_prestart_logic" bpmnElement="Collaboration_service_prestart_logic">
      <bpmndi:BPMNShape id="prestart_DI_Pool_prestart" bpmnElement="prestart_Pool_prestart" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="2460" height="1150" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_Lane_worker" bpmnElement="prestart_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="2430" height="1150" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_start" bpmnElement="prestart_start">
        <dc:Bounds x="132.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_intent" bpmnElement="prestart_intent">
        <dc:Bounds x="365.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_intent_ok" bpmnElement="prestart_intent_ok">
        <dc:Bounds x="725.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_exit" bpmnElement="prestart_exit">
        <dc:Bounds x="1042.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_context" bpmnElement="prestart_context">
        <dc:Bounds x="675.0" y="305.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_due" bpmnElement="prestart_due">
        <dc:Bounds x="1035.0" y="315.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_auto" bpmnElement="prestart_auto">
        <dc:Bounds x="1345.0" y="315.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_planned" bpmnElement="prestart_planned">
        <dc:Bounds x="1605.0" y="305.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_planned_end" bpmnElement="prestart_planned_end">
        <dc:Bounds x="1972.0" y="322.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_round" bpmnElement="prestart_round">
        <dc:Bounds x="1295.0" y="545.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_outcome" bpmnElement="prestart_outcome">
        <dc:Bounds x="1655.0" y="555.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_actual" bpmnElement="prestart_actual">
        <dc:Bounds x="1915.0" y="545.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_actual_end" bpmnElement="prestart_actual_end">
        <dc:Bounds x="2282.0" y="562.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_forget" bpmnElement="prestart_forget">
        <dc:Bounds x="1605.0" y="785.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_send" bpmnElement="prestart_send">
        <dc:Bounds x="1295.0" y="1015.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_wait" bpmnElement="prestart_wait">
        <dc:Bounds x="1662.0" y="1032.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="prestart_DI_defer" bpmnElement="prestart_defer">
        <dc:Bounds x="1042.0" y="802.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_0" bpmnElement="prestart_Flow_0">
        <di:waypoint x="168.0" y="100.0" />
        <di:waypoint x="365.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_1" bpmnElement="prestart_Flow_1">
        <di:waypoint x="515.0" y="100.0" />
        <di:waypoint x="725.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_2" bpmnElement="prestart_Flow_2">
        <di:waypoint x="775.0" y="100.0" />
        <di:waypoint x="1042.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_3" bpmnElement="prestart_Flow_3">
        <di:waypoint x="750.0" y="125.0" />
        <di:waypoint x="750.0" y="305.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_4" bpmnElement="prestart_Flow_4">
        <di:waypoint x="825.0" y="340.0" />
        <di:waypoint x="1035.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_5" bpmnElement="prestart_Flow_5">
        <di:waypoint x="1085.0" y="340.0" />
        <di:waypoint x="1345.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_6" bpmnElement="prestart_Flow_6">
        <di:waypoint x="1060.0" y="365.0" />
        <di:waypoint x="1060.0" y="802.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_7" bpmnElement="prestart_Flow_7">
        <di:waypoint x="1395.0" y="340.0" />
        <di:waypoint x="1605.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_8" bpmnElement="prestart_Flow_8">
        <di:waypoint x="1755.0" y="340.0" />
        <di:waypoint x="1972.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_9" bpmnElement="prestart_Flow_9">
        <di:waypoint x="1370.0" y="365.0" />
        <di:waypoint x="1370.0" y="545.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_10" bpmnElement="prestart_Flow_10">
        <di:waypoint x="1445.0" y="580.0" />
        <di:waypoint x="1655.0" y="580.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_11" bpmnElement="prestart_Flow_11">
        <di:waypoint x="1705.0" y="580.0" />
        <di:waypoint x="1915.0" y="580.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_12" bpmnElement="prestart_Flow_12">
        <di:waypoint x="2065.0" y="580.0" />
        <di:waypoint x="2282.0" y="580.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_13" bpmnElement="prestart_Flow_13">
        <di:waypoint x="1680.0" y="605.0" />
        <di:waypoint x="1680.0" y="785.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_14" bpmnElement="prestart_Flow_14">
        <di:waypoint x="1605.0" y="820.0" />
        <di:waypoint x="1078.0" y="820.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_15" bpmnElement="prestart_Flow_15">
        <di:waypoint x="1605.0" y="820.0" />
        <di:waypoint x="1525.0" y="820.0" />
        <di:waypoint x="1525.0" y="1050.0" />
        <di:waypoint x="1445.0" y="1050.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_16" bpmnElement="prestart_Flow_16">
        <di:waypoint x="1655.0" y="580.0" />
        <di:waypoint x="1550.0" y="580.0" />
        <di:waypoint x="1550.0" y="1050.0" />
        <di:waypoint x="1445.0" y="1050.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_17" bpmnElement="prestart_Flow_17">
        <di:waypoint x="1445.0" y="1050.0" />
        <di:waypoint x="1490.0" y="1050.0" />
        <di:waypoint x="1550.0" y="1050.0" />
        <di:waypoint x="1550.0" y="510.0" />
        <di:waypoint x="1990.0" y="510.0" />
        <di:waypoint x="1990.0" y="545.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="prestart_DI_Flow_18" bpmnElement="prestart_Flow_18">
        <di:waypoint x="1445.0" y="1050.0" />
        <di:waypoint x="1662.0" y="1050.0" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

При своём статусе сначала обрабатывается один подходящий queued intent: start, force_majeure, decline или refuse. Успех/stale заканчивает проход. Обработанный неуспех позволяет продолжить обычную логику; исключение идёт в общий processing_error. Наличие intent в этой очереди зависит от маршрутизации до processing, описанной ниже.

Затем загружается scoped order context, устанавливается локальная причина provider_start и проверяется planned_start. До этой даты — RECHECK. При отсутствии/некорректной дате helper не считает срок наступившим; обычная auto/round-ветка не стартует, но ранее обработанный пользовательский start — отдельный путь.

После даты:

  • SERVICE_REQUEST_PRE_START_AUTO_PROCESS=true → narrow start с time_mode=planned; неуспех ждёт RECHECK.
  • При выключенном auto winner → narrow start с time_mode=actual; после доменного неуспеха проверяется порог action failures, при достижении раунд забывается. В любом случае неуспех ждёт RECHECK.
  • no_winner забывается, после чего можно создать новое приглашение в том же проходе.
  • При исчерпании попыток активный раунд забывается, назначается RECHECK, и проход завершается.
  • Иначе отправляется попытка start, разбираются queued intents и winner/no_winner проверяются снова. Иной результат ждёт NOTIFICATION_INTERVAL.

Забывание раунда не меняет бизнес-статус и не равняется отказу исполнителя. Автоматическая ветка не использует порог failures для изменения стадии; неуспех auto-start остаётся на повторе.

Приглашение и внешний ответ (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_service_prestart_round" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="round_Process_round" name="Приглашение начать: получатель, ответ и интервал повторной отправки" isExecutable="false">
    <bpmn:documentation>{"notes": ["ShariX Open; описательная BPMN, isExecutable=false.", "Immediate web intent обрабатывается до planned_start.", "У PRE_START раунда expires_at=None; лимит попыток не означает бизнес-отказ.", "Python побайтово сверён с каноническим Blockly renderer."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_prestart.py", "repository": "sharix-open-handlers-examples", "sha256": "1c799d0642143898813d478c5575451bf633e49043e0724e9a28040090b8a827"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_prestart.json", "repository": "sharix-open-handlers-examples", "sha256": "69757546299d7f48e300875f7a64b9cb09383c78ddf40ebe7cc85c14fea170c5"}, {"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_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}]}</bpmn:documentation>
    <bpmn:laneSet id="round_Lanes_round">
      <bpmn:lane id="round_Lane_worker" name="Stage PRE_START; один текущий provider JID">
        <bpmn:flowNodeRef>round_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_create</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_send</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_wait</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_reply</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_validate</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_timer</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>round_retry</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="round_start" name="После planned_start, auto выключен">
      <bpmn:outgoing>round_Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:serviceTask id="round_create" name="Создать раунд: strategy/delivery, attempts; без expires_at">
      <bpmn:incoming>round_Flow_0</bpmn:incoming>
      <bpmn:outgoing>round_Flow_1</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sendTask id="round_send" name="order.action.required start, active_order">
      <bpmn:incoming>round_Flow_1</bpmn:incoming>
      <bpmn:outgoing>round_Flow_2</bpmn:outgoing>
    </bpmn:sendTask>
    <bpmn:eventBasedGateway id="round_wait" name="Ответ / интервал следующей попытки">
      <bpmn:incoming>round_Flow_2</bpmn:incoming>
      <bpmn:outgoing>round_Flow_3</bpmn:outgoing>
      <bpmn:outgoing>round_Flow_6</bpmn:outgoing>
    </bpmn:eventBasedGateway>
    <bpmn:intermediateCatchEvent id="round_reply" name="Прямой XMPP / trusted relay">
      <bpmn:incoming>round_Flow_3</bpmn:incoming>
      <bpmn:outgoing>round_Flow_4</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:intermediateCatchEvent>
    <bpmn:serviceTask id="round_validate" name="Проверить actor/JID, round/order/status, действие, повтор">
      <bpmn:incoming>round_Flow_4</bpmn:incoming>
      <bpmn:outgoing>round_Flow_5</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="round_end" name="Учтённое решение → Ticket ready; действие ещё не сохранено">
      <bpmn:incoming>round_Flow_5</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:intermediateCatchEvent id="round_timer" name="NOTIFICATION_INTERVAL">
      <bpmn:incoming>round_Flow_6</bpmn:incoming>
      <bpmn:outgoing>round_Flow_7</bpmn:outgoing>
      <bpmn:timerEventDefinition>
        <bpmn:timeDuration xsi:type="bpmn:tFormalExpression">pre_start_notification_interval</bpmn:timeDuration>
      </bpmn:timerEventDefinition>
    </bpmn:intermediateCatchEvent>
    <bpmn:endEvent id="round_retry" name="Следующий проход проверяет лимит; при необходимости новый round">
      <bpmn:incoming>round_Flow_7</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="round_Flow_0" sourceRef="round_start" targetRef="round_create" name="" />
    <bpmn:sequenceFlow id="round_Flow_1" sourceRef="round_create" targetRef="round_send" name="" />
    <bpmn:sequenceFlow id="round_Flow_2" sourceRef="round_send" targetRef="round_wait" name="" />
    <bpmn:sequenceFlow id="round_Flow_3" sourceRef="round_wait" targetRef="round_reply" name="" />
    <bpmn:sequenceFlow id="round_Flow_4" sourceRef="round_reply" targetRef="round_validate" name="" />
    <bpmn:sequenceFlow id="round_Flow_5" sourceRef="round_validate" targetRef="round_end" name="" />
    <bpmn:sequenceFlow id="round_Flow_6" sourceRef="round_wait" targetRef="round_timer" name="" />
    <bpmn:sequenceFlow id="round_Flow_7" sourceRef="round_timer" targetRef="round_retry" name="" />
  </bpmn:process>
  <bpmn:process id="person_Process_person" name="Назначенный исполнитель / разрешённый web actor" isExecutable="false">
    <bpmn:documentation>{"notes": ["ShariX Open; описательная BPMN, isExecutable=false.", "Immediate web intent обрабатывается до planned_start.", "У PRE_START раунда expires_at=None; лимит попыток не означает бизнес-отказ.", "Python побайтово сверён с каноническим Blockly renderer."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_prestart.py", "repository": "sharix-open-handlers-examples", "sha256": "1c799d0642143898813d478c5575451bf633e49043e0724e9a28040090b8a827"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_prestart.json", "repository": "sharix-open-handlers-examples", "sha256": "69757546299d7f48e300875f7a64b9cb09383c78ddf40ebe7cc85c14fea170c5"}, {"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_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}]}</bpmn:documentation>
    <bpmn:laneSet id="person_Lanes_person">
      <bpmn:lane id="person_Lane_worker" name="Действие вне handler">
        <bpmn:flowNodeRef>person_notice</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>person_action</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>person_send</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>person_end</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="person_notice" name="Получить приглашение либо открыть заказ">
      <bpmn:outgoing>person_Flow_0</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:startEvent>
    <bpmn:userTask id="person_action" name="Подтвердить начало; отдельно сообщить о проблеме">
      <bpmn:incoming>person_Flow_0</bpmn:incoming>
      <bpmn:outgoing>person_Flow_1</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:sendTask id="person_send" name="XMPP response либо web intent">
      <bpmn:incoming>person_Flow_1</bpmn:incoming>
      <bpmn:outgoing>person_Flow_2</bpmn:outgoing>
    </bpmn:sendTask>
    <bpmn:endEvent id="person_end" name="HTTP 202 / response ack не равен PROCESS">
      <bpmn:incoming>person_Flow_2</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="person_Flow_0" sourceRef="person_notice" targetRef="person_action" name="" />
    <bpmn:sequenceFlow id="person_Flow_1" sourceRef="person_action" targetRef="person_send" name="" />
    <bpmn:sequenceFlow id="person_Flow_2" sourceRef="person_send" targetRef="person_end" name="" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_service_prestart_round">
    <bpmn:participant id="round_Pool_round" name="Приглашение начать: получатель, ответ и интервал повторной отправки" processRef="round_Process_round" />
    <bpmn:participant id="person_Pool_person" name="Назначенный исполнитель / разрешённый web actor" processRef="person_Process_person" />
    <bpmn:messageFlow id="Message_service_prestart_round_0" sourceRef="round_send" targetRef="person_notice" name="Send не доказывает показ окна" />
    <bpmn:messageFlow id="Message_service_prestart_round_1" sourceRef="person_send" targetRef="round_reply" name="Сохранить actor; immediate web start — отдельная ранняя ветка" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_service_prestart_round">
    <bpmndi:BPMNPlane id="Plane_service_prestart_round" bpmnElement="Collaboration_service_prestart_round">
      <bpmndi:BPMNShape id="round_DI_Pool_round" bpmnElement="round_Pool_round" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="2150" height="440" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_Lane_worker" bpmnElement="round_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="2120" height="440" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_start" bpmnElement="round_start">
        <dc:Bounds x="132.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_create" bpmnElement="round_create">
        <dc:Bounds x="365.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_send" bpmnElement="round_send">
        <dc:Bounds x="675.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_wait" bpmnElement="round_wait">
        <dc:Bounds x="1035.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_reply" bpmnElement="round_reply">
        <dc:Bounds x="1352.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_validate" bpmnElement="round_validate">
        <dc:Bounds x="1605.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_end" bpmnElement="round_end">
        <dc:Bounds x="1972.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_timer" bpmnElement="round_timer">
        <dc:Bounds x="1352.0" y="322.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="round_DI_retry" bpmnElement="round_retry">
        <dc:Bounds x="1662.0" y="322.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="round_DI_Flow_0" bpmnElement="round_Flow_0">
        <di:waypoint x="168.0" y="100.0" />
        <di:waypoint x="365.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_1" bpmnElement="round_Flow_1">
        <di:waypoint x="515.0" y="100.0" />
        <di:waypoint x="675.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_2" bpmnElement="round_Flow_2">
        <di:waypoint x="825.0" y="100.0" />
        <di:waypoint x="1035.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_3" bpmnElement="round_Flow_3">
        <di:waypoint x="1085.0" y="100.0" />
        <di:waypoint x="1352.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_4" bpmnElement="round_Flow_4">
        <di:waypoint x="1388.0" y="100.0" />
        <di:waypoint x="1605.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_5" bpmnElement="round_Flow_5">
        <di:waypoint x="1755.0" y="100.0" />
        <di:waypoint x="1972.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_6" bpmnElement="round_Flow_6">
        <di:waypoint x="1085.0" y="100.0" />
        <di:waypoint x="1218.5" y="100.0" />
        <di:waypoint x="1218.5" y="340.0" />
        <di:waypoint x="1352.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="round_DI_Flow_7" bpmnElement="round_Flow_7">
        <di:waypoint x="1388.0" y="340.0" />
        <di:waypoint x="1662.0" y="340.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="person_DI_Pool_person" bpmnElement="person_Pool_person" isHorizontal="true">
        <dc:Bounds x="0.0" y="650.0" width="1220" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="person_DI_Lane_worker" bpmnElement="person_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="650.0" width="1190" height="200" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="person_DI_notice" bpmnElement="person_notice">
        <dc:Bounds x="132.0" y="732.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="person_DI_action" bpmnElement="person_action">
        <dc:Bounds x="365.0" y="715.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="person_DI_send" bpmnElement="person_send">
        <dc:Bounds x="675.0" y="715.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="person_DI_end" bpmnElement="person_end">
        <dc:Bounds x="1042.0" y="732.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="person_DI_Flow_0" bpmnElement="person_Flow_0">
        <di:waypoint x="168.0" y="750.0" />
        <di:waypoint x="365.0" y="750.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="person_DI_Flow_1" bpmnElement="person_Flow_1">
        <di:waypoint x="515.0" y="750.0" />
        <di:waypoint x="675.0" y="750.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="person_DI_Flow_2" bpmnElement="person_Flow_2">
        <di:waypoint x="825.0" y="750.0" />
        <di:waypoint x="1042.0" y="750.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Message_service_prestart_round_0" bpmnElement="Message_service_prestart_round_0">
        <di:waypoint x="750" y="135" />
        <di:waypoint x="750" y="550" />
        <di:waypoint x="150" y="550" />
        <di:waypoint x="150" y="732" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="180" y="515" width="260" height="42" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="DI_Message_service_prestart_round_1" bpmnElement="Message_service_prestart_round_1">
        <di:waypoint x="750" y="785" />
        <di:waypoint x="2080" y="785" />
        <di:waypoint x="2080" y="30" />
        <di:waypoint x="1370" y="30" />
        <di:waypoint x="1370" y="82" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1550" y="530" width="260" height="42" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Адресат — один текущий provider с JID из backend context. Сообщение order.action.required содержит start, popup_policy=active_order, due_at=planned_start. Альтернативное действие в этом приглашении не задаётся. Значение due_at здесь информирует о плановой дате; expires_at для PRE_START раунда не задаётся.

Используются SERVICE_REQUEST_PRE_START_ROUND_STRATEGY, …DELIVERY_POLICY, …NOTIFICATION_ATTEMPTS и …NOTIFICATION_INTERVAL_SECONDS. Число попыток может быть 0: это не запрет приглашений, а отсутствие конечного лимита в RoundRegistry. При положительном лимите handler при очередной проверке может забыть исчерпанный раунд и позднее создать новый. Не следует переносить сюда OFFER_TTL из PENDING или формулу RESPONSE_WINDOW из ACCEPTED.

Таймер на схеме — срок очередного прохода/отправки, а не timeout ответа человека. Без expires_at стратегия не получает обычного timeout по дате. Попытка регистрируется до отправки; send failure может расходовать лимит, но не доказывает отказа человека. Пустой JID оставляет handler на повторе.

Входящий ответ проверяется по round/order/ticket/status, участнику JID, допустимому действию, offer при наличии и повтору. Прямой XMPP actor берётся из отправителя, web actor — только из доверенного relay. Успешный response ack не является сохранённым началом работы. Ответ делает Ticket ready для последующего прохода, где заново применяются текущие правила.

Web intent: подтверждённая граница текущей маршрутизации

До processing runtime сначала ищет раунд: явный round id либо активный раунд Ticket для trusted web relay. Если он найден, intent направляется туда и не ставится в immediate queue.

Для активного PRE_START раунда allowed_actions содержит start. Поэтому web force_majeure может получить action_mismatch и не дойти до ранней ветки process_immediate_order_intent. При отсутствии такого раунда intent попадает в очередь и может быть обработан как переход PRE_FORCEMAJEUER. Это подтверждённое расхождение доступного web действия и его доставки при активном приглашении; фактическая конфигурация сервера не запрашивалась, исправление кода этой публикацией не выполнялось.

Также web start с активным раундом становится его ответом, а без раунда — immediate пользовательским действием. Эти пути по-разному проходят временную ветку и backend action. Указание «нажал start» недостаточно для диагностики: нужно понимать, был ли активный раунд.

Backend: planned, actual и сообщение о проблеме (BPMN)

Схема BPMN

Загрузка схемы…

Исходник схемы
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_service_prestart_actions" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="actions_Process_actions" name="Разные пути к PROCESS и PRE_FORCEMAJEUER" isExecutable="false">
    <bpmn:documentation>{"notes": ["ShariX Open; описательная BPMN, isExecutable=false.", "Immediate web intent обрабатывается до planned_start.", "У PRE_START раунда expires_at=None; лимит попыток не означает бизнес-отказ.", "Python побайтово сверён с каноническим Blockly renderer.", "Narrow start action не повторяет дату planned_start; planned/actual выбирает источник фактической даты.", "Immediate start заново проверяет аутентифицированного actor через каноническое пользовательское действие."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_service_request_prestart.py", "repository": "sharix-open-handlers-examples", "sha256": "1c799d0642143898813d478c5575451bf633e49043e0724e9a28040090b8a827"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_service_request_prestart.json", "repository": "sharix-open-handlers-examples", "sha256": "69757546299d7f48e300875f7a64b9cb09383c78ddf40ebe7cc85c14fea170c5"}, {"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_execution_location.py", "repository": "sharix-open-backend", "sha256": "2fc1ad5f63e5b81a245d493c70d3de8e33c194cd3eb2316efde667b06e651ddc"}]}</bpmn:documentation>
    <bpmn:laneSet id="actions_Lanes_actions">
      <bpmn:lane id="actions_Lane_worker" name="Backend actions под scope/capabilities и блокировкой актуального заказа">
        <bpmn:flowNodeRef>actions_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_check</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_save</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_web</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_actor</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_websave</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_problem</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_force</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>actions_force_end</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="actions_start" name="start-pre-start от auto/раунда">
      <bpmn:outgoing>actions_Flow_0</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:startEvent>
    <bpmn:serviceTask id="actions_check" name="PRE_START + provider; scope/capability; resolve time_mode">
      <bpmn:incoming>actions_Flow_0</bpmn:incoming>
      <bpmn:outgoing>actions_Flow_1</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="actions_save" name="Канонический PROCESS; заполнить пустые real start/location">
      <bpmn:incoming>actions_Flow_1</bpmn:incoming>
      <bpmn:outgoing>actions_Flow_2</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="actions_end" name="При успехе handoff PROCESS">
      <bpmn:incoming>actions_Flow_2</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:startEvent id="actions_web" name="Immediate web start: apply-user-intent">
      <bpmn:outgoing>actions_Flow_3</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:startEvent>
    <bpmn:serviceTask id="actions_actor" name="Проверить active actor/JID и user_can_start; actual time">
      <bpmn:incoming>actions_Flow_3</bpmn:incoming>
      <bpmn:outgoing>actions_Flow_4</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="actions_websave" name="Канонический пользовательский старт">
      <bpmn:incoming>actions_Flow_4</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:startEvent id="actions_problem" name="Immediate force_majeure / decline / refuse">
      <bpmn:outgoing>actions_Flow_5</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:startEvent>
    <bpmn:serviceTask id="actions_force" name="move-active-to-pre-forcemajeur: активный stage + provider">
      <bpmn:incoming>actions_Flow_5</bpmn:incoming>
      <bpmn:outgoing>actions_Flow_6</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="actions_force_end" name="PRE_FORCEMAJEUER; назначение сохраняется">
      <bpmn:incoming>actions_Flow_6</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="actions_Flow_0" sourceRef="actions_start" targetRef="actions_check" name="" />
    <bpmn:sequenceFlow id="actions_Flow_1" sourceRef="actions_check" targetRef="actions_save" name="" />
    <bpmn:sequenceFlow id="actions_Flow_2" sourceRef="actions_save" targetRef="actions_end" name="" />
    <bpmn:sequenceFlow id="actions_Flow_3" sourceRef="actions_web" targetRef="actions_actor" name="" />
    <bpmn:sequenceFlow id="actions_Flow_4" sourceRef="actions_actor" targetRef="actions_websave" name="" />
    <bpmn:sequenceFlow id="actions_Flow_5" sourceRef="actions_problem" targetRef="actions_force" name="" />
    <bpmn:sequenceFlow id="actions_Flow_6" sourceRef="actions_force" targetRef="actions_force_end" name="" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_service_prestart_actions">
    <bpmn:participant id="actions_Pool_actions" name="Разные пути к PROCESS и PRE_FORCEMAJEUER" processRef="actions_Process_actions" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_service_prestart_actions">
    <bpmndi:BPMNPlane id="Plane_service_prestart_actions" bpmnElement="Collaboration_service_prestart_actions">
      <bpmndi:BPMNShape id="actions_DI_Pool_actions" bpmnElement="actions_Pool_actions" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="1220" height="800" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_Lane_worker" bpmnElement="actions_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="1190" height="800" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_start" bpmnElement="actions_start">
        <dc:Bounds x="132.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_check" bpmnElement="actions_check">
        <dc:Bounds x="365.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_save" bpmnElement="actions_save">
        <dc:Bounds x="675.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_end" bpmnElement="actions_end">
        <dc:Bounds x="1042.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_web" bpmnElement="actions_web">
        <dc:Bounds x="132.0" y="382.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_actor" bpmnElement="actions_actor">
        <dc:Bounds x="365.0" y="365.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_websave" bpmnElement="actions_websave">
        <dc:Bounds x="732.0" y="382.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_problem" bpmnElement="actions_problem">
        <dc:Bounds x="132.0" y="682.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_force" bpmnElement="actions_force">
        <dc:Bounds x="365.0" y="665.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="actions_DI_force_end" bpmnElement="actions_force_end">
        <dc:Bounds x="732.0" y="682.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="actions_DI_Flow_0" bpmnElement="actions_Flow_0">
        <di:waypoint x="168.0" y="100.0" />
        <di:waypoint x="365.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="actions_DI_Flow_1" bpmnElement="actions_Flow_1">
        <di:waypoint x="515.0" y="100.0" />
        <di:waypoint x="675.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="actions_DI_Flow_2" bpmnElement="actions_Flow_2">
        <di:waypoint x="825.0" y="100.0" />
        <di:waypoint x="1042.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="actions_DI_Flow_3" bpmnElement="actions_Flow_3">
        <di:waypoint x="168.0" y="400.0" />
        <di:waypoint x="365.0" y="400.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="actions_DI_Flow_4" bpmnElement="actions_Flow_4">
        <di:waypoint x="515.0" y="400.0" />
        <di:waypoint x="732.0" y="400.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="actions_DI_Flow_5" bpmnElement="actions_Flow_5">
        <di:waypoint x="168.0" y="700.0" />
        <di:waypoint x="365.0" y="700.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="actions_DI_Flow_6" bpmnElement="actions_Flow_6">
        <di:waypoint x="515.0" y="700.0" />
        <di:waypoint x="732.0" y="700.0" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Narrow start-pre-start требует order.start_pre_start, текущий scope, PRE_START и provider. Под lock выбирается effective time: planned берёт Orders.time_start, actual — текущее backend time. Отсутствие плановой даты даёт неуспех planned-вызова. Narrow action сам не повторяет проверку «дата уже наступила»; её делает Python.

При успешном каноническом PROCESS пустой time_start_real заполняется effective time; уже существующее фактическое начало не перезаписывается. Пустая location_start_real заполняется через resolver, если ему доступна корректная локация. Для actual-ответа runtime передаёт допустимые location-поля победителя; planned-вызов не передаёт этот action payload. Выбор planned означает запись планового времени как эффективного начала, а не доказательство фактического действия человека ровно в эту секунду.

В отличие от ACCEPTED wrapper этот start-wrapper не передаёт expected_provider_id из context. Backend поддерживает такую проверку при наличии параметра, но нельзя приписывать текущему вызову привязку к старому provider id из снимка раунда.

Immediate start использует apply-user-intent: backend заново находит active actor, сверяет JID при его передаче и вызывает каноническое пользовательское start. Оно проверяет, что actor — текущий исполнитель и заказ в PRE_START, заполняет actual time/location и меняет стадию. Отдельного ожидания planned_start в этом пользовательском lifecycle-пути нет.

Queued force_majeure/decline/refuse использует move-active-to-pre-forcemajeur: narrow capability/scope, активный PRE_START/PROCESS и наличие provider. При успехе сохраняется PRE_FORCEMAJEUER, provider этим action не очищается. Аутентификацию и доступ к web intent проверяет relay; этот путь не выполняет apply-user-intent заново и не подменяет его каноническим пользовательским start. Ограничение доставки при активном раунде описано выше.

Настройки, ожидание и восстановление

Назначение Настройка
Auto-start после planned_start SERVICE_REQUEST_PRE_START_AUTO_PROCESS
Обычный повтор / ожидание даты SERVICE_REQUEST_PRE_START_RECHECK_SECONDS
Стратегия и доставка SERVICE_REQUEST_PRE_START_ROUND_STRATEGY, SERVICE_REQUEST_PRE_START_DELIVERY_POLICY
Лимит рассылки и порог доменных неуспехов start SERVICE_REQUEST_PRE_START_NOTIFICATION_ATTEMPTS
Интервал приглашений SERVICE_REQUEST_PRE_START_NOTIFICATION_INTERVAL_SECONDS
Общая ошибка DEFERRED_TICKET_RECHECK_SECONDS, processing_error
Восстановление состава INTERVAL_TIME_BD_REQ

Счётчики send и доменных неуспехов start различны; при attempts=0 порог failures не считается достигнутым. RoundRegistry, ответы, очередь intents и счётчики — память процесса. После рестарта старое подтверждение не считается ответом на новый round id. Defer освобождает worker; внешний ответ может снять defer раньше.

Проверяйте текущий provider/status, planned_start, auto-настройку, наличие активного раунда, маршрут intent и ответ backend. Разделяйте transport 202, приём ответа, результат стратегии и сохранённый PROCESS. Auth/HTTP/transport exceptions не равны отказу исполнителя и идут в общий retry. После commit ticket.changed/ticket.moved передают владение; periodic reconciliation компенсирует потерю событий.

Проверенные источники

Источники закреплены в metadata/BPMN и повторно сверены при упаковке. Handler и бизнес-API не исполнялись. Общий автоматический hook Wiki пока не завершён.

Связанные материалы

sharixopen/knowledge/scenarios/service_request_prestart.1793221832.txt.gz · Последнее изменение: — sx_knowledge_api_open

© 2022 ShariX