Files
specs/openspec/specs/frontend-quality-guardrails/spec.md
T

6.8 KiB
Raw Blame History

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