Как устроено

Условия, сроки, шаги и обратные действия — в одной исполняемой спецификации, проверяемой до выпуска.

Здесь — модель исполнения, рабочие места, сроки и версии, проверка до выпуска, откат, запись, место ИИ, граница интеграции, гарантии и безопасность. Страница отвечает на вопрос «как это устроено и что требует от ваших систем». На вопрос «зачем это нужно» отвечает главная.

Учебный пример: кофейный автомат

Автомат — простой учебный пример: четыре шага и одна кнопка. Если даже здесь ответ на «почему» приходится искать, в процессе с десятками шагов это уже расследование.

Оплатила латте 170 рублей, автомат налил чёрный кофе без молока. Я его не пью. Прошу вернуть деньги и объяснить, почему так вышло. Это уже не первый раз.

Смотрим, что записал автомат. Записано всё.

14:29:14молоко: остаток ниже порога
14:29:14режим меню: авто-замена
14:32:01оплата принята, 170 ₽, карта ****4417
14:32:04напиток: американо
14:32:06стакан выдан
14:32:31налито, 200 мл
14:32:33операция завершена успешно

Почему автомат налил американо?

Модель исполнения

Всё это задано одним описанием. Поэтому проверка до выпуска видит не только ошибки внутри таблицы, но и несогласованность на стыках правил, шагов, сроков и откатов.

сессия
Одна операция процесса: своё состояние, своя запись и своя версия правил — та, на которой операция началась.
такт
Один цикл исполнения: процесс возобновляется, вычисляет правила по текущим данным и выбирает следующий шаг из допустимых, а не идёт по заранее нарисованному маршруту.
контракт данных
Всё, с чем работает процесс, объявлено типами: состояние, факты, поручения наружу. Чего нет в контракте, того для процесса не существует.
таблицы решений
Решение раскладывается на читаемые ступени, и таблицы ссылаются друг на друга: сложная цена — несколько коротких таблиц, а не функция на сотни строк. Условие правила — фраза, а не код, и его можно разобрать формально.
логика шагов
Где нужны вычисления, их пишут рядом с правилами, под теми же контрактами. Перед исполнением шаг ещё может остановить предохранитель: «по правилам можно, но сейчас нельзя».
цели
Цели заявлены, и каждый шаг объявляет, что ему нужно и что он обеспечит. «Завершена» и «достигла цели» — два разных ответа об одной операции.
стратегия выбора
Кто решает, что делать дальше: встроенный алгоритм по близости к целям, своя стратегия или внешний решатель, в том числе языковая модель.
поручения
То, что процесс поручает вашей стороне. У каждого поручения есть срок и правила повтора, а ответ связывается с процессом. Вид поручения, которого процесс не объявил, наружу не отправляется — на любой глубине вложенности.
ожидания
Процесс ждёт ответа, события или срока и называет, чего именно ждёт. Команды извне принимаются и во время ожидания.
сроки и пределы
Сроки относительные — «через три дня», и отсчитывает их сам ВЕРДИКТ. Сколько раз шаг может сработать и сколько может ждать цель, задано явно; исчерпанный предел назван в записи.
обратные действия
У шага, который просто так не отменить, есть обратное действие со своим деловым именем. Откат — часть процесса со своими пределами и повторами, а его результат проверяется правилами.
окончание
Процесс не зависает молча: он либо идёт дальше, либо заканчивается одним из двенадцати названных окончаний. Если за операцией остался непогашенный долг, ответ называет и долг, и его срок.

Три рабочих места и одно описание

Конструкторская

Здесь описывают правила, условия, контракты данных и шаги, отлаживают процесс, проверяют его до выпуска и собирают версию. Набор проверочных случаев прогоняется сразу на двух версиях: видно, какие случаи дали другой результат, в какой таблице и с какими значениями. Ни один прогон здесь не выполняется «понарошку»: он идёт тем же путём, что и настоящая работа. У описания есть история правок: к любой точке можно вернуться, а любые две редакции — сравнить деловым языком.

Диспетчерская

Рабочее место владельца процесса и аудитора: то же описание тем же способом, но без права его менять. Здесь читают процесс целиком, загружают выпущенную версию и переключают действующую, открывают запись любой операции на её версии и могут спросить правила, что бы они решили на данных этого случая.

