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

Backlog реализации competitions

Зачем нужно

Документ раскладывает план реализации competitions на backlog epics/tasks и связывает каждый epic с каноническими сущностями, таблицами, endpoint-ами, статусными моделями и тестами.

Основной план находится в implementation-plan.md. Этот документ отвечает на другой вопрос: достаточно ли backlog покрывает всё, что нужно, чтобы разработать competitions с нуля.

Правила покрытия

  1. Каждая таблица из domains/competitions/data-model.md и database-schema.md должна быть привязана к epic.
  2. Каждый endpoint из domains/competitions/api-map.md должен быть привязан к epic.
  3. Каждая статусная модель из domains/competitions/state-machines.md должна быть привязана к epic.
  4. Каждый обязательный тестовый сценарий из domains/competitions/test-plan.md должен быть привязан к epic.
  5. Если canonical docs меняются, этот backlog обновляется в том же PR.
  6. Epic нельзя считать done, если его traceability rows не закрыты тестами и acceptance.

Definition of Done

Для каждого epic:

УсловиеЧто проверить
DocsCanonical docs не противоречат реализации
DBPrisma schema/migrations соответствуют database-schema
APIEndpoints, DTO, validation, error codes соответствуют api-map/api-contracts
PermissionsBackend guards покрывают required actor contexts
AuditDangerous/state-changing actions пишут audit
EventsOutgoing/incoming events идемпотентны
UILoading, empty, success, partial, error states реализованы
TestsUnit/integration/e2e/security/resilience tests покрывают сценарии
ObservabilityLogs, metrics, traces и alerts есть для production paths
RunbookДля операционного сценария есть инструкция или admin support path

Milestones

MilestoneEpic rangeProduction value
M0 FoundationC0-C2Сервис, БД, auth integration, permissions и UI shell готовы
M1 Competition setupC3-C5Admin может настроить event/season/tour/track/policies до открытия регистрации
M2 RegistrationC6-C10Работают individual, parent, teacher/group, official data, claim и paid hook
M3 Teacher and venue operationsC11-C17Learning Workspace handoff, groups, helpers, conduct applications, materials, venues
M4 Activity runtime and deliveryC18-C22LMS activity binding, training publication, attempts/submissions, group execution, photo reports
M5 Checking and resultsC23-C26Checking, appeals, arbitration, calculation, rankings, personal/public publication
M6 Documents and archiveC27-C28Documents, verification, archive, historical access
M7 Launch hardeningC29-C33Security, migration, support, observability, rehearsal готовы к production

Epic Backlog

C0. Repository, Service And Web Shell

Goal: создать рабочие competitions-api и competitions-web.

Tasks:

  1. Создать service skeleton NestJS с health/readiness endpoints.
  2. Подключить config, validation, API envelope, error catalog.
  3. Создать Next.js shell с auth guard, layouts и базовыми состояниями UI.
  4. Подключить CI: lint, typecheck, unit, integration, build.
  5. Подключить shared packages: api-contracts, permissions, observability, events-bus, testing.

Traceability: platform baseline, no domain tables yet.

C1. Database Baseline, Audit And Outbox

Goal: подготовить БД и infrastructure patterns для всех следующих epic.

Tasks:

  1. Создать Prisma schema baseline.
  2. Добавить migration conventions, seed, test DB reset.
  3. Реализовать common columns: ids, timestamps, status, external refs, snapshots.
  4. Реализовать competition_audit_log.
  5. Реализовать outbox/inbox для domain events.
  6. Добавить миграционный test db:migrate-check.

Tables: competition_audit_log, outbox/inbox support tables.

C2. Auth, Actor Context, Permissions And Admin Shell

Goal: competitions корректно использует identity, organization context и permissions.

Tasks:

  1. Подключить token validation через JWKS.
  2. Поддержать service-to-service token для identity/Learning Workspace/task-bank calls.
  3. Реализовать actor contexts: self, family, teacher_mode, learning_group, teacher_admin_layer, teacher_venue_layer, helper_limited, checker, systematika_admin, public.
  4. Создать permission catalog entries из permissions-matrix.md.
  5. Реализовать backend guards и audit reason для dangerous actions.
  6. Создать admin shell: navigation, role-aware menu, audit access.

