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:
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user