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`, дожидаясь его завершения. Снят с паузы — стенд через `TriggerDagRunOperator`, дожидаясь его завершения. Снят с паузы — стенд
живёт день за днём; поставлен на паузу — мир встал на границе модельных суток. живёт день за днём; поставлен на паузу — мир встал на границе модельных суток.
Генератор задача зовёт `DockerOperator`: поднимает образ Генератор задача зовёт через `DockerOperator`: тот поднимает образ
`clickstream-generator:local` — тот самый канонический контейнер, внутри `clickstream-generator:local` — тот самый канонический контейнер, внутри
которого [спека генератора](../specs/2026-08-01-generator.md) обещает побайтовую которого [спека генератора](../specs/2026-08-01-generator.md) обещает побайтовую
воспроизводимость, — в сети стенда, командой `batch` или `live`. воспроизводимость, — в сети стенда, командой `batch` или `live`.
@@ -75,12 +75,18 @@
и выключатель. Это [ADR 0003](0003-dag-run-state.md) в действии: зелёный конец и выключатель. Это [ADR 0003](0003-dag-run-state.md) в действии: зелёный конец
графа не должен переживать отказ выше. графа не должен переживать отказ выше.
**Позиция ставится, а не увеличивается.** Правило дешевле сторожа. Если **Позиция ставится, а не увеличивается.** Правило дешевле сторожа. Если прогон
автоматика прилетит поверх ручного прогона, худшее — день сыгран дважды: номера выключателя наложится на ручной, худшее — день сыгран дважды: номера событий
событий детерминированы, повтор схлопнет `ReplacingMergeTree`, а позиция детерминированы, повтор схлопнет `ReplacingMergeTree`, а позиция останется
останется верной. Увеличение на единицу в том же случае молча проглотило бы верной. Увеличение на единицу в том же случае молча проглотило бы день, и мир
день, и мир получил бы дыру, которую никто не заметит. Ни пул как мьютекс, ни получил бы дыру, которую никто не заметит. Ни пул как мьютекс, ни проверка «а не
проверка «а не идёт ли другой прогон» после этого не нужны. идёт ли другой прогон» после этого не нужны.
Худший исход у правила всё-таки есть, и он мягкий: работник, кончивший позже,
ставит позицию по своему последнему дню и может отодвинуть её назад — так
бывает, если долгий живой день закончится после разгона на три дня вперёд.
Тогда часть дней переигрывается. Это дешевле дыры: переигранный день склеится,
пропущенный не найдётся никогда.
**Плата — сокет докера внутри Airflow.** Доступ к нему равен праву root на **Плата — сокет докера внутри Airflow.** Доступ к нему равен праву root на
машине, и пользователю `airflow` он открывается через GID группы `docker`, машине, и пользователю `airflow` он открывается через GID группы `docker`,