9.4 KiB
Quality gates
Статус: active. Каноническое описание быстрых проверок репозитория. Краткие обязательные команды остаются в
AGENTS.md.
Каноническая команда
Запускать из корня репозитория:
pnpm verify
verify выполняет последовательно:
pnpm --dir web check— SvelteKit sync иsvelte-check.pnpm --dir web test:coverage— полный Vitest-набор вместе с coverage-гейтом.pnpm --dir web test:rules— отдельный быстрый прогон тестов ESLint-правил.pnpm --dir web lint:all— ESLint, Stylelint и token audit.pnpm --dir web exec prettier --check .— форматирование кодаweb/.pnpm check:docs— форматирование Markdown.pnpm --dir web build— production build.
Полный test уже включает тесты lint-правил; отдельный test:rules в verify
оставлен как явный быстрый диагностический этап.
Coverage
pnpm --dir web test:coverage считает покрытие только по src/lib и падает
ниже порога. Scope и список исключений — в web/vitest.config.ts, обоснование —
в docs/testing-strategy.md.
| Метрика | Порог | Baseline |
|---|---|---|
| statements | 90 | 91.77% |
| branches | 82 | 83.3% |
| functions | 72 | 74.31% |
| lines | 91 | 92.53% |
Порог — нижняя граница от текущего baseline, а не оценка качества: он блокирует
регрессию и не требует сначала закрывать весь долг. Локальный замер занимает ~30
с, поэтому отдельного прогона в verify нет — test:coverage заменяет test.
E2E
E2E не входит в verify, потому что Playwright поднимает build и статический
сервер. Locator, fixture, i18n и test.fixme-политика описаны в
docs/testing-strategy.md:
pnpm --dir web test:e2e
Запускать его обязательно для изменений маршрутов, загрузки файла, результата,
download, темы или локализации. Изменения runtime fixtures/загрузки файла
проверяются отдельным web/e2e/png-fixtures.spec.ts; ручные бинарники из
tests/fixtures/ не входят в verify. В текущем CI это отдельный non-blocking
baseline; после закрытия известных ошибок его можно сделать blocking.
Локально прогон идёт с workers: 1 и заметно медленнее: это осознанный размен,
экономит память и оставляет компьютер отзывчивым. Playwright не умеет
per-project лимит воркеров, а browser matrix упирается в память, а не CPU.
Тяжёлые прогоны запускаются по команде пользователя — по одному, без фонового
запуска и циклов повторов; детали в docs/agent-workflow.md.
Быстрые подмножества
| Изменение | Команда |
|---|---|
| Только Markdown | pnpm check:docs |
| TypeScript/Svelte | pnpm --dir web check и pnpm --dir web test |
| Lint-правило или lint-конфиг | pnpm --dir web test:rules и pnpm --dir web lint:all |
| Пользовательский поток | pnpm --dir web test:e2e |
| Fixtures/загрузка файла | pnpm --dir web test:e2e |
| Полный локальный gate | pnpm verify |
Errors и warnings
errorsзавершают соответствующий инструмент ненулевым кодом.- После Q2 ESLint запускается с
--max-warnings=0: новые ESLint warnings блокируют gate. - Token audit пока оставляет unused-token warnings отдельным неблокирующим сообщением.
lint:allпо-прежнему сообщает 4 unused-token warnings отдельным предупреждением token audit; это следующий debt Q7.dict-consistencyиспользует base-locale fallback для registry metadata и pattern-based policy для временно неиспользуемыхtools.*.params; это не молчаливыйallowPaths-список.
CI
.github/workflows/quality.yml:
verifyблокирует PR при typecheck, unit, rule-test, lint, format, docs или build ошибке;e2eзапускается отдельным job после verify и пока не блокирует PR.
.github/workflows/deploy.yml перед production build запускает тот же
pnpm verify, поэтому deploy не должен проходить при ошибке быстрых проверок.
Что и когда запускается
| Workflow | Триггер | Jobs |
|---|---|---|
Deploy to GitHub Pages |
push в main, dispatch |
verify, build, deploy |
Quality |
push в main, pull_request, dispatch |
verify, e2e |
Пуш в main запускает оба workflow: deploy проверяет быстрый gate и собирает
сайт, Quality прогоняет тот же verify и browser matrix. Дублирование
verify (~1 мин) сознательное: matrix на каждый пуш стоит ~3 мин, и условные
job-и ради минуты не окупаются. Browser matrix проверяется на каждом пуше, а
ручной gh workflow run quality.yml нужен только для перепрогона старого
коммита.
Проверка результатов CI после пуша
Первый реальный прогон browser matrix происходит на runner, а не на локальной машине: локально Firefox и WebKit проходят на 1 воркере, но состав, скорость и память Linux-раннера отличаются. Поэтому после пуша разработчика:
- дождаться завершения workflow и посмотреть, какие job вообще запустились;
- смотреть статусы отдельных job, а не общий conclusion прогона: у
e2eстоитcontinue-on-error: true, поэтому прогон с упавшим e2e целиком помечается какsuccess— проверено на run36225579363(E2E: failureприconclusion: success); - если
e2eзапускался и зелёный — сообщить фактические числа passed, failed, skipped; - если
e2eне запускался, сказать это прямо: matrix на раннере не проверена, и её можно прогнать черезgh workflow run quality.yml; - красный
e2eтолько из-за ресурсов раннера фиксируется как ограничение окружения: сначала проверяется один проект и один spec, а не увеличиваются таймауты под конкретную машину.
Измеренная стоимость прогона
Замер на ручном запуске quality.yml (276 e2e-тестов, 4 проекта,
ubuntu-latest):
| Этап | Время |
|---|---|
verify job |
~1 мин |
e2e job целиком |
~3.1 мин |
| из них сами тесты | ~2.2 мин |
| весь run | ~4.2 мин |
Browser matrix стоит около трёх минут, поэтому её дешёво держать на каждом PR.
Полный прогон локально на 1 воркере — заметно дольше (~7 мин), и именно поэтому
локальные правила нагрузки описаны в docs/agent-workflow.md.
Локальная диагностика
При медленном полном прогоне сначала запускай минимальную команду из таблицы, а
перед ревью или merge — pnpm verify. После каждого шага плана результат команд
и текущий baseline фиксируются в отчёте агента.