Шаг 2 — задания
Формулировки заданий по утверждённой предметной области. Пока область не утверждена, шаг сообщит об этом вместо формы — задания генерируются по её DDL.

Что содержит задание
| Поле | Зачем |
|---|---|
title | короткое имя в списках |
business_statement | что видит студент первым: бизнес-формулировка без имён таблиц и колонок, но со всем нужным для решения |
statement | точная техническая формулировка; по ней строятся проверки, студенту доступна в раскрытом «Полном условии» |
kind | select, dml или ddl — определяет, что вообще сравнивать |
objectives | темы курса, которые задание закрывает |
difficulty | 1–3, показывается студенту засечками |
require_constructs | конструкции, которые обязаны быть в решении |
forbid_constructs | конструкции, которых быть не должно |
Две формулировки — не дублирование. Студент читает бизнес-версию и сам решает, какие таблицы для этого нужны; техническая открывается в «Полном условии» и остаётся источником правды для проверок. Править бизнес-формулировку можно свободно: она исключена из source_hash, поэтому материализации от этого не устаревают.
Обе формулировки самодостаточны: по любой из них задание решается без второй. Бизнес-версия обязана называть, что вывести — все выводимые величины в том же порядке, что и в result.columns, — границы отбора и нужную сортировку; имён колонок в ней по-прежнему нет. Обе пишутся в Markdown: абзацы, списки, код, выделение.
Состав колонок, признак порядка, кардинальность и точность чисел студент видит отдельным блоком «что должно получиться» — он собран из машинных полей задания, а не из текста нейросети, поэтому не может разойтись с проверками.
Гейт формулировок
Перед утверждением студия проверяет не только покрытие тем, но и структуру постановки:
- бизнес-формулировка не пуста и не повторяет техническую дословно;
- у
select-задания задан состав колонок, имена не повторяются и не пусты; - если
result.orderedвключён, в формулировке сказано, по чему сортировать; - у
dml-задания перечисленыstate_tables, и все они есть в схеме.
Смысл текста машиной не проверяется — за него отвечает промпт и блок «что должно получиться» рядом с условием.
Требуемые и запрещённые конструкции
Так задание удерживается в теме занятия. «Без агрегатов» на первой лекции, «через JOIN, а не подзапрос» на четвёртой. Проверка sql_constraints разбирает решение как SQL: обойти требование DISTINCT через GROUP BY не получится.
Покрытие тем
До утверждения студия сверяет, сколько заданий закрывает каждую тему, с квотами из шага 1:
| Тема | Заданий | Нужно | |
|---|---|---|---|
| Простые SELECT и WHERE | 3 | 2–3 | покрыто |
| Вариации SELECT и WHERE | 5 | 6–8 | не хватает |
Пока в таблице есть непокрытые темы, кнопки утверждения нет. Варианты действий: перегенерировать задания, ослабить квоты на шаге 1 или дописать задания вручную через ручной режим.
Утверждение
«Утвердить задания» фиксирует хэш набора заданий и хэш области, к которой он собран. Если область потом изменится, задания получат пометку «устарели» с причиной — работать дальше с ними студия не даст.