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

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


sharixopen:knowledge:scenarios:st_request_wontfix

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


ST_REQUEST в WONTFIX: отрицательный результат и решение о закрытии

Область: ShariX Open. Обработчик: open_st_request_wontfix, тип ST_REQUEST (1), рабочий статус WONTFIX (149). Опубликованный встроенный Python на 28.10.2026 побайтово сверен с канонической генерацией из Blockly workspace. Выбор локальной версии и работоспособность конкретного runtime не выводятся из одной этой страницы.

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

Для обычной заявки WONTFIX фиксирует решение «не будет исправлено» и ожидает отдельного решения о закрытии. Сам обработчик не выбирает основание отказа, не добавляет объяснение в карточку и не закрывает такую заявку по таймеру. STREQ_AUTOACCEPT здесь не используется.

Для document-verification-v1 и requirement-check-v1 применяется профильное завершение: backend фиксирует отрицательный результат, пересчитывает потребителей, runtime отправляет итоговое уведомление и запрашивает CLOSED. Это завершение конкретной проверки. Оно не означает глобальное удаление документов, отзыв всех прежних подтверждений или деактивацию связанных объектов.

Оба BPMN-процесса имеют isExecutable=false. Это описание реализации, а не исполняемый workflow Wiki. Runtime выполняет выбранный проверенный Python из Blockly. End event завершает показанную операцию, а не утверждает успех всего продукта.

