Claude Code · Claude Opus 5 High
Тир BClaude Code · Anthropic · прогон 07.09.2026
Битриксовый модуль по канону D7 и узнаваемый референс с первой попытки; подвела адаптивность одной секции.
Выбранный референс
venetianspa.ca/«1. Побуквенное «зажигание» заголовков. Дисплейные заголовки разбиваются на слова и буквы; по мере прохода секции буквы слева направо переходят из бледного тона в золото. Прогресс считается от положения заголовка во вьюпорте, а не по таймеру. Заголовок первого экрана зажигается сразу после загрузки. 2. Арочная маска. border-radius: 50% 50% 0 0 / 42% 42% 0 0 — фото интро, плавающие фото…»
Агент выбирает референс сам и обязан воспроизвести его узнаваемо; это главный критерий среза «Визуал». Из SOLUTION.md, секция Reference.
Баллы по критериям
| Критерий | Модель | Автор | Итог |
|---|---|---|---|
|
Референс: выбор и следование
|
29 | 30 | 29.5 / 35 |
|
Композиция и адаптив
|
17 | 18 | 17.5 / 25 |
|
Тексты
|
13 | 13 | 13 / 15 |
|
Код вёрстки
|
12 | 10 | 11 / 15 |
|
SOLUTION.md
|
9 | 8 | 8.5 / 10 |
| Критерий | Модель | Автор | Итог |
|---|---|---|---|
|
Архитектура и битриксовость
|
26 | 25 | 25.5 / 30 |
|
Данные: ORM, гонка за слот, воспроизводимость
|
19 | 16 | 17.5 / 20 |
|
Ошибки и безопасность
|
13 | 13 | 13 / 15 |
|
Читаемость
|
12 | 13 | 12.5 / 15 |
|
Code-style по AGENTS.md
|
8 | 8 | 8 / 10 |
|
SOLUTION.md
|
9 | 8 | 8.5 / 10 |
Модель — ревью модели-ревьювера на том же стенде, не зная, чья связка перед ней. Автор — по живому стенду, не читая ревью модели. Итог = среднее.
Вывод
Связка Claude Code с Claude Opus 5 High закрыла задачу с первого прогона: замечаний от заказчика не потребовалось, лендинг, модуль записи, админка и письмо заработали сразу. Единственная итерация заняла весь отведённый лимит времени — 90 минут.
В визуале исход решило следование референсу. Агент выбрал реальный сайт нейл-спа и на десктопе воспроизвёл его узнаваемо: золото по кремовому, антиква капсом, арочный стык после первого экрана, карусель скруглённых карточек, плавающие арочные фото с вотермарком, форма записи на фото, золотой футер. Все приёмы, обещанные в разборе SOLUTION.md, на странице есть, включая побуквенное зажигание заголовков по скроллу и заливку кнопок при наведении. Тексты конкретные, отзывы различимы по голосу и привязаны к мастерам. Оценку снизила адаптивность: секция «Каждая деталь — удовольствие» на мобильной и планшетной ширине уезжает за экран, автор отметил наезжание блоков, подглючивание части анимаций, отсутствие маски телефона и JS в компонентах без BX. Первый экран референса — видео, у лендинга статичное фото.
В бэкенде обе стороны сошлись: это битриксовый модуль, а не PHP-фреймворк поверх ядра. Тонкие контроллеры с инъекцией сервисов, Result/Error, ServiceLocator, почтовое событие, штатные админские списки с правами и фильтрами, консольная команда генерации расписания, пять миграций sprint.migration от чистой площадки до готового стенда. Гонка за слот решена уникальным индексом и проверена параллельными запросами. Претензии мелкие: строки без Loc, дублирование репозиториев инфоблоков и админ-страниц, registerNamespace в include.php без нужды, имена файлов не в PascalCase, валидация в сервисах через if, возможная утечка текста SQL-исключения в ответ.
Главный плюс — рабочий и узнаваемый результат с первой попытки при каноничном D7. Главный минус — сломанная секция на двух из трёх контрольных ширин.
Комментарий автора
Из ревью модели
- [reference] 29/35 — Референс открывается, выбор уместен (реальный нейл-спа, Awwwards Nominee) и амбициозен. Рядом на десктопе это узнаётся как та же страница: золото по кремовому, антиква капсом 90/65 px (Playfair вместо Beautique Display — подходящая замена), арочный стык после первый экран, карусель скруглённых карточек с круглыми стрелками, гигантские центрированные заголовки с плавающими арочными фото и размытым вотермарком, арочные карточки отзывов, форма на фото с белыми pill-полями, золотой футер со скруглённым верхом. Все пять приёмов из разбора на странице есть (побуквенное зажигание по скроллу проверено, hover-заливка кнопок снизу и раскрытие описания карточки — проверено наведением). Минусы: у референса первый экран — видео с «падающими» буквами, у лендинга статичное фото и только перекраска букв; на мобильной ширине референс уходит в сплошной золотой первый экран, лендинг оставляет фото.
- [composition] 17/25 — На 1440 иерархия, воздух и ритм секций хорошие; на 360/768 первый экран, услуги, работы, мастера, отзывы, запись и футер собираются корректно, сетка слотов на 360 переходит в строки по дням без внутреннего скролла. Но секция «О студии» на ≤900px сломана: флекс-родитель ставит контент и ряд фото в одну строку, заголовок с двумя абзацами и CTA уезжают за экран — это заметная дыра на двух из трёх контрольных ширин. Клавиатура: skip-link, focus-visible на ссылках/кнопках, слоты — listbox со стрелками/Home/End/Enter, aria-selected и aria-disabled проверены; reduced-motion учтён в CSS и JS; alt у всех 25 картинок.
- [content] 13/15 — Оффер и факты («30 мин перерыв между гостьями на стерилизацию») конкретные, описания услуг говорят о технике и результате, отзывы разные по голосу и привязаны к конкретным мастерам, без «рыбы». Мелочи: «Согласна на обработку…» в чекбоксе предполагает только женский род клиента; «Больше 900 визитов» в первый экран и «почти тысячи визитов» в галерее чуть расходятся.
- [frontend-code] 12/15 — CSS на токенах и БЭМ, мёртвых правил не нашёл, шрифты — локальные сабсеты woff2, внешних ресурсов в рантайме нет (проверено по performance.getEntries). JS виджета читаем: состояния загрузки (aria-busy), ошибок по коду контракта, гонки запросов (ticket), успеха и сброса обрабатываются явно. Минусы: в секции работ переиспользованы классы «services__controls/services__arrows»; тексты шаблона компонента и JS зашиты строками без Loc; баг адаптива секции about (см. composition).
- [solution-doc] 9/10 — Разбор референса подробный и совпадает со страницей: каждая строка таблицы секций и все пять приёмов нашлись на лендинге, шрифты/палитра — как заявлено. Неточность одна: первый экран референса — видео, а не «фото на весь экран».
- [architecture-d7] 26/30 — Слои настоящие: тонкие контроллеры с инъекцией сервиса в action, сервисы с Result/Error, репозитории над ORM и над D7-сущностями инфоблоков, DI через ServiceLocator в .settings.php, консольная команда, options.php, почтовое событие с шаблоном ставится/снимается в InstallEvents/UnInstallEvents. Админка — штатные CAdminUiList с фильтром, меню в «Сервисах», права модуля D/R/W (просмотр по R, действия по W + sessid). Проверено на стенде: закрытие слота через меню строки сразу даёт «taken» в slots.list, удаление заявки освобождает слот, фильтр по мастеру/статусу работает. Минусы: пользовательские сообщения в сервисах и шаблоне компонента — строки без Loc; в установщике жёстко зашиты LID «s1»/«ru» для шаблона письма (install/index.php:175); в админ-страницах Loader::includeModule без проверки результата.
- [data] 19/20 — Таблицы и колонки совпадают с контрактом, ORM-сущности со связями Reference, инфоблоки services/masters. Гонка решена на уровне БД: 12 одновременных POST на один слот через curl — ровно один success, остальные SLOT_TAKEN, в таблице одна запись. Воспроизводимость — пять миграций sprint.migration (модуль, инфоблоки, контент с картинками из media/, расписание, шаблон сайта), на стенде все пять применены; генератор идемпотентен через INSERT IGNORE по уникальному (MASTER_ID, STARTS_AT). Мелочь: INSERT IGNORE — MySQL-специфичный raw SQL (slotrepository.php:106), down() расписания — голый DELETE.
- [errors-security] 13/15 — Все пять кодов контракта проверены curl-ом (CONSENT_REQUIRED, SLOT_NOT_FOUND, VALIDATION, MASTER_NOT_FOUND, SLOT_TAKEN); без sessid — invalid_csrf, GET на create — invalid_http_method. Согласие — чекбокс, время фиксируется в CONSENT_AT и показывается в админке и письме. slots.list отдаёт только id/время/статус, в исходнике главной ПДн нет, вывод в шаблонах и админке экранирован htmlspecialcharsbx. Минус: не-дубликатная SqlQueryException пробрасывается наверх, и Engine вернёт её текст с SQL в ответе (лечится Result вместо throw); телефон валидируется регуляркой, но не нормализуется.
- [readability] 12/15 — Файлы читаются с листа: короткие методы, говорящие имена (SlotView, BookingConfirmation, markPastAsTaken), комментарии там, где объясняют решение (гонка, идемпотентность). Копипаста: два iblock-репозитория дублируют getAll(), две админ-страницы дублируют каркас (права, сортировка, навигация); мёртвое: неиспользуемый lang-ключ, лишняя картинка stations.jpg в шаблоне, Loc::loadMessages в template.php без языкового файла.
- [code-style] 8/10 — declare(strict_types=1), final/readonly, типизированные сигнатуры, «<?=» в шаблонах, Request/Context вместо суперглобалов, весь код в /local (стабы в /bitrix/admin — штатное соглашение, обосновано в SOLUTION.md). Не по AGENTS.md: Loc не используется для текстов сервисов и шаблона компонента, один нетипизированный параметр действия, миграции выпадают из общего стиля (нет strict_types, другой отступ).
- [solution-doc] 9/10 — Гонка, воспроизводимость, админка, крайние случаи контракта и отклонения названы и совпадают с кодом и стендом (проверил индекс, миграции, стабы, опцию admin_email, фолбэк главной без модуля). Лимит 400 слов соблюдён. Не упомянуто, что письмо содержит ссылку на админку без порта хоста (в письме на стенде «http://ai.bitrix/bitrix/admin/…»).
Итого ревьювера. Впечатление решило то, что это именно битриксовый модуль, а не PHP-фреймворк поверх ядра: сервисы в ServiceLocator, Result/Error, почтовое событие, CAdminUiList с правами и фильтрами, sprint.migration от чистой площадки до готового стенда — и всё это работает вживую, включая решённую гонку (1 успех из 12 параллельных запросов). Главный плюс — визуальная верность референсу на десктопе: рядом с venetianspa.ca лендинг читается как та же страница с другим содержимым, и каждый обещанный приём есть. Главный минус — секция «Каждая деталь — удовольствие» на 360 и 768 px: заголовок, текст и кнопка уезжают за экран и обрезаются, что портит две из трёх контрольных ширин. По коду остаются мелочи: строки без Loc, дублирование репозиториев инфоблоков и админ-страниц, возможная утечка текста SQL-исключения в ответ.
Комментарии ревьювера, которые автор счёл точными; полное ревью — в репозитории.
Метаданные прогона
- Итерации
- 1 · с первого прогона
- Время агента
- 90 мин
- Токены in / out
-
1 256 / 546 681
кеш ввода 227 901 325кеш вывода 1 699 004
- Расход лимита
- 14% 5ч · тариф Max 5x ($100)
- Ядро Битрикс
- 26.700.0
Замечания между итерациями
Замечаний не было — результат принят с первого прогона.
Первая итерация полностью автономна; дальше автор пишет агенту как заказчик — без решений и имён API. Тексты сохраняются дословно.