Files
enduro-trails/docs/work-items/ET-015/03-acceptance-criteria.md
claude-bot c2cf8280ca
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 9s
CI / build (push) Successful in 3s
analyst(ET): auto-commit from analyst run_id=101
2026-06-05 15:11:28 +00:00

5.3 KiB
Raw Blame History

Acceptance Criteria: ET-015

Work Item: ET-015 — Healthcheck enduro-trails-app Базовые документы: 01-brd.md, 02-trz.md

Формат

Каждый критерий записан как Gherkin-сценарий (Given/When/Then) и имеет уникальный идентификатор AC-NN. Все критерии — обязательные, если не указано иное.


AC-01. Контейнер становится healthy после деплоя

Given на тестовой среде mva154 смерджена ветка feature/ET-015-healthcheck-enduro-trails-app- And выполнен make deploy-test When проходит ≤ 120 секунд после docker compose up -d app Then docker inspect enduro-trails-app-1 --format '{{.State.Health.Status}}' возвращает healthy And docker inspect ... --format '{{.State.Health.FailingStreak}}' возвращает 0.

AC-02. Контейнер остаётся healthy при штатной работе

Given контейнер enduro-trails-app-1 в статусе healthy When проходит 10 минут без вмешательства Then статус остаётся healthy And FailingStreak == 0 And в docker inspect ... --format '{{json .State.Health.Log}}' последние 5 записей имеют ExitCode: 0.

AC-03. Healthcheck не использует curl

Given ветка feature/ET-015-healthcheck-enduro-trails-app- смерджена When выполняется grep -n curl docker-compose.yml Then в выводе нет строки в секции healthcheck сервиса app содержащей curl.

AC-04. Образ не растёт за счёт установки curl/wget

Given PR с фиксом When выполняется git diff main -- Dockerfile Then в diff нет строк apt-get install для пакетов curl или wget.

AC-05. Healthcheck честно фиксирует unhealthy при отказе приложения

Given контейнер enduro-trails-app-1 в статусе healthy When uvicorn останавливается внутри контейнера (docker exec enduro-trails-app-1 sh -c 'kill -STOP 1' или эквивалент через останов python-процесса), и приложение перестаёт отвечать на http://localhost:5556/api/health Then в течение ≤ 120 секунд статус становится unhealthy.

Примечание: в рамках интеграционного теста допускается имитировать отказ путём временной остановки контейнера-приложения и проверки, что Docker фиксирует переход.

AC-06. Healthcheck-команда использует stdlib python

Given YAML docker-compose.yml When парсится секция app.healthcheck.test Then первый аргумент — "CMD", второй — "python", третий — "-c", четвёртый — однострочник, использующий только модули из стандартной библиотеки Python 3.12 (urllib, sys).

AC-07. Внутренний таймаут запроса меньше внешнего

Given секция healthcheck сервиса app When читаются timeout (YAML-параметр) и timeout=N внутри urlopen(...) Then внутренний timeout строго меньше внешнего timeout (internal < external), чтобы python успел корректно завершиться и отдать exit code.

AC-08. Эндпоинт /api/health не изменён

Given PR с фиксом When выполняется git diff main -- src/api/main.py Then в diff отсутствуют изменения функции health() и декоратора @app.get("/api/health") (либо они затронуты тривиально — например, вынос в роутер — но контракт ответа сохраняется: HTTP 200 + JSON с полем status).

AC-09. CHANGELOG обновлён

Given PR с фиксом When открывается CHANGELOG.md Then в секции Unreleased (или ближайшего невыпущенного релиза) присутствует запись формата fix(infra): ... healthcheck ... ET-015.

AC-10. ADR зафиксирован

Given PR с фиксом When проверяется docs/work-items/ET-015/06-adr/ Then существует файл с ADR, описывающий решение «использовать python urllib вместо curl/wget» с контекстом, решением, последствиями.


Критерии приёмки выполнены, если

Все AC-01 … AC-10 проходят. Owner вручную проверяет на mva154:

ssh mva154 'docker inspect enduro-trails-app-1 \
  --format "{{.State.Health.Status}} (streak {{.State.Health.FailingStreak}})"'
# → healthy (streak 0)