Один проход, ожидание и закрытие (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_st_wontfix_logic" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="wontfix_Process_wontfix" name="open_st_request_wontfix: проход Python, закрытие или ожидание" isExecutable="false">
    <bpmn:documentation>{"notes": ["Только опубликованный Git built-in. Никакой код обработчика при генерации не исполняется.", "End event — конец показанной операции; процесс isExecutable=false.", "deferred_until — символ срока в локальной памяти runtime."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_wontfix.py", "repository": "sharix-open-handlers-examples", "sha256": "ece9fb7e09ee0e401e91d5d274d6b151b51d1364ba698b835c929e6416f90f03"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_wontfix.json", "repository": "sharix-open-handlers-examples", "sha256": "7958fd121808a70fa27191b81222906f326d5ec8b5a2653f88436c7b19a08d6a"}, {"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": "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": "services/verification_results.py", "repository": "sharix-open-tickets", "sha256": "682c5f6869373e649d6d62f44e63e8fb3bb34cf6bfc85d0187b26b2c96984e91"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/st_request_contracts.py", "repository": "sharix-open-tickets", "sha256": "9c1553437dbff63c608504ee000fa67a9be6e9887b1df0599552aa4d9141276c"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_workflow.py", "repository": "sharix-open-backend", "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/document_verification.py", "repository": "sharix-open-backend", "sha256": "1692ec40fb8503368a38e154dc4c53644c25a825efc91a87b34bde8065b387bb"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_responsibility.py", "repository": "sharix-open-backend", "sha256": "7919b83c89cb4214545ea2c2db0cffac09af892b190ce3af72348d688abb9cf4"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_algorithms.py", "repository": "sharix-open-backend", "sha256": "9e55e4119051847bb3596c3563b9b151ee92b660e89c39c533b16ed6b4a2099e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_checks.py", "repository": "sharix-open-backend", "sha256": "5a73a6e71307e734f0c0e480fd14a825a7a22242811e2523b7f25157224cf34c"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/activation.py", "repository": "sharix-open-backend", "sha256": "f78d4e219a5b83c7952bd366a4e7a711589b1d382af653a0c453c0524e4220f7"}]}</bpmn:documentation>
    <bpmn:laneSet id="wontfix_Lanes_wontfix">
      <bpmn:lane id="wontfix_Lane_worker" name="Worker">
        <bpmn:flowNodeRef>wontfix_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_status</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_special</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_complete</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_notify</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_close</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_confirmed</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_remove</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_stale</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_stale_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_manual</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_missing</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_complete_error</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_completion_retry</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_notify_error</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_close_error</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_generic</bpmn:flowNodeRef>
      </bpmn:lane>
      <bpmn:lane id="wontfix_Lane_queue" name="Планировщик: defer без занятого worker">
        <bpmn:flowNodeRef>wontfix_wait</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_timer</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_revision</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>wontfix_ready</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="wontfix_start" name="Ticket готов к проходу">
      <bpmn:outgoing>wontfix_Flow_0</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:exclusiveGateway id="wontfix_status" name="Статус WONTFIX?">
      <bpmn:incoming>wontfix_Flow_0</bpmn:incoming>
      <bpmn:incoming>wontfix_Flow_22</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_1</bpmn:outgoing>
      <bpmn:outgoing>wontfix_Flow_2</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:exclusiveGateway id="wontfix_special" name="Контракт проверки?">
      <bpmn:incoming>wontfix_Flow_1</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_4</bpmn:outgoing>
      <bpmn:outgoing>wontfix_Flow_5</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="wontfix_complete" name="Scoped verification API: complete">
      <bpmn:documentation>Доменный результат + marker completed + consumer_evaluations. Разбор — на отдельной схеме.</bpmn:documentation>
      <bpmn:incoming>wontfix_Flow_4</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_6</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sendTask id="wontfix_notify" name="Уведомить автора, сохранить ack ключа">
      <bpmn:incoming>wontfix_Flow_6</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_7</bpmn:outgoing>
    </bpmn:sendTask>
    <bpmn:serviceTask id="wontfix_close" name="Scoped Ticket API: CLOSED">
      <bpmn:documentation>В текущем runtime после успешного ответа complete. Не требует consumer_evaluations=all ok.</bpmn:documentation>
      <bpmn:incoming>wontfix_Flow_7</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_8</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="wontfix_confirmed" name="Переход подтверждён?">
      <bpmn:incoming>wontfix_Flow_8</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_9</bpmn:outgoing>
      <bpmn:outgoing>wontfix_Flow_11</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="wontfix_remove" name="Удалить локальный Ticket и комнату">
      <bpmn:incoming>wontfix_Flow_9</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_10</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="wontfix_end" name="Этот проход завершён">
      <bpmn:incoming>wontfix_Flow_10</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="wontfix_stale" name="Удалить локальный Ticket и комнату">
      <bpmn:incoming>wontfix_Flow_2</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_3</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="wontfix_stale_end" name="Прежний владелец освобождён">
      <bpmn:incoming>wontfix_Flow_3</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="wontfix_manual" name="support_closure_decision; defer">
      <bpmn:documentation>ST_REQUEST_WONTFIX_RECHECK_SECONDS, журнал st_request_wontfix; autoaccept здесь не проверяется.</bpmn:documentation>
      <bpmn:incoming>wontfix_Flow_5</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_12</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="wontfix_missing" name="404: очистка уже запрошена">
      <bpmn:incoming>wontfix_Flow_11</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:boundaryEvent id="wontfix_complete_error" name="HTTP/JSON ошибка" attachedToRef="wontfix_complete" cancelActivity="true">
      <bpmn:outgoing>wontfix_Flow_13</bpmn:outgoing>
      <bpmn:errorEventDefinition />
    </bpmn:boundaryEvent>
    <bpmn:serviceTask id="wontfix_completion_retry" name="defer 300 с: verification_completion_error">
      <bpmn:incoming>wontfix_Flow_13</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_14</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:boundaryEvent id="wontfix_notify_error" name="Ошибка отправки" attachedToRef="wontfix_notify" cancelActivity="true">
      <bpmn:outgoing>wontfix_Flow_15</bpmn:outgoing>
      <bpmn:errorEventDefinition />
    </bpmn:boundaryEvent>
    <bpmn:boundaryEvent id="wontfix_close_error" name="Ошибка перехода" attachedToRef="wontfix_close" cancelActivity="true">
      <bpmn:outgoing>wontfix_Flow_16</bpmn:outgoing>
      <bpmn:errorEventDefinition />
    </bpmn:boundaryEvent>
    <bpmn:serviceTask id="wontfix_generic" name="Общий processing_error + defer">
      <bpmn:documentation>DEFERRED_TICKET_RECHECK_SECONDS. Завершённый backend complete не откатывается.</bpmn:documentation>
      <bpmn:incoming>wontfix_Flow_15</bpmn:incoming>
      <bpmn:incoming>wontfix_Flow_16</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_17</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:eventBasedGateway id="wontfix_wait" name="Что наступило раньше?">
      <bpmn:incoming>wontfix_Flow_12</bpmn:incoming>
      <bpmn:incoming>wontfix_Flow_14</bpmn:incoming>
      <bpmn:incoming>wontfix_Flow_17</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_18</bpmn:outgoing>
      <bpmn:outgoing>wontfix_Flow_19</bpmn:outgoing>
    </bpmn:eventBasedGateway>
    <bpmn:intermediateCatchEvent id="wontfix_timer" name="Локальный срок defer">
      <bpmn:incoming>wontfix_Flow_18</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_20</bpmn:outgoing>
      <bpmn:timerEventDefinition>
        <bpmn:timeDate xsi:type="bpmn:tFormalExpression">deferred_until</bpmn:timeDate>
      </bpmn:timerEventDefinition>
    </bpmn:intermediateCatchEvent>
    <bpmn:intermediateCatchEvent id="wontfix_revision" name="Новая ревизия Ticket">
      <bpmn:incoming>wontfix_Flow_19</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_21</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:intermediateCatchEvent>
    <bpmn:serviceTask id="wontfix_ready" name="Снять defer, вернуть Ticket в ready">
      <bpmn:documentation>При смене владельца убрать локальный снимок; при той же стадии повторить проход.</bpmn:documentation>
      <bpmn:incoming>wontfix_Flow_20</bpmn:incoming>
      <bpmn:incoming>wontfix_Flow_21</bpmn:incoming>
      <bpmn:outgoing>wontfix_Flow_22</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:sequenceFlow id="wontfix_Flow_0" sourceRef="wontfix_start" targetRef="wontfix_status" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_1" sourceRef="wontfix_status" targetRef="wontfix_special" name="Да" />
    <bpmn:sequenceFlow id="wontfix_Flow_2" sourceRef="wontfix_status" targetRef="wontfix_stale" name="Нет" />
    <bpmn:sequenceFlow id="wontfix_Flow_3" sourceRef="wontfix_stale" targetRef="wontfix_stale_end" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_4" sourceRef="wontfix_special" targetRef="wontfix_complete" name="Да" />
    <bpmn:sequenceFlow id="wontfix_Flow_5" sourceRef="wontfix_special" targetRef="wontfix_manual" name="Нет" />
    <bpmn:sequenceFlow id="wontfix_Flow_6" sourceRef="wontfix_complete" targetRef="wontfix_notify" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_7" sourceRef="wontfix_notify" targetRef="wontfix_close" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_8" sourceRef="wontfix_close" targetRef="wontfix_confirmed" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_9" sourceRef="wontfix_confirmed" targetRef="wontfix_remove" name="Да" />
    <bpmn:sequenceFlow id="wontfix_Flow_10" sourceRef="wontfix_remove" targetRef="wontfix_end" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_11" sourceRef="wontfix_confirmed" targetRef="wontfix_missing" name="Нет (404)" />
    <bpmn:sequenceFlow id="wontfix_Flow_12" sourceRef="wontfix_manual" targetRef="wontfix_wait" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_13" sourceRef="wontfix_complete_error" targetRef="wontfix_completion_retry" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_14" sourceRef="wontfix_completion_retry" targetRef="wontfix_wait" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_15" sourceRef="wontfix_notify_error" targetRef="wontfix_generic" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_16" sourceRef="wontfix_close_error" targetRef="wontfix_generic" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_17" sourceRef="wontfix_generic" targetRef="wontfix_wait" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_18" sourceRef="wontfix_wait" targetRef="wontfix_timer" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_19" sourceRef="wontfix_wait" targetRef="wontfix_revision" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_20" sourceRef="wontfix_timer" targetRef="wontfix_ready" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_21" sourceRef="wontfix_revision" targetRef="wontfix_ready" name="" />
    <bpmn:sequenceFlow id="wontfix_Flow_22" sourceRef="wontfix_ready" targetRef="wontfix_status" name="Новый проход" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_st_wontfix_logic">
    <bpmn:participant id="wontfix_Pool_wontfix" name="open_st_request_wontfix: проход Python, закрытие или ожидание" processRef="wontfix_Process_wontfix" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_st_wontfix_logic">
    <bpmndi:BPMNPlane id="Plane_st_wontfix_logic" bpmnElement="Collaboration_st_wontfix_logic">
      <bpmndi:BPMNShape id="wontfix_DI_Pool_wontfix" bpmnElement="wontfix_Pool_wontfix" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="2210" height="970" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_Lane_worker" bpmnElement="wontfix_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="2180" height="580.0" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_Lane_queue" bpmnElement="wontfix_Lane_queue" isHorizontal="true">
        <dc:Bounds x="30.0" y="580.0" width="2180" height="390.0" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_start" bpmnElement="wontfix_start">
        <dc:Bounds x="132.0" y="92.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_status" bpmnElement="wontfix_status">
        <dc:Bounds x="325.0" y="85.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_special" bpmnElement="wontfix_special">
        <dc:Bounds x="555.0" y="85.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_complete" bpmnElement="wontfix_complete">
        <dc:Bounds x="755.0" y="75.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_notify" bpmnElement="wontfix_notify">
        <dc:Bounds x="1005.0" y="75.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_close" bpmnElement="wontfix_close">
        <dc:Bounds x="1255.0" y="75.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_confirmed" bpmnElement="wontfix_confirmed">
        <dc:Bounds x="1555.0" y="85.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_remove" bpmnElement="wontfix_remove">
        <dc:Bounds x="1745.0" y="75.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_end" bpmnElement="wontfix_end">
        <dc:Bounds x="2032.0" y="92.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_stale" bpmnElement="wontfix_stale">
        <dc:Bounds x="275.0" y="265.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_stale_end" bpmnElement="wontfix_stale_end">
        <dc:Bounds x="562.0" y="282.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_manual" bpmnElement="wontfix_manual">
        <dc:Bounds x="755.0" y="265.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_missing" bpmnElement="wontfix_missing">
        <dc:Bounds x="1562.0" y="282.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_complete_error" bpmnElement="wontfix_complete_error">
        <dc:Bounds x="862.0" y="127.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_completion_retry" bpmnElement="wontfix_completion_retry">
        <dc:Bounds x="1005.0" y="445.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_notify_error" bpmnElement="wontfix_notify_error">
        <dc:Bounds x="1112.0" y="127.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_close_error" bpmnElement="wontfix_close_error">
        <dc:Bounds x="1362.0" y="127.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_generic" bpmnElement="wontfix_generic">
        <dc:Bounds x="1505.0" y="445.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_wait" bpmnElement="wontfix_wait">
        <dc:Bounds x="1055.0" y="715.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_timer" bpmnElement="wontfix_timer">
        <dc:Bounds x="1312.0" y="662.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_revision" bpmnElement="wontfix_revision">
        <dc:Bounds x="1312.0" y="852.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="wontfix_DI_ready" bpmnElement="wontfix_ready">
        <dc:Bounds x="1505.0" y="705.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_0" bpmnElement="wontfix_Flow_0">
        <di:waypoint x="168.0" y="110.0" />
        <di:waypoint x="325.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_1" bpmnElement="wontfix_Flow_1">
        <di:waypoint x="375.0" y="110.0" />
        <di:waypoint x="555.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_2" bpmnElement="wontfix_Flow_2">
        <di:waypoint x="350.0" y="135.0" />
        <di:waypoint x="350.0" y="265.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_3" bpmnElement="wontfix_Flow_3">
        <di:waypoint x="425.0" y="300.0" />
        <di:waypoint x="562.0" y="300.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_4" bpmnElement="wontfix_Flow_4">
        <di:waypoint x="605.0" y="110.0" />
        <di:waypoint x="755.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_5" bpmnElement="wontfix_Flow_5">
        <di:waypoint x="605.0" y="110.0" />
        <di:waypoint x="700.0" y="110.0" />
        <di:waypoint x="700.0" y="235.0" />
        <di:waypoint x="830.0" y="235.0" />
        <di:waypoint x="830.0" y="265.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_6" bpmnElement="wontfix_Flow_6">
        <di:waypoint x="905.0" y="110.0" />
        <di:waypoint x="1005.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_7" bpmnElement="wontfix_Flow_7">
        <di:waypoint x="1155.0" y="110.0" />
        <di:waypoint x="1255.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_8" bpmnElement="wontfix_Flow_8">
        <di:waypoint x="1405.0" y="110.0" />
        <di:waypoint x="1555.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_9" bpmnElement="wontfix_Flow_9">
        <di:waypoint x="1605.0" y="110.0" />
        <di:waypoint x="1745.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_10" bpmnElement="wontfix_Flow_10">
        <di:waypoint x="1895.0" y="110.0" />
        <di:waypoint x="2032.0" y="110.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_11" bpmnElement="wontfix_Flow_11">
        <di:waypoint x="1580.0" y="135.0" />
        <di:waypoint x="1580.0" y="282.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_12" bpmnElement="wontfix_Flow_12">
        <di:waypoint x="905.0" y="300.0" />
        <di:waypoint x="950.0" y="300.0" />
        <di:waypoint x="950.0" y="625.0" />
        <di:waypoint x="1080.0" y="625.0" />
        <di:waypoint x="1080.0" y="715.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_13" bpmnElement="wontfix_Flow_13">
        <di:waypoint x="898.0" y="145.0" />
        <di:waypoint x="940.0" y="145.0" />
        <di:waypoint x="940.0" y="400.0" />
        <di:waypoint x="1080.0" y="400.0" />
        <di:waypoint x="1080.0" y="445.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_14" bpmnElement="wontfix_Flow_14">
        <di:waypoint x="1080.0" y="515.0" />
        <di:waypoint x="1080.0" y="715.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_15" bpmnElement="wontfix_Flow_15">
        <di:waypoint x="1148.0" y="145.0" />
        <di:waypoint x="1190.0" y="145.0" />
        <di:waypoint x="1190.0" y="400.0" />
        <di:waypoint x="1580.0" y="400.0" />
        <di:waypoint x="1580.0" y="445.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_16" bpmnElement="wontfix_Flow_16">
        <di:waypoint x="1398.0" y="145.0" />
        <di:waypoint x="1440.0" y="145.0" />
        <di:waypoint x="1440.0" y="370.0" />
        <di:waypoint x="1580.0" y="370.0" />
        <di:waypoint x="1580.0" y="445.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_17" bpmnElement="wontfix_Flow_17">
        <di:waypoint x="1655.0" y="480.0" />
        <di:waypoint x="1720.0" y="480.0" />
        <di:waypoint x="1720.0" y="620.0" />
        <di:waypoint x="1080.0" y="620.0" />
        <di:waypoint x="1080.0" y="715.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_18" bpmnElement="wontfix_Flow_18">
        <di:waypoint x="1105.0" y="740.0" />
        <di:waypoint x="1208.5" y="740.0" />
        <di:waypoint x="1208.5" y="680.0" />
        <di:waypoint x="1312.0" y="680.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_19" bpmnElement="wontfix_Flow_19">
        <di:waypoint x="1105.0" y="740.0" />
        <di:waypoint x="1208.5" y="740.0" />
        <di:waypoint x="1208.5" y="870.0" />
        <di:waypoint x="1312.0" y="870.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_20" bpmnElement="wontfix_Flow_20">
        <di:waypoint x="1348.0" y="680.0" />
        <di:waypoint x="1426.5" y="680.0" />
        <di:waypoint x="1426.5" y="740.0" />
        <di:waypoint x="1505.0" y="740.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_21" bpmnElement="wontfix_Flow_21">
        <di:waypoint x="1348.0" y="870.0" />
        <di:waypoint x="1426.5" y="870.0" />
        <di:waypoint x="1426.5" y="740.0" />
        <di:waypoint x="1505.0" y="740.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="wontfix_DI_Flow_22" bpmnElement="wontfix_Flow_22">
        <di:waypoint x="1655.0" y="740.0" />
        <di:waypoint x="2140.0" y="740.0" />
        <di:waypoint x="2140.0" y="25.0" />
        <di:waypoint x="350.0" y="25.0" />
        <di:waypoint x="350.0" y="85.0" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="1850.0" y="5.0" width="180" height="26" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>
  • Снимок уже не в WONTFIX — запросить удаление Ticket из локальной очереди и удаление комнаты.
  • Обычный Ticket — записать локальную причину support_closure_decision, назначить defer по ST_REQUEST_WONTFIX_RECHECK_SECONDS и освободить worker. Причина в журнале defer — st_request_wontfix; сохранённая локальная причина остаётся support_closure_decision.
  • Профильный контракт — вызвать complete_verification_workflow. Scoped backend API требует handler identity, capability verification.workflow и доступ к данному Ticket. Успешный ответ обрабатывается отдельно от смены статуса: уведомления, журнал, затем запрос CLOSED через scoped Ticket API.

404 при переходе в CLOSED запрашивает локальную очистку как для устаревшего контекста. Ошибки отправки/перехода вне локального catch приводят к общему processing_error и DEFERRED_TICKET_RECHECK_SECONDS; уже committed доменный результат не откатывается.

Отрицательное завершение в backend (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_st_wontfix_complete" targetNamespace="urn:sharix:knowledge:handlers">
  <bpmn:process id="complete_Process_complete" name="dbsynce: complete_specialized_ticket — результат и потребители" isExecutable="false">
    <bpmn:documentation>{"notes": ["Показана ветвь первого complete для WONTFIX, а не для DONE.", "Процесс isExecutable=false. Источники закреплены по Git SHA и SHA-256.", "Отрицательная проверка не аннулирует автоматически предыдущие DocumentVersion и не отменяет чужие одобрения."], "sources": [{"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "handlers/open_st_request_wontfix.py", "repository": "sharix-open-handlers-examples", "sha256": "ece9fb7e09ee0e401e91d5d274d6b151b51d1364ba698b835c929e6416f90f03"}, {"commit": "76e0c693b628ed4a1fa34515a3f8abdff26149bb", "path": "generated_handler_blocks/open_st_request_wontfix.json", "repository": "sharix-open-handlers-examples", "sha256": "7958fd121808a70fa27191b81222906f326d5ec8b5a2653f88436c7b19a08d6a"}, {"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": "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": "services/verification_results.py", "repository": "sharix-open-tickets", "sha256": "682c5f6869373e649d6d62f44e63e8fb3bb34cf6bfc85d0187b26b2c96984e91"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/st_request_contracts.py", "repository": "sharix-open-tickets", "sha256": "9c1553437dbff63c608504ee000fa67a9be6e9887b1df0599552aa4d9141276c"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "utils.py", "repository": "sharix-open-tickets", "sha256": "a5680205c6522e1d9a74d9d267fe9ee96faf6f06436b00877fc0a93d80234bf5"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "views/ticket_detail.py", "repository": "sharix-open-tickets", "sha256": "05d344b0fba14cf895400694d4a18f486c800fef08dd1acb43ea46909b9e7e59"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "api/views/handler_workflow.py", "repository": "sharix-open-tickets", "sha256": "f97c4b467a9a30749f5c4b86b39a833c430e57aaa1f030f70030d9b5c609d368"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "signals.py", "repository": "sharix-open-tickets", "sha256": "39aad8690a2e7d35cebfb052127a8130a951cbb4eea316c4f767a0a59fc5fa7e"}, {"commit": "fd64704d7d9f01a5ec5b7b89cbc5afe5102b2c14", "path": "services/handler_wakeup.py", "repository": "sharix-open-tickets", "sha256": "c9fdc62a18301fd7c075395c697d5b1c738c77713aa71fcbb5ab097e173d98de"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "apiviews/handler_workflow.py", "repository": "sharix-open-backend", "sha256": "0f699a4e16760cbbdd09d894093c685ba69073fedf0522852cb1fdc9811636e3"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_workflow.py", "repository": "sharix-open-backend", "sha256": "9fe62f8344d7fd78e5af0ce025c82ba4f7d21759e71f518df1186a1d6a4a0644"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/document_verification.py", "repository": "sharix-open-backend", "sha256": "1692ec40fb8503368a38e154dc4c53644c25a825efc91a87b34bde8065b387bb"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_responsibility.py", "repository": "sharix-open-backend", "sha256": "7919b83c89cb4214545ea2c2db0cffac09af892b190ce3af72348d688abb9cf4"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/verification_algorithms.py", "repository": "sharix-open-backend", "sha256": "9e55e4119051847bb3596c3563b9b151ee92b660e89c39c533b16ed6b4a2099e"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/requirement_checks.py", "repository": "sharix-open-backend", "sha256": "5a73a6e71307e734f0c0e480fd14a825a7a22242811e2523b7f25157224cf34c"}, {"commit": "778a3280cee115ba0efe3fdff7b0e708b0c10093", "path": "lib/activation.py", "repository": "sharix-open-backend", "sha256": "f78d4e219a5b83c7952bd366a4e7a711589b1d382af653a0c453c0524e4220f7"}]}</bpmn:documentation>
    <bpmn:laneSet id="complete_Lanes_complete">
      <bpmn:lane id="complete_Lane_worker" name="Backend: транзакционная операция">
        <bpmn:flowNodeRef>complete_start</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_acl</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_seen</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_cached</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_cached_end</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_check_status</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_doc</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_document</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_check</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_pending</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_apply</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_existing</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_consumers</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_mark</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_response</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_check_error</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_apply_error</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_mismatch</bpmn:flowNodeRef>
        <bpmn:flowNodeRef>complete_error</bpmn:flowNodeRef>
      </bpmn:lane>
    </bpmn:laneSet>
    <bpmn:startEvent id="complete_start" name="Scoped complete для WONTFIX">
      <bpmn:outgoing>complete_Flow_0</bpmn:outgoing>
      <bpmn:messageEventDefinition />
    </bpmn:startEvent>
    <bpmn:serviceTask id="complete_acl" name="Проверить identity, capability, scope">
      <bpmn:incoming>complete_Flow_0</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_1</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="complete_seen" name="Есть marker completed?">
      <bpmn:incoming>complete_Flow_1</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_2</bpmn:outgoing>
      <bpmn:outgoing>complete_Flow_4</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="complete_cached" name="Вернуть прежние outcome/details и неack уведомление">
      <bpmn:documentation>Без повторного применения результата и пересчёта потребителей.</bpmn:documentation>
      <bpmn:incoming>complete_Flow_2</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_3</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="complete_cached_end" name="Ответ повторного вызова">
      <bpmn:incoming>complete_Flow_3</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:serviceTask id="complete_check_status" name="Проверить DONE/WONTFIX; выбрать actor">
      <bpmn:documentation>Явный actor → reviewer_user_id → assigned_to. В handler API actor не передаётся.</bpmn:documentation>
      <bpmn:incoming>complete_Flow_4</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_5</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="complete_doc" name="Проверка документа?">
      <bpmn:incoming>complete_Flow_5</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_6</bpmn:outgoing>
      <bpmn:outgoing>complete_Flow_7</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="complete_document" name="Записать отрицательный outcome и комментарий">
      <bpmn:documentation>В WONTFIX не создаётся DocumentVersion, существующая проверенная версия этим вызовом не удаляется. Ветвь не проверяет draft_revision как положительная проверка.</bpmn:documentation>
      <bpmn:incoming>complete_Flow_6</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_8</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="complete_check" name="Загрузить RequirementCheck">
      <bpmn:incoming>complete_Flow_7</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_9</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:exclusiveGateway id="complete_pending" name="Попытка PENDING?">
      <bpmn:incoming>complete_Flow_9</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_10</bpmn:outgoing>
      <bpmn:outgoing>complete_Flow_11</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:serviceTask id="complete_apply" name="Применить результат и политику баллов">
      <bpmn:documentation>passed=False: отрицательный результат не превращается в успех из-за высокого балла. Требуются допустимая попытка и обязательный ответственный.</bpmn:documentation>
      <bpmn:incoming>complete_Flow_10</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_12</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="complete_existing" name="Уже завершена: для WONTFIX допускается только FAILED">
      <bpmn:incoming>complete_Flow_11</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_13</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="complete_consumers" name="Пересчитать найденных потребителей требований">
      <bpmn:documentation>evaluate_requirements; при ok вызвать resume_approved_activation. Нет новой выдачи прав или отмены прежних отказов.</bpmn:documentation>
      <bpmn:incoming>complete_Flow_8</bpmn:incoming>
      <bpmn:incoming>complete_Flow_12</bpmn:incoming>
      <bpmn:incoming>complete_Flow_13</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_14</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:serviceTask id="complete_mark" name="Сохранить marker completed, outcome, детали">
      <bpmn:incoming>complete_Flow_14</bpmn:incoming>
      <bpmn:outgoing>complete_Flow_15</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="complete_response" name="Ответ completed + уведомление автору">
      <bpmn:incoming>complete_Flow_15</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:boundaryEvent id="complete_check_error" name="Нет попытки" attachedToRef="complete_check" cancelActivity="true">
      <bpmn:outgoing>complete_Flow_16</bpmn:outgoing>
      <bpmn:errorEventDefinition />
    </bpmn:boundaryEvent>
    <bpmn:boundaryEvent id="complete_apply_error" name="Валидация" attachedToRef="complete_apply" cancelActivity="true">
      <bpmn:outgoing>complete_Flow_17</bpmn:outgoing>
      <bpmn:errorEventDefinition />
    </bpmn:boundaryEvent>
    <bpmn:boundaryEvent id="complete_mismatch" name="Несовместимый статус" attachedToRef="complete_existing" cancelActivity="true">
      <bpmn:outgoing>complete_Flow_18</bpmn:outgoing>
      <bpmn:errorEventDefinition />
    </bpmn:boundaryEvent>
    <bpmn:endEvent id="complete_error" name="Ошибка: runtime отложит повтор">
      <bpmn:incoming>complete_Flow_16</bpmn:incoming>
      <bpmn:incoming>complete_Flow_17</bpmn:incoming>
      <bpmn:incoming>complete_Flow_18</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="complete_Flow_0" sourceRef="complete_start" targetRef="complete_acl" name="" />
    <bpmn:sequenceFlow id="complete_Flow_1" sourceRef="complete_acl" targetRef="complete_seen" name="" />
    <bpmn:sequenceFlow id="complete_Flow_2" sourceRef="complete_seen" targetRef="complete_cached" name="Да" />
    <bpmn:sequenceFlow id="complete_Flow_3" sourceRef="complete_cached" targetRef="complete_cached_end" name="" />
    <bpmn:sequenceFlow id="complete_Flow_4" sourceRef="complete_seen" targetRef="complete_check_status" name="Нет" />
    <bpmn:sequenceFlow id="complete_Flow_5" sourceRef="complete_check_status" targetRef="complete_doc" name="" />
    <bpmn:sequenceFlow id="complete_Flow_6" sourceRef="complete_doc" targetRef="complete_document" name="Да" />
    <bpmn:sequenceFlow id="complete_Flow_7" sourceRef="complete_doc" targetRef="complete_check" name="Нет" />
    <bpmn:sequenceFlow id="complete_Flow_8" sourceRef="complete_document" targetRef="complete_consumers" name="" />
    <bpmn:sequenceFlow id="complete_Flow_9" sourceRef="complete_check" targetRef="complete_pending" name="" />
    <bpmn:sequenceFlow id="complete_Flow_10" sourceRef="complete_pending" targetRef="complete_apply" name="Да" />
    <bpmn:sequenceFlow id="complete_Flow_11" sourceRef="complete_pending" targetRef="complete_existing" name="Нет" />
    <bpmn:sequenceFlow id="complete_Flow_12" sourceRef="complete_apply" targetRef="complete_consumers" name="" />
    <bpmn:sequenceFlow id="complete_Flow_13" sourceRef="complete_existing" targetRef="complete_consumers" name="" />
    <bpmn:sequenceFlow id="complete_Flow_14" sourceRef="complete_consumers" targetRef="complete_mark" name="" />
    <bpmn:sequenceFlow id="complete_Flow_15" sourceRef="complete_mark" targetRef="complete_response" name="" />
    <bpmn:sequenceFlow id="complete_Flow_16" sourceRef="complete_check_error" targetRef="complete_error" name="" />
    <bpmn:sequenceFlow id="complete_Flow_17" sourceRef="complete_apply_error" targetRef="complete_error" name="" />
    <bpmn:sequenceFlow id="complete_Flow_18" sourceRef="complete_mismatch" targetRef="complete_error" name="" />
  </bpmn:process>
  <bpmn:collaboration id="Collaboration_st_wontfix_complete">
    <bpmn:participant id="complete_Pool_complete" name="dbsynce: complete_specialized_ticket — результат и потребители" processRef="complete_Process_complete" />
  </bpmn:collaboration>
  <bpmndi:BPMNDiagram id="Diagram_st_wontfix_complete">
    <bpmndi:BPMNPlane id="Plane_st_wontfix_complete" bpmnElement="Collaboration_st_wontfix_complete">
      <bpmndi:BPMNShape id="complete_DI_Pool_complete" bpmnElement="complete_Pool_complete" isHorizontal="true">
        <dc:Bounds x="0.0" y="0.0" width="2400" height="950" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_Lane_worker" bpmnElement="complete_Lane_worker" isHorizontal="true">
        <dc:Bounds x="30.0" y="0.0" width="2370" height="950" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_start" bpmnElement="complete_start">
        <dc:Bounds x="132.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_acl" bpmnElement="complete_acl">
        <dc:Bounds x="315.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_seen" bpmnElement="complete_seen">
        <dc:Bounds x="625.0" y="75.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_cached" bpmnElement="complete_cached">
        <dc:Bounds x="855.0" y="65.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_cached_end" bpmnElement="complete_cached_end">
        <dc:Bounds x="1182.0" y="82.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_check_status" bpmnElement="complete_check_status">
        <dc:Bounds x="575.0" y="255.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_doc" bpmnElement="complete_doc">
        <dc:Bounds x="905.0" y="265.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_document" bpmnElement="complete_document">
        <dc:Bounds x="1125.0" y="255.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_check" bpmnElement="complete_check">
        <dc:Bounds x="855.0" y="455.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_pending" bpmnElement="complete_pending">
        <dc:Bounds x="1175.0" y="465.0" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_apply" bpmnElement="complete_apply">
        <dc:Bounds x="1385.0" y="455.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_existing" bpmnElement="complete_existing">
        <dc:Bounds x="1125.0" y="655.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_consumers" bpmnElement="complete_consumers">
        <dc:Bounds x="1665.0" y="255.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_mark" bpmnElement="complete_mark">
        <dc:Bounds x="1925.0" y="255.0" width="150" height="70" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_response" bpmnElement="complete_response">
        <dc:Bounds x="2222.0" y="272.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_check_error" bpmnElement="complete_check_error">
        <dc:Bounds x="962.0" y="507.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_apply_error" bpmnElement="complete_apply_error">
        <dc:Bounds x="1492.0" y="507.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_mismatch" bpmnElement="complete_mismatch">
        <dc:Bounds x="1232.0" y="707.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="complete_DI_error" bpmnElement="complete_error">
        <dc:Bounds x="1722.0" y="832.0" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="complete_DI_Flow_0" bpmnElement="complete_Flow_0">
        <di:waypoint x="168.0" y="100.0" />
        <di:waypoint x="315.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_1" bpmnElement="complete_Flow_1">
        <di:waypoint x="465.0" y="100.0" />
        <di:waypoint x="625.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_2" bpmnElement="complete_Flow_2">
        <di:waypoint x="675.0" y="100.0" />
        <di:waypoint x="855.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_3" bpmnElement="complete_Flow_3">
        <di:waypoint x="1005.0" y="100.0" />
        <di:waypoint x="1182.0" y="100.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_4" bpmnElement="complete_Flow_4">
        <di:waypoint x="650.0" y="125.0" />
        <di:waypoint x="650.0" y="255.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_5" bpmnElement="complete_Flow_5">
        <di:waypoint x="725.0" y="290.0" />
        <di:waypoint x="905.0" y="290.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_6" bpmnElement="complete_Flow_6">
        <di:waypoint x="955.0" y="290.0" />
        <di:waypoint x="1125.0" y="290.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_7" bpmnElement="complete_Flow_7">
        <di:waypoint x="930.0" y="315.0" />
        <di:waypoint x="930.0" y="455.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_8" bpmnElement="complete_Flow_8">
        <di:waypoint x="1275.0" y="290.0" />
        <di:waypoint x="1665.0" y="290.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_9" bpmnElement="complete_Flow_9">
        <di:waypoint x="1005.0" y="490.0" />
        <di:waypoint x="1175.0" y="490.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_10" bpmnElement="complete_Flow_10">
        <di:waypoint x="1225.0" y="490.0" />
        <di:waypoint x="1385.0" y="490.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_11" bpmnElement="complete_Flow_11">
        <di:waypoint x="1200.0" y="515.0" />
        <di:waypoint x="1200.0" y="655.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_12" bpmnElement="complete_Flow_12">
        <di:waypoint x="1535.0" y="490.0" />
        <di:waypoint x="1580.0" y="490.0" />
        <di:waypoint x="1660.0" y="490.0" />
        <di:waypoint x="1660.0" y="215.0" />
        <di:waypoint x="1740.0" y="215.0" />
        <di:waypoint x="1740.0" y="255.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_13" bpmnElement="complete_Flow_13">
        <di:waypoint x="1275.0" y="690.0" />
        <di:waypoint x="1320.0" y="690.0" />
        <di:waypoint x="1620.0" y="690.0" />
        <di:waypoint x="1620.0" y="215.0" />
        <di:waypoint x="1740.0" y="215.0" />
        <di:waypoint x="1740.0" y="255.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_14" bpmnElement="complete_Flow_14">
        <di:waypoint x="1815.0" y="290.0" />
        <di:waypoint x="1925.0" y="290.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_15" bpmnElement="complete_Flow_15">
        <di:waypoint x="2075.0" y="290.0" />
        <di:waypoint x="2222.0" y="290.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_16" bpmnElement="complete_Flow_16">
        <di:waypoint x="998.0" y="525.0" />
        <di:waypoint x="1040.0" y="525.0" />
        <di:waypoint x="1040.0" y="785.0" />
        <di:waypoint x="1740.0" y="785.0" />
        <di:waypoint x="1740.0" y="832.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_17" bpmnElement="complete_Flow_17">
        <di:waypoint x="1528.0" y="525.0" />
        <di:waypoint x="1570.0" y="525.0" />
        <di:waypoint x="1740.0" y="525.0" />
        <di:waypoint x="1740.0" y="832.0" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="complete_DI_Flow_18" bpmnElement="complete_Flow_18">
        <di:waypoint x="1268.0" y="725.0" />
        <di:waypoint x="1310.0" y="725.0" />
        <di:waypoint x="1310.0" y="785.0" />
        <di:waypoint x="1740.0" y="785.0" />
        <di:waypoint x="1740.0" y="832.0" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

Операция complete на dbsynce/api/handler/ticket/{ticket_id}/verification/ сначала проверяет сохранённый marker verification_runtime.completed. Если результата ещё нет, требуется DONE или WONTFIX. При WONTFIX выбирается отрицательный результат. Actor берётся из явного аргумента, иначе из существующего reviewer_user_id в metadata ручного результата, иначе из assigned_to; handler API явный actor не передаёт.

Отказ в проверке документа

Для document-verification-v1 отрицательная ветвь сохраняет outcome=failed и комментарий результата. Она не создаёт DocumentVersion, не удаляет существующую проверенную версию и не меняет её на «отрицательную версию». Проверки актуальности draft_revision, которые выполняются при положительном создании версии, в этой отрицательной ветви не запускаются.

Отказ по новой заявке не следует трактовать как автоматическое аннулирование старого проверенного документа. Если нужен отзыв прежнего подтверждения или замена документа, это отдельное доменное действие; текущий обработчик не выполняет его скрыто.

Отказ по RequirementCheck

Для requirement-check-v1 должна существовать связанная попытка. Если она PENDING, backend применяет passed=False, actor, комментарий и применимые поля баллов через доменную операцию. Проверяются связь с Ticket, допустимость завершения попытки и обязательный ответственный. Явный отрицательный результат не становится положительным из-за высокого балла.

Если попытка уже завершена, для Ticket в WONTFIX допускается только FAILED. PASSED и иные несовместимые состояния вызывают ошибку; результат не перезаписывается простым повтором handler. Отсутствующая попытка также является ошибкой. Следует сверить Ticket и фактическую попытку, а не вручную приписывать успешный complete.

Пересчёт потребителей

После отрицательного результата backend всё равно вызывает reevaluate_ticket_consumers: собирает найденных потребителей, вычисляет требования, при ok=true вызывает resume_approved_activation. Это не отмена отказа. Другие действительные подтверждения и требования могут сохраняться, поэтому итог ok не выводится только из одного WONTFIX.

Возобновление следует канонической границе ранее одобренной активации. Для ACCESS_REQUEST/NEG_REQUEST будится текущий handler; для исторического ST_REQUEST проверяется соответствующий gate. Отрицательная проверка не выдаёт новое одобрение, не обходит требования и не означает автоматическую деактивацию.

Backend сохраняет marker, outcome и consumer_evaluations, возвращает итоговое сообщение автору. Runtime после успешного ответа запрашивает CLOSED; он не требует положительного outcome или успеха всех consumer evaluations перед закрытием Ticket. Закрытие отрицательной проверки является штатным поведением.

Повтор и частично выполненная последовательность

Повторный complete при сохранённом marker возвращает прежние outcome/details и ещё не подтверждённое уведомление. Результат и consumer evaluations заново не вычисляются. Поэтому marker — граница идемпотентности этого Ticket, а не команда пересмотреть ранее сохранённое решение после переоткрытия.

Вызов backend, XMPP-уведомление и переход в CLOSED разделены. Ответ мог потеряться после сохранения результата; уведомление могло уйти без сохранения ack; CLOSED мог ещё не сохраниться. При диагностике сначала различайте и перечитывайте эти состояния. Не стирайте marker и не повторяйте отрицательное решение вслепую ради исправления транспортной ошибки.

Внешнее решение для обычной заявки

Обычный Ticket в WONTFIX остаётся на ожидании. Пользователь с доступом и правом смены статуса может выбрать CLOSED либо REOPENED согласно текущему lifecycle. Авторство само по себе не разрешает переход. Ветка autoaccept и автоматический таймер закрытия отсутствуют; очередной срок defer лишь разрешает новый проход.

После commit канонический backend направляет события смены владельца; прежний handler исключает локальный снимок по ticket.moved. При переоткрытии новый владелец — open_st_request_reopened. Отдельного open_st_request_closed в текущем каталоге нет. При потере события scoped periodic reconciliation восстанавливает состав очереди. Внешний пользовательский переход, commit и best-effort доставка XMPP разобраны также в сценарии IN_PROCESS.

Уведомления и интервалы

Итоговое уведомление получает автор через защищённый API получателей. Подтверждение ключа ack_notification сохраняется после попытки отправки; оно не доказывает прочтение человеком. Потеря ack может вызвать повтор сообщения, но не должна создавать второй доменный результат при сохранённом marker.

Ситуация Ожидание / причина
Обычная заявка ST_REQUEST_WONTFIX_RECHECK_SECONDS; support_closure_decision, журнал st_request_wontfix
Ошибка HTTP/разбора complete 300 секунд; verification_completion_error
Иное исключение отправки/перехода DEFERRED_TICKET_RECHECK_SECONDS; processing_error
Периодическая сверка INTERVAL_TIME_BD_REQ; scoped список

300 секунд — текущая константа Python. Defer находится в памяти и не занимает worker. Новая authoritative revision может снять ожидание; дубликат того же снимка — нет. После рестарта runtime заново сверяется с backend. Фактический запуск зависит также от соединения и свободного worker.

Что различать при диагностике

Проверьте контракт и выбранную версию handler, статус Ticket, состояние связанной попытки/документа, marker completed, outcome, consumer evaluations, ack и переход в CLOSED. Для обычной заявки отсутствие автоматического закрытия штатно. Для профильной — несовместимое терминальное состояние требует разбора решения, а не только исправления сетевого подключения.

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

Git SHA и SHA-256 закреплены в metadata и documentation BPMN. Изменение источников требует повторного сопоставления алгоритма и внешних контрактов.

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

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

© 2022 ShariX