272 Commits
Author SHA1 Message Date
ddadminandClaude Fable 5 ffd467bf43 chore(scratch): убран отработавший handoff сессии спеки v2
- Зачем:
  - handoff одноразовый (ADR-0003), работа сессии завершена: спека принята,
    v2-репозиторий рождён.
- Что:
  - удалён .scratch/handoffs/20260730-1003-spec-v2-realism-review.md.
- Проверка:
  - git status чистый.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 16:01:38 +03:00
ddadminandClaude Fable 5 dda4f3aeb5 docs(readme): стенд заморожен, развитие переехало в clickstream-data-platform
- Зачем:
  - исполнение спеки «Боевой реализм стенда» идёт в новом репозитории;
    читатель v1 должен сразу видеть, где продолжение, а спека — где её
    актуальная версия.
- Что:
  - README: блок-указатель у начала — стенд заморожен для новых фич,
    остаётся учебным, развитие в clickstream-data-platform.
  - docs/specs/2026-07-30-stand-v2-realism.md: строка «Источник истины
    переехал в v2» со ссылкой на копию спеки в новом репозитории.
- Проверка:
  - ссылки открываются, содержание спеки не менялось.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 16:00:14 +03:00
ddadminandClaude Fable 5 05e4cdea4d docs(specs): спека «Боевой реализм v2» принята владельцем (#17)
- Зачем:
  - зафиксировать вердикт владельца по трём помеченным отступлениям и
    закрыть приёмку спеки.
- Что:
  - статус Draft -> Accepted; подтверждены порядок страховочных срезов
    и VisitID как эталон самопроверки.
  - Sign взят как колонка формата без механики (всегда 1, 47-я колонка
    события); честность — комментарий в DDL, абзац в документе о
    реализме, лекционный крючок про CollapsingMergeTree.
  - в опорные точки добавлена рамка лабы сессий: сначала собрать самому,
    потом рассказ про VisitID в хитах с октября 2025.
- Проверка:
  - вычитка разделов 1.1, 1.2, 10, 12 и шапки статуса.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 15:24:50 +03:00
ddadminandClaude Fable 5 9d3a8053d3 docs(specs): закрыты находки внешнего ревью спеки v2 (#17)
- Зачем:
  - слепое ревью постановки нашло места, где исполнителю пришлось бы
    молча изобретать решение.
- Что:
  - зафиксированы: правило соединения purchaseID[1]=order_id, исключение
    declared_* из правила «деньги по бэкенду», имена массивов позиций
    dds.order, контракт присутствия всех 46 полей, класс awaiting_order
    в сверке, счётчик дельт сумм в манифесте.
  - шардирование в разделе 6 и dds.identity_map приведено к
    cityHash64 — буквально тем же выражением, что в 1.3.
- Проверка:
  - сверка правок с индексом находок ревью (SOL-1..SOL-8, кроме
    отклонённого SOL-7).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 15:04:41 +03:00
ddadminandClaude Fable 5 1fccaf8599 chore(scratch): handoff по ревью и приёмке спеки v2
- Зачем:
  - сохранить состояние сессии ревью спеки #17 на случай сбоя
    инфраструктуры (ADR-0003: handoff'ы живут в .scratch/handoffs/).
- Что:
  - добавлена записка 20260730-1003: состояние спеки, открытые вопросы
    владельцу, рецепт запуска ревью Сола, грабли с 529.
- Проверка:
  - чтение записки в свежей сессии по шагам раздела «Дальше».

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 15:00:49 +03:00
ddadminandClaude Fable 5 247ab72d26 docs(specs): добавлен черновик спеки «Боевой реализм стенда v2» (#17)
- Зачем:
  - собрать резолюции карты #10 (#14, #15, #16, #18) в одну целевую
    картину v2 и защитить черновик от потери до конца ревью.
- Что:
  - создана docs/specs/2026-07-30-stand-v2-realism.md (статус Draft):
    широкое событие, заказы слепками, кластер 2×1, анонимность и склейка,
    карта слоёв, оценка объёма и этапы для /to-tickets.
  - внесены правки четырёх волн ревью (сверка с резолюциями, грилинг,
    вычитка, правки владельца); внешнее ревью ещё идёт.
- Проверка:
  - вычитка документа; вердикт владельца по трём помеченным отступлениям —
    перед сменой статуса на Accepted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 15:00:36 +03:00
ddadmin 1fdc7be733 docs(adr): дом разработки — Gitea, GitHub — одностороннее зеркало
- Зачем:
  - вопрос о доме репозитория и трекера висел без решения после блокировки
    GitHub-аккаунта; своя площадка выигрывает по существу, а не только как
    вынужденная мера.
- Что:
  - добавлен ADR-0007: активная разработка в Gitea, GitHub — публичное
    зеркало кода (push-mirror, направление одно).
  - зафиксировано, что issues не зеркалируются, а durable-часть (спеки, ADR,
    история коммитов) уезжает в зеркало вместе с кодом.
  - репозиторий v2 создаём сразу в Gitea.
- Проверка:
  - чтением docs/adr/0007-gitea-as-development-home.md.
2026-07-29 21:49:47 +03:00
ddadmin 772a6c48c7 chore(scratch): handoff по настройке трекера на Gitea
- Зачем:
  - продолжение работы в новой сессии: контракт трекера переписан,
    граф блокировок карты #10 восстановлен, часть веток не влита.
- Что:
  - добавлен .scratch/handoffs/20260729-2125-gitea-tracker-tea-setup.md
    с состоянием карты, списком хвостов и подсказками по скиллам.
- Проверка:
  - текст читается, ссылки на docs/ и на трекер ведут в существующие места.
2026-07-29 21:32:05 +03:00
ddadmin 6c9d986114 docs(agents): контракт трекера переведён на Gitea и CLI tea
- Зачем:
  - GitHub-аккаунт заблокирован, работа идёт в Gitea на git.dementev.space,
    а инструкции для агентов всё ещё описывали GitHub Issues и gh.
- Что:
  - docs/agents/issue-tracker.md переписан под Gitea и tea 0.15.0: установка,
    вход, скоупы токена, обход прокси, команды для issues/комментариев/меток;
  - блокировки переведены на нативные зависимости Gitea через tea api,
    текстовые строки Blocked by из тел тикетов убраны;
  - GitHub ушёл одной строкой в раздел «Архив»;
  - docs/agents/triage-labels.md и блок «Agent skills» в AGENTS.md
    переобвязаны на Gitea.
- Проверка:
  - tea issues list, tea labels list — читают трекер;
  - граф блокировок карты #10 собран заново и прочитан обратно через
    tea api repos/{owner}/{repo}/issues/<n>/dependencies.
2026-07-29 21:32:05 +03:00
ddadminandClaude Fable 5 2e42cf63ff chore(scratch): сохранены слепок трекера и handoff миграции на Gitea
- Зачем:
  - GitHub-аккаунт заблокирован 2026-07-26; трекер карты «боевой
    реализм» перенесён на git.dementev.space, контекст нужен новой
    сессии независимо от исхода апелляции.
- Что:
  - .scratch/backup/ — слепок всех 27 issues и резолюция тикета #15
    на момент блокировки;
  - .scratch/handoffs/ — handoff с состоянием карты, нюансами доступа
    к Gitea и списком хвостов (апелляция, выбор основного трекера).
- Проверка:
  - тексты читаются; ссылки на Gitea-трекер открываются
    (git.dementev.space/ddmitry/clickstream-ch-kafka-superset-demo).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 22:03:00 +03:00
Dmitry DementievandClaude Fable 5 95599ead29 Merge branch 'research/yandex-clickstream-format'
Исследование формата кликстрима Яндекса для решения по модели данных (#18, #27).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 18:53:00 +03:00
Dmitry Dementiev e6e34f2605 docs(docs): добавлено исследование формата кликстрима Яндекса
- Зачем:
  - владелец стенда выбирает целевую модель данных (тикет #27):
    оставлять четыре топика со склейкой или перейти на одно широкое
    событие по образцу Яндекса
- Что:
  - добавлен docs/research/2026-07-26-yandex-clickstream-format.md
  - разобран Logs API Метрики: хиты и визиты, состав полей, массивы,
    метки времени, идентификаторы, ограничения выгрузки
  - разобрана форма доставки: батч через Logs API (TSV) и поток
    только в Метрике Про через Yandex Data Transfer, задержка до 15 минут
  - разобраны AppMetrica (event_json, Data Stream), ecommerce и выручка,
    схемы hits_v1/visits_v1 из документации ClickHouse
  - дано сравнение со Snowplow, Segment и Amplitude
  - зафиксирован вывод: плоское ядро с массивами, список 53 полей
    для широкого события и перечень того, что копировать не стоит
- Проверка:
  - каждое утверждение со ссылкой на первоисточник
  - DDL hits_v1/visits_v1 сверен через MCP Context7 (/clickhouse/clickhouse-docs)
  - неподтверждённое вынесено в отдельный раздел
2026-07-26 18:27:46 +03:00
ddadminandGitHub 1961128cf1 Merge pull request #26 from dementev-dev/feature/prune-prose-tests
test: вычистка прозаических тестов из test_world_dags_contract.py
2026-07-23 18:44:48 +03:00
ddadminandClaude Fable 5 271f1afdb3 test(generator): вычищены прозаические тесты из контракта DAG
Тесты на дословные фразы документов и комментариев удалены: прозу
сторожит ревью, а не pytest. Оставлены структурные инварианты (порядок
задач, монтирования, версии, живые перекрёстные ссылки). В шапке файла —
критерий «инвариант должен переживать честную переписку текста».

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 18:41:09 +03:00
ddadminandClaude Opus 4.8 4861d20313 chore(scratch): убран отработавший handoff прогона #7
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 18:32:10 +03:00
ddadminandGitHub b8485474ba Merge pull request #25 from dementev-dev/feature/course-labs-redesign
Редизайн лаб курса: путь import, лабы next-day и continue (#7)
2026-07-23 18:31:17 +03:00
ddadminandClaude Opus 4.8 b2ca38a1d2 chore(scratch): handoff закрыт — прогон #7 завершён, PR #25
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 18:18:19 +03:00
ddadminandClaude Opus 4.8 8f03d8b347 docs(course): маркеры «сверить-на-стенде» заменены живыми числами (#23)
Зачем: тикет #23 — каждое цитируемое число курса сверено с живым
стендом; до этого в уроках стояли заглушки.

Что:
- уроки 00–04: 18 маркеров заполнены числами свежего импорта
  (280 437 событий, нули в таблицах ошибок, счётчики ODS/DDS);
- лаба 07: таблица manifest после дня 4 (374 092 / 34 801 / 5 388),
  переходящие визиты по стыкам (35/22/26), числа после дня 5;
- лаба 08: каноническая граница трёх дней, пример замера свежести
  (лаг 3:45 модельного времени до догона, ETL ~29 с) и вернувшегося
  пользователя; две живые поправки разбора времени: убран
  принудительный UTC в разборе STG и суффикс +00:00 в сравнении
  границы (ловились только на живом стенде).

Проверка: детерминизм подтверждён двумя независимыми циклами
сброс→импорт→инкремент (числа manifest и checksum_sha256 дней 4 и 5
совпали бит в бит); chain-check зелёный; сценарий лабы 08 прогнан
вживую, включая стоп/продолжение и красный full_refresh=false из
урока 4; grep «сверить-на-стенде» пуст; ссылки и якоря целы;
make test (219+31) и make lint зелёные; /ai-text-lint по лабам — без
существенных находок.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 18:15:46 +03:00
ddadminandClaude Opus 4.8 cbf8b2d770 fix(course): правки по итогам слепого ревью лаб 07/08 (#22)
Зачем: два слепых ревью (Codex CODE-1..9, Claude TASK-1..2) и
перепроверки нашли дефекты в лабах и метадоках; финал лабы 08
переделан по решению пользователя.

Что:
- канонический сброс в README курса теперь снимает DAG'и с паузы
  (все создаются на паузе);
- имя дашборда исправлено на «E-commerce Analytics Dashboard»;
- финал лабы 08: вместо мифа «users == sessions на статике» —
  вернувшийся пользователь через границу заморозки и измеренное
  обещание свежести; §2 велит записать границы и время (§6 их требует);
- CONTEXT.md: эталонный мир — замороженный живой,
  4 056 пользователей / 26 083 визита, возвраты уже есть;
- уроки 5–6 ведут в обязательный маршрут, живое упражнение
  урока 5 требует канонический сброс;
- контрактные тесты: убран якорь на удалённую команду; добавленные
  на триаже тесты-цитаты срезаны до устойчивых инвариантов
  (прозаический легаси-жанр — issue #24);
- handoff обновлён до текущего состояния.

Проверка: make test (219 generator + 31 contract) и make lint зелёные;
SQL вернувшегося пользователя проверен на эфемерном ClickHouse 25.1
(на полном наборе — в #23).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 14:48:02 +03:00
ddadminandClaude Opus 4.8 1dd79a3287 docs(course): лабы 07 (next-day) и 08 (continue) + метадокументы (#22)
Зачем: два новых режима роста мира не имели уроков, а метадокументы
курса не знали о новом маршруте.

Что: лаба 07 «Следующий день и границы времени» — инкремент дня,
сверка manifest, переходящие визиты запросом в dds.event, включение
расписания на один запуск, цена роста full_refresh; лаба 08 «Живой
поток и свежесть данных» — расслоение свежести слоёв, стоп/продолжение
генератора, users < sessions, врезка про модельное время; LEARNING_PLAN
и README курса согласованы с маршрутом 0–8; в CONTEXT.md починена
ссылка «урок 7» (теперь ведёт на врезку лабы 08). Числа со стенда
помечены маркером «сверить-на-стенде».

Проверка: обе лабы по шаблону LESSON_STANDARD (6 секций, явный «верни
как было»); внутренние ссылки разрешаются; git diff --check чистый.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 13:36:30 +03:00
ddadminandClaude Opus 4.8 cc1cffe2f3 docs(course): каркас курса и переобвязка уроков 0–6 на путь import (#21)
Зачем: после редизайна пути менти курс ссылался на старый путь
generated-history-analytics/backfill и не проходился по новому стенду.

Что: в README курса — единый блок подготовки и канонического сброса
(make clean -> make up + ddl_init/world_init -> make superset-init),
таблица уроков дополнена лабами 07–08 («в работе»); LESSON_STANDARD и
уроки 0–6 ссылаются на канонический блок; урок 1 переведён на дозаливку
через world_next_day (кнопкой-анонсом, цена в минутах названа); урок 4 —
лесенка DAG-ов; урок 5 — словарь «база import / живой поток»; урок 6
обязателен; цифры старого мира помечены маркером «сверить-на-стенде».

Проверка: grep по generated-history-analytics/backfill в docs/course/
пуст; правки только в docs/course/; git diff --check чистый.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 13:22:41 +03:00
ddadminandClaude Opus 4.8 b57a4e2292 docs(course): спека редизайна лаб курса под три режима менти
- Зачем:
  - курс целиком сидит на старом пути backfill и после редизайна
    пути менти (issue #9) не заработает; issue #7 требует постановки
- Что:
  - спека docs/specs/2026-07-23-course-labs-redesign.md: урок 6
    становится обязательным, две обязательные лабы 07 (next-day:
    инкремент и границы дня) и 08 (continue: живой поток и свежесть),
    канонический сброс через import, вердикты по урокам 0-6 и метадокам
  - handoff для продолжения работы в новой сессии
- Проверка:
  - адверсарное ревью спеки против кода и доков: 8 находок внесены
    решениями, повторная проверка ревьюером — все закрыты

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 12:57:57 +03:00
ddadminandClaude Opus 4.8 48ca1c4f72 docs(operations): заметка про JS-ошибку Grid при истёкшем сеансе
- Зачем:
  - триаж issue #2: ошибка `p.dagRuns is undefined` — баг UI Airflow 2.10.x
    (в `useGridData.ts` нет проверки формы ответа), а спусковой крючок —
    потеря сеанса: `/object/grid_data` отдаёт HTML страницы входа.
- Что:
  - в docs/OPERATIONS.md (Troubleshooting) добавлен симптом, причина и что делать.
- Проверка:
  - curl -sL http://localhost:8080/object/grid_data?dag_id=... без cookie
    отдаёт 200 text/html со страницей входа.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 11:58:21 +03:00
ddadminandClaude Fable 5 1639d348dc fix(superset): переименована cookie сессии — убран взаимный разлогин с Airflow
- Зачем:
  - Airflow и Superset на localhost делили cookie `session` (порты браузер
    не различает) и затирали сессии друг друга — менти разлогинивало за минуты (issue #1).
- Что:
  - в configs/superset_config.py задано SESSION_COOKIE_NAME = 'superset_session';
  - удалена мёртвая строка SESSION_TYPE = 'filesystem' (без SESSION_SERVER_SIDE не работала);
  - в docs/OPERATIONS.md (Troubleshooting) добавлена заметка: симптом, причина, решение.
- Проверка:
  - curl -si http://localhost:8088/login/ отдаёт superset_session=, :8080 — session=;
  - make contract-test: 31 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 11:49:31 +03:00
ddadminandGitHub 6a726cf810 Merge pull request #19 from dementev-dev/feature/mentee-path
Редизайн пути менти: мир из артефакта и две ветки роста
2026-07-23 11:09:49 +03:00
ddadmin 897dfc67bd chore(scratch): убраны обменные файлы прогона #5 и отработавший handoff
- Зачем:
  - фича mentee-path завершена (#9 закрыт), одноразовые артефакты
    конвейера своё отслужили; в дифф PR им попадать незачем.
- Что:
  - удалён каталог .scratch/issue5-run (отчёты ревью и приёмки прогона);
  - удалён handoff 20260722-2222-mentee-path-issue5-midflight.md.
- Проверка:
  - git log: содержимое остаётся в истории (f4971e9, ceb30a9).
2026-07-22 23:52:50 +03:00
ddadminandClaude Fable 5 103ac021c8 feat(generator): инкрементальные счётчики manifest без перечитки Kafka
- Зачем:
  - world_next_day перечитывал всю историю топиков Kafka ради
    накопительных счётчиков — время прогона росло с возрастом мира
    (issue #5, находка F9).
- Что:
  - счётчики засеваются при import из уже прочитанного артефакта и при
    backfill из потока; next-day продвигает их только событиями нового
    дня, полного чтения Kafka больше нет;
  - катящаяся контрольная сумма — сумма SHA-256 событий по модулю 2^256
    (инкремент равен полному пересчёту), старый формат артефакта
    принимается без изменений;
  - точные множества click_id/user_domain_id вынесены из manifest в
    цепочку контент-адресуемых фрагментов (<=10 000 ID, SHA-256-цепочка,
    отдельный топик counter_chunks) — потолок сообщения Kafka не грозит,
    предел 900 000 байт проверяется явно с понятной ошибкой;
  - порядок записи всюду: фрагменты -> manifest -> state; старое локальное
    состояние отклоняется с подсказкой перезапустить import;
  - документация manifest/state обновлена (ARCHITECTURE, OPERATIONS,
    runbook startup-history).
- Проверка:
  - make test (216+31) и make lint зелёные;
  - живая приёмка на чистом стенде: import 235 с; три прогона
    world_next_day — 716/718/716 с (плоское время, O(нового дня));
    мир 3->6 дней, 561 942 события; make generated-history-chain-check —
    все порции и стыки однородны;
  - тест равенства инкремента и полного пересчёта:
    test_incremental_counters_equal_full_recompute.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 23:47:02 +03:00
ddadmin f4971e94ca docs(scratch): handoff — триаж #5 закрыт, ревью APPROVED, идёт приёмка
- Зачем:
  - зафиксировать состояние конвейера #5 перед долгой живой приёмкой,
    чтобы новая сессия продолжила без потери контекста.
- Что:
  - в handoff добавлена дельта 23:10: обе находки FIXED (фрагменты ID
    с SHA-256-цепочкой), перепроверка линией B — APPROVED;
  - обновлено состояние стенда: им владеет сценарий приёмки;
  - в .scratch/issue5-run добавлены свежие отчёты, перепроверка и
    сценарий приёмки acceptance-issue5.sh.
- Проверка:
  - git show --stat; лог приёмки — до строки SCRIPT_EXIT_CODE=.
2026-07-22 23:11:44 +03:00
ddadminandClaude Fable 5 ceb30a95c0 docs(scratch): handoff дополнен дельтой — триаж #5 в полёте, владелец задачи
- Зачем:
  - пользователь делает compaction прямо сейчас; свежие детали конвейера
    ещё нигде не были записаны.
- Что:
  - дельта: вердикт линии A, запуск триаж-раунда, владелец дерева —
    задача Codex mrwhhml9, остановленный дубль и как проверить дерево.
- Проверка:
  - чтение раздела «Дельта 23:45» свежим взглядом.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:39:21 +03:00
ddadminandClaude Fable 5 1252f4a2c0 docs(scratch): handoff — #5 в середине конвейера, известные находки ревью
- Зачем:
  - подстраховать продолжение работы в новой сессии: #5 реализован,
    но не закоммичен, два ревью в полёте.
- Что:
  - новый handoff с состоянием конвейера #5 (CODE-1 High про лимит
    Kafka, порядок триажа) и уроками приёмки этой сессии;
  - отработанный handoff от 20:29 удалён по ADR-0003;
  - обменные файлы прогона #5 скопированы в .scratch/issue5-run/
    (без коммита — локальная копия на случай потери /tmp).
- Проверка:
  - git show --stat HEAD; чтение handoff свежим взглядом.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 22:23:07 +03:00
ddadminandClaude Fable 5 ac7a973504 feat(airflow): пульт стал world_init, добавлен DAG world_next_day (#4)
- Зачем:
  - список DAG'ов должен читаться лесенкой ddl_init → world_init →
    world_next_day, а путь менти — проходиться пустыми формами
    (issue #4, спека редизайна пути менти, решения 2–3).
- Что:
  - generator_control переименован в world_init, дефолт операции —
    import; next-day ушёл из выпадашки в отдельный DAG;
  - новый беспараметрный world_next_day: расписание */30 * * * *,
    создаётся на паузе, catchup=False, max_active_runs=1; общие
    задачи вынесены в airflow/dags/utils/startup_history_tasks.py;
  - доки и контрактные тесты обновлены синхронно; быстрый старт
    README — без make ddl, схему создаёт DAG ddl_init.
- Проверка:
  - make test (210 + 31) и make lint зелёные;
  - живая приёмка на чистом стенде: world_init пустой формой
    импортировал эталонный мир за 217 с (3 дня, 280 437 событий),
    world_next_day после снятия с паузы добавляет ровно один день
    за прогон, дашборд Superset собирается.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 21:45:02 +03:00
ddadmin 76ff669cf7 docs(scratch): handoff обновлён — фокус на добивание mentee-path (#4, #5)
- Зачем:
  - следующая сессия после compaction продолжает конвейерное
    исполнение фичи; нужен свежий вход без потери уроков приёмки #3.
- Что:
  - новый handoff 20260722-2029: порядок #4#5, уроки приёмки,
    сводная карта работ (карта #10 и бэклог ждут решения #18).
  - удалены два отработанных handoff'а (одноразовые по ADR-0003).
- Проверка:
  - cat .scratch/handoffs/20260722-2029-finish-mentee-path.md
2026-07-22 20:29:48 +03:00
ddadminandClaude Fable 5 65cb88fa4f docs(scratch): handoff — issues 6 и 3 закрыты, карта боевого реализма
- Зачем:
  - зафиксировать точку продолжения: фронтир фичи (#4, #5) и фронтир
    карты (#18 «Модель данных») для следующей сессии.
- Что:
  - handoff 20260722-1913: итоги по issues #6/#3, эталонный мир в git,
    карта wayfinder #10 с тремя закрытыми тикетами, состояние стенда,
    грабли WSL.
- Проверка:
  - не требуется (одноразовый документ по ADR-0003).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 19:14:35 +03:00
ddadminandClaude Fable 5 068d96ff0e docs(realism): границы применимости генератора кликстрима
- Зачем:
  - менти должен понимать, какой опыт со стенда переносится на бой
    напрямую, а какой требует поправки на учебные упрощения
    (тикет «Реализм генератора» карты боевого реализма, issue #11).
- Что:
  - docs/generator-realism.md: что честно как в бою (схема, воронка,
    сессии, суточная волна, обвязка) и что упрощено (четыре топика,
    только pageview, клонированные пользователи, нет «грязи», масштаб);
  - ссылка на документ в списке документации README.
- Проверка:
  - make test (210 + 31) зелёный.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 19:10:16 +03:00
ddadminandClaude Fable 5 10ee1a1cb6 feat(generator): эталонный мир в git и import по умолчанию
- Зачем:
  - менти собирал мир генерацией (минуты и десятки минут CPU); теперь
    готовый трёхдневный мир загружается импортом за ~2 минуты, и числа
    у всех менти совпадают число-в-число (issue #3).
- Что:
  - артефакт data/startup_history/reference-world.json.xz в git:
    3 модельных дня daily-wave, ~850 МБ JSON → 32 МБ xz;
  - чтение и запись артефакта понимают .xz потоково (lzma); пустое поле
    artifact_path в пульте и make startup-history-import читают эталон;
  - длительность профиля daily-wave стала 3d — в тон эталонному миру;
  - предпроверка чистого стенда ставит зависимости генератора через uv;
    экспорт и импорт разведены отдельными переменными Makefile;
  - доки и runbook обновлены; новые контрактные тесты: xz round-trip
    и дефолтные пути артефакта.
- Проверка:
  - make test (210 + 31) и make lint зелёные; импорт на чистом стенде
    за 2м03с, manifest совпал (280437 событий), Superset-проверка
    зелёная; независимое ревью — APPROVED.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 18:49:02 +03:00
ddadminandClaude Fable 5 b87dde79b7 feat(generator): дефолт профиля — daily-wave, ci стал служебным
- Зачем:
  - менти доставался плоский тестовый профиль ci; учебный профиль
    должен быть один — daily-wave с суточной волной (issue #6).
- Что:
  - дефолт daily-wave во всех точках: форма пульта generator_control,
    launch.py (API и CLI), Config, Makefile, четыре shell-скрипта.
  - автопроверки передают ci явно; контрактный тест пульта теперь
    проверяет сам дефолт Param профиля (через AST), а не подстроку.
  - доки в том же изменении: README, OPERATIONS, TEST_PLAN,
    generator/README, runbook startup-history.
- Проверка:
  - make test (206 + 31 passed) и make lint — зелёные.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 17:16:07 +03:00
ddadmin 5791d42db8 docs(scratch): handoff — багфиксы F5/F4 заведены как issues #1 и #2
- Зачем:
  - handoff должен отражать, что уже в трекере, а что осталось завести.
- Что:
  - список «не забыть» сокращён: #1 и #2 созданы, остались лабы и
    инкрементальный ETL.
- Проверка:
  - gh issue list — два открытых issue.
2026-07-19 23:25:11 +03:00
ddadmin 1f7ed5e932 docs(scratch): в handoff добавлен техдолг инкрементального ETL
- Зачем:
  - full_refresh на каждый world_next_day пересчитывает весь мир —
    с ростом мира это следующее узкое место после счётчиков manifest.
- Что:
  - в список issues «не забыть» добавлен инкрементальный ETL со ссылкой
    на legacy-план plans/incremental-etl-v2.md.
- Проверка:
  - вычитка handoff.
2026-07-19 23:23:40 +03:00
ddadmin 7bc7a128be docs(scratch): handoff обновлён — спека готова, дальше issues
- Зачем:
  - следующая сессия должна стартовать от актуальной точки.
- Что:
  - раздел «Что дальше» переписан: спека и контракт трекера сделаны,
    остались issues и конвейер задач.
- Проверка:
  - вычитка handoff.
2026-07-19 23:21:11 +03:00
ddadmin 8c68d6cd73 docs(specs): спека уточнена после проверки свежим взглядом
- Зачем:
  - три обещания спеки расходились с фактами кода и замеров HITL.
- Что:
  - в путь менти возвращён шаг make superset-init; критерий «терминал
    только make up» поправлен честно.
  - критерий стоимости world_next_day сужен до генерации+manifest:
    ETL full_refresh растёт с миром — явно вынесен в «чего не делаем».
  - проверка профиля ×1 уточнена: runtime-seam уже на daily-wave,
    проверять надо дефолты launch.py и автотесты.
- Проверка:
  - сверка с scripts/run_generated_history_runtime_check.sh, Makefile
    и замерами HITL (ETL 30 с на 110k событий).
2026-07-19 23:20:44 +03:00
ddadmin d6e7a03032 docs(specs): спека редизайна пути менти — мир из артефакта и две ветки
- Зачем:
  - находки ручного HITL 2026-07-19 требовали проектного решения: путь
    менти через backfill медленный, бедный и путаный; нужна база import
    эталонного мира и две ветки роста.
- Что:
  - спека docs/specs/2026-07-19-mentee-path-redesign.md: целевая модель
    (import + next-day + continue), эталонный 3-дневный мир в git (xz),
    переименование пульта в world_init с дефолтом import, отдельный
    world_next_day, инкрементальные счётчики manifest, один учебный
    профиль; форма работ — 4 дочерних issue.
  - CONTEXT.md: термины «мир (стенда)», «эталонный мир», «три режима
    менти».
  - .scratch/hitl-findings.md восстановлен из среза 0e312b3 как рабочий
    материал фичи (до разбора в issues).
- Проверка:
  - вычитка против hitl-findings и решений обсуждения 2026-07-19.
2026-07-19 23:18:17 +03:00
ddadmin 79a3d07cb1 docs(agents): трекер задач переведён на GitHub Issues
- Зачем:
  - пилот нативного трекера на фиче mentee-path: спека в git как
    источник истины, тонкий корневой issue, дочерние issues-постановки.
- Что:
  - docs/agents/issue-tracker.md переписан с локального markdown на
    GitHub Issues (gh CLI, правило тонкого корневого issue, архив
    старых задач — в истории git, срез 0e312b3).
  - triage-метки стали настоящими метками GitHub (созданы в репозитории),
    AGENTS.md обновлён.
- Проверка:
  - gh label list — пять канонических меток на месте.
2026-07-19 22:37:25 +03:00
ddadmin de7f62cbab chore(scratch): уборка одноразовых материалов и handoff новой фичи
- Зачем:
  - после слияния feature/data-generator одноразовые материалы .scratch
    (задачи 01-21, PRD, журналы, старые handoff'ы) больше не нужны:
    долговечное живёт в docs/, история — в git (срез 0e312b3).
- Что:
  - удалено всё содержимое .scratch (50 файлов).
  - добавлен handoff 20260719-2229-mentee-path-start.md: направление
    редизайна пути менти (4 задачи) и пилот GitHub Issues.
- Проверка:
  - git show --stat; в .scratch остался только новый handoff.
2026-07-19 22:29:44 +03:00
ddadmin 0e312b3c6c Merge ветки feature/data-generator в main 2026-07-19 22:21:27 +03:00
ddadmin fc3cf5bbc3 docs: ARCHITECTURE и REPO_MAP догнали ветку генератора
- Зачем:
  - перед слиянием в main документация должна совпадать с кодом:
    ARCHITECTURE.md и REPO_MAP.md не знали про операцию next-day,
    каталог generator/ и семь новых скриптов.
- Что:
  - в ARCHITECTURE.md операция next-day добавлена в описание DAG
    generator_control (три места).
  - в REPO_MAP.md добавлены раздел Generator и семь скриптов
    стартовой истории; описание generator_control дополнено.
- Проверка:
  - make lint — зелёный; сверка списков с airflow/dags и scripts/.
2026-07-19 22:21:21 +03:00
ddadmin bec56da1c3 fix(airflow): необязательные поля формы generator_control стали необязательными
- Зачем:
  - форма Trigger DAG требовала заполнить все поля: канонический запуск
    «выбрать профиль, остальное пусто» через UI был невозможен (находка F1
    ручного HITL); артефакты backfill (data/*.json, 49 МБ) рисковали
    попасть в коммит.
- Что:
  - пять необязательных Param переведены на Param(None, type=["null",
    "string"]) — идиома необязательного поля, проверено по Context7
    (Airflow 2.10.5); все места чтения уже None-безопасны (or "").
  - контрактный тест дополнен: у необязательных Param есть "null" в type,
    у operation/profile — нет.
  - .gitignore: правило data/*.json (сиды data/*.jsonl остаются под git);
    задача 21 закрыта в .scratch.
- Проверка:
  - make test (205 + 31 passed) и make lint — зелёные.
2026-07-19 22:17:50 +03:00
ddadminandClaude Opus 4.8 91d15e60a0 docs(generator): находки ручного HITL пути менти и handoff
- Зачем:
  - долг ручной HITL-проверки пути менти переносился пятый handoff подряд;
    проверка вскрыла набор находок и наметила редизайн пути менти.
- Что:
  - добавлены находки HITL (F1-F9) с рамочной моделью трёх режимов менти:
    import-база, ветки next-day и continue, под каждую — свой урок/лаба.
  - зафиксированы решения: 3-дневный артефакт на daily-wave, сжатие xz,
    один учебный профиль, беспараметрный next-day, инкрементальные счётчики.
  - добавлен handoff по ADR-0003 с планом раскладки находок в постановки.
- Проверка:
  - чтение .scratch/generator-model-time-startup-history/hitl-findings.md
    и .scratch/handoffs/20260719-2144-hitl-mentee-path-redesign.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 21:52:12 +03:00
ddadminandClaude Fable 5 842c1be98c docs(generator): handoff сессии — задача 13 закрыта, дальше расписание
- Зачем:
  - передать контекст новой сессии: конвейер задачи 13 завершён, следующие
    шаги — задача про расписание, HITL-проверка пути менти, уроки плейбука.
- Что:
  - добавлен handoff 20260712-2359 (итоги конвейера, состояние стенда,
    план и отклонения процесса).
  - убран отработанный handoff 20260712-2015 (одноразовый по ADR-0003).
- Проверка:
  - вычитка handoff'а; ссылки на задачу 13 и коммиты f5dee26/540989d.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 00:00:40 +03:00
ddadminandClaude Fable 5 f5dee26eda feat(generator): глагол next-day — следующий модельный день от слепка
- Зачем:
  - режим кормления стенда порциями: менти триггерит «следующий день»,
    видит полный цикл DWH за один шаг (задача 13, вариант 2 — генерация
    от слепка T_end).
- Что:
  - новый ограниченный режим next-day: восстановление мира из state,
    генерация ровно [T_end, T_end+24h), публикация данные -> state ->
    манифест (манифест — точка фиксации, автоотката нет).
  - операция next-day в DAG generator_control: своя предпроверка границы
    вместо clean-guard, идемпотентность через параметр expected_t_end.
  - цепочка границ — накопительное поле boundaries в манифесте, старый
    формат читается как [T0, T_end]; импорт не изменён.
  - новая проверка цепочки (make generated-history-chain-check): непарные
    счётчики и однородность по каждой границе, явный статус нулевого
    стыка, хвост за границей по всем четырём топикам, литералы в UTC
    с микросекундами.
  - документация OPERATIONS.md: глагол, предпроверка, восстановление
    после сбоя, ограничение retention; в задаче 13 — решения двух слепых
    ревью постановки и кода с аргументами отклонений.
- Проверка:
  - make test: 204 теста генератора + 31 контракт корня, зелёные.
  - make generated-history-chain-check: зелёный, 2 внутренние границы,
    непарные счётчики нулевые; учебный цикл: DM 322 -> 10026 -> 19196
    за два next-day подряд.
  - make generated-history-runtime-check (регрессия задачи 20): зелёный.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 23:53:48 +03:00
ddadminandClaude Fable 5 540989d358 docs(generator): постановка задачи 13 доработана после двойного ревью
- Зачем:
  - два слепых ревью постановки (Codex и Claude) вернули CHANGES_REQUIRED:
    guard чистого стенда противоречил доливке, не были заданы механизм
    идемпотентности, точка фиксации, формат цепочки границ и проверки.
- Что:
  - добавлен раздел «Решения по ревью постановки»: next-day как новый
    ограниченный режим, день = [T_end, T_end+24h), предпроверка границы,
    параметр expected_t_end, манифест как точка фиксации, поле boundaries,
    батчевый режим проверки цепочки, расписание вынесено в отдельную задачу.
  - критерии приёмки финализированы (были черновыми), добавлен раздел
    «Границы (что не трогать)», исправлены ссылки на строки кода.
- Проверка:
  - вычитка задачи; факты сверены обоими ревьюерами по коду ветки
    (индексы находок — в обменном каталоге сессии).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 22:30:56 +03:00