Опубликовано 02.10.2026 21:40
2 октября 2026, вечер: вёрстка медиа одним правилом и проверка главной и Frisco
Сессия по заданию Дениса от 2 октября (две задачи, вторая только после чистого скрипта первой). Тексты обеих страниц не менялись. Тестовый сайт обновлён: https://fppplumbing-preview.pages.dev (главная и /plumber-frisco-tx/).
Коротко
- Вёрстка: вместо обтекания и заплаток одно правило «текст плюс медиа» (design/layout-rules.md). Применено ко всем фото и клипам в тексте главной и Frisco. Скрипт проверки чистый: 2 страницы, 5 ширин, 0 пересечений, 0 выходов за экран.
- Починено сразу: ссылки на Google-профили и YouTube шли через переадресацию, теперь прямые; у главной появилась дата обновления в разметке; у окна полного видео появилась подпись для программ чтения; устаревшая заметка в файле текста Frisco.
- Проверки: 28 из 28 на сайте, валидатор schema.org ноль ошибок и ноль предупреждений на обеих страницах, факты против CLAUDE.md сходятся, скорость на телефоне в бюджете (главная 1,34 с, Frisco 1,51 с при пределе 1,6).
- Требуют решения Дениса: 6 пунктов (раздел 4). Для чата с текстом: 7 предложений (раздел 5).
- Баллы аудитов до и после: раздел 2.8 и таблица в конце.
1. Вёрстка медиа: одно правило вместо заплаток
Правило
Текст и медиа никогда не обтекают друг друга. Абзац и его картинки образуют один блок «текст плюс медиа»:
- от 1024 px блок это сетка из двух колонок: текст слева, медиа справа, колонка медиа треть ширины контента (для пары и четвёрки половина), медиа прижато к верху своего абзаца, текст не заходит под картинку;
- до 1024 px один столбец: текст, под ним медиа на всю ширину;
- никаких float;
- каждое фото и клип в ячейке заданной пропорции: горизонтальное фото 4:3, вертикальное фото 3:4, клип 9:16, кадр заполняет ячейку (object-fit cover), у img и video заданы width и height, ячейка не выше 80% экрана;
- пара «до и после» и четвёрка это сетка из двух равных колонок, ячейки одной ширины и одной высоты, у всей группы одна форма;
- подпись под картинкой внутри ячейки, одним стилем на всём сайте;
- абзацы того же раздела без своих картинок присоединяются к текстовой колонке блока: текст заполняет место рядом с высокой картинкой, а картинка остаётся у верха своего абзаца.
Правило записано в design/layout-rules.md для остальных 62 страниц, с разметкой, списком блоков дизайна вне правила и командой проверки. В CLAUDE.md добавлена строка со ссылкой на него.
Где я отступил от задания и почему
- Вертикальные фото 3:4, а не 9:16. Фото с телефона сняты 3:4; ячейка 9:16 резала бы четверть ширины каждого фото, в том числе подпись «AC condensate line» на фото 201, которую Денис просил нарисовать. Клипы 9:16, как сняты. В группе с клипом все ячейки 9:16 (так уже было: фото 166 в истории про главную линию).
- Пара и четвёрка стоят в колонке шириной половина контента, а не треть. При трети ячейка пары была бы 105 px на экране 1440 и 86 px на 1024, «до и после» не разглядеть.
- Следующие абзацы раздела заходят в текстовую колонку блока (см. правило). Без этого под коротким абзацем рядом с высоким фото оставалась пустота, на которую Денис жаловался вчера.
- Блок Дениса на главной остался как в утверждённом дизайне F2: портрет слева, текст справа. «See the Work» остался галереей из трёх ячеек, но теперь ячейки равные 3:4 (видео счётчика, квадратное, обрезано до 3:4 по бокам). Если нужно, чтобы и там медиа стояло справа от текста, это отдельное решение.
- На планшете в портретной ориентации (768) фото «на всю ширину» ограничено 80% высоты экрана, иначе одно фото 3:4 было бы выше экрана.
Что изменилось в коде
- site/src/styles/site.css: правила .pic-row, .media-row и .job-pic (float, clear, flow-root) удалены, вместо них блок .tm с ячейками .cell.
- tools/export_page_text.py: страницы из текстового файла собираются блоками «текст плюс медиа» (форма ячейки считается по размерам фото в photos/index.csv).
- site/src/layouts/Home.astro и tools/export_home_text.py: истории «From the Job» на главной тем же блоком.
- tools/check_layout.py: новый скрипт, снимки и проверка.
Снимки и результат скрипта
Скрипт python3 tools/check_layout.py грузит собранные страницы на 390, 768, 1024, 1280 и 1440 px, прокручивает их, снимает всю страницу (exports/layout-shots/<страница>-<ширина>.jpg, 10 файлов) и измеряет каждую картинку против каждого текстового блока. Нарушение: пересечение картинки с текстом, выход за край экрана, боковая прокрутка страницы. Исключения только для оверлеев дизайна (название услуги на плитке, заголовок на видео первого экрана), перечислены в скрипте с причиной.
| Страница | Ширина | Картинок | Текстовых блоков | Высота страницы | Пересечений | За экраном | Боковая прокрутка |
|---|---|---|---|---|---|---|---|
| / | 390 | 20 | 172 | 22519 | 0 | 0 | нет |
| / | 768 | 20 | 172 | 20418 | 0 | 0 | нет |
| / | 1024 | 22 | 174 | 13333 | 0 | 0 | нет |
| / | 1280 | 22 | 157 | 13682 | 0 | 0 | нет |
| / | 1440 | 22 | 157 | 13836 | 0 | 0 | нет |
| /plumber-frisco-tx/ | 390 | 24 | 125 | 25256 | 0 | 0 | нет |
| /plumber-frisco-tx/ | 768 | 24 | 125 | 24466 | 0 | 0 | нет |
| /plumber-frisco-tx/ | 1024 | 24 | 127 | 14088 | 0 | 0 | нет |
| /plumber-frisco-tx/ | 1280 | 24 | 127 | 13916 | 0 | 0 | нет |
| /plumber-frisco-tx/ | 1440 | 24 | 127 | 14122 | 0 | 0 | нет |
Сводные снимки всех блоков с медиа (каждый блок снят отдельно, шапка и панель звонка скрыты):
- Frisco: 390, 768, 1024, 1280, 1440
- Главная («See the Work» и «From the Job»): 390, 768, 1024, 1280, 1440
Замечание по ширине 1024: там страница Frisco ещё двухколонная (текст и боковая панель), поэтому текстовая колонка блока около 370 px, восемь-девять слов в строке. Читается, но плотно. Это следствие правила «от 1024», как задано.
2. Проверка главной и Frisco свежими глазами
2.1 Факты против CLAUDE.md
Сходится всё: 4,500+ клиентов и «more than 450 five-star reviews across Google, Yelp and Thumbtack», лицензия M-44816 без имени (главная: блок о компании, лента и подвал; Frisco: подвал и разметка), «Denys Kavaler, Managing Partner and Licensed Plumber», слово owner нигде, десять городов плюс Park Cities, «North Dallas suburbs» только в этой форме, tankless, reroute, hydro jetting и PHCC нет, цена только $49 (главная 4 раза, Frisco 1 раз), обещаний времени в нашем тексте нет, гарантия без сроков (FAQ главной), «twenty minute drive» как описание района.
Три места на границе правил, все в утверждённом тексте, не правил:
- Главная, раздел «Where We Work»: «On the Denton County side» это округ, не город Denton; проверка сайта это знает и даёт только предупреждение.
- Главная, отзыв Paul J. (Yelp): «FPP sent someone to my house in 20 minutes». Это слова клиента, отзывы по правилу 11 не правятся, но на странице стоит время приезда. Длинное тире в отзыве Adam Lis тоже дословное, разрешено.
- Frisco, пункт про измельчители: «one year warranty» и «ten year manufacturer warranty» это гарантии производителя из диктовки Дениса, не наши сроки.
2.2 Структура
- H2 с услугой и городом вместе: на Frisco нет; один заголовок на границе: «Sprinkler Backflow Preventers in Frisco: Replace, Test, Report to the City» (своей страницы у backflow нет, каннибализации нет). На главной «Same-Day Plumbing Services in Frisco, Plano & McKinney» намеренно, ради позиций живой страницы.
- FAQ: 16 вопросов двух страниц уникальны на всём сайте (267 вопросов на 64 страницах). У других страниц семь повторов, старый текст: «Do you charge extra after hours?» на восьми городских страницах и ещё шесть пар; чинить при переписывании тех страниц.
- «plumber near me»: на главной 5 раз в теле (плюс title и meta), на Frisco 1 раз, это и есть ссылка на главную. Ссылки на страницу Plano с Frisco нет.
- Главная ссылается на каждый город дважды: якорем «plumber in Frisco» в тексте и названием города в блоке карты. CLAUDE.md говорит «once»; второй раз даёт блок дизайна F2.
2.3 Ссылки
Frisco 44 ссылки в теле, главная 103. Все внутренние ведут на существующие страницы (проверка сайта), якоря /#how-a-call-works и #request существуют. Внешних адресов 23; проверены все:
- Починено: ссылки на профили Google шли через две переадресации (maps.google.com/?cid= → www.google.com/maps?cid=), ссылка на YouTube через одну (youtube.com → www.youtube.com). Теперь в адресах стоит конечная форма: в генераторе дизайна, в llms.txt и в CLAUDE.md.
- BBB, Yelp, Facebook и LinkedIn не отвечают роботу (403, 400, 999), но в браузере открываются: профиль BBB «FPP Plumbing, LLC», страница Yelp, страница Facebook «FPP Plumbing | Plano TX» (Facebook сам переводит profile.php на свой адрес /people/, это внутри Facebook), LinkedIn показывает стену входа для гостей, это обычное поведение LinkedIn.
2.4 Схема
validator.schema.org: главная 0 ошибок, 0 предупреждений; Frisco 0 ошибок, 0 предупреждений. Проверка сайта сверяет FAQPage с видимым FAQ слово в слово на всех 64 страницах.
- Главная: Plumber (@id organization, два офиса как Place с адресом, телефоном, часами и картой, 12 мест обслуживания, 10 профилей в sameAs), WebSite, WebPage, BreadcrumbList, Person (Денис, LinkedIn в sameAs), FAQPage на 9 вопросов. Починено: у WebPage не было dateModified, теперь 2026-10-02 (день закрытия версии 4).
- Frisco: то же плюс Service с provider на организацию, 8 VideoObject (ровно по числу клипов, у каждого название, описание, обложка, дата съёмки, длительность, адрес полного видео), 4 Review без общего рейтинга, dateModified 2026-10-02.
2.5 Фото и видео
- Главная: 24 картинки, Frisco: 16 картинок и 8 клипов. У всех src в HTML, alt, width и height. Город в alt и подписи везде, где он известен: Frisco 15 из 16 (фото 53 с корнями без города, место съёмки не записано); на главной плитки услуг без подписей по дизайну, у 7 плиток в alt нет города, потому что его нет в captions.csv.
- Имена файлов: 36 из 40 картинок зовутся номером (201-720.webp). Говорящие имена нужны, но это переименование всего конвейера фото (tools/optimize_photos.py, design/build_mockups.py, штамп кеша, ссылки из старых публикаций), не мелочь на вечер. Предложение в разделе 4.
- Вес и скорость на телефоне (tools/page_weight.py, tools/perf_budget.py): Frisco 1 391 КБ при загрузке, клипы 2,9 МБ только при прокрутке, полные видео 16 МБ только по нажатию; главная 1 812 КБ. LCP на телефоне: главная 1,34 с, Frisco 1,51 с, предел 1,6 с.
- Постер видео первого экрана главной стоит с loading="lazy" (это дизайн-блок). Пробовал поднять ему приоритет: оценка бюджета тут же посчитала его картинкой первого экрана на телефоне (где видео вообще не грузится) и показала 1,48 с, поэтому вернул как было. Настоящий LCP на телефоне от этого не зависит.
2.6 Клипы и кнопки звонка
Проверено скриптом на 5 ширинах. Все 8 клипов без controls, muted, loop, playsinline, не ловят нажатия (pointer-events none), у каждого кнопка «Play video» 44 на 44 px. Первый клип в зоне видимости играет (readyState 4, без ошибки). Нажатие на клип открывает окно поверх страницы с полным видео (199-prv-leaking-in-box-frisco-full.mp4, звук включён, плеер с управлением); Esc, крестик и нажатие мимо закрывают окно. Кнопки звонка: на 390 и 768 липкая панель с двумя номерами видна, на 1024 и шире номера в шапке; на первом экране главной две кнопки с номерами, на Frisco кнопка «Call Frisco» с номером и «Request Service».
2.7 Текст: check_text и совпадения
- check_text.py: главная PROBLEMS none, Frisco PROBLEMS none.
- check_overlap.py против конкурентов: 0 совпадений у обеих страниц.
- Между главной и Frisco четыре совпадения из 8 и более слов: про $49, «on where the closest plumber on duty is right now» и «you get an invoice that says what we did» (шаги вызова, намеренно) и одно лишнее: «requires a permit for the job, we pull it and go through the inspection» (шаг 5 на главной и раздел «How a Call Works From the Frisco Office»). Предложение в разделе 5.
- У Frisco четыре совпадения со старой страницей Frisco (два вопроса FAQ, фраза «water heaters installed with the bare minimum», строка офиса): сохранённые формулировки, намеренно.
2.8 Аудиты superseo и claude-seo
Два помощника, только чтение, по локальным копиям собранных страниц (сборка 19:42, до второй партии правок). Методика та же, что 1 октября: superseo page-audit, семь частей по 10 баллов. claude-seo seo-page числовой оценки 1 октября не давал (тогда была таблица фактов), поэтому для него сравнение по фактам.
superseo page-audit
| Часть | Главная 1 окт | Главная 2 окт | Frisco 2 окт (планка slab leak 49) |
|---|---|---|---|
| 1. Новая информация, которой нет у других | 5 | 7 | 9 |
| 2. Полнота темы | 5 | 7 | 8 |
| 3. E-E-A-T | 6 | 8 | 8 |
| 4. Структура и скорость ответа | 7 | 8 | 7 |
| 5. Техническое SEO на странице | 6 | 7 | 8 |
| 6. Вовлечение и вид в соцсетях | 6 | 7 | 8 |
| 7. Звонки и заявки | 8 | 8 | 7 |
| Итого | 43 | 52, +9 | 55, +6 к планке 49 |
Что подняло главную: четыре истории с вызовов, стаж Дениса, строка про команду, LinkedIn в разметке, meta без слогана, dateModified. Что держит: og:image это логотип, истории длинные для главной. Frisco: цифры с работы (80, 90 и 105 PSI, новый PRV на 70, 30 PSI у забитого клапана, около десяти слаб ликов за всё время), 8 клипов, настоящее og-фото; минусы: нет автора и даты на странице, лицензия только в подвале, отзывы и офис в самом конце.
claude-seo seo-page (по областям из 100): главная 82 (on-page 80, контент 85, технические мета 82, схема 85, картинки 76); Frisco 86 (90, 90, 88, 88, 76). Сравнимого числа за 1 октября нет. По фактам против 1 октября: слов в main на главной было около 1 900, стало 3 550, H2 было 5, стало 12; meta больше не повторяет title; у WebPage есть дата, у Person LinkedIn; на Frisco слов было около 1 100, стало 3 300, ссылка на Plano убрана, у офиса Frisco координаты и часы; LCP на телефоне главная 1,31 → 1,34 с, Frisco 1,25 → 1,51 с (тяжелее фото первого экрана, в бюджете).
Совпадающие находки обоих аудитов и куда они пошли: технические закрыты второй партией правок сегодня (раздел 3, пункты 6 до 15); текстовые и спорные в разделах 4 и 5. Советы навыков, которые нарушают правила проекта (цены и вилки, срок гарантии, телефон в тексте, имя RMP у лицензии, AggregateRating, имена сотрудников, соседние города на Frisco, больше «plumber near me», PHCC), в находки не вошли.
3. Что починено сегодня (без правки текста)
- Ссылки на профили Google и YouTube без переадресаций (раздел 2.3). Коммит ec83c35.
- dateModified у WebPage главной (раздел 2.4). Тот же коммит.
- Подпись aria-label у плеера полного видео (пустой video без имени мог попасть в отчёты как картинка без alt). Тот же коммит.
- Заметка в source/frisco-text-v1.md называла Sergey Kravchenko среди отзывов страницы, хотя его заменил Jan Shangle; заметка поправлена, текст не тронут. Коммит 62965f3.
- Вёрстка медиа и скрипт проверки. Коммит 1157d0a.
Вторая партия, по находкам аудитов (коммит 422fdb5):
- Строка лицензии в разметке: было «Texas master plumber license M-44816», стало «Responsible Master Plumber, License M-44816», слово в слово как в ленте и подвале (ИИ сверяет формулировки).
- Оба офиса в разметке на каждой странице несут свою страницу, координаты, часы и описание, а не только офис Frisco на своей странице: одна сущность, одни факты везде.
- Хлебные крошки в разметке: последний пункт назван так, как виден на странице («Plumber in Frisco, TX»), а не полным H1 на 79 знаков.
- WebPage страниц с узлом Дениса (главная, Frisco) получил reviewedBy на его Person: Денис читает каждую страницу с его диктовки до выкладки, узел перестал висеть без связи со страницей.
- og:image:width и og:image:height у страниц с фото 1200 на 630 (Frisco).
- VideoObject для клипа счётчика на главной (из видео 72, Plano, 20 ноября 2025, 4 секунды): раньше VideoObject были только у клипов Frisco.
- 13 названий услуг (H3 на главной) начинаются с заглавной буквы в самом HTML, а не только через CSS: машины читали «emergency plumbing».
- Alt двух фото блока «What is happening right now?» (006 водонагреватель, 048 PRV) берутся из photos/captions-en.csv, как у всех фото, вместо общих слов «Water heater in a closet» и «Pressure reducing valve in a wall box» в генераторе дизайна.
- Из srcset фото в тексте (Frisco и истории главной) убран файл 1600 px: телефон с плотным экраном брал его для картинки шириной 360 css px (044-1600 весит 792 КБ, 046-1600 665 КБ); остаются 480, 720 и 960.
- Журнал отзывов нового сайта: reviews/site-ledger.md (tools/site_reviews_ledger.py из reviews/site-reviews.json): кто на какой странице, 32 рецензента, повторов 0. Старый reviews/ledger.md это журнал по обходу старого сайта, в нём стоит заметка со ссылкой.
4. Что требует решения Дениса
- Отзыв Paul J. (Yelp) на главной со словами «in 20 minutes»: оставить (слова клиента) или заменить другим отзывом Yelp без времени приезда. Оба аудита назвали это первым риском: ИИ-помощник может пересказать это как обещание приехать за 20 минут.
- Блок Дениса на главной: оставить портрет слева, как в дизайне F2, или перевести на правило «текст слева, медиа справа».
- Видео счётчика в «See the Work» теперь обрезано до 3:4 ради равных ячеек. Если лучше квадрат, скажи.
- Имена файлов фото: перевести конвейер на имена вида 201-sink-drain-ac-line-frisco-720.webp. Это отдельная задача на одну сессию (переименование, перегенерация, штамп кеша, проверка старых ссылок).
- Ширина 1024: текстовая колонка блока рядом с боковой панелью около 370 px. Можно оставить, можно начинать двухколонный блок с 1100 (тогда на 1024 фото встанет под абзац).
- Заголовок «Sprinkler Backflow Preventers in Frisco: Replace, Test, Report to the City»: оставить как есть (страницы у backflow нет) или переформулировать без услуги в заголовке.
- og:image главной это логотип (находка ещё 1 октября). Нужен горизонтальный кадр с работы под 1200 на 630: предложения аудита 163 (пайка в тоннеле) или 112 (Денис на вызове). Денис выбирает, остальное техника.
- Отзыв Jan Shangle на Frisco: «they do charge 2.99% bank transaction fee». Отзыв настоящий, не правится. Но в FAQ главной про оплату картой сбора нет, ИИ сравнит. Варианты: одна фраза про сбор за карту в ответе об оплате (текст, если сбор есть) или другой отзыв на Frisco.
- Фото 053 (корни через унитаз) стоит в списке вызовов Frisco, а место съёмки не записано; в подписи и alt города нет, ложного утверждения нет. Подтвердить, что это Frisco, или заменить фото.
- Frisco: рядом с первой кнопкой звонка нет ни одного доказательства доверия, отзывы стоят 13-м разделом из 14 (у Trident «1,200+» наверху). Предложение: лента доверия под вступлением (Google 5.0 Frisco, BBB A+, Thumbtack, Yelp), техника, нужно только «да».
- Главная и Frisco делят запросы Frisco (Search Console за 3 месяца: «plumber frisco» главная 12,8, Frisco 10,9; «frisco plumber» 12,3 против 24,6; «plumber in frisco» 13,5 против 39,4). На главной Frisco стоит в title, H1, H2 услуг и в фразе про районы. Главная закрыта. Предложение аудита: после переезда 4 до 6 недель смотреть, кто берёт эти запросы, и если Frisco не выйдет вперёд, первым шагом убрать с главной фразу «in Frisco, where the homes are newer, it's the builder grade PRV and the expansion tank that fail early», а не title.
- Заголовки H3 на главной до первого H2: семь подписей групп домика («Roof», «Kitchen», …) и четыре одинаковых «Call the office closest to you» в панелях «What is happening right now?». Это H3 по дизайну (wow_pipe.py, build_mockups_fg.py и CSS), менять их на обычные подписи это отдельная правка генераторов дизайна, предлагаю на следующую сессию.
5. Что предлагается чату для текста (ничего не правил)
- Frisco, «How a Call Works From the Frisco Office»: фраза про пермит повторяет шаг 5 главной слово в слово («requires a permit for the job, we pull it and go through the inspection»). Переформулировать одной фразой в словах Дениса, например про инспектора Frisco, который уже упомянут выше.
- Frisco: номер лицензии стоит только в подвале и в разметке. Для ответа ИИ-поиску «is FPP Plumbing licensed» одна фраза с номером M-44816 в блоке офиса Frisco дала бы прямой цитируемый ответ.
- Frisco, история про главную линию: «hits a 45» понятно сантехнику, домовладельцу нет. Можно «hits a 45 degree fitting».
- Frisco, FAQ «Who answers the Frisco line after hours?»: ответ хороший, но сумма после-часового сбора нигде не названа, только «it depends on the hour». По правилам так и надо; если Денис захочет, можно назвать принцип (чем позже, тем дороже) без цифр.
- Главная, «Where We Work»: «On the Denton County side» формально называет Denton. Если проверка однажды станет строгой, фраза «to the west» без округа говорит то же.
- Главная: офисные часы (Monday to Friday, 8 AM to 5 PM) есть только в подвале и в разметке; в FAQ «Are you open 24/7?» одна фраза про часы офиса закрыла бы вопрос для ИИ-поиска.
- Старые страницы: семь повторяющихся вопросов FAQ (раздел 2.2) переписать при углублении тех страниц, список в этой странице.
- Frisco, список вызовов: PRV стоит вторым пунктом, а следующий пункт про водонагреватели начинается «The second most common call». Либо поменять местами, либо убрать «second».
- Frisco: «most of the houses we work in are under twenty years old» (первый раздел) и «houses under ten years old» (FAQ). Не ошибка, но читается как противоречие.
- Frisco, раздел про разрешения: одно предложение с тремя ссылками подряд («When a tank is due is in our guide…, one Frisco job from start to finish is here: …, and when the pan…»). Разбить на три.
- Frisco: фразы «right now» («This is the top call in Frisco right now», «That is the main trend we see in Frisco right now») без видимой даты. Дата 2026-10-02 стоит только в разметке. Если Денис согласен, строка «Updated October 2026» под H1 (как у гайдов) закроет это; CLAUDE.md требует подпись только у гайдов и постов, поэтому решение за ним.
- Frisco, title «Plumber in Frisco, TX | Licensed, Local, 24/7 | FPP Plumbing»: хвост «Licensed, Local, 24/7» повторяет конец H1 главной, две страницы, которые спорят за Frisco. Вариант аудита: «Plumber in Frisco, TX | Westridge Blvd Office | FPP Plumbing» (60 знаков). Только после проверки Search Console.
- Frisco: из одобренного Word файла (source/FPP-Frisco-City-Page.docx) в версию 1 не вошли «all four ZIP codes, 75033, 75034, 75035 and 75036» и глина под фундаментом; про грунт осталось «The soil here moves». У конкурентов ZIP коды есть. По одной фразе словами Дениса.
- Frisco: слово Frisco стоит 94 раза примерно на 4 100 слов, во всех 14 H2 и в 20 подписях (у Berkeys 47 на 1 662). Пока не переспам, но больше не добавлять.
- Frisco: в тексте и FAQ «Westridge Boulevard», в карточке офиса, подвале, разметке и Google «Westridge Blvd». Google понимает, мелочь, но одинаково лучше.
- Главная, блок о компании: «Texas master plumber license M-44816 from the Texas State Board of Plumbing Examiners», а утверждённая строка «Responsible Master Plumber, License M-44816». Текст закрыт, поэтому только на заметку; разметка теперь несёт утверждённую строку.
6. Проход читателем: телефон, вода на полу
Главная. Первый экран даёт то, что нужно: заголовок, одна строка, две кнопки с номерами, «A licensed plumber is on duty 24/7». Сразу под ним блок «What is happening right now?» с кнопками «Water on the floor» и остальными. Дальше страница длинная: 22 500 px на телефоне, около 27 экранов, и человеку с водой на полу после первых двух экранов она уже не нужна, он звонит. Где длинно для читателя без аварии: «From the Job» (четыре истории, 500 слов) и девять вопросов FAQ подряд. Где хочется позвонить и кнопки нет: нигде, липкая панель с двумя номерами стоит на любом экране. Непонятных мест нет; «ProPress tool» и «brazing torch» в блоке про грузовик это слова для тех, кто знает, остальные пропустят.
Frisco. Первый экран: заголовок, три фразы с адресом офиса и правилом «цена до работы», кнопка «Call Frisco» с номером, «Request Service». Для воды на полу этого хватает. Чего нет: подсказки «что закрыть первым» рядом с кнопкой. Блок «What to do: Water on the floor» (ссылки на страницу аварий) на телефоне стоит в самом конце страницы, после 25 000 px, потому что боковая панель на телефоне уходит под текст. Предложение по вёрстке, не по тексту: на телефоне показывать блок «What to do» сразу под первым экраном страниц услуг и городов, как «What is happening right now?» на главной. Длинно: четыре истории «From the Job in Frisco» подряд с четырьмя картинками у второй, и список из семи вызовов с фото у шести. Непонятно домовладельцу: «hits a 45», «T&P valve», «sediment trap» (оставить, это голос Дениса, но «45» стоит пояснить).
7. Для ИИ-поиска: на что страница отвечает прямо
Главная, прямые цитируемые ответы: лицензия (одна фраза с номером и TSBPE), два офиса и города (раздел «Where We Work» и FAQ), сколько стоит вызов ($49, в тексте и в FAQ), кто приедет (четыре-пять лицензированных сантехников, двое в смене), 24/7 и после-часовой сбор, пермиты (одна фраза), оплата, фото и отчёт, вода и сушка. Размазано: часы офиса (только подвал и разметка), адреса офисов с улицей и номером (только подвал, в тексте «Westridge Boulevard» и «Tennyson Parkway» без номеров: по правилу CLAUDE.md главная показывает оба адреса, и подвал это делает, но цитировать ИИ будет текст), гарантия (без срока, по решению).
Frisco, прямые ответы: адрес офиса (три раза, одинаково), пермиты и инспекция (раздел и FAQ), $49, кто приедет (FAQ), часы и 24/7 (FAQ и блок офиса), что ломается в домах Frisco (список с фото). Размазано: лицензия (только подвал и разметка, см. раздел 5), после-часовой сбор (принцип есть, суммы нет, по правилу), «how fast» (окно приезда по правилу без времени).
8. Файлы и команды
- design/layout-rules.md: правило вёрстки для остальных страниц.
- tools/check_layout.py:
python3 tools/check_layout.py(снимки в exports/layout-shots, отчёт exports/layout-check.md). - exports/layout-shots: 10 снимков всей страницы и 10 сводных снимков блоков.
- site/check-report.md: 28 проверок сайта, скорость на телефоне.
- Коммиты: 1157d0a (вёрстка), ec83c35 (ссылки, дата, подпись плеера), 62965f3 (заметка и CLAUDE.md).
Таблица баллов до и после
| Страница | superseo 1 окт | superseo 2 окт | claude-seo 2 окт (из 100) | Проверки сайта | Валидатор schema.org | LCP телефон (предел 1,6) | Скрипт вёрстки |
|---|---|---|---|---|---|---|---|
| Главная | 43 из 70 | 52 из 70 | 82 | 28 из 28 | 0 ошибок, 0 предупреждений | 1,34 с | чисто на 5 ширинах |
| Frisco | нет (slab leak 49) | 55 из 70 | 86 | 28 из 28 | 0 ошибок, 0 предупреждений | 1,51 с | чисто на 5 ширинах |