Codex · GPT 5.6 Sol High
Тир CCodex · OpenAI · прогон 08.09.2026
Убедительный лендинг по референсу поверх бэкенда, который держит контракт, но написан на один показ.
Выбранный референс
Референс не зафиксирован.
Баллы по критериям
| Критерий | Модель | Автор | Итог |
|---|---|---|---|
|
Референс: выбор и следование
|
28 | 27 | 27.5 / 35 |
|
Композиция и адаптив
|
18 | 18 | 18 / 25 |
|
Тексты
|
12 | 13 | 12.5 / 15 |
|
Код вёрстки
|
9 | 5 | 7 / 15 |
|
SOLUTION.md
|
8 | 5 | 6.5 / 10 |
| Критерий | Модель | Автор | Итог |
|---|---|---|---|
|
Архитектура и битриксовость
|
21 | 15 | 18 / 30 |
|
Данные: ORM, гонка за слот, воспроизводимость
|
15 | 10 | 12.5 / 20 |
|
Ошибки и безопасность
|
12 | 10 | 11 / 15 |
|
Читаемость
|
11 | 10 | 10.5 / 15 |
|
Code-style по AGENTS.md
|
6 | 8 | 7 / 10 |
|
SOLUTION.md
|
8 | 5 | 6.5 / 10 |
Модель — ревью модели-ревьювера на том же стенде, не зная, чья связка перед ней. Автор — по живому стенду, не читая ревью модели. Итог = среднее.
Вывод
Связка прошла задание за один заход: замечаний автор не писал, результат приняли с первого прогона. Итог вышел неровным — визуал держится заметно лучше бэкенда.
Референс выбран уместно и амбициозно, и страница действительно узнаётся рядом с ним и на десктопе, и на мобильной ширине: та же шапка с пудровым состоянием при скролле, крупная антиква с курсивными словами, тонкие uppercase-подписи, асимметричные коллажи, контурные кнопки, появление блоков при скролле. Тексты не «рыба»: услуги описаны конкретно, отзывы привязаны к мастерам и различимы по голосу. Дальше начинаются проблемы. Промежуточная ширина 768 проработана слабее — коллаж и колонка селектов рассыпаются. CSS сдан одной минифицированной строкой на секцию, без исходника и с !important-заплатками; JS написан мимо BX; шаблон сайта не создавался, весь лендинг живёт в шаблоне компонента, а index.php сам рисует html и head. Маски телефона нет. Ревьювер отдельно поймал сломанный экран успеха: hidden перебивается display: grid, и форма остаётся видимой над подтверждением записи.
Бэкенд разложен по слоям не только на бумаге: контроллеры короткие, сервисы возвращают Result с кодами из контракта, репозитории на ORM, почтовое событие уходит штатно, а гонка за слот закрыта уникальным индексом — параллельные запросы на один слот дают ровно одну запись. Но отметить на этом срезе автору оказалось почти нечего. Админка сделана формально: страницы отдаются прямо из каталога модуля, список без пагинации и сортировки, фильтр и связь с мастером считаются в PHP запросом на каждую заявку, «удалить» и «закрыть» — GET-ссылки. Sprint.migration установлен и не использован, Loc почти не применяется, сервис-локатор устроен странно, в репозитории остался легаси CIBlockElement::GetList, а недубликатные ошибки базы уходят наружу через обработчик ядра.
Плюс у связки один, зато общий для обоих срезов: она держит замысел целиком — референс, контракт API, коды ошибок, права и почтовое событие сходятся без расхождений. Минус — всё, что нужно не показать, а поддерживать: минифицированный CSS без исходника, установщик вместо миграций, админка на GET-ссылках. Демо связка проходит, сопровождение — нет.
Комментарий автора
Из ревью модели
[reference] 28/35 — Референс открывается, выбор амбициозный и уместный; рядом на 1440 и 360 страницы узнаются как одна: та же шапка и её пудровое состояние при скролле, крупная антиква с курсивными словами, тонкие uppercase-подписи, асимметричные коллажи со скруглениями, контурные pill-кнопки и круглые стрелки, reveal снизу. Все пять пунктов чек-листа из SOLUTION.md на странице есть (проверил hover/focus, «дыхание» хиро, меню-панель, мобильные перекрывающиеся коллажи). Минусы: «Favorites» референса — шахматная сетка карточек, у автора вместо неё строгий прайс-список; хиро референса — видео без текста, здесь фото с заголовком (оправдано ТЗ); Open Sans был доступен бесплатно, замена на Manrope не обязательна. (SOLUTION.md:4 «goldustspa.com»; 1440px, хиро: пилюля слева, монограмма по центру, «Меню» с линиями справа, фото на весь экран; 1440px, футер: бегущая строка «Почувствуйте себя прекрасной» = «Feel Like Gold»; www/local/assets/lak-tochka/site.css:6 «.site-header.is-scrolled…background:rgba(208,176,156,.91)»)
[composition] 18/25 — 360 и 1440 собраны аккуратно, горизонтального скролла на 360 нет (scrollWidth = 360), skip-link, :focus-visible, стрелки/Home/End по слотам, reduced-motion (reveal сразу видим, анимации 0.01мс), alt у всех img осмысленные. Промежуточная ширина 768 проработана слабее: коллаж и селекты. Занятый слот делается disabled — он остаётся в дереве доступности с aria-disabled, но выпадает из tab-порядка, а виджет не фильтрует прошедшие даты: 9 сентября в 09:36 показывает вчерашний день и утренние часы как свободные. (768px, «О студии»: коллаж с фиксированной высотой 820px и десктопными процентами ширины превращается в узкие вертикальные полосы (site.css:8 «.about__collage{height:820px}» без правила в @media(max-width:1000px)); 768px, форма: колонка селектов сжата, текст «Выберите услугу» обрезается; www/local/components/bxmax/booking/templates/.default/script.js:116 «button.disabled = true»)
[content] 12/15 — Оффер и описания услуг конкретные (длительность, «180 оттенков», «без пропилов»), отзывы различимы по голосу и привязаны к мастерам и услугам, «рыбы» нет. Мелочи: eyebrow «Love notes» на английском (template.php:85), согласие «Согласна…» в женском роде (template.php:155), заголовок отзывов повторяет формат цитаты и сливается с первым отзывом. (www/local/components/bxmax/booking/templates/.default/template.php:88–92 отзывы «…спустя три недели ни одного скола», «…без “бетонного” слоя базы»; www/local/modules/bxmax.booking/install/index.php:236–243 услуги с ценами и длительностью)
[frontend-code] 9/15 — JS формы читаемый: состояния aria-busy, ошибка, загрузка, SLOT_TAKEN → перезапрос слотов, успех с фокусом на блок. Но экран успеха сломан: hidden перебивается классом с display:grid, форма остаётся видимой над «Запись подтверждена» (проверено: computed display = grid после отправки). CSS с переменными и понятным именованием, однако сдан в одну минифицированную строку на секцию — сопровождать невозможно, есть !important-заплатки. Внешних ресурсов в рантайме нет (0 запросов на сторонние хосты). (www/local/assets/lak-tochka/site.css — 17 строк минифицированного CSS на 17 КБ, исходной версии нет; site.css:13 «.consent{…text-transform:none!important;letter-spacing:0!important…}»; script.js:211 «form.hidden = true» при site.css:13 «.booking-form{display:grid}»)
[solution-doc] 8/10 — Разбор референса точный и полностью подтверждается страницей, отклонения (демо-реквизиты, трактовка недели, IS_CLOSED, prolog_before) осмысленны и совпадают с кодом. Не упомянуто, что весь лендинг, а не только форма и слоты, живёт в шаблоне компонента, и что шаблон сайта не создавался. (SOLUTION.md:10–15 карта секций; SOLUTION.md:23–27 чек-лист приёмов; SOLUTION.md:39 «Главная страница подключает prolog_before.php»)
[architecture-d7] 21/30 — Слои реальные: контроллеры в 10 строк, сервисы возвращают Result с кодами, репозитории на ORM, ServiceLocator, атрибуты фильтров, почтовое событие через CEventType/CEventMessage и Event::send, компонент по канону с копированием из install. Слабое место — админка: страницы отдаются напрямую из /local/modules/…/admin/ вместо заглушек в /bitrix/admin/, список без пагинации и сортировки (560 слотов одной таблицей), фильтр по дате и связь с мастером считаются в PHP c N+1 запросом на каждую заявку, действия «удалить/закрыть» — GET-ссылки, а не штатные действия CAdminList. Loc не используется нигде (options.php:17, admin/*.php, сообщения ошибок в сервисах). Шаблона сайта нет, index.php сам рисует html/head (www/index.php:7). (www/local/modules/bxmax.booking/.settings.php:22–27 регистрация сервисов с constructorParams; lib/Infrastructure/Controller/Api/Bookings.php:15–16 «#[HttpMethod…] #[DisablePrefilters…]»; admin/entries.php:44–55 «BookingEntryTable::query()…fetchAll()» + «$slotRepository->find(...)» в цикле; admin/menu.php:28 «'url' => '/local/modules/bxmax.booking/admin/entries.php…'»)
[data] 15/20 — Сущности и колонки по контракту, гонка решена уникальным индексом на SLOT_ID: 5 параллельных запросов на один слот — ровно один успех (проверено). Инфоблоки, наполнение, свойства, событие и расписание создаются кодом в DoInstall и идемпотентны по CODE. Минусы: sprint.migration стоит, папка миграций есть, но не использована; ScheduleService::provision (lib/Application/Service/ScheduleService.php:31) без проверки существующих слотов упадёт на уникальном индексе при повторном вызове; выдача слотов не отсекает прошедшее время. (install/index.php:93–99 «UX_BXMAX_ENTRY_SLOT … INDEX_UNIQUE»; lib/Application/Service/BookingService.php:60–71 catch → existsForSlot → SLOT_TAKEN; install/index.php:103 «provision(14)»; www/local/php_interface/migrations — пусто)
[errors-security] 12/15 — Все коды контракта воспроизведены (MASTER_NOT_FOUND, SLOT_NOT_FOUND, SLOT_TAKEN, VALIDATION, CONSENT_REQUIRED), без sessid — invalid_csrf, GET на create — invalid_http_method; slots.list отдаёт только id/время/статус; CONSENT_AT пишется сервером; вывод экранирован htmlspecialcharsbx; аноним на admin/entries.php получает форму входа, права D/R/W работают. Минусы: weekStart не проверяется на понедельник и на формат; недубликатные исключения БД перебрасываются наружу (BookingService.php:70) и уходят в ответ через обработчик ядра; смена состояния в админке по GET-ссылке. (lib/Infrastructure/Controller/Api/Slots.php:16 «DisablePrefilters([Authentication::class, Csrf::class])» только для GET-чтения; BookingService.php:36 CONSENT_REQUIRED, :41 regex телефона; admin/entries.php:35 «$right >= 'W' && check_bitrix_sessid()»; lib/Application/Service/SlotService.php:28–32 невалидный weekStart молча заменяется на текущую неделю)
[readability] 11/15 — Файлы короткие, имена говорящие, комментариев почти нет и они не нужны; SlotRepository и SlotService читаются с листа. Дублирование в установщике и сервисе, процедурные админ-страницы с логикой фильтра в цикле, минифицированный CSS без исходника. (BookingService.php:55, :66, :75 — трижды один и тот же existsForSlot → SLOT_TAKEN; install/index.php:134–143 и :276–285 дублирующий сбор siteIds; BookingService.php:84–88 и options.php:24–28 дублирующий fallback e-mail)
[code-style] 6/10 — strict_types, final/readonly, типизация, <?= в шаблонах, Context::getRequest вместо $_GET/$_POST, весь код в /local — соблюдено. Нарушено: Loc нигде не применяется для пользовательских строк (только lang для install), стиль скобок — битриксовский, а не PSR-12, как требует AGENTS.md. (lib/Model/SlotTable.php:3 «declare(strict_types=1)», :12 «final class»; BookingService.php:21 «private readonly»; options.php:17 «'TAB' => 'Настройки'» и admin/entries.php:68–74 строки без Loc; BookingService.php:34–35 «if (!$consent)» + «{» на новой строке — скобки Allman вместо PSR-12)
[solution-doc] 8/10 — Гонка, закрытие слотов, трактовка недели, поведение без модуля названы и совпадают с реализацией. Не объяснён отказ от sprint.migration в пользу сидинга из install и не обоснован легаси CIBlockElement::GetList в ContentRepository (lib/Infrastructure/Repository/ContentRepository.php:82). (SOLUTION.md:38 «Уникальный индекс UX_BXMAX_ENTRY_SLOT…»; SOLUTION.md:37 «Закрытие слота хранится дополнительным полем IS_CLOSED»; SOLUTION.md:36 трактовка недели)
Итого ревьювера. Впечатление решает визуал: лендинг действительно узнаётся как Goldust Spa с другим содержимым, все обещанные приёмы на месте, а бэкенд честно разложен по слоям с Result-ошибками и уникальным индексом, который выдержал параллельные запросы. Главный плюс — цельность: референс, контракт API, коды ошибок, CSRF, права и почтовое событие сходятся без расхождений. Главный минус — недоделанные края: экран успеха перекрыт незакрытой формой, виджет предлагает прошедшие слоты, планшетная ширина не проработана, а админка сделана на CAdminList формально — без пагинации, с фильтрацией в PHP и GET-действиями, при полном отсутствии Loc и миграций несмотря на установленный sprint.migration.
Комментарии ревьювера, которые автор счёл точными; полное ревью — в репозитории.
Метаданные прогона
- Итерации
- 1 · с первого прогона
- Время агента
- 63 мин
- Токены in / out
-
851 238 / 89 284
кеш ввода 21 354 880кеш вывода 0
- Расход лимита
- 64% 5ч · тариф Plus ($20)
- Ядро Битрикс
- 26.700.0
Замечания между итерациями
Замечаний не было — результат принят с первого прогона.
Первая итерация полностью автономна; дальше автор пишет агенту как заказчик — без решений и имён API. Тексты сохраняются дословно.