docs: #399 spec revision 2 per SPEC-REVIEW-399-r1

User-Visible: no
Issue: #399
This commit is contained in:
Codex
2026-08-31 04:16:18 +03:00
parent 627a5359c3
commit 6d229c66f1
+24 -8
View File
@@ -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 остаются зелёными.