Files
clickstream-ch-kafka-supers…/.scratch/handoffs/20260722-2222-mentee-path-issue5-midflight.md
T
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

130 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Handoff: mentee-path, issue #5 в середине конвейера
Дата: 2026-07-22 22:22. Ветка: `feature/mentee-path` (запушена, ac7a973).
Фокус: дожать #5 «Инкрементальные счётчики manifest», затем корень #9.
## Уже сделано (не переделывать)
- **#4 закрыт** коммитом `ac7a973`: пульт → `world_init` (дефолт `import`),
беспараметрный `world_next_day` (`*/30 * * * *`, paused, catchup=False),
доки и контрактные тесты. Живая приёмка пройдена, детали — в
комментарии к issue #4.
- **#5 реализован исполнителем** (Codex, gpt-5.6-sol high), НЕ закоммичен —
лежит в рабочем дереве. Дизайн: счётчики засеваются при `import` из уже
прочитанного артефакта и при `backfill` из потока; `next-day` без
перечитки Kafka; катящаяся сумма = SHA-256 по модулю 2^256
(коммутативна, инкремент == полный пересчёт); артефакт в git не тронут.
`make test` (214+31) и `make lint` зелёные.
## Где мы сейчас: два адверсариальных ревью #5
Обменные файлы прогона скопированы в `.scratch/issue5-run/`
(оригиналы — в scratchpad сессии 0836e970 в /tmp/claude-1000):
мандат, отчёт исполнителя, отчёт линии B, фокус линии A.
- **Линия B (Opus, качество кода) — готова: CHANGES_REQUESTED.**
- CODE-1 (High): manifest хранит точные множества click_id/uid —
уже ~0,81 МБ на эталонном мире; лимит сообщения Kafka 1 МБ нигде
не переопределён → запись manifest упадёт примерно через один
next-day. Болезнь перенесена из чтения в потолок записи.
- CODE-2 (Low): в next-day state пишется раньше manifest (import —
наоборот); окно полупродвинутого стенда шире нужного.
- Математика суммы и legacy-валидация старого артефакта подтверждены.
- **Линия A (Codex, соответствие задаче) — ещё работала** на момент
handoff. Статус задач Codex смотреть в JSON:
`~/.claude/plugins/data/codex-openai-codex/state/clickstream-ch-kafka-superset-demo-*/jobs/*.json`
(поле status/phase). Отчёт линия A пишет в scratchpad сессии:
`review-issue5-task.md` (если появился — скопировать в
`.scratch/issue5-run/`).
## Дальше по конвейеру (договор ревью из скилла codex-subagent-playbook)
1. Дождаться линию A. Оба полных отчёта БЕЗ изменений → исполнителю
(Codex, тот же тред/задача) на пофиндинговый триаж + короткая шапка
координатора (совпадения/противоречия). CODE-1 почти наверняка — смена
представления множеств; НЕ проектировать решение за исполнителя.
2. Фикс-раунд → узкая перепроверка тем же ревьюером (линия B по CODE-1/2).
3. Живая приёмка на чистом стенде: `import`, 23 прогона `world_next_day`
с замером «день N ≈ день 1», `make generated-history-chain-check`.
4. Коммит (conventional, русский, Зачем/Что/Проверка), закрыть #5,
затем корень #9; слияние ветки обсудить с пользователем.
## Дельта 23:45 (после написания handoff)
- Линия A закончила: CHANGES_REQUESTED, TASK-1 (MAJOR) == CODE-1.
Вердикт сохранён в `.scratch/issue5-run/review-issue5-task.md`
(файл отчёта ревьюеру не дала записать read-only-песочница).
- Запущен триаж+фикс-раунд у исполнителя. Постановка:
`.scratch/issue5-run/`… нет — триаж-файл только в scratchpad сессии:
`triage-issue5.md` (скопировать в issue5-run при следующей правке).
- **Владелец рабочего дерева — задача Codex `task-mrwhhml9-6dhovo`**
(jobs-каталог плагина, см. выше). Случайный дубль
`task-mrwhilcm-qed4rr` остановлен kill'ом через ~2 мин работы —
после завершения владельца проверить дерево: `make test` и связность
«Triage round 1» в report-issue5.md; при мусоре — свежий исполнитель
от сохранённых отчётов, дерево не откатывать вслепую.
- Пустая задача `task-mrwhgn0z` — хвост старого курьера, игнорировать.
- Урок курьера: promt в задачу Codex иногда не доезжает — проверять
`request` в JSON задачи сразу после старта.
## Дельта 23:10: триаж закрыт, ревью пройдено, идёт живая приёмка
- **Триаж-раунд #5 завершён, обе находки FIXED** (детали — «Triage round 1»
в `.scratch/issue5-run/report-issue5.md`):
- CODE-1/TASK-1: точные множества ID вынесены из manifest в цепочку
контент-адресуемых фрагментов (≤10 000 ID, SHA-256-цепочка, отдельный
компактный топик `generator_startup_history_counter_chunks`); manifest
ужался до 3 КБ, максимальный фрагмент 282 КБ при явном пределе 900 КБ
с русской ошибкой; next-day пишет только новые фрагменты — O(нового дня).
- CODE-2: порядок записи всюду фрагменты → manifest → state, закреплён
тестом.
- Дерево после убитого дубля проверено координатором: `make test` — 0,
216+31 зелёные.
- **Узкая перепроверка линией B (свежий Opus): APPROVED**, отчёт —
`.scratch/issue5-run/recheck-issue5-code.md`. Некритичное (Low): топик
фрагментов пока write-only, читателя нет — проверка хеш-цепочки при
чтении не задействована. Не блокер; упомянуть в коммите/доке или
завести фоновый issue.
- **Живая приёмка #5 запущена** ~23:02: сценарий
`.scratch/issue5-run/acceptance-issue5.sh` (лог — в скретчпаде сессии,
`acceptance-issue5.log`, конец отмечен строкой `SCRIPT_EXIT_CODE=`).
Чистый стенд → лестница → импорт (прошёл за ~4 мин) → три замеренных
прогона `world_next_day` (критерий: плоское время) →
`make generated-history-chain-check`. Работает отвязанным процессом
(setsid/nohup), переживёт сессию.
- После зелёной приёмки: коммит #5 (conventional, русский,
Зачем/Что/Проверка), закрыть #5 с доказательствами, затем корень #9,
слияние ветки обсудить с пользователем.
## Уроки приёмки этой сессии (сэкономят круги)
- REST API Airflow на стенде — только session-auth: живую приёмку водить
через `docker compose exec -T airflow-scheduler airflow dags ...`
(unpause/trigger/list-runs — эквивалент кликов UI и пустой формы).
- Webserver поднимается позже парсинга DAG'ов — проверять `/login/`
циклом с ретраями, не одним запросом.
- В `dm.v_events_enriched` колонка даты — `event_date` (не event_time).
- `make superset-init` сам поднимает Superset и создаёт дашборд
(ecommerce-analytics) — отдельный make-шаг не нужен.
- Субагент `codex:codex-rescue` — только пускатель: задачу Codex он не
ждёт; мониторить JSON статуса задачи самому (фоновый bash-цикл).
- Приёмку #4 трижды ронял сам сценарий приёмки, не реализация —
проверять команды сценария на живом стенде до полного прогона.
## Состояние стенда
С 23:02 стендом владеет сценарий приёмки #5 (см. дельту 23:10): он сам
сделал `make clean`, поднял стенд и гоняет прогоны; в конце вернёт
`world_next_day` на паузу. До строки `SCRIPT_EXIT_CODE=` в логе стенд
руками не трогать.
## Остальной трекер (не трогать)
- Карта #10: фронтир #18 «Модель данных» — `/wayfinder 10` свежей сессией.
- #7, #8 ждут решения #18. #1, #2 — фоновые багфиксы UI.
## Suggested skills
- `codex-subagent-playbook` — конвейер #5 (ревью/триаж — по его договору).
- `conventional-commits` — коммиты.