ADR-0005 · Встречная сверка с актами утилизаторов: ячейка aeo#
Статус: принят · 2026-09-22
Метод: D-04 v3.0 · шаблон ADR v1.2
Участники: руководитель ИТ ЦУУ, аналитик, юрист
Учебная запись: часть прогона U-02, система вымышлена. Форма и рассуждение настоящие.
Контекст#
Вход — 00-context.md. Модули — ADR-0004.
Процесс, разрезанный по границам без общей транзакции#
| Участок | Участники | Есть ли общая транзакция | Исход |
|---|---|---|---|
| Подача документа обязанным лицом | Лицо → мы | Нет — другая организация | Не сага: один шаг у каждой стороны, компенсировать нечего. Запрос-ответ |
| Загрузка → проверка → принятие → квитанция | Только Приём |
Да, одна база (ADR-0003) | Вне пространства восьми ячеек |
| Встречная сверка: заявленные объёмы ↔ акты утилизаторов | Лицо, мы, 310 утилизаторов | Нет: акт сдаёт другая организация и имеет право сдать позже | Единственный участок в пространстве |
| Начисление из принятой подачи | Приём → Расчёт, через представление |
Да, одна база | Вне пространства |
| Выгрузка витрины ведомству | Мы → ведомство | — | Отвод: один шаг, повторённый по списку. Координата определится и ничего не даст |
Отбрасывание сделало половину работы. Из пяти участков в пространство попал один; два — локальные транзакции, один — запрос-ответ, один отведён как размножение одного шага. Документ настаивает, что это не формальность, и здесь он прав: «процесс отчётности» в терминах продукта выглядит сагой целиком.
Числа участка#
| Участников | 3 типа: обязанное лицо, мы, утилизатор (310 организаций) [приказ] |
| Шагов | 4: заявление объёма → ожидание акта → сопоставление → итоговый вердикт |
| Экземпляров одновременно | До 11 760 внутри окна [расчёт] |
| Длительность экземпляра | От часов до месяцев: акт может прийти в следующем квартале [допущение] |
| Частота | 11 760 за окно, затем затухающий хвост [расчёт] |
Дисквалификаторы#
| Сочетание требований | Отвергнуто? | Почему |
|---|---|---|
| Атомарность при хореографии | Не возникло | Координация оркестровая |
| Атомарность между участниками без явного инварианта | Да, требование снято | Закон требует сверки, а не одновременности: акт разрешено сдать позже. Атомарность была бы привычкой, а не инвариантом |
| Хореография при пяти и более участниках | Не возникло | Типов участников три |
| Экземпляры есть в любой момент, а состояние — в коде | Да | Экземпляр живёт месяцами; переменной в коде он не переживёт ни одного перезапуска. Требуется явная машина состояний в intake |
| Асинхронность без идемпотентного потребителя | Да | Акт приходит той же подачей и может прийти повторно. Дедупликация по ключу «утилизатор × период × номер акта» обязательна |
Рассмотренные варианты#
Три ответа раздела 1 — перечень ячеек не копируется.
| Вопрос | Ответ | Почему |
|---|---|---|
| Нужен ли инициатору ответ до завершения процесса? | Асинхронное | Немедленную часть вердикта — форму и арифметику — лицо получает квитанцией сразу (ADR-0001); встречная часть приходит уведомлением позже |
| Обязаны ли шаги быть согласованы атомарно? | Итоговая | Инвариант требует совпадения объёмов, но не одновременности. Третье значение — «требуется и недостижима» — не наш случай: требования атомарности нет вовсе |
| Кто отвечает за завершение? | Оркестровка | Мы держим подачу, мы ждём акт, мы выносим итоговый вердикт. Ни лицо, ни утилизатор процесса целиком не видят |
Ячейка — aeo, Parallel Saga.
Решение#
aeo: асинхронное взаимодействие, итоговая согласованность, оркестровка. Дирижёр — модуль Приём.
| Что | Как |
|---|---|
| Состояние процесса | Явная машина состояний в intake: заявлено → ожидает акта → сопоставлено → подтверждено / не подтверждено |
| Срок ожидания | 90 дней от принятия подачи [приказ]; по истечении — переход в не подтверждено автоматически |
| Компенсация | Не откат: пересчёт начисления по неподтверждённому объёму и уведомление лица. Принятая подача при этом не меняется — она неизменяема |
| Идемпотентность | Дедупликация актов по ключу «утилизатор × период × номер акта» |
| Наблюдаемость | Число экземпляров по состояниям — единственная метрика, по которой видно, что процесс живой |
Состояние не подтверждено существует явно и является штатным, а не ошибкой: утилизатор мог не сдать акт по своей причине, и это не делает отчёт лица недействительным — меняется только сумма.
Обоснование#
Начали с согласованности, как велит эвристика. Из трёх координат извне приходит только она: атомарность задаётся бизнес-инвариантом. Инвариант её не требует — значит, вся атомарная половина пространства отпала до обсуждения остальных двух осей.
Оркестровка против хореографии решена не ничьёй. Участников три, и хореография формально осталась бы отлаживаемой. Но завершённость здесь кто-то обязан гарантировать: без дирижёра экземпляр, у которого акт не пришёл, не перейдёт никуда — он просто останется. Ответственность за истечение 90 дней некому отдать, кроме нас.
Асинхронность не «современна», а следует из того, что акт физически может прийти через месяц. Синхронного варианта здесь не существует.
Последствия#
Что придётся построить: машину состояний с сохранением в базе; планировщик истечения срока; дедупликацию актов; уведомление лица о смене вердикта; метрику по состояниям.
Что становится дороже. Вердикт перестаёт быть однократным событием: у подачи два вердикта — немедленный и встречный, — и оба юридически значимы. Каждый требует своей квитанции, своего срока и своего места в обещании из ADR-0001.
Отрицательное последствие. До 11 760 живых экземпляров процесса с длительностью до трёх месяцев означает, что между окнами система не простаивает — она ждёт. Утверждение из ADR-0003 о рабочем цикле в 2 % года верно для нагрузки и неверно для состояния: база почти пуста по операциям и полна по незавершённым процессам.
Чего лишаемся. Возможности сказать обязанному лицу окончательное «принято» в момент подачи. Формулировка квитанции обязана это отражать, иначе первый же спор будет о том, что означала первая квитанция.
Условия пересмотра#
- Утилизаторы стали сдавать акты до подачи отчёта лицом — порядок шагов изменился, и ожидание исчезает.
- Число типов участников выросло до пяти — оркестровка станет единственным вариантом и без выбора.
- Срок ожидания изменён приказом.
- Появился второй дирижёр — признак, что участок разрезан неверно.
Связанные ADR#
Зависит от ADR-0004 (модуль Приём — дирижёр) и ADR-0003 (состояние процесса живёт в той же базе). Уточняет ADR-0001: вердиктов два, и охват обещания обязан назвать оба.
Замечание 8 · Обязательства третьего значения нужны и при втором#
D-04 вводит третье значение оси согласованности — «требуется инвариантом и технически недостижима» — и привязывает к нему три обязательства: состояние «неизвестно» существует явно, сверка с чужой системой — часть системы, а не опция, процесс разбора расхождений спроектирован заранее.
Здесь координата вторая — итоговая согласованность, — а все три обязательства понадобились. Состояние не подтверждено пришлось сделать явным и штатным; сверка с актами и есть содержание участка; процесс разбора расхождений спроектирован до запуска.
Причина, похоже, не в значении координаты, а в том, что встречная сторона вне нашего управления. Документ связал обязательства с недостижимостью атомарности, а они, судя по этому применению, следуют из другого: из того, что завершение процесса зависит от организации, которой мы не распоряжаемся. При итоговой согласованности это ровно так же верно.
Документ при этом прямо велит «отличать это от "атомарность не нужна": там обязательств нет вовсе». На этом участке атомарность не нужна — и обязательства всё равно есть.