Подготовить ТЗ лабы, в которой учащийся сначала строит проверки качества заказов, а затем безопасно вычитает разбор и трансформацию. Учебный результат: проверки появляются до рискованного изменения и умеют показать управляемую ошибку.
Критерии приемки
В ТЗ есть две новые проверки: равенство price * quantity = items_total и сверка слоя с авторитетным источником по дням.
Для обеих проверок описаны управляемые ошибки: результат сначала красный, после исправления снова зеленый.
Описано ручное подкладывание по одной строки каждого класса ошибки разбора и адресная очистка только своего среза.
Описано вычитание ods.order_parse и DDS-заказа: область, пересборка и замена партиции; инфраструктура стенда сохраняется.
В самопроверке учтены существующие DQ, баланс годных и ошибочных строк по срезу, физическое шардирование через hostName(), восстановление пропущенного дня и повторный запуск.
Все действия и договоры проверены по коду, SQL и дагам; команды дают исполнимое, адресное и по возможности только читающее доказательство.
Индекс docs/labs/README.md ведет на новое ТЗ; Markdown-ссылки и git diff --check проверены.
Текст прошел writing-for-agents, ai-text-lint и литературную вычитку русского языка.
ТЗ разделено на три последовательные части: 5-1-order-checks.md, 5-2-order-parsing.md и 5-3-order-pipeline.md; у каждой части есть собственные критерии приёмки и чистая точка остановки после проверки.
Границы
Меняются только docs/labs/5-1-order-checks.md, docs/labs/5-2-order-parsing.md, docs/labs/5-3-order-pipeline.md и ссылки на них в docs/labs/README.md. SQL, даги, DDL, генератор, службы и данные стенда не меняются. Три части выполняются последовательно; каждая описывает собственный результат, критерии приёмки и чистую точку остановки. ТЗ не содержит реализации учебных SQL или DQ-проверок: учащийся пишет их сам.
Сначала прочитать
docs/specs/2026-09-01-labs-program.md, раздел ступени 5 и общее правило вычитания.
Проверить ссылки, git diff --check и все заявленные команды без make clean и без разрушения общего стенда.
Part of #206
## Цель
Подготовить ТЗ лабы, в которой учащийся сначала строит проверки качества заказов, а затем безопасно вычитает разбор и трансформацию. Учебный результат: проверки появляются до рискованного изменения и умеют показать управляемую ошибку.
## Критерии приемки
- [x] В ТЗ есть две новые проверки: равенство `price * quantity = items_total` и сверка слоя с авторитетным источником по дням.
- [x] Для обеих проверок описаны управляемые ошибки: результат сначала красный, после исправления снова зеленый.
- [x] Описано ручное подкладывание по одной строки каждого класса ошибки разбора и адресная очистка только своего среза.
- [x] Описано вычитание `ods.order_parse` и DDS-заказа: область, пересборка и замена партиции; инфраструктура стенда сохраняется.
- [x] В самопроверке учтены существующие DQ, баланс годных и ошибочных строк по срезу, физическое шардирование через `hostName()`, восстановление пропущенного дня и повторный запуск.
- [x] Все действия и договоры проверены по коду, SQL и дагам; команды дают исполнимое, адресное и по возможности только читающее доказательство.
- [x] Индекс `docs/labs/README.md` ведет на новое ТЗ; Markdown-ссылки и `git diff --check` проверены.
- [x] Текст прошел `writing-for-agents`, `ai-text-lint` и литературную вычитку русского языка.
- [x] ТЗ разделено на три последовательные части: `5-1-order-checks.md`, `5-2-order-parsing.md` и `5-3-order-pipeline.md`; у каждой части есть собственные критерии приёмки и чистая точка остановки после проверки.
## Границы
Меняются только `docs/labs/5-1-order-checks.md`, `docs/labs/5-2-order-parsing.md`, `docs/labs/5-3-order-pipeline.md` и ссылки на них в `docs/labs/README.md`. SQL, даги, DDL, генератор, службы и данные стенда не меняются. Три части выполняются последовательно; каждая описывает собственный результат, критерии приёмки и чистую точку остановки. ТЗ не содержит реализации учебных SQL или DQ-проверок: учащийся пишет их сам.
## Сначала прочитать
- `docs/specs/2026-09-01-labs-program.md`, раздел ступени 5 и общее правило вычитания.
- `docs/labs/4-1-session-pipeline.md`.
- `docs/architecture/orders/README.md`, `code-rules.md`, `fate.md`, `ingestion.md`, `inventory.md`, `snapshot.md`.
- `docs/architecture/dds/order.md`, `docs/architecture/etl.md`, `docs/architecture/testing.md`.
- `sql/dq/`, `sql/ods/order_parse.sql`, `sql/dds/order_scope.sql`, `sql/dds/order_rebuild.sql`, `sql/dds/order_replace.sql`.
- `dags/orders_ingest.py`, `dags/etl_pipeline.py`, `dags/dq_check.py`.
## Проверка
Проверить ссылки, `git diff --check` и все заявленные команды без `make clean` и без разрушения общего стенда.
Учащийся сначала пишет две проверки заказов и доказывает их управляемыми ошибками, затем переписывает разбор ODS и три SQL-файла сборки DDS внутри готового конвейера. Даги, DDL, Kafka, службы и таблицы-доноры остаются несущей частью упражнения.
Проверено:
локальные ссылки и якоря, git diff --check и отдельная проверка нового файла;
четырехстрочная заготовка jq с одной годной строкой, тремя классами брака и разными временами created_at и updated_at;
формы мутаций в отдельном clickhouse-local, без изменения общих таблиц стенда;
техническая линия Claude Opus: 3 исходные блокирующие находки и 5 замечаний закрыты, перепроверка APPROVED, все 8 исходов CLOSED и PROPORTIONATE;
линия формы: APPROVED.
Граница результата сохранена: orders_vs_ods сравнивает DDS с непосредственным источником ods.order_v по дням и не является сквозным эталоном генератора — одинаковую потерю строки в обоих слоях она не обнаружит. Это прикрыто отдельным опытом по контролируемому сырому срезу и проверкой текущей версии по snapshot_date.
Полный опыт с изменением данных общего стенда не запускался; проверены команды, код, SQL, даги и документация, а не разрушительная демонстрация на общей базе.
## Результат
Подготовлен [PR «ТЗ ступени 5 „Сначала сторож, потом ломай: заказы“»](https://git.dementev.space/ddmitry/clickstream-data-platform/pulls/239), коммит `d686de5`. Задание лежит в `docs/labs/5-1-order-checks.md`, индекс ведет на него.
Учащийся сначала пишет две проверки заказов и доказывает их управляемыми ошибками, затем переписывает разбор ODS и три SQL-файла сборки DDS внутри готового конвейера. Даги, DDL, Kafka, службы и таблицы-доноры остаются несущей частью упражнения.
Проверено:
- локальные ссылки и якоря, `git diff --check` и отдельная проверка нового файла;
- четырехстрочная заготовка `jq` с одной годной строкой, тремя классами брака и разными временами `created_at` и `updated_at`;
- формы мутаций в отдельном `clickhouse-local`, без изменения общих таблиц стенда;
- техническая линия Claude Opus: 3 исходные блокирующие находки и 5 замечаний закрыты, перепроверка `APPROVED`, все 8 исходов `CLOSED` и `PROPORTIONATE`;
- линия формы: `APPROVED`.
Граница результата сохранена: `orders_vs_ods` сравнивает DDS с непосредственным источником `ods.order_v` по дням и не является сквозным эталоном генератора — одинаковую потерю строки в обоих слоях она не обнаружит. Это прикрыто отдельным опытом по контролируемому сырому срезу и проверкой текущей версии по `snapshot_date`.
Полный опыт с изменением данных общего стенда не запускался; проверены команды, код, SQL, даги и документация, а не разрушительная демонстрация на общей базе.
В этом прогоне координатор несколько раз опрашивал долгий Claude-прогон через sleep 25; это произошло из-за смешения тайм-аута вызова инструмента yield_time_ms=30000 с частотой наблюдения. Повторные уведомления съели внимание, измеренной экономии токенов или денег нет.
Принятое владельцем правило: работу с Claude ведет отдельный субагент, а Git и трекер — отдельный помощник. Полные отчеты и триаж передаются уникальными файлами напрямую автору и ревьюеру; сообщения несут путь, замороженную версию и следующее действие. Наблюдение после запуска механизируется watcher-ом примерно с минутным интервалом, который сообщает только изменение, терминальный результат или настоящий блокер.
Это принятые границы ответственности и обмена. Сам watcher и экономия от него в этом комментарии не выдаются за измеренный результат; подробная записка эксперимента сохранена во временном файле /tmp/wayfinder206-stage5-luna-monitoring-note.md.
## Эксперимент с наблюдением
В этом прогоне координатор несколько раз опрашивал долгий Claude-прогон через `sleep 25`; это произошло из-за смешения тайм-аута вызова инструмента `yield_time_ms=30000` с частотой наблюдения. Повторные уведомления съели внимание, измеренной экономии токенов или денег нет.
Принятое владельцем правило: работу с Claude ведет отдельный субагент, а Git и трекер — отдельный помощник. Полные отчеты и триаж передаются уникальными файлами напрямую автору и ревьюеру; сообщения несут путь, замороженную версию и следующее действие. Наблюдение после запуска механизируется watcher-ом примерно с минутным интервалом, который сообщает только изменение, терминальный результат или настоящий блокер.
Это принятые границы ответственности и обмена. Сам watcher и экономия от него в этом комментарии не выдаются за измеренный результат; подробная записка эксперимента сохранена во временном файле `/tmp/wayfinder206-stage5-luna-monitoring-note.md`.
После разбора отзыва Fable владелец принял разделение PR #239 на три последовательные части: 5-1-order-checks.md, 5-2-order-parsing.md и 5-3-order-pipeline.md. Содержание и порядок учебного опыта сохраняются; у каждой части будут собственные критерии приёмки и чистая точка остановки.
В записи решения сохранены четыре замечания к форме ТЗ:
Договор и реализация: отделить требования от устройства готового решения; обязательным остаётся ожидание Distributed-записи перед заменой партиции.
Диагностика: явно направлять учащегося в журнал задачи Airflow, поскольку dm.dq_summary не хранит эту диагностику.
Восстановление: говорить о любом закрытом дне левее окна, ближайшем к нему, и объяснять пересборку оставшегося отрезка.
Язык: убрать лишние олицетворения; термин «сторож» сохраняется как словарь задания.
При реализации под проверкой остаются три вопроса среды: путь kafka-console-producer.sh в образе apache/kafka:4.3.1, форма ALTER ... ON CLUSTER ... SETTINGS mutations_sync = 2 и повторное чтение сообщений маркера после world_recreate. Уже закрытые TECH-находки этим решением не переоткрываются; сильные технические договоры и проверенные имена сохраняются. Выполнение этих трёх проверок здесь не заявляется.
## Решение о разделении
После разбора отзыва Fable владелец принял разделение PR #239 на три последовательные части: `5-1-order-checks.md`, `5-2-order-parsing.md` и `5-3-order-pipeline.md`. Содержание и порядок учебного опыта сохраняются; у каждой части будут собственные критерии приёмки и чистая точка остановки.
В записи решения сохранены четыре замечания к форме ТЗ:
- **Договор и реализация:** отделить требования от устройства готового решения; обязательным остаётся ожидание Distributed-записи перед заменой партиции.
- **Диагностика:** явно направлять учащегося в журнал задачи Airflow, поскольку `dm.dq_summary` не хранит эту диагностику.
- **Восстановление:** говорить о любом закрытом дне левее окна, ближайшем к нему, и объяснять пересборку оставшегося отрезка.
- **Язык:** убрать лишние олицетворения; термин «сторож» сохраняется как словарь задания.
При реализации под проверкой остаются три вопроса среды: путь `kafka-console-producer.sh` в образе `apache/kafka:4.3.1`, форма `ALTER ... ON CLUSTER ... SETTINGS mutations_sync = 2` и повторное чтение сообщений маркера после `world_recreate`. Уже закрытые TECH-находки этим решением не переоткрываются; сильные технические договоры и проверенные имена сохраняются. Выполнение этих трёх проверок здесь не заявляется.
Ступень 5 реализована тремя заданиями в пределах прежней семиступенчатой
программы. Каждое задание заканчивается чистым состоянием стенда и проверяемой
приемкой: две DQ и их красные опыты; разбор ODS до и после переписывания;
сборка DDS, восстановление дня, шардирование и повторный прогон.
Проверка orders_vs_ods использует непосредственный источник DDS - ods.order_v. Одинаковую потерю в ODS и DDS она не обнаруживает. Этот предел
не скрыт: путь raw -> ODS отдельно проверяется балансом одной годной строки и
трех классов брака по _load_id.
Команды Kafka и кластерных мутаций подтверждены на развернутой версии стенда.
Для world_recreate проверен код жизненного цикла: он удаляет прикладные
consumer groups и топики, поэтому пробная пачка не попадает в новый мир.
Ступень 5 реализована тремя заданиями в пределах прежней семиступенчатой
программы. Каждое задание заканчивается чистым состоянием стенда и проверяемой
приемкой: две DQ и их красные опыты; разбор ODS до и после переписывания;
сборка DDS, восстановление дня, шардирование и повторный прогон.
Проверка `orders_vs_ods` использует непосредственный источник DDS -
`ods.order_v`. Одинаковую потерю в ODS и DDS она не обнаруживает. Этот предел
не скрыт: путь raw -> ODS отдельно проверяется балансом одной годной строки и
трех классов брака по `_load_id`.
Команды Kafka и кластерных мутаций подтверждены на развернутой версии стенда.
Для `world_recreate` проверен код жизненного цикла: он удаляет прикладные
consumer groups и топики, поэтому пробная пачка не попадает в новый мир.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of #206
Цель
Подготовить ТЗ лабы, в которой учащийся сначала строит проверки качества заказов, а затем безопасно вычитает разбор и трансформацию. Учебный результат: проверки появляются до рискованного изменения и умеют показать управляемую ошибку.
Критерии приемки
price * quantity = items_totalи сверка слоя с авторитетным источником по дням.ods.order_parseи DDS-заказа: область, пересборка и замена партиции; инфраструктура стенда сохраняется.hostName(), восстановление пропущенного дня и повторный запуск.docs/labs/README.mdведет на новое ТЗ; Markdown-ссылки иgit diff --checkпроверены.writing-for-agents,ai-text-lintи литературную вычитку русского языка.5-1-order-checks.md,5-2-order-parsing.mdи5-3-order-pipeline.md; у каждой части есть собственные критерии приёмки и чистая точка остановки после проверки.Границы
Меняются только
docs/labs/5-1-order-checks.md,docs/labs/5-2-order-parsing.md,docs/labs/5-3-order-pipeline.mdи ссылки на них вdocs/labs/README.md. SQL, даги, DDL, генератор, службы и данные стенда не меняются. Три части выполняются последовательно; каждая описывает собственный результат, критерии приёмки и чистую точку остановки. ТЗ не содержит реализации учебных SQL или DQ-проверок: учащийся пишет их сам.Сначала прочитать
docs/specs/2026-09-01-labs-program.md, раздел ступени 5 и общее правило вычитания.docs/labs/4-1-session-pipeline.md.docs/architecture/orders/README.md,code-rules.md,fate.md,ingestion.md,inventory.md,snapshot.md.docs/architecture/dds/order.md,docs/architecture/etl.md,docs/architecture/testing.md.sql/dq/,sql/ods/order_parse.sql,sql/dds/order_scope.sql,sql/dds/order_rebuild.sql,sql/dds/order_replace.sql.dags/orders_ingest.py,dags/etl_pipeline.py,dags/dq_check.py.Проверка
Проверить ссылки,
git diff --checkи все заявленные команды безmake cleanи без разрушения общего стенда.Результат
Подготовлен PR «ТЗ ступени 5 „Сначала сторож, потом ломай: заказы“», коммит
d686de5. Задание лежит вdocs/labs/5-1-order-checks.md, индекс ведет на него.Учащийся сначала пишет две проверки заказов и доказывает их управляемыми ошибками, затем переписывает разбор ODS и три SQL-файла сборки DDS внутри готового конвейера. Даги, DDL, Kafka, службы и таблицы-доноры остаются несущей частью упражнения.
Проверено:
git diff --checkи отдельная проверка нового файла;jqс одной годной строкой, тремя классами брака и разными временамиcreated_atиupdated_at;clickhouse-local, без изменения общих таблиц стенда;APPROVED, все 8 исходовCLOSEDиPROPORTIONATE;APPROVED.Граница результата сохранена:
orders_vs_odsсравнивает DDS с непосредственным источникомods.order_vпо дням и не является сквозным эталоном генератора — одинаковую потерю строки в обоих слоях она не обнаружит. Это прикрыто отдельным опытом по контролируемому сырому срезу и проверкой текущей версии поsnapshot_date.Полный опыт с изменением данных общего стенда не запускался; проверены команды, код, SQL, даги и документация, а не разрушительная демонстрация на общей базе.
Эксперимент с наблюдением
В этом прогоне координатор несколько раз опрашивал долгий Claude-прогон через
sleep 25; это произошло из-за смешения тайм-аута вызова инструментаyield_time_ms=30000с частотой наблюдения. Повторные уведомления съели внимание, измеренной экономии токенов или денег нет.Принятое владельцем правило: работу с Claude ведет отдельный субагент, а Git и трекер — отдельный помощник. Полные отчеты и триаж передаются уникальными файлами напрямую автору и ревьюеру; сообщения несут путь, замороженную версию и следующее действие. Наблюдение после запуска механизируется watcher-ом примерно с минутным интервалом, который сообщает только изменение, терминальный результат или настоящий блокер.
Это принятые границы ответственности и обмена. Сам watcher и экономия от него в этом комментарии не выдаются за измеренный результат; подробная записка эксперимента сохранена во временном файле
/tmp/wayfinder206-stage5-luna-monitoring-note.md.Решение о разделении
После разбора отзыва Fable владелец принял разделение PR #239 на три последовательные части:
5-1-order-checks.md,5-2-order-parsing.mdи5-3-order-pipeline.md. Содержание и порядок учебного опыта сохраняются; у каждой части будут собственные критерии приёмки и чистая точка остановки.В записи решения сохранены четыре замечания к форме ТЗ:
dm.dq_summaryне хранит эту диагностику.При реализации под проверкой остаются три вопроса среды: путь
kafka-console-producer.shв образеapache/kafka:4.3.1, формаALTER ... ON CLUSTER ... SETTINGS mutations_sync = 2и повторное чтение сообщений маркера послеworld_recreate. Уже закрытые TECH-находки этим решением не переоткрываются; сильные технические договоры и проверенные имена сохраняются. Выполнение этих трёх проверок здесь не заявляется.Ступень 5 реализована тремя заданиями в пределах прежней семиступенчатой
программы. Каждое задание заканчивается чистым состоянием стенда и проверяемой
приемкой: две DQ и их красные опыты; разбор ODS до и после переписывания;
сборка DDS, восстановление дня, шардирование и повторный прогон.
Проверка
orders_vs_odsиспользует непосредственный источник DDS -ods.order_v. Одинаковую потерю в ODS и DDS она не обнаруживает. Этот пределне скрыт: путь raw -> ODS отдельно проверяется балансом одной годной строки и
трех классов брака по
_load_id.Команды Kafka и кластерных мутаций подтверждены на развернутой версии стенда.
Для
world_recreateпроверен код жизненного цикла: он удаляет прикладныеconsumer groups и топики, поэтому пробная пачка не попадает в новый мир.