Endpoints: all protected endpoint groups depend on C2.

C3. Event, Season And Tour Model

Goal: admin может создать и вести олимпиаду, сезон и туры без хардкода.

Tasks:

  1. Реализовать competition_event.
  2. Реализовать competition_season.
  3. Реализовать competition_tour.
  4. Реализовать status transitions event/season/tour.
  5. Добавить cancellation paths без удаления registrations/payments/audit.
  6. Реализовать admin screens event/season/tour.

Tables: competition_event, competition_season, competition_tour.

Endpoints: /admin/events*, /admin/seasons*, /admin/tours*, public /events, /events/{slug}.

C4. Grade Categories, Tracks And Policies

Goal: отделить классы/категории, зачёты, delivery mode и award rules.

Tasks:

  1. Реализовать competition_grade_category.
  2. Реализовать competition_track.
  3. Реализовать competition_award_policy.
  4. Реализовать registration policy, fee policy, official data policy, appeal policy.
  5. Проверить, что delivery mode не смешивается с result track.
  6. Добавить admin UI for grade categories, tracks and policies.

Tables: competition_grade_category, competition_track, competition_award_policy.

Endpoints: /admin/tracks, policy fields in /admin/seasons*, /admin/tours*.

C5. Public Event/Season Pages

Goal: временно обслуживать public competition pages из competitions, пока storefront не готов.

Tasks:

  1. Public list events.
  2. Public event page.
  3. Public season page with rules and registration CTA.
  4. Public training links placeholder.
  5. SEO baseline for competition pages.
  6. Migration trigger to storefront read-model.

Endpoints: /events, /events/{slug}, /seasons/{seasonId}/training-links.

C6. Participants And Registration Core

Goal: реализовать participant, two-step registration и season/tour participation.

Tasks:

  1. Реализовать competition_participant.
  2. Реализовать competition_registration.
  3. Реализовать competition_season_participation.
  4. Реализовать competition_tour_participation.
  5. Реализовать registration statuses: pre_submitted, needs_completion, submitted, pending_review, approved, duplicate_hold, rejected, cancelled.
  6. Реализовать duplicate detection and review queue.
  7. Реализовать TourParticipation delivery mode per participant.

Endpoints: /seasons/{seasonId}/pre-registrations, /registrations/{registrationId}/complete, /seasons/{seasonId}/registrations, /admin/registrations, /admin/registrations/{id}/status.

C7. Individual And Parent Registration

Goal: ученик и родитель проходят регистрацию корректно.

Tasks:

  1. Individual pre-registration and completion.
  2. Parent registers child.
  3. Child-mode tour access.
  4. Parent result/document visibility after publication policy.
  5. Student olympiad list: текущие, будущие, прошедшие.
  6. Прошедшие олимпиады показывать ограниченным списком 5-6 последних и ссылкой на архив.
  7. Карточка в списке показывает личный статус: участвовал / не участвовал, registration state и ближайшее действие.
  8. CTA “Пройти как тренажёр” показывается только при published LMS training publication.
  9. Карточка конкретной Олимпиады показывает состояния: не зарегистрирован, регистрация начата, не хватает official data, зарегистрирован/тур не начался, тур открыт, работа отправлена, результаты опубликованы, работа доступна, апелляция открыта, документ готов, олимпиада завершена.
  10. UI for parent child registration and status.

Screens: student cabinet, parent cabinet.

Tests: individual registration, parent registers child, child mode, student olympiad list/card states, trainer CTA hidden until LMS publication.

C8. Official Data Package Via Identity

Goal: official data package не хранит raw values в competitions.

Tasks:

  1. Реализовать competition_official_data_package.
  2. Реализовать status model: not_required, not_filled, incomplete, needs_verification, confirmed, rejected.
  3. Зафиксировать состав official data package: СНИЛС ребёнка, дата рождения ребёнка, email родителя, телефон родителя.
  4. Интеграция с identity protected attributes и parent contact records.
  5. Competitions хранит только requirement, status, refs и audit.
  6. Endpoint readiness/status показывает missing fields без раскрытия raw values.
  7. Endpoint create collection session / parent invite.
  8. Teacher collection flow может инициировать parent contact / pending parent invite только в разрешённом official flow.
  9. Parent invite не даёт учителю family/parent rights.
  10. Parent может подтвердить аккаунт и связь с ребёнком по ссылке.
  11. Reject raw official fields in competitions API.
  12. Audit all official data status/ref access.

