Опись мира: счётчики классов A и C #157

Closed
opened 2026-08-25 15:01:08 +03:00 by ddmitry · 2 comments
Owner

Part of #6.

Цель

Опись получает счётчики наблюдаемых классов расхождений: их читатель —
DQ-проверка сверки — приходит этим этапом (обещание нарезки этапа 3,
#89). Учебный результат: опора-счётчик рядом с растяжкой-хешем, по
словарю описи.

Что войдёт

  • generator/src/clickstream_generator/inventory.py: счётчики
    наблюдаемых классов после приоритета по итоговой судьбе заказов дня;
    единица счёта — заказ, опись называет её словом (inventory.md); только
    дни с закрытым окном — при N сыгранных днях их N − 7.
  • Наблюдаемые классы стартового мира: match, cancelled,
    amount_delta — приоритет спеки §4. Классы этапа 6 не заводятся.
  • Пересборка data/world-inventory.json; тесты в generator/tests.
  • inventory.md обновить тем же PR: обещание «читатель придёт этапом 4»
    исполнено. Спека §8 обещает описи больше принятого словаря («заказы,
    выручка и счётчики классов») — привести её к словарю описи той же
    правкой: заказы и выручка ждут своего читателя.

Границы

  • Механику расхождений не менять — только счёт уже рождённого мира.
  • Классы B и D, опоздания — этап 6 (#8).
  • Стендовая сторона сверки — тикеты витрины и контура DQ.

Кому что

Счёт и тесты — Codex целиком по брифу: судьбы уже рождены, счёт
механический, словарь описи задан. Вычитка правок inventory.md и спеки —
Opus.

Сначала прочитать

  • docs/architecture/orders/inventory.md — это спека тикета;
  • мастер-спека, разделы 4 (приоритет классов) и 8;
  • generator/src/clickstream_generator/inventory.py и orders.py;
  • линт и тесты — make lint из generator/.

Проверка

  • make lint, make typecheck и make test в generator/ зелёные
    (правило testing.md для правок генератора).
  • Хеши дней и слепков в описи не изменились: мир тот же, добавлен
    только счёт.
  • Счётчики есть ровно для дней с закрытым окном; сумма классов дня
    равна числу заказов дня.
Part of #6. ## Цель Опись получает счётчики наблюдаемых классов расхождений: их читатель — DQ-проверка сверки — приходит этим этапом (обещание нарезки этапа 3, #89). Учебный результат: опора-счётчик рядом с растяжкой-хешем, по словарю описи. ## Что войдёт - `generator/src/clickstream_generator/inventory.py`: счётчики наблюдаемых классов после приоритета по итоговой судьбе заказов дня; единица счёта — заказ, опись называет её словом (inventory.md); только дни с закрытым окном — при N сыгранных днях их N − 7. - Наблюдаемые классы стартового мира: `match`, `cancelled`, `amount_delta` — приоритет спеки §4. Классы этапа 6 не заводятся. - Пересборка `data/world-inventory.json`; тесты в `generator/tests`. - inventory.md обновить тем же PR: обещание «читатель придёт этапом 4» исполнено. Спека §8 обещает описи больше принятого словаря («заказы, выручка и счётчики классов») — привести её к словарю описи той же правкой: заказы и выручка ждут своего читателя. ## Границы - Механику расхождений не менять — только счёт уже рождённого мира. - Классы B и D, опоздания — этап 6 (#8). - Стендовая сторона сверки — тикеты витрины и контура DQ. ## Кому что Счёт и тесты — Codex целиком по брифу: судьбы уже рождены, счёт механический, словарь описи задан. Вычитка правок inventory.md и спеки — Opus. ## Сначала прочитать - docs/architecture/orders/inventory.md — это спека тикета; - мастер-спека, разделы 4 (приоритет классов) и 8; - generator/src/clickstream_generator/inventory.py и orders.py; - линт и тесты — `make lint` из `generator/`. ## Проверка - [ ] `make lint`, `make typecheck` и `make test` в `generator/` зелёные (правило testing.md для правок генератора). - [ ] Хеши дней и слепков в описи не изменились: мир тот же, добавлен только счёт. - [ ] Счётчики есть ровно для дней с закрытым окном; сумма классов дня равна числу заказов дня.
ddmitry added a new dependency 2026-08-25 15:01:28 +03:00
ddmitry self-assigned this 2026-08-25 17:40:38 +03:00
Author
Owner

После реализации всплыл важный вопрос: чему именно эти счётчики учат.

Их считает сам генератор. Сверка с ними подтверждает, что данные в хранилище соответствуют рождённому миру, но для этого мы подглядываем внутрь источника. Для узкой технической проверки это допустимо. Для учебной DQ-лабы — нет: в обычном магазине такого эталона не будет.

Поэтому перед задачей #158 нужно отдельно решить:

  • учебную DQ-лабу проектировать на наблюдаемых данных магазина, без знания внутренностей генератора;
  • classes_vs_inventory либо оставить узкой технической проверкой эталонного мира, либо удалить, если отдельного технического читателя у счётчиков не найдётся;
  • не выдавать сравнение с описью генератора за учебную DQ-лабу.

Текущая реализация сохранена в отдельной ветке; в основную ветку она пока не отправляется.

После реализации всплыл важный вопрос: чему именно эти счётчики учат. Их считает сам генератор. Сверка с ними подтверждает, что данные в хранилище соответствуют рождённому миру, но для этого мы подглядываем внутрь источника. Для узкой технической проверки это допустимо. Для учебной DQ-лабы — нет: в обычном магазине такого эталона не будет. Поэтому перед задачей #158 нужно отдельно решить: - учебную DQ-лабу проектировать на наблюдаемых данных магазина, без знания внутренностей генератора; - `classes_vs_inventory` либо оставить узкой технической проверкой эталонного мира, либо удалить, если отдельного технического читателя у счётчиков не найдётся; - не выдавать сравнение с описью генератора за учебную DQ-лабу. Текущая реализация сохранена в отдельной ветке; в основную ветку она пока не отправляется.
Author
Owner

Развилка из комментария выше разобрана, решение:

  • Учебная DQ-лаба и так стоит на наблюдаемых данных магазина: даг самопроверки менти работает инвариантами против DDS-источников, оракул описи ему не нужен. Путаницу создавала одна фраза §8 — «самопроверка лабы сверки»; заменена на честного читателя.
  • classes_vs_inventory остаётся полноправным звеном конвейера и пишет в dm.dq_summary, но всюду названа технической проверкой: её оракул — опись генератора, у настоящего магазина такого оракула нет.
  • Смысл проверки шире сторожа доставки: это периметр генератора «сверху» — один инвариант ловит ошибки целыми семействами и заменяет россыпь мелких сторожей внутри кода, которую пришлось бы отбивать через AGENTS.md.

Словарь закреплён: термин «Техническая проверка» в CONTEXT.md, правки dm.md, §8 и inventory.md едут этой же веткой. Ветка разблокирована, реализация счётчиков не меняется.

Развилка из комментария выше разобрана, решение: - Учебная DQ-лаба и так стоит на наблюдаемых данных магазина: даг самопроверки менти работает инвариантами против DDS-источников, оракул описи ему не нужен. Путаницу создавала одна фраза §8 — «самопроверка лабы сверки»; заменена на честного читателя. - `classes_vs_inventory` остаётся полноправным звеном конвейера и пишет в `dm.dq_summary`, но всюду названа технической проверкой: её оракул — опись генератора, у настоящего магазина такого оракула нет. - Смысл проверки шире сторожа доставки: это периметр генератора «сверху» — один инвариант ловит ошибки целыми семействами и заменяет россыпь мелких сторожей внутри кода, которую пришлось бы отбивать через AGENTS.md. Словарь закреплён: термин «Техническая проверка» в CONTEXT.md, правки dm.md, §8 и inventory.md едут этой же веткой. Ветка разблокирована, реализация счётчиков не меняется.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Blocks
Reference: ddmitry/clickstream-data-platform#157