feat: закрыть остаточный backlog

- keyset-пагинация аудита с курсором (occurred_at, id) и UI «Показать ещё»
- пакетный /api/v1/labs/details и переход progress на один запрос
- абсолютный потолок сессии 30 дней (identity V12 + web), очистка refresh
- админская инвентаризация legacy-активов (/admin/legacy-assets, скрипт)
- E2E в Chromium/Firefox/WebKit (18/18), CI preflight
- LDD: 51 claim, 346 тестов, docs и handoff обновлены
This commit is contained in:
2026-10-28 19:29:23 +03:00
parent d45137220c
commit 1e1e9ae0e4
64 changed files with 2124 additions and 372 deletions

View File

@@ -52,14 +52,14 @@
# 6. Mutation testing критичных P0-компонентов
./scripts/ldd-mutation.sh
# 7. Браузерный E2E (Playwright + Chromium)
# 7. Браузерный E2E (Playwright: Chromium/Firefox/WebKit)
./scripts/ldd-browser.sh
# 8. Полный release gate
./scripts/ldd-release.sh
```
Для E2E один раз установите зависимости и браузер: `cd e2e && npm install && npx playwright install chromium`.
Для E2E один раз установите зависимости и браузеры: `cd e2e && npm install && npx playwright install chromium firefox webkit`.
Mutation harness использует JUnit 4: JUnit5-плагин PIT несовместим с JUnit
Platform 6 из Spring Boot 4.
@@ -87,15 +87,17 @@ Platform 6 из Spring Boot 4.
LDD-циклы выполнены 2026-10-27/28; последний — после закрытия продуктовых
рисков:
- **319 автоматических тестов**, 0 failures/errors;
- **46 claims**: 25 P0 + 21 P1, **46/46 proven, P0 gaps = 0**. P0 — доступы,
- **346 автоматических тестов**, 0 failures/errors;
- **51 claims**: 25 P0 + 26 P1, **51/51 proven, P0 gaps = 0**. P0 — доступы,
повышение, жизненный цикл, профиль/скачивание, материалы/активы
(включая secure-by-default legacy-файлы), миграция V13, аудит, refresh-токены
и их отзыв; P1 — группы, авторство, UI, контракты, импорт, копирование лаб,
пагинация аудита, bulk-группы курса, runtime, mutation и browser E2E;
(включая secure-by-default legacy-файлы), миграции V11–V13, аудит,
refresh-токены и их отзыв; P1 — группы, авторство, UI, контракты, импорт,
копирование лаб, keyset-пагинация, пакетные детали лабораторных,
абсолютный потолок сессии, runtime, mutation и browser E2E;
- mutation testing: `CourseAccessService` 75% test strength,
`PromotionPlanner` 69%;
- Playwright: 4 сценария (admin, teacher, student/anonymous, сдача+mobile),
- Playwright: 6 сценариев (admin, teacher, student/anonymous, сдача+mobile,
cursor-аудит, инвентаризация активов) × Chromium/Firefox/WebKit = **18/18**,
все зелёные;
- масштабный load: 100 групп / 1000 студентов, 125 параллельных чтений,
0 ошибок, p95 < 1 с (порог p95 < 2 с);
@@ -107,7 +109,9 @@ LDD-циклы выполнены 2026-10-27/28; последний — посл
Kotlin-модуль, поэтому DTO с default-значениями требовали все поля JSON
(например, создание студента без `firstName`/`basis` давало 400).
Остаточные ограничения: offset-пагинация аудита, N+1 в отдельных лабораторных
списках/ведомости, отсутствие абсолютного лимита web-сессии. Legacy-активы,
срок жизни JWT и «ведущие нули» больше не являются открытыми рисками.
Остаточные ограничения: ручная инвентаризация legacy-активов на production,
сдачи по выбранной лабораторной в ведомости, непроверенный первый CI-прогон на
реальных runner'ах и отсутствие визуальной регрессии. Legacy-активы, срок
access-токена, пагинация, N+1 деталей лабораторных, абсолютный лимит сессии и
«ведущие нули» больше не являются открытыми рисками.
Результаты — в `baseline-2026-10-27.md`.