-- ═══════════════════════════════════════════════════════════════ -- 083: Пул текстовых задач тренажёра (Уровень 1, Фаза 3). -- -- Кэш сгенерированных LLM и ПРОВЕРЕННЫХ задач: модель предлагает условие + -- уравнение (lhs/rhs) + корень, сервер подтверждает подстановкой (practiceVerify) -- и только тогда пишет сюда. Ученик берёт готовые задачи из пула (не платим за -- генерацию на каждый показ). story и заметки решения уже санитизированы. -- status: approved (видна ученикам) | draft (на ревью учителю). -- created_by ON DELETE SET NULL — задача переживает удаление автора. -- ═══════════════════════════════════════════════════════════════ CREATE TABLE IF NOT EXISTS practice_problems ( id INTEGER PRIMARY KEY AUTOINCREMENT, topic TEXT NOT NULL, -- word-linear | word-proportion | word-percent skill TEXT NOT NULL, -- ключ навыка (для прогресса) difficulty INTEGER NOT NULL DEFAULT 1, story TEXT NOT NULL, -- условие словами (экранировано) lhs TEXT NOT NULL, -- левая часть уравнения (выражение от x) rhs TEXT NOT NULL, -- правая часть answer_var TEXT NOT NULL DEFAULT 'x', answer REAL NOT NULL, -- проверенный корень solution_json TEXT, -- шаги [{note,tex}] (JSON) status TEXT NOT NULL DEFAULT 'approved', -- approved | draft created_by INTEGER REFERENCES users(id) ON DELETE SET NULL, created_at TEXT DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_practice_problems_skill ON practice_problems (skill, status);