Опубликовано 02.10.2026 21:40

2 октября 2026, вечер: вёрстка медиа одним правилом и проверка главной и Frisco

Сессия по заданию Дениса от 2 октября (две задачи, вторая только после чистого скрипта первой). Тексты обеих страниц не менялись. Тестовый сайт обновлён: https://fppplumbing-preview.pages.dev (главная и /plumber-frisco-tx/).

Коротко

1. Вёрстка медиа: одно правило вместо заплаток

Правило

Текст и медиа никогда не обтекают друг друга. Абзац и его картинки образуют один блок «текст плюс медиа»:

Правило записано в design/layout-rules.md для остальных 62 страниц, с разметкой, списком блоков дизайна вне правила и командой проверки. В CLAUDE.md добавлена строка со ссылкой на него.

Где я отступил от задания и почему

  1. Вертикальные фото 3:4, а не 9:16. Фото с телефона сняты 3:4; ячейка 9:16 резала бы четверть ширины каждого фото, в том числе подпись «AC condensate line» на фото 201, которую Денис просил нарисовать. Клипы 9:16, как сняты. В группе с клипом все ячейки 9:16 (так уже было: фото 166 в истории про главную линию).
  2. Пара и четвёрка стоят в колонке шириной половина контента, а не треть. При трети ячейка пары была бы 105 px на экране 1440 и 86 px на 1024, «до и после» не разглядеть.
  3. Следующие абзацы раздела заходят в текстовую колонку блока (см. правило). Без этого под коротким абзацем рядом с высоким фото оставалась пустота, на которую Денис жаловался вчера.
  4. Блок Дениса на главной остался как в утверждённом дизайне F2: портрет слева, текст справа. «See the Work» остался галереей из трёх ячеек, но теперь ячейки равные 3:4 (видео счётчика, квадратное, обрезано до 3:4 по бокам). Если нужно, чтобы и там медиа стояло справа от текста, это отдельное решение.
  5. На планшете в портретной ориентации (768) фото «на всю ширину» ограничено 80% высоты экрана, иначе одно фото 3:4 было бы выше экрана.

Что изменилось в коде

Снимки и результат скрипта

Скрипт 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 нет

Сводные снимки всех блоков с медиа (каждый блок снят отдельно, шапка и панель звонка скрыты):

Замечание по ширине 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» как описание района.

Три места на границе правил, все в утверждённом тексте, не правил:

2.2 Структура

2.3 Ссылки

Frisco 44 ссылки в теле, главная 103. Все внутренние ведут на существующие страницы (проверка сайта), якоря /#how-a-call-works и #request существуют. Внешних адресов 23; проверены все:

2.4 Схема

validator.schema.org: главная 0 ошибок, 0 предупреждений; Frisco 0 ошибок, 0 предупреждений. Проверка сайта сверяет FAQPage с видимым FAQ слово в слово на всех 64 страницах.

2.5 Фото и видео

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 и совпадения

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. Что починено сегодня (без правки текста)

  1. Ссылки на профили Google и YouTube без переадресаций (раздел 2.3). Коммит ec83c35.
  2. dateModified у WebPage главной (раздел 2.4). Тот же коммит.
  3. Подпись aria-label у плеера полного видео (пустой video без имени мог попасть в отчёты как картинка без alt). Тот же коммит.
  4. Заметка в source/frisco-text-v1.md называла Sergey Kravchenko среди отзывов страницы, хотя его заменил Jan Shangle; заметка поправлена, текст не тронут. Коммит 62965f3.
  5. Вёрстка медиа и скрипт проверки. Коммит 1157d0a.

Вторая партия, по находкам аудитов (коммит 422fdb5):

  1. Строка лицензии в разметке: было «Texas master plumber license M-44816», стало «Responsible Master Plumber, License M-44816», слово в слово как в ленте и подвале (ИИ сверяет формулировки).
  2. Оба офиса в разметке на каждой странице несут свою страницу, координаты, часы и описание, а не только офис Frisco на своей странице: одна сущность, одни факты везде.
  3. Хлебные крошки в разметке: последний пункт назван так, как виден на странице («Plumber in Frisco, TX»), а не полным H1 на 79 знаков.
  4. WebPage страниц с узлом Дениса (главная, Frisco) получил reviewedBy на его Person: Денис читает каждую страницу с его диктовки до выкладки, узел перестал висеть без связи со страницей.
  5. og:image:width и og:image:height у страниц с фото 1200 на 630 (Frisco).
  6. VideoObject для клипа счётчика на главной (из видео 72, Plano, 20 ноября 2025, 4 секунды): раньше VideoObject были только у клипов Frisco.
  7. 13 названий услуг (H3 на главной) начинаются с заглавной буквы в самом HTML, а не только через CSS: машины читали «emergency plumbing».
  8. 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» в генераторе дизайна.
  9. Из srcset фото в тексте (Frisco и истории главной) убран файл 1600 px: телефон с плотным экраном брал его для картинки шириной 360 css px (044-1600 весит 792 КБ, 046-1600 665 КБ); остаются 480, 720 и 960.
  10. Журнал отзывов нового сайта: reviews/site-ledger.md (tools/site_reviews_ledger.py из reviews/site-reviews.json): кто на какой странице, 32 рецензента, повторов 0. Старый reviews/ledger.md это журнал по обходу старого сайта, в нём стоит заметка со ссылкой.

