ADR 0027: исполняемые архитектурные правила и тестовые гейты
Дата: 2026-09-25. Статус: принято.
Проблема
Границы слоёв проверялись, но декларации не ограничивали рост модулей. Браузерная приёмка не входила в обязательный CI. Команды тестов и порядок сборки были разрозненными. Большой зелёный набор unit-тестов не доказывал прохождение остальных проверок.
Решение
Единый config/architecture.json задаёт граф разрешённых зависимостей и порядок сборки. Сохраняем строгие TS-настройки, публичные workspace-входы, запрет циклов и зависимости ядра от адаптеров. AST-проверка считает строки с кодом: файл ≤500, класс ≤300, функция/метод/стрелочная функция ≤100. Комментарии и пустые строки не считаются; многострочные литералы считаются. Prettier исключает уплотнение кода ради лимита. Проверяются исходники продукта и scripts; тесты не ограничены этими размерами.
28 существующих превышений внесены в config/architecture-exceptions.json с точным потолком, причиной, владельцем, ADR, тестами и датой пересмотра 2026-12-20. Это видимый долг, а не соответствие лимитам. Запрещены рост потолка без отдельного архитектурного review, автоматическая перезапись baseline и перенос срока ради зелёного CI. Максимальная длительность исключения — 90 дней. Снижение размера требует снижения потолка; исчезновение нарушения — удаления исключения и комментария.
У превышения обязателен комментарий arkvory-exception ARCH-NNN -- с конкретной причиной рядом с декларацией; файловое исключение — в начале файла. Исключение не разрешает нарушение ACL, долговечности или границ пакетов. Такие изменения требуют самостоятельного ADR, изменения явных правил и регрессионных тестов. Отключение lint/TS запрещено.
config/gates.json — реестр тестовых входов, зависимостей, тайм-аутов и профилей. Все тестовые файлы должны быть входами гейтов либо достижимыми helpers. Запрещены only/skip/todo и неявный успешный пропуск из-за отсутствия БД/браузера. Новые тестовые наборы включаются в verify/release и CI; новый файл в существующем glob подключается автоматически.
CI проверяет quick на Windows/Linux, PostgreSQL, Chromium и npm audit. Финальное задание всегда проверяет результаты всех обязательных заданий. Оба настоящих сценария 5 GiB обязательны на v-тегах и при ручной release-проверке. Для PR они отдельный дорогостоящий release-гейт. Локальный release включает всё. Ни workflow, ни его финальное задание сами по себе не запрещают merge: в настройках GitHub нужен required status Arkvory merge gate.
Отчёт гейта обязательно публикуется в logs и job summary. Архивы test-results подключаются через ARKVORY_UPLOAD_ARTIFACTS=true: первый прогон обнаружил исчерпанную квоту GitHub Artifact storage. Недоступность квоты не должна подменять результат тестов. Условия запуска тестов не меняются, continue-on-error запрещён; при включённом архивировании его ошибки остаются ошибками задания.
Последствия и границы
Больше времени CI и обязательная тестовая инфраструктура для verify. Отказ audit registry считается ошибкой, а не пропуском. Блокировка одного checkout исключает гонки сборок; PostgreSQL suites на одной БД выполняются последовательно. Тайм-аут завершает дерево дочернего процесса; аварийная потеря питания требует проверки PID перед удалением оставшегося lock.
Размер не доказывает SRP и качество. Семантическую необходимость комментариев, корректность портов и полноту отказных сценариев проверяет reviewer. Покрытие unit-тестов публикуется диагностически, без произвольного процента, создающего ложное качество. Двухсерверная репликация, failover, online GC и восстановление резервной копии остаются отдельными приёмками.
GitHub рекомендует always()+needs для итогового required status и merge_group для merge queue: required checks.