diff --git a/backend/scripts/seed_ctmath_rt2425_e1v1.js b/backend/scripts/seed_ctmath_rt2425_e1v1.js
new file mode 100644
index 0000000..3360cd8
--- /dev/null
+++ b/backend/scripts/seed_ctmath_rt2425_e1v1.js
@@ -0,0 +1,384 @@
+'use strict';
+/* ───────────────────────────────────────────────────────────────────────────
+ seed_ctmath_rt2425_e1v1.js
+ Эталонный «чистый» вариант-пробник для трека exam-prep `ctmath`.
+
+ Источник: РТ–2024/2025, Этап I, Вариант 1 (РИКЗ, «Тематическое
+ консультирование по математике»). 30 заданий: А1–А10 (часть A) +
+ В1–В20 (часть B). Перенабрано вручную в KaTeX по PDF
+ (F:\!Рабочие\ЦТ\Математика\Математика\РТ\2024-2025\МАТ РТ-1 24_25 В1.pdf).
+
+ Чем отличается от уже залитых 723 задач: те сгруппированы по `variant`=ГОД
+ (2024 → 114 задач в одной «пачке») и НЕ образуют чистого 30-задачного
+ варианта, поэтому таймер-пробник на них собирается криво. Здесь
+ variant=101 — ровно 30 заданий (task_idx 1..30) → корректный пробник
+ на 180 мин (mock source='variant').
+
+ Идемпотентность: upsert по UNIQUE(exam_key, variant, task_idx). Повторный
+ запуск обновляет строки, не плодит дубли.
+
+ Запуск:
+ node backend/scripts/seed_ctmath_rt2425_e1v1.js # DRY-RUN (по умолчанию)
+ node backend/scripts/seed_ctmath_rt2425_e1v1.js --apply # запись в БД
+
+ ⚠️ Массовую запись в БД запускает ПОЛЬЗОВАТЕЛЬ вручную (авто-режим
+ Claude Code блокирует продакшн-записи). Скрипт безопасен: без --apply
+ ничего не пишет, только печатает сводку и самопроверку.
+ ─────────────────────────────────────────────────────────────────────────── */
+
+const { DatabaseSync } = require('node:sqlite');
+const path = require('path');
+
+const APPLY = process.argv.includes('--apply');
+const EXAM = 'ctmath';
+const VARIANT = 101; // чистый 30-задачный вариант (не год)
+const PROV = 'РТ–2024/2025, Этап I, Вариант 1';
+const R = String.raw;
+
+// figure helper — белый фон у самого PNG, поэтому смотрится на любой теме
+const FIG = (name, alt) =>
+ `
`;
+
+/* opts: метки кириллица а–д (как в существующих 723 строках ctmath;
+ checkAnswerServer имеет ветку /^[а-д]$/). РТ-варианты 1..5 → а..д. */
+const L = ['а', 'б', 'в', 'г', 'д'];
+const mc = (...html) => html.map((h, i) => [L[i], h]);
+
+/* ── 30 заданий ─────────────────────────────────────────────────────────── */
+const TASKS = [
+ // ── Часть A: А1–А10 ──────────────────────────────────────────────────────
+ { idx: 1, type: 'mc', topic: 'numbers', subtopic: 'num-real', diff: 1,
+ text: R`Результатом округления числа $1{,}3678$ до тысячных является число:`,
+ opts: mc('$0{,}368$', '$1{,}367$', '$1{,}368$', '$1{,}370$', '$1{,}363$'),
+ answer: 'в',
+ sol: R`Округляем до третьего знака после запятой: $1{,}3678\approx 1{,}368$.`,
+ ref: 'Герасимов «Математика, 6 кл.», гл. 1, § 2' },
+
+ { idx: 2, type: 'mc', topic: 'planimetry', subtopic: 'plan-circle', diff: 1,
+ text: R`Среди отрезков $FP$, $OA$, $NK$, $MA$, $TE$ укажите отрезок, который является хордой окружности, изображённой на рисунке. (Точка $O$ — центр окружности.)`,
+ opts: mc('$FP$', '$OA$', '$NK$', '$MA$', '$TE$'),
+ answer: 'г',
+ sol: R`Хорда — это отрезок, соединяющий две точки окружности. Обе точки $M$ и $A$ лежат на окружности, поэтому хордой является отрезок $MA$.`,
+ ref: 'Казаков «Геометрия, 7 кл.», гл. 1, § 4',
+ fig: FIG('a2.png', 'Окружность с центром O и точками E, K, P, F, N, A, T, M') },
+
+ { idx: 3, type: 'mc', topic: 'functions', subtopic: 'fn-graphs', diff: 2,
+ text: R`Укажите номер функции, график которой параллелен графику функции $y=4x+1$.`,
+ opts: mc('$y=4x-1$', '$y=-4x+1$', '$y=-4x-1$', '$y=x+4$', '$y=-x-4$'),
+ answer: 'а',
+ sol: R`Графики линейных функций параллельны, если их угловые коэффициенты равны, а свободные члены различны. У $y=4x+1$ коэффициент $k=4$; из предложенных только $y=4x-1$ имеет $k=4$ и $b=-1\ne 1$.`,
+ ref: 'Арефьева «Алгебра, 7 кл.», гл. 3, § 20' },
+
+ { idx: 4, type: 'mc', topic: 'expressions', subtopic: 'expr-polynomials', diff: 2,
+ text: R`Найдите значения данных выражений при $x=-1{,}1$. Укажите номер того выражения, значение которого является наибольшим.`,
+ opts: mc('$2x$', '$1-x$', '$|x|$', '$x+1$', '$x^2$'),
+ answer: 'б',
+ sol: R`Подставим $x=-1{,}1$: $\ 1)\ 2x=-2{,}2;\quad 2)\ 1-x=2{,}1;\quad 3)\ |x|=1{,}1;\quad 4)\ x+1=-0{,}1;\quad 5)\ x^2=1{,}21.$ Наибольшее значение $2{,}1$ — у выражения $1-x$.`,
+ ref: 'Арефьева «Алгебра, 7 кл.», гл. 2, § 4' },
+
+ { idx: 5, type: 'mc', topic: 'equations', subtopic: 'eq-linear', diff: 1,
+ text: R`Определите, при каком из значений $x$, равных $6;\ 0;\ 1{,}8;\ 4{,}2;\ -1$, верно двойное неравенство $3\le x+1<7$.`,
+ opts: mc('$6$', '$0$', '$1{,}8$', '$4{,}2$', '$-1$'),
+ answer: 'г',
+ sol: R`Неравенство $3\le x+1<7$ равносильно $2\le x<6$. Из данных чисел этому промежутку принадлежит только $x=4{,}2$.`,
+ ref: 'Арефьева «Алгебра, 7 кл.», гл. 3, § 18' },
+
+ { idx: 6, type: 'open', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2,
+ text: R`Укажите номера верных равенств.
1) $2^{5/7}:2^{4/7}=2^{1/7}$;
2) $2^{1/3}=\dfrac{1}{8}$;
3) $2^{1/3}\cdot 2^{2}=2^{2/3}$;
4) $\left(2^{1/3}\right)^{2}=2^{1/9}$;
5) $2^{1/3}\cdot 5^{1/3}=10^{1/3}$.
Ответ запишите цифрами в порядке возрастания, без пробелов.`,
+ answer: '15', ansShow: '1, 5',
+ sol: R`$1)\ 2^{5/7}:2^{4/7}=2^{5/7-4/7}=2^{1/7}$ — верно. $\ 2)$ неверно. $\ 3)\ 2^{1/3}\cdot 2^{2}=2^{1/3+2}=2^{7/3}\ne 2^{2/3}$ — неверно. $\ 4)\ \left(2^{1/3}\right)^{2}=2^{2/3}\ne 2^{1/9}$ — неверно. $\ 5)\ 2^{1/3}\cdot 5^{1/3}=(2\cdot5)^{1/3}=10^{1/3}$ — верно.`,
+ ref: 'Арефьева «Алгебра, 11 кл.», гл. 1, § 1' },
+
+ { idx: 7, type: 'mc', topic: 'word-sequences', subtopic: 'word-problems', diff: 2,
+ text: R`В состав чайного сбора входят мята и липа в отношении $2:3$ соответственно. Сколько граммов липы входит в $975$ г такого сбора?`,
+ opts: mc('$390$ г', '$325$ г', '$875$ г', '$545$ г', '$585$ г'),
+ answer: 'д',
+ sol: R`Пусть на одну часть приходится $k$ г: мята — $2k$, липа — $3k$. Тогда $2k+3k=975$, $5k=975$, $k=195$. Липа: $3k=585$ г.`,
+ ref: 'Герасимов «Математика, 6 кл.», гл. 2, § 5' },
+
+ { idx: 8, type: 'mc', topic: 'expressions', subtopic: 'expr-powers-roots', diff: 2,
+ text: R`Результат упрощения выражения $\sqrt{(x-3)^{2}}$ при $-1{,}61) $-\sqrt[4]{\sqrt{51}-8}$;
2) $\sqrt[3]{-8}$;
3) $\sqrt[4]{8^{-1}}$;
4) $\sqrt[4]{-8}$;
5) $-\sqrt[5]{8^{-1}}$.
Ответ запишите цифрами в порядке возрастания, без пробелов.`,
+ answer: '235', ansShow: '2, 3, 5',
+ sol: R`$1)$ не имеет смысла: $\sqrt{51}-8<0$, а корень чётной степени из отрицательного числа не существует. $\ 2)\ \sqrt[3]{-8}$ — корень нечётной степени, смысл есть. $\ 3)\ \sqrt[4]{8^{-1}}$ — $8^{-1}=\tfrac18>0$, смысл есть. $\ 4)\ \sqrt[4]{-8}$ — смысла нет. $\ 5)\ -\sqrt[5]{8^{-1}}$ — смысл есть.`,
+ ref: 'Арефьева «Алгебра, 10 кл.», гл. 2, § 13' },
+
+ // ── Часть B: В1–В20 ──────────────────────────────────────────────────────
+ { idx: 11, type: 'open', topic: 'stereometry', subtopic: 'ster-basics', diff: 3,
+ text: R`Дана правильная четырёхугольная пирамида $SABCD$. Точки $M$ и $N$ — середины боковых рёбер $SA$ и $SC$ соответственно. Выберите верные утверждения.
1) прямая $MN$ пересекает прямую $SD$;
2) прямая $MN$ пересекает плоскость $SBD$;
3) прямая $MN$ лежит в плоскости $SDC$;
4) прямая $MN$ параллельна прямой $AB$;
5) прямая $MN$ параллельна плоскости $ADC$;
6) прямые $MN$ и $CD$ являются скрещивающимися.
Ответ запишите цифрами в порядке возрастания, без пробелов.`,
+ answer: '256', ansShow: '2, 5, 6',
+ sol: R`$1)$ неверно: $MN$ и $SD$ скрещиваются. $\ 2)$ верно: $M$ и $N$ по разные стороны от плоскости $SBD$. $\ 3)$ неверно: $MN$ пересекает $SDC$ в точке $N$. $\ 4)$ неверно: $MN$ и $AB$ скрещиваются. $\ 5)$ верно: $MN$ — средняя линия треугольника $SAC$, значит $MN\parallel AC$, $AC\subset ADC$. $\ 6)$ верно: $MN$ и $CD$ скрещиваются.`,
+ ref: 'Латотин «Геометрия, 10 кл.», разд. 1–3' },
+
+ { idx: 12, type: 'long', topic: 'planimetry', subtopic: 'plan-circle', diff: 3,
+ text: R`Для начала каждого из предложений А–В подберите его окончание 1–7 так, чтобы получилось верное утверждение.
Начало:
А) Уравнение окружности с центром в начале координат и радиусом $\sqrt{11}$ имеет вид …
Б) Уравнение окружности с центром в начале координат, проходящей через точку $M(-2;5)$, имеет вид …
В) Уравнение прямой, проходящей через точки $M(-2;5)$ и $A(2;-5)$, имеет вид …
Окончание:
1) $5y-2x=0$; 2) $x^{2}-y^{2}=29$; 3) $x^{2}+y^{2}=29$; 4) $x+y=11$;
5) $2y+5x=0$; 6) $x^{2}+y^{2}=11$; 7) $x^{2}-y^{2}=11$.
Ответ запишите сочетанием букв и цифр, например: А1Б1В4.`,
+ answer: 'А6Б3В5', ansShow: 'А6Б3В5',
+ sol: R`А) Центр $(0;0)$, радиус $\sqrt{11}$: $x^{2}+y^{2}=11$ — окончание 6. Б) Центр $(0;0)$, проходит через $M(-2;5)$: $R^{2}=(-2)^{2}+5^{2}=29$, то есть $x^{2}+y^{2}=29$ — окончание 3. В) Прямая через $M(-2;5)$ и $A(2;-5)$: подходит $2y+5x=0$ (обе точки ему удовлетворяют) — окончание 5.`,
+ ref: 'Арефьева «Алгебра, 9 кл.», гл. 3, § 12' },
+
+ { idx: 13, type: 'open', topic: 'numbers', subtopic: 'num-divisibility', diff: 1,
+ text: R`Фломастеры, которых всего было $445$ штук, упаковывали в коробки по $16$ штук в каждую. Сколько получилось полных коробок, если $13$ фломастеров остались неупакованными?`,
+ answer: '27',
+ sol: R`Пусть $x$ — число полных коробок. По смыслу деления с остатком $445=16x+13$, откуда $16x=432$, $x=27$.`,
+ ref: 'Герасимов «Математика, 5 кл.», ч. 1, гл. 1, § 11' },
+
+ { idx: 14, type: 'open', topic: 'functions', subtopic: 'fn-graphs', diff: 2,
+ text: R`Найдите значение выражения $4p$, где $p$ — произведение координат вершины параболы, заданной уравнением $y=-2x^{2}-6x+3$.`,
+ answer: '-45',
+ sol: R`Абсцисса вершины $x_0=-\dfrac{b}{2a}=-\dfrac{-6}{2\cdot(-2)}=-\dfrac32$. Ордината $y_0=-2\left(-\dfrac32\right)^{2}-6\left(-\dfrac32\right)+3=-\dfrac92+9+3=\dfrac{15}{2}$. Тогда $p=x_0y_0=-\dfrac32\cdot\dfrac{15}{2}=-\dfrac{45}{4}$ и $4p=-45$.`,
+ ref: 'Арефьева «Алгебра, 8 кл.», гл. 3, § 13' },
+
+ { idx: 15, type: 'open', topic: 'planimetry', subtopic: 'plan-triangles', diff: 2,
+ text: R`В треугольнике $ABC$ точки $M$ и $N$ — середины сторон $AB$ и $AC$ соответственно, $\angle ABC=95^\circ$, $\angle ANM=36^\circ$. Найдите градусную меру угла $BAC$.`,
+ answer: '49',
+ sol: R`$MN$ — средняя линия треугольника $ABC$, поэтому $MN\parallel BC$, и $\angle ACB=\angle ANM=36^\circ$ (соответственные углы). По сумме углов треугольника $\angle BAC=180^\circ-95^\circ-36^\circ=49^\circ$.`,
+ ref: 'Казаков «Геометрия, 7 кл.», гл. 3, § 17' },
+
+ { idx: 16, type: 'open', topic: 'trigonometry', subtopic: 'trig-identities', diff: 3,
+ text: R`Найдите значение выражения $6\sqrt3\,\sin 600^\circ-\sqrt2\,\cos 225^\circ$.`,
+ answer: '-8',
+ sol: R`$\sin600^\circ=\sin240^\circ=\sin(270^\circ-30^\circ)=-\cos30^\circ=-\dfrac{\sqrt3}{2}$; $\cos225^\circ=\cos(180^\circ+45^\circ)=-\cos45^\circ=-\dfrac{\sqrt2}{2}$. Тогда $6\sqrt3\cdot\left(-\dfrac{\sqrt3}{2}\right)-\sqrt2\cdot\left(-\dfrac{\sqrt2}{2}\right)=-9+1=-8$.`,
+ ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 2; § 9' },
+
+ { idx: 17, type: 'open', topic: 'equations', subtopic: 'eq-rational', diff: 3,
+ text: R`Найдите произведение наибольшего целого решения на количество всех целых решений неравенства $\left(x+\log_{0{,}5}64\right)^{2}(x-3)(x+13)\le 0$.`,
+ answer: '108',
+ sol: R`Так как $\log_{0{,}5}64=-6$, неравенство принимает вид $(x-6)^{2}(x-3)(x+13)\le 0$. Методом интервалов решение: $[-13;3]\cup\{6\}$. Наибольшее целое решение $6$; всего целых решений $18$ (17 на отрезке $[-13;3]$ и $x=6$). Произведение: $6\cdot18=108$.`,
+ ref: 'Арефьева «Алгебра, 9 кл.», гл. 3, § 13' },
+
+ { idx: 18, type: 'open', topic: 'equations', subtopic: 'eq-linear', diff: 2,
+ text: R`Найдите сумму всех целых решений системы неравенств $\begin{cases}(x-2)^{2}+23>(x+3)^{2}-2,\\[2pt] 1{,}6x\ge 0{,}9x-6{,}3.\end{cases}$`,
+ answer: '-44',
+ sol: R`Первое неравенство: $x^{2}-4x+4+23>x^{2}+6x+9-2$, то есть $-10x>-20$, $x<2$. Второе: $0{,}7x\ge-6{,}3$, $x\ge-9$. Решение системы — полуинтервал $[-9;2)$. Сумма всех целых из него равна $-44$.`,
+ ref: 'Арефьева «Алгебра, 8 кл.», гл. 1, § 6' },
+
+ { idx: 19, type: 'open', topic: 'functions', subtopic: 'fn-properties', diff: 3,
+ text: R`Функция $y=f(x)$ нечётна и определена на отрезке $[-8;8]$. Её график для $x\le 0$ изображён на рисунке. Найдите значение выражения $3n$, где $n$ — количество всех целых значений аргумента, при которых функция принимает неположительные значения.`,
+ answer: '30',
+ sol: R`График нечётной функции симметричен относительно начала координат. Функция неположительна ($f(x)\le0$) на промежутках $[-8;-6]$ и $(0;6)$, а также в точках $x=-6,\ 0,\ 6$. Целых значений с $f(x)<0$ — семь, плюс три нуля, итого $n=10$, значит $3n=30$.`,
+ ref: 'Арефьева «Алгебра, 9 кл.», гл. 2, § 8',
+ fig: FIG('b9.png', 'График нечётной функции для x ≤ 0 на отрезке [-8;0]') },
+
+ { idx: 20, type: 'open', topic: 'planimetry', subtopic: 'plan-quadrilaterals', diff: 2,
+ text: R`Найдите площадь ромба $ABCD$, если его периметр равен $72$, а величина угла $BAD$ равна $30^\circ$.`,
+ answer: '162',
+ sol: R`Сторона ромба $a=\dfrac{72}{4}=18$. Площадь $S=a^{2}\sin\alpha=18^{2}\cdot\sin30^\circ=324\cdot\dfrac12=162$.`,
+ ref: 'Казаков «Геометрия, 8 кл.», гл. 2, § 15' },
+
+ { idx: 21, type: 'open', topic: 'equations', subtopic: 'eq-exponential', diff: 3,
+ text: R`Найдите значение выражения $25m$, где $m$ — сумма корней уравнения $\left(\dfrac37\right)^{5x^{2}-5x+2}-\left(\dfrac73\right)^{1-3x}=0$.`,
+ answer: '40',
+ sol: R`Так как $\left(\dfrac73\right)^{1-3x}=\left(\dfrac37\right)^{3x-1}$, получаем $5x^{2}-5x+2=3x-1$, то есть $5x^{2}-8x+3=0$. Дискриминант положителен, корни существуют. По теореме Виета сумма корней $m=\dfrac{8}{5}=1{,}6$, поэтому $25m=40$.`,
+ ref: 'Арефьева «Алгебра, 11 кл.», гл. 2, § 5' },
+
+ { idx: 22, type: 'open', topic: 'equations', subtopic: 'eq-linear', diff: 2,
+ text: R`Поле разбили на два участка $A$ и $B$ одинаковой площади, как показано на рисунке (размеры указаны в метрах). Найдите (в метрах) периметр участка $B$.`,
+ answer: '390',
+ sol: R`Обозначим горизонтальный размер участка $B$ через $x$ м. Из равенства площадей: $140\cdot40+70\cdot(170-x)=70x$, откуда $14x=1750$, $x=125$. Значит, участок $B$ — прямоугольник $70\times125$, его периметр $2(70+125)=390$ м.`,
+ ref: 'Арефьева «Алгебра, 7 кл.», гл. 3, § 16',
+ fig: FIG('b12.png', 'L-образный участок: A и B, размеры 170, 70, 210, 40 м') },
+
+ { idx: 23, type: 'open', topic: 'stereometry', subtopic: 'ster-rotation', diff: 3,
+ text: R`Осевым сечением цилиндра является квадрат, длина диагонали которого равна $4\sqrt6$. Найдите значение выражения $\dfrac{\sqrt3\,V}{\pi}$, где $V$ — объём цилиндра.`,
+ answer: '144',
+ sol: R`Сторона квадрата $\dfrac{4\sqrt6}{\sqrt2}=4\sqrt3$, значит высота цилиндра и диаметр основания равны $4\sqrt3$, радиус $R=2\sqrt3$. Объём $V=\pi R^{2}h=\pi(2\sqrt3)^{2}\cdot4\sqrt3=48\pi\sqrt3$. Тогда $\dfrac{\sqrt3\,V}{\pi}=48\cdot3=144$.`,
+ ref: 'Латотин «Геометрия, 11 кл.», разд. 1, § 2' },
+
+ { idx: 24, type: 'open', topic: 'equations', subtopic: 'eq-irrational', diff: 3,
+ text: R`Найдите произведение корней (корень, если он единственный) уравнения $\sqrt{x+7}-\sqrt{x^{2}-6x-91}=0$.`,
+ answer: '-98',
+ sol: R`Так как $x^{2}-6x-91=(x+7)(x-13)$, уравнение приводится к $\sqrt{x+7}=\sqrt{(x+7)(x-13)}$. После возведения в квадрат $(x+7)(x-14)=0$. Проверка показывает, что оба числа $-7$ и $14$ — корни. Их произведение $-7\cdot14=-98$.`,
+ ref: 'Арефьева «Алгебра, 10 кл.», гл. 2, § 17' },
+
+ { idx: 25, type: 'open', topic: 'trigonometry', subtopic: 'trig-equations', diff: 4,
+ text: R`Найдите (в градусах) сумму наименьшего положительного и наибольшего отрицательного корней уравнения $\sin 2x\cos 17x-\cos 2x\sin 17x=\sin\dfrac{3\pi}{2}$.`,
+ answer: '-12',
+ sol: R`Левая часть по формуле синуса разности равна $\sin(2x-17x)=\sin(-15x)$, а $\sin\dfrac{3\pi}{2}=-1$. Значит $\sin(-15x)=-1$, то есть $\sin15x=1$, $15x=90^\circ+360^\circ n$, $x=6^\circ+24^\circ n$. Наименьший положительный корень $6^\circ$, наибольший отрицательный $-18^\circ$; их сумма $-12^\circ$.`,
+ ref: 'Арефьева «Алгебра, 10 кл.», гл. 1, § 8; § 10' },
+
+ { idx: 26, type: 'open', topic: 'equations', subtopic: 'eq-quadratic', diff: 3,
+ text: R`Найдите сумму всех целых решений совокупности неравенств $\left[\begin{array}{l}x^{2}-x-6\le0,\\ x^{2}-4x-5>0\end{array}\right.$ на промежутке $[-10;7]$.`,
+ answer: '-36',
+ sol: R`$1)\ x^{2}-x-6\le0$: решение $[-2;3]$. $\ 2)\ x^{2}-4x-5>0$: решение $(-\infty;-1)\cup(5;+\infty)$. Объединение решений совокупности: $(-\infty;3]\cup(5;+\infty)$. Пересечение с $[-10;7]$ даёт $[-10;3]\cup(5;7]$. Сумма целых: $-49+13=-36$.`,
+ ref: 'Арефьева «Алгебра, 8 кл.», гл. 3, § 16' },
+
+ { idx: 27, type: 'open', topic: 'stereometry', subtopic: 'ster-polyhedra', diff: 4,
+ text: R`В правильной четырёхугольной пирамиде $QABCD$ длина бокового ребра равна $17$, длина диагонали основания $ABCD$ равна $16$. Через середины рёбер $AB$ и $AD$ и точку $Q$ проведена секущая плоскость. Найдите значение выражения $S^{2}$, где $S$ — площадь сечения пирамиды этой плоскостью.`,
+ answer: '3856',
+ sol: R`Пусть $K$, $M$ — середины рёбер $AB$, $AD$; сечение — равнобедренный треугольник $KQM$. $KM$ — средняя линия треугольника $ABD$, $KM=\dfrac12 BD=8$. Высота пирамиды $QO=\sqrt{QA^{2}-OA^{2}}=\sqrt{17^{2}-8^{2}}=15$. Высота $QN$ треугольника $KQM$: $QN=\sqrt{QO^{2}+ON^{2}}=\sqrt{15^{2}+4^{2}}=\sqrt{241}$. Площадь $S=\dfrac12\cdot KM\cdot QN=4\sqrt{241}$, откуда $S^{2}=16\cdot241=3856$.`,
+ ref: 'Латотин «Геометрия, 10 кл.», разд. 1, § 3' },
+
+ { idx: 28, type: 'open', topic: 'word-sequences', subtopic: 'word-problems', diff: 4,
+ text: R`При делении некоторого натурального двузначного числа на произведение его цифр неполное частное равно $3$, а остаток равен $10$. Если цифры этого числа поменять местами, то полученное число будет меньше данного на $36$. Найдите исходное число.`,
+ answer: '73',
+ sol: R`Пусть $x$ — цифра десятков, $y$ — цифра единиц; число равно $10x+y$. Условия дают систему $\begin{cases}10x+y=3xy+10,\\ 10x+y=(10y+x)+36.\end{cases}$ Из второго уравнения $x-y=4$. Подставив $x=y+4$, получаем $3y^{2}+y-30=0$, откуда $y=3$, $x=7$. Искомое число — $73$.`,
+ ref: 'Арефьева «Алгебра, 9 кл.», гл. 3, § 11' },
+
+ { idx: 29, type: 'open', topic: 'functions', subtopic: 'fn-derivative', diff: 4,
+ text: R`Составьте уравнение касательной к графику функции $f(x)=32x^{3}-24x-5$ в точке с абсциссой $x_0=\dfrac14$. В ответ запишите произведение координат точки пересечения этой касательной с прямой $y=-16x-10$.`,
+ answer: '-84',
+ sol: R`$f'(x)=96x^{2}-24$, $f'\!\left(\dfrac14\right)=-18=k$; $f\!\left(\dfrac14\right)=-10{,}5$. Касательная $y=-18x-6$. Пересечение с $y=-16x-10$: $-18x-6=-16x-10$, $x=2$, $y=-42$. Произведение координат $2\cdot(-42)=-84$.`,
+ ref: 'Арефьева «Алгебра, 10 кл.», гл. 3, § 20' },
+
+ { idx: 30, type: 'open', topic: 'stereometry', subtopic: 'ster-angles-distances', diff: 5,
+ text: R`Из точки $E$ — середины стороны $BC$ равностороннего треугольника $ABC$ — проведён перпендикуляр $EP$ к плоскости треугольника, причём $EP=\dfrac12 BC$. На отрезке $PC$ взята точка $M$ так, что $PM:MC=2:3$. Найдите значение выражения $176\sin^{2}\alpha$, где $\alpha$ — угол между прямой $AM$ и плоскостью $ABC$.`,
+ answer: '18',
+ sol: R`Пусть сторона равна $a$, тогда $EP=\dfrac a2$. Проекция $M$ на плоскость — точка $K$ на $EC$, $\angle MAK=\alpha$. Из подобия $\triangle MKC\sim\triangle PEC$: $MK=\dfrac{3a}{10}$, $CK=\dfrac{3a}{10}$. По теореме косинусов в $\triangle AKC$: $AK^{2}=a^{2}+\left(\dfrac{3a}{10}\right)^{2}-2a\cdot\dfrac{3a}{10}\cos60^\circ=\dfrac{79a^{2}}{100}$. Тогда $AM^{2}=MK^{2}+AK^{2}=\dfrac{88a^{2}}{100}$, $\sin\alpha=\dfrac{MK}{AM}=\dfrac{3}{2\sqrt{22}}$, и $176\sin^{2}\alpha=176\cdot\dfrac{9}{88}=18$.`,
+ ref: 'Латотин «Геометрия, 10 кл.», разд. 3, § 9' },
+];
+
+/* ── Сборка solution_html ────────────────────────────────────────────────── */
+function ansShowOf(t) {
+ if (t.ansShow != null) return t.ansShow;
+ if (t.type === 'mc') return `${t.answer})`;
+ return `$${t.answer}$`; // числовой/комбинация цифр — в KaTeX
+}
+function buildSolution(t) {
+ const ans = ansShowOf(t);
+ let html = `${t.sol}Ответ: ${ans}
`;
+ if (t.ref) html += `Учебник: ${t.ref}
`;
+ return html;
+}
+
+/* ── Самопроверка (повтор логики checkAnswerServer из exam-prep.js) ────────── */
+const EPS = 1e-6;
+function srvToNumber(s) {
+ if (s == null) return NaN;
+ let t = String(s).trim().replace(/\$/g, '').replace(/\s+/g, '').replace(',', '.');
+ const f = t.match(/^(-?\d+(?:\.\d+)?)\s*\/\s*(-?\d+(?:\.\d+)?)$/);
+ if (f) { const n = Number(f[1]), d = Number(f[2]); return d === 0 ? NaN : n / d; }
+ const n = Number(t); return Number.isFinite(n) ? n : NaN;
+}
+function checkAnswerServer(userInput, canonical) {
+ if (userInput == null || canonical == null) return false;
+ const c = String(canonical).trim();
+ if (/^[а-д]$/.test(c)) return String(userInput).trim().toLowerCase() === c.toLowerCase();
+ if (/^[^;]+;[^;]+$/.test(c)) return false; // (пар нет в этом варианте)
+ const cn = srvToNumber(c), un = srvToNumber(userInput);
+ if (Number.isNaN(cn) || Number.isNaN(un)) return false;
+ return Math.abs(cn - un) < EPS;
+}
+
+/* ── Валидация набора ──────────────────────────────────────────────────────── */
+const problems = [];
+if (TASKS.length !== 30) problems.push(`Ожидалось 30 заданий, получено ${TASKS.length}`);
+const seen = new Set();
+for (const t of TASKS) {
+ if (seen.has(t.idx)) problems.push(`Дубль task_idx=${t.idx}`); seen.add(t.idx);
+ if (t.idx < 1 || t.idx > 30) problems.push(`task_idx вне 1..30: ${t.idx}`);
+ if (!['mc', 'open', 'long'].includes(t.type)) problems.push(`#${t.idx}: тип ${t.type}`);
+ if (t.type === 'mc') {
+ if (!Array.isArray(t.opts) || t.opts.length !== 5) problems.push(`#${t.idx}: mc должен иметь 5 вариантов`);
+ if (!t.opts.some(o => o[0] === t.answer)) problems.push(`#${t.idx}: answer "${t.answer}" не среди меток`);
+ }
+ if (!t.text || !t.sol) problems.push(`#${t.idx}: пустой text/sol`);
+ // self-check автопроверки (long не автопроверяется)
+ if (t.type !== 'long' && !checkAnswerServer(t.answer, t.answer))
+ problems.push(`#${t.idx}: answer "${t.answer}" не проходит self-check (Unicode-минус? пробел?)`);
+ // запрет Unicode-минуса в answer (нужен ASCII '-')
+ if (/−/.test(String(t.answer))) problems.push(`#${t.idx}: Unicode-минус в answer`);
+}
+
+/* ── Экспорт для тестов/тиража (без запуска main при require) ──────────────── */
+module.exports = { TASKS, buildSolution, ansShowOf, checkAnswerServer, EXAM, VARIANT, PROV };
+if (require.main !== module) return;
+
+/* ── Открытие БД ───────────────────────────────────────────────────────────── */
+const DB = path.join(__dirname, '..', 'data', 'learnspace.db');
+const db = new DatabaseSync(DB);
+
+// Защита: трек должен существовать
+const track = db.prepare(`SELECT exam_key, variants_count FROM exam_tracks WHERE exam_key=?`).get(EXAM);
+if (!track) { console.error(`✗ Трек '${EXAM}' не найден в exam_tracks. Прерывание.`); process.exit(1); }
+
+/* ── DRY-RUN сводка ────────────────────────────────────────────────────────── */
+console.log(`\n=== seed_ctmath_rt2425_e1v1 (${PROV}) variant=${VARIANT} ===`);
+console.log(`Режим: ${APPLY ? 'APPLY (запись)' : 'DRY-RUN (только проверка)'}\n`);
+
+const byType = TASKS.reduce((a, t) => (a[t.type] = (a[t.type] || 0) + 1, a), {});
+console.log('Типы:', JSON.stringify(byType), '| фигур:', TASKS.filter(t => t.fig).length, '\n');
+
+console.log('idx | type | subtopic | d | answer | fig');
+console.log('----+------+-----------------------+---+-----------+----');
+for (const t of TASKS) {
+ console.log(
+ `${String(t.idx).padStart(3)} | ${t.type.padEnd(4)} | ${String(t.subtopic).padEnd(21)} | ${t.diff} | ${String(t.answer).padEnd(9)} | ${t.fig ? '✓' : ''}`
+ );
+}
+
+if (problems.length) {
+ console.error(`\n✗ ПРОБЛЕМЫ (${problems.length}):`);
+ problems.forEach(p => console.error(' - ' + p));
+ console.error('\nЗапись отменена из-за ошибок валидации.');
+ db.close();
+ process.exit(1);
+}
+console.log('\n✓ Валидация и self-check ответов пройдены (30/30).');
+
+/* ── APPLY: upsert ─────────────────────────────────────────────────────────── */
+if (!APPLY) {
+ console.log('\nDRY-RUN: ничего не записано. Для записи: node backend/scripts/seed_ctmath_rt2425_e1v1.js --apply\n');
+ db.close();
+ process.exit(0);
+}
+
+const upsert = db.prepare(`
+ INSERT INTO exam_tasks
+ (exam_key, variant, task_idx, task_type, text_html, figure_html,
+ opts_json, answer, solution_html, topic, subtopic, difficulty)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+ ON CONFLICT(exam_key, variant, task_idx) DO UPDATE SET
+ task_type = excluded.task_type,
+ text_html = excluded.text_html,
+ figure_html = excluded.figure_html,
+ opts_json = excluded.opts_json,
+ answer = excluded.answer,
+ solution_html = excluded.solution_html,
+ topic = excluded.topic,
+ subtopic = excluded.subtopic,
+ difficulty = excluded.difficulty
+`);
+
+let n = 0;
+db.exec('BEGIN');
+try {
+ for (const t of TASKS) {
+ upsert.run(
+ EXAM, VARIANT, t.idx, t.type,
+ t.text,
+ t.fig || null,
+ t.type === 'mc' ? JSON.stringify(t.opts) : null,
+ t.answer,
+ buildSolution(t),
+ t.topic, t.subtopic, t.diff
+ );
+ n++;
+ }
+ // обновить variants_count = реальное число различных вариантов
+ const distinct = db.prepare(`SELECT COUNT(DISTINCT variant) c FROM exam_tasks WHERE exam_key=?`).get(EXAM).c;
+ db.prepare(`UPDATE exam_tracks SET variants_count=? WHERE exam_key=?`).run(distinct, EXAM);
+ db.exec('COMMIT');
+ console.log(`\n✓ Записано/обновлено ${n} заданий (variant=${VARIANT}).`);
+ console.log(`✓ exam_tracks.variants_count = ${distinct} (различных вариантов).`);
+ console.log(`\nПробник доступен: /exam-prep/ctmath → «Варианты» → «Вариант ${VARIANT}».\n`);
+} catch (e) {
+ db.exec('ROLLBACK');
+ console.error('\n✗ Ошибка записи, откат транзакции:', e.message);
+ process.exitCode = 1;
+}
+db.close();
diff --git a/frontend/img/ct/math/rt2425_e1v1/a2.png b/frontend/img/ct/math/rt2425_e1v1/a2.png
new file mode 100644
index 0000000..0f58e5b
Binary files /dev/null and b/frontend/img/ct/math/rt2425_e1v1/a2.png differ
diff --git a/frontend/img/ct/math/rt2425_e1v1/b12.png b/frontend/img/ct/math/rt2425_e1v1/b12.png
new file mode 100644
index 0000000..f9ca1d0
Binary files /dev/null and b/frontend/img/ct/math/rt2425_e1v1/b12.png differ
diff --git a/frontend/img/ct/math/rt2425_e1v1/b9.png b/frontend/img/ct/math/rt2425_e1v1/b9.png
new file mode 100644
index 0000000..06c31c5
Binary files /dev/null and b/frontend/img/ct/math/rt2425_e1v1/b9.png differ