docs: закрытие продуктовых рисков и новый LDD baseline
This commit is contained in:
25
README.md
25
README.md
@@ -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, переотправка до дедлайна, история, скачивание последней),
|
||||
|
||||
Reference in New Issue
Block a user