Операторская

Управление доступом: люди входят через поставщика удостоверений по стандарту OpenID Connect — встроенного или вашего корпоративного, и учётных записей людей ВЕРДИКТ не хранит. Доступ выдаётся по группе, по домену почты, конкретному человеку или по почте того, кто ещё ни разу не входил. Роли — четыре базовые, свои объявляются конфигурацией. Интеграция получает собственную личность, а не чужой пароль: сервисный аккаунт с меткой, сроком действия и доступом.

Автор и аудитор смотрят на одно и то же описание — разница только в праве его менять.

Обязательство не теряется по дороге

Срок — поле процесса, а не пункт регламента.

Когда срок наступает, правила процесса определяют, что делать: напомнить, эскалировать или отменить. Само действие выполняет ваша сторона, как и любое другое поручение.

Для каждого шага задан предел попыток, для каждой цели — срок.

Остановка операции — не догадка, а исчерпанный предел, и в записи он назван.

Повторная попытка — с растущим интервалом.

Внешнюю систему, которая отвечает через раз, процесс не нагружает повторами подряд: он ждёт дольше и обращается снова.

Пока процесс ждёт, он принимает команды извне.

«Клиент доплатил», «партия отгружена» — объявленные в процессе команды. Они принимаются во время ожидания и сразу меняют состояние.

Пределы внутри процесса

У каждого шага свой предел числа попыток, и видно, сколько из него израсходовано.Открыть кадр целиком
У каждого шага свой предел числа попыток, и видно, сколько из него израсходовано.

Всё это — части описания процесса, а не напоминания в задачах и не мониторинг по факту просрочки.

Условие меняют без разработчика

Таблица условий: что можно налить

Условие, действие и основание решения — в одной строке таблицы. Её содержимое меняют без разработчика.Открыть кадр целиком
Условие, действие и основание решения — в одной строке таблицы. Её содержимое меняют без разработчика.

Заменить «предложить замену» на «отказать и вернуть деньги» — это одна строка таблицы. Не заявка в очередь разработки и не выкатка прикладного кода, а новая версия процесса: проверка до выпуска, выпуск, включение.

Операции, которые уже идут, доходят до конца на той версии, на которой начались. Выпущенная версия начинает работать, только когда её включат.

Каждое сохранение остаётся в истории — с автором и временем. Любые две редакции сравниваются деловым языком: «порог суммы заказа был 10 000, стал 20 000». Если правка контракта данных ломает совместимость, так и сказано.

Порог, строку таблицы и деловые имена меняют без разработчика. Новый шаг или новое поле контракта — по-прежнему работа разработчика.

Версии одного правила

Спор о мартовском случае разбирается по мартовской версии правил: запись операции открывается на той версии, на которой она шла.Открыть кадр целиком
Спор о мартовском случае разбирается по мартовской версии правил: запись операции открывается на той версии, на которой она шла.

Проверка до выпуска: что именно находится

Прогон набора случаев показывает, что изменится. Остальные проверки разбирают само описание — это десятки видов находок в правилах, шагах, сроках и на стыках между ними, и случаи для них не нужны.

набор случаев
Прогоняется сразу на двух версиях — прежней и новой: видно, какие случаи дали другой результат, в какой таблице и с какими значениями. Это проверка замысла, а не описания.
противоречие
Два правила, которые при одних и тех же входных данных требуют разного.
пробел
Входные значения, при которых не срабатывает ни одно правило.
недостижимое и лишнее
Цели, которых нельзя достичь, и шаги, которые ничего не меняют.
находка на стыке
Несогласованность между правилами, шагами, сроками и откатами: срок, который никто не обрабатывает; шаг обещает результат, а его логика не пишет ни одного поля, от которого тот зависит; откат, который ничего не отменяет; объявленное поручение без обработчика.
охват
Отчёт называет свой охват первой строкой, до перечня находок. Проверка отвечает на объявленный набор вопросов, а догадка в отчёте помечена как догадка.
чего не обещает
Найти все ошибки. Отсутствие находок не доказывает, что ошибок нет.
решение при выпуске
Новая находка при выпуске из Конструкторской не проходит молча: выпустить версию можно только явным решением, «так задумано» — с обязательной причиной, и признанный долг остаётся на виду.
Как это выглядит на экране

