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

Связь с банком задач, LMS activity и тренажёром

Зачем нужно

Документ описывает, как домен олимпиад использует банк задач как источник контента, как тур связывается с LMS activity или temporary compatible adapter, какие данные competitions фиксирует для результата, и как прошедшая олимпиада ссылается на LMS-разбор или тренажёр.

Ключевое правило: problem set или activity template — это контент, LMS activity — runtime выполнения, competitions — соревновательный lifecycle и итоговые правила.

В банке задач могут храниться сами задачи, их условия, решения, методические разборы, теги, темы, подборки, activity templates and locked content export snapshots. В LMS activity runtime должны жить попытки, ответы, файлы, проверка и тренировочные попытки. В олимпиадном домене должно храниться только то, что нужно для результата: класс/категория, номер задачи, максимальный балл, LMS item ref, score by item, status проверки и immutable score snapshot.

Для competitions-first MVP допускается temporary LMS-compatible activity adapter: activity snapshot, item map и scoring snapshot фиксируются для конкретного тура. Adapter повторяет будущий LMS contract, не становится task-bank, не становится полноценным LMS и имеет migration trigger.

Что входит

Документ фиксирует:

  • границу между банком задач и олимпиадой;
  • различие между подборкой как контентом, LMS activity как runtime и competitions score snapshot как результатообразующим слоем;
  • как задачи связываются с сезоном, туром, классом и зачётом через activity binding;
  • какие item refs, номера задач и max score фиксируются в competitions;
  • как поддержать автоматическую и ручную проверку через LMS/runtime или temporary adapter;
  • как один и тот же контент может использоваться в олимпиаде и потом в LMS-разборе или тренажёре;
  • почему тренировочная попытка не является олимпиадной попыткой;
  • какие сущности нужны в олимпиадном домене: activity binding, task structure, task item, score snapshot;
  • какие данные должны оставаться в банке задач;
  • какие правила аудита нужны.

Что не входит

Документ не проектирует подробно:

  • полный редактор задач;
  • внутреннюю таксономию тем и навыков;
  • хранение медиа внутри задач;
  • полноценный UX тренажёра;
  • LMS progress, учебные и тренировочные попытки;
  • детальную проверку развёрнутых решений жюри;
  • финальные API-контракты;
  • импорт из проекта МИР Олимп.

4. Главный принцип модели

Нужно разделять четыре уровня.

УровеньЧто означаетГде источник истины
Problem contentусловие задачи, варианты контента, решение, разбор, тегибанк задач
Problem selection / activity templateподборка задач или competition round design как контентная единицабанк задач
Content export snapshotlocked payload задач, порядка, ролей, scoring/rubric refs and visibility policiesбанк задач + consumer
Activity runtimeотображение задания, attempts, responses, files, checking resultLMS activity runtime или temporary adapter
Competition score snapshotномер задачи, max score, LMS item ref, score by item, status проверкидомен олимпиад

Подборка или activity template отвечает на вопрос: «какие задачи как контент мы хотим использовать и в какой роли/структуре?»

LMS activity отвечает на вопрос: «как участник видит задания, отвечает, загружает файлы и получает checked score?»

Competition score snapshot отвечает на вопрос: «какие item refs, номера задач, максимальные баллы и баллы участника входят в итоговый результат?»

5. Граница ответственности

5.1. Банк задач отвечает за контент

ОбъектОписание
Problemзадача как контентная единица
ProblemStatementусловие задачи
ProblemAssetизображения, формулы, файлы и медиа
ProblemSolutionрешение или разбор
ProblemTagтема, навык, сложность, источник
ProblemSelectionподборка задач
ActivityTemplatedesign олимпиадного тура, если нужны sections, sample/reserve blocks, instructions
ContentExportSnapshotlocked transfer problem set/activity template to competitions
MethodicalMaterialметодические материалы

5.2. LMS activity runtime отвечает за выполнение

ОбъектОписание
Activityконтейнер активности тура
ActivityItemзадача внутри активности
ActivityAttemptпопытка участника или группы
Responseответ на задачу
FileResponseфайл, фото, скан или zip
CheckingResultрезультат проверки по item
ActivityScoreбалл по item и итоговый балл активности

5.3. Олимпиадный домен отвечает за lifecycle и snapshots

