Перейти к содержанию

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 вводит третье значение оси согласованности — «требуется инвариантом и технически недостижима» — и привязывает к нему три обязательства: состояние «неизвестно» существует явно, сверка с чужой системой — часть системы, а не опция, процесс разбора расхождений спроектирован заранее.

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

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

Документ при этом прямо велит «отличать это от "атомарность не нужна": там обязательств нет вовсе». На этом участке атомарность не нужна — и обязательства всё равно есть.