Исход отката назван, включая тот, при котором он не доехал

Запись отмены: откат целиком

Откат — часть процесса: что отменено и чем это закончилось, видно в записи.Открыть кадр целиком
Откат — часть процесса: что отменено и чем это закончилось, видно в записи.

У каждого обратного действия своё деловое имя. Удержать, списать частично, снять удержание, вернуть — четыре разных обязательства перед клиентом, и в записи они названы четырьмя разными словами.

Одинаковые записи вида «фиксируем оплату» не позволяют установить, что именно произошло.

Результат обратного действия проверяется правилами, а не берётся на веру.

Откат может и не дойти до конца — тогда он заканчивается одним из четырёх объявленных исходов, например «исчерпаны попытки» или «требуется человек». Какой именно — видно в записи.

Операция может закончиться раньше своего отката: решение принято, а возвраты и снятия удержаний идут дальше, каждый в свой срок.

«А сейчас правило отработает так же?»

Спорный случай можно проверить заново. С экрана операции открывается песочница, уже заполненная её данными, и считает по правилам той версии, на которой операция шла. Автор процесса может и запустить случай заново на тех же данных — из Конструкторской.

Запись одной операции целиком

Одна операция от старта до исхода

Основание сбоя, перечень отменённого и итог операции — на одном экране, без выгрузки данных.Открыть кадр целиком
Основание сбоя, перечень отменённого и итог операции — на одном экране, без выгрузки данных.

Аудит — не журнал сообщений, а доказательство решения. По записи восстанавливается ход дела: какой шаг выполнился, какое поручение ушло наружу, какой срок был взведён и какое поле состояния изменилось — со старым и новым значением. Там же само решение: какие шаги были допустимы, у недопустимых — какие условия не сошлись, по правилам какой версии и каким из двенадцати окончаний всё закончилось.

Запись шага, который завершился ошибкой, несёт саму ошибку, а не пустоту. Два одинаковых прогона дают одинаковые последовательности — вплоть до идентификаторов.

«Завершена» и «достигла цели» — два разных ответа: операция может дойти до конца и не сделать того, ради чего выполнялась.

Операция, начатая на прежней сборке, доходит до конца на ней целиком, даже если новая уже принимает работу. Выкатка идущие процессы не трогает.

Если человек потребует разъяснить, как принято касающееся его решение, — по закону о персональных данных такое право у него есть, и ответить надо в тридцать дней, — ответ берётся из записи операции, а не из расследования по журналам.

Если выбор отдан модели, полномочия остаются за правилами

Пусть замену подбирает языковая модель. Ночью она решает, что раз молока нет, а клиент постоянный, следует налить двойной эспрессо и денег не брать. Правило «не брать денег» никто не заводил: модель сформулировала его сама.

Предложить такое модель может: ни устройство системы, ни промпт этому не помешают. Но своих полномочий она не определяет — что сейчас уместно, считают правила ещё до обращения к ней.

Сама модель при этом необязательна. Выбор следующего шага — отдельная стратегия, и встроенная обходится без модели; передать выбор внешнему решателю можно, но процесс к этому не обязывает.

Запрос к модели и ответ на него

Границу полномочий задаёт не модель: перечень уместного считают правила до обращения к ней. В записи остаются и этот перечень, и ответ модели.Открыть кадр целиком
Границу полномочий задаёт не модель: перечень уместного считают правила до обращения к ней. В записи остаются и этот перечень, и ответ модели.

ИИ может участвовать в выборе следующего шага, но своих полномочий не определяет. Перечень уместного считают правила до обращения к модели и передают ей как входные данные, а не как рекомендацию.

Сам шаг выполняется только при сошедшихся условиях — это единственная проверка, которую выбор не может отменить, кем бы он ни был сделан. Ответ, для которого условия не сошлись, записывается вместе с причиной отказа и не выполняется.

И обратиться к модели процесс может лишь тем вызовом, который в нём объявлен заранее. Молчание решателя ограничено объявленным сроком и кончается названным исходом, а не ожиданием без конца.

Запись держит и допустимый набор, и выбор: какие шаги правила сочли допустимыми, у каждого недопустимого — какие условия не сошлись, что выбрала стратегия и как она называется. Ответ модели приходит событием и тоже записывается.

