Кластер ClickHouse как единственный режим стенда: две ноды по одному шарду и отдельный clickhouse-keeper. Образ зафиксирован точным LTS-выпуском 26.3.17.56, серверы и keeper берут одну переменную и разъехаться не могут. Порты открыты только на 127.0.0.1.
Роли нод заложены сразу, как требует спека: clickhouse-01 — инициатор DDL и будущая точка Airflow, clickhouse-02 — будущий Superset. Записаны и в README, и комментариями рядом с сервисами в compose.
make smoke — восемь проверок ON CLUSTER одной командой, вывод по-русски. make smoke-guards — три проверки самой smoke-команды: аварийная очистка ограничена по времени, прерывание обрабатывается, keeper работает от непривилегированного пользователя.
Проверка
make up && make smoke && make smoke-guards && make clean
Холодный старт — 11,7 с, три контейнера здоровы. Smoke — 8/8, guards — 3/3.
Кластер в покое занимает 0,49 ГБ при заложенных спекой +0,6–0,8 ГБ.
Как это ревьюировали
Реализация — Codex, дальше саморевью своим же диффом, затем независимое слепое ревью, триаж находок и узкая перепроверка тем же ревьюером.
Ревьюер поднимал стенд и ломал его нарочно. Найдено девять расхождений: главное — при упавшей ноде smoke молча висел 362 секунды, и Ctrl-C не помогал. Стало 107–118 мс, а при падении ноды посреди прогона — 13 с с ограниченной уборкой. Четыре проверки печатали больше, чем доказывали: теперь каждая умеет краснеть, что подтверждено подставными таблицами (например, Distributed с ключом по сырому ClientID роняет проверку ключа шардирования). Keeper работал от root с лимитом в 1024 дескриптора — стало clickhouse и 262144.
Одна находка отклонена с доводом: пустые каталоги /clickhouse/tables/{shard} в keeper — общее пространство имён будущих таблиц, а не мусор проверки; удалять их после smoke было бы вредной привычкой. Довод признан верным при перепроверке.
Конфигурация сверена через Context7 с актуальной документацией ClickHouse 26.x — ничего устаревшего или переименованного.
Что вынесено дальше
Три наблюдения перенесены в #13 (healthcheck проверяет живость, а не готовность кластера; CLICKHOUSE_SKIP_USER_SETUP молча проглотит будущий пароль; потолок 1 ГБ на ноду), одно — в #4 (путь в keeper без {database} столкнётся, если рабочие DDL скопируют шаблон).
Закрывает #12.
## Что сделано
Кластер ClickHouse как единственный режим стенда: две ноды по одному шарду и отдельный clickhouse-keeper. Образ зафиксирован точным LTS-выпуском `26.3.17.56`, серверы и keeper берут одну переменную и разъехаться не могут. Порты открыты только на `127.0.0.1`.
Роли нод заложены сразу, как требует спека: `clickhouse-01` — инициатор DDL и будущая точка Airflow, `clickhouse-02` — будущий Superset. Записаны и в README, и комментариями рядом с сервисами в compose.
`make smoke` — восемь проверок ON CLUSTER одной командой, вывод по-русски. `make smoke-guards` — три проверки самой smoke-команды: аварийная очистка ограничена по времени, прерывание обрабатывается, keeper работает от непривилегированного пользователя.
## Проверка
```
make up && make smoke && make smoke-guards && make clean
```
Холодный старт — 11,7 с, три контейнера здоровы. Smoke — 8/8, guards — 3/3.
Кластер в покое занимает 0,49 ГБ при заложенных спекой +0,6–0,8 ГБ.
## Как это ревьюировали
Реализация — Codex, дальше саморевью своим же диффом, затем независимое слепое ревью, триаж находок и узкая перепроверка тем же ревьюером.
Ревьюер поднимал стенд и ломал его нарочно. Найдено девять расхождений: главное — при упавшей ноде smoke молча висел 362 секунды, и Ctrl-C не помогал. Стало 107–118 мс, а при падении ноды посреди прогона — 13 с с ограниченной уборкой. Четыре проверки печатали больше, чем доказывали: теперь каждая умеет краснеть, что подтверждено подставными таблицами (например, Distributed с ключом по сырому `ClientID` роняет проверку ключа шардирования). Keeper работал от root с лимитом в 1024 дескриптора — стало `clickhouse` и 262144.
Одна находка отклонена с доводом: пустые каталоги `/clickhouse/tables/{shard}` в keeper — общее пространство имён будущих таблиц, а не мусор проверки; удалять их после smoke было бы вредной привычкой. Довод признан верным при перепроверке.
Конфигурация сверена через Context7 с актуальной документацией ClickHouse 26.x — ничего устаревшего или переименованного.
## Что вынесено дальше
Три наблюдения перенесены в #13 (healthcheck проверяет живость, а не готовность кластера; `CLICKHOUSE_SKIP_USER_SETUP` молча проглотит будущий пароль; потолок 1 ГБ на ноду), одно — в #4 (путь в keeper без `{database}` столкнётся, если рабочие DDL скопируют шаблон).
- Зачем:
- этап 1 спеки требует стенд, поднимаемый одной командой; кластер —
единственный режим, выключателя «без кластера» нет (issue #12).
- Что:
- compose.yaml: две ноды ClickHouse и отдельный clickhouse-keeper на
зафиксированном LTS-образе 26.3.17.56, порты только на 127.0.0.1.
- infra/clickhouse: общее описание кластера, подключение к keeper и
отдельные макросы shard и replica для каждой ноды.
- scripts/clickhouse-smoke.sh: восемь проверок ON CLUSTER от описания
кластера до удаления временных таблиц, вывод по-русски.
- tests/smoke-guards.sh: три проверки самой smoke-команды —
ограниченная аварийная очистка, обработка прерывания, окружение keeper.
- README.md: быстрый старт, роли нод, обоснование выбора версии.
- Проверка:
- make up && make smoke && make smoke-guards && make clean
- Зачем:
- конвейер работы над тикетом раздаёт рассуждения и механику разным
субагентам; определение в репозитории задаёт модель и глубину явно и
переживает сессию.
- Что:
- .claude/agents/deep-reasoner.md — рассуждения и ревью, модель opus.
- .claude/agents/fast-worker.md — механическая работа, модель sonnet.
- Проверка:
- .gitignore уже разрешает .claude/agents/; субагенты видны в списке
агентов Claude Code.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Закрывает #12.
Что сделано
Кластер ClickHouse как единственный режим стенда: две ноды по одному шарду и отдельный clickhouse-keeper. Образ зафиксирован точным LTS-выпуском
26.3.17.56, серверы и keeper берут одну переменную и разъехаться не могут. Порты открыты только на127.0.0.1.Роли нод заложены сразу, как требует спека:
clickhouse-01— инициатор DDL и будущая точка Airflow,clickhouse-02— будущий Superset. Записаны и в README, и комментариями рядом с сервисами в compose.make smoke— восемь проверок ON CLUSTER одной командой, вывод по-русски.make smoke-guards— три проверки самой smoke-команды: аварийная очистка ограничена по времени, прерывание обрабатывается, keeper работает от непривилегированного пользователя.Проверка
Холодный старт — 11,7 с, три контейнера здоровы. Smoke — 8/8, guards — 3/3.
Кластер в покое занимает 0,49 ГБ при заложенных спекой +0,6–0,8 ГБ.
Как это ревьюировали
Реализация — Codex, дальше саморевью своим же диффом, затем независимое слепое ревью, триаж находок и узкая перепроверка тем же ревьюером.
Ревьюер поднимал стенд и ломал его нарочно. Найдено девять расхождений: главное — при упавшей ноде smoke молча висел 362 секунды, и Ctrl-C не помогал. Стало 107–118 мс, а при падении ноды посреди прогона — 13 с с ограниченной уборкой. Четыре проверки печатали больше, чем доказывали: теперь каждая умеет краснеть, что подтверждено подставными таблицами (например, Distributed с ключом по сырому
ClientIDроняет проверку ключа шардирования). Keeper работал от root с лимитом в 1024 дескриптора — сталоclickhouseи 262144.Одна находка отклонена с доводом: пустые каталоги
/clickhouse/tables/{shard}в keeper — общее пространство имён будущих таблиц, а не мусор проверки; удалять их после smoke было бы вредной привычкой. Довод признан верным при перепроверке.Конфигурация сверена через Context7 с актуальной документацией ClickHouse 26.x — ничего устаревшего или переименованного.
Что вынесено дальше
Три наблюдения перенесены в #13 (healthcheck проверяет живость, а не готовность кластера;
CLICKHOUSE_SKIP_USER_SETUPмолча проглотит будущий пароль; потолок 1 ГБ на ноду), одно — в #4 (путь в keeper без{database}столкнётся, если рабочие DDL скопируют шаблон).- Зачем: - этап 1 спеки требует стенд, поднимаемый одной командой; кластер — единственный режим, выключателя «без кластера» нет (issue #12). - Что: - compose.yaml: две ноды ClickHouse и отдельный clickhouse-keeper на зафиксированном LTS-образе 26.3.17.56, порты только на 127.0.0.1. - infra/clickhouse: общее описание кластера, подключение к keeper и отдельные макросы shard и replica для каждой ноды. - scripts/clickhouse-smoke.sh: восемь проверок ON CLUSTER от описания кластера до удаления временных таблиц, вывод по-русски. - tests/smoke-guards.sh: три проверки самой smoke-команды — ограниченная аварийная очистка, обработка прерывания, окружение keeper. - README.md: быстрый старт, роли нод, обоснование выбора версии. - Проверка: - make up && make smoke && make smoke-guards && make clean- Зачем: - конвейер работы над тикетом раздаёт рассуждения и механику разным субагентам; определение в репозитории задаёт модель и глубину явно и переживает сессию. - Что: - .claude/agents/deep-reasoner.md — рассуждения и ревью, модель opus. - .claude/agents/fast-worker.md — механическая работа, модель sonnet. - Проверка: - .gitignore уже разрешает .claude/agents/; субагенты видны в списке агентов Claude Code.