Auteur
Проектирование и сборка кинематографичных веб-страниц уровня наград.
Метаданные навыка
| Источник | Опциональный (устанавливается по запросу) — hermes skills install official/creative/auteur |
| Путь | optional-skills/creative/auteur |
| Версия | 1.3.1 |
| Автор | agiwhitelist (https://github.com/agiwhitelist, апстрим agiwhitelist/auteur), портирован Hermes Agent |
| Лицензия | MIT |
| Платформы | linux, macos, windows |
| Теги | web-design, cinematic, scroll-animation, design-system, anti-slop, frontend |
| Связанные навыки | popular-web-designs, design-md, p5js |
Справочник: полный SKILL.md
Ниже — полное определение навыка, которое Hermes загружает при его срабатывании. Именно это агент видит как инструкции, когда навык активен.
Навык Auteur
Портирован из agiwhitelist/auteur (MIT), снимок коммита
9bca227d— см.LICENSE. Скрипты, шаблоны и справочные файлы взяты из апстрима как есть (CRLF→LF); единственные правки — заметки об адаптации под Hermes и исправленные путиreferences/.
Auteur проектирует и собирает веб-страницы так, как режиссёр снимает фильм: сначала сценарий, потом реквизит, потом съёмка, потом монтаж. У навыка три регистра — build (отличный сайт в привычном формате), direct (кинематографичный сайт, управляемый скроллом) и system (многоэкранный продукт как единая дизайн-система) — и одно общее ядро вкуса. Ничего не уходит в релиз, пока страница не пройдёт исполняемый анти-слоп-гейт и навык сам не посмотрит на собственный результат.
Когда использовать
- Нужно собрать или переделать лендинг, маркетинговый сайт, hero-секцию, портфолио или страницу продукта — и «выглядит как у всех» не вариант.
- В брифе просят скролл-анимацию, сторителлинг или сайт, который ощущается как фильм.
- Продукт занимает несколько экранов, которые должны выглядеть одним целым — приложение, дашборд, админка, онбординг, документация.
- Кто-то говорит сделай красиво, сделай вау, кинематографично или дизайн-система, не называя конкретной техники.
Не для полировки чужого UI и не для чисто бэкенд-задач.
Требования
- Node 18+ — каждый QA-гейт — это
.mjs-скрипт, который запускается черезnodeв инструментеterminal. - Playwright (для QA-гейтов) — в каталоге проекта:
npm install playwright, затемnpx playwright install chromium. Нужен дляscripts/shoot.mjs,motionqa.mjs,systemscan.mjs,refscout.mjs,chromadiff.mjs,moodboard.mjs(скрипты импортируютplaywrightво время выполнения; уslopscan.mjsиsource.mjsзависимостей почти нет). - ffmpeg — опционально; только для видео- и звуковых сценариев из
references/assets.mdиreferences/scroll-flight.md. - Инструменты Hermes —
image_generateдля генерации и редактирования изображений,terminalдля node/ffmpeg/npm,write_file/read_fileдля файлов проекта,vision_analyze, чтобы по-настоящему смотреть на скриншоты, иbrowser_execдля осмотра живой страницы, когда скрипт не подходит.
Как запускать
Что навык делает на самом деле
- Фиксирует арт-дирекшн письменно, до первой строки разметки — один оттенок, одна типографическая система, бюджет движения, названные анти-референсы.
- Генерирует или подбирает ассеты: инструмент Hermes
image_generate, Blender, карты глубины, CC0-меши и HDRI с записанными лицензиями. - Собирает по проверенным рецептам — один контекст WebGL, движение только через transform/opacity, конечные автоматы для скролла.
- Прогоняет результат через гейты:
slopscanвалит сборку на конкретном слопе,motionqa— на выпавших кадрах,systemscan— на расхождении между маршрутами.
Доступ к сети
Скрипты разведки и подбора ассетов читают живые страницы (awwwards, поиск картинок Bing/Pinterest/are.na, Poly Haven, Iconify, Google Fonts, Openverse, Coverr). Загруженный контент используется только как референсы и метаданные лицензий — он никогда не исполняется, и никакие учётные данные, API-ключи или логины в процессе не участвуют. Если исходящие запросы нежелательны, полностью пропустите фазы 0–1; все остальные фазы работают офлайн. moodboard.mjs дополнительно скачивает картинки по URL, которые вернули поисковые хосты, чтобы собрать контактный лист.
Маршрутизация
Прочитайте аргумент / бриф и выберите маршрут:
directили бриф пахнет кино — «вау», «кинематографично», «иммерсивно», «сторителлинг», «страница запуска», «премиальный бренд», «чтобы люди перестали листать» → загрузитеreferences/direct.mdи следуйте его фазам. Это флагманский регистр.buildили в брифе ОДНА обычная поверхность — маркетинговая страница, лендинг, отдельная страница продукта → загрузитеreferences/build.md.systemили в брифе больше одного экрана, которые должны ощущаться одним продуктом — приложение, дашборд, админка, настройки, онбординг, документация или контентный сайт с настоящей навигацией → загрузитеreferences/system.md. Единицей дизайна становится компонент × состояние, режимом отказа — расползание (drift), а не скука, и пика здесь намеренно нет. Если вы уже вbuild, а на горизонте появился второй экран, — остановитесь и переключитесь: половина системы хуже любого из двух вариантов.editили запрос меняет страницу, которую собрал этот навык (в проекте естьdesign/DESIGN.md) — «добавь секцию», «поменяй цены», «замени текст в hero» → СНАЧАЛА прочитайтеdesign/DESIGN.mdи следуйте его протоколу редактирования: переиспользуйте токены, паттерны открытия секций и семейства движения; после правки запустите slopscan и переснимите затронутые вьюпорты. Правка, игнорирующая DESIGN.md, — регрессия, даже если сама по себе выглядит хорошо.recon <brief>или просят только референсы — «найди референсы», «собери мудборд», «что сейчас считается передним краем для сайтов X» → загрузитеreferences/recon.mdи выполните только эту фазу: разведайте живые сайты, соберите мудборд, вернитеdesign/refs/REFERENCES.md(с заполненными строкамиsteal:) иdesign/moodboard/contact-sheet.png(с заполненным разбором). Без commit-sheet, без сборки.audit <path-or-url>→ загрузитеreferences/verify.mdи прогоните конвейер верификации по странице, собранной auteur. Если цель — существующий UI, который auteur не собирал, и пользователь хочет его отполировать, а не пересобрать, скажите, что для этого нужен отдельный проход UI-полировки/критики (в апстриме auteur работал в паре с отдельным навыком «impeccable», сюда он не включён), и предложите продолжить, только если нужна пересборка.- Неоднозначно (например, просто «сделай лендинг») → задайте ровно один вопрос: «Отличный лендинг в привычном формате или режим кино со скролл-режиссурой и сгенерированными ассетами?» (в апстриме примеры брифов были на русском; здесь они переведены). Затем маршрутизируйте. (Многоэкранные брифы неоднозначными не считаются — это
system.) Больше пока ничего не спрашивайте: у каждого регистра свой опрос.
Все три регистра делят нулевую фазу, и её центр тяжести — commit-sheet. Порядок различается: build идёт recon → commit-sheet → макет; direct идёт recon → раскадровка → commit-sheet → макет, потому что шесть решений принимаются о сценах фильма; system идёт recon → system-sheet (карта маршрутов + инвентарь компонентов) → commit-sheet → макет, потому что шесть решений принимаются о продукте, а не о странице. В любом случае ни строчки кода, пока лист не заполнен.
Взаимодействие с другими навыками
Auteur строит; он не полирует чужой UI. Если у пользователя есть готовый интерфейс, который нужно доработать, проведите отдельный проход UI-критики (например, vision_analyze по скриншотам плюс соседние дизайн-навыки). В апстриме auteur работал в паре с навыком критики «impeccable» (сюда не включён); гейт верификации auteur и внешняя критика измеряют разное и спокойно уживаются.
Краткий справочник
Непреложные правила и таблица фаз. Они действуют в каждом регистре, на каждой фазе, всегда — даже если ни один справочный файл не загружен. Правило «узнал — откажись»: если вы собираетесь выдать что-то из этого списка, остановитесь и перестройте элемент.
Запрещено (переписать, а не подправить)
| # | Запрет | Вместо этого |
|---|---|---|
| 1 | border-left/border-right толще 1px как цветной акцент на карточках, врезках, алертах | полная рамка, подкрашенный фон, иконка в начале — или ничего |
| 2 | Градиентный текст (background-clip: text + градиент) | один сплошной цвет; акцент через начертание или размер |
| 3 | Глассморфизм по умолчанию (декоративные карточки с backdrop-filter) | редко и осмысленно, либо сплошные поверхности |
| 4 | Шаблон «hero-метрика» (большое число, мелкая подпись, ряд статистики, градиентный акцент) | доказательства в тексте, один продуманный визуал |
| 5 | Одинаковые сетки карточек (иконка + заголовок + текст одного размера, повторённые) | варьировать размер, структуру или вовсе убрать карточки |
| 6 | Надзаголовки-кикеры (крошечная разреженная капительная подпись) над каждой секцией | максимум один осознанный кикер как элемент бренд-системы; варьировать открытие секций |
| 7 | Нумерованный каркас секций (01 / 02 / 03), когда порядок ничего не значит | номера только для настоящей последовательности |
| 8 | Inter или Space Grotesk как первый выбор шрифта | брать пару по оси контраста (см. taste.md); эти два — ИИ-дефолт 2024–2026 годов |
| 9 | Градиенты фиолетовый→синий (оба стопа в оттенке 250–290) | осознанный фирменный оттенок или никакого градиента |
| 10 | Кремовый/тёпло-бежевый фон тела как рефлекс «теплоты» (OKLCH L 0,84–0,97, C <0,06, оттенок 40–100) | насыщенная фирменная поверхность, настоящий off-white с хромой ~0 либо более тёмный тонированный полутон; тепло живёт в акценте, шрифте и изображениях |
| 11 | Один и тот же fade-in/slide-up на входе каждой секции | каждое появление подходит тому, что оно показывает; варьировать easing, дистанцию, направление |
| 12 | transition: all | перечислять анимируемые свойства |
| 13 | window.addEventListener('scroll', ...) | IntersectionObserver, GSAP ScrollTrigger или CSS animation-timeline |
| 14 | Появление из scale(0) | начинать с scale(0.95) + opacity |
| 15 | Bento-сетки из почти одинаковых или пустых ячеек; белая карточка на белом bento | bento только с реальной визуальной вариативностью в каждой ячейке, иначе другая раскладка |
| 16 | Штампы в копирайте: “Revolutionize”, “Seamless”, “Effortless”, “Unleash”, “Elevate”, предложения, перегруженные длинными тире, декоративные ленты вроде “BRAND. MOTION. SPATIAL.” | конкретные утверждения простыми словами |
| 17 | Больше одной бегущей строки (marquee) на страницу | одна или ни одной |
| 18 | Instrument Serif / Playfair Display как рефлекторный «элегантный серифный» | серифы, выбранные под бренд, а не из ИИ-шортлиста |
Обойти запрет можно только через письменный auteur-allow (см. «Верификация») с настоящей причиной: осознанный, аргументированный выбор — это голос; дефолт — это слоп.
Критические числа (запомнить; полный контекст в справочных файлах)
- Контраст основного текста ≥ 4,5:1 (крупный текст ≥ 3:1). Плейсхолдеров это тоже касается. Приглушённый серый на тонированном белом — ошибка читаемости №1 у ИИ.
- Длина строки основного текста 65–75ch. Потолок дисплейного заголовка: максимум clamp ≤ 6rem для заголовков в потоке текста; вордмарк или намеренно типографический hero — исключение, и commit-sheet должен это оговаривать. Межбуквенный интервал дисплейных ≥ −0,04em.
- Длительности: кнопка 100–160 мс · тултип 125–200 мс · выпадающий список 150–250 мс · модалка/дровер 200–500 мс · любой UI дольше 300 мс требует письменного обоснования.
- Easing на входе/выходе = ease-out.
ease-inв UI запрещён. - Анимировать только
transformиopacity. Stagger 30–80 мс. - Бюджет движения: ≤ 3 семейств скролл-паттернов на страницу; один главный вау-пик, остальные сцены — на меньшей интенсивности.
- Сглаживание scrub 0,3–0,8. Hero-видео ≤ 2 МБ. LCP < 2,5 с. CLS < 0,1.
- Полноэкранные проходы (bloom, зерно, DoF, любой полнокадровый шейдер) стоят по пикселям, а не по объектам — именно они, а не геометрия, съедают бюджет кадра. Показатель производительности засчитывается только при измерении на DPR 2 на production-сборке: DPR 1 уменьшает стоимость каждого такого прохода вчетверо, а dev-сервер примерно удваивает время кадра.
prefers-reduced-motion= альтернативный арт-дирекшн (мягче, но не ноль), никогда не запоздалая заплатка.- Контент должен читаться с выключенным JS: появления усиливают уже видимое состояние по умолчанию, но никогда не запирают видимость.
Фазы одним взглядом
| Фаза | Регистр build | Регистр direct | Регистр system | Что загрузить |
|---|---|---|---|---|
| 0 | recon → commit-sheet → гейт hero-макета | recon → сценарий (STORYBOARD.md) → commit-sheet → гейт hero-макета | recon → SYSTEM-SHEET.md (маршруты + инвентарь компонентов + состояния) → commit-sheet → гейт макета | recon.md, затем build.md / direct.md / system.md |
| 1 | — | производство ассетов (генерация → правка → оптимизация) | — (иконки/шрифты подбираются через source.mjs) | assets.md |
| 2 | собрать страницу | смонтировать фильм (сначала плавный скролл, затем hero, затем сцены сверху вниз) | токены → оболочка → экраны в порядке трафика → каждое состояние | build.md / scroll-cinema.md / system.md + taste.md + motion.md |
| 3 | верификация | верификация + CINEMA-QA.md | верификация + systemscan по каждому маршруту | verify.md |
| 4 | зафиксировать стиль: заполнить design/DESIGN.md | то же | то же, но DESIGN.md — это контракт компонентов | templates/DESIGN.md |
Гейт hero-макета (один статичный одноразовый экран, заскриншоченный и утверждённый до того, как собрано что-либо ещё) — самый дешёвый момент, чтобы сменить арт-дирекшн; подробности в справочнике каждого регистра. design/DESIGN.md — стилевой контракт, благодаря которому каждая последующая правка остаётся в стиле (маршрут edit читает его первым).
Никогда не пропускайте гейт из-за того, что промежуточный результат «выглядит готовым». Гейты существуют именно потому, что страница, которая всего лишь выглядит готовой, — ровно то, что выпускает любой другой ИИ.
Процедура
Commit-sheet (до любого кода, в обоих регистрах)
Слоп появляется, когда решения принимают дефолты. Commit-sheet заставляет вынести на бумагу семь настоящих решений до первой строки кода. Скопируйте templates/COMMIT-SHEET.md в проект (например, в design/COMMIT-SHEET.md) и заполните все семь полей не-дефолтами:
- Пик — ОДИН главный вау-момент (direct) или фирменный элемент (build). Одно предложение. Если не можете его назвать, вы не готовы строить.
- Цвет — основной цвет в OKLCH + уровень приверженности (сдержанный / committed / полная палитра / насыщенный до предела) + одна строка: почему это не лавандовый, не кремовый и не рефлекс категории + светлота фона числом (целевое среднее L), потому что «тёмное выглядит премиально» — именно то место, где этот навык сползает, а число потом можно проверить, в отличие от настроения.
- Шрифт — пара «дисплейный + текстовый» по оси контраста (серифный+гротеск, геометрический+гуманистический, моноширинный+серифный…) + одна строка: почему не Inter.
- Слом сетки — та единственная конкретная вещь, что ломает дефолт симметричной сетки: наложение, асимметричное деление, диагональный поток, полноэкранный разрыв. Назовите её конкретно.
- Бюджет движения — сколько семейств скролл-паттернов (≤3) и какие именно.
- Проверка рефлексов — запишите: (a) что сделал бы типовой ИИ для этой категории (рефлекс первого порядка), (b) что сделал бы типовой ИИ, избегающий (a) (рефлекс второго порядка — например, финтех → «тёмный режим терминала» тоже уже приелся), (c) ваше выбранное отклонение от обоих. Если разведка была, (a) — не догадка: то, что
design/refs/REFERENCES.mdпоказал пять раз, и есть рефлекс, с датой и доказательствами. - Сломанные фирменные штампы — назовите минимум два пункта из
taste.md§2.5, которые вы в этот раз намеренно не делаете, и чем заменяете каждый. Поля 6a/6b — рефлексы категории; здесь — рефлексы самого навыка, которые повторяются в несвязанных проектах и невидимы изнутри любого из них: почти чёрные фоны, моноширинные служебные подписи, шапка «логотип/статус/действие», футер с инструкцией прокрутить, янтарные или кислотные акценты, вордмарк вместо hero, свечение вместо освещения. По девяти витринным сборкам: восемь были тёмными, а три попали в пределы 0,002 одной и той же светлоты. Штамп, который здесь действительно уместен, может остаться — объясните почему, как сauteur-allow.
Гейт: каждое поле заполнено конкретным, не дефолтным ответом. Пустое или общее поле («современный, чистый вид») означает: стоп, принимайте решение. Этот артефакт проверяется повторно на этапе верификации.
Справочные файлы
references/recon.md— разведка фазы 0, два исполняемых плеча:scripts/refscout.mjsпрофилирует живые сайты уровня наград (реальный стек, закреплённые сцены, бюджет скролла, шрифты, отрисованная палитра, скриншоты — механика, а не шкурки), аscripts/moodboard.mjsсобирает пронумерованный контактный лист из Bing / Pinterest / are.na, чтобы арт-дирекшн выбирался по живому материалу, а не по памяти. Также: искусство запросов, правило заимствования (steal), как разведка питает commit-sheet и черта «референсные картинки — не ассеты». Загружать в начале фазы 0.references/taste.md— полная анти-слоп-система: расширенные запреты с заменами, таблица категорийных рефлексов второго порядка, уровни цветовой стратегии, подбор шрифтовых пар, правила копирайта. Загружать для любого визуального решения.references/motion.md— школа движения: когда анимировать, числа для easing/длительности/пружин, правила производительности, бюджет движения, политика звука. Загружать перед написанием любой анимации.references/build.md— процесс стандартного регистра. Загружать при маршруте build.references/system.md— многоэкранный регистр: карта маршрутов, инвентарь компонентов как гейт, матрица состояний (пустое/загрузка/ошибка — не крайние случаи), правила плотности, правило «без пика» иscripts/systemscan.mjs, который обходит каждый маршрут, читает то, что браузер реально отрисовал, валит тип контрола, вышедший за объявленный бюджет вариантов — считая состояния (disabled, current, внутри строкиdata-state) отдельно, чтобы реализация матрицы состояний никогда не читалась как расползание, — нажимает Tab, чтобы поймать контролы без видимого состояния фокуса, и рендерит по плитке на каждый отрисованный вариант, чтобы расползание было и видно, и посчитано. Загружать при маршруте system.references/direct.md— кинематографичный регистр: контракт сценария, листы сцен, драматургия, порядок монтажа. Загружать при маршруте direct.references/assets.md— медиа-команда и маршрутизация (в Hermes:image_generateдля всей генерации и правки изображений,terminalдля ffmpeg/node; видео — через тот бэкенд image→video, что есть у пользователя), §0.5 подобрать или сгенерировать (scripts/source.mjs: CC0-меши glTF, HDRI и PBR-материалы с Poly Haven, иконки, шрифты, CC-изображения, стоковое видео — с реестром лицензий, потому что генерация не умеет делать геометрию и IBL, а стоковое видео никогда не должно быть пиком), трюк консистентности (правка кадра A в кадр B), локальное видео через цепочку «первый→последний кадр», сгенерированные элементы/мокапы, эмбиент-саундтрек, лестница деградации и кеширование ассетов. Загружать во время фазы 1 регистра direct.references/scroll-cinema.md— рабочие рецепты кода: видео, управляемое скроллом, canvas-последовательности, фундамент GSAP+Lenis, CSS scroll-driven-анимации, появление текста, WebGL-переход со смещением по двум ключевым кадрам, view transitions, эмбиент-звук и библиотека кинематографичных переходов (шторка, занавес, леттербокс, затвор, параллакс глубины). Загружать во время сборки.references/scroll-flight.md— уровень video-scrub: фотореалистичный hero «полёт сквозь мир», управляемый скроллом, на готовомtemplates/scroll-flight-engine.js. Канонический рецепт для видео, прокручиваемого скроллом (кодирование под scrub-g 8, постеры из закодированных кадров, гейт швов по SSIM, архитектура цепочки A/B, защита декодирования для iOS/мобильных, швы crossfade-vs-seamless). Загружать, когда hero должен быть фотореалистичной съёмкой/ИИ-видео, а не WebGL в реальном времени.references/ambient-backgrounds.md— тихая текстура для второстепенных секций и простых сборок (не для hero): подборка из 6 редакционных/аналоговых эффектов (бумажное зерно, линии гроссбуха/чертежа, топографические изолинии, чернильный прилив, редкая пыль, один шейдер теплового марева) + статичный mesh-дефолт без движения. Главное правило (слабее самого тихого элемента переднего плана; один эмбиент на страницу), стек «сначала CSS/SVG» и правило производительности «feTurbulence— только статично». Загружать, когда секции нужно не быть плоской, но при этом НЕ спорить с текстом.references/verify.md— приёмочный конвейер: slopscan → серия скриншотов → QA движения/производительности/звука (FPS на DPR 2 на production-сборке, long tasks, гейт звука, reduced-motion, для сцен уровня Tier-1) → числовая рубрика → сравнение с референсом (ваш кадр рядом с референсом, задавшим направление, гдеscripts/chromadiff.mjsизмеряет уход цвета, который модель в себе никогда не видит) → подпись QA. Загружать на фазе 3.
Заметка для слабых моделей
Если вы — небольшая модель, исполняющая этот навык: следуйте таблицам и числам буквально, заполняйте каждое поле шаблона, запускайте каждую команду гейта и не импровизируйте за пределами справочных рецептов — рецепты проверены, ваша импровизация нет. Когда справочный файл спорит с вашим чутьём, побеждает файл. Пишите файлы по путям относительно корня проекта; никогда не перепечатывайте абсолютный путь по памяти (имя навыка «auteur» отделяет от «author» одна опечатка, а абсолютные пути с ошибками разбрасывают ваш вывод по всей файловой системе).
Подводные камни
- Сетевая разведка:
refscout.mjs,moodboard.mjsиsource.mjsчитают живые страницы (awwwards, поиск картинок Bing/Pinterest/are.na, Poly Haven, Iconify, Google Fonts, Openverse, Coverr). Загруженный контент — только референсы и метаданные лицензий; никогда его не исполняйте. Чтобы остаться полностью офлайн, пропустите фазы 0–1. - Другая среда исполнения: эти скрипты и документы писались под другую агентную среду (в апстриме генерация ассетов шла через несколько локальных CLI для изображений). В Hermes каждая инструкция по генерации изображений отображается на инструмент
image_generate; если проза документации и реальность разошлись, доверяйте выводуnode scripts/<x>.mjs --helpи фактическим ошибкам node. - Непроверенные команды: скрипты проходят синтаксическую проверку
node --check, но полные прогоны (которым нужныnpm install playwrightи загрузка chromium) при портировании не выполнялись. Считайте сквозное поведениеshoot.mjs,motionqa.mjs,systemscan.mjs,refscout.mjs,chromadiff.mjs,moodboard.mjs,source.mjs, а также все рецепты кодированияffmpeg/видео непроверенными утверждениями апстрима, пока не запустите их сами. - Проверенное поведение slopscan:
node scripts/slopscan.mjs <dir>запускается без npm-зависимостей; печатает находки по каждому правилу и завершается ненулевым кодом при провалах (код 0, если чисто). - Кеш метаданных шрифтов:
source.mjs font …кеширует ~2,6 МБ JSON с метаданными Google Fonts в файлauteur-gf-metadata.jsonво временном каталоге ОС (os.tmpdir()), а не в проекте; чтобы принудительно обновить, удалите его там.
Верификация
Страница не готова, когда код компилируется. Она готова, когда:
node scripts/slopscan.mjs <src-dir>завершается с кодом 0 (провалы исправлены, а не заглушены —/* auteur-allow: RULE_ID -- reason */существует для осознанных решений и требует настоящей причины);node scripts/shoot.mjs <url>сделал серии скриншотов на 390 / 768 / 1440, и вы посмотрели каждый кадр — переполнение текста, пустые сцены, сломанные появления, развалившуюся вёрстку находят глазами, а не текстовым поиском;- числовая рубрика из
references/verify.mdпройдена (контраст, LCP, CLS, прогон с reduced-motion, разнообразие сцен); - для регистра direct:
CINEMA-QA.md(из шаблонов) заполнен, и в каждой строке стоит PASS.
Если хоть один гейт провален — исправьте и перезапустите. Отчитывайтесь честно: «slopscan чистый, просмотрен 21 скриншот, LCP 1,9 с» лучше, чем «выглядит отлично».