docs(storage): конвенции хранилища и приём событий перед этапом 2 #52
@@ -0,0 +1,91 @@
|
||||
# Handoff: конвенции хранилища и приём событий (#37)
|
||||
|
||||
Дата: 4 августа 2026 года. Ветка: `docs/37-storage-conventions`.
|
||||
|
||||
## Что это было
|
||||
|
||||
Сессия началась с вопроса «хватает ли информации, чтобы взять #37 в работу».
|
||||
Оказалось, что нет: тикет молча опирался на конвенции хранилища, которых в
|
||||
проекте не существовало. Дальше шёл грилинг пяти развилок, затем два холодных
|
||||
ревью — по линии дефектов и по линии уместности, — затем правки по их находкам.
|
||||
|
||||
Кода не написано ни строки. Итог сессии — принятые решения и приведённые в
|
||||
соответствие постановки.
|
||||
|
||||
## Где лежат решения
|
||||
|
||||
Ничего из перечисленного здесь не пересказывается — читать по адресам:
|
||||
|
||||
- `docs/adr/0005-event-ingestion.md` — как принимаем события: чтец читает топик
|
||||
байтами, разбор идёт функциями в матвью ODS. Там же отвергнутые варианты и
|
||||
цена решения.
|
||||
- `docs/adr/0006-object-naming.md` — суффикс вида в именах объектов.
|
||||
- `docs/architecture/storage.md` — рабочий справочник: конвенции имён и
|
||||
служебных колонок, раскладка по шардам, путь в keeper, срок жизни сырья,
|
||||
свойства приёма, раскладка файлов DDL, карта таблиц.
|
||||
- `docs/specs/2026-07-30-stand-v2-realism.md` — правлены разделы 6, 7, 9, 11,
|
||||
«Витрины DM» и опорные точки для лекций.
|
||||
- `docs/specs/2026-08-01-generator.md` — раздел 4 получил контракт транспорта
|
||||
«одно событие — одно сообщение Kafka».
|
||||
- Тикеты #37 и #43 переписаны целиком; у каждого сверху комментарий с разбором
|
||||
того, что изменилось против исходной постановки, — читать `tea issues 37
|
||||
--comments`.
|
||||
|
||||
Коммит с документами — `319db30`, он же единственный на ветке помимо этого
|
||||
файла.
|
||||
|
||||
## Чего не переоткрывать
|
||||
|
||||
Всё ниже прошло грилинг с веером вариантов и записано с доводами. Если решение
|
||||
кажется странным — сначала прочитать довод, а не начинать заново:
|
||||
|
||||
- имена объектов: суффикс вида, а не префикс и не `_all`;
|
||||
- служебная колонка загрузки `_load_ts`, метаданные доставки без ведущего
|
||||
подчёркивания;
|
||||
- нарезка сырья по дню загрузки, а не по модельному дню; TTL трое суток;
|
||||
- модельного дня в STG нет вовсе;
|
||||
- формат чтеца `RawBLOB`, режим `kafka_handle_error_mode` не используется;
|
||||
- строгий приём: сверка набора ключей плюс `Nullable` на пяти опорных колонках,
|
||||
не на сорока семи;
|
||||
- источник матвью разбора — `stg.hits_raw_dist`, пишем только в `_dist`,
|
||||
`distributed_foreground_insert = 1`;
|
||||
- путь в keeper `/clickhouse/tables/{shard}/{database}/{table}`, без `{uuid}`.
|
||||
|
||||
## Что осталось
|
||||
|
||||
По убыванию веса:
|
||||
|
||||
1. **Проверки на живом стенде**, две из них внесены в раздел 11 мастер-спеки:
|
||||
`RawBLOB` даёт ровно одну строку на сообщение; форма именованного кортежа в
|
||||
`JSONExtract` с `Nullable`-членами. Не внесены, но всплыли в ревью: как
|
||||
`make up --wait` поведёт себя с одноразовым сервисом, у которого нет
|
||||
зависимых долгоживущих (существующие `airflow-init` и `superset-init`
|
||||
переживают `--wait` только за счёт зависимостей), и как аккуратнее навесить
|
||||
`distributed_foreground_insert` на путь приёма — это настройка уровня
|
||||
запроса, вероятно через профиль пользователя в конфиге.
|
||||
2. **PR не открыт.** Ветка запушена, тело PR писать с английским `Closes #NN`,
|
||||
иначе Gitea задачу не закроет (см. `docs/agents/issue-tracker.md`).
|
||||
3. **Третий холодный проход** — по желанию владельца. Оба документа переписаны
|
||||
после ревью существенно, а разделы про keeper, таблицу ошибок и свойства
|
||||
приёма ревьюеры не видели вовсе.
|
||||
4. **Реализация #37** — собственно этап, ради которого всё затевалось.
|
||||
|
||||
## Что стоит знать про ход работы
|
||||
|
||||
- Владелец правит рекомендации по существу и часто оказывается прав: из пяти
|
||||
развилок три пересматривались по его возражениям. Предлагать вариант с
|
||||
доводом, а не спрашивать «как сделать», — и быть готовым, что довод разберут.
|
||||
- Спека не выбита в камне: менять её аргументированно можно и нужно, но
|
||||
обсуждая с владельцем, а не молча.
|
||||
- Трекер — Gitea, только через `tea`, при проблемах с прокси префикс
|
||||
`NO_PROXY='*'`. Тикеты читать с `--comments`: хвосты живут там.
|
||||
- Сверка спорных API ClickHouse — через MCP Context7 до кода, не после.
|
||||
|
||||
## Suggested skills
|
||||
|
||||
- `brainstorm-with-docs` — если всплывёт новая развилка. Именно им шла эта
|
||||
сессия; формат «веер вариантов, потом конвергенция» владельцу привычен.
|
||||
- `claude-subagent-playbook` — когда #37 пойдёт в реализацию: конвейер с
|
||||
делегированием механической части и слепым ревью.
|
||||
- `conventional-commits` — обязателен при любом коммите в этом репозитории.
|
||||
- `code-review` — для ревью изменений перед приёмкой.
|
||||
Reference in New Issue
Block a user