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:
@@ -13,20 +13,20 @@
|
||||
|
||||
| Область | Статус | Что осталось |
|
||||
|---|---|---|
|
||||
| Роли, группы-когорты, статусы, история | partial | Финальные `NOT NULL`/полная уникальность когорты; группа не восстанавливается из архива; история членства не показана в UI |
|
||||
| Роли, группы-когорты, статусы, история | implemented | Финальные ограничения когорты, возврат из архива и блок истории членства на странице группы |
|
||||
| Академический отпуск | **исправлено** | Вход read-only, сдача/защиты заблокированы на progress-service |
|
||||
| Черновики лабораторных | **исправлено** | Студент не видит черновик в списке/деталях/по UUID |
|
||||
| «Убрать из группы» | **исправлено** | Действие удалено из UI и API; остались перевод/академ/отчисление/архив |
|
||||
| Импорт v2 | partial | Есть флаг восстановления неактивных; row-level отчёт для DB-конфликтов неполный; legacy-группы с NULL-полями |
|
||||
| Импорт v2 | partial | Флаг восстановления и row-level отчёт для CSV/XLSX есть; гонка с параллельной вставкой логина всё ещё даёт общий 409 |
|
||||
| Курсы, преподаватели, группы курса | implemented | — |
|
||||
| Материалы и активы | implemented | Глобальные `STUDENTS`/`TEACHERS` теперь работают; импорт глобальных глав всё ещё создаёт только `ALL` |
|
||||
| Профиль студента | partial | URL уже `courseNo`; часть полей контракта 09 отличается; нет лимита/пагинации попыток; нет SQL-теста «без N+1» |
|
||||
| Профиль студента | implemented | Контракт 09 (`variant/level/updatedBy/name`), лимит попыток и SQL-тест «без N+1» сделаны |
|
||||
| Повышение | partial | Догон при старте ищет только текущий год, не предыдущий; нет теста apply-конфликта |
|
||||
| Аудит | partial | Добавлены `GROUP_CREATE`, `STUDENT_CREATE`, `GROUP_IMPORT`, `GROUP_ENROLL`; отдельных тестов на эти события пока нет |
|
||||
| Аудит | implemented | `GROUP_CREATE/STUDENT_CREATE/GROUP_IMPORT/GROUP_ENROLL/GROUP_ARCHIVE/GROUP_RESTORE` проверены интеграционным тестом |
|
||||
| Backup/deploy | partial | `deploy.sh` теперь проверяет последний backup; restore на staging не подтверждён; первый деплой без backup — документированное исключение |
|
||||
| CI | partial | Конфигурация Woodpecker и локальные прогоны есть; первый реальный pipeline на VM не подтверждён |
|
||||
| Производительность | partial | Keyset-аудит, пакетные лабы и группы курса есть; списки материалов/групп без пагинации; сдачи в ведомости по выбранной лабе |
|
||||
| LDD | implemented | 59 claims (27 P0 / 32 P1), 59/59 proven после release; `check` доказывает P0/unit, runtime P1 — release |
|
||||
| Производительность | partial | Keyset-аудит, пакетные лабы/группы/сдачи, пагинация групп и плоского списка материалов, лимит попыток профиля; остаются visual regression и SLA-нагрузка |
|
||||
| LDD | implemented | 66 claims (27 P0 / 39 P1); `check` доказывает P0/unit, runtime P1 — release |
|
||||
| Legacy-активы | partial | Код и UI готовы; инвентаризация на production/staging не выполнена |
|
||||
| «Контингент» | out of scope | Исключён решением 2026-10-28 |
|
||||
|
||||
@@ -87,15 +87,47 @@
|
||||
- Занятый логин и неактивная целевая группа возвращают `applied=false`
|
||||
с номером строки и не создают частичных записей.
|
||||
- Тесты: `GroupServiceIntegrationTest#import reports occupied login...`,
|
||||
`#import reports inactive target group...`.
|
||||
`#import reports inactive target group...`, XLSX-варианты
|
||||
`#xlsx import reports occupied login before writing()`,
|
||||
`#xlsx import reports inactive target group before writing()`.
|
||||
|
||||
12. **Профиль приведён к контракту 09.**
|
||||
- `variant.id`, `level.id/code`, `grade.updatedBy`, `author.name`.
|
||||
- ФИО автора берётся из identity (fallback — логин).
|
||||
- `submissionLimit` (по умолчанию 50) и `submissionsTotal`; `attemptsCount`
|
||||
остаётся полным.
|
||||
- SQL-тест: 10 лабораторных — не более 15 запросов.
|
||||
- Тесты: `StudentProfileIntegrationTest`, `ProfileDtoJsonTest`,
|
||||
`StudentProfileTemplateTest`, `InternalControllerIntegrationTest`.
|
||||
|
||||
13. **Финальные ограничения когорты.**
|
||||
- `V14__cohort_constraints.sql`: `NOT NULL` для 5 полей, полный unique index,
|
||||
строгие check-констрейнты; legacy-строки блокируют миграцию с явной ошибкой.
|
||||
- `scripts/ldd-migration-upgrade.sh` проверяет `cohort_not_null=5` и
|
||||
`cohort_unique_full=1` на пути master→branch.
|
||||
|
||||
14. **Возврат группы из архива.**
|
||||
- `POST /api/v1/groups/{id}/restore`, кнопка на странице группы, аудит
|
||||
`GROUP_RESTORE`; повторный возврат активной группы — 400.
|
||||
|
||||
15. **Пагинация и пакетные сдачи.**
|
||||
- `GET /api/v1/groups?page=&limit=` и страница `/admin/groups`.
|
||||
- `GET /api/v1/admin/content/articles?offset=&limit=`.
|
||||
- `SubmissionService.latestPerStudentByLab` — один запрос на все лабы
|
||||
ведомости вместо запроса на каждую.
|
||||
|
||||
16. **Аудит ростера.**
|
||||
- Интеграционный тест проверяет шесть событий и актора.
|
||||
|
||||
17. **История членства на странице группы.**
|
||||
- `GET /api/v1/groups/{id}/history` отдаёт студента, действие,
|
||||
откуда/куда и причину; шаблон показывает последние 200 событий в МСК.
|
||||
- Тесты: `GroupServiceIntegrationTest`, `AdminStage4TemplateTest`.
|
||||
|
||||
## 3. Остаточные отличия от цели
|
||||
|
||||
### P1
|
||||
|
||||
- **Профиль: поля контракта.** URL уже используют `courseNo`, но часть полей
|
||||
`variant/level/grade` и авторы комментариев отличаются от docs/09; нужен
|
||||
либо код к контракту, либо официальное обновление контракта.
|
||||
- **Backup restore на staging** не подтверждён артефактом/логом.
|
||||
- **Первый реальный CI pipeline** на Woodpecker VM не подтверждён.
|
||||
|
||||
@@ -109,17 +141,10 @@
|
||||
|
||||
### P2
|
||||
|
||||
- **Импорт: гонка и XLSX-отчёт.** Preflight закрывает известные конфликты,
|
||||
но гонка с параллельной вставкой логина всё ещё даёт общий 409; XLSX-строки
|
||||
новых preflight-тестов не покрыты (CSV покрыт).
|
||||
- Когорта: поля всё ещё nullable, уникальность частичная; нужен preflight и
|
||||
финальный `SET NOT NULL`/полный unique index после ручного разбора legacy.
|
||||
- Нет восстановления группы из архива (сейчас архив односторонний).
|
||||
- Нет пагинации списков материалов и групп (аудит и профиль уже лучше).
|
||||
- Попытки сдачи в профиле не ограничены/не пагинированы.
|
||||
- Сдачи в ведомости запрашиваются по выбранной лабораторной, а не пакетно.
|
||||
- Нет визуальной регрессии и полного мобильного набора E2E.
|
||||
- Нет тестов на audit-события `GROUP_CREATE/STUDENT_CREATE/GROUP_IMPORT/GROUP_ENROLL`.
|
||||
- **Импорт: гонка.** Preflight закрывает известные конфликты, но гонка с
|
||||
параллельной вставкой логина всё ещё даёт общий 409 вместо строки отчёта.
|
||||
- **Визуальная регрессия.** Playwright проверяет сценарии и мобильный viewport,
|
||||
но screenshot-diff нет.
|
||||
- Mutation testing не 100%, нагрузочный smoke не SLA.
|
||||
|
||||
### Операционные
|
||||
@@ -142,16 +167,19 @@
|
||||
|
||||
## 5. LDD
|
||||
|
||||
- Реестр: `docs/evidence/claims.json`, **59 claims** (27 P0 / 32 P1).
|
||||
- Реестр: `docs/evidence/claims.json`, **66 claims** (27 P0 / 39 P1).
|
||||
- `./gradlew test ktlintCheck detekt evidenceCheck` — зелёный; P0 gaps = 0.
|
||||
- `./scripts/ldd-release.sh` — PASS: **59/59 claims**, 385 тестов, mutation
|
||||
- `./scripts/ldd-release.sh` — PASS: **66/66 claims**, 398 тестов, mutation
|
||||
`CourseAccessService` 75%, `PromotionPlanner` 69%, browser E2E 18/18,
|
||||
runtime/load p95 < 1 с.
|
||||
|
||||
## 6. Следующий порядок работ
|
||||
|
||||
1. Закрыть P1: row-level ошибки импорта, догон повышения, контракт профиля,
|
||||
staging restore, первый CI pipeline.
|
||||
2. Закрыть P2: финальная миграция когорты, unarchive, пагинация, audit-тесты,
|
||||
визуальная регрессия.
|
||||
3. Прогнать полный release и обновить `evidence/baseline-*`.
|
||||
1. Остались операционные P1: restore на staging и первый реальный
|
||||
Woodpecker pipeline.
|
||||
2. P2: гонка импорта, визуальная регрессия, повышение mutation-покрытия
|
||||
и SLA-нагрузка.
|
||||
3. Перед production: ручной разбор legacy-когорт по SQL из `deploy/DEPLOY.md`,
|
||||
затем backup и деплой.
|
||||
4. После каждого изменения прогонять `./scripts/ldd-release.sh` и обновлять
|
||||
`docs/evidence/baseline-2026-10-29.md`.
|
||||
|
||||
Reference in New Issue
Block a user