- backend/scripts/seed_ctmath_exam_tasks.js — переносит размеченные вопросы ЦТ-11 из банка questions в exam_tasks (exam_key='ctmath') для отдельного модуля exam-prep. Dry по умолчанию, запись только с --apply. Правила сверены с exam-prep: MC-метки кириллица а..д (answer=метка); open числовой/дробь/пара иначе long; делимитеры \( \)→$, \[ \]→$$; subtopic=slug из 077; variant=год; multi/multiple пропуск. Dry-run: 733 вопроса → 723 (525 mc + 191 open + 7 long), выборка корректна. - BUILD_ON_QUESTIONS.md: решение «ЦТ = отдельный модуль» + план + dry-результат. Запись в БД (применение 077 + вставка 723) — ожидает явной санкции пользователя. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
21 KiB
Сборка курса ЦЭ/ЦТ на СУЩЕСТВУЮЩЕМ банке questions (основной путь)
⚠️ ПИВОТ (2026-06-14): контент ЦЭ/ЦТ по математике уже в базе — таблица
questions(subject_id=3), 1753 задания за 2011–2025 (включая ЦЭ-2024 = 117, набор 2025 = 1020), размечены по темам (topics) и годам (year), залиты скриптамиbackend/scripts/seed_math_ct*.js. Поэтому курс строим поверх этого банка черезtests/assignments/courses, а НЕ через exam-prep (exam_tasks). Миграция 077 (пустой exam-prep-скелетctmath) оставлена как опция, но это НЕ основной путь и в БД не применяется.Этот документ заменяет (по части «куда складывать») разделы маппинга в PLAN.md §6 и спецификацию оцифровки DIGITIZATION_SPEC.md. Карта экзамена (§1 PLAN), методика (§2), модульная программа (§3), уровни (§4), пилоты (тригонометрия/стереометрия) и инвентарь (RESOURCES.md) — остаются в силе.
0. Состояние реализации
Сделано (скрипт backend/scripts/seed_ctmath_course.js, идемпотентный, применён на живой БД 2026-06-14):
- ✅ Добавлены 6 тем (
topics, subject_id=3): Преобразование выражений (72), Модуль (73), Иррациональные уравнения (74), Показательные уравнения (75), Производная (76), Параметры (77). - ✅ Создан DRAFT-курс «ЦЭ/ЦТ — Математика» (
courses.id=13,is_published=0, created_by=2) — ученикам НЕ виден до публикации. - ✅ 9 секций (
course_sections.id=27..35) = блоки I–IX.
Сделано (скрипт backend/scripts/seed_ctmath_diagnostic.js, применён 2026-06-14):
- ✅ Диагностический
test«Диагностика ЦЭ/ЦТ — Математика» (tests.id=164, 15 вопросов, лимит 40 мин,show_answers=1) — собран из РЕАЛЬНЫХ размеченных вопросов ЦТ-11 (в осн. 2024): 5single(базовые, по 1 на тему Теория чисел/Арифметика/Квадратные/Тригонометрия/Промежутки) + 10fill-blank(средние/сложные: Словесные/Прогрессии/Функции/Геометрия/Окружность/Стереометрия/Логарифмы/Неравенства/Уравнения/Показательные). Новых вопросов не авторили. Выдать классу/ученику: assignment сtest_id=164.
Сделано (скрипт backend/scripts/seed_ctmath_lessons_trig.js, применён 2026-06-15):
- ✅ Блок «Тригонометрия» — 3 урока в секции 31 курса 13 (по PILOT_TRIGONOMETRY.md):
«Тригонометрический круг и значения» (
lessons.id=41, 18 блоков, А3 🟢), «Тождества и формулы» (id=42, 19 блоков, А8/В4 🟡), «Уравнения и отбор корней» (id=43, 15 блоков, В15 🔴). Блоки в формате рендера lesson.html (heading/text/formula/callout/simtrigcircle/flashcard/quiz/ matching/ordering/accordion/table); математика$…$/$$…$$; JSON валиден; идемпотентно.
Дальше (не сделано): уроки остальных 8 блоков по пилотам (тиражирование, начать со стереометрии);
assignment-практика mode='topic'; колоды формул (flashcard_decks); публикация курса; выдача
диагностики классу (assignment test_id=164). См. §8.
0a. Решение: ЦТ как ОТДЕЛЬНЫЙ модуль exam-prep (2026-06-15)
По решению пользователя ЦТ оформляется как отдельный модуль (как «Экзамен 9»): свой раздел
/exam-prep/ctmath с дашбордом, тренажёром по темам, пробниками на таймер, детектором слабых тем.
Это значит: применить трек+дерево тем (миграция 077) и перенести размеченные вопросы ЦТ-11 из
банка questions в exam_tasks (exam_key='ctmath').
Конвертер: backend/scripts/seed_ctmath_exam_tasks.js (dry по умолчанию, запись --apply).
Правила сверены с exam-prep (агент-разведка): MC-метки кириллица а,б,в,г,д, answer=метка; open —
числовой/дробь/пара (иначе → long self-check); математика \( \)→$, \[ \]→$$ (exam-prep KaTeX
знает только $/$$!); subtopic=slug из 077; variant=год; multi/multiple (radio несовместимо) — пропуск.
Dry-run (2026-06-15): 733 размеч. вопроса → 723 к вставке (525 mc + 191 open + 7 long; 10 multi пропущено; 7 не-числовых → long). Делимитеры/метки/ответы корректны (проверено на выборке).
Статус записи: применение 077 и вставка 723 задач — это запись в живую БД; авто-режим её
заблокировал, ждём явной санкции пользователя. После applied: дать content_access (exam/ctmath классу)
- ссылку в сайдбаре на
/exam-prep/ctmath.
⚠️ Гоча: рендер exam-prep — ТОЛЬКО
$…$/$$…$$(НЕ\(…\)). Конвертер это учитывает.
1. Что уже есть (проверено чтением БД)
| Таблица | Роль | Факт |
|---|---|---|
questions |
банк заданий | 1753 матем. (subject_id=3); topic_id, year, difficulty 1–3, type, explanation, image, source_type |
options |
варианты ответов | question_id, text, is_correct, order_index, match_pair |
topics |
темы (ПЛОСКИЕ) | 19 тем по математике (без иерархии): id+subject_id+name+order_index |
tests / test_questions |
фикс. наборы | тест = упорядоченный список вопросов |
test_sessions / user_answers |
прохождение + баллы | score = число верных |
assignments |
выдача | режимы exam/practice/topic/repeat/ct |
courses/course_sections/lessons/lesson_blocks |
теория | общий слой контента |
flashcard_* |
карточки + SR | для формул |
1.1. Уточнение по инспекции (2026-06-14) — ВАЖНО
Из 1753 матем. заданий:
- ~733 — реальный банк ЦЭ/ЦТ-11 (2011–2024), размечены по темам. Часть A =
single, Часть B =fill-blank(198 шт.),short_answerу них НЕТ. Это база курса. - 1020 — набор
year=2025,source_type='экзамен 9'= «Экзамен 9 класс», БЕЗ тем (topic_idпустой), всеdifficulty=1, типыsingle+short_answer. Это контент 9-класса (из него собраны тесты «Экзамен 9 — Вариант N»). Для курса ЦЭ/ЦТ-11 — НЕ основа (другой экзамен/класс; не размечен).
Типы заданий (questions.type): single, multi, true_false, short_answer, matching, fill-blank.
Сложность: difficulty 1–3 (CHECK), 1=базовый/2=средний/3=продвинутый. (В PLAN.md шкала 1–5 — привести к 1–3: А-часть и лёгкая В = 1, средняя В = 2, сложная В14–В20 = 3.)
Год: year (2011…2025) — фильтр по году/варианту.
Текущая таксономия тем (math, subject_id=3)
16 Арифметика и степени · 17 Словесные задачи · 18 Теория чисел · 19 Тригонометрия · 20 Квадратные уравнения · 21 Прогрессии · 22 Неравенства · 23 Геометрия · 24 Функции · 25 Логарифмы · 26 Показательные неравенства · 27 Уравнения · 28 Статистика и диаграммы · 61 Стереометрия · 62 Окружность и круг · 63 Числовые промежутки · 64 Подобные фигуры · 67 Парабола · 69 Тригонометрические уравнения
2. Ключевой механизм: режимы assignments (выбор вопросов)
Логика assignmentController.startAssignment (подтверждено по коду):
mode='ct'— собирает ЦТ-вариант: ~половина изtype IN ('single','true_false')(Часть A) + остаток изtype IN ('multi','short_answer')(Часть B), добор при нехватке. ⚠️ Гоча: реальный банк ЦТ-11 имеет Часть B типаfill-blank, которыйmode='ct'НЕ выбирает (он ждётshort_answer) → для ЦТ-11 Часть B соберётся только «добором».mode='ct'хорошо ложится на набор «Экзамен 9» (там Часть B =short_answer). Для ЦТ-11 надёжнееmode='topic'или ручная сборкаtest(single + fill-blank).mode='topic'—SELECT id FROM questions WHERE subject_id=3 AND topic_id=? ORDER BY RANDOM() LIMIT count. Тренажёр по теме модуля.mode='exam'|'practice'|'repeat'— случайныеcountпо предмету (или теме).test_idзадан — берутся ИМЕННО вопросы теста в его порядке (перекрывает режим). Так делается фиксированная диагностика.
Выдача: class_id (классу) или user_id (ученику); count 1–200; deadline; max_attempts 0–10.
3. Таксономия: довести темы под модульную карту
Текущие 19 тем покрывают большинство модулей, но грубее карты §3 PLAN.md. Два варианта (рекомендуется А):
A. Принять текущую гранулярность + добавить недостающее (мин. усилий).
Добавить новые topics (для будущей разметки и точечной практики), существующие вопросы НЕ перетегировать массово:
Преобразование выражений(M3–M6)Модуль(M10)Иррациональные уравнения(M11)Показательные уравнения(M12; сейчас есть только «Показательные неравенства»)Производная(M17)Параметры(M30)
B. Полная иерархия — перетегировать 1753 вопроса под все 32 подтемы. Дорого; не оправдано на старте.
Маппинг модуль → тема банка (для практики mode='topic')
| Модуль(и) | topic |
|---|---|
| M1–M3 Числа | 18 Теория чисел, 16 Арифметика и степени |
| M4–M6 Преобразования | 16 (+ новый Преобразование выражений) |
| M7 Линейные/системы | 27 Уравнения, 22 Неравенства, 63 Числовые промежутки |
| M8 Квадратные | 20 Квадратные уравнения |
| M9 Рациональные | 27 Уравнения, 22 Неравенства |
| M10 Модуль | новый Модуль |
| M11 Иррациональные | новый Иррациональные уравнения |
| M12 Показательные | новый Показательные уравнения, 26 Показательные неравенства |
| M13 Логарифмы | 25 Логарифмы |
| M15–M16 Функции/графики | 24 Функции, 67 Парабола |
| M17 Производная | новый Производная |
| M18–M19 Тригонометрия | 19 Тригонометрия |
| M20 Триг. уравнения | 69 Тригонометрические уравнения |
| M21 Прогрессии | 21 Прогрессии |
| M22 Текстовые | 17 Словесные задачи |
| M23–M24 Планиметрия | 23 Геометрия, 64 Подобные фигуры |
| M25 Окружность | 62 Окружность и круг |
| M26–M29 Стереометрия | 61 Стереометрия |
| M30 Параметры | новый Параметры |
| (стат.) | 28 Статистика и диаграммы |
Реализация добавления тем — обычным
INSERT INTO topics(subject_id,name)(как делают seed-скрипты черезgetTopic). Можно отдельной миграцией или скриптом. Перетегировать существующие вопросы под новые темы — опционально и точечно (по тексту/году).
4. Структура курса (теория) — courses/sections/lessons
Создаётся через API (teacher/admin), наполняется по пилотам:
courses:subject_slug='math',title='ЦЭ/ЦТ — Математика',is_published=1, обложка.course_sections: 9 секций = блоки I–IX из PLAN.md §3.lessons+lesson_blocksпо шаблону пилотов (heading → теория/формулы → sim/диаграмма → callout «ошибки» → flashcards → quiz). Типы блоков:text/formula/callout/quiz/sim/geogebra/flashcard/image/table/accordion/ordering/matching.- В уроке кнопка «тренироваться» → assignment
mode='topic'по теме модуля (или ссылка на практику банка). - Доступ ученикам/классам —
content_access/course_access(миграция 052) +class_courses.
Связь урок↔§учебника — через ссылки в
lesson_blocks(textс гиперссылкой на/textbook/...), т.к. вquestions/topicsнет поля textbook (в отличие от exam-prep). Учебники реальны (algebra-7..11, geometry-8..11) — см. TOPICS_SEED.md.
5. Практика и пробники (на банке)
- Тренажёр модуля → assignment
mode='topic',topic_id= тема модуля,count10–25,max_attempts=0. - Пробный вариант ЦТ → assignment
mode='ct',count=30(безtopic_id= по всем темам). Даёт Часть A + Часть B автоматически. Для «на время» — задать через связанныйtest.time_limit(или прохождение сессии; полноценный таймер-пробник как в exam-prep здесь проще черезtestсtime_limit). - Фиксированный набор (диагностика, тематический срез) →
test+test_questions, затем assignment сtest_id. - Сложность регулируется выбором тем +
difficulty(1–3) при ручной сборкеtest.
6. Входная диагностика (из реальных вопросов банка, БЕЗ авторинга)
Собрать test «Диагностика ЦЭ/ЦТ» из ~14 существующих вопросов — по одному на ключевую тему, желательно year=2024:
| # | topic (bank) | критерий выбора | уровень-зонд |
|---|---|---|---|
| 1 | 18 Теория чисел | single, diff 1 |
🟢 |
| 2 | 20 Квадратные уравнения | single, diff 1 |
🟢 |
| 3 | 19 Тригонометрия | single, diff 1 |
🟢 |
| 4 | 16 Арифметика и степени | single, diff 1–2 |
🟢 |
| 5 | 17 Словесные задачи | short_answer, diff 2 |
🟡 |
| 6 | 21 Прогрессии | short_answer, diff 2 |
🟡 |
| 7 | 24 Функции | diff 2 | 🟡 |
| 8 | 19 Тригонометрия | short_answer, diff 2 (тождества) |
🟡 |
| 9 | 23 Геометрия | short_answer, diff 2 |
🟡 |
| 10 | 61 Стереометрия | diff 2 | 🟡 |
| 11 | 25 Логарифмы | short_answer, diff 3 |
🔴 |
| 12 | 69 Триг. уравнения | diff 3 | 🔴 |
| 13 | 24 Функции / Производная | diff 3 | 🔴 |
| 14 | 61 Стереометрия | diff 3 (углы/расстояния) | 🔴 |
Реализация: выбрать конкретные question.id по критериям (subject_id=3 AND topic_id=? AND difficulty=? [AND year=2024]), создать test + test_questions в нужном порядке, выдать как assignment test_id. По результату — назначить трек (правила §4 PLAN.md). Никакого нового авторинга — берём готовые проверенные вопросы.
7. Прогресс и аналитика
- Есть:
test_sessions.score/total,user_answers.is_correct,lesson_progress.completed. - Нет (в этой подсистеме): автодетектора слабых тем и per-topic mastery (это только в exam-prep). Варианты:
- считать точность по теме join'ом
user_answers+questions.topic_id(естьassignmentQuestionStatsпо вопросам — расширить до тем); - или (доработка) добавить агрегат «точность по теме» для рекомендаций «что подтянуть».
- считать точность по теме join'ом
- Формулы —
flashcard_decksпо блокам +flashcard_deck_accessклассу (SR встроен).
8. Порядок реализации (на банке questions)
- Таксономия: добавить недостающие темы (§3, вариант A) — миграция/скрипт
INSERT INTO topics. - Курс-каркас:
courses+ 9course_sections. - Диагностика: собрать
testиз 14 реальных вопросов (§6), выдать. - Уроки по приоритету (стерео, тригонометрия — §8 PLAN): теория в
lesson_blocksпо пилотам + кнопка практикиmode='topic'. - Пробники: assignment
mode='ct'(вариант 30 заданий) + тематическиеmode='topic'. - Карточки формул:
flashcard_decksпо блокам. - (Опц.) Аналитика по темам: агрегат точности для рекомендаций.
- (Опц.) Точечно дотегировать вопросы под новые темы (Производная, Иррациональные, Модуль, Показательные ур., Параметры).
9. Открытые вопросы
| Вопрос | Заметка / дефолт |
|---|---|
Что за набор year=2025 (1020 вопросов)? |
Уточнить происхождение (свежие ЦЭ/ЦТ-2025?); вероятно главный современный банк — проверить разметку по темам/типам |
| Перетегировать ли под тонкие темы | По умолчанию — нет (вариант A); добавить только новые темы, дотегировать точечно |
| Per-topic mastery / слабые темы | Пока считать join'ом; полноценный детектор — отдельная доработка |
| Нужен ли отдельный признак «ЦТ/ЦЭ» | Уже есть year и source_type; при необходимости фильтровать по ним |
| Таймер-пробник на 180 мин | Через test.time_limit (есть); полноценный mock как в exam-prep — опционально |
| Судьба миграции 077 (exam-prep ctmath) | Оставлена (по решению), в БД не применяется; основной путь — этот документ |