- Зачем:
- расположение файла должно отличать задания основной программы от факультативов.
- Что:
- существующее ТЗ Superset перенесено в `docs/labs/optional/`, ссылки обновлены.
- правило размещения записано в `AGENTS.md`.
- выбор формы витрин объяснен учебной целью стенда.
- Проверка:
- `git diff --check`.
- проверены все упоминания `superset-dashboard` и относительные ссылки.
- Зачем:
- справочники читает человек со стороны, а «пульт мира», «опись мира»,
«работник» и «сырьё» звучали шуткой или калькой времён разработки
(тикет #214, выбор владельца).
- Что:
- CONTEXT.md: статьи «Паспорт мира», «Даги модельного времени»,
«Шаговый даг», «Сырые данные», старые слова в строках «Избегать»;
пометки в ADR 0005, 0008, 0009 без переписывания решений.
- замены по README, справочникам, путеводителю, лабам, спекам,
комментариям дагов и SQL, тегу дага и панели Grafana; имена в коде
не тронуты.
- world.md и stand.md: 35 находок вычитки внесены, регистр выровнен.
- Проверка:
- make config-test; make lint в корне и в generator/; make test в
generator/ (437 passed); скрипт ссылок из #212 пуст; grep старых
слов вне ADR, research и CONTEXT.md пуст.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QBCtU38qSHg5DvgtnKXcW
Зачем: владеть хотя бы одним 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>
- Зачем:
- трекер стенда был полным, и правило «деньги — по бэкенду» держалось
на слове; классы 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>
- Зачем:
- менти строит витрины 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.
- три семейства проверок покрашены искусственными расхождениями и восстановлены повторным полным прогоном.
Зачем:
- Один запуск должен одинаково работать из жизненного цикла, вручную после разгона и повторно после отказа.
Что:
- Добавлена последовательная сцепка 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.
Зачем:
- Показать два ритма пересборки агрегатов на готовых витринах 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; меры сверены с прямыми агрегатами.
Зачем:
- Показать слой DDS как договор данных, которому не нужна физическая копия.
- Сохранить простой учебный стенд без отдельного маршрута ради узких прав.
Что:
- Добавлено кластерное представление dds.event_v с явными 44 колонками.
- Роли bi_reader разрешено чтение ODS, DDS и DM при договоре чтения через _v.
- Согласованы мастер-спека, ADR, справочники архитектуры и живые тикеты этапа.
- Зафиксировано исследование поведения DEFINER поверх Distributed.
Проверка:
- make config-test
- make smoke
- make check-clickhouse
- Приёмочные запросы: равенство ODS/DDS, состав колонок, коды устройств и права bi.
- Зачем:
- сверка с описью подглядывает внутрь генератора: у настоящего магазина
такого оракула нет, и выдавать её за учебный урок DQ нельзя (развилка
из комментария к #157).
- Что:
- в dm.md проверка счётчиков классов помечена технической, её обещание
сужено честно: до витрин доехал рождённый мир; верно ли мир рождён,
проверка не видит — опись считает тот же генератор.
- в §8 мастер-спеки читатель счётчиков «самопроверка лабы сверки»
заменён на техническую проверку classes_vs_inventory звена DQ.
- словарь: короткий термин «Техническая проверка» в CONTEXT.md — только
язык, решение живёт в dm.md; та же формулировка читателя в inventory.md.
- Проверка:
- grep -rn "лабы сверки" docs/ — упоминаний не осталось.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- после переписывания ритма пересборки в тексте остались швы прежних
формулировок и один разрыв с докой конвейера.
- Что:
- довод против дневных партиций daily_traffic заменён верным: партиция —
единица замены, а витрина заменяется только целиком (число строк тут
ни при чём, иначе довод бил бы и по dq_summary).
- в etl.md к механике REPLACE PARTITION добавлена вторая идемпотентность
конвейера — полная перезапись в ReplacingMergeTree.
- правило ритмов говорит про день, а не партицию; поправлены переносы
строк и обороты.
- Проверка:
- make config-test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- обсуждение горячего ревью показало: «окно K для всех» — ритм заказов,
натянутый на слой, а замерзание daily_traffic обесценивало витрину.
- Что:
- раздел «Объём пересборки» заменён «Ритмом пересборки»: три ритма —
хвост / окно K / целиком; daily_traffic наследует у карты полный
пересчёт в ReplacingMergeTree, дневные партиции ей не положены.
- в отклонённые добавлены замерзание за окном K и инкремент по
first_matched_at; инкремент стал идеей лабы повышенной сложности #149.
- Проверка:
- make config-test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- горячее ревью развилки #135 нашло два незакрытых решения: объём
пересборки витрин и судьба менти-витрины после постройки.
- Что:
- добавлен раздел «Объём пересборки»: одно окно K для всех витрин,
замерзание daily_traffic за окном названо решением с объяснением.
- в ТЗ менти добавлен финальный пункт — встроить витрину в dm_transform.
- поправлены мелочи: greenplum-стенд больше не зовётся предшественником,
добавлены ссылки на спеку и карту идентичностей.
- Проверка:
- make config-test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Зачем:
- развилка #135 карты #127 решена: форма и состав витрин DM,
контур DQ этапа 4; резолюция переносится в доки architecture.
- Что:
- создана docs/architecture/dm.md: форма по зерну, дележ витрин
между стендом и заданиями менти, dq_summary с REPLACE PARTITION,
звено DQ конвейера и даг самопроверки домашек.
- ссылки на #135 в etl.md и dds/README.md заменены на доку слоя.
- Проверка:
- make config-test.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>