Endpoints: /registrations/{registrationId}/official-data-status, /registrations/{registrationId}/official-data-collection.

Acceptance:

  • для неофициального сценария official data package не требуется;
  • для официального зачёта система показывает, какие поля отсутствуют;
  • teacher может заполнить official data только в разрешённом flow;
  • после teacher input родителю можно отправить invite;
  • parent invite создаёт или подтверждает родительский доступ только после parent/trusted action;
  • учитель не получает family/parent rights;
  • competitions не хранит сырой СНИЛС, дату рождения или контакты родителя как свободный текст.

C9. Claim Access And Participant Linking

Goal: участник без аккаунта может получить связь через controlled claim.

Tasks:

  1. Реализовать competition_access_claim.
  2. Реализовать statuses requested, approved, rejected, cancelled.
  3. Поддержать claim types: student, parent, family.
  4. Admin review and decision.
  5. No automatic merge between organization_student, student_profile, participant by name.
  6. Audit claim decisions.

Endpoints: /participants/{participantId}/claim-access, /admin/access-claims/{id}/status.

C10. Paid Admission Hook

Goal: поддержать платный сезон без реализации полного CRM.

Tasks:

  1. Ввести fee policy на season.
  2. Ввести admission/payment status как temporary competitions field.
  3. Обработать CRM payment/entitlement event if available.
  4. Реализовать idempotency for duplicate CRM events.
  5. Registration approval blocks without payment/entitlement for paid season.
  6. Migration trigger to CRM order/payment/entitlement flow.

Tests: paid season integration.

C11. Learning Workspace Handoff And Competition Groups

Goal: teacher/group registration использует Learning Workspace, а не собственный roster competitions.

Tasks:

  1. Read organizations for teacher mode.
  2. Read Learning Groups for selected organization.
  3. Create competition_group as season snapshot.
  4. Create competition_group_member.
  5. Store source refs and member snapshot.
  6. Ensure Learning Group updates do not mutate historical snapshots automatically.

Tables: competition_group, competition_group_member.

Endpoints: /teacher/organizations, /teacher/organizations/{organizationId}/learning-groups, /teacher/competition-groups.

C12. Teacher Group Registration And Helpers

Goal: teacher can register group/selected students and delegate limited actions.

Tasks:

  1. Group registration from competition group snapshot.
  2. Selected students registration.
  3. Organization student references and snapshots.
  4. Helper grants with limited roles.
  5. Permission checks for helper_limited.
  6. Teacher UI for group registration and helpers.

Endpoints: /teacher/competition-groups/{groupId}/registrations, /teacher/competition-groups/{groupId}/helpers.

Goal: external teacher scenario works without global teacher role.

Tasks:

  1. Реализовать competition-specific external teacher projection/application, not canonical educator profile.
  2. Canonical educator data живёт в identity-owned EducatorProfile.
  3. external_teacher_profile не является canonical profile; если имя остаётся в БД, оно обозначает projection/snapshot/access record.
  4. Verification lifecycle относится к application/projection: pending, verified, rejected, revoked.
  5. Реализовать external teacher student links.
  6. Enforce only verified projection/application can register/link participants where policy requires it.
  7. Права не выдаются из факта наличия profile; права идут через selected organization, Learning Workspace, grants и capabilities.
  8. External teacher assigned results after publication.
  9. Audit verification and link changes.

Endpoints: /external-teachers/profile, /external-teachers/profile/verify, /external-teachers/students, /external-teachers/students/{participantId}, /external-teachers/results.

C14. Teacher Conduct Applications

Goal: “Провести Олимпиаду” работает как отдельный operational flow.

Tasks:

  1. Реализовать competition_teacher_conduct_application.
  2. Statuses: draft, submitted, needs_changes, approved, rejected, cancelled, completed.
  3. approval_required определяется season/tour/material/venue/risk policy.
  4. В обычном первом туре submitted может разрешать registration actions и доступ к открытым материалам.
  5. approved требуется только для policy-сценариев: ранний доступ к закрытым материалам, официальный финал, открытая площадка, риск-сценарии.
  6. Teacher create/edit draft/needs_changes.
  7. Admin approve/reject/needs_changes only when approval is required.
  8. Complete conduct application after tour.
  9. Ensure conduct application does not create participant registration automatically.
  10. Link conduct application to materials, photo report, gratitude documents and operational notifications.

