docs(adr): у правила позиции назван мягкий худший исход

Зачем: горячее ревью ADR 0009 нашло случай, который читатель найдёт сам —
работник, кончивший позже, ставит позицию по своему последнему дню и может
отодвинуть её назад.

Что: случай назван вместе с ценой (часть дней переигрывается, и это дешевле
дыры); заодно поправлен порядок слов там, где даг зовёт генератор.

Проверка: make config-test зелёный.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 12:24:54 +03:00
co-authored by Claude Opus 5
parent aa4797ae93
commit 2ee436f8c7
+13 -7
View File
@@ -17,7 +17,7 @@
через `TriggerDagRunOperator`, дожидаясь его завершения. Снят с паузы — стенд
живёт день за днём; поставлен на паузу — мир встал на границе модельных суток.
Генератор задача зовёт `DockerOperator`: поднимает образ
Генератор задача зовёт через `DockerOperator`: тот поднимает образ
`clickstream-generator:local` — тот самый канонический контейнер, внутри
которого [спека генератора](../specs/2026-08-01-generator.md) обещает побайтовую
воспроизводимость, — в сети стенда, командой `batch` или `live`.
@@ -75,12 +75,18 @@
и выключатель. Это [ADR 0003](0003-dag-run-state.md) в действии: зелёный конец
графа не должен переживать отказ выше.
**Позиция ставится, а не увеличивается.** Правило дешевле сторожа. Если
автоматика прилетит поверх ручного прогона, худшее — день сыгран дважды: номера
событий детерминированы, повтор схлопнет `ReplacingMergeTree`, а позиция
останется верной. Увеличение на единицу в том же случае молча проглотило бы
день, и мир получил бы дыру, которую никто не заметит. Ни пул как мьютекс, ни
проверка «а не идёт ли другой прогон» после этого не нужны.
**Позиция ставится, а не увеличивается.** Правило дешевле сторожа. Если прогон
выключателя наложится на ручной, худшее — день сыгран дважды: номера событий
детерминированы, повтор схлопнет `ReplacingMergeTree`, а позиция останется
верной. Увеличение на единицу в том же случае молча проглотило бы день, и мир
получил бы дыру, которую никто не заметит. Ни пул как мьютекс, ни проверка «а не
идёт ли другой прогон» после этого не нужны.
Худший исход у правила всё-таки есть, и он мягкий: работник, кончивший позже,
ставит позицию по своему последнему дню и может отодвинуть её назад — так
бывает, если долгий живой день закончится после разгона на три дня вперёд.
Тогда часть дней переигрывается. Это дешевле дыры: переигранный день склеится,
пропущенный не найдётся никогда.
**Плата — сокет докера внутри Airflow.** Доступ к нему равен праву root на
машине, и пользователю `airflow` он открывается через GID группы `docker`,