Перейти к основному содержимому

Шаг 3 — решения и проверки

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

Слева задания с точкой состояния, в центре отчёт, справа инспектор с итогами прогона.
отчёт заданияСлева задания с точкой состояния, в центре отчёт, справа инспектор с итогами прогона.

Как запускать​

В списке слева — все утверждённые задания, в том числе те, что ещё ни разу не генерировались: у них серая точка и статус «не сгенерировано». Под названием списка — счётчик, полоска готовности и действия над всей практикой.

  • «Сгенерировать недостающие (N)» — прогоняет задания, которые не готовы: не генерировались, не прошли гейт или устарели (формулировку поправили на шаге 2 после генерации). Готовые не трогает, в том числе сделанные вручную. Когда недостающих нет, кнопка неактивна и пишет «Все задания готовы».
  • «⋯» → «Перегенерировать всё» — прогоняет все задания заново. Спрашивает подтверждение: готовые материализации будут перезаписаны.

Задания идут по одному. Во время прогона шапка списка показывает «идёт 2 из 5» и название задания; каждое готовое задание сохраняется сразу, не дожидаясь остальных. «Остановить» прерывает очередь после текущего задания. Если одно задание упало, очередь идёт дальше, а причины собираются в плашку над отчётом.

У выбранного задания в шапке две кнопки: «Сгенерировать» (или «Перегенерировать») гоняет только его, «Вручную» раскрывает под шапкой ручной режим для этого задания.

Что происходит при прогоне​

Три решения независимо

Задание решается трижды: одна модель, другой промпт, вторая модель. Если результаты расходятся на одних и тех же данных — формулировка допускает два прочтения, и это дефект задания, а не решения. Статус решения разошлись — формулировка двусмысленна.

Спека данных и варианты

Модель описывает, какие бывают классы строк и какие крайние случаи обязаны существовать. Дальше данные строит движок: систематические крайности плюс случайные комбинации квот, обычно около полусотни вариантов. Три из них — именованные открытые примеры.

Эталон по всем вариантам

Эталонное решение прогоняется на каждом варианте, результат нормализуется и запоминается: для select — строки и хэш, для dml — состояние таблиц, для ddl — снимок схемы.

Гейт инвариантов

Проверки прогоняются на самом эталоне (должны пройти все) и на негативных решениях (каждое должно быть чем-то поймано). Не сошлось — задание получает статус проверки не сошлись и в готовые не попадает.

Каждый JSON-ответ модели — спека данных и негативные решения — сначала проверяется на форму: нужные поля, типы, ссылки внутри спеки (ключ квоты объявлен в class_columns, fk смотрит на таблицу, которая генерируется раньше). Если форма не та, модели один раз отправляется просьба исправить с перечнем ошибок по полям. Повтор касается только формы: расхождение решений и провал гейта не повторяются — это сигнал автору, а не опечатка.

Статусы задания в списке и в инспекторе:

СтатусЧто это значит
все проверки пройденызадание готово ехать студентам
решения разошлись — формулировка двусмысленнапереформулируйте задание на шаге 2
проверки не сошлисьнабор проверок не ловит то, что должен; нужен переген
не удалось описать данные — нужен перегенспека правильной формы, но движок не смог построить по ней данные
ответ модели не разобран — нужен перегенответ не той формы и после просьбы исправить; ошибки по полям — в отчёте
не сгенерированозадание ещё не прогонялось
устарело — формулировка измениласьзадание правили после генерации; эталон проверяет уже другое

Отчёт задания​

Четыре вкладки. Первая — сводка, три остальные показывают всё содержимое материализации без сокращений.

Отчёт​

Проверка однозначности (три решения рядом), правильное решение с подсветкой, правильный результат на открытых примерах и таблица «типичные ошибки студентов — какая проверка их ловит».

Варианты данных​

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

Каждый вариант с квотами по классам строк; раскрытие показывает данные и ожидаемый результат.
вкладка «варианты данных»Каждый вариант с квотами по классам строк; раскрытие показывает данные и ожидаемый результат.
Первое раскрытие медленное

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

Проверки​

Полный список проверок задания: тип, открытая или скрытая, параметры. Открытые проверки студент видит по именам, скрытые существуют только на бэкенде.

Все проверки задания с параметрами: что именно сравнивается на каждом варианте.
вкладка «проверки»Все проверки задания с параметрами: что именно сравнивается на каждом варианте.

Негативные решения​

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

Каждый негатив с чипами пойманных проверок; «ничем не поймано» — дыра в проверках.
вкладка «негативные решения»Каждый негатив с чипами пойманных проверок; «ничем не поймано» — дыра в проверках.

Негатив без единого чипа помечен как дыра: значит, студент, сделавший ровно эту ошибку, получит зачёт. Такое задание нужно перегенерировать или дописать ему проверку вручную.

Инспектор​

Правая колонка держит итоги прогона на виду, пока вы листаете вкладки: статус, сколько вариантов данных и сколько среди них открытых, число проверок и негативов, список проверок с пометкой «скрытая», покрытие ошибок построчно. Скрывается кнопкой «Скрыть инспектор» — на узком экране прячется сам.

Отчёт приёмки​

Помимо интерфейса конвейер пишет report/index.md в паке. Это тот же материал в виде файла — его удобно читать в мердж-реквесте, когда паки живут в git и правки к практике проходят ревью.