docs(orders): устройство заказов переехало в живой набор architecture/orders
Зачем: собранная спека заказов стала базовой документацией сервиса, а жанр спеки-события ей мал: дата в имени врёт, целиком в контекст агента она не влезает, а трекер с резолюциями долговечным хранилищем не считается. Решение владельца — держать детальное устройство компонента связным набором живых документов (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>
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# Заказы бэкенда
|
||||
|
||||
Устройство второго источника стенда: раз в модельный день бэкенд магазина
|
||||
выгружает полный слепок заказов окна изменяемости, и деньги в витринах
|
||||
считаются по нему, а не по трекеру. Набор собран картой #69 (этап 3) и
|
||||
правится по мере постройки.
|
||||
|
||||
Статус: приёмка владельцем — тикет #88; до неё набор — черновик.
|
||||
|
||||
Границы уже решены мастер-спекой [«Боевой реализм стенда
|
||||
(v2)»](../../specs/2026-07-30-stand-v2-realism.md): поля слепка, окно K = 7
|
||||
как константа мира, три статуса, приоритет классов расхождений, правило
|
||||
«поведение и атрибуцию считаем по трекеру, деньги — по бэкенду». Рамка, перед
|
||||
которой отвечает каждое решение, — «Чем меряется генератор» в [спеке
|
||||
генератора](../../specs/2026-08-01-generator.md): конструкция внутри
|
||||
оправдана только наблюдаемым эффектом на выходе.
|
||||
|
||||
## Целевая картина одним взглядом
|
||||
|
||||
- **Заказ — проекция, не порождение.** Торговая половина дня-функции уже
|
||||
посчитала корзину, цены, купон и номер заказа; заказная половина навешивает
|
||||
судьбу и собирает слепок. Ни одного нового броска в торговом подпотоке —
|
||||
[откуда берётся заказ](projection.md).
|
||||
- **Слепок дня D — чистая функция (зерно, D)**: состояние заказов, рождённых
|
||||
в дни D−6…D, снятое на границе суток D|D+1. Отправляет его следующий
|
||||
прогон — ночная выгрузка бэкенда за вчера; на проводе — один JSON-документ
|
||||
на заказ — [слепок и его доставка](snapshot.md).
|
||||
- **Судьба заказа решается при рождении** и обязана уложиться в окно K либо
|
||||
не случиться вовсе. На выходе из окна заказ либо `paid`, либо `cancelled` —
|
||||
[судьба заказа](fate.md).
|
||||
- **Расхождения и опоздания — часть мира, а не грязь**: два подпотока —
|
||||
заказная и событийная стороны; броски независимы, пересечения выходят
|
||||
арифметикой, приоритет классов работает по-настоящему —
|
||||
[классы расхождений и опоздание](mismatch.md).
|
||||
- **Опись хранит только то, чего движение мира не меняет**: хеш байтов
|
||||
каждого слепка и счётчики наблюдаемых классов —
|
||||
[что хранит опись](inventory.md).
|
||||
- **Мост к склейке**: план состава владеет человеком; его непрозрачный
|
||||
`person_id` заказ показывает как `user_id`, кликстрим остаётся анонимным —
|
||||
[мост к склейке](identity.md).
|
||||
- **Приём — пакетный забор**: одно прямое чтение Kafka в STG, два
|
||||
`INSERT SELECT` в типизированный ODS и таблицу ошибок; `ods.order_snapshot`
|
||||
принимает версии заказа на `ReplacingMergeTree(updated_at)` —
|
||||
[приём из Kafka в ODS](ingestion.md).
|
||||
- **Стартовый мир отправляет семь слепков** (дни 0…6): у последнего прожитого
|
||||
дня клики есть, а заказов нет, и график выручки дозаполняется по ходу
|
||||
мира — [заказы в стартовом мире](start-world.md).
|
||||
|
||||
Правила, обязательные для кода этапа 3, собраны в
|
||||
[правилах кода](code-rules.md).
|
||||
|
||||
## Открытые решения
|
||||
|
||||
- **Имена подпотоков сторон судьбы** — при реализации; из мёртвых имён никто
|
||||
не бросает, переименование ничего не сдвигает (#72).
|
||||
- **Конкретные веса и доли** — таблицы исходов, моментов, задержки опоздания,
|
||||
доли классов, стоимость доставки — калибровка при реализации; финальная
|
||||
фиксация чисел — пересборка эталонного мира, этап 7. При пересборке правки
|
||||
потребуют только числа, не устройство.
|
||||
- **Проверки приёма** — разовая приёмка допущения «один запуск — одно чтение»
|
||||
и опыты из [«Рисков и проверки»](ingestion.md) — тикет реализации приёма.
|
||||
- **`_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/0008-order-ingestion.md) и
|
||||
[ADR 0010](../../adr/0010-order-versions-in-ods.md); контракт провода —
|
||||
мастер-спека, раздел 2, и [исследование формата
|
||||
слепка](../../research/2026-08-16-order-snapshot-wire-format.md). Форма
|
||||
набора — [ADR 0011](../../adr/0011-component-docs.md).
|
||||
Reference in New Issue
Block a user