# Night shift 2026-10-15 (day) ## Mёртвый BASE: ночные теги vLLM прунены, kindling не собирается После вчерашнего чат-шаблонного фикса `sm121 serve --build-node` попытался rebuild `spark-glm53:v10` (чексумма каталога сменилась) и упал: `FROM vllm/vllm-openai:nightly-ddd6fbca…` → **not found**. Docker Hub прунул всю старую схему `nightly-` (сейчас только `nightly-dev---`), база прунена и с узлов (dgx1/2), дайджест нигде не записан (сентябрьский лог затёрт, реестр на Mac не включён, web-jobs чисты) → образ-база **невосстановим**. Промежуточный ручной путь (тонкая обёртка `FROM spark-glm53:v10` + новый шаблон + label) построен на dgx1, но **отклонён оператором**: sm121 должен уметь собрать всё с нуля, без ручных обходов. ## Решение: репин BASE на релиз v0.31.0 (постоянный тег) - v0.31.0 (cut 2026-10-02) — первый релиз, содержащий коммит базы ddd6fbca (09-26); multi-arch, arm64 ✓. - Дрейф-аудит `ddd6fbca..v0.31.0` (6 дней mainline, 239 файлов): - все файлы, которые патчат kindling-патчеры (mla/_fa_common, mla/_core, sparse_attn_indexer_kpool, kernel_warmup, shm_broadcast, platforms/cuda, reasoning, glm5next/*) — **без изменений**; - `routed_experts.py`: vllm#58720 вкатился upstream **дословно** (`_index_expert_mapping` идентичен) → `vllm-58720-routed-experts.patch` удалён из Dockerfile (verify-base.py по-прежнему ассертит наличие фикса); - requirements: flashinfer 0.7.0 → 0.7.0.post1 (mикро-бамп), torch/NCCL/ cutlass-dsl без изменений. - `ARG BASE=vllm/vllm-openai:v0.31.0`, `ARG VLLM_REF=db9527a4…` (коммит тега — FlashKDA shim компилится против того же исходника, что в base). - Коммит `546e7b2` (shared repo). ## Сборка через sm121 — успешна `sm121 build --recipe glm53-kindling-2x --build-node dgx1.lan`: **11 m 16 s** (pull base 145 s + flashkda + патчи + verify-base гейт + --load). Гейт verify-base прошёл (Glm5Next, glm45, glm47_failclosed, sm_120, MiaAI SM90 + indexer, spin-wait, FlashKDA 17a037d, mentat). Образ `c4bf0a1a…`, label `74087ade…` (= чексумма каталога), шаблон внутри `6c444d8b…` (фикс). Каталог снова полностью воспроизводим с нуля. ## 2x serve: падение через 9 с и настоящая причина Первый serve упёрся в то, что контейнер умирал через ~9 с (с `--rm` — самоудалялся из store, в логах только TaskDelete). Причина: **бейковые оверлеи `experimental/`** (build.sh генерирует `Dockerfile.bake` — COPY оверлеев поверх image/Dockerfile) написаны против дерева ddd6fbca и включают полные файлы с **старыми импорт-блоками**. На чистом v0.31.0 такой файл даёт ImportError в первый же импорт (`hisparse get_hisparse_gpu_memory_usage`). verify-base проходит — он ранит ДО bake- стадии. 23 оверлея из 38 имели дрейф базового файла. Ребейс на v0.31.0: `new = v0.31.0-файл + (оверлей − ddd6fbca)`; 21 авто, 2 вручную (`rejection_sampler` — рефакторинг `gather_draft_sampled()`; `flashinfer_mla_sparse_sm90` — 3-кортеж `_kv_lens_host` + early-return `_TRITON`). Коммит `5e04b7b`. **Вторая ловушка — guard в `experimental/draft-trunc/draft_trunc.py`**: `VLLM_COMMIT = "ddd6fbca"` + чек `f"+g{VLLM_COMMIT}" in vllm.__version__`. Ночные базы несли scm-суффикс `+g`; релизный v0.31.0 — голый `"0.31.0"` → guard ронял движок на старте ("Refresh the copies..."). Фикс: guard закреплён за версией релиза (semantics fail-loud сохранены), коммит `6e0b952`. Ребильд 30 с, label `29c47313…`. Финал: serve6 (08:29) — контейнер живой, грузит веса (33 шарда, NFS4), Mac-процесс serve умер после стрима лога (ран-лиджер закрыт); модель поднимается автономно, readiness ~08:39 UTC. Пайдантик-трейс с `{{dflash}}` в логах serve2/serve6 источник не установлен (live-команда catched inspect несёт resolved `snapshots/bf582e4e…`, движок грузит веса — не в этом краш); если повторится — смотреть APIServer-процесс, а не команду. ## Итог дня (10-15) - **kindling-2x снова жив на v0.31.0-базе** (sm121-native, воспроизводим с нуля), API http://192.168.88.14:30000, модель `glm53`. Смоук: plain ✓ + structured output с параллельными tool calls ✓ (горячий путь фикс-шаблона). - Лиджер: Mac-серверные процессы (serve2–6) умирали после стрима лога, контейнер живёт автономно → ран-лиджер закрыт, модель служит без open-run. Для чистого состояния: `sm121 serve` заново (цена ~20 мин перезагрузки весов). - Пайдантик-трейс с `{{dflash}}` в логах serve2/serve6: источник не установлен (live-команда несёт resolved `snapshots/bf582e4e…`, движок поднялся и служит) — не фатально, не в команде. - Ключевой урок: при смене BASE в kindling-дире **все** бейковые оверлеи (полные копии vllm-файлов) надо ребейсить + проверять guards на `__version__` (draft-trunc). Чек-лист записан в `docker-images/glm53-kindling/AGENTS.md` ("Changing the vLLM base"). ## Замечания - **karmic-kraken** dirs (шаблон тоже обновлён): его BASE — дайджест-закреплённая CUDA (вечная), rebuild воспроизводим, но полный clone-at-pin (долгий, 45+ мин) — сработает при следующем serve полос, использующих karmic-kraken (`glm53-kindling-4x-karmic`, `mimo26-flash-mopd-4x-vllm`, `mimo26-flash-mopd-4x-sparkring`). - Патчеры со «вступлением» (MiaAI retarget под flashinfer 0.7.0) прошли на 0.7.0.post1 — якоря не съехали. - Ночные vLLM-теги имеют TTL: любая схема на `nightly-*` мёртва через недели. Базы должны быть релизными/дайджестными (karmic — образец).