Представление процесса
Каждый воркфлоу, объявляющий progress, Moira показывает как представление процесса:
короткую цепочку блоков, которую новичок прочитает, не зная лежащего под ней графа. То же
представление показывает запуск этого воркфлоу: какие блоки завершены, какой активен, какие
повторялись или были пропущены, и какой маршрут запуск прошёл на самом деле. Этот раздел
объясняет словарь и то, как строится каждая картина.
Словарь
- Блок. Один этап процесса, как назвал бы его человек: «Набросать план», «Независимое
ревью плана», «Выполнить шаги плана». Массив
progress.nodesперечисляет блоки в порядке процесса; у каждого есть подпись и описание в одно предложение (content.summary). - Шаг. Одна нода графа воркфлоу: директива, которую выполняет агент, условие или выражение,
которое маршрутизирует, старт или завершение. Каждый шаг принадлежит ровно одному блоку через
progressNodeId, включая ноды маршрутизации, поэтому ничто из происходящего в запуске не выпадает из картины. - Свидетельство. То, что шаг обязан вернуть, чтобы завершиться, — его input schema. Текст
результата блока (
content.outcome) — шаблон над переменными, которые записывают его шаги, поэтому запуск показывает, к чему блок пришёл, а не только что он выполнялся. - Переход. Связь, которая уходит из блока в другой блок. У каждой есть короткая подпись из
connectionLabelsна ноде, например «план одобрен» или «ревью нашло дефекты», так что стрелка объясняет себя сама. - Цикл. Переход назад к более раннему блоку или к тому же блоку. Его подпись также называет
причину повторения и то, что его завершает (
cycle.cause,cycle.exit); представление помечает такую стрелку как возврат. - Хаб. Блок, в который ведут несколько других блоков (перепланирование или остановка). Он размещается после блоков, которые в него ведут, чтобы процесс читался слева направо, и каждое представление рисует от каждого источника в него по одной связанной в пучок линии, а источник называет его в чипе.
- Запуск. Одно выполнение воркфлоу. Движок записывает его маршрут: каждый выполненный шаг, связь, через которую он вышел, изменённые переменные и места ожидания.
Страница флоу: процесс без запуска
Процесс выводится только из определения воркфлоу: блоки из progress.nodes, принадлежность из
progressNodeId, переходы и циклы из подписанных связей. Ничто в нём не рисуется отдельно,
поэтому картина не может разойтись с графом. Валидация отвергает воркфлоу, чей процесс был бы
нечитаемым: шаг без блока (unowned-node), блок без описания (empty-description) или без
шагов (empty-block), граничная связь без подписи (unlabeled-edge), возврат без причины и
выхода (unexplained-cycle), шаблон результата на блоке, которому не принадлежит ни одна нода,
записывающая его переменную (outcome-unowned), или на двух блоках (outcome-duplicate), блок
без перехода в другой блок или из него (unconnected-block; блок, владеющий стартовой нодой,
не проверяется, а возврат в себя ничего не связывает).
moira-workflow <file> derive печатает выведенный процесс с любыми из этих диагностик, а
set-block, add-block, edit-block, set-label и clear-label редактируют его по одному
изменению за раз.
Веб-интерфейс показывает этот вывод на странице флоу (/workflows/<id>, см. руководство
«Чтение и правка флоу»): конспект, карта, дорожки и разворот блоков против их шагов, а также
технический граф нод. Владелец может править определение прямо там — блоки, подписи переходов и
циклы, принадлежность и текст шагов, реестр переменных — с диагностикой выше, показываемой по мере
ввода, и сохранением, которое отклоняется для невалидного определения или устаревшей ревизии.
Страница запуска: процесс с маршрутом
Запуск проецируется на процесс из записанного маршрута и никогда не угадывается по порядку блоков:
- active — блок последнего шага, которого запуск достиг; waiting — когда этот шаг приостановлен в ожидании ввода человека или агента;
- done — посещённый блок, чьи рабочие шаги выполнились один раз; repeated ×n — то же после n проходов через его рабочие шаги (ревью, прошедшее дважды, показывает ×2);
- skipped — блок, который запуск обошёл или в который вошёл, не выполняя его работы (выполнились только ноды маршрутизации);
- pending — ещё не достигнут.
Непосещённый блок никогда не показывается завершённым. Сам маршрут доступен как упорядоченный список с отметками циклов, у каждой переменной есть история значений, а значение, заданное извне флоу (корректировка во время запуска), показано как таковое вместе с тем, кто его задал. Курсор маршрута показывает запуск на момент любого более раннего визита, а владелец выполнения может ответить ожидающему шагу прямо со страницы; ответ проверяется как ответ агента и записывается как корректировка (см. руководство «Чтение запуска»). Запуск, записанный до появления маршрутов, показывает только свой текущий блок и сообщает, что маршрут не записан.
Как сделать воркфлоу читаемым
Называйте блоки так, как человек назвал бы этап, держите описания в одно предложение,
подписывайте каждую граничную связь решением, которое она выражает, и объясняйте каждый возврат
причиной и выходом. Предпочитайте от трёх до пятнадцати блоков; ноды маршрутизации кладите в
блок, чьё решение они маршрутизируют. Workflow Management Flow требует всего этого при создании
и редактировании воркфлоу, а session({ action: "progress" }) или
GET /api/executions/:id/progress возвращают представление запуска.