ОбъектОписание
TourActivityBindingсвязь тура/класса/зачёта с LMS activity или temporary adapter
TourTaskStructureколичество задач, максимум, task-bank snapshot ref и locked structure snapshot
TourTaskItemномер задачи, max score, LMS activity item ref
ScoreSnapshotimmutable балл участника по item
TrainingPublicationпубликация прошедшей activity как тренажёра
LmsReviewLinkссылка на разбор, курс, урок или тренировочный модуль LMS

6. Основные сущности

СущностьНазначение
TourActivityBindingсвязь тура с LMS activity или temporary adapter
TourTaskStructureзафиксированная структура задач для класса/категории
TourTaskItemtask number, max score, LMS item ref
ScoreSnapshotscore by item для результата
ActivityPublicationPolicyкогда участник видит условия, ответы, решения и разборы
TrainingPublicationпревращение прошедшей activity в тренажёр
LmsReviewLinkexternal ref на LMS-разбор или тренировочный модуль

7. TourActivityBinding

TourActivityBinding — связь конкретного сезона, тура, класса или категории с LMS activity или temporary compatible adapter.

Binding может быть создан на основе problem set или activity_template(type=competition_round) из банка задач, но не равен этой подборке/template и не становится runtime выполнения.

ПолеОписание
idуникальный идентификатор
competition_season_idсезон
tour_idтур
grade_category_idкласс или категория
lms_activity_refLMS activity, если runtime готов
adapter_reftemporary adapter, если LMS runtime ещё не готов
task_bank_source_refисходная подборка/версии из банка задач, если есть
content_export_snapshot_reflocked snapshot из task-bank
statusстатус binding
task_countколичество задач в activity structure
max_scoreмаксимальный балл
locked_atкогда структура зафиксирована

Статусы:

СтатусЗначение
draftbinding готовится
reviewbinding на проверке
approvedbinding утверждён
assignedbinding назначен на тур
activeactivity используется в текущем туре
lockedbinding заблокирован от изменений
archivedbinding архивирован
training_availableactivity доступна как тренажёр

Правила:

  1. Binding принадлежит олимпиадному сезону и туру.
  2. Binding может ссылаться на LMS activity и source refs из банка задач.
  3. Изменение исходной подборки после lock не должно автоматически менять утверждённую структуру тура.
  4. Перед запуском тура binding и task structure должны быть утверждены и заблокированы.
  5. Количество задач и max score по каждой задаче должны быть явно зафиксированы.
  6. Если используется temporary adapter, он должен иметь explicit migration plan в LMS activity runtime.

8. TourTaskStructure и TourTaskItem

TourTaskStructure фиксирует количество задач, максимальный балл и список item refs для конкретного тура и класса/категории.

TourTaskItem — минимальная result-facing запись о задаче внутри activity.

ПолеОписание
idуникальный идентификатор
activity_binding_idсвязь тура с LMS activity или adapter
task_numberномер задачи
display_titleотображаемое название или номер
max_scoreмаксимальный балл
lms_activity_item_refitem внутри LMS activity
task_bank_problem_version_refsource ref на версию задачи, если есть
scoring_snapshotзафиксированный scoring metadata для результата

Правила:

  1. Для competitions достаточно знать номер задачи, max score, item ref и score snapshot.
  2. Raw answer policy, answer key, attempts, files и checking details живут в LMS/runtime или temporary adapter.
  3. Изменение source problem после lock не меняет историческую activity structure.
  4. Если temporary adapter хранит answer/scoring details, это locked snapshot конкретного тура, а не task-bank внутри competitions.

9. ScoreSnapshot

ScoreSnapshot — immutable результат проверки по activity item.

ПолеОписание
submission_idcompetition-facing submission/attempt ref
tour_task_item_idresult-facing item
lms_activity_item_refitem ref из LMS/runtime
task_numberномер задачи
scoreбалл участника
max_scoreмаксимум
checking_statusстатус проверки
source_runtime_refLMS/checking runtime или adapter
versionверсия snapshot

Правила:

  1. Result calculation использует score snapshots, а не raw answers.
  2. Training scores не попадают в competition score snapshots.
  3. Любое изменение score после finalize создаёт новую версию и audit.
  4. Score snapshot остаётся воспроизводимым после миграции adapter в LMS runtime.

10. Snapshot исторической версии

Олимпиада должна быть воспроизводимой после завершения сезона.