Endpoints: /teacher/conduct-applications*, /admin/conduct-applications*.

C15. Teacher Materials

Goal: teacher has materials by season/tour/status/window.

Tasks:

  1. Реализовать competition_teacher_material.
  2. Material types: poster, banner, announcement, instructions, tour material, participant list, report template, photo report, results news, gratitude.
  3. Availability windows and visibility.
  4. Admin material CRUD/publish.
  5. Teacher season/tour materials read.
  6. Audit closed material access.

Endpoints: /teacher/seasons/{seasonId}/materials, /teacher/tours/{tourId}/materials, /admin/materials*.

C16. Venues And Venue Applications

Goal: venue flow supports public venue list/map, selection and capacity guard.

Tasks:

  1. Реализовать competition_venue.
  2. Реализовать venue application lifecycle.
  3. Store participant-facing rules: access rules, documents, guardian policy, facility rules, public comment.
  4. Keep technical capabilities and admin internal comments private.
  5. Admin approval creates/updates venue.
  6. Public venue list/map payload excludes private fields.
  7. Capacity cannot decrease below active assignments without admin process.

Endpoints: /venues/applications, /venues/applications/{id}, /admin/venues, /admin/venues/applications/{id}/status, /seasons/{seasonId}/venues, /seasons/{seasonId}/venues/map, /venues/{venueId}/capacity.

C17. Venue Assignments And Venue Layer

Goal: participant can select/change venue and venue sees assigned participants only.

Tasks:

  1. Реализовать competition_venue_assignment.
  2. Venue assignment status model.
  3. Participant self/family/teacher/admin venue selection/change.
  4. UI warning on venue change.
  5. Venue participant list.
  6. Venue file/bulk upload permissions.
  7. Venue list exports.

Endpoints: /participants/{participantId}/venue-selection, /admin/venues/{venueId}/assignments, /venue/me/participants.

C18. Tour Activity Binding And Task Structure

Goal: tour is connected to an LMS activity or temporary LMS-compatible activity adapter. Competitions stores task count, max score per task, item refs and lock snapshots, not full task runtime.

Tasks:

  1. Реализовать competition_tour_activity_binding.
  2. Реализовать competition_tour_task_structure или equivalent item map.
  3. Для каждого класса/категории хранить количество задач.
  4. Для каждой задачи хранить task_number и max_score.
  5. Хранить lms_activity_ref.
  6. Хранить lms_activity_item_ref по задаче.
  7. Хранить task-bank source refs and content_export_snapshot_id only as content/source refs, not runtime refs.
  8. Зафиксировать lock до открытия тура.
  9. Запретить изменение структуры после lock без новой версии и audit.
  10. Если LMS не готов, использовать temporary LMS-compatible adapter.
  11. Temporary adapter stores locked activity snapshot for this tour only and has migration trigger to LMS activity runtime and task-bank content snapshot.

Tables/entities: competition_tour_activity_binding, competition_tour_task_structure, optional competition_tour_task_item, optional activity_snapshot_ref, optional task_bank_content_export_snapshot_ref.

Endpoints: /admin/tour-activity-bindings, /admin/tour-activity-bindings/{id}/lock.

C19. Training Publication

Goal: completed competition activity can be published as LMS training/review activity without creating competition attempts.

Tasks:

  1. Реализовать competition_training_publication.
  2. Training publication points to LMS activity or derived LMS activity.
  3. Require lms_ref.
  4. Optional storefront_ref only as public projection.
  5. Modes: practice, timed practice, review mode, mock contest.
  6. Training attempt is LMS-owned, not competition-owned.
  7. Competition result is never recalculated from training attempts.
  8. Student Olympiad archive shows trainer CTA only if publication status is published.

Endpoints: /seasons/{seasonId}/training-links.

C20. Competition Activity Launch And Participant Attempt Handoff

Goal: participant enters tour from competitions, but task execution happens in LMS activity runtime or temporary compatible adapter.