4. Что требует решения Дениса

  1. Отзыв Paul J. (Yelp) на главной со словами «in 20 minutes»: оставить (слова клиента) или заменить другим отзывом Yelp без времени приезда. Оба аудита назвали это первым риском: ИИ-помощник может пересказать это как обещание приехать за 20 минут.
  2. Блок Дениса на главной: оставить портрет слева, как в дизайне F2, или перевести на правило «текст слева, медиа справа».
  3. Видео счётчика в «See the Work» теперь обрезано до 3:4 ради равных ячеек. Если лучше квадрат, скажи.
  4. Имена файлов фото: перевести конвейер на имена вида 201-sink-drain-ac-line-frisco-720.webp. Это отдельная задача на одну сессию (переименование, перегенерация, штамп кеша, проверка старых ссылок).
  5. Ширина 1024: текстовая колонка блока рядом с боковой панелью около 370 px. Можно оставить, можно начинать двухколонный блок с 1100 (тогда на 1024 фото встанет под абзац).
  6. Заголовок «Sprinkler Backflow Preventers in Frisco: Replace, Test, Report to the City»: оставить как есть (страницы у backflow нет) или переформулировать без услуги в заголовке.
  7. og:image главной это логотип (находка ещё 1 октября). Нужен горизонтальный кадр с работы под 1200 на 630: предложения аудита 163 (пайка в тоннеле) или 112 (Денис на вызове). Денис выбирает, остальное техника.
  8. Отзыв Jan Shangle на Frisco: «they do charge 2.99% bank transaction fee». Отзыв настоящий, не правится. Но в FAQ главной про оплату картой сбора нет, ИИ сравнит. Варианты: одна фраза про сбор за карту в ответе об оплате (текст, если сбор есть) или другой отзыв на Frisco.
  9. Фото 053 (корни через унитаз) стоит в списке вызовов Frisco, а место съёмки не записано; в подписи и alt города нет, ложного утверждения нет. Подтвердить, что это Frisco, или заменить фото.
  10. Frisco: рядом с первой кнопкой звонка нет ни одного доказательства доверия, отзывы стоят 13-м разделом из 14 (у Trident «1,200+» наверху). Предложение: лента доверия под вступлением (Google 5.0 Frisco, BBB A+, Thumbtack, Yelp), техника, нужно только «да».
  11. Главная и 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.
  12. Заголовки 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. Что предлагается чату для текста (ничего не правил)

  1. 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, который уже упомянут выше.
  2. Frisco: номер лицензии стоит только в подвале и в разметке. Для ответа ИИ-поиску «is FPP Plumbing licensed» одна фраза с номером M-44816 в блоке офиса Frisco дала бы прямой цитируемый ответ.
  3. Frisco, история про главную линию: «hits a 45» понятно сантехнику, домовладельцу нет. Можно «hits a 45 degree fitting».
  4. Frisco, FAQ «Who answers the Frisco line after hours?»: ответ хороший, но сумма после-часового сбора нигде не названа, только «it depends on the hour». По правилам так и надо; если Денис захочет, можно назвать принцип (чем позже, тем дороже) без цифр.
  5. Главная, «Where We Work»: «On the Denton County side» формально называет Denton. Если проверка однажды станет строгой, фраза «to the west» без округа говорит то же.
  6. Главная: офисные часы (Monday to Friday, 8 AM to 5 PM) есть только в подвале и в разметке; в FAQ «Are you open 24/7?» одна фраза про часы офиса закрыла бы вопрос для ИИ-поиска.
  7. Старые страницы: семь повторяющихся вопросов FAQ (раздел 2.2) переписать при углублении тех страниц, список в этой странице.
  8. Frisco, список вызовов: PRV стоит вторым пунктом, а следующий пункт про водонагреватели начинается «The second most common call». Либо поменять местами, либо убрать «second».
  9. Frisco: «most of the houses we work in are under twenty years old» (первый раздел) и «houses under ten years old» (FAQ). Не ошибка, но читается как противоречие.
  10. Frisco, раздел про разрешения: одно предложение с тремя ссылками подряд («When a tank is due is in our guide…, one Frisco job from start to finish is here: …, and when the pan…»). Разбить на три.
  11. 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 требует подпись только у гайдов и постов, поэтому решение за ним.
  12. 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.
  13. Frisco: из одобренного Word файла (source/FPP-Frisco-City-Page.docx) в версию 1 не вошли «all four ZIP codes, 75033, 75034, 75035 and 75036» и глина под фундаментом; про грунт осталось «The soil here moves». У конкурентов ZIP коды есть. По одной фразе словами Дениса.
  14. Frisco: слово Frisco стоит 94 раза примерно на 4 100 слов, во всех 14 H2 и в 20 подписях (у Berkeys 47 на 1 662). Пока не переспам, но больше не добавлять.
  15. Frisco: в тексте и FAQ «Westridge Boulevard», в карточке офиса, подвале, разметке и Google «Westridge Blvd». Google понимает, мелочь, но одинаково лучше.
  16. Главная, блок о компании: «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. Файлы и команды

Таблица баллов до и после

Страница 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 ширинах