План исправления архитектуры, React-кода и качества BELF
1. Статус документа
Этот документ — актуальный исполняемый план следующего цикла рефакторинга BELF. Он дополняет завершённую миграцию CSS Modules и заменяет старые планы в части будущих работ.
План составлен по состоянию проекта на 16 сентября 2026 года. Исходный baseline:
npm run check— PASS;- Vitest — 17 тестов PASS;
- Playwright — 96 тестов PASS на шести viewport;
- production и SSR/prerender build — PASS;
- полный recommended preset установленного
eslint-plugin-react-hooks— FAIL: одна ошибкаreact-hooks/set-state-in-effectвNavigationOverlay; - текущие ESLint boundary rules допускают запрещённые относительные импорты;
- keyboard focus в открытом modal navigation может выйти за пределы dialog.
Работа по этому плану считается завершённой только после одновременного прохождения всех пунктов Final Quality Gate из раздела 13.
2. Цели
- Исправить все обнаруженные ошибки, не меняя согласованный дизайн и контент.
- Сделать архитектурные границы автоматически проверяемыми, а не только описанными в документации.
- Привести React-код к полному recommended preset используемой версии
eslint-plugin-react-hooks. - Сделать modal navigation корректным для клавиатуры и assistive technologies.
- Исключить молчаливые ошибки в связке
modules ↔ pricing. - Создать единый источник истины для контактов, site identity и SEO metadata.
- Разделить крупные файлы по самостоятельным обязанностям без over-componentization.
- Сделать код предсказуемым для чтения: единые импорты, имена, public API, расположение тестов и правила владения стилями.
- Усилить CI так, чтобы регрессия архитектуры, accessibility, типов, поведения, визуала или bundle size блокировала deploy.
- Построить устойчивое SEO для брендовых и предметных запросов: сделать BELF однозначной поисковой сущностью, расширить индексируемую информационную архитектуру и измерять позиции, видимость и органические обращения.
3. Неприкосновенные ограничения
Во время выполнения запрещено:
- менять тексты, цены, маршруты, anchors, контакты и SEO-смысл без отдельного продуктового требования;
- менять согласованные размеры, цвета, spacing, typography, breakpoints и анимации только ради рефакторинга;
- обновлять visual snapshots до установления точной причины расхождения и ручного подтверждения изменения;
- отключать правила ESLint, TypeScript, Stylelint или accessibility-проверки;
- добавлять
eslint-disable,@ts-ignore,@ts-nocheck,any, необоснованные type assertions или!importantдля прохождения gate; - ослаблять assertions, coverage threshold или visual threshold ради зелёного CI;
- смешивать исправление поведения, перенос файлов и массовое форматирование в одной итерации;
- создавать компоненты, hooks, types или директории «на будущее»;
- создавать глобальные barrel-файлы, скрывающие направление зависимостей;
- добавлять runtime dependency, если задача решается React, DOM API или текущими библиотеками;
- удалять или перезаписывать несвязанные пользовательские изменения;
- выполнять commit, push, merge или deploy без отдельного запроса владельца.
Для SEO дополнительно запрещено:
- обещать гарантированное первое место или фиксированный срок выхода в топ;
- создавать doorway pages, массовые шаблонные страницы или тексты только ради вариаций ключевого запроса;
- использовать keyword stuffing, скрытый текст, покупные ссылки, cloaking или ложные отзывы;
- публиковать неподтверждённые цифры, кейсы, сертификаты, интеграции и сравнения;
- добавлять structured data, содержание которого не видно пользователю или не соответствует странице.
Допустимая визуальная дельта по умолчанию — нулевая. Исключение: технически необходимая кнопка закрытия внутри modal navigation. Она должна визуально совпасть с текущей кнопкой-крестиком и пройти отдельное ручное подтверждение.
4. Целевая архитектура
4.1. Слои
app → pages → widgets → features → shared
Разрешённые зависимости:
| Слой | Может импортировать |
|---|---|
app | pages, widgets, features, shared |
pages | локальные sections, widgets, features, shared |
widgets | features, shared |
features | shared |
shared | только другие модули shared и внешние пакеты |
Дополнительные правила:
- одна страница не импортирует внутренности другой страницы;
- feature не знает, в какой странице или widget она отображается;
- widget не импортирует page-specific data или page CSS;
- shared не содержит бизнес-сценариев страницы;
- cross-layer import использует
@/...; - относительный
./...используется только внутри одной директории модуля; - parent-relative imports
../...запрещены; - внутренние файлы feature/widget не импортируются снаружи в обход его public API;
- допустим только локальный
index.tsна корне самостоятельного feature/widget; общийsrc/index.tsне создаётся.
4.2. Целевая структура
src/
app/
entrypoints/
home.tsx
partners.tsx
careers.tsx
entry-server.tsx
mountApp.tsx
pages/
home/
HomePage.tsx
sections/
HeroSection/
HeroSection.tsx
HeroSection.module.css
SignalStrip/
SignalStrip.tsx
SignalStrip.module.css
PlatformSection/
ModulesSection/
ProctoringSection/
DeploymentSection/
CalculatorSection/
CalculatorSection.tsx
CalculatorSection.module.css
ClosingSections/
partners/
PartnersPage.tsx
data.ts
components/
ApplicationForm/
sections/
careers/
CareersPage.tsx
data.ts
components/
ResumeForm/
sections/
widgets/
site-header/
index.ts
SiteHeader.tsx
SiteHeader.module.css
SiteHeader.test.tsx
NavigationDialog.tsx
NavigationDialog.module.css
NavigationDialog.test.tsx
navigation-dialog.model.ts
navigation-dialog.model.test.ts
NavigationGroups.tsx
NavigationContact.tsx
site-footer/
index.ts
SiteFooter.tsx
SiteFooter.module.css
features/
navigation-theme/
index.ts
NavigationThemeProvider.tsx
NavThemeRegion.tsx
useHeaderTheme.ts
navigation-theme.model.ts
navigation-theme.model.test.ts
calculator/
index.ts
Calculator.tsx
Calculator.test.tsx
components/
CalculatorForm/
CalculatorForm.tsx
CalculatorForm.module.css
CalculatorForm.test.tsx
CalculatorQuote/
CalculatorQuote.tsx
CalculatorQuote.module.css
model/
calculator.types.ts
calculator.ts
calculator.test.ts
shared/
config/
site.ts
seo.ts
data/
modules.ts
pricing.ts
lib/
clipboard.ts
mailto.ts
ui/
assets/
styles/
fonts.css
tokens.css
reset.css
global.css
home-utilities.css
partners-utilities.css
careers-utilities.css
Это целевое дерево, а не требование создать все папки заранее. Директория создаётся только вместе с реальным владельцем и тестом.
4.3. Правило выделения компонента
Новый компонент создаётся, если выполняется хотя бы одно условие:
- блок имеет самостоятельную пользовательскую или бизнес-ответственность;
- у блока есть собственное состояние, effect, accessibility contract или тест;
- блок повторяется минимум в двух местах;
- блок имеет самостоятельный CSS-владелец;
- имя компонента объясняет код лучше, чем чтение его JSX;
- часть можно изменить независимо от родителя.
Не выделять компонент:
- ради уменьшения количества строк без смысловой границы;
- вокруг одного
div, заголовка или иконки; - если единственный результат — прокидывание тех же props через дополнительный слой;
- если компонент получает неявный контракт вроде
styles: Record<string, string>; - если разделение создаёт циклическую зависимость или скрывает владельца данных.
5. Обязательные стандарты кода
5.1. React
- включён полный
eslint-plugin-react-hooksrecommended preset; - components и hooks чистые и детерминированные во время render;
- hook вызывается только на верхнем уровне компонента или custom hook;
- effect используется только для синхронизации с внешней системой;
- синхронный
setStateвнутри effect запрещён; - derived values не хранятся в state;
- props, state и hook arguments не мутируются;
- DOM globals не читаются во время SSR render без SSR-safe abstraction;
- timers, observers и event listeners всегда имеют cleanup;
- async effect защищён от stale completion или поддерживает cancellation;
- interactive state проверяется component test;
StrictModeостаётся включённым;- SSR output и первый client render должны совпадать без hydration warning.
5.2. TypeScript
strict: trueсохраняется;- включаются
noUncheckedIndexedAccess,exactOptionalPropertyTypes,noFallthroughCasesInSwitchиnoImplicitOverride; - запрещены
any, необоснованный non-null assertion и широкиеstringтам, где существует закрытый домен; - состояния UI с несколькими режимами описываются discriminated union;
- конфиги проверяются через
satisfies, чтобы сохранить литеральные типы; - типы бизнес-модели не объявляются внутри UI-компонента;
- парсинг внешних JSON/API-данных имеет runtime validation на границе;
- функция не принимает состояние, невозможное в пользовательском интерфейсе, без явной валидации.
5.3. Имена и файлы
- компонент и файл компонента имеют одинаковое PascalCase-имя;
- hooks начинаются с
useи отражают один сценарий; model.tsзаменяется предметным именем, если в директории больше одной модели;- булевы значения именуются
is*,has*,can*илиshould*; - обработчики:
handle*внутри компонента,on*в props; - magic numbers получают предметное имя или token;
- default export допустим для page entry; reusable feature/widget использует named exports через локальный public API;
- комментарий объясняет причину или ограничение, а не пересказывает код.
5.4. Ограничения сложности
Значения являются blocking threshold, а не целью искусственно дробить код:
- cyclomatic complexity функции — не более 10;
- вложенность — не более 3 уровней;
- функция/компонент — не более 80 значимых строк;
- TS/TSX-файл — не более 220 значимых строк;
- CSS Module — не более 300 строк;
- при обоснованном исключении требуется ADR или комментарий в quality report; inline-disable не допускается.
Для существующего файла выше порога сначала определяется смысловая граница, и только затем выполняется разбиение.
5.5. Стили
- компонент импортирует только собственный CSS Module;
- CSS Module не передаётся другому компоненту через props;
- глобальные стили содержат только fonts, reset, tokens и доказанно общие utilities;
- повторяемые цвета, spacing, radius, shadow и z-index получают семантические tokens;
- уникальное иллюстративное значение может остаться локальным;
- новые hardcoded brand colors запрещены;
!importantзапрещён;- focus-visible state обязателен для интерактивных элементов;
prefers-reduced-motionобязателен для значимой анимации.
5.6. Тесты
- тест проверяет наблюдаемое поведение, а не внутреннюю реализацию;
- query priority Testing Library: role/name → label → text → test id;
data-testidиспользуется только при отсутствии устойчивой семантики;- каждый исправленный дефект сначала получает падающий regression test;
- pure model/lib code покрывается минимум на 95% lines/functions и 90% branches;
- общий threshold: 85% lines/statements, 90% functions, 80% branches;
- на новых и изменённых строках coverage не ниже 90%;
- accessibility проверяется автоматикой и отдельными keyboard-сценариями;
- visual test не заменяет semantic или behavioral assertion.
6. Этап 0 — неизменяемый baseline
Перед первой реализационной правкой:
- Зафиксировать
git status --shortи не смешивать пользовательские изменения. - Выполнить
npm ciв чистом CI окружении. - Выполнить
npm run check,npm run test:e2eиgit diff --check. - Сохранить число unit/component/e2e tests и список snapshots.
- Зафиксировать production bundle sizes.
- Сохранить representative screenshots: mobile 390, tablet 768, desktop 1440.
- Проверить прямое открытие
/,/partners/,/careers/.
Gate 0
- исходный git status записан;
-
npm run check— PASS; - 17 текущих Vitest tests — PASS;
- 96 текущих Playwright tests — PASS;
- build и prerender — PASS;
- screenshots проходят без update;
- bundle baseline записан;
- известные ошибки из раздела 1 воспроизводятся отдельными probe/tests.
При красном baseline сначала документируется исходная ошибка. Рефакторинг поверх необъяснённого FAIL не начинается.
7. Этап 1 — regression tests до исправлений
7.1. Navigation accessibility
Добавить тесты, которые до исправления должны падать:
- при открытии focus перемещается внутрь dialog;
- активный элемент является потомком
[role="dialog"]; Tabс последнего элемента переходит на первый внутри dialog;Shift+Tabс первого элемента переходит на последний внутри dialog;- focus не попадает на logo, header CTA,
mainили footer; - внутри dialog есть видимая кнопка закрытия с accessible name;
Escapeзакрывает dialog и возвращает focus на trigger;- закрытие по кнопке, backdrop и navigation link возвращает ожидаемое состояние;
- закрытый overlay не находится в accessibility tree и tab order;
- повторное открытие не создаёт дубликатов listeners или portal nodes.
7.2. Architecture probes
Добавить lint fixtures или programmatic tests, доказывающие, что CI отклоняет:
shared → pagesчерез alias и через relative import;shared → features/widgets/app;features → pages/widgets/app;widgets → pages/app;- импорт внутреннего feature-файла в обход public API;
- cross-page import;
- любой parent-relative import
../....
7.3. Calculator contracts
Добавить тесты:
- каждый
ModuleIdимеет self/cloud pricing; - pricing не содержит orphan module id;
- неизвестный module id невозможно передать на уровне TypeScript;
- допустимые months — только
1 | 6 | 12; - employees/computers/servers — целые числа в заданном диапазоне;
- недопустимые значения не попадают в расчёт и estimate;
- ни одна корректная конфигурация не возвращает
NaN,Infinityили отрицательную итоговую цену.
Gate 1
- новые regression tests воспроизводят каждую проблему;
- каждый тест красный по ожидаемой причине;
- существующие тесты не изменены и не ослаблены;
- snapshots не обновлены;
-
git diff --check— PASS.
8. Этап 2 — modal navigation и React rules
8.1. Исправление modal navigation
- Сохранить trigger в
SiteHeader, но использовать его только для открытия. - Разместить визуально доступную кнопку закрытия внутри dialog DOM subtree.
- При открытии перемещать focus на осмысленный элемент внутри dialog.
- Focus trap должен вычислять только видимые и доступные descendants dialog.
- Всё вне активного dialog должно быть inert; предыдущее значение
inertнеобходимо сохранить и восстановить. - При закрытии восстановить body overflow, padding и focus на исходный trigger.
- Cleanup должен быть корректен при unmount и React StrictMode remount.
- Portal/client-ready механизм переписать без синхронного
setStateв effect и без hydration mismatch. - Сохранить текущую геометрию, цвета и responsive-поведение overlay.
8.2. Полный React lint
- Подключить flat recommended preset установленного
eslint-plugin-react-hooks. - Удалить ручное дублирование правил, уже входящих в preset.
- Исправить все diagnostics без disable-комментариев.
- Добавить отдельную проверку отсутствия hydration warnings в Playwright.
- Проверить работу StrictMode в dev и hydration production build.
Gate 2
- полный React recommended preset — 0 errors, 0 warnings;
- все navigation regression tests из Gate 1 — PASS;
- Tab/Shift+Tab остаются внутри dialog во всех шести viewport;
-
Escapeи кнопка закрытия возвращают focus на trigger; - внешняя страница inert, scroll заблокирован и полностью восстанавливается;
- нет hydration warning,
pageerrorиconsole.error; - visual snapshots navigation — PASS без необъяснённого update;
-
npm run check— PASS; - релевантные Playwright tests — PASS.
9. Этап 3 — реальные архитектурные границы
- Переименовать общий слой
componentsвwidgets, потому что header/footer — составные блоки страницы, а не атомарные shared UI-компоненты. - Выделить
features/navigation-themeкак самостоятельный механизм темы header. - Убрать зависимость calculator от navigation widget: page-specific
CalculatorSectionвладеетNavThemeRegion, featureCalculator— только состоянием, формой, расчётом и quote. - Перенести cross-layer imports на
@/...; оставить./...внутри директории. - Запретить parent-relative imports ESLint-правилом.
- Настроить ограничения из таблицы раздела 4 для всех способов импорта.
- Добавить локальные public API для
site-header,site-footer,navigation-theme,calculator. - Добавить cycle detection в CI; допустимое число циклов — 0.
- Обновить
docs/architecture.mdиCONTRIBUTING.mdодновременно с кодом.
Gate 3
- все architecture fixtures из Gate 1 отклоняются линтером;
- фактический import graph соответствует таблице раздела 4;
- parent-relative imports отсутствуют;
- cross-page imports отсутствуют;
- deep imports в feature/widget internals отсутствуют;
- циклических зависимостей — 0;
- orphan exports и orphan files — 0;
- документация совпадает с фактическим деревом;
-
npm run typecheck,npm run lint,npm run test,npm run build— PASS.
10. Этап 4 — типобезопасные данные и единый site config
10.1. Calculator domain
- Ввести
ModuleIdкак литеральный union, выведенный из единого каталога модулей либо объявленный один раз. - Связать pricing с
ModuleIdчерезsatisfies Record<ModuleId, ...>. - Сделать
Hosting,Installation,BillingPeriodиAdjustmentзакрытыми доменами. - Вынести parsing/clamping input values в чистые функции модели.
- Удалить fallback
?? 0для отсутствующей цены: это ошибка конфигурации, а не бесплатный модуль. - Проверять целые min/max значения в модели, а не только HTML attributes.
- Разделить calculation, validation и estimate formatting.
10.2. Site identity и SEO
- Создать
shared/config/site.tsс названием, legal name, base URL, контактами, social links и текущим copyright policy. - Создать типизированный page metadata config.
- Генерировать или проверять canonical, Open Graph, Twitter и JSON-LD из этого config во время build.
- Удалить ручные копии телефона, email, social URL и Organization JSON-LD из HTML shells.
- Build должен падать при невалидном JSON-LD, несовпадении canonical route или отсутствии обязательного metadata field.
Gate 4
-
modulesиpricingимеют compile-time полное взаимное соответствие; - неизвестная цена не превращается в
0; - calculator property/boundary tests — PASS;
- результаты всех существующих валидных конфигураций не изменились;
- контакты и organization identity объявлены один раз;
- UI, mailto, JSON-LD и social metadata получают одинаковые значения;
- JSON-LD валиден для всех трёх страниц;
- canonical URL соответствует маршруту;
- SSR/prerender build — PASS;
- calculator и metadata coverage соответствуют разделу 5.6.
11. Этап 5 — SEO уровня production
11.1. Принцип и ожидаемый результат
SEO не может гарантировать первое место Google: итоговая позиция зависит от конкуренции, истории домена, качества и известности продукта, внешних упоминаний и алгоритмов поисковой системы. Технический результат этапа — устранить все контролируемые препятствия и создать сильнейшие доступные сигналы релевантности, доверия и идентичности BELF.
Целевые результаты:
- по брендовым запросам
BELF,Белф,BELF Uzbekistan,belf.uz,BELF Proctorофициальный сайт однозначно идентифицируется как основной источник о продукте; - для каждого подтверждённого продуктового поискового намерения существует одна лучшая, содержательная и индексируемая страница;
- Google получает полностью отрендеренный HTML, согласованные canonical, sitemap, metadata и structured data без необходимости угадывать назначение страницы;
- органический трафик оценивается не только позициями, но и qualified clicks, CTR, заявками и долей брендовой/небрендовой видимости;
- рост достигается people-first содержанием и реальной репутацией, без манипулятивных SEO-техник.
11.2. SEO baseline и исследование спроса
До изменения структуры или текстов:
- Подключить и подтвердить domain property в Google Search Console.
- Зафиксировать индексирование через URL Inspection и отчёт Pages.
- Выгрузить последние доступные данные Search Console: queries, pages, countries, devices, impressions, clicks, CTR и average position.
- Проверить фактическую выдачу в целевых регионах и языках для брендовых написаний, транслитераций и опечаток.
- Собрать семантическое ядро из реальных формулировок потенциальных клиентов, Search Console, интервью продаж и конкурентной выдачи.
- Разделить запросы по намерению:
- узнать категорию решения;
- решить конкретную операционную проблему;
- сравнить способы или продукты;
- проверить функции, безопасность, размещение и интеграции;
- узнать цену и условия внедрения;
- найти именно BELF;
- стать партнёром или специалистом по внедрению.
- Для каждого кластера зафиксировать аудиторию, ситуацию, главный вопрос, доказательства, целевую страницу и conversion event.
- Не утверждать список ключевых слов до подтверждения спроса и релевантности.
SEO Gate 5.1 — baseline
- Search Console domain property подтверждён;
- XML sitemap отправлен и прочитан Google;
- все текущие canonical URL проверены через URL Inspection;
- baseline брендовых и небрендовых queries сохранён;
- определены целевые регионы и реальные языки продукта;
- каждому keyword cluster назначено одно поисковое намерение и одна primary page;
- в semantic map нет кластеров без связи с реальной возможностью BELF;
- baseline содержит дату, источник и не смешивает desktop/mobile или разные страны без пометки.
11.3. Поисковая информационная архитектура
Текущих трёх страниц недостаточно, чтобы полноценно отвечать на широкий набор продуктовых запросов. Новые страницы создаются только под самостоятельное намерение и реальную полезность, а не под перестановки ключевых слов.
Предварительная карта, которую необходимо подтвердить исследованием:
/
BELF: категория продукта, основная ценность и выбор следующего шага
/platform/
единая платформа, роли, доступ, модули и интеграции
/modules/<module-slug>/
отдельная подтверждённая задача и возможности конкретного модуля
/proctoring/
рабочий контекст, события, приватность, ограничения и сценарии использования
/deployment/
self-hosted и cloud: требования, различия, безопасность и внедрение
/pricing/
модель расчёта, состав цены, условия и калькулятор
/security/
архитектура защиты, хранение, доступ и подтверждённые меры
/integrations/
реальные поддерживаемые интеграции и порядок подключения
/use-cases/<verified-use-case>/
конкретная роль/задача, процесс, результат и ограничения
/customers/<verified-case>/
проверяемый кейс с разрешёнными фактами и доказательствами
/docs-or-help/
индексируемые ответы на вопросы выбора и внедрения, если они полезны до покупки
/partners/
/careers/
/about/
/contact/
Правила:
- URL короткий, стабильный, человекочитаемый и написан в одном выбранном языке;
- один URL соответствует одному основному намерению;
- canonical указывает на саму страницу;
- важная страница доступна обычной HTML-ссылкой максимум за три перехода от главной;
- orphan pages запрещены;
- одинаковые страницы по городам, отраслям или языкам без уникальной пользы запрещены;
- filter/query/hash URL не индексируются как отдельные контентные страницы;
- удалённая страница получает релевантный
301, а не redirect на главную; - отсутствующий URL возвращает настоящий HTTP
404; - sitemap содержит только canonical indexable URLs с кодом
200; lastmodменяется только при существенном изменении страницы.
SEO Gate 5.2 — информационная архитектура
- утверждена карта
intent → primary URL → CTA → evidence; - keyword cannibalization отсутствует;
- doorway, duplicate и orphan pages — 0;
- глубина перехода к priority pages — не более 3;
- internal links используют canonical URLs и описательный anchor text;
- каждый новый маршрут добавлен в prerender, sitemap, navigation context и e2e crawl;
- каждый несуществующий маршрут возвращает корректный
404; - redirect chains и loops — 0.
11.4. Архитектура сообщений и on-page SEO
Каждая поисковая страница проектируется для конкретной аудитории и этапа решения. Порядок сообщения:
релевантность → ценность → механизм → доказательство → ограничения → действие
Обязательные требования:
- Первый экран отвечает: что это, для кого, какую задачу решает и какой следующий шаг доступен.
- Один уникальный
<title>точно называет тему и BELF; длина не оптимизируется механически, смысл важнее числа символов. - Один видимый
h1соответствует главному намерению страницы; уровниh2–h3образуют логичную структуру без пропусков ради дизайна. - Meta description уникально и честно описывает пользу страницы; она не повторяет title и не содержит неподтверждённых обещаний.
- Основные термины используются естественно в title, h1, вводном тексте, ссылках и alt только там, где помогают человеку.
- Сильное утверждение сопровождается рядом расположенным доказательством: механизмом, демонстрацией, документом, разрешённым кейсом или точным ограничением.
- Нельзя придумывать ROI, проценты эффективности, отзывы, число клиентов, соответствие стандартам или превосходство над конкурентами.
- CTA соответствует готовности посетителя: изучить модуль, посмотреть пример, рассчитать цену, обсудить внедрение.
- Изображения получают описательные filename/alt, если несут содержание; декоративные изображения имеют пустой alt.
- Видео получает индексируемое название, описание, poster и transcript, если оно важно для страницы.
- FAQ создаётся из реальных вопросов клиентов; FAQ structured data добавляется только если текущая документация Google делает страницу подходящей для соответствующего rich result.
- Дата обновления показывается только для материалов, где свежесть важна, и меняется при содержательном обновлении.
Контентные типы для устойчивого роста:
- подробные страницы модулей и deployment;
- документация по требованиям, внедрению и интеграциям;
- проверяемые кейсы с исходной ситуацией, процессом, результатом и ограничениями;
- сравнения подходов, основанные на проверяемых критериях, а не на нападках на конкурентов;
- glossary только для терминов, которые действительно ищет и использует аудитория;
- статьи-ответы на сложные вопросы покупателей, если ответ нельзя качественно разместить на основной product page.
SEO Gate 5.3 — content quality
- у каждой страницы есть content brief: audience, intent, message, evidence, CTA;
- title, description, h1 и основной текст уникальны;
- одна страница полностью отвечает на назначенное намерение;
- все факты имеют внутренний источник и владельца подтверждения;
- неподтверждённые claims, искусственные superlatives и keyword stuffing — 0;
- текст понятен без внутренней терминологии компании;
- proof находится рядом с утверждением;
- CTA продолжает решение пользователя и объясняет следующий шаг;
- контент прошёл редакторскую, продуктовую и юридическую проверку;
- массово сгенерированный или поверхностно перефразированный контент — 0.
11.5. Brand/entity SEO для запроса BELF
- Зафиксировать одно основное имя
BELFи допустимые варианты написания. - На главной ясно связать
BELF, категорию продукта, разработчика Digital Revolution Makers и официальный доменbelf.uz. - Создать содержательные
/about/и/contact/с проверяемыми сведениями о компании и едиными контактами. - Размещать
OrganizationJSON-LD только на главной или основной странице организации; использовать постоянный@id. - Связать
Organization,WebSite,SoftwareApplicationи WebPage через стабильные@id,publisher,provider,isPartOfиabout. - Указать только реальные
sameAs, logo, contactPoint, address и legal data. - Проверить единообразие названия, логотипа, описания и URL на официальных социальных профилях и авторитетных отраслевых площадках.
- Получать внешние упоминания через реальные партнёрства, кейсы, публикации и полезные материалы; покупка ссылок запрещена.
- Добавить
WebSite/site name signals, favicon и согласованные Open Graph данные, чтобы официальный результат визуально распознавался. - Ежемесячно проверять branded SERP на конкурирующие сущности, неверные title, sitelinks и неофициальные страницы.
SEO Gate 5.4 — бренд
- главная однозначно объясняет, что такое BELF;
- официальный домен, бренд и разработчик связаны видимым текстом и schema;
- Organization существует в одном согласованном варианте;
- logo/favicon доступны Googlebot, индексируемы и соответствуют бренду;
- все
sameAsведут на официальные подтверждённые профили; - NAP/contact data согласованы на сайте и внешних официальных профилях;
- запросы
BELF,Белф,BELF Proctor,belf.uzотслеживаются отдельно; - целевой внешний KPI: официальный сайт занимает позицию 1 по однозначным брендовым запросам в целевом регионе после периода переиндексации;
- отсутствие позиции 1 не маскируется техническим PASS: создаётся отдельная гипотеза по данным Search Console и выдачи.
11.6. Technical SEO и structured data
Для каждого indexable URL build обязан проверять:
- HTTP
200, валидныйlang, viewport и charset; - уникальные server-rendered
title, meta description и self-canonical; - один canonical, согласованный с sitemap, internal links и redirect policy;
robotsразрешает индексирование, если страница предназначена для поиска;- важный текст и ссылки присутствуют в prerendered HTML до выполнения JS;
- heading outline, link names и image alt валидны;
- Open Graph и Twitter metadata используют абсолютные доступные URLs;
- social image имеет корректный MIME type, размеры и content;
- JSON-LD синтаксически валиден и соответствует видимому содержанию;
Organization,WebSite,SoftwareApplication,BreadcrumbListи другие типы добавляются только на подходящие страницы;- fake review/rating, неподтверждённый Offer и нерелевантная schema запрещены;
- sitemap генерируется из page registry и не редактируется вручную;
robots.txtсодержит абсолютный sitemap URL и не блокирует CSS, JS, изображения или indexable routes;- ссылки доступны как
<a href>, а не только через click handler; - отсутствуют broken internal links, mixed content и redirect chains;
- mobile и desktop получают эквивалентные content и metadata;
- hreflang добавляется только при существовании полноценной переведённой версии,
содержит reciprocal links и корректный
x-default.
Добавить автоматический SEO audit, который сканирует production preview, а не исходные шаблоны.
SEO Gate 5.5 — technical
- все indexable URLs:
200, self-canonical, index/follow; - blocked/redirect/error URLs отсутствуют в sitemap;
- canonical conflicts и duplicate canonical — 0;
- duplicate/missing title, description и h1 — 0;
- broken internal links — 0;
- structured data: 0 critical и 0 non-critical validation errors;
- Rich Results Test пройден для поддерживаемых типов;
- rendered HTML содержит основной content и crawlable links без JS;
- robots.txt, sitemap.xml и page registry согласованы;
- hreflang errors — 0 либо hreflang отсутствует до появления переводов;
- mobile parity — PASS;
-
npm run test:seo— PASS.
11.7. Производительность и Core Web Vitals
SEO performance gate измеряется отдельно для mobile и desktop. Основным результатом являются field data на 75-м процентиле; Lighthouse используется как лабораторная защита до накопления field data.
Обязательные пороги:
- LCP ≤ 2.5 s;
- INP ≤ 200 ms;
- CLS ≤ 0.1;
- TTFB ≤ 0.8 s как внутренний диагностический бюджет;
- изображения выше fold имеют заданные размеры и не вызывают layout shift;
- основной LCP asset не lazy-load, имеет корректный priority/preload только при доказанной необходимости;
- below-fold media lazy-load;
- font loading не скрывает содержимое и не создаёт заметный CLS;
- third-party scripts не добавляются без performance budget и consent review.
SEO Gate 5.6 — performance
- Lighthouse SEO = 100 на всех indexable page templates;
- Lighthouse median из трёх mobile запусков: Performance ≥ 90;
- field Core Web Vitals имеют статус Good на 75-м процентиле после достаточного периода сбора данных;
- LCP, INP и CLS соответствуют указанным порогам;
- новый route не превышает bundle budgets Final Quality Gate;
- изображения имеют width/height, responsive sources и подходящий формат;
- regression budget блокирует ухудшение LCP/CLS/bundle в CI.
11.8. Измерение результата и непрерывное улучшение
Технический gate и внешний SEO outcome разделяются. Код можно признать технически корректным после прохождения audit, но нельзя объявлять SEO успешным без данных поисковой выдачи.
Отслеживать еженедельно в первые восемь недель, затем ежемесячно:
- indexed canonical pages и причины исключения;
- crawl errors, manual actions и security issues;
- брендовые и небрендовые impressions/clicks/CTR/average position;
- долю целевых запросов в top 3, top 10 и top 20;
- landing pages с impressions, но низким CTR;
- queries с позицией 4–20 и достаточными impressions;
- органические CTA, qualified leads и конверсию landing pages;
- Core Web Vitals field data;
- branded SERP и корректность site name/logo/sitelinks.
Цели фиксируются после baseline, а не придумываются заранее. Для каждой цели указываются исходное значение, целевой период, рынок и владелец. Изменение оценивается минимум после полного цикла crawl/index/re-ranking; краткосрочные колебания не считаются доказательством.
SEO Gate 5.7 — post-release outcome
- Search Console не показывает manual actions или security issues;
- все priority pages проиндексированы с ожидаемым Google-selected canonical;
- брендовые queries имеют отдельный dashboard;
- небрендовые clusters имеют измеримые impressions и landing pages;
- органические conversion events проверены end-to-end;
- для страниц с падением зафиксированы данные и гипотеза, а не выполнено бесконтрольное переписывание;
- monthly SEO report содержит изменения, причины, риски и следующий эксперимент;
- контент без показов/ценности улучшается, объединяется или удаляется только после анализа и корректной redirect/canonical стратегии.
Gate 5 — SEO release
- SEO Gates 5.1–5.6 — PASS до production release;
- SEO Gate 5.7 имеет настроенный мониторинг и владельца;
- people-first content и Google Search Essentials соблюдены;
- spam/doorway/keyword-stuffing techniques отсутствуют;
- site config, page registry, sitemap, metadata и structured data имеют один источник истины;
- SEO audit является blocking частью CI;
- post-release KPI не выдаются за гарантированный результат алгоритма.
11.9. Нормативные источники SEO
Реализацию и review сверять с актуальными официальными источниками:
- Google Search Essentials;
- SEO Starter Guide;
- Crawling and indexing;
- JavaScript SEO;
- Canonical URLs;
- Sitemaps;
- Organization structured data;
- Breadcrumb structured data;
- Google spam policies;
- Core Web Vitals thresholds.
Перед реализацией перепроверить даты обновления документации и доступность конкретных rich result: поддержка Google меняется со временем.
12. Этап 6 — компоненты и читаемость
Миграция выполняется по одному владельцу. Сначала перенос без изменения поведения, затем отдельным изменением — упрощение.
12.1. Navigation
SiteHeaderвладеет шапкой и trigger;NavigationDialogвладеет modal semantics, portal и focus lifecycle;navigation-dialog.modelвладеет поиском focusable elements и переходами;NavigationGroupsтолько отображает группы ссылок;NavigationContactтолько отображает контактный CTA;- дочерние компоненты импортируют собственный CSS либо остаются приватными
частями одного файла;
stylesчерез props не передаётся.
12.2. Home
- выделить
SignalStripизHeroSectionс собственным JSX и CSS Module; - сохранить
DashboardPreviewсамостоятельным визуальным компонентом; HeroSectionоставить композицией hero content и preview;- разделить
ClosingSectionsнаCustomSectionиContactSection, если они имеют разные anchors, данные и стили; - page component сохраняет только порядок секций.
12.3. Calculator
- page
CalculatorSectionвладеет заголовком, theme region и layout секции; - feature
Calculatorвладеет состоянием и orchestration; CalculatorFormразделить на именованные private blocks только потому, что каждый fieldset имеет самостоятельный набор данных и событий:HostingFieldset,ScaleFieldset,ModulesFieldset,InstallationFieldset;- повторяемые radio options описать типизированными данными, не дублировать JSX;
CalculatorQuoteостаётся одним компонентом, пока не превышает thresholds;- бизнес-расчёт и validation не находятся в JSX.
12.4. Partners и careers
- сохранить page-specific формы рядом со страницами;
- вынести form serialization/navigation side effect в testable hook или action;
- вынести
Clientи registry state из UI-файла в предметную модель; - runtime-валидировать client registry JSON на входной границе;
- объединять partners/careers footer только если появился стабильный общий контракт; визуально похожий JSX сам по себе не является основанием;
- не создавать универсальный
Section, если он скрывает семантику и anchors.
12.5. Design tokens
- проинвентаризировать повторяющиеся цвета и размеры;
- создать только семантические tokens: surface, text, border, brand, feedback, overlay, focus ring;
- заменять hardcoded values небольшими партиями с visual regression после каждой;
- не создавать token для уникального декоративного значения.
Gate 6
- каждый компонент соответствует правилу раздела 4.3;
- page components содержат только providers, header/footer и порядок секций;
- feature calculator не импортирует navigation/widget/page code;
-
styles: Record<string, string>и передача CSS Module через props отсутствуют; - файлы и функции проходят thresholds раздела 5.4;
- один CSS Module имеет одного владельца;
- глобальные CSS не содержат selectors конкретных компонентов;
- повторяемые brand/design values используют семантические tokens;
- DOM order, texts, routes и anchors не изменились;
- full-page snapshots — PASS на шести viewport;
- component/unit/e2e tests — PASS.
13. Final Quality Gate
Работа завершена только при одновременном PASS всех пунктов.
13.1. Статика и форматирование
-
npm run format:check— 0 differences; -
npm run lint— 0 errors, 0 warnings; - полный React recommended preset включён, а не запускается отдельной пробой;
-
npm run lint:css— 0 errors, 0 warnings; -
npm run typecheck— PASS с усиленными compiler options; -
git diff --check— PASS; - нет
eslint-disable,@ts-ignore,@ts-nocheck, необоснованногоanyи новых!important; - dependency cycles — 0;
- orphan source files/exports — 0.
13.2. Unit и component tests
- все regression tests добавлены до исправления и теперь PASS;
- все pure models/utils имеют ≥95% lines/functions и ≥90% branches;
- global coverage: ≥85% lines/statements, ≥90% functions, ≥80% branches;
- changed-line coverage ≥90%;
- тесты проходят минимум три последовательных запуска без flaky retry;
- fake timers используются для timer-dependent component tests;
- rejected promises и console errors приводят к FAIL.
13.3. Accessibility
- axe-проверка трёх маршрутов — 0 serious/critical violations;
- axe-проверка открытого navigation dialog — 0 violations;
- весь сайт проходим только клавиатурой;
- focus всегда видим;
- modal focus не покидает dialog;
- после закрытия focus возвращается на trigger;
- interactive elements имеют role/name/state;
- reduced-motion режим проверен;
- таблица registry имеет корректные row/header/cell semantics.
13.4. Browser и SSR
-
npm run build— PASS; - prerender создаёт три ожидаемые страницы;
- hydration warnings — 0;
-
pageerror— 0; -
console.errorи необъяснённыеconsole.warn— 0; -
/,/partners/,/careers/открываются напрямую; - все anchors и navigation links работают;
- forms создают корректные mailto URLs;
- calculator выдаёт утверждённые результаты;
- registry корректно показывает success/loading/error/empty states;
- horizontal overflow — 0 на всех поддерживаемых viewport;
- CLS, вызванный hydration/navigation, отсутствует.
13.5. Visual regression
- 96 существующих Playwright scenarios — PASS;
- новые keyboard/accessibility scenarios — PASS;
- navbar closed/open screenshots — PASS для 3 routes × 6 viewport;
- partners/careers full-page screenshots — PASS для 2 routes × 6 viewport;
- home получает full-page baseline для 6 viewport;
-
maxDiffPixelRatioне выше0.003; - snapshots не обновлялись автоматически;
- каждое намеренное visual изменение просмотрено и записано в отчёт.
13.6. Производительность и bundle
- initial route JavaScript ≤100 KiB gzip для каждого маршрута;
- общий shared JavaScript ≤85 KiB gzip;
- новый runtime dependency имеет записанное обоснование;
- отсутствуют duplicate package versions без причины;
- Lighthouse median из трёх запусков: Performance ≥90, Accessibility ≥95, Best Practices ≥95, SEO =100;
- production dependencies: 0 high/critical security advisories;
- изображения и шрифты не загружаются повторно без необходимости.
13.7. Архитектура и читаемость
- import graph соответствует
app → pages → widgets → features → shared; - все boundary rules проверены отрицательными fixtures;
- public API существуют только у самостоятельных feature/widget;
- page-specific data остаются в page scope;
- общие site identity и contacts имеют один источник истины;
- отсутствуют широкие типы для закрытых бизнес-доменов;
- нет компонентов без самостоятельной ответственности;
- нет крупных компонентов, скрывающих несколько независимых сценариев;
- README, architecture и contribution guide соответствуют коду;
- новый разработчик по документации может добавить секцию, module и route без изучения истории рефакторинга.
13.8. SEO
- SEO Gates 5.1–5.6 — PASS;
- Search Console подключён, sitemap принят, priority URLs доступны для индексирования;
- каждый indexable URL имеет уникальные title, description, h1 и self-canonical;
- основной content и links присутствуют в prerendered HTML;
- sitemap, robots, canonical, internal links и page registry согласованы;
- broken links, orphan pages, duplicate metadata и canonical conflicts — 0;
- structured data соответствует видимому content и проходит validation;
- BELF, официальный домен, продукт и разработчик связаны едиными entity signals;
- keyword map не содержит cannibalization, doorway или недоказанных запросов;
- content briefs содержат audience, intent, message, evidence и CTA;
- keyword stuffing, hidden text, cloaking, link spam и fake claims — 0;
- Core Web Vitals соответствуют Good thresholds на 75-м процентиле после появления достаточных field data;
- брендовые и небрендовые KPI измеряются раздельно;
- настроен post-release мониторинг индексирования, позиций, CTR и organic conversions;
- позиция в выдаче не заявляется как гарантированный результат.
13.9. CI и поставка
-
npm run qualityлокально запускает тот же обязательный набор, что и CI; - CI использует
npm ciи закреплённую поддерживаемую версию Node; - deploy зависит от static, unit, accessibility, e2e и build gates;
- test/Playwright reports загружаются при FAIL;
- snapshot update не выполняется в CI;
- исходные пользовательские изменения сохранены;
- итоговый
git status --shortприложен к отчёту; - commit, push и deploy выполнены только при отдельном разрешении.
14. Обязательные команды
Итоговый публичный интерфейс проверок должен быть таким:
npm run format:check
npm run lint
npm run lint:css
npm run typecheck
npm run test
npm run test:coverage
npm run test:a11y
npm run test:e2e
npm run test:seo
npm run test:architecture
npm run check:cycles
npm run check:bundle
npm run check:links
npm run check:lighthouse
npm run build
npm run quality
npm run quality обязан запускать все blocking checks либо быть CI-агрегатором,
который гарантирует тот же набор. Команды из документации не могут ссылаться на
несуществующий script.
15. Порядок поставки
Рекомендуемые независимые изменения:
- Regression tests navigation и architecture probes.
- Исправление modal navigation и полный React lint preset.
- Alias policy, реальные boundary rules и cycle detection.
- Calculator domain types и validation.
- Site config, page registry и генерация metadata.
- Перемещение
components → widgetsи public API. - Разделение home/navigation/calculator компонентов.
- SEO baseline, Search Console и semantic map без изменения страниц.
- Technical SEO audit, link crawler, sitemap и structured data validation.
- Priority landing pages по одной подтверждённой search intent за итерацию.
- Brand/entity signals, about/contact и подтверждённые доказательства.
- Design tokens небольшими визуально проверяемыми партиями.
- Coverage, axe, bundle, SEO и Lighthouse gates.
- Финальная синхронизация документации и CI.
Каждый пункт должен иметь собственный зелёный gate и не смешиваться с соседним, если это затрудняет review или локализацию регрессии.
16. Стоп-условия
Текущий этап немедленно останавливается, если:
- меняется screenshot без заранее описанной причины;
- возникает hydration warning,
pageerror,console.errorили overflow; - тест становится зелёным только после ослабления assertion;
- для продолжения требуется disable линтера,
any,@ts-ignoreили!important; - меняется цена, mailto body, route, anchor или SEO-смысл;
- появляется новая cross-layer или циклическая зависимость;
- обнаружено пересечение с неизвестным пользовательским изменением;
- новый компонент не имеет самостоятельной ответственности;
- новый dependency добавляется без письменного обоснования;
- SEO-страница создаётся без подтверждённого намерения или уникальной пользы;
- для роста предлагаются keyword stuffing, doorway pages, скрытый текст, покупные ссылки или неподтверждённые claims;
- structured data не соответствует видимому содержанию страницы.
При остановке фиксируются точный файл, сценарий, ожидаемое и фактическое поведение. Snapshot и baseline не обновляются до устранения причины.
17. Формат отчёта после каждого этапа
Этап
- цель;
- изменённые владельцы и файлы;
- какие обязанности разделены;
- какие старые файлы удалены.
Проверки
- каждая команда: PASS/FAIL;
- количество unit/component/e2e tests;
- coverage;
- routes и viewport;
- visual comparison без update: PASS/FAIL.
Архитектура
- новые/изменённые зависимости;
- результат boundary fixtures и cycle detection;
- подтверждение public API.
SEO
- изменённые URLs и search intents;
- title/description/canonical/schema validation;
- indexability, internal links и sitemap;
- Search Console baseline/outcome без обещаний позиции;
- Core Web Vitals и Lighthouse.
Визуальная и поведенческая дельта
- отсутствует;
- либо точное согласованное изменение.
Риски и остаток
- что не выполнено;
- временные compatibility-решения;
- следующий безопасный этап.
Git
- git status --short;
- commit/push/deploy status.
18. Master-checklist всех работ
Этот раздел — единая точка контроля исполнения. Детальные требования и пороги берутся из соответствующих разделов выше, но завершение всей работы определяется только этим checklist.
18.1. Правила ведения checklist
-
RULE-01Перед началом назначить одного владельца актуального checklist. -
RULE-02Отмечать пункт только после получения проверяемого доказательства: diff, test output, audit report, screenshot или данные Search Console. -
RULE-03Для каждого PASS записывать команду, дату, окружение и результат. -
RULE-04Не отмечать родительский пункт, пока не выполнены все его дочерние требования и соответствующий Gate. -
RULE-05Не заменять FAIL обновлением snapshot, ослаблением assertion, отключением правила или снижением threshold. -
RULE-06После каждого этапа заполнять отчёт по шаблону раздела 17. -
RULE-07При блокере оставить пункт unchecked, записать точную причину и запросить только недостающие данные или полномочия. -
RULE-08Не объявлять реализацию завершённой, пока число unchecked-пунктовIMPL-*,VERIFY-*иCLOSE-*больше нуля. -
RULE-09Не объявлять весь SEO-цикл завершённым, пока не закрыты post-release пунктыSEO-POST-*; ожидание индексации оформляется как активный мониторинг, а не как завершение. -
RULE-10Commit, push и deploy не выполнять без отдельного разрешения владельца.
18.2. Baseline и защита исходного поведения
-
BASE-01Зафиксировать исходныйgit status --short. -
BASE-02Зафиксировать текущие версии Node, npm и dependencies. -
BASE-03Выполнить чистую установку черезnpm ciв CI-окружении. -
BASE-04Выполнитьnpm run check. -
BASE-05Подтвердить 17 исходных Vitest tests. -
BASE-06Подтвердить 96 исходных Playwright tests. -
BASE-07Подтвердить production build и SSR/prerender трёх страниц. -
BASE-08Зафиксировать текущие bundle sizes. -
BASE-09Зафиксировать список и checksum visual snapshots. -
BASE-10Сохранить representative screenshots для mobile, tablet и desktop. -
BASE-11Проверить прямое открытие всех текущих routes и anchors. -
BASE-12Зафиксировать текущие calculator results и mailto outputs. -
BASE-13Воспроизвести обнаруженную React lint ошибку. -
BASE-14Воспроизвести обход текущих architecture boundaries. -
BASE-15Воспроизвести выход keyboard focus из modal navigation. -
BASE-GATEGate 0 пройден полностью.
18.3. Regression tests до исправлений
-
TEST-01Добавить initial-focus test для navigation dialog. -
TEST-02Добавить forwardTabfocus-loop test. -
TEST-03Добавить reverseShift+Tabfocus-loop test. -
TEST-04Проверить недоступность header/main/footer во время modal state. -
TEST-05Проверить close button внутри dialog subtree. -
TEST-06Проверить закрытие поEscape, close button, backdrop и link. -
TEST-07Проверить восстановление focus, scroll, padding и inert. -
TEST-08Проверить cleanup при unmount и StrictMode remount. -
TEST-09Добавить architecture fixtures для всех запрещённых направлений. -
TEST-10Добавить fixture для parent-relative import. -
TEST-11Добавить fixture для deep import в обход public API. -
TEST-12Добавить tests соответствияModuleId ↔ pricing. -
TEST-13Добавить tests допустимых billing periods и adjustments. -
TEST-14Добавить numeric boundary/property tests calculator. -
TEST-15Подтвердить, что новые regression tests падают до исправлений по ожидаемым причинам. -
TEST-GATEGate 1 пройден полностью.
18.4. Modal navigation и React
-
IMPL-NAV-01Разделить ответственность trigger и dialog close button. -
IMPL-NAV-02Поместить close button внутрь dialog DOM subtree. -
IMPL-NAV-03Реализовать корректный initial focus внутри dialog. -
IMPL-NAV-04Ограничить focus trap видимыми descendants dialog. -
IMPL-NAV-05Сделать весь внешний DOM inert на время modal state. -
IMPL-NAV-06Сохранять и восстанавливать исходные inert/body styles. -
IMPL-NAV-07Гарантировать возврат focus на исходный trigger. -
IMPL-NAV-08Обеспечить корректный cleanup listeners/timers/portal. -
IMPL-NAV-09Удалить синхронныйsetStateиз effect. -
IMPL-NAV-10Сохранить SSR-safe portal и отсутствие hydration mismatch. -
IMPL-REACT-01Подключить полный React Hooks recommended flat preset. -
IMPL-REACT-02Исправить все новые diagnostics без disable-комментариев. -
IMPL-REACT-03Добавить browser assertion на отсутствие hydration warning. -
IMPL-REACT-04СохранитьStrictMode. -
IMPL-NAV-GATEGate 2 пройден полностью.
18.5. Архитектурные границы
-
IMPL-ARCH-01Утвердить схемуapp → pages → widgets → features → shared. -
IMPL-ARCH-02Перенести составные header/footer изcomponentsвwidgets. -
IMPL-ARCH-03Выделитьfeatures/navigation-theme. -
IMPL-ARCH-04Убрать зависимость calculator feature от navigation widget. -
IMPL-ARCH-05Создать page-ownedCalculatorSectionwrapper. -
IMPL-ARCH-06Перевести cross-layer imports на@/.... -
IMPL-ARCH-07Оставить./...только внутри локального модуля. -
IMPL-ARCH-08Запретить все parent-relative imports. -
IMPL-ARCH-09Настроить ESLint boundaries для каждого слоя. -
IMPL-ARCH-10Создать локальные public API feature/widget. -
IMPL-ARCH-11Запретить deep imports в обход public API. -
IMPL-ARCH-12Добавить cycle detection. -
IMPL-ARCH-13Удалить циклы, orphan exports и orphan files. -
IMPL-ARCH-14Обновить architecture fixtures и документацию. -
IMPL-ARCH-GATEGate 3 пройден полностью.
18.6. TypeScript и calculator domain
-
IMPL-TS-01ВключитьnoUncheckedIndexedAccess. -
IMPL-TS-02ВключитьexactOptionalPropertyTypes. -
IMPL-TS-03ВключитьnoFallthroughCasesInSwitch. -
IMPL-TS-04ВключитьnoImplicitOverride. -
IMPL-TS-05Устранить ошибки усиленного typecheck без ослаблений. -
IMPL-CALC-01Ввести закрытыйModuleId. -
IMPL-CALC-02Связать pricing сModuleIdчерезsatisfies. -
IMPL-CALC-03Типизировать Hosting, Installation, BillingPeriod и Adjustment. -
IMPL-CALC-04Вынести parsing и validation чисел в pure model. -
IMPL-CALC-05Удалить fallback отсутствующей цены в0. -
IMPL-CALC-06Проверять integer/min/max на уровне модели. -
IMPL-CALC-07Разделить validation, calculation и estimate formatting. -
IMPL-CALC-08Подтвердить неизменность всех валидных исходных расчётов. -
IMPL-DATA-GATECalculator-часть Gate 4 пройдена полностью.
18.7. Единый site config и metadata
-
IMPL-META-01Создать единыйshared/config/site.ts. -
IMPL-META-02Перенести туда brand, legal identity, base URL, контакты и social links. -
IMPL-META-03Создать типизированный page registry/metadata config. -
IMPL-META-04Генерировать title, description, canonical, Open Graph и Twitter metadata. -
IMPL-META-05Генерировать JSON-LD из того же источника. -
IMPL-META-06Удалить ручные дубликаты контактов и Organization data. -
IMPL-META-07Добавить build validation metadata и JSON-LD. -
IMPL-META-08Проверить согласованность UI, mailto, metadata и schema. -
IMPL-META-GATEMetadata-часть Gate 4 пройдена полностью.
18.8. SEO baseline и стратегия
-
SEO-BASE-01Подтвердить Google Search Console domain property. -
SEO-BASE-02Отправить и проверить XML sitemap. -
SEO-BASE-03Выгрузить query/page/country/device baseline. -
SEO-BASE-04Проверить фактическую индексацию текущих URLs. -
SEO-BASE-05Зафиксировать branded SERP по целевым регионам. -
SEO-BASE-06Подтвердить целевые языки и рынки. -
SEO-BASE-07Собрать семантическое ядро из проверяемых источников. -
SEO-BASE-08Сгруппировать запросы по search intent. -
SEO-BASE-09Создать картуintent → URL → evidence → CTA. -
SEO-BASE-10Назначить KPI, период и владельца каждому кластеру. -
SEO-BASE-GATESEO Gate 5.1 пройден полностью.
18.9. SEO-информационная архитектура и контент
-
SEO-IA-01Утвердить priority page map по подтверждённому спросу. -
SEO-IA-02Устранить cannibalization, duplicate и orphan pages. -
SEO-IA-03Обеспечить глубину до priority pages не более трёх переходов. -
SEO-IA-04Добавить crawlable descriptive internal links. -
SEO-IA-05Настроить корректные301,404и canonical policy. -
SEO-IA-06Добавлять новые routes одновременно в prerender и page registry. -
SEO-CONTENT-01Создать content brief для каждой priority page. -
SEO-CONTENT-02Определить audience, intent, message, evidence и CTA. -
SEO-CONTENT-03Написать уникальные title, description и h1. -
SEO-CONTENT-04Выстроить структуруценность → механизм → доказательство → ограничения → действие. -
SEO-CONTENT-05Подтвердить каждый факт внутренним источником. -
SEO-CONTENT-06Добавить осмысленные alt, media descriptions и transcript. -
SEO-CONTENT-07Провести редакторскую, продуктовую и юридическую проверку. -
SEO-CONTENT-08Подтвердить отсутствие keyword stuffing, doorway и fake claims. -
SEO-IA-GATESEO Gates 5.2 и 5.3 пройдены полностью.
18.10. Brand/entity и technical SEO
-
SEO-BRAND-01Зафиксировать основное имя BELF и допустимые варианты. -
SEO-BRAND-02Связать BELF, продукт, разработчика иbelf.uzна главной. -
SEO-BRAND-03Создать содержательные About и Contact pages. -
SEO-BRAND-04Настроить единый Organization@idи согласованный graph. -
SEO-BRAND-05Проверить logo, favicon, sameAs и внешние официальные профили. -
SEO-BRAND-06Настроить отдельное отслеживание брендовых запросов. -
SEO-TECH-01Генерировать sitemap из page registry. -
SEO-TECH-02Проверить robots, canonical, indexability и HTTP codes. -
SEO-TECH-03Обеспечить основной content и links в prerendered HTML. -
SEO-TECH-04Валидировать heading outline и image alt. -
SEO-TECH-05Валидировать Open Graph/Twitter assets. -
SEO-TECH-06Валидировать Organization, WebSite, SoftwareApplication и BreadcrumbList. -
SEO-TECH-07Добавить production link crawler. -
SEO-TECH-08Проверить mobile content/metadata parity. -
SEO-TECH-09Добавлять hreflang только для реальных полных переводов. -
SEO-TECH-10Реализовать blockingnpm run test:seo. -
SEO-TECH-GATESEO Gates 5.4 и 5.5 пройдены полностью.
18.11. Компонентная декомпозиция и стили
-
IMPL-COMP-01Выделить SiteHeader и NavigationDialog по ответственности. -
IMPL-COMP-02Устранить передачу CSS Module черезstylesprops. -
IMPL-COMP-03ВыделитьSignalStripизHeroSection. -
IMPL-COMP-04Сохранить самостоятельныйDashboardPreview. -
IMPL-COMP-05Разделить ClosingSections при подтверждённых границах. -
IMPL-COMP-06Отделить page CalculatorSection от feature Calculator. -
IMPL-COMP-07Разделить CalculatorForm на четыре предметных fieldset. -
IMPL-COMP-08Перенести business logic из JSX в pure model. -
IMPL-COMP-09Вынести Client/registry state в предметную модель. -
IMPL-COMP-10Добавить runtime validation registry JSON. -
IMPL-COMP-11Проверить каждый новый компонент правилом раздела 4.3. -
IMPL-COMP-12Выполнить complexity/size thresholds без искусственного дробления. -
IMPL-CSS-01Обеспечить одного владельца каждому CSS Module. -
IMPL-CSS-02Удалить component selectors из global CSS. -
IMPL-CSS-03Инвентаризировать повторяемые design values. -
IMPL-CSS-04Ввести семантические tokens небольшими партиями. -
IMPL-CSS-05Проверить visual regression после каждой CSS-партии. -
IMPL-COMP-GATEGate 6 пройден полностью.
18.12. Coverage, accessibility, performance и SEO automation
-
IMPL-QA-01Добавитьnpm run test:coverageи обязательные thresholds. -
IMPL-QA-02Довести pure model/lib coverage до заданных порогов. -
IMPL-QA-03Обеспечить changed-line coverage не ниже 90%. -
IMPL-QA-04Добавить axe-аудит всех page templates. -
IMPL-QA-05Добавить axe-аудит открытого navigation dialog. -
IMPL-QA-06Исправить table semantics registry. -
IMPL-QA-07Проверить полный keyboard journey и focus-visible. -
IMPL-QA-08Проверить reduced-motion. -
IMPL-PERF-01Добавитьcheck:bundleс blocking budgets. -
IMPL-PERF-02Добавитьcheck:lighthouseс тремя запусками. -
IMPL-PERF-03Достичь Lighthouse Performance/Accessibility/SEO thresholds. -
IMPL-PERF-04Обеспечить LCP/INP/CLS budgets в lab tests. -
IMPL-PERF-05Оптимизировать media/fonts без визуальной регрессии. -
IMPL-SEO-01Добавитьcheck:links. -
IMPL-SEO-02Добавить metadata/canonical/schema audit. -
IMPL-SEO-03Добавить home full-page visual baseline на шести viewport. -
IMPL-QA-GATEВсе automation-пункты Final Quality Gate работают локально и в CI.
18.13. Документация и CI
-
IMPL-DOC-01Обновить README по фактической структуре и командам. -
IMPL-DOC-02Обновитьdocs/architecture.md. -
IMPL-DOC-03Обновить CONTRIBUTING и инструкцию добавления route/section. -
IMPL-DOC-04Описать SEO page/content workflow. -
IMPL-DOC-05Удалить или явно архивировать противоречащие старые планы. -
IMPL-CI-01Добавить все обязательные scripts раздела 14. -
IMPL-CI-02Сделать локальный и CI quality-наборы эквивалентными. -
IMPL-CI-03Сделать deploy зависимым от всех blocking jobs. -
IMPL-CI-04Загружать test/audit reports при FAIL. -
IMPL-CI-05Запретить автоматический snapshot update в CI. -
IMPL-CI-06Зафиксировать поддерживаемую Node-версию иnpm ci. -
IMPL-CI-07Проверить production dependency advisories.
18.14. Финальная верификация реализации
-
VERIFY-01npm run format:check— PASS. -
VERIFY-02npm run lint— PASS, 0 warnings. -
VERIFY-03npm run lint:css— PASS, 0 warnings. -
VERIFY-04npm run typecheck— PASS. -
VERIFY-05npm run test— PASS три последовательных запуска. -
VERIFY-06npm run test:coverage— PASS. -
VERIFY-07npm run test:a11y— PASS. -
VERIFY-08npm run test:architecture— PASS. -
VERIFY-09npm run check:cycles— PASS. -
VERIFY-10npm run check:bundle— PASS. -
VERIFY-11npm run check:links— PASS. -
VERIFY-12npm run test:seo— PASS. -
VERIFY-13npm run check:lighthouse— PASS. -
VERIFY-14npm run build— PASS. -
VERIFY-15npm run test:e2e— PASS на всех viewport. -
VERIFY-16Все visual snapshots — PASS без необъяснённого update. -
VERIFY-17npm run quality— PASS. -
VERIFY-18git diff --check— PASS. -
VERIFY-19Ручной keyboard/accessibility smoke test — PASS. -
VERIFY-20Ручной visual review mobile/tablet/desktop — PASS. -
VERIFY-21Ручной SEO review rendered HTML — PASS. -
VERIFY-22Все routes, anchors, calculator, forms и registry — PASS. -
VERIFY-23Исходные пользовательские изменения сохранены. -
VERIFY-24Финальныйgit status --shortзаписан в отчёт. -
VERIFY-GATEВсе разделы Final Quality Gate 13.1–13.9 пройдены.
18.15. Post-release SEO и окончательное закрытие
Эти пункты требуют production deploy, доступа к Search Console и времени на crawl/index/re-ranking. До отдельного разрешения на deploy они остаются unchecked и не могут быть выданы за выполненные.
-
SEO-POST-01Production URLs проверены через URL Inspection. -
SEO-POST-02Sitemap успешно обработан без неожиданных excluded URLs. -
SEO-POST-03Priority pages имеют ожидаемый Google-selected canonical. -
SEO-POST-04Manual Actions и Security Issues отсутствуют. -
SEO-POST-05Organic conversion events подтверждены end-to-end. -
SEO-POST-06Field Core Web Vitals собраны и соответствуют Good либо создан план исправления конкретной метрики. -
SEO-POST-07Branded dashboard показывает BELF/Белф/BELF Proctor/belf.uz. -
SEO-POST-08Non-branded dashboard показывает каждый priority cluster. -
SEO-POST-09Выполнен первый отчёт после полного цикла переиндексации. -
SEO-POST-10Для запросов вне цели зафиксированы данные и следующая проверяемая гипотеза. -
SEO-POST-11Официальный сайт достиг позиции 1 по однозначным брендовым запросам в целевом регионе либо задача остаётся открытой с мониторингом. -
SEO-POST-12Настроен ежемесячный SEO-review без бесконтрольного переписывания страниц.
18.16. Условие завершения
-
CLOSE-01Все пунктыBASE-*,TEST-*,IMPL-*иVERIFY-*отмечены с доказательствами. -
CLOSE-02Все Gate 0–6 и Final Quality Gate пройдены. -
CLOSE-03Количество unchecked blocking implementation items равно нулю. -
CLOSE-04Итоговый отчёт перечисляет выполненное, команды, тесты, coverage, visual/behavior delta, SEO state, риски и git status. -
CLOSE-05Если production deploy разрешён, всеSEO-POST-*закрыты; если не разрешён, implementation task закрывается только как «готово к deploy», а общий SEO-цикл остаётся активным и не называется завершённым. -
CLOSE-06Работа объявляется полностью завершённой только при нулевом числе unchecked пунктов во всём Master-checklist.