Tasks:

  1. Проверить participant eligibility.
  2. Проверить tour window.
  3. Проверить track/delivery rules.
  4. Создать или получить LMS activity attempt.
  5. Передать participant context в LMS runtime.
  6. Получить submission/attempt status обратно.
  7. Сохранить competition-facing refs/status in competition_submission.
  8. Не хранить raw answers in competitions, если runtime уже LMS-owned.
  9. Поддержать signed file access через storage policy.
  10. Поддержать personal work view через LMS attempt/file refs.
  11. Participant workspace UI opens activity from student olympiad card.

Endpoints: /tours/{tourId}/submissions, /submissions/{submissionId}, /submissions/{submissionId}/files.

C21. Teacher Group Submission And Bulk Uploads

Goal: teacher/helper/venue/admin can submit group answers and final files through LMS activity runtime or temporary compatible adapter according to delivery policy.

Tasks:

  1. Group answer submit with required warning.
  2. Teacher group answer submit writes to LMS activity attempt or temporary adapter.
  3. Lock sent students.
  4. Allow late new students before first-tour close if policy allows.
  5. Bulk final files upload creates LMS/adapter file submissions.
  6. Competitions stores refs/status, not file-checking ownership when runtime owns files.
  7. MVP may omit mandatory participant binding for every file, but target model supports binding via LMS attempt/item refs.
  8. Late upload reason/audit.
  9. Admin submission lock/void with reason.

Endpoints: /teacher/tours/{tourId}/group-submissions, /tours/{tourId}/bulk-files, /admin/submissions/{id}/lock.

C22. Photo Reports

Goal: teacher/venue photo report is tracked independently from results.

Tasks:

  1. Реализовать photo report storage/model.
  2. Statuses: submitted, confirmed, unconfirmed.
  3. unconfirmed requires comment.
  4. Link to venue, competition group and/or teacher conduct application.
  5. Link to tour and organization snapshot where applicable.
  6. Re-submission preserves audit history.
  7. Admin review UI.

Endpoints: /photo-reports, /photo-reports/{id}/status.

C23. Checking Integration And Score Snapshot

Goal: checking may run in LMS activity runtime or temporary adapter. Competitions consumes score snapshots and manages competition result lifecycle.

Tasks:

  1. Получить score by item из LMS/checking runtime.
  2. Сохранить immutable score snapshot для competitions.
  3. Синхронизировать checking status.
  4. Поддержать manual score import/admin override with reason.
  5. Поддержать checker assignment, если checking временно реализован внутри competitions adapter.
  6. Mask participant identity by default for manual checking.
  7. Не смешивать LMS training scores с competition scores.
  8. Передать финальные score snapshots в result calculation.

Endpoints: /checker/submissions, /checker/submissions/{id}/check.

C24. Appeals And Arbitration

Goal: result disagreement and suspicious work workflow are separate.

Tasks:

  1. Реализовать appeal lifecycle.
  2. UI status “Новая” maps to technical submitted.
  3. Appeal decision can create score/check version or recalculation.
  4. Реализовать arbitration case lifecycle.
  5. Arbitration can withhold result.
  6. Appeal and arbitration decisions require reason/audit.

Endpoints: /appeals, /admin/appeals/{id}/decision, /admin/arbitration-cases, /admin/arbitration-cases/{id}/decision.

C25. Results, Ranking And Award Calculation

Goal: results are calculated from immutable score snapshots, reviewed, finalized and withheld/released correctly.

Tasks:

  1. Реализовать competition_result.
  2. Реализовать competition_ranking.
  3. Consume finalized score snapshots from C23.
  4. Calculate by season/tour/class/track.
  5. Manual threshold snapshot approval.
  6. Award status calculation.
  7. Finalize result separately from publication.
  8. Withhold/release.
  9. Recalculation/amendment after finalized only with reason/audit.

Endpoints: /admin/results/calculate, /admin/results/{id}/finalize, /admin/results/{id}/withhold.

C26. Publications

Goal: personal and public publication are separate and policy-driven.

Tasks:

  1. Реализовать competition_publication.
  2. Personal result publication.
  3. Public standings publication by class/track.
  4. Work publication personal-only option.
  5. Trainer/review link publication only when LMS training publication is published.
  6. Hide/revoke publication.
  7. Public results endpoint excludes hidden/withheld results.
  8. Publication requires finalized results, not merely calculated results.