Предсказуемой становится не модель, а граница её полномочий.

Помощника, который пишет процесс за автора, в ВЕРДИКТЕ нет. Зато весь путь автора доступен через один программный интерфейс, описание принимается только в проверенной форме, а проверка до выпуска одинаково строга к любому описанию — кто бы его ни составил.

Граница интеграции

Операцию запускает ваша система, и предметная область остаётся за ней. ВЕРДИКТ вычисляет, что делать дальше, хранит состояние процесса и отправляет поручение на ваш адрес. Адреса задаёте вы — один на всё или по одному на вид поручения, — и ВЕРДИКТ обращается только к ним. Вид поручения, которого процесс не объявил, наружу не отправляется.

Обработчик выполняет поручение сам — своими доступами и своими вызовами к вашим сервисам.

Сроки отсчитывает сам ВЕРДИКТ: чтобы процесс возобновился по сроку, вашему планировщику делать нечего. Отсчёт идёт по объявленным часам такта, поэтому повтор после сбоя выводит ту же задержку.

Срок несёт каждое поручение наружу. Поручение без срока не проходит разбор процесса: отказ называет поле и причину, а не подставляет ноль. Верхние пределы есть и у операции целиком, и у отката. Владелец установки может ограничить сроки чужих процессов сверху: превышение отклоняется при выпуске, в тексте отказа названы оба значения, а объявленный срок молча не укорачивается.

Внешний сервис отвечает вашей системе, а не ВЕРДИКТУ. Ваша система берёт из ответа то, что нужно для следующего решения, и возвращает это в заранее оговорённом виде. Где провести эту границу, решает она.

Вся граница с внешним миром

Ни одного адреса ваших сервисов, и при этом вся граница видна: что поручено, что отвечено, что поступило извне.Открыть кадр целиком

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

Ни одного адреса ваших сервисов, и при этом вся граница видна: что поручено, что отвечено, что поступило извне.

Базовый интерфейс интеграции

POST/api/v1/sessionsзапустить процесс
GET/api/v1/sessions/{id}состояние процесса
POST/api/v1/sessions/{id}/callbackответ на поручение
POST/api/v1/sessions/{id}/commandсообщение извне в процесс
POST/api/v1/sessions/{id}/abortзавершить процесс

Поручение приходит вашему обработчику в одной и той же форме:

что выполнитьРезервируем ингредиенты
куда и чем отчитатьсяадрес ответа и подписанный токен

Внешняя система о ВЕРДИКТЕ ничего не знает. Её вызывают её собственным интерфейсом, и отвечает она туда же, куда отвечала всегда.

Что знать автору обработчика о повторах

Одно и то же поручение может прийти к вашей системе повторно — например, если действие выполнено, а ответ потерялся. Каждая доставка несёт один и тот же ключ dedupe_key. Однократность действия во внешней системе обеспечивает ваша система: по этому ключу она не повторяет уже выполненное действие.

двенадцатьобъявленных окончаний сессии

Предел размера одного запроса и потолок сроков чужих процессов настраивает владелец установки.

Ваша система

ORD-14-32-04заказ
Нажали
Латте 170 ₽
Налито
Американо 200 мл
Списано
120 ₽
Чек
ФД-2233
Статус
ГОТОВО
Запись процесса837ee582…1ea23
  • Почему налили не то, что нажали?
  • Кто разрешил замену?
  • Почему списали 120 ₽, а удержали 170 ₽?

Карточка не отвечает ни на один. Нижняя строка — всё, что добавляет интеграция.

ВЕРДИКТ

Запись 837ee582…1ea23ваш номер ORD-14-32-04

26 фаз · 2 цели закрыты · 2 команды извне

Что на них отвечает запись

В той же записи и попутное: заявка на пополнение RPL-3204 и закрытый резерв RSV-3204.

Ни одной строки этой записи вы не программировали.

В вашей карточке лежит только ключ записи. Сама запись — в ВЕРДИКТЕ, и по любой операции она одинаково полная.

Гарантии

На что можно положиться в любой операции.

  • Операция приходит к концу: она либо идёт дальше, либо заканчивается названным исходом, и всегда видно, чего она ждёт. Если за законченной операцией остался долг, ответ называет и долг, и его срок.
  • У каждого поручения наружу есть срок, и следит за ним сам ВЕРДИКТ. Описание, где у поручения нет срока, разбор не пройдёт.
  • Обновление не трогает операции, которые уже идут: они завершаются на прежней версии, а новые начинаются на новой.
  • По записи восстанавливается ход любого дела: какой шаг выполнился, что было поручено, какие сроки назначены и что изменилось — со старым и новым значением. Запись шага с ошибкой несёт саму ошибку.
  • Ошибка не выдаёт себя за успех: если обязательное значение пропущено или испорчено, процесс останавливается и называет ошибку. Значений по умолчанию он не подставляет, а явный ноль считает настоящим значением.

Чего ВЕРДИКТ не делает

  • Не решает за вас, каким должен быть процесс: плохо описанный процесс будет исполнен ровно так, как описан, — и запись это покажет.
  • Не заменяет ваши прикладные системы: держит логику процесса, а не платёжный шлюз, CRM или хранилище.
  • Не выполняет действий во внешнем мире сам: их выполняют ваши системы по поручениям ВЕРДИКТА, своими доступами. Подключение обработчиков к вашим сервисам — работа на вашей стороне.
  • Не гарантирует однократности действия во внешней системе: повторная доставка приходит с тем же ключом, и не повторять действие по нему — задача вашей системы.
  • Не обещает, что проверка до выпуска найдёт все ошибки: она отвечает на объявленный набор вопросов и называет свой охват первой строкой отчёта.
  • Не запрещает выпуск версии с находками проверки, но и молча его не пропускает: нужно явное решение, а «так задумано» — с причиной.
  • Не даёт ручного перезапуска отката: откат, который не дошёл до конца, заканчивается названным исходом.
  • Не толкует смысл ваших данных: запись восстанавливает ход дела, а не деловой смысл значений.
  • Не ведёт учётные записи людей и парольную политику: они живут у поставщика удостоверений. Встроенный поставщик — для пилота; срок действия пароля, блокировка после неудачных попыток и второй фактор — забота корпоративного каталога, который подключается вместо него.
  • Не удерживает языковую модель: предложить она может что угодно. Работает другое — допустимое считают правила, а шаг выполняется только при сошедшихся условиях.

Про данные

Решения принимаются по тем данным, которые вы передаёте, и ВЕРДИКТ работает ровно с ними. Поле, не участвующее ни в одном правиле, передавать не нужно: не решаете по почте клиента — не передавайте её, и в записи её не будет.

Смысл ваших данных остаётся на вашей стороне — мы в него не заходим. Запись отвечает на другой вопрос: как шло дело. Какое правило сработало, какие не подошли и по какому условию, какая версия правил действовала.

Кто может открывать разбор операций, решаете вы.

Для безопасности и эксплуатации

Ставится у вас. Во время работы ВЕРДИКТ обращается наружу только туда, куда укажете вы: поручения — на ваши адреса, записи аудита — в вашу систему, описание процесса — в ваш git-репозиторий и только по явному действию.

Готовых секретов в поставке нет — они создаются при установке. Сертификат входа выпускается внутри установки, без внешних центров сертификации.

Снаружи открыт один порт; служебные интерфейсы наружу не открыты.

Доступ — по ролям: четыре базовые, свои объявляются конфигурацией. Выдавать и отзывать доступ может только владелец.

Отправка описаний процессов за пределы установки — выгрузка в репозиторий, загрузка оттуда, настройка адреса — отдельное право. Ни одна роль не получает его по наследству: его выдают явно.

Каждая выдача и отзыв доступа записываются в журнал вместе с тем, кто действовал.

Подмена описания процесса обнаруживается при каждой загрузке: контрольная сумма сверяется, и при расхождении загрузка отказывает.

Обновление без простоя: новая версия поднимается рядом, начатые операции доходят на прежней. Резервное копирование и восстановление — в инструментах оператора.

Материалы и следующий шаг

Обе презентации можно переслать внутри компании без устного сопровождения.

Продукт готов к промышленной эксплуатации. Берём ваш процесс и доводим его до работы: разбор, описание, проверка до выпуска, установка в вашем контуре и передача управления вашим людям.

hq@verdikt-app.ru