Шаг 3 — решения и проверки
Самый долгий шаг: на каждое задание генерируются эталонное решение, спека данных, варианты, набор проверок и намеренно неверные решения. Всё это исполняется на настоящем Postgres — то, что попало в пак, уже прогонялось.

Как запускать
В списке слева — все утверждённые задания, в том числе те, что ещё ни разу не генерировались: у них серая точка и статус «не сгенерировано». Под названием списка — счётчик, полоска готовности и действия над всей практикой.
- «Сгенерировать недостающие (N)» — прогоняет задания, которые не готовы: не генерировались, не прошли гейт или устарели (формулировку поправили на шаге 2 после генерации). Готовые не трогает, в том числе сделанные вручную. Когда недостающих нет, кнопка неактивна и пишет «Все задания готовы».
- «⋯» → «Перегенерировать всё» — прогоняет все задания заново. Спрашивает подтверждение: готовые материализации будут перезаписаны.
Задания идут по одному. Во время прогона шапка списка показывает «идёт 2 из 5» и название задания; каждое готовое задание сохраняется сразу, не дожидаясь остальных. «Остановить» прерывает очередь после текущего задания. Если одно задание упало, очередь идёт дальше, а причины собираются в плашку над отчётом.
У выбранного задания в шапке две кнопки: «Сгенерировать» (или «Перегенерировать») гоняет только его, «Вручную» раскрывает под шапкой ручной режим для этого задания.
Что происходит при прогоне
Задание решается трижды: одна модель, другой промпт, вторая модель. Если результаты расходятся на одних и тех же данных — формулировка допускает два прочтения, и это дефект задания, а не решения. Статус решения разошлись — формулировка двусмысленна.
Модель описывает, какие бывают классы строк и какие крайние случаи обязаны существовать. Дальше данные строит движок: систематические крайности плюс случайные комбинации квот, обычно около полусотни вариантов. Три из них — именованные открытые примеры.
Эталонное решение прогоняется на каждом варианте, результат нормализуется и запоминается: для select — строки и хэш, для dml — состояние таблиц, для ddl — снимок схемы.
Проверки прогоняются на самом эталоне (должны пройти все) и на негативных решениях (каждое должно быть чем-то поймано). Не сошлось — задание получает статус проверки не сошлись и в готовые не попадает.
Каждый JSON-ответ модели — спека данных и негативные решения — сначала проверяется на форму: нужные поля, типы, ссылки внутри спеки (ключ квоты объявлен в class_columns, fk смотрит на таблицу, которая генерируется раньше). Если форма не та, модели один раз отправляется просьба исправить с перечнем ошибок по полям. Повтор касается только формы: расхождение решений и провал гейта не повторяются — это сигнал автору, а не опечатка.
Статусы задания в списке и в инспекторе:
| Статус | Что это значит |
|---|---|
| все проверки пройдены | задание готово ехать студентам |
| решения разошлись — формулировка двусмысленна | переформулируйте задание на шаге 2 |
| проверки не сошлись | набор проверок не ловит то, что должен; нужен переген |
| не удалось описать данные — нужен переген | спека правильной формы, но движок не смог построить по ней данные |
| ответ модели не разобран — нужен переген | ответ не той формы и после просьбы исправить; ошибки по полям — в отчёте |
| не сгенерировано | задание ещё не прогонялось |
| устарело — формулировка изменилась | задание правили после генерации; эталон проверяет уже другое |
Отчёт задания
Четыре вкладки. Первая — сводка, три остальные показывают всё содержимое материализации без сокращений.
Отчёт
Проверка однозначности (три решения рядом), правильное решение с подсветкой, правильный результат на открытых примерах и таблица «типичные ошибки студентов — какая проверка их ловит».
Варианты данных
Все варианты со своими квотами по классам и ожидаемым результатом. Открытые примеры — карточками с таблицей результата, скрытые — строками таблицы, любая раскрывается по кнопке: студия достаёт данные варианта из эфемерной базы.

Под варианты студия поднимает эфемерный Postgres и держит его на время процесса. Первый запрос ждёт старта контейнера (около сорока секунд), следующие отвечают мгновенно.
Проверки
Полный список проверок задания: тип, открытая или скрытая, параметры. Открытые проверки студент видит по именам, скрытые существуют только на бэкенде.

Негативные решения
Намеренно неверные запросы и то, какие проверки их поймали.

Негатив без единого чипа помечен как дыра: значит, студент, сделавший ровно эту ошибку, получит зачёт. Такое задание нужно перегенерировать или дописать ему проверку вручную.
Инспектор
Правая колонка держит итоги прогона на виду, пока вы листаете вкладки: статус, сколько вариантов данных и сколько среди них открытых, число проверок и негативов, список проверок с пометкой «скрытая», покрытие ошибок построчно. Скрывается кнопкой «Скрыть инспектор» — на узком экране прячется сам.
Отчёт приёмки
Помимо интерфейса конвейер пишет report/index.md в паке. Это тот же материал в виде файла — его удобно читать в мердж-реквесте, когда паки живут в git и правки к практике проходят ревью.