Зачем: собранная спека заказов стала базовой документацией сервиса, а жанр спеки-события ей мал: дата в имени врёт, целиком в контекст агента она не влезает, а трекер с резолюциями долговечным хранилищем не считается. Решение владельца — держать детальное устройство компонента связным набором живых документов (ADR 0011) и совместить переезд с проходом на вычитание (#84). Что: docs/architecture/orders/ — индекс README и файлы по частям устройства: проекция, слепок и доставка, судьба, классы расхождений, опись, мост к склейке, стартовый мир, правила кода; спека приёма переехала в ingestion.md без содержательных правок. Резы вычитания по итогам двух слепых линий: тела разделов о проводе и приёме сведены к указателям на мастер-спеку, исследование формата и ADR (порядок строк слепка — единственное правило, оставшееся на месте); замеры канонического зерна и повторы-пояснения срезаны; списки отклонённых вариантов сохранены как долговечная запись. Датированные файлы удалены, ссылки из мастер-спеки, спеки генератора, ADR 0008/0010, исследования формата и storage.md перенацелены; раздел «Структура» AGENTS.md дополнен правилом подпапки. Проверка: grep по репозиторию не находит ссылок на удалённые файлы; все относительные ссылки внутри набора разрешаются в существующие файлы; впереди холодная сверка «ни одно решение не потеряно» и приёмка #88. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Заказы бэкенда
Устройство второго источника стенда: раз в модельный день бэкенд магазина выгружает полный слепок заказов окна изменяемости, и деньги в витринах считаются по нему, а не по трекеру. Набор собран картой #69 (этап 3) и правится по мере постройки.
Статус: приёмка владельцем — тикет #88; до неё набор — черновик.
Границы уже решены мастер-спекой «Боевой реализм стенда (v2)»: поля слепка, окно K = 7 как константа мира, три статуса, приоритет классов расхождений, правило «поведение и атрибуцию считаем по трекеру, деньги — по бэкенду». Рамка, перед которой отвечает каждое решение, — «Чем меряется генератор» в спеке генератора: конструкция внутри оправдана только наблюдаемым эффектом на выходе.
Целевая картина одним взглядом
- Заказ — проекция, не порождение. Торговая половина дня-функции уже посчитала корзину, цены, купон и номер заказа; заказная половина навешивает судьбу и собирает слепок. Ни одного нового броска в торговом подпотоке — откуда берётся заказ.
- Слепок дня D — чистая функция (зерно, D): состояние заказов, рождённых в дни D−6…D, снятое на границе суток D|D+1. Отправляет его следующий прогон — ночная выгрузка бэкенда за вчера; на проводе — один JSON-документ на заказ — слепок и его доставка.
- Судьба заказа решается при рождении и обязана уложиться в окно K либо
не случиться вовсе. На выходе из окна заказ либо
paid, либоcancelled— судьба заказа. - Расхождения и опоздания — часть мира, а не грязь: два подпотока — заказная и событийная стороны; броски независимы, пересечения выходят арифметикой, приоритет классов работает по-настоящему — классы расхождений и опоздание.
- Опись хранит только то, чего движение мира не меняет: хеш байтов каждого слепка и счётчики наблюдаемых классов — что хранит опись.
- Мост к склейке: план состава владеет человеком; его непрозрачный
person_idзаказ показывает какuser_id, кликстрим остаётся анонимным — мост к склейке. - Приём — пакетный забор: одно прямое чтение Kafka в STG, два
INSERT SELECTв типизированный ODS и таблицу ошибок;ods.order_snapshotпринимает версии заказа наReplacingMergeTree(updated_at)— приём из Kafka в ODS. - Стартовый мир отправляет семь слепков (дни 0…6): у последнего прожитого дня клики есть, а заказов нет, и график выручки дозаполняется по ходу мира — заказы в стартовом мире.
Правила, обязательные для кода этапа 3, собраны в правилах кода.
Открытые решения
- Имена подпотоков сторон судьбы — при реализации; из мёртвых имён никто не бросает, переименование ничего не сдвигает (#72).
- Конкретные веса и доли — таблицы исходов, моментов, задержки опоздания, доли классов, стоимость доставки — калибровка при реализации; финальная фиксация чисел — пересборка эталонного мира, этап 7. При пересборке правки потребуют только числа, не устройство.
- Проверки приёма — разовая приёмка допущения «один запуск — одно чтение» и опыты из «Рисков и проверки» — тикет реализации приёма.
_load_idвыше ODS — вместе с устройствомdds.order(#85).- Контур проверок качества для расхождений (даг DQ,
dm.dq_summary) — остаётся в тумане карты #69; естественное место разговора — этап 4. - Каноническое чтение событий
ods.event_v— отдельный тикет #86, к механике заказов не привязан.
Родословная
Собрано тикетом #87 по резолюциям развилок карты #69: приём (#70), генератор слепков (#71), расхождения и опоздания (#72), мост к склейке (#73), место в стартовом мире (#74), брак и версии в ODS (#80), форма записи на проводе (#81). Решения о приёме — ADR 0008 и ADR 0010; контракт провода — мастер-спека, раздел 2, и исследование формата слепка. Форма набора — ADR 0011.