6.8 KiB
frontend-quality-guardrails Specification
Purpose
Гарантирует, что frontend сохраняет проверяемые structural, startup-size и test-coverage свойства при последующих изменениях React client.
Requirements
Requirement: Frontend сохраняет structural boundaries slice public API
Frontend MUST не содержать cycles в import graph src и MUST обращаться к
другому FSD slice только через его public index.ts, независимо от слоя,
включая app и test source. Generated source MAY быть исключён только при
документированном вынужденном исключении в dependency configuration.
Scenario: Добавлен import cycle
- WHEN исходный или test module в
srcсоздаёт прямой либо косвенный import cycle - THEN documented frontend dependency gate завершается с ошибкой до передачи изменения
Scenario: Slice обходит public API другого slice
- WHEN module одного slice импортирует внутренний file другого slice,
минуя его public
index.ts - THEN documented frontend dependency gate завершается с ошибкой и сообщает boundary violation
Scenario: Application использует public route API
- WHEN application container использует route-level component
- THEN import проходит через public API routes slice и dependency gate завершается успешно при отсутствии остальных violations
Requirement: Frontend ограничивает initial JavaScript payload
Production frontend MUST lazy-load route page boundaries. Сумма minified JavaScript entry bundle и всех его eagerly loaded JavaScript dependencies MUST NOT превышать 500 kB. Lazy route chunks MUST иметь зафиксированный baseline для последующих регрессий; bundle policy MUST NOT требовать ручного vendor chunking.
Scenario: Production build укладывается в initial budget
- WHEN frontend production build создаёт entry bundle и eagerly loaded JavaScript dependencies суммарным размером не более 500 kB minified
- THEN documented bundle gate завершается успешно
Scenario: Production build превышает initial budget
- WHEN frontend production build создаёт entry bundle и eagerly loaded JavaScript dependencies суммарным размером более 500 kB minified
- THEN documented bundle gate завершается с ошибкой и сообщает measured initial payload
Scenario: Изменён lazy route chunk
- WHEN lazy-loaded route chunk превышает свой зафиксированный baseline
- THEN documented bundle gate завершается с ошибкой до передачи изменения
Requirement: Frontend coverage является anti-regression gate
Documented frontend coverage command MUST завершаться с ошибкой, если global coverage committed source ниже 82% statements, 75% branches, 75% functions или 83% lines. Эти пороги SHALL служить только сигналом регрессии и MUST NOT заменять scenario-based tests.
Scenario: Coverage сохраняет каждый baseline floor
- WHEN frontend test suite достигает либо превышает все четыре coverage floors
- THEN documented coverage command завершается успешно
Scenario: Coverage опускается ниже floor
- WHEN frontend test suite опускается ниже хотя бы одного coverage floor
- THEN documented coverage command завершается с ошибкой по этой метрике
Requirement: Frontend проверяет автоматически проверяемый стиль React components
Authored frontend source MUST сохранять автоматически проверяемую часть документированного стиля React components внутри документированного frontend verification gate. Gate MUST отклонять default exports в authored frontend source, named React components, объявленные вне документированной const-valued component form, и module exports, размещённые перед declarations тела module. Style preferences, для которых нет детерминированной локальной проверки, MUST оставаться review conventions и MUST NOT описываться как gate-blocking hard guardrails.
Scenario: Authored source соблюдает проверяемый component style
- WHEN authored frontend source объявляет named React components через документированную const-valued component form, не использует default exports и держит exports после declarations тела module
- THEN документированный frontend verification gate не падает из-за React component style
Scenario: Named component использует запрещённую форму объявления
- WHEN authored frontend source объявляет named React component вне документированной const-valued component form
- THEN документированный frontend verification gate падает и сообщает нарушение React component style
Scenario: Authored source использует default export
- WHEN authored frontend source открывает module API через default export
- THEN документированный frontend verification gate падает и сообщает нарушение module export style
Scenario: Authored source экспортирует до declarations тела module
- WHEN authored frontend source размещает module export перед non-exported declarations тела module
- THEN документированный frontend verification gate падает и сообщает нарушение module export ordering
Scenario: Convention не имеет детерминированной проверки
- WHEN documented frontend style convention нельзя проверить existing deterministic local tooling
- THEN frontend documentation трактует её как mandatory review convention, а не как gate-blocking hard guardrail