docs: закрытие продуктовых рисков и новый LDD baseline

This commit is contained in:
2026-10-28 13:26:43 +03:00
parent 71fa3284a0
commit 9dcba8ce0c
16 changed files with 584 additions and 212 deletions

View File

@@ -54,7 +54,8 @@ progress `:8083`, web `:8090`. Интерфейс: `http://localhost:8090`.
./gradlew ktlintCheck detekt test # линтеры (строгий режим) + тесты
./gradlew evidenceCheck # LDD: P0-claims должны иметь зелёные свидетельства
./gradlew ktlintFormat # автоформат Kotlin
./scripts/ldd-runtime.sh # runtime-smoke полного стека на одноразовой БД
./scripts/ldd-smoke.sh # быстрый smoke полного стека (как CI job smoke)
./scripts/ldd-runtime.sh # runtime-smoke полного стека + scale load
./scripts/ldd-migration-upgrade.sh # upgrade с master-схемы
./scripts/ldd-mutation.sh # PIT: mutation strength критичных P0-компонентов
./scripts/ldd-browser.sh # Playwright E2E (cd e2e && npm install && npx playwright install chromium)
@@ -69,10 +70,14 @@ progress `:8083`, web `:8090`. Интерфейс: `http://localhost:8090`.
- Тестовая инфраструктура — `libs:test-support` (JUnit 5, MockK, Testcontainers `postgres:18`).
- **LDD** — реестр проверяемых утверждений `docs/evidence/claims.json`;
P0 без зелёного теста валит `./gradlew evidenceCheck`. Runtime, migration,
mutation и browser E2E — отдельные скрипты из `scripts/`; baseline —
mutation, browser E2E и smoke — скрипты из `scripts/`; baseline —
`docs/evidence/baseline-2026-10-27.md`.
- CI merge gate — `.gitlab-ci.yml`: `./gradlew --no-daemon test ktlintCheck detekt evidenceCheck`
на push/MR. Runner должен разрешать privileged `docker:dind` для Testcontainers.
- CI merge gate — `.gitlab-ci.yml`: `test ktlintCheck detekt evidenceCheck` и
job `smoke` (`scripts/ldd-smoke.sh`) на каждом push/MR. Полный
`release-evidence` (`scripts/ldd-release.sh`) обязателен для тегов и
запускается вручную для веток. `check` требует privileged `docker:dind`
для Testcontainers; `smoke`/`release-evidence` — shell-runner с Java 21,
Docker Compose v2, Python 3 и (для release) Node/Chromium.
## Запуск в Docker (для сервера)
@@ -113,6 +118,11 @@ cp .env.prod.example .env.prod # заполнить LMS_DB_PASSWORD
- **Доступ**: JWT (RSA, ключи identity генерирует при первом старте и хранит в БД),
проверка токена на gateway, роли ADMIN/TEACHER/STUDENT, CSRF на всех POST-формах,
session fixation-защита; вход студента с обязательной сменой пароля.
Access-токен живёт 15 минут (`LMS_ACCESS_TOKEN_TTL`), refresh — 7 дней
(`LMS_REFRESH_TOKEN_TTL`) с ротацией и отзывом; прямой API использует
`POST /api/v1/auth/refresh`. Web-сессия `LMS_SESSION` — 7 дней sliding
(`LMS_SESSION_TIMEOUT`), access обновляется автоматически за 2 минуты до
истечения; logout и смена пароля отзывают refresh.
- **Группы и студенты**: группы-когорты (поток, курс, номер, степень, год набора),
импорт `.xls/.xlsx/.csv` по шаблону `поток/курс/номер/степень/год набора/ФИО/№/база`,
ручное добавление студента (генерация пароля) и «Добавить существующего»
@@ -139,8 +149,8 @@ cp .env.prod.example .env.prod # заполнить LMS_DB_PASSWORD
`/teacher/courses/{id}/content`. Чужой курс отклоняется на сервисах.
- **Аудит**: чувствительные действия (профили, скачивания, оценки, защиты,
курсы, группы, материалы, преподаватели, жизненный цикл) пишутся в
`identity.audit_events`; админ смотрит `/admin/audit` с фильтром по действию
и временем МСК.
`identity.audit_events`; админ смотрит `/admin/audit` с фильтром по действию,
временем МСК и постраничным переходом «Показать ещё» (`page`/`limit`).
- **Повышение и жизненный цикл**: `/admin/promotion` — dry-run, применение
и откат повышения (автоматический dry-run 31 августа МСК); на странице
группы — академотпуск, возврат, отчисление, архив и восстановление;
@@ -165,6 +175,9 @@ cp .env.prod.example .env.prod # заполнить LMS_DB_PASSWORD
markdown (код, спойлеры, картинки; санитизация OWASP); импорт ZIP
(`chapters/N-глава/N-раздел/N-статья.md` + `assets/`); создание/переименование/
удаление глав, разделов, статей; перенос статей между разделами.
Видимость картинок наследуется от статьи; файл без привязки к статье отдаёт
`404` обычным пользователям и доступен только админу, который получает
список таких файлов через `GET /api/v1/content/legacy-assets`.
- **Студент**: дашборд успеваемости (сдано, средний балл, лучшая/слабая оценка),
карточки опубликованных лаб, страница лабы: условие, свой вариант, сдача
файлов (zip/.c, переотправка до дедлайна, история, скачивание последней),