Snapshot может храниться:

  • в task-bank через immutable problem versions;
  • в LMS activity version;
  • во временном adapter snapshot для первого запуска;
  • в competitions только как structure/score snapshot, достаточный для результата.

Competitions не хранит канонически текст задачи, варианты ответа, правильный ответ, контент урока, тренировочные попытки и LMS progress.

11. Связь с submission/checking

Participant или teacher запускает/заполняет LMS activity attempt или temporary adapter attempt. Competitions хранит competition_submission как ref/status и получает checked score by item.

Правила:

  1. Answer/Response должен ссылаться на LMS ActivityItem или adapter item.
  2. Балл возвращается runtime/checking layer и snapshots в competitions.
  3. Ручная проверка может временно идти в adapter, но её результат всё равно сохраняется как score snapshot.
  4. Нельзя проверять олимпийскую работу только по актуальному состоянию Problem в банке задач, потому что оно могло измениться после проведения тура.

16. Публикация материалов после олимпиады

После завершения олимпиады activity или её derived version может стать публичным материалом прошлых лет или ссылкой на LMS-разбор/тренажёр.

Публикуемые материалы могут включать:

  • условия задач;
  • варианты ответа;
  • правильные ответы;
  • решения;
  • критерии;
  • разборы;
  • статистику по задачам, если разрешено;
  • ссылку на тренировочную попытку в LMS/тренажёре.

Правила:

  1. Публикация материалов не равна публикации результатов участников.
  2. Условия можно публиковать раньше или позже правильных ответов и решений.
  3. Решения и критерии могут открываться отдельной публикацией.
  4. Для материалов прошлых лет может использоваться исторический snapshot.
  5. LMS-разбор и тренажёр публикуются как external refs; competitions не становится владельцем LMS progress.

17. TrainingPublication

TrainingPublication описывает публикацию прошедшей activity как тренажёра или ссылки на LMS-тренажёр.

ПолеОписание
idуникальный идентификатор
source_activity_binding_idисходный activity binding
source_tour_task_structure_idисходная структура задач
competition_season_idсезон-источник
tour_idтур-источник
grade_category_idкласс или категория
titleназвание тренажёра
training_modeрежим тренировки
visibilityкому доступно
lms_refexternal ref на LMS-разбор/тренажёр, если попытки живут в LMS
statusстатус публикации
published_atдата публикации

Режимы training_mode:

РежимОписание
practiceобычная тренировка без рейтинга
timed_practiceтренировка с таймером
review_modeпросмотр задач, ответов и решений
mock_contestимитация олимпиады

Статусы:

СтатусЗначение
draftтренажёр готовится
scheduledпубликация запланирована
publishedтренажёр опубликован
pausedвременно скрыт
archivedархивирован

Правила:

  1. TrainingPublication использует контент и конфигурацию прошедшего тура, но создаёт или ссылается на новые попытки тренировки, не влияющие на олимпиадные результаты.
  2. Тренировочные попытки не должны попадать в ResultTrack, Attempt, Submission или Result олимпиады.
  3. В тренажёре могут использоваться другие правила подсказок, решений и повторных попыток.
  4. Доступность тренажёра может зависеть от продукта, курса, роли или публичной витрины.
  5. Если тренажёр реализован в LMS, competitions хранит только lms_ref, publication status и audit публикации ссылки.
  6. В интерфейсе ученика кнопка “Пройти как тренажёр” показывается только для published TrainingPublication с доступным lms_ref.
  7. Переход в тренажёр ведёт в LMS/training контур и не создаёт competition_attempt, competition_submission или competition_result.

18. Статусы жизненного цикла activity binding

СостояниеЗначение
content_selectedзадачи выбраны как контент
activity_boundвыбран LMS activity или temporary adapter
structure_configuredзафиксированы item refs, номера задач и max score
reviewedbinding проверен
approvedbinding утверждён
locked_for_contestbinding и структура заблокированы для проведения
active_in_contestactivity используется в туре
contest_finishedтур завершён
results_calculatedрезультаты рассчитаны
materials_publishedматериалы опубликованы
training_publishedтренажёр опубликован
archivedbinding архивирован

19. Админские требования

