- Зачем: - зафиксировать состояние конвейера #5 перед долгой живой приёмкой, чтобы новая сессия продолжила без потери контекста. - Что: - в handoff добавлена дельта 23:10: обе находки FIXED (фрагменты ID с SHA-256-цепочкой), перепроверка линией B — APPROVED; - обновлено состояние стенда: им владеет сценарий приёмки; - в .scratch/issue5-run добавлены свежие отчёты, перепроверка и сценарий приёмки acceptance-issue5.sh. - Проверка: - git show --stat; лог приёмки — до строки SCRIPT_EXIT_CODE=.
130 lines
9.9 KiB
Markdown
130 lines
9.9 KiB
Markdown
# 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`, 2–3 прогона `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` — коммиты.
|