diff --git a/docs/specs/399-backend-gate-honesty.md b/docs/specs/399-backend-gate-honesty.md index 123fc620..b356e92a 100755 --- a/docs/specs/399-backend-gate-honesty.md +++ b/docs/specs/399-backend-gate-honesty.md @@ -3,7 +3,8 @@ - Issue: https://github.com/Matysh/houseplan-card/issues/399 - Приоритет: P2, infra; полный трек — класс B (конфигурация гейта, workflow, тесты), три несвязанные поверхности в одном issue по решению аудита -- Ревизия: 1 (2026-08-31) +- Ревизия: 2 (2026-08-31) — по SPEC-REVIEW-399-r1 (Medium: перебор по каталогу, + а не по паре имён) ## Сценарий @@ -78,9 +79,19 @@ if (!/pytest-homeassistant-custom-component|tests_backend\/requirements\.txt/.te версий — ровно то, от чего защищались в #392 — гейт не заметит: исчезнут обе зацепки разом. -**Контракт**: отсутствие зацепок — отказ, а не пропуск. Если workflow ставит -зависимости бэкенда, он обязан делать это из файла пинов; если не ставит вовсе -— это тоже утверждение, которое надо доказать, а не предположить. +Вторая половина той же дыры: проверка перебирает **жёстко заданный массив** +`['validate.yml', 'mutation-gate.yml']`, а не каталог. Новый workflow с +неверсионированной установкой гейт не увидит просто потому, что его нет в +списке — и это ровно тот способ, которым #392 уже случился: корректность +держалась на том, что никто не добавит третий файл. + +**Контракт**: проверка перебирает **все** `.github/workflows/*.yml`. Для +каждого файла возможны ровно два исхода: либо он ставит зависимости бэкенда — +и тогда обязан делать это из `tests_backend/requirements.txt`, либо он их не +ставит — и тогда это утверждение проверяется явно (в файле нет установки +python-зависимостей), а не выводится из отсутствия подстроки. Появление нового +workflow, ставящего зависимости мимо файла пинов, краснеет само, без правки +списка. ## Скоуп / не-скоуп @@ -122,10 +133,15 @@ include`) и/или шаг линта в `.github/workflows/validate.yml`, - **AC4**. `test/validate-workflow.test.mjs` отказывает, когда в workflow нет ни имени пакета, ни пути к файлу пинов. Доказательство: тест на синтетическом workflow без обеих зацепок → красный. -- **AC5**. Проверка при этом не ломается на workflow, которые бэкенд-зависимости - не ставят вовсе (если такие есть в репозитории): для них условие формулируется - явно, а не через отсутствие подстроки. Доказательство: перечисление файлов, - которые проверка обходит, зафиксировано в самом тесте. +- **AC5**. Проверка перебирает каталог `.github/workflows/*.yml`, а не + фиксированный список имён. Для файла, который зависимостей бэкенда не + ставит, это доказывается явно — в нём нет установки python-пакетов, — а не + выводится из отсутствия подстроки. Доказательство: тест на синтетическом + каталоге, где третий workflow ставит `pip install pytest` без версий → + красный, хотя в прежнем списке из двух имён его бы не было. Сегодня в + репозитории девять workflow, установку python-зависимостей делают два + (`validate.yml`, `mutation-gate.yml`) — это факт, который проверка обязана + вывести сама, а не принять на веру. - **AC6**. Существующие гейты не ослаблены: `npm test`, `ruff` по текущему CI-скоупу и `mypy` strict остаются зелёными.