Администратор или ответственный за контент должен иметь возможность:

  • выбрать подборку из банка задач;
  • создать TourActivityBinding;
  • выбрать LMS activity или temporary adapter;
  • задать количество задач;
  • задать item refs, порядок и max score;
  • проверить полноту activity structure;
  • утвердить и заблокировать binding перед туром;
  • опубликовать материалы после завершения тура;
  • создать тренажёр на основе прошедшей activity.

20. Проверки готовности перед запуском тура

Перед запуском тура система должна проверить:

ПроверкаУсловие
есть bindingTourActivityBinding назначен на тур и класс
есть runtimelms_activity_ref или approved temporary adapter
есть задачиtask_count больше нуля
задан порядоку каждой задачи есть task_number
есть item refsу каждой задачи есть lms_activity_item_ref или adapter item ref
заданы баллыу каждой задачи есть max_score
задан score contractLMS/runtime возвращает score by item
binding заблокированутверждённая структура не меняется во время тура

21. Права доступа

ПравоНазначение
tour_activity_binding.createсоздать binding тура
tour_activity_binding.configureнастраивать binding
tour_activity_binding.approveутверждать binding
tour_activity_binding.lockблокировать binding перед проведением
tour_task_structure.configureнастраивать item refs и max score
temporary_adapter.configureнастраивать temporary adapter snapshot
materials.publishпубликовать материалы олимпиады
training_publication.createсоздавать тренажёр по прошедшей activity
training_publication.publishпубликовать тренажёр

22. Требования к аудиту

Аудироваться должны:

  • создание TourActivityBinding;
  • связь с исходной подборкой;
  • добавление или удаление item из structure;
  • изменение порядка задач или item refs;
  • изменение max score;
  • изменение score contract;
  • утверждение binding;
  • блокировка binding;
  • разблокировка binding;
  • сохранение score snapshot;
  • публикация материалов;
  • создание и публикация тренажёра;
  • любые изменения после начала тура.

23. Доменные события

СобытиеКогда возникает
TourActivityBindingCreatedсоздан binding тура
ProblemSelectionLinkedbinding связан с source refs из банка задач
TourTaskStructureConfiguredнастроены item refs, номера задач и max score
ScoreContractConfiguredзадан контракт возврата score by item
TourActivityBindingApprovedbinding утверждён
TourActivityBindingLockedbinding заблокирован
ScoreSnapshotCreatedсохранён immutable score snapshot
ContestMaterialsPublishedопубликованы материалы олимпиады
TrainingPublicationCreatedсоздан тренажёр по activity
TrainingPublicationPublishedтренажёр опубликован

24. Нестандартные случаи

СитуацияТребуемое поведение
Подборка изменилась после назначения на турlocked activity structure не меняется автоматически
LMS activity item не возвращает scoreтур нельзя открыть до настройки score contract
У задачи нет max scoreтур нельзя открыть или item считается неготовым
В банке задач исправили условие после проведенияисторическая версия олимпиады должна остаться воспроизводимой
Нужно изменить проверку после тураизменение аудируется, создаёт новую score snapshot/version и запускает пересчёт затронутых результатов
Одна задача используется в олимпиаде и тренажёретренажёр создаёт отдельные тренировочные попытки, не влияющие на результаты олимпиады
LMS прислал событие тренировочной попыткисобытие не создаёт competition submission/result и используется только для аналитики/витрины
Письменная задача не имеет структурированного ответаchecking идёт в LMS/runtime или temporary adapter через file response/manual review
В одном туре есть тестовые и письменные задачиActivity и score snapshots должны поддерживать смешанный формат

Готовность

  1. Добавить модель TourActivityBinding.
  2. Добавить модель TourTaskStructure.
  3. Добавить модель TourTaskItem с LMS item refs and max score.
  4. Добавить temporary adapter contract, если LMS runtime не готов.
  5. Добавить проверки готовности binding перед запуском тура.
  6. Добавить блокировку binding перед проведением.
  7. Добавить получение score by item из LMS/runtime.
  8. Добавить immutable ScoreSnapshot.
  9. Добавить аудит изменения item refs, max score и score snapshots.
  10. Добавить модель TrainingPublication.
  11. Добавить публикацию материалов после завершения тура.
  12. Добавить запрет влияния тренировочных попыток на олимпиадные ResultTrack.

27. Статус документа

Документ является первой версией модели связи олимпиад с банком задач и тренажёром. Следующий рекомендуемый документ: первая дорожная карта Codex-задач по домену олимпиад.