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

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


sharixopen:knowledge:scenarios:st_request_wontfix

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

Назначение: Сценарий процесса. Продукт: ShariX Open.

Для кого: Разработчик · Поддержка · Рецензент и приёмщик · Нейросеть.

Темы: Обработчики → ST_REQUEST · Доступ → Требования · Обработчики → Blockly.

Область: ShariX Open. Обработчик: open_st_request_wontfix, тип ST_REQUEST (1), рабочий статус WONTFIX (149). 31.10.2026 исходники повторно получены из Git. Обе Python-копии совпали с новой канонической генерацией Blockly. Сам обработчик и его внешние действия при анализе не запускались. Выбранная версия, настройки и работоспособность конкретной установки проверяются отдельно.

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

Для обычной заявки WONTFIX:

  • фиксирует уже принятое решение «не будет исправлено»;
  • ожидает отдельного решения о закрытии;
  • не выбирает основание отказа и не добавляет объяснение в карточку;
  • не закрывает заявку по таймеру.

STREQ_AUTOACCEPT здесь не используется.

Для document-verification-v1 и requirement-check-v1 действует профильное завершение:

  1. Backend фиксирует отрицательный результат конкретной проверки.
  2. Пересчитывает связанных потребителей.
  3. Runtime отправляет итоговое уведомление.
  4. Отдельно запрашивает 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/:

  1. Прочитать marker verification_runtime.completed.
  2. Если результата ещё нет — потребовать DONE либо WONTFIX. Для WONTFIX выбрать отрицательный результат.
  3. Определить actor: явный аргумент, затем reviewer_user_id ручного результата, затем assigned_to.
  4. Применить соответствующий контракт документа либо RequirementCheck.

Handler API явный actor не передаёт. Повтор с marker имеет отдельное поведение, описанное ниже.

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

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

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

Отказ по RequirementCheck

Для requirement-check-v1:

  • связанная попытка должна существовать;
  • у PENDING применяется passed=False, actor, комментарий и применимые поля баллов через доменную операцию;
  • проверяются связь с Ticket, допустимость завершения попытки и обязательный ответственный.

Высокий балл не превращает явный отрицательный результат в положительный.

Если попытка уже завершена:

  • FAILED: совместимо с WONTFIX.
  • PASSED или иное несовместимое состояние: ошибка, прежний результат не перезаписывается.
  • Попытка отсутствует: ошибка связи.

Нужно сверить Ticket и фактическую попытку, а не считать complete успешным по самому запуску handler.

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

После отрицательного результата 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, но ответ мог потеряться;
  • уведомление отправлено, но 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.

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

При диагностике сверить:

  1. Контракт и выбранную версию handler.
  2. Статус Ticket и состояние связанной попытки/документа.
  3. Marker completed, outcome и consumer_evaluations.
  4. Ключ ack уведомления.
  5. Отдельный результат перехода CLOSED.

Для обычной заявки ожидание решения штатно. Для профильной несовместимый терминальный результат требует разбора решения, а не только сетевой проверки.

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

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

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

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

© 2022 ShariX