feat: закрыть остаточные P1/P2 по профилю, когорте и ведомости

- профиль приведён к docs/09: variant/level, updatedBy/name, лимит попыток
- V14: NOT NULL и полная уникальность когорты, preflight legacy-групп
- возврат группы из архива и история членства на странице группы
- пагинация групп и плоского списка материалов
- пакетные сдачи ведомости одним запросом
- XLSX-preflight импорта и audit-тесты ростера
- LDD: 66 claims, 398 тестов, release PASS
This commit is contained in:
2026-10-29 20:51:27 +03:00
parent 7ef5c866a3
commit 82394cc688
48 changed files with 1196 additions and 156 deletions

View File

@@ -1,6 +1,6 @@
# 17. Handoff: состояние проекта после закрытия продуктовых рисков
**Дата:** 2026-10-28.
**Дата:** 2026-10-29.
**Ветка:** `feature/groups-courses`.
**История:** `git log --oneline`; последние изменения — Woodpecker CI и
изоляция тестовой среды на отдельной VM.
@@ -20,8 +20,10 @@
- Роли `ADMIN`, `TEACHER`, `STUDENT`.
- Группы-когорты: `stream`, `course`, `number`, `degree`, `enrollment_year`,
`status`; история членства `membership_history`.
- Импорт групп Excel v2, перевод/академ/отчисление/выпуск/архив/восстановление.
`status`; история членства `membership_history`. `V14` делает поля когорты
`NOT NULL` и уникальность полной; архивная группа возвращается из архива.
- Импорт групп Excel v2 (CSV/XLSX с row-level preflight), перевод/академ/
отчисление/выпуск/архив/восстановление.
- Удаление студента с усиленным подтверждением (`login` или ФИО).
- Вход закрыт для отчисленных, выпущенных, архивных студентов и архивных
аккаунтов; архивные/выпущенные группы также блокируют вход.
@@ -116,8 +118,8 @@
### 1.8. LDD и проверки
- Реестр: `docs/evidence/claims.json`.
- **59 claims**: 27 P0 + 32 P1; **59/59 proven, P0 gaps = 0**.
- **385 автотестов**, 0 failures/errors/skipped.
- **66 claims**: 27 P0 + 39 P1; **66/66 proven, P0 gaps = 0**.
- **398 автотестов**, 0 failures/errors/skipped.
- Mutation testing:
- `CourseAccessService` — 75% test strength;
- `PromotionPlanner` — 69%.
@@ -143,7 +145,7 @@
| Сервис | Диапазон | Что важно |
|---|---|---|
| identity | `V4–V13` | роли, группы, статусы, promotion, история, аудит (`V10`), refresh (`V11`), absolute (`V12`), keyset-индексы (`V13`) |
| identity | `V4–V14` | роли, группы, статусы, promotion, история, аудит (`V10`), refresh (`V11`), absolute (`V12`), keyset-индексы (`V13`), финальные ограничения когорты (`V14`) |
| academic | `V6–V12` | курсы, `labs.course_id`, главы/аудитории, индексы, `article_assets`, backfill |
| progress | `V13` | автор комментария/оценки; V13 идемпотентна |
@@ -153,6 +155,8 @@
`deploy/preflight/progress-v10-v13.sql`, объекты не удалять.
- Production/master: progress V11/V12 уже есть, затем V13.
- `labs.course_id NOT NULL` — post-bootstrap, не Flyway.
- `V14` намеренно падает на legacy-группах с NULL-когортой; SQL для проверки —
в `deploy/DEPLOY.md`.
### 1.10. Деплой и backup
@@ -194,8 +198,8 @@ cat build/reports/evidence/index.md
```
Последний подтверждённый результат:
- `385` тестов, 0 failures;
- `59/59` claims, P0 gaps = 0;
- `398` тестов, 0 failures;
- `66/66` claims, P0 gaps = 0;
- `ldd-release.sh` — PASS;
- smoke — PASS;
- browser E2E — 18/18 (Chromium/Firefox/WebKit);
@@ -225,10 +229,12 @@ cat build/reports/evidence/index.md
Сейчас 6 сценариев × 3 браузера, без screenshot-diff. Добавлять по мере
роста UI.
4. **Пакетные сдачи в ведомости.**
Детали лабораторных курса уже пакетные, но ведомость запрашивает сдачи по
выбранной лабораторной отдельно. Оптимизировать, если появятся медленные
курсы.
4. **Гонка импорта.**
Preflight закрывает известные конфликты, но параллельная вставка логина
всё ещё даёт общий 409.
5. **Restore на staging.**
Backup/restore-скрипты готовы; нужен реальный прогон на стенде с логом.
«Контингент»/`next.uniyar.ac.ru` **исключён из плана** решением от 2026-10-28:
нет API-спецификации и доступа к внешней системе. При появлении нового ТЗ
@@ -274,9 +280,9 @@ cat build/reports/evidence/index.md
1. `git status --short --branch` — ожидается чистое дерево на
`feature/groups-courses`.
2. Прочитать этот файл, затем `docs/16-stage6-report.md` §7 и
`docs/evidence/baseline-2026-10-27.md`.
3. `./gradlew test ktlintCheck detekt evidenceCheck` — должно быть 385 тестов
и 59 claims, 59/59 proven.
`docs/evidence/baseline-2026-10-29.md`.
3. `./gradlew test ktlintCheck detekt evidenceCheck` — должно быть 398 тестов
и 66 claims, 66/66 proven.
4. Для release-проверки: `./scripts/ldd-release.sh`.
5. Для быстрой проверки: `./scripts/ldd-smoke.sh` и `./scripts/ci-preflight.sh`.
6. Продолжать backlog из §3, начиная с инвентаризации legacy-активов и
@@ -288,16 +294,20 @@ cat build/reports/evidence/index.md
- `docs/08-groups-courses-plan.md` — план и статус.
- `docs/16-stage6-report.md` — итоговый отчёт, deploy и ограничения.
- `docs/evidence/claims.json` — LDD-реестр.
- `docs/evidence/baseline-2026-10-27.md` — фактический baseline.
- `docs/evidence/baseline-2026-10-29.md` — фактический baseline.
- `services/identity-service/.../auth/refresh/` — refresh-токены, absolute,
cleanup.
- `services/identity-service/.../db/migration/V11__refresh_tokens.sql`,
`V12__refresh_absolute.sql`, `V13__audit_keyset_indexes.sql`.
`V12__refresh_absolute.sql`, `V13__audit_keyset_indexes.sql`,
`V14__cohort_constraints.sql`.
- `services/identity-service/.../audit/` — аудит и keyset-курсор.
- `services/academic-service/.../content/` — материалы/активы.
- `services/academic-service/.../course/CourseGroupService.kt` — bulk-группы.
- `services/academic-service/.../lab/LabService.kt` — `details(courseId)`.
- `services/progress-service/.../AcademicClient.kt` — пакетный вызов лаб.
- `services/progress-service/.../SubmissionService.kt` — пакетные сдачи
ведомости; `profile/StudentProfileService.kt` — контракт профиля и лимит
попыток.
- `services/progress-service/.../CourseScopeService.kt` — course-scope.
- `web/.../session/SessionTokenService.kt`, `SessionLifetime.kt`,
`SessionCookieRefreshFilter.kt`.