Endpoints: /admin/publications, /seasons/{seasonId}/public-results.

C27. Documents

Goal: award and gratitude documents are generated, verified, revoked and archived.

Tasks:

  1. Реализовать competition_award_document.
  2. Реализовать competition_document_generation_job.
  3. Generate award documents only for finalized award status.
  4. Generate gratitude documents for helpers, team, organization, venue.
  5. Verification code public endpoint with public-safe data.
  6. Revoke preserves verification history.
  7. Document download permissions.

Endpoints: /admin/documents/generate, /documents/verify/{code}.

C28. Archive And Historical Access

Goal: completed season remains immutable and accessible by rights.

Tasks:

  1. Season archive transition.
  2. Preserve access to own works/results/documents.
  3. Preserve venue/teacher/admin audit.
  4. Archive public pages.
  5. Archive exports.

Events: competitions.season.closed.

C29. Events And Integrations

Goal: outgoing/incoming events match canonical events.md.

Tasks:

  1. Publish lifecycle events for season, registration, participant, group snapshot, tour, activity binding, submission refs, score snapshots, venue, result, publication, documents.
  2. Consume identity organization/student/membership events.
  3. Consume Learning Workspace group/member events without mutating historical snapshots.
  4. Consume CRM payment/entitlement events if paid season is enabled.
  5. Consume LMS activity attempt/checking/score events.
  6. Consume task-bank content/source events only where they affect activity binding before lock.
  7. Publish minimal notification-trigger events for registration, missing official data, upcoming tour, teacher/venue operations, results and documents.
  8. Implement idempotency keys from events.md.

C30. Security, Privacy And Rate Limits

Goal: competitions is safe for child data, submissions, results and documents.

Tasks:

  1. PII minimization.
  2. Official protected data guard.
  3. Private file storage and signed URL access.
  4. Anonymous checking.
  5. Rate limits for registrations, submissions, public results, access claims.
  6. Watermarking scans if required.
  7. Alerts on mass downloads.
  8. Security tests from security.md.

C31. Observability, Admin Support And Exports

Goal: support and operations can run a season.

Tasks:

  1. Dashboards for registrations, submissions, checking backlog, document jobs, upload failures.
  2. Admin search by participant, registration, group, submission, result, document, venue, conduct application.
  3. Exports: participant lists, venue lists, checking queues, results, documents, operational reports.
  4. Audit log search.
  5. Support actions with reason/audit.

C32. Migration And Мир Олимп Decision

Goal: implement the already approved first-launch relation to existing olympiad systems.

Tasks:

  1. Use the early Migration decision gate outcome: new_season_only, archive_only, import_tasks, import_seasons_results or hybrid.
  2. If importing tasks, map to task-bank source refs, problem sets, activity templates or temporary content snapshots used by LMS activity binding.
  3. If importing results, preserve historical publication/document semantics.
  4. Define read-only archive access.
  5. Define data quality checks and reconciliation.
  6. Verify migrated data does not create competition-owned task runtime.

C33. Rehearsal, Launch Runbooks And Production Gate

Goal: production launch is rehearsed and operable.

Tasks:

  1. Create runbooks: registration opening, tour opening, tour closing, checking, publication, documents, rollback.
  2. Full staging rehearsal with realistic users, files, groups, venues, checks and documents.
  3. Load test registration spike.
  4. Load test submission/file upload spike.
  5. Backup/restore rehearsal.
  6. Incident response drill.
  7. Final launch checklist.

Traceability: Tables To Epics

Table/entityEpic
competition_eventC3
competition_seasonC3
competition_grade_categoryC4
competition_tourC3
competition_trackC4
competition_award_policyC4
competition_participantC6
competition_registrationC6
competition_official_data_packageC8
competition_season_participationC6
competition_tour_participationC6
competition_access_claimC9
competition_groupC11
competition_group_memberC11
competition_organizationC11
competition_organization_roleC12
competition_venueC16
competition_venue_assignmentC17
competition_teacher_conduct_applicationC14
competition_teacher_materialC15
External teacher projection / access recordC13
External teacher student linkC13
competition_tour_activity_bindingC18
competition_tour_task_structureC18
competition_tour_task_itemC18
competition_training_publicationC19
competition_submission as attempt/submission ref/statusC20
Item score snapshot / answer item refC23
competition_submission_file as file refC20, C21
Photo reportC22
Checking status ref / temporary adapter checkC23
Score snapshotC23
AppealC24
Arbitration caseC24
competition_resultC25
competition_rankingC25
competition_publicationC26
competition_award_documentC27
competition_document_generation_jobC27
competition_audit_logC1

Traceability: Endpoints To Epics

Endpoint/actionEpic
GET /eventsC5
GET /events/{slug}C5
GET /seasons/{seasonId}/venuesC16
GET /seasons/{seasonId}/venues/mapC16
GET /seasons/{seasonId}/public-resultsC26
GET /seasons/{seasonId}/training-linksC19
GET /documents/verify/{code}C27
GET/POST /admin/eventsC3
GET/PATCH /admin/events/{eventId}C3
GET/POST /admin/seasonsC3
PATCH /admin/seasons/{seasonId}/statusC3
GET/POST /admin/toursC3
PATCH /admin/tours/{tourId}/statusC3
GET/POST /admin/tracksC4
POST /seasons/{seasonId}/pre-registrationsC6
PATCH /registrations/{registrationId}/completeC6
POST /seasons/{seasonId}/registrationsC6
GET /teacher/organizationsC11
GET /teacher/organizations/{organizationId}/learning-groupsC11
GET/POST /teacher/competition-groupsC11
POST /teacher/competition-groups/{groupId}/registrationsC12
POST/DELETE /teacher/competition-groups/{groupId}/helpersC12
GET /registrations/{registrationId}/official-data-statusC8
POST /registrations/{registrationId}/official-data-collectionC8
GET /admin/registrationsC6
PATCH /admin/registrations/{id}/statusC6
POST /participants/{participantId}/claim-accessC9
PATCH /admin/access-claims/{id}/statusC9
GET/POST /teacher/conduct-applicationsC14
GET/PATCH /teacher/conduct-applications/{id}C14
POST /teacher/conduct-applications/{id}/completeC14
GET /admin/conduct-applicationsC14
POST /admin/conduct-applications/{id}/approveC14
POST /admin/conduct-applications/{id}/rejectC14
GET /teacher/seasons/{seasonId}/materialsC15
GET /teacher/tours/{tourId}/materialsC15
POST /admin/materialsC15
PATCH /admin/materials/{id}C15
POST /admin/materials/{id}/publishC15
POST /venues/applicationsC16
PATCH /venues/applications/{id}C16
GET/POST /admin/venuesC16
PATCH /admin/venues/applications/{id}/statusC16
PATCH /venues/{venueId}/capacityC16
POST/PATCH /participants/{participantId}/venue-selectionC17
POST /admin/venues/{venueId}/assignmentsC17
GET /venue/me/participantsC17
GET/POST /admin/tour-activity-bindingsC18
POST /admin/tour-activity-bindings/{id}/lockC18
POST /tours/{tourId}/submissionsC20
POST /teacher/tours/{tourId}/group-submissionsC21
GET /submissions/{submissionId}C20
POST /submissions/{submissionId}/filesC20
POST /tours/{tourId}/bulk-filesC21
POST /photo-reportsC22
PATCH /photo-reports/{id}/statusC22
POST /admin/submissions/{id}/lockC21
GET /checker/submissionsC23
POST /checker/submissions/{id}/checkC23
POST /admin/results/calculateC25
POST /admin/results/{id}/finalizeC25
POST /admin/results/{id}/withholdC25
POST /appealsC24
POST /admin/appeals/{id}/decisionC24
POST /admin/arbitration-casesC24
POST /admin/arbitration-cases/{id}/decisionC24
GET/POST /admin/publicationsC26
POST /admin/documents/generateC27
POST /external-teachers/profileC13
POST /external-teachers/profile/verifyC13
POST /external-teachers/studentsC13
DELETE /external-teachers/students/{participantId}C13
GET /external-teachers/resultsC13

Traceability: Status Models To Epics

Status modelEpic
EventC3
SeasonC3
TourC3
RegistrationC6
Official data packageC8
SeasonParticipationC6
TourParticipationC6
SubmissionC20
Photo reportC22
Tour activity bindingC18
Training publicationC19
ResultC25
PublicationC26
Venue applicationC16
Teacher conduct applicationC14
Teacher materialC15
Venue assignmentC17
Access claimC9
AppealC24
Arbitration caseC24
External teacher profileC13
External teacher student linkC13
Award documentC27

Traceability: Tests To Epics

Test scenarioEpic
Season status transitionsC3
Tour status transitionsC3
Track independent from delivery modeC4
Award policy thresholdsC4, C25
Publication requires finalized resultsC25, C26
Registration duplicate detectionC6
Participant without accountC6, C9
Organization student registration snapshotC6, C11
Access claim transitionsC9
TourParticipation delivery mode per participantC6
Two-step registration statusesC6
Official data package protected flowC8
Teacher official flow parent invite without parent rightsC8
Parent registration child modeC7
teacher_name_text never grants accessC6, C30
Disqualification blocks result publicationC6, C25, C26
LMS/adapter attempt cannot be edited after lockC20
Group answer submit lock warningC21
Late new students before first-tour closeC21
Void requires reasonC21
File validationC20, C30
Final MVP bulk uploadC21
Photo report transitionsC22
Activity binding lock prevents structure changesC18
LMS activity returns score by itemC20, C23, C25
Competition stores immutable score snapshotC23, C25
Rank calculation by track/categoryC25
Award status calculationC25
Manual threshold approval snapshotC25
Withheld result excluded from public publicationC25, C26
Result finalizationC25
Amendment/void auditC1, C25
Individual registration integrationC6, C7
Teacher registration through Learning GroupC11, C12
Parent registers child integrationC7
Organization student registration integrationC6, C11
Paid season integrationC10
Competition tour launches LMS activity attemptC18, C20
Temporary activity adapter follows LMS contractC18, C20, C23
Task-bank source does not become runtimeC18, C29, C30
Results and documents integrationC25, C26, C27
Appeals and arbitration integrationC24
Student online tour E2EC7, C20, C23, C25, C27
Teacher group tour E2EC11, C12, C14, C15, C21, C22
Open venue E2EC16, C17, C21, C22
Multi-track second tour E2EC4, C20, C25, C26
Participant cannot read another resultC2, C30
Parent cannot claim чужую записьC9, C30
Teacher cannot see unrelated Learning GroupC11, C30
Helper cannot exceed rightsC12, C30
Venue cannot see non-assigned participantsC17, C30
Student cannot edit locked submissionC20, C30
Public cannot see hidden/withheld resultsC25, C26, C30
Checker cannot access non-assigned submissionsC23, C30
Document verification public-safe dataC27, C30
Task-bank unavailable before lockC18, C29
Identity organization merge preserves historyC11, C29
CRM payment duplicate safeC10, C29
Document generation failure keeps finalized resultC27
Late submission after close requires overrideC21
Duplicate student review queueC6
Learning Group update after snapshot does not rewrite registrationsC11, C29
Training attempt does not affect competition resultC19, C29, C30
Student archive shows trainer only after LMS publicationC7, C19

Traceability: Events To Epics

Event groupEpic
Season published/opened/closedC3, C5, C28, C29
Registration eventsC6, C8, C10, C29
Participant/access claim eventsC6, C9, C29
Learning Group snapshot/helper eventsC11, C12, C29
Tour opened/activity binding lockedC3, C18, C29
Activity attempt/submission refs/group submission/late filesC20, C21, C29
Photo report eventsC22, C29
Venue eventsC16, C17, C29
Result/publication eventsC25, C26, C29
Appeal/arbitration eventsC24, C29
Award/document eventsC27, C29
Training publication eventsC19, C29

Completion Checklist

Before claiming “competitions is fully planned”, every row below must be true:

  • All C0-C33 epics are either in scope, explicitly deferred, or converted into a migration trigger.
  • Every table/entity row has an implementation ticket.
  • Every endpoint row has API contract, permission, validation and test tickets.
  • Every status model has transition tests.
  • Every test scenario has an owner and target pipeline layer.
  • Every security/privacy control has a test or manual launch checklist item.
  • Every temporary supporting slice has exit criteria.
  • Мир Олимп decision is explicit before first production season.
  • Full staging rehearsal passes before production launch.