# Phase 6: healthcheck и диагностика startup Phase 6 завершена: ожидание готовности проверяет pinned image healthcheck, Minecraft status query и стабильность контейнера; отказ возвращает non-zero и пути к сохранённым logs/report. Контракт — [health.md](health.md). ## Реальная Docker-проверка 2026-10-03 Исходный snapshot Phase 5 восстановлен в отдельный `.tools/phase6-server`. Использован сохранённый полный NeoForge release 0.0.4, Minecraft 1.21.1, NeoForge 21.1.252, pinned image, host UID/GID 1000:1000 и port 25566. Project — свободный после Phase 5 `minecraft-lab-phase4`. - `up --wait --wait-timeout 2 --stable-seconds 1` на холодном JVM старте вернул timeout/non-zero через 2000 ms ожидания. Container оставлен для диагностики; runtime/binding сохранились. - `health --wait-timeout 120 --stable-seconds 3` затем вернул 0 после Docker healthy и стабильных свежих Minecraft queries. TCP не использован как достаточное свидетельство готовности. - Только тестовый контейнер аварийно завершён `docker kill --signal KILL`. Следующий health вернул crash/non-zero, report сохранил exit code 137 и OOMKilled=false; elapsed около 230 ms. - Повторный `up --wait --wait-timeout 120 --stable-seconds 3` поднял тот же NeoForge release и подтвердил готовность. Исходный модпак не заменялся. - Для restart loop создан отдельный `.tools/phase6-loop-server` и намеренно повреждённая Compose fixture: pinned image, entrypoint с exit 42 и restart=on-failure:5. Это тестовая копия полного релиза с отдельной версией `phase6-failure-fixture` в manifest и пересчитанными checksums; опубликованный immutable release 0.0.4 не менялся. Fixture не доказывает загрузку NeoForge: её назначение — реальный Docker restart loop. - Docker inspect подтвердил RestartCount=1 до проверки. Health затем вернул restart-loop/non-zero за около 1476 ms с RestartCount=2 и новым StartedAt, сохранив logs с intentional failure marker. - Для всех ошибок есть JSON report и файл последних logs, binding сохранился, lifecycle lock освободилась, automatic rollback не выполнялся. - Test containers/network удалены через down. Их runtime/release/diagnostics оставлены для просмотра. Primary Phase 0 сервер на 25565 не останавливался, не пересоздавался и остался healthy. Сценарий: `scripts/verify-phase6.sh`. Он требует Phase 5 snapshot и новых fixture roots, использует только копии test runtime. Свидетельства: `.tools/phase6-evidence/{integration.log,timeout.txt,healthy.txt,healthy-start.log, crash.txt,recovered.txt,restart-loop.txt,loop-docker-state.txt,assertions.txt, primary-server-status.txt}`. Подробные reports/logs находятся в diagnostics соответствующих test roots. ## Автоматические проверки `npm test`: 46 тестов. Deterministic health tests проверяют успешные последовательные queries, провал протокола при running/healthy state, starting/unhealthy, сброс окна после transient failure, crash/OOM/paused, RestartCount/StartedAt/container identity, missing container/healthcheck, inspection error, deadlines включая launch и слишком поздний query, строгие флаги и диагностику Compose failure с сохранением binding/lock cleanup. Regression tests Phase 2–5 проходят; backup resume теперь действительно ожидает стабильную готовность. Bash/Node syntax и `git diff --check` пройдены. SSH transport, switching active-release, automatic recovery/rollback и continuous watchdog не добавляются в эту фазу. Следующая Phase 7 — SSH deployment с уже готовыми backup gate и healthcheck.