Все системы записывают, что произошло.
Вердикт записывает, почему не произошло остальное

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

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

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

Ошибок не стало больше. Дороже стало каждое объяснение

Процессы выстроены, записи ведутся, ответственные назначены. Доля сбоев за последние годы, скорее всего, не выросла.

Выросло другое. Разбор одного спорного случая раньше занимал час, теперь занимает дни. Те же люди, те же данные.

Этот расход никто не считает, потому что он и не выглядит расходом. Он выглядит как «Иван Петрович посмотрит».

И растёт он не от количества ошибок, а от количества шагов, условий и людей в процессе.

Четыре шага, одна кнопка. И объяснить всё равно нечем

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

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

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

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

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

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

Чем аккуратнее система, тем убедительнее неполный ответ

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

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

Проверить можно за десять минут, не спрашивая нас.

Возьмите случай, когда система что-то не пропустила или отклонила, и попробуйте ответить:

  • ?Видно ли, какое именно условие сработало и какие варианты рассматривались, чтобы объяснить эту блокировку человеку со стороны?
  • ?Видно ли значение, при котором условие не выполнилось?
  • ?Видно ли, какая версия правил действовала в тот день?

Если ответы находятся в системе, а не у людей, мы вам не нужны.

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

Процесс на выбранном такте

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

Срок на исход оплаты ещё не наступил, возврат удержанных денег отправлен и ждёт ответа.

Чего ждём, что уже стало правдой, сколько целей закрыто.

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

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

У каждого шага есть предел числа попыток, у каждой цели свой срок.

«Зависло» перестаёт быть ощущением и становится исчерпанным пределом, у которого есть имя.

Повтор идёт с растущей паузой.

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

Пока процесс ждёт, он слушает.

«Клиент доплатил», «партия отгружена» приходят как обычные сообщения и меняют состояние до следующего шага. Ждущий процесс не глухой.

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

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

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

Почему отказали именно этому, видно из записи

Решение и правило под ним

Решение, правило под ним и все рассмотренные — с условием, которое у каждого не выполнилось.Открыть кадр целиком

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

Решение, правило под ним и все рассмотренные — с условием, которое у каждого не выполнилось.

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

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

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

Что изменится, видно до того, как правило заработает

Прогон случаев до публикации

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

Собираем набор случаев и прогоняем их на новой версии правила до того, как она заработает.

Видно не «сколько процентов сломалось», а какие именно случаи разошлись и в каком поле.

Прогон случаев это половина проверки. Вторая половина не требует случаев вообще.

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

Каждое из этого обычно находят уже на живых операциях, по инциденту.

Проверка описания до выпуска

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

Самое неприятное лежит между слоями.

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

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

Шаг обещает результат, которого не производит: по описанию он закрывает условие, а его обработчик не записывает ни одного поля, от которого это условие зависит.

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

Мы смотрим на это как на один предмет, потому что это и есть один предмет.

Одна находка со свидетелем

Находка, которую не видит ни один слой по отдельности.Открыть кадр целиком
Находка, которую не видит ни один слой по отдельности.

И одно про сам отчёт.

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

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

Поэтому молчание у нас означает «не доказано», а не «всё хорошо».

Условие меняет тот, кто отвечает за процесс

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

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

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

Операции, которые шли в этот момент, доработают по тем правилам, которые действовали на их старте.

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

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

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

Сбой не оставляет полусостояний

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

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

У каждого обратного действия своё деловое имя. Девять строк «Фиксируем оплату» подряд, пока машина возвращает деньги, это разница между «прочитал» и «догадался».

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

Налив, который не успел начаться, не отменялся. Система не отменяет то, чего не было.

Одно и то же событие, пришедшее дважды, не приводит к действию дважды.

«А сейчас она ещё так делает?»

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

Модель предлагает. Правила разрешают

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

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

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

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

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

В записи каждого выбора видно, кто выбирал: правила или внешний решатель.

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

В ваши сервисы мы не ходим

Хозяин процесса — ваша система: она запускает операцию и остаётся хозяином предметной области. Вердикт считает, что делать дальше, и отправляет поручение на один адрес — ваш обработчик поручений. Адрес задаёте вы.

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

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

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

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

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

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

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

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

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завершить процесс

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

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

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

Ваша система

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.

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

Ключ записи лежит в вашей карточке. Разбор — на нашей стороне, и по любой операции он одинаково полный.

Вы уже за это платите. Просто не счётом

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

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

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

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

  • Не за переписывание процессов: они остаются как есть.
  • Не за замену систем: они остаются на месте.
  • Не за консультантов внутри вашего бизнеса: предметную область знаете вы, и мы в неё не идём.

Чего мы не делаем

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

Про данные

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

Шифрования записи на нашей стороне пока нет. Место под него в контракте зарезервировано, но говорить, что оно работает, было бы неправдой. Пока запись защищена тем же, чем защищён контур, в котором она развёрнута.

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

На экране разбора видно то, что попало в запись. Кому открыт этот экран, определяете вы.

При развёртывании в вашем контуре запись никуда не уходит.

Про ФСТЭК №117 →

Кто это делает

Георгий Бах, основатель Вердикта

Георгий Бах

Основатель Вердикта

20 лет в ИТ, 15 на руководящих позициях. Последние шесть техническим директором компании в кибербезопасности: два продукта для корпоративных клиентов, оба с нуля до продаж.

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

Один вопрос напоследок

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

Если цифра вас неприятно удивила — расскажите про этот случай. Разберём его предметно, без презентации и созвона.

hq@verdikt-app.ru

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

1На прошлой неделе что-то должно было произойти и не произошло. Вы узнали об этом из системы или от клиента?
2Возьмите спорный случай прошлого квартала. Сколько людей и сколько часов понадобилось, чтобы объяснить, почему решили именно так?
3Кто в компании может сказать, какая версия правил действовала в тот день?
4Когда правило меняют, кто видит, что изменится, до того как оно заработает?
5Сколько сейчас в ваших правилах условий, которые противоречат друг другу или до которых никогда не доходит очередь? Чем это проверить?
6Если система что-то заблокировала или программа приняла решение вместо человека, чем ограничен набор разрешённых действий и где записано, почему выбрали именно это?

Если на четыре из шести ответ «зависит от конкретного человека», значит тот самый растущий расход у вас есть.