- Зачем:
- термины спеки перейдут в задания, а «хребет», «ветки» и «точка
прицепа» с калькированными заголовками сюжетов смущали бы студентов.
- Что:
- хребет → основная программа, шаги → ступени, ветки → факультативы,
«точка прицепа» заменена формулой «открывается после ступени N»;
- заголовки разделов и сюжетов переписаны из позиции студента
(«Почему выручка не сходится», «Куда попадают битые строки»);
- переносы выровнены по ~80 колонок по всему файлу.
- Проверка:
- текст без учета пробелов не изменился на шаге переносов (SHA-256);
решения, состав и порядок программы не менялись.
- Зачем:
- тикет #202 карты #182: собрать из инвентаризации #201 программу лаб
целиком — состав, порядок, формы и судьбу идей-кандидатов.
- Что:
- создан docs/specs/2026-09-01-labs-program.md: хребет из семи
обязательных шагов и пять тематических разделов необязательных лаб;
- узаконены границы вычитания по потокам и поименные резолюции идей
#143, #145, #148, #149, #186, #187, #188;
- записаны отклоненные варианты оси прогрессии и границы спеки (#203).
- Проверка:
- вычитка владельцем (спека принята), слепое ревью фактов против
инвентаризации и доков — все находки закрыты.
- Зачем:
- спеке программы лаб (#202) нужен полный веер сюжетов вместо семи
случайно накопленных идей; резолюция тикета #201 карты #182.
- Что:
- заметка docs/research/2026-08-31-labs-inventory.md: 32 сюжета по
слоям STG, ODS, DDS, DM, BI и поперек слоев, три формы заданий,
разбор гипотезы «вычитание + DQ» с таблицей по потокам.
- Проверка:
- фактура (пути, имена таблиц, номера тикетов) сверена с репозиторием
при вычитке; кода изменение не касается.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Зачем: раздел 10 выносил все лабы v2 в отдельную работу учебного пути,
делая исключение только для домашек DM, — необязательная лаба Superset
из #197 формально в него не попадала.
Что: исключение расширено фразой про лабу «свой дашборд в Superset» с
меркой владельца: домашки DM и эта лаба продуманы до готовых ТЗ,
остальные лабы пока на уровне идей.
Проверка: вычитка; решение владельца репозитория из обсуждения #197.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Зачем: владеть хотя бы одним BI-инструментом на базовом уровне — полезный
навык дата-инженера, но стенд в первую очередь про ClickHouse, поэтому
лаба необязательная. Обещание «отдельная домашка после этапа 8» в доке DM
висело без адреса.
Что: ТЗ docs/labs/superset-dashboard.md — пять датасетов поверх публичных
представлений заданий 1-5, свой дашборд отдельно от стендового, проверка
глазами без homework_check; шестая строка и разведение «пяти заданий по
витринам» в docs/labs/README.md; абзац о сроке жизни объектов менти в
docs/architecture/superset.md; ссылка на лабу из доки DM; правило слага в
AGENTS.md расширено до «предмет задания».
Проверка: кода и DDL нет; слепое ревью текста (9 находок закрыто, 2
дополнительные с перепроверки) и финальная вычитка.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- этап 8 (#196): три сюжета спеки — выручка, сверка, посетители /
известные — должны приезжать в Superset при каждой инициализации
стенда, без ручной сборки в интерфейсе.
- Что:
- дерево infra/superset/import/ дополнено датасетами трех витрин dm,
тремя графиками и дашбордом «Бизнес-сюжеты»; uuid розданы рукой,
русские строки читаемы, metadata.yaml сокращен до версии формата.
- написан справочник docs/architecture/superset.md: устройство зоны,
дерево импорта, маршрут свежего экспорта, ловушки импорта.
- в docs/architecture/dm.md добавлена ссылка на справочник зоны.
- Проверка:
- docker compose run --rm superset-init — импорт начисто, затем три
графика отдают данные через API (54/48/10 строк).
- прогон рецепта «чистая установка» из справочника: сброс базы superset
в postgres-metadata, импорт, активы на месте.
- make lint и make check-services зеленые (7/7).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- семь мест обещали калибровку черновых долей «при пересборке
эталонного мира (этап 7)», а пересборки не будет (#192); числа
сверены замером и зафиксированы (#194, хвост этапа 7 — #9).
- Что:
- замер на каноническом мире (28 дней, без транспорта): все доли в
пределах ориентиров; пометки «черновое» сняты, наблюдаемые доли
вписаны в комментарии world.py, fate.md и запись «Что проверено»;
- потеря purchase: наблюдаемых 1,78% при броске 3% — вычеты штатные
(пары склейки, приоритет отмены), принято решением владельца;
ориентир класса B в мастер-спеке различает бросок и наблюдаемую долю;
- веса мира и опись не тронуты: правки world.py — только комментарии.
- Проверка:
- cd generator && make lint && make typecheck && make test (437 passed);
- git diff по data/world-inventory.json пуст; grep «черновое|калибровка»
по generator/src и docs/architecture/orders пуст.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- у дней 8-13 описи не нашлось читателя: обещание эталона в 14 дней
снято решением владельца 2026-08-30 (#192, этап 7 — #9).
- Что:
- резолюция перенесена в обе спеки, докстринг описи и словарь CONTEXT.md;
- добавлен тест: проигранный через CLI день совпадает с хешем описи;
- сняты замеры: пересборка описи 20,5 с, снимок 460,7 МБ, make test
176,5 с — записаны в карту проверок и таблицу бюджетов.
- Проверка:
- cd generator && make lint && make typecheck && make test (437 passed);
- git diff по data/world-inventory.json пуст.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- менти должен увидеть, как запоздавшая выгрузка меняет открытое окно, не подделывая аудит источника.
- Что:
- заказам назначена задержка D, D+1 или D+2 последним броском подпотока ORDERS.
- назначенный планом заказ приезжает сразу, а Woven передаёт эту гарантию именованным полем.
- обновлены документы, проверки границ механики и эталонные хеши слепков.
- Проверка:
- make lint, make typecheck и make test в generator: 436 тестов прошли.
- make config-test: конфигурация прошла проверку.
- world_live_day и следующий etl_pipeline перевели заказ 20260608-0001 из awaiting_order в match.
- Зачем:
- трекер стенда был полным, и правило «деньги — по бэкенду» держалось
на слове; классы B и D делают недосчет и пересчет трекера
наблюдаемыми (этап 6, #184).
- Что:
- подпоток BEACONS: точечная потеря purchase (~3%) и сюжетный дубль
(~2%) швом после _purchases, с гарантией моста идентичностей и
условием допуска дубля по паузе до следующего визита;
- опись считает пять классов по приоритету спеки; фильтр
classes_vs_inventory расширен, нулевой класс читается нулем;
- fate.md, seeds.md, dm.md и orders/README.md приведены к имени
BEACONS и строгому правилу допуска.
- Проверка:
- make lint, make typecheck, make test (433 passed) и make inventory
из generator/ — хеши слепков не изменились;
- на стенде: make smoke, make check-clickhouse, make check-services
зеленые; в dq_summary classes_vs_inventory и sessions_vs_reference
pass, витрина сверки показывает lost_event и duplicate_event.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- спека разрослась до 1058 строк, а журнал решений в разделе 9 читался
только целиком; агентам и людям нужен дешевый адресный заход к
основаниям решений генератора.
- Что:
- заведены ADR 0015 (пояс счетчика), 0016 (паспорт куки) и 0017 (номер
заказа); четыре адресные ссылки на «раздел 9» перешиты на них.
- раздел 9 пересобран в 11 тематических подразделов с датами и тикетами
у каждого решения и закрыт пометкой о заморозке; устаревшие
промежуточные замеры свернуты до указателей на актуальные.
- строка статуса в шапке отмечает закрытие спеки как документа этапа 2.
- Проверка:
- wc -l docs/specs/2026-08-01-generator.md (951, было 1058);
rg -n 'раздел[а-яё]* 9|разделы 8 и 9' docs -g '*.md' — 18 попаданий,
все классифицированы; разделы 1-8 нетронуты (сверка хешем).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- ADR и комментарии повторяли устройство Compose и говорили о сборке безлично.
- Что:
- в Compose оставлен один указатель на причину решения.
- ADR хранит правило общей сборки и объясняет гонку Buildx.
- Проверка:
- make config-test.
- git diff --check.
- Зачем:
- спека отвечает «почему», а жанра «как пройти устройство по коду»
не было (#48); черновик в generator/README.md ждал выверки.
- Что:
- новый набор docs/architecture/generator/: индекс с целевой картиной
и mermaid-схемой плюс шесть поддокументов по темам тикета.
- демо-модуль и цель make demo: канонический D0, все стадии цепочки
на одном экране; тест-сторож проверяет стадии без прибитых чисел.
- раздел «Как это работает» в generator/README.md сжат до ссылки
на путеводитель, черновая врезка снята.
- Проверка:
- из generator/: make lint, make typecheck, make test (430 passed),
make demo; два слепых ревью и узкая перепроверка — находки закрыты.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- make up иногда падал, когда несколько служб параллельно экспортировали один тег образа.
- Что:
- сборка образов Airflow и Superset закреплена за службами инициализации.
- зависимые службы только используют готовый образ, решение описано в ADR 0001.
- Проверка:
- make config-test.
- docker compose --progress plain build superset superset-init airflow-scheduler airflow-init.
- два запуска make up прошли экспорт трёх уникальных тегов без image already exists.
- Зачем:
- холодный запуск второго приложения Superset давал ложный красный результат исправного стенда.
- Что:
- тяжёлые `create_app()` и `superset test-db` заменены проверкой сохранённого подключения через REST API.
- добавлены проверка схемы `dm`, безопасная диагностика и краткая запись приёмки с замерами.
- Проверка:
- `make config-test`.
- `make smoke`: 21/21 за 25 секунд.
- три `make check-services` после перезапуска Superset: 7/7 за 71, 67 и 70 секунд; финальный прогон — 7/7 за 70 секунд.
- контрольный неверный UUID: 5/1, красной стала проверка метаданных.
- Зачем:
- make up падал с HTTP 451 при загрузке плагина из каталога Grafana.
- Что:
- закреплённый выпуск плагина загружается из официального GitHub Releases.
- версия плагина вынесена в один аргумент сборки, причина выбора описана в справочнике мониторинга.
- Проверка:
- docker build --progress=plain -t clickstream-grafana:local infra/grafana.
- docker run --rm --entrypoint grafana clickstream-grafana:local cli --pluginsDir /usr/share/grafana/plugins plugins ls.
- make config-test.
- Зачем:
- владелец на ревью PR #175 отметил кальку в подсказках; читать их
будет менти, и язык здесь — часть продукта.
- Что:
- переписаны подсказка формы days, докстринги работников, строки
журнала remember_played, абзац README и пункт в etl.md; смысл
не менялся.
- Проверка:
- make lint, make config-test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- оператор принимал служебную logical_date Airflow за дату мира (#111),
а документацию читают реже, чем форму запуска.
- Что:
- у параметра days появилась подсказка description_md, а в докстринги
работников добавлена фраза: день определяет world_position, служебные
поля Airflow к оси мира отношения не имеют.
- remember_played пишет в журнал сыгранные дни и новую позицию.
- README дополнен абзацем про служебные поля за «Advanced Options»;
из etl.md сняты устаревшие стыки на закрытые #7 и #2.
- Проверка:
- make lint, make config-test; ручной прогон world_next_day зелёный,
позиция 9 -> 10, в журнале «сыграны дни 9–9, позиция теперь 10».
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- менти строит витрины DM сам, от DDL по правилу зерна до задачи в
конвейере; стенду нужны ТЗ с образцом и обратная связь по каждой
витрине (#159, резолюция #135).
- Что:
- docs/labs/: README и пять ТЗ — events_enriched_v, top_pages_daily,
session_overview, dq_errors_daily, utm_effectiveness; каждое ТЗ
называет урок, состав колонок, форму по зерну и самопроверку.
- dags/homework_check.py: ручной даг, задача на витрину, красная без
витрины или при расхождении; проверки — шесть файлов sql/dq/ с
инвариантами против DDS и ODS, без золотых констант; в dq_summary
не пишет.
- docs: dm.md называет homework_check и снимает «Остается нарезке»,
§7 и §10 мастер-спеки согласованы с лабами, dds/session.md указывает
на ТЗ, AGENTS.md пополнен правилом имен docs/labs/.
- Проверка:
- make lint; make smoke 21/21, make check-clickhouse 10/10,
make check-services 7/7.
- на свежем стенде все пять задач homework_check красные и называют
ТЗ; черновик каждой витрины по тексту ТЗ зеленит свою задачу,
после сноса — снова красная; строк от самопроверки в dq_summary нет.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- параллельный DQ выгружал деловые ключи в Python и исчерпывал 640 МиБ планировщика.
- Что:
- четыре сверки агрегируют дневные итоги и ограниченную диагностику в ClickHouse.
- коробка планировщика поднята до 1,5 ГиБ, локальные пределы задач удалены.
- измерения и граница между SQL и Python записаны в документации.
- Проверка:
- make lint, make config-test, make smoke, make check-clickhouse, make check-services.
- полный etl_pipeline, красный и восстановительный прогоны dq_check.
- Зачем:
- конвейеру нужна публикуемая сводка текущего качества с красным завершением при нарушении договоров.
- Что:
- добавлены DDL, публичное представление и пять сверок на естественном деловом зерне.
- даг dq_check встроен после DM и публикует полные дневные партиции до именованных утверждений.
- параллелизм DDS, DM и DQ приведён к измеренному лимиту памяти планировщика.
- Проверка:
- make lint; make config-test; make rebuild-storage.
- make smoke; make check-clickhouse; make check-services.
- три семейства проверок покрашены искусственными расхождениями и восстановлены повторным полным прогоном.
- Зачем:
- верхние смещения можно получить тем же административным клиентом без одноразового Consumer и фиктивной группы.
- Что:
- чтение хвоста переведено на AdminClient.list_offsets с OffsetSpec.latest.
- назначение system.one названо рядом с запросом, а документация и запись проверок сокращены и переставлены по смыслу.
- Проверка:
- make config-test; make lint.
- живые проверки готового и отсутствующего разделов Kafka; полный etl_pipeline.
Зачем:
- Один запуск должен одинаково работать из жизненного цикла, вручную после разгона и повторно после отказа.
Что:
- Добавлена последовательная сцепка DDS и DM с ожиданием каждого слоя.
- DDS дожидается смещений Kafka и очереди доставки ClickHouse за общий срок.
- ETL встроен в создание мира и живой день; документация приведена к новому графу.
Проверка:
- make config-test; make lint.
- make smoke: 21/21; make check-clickhouse: 10/10; make check-services: 7/7.
- make rebuild-storage, живой и пакетный дни, искусственный отказ и ручное восстановление ETL.
- Зачем:
- Ревью выявило неясные причины ограничений и защитных условий в учебном образце.
- Что:
- Спекулятивный общий потолок задач заменен адресным лимитом размноженной замены с точным описанием OOM.
- Объяснены нулевое значение непарного LEFT JOIN и опасность пустого DDS при замене партиций.
- Добавлена ссылка на разбор области пересборки, а общий штамп про Context7 удален.
- Проверка:
- make lint, make config-test, make smoke; успешный запуск dm_transform.
Зачем:
- Показать два ритма пересборки агрегатов на готовых витринах DM.
Что:
- Добавлены физические модели и публичные договоры revenue_daily и daily_traffic.
- Добавлен dm_transform с оконной заменой выручки и полным пересчетом трафика.
- Отрицательный опыт локального соединения через публичные _v зафиксирован; выбран явный GLOBAL LEFT JOIN.
- Замены партиций сериализованы после подтвержденного OOM при трех одновременных задачах.
- Обновлены архитектурные документы и мастер-спека.
Проверка:
- make lint, make config-test, make smoke, make check-clickhouse, make check-services.
- Чистая сборка world_recreate, dds_transform и dm_transform; меры сверены с прямыми агрегатами.