From 559ea715d398bd9290b3aadd0565a061e4e3fb99 Mon Sep 17 00:00:00 2001 From: Fedor Date: Tue, 3 Nov 2026 05:20:25 +0300 Subject: [PATCH 1/2] docs: record live backend fixes and PR517 acceptance checkpoint --- .../integration-517/CODE_REVIEW.md | 20 +- .../integration-517/MATRIX.csv | 12 +- .../integration-517/README.md | 40 +- .../integration-517/results.json | 395 +++++++++++------- 4 files changed, 291 insertions(+), 176 deletions(-) diff --git a/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md b/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md index ad745c359..609737670 100644 --- a/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md +++ b/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md @@ -6,7 +6,7 @@ Последний source/runtime `ffe677f5cefb4f2412f4b513954269ee1d846a10`:5 CSS-строк убирают разрывы слов в мобильных итогах оценивания и горизонтальную полосу tooltip. Обе версии 360px, нижняя подсказка 390px, Enter/Escape/outside проверены.13 существующих tests/2files, scoped stylelint/Prettier и штатный prod build PASS. Ранее 68/3 и 12/2 (5 пересекаются) не суммируются. -Браузер восстановлен, draft25/приглашение 37/вступление завершены обычными интерфейсами; flag49=false. Итоговый вердикт NOT READY обусловлен серверными R9/R11 и явно ограниченными NOT TESTED, а не прежней остановкой браузера. +Draft25/приглашение37/вступление завершены обычными интерфейсами; flag49=false. R9/R11 теперь CLOSED: backend PR854 смержен и опубликован, повтор на текущем dev912dedc пройден. Текущая приемка IN PROGRESS:65 PASS/7 NOT TESTED/0 FAIL; новые письма, выдача и прямые отрицательные записи ожидают отдельного согласия, свежий сброс — ручного ввода. ### R8 — отправитель Project invitation, исправлен @@ -14,19 +14,15 @@ Пройдены 15 существующих тестов InviteRepository/GetMyInvites/AcceptInvite, ESLint, Prettier и обычный prod build с прежними budgets. Реальный reload pending 126 показал sender84; затем обычное принятие POST 200 и команда 403 из 84/59. Повторного письма ради ретеста не было. -### R9 — P2, OPEN: дубль капитана в backend XLSX draft +### R9 — P2, CLOSED: дубль капитана в backend XLSX draft -Повтор на реальном draft25 после вступления 341: UI2 участника, workbook Решения teamSize2, Команды 3 строки с userIds84/84/341. Ранее 21/84 давал две строки при размере 1. Frontend сохраняет готовый Blob, строк не создает. +До исправления реальный draft25 давал teamSize2, но строки команды84/84/341. Backend PR854 исключает капитана из membership-компрехеншена, сохраняя submitted snapshot. Реальные workbook после deploy32d1f92 и повтор после912dedc:84/341, размер2, обе роли сохранены. Регрессия открывает настоящий XLSX, проверяет строки и состав; это дополнение к исторической pure-method проверке, а не замена Django/DB тестов. -Доступный backend `SolutionAnalyticsContext.team()` явно добавляет капитана, затем все `solution.members.all()`, где captain уже существует. `solution_program_report.write_solutions()` считает размер через множество ID, но пишет все строки команды. Три релевантных файла совпадают с ранее сообщенным dev image cf48cd7; свежий image этого цикла не запрашивался. Доступный backend checkout не изменялся. +### R11 — P1, CLOSED: аудитория сертификатов Solution -Приватный `R9-backend-proposed.patch` добавляет исключение captain из membership-компрехеншена. Pure Python method regression на настоящем извлеченном методе: до 84/84/341, после 84/341; роль участника, отсутствие membership капитана и submitted snapshot сохраняются. Это не Django/DB suite и не исправление dev. Нужны отдельное backend изменение и реальный повтор. +Backend PR854 добавляет в общий `recipients()` состав snapshot сданных активных Solution и фильтр регистрации. Счетчик и инициализация batch используют один service; legacy Project ветка сохранена. Регрессии проверяют API counts, actual batch recipient rows, snapshot/live drift, draft/archive/чужую программу и dedup. Вместе с R9 и смежными сценариями прошел81 Django/PostgreSQL тест; полные PostgreSQL/SQLite CI прошли. На реальном49 GET200 после32d1f92 и912dedc дает all5/submitted3 вместо0. Выдача49 не запускалась. -### R11 — P1, OPEN: аудитория сертификатов игнорирует Solution - -На ffe6 реальный GET49/management/certificates/200 вернул eligible_counts all5/submitted0 и draft.audience=submitted. В 49 сданы Solution7/19/20, но UI показывает 0 получателей. Выдача/отправка не запускались. - -Backend `services/certificates.py:recipients()` фильтрует участников через submitted PartnerProgramProject и Project Collaborator, без ветки Solution. Клиент отображает серверный счетчик. Нужен серверный расчет по сданным Solution с проверкой состава/snapshot и admin-интерфейса по backend AGENTS; подмена числа только в клиенте не исправляет аудиторию. Принадлежность R9/R11 к изменениям frontend PR не установлена. +Сопутствующий PR855 добавляет только preview-first dev QA-operation и ее тесты: четыре закрытые программы79–82,23 Solution,4 Project,18 synthetic `.invalid` аккаунтов без пригодных паролей. Creation flags закрываются в той же транзакции; hash-проверка43 моделей подтверждает неизменность прежних строк. Три локальных PostgreSQL теста и полный CI PASS; текущий backend dev912dedc успешно опубликован. ### Серверные отрицательные сценарии @@ -70,7 +66,9 @@ R2–R6 и реальные R1/assignment/version/grade conflicts описаны Иных конкретно воспроизведенных actionable findings в изменениях PR не найдено. Это ограниченный результат review: нельзя утверждать отсутствие серверных проблем или полную неизменность поведения по одним unit-тестам. Локальный checkout API не содержит весь актуальный Solution-management контур deployed dev; его старые Application/Submission-модели не использованы вместо C00 и реального dev. Backend не изменялся. -## Verification и ограничения +## Исторические проверки облачного этапа и ограничения + +Этот подраздел сохраняет результат облачного этапа до авторизованных desktop E2E. Актуальные результаты и оставшиеся ограничения приведены выше и в README/MATRIX. - Checked by source: перечисленные цепочки, base/head diff, handlers, ID, payload, cancellation и revision. Новая product-правка — только guard неизмененного фильтра V2. - Checked by tests: 75 passed в шести релевантных файлах, включая четыре добавленных сценария. V1 41, V2 14, allocation 4, export 2, progress 9, Solution analytics 5. Это unit-тесты с doubles, не интеграция dev. Полный 3089-набор предыдущего этапа повторно не запускался. diff --git a/docs/program-v2-ui-audit/integration-517/MATRIX.csv b/docs/program-v2-ui-audit/integration-517/MATRIX.csv index a58c06c20..14446747c 100644 --- a/docs/program-v2-ui-audit/integration-517/MATRIX.csv +++ b/docs/program-v2-ui-audit/integration-517/MATRIX.csv @@ -4,21 +4,21 @@ P02,Публичный режим программы,V1 №39,legacy_project,П P03,Публичный режим программ,V2 №49/50/51,solution,Повтор на d378a0f3: browser GET /programs/49/50/51/ 200; solution,PASS,—,d378a0f38c5542d6c005cb0be98cd00c8c66a58f P04,Анонимный доступ к управлению,V1 №39,"401, закрытые данные не выдаются",d378a0f3: реальные anonymous browser GET management и experts 401; локальный management route переводит на обычный вход,PASS,—,d378a0f38c5542d6c005cb0be98cd00c8c66a58f P05,Анонимный доступ к управлению,V2 №49,"401, закрытые данные не выдаются",d378a0f3: реальные anonymous browser GET management и experts 401; локальный management route переводит на обычный вход,PASS,—,d378a0f38c5542d6c005cb0be98cd00c8c66a58f -S11,"Настройки: чтение, сохранение всех разделов и повторное чтение",V1 №39,Сохраняются разрешенные изменения; reload возвращает серверное значение,"0152e19c: все 7 разделов прочитаны; описание и конец+1 мин сохранены/reload/возвращены; материал create/edit/delete; optional Project field и draft анкеты сохранены/reload/удалены с возвратом. Критерии уже зафиксированы оценками; организаторы проверены чтением/поиском, их доступ не изменялся frontend. Полная запись всех 7 разделов не заявлена",NOT TESTED,—, +S11,"Настройки: чтение, сохранение всех разделов и повторное чтение",V1 №39 / закрытая QA №79,Сохраняются разрешенные изменения; reload возвращает серверное значение,"В №39 выполнены save/reload/restore основного, сроков, материалов, optional Project field и draft анкеты. На том же продуктном коде в новой QA79 дополнены недостающие записи: описание числового критерия PUT200/reload/возврат200; пустое описание нормализуется null -> пустая строка, остальные значения сохранены. Дополнительная QA-роль11 снята только из79, fresh GET200/reload подтверждает одного организатора28. Первый наблюденный POST79 был401 перед штатным refresh/retry; финальный статус мутации не захвачен, результат подтвержден свежим серверным чтением. Исходные роли39 не менялись.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 S21,"Приглашение, принятие, повтор и отзыв эксперта",V1 №39,Тестовый invitation lifecycle и кейсы сохраняются,"Два тестовых приглашения созданы ранее; неактивное отозвано. На 1054ed6c user 59 принял свое приглашение 39 через подтверждение, POST 200; после reload pending исчез. Повторная отправка еще не выполнялась: первоначальный лимит 4 писем уже использован",NOT TESTED,—, S31,"Поиск, фильтры, массовый выбор и смена страницы",V1 №39,"Draft/отмена; весь фильтр; no-op сохраняет выбор, изменение сбрасывает",8d36: выбраны 64 на странице 1 и 95 на странице 2; no-op фильтр сохраняет 2 и страницу 21–27. Выбор всего фильтра дает 27; смена статуса на joined очищает выбор и дает страницу 1–20 из 26. Реальные XLSX:27 со страницы 2 и 26 по фильтру; поиск/no-results проверены ранее на 1d403fe0.,PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S41,"Назначение, снятие и защита сохраненной оценки",V1 №39,Только выбранные работы; сохраненная оценка защищена; reload подтверждает состав,"8d36: POST project-experts только project_ids403/expert_ids64, затем 404/[64,95], оба 200. Неоцененное 95->404 снято и возвращено 200, промежуточное чтение подтверждает. Старый редактор 403 после оценки отправил expert_ids[] и получил 409; свежий редактор 64 checked/disabled, оценка после reload сохранена.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S51,Оценивание и пересчет результатов,V1 №39,Принятые оценки и quota дают результат по правилу программы,"8d36:403/64 сохранены 0,0,0/Нет/comment POST 201;404/64 сумма 10/Нет и 404/95 сумма 20/Да POST 201x2, reload. При quota 3 результат 404 предварительно 15; quota 2 дает ready 15 и место 6, ready всей программы 20->25. Возврат 3: preview 25->20, PUT 200 и reload3. Исходные оценки не изменялись.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S61,"Аналитика, все/completed/pending и выгрузки",V1 №39,Счетчики и файлы совпадают с данными/фильтром всех страниц,"8d36: аналитика 123 участников/62 проекта/50 сдано, assignments75 completed+48 pending=123. Списки содержат 75/48/123 строк; детализация 403 показывает 0/Нет/comment. XLSX результатов filtered2/all 50, оценки 3/all 123; эксперты 27/26. Полный analytics XLSX: участники 123, проекты 62, эксперты 26, назначения 123; исходные данные не публикуются. Excel runtime recalculation не запускался.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S71,"Работа с Project либо Solution, составом и snapshot",V1 №39,V1 сохраняет Project; V2 самостоятельное Solution и права команды,"8d36:403 создан капитаном 84 через program39 CTA POST 201, link 205; обязательные main/additional поля save/reload, основной save сохраняет кейс.404 создан штатно глобально, новый link 206 и profile337->404 подготовлены через разрешенную Django admin как fixture. Обе работы сданы UI PUT 200;126 принят POST 200, команда 403=[84,59]. Старое исключение 59 после сдачи DELETE 409, свежий просмотр сохраняет обоих. Project остается V1.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 -S12,"Настройки: чтение, сохранение всех разделов и повторное чтение",V2 №49,Сохраняются разрешенные изменения; reload возвращает серверное значение,0152e19c: описание/material/form/draft анкеты round trips и восстановление выполнены. Календарь исправлен после 409/reopen confirmation и оставлен по отдельному разрешению; числовой 0-10 и boolean критерии добавлены. Организаторы проверены чтением/поиском; полная запись всех 7 разделов не заявлена,NOT TESTED,—, +S12,"Настройки: чтение, сохранение всех разделов и повторное чтение",V2 №49 / закрытая QA №80,Сохраняются разрешенные изменения; reload возвращает серверное значение,"В №49 выполнены save/reload/restore основного, материалов, optional Solution field и draft анкеты; календарь сохранен по отдельному разрешению, числовой и boolean критерии добавлены до первой оценки. Недостающие записи выполнены в новой QA80: описание числового критерия PUT200/reload/возврат200; пустое описание нормализуется null -> пустая строка. Дополнительная QA-роль11 снята POST200/reload: остался организатор28. Исходные роли49 не менялись. Таким образом записи всех7 разделов проверены в обеих версиях, на изолированных данных там, где исходные критерии уже зафиксированы.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 S22,"Приглашение, принятие, повтор и отзыв эксперта",V2 №49,Тестовый invitation lifecycle и кейсы сохраняются,"На 1054ed6c user 59 принял приглашение 49, POST 200; organizer roster показывает joined и только Город. ExpertId95 отличается от userId59/invitationId7. Неактивное приглашение 6 ранее отозвано. Повтор еще не проверен",NOT TESTED,—, -S32,"Поиск, фильтры, массовый выбор и смена страницы",V2 №49,"Draft/отмена; весь фильтр; no-op сохраняет выбор, изменение сбрасывает","b6ab: live R1 — реальное изменение кейса сбрасывает выбор; no-op сохраняет 19; POST solution_ids[19]/expert_ids[64,95],20 не входит; cancel без записей.8d36 фильтр not_submitted показывает только 21, экспорт содержит только 21. Серверной второй страницы V2 нет: в 49 всего 4 работы; это ограничение данных, а не PASS пагинации.",NOT TESTED,R1 исправлен и live retest пройден,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313 +S32,"Поиск, фильтры, массовый выбор и смена страницы",V2 №49 / закрытая QA №80,"Draft/отмена; весь фильтр; no-op сохраняет выбор, изменение сбрасывает","Исторический R1 в49: no-op сохраняет выбор19; реальная смена кейса сбрасывает; preview содержит только solution_ids[19],20 исключено. На опубликованном dev backend912dedc и том же frontend product tree в новой QA80 создан21 Solution: серверные страницы20+1 (offset20, последняя46). Выбор всего фильтра содержит все26–46 и сохраняется на странице2 и после no-op фильтра. Смена кейса на Образование оставляет только46, сбрасывает выбор и offset. Excel, полученный со страницы2, содержит все21 Solution26–46, независимо от страницы.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 S42,"Назначение, снятие и защита сохраненной оценки",V2 №49,Только выбранные работы; сохраненная оценка защищена; reload подтверждает состав,"b6ab5864: назначение 64->19 PUT 200; старый allocation/apply POST 409; новый preview добавляет 1 и reload19=[64,95],20=0,7=0. Неоцененное 95->19 снято PUT[]200, reload и возвращено PUT[19]200. Гонка снятия 64 после оценки: PUT[]409, после refresh19 checked/disabled, оценка сохранена. Дополнительно 64->20 PUT[19,20]200 сохраняет защищенное 19",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb S52,Оценивание и пересчет результатов,V2 №49,Принятые оценки и quota дают результат по правилу программы,"b6ab5864:19/64 POST 200 с 0/Нет/комментарием +reload;19/95 POST 200 с 6/Да +reload. Результат: предварительно 0 при 1/2 ->3 при 2/2; изменение 64 до 2 ->4. У 20 одна оценка 4; quota 2 дает partial, восстановление 1 дает ready. Оба решения имеют место 1/балл 4; все 3 оценки сохранены",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb S62,"Аналитика, все/completed/pending и выгрузки",V2 №49,Счетчики и файлы совпадают с данными/фильтром всех страниц,"b6ab: quota 2/1 и 3 сохраненные оценки сверены.8d36: после 21 Education сдано 4/оценено 2; временное 64->21 дает 3 completed+1 pending=4,75%. Модальные списки 3/1/4 и 14 листов полного analytics XLSX совпадают: 4 решения/4 assignments/9 строк критериев оценок. Временное 21 снято PUT[19,20]200, защищенные 19/20 сохранены. Дефект draft team XLSX вынесен X14.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S72,"Работа с Project либо Solution, составом и snapshot",V2 №49,V1 сохраняет Project; V2 самостоятельное Solution и права команды,"Ранее 19/20: штатное создание, 0/Нет, сдача и frozen snapshot. На1e2f создан новый draft25 капитаном84, PATCH200/reload0/false. Одно разрешенное приглашение37 получателю341: POST201 и обычное принятие POST200. Reload обоих аккаунтов:84+341, роль PR517 QA участник, pending0. Наffe6 участнику can_edit/manage_team/invite/submit=false; can_leave=true. Draft25 не сдан ради воспроизведения R9.",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 1e2fb68d361896aba1a632f759568d4dac70e164; ffe677f5cefb4f2412f4b513954269ee1d846a10 -N01,Конфликт изменений формы/решения,V1/V2,Revision-конфликт без перезаписи чужого изменения; нет auto-retry записи,"0152: форма Solution B200/A409, refetch сохраняет локальный A и сервер B без auto-write. b6ab: само решение 19 B PATCH 200/A PATCH 409; после сдачи staleA409. Конкурирующие записи формы Project V1 не выполнялись; защита сданной команды V1 отдельно N16.",NOT TESTED,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb +N01,Конфликт изменений формы/решения,V1/V2,Revision-конфликт без перезаписи чужого изменения; нет auto-retry записи,"V2: форма B200/A409; refetch сохраняет локальный A и новый B без auto-write. Данные19 B PATCH200/A PATCH409; после сдачи staleA409. Дополнен V1: две вкладки формы39, B optional field PUT200, A stale PUT409/code stale_project_form с русским сообщением; локальный A сохранен. Новое поле B удалено PUT200, reload подтвердил точное совпадение исходных fields/cases. A отменен через подтверждение выхода без сохранения. Существующие ответы не менялись.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 32d1f92b1021f2021afce7f32f2582c9817f97c9 N02,Устаревший allocation/назначение и гонка с оценкой,V1/V2,Старый план отклонен; актуальная оценка не удаляется,b6ab: V2 старый allocation/apply POST 409 после B manual assignment; новый preview сохраняет назначение. V2 grade/removal race409.8d36 V1 grade/removal race POST 403/[]409 и свежая защита checked/disabled. Автоматический apply V1 не выполнялся: штатный preview относится ко всей программе и включал прежние работы; разрешение охватывает назначения новых работ.,NOT TESTED,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313 N03,"Другой кейс, своя команда, shortage и quota",V1/V2,Недопустимые назначения не появляются; shortage блокирует confirm,"b6ab V2 собственная команда 95/20: preview added0/shortage 2.8d36 V2 другой кейс 95/21: POST 200 added0/shortage 1, confirm disabled. V1 транспортный pool=[95] в реальном POST preview:403 сохраняет только 64, shortage 2;404 сохраняет 64/95, shortage 1; confirm disabled, общий preview отменен. Квоты 39 и 49 возвращены 3/1; сохраненные оценки не удалялись.",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313 N04,Роли и чужие объекты,V1/V2,Авторизованные участник/эксперт не получают organizer права; object scope сохраняется,"Анонимные management401 на d378; эксперт 59 management39/49=403 на 1054; pure participant 84 management39/49=403 на b6ab.8d36 чужое Solution 19 у 84 GET 404 и русское Заявка не найдена, без save. Собственная V1-команда 403 у эксперта 95 недоступна для оценки в UI; V2 own20 GET 200 read-only. Прямой forbidden grade POST не отправляли, серверный write guard чужого объекта не заявлен. Финальный pure member341 наffe6: management49 GET403, чужое19 GET404, собственное25 GET200 с readonly permissions. Прямые forbidden grade writes не выполнялись.",NOT TESTED,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313 @@ -64,10 +64,10 @@ N17,Серверный preview другого кейса,V2 №49 / Solution 21, A07,Чужая заявка у обычного участника,V2 №49 / participant 84,Данные чужого решения не выдаются,Штатный detail route19 в отдельной странице обычного 84: GET /programs/49/solutions/19/ HTTP 404; Заявка не найдена / Решение или программа не найдены.; save control отсутствует. Сессия без роли эксперта/организатора; ответы и права не подменялись.,PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 X12,Все страницы и фильтр реального V1 Excel,V1 №39,Экспорт не ограничен видимой страницей и сохраняет числа/формулы,"Со страницы 2 экспертов выгружено 27 строк, joined-фильтр дает 26. Поиск результатов prefix дает 2 рейтинга/3 оценки; Вся программа при активном поиске дает 50/123. Новый 404 имеет входы 0/8/2 и 4/10/6, суммы 10/20, AVERAGEIF/ROUND дают 15;403 нули/Нет. fullCalcOnLoad=1, пересчет Excel runtime не выполнялся.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 X13,Непустой pending и полный analytics Excel,V2 №49,3 выполненных и 1 pending совпадают со списками и файлом,"Временное назначение 64->21 apply POST 200 дает 75%/3 из 4. Модальные completed/pending/all содержат 3/1/4 строк; pending — только 21/64. XLSX14 листов: решения 7/19/20/21, назначения 11/13/14/15, grades9 строк без оценок 21. После экспорта 21 снято PUT 200, оставлены 19/20.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 -X14,Уникальность участников команды в XLSX черновика,V2 №49 / draft 21,У команды из одного капитана одна строка участника,"Повтор на draft25/team84+341: серверный Excel содержит1 решение с teamSize2, но3 строки команды с userIds84/84/341. Дубль капитана ранее подтвержден на21. В доступном backend source team() добавляет капитана, затем все membership rows, включая его. Подготовлен отдельный минимальный patch и pure-method regression: до84/84/341, после84/341; роль и submitted snapshot сохраняются. Backend checkout/dev не менялись, Django/DB и dev retest patch не выполнены.",FAIL,R9 OPEN: backend draft team XLSX,8d36f4a833b9c664bea52c4806afe3484620f313; 1e2fb68d361896aba1a632f759568d4dac70e164 +X14,Уникальность участников команды в XLSX черновика,V2 №49 / draft25,Капитан и участники имеют по одной строке; размер команды соответствует уникальному составу,"R9 исправлен backend PR854: draft team исключает повтор капитана из membership, submitted snapshot не меняется. Реальные XLSX до/после на25: teamSize2; было userIds84/84/341, стало84/341. Роли Капитан и PR517 QA участник сохранены. Повторено после dev deploy912dedc: одна заявка25, две строки команды84/341, размер2. Настоящий Django/PostgreSQL regression и81 релевантный тест прошли; frontend готовые строки workbook не переписывает.",PASS,"R9 CLOSED: api PR854, live retest PASS",frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 V02,"Аналитика: подписи, даты, подсказки и экспорт",V2 №49,Стиль доведенного V1; клавиатура и меню работают,"9c92: Mont16/22, export32x32, даты12/18 и статусы11/16; desktop top/middle/bottom, Enter/Escape/outside и focus. На1e2f повтор V1/V2 desktop/390/360 и нижние блоки. Наffe6 проверены исправленные мобильные итоги, нижняя подсказка Enter/Escape/outside; прежний overflow scrollbar отсутствует.",PASS,R10 исправлен,9c92cd7fa274477575163ec0443205d47d51b591; 1e2fb68d361896aba1a632f759568d4dac70e164; ffe677f5cefb4f2412f4b513954269ee1d846a10 V03,Повтор отступов кнопки добавления поля,V2 №49,Внутренние отступы соответствуют общему compact-action,"Реальный повтор1e2f: Добавить поле134.675x32, padding5px20px, Mont12. Форма V1/V2 и footer/preview на390px; редактор Solution на360/390px помещается в окно. Записей настроек при визуальном повторе нет.",PASS,R10 исправлен,1e2fb68d361896aba1a632f759568d4dac70e164 V04,Таблица заполнения формы и слот фильтра,V2 №49,Общая адаптивная таблица и отступы Project,"На1e2f реальная таблица Материалы решений:4 из4 по каждому полю, включая0/Нет; общие responsive cards на390/360px. Нажатие Число для проверки открыло missing-answer диалог с0 строк, что совпадает со счетчиком. Наffe6 фильтр/выбор заявок используют общий toolbar-slot; desktop/mobile и белая панель сверены с Project.",PASS,R10 исправлен,1e2fb68d361896aba1a632f759568d4dac70e164; ffe677f5cefb4f2412f4b513954269ee1d846a10 T21,Разрешенное архивирование только тестовой21,V2 №49,Preview и apply затрагивают только указанную новую работу,"9c92: отдельное согласие; preview0 оценок/назначений/ожидающих приглашений; archive/apply POST200,21 исчезла из активной таблицы. Последующие создание25 и вступление37 проверены отдельно в S72. Архивные материалы повторно не читались.",PASS,—,9c92cd7fa274477575163ec0443205d47d51b591 V05,Мобильные итоги оценивания и нижняя подсказка,V1 №39 / V2 №49,"Слова читаются целиком; подсказка без горизонтальной полосы, клавиатура работает","До: слово Выполнено переносилось внутри слова, label36px; мобильная подсказка показывала горизонтальную полосу от стрелки. ffe6: итоги в одну колонку на<=420px, label18px на360px в обеих версиях; overflow-x:hidden убирает полосу подсказки. Enter/Escape/outside подтверждены живым UI.13 существующих tests/2files, stylelint/format и штатная prod build PASS.",PASS,R10: дополнительные мобильные исправления,ffe677f5cefb4f2412f4b513954269ee1d846a10 -X15,Аудитория сертификатов сданных Solution,V2 №49,Сдавшие Solution7/19/20 включены; у draft25 участники не включены,"Реальный GET /programs/49/management/certificates/200: eligible_counts={all:5,submitted:0}, draft.audience=submitted. UI показывает0 при3 сданных Solution. Backend recipients() фильтрует только PartnerProgramProject и Project Collaborator; Solution не учитываются. Только чтение: выдача и отправка не запускались.",FAIL,R11 OPEN: backend recipients certificates ignore Solution,ffe677f5cefb4f2412f4b513954269ee1d846a10 +X15,Аудитория сертификатов сданных Solution,V2 №49,Сдавшие Solution7/19/20 включены; у draft25 участники не включены,"R11 исправлен backend PR854: аудитория submitted для Solution использует snapshot команды сданных активных решений и существующую регистрацию. Общий service применяется к счетчику и реальной инициализации batch, legacy Project сохранен. GET49/management/certificates/200 после32d1f92 и повтор после912dedc: all5/submitted3 вместо прежнего0; draft25 исключен. Regression покрывает snapshot/live drift, draft/archive, другую программу, отсутствие legacy fallback, dedup и actual batch recipients. Выдача на49 не запускалась.",PASS,"R11 CLOSED: api PR854, live retest PASS",frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 diff --git a/docs/program-v2-ui-audit/integration-517/README.md b/docs/program-v2-ui-audit/integration-517/README.md index 904407812..016e1965b 100644 --- a/docs/program-v2-ui-audit/integration-517/README.md +++ b/docs/program-v2-ui-audit/integration-517/README.md @@ -2,7 +2,7 @@ # Интеграционная приемка PR #517 -Вердикт на 03.11.2026: **NOT READY**. Подтверждены два серверных дефекта R9/R11. Сверка интерфейса завершена в описанной ниже области; матрица содержит **59 PASS / 11 NOT TESTED / 2 FAIL**. Merge и deploy не выполнялись. +Промежуточный итог на 03.11.2026: **IN PROGRESS**. Серверные R9/R11 исправлены, смержены в dev и повторно проверены. Матрица: **65 PASS / 7 NOT TESTED / 0 FAIL**. PR #517 уже смержен и опубликован на dev по новому разрешению пользователя; полная приемка еще не объявлена завершенной. Последний проверенный продуктный commit и видимый runtime: `ffe677f5cefb4f2412f4b513954269ee1d846a10`. Предыдущий runtime `1e2fb68d361896aba1a632f759568d4dac70e164` использовался для создания 25, приглашения 37 и первого повтора экспорта. У исторических сценариев сохранены исходные SHA в [MATRIX.csv](MATRIX.csv); результаты старых проверок не переименованы в проверки последнего кода. Машиночитаемые сведения — [results.json](results.json). @@ -12,6 +12,16 @@ №39 — legacy_project; №49 — solution/competitive; №50 — solution/hackathon; №51 — solution/noncompetitive. №50/51 проверены чтением; их данные не менялись. Исторические облачные проверки и mocks отделены от реальных dev E2E. +## Закрытие backend R9/R11 и дополнительные проверки + +Backend [PR #854](https://github.com/PROCOLLAB-github/api/pull/854) смержен как `32d1f92b1021f2021afce7f32f2582c9817f97c9`; [dev deploy](https://github.com/PROCOLLAB-github/api/actions/runs/41555751215) прошел. В production-логике изменены 13 строк: устранен дубль капитана в draft XLSX и добавлен snapshot-состав сданных Solution в общий расчет аудитории сертификатов. Legacy Project сохраняет прежнюю ветку. Прошли 81 релевантный Django/PostgreSQL тест и полные PostgreSQL/SQLite CI, Docker и lint. + +После [PR #855](https://github.com/PROCOLLAB-github/api/pull/855) текущий backend dev — `912dedc439412279bf57aca6d47dd63f67eb40f2`, [deploy успешен](https://github.com/PROCOLLAB-github/api/actions/runs/41561994284). На нем повторены реальные R9/R11: draft25 дает строки команды84/341 и размер2; GET сертификатов49 дает all5/submitted3. Выдача на49 не запускалась. Служебная QA-операция по умолчанию только показывает preview; ее три PostgreSQL теста и полный CI прошли. Фактическое создание четырех закрытых программ79–82 подтвердило неизменность прежних строк43 моделей, не отправило писем и оставило creation flags=false. + +Дополнительно закрыты: V1 form concurrency B200/A409 с точным восстановлением fields/cases; V2 пагинация20+1, выбор всех21 и no-op; Excel со страницы2 со всеми21 Solution; запись/reload критериев и организаторов в новых QA79/80. С прежними round trips это покрывает запись всех7 разделов настроек обеих версий. + +Frontend [PR #517](https://github.com/PROCOLLAB-github/procollab/pull/517) смержен как `6d0c691917293fb16372a4be02e49dbdb7ac75ac`. Первый deploy остановился на форматировании9 документных файлов. [PR #518](https://github.com/PROCOLLAB-github/procollab/pull/518) исправляет только их форматирование; итоговый dev `8337094716c1886f54cad440b572f8b2957bda6f`, [полный CI и deploy PASS](https://github.com/PROCOLLAB-github/procollab/actions/runs/41558542023). Дерево product-файлов совпадает с проверенным frontend `ffe677f5cefb4f2412f4b513954269ee1d846a10`. Исторические проверки ниже сохраняют свои исходные SHA; это не повтор всех сценариев на новом backend. + ## Реальные функциональные результаты - R1: no-op фильтра сохраняет выбранное 19, реальная смена кейса сбрасывает выбор. Server preview передал только solution_ids[19], expert_ids[64,95];20 исключено. Отмена не создала назначений. @@ -35,25 +45,25 @@ Проверенные 403/404/409 и календарные ошибки русские. R2 реальным unknown-account400 получил английский ответ сервера и русский fallback в UI. R3/R4 разделяют ошибку ссылки восстановления и логина; первоначальная причина отказа reset-confirm Play station не установлена. Пользователь позже входил обычным способом. R5 исправляет подсказку draft, R6 согласует comment1000, R7 скрывает неприменимые аналитические этапы/метрики 51, R8 показывает sender Project invitation. Пользовательские данные и справочники не переписывались. Это не утверждение о каждом возможном сообщении всей платформы. -## Открытые серверные дефекты +## Исправленные серверные дефекты -| Дефект | Реальное доказательство | Что требуется | -| ------- | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| R9, P2 | Draft25: команда 84/341, teamSize2, но лист Команды содержит 84/84/341. Ранее то же на 21 с одним капитаном. | Backend team() добавляет капитана отдельно и повторяет membership. Подготовлен приватный минимальный patch; pure-method проверка до/после подтверждена. Backend не изменен, Django/DB и dev retest patch не выполнены. | -| R11, P1 | GET49/management/certificates/200: eligible_counts all5/submitted0, хотя 7/19/20 сданы. UI аудитории показывает 0. | Backend recipients() учитывает только Project links/Collaborator. Нужен расчет по участникам сданных Solution. Выдача/рассылка не запускались. | +| Дефект | До исправления | Реальный повтор после исправления | +| --------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| R9, P2, CLOSED | Draft25: teamSize2, строки84/84/341. | Backend854: капитан исключен из повторного membership. После текущего deploy912dedc: строки84/341, размер2, роли сохранены. Submitted snapshot не меняется. | +| R11, P1, CLOSED | Аудитория49 all5/submitted0 при сданных Solution7/19/20. | Общий recipients service использует snapshot команд активных сданных Solution и регистрацию. GET200 после32d1f92 и912dedc: all5/submitted3; draft25 исключен. Регрессии проверяют actual batch rows и legacy Project. | -Frontend сохраняет серверный workbook как Blob и отображает серверную аудиторию; исправления этих значений в клиенте не применялись. Доступные backend-файлы совпадают с ранее сообщенным dev image cf48cd7, но свежая версия контейнера в этом цикле не запрашивалась. Принадлежность R9/R11 к изменениям frontend PR не установлена. +Frontend сохраняет серверный workbook и отображает серверную аудиторию; эти значения в клиенте не подменяются. Принадлежность исходных R9/R11 к изменениям frontend PR не установлена. ## Проверки кода -Исторические наборы: R1—75/6 файлов, R2—183/13, R3/R4—235/22, R5/R6—14/3, R7—30/2 (2 падения до исправления), R8—15/3. Визуальные изменения 9c92—68/3;20ea—12/2,5 пересекаются. Последние два CSS-исправления—13 существующих тестов/2 файла. Scoped lint/format и штатные production builds PASS с исходными budgets; последняя сборка на source `ffe677f5cefb4f2412f4b513954269ee1d846a10`, NG_BUILD_MAX_WORKERS=1. Полный набор не перезапускался, результаты разных запусков не суммируются. +Исторические наборы: R1—75/6 файлов, R2—183/13, R3/R4—235/22, R5/R6—14/3, R7—30/2 (2 падения до исправления), R8—15/3. Визуальные изменения 9c92—68/3;20ea—12/2,5 пересекаются. Последние два CSS-исправления—13 существующих тестов/2 файла. Scoped lint/format и штатные production builds PASS с исходными budgets; последняя локальная сборка на source `ffe677f5cefb4f2412f4b513954269ee1d846a10`, NG_BUILD_MAX_WORKERS=1. Эти локальные наборы были адресными; отдельно на опубликованном frontend8337094 прошли полные format/lint/test:ci/build:pr в CI. Результаты разных запусков не суммируются. -## Итоговое состояние dev и границы +## Текущее состояние dev и оставшиеся действия -- №39 quota3 и исходный календарь. №49 quota1, **creationFlag=false**, возврат подтвержден выводом штатной команды пользователя после создания 25. Дополнительных действий SSH/backend/deploy агент не выполнял. -- По согласованию календарь 49 оставлен: регистрация/сдача 04.11.2026 18:00, оценивание 05.11 18:00, конец 10.11 18:00 Москва. Противоречивый календарь 51 не менялся. -- Prefixed Project403/404, Solution19/20, их оценки и роли остаются;21 в архиве,25 — draft с командой 84/341. Материалы, optional поля и draft анкеты очищены после round trips; публикации анкеты не было. Критерии 123/124 зафиксированы разрешенными оценками. -- Письма: ранее 4 expert invitations, одно Project126 и одно отдельно разрешенное Solution37. На admin писем нет, resend нет. SMTP-доставка в почтовом ящике отдельно не проверялась. Массовых писем и выдачи сертификатов нет. -- NOT TESTED остаются: запись всех 7 разделов; полный resend lifecycle; реальная V2 пагинация >20 работ; V1 form concurrency и общий auto apply/stale plan; прямые forbidden grade writes; запись/оценивание 50/51; первоначальный reset-confirm; массовые письма/сертификаты. Подробные частичные результаты сохранены в матрице. +- №39: quota3 и исходный календарь. №49: quota1 и **creationFlag=false**. Согласованный календарь49 сохранен: регистрация/сдача04.11.2026 18:00, оценивание05.11 18:00, конец10.11 18:00 Москва. Исходные50/51 остаются без изменений. +- Прежние prefixed Project403/404, Solution19/20 и их оценки остаются.21 в архиве,25 — draft с командой84/341. Новые QA79–82 закрыты, creation flags=false; Project407/408 сданы штатным manager apply200. Из новых79/80 удалена только дополнительная QA-роль11, остался организатор28. Критерии семантически восстановлены; пустая textarea нормализует null-описание в пустую строку. +- Новых писем и выдачи пока нет. Прежние разрешения включали4 expert invitations, Project126 и Solution37 и были использованы. На admin писем нет. В QA80 сохранены submitted/manual/sendEmail=false и аудитория3; batch еще не создан. +- Остаются7 NOT TESTED: полный resend lifecycle обеих версий (S21/S22), V1 общий auto apply/stale plan (N02), прямые forbidden grade writes (N04), серверные записи хакатона/неконкурсного режима (N05), письма/выдача (X01), свежий reset-confirm и обычный вход (L13). Для новых писем, выдачи и отрицательных записей подготовлен конкретный запрос согласия. Ручной сброс подготовлен в отдельном постоянном окне. Требуемый ввод пользователя еще не получен. +- Автопроверка отклонила пробный POST оценки существующей19 из-за риска записи при неисправной защите; запрос не выполнен. Для безопасной альтернативы созданы новые неоцененные QA-работы. Отказ инструмента не записан как серверный403/404 и не засчитан PASS. -Приватная галерея, исходные снимки/XLSX и безопасные проекции запросов: `.acceptance-517/final-acceptance-20261103/visual-review.html`. В Git входят только сводные документы без учетных данных и персональных выгрузок. Для полного PASS нужны backend R9/R11 и их повтор на реальном dev, а также отдельно разрешенные либо явно исключенные оставшиеся сценарии. +Приватная визуальная галерея: `.acceptance-517/final-acceptance-20261103/visual-review.html`. Новые безопасные проекции ответов и XLSX: `.acceptance-517/backend-closeout-20261103/`. В Git входят только сводные документы без учетных данных и персональных выгрузок. Дальнейшая приемка продолжится после требуемых согласия и ручного входа; **65 PASS не заменяют оставшиеся7 сценариев**. diff --git a/docs/program-v2-ui-audit/integration-517/results.json b/docs/program-v2-ui-audit/integration-517/results.json index 31233cd60..52083bfa1 100644 --- a/docs/program-v2-ui-audit/integration-517/results.json +++ b/docs/program-v2-ui-audit/integration-517/results.json @@ -191,15 +191,34 @@ } ], "matrixSummary": { - "PASS": 59, - "NOT TESTED": 11, - "FAIL": 2 + "PASS": 65, + "NOT TESTED": 7, + "FAIL": 0 }, - "integrationAcceptance": "NOT READY: confirmed backend R9/R11; visual comparison complete, 11 bounded scenarios remain NOT TESTED", + "integrationAcceptance": "IN PROGRESS: R9/R11 closed on dev;65 PASS/7 NOT TESTED/0 FAIL; required new mail/issuance/negative-write consent and manual reset pending", "mailSent": true, "certificateDelivery": false, - "merge": false, - "deploy": false, + "merge": { + "frontend517": "6d0c691917293fb16372a4be02e49dbdb7ac75ac", + "frontend518": "8337094716c1886f54cad440b572f8b2957bda6f", + "backend854": "32d1f92b1021f2021afce7f32f2582c9817f97c9", + "backend855": "912dedc439412279bf57aca6d47dd63f67eb40f2", + "authorizedByUser": true, + "production": false + }, + "deploy": { + "frontend": { + "sha": "8337094716c1886f54cad440b572f8b2957bda6f", + "run": 41558542023, + "status": "success" + }, + "backend": { + "sha": "912dedc439412279bf57aca6d47dd63f67eb40f2", + "run": 41561994284, + "status": "success" + }, + "production": false + }, "rawEvidence": "Separate integration artifact; no credentials/HAR/storageState", "codeChecks": [ { @@ -237,162 +256,92 @@ "currentRun": { "date": "2026-11-03", "timezone": "Europe/Moscow", - "sourceHead": "ffe677f5cefb4f2412f4b513954269ee1d846a10", + "phase": "backend closeout checkpoint", + "verdict": "IN PROGRESS", + "acceptanceComplete": false, "testedProductCommit": "ffe677f5cefb4f2412f4b513954269ee1d846a10", - "earlierRuntime": "1e2fb68d361896aba1a632f759568d4dac70e164", + "publishedFrontendSha": "8337094716c1886f54cad440b572f8b2957bda6f", + "publishedProductTreeIdenticalToTestedProduct": true, + "backendFixMerge": "32d1f92b1021f2021afce7f32f2582c9817f97c9", + "backendCurrentMerge": "912dedc439412279bf57aca6d47dd63f67eb40f2", "origin": "http://127.0.0.1:4317", "api": "https://dev.procollab.ru", "apiMocked": false, - "verdict": "NOT READY", - "acceptanceComplete": false, "visualComparisonCompleteWithinDocumentedScope": true, - "designTarget": "Polished Project tabs + PROCOLLAB design system; Mont canonical, Figma Inter restriction obsolete. VE01-VE06 were never approved.", - "realVisual": { - "summary": { - "uniqueFrames": 185, - "finalRuntimeFrames": 147, - "runtimeCounts": { - "1e2fb68d361896aba1a632f759568d4dac70e164": 35, - "ffe677f5cefb4f2412f4b513954269ee1d846a10": 150 - }, - "pageOverflow": [], - "allFinalFramesLangRu": true, - "allFinalFramesMontReady": true, - "excluded": { - "39-form-bottom-desktop": "partial first screen, not footer", - "49-allocation-start-final-390": "loading; superseded by loaded frame", - "49-certificate-delivery-final-390": "loading; superseded by loaded frame", - "39-certificate-delivery-final-390": "loading; superseded by loaded frame" - }, - "screenshotsMissing": [], - "note": "Geometry checks supplement visual inspection. English user data and email labels are not error messages. Program51 calendar validation is Russian; its inconsistent fixture was not changed." - }, - "privateEvidence": ".acceptance-517/final-acceptance-20261103", - "gallery": "visual-review.html", - "allManagementTabs": true, - "allSevenSettingsSections": true, - "scope": "1440/390, selected360; long pages, branding, filters, field/questionnaire/criteria previews and editors, assignments, expanded results, selection, team/history/case dialog, 3 certificate steps", - "runtimeProvenance": "provenance-correction.json corrects helper metadata at known sequential preview restart; original pixels unchanged" - }, - "codeChecks": { - "source": "ffe677f5cefb4f2412f4b513954269ee1d846a10", - "existingTests": 13, - "files": 2, - "stylelint": "PASS", - "prettier": "PASS", - "productionBuildExitCode": 0, - "originalBudgets": true, - "fullSuiteRepeated": false, - "priorVisualRuns": [ - { - "source": "9c92cd7fa274477575163ec0443205d47d51b591", - "tests": 68, - "files": 3 - }, - { - "source": "20ea3590756d8053479dd3fca318bc4ea68233ca", - "tests": 12, - "files": 2, - "overlapWithPrior": 5 - } - ] - }, - "browserStop": { - "active": false, - "recovered": true, - "mechanism": "Visible authenticated QA Chrome profiles and ordinary local UI; no native Chrome window workaround after a current safeguard stop" - }, - "team25": { - "captainUserId": 84, - "status": "draft", - "createStatus": 201, - "saveStatus": 200, - "number": 0, - "boolean": false, - "members": [84, 341], - "role341": "PR517 QA участник", - "invitationId": 37, - "inviteStatus": 201, - "acceptStatus": 200, - "pending": 0, - "registrationProfile341": 352, - "reloadConfirmedBothAccounts": true - }, - "pureMember341": { - "management49": 403, - "foreign19": 404, - "own25": 200, - "canEdit": false, - "canManageTeam": false, - "canInvite": false, - "canSubmit": false, - "canLeave": true - }, - "activeChanges": { - "creationFlag49": false, - "restoreRequired": false, - "quota39": 3, - "quota49": 1, - "calendar49KeptByApproval": true, - "solution21Archived": true, - "solution25DraftKept": true, - "registrationProfile352Added": true - }, - "mail": { - "oneSolutionInvitationCreated": 37, - "recipientUserId": 341, - "sentOnce": true, - "accepted": true, - "resend": false, - "adminMail": false, - "smtpInboxDeliveryVerified": false - }, - "openDefects": [ + "visualEvidence": "previousFinalAcceptance20261103.realVisual; all7 tabs and7 settings,1440/390 and selected360; Mont; no approved VE exceptions", + "closedThisRun": ["S11", "S12", "S32", "N01", "X14", "X15"], + "closedDefects": [ { "id": "R9", - "severity": "P2", - "status": "OPEN", - "server": true, - "draft25ActualTeamRows": [84, 84, 341], - "expected": [84, 341], - "proposedPatch": "private R9-backend-proposed.patch", - "pureMethodCheck": "PASS", - "djangoDbTestsRun": false, - "backendModified": false, - "regressionOfPRProven": false + "status": "CLOSED", + "pr": 854, + "draft25Before": [84, 84, 341], + "draft25After": [84, 341], + "teamSize": 2, + "latestLiveBackend": "912dedc439412279bf57aca6d47dd63f67eb40f2" }, { "id": "R11", - "severity": "P1", - "status": "OPEN", - "server": true, - "program49EligibleCounts": { + "status": "CLOSED", + "pr": 854, + "program49CountsBefore": { "all": 5, "submitted": 0 }, - "expectedSubmittedAtLeast": 3, - "source": "backend recipients() only Project membership", - "issuanceAttempted": false, - "regressionOfPRProven": false + "program49CountsAfter": { + "all": 5, + "submitted": 3 + }, + "latestLiveBackend": "912dedc439412279bf57aca6d47dd63f67eb40f2" } ], - "open": [ - "Backend R9/R11 fix and real retest", - "Every-settings-section write not tested: locked criteria and organizer changes excluded", - "Extra expert invitation resend not authorized", - "Real V2 pagination >20 works absent", - "V1 form concurrency and whole-program automatic apply/stale plan not exercised", - "Direct forbidden grade writes not exercised", - "50/51 write/evaluation negative scenarios read-only scope", - "Original Play station reset-confirm root cause not captured", - "Participant bulk mail and certificate issuance not authorized" + "openDefects": [], + "openScenarioIds": ["S21", "S22", "N02", "N04", "N05", "X01", "L13"], + "codeChecks": { + "backendRelatedRealPostgresTests": 81, + "fixtureRealPostgresTests": 3, + "backend854FullCi": "PostgreSQL and SQLite PASS; Docker/lint PASS", + "backend855FullCi": "PostgreSQL and SQLite PASS; Docker/lint and PG14/18 migration-role tests PASS", + "frontendDeployCi": "format:check,lint:ts,test:ci,build:pr and deploy PASS", + "frontend518Scope": "9 documentary Prettier files only; no product changes" + }, + "fixtures": { + "pr": 855, + "programs": [79, 80, 81, 82], + "draft": true, + "creationFlags": false, + "newProjects": [406, 407, 408, 409], + "newSolutions": [ + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 + ], + "syntheticUsers": [ + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366 + ], + "syntheticAccountsHaveUsablePasswords": false, + "addresses": "reserved .invalid", + "oldModelsUnchangedAtCreation": 43, + "previewRun": 41562326457, + "applyRun": 41562451738, + "creationSentMail": false, + "currentChanges": "Project407/408 submitted through manager UI200; extra QA-manager11 removed only79/80; criteria blank description null normalized to empty string; cert80 configured submitted/manual/sendEmail=false, no batch" + }, + "pendingUser": [ + "Exact consent for4 expert letters+1 participant reminder to341, portal-only certificates59/349/350 and forbidden-write probes on new QA works", + "Fresh reset/normal login in permanent Chrome9442; no credentials or reset URLs read" ], + "safetyReview": { + "request": "member341 rate existing Solution19", + "executed": false, + "rejected": true, + "reason": "possible new grade without exact consent if guard failed", + "alternative": "new ungraded QA works with explicit scope pending consent" + }, + "privateEvidence": ".acceptance-517/backend-closeout-20261103", "credentialsRecorded": false, - "certificateDelivery": false, - "merge": false, - "deploy": false + "harExported": false, + "permissionsForged": false }, - "matrixSummaryScope": "72 rows; historical scenarios retain their actual tested SHAs. New visual and role reads on ffe677f5cefb4f2412f4b513954269ee1d846a10; functional team25/invitation37 on 1e2fb68d361896aba1a632f759568d4dac70e164.", + "matrixSummaryScope": "72 actual acceptance scenarios; historical mocks and CI are not counted as E2E", "previousDesktopRun": { "date": "2026-11-02", "timezone": "Europe/Moscow", @@ -783,5 +732,163 @@ "certificateDelivery": false, "merge": false, "deploy": false + }, + "previousFinalAcceptance20261103": { + "date": "2026-11-03", + "timezone": "Europe/Moscow", + "sourceHead": "ffe677f5cefb4f2412f4b513954269ee1d846a10", + "testedProductCommit": "ffe677f5cefb4f2412f4b513954269ee1d846a10", + "earlierRuntime": "1e2fb68d361896aba1a632f759568d4dac70e164", + "origin": "http://127.0.0.1:4317", + "api": "https://dev.procollab.ru", + "apiMocked": false, + "verdict": "NOT READY", + "acceptanceComplete": false, + "visualComparisonCompleteWithinDocumentedScope": true, + "designTarget": "Polished Project tabs + PROCOLLAB design system; Mont canonical, Figma Inter restriction obsolete. VE01-VE06 were never approved.", + "realVisual": { + "summary": { + "uniqueFrames": 185, + "finalRuntimeFrames": 147, + "runtimeCounts": { + "1e2fb68d361896aba1a632f759568d4dac70e164": 35, + "ffe677f5cefb4f2412f4b513954269ee1d846a10": 150 + }, + "pageOverflow": [], + "allFinalFramesLangRu": true, + "allFinalFramesMontReady": true, + "excluded": { + "39-form-bottom-desktop": "partial first screen, not footer", + "49-allocation-start-final-390": "loading; superseded by loaded frame", + "49-certificate-delivery-final-390": "loading; superseded by loaded frame", + "39-certificate-delivery-final-390": "loading; superseded by loaded frame" + }, + "screenshotsMissing": [], + "note": "Geometry checks supplement visual inspection. English user data and email labels are not error messages. Program51 calendar validation is Russian; its inconsistent fixture was not changed." + }, + "privateEvidence": ".acceptance-517/final-acceptance-20261103", + "gallery": "visual-review.html", + "allManagementTabs": true, + "allSevenSettingsSections": true, + "scope": "1440/390, selected360; long pages, branding, filters, field/questionnaire/criteria previews and editors, assignments, expanded results, selection, team/history/case dialog, 3 certificate steps", + "runtimeProvenance": "provenance-correction.json corrects helper metadata at known sequential preview restart; original pixels unchanged" + }, + "codeChecks": { + "source": "ffe677f5cefb4f2412f4b513954269ee1d846a10", + "existingTests": 13, + "files": 2, + "stylelint": "PASS", + "prettier": "PASS", + "productionBuildExitCode": 0, + "originalBudgets": true, + "fullSuiteRepeated": false, + "priorVisualRuns": [ + { + "source": "9c92cd7fa274477575163ec0443205d47d51b591", + "tests": 68, + "files": 3 + }, + { + "source": "20ea3590756d8053479dd3fca318bc4ea68233ca", + "tests": 12, + "files": 2, + "overlapWithPrior": 5 + } + ] + }, + "browserStop": { + "active": false, + "recovered": true, + "mechanism": "Visible authenticated QA Chrome profiles and ordinary local UI; no native Chrome window workaround after a current safeguard stop" + }, + "team25": { + "captainUserId": 84, + "status": "draft", + "createStatus": 201, + "saveStatus": 200, + "number": 0, + "boolean": false, + "members": [84, 341], + "role341": "PR517 QA участник", + "invitationId": 37, + "inviteStatus": 201, + "acceptStatus": 200, + "pending": 0, + "registrationProfile341": 352, + "reloadConfirmedBothAccounts": true + }, + "pureMember341": { + "management49": 403, + "foreign19": 404, + "own25": 200, + "canEdit": false, + "canManageTeam": false, + "canInvite": false, + "canSubmit": false, + "canLeave": true + }, + "activeChanges": { + "creationFlag49": false, + "restoreRequired": false, + "quota39": 3, + "quota49": 1, + "calendar49KeptByApproval": true, + "solution21Archived": true, + "solution25DraftKept": true, + "registrationProfile352Added": true + }, + "mail": { + "oneSolutionInvitationCreated": 37, + "recipientUserId": 341, + "sentOnce": true, + "accepted": true, + "resend": false, + "adminMail": false, + "smtpInboxDeliveryVerified": false + }, + "openDefects": [ + { + "id": "R9", + "severity": "P2", + "status": "OPEN", + "server": true, + "draft25ActualTeamRows": [84, 84, 341], + "expected": [84, 341], + "proposedPatch": "private R9-backend-proposed.patch", + "pureMethodCheck": "PASS", + "djangoDbTestsRun": false, + "backendModified": false, + "regressionOfPRProven": false + }, + { + "id": "R11", + "severity": "P1", + "status": "OPEN", + "server": true, + "program49EligibleCounts": { + "all": 5, + "submitted": 0 + }, + "expectedSubmittedAtLeast": 3, + "source": "backend recipients() only Project membership", + "issuanceAttempted": false, + "regressionOfPRProven": false + } + ], + "open": [ + "Backend R9/R11 fix and real retest", + "Every-settings-section write not tested: locked criteria and organizer changes excluded", + "Extra expert invitation resend not authorized", + "Real V2 pagination >20 works absent", + "V1 form concurrency and whole-program automatic apply/stale plan not exercised", + "Direct forbidden grade writes not exercised", + "50/51 write/evaluation negative scenarios read-only scope", + "Original Play station reset-confirm root cause not captured", + "Participant bulk mail and certificate issuance not authorized" + ], + "credentialsRecorded": false, + "certificateDelivery": false, + "merge": false, + "deploy": false } } From e1cdf5c904f60f7643d17355a27cda7a97ab0dda Mon Sep 17 00:00:00 2001 From: Fedor Date: Tue, 3 Nov 2026 14:14:35 +0300 Subject: [PATCH 2/2] docs: complete PR517 real-dev acceptance and cleanup --- .../integration-517/CODE_REVIEW.md | 14 +- .../integration-517/MATRIX.csv | 14 +- .../integration-517/README.md | 28 ++- .../integration-517/results.json | 199 ++++++++++++++++-- 4 files changed, 219 insertions(+), 36 deletions(-) diff --git a/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md b/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md index 609737670..903952aa4 100644 --- a/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md +++ b/docs/program-v2-ui-audit/integration-517/CODE_REVIEW.md @@ -6,7 +6,7 @@ Последний source/runtime `ffe677f5cefb4f2412f4b513954269ee1d846a10`:5 CSS-строк убирают разрывы слов в мобильных итогах оценивания и горизонтальную полосу tooltip. Обе версии 360px, нижняя подсказка 390px, Enter/Escape/outside проверены.13 существующих tests/2files, scoped stylelint/Prettier и штатный prod build PASS. Ранее 68/3 и 12/2 (5 пересекаются) не суммируются. -Draft25/приглашение37/вступление завершены обычными интерфейсами; flag49=false. R9/R11 теперь CLOSED: backend PR854 смержен и опубликован, повтор на текущем dev912dedc пройден. Текущая приемка IN PROGRESS:65 PASS/7 NOT TESTED/0 FAIL; новые письма, выдача и прямые отрицательные записи ожидают отдельного согласия, свежий сброс — ручного ввода. +Draft25/приглашение37/вступление завершены обычными интерфейсами; flag49=false. R9/R11 теперь CLOSED: backend PR854 смержен и опубликован, повтор на текущем dev912dedc пройден. Текущая приемка завершена в документированной области:72 PASS/0 NOT TESTED/0 FAIL. Новые письма, три сертификата без писем, прямые отрицательные записи на новых QA-работах и ручной чувствительный reset/обычный вход выполнены по явному согласию. QA79–81 возвращены в черновики, регистрация закрыта, batch12 приостановлен. Пределы наблюдений перечислены в README/MATRIX/results. ### R8 — отправитель Project invitation, исправлен @@ -20,7 +20,7 @@ Draft25/приглашение37/вступление завершены обы ### R11 — P1, CLOSED: аудитория сертификатов Solution -Backend PR854 добавляет в общий `recipients()` состав snapshot сданных активных Solution и фильтр регистрации. Счетчик и инициализация batch используют один service; legacy Project ветка сохранена. Регрессии проверяют API counts, actual batch recipient rows, snapshot/live drift, draft/archive/чужую программу и dedup. Вместе с R9 и смежными сценариями прошел81 Django/PostgreSQL тест; полные PostgreSQL/SQLite CI прошли. На реальном49 GET200 после32d1f92 и912dedc дает all5/submitted3 вместо0. Выдача49 не запускалась. +Backend PR854 добавляет в общий `recipients()` состав snapshot сданных активных Solution и фильтр регистрации. Счетчик и инициализация batch используют один service; legacy Project ветка сохранена. Регрессии проверяют API counts, actual batch recipient rows, snapshot/live drift, draft/archive/чужую программу и dedup. Вместе с R9 и смежными сценариями прошел81 Django/PostgreSQL тест; полные PostgreSQL/SQLite CI прошли. На реальном49 GET200 после32d1f92 и912dedc дает all5/submitted3 вместо0. Выдача49 не запускалась. Отдельно согласованная реальная выдача в QA80 после fix: activate201, batch12 ровно59/349/350,3 ready/0 sent; portal59 download и bulk3 PDF проверены. Pause200/active=false. Таким образом actual batch подтвержден и на настоящем dev, а не только регрессионными тестами. Сопутствующий PR855 добавляет только preview-first dev QA-operation и ее тесты: четыре закрытые программы79–82,23 Solution,4 Project,18 synthetic `.invalid` аккаунтов без пригодных паролей. Creation flags закрываются в той же транзакции; hash-проверка43 моделей подтверждает неизменность прежних строк. Три локальных PostgreSQL теста и полный CI PASS; текущий backend dev912dedc успешно опубликован. @@ -28,11 +28,19 @@ Backend PR854 добавляет в общий `recipients()` состав snaps На 8d36 V1 grade/removal race:POST project_ids403/expert_ids[] получил 409 после оценки 201; свежий редактор защищает 64 checked/disabled, reload эксперта сохраняет 0/Нет/comment. Отдельно согласованный stale team remove59 после сдачи 403: DELETE 409 с русским сообщением, свежая команда сохраняет 84/59. V1 transport pool=[95] не добавил собственного 95 к 403 и дал shortage 2; общий preview отменен без apply. V2 другой кейс 95/21 дал added0/shortage 1; чужое 19 у обычного 84 вернуло 404. Disabled controls отдельно не выдаются за запрет подмененного grade POST. +### Финальный повтор на backend912dedc и продуктном frontend ffe677f + +Новый V1 stale auto plan в QA79 отклонен409 после ручного назначения B200; свежий apply200 сохраняет B и добавляет только недостающее назначение. Pure member341 V1 rate407403 оставил evaluation точно неизменным. В опубликованной QA80 успешный контроль grade29=0/False/comment200 отделен от forbidden member341->27404 и own-team expert59->27403: оценки27 не изменились. Предварительный draft404 не засчитан как роль/own-team защита. + +QA81 open hackathon grade47=0/False/comment200 сохраняется после reload; expert submit47403/not_solution_captain не изменяет snapshot/команду/версию. Неконкурсная QA82 submit preview48409/not_competitive не меняет статус. Публикация79–81 была отдельно согласована, сразу закрыта регистрация; после проверок unpublish200 и fresh draft=true для всех трех. Создание Solution не включалось. Исходные50/51 сохранены. + +Invitation10/11: create201/resend200/revoke204, sent и кейс Город проверены после reload. Reminder79 только341: preview1, created1/skipped0, русское уведомление видно получателю. Это ровно согласованные5 dispatch; внешняя почта не инспектировалась. Свежий сброс выполнен пользователем, обычный вход200 проверен; reset-confirm HTTP не захвачен. Исторические результаты ниже сохраняют прежние даты и ограничения своего этапа. + ## Продолжение desktop: R7, 02.11.2026 На реальной 51 management200 подтвердил is_competitive=false, однако результаты показывали оцененность 0/0 и безбалльное оценивание, а analytics deadlines — активное оценивание. В `b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb` применимость существующего флага теперь скрывает summary/hint/status filter и evaluation deadline. Форматы/API не менялись, новый дизайн не вводился. Две регрессионные проверки упали до исправления; после 30 tests/2files, lint/format и стандартный prod build прошли. Реальный retest51 подтвердил отсутствие неприменимых текстов/контролов, с сохранением case filter и правильного noncompetitive empty state. Записей 50/51 нет. -R2–R6 и реальные R1/assignment/version/grade conflicts описаны в README и MATRIX с точными SHA. Итог интеграции остается insufficient evidence до оставшихся сценариев; исторические утверждения об отсутствии auth/writes ниже относятся к прежнему облачному этапу. +R2–R6 и реальные R1/assignment/version/grade conflicts описаны в README и MATRIX с точными SHA. На том промежуточном этапе доказательств еще не хватало; оставшиеся сценарии закрыты финальным циклом выше. Исторические утверждения об отсутствии auth/writes ниже относятся к прежнему облачному этапу. ## Историческое code review облачного этапа diff --git a/docs/program-v2-ui-audit/integration-517/MATRIX.csv b/docs/program-v2-ui-audit/integration-517/MATRIX.csv index 14446747c..79ea9e1e6 100644 --- a/docs/program-v2-ui-audit/integration-517/MATRIX.csv +++ b/docs/program-v2-ui-audit/integration-517/MATRIX.csv @@ -5,25 +5,25 @@ P03,Публичный режим программ,V2 №49/50/51,solution,По P04,Анонимный доступ к управлению,V1 №39,"401, закрытые данные не выдаются",d378a0f3: реальные anonymous browser GET management и experts 401; локальный management route переводит на обычный вход,PASS,—,d378a0f38c5542d6c005cb0be98cd00c8c66a58f P05,Анонимный доступ к управлению,V2 №49,"401, закрытые данные не выдаются",d378a0f3: реальные anonymous browser GET management и experts 401; локальный management route переводит на обычный вход,PASS,—,d378a0f38c5542d6c005cb0be98cd00c8c66a58f S11,"Настройки: чтение, сохранение всех разделов и повторное чтение",V1 №39 / закрытая QA №79,Сохраняются разрешенные изменения; reload возвращает серверное значение,"В №39 выполнены save/reload/restore основного, сроков, материалов, optional Project field и draft анкеты. На том же продуктном коде в новой QA79 дополнены недостающие записи: описание числового критерия PUT200/reload/возврат200; пустое описание нормализуется null -> пустая строка, остальные значения сохранены. Дополнительная QA-роль11 снята только из79, fresh GET200/reload подтверждает одного организатора28. Первый наблюденный POST79 был401 перед штатным refresh/retry; финальный статус мутации не захвачен, результат подтвержден свежим серверным чтением. Исходные роли39 не менялись.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 -S21,"Приглашение, принятие, повтор и отзыв эксперта",V1 №39,Тестовый invitation lifecycle и кейсы сохраняются,"Два тестовых приглашения созданы ранее; неактивное отозвано. На 1054ed6c user 59 принял свое приглашение 39 через подтверждение, POST 200; после reload pending исчез. Повторная отправка еще не выполнялась: первоначальный лимит 4 писем уже использован",NOT TESTED,—, +S21,"Приглашение, принятие, повтор и отзыв эксперта",V1 №39 / QA №79,Тестовый invitation lifecycle и кейсы сохраняются,"Прежнее принятие user59 в39: POST200/reload roster joined. На текущем продуктном коде в QA79 отдельно согласованы invite10 для user341, кейс Город: create201, фактический UI sent, resend200, fresh reload снова sent, revoke204 с пустым телом. После reload приглашение отозвано, кейс Город сохранен. Ровно два письма, повторных отправок после завершения нет. Историческое принятие и новый resend/revoke не выдаются за один новый invitation.",PASS,—,current frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 S31,"Поиск, фильтры, массовый выбор и смена страницы",V1 №39,"Draft/отмена; весь фильтр; no-op сохраняет выбор, изменение сбрасывает",8d36: выбраны 64 на странице 1 и 95 на странице 2; no-op фильтр сохраняет 2 и страницу 21–27. Выбор всего фильтра дает 27; смена статуса на joined очищает выбор и дает страницу 1–20 из 26. Реальные XLSX:27 со страницы 2 и 26 по фильтру; поиск/no-results проверены ранее на 1d403fe0.,PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S41,"Назначение, снятие и защита сохраненной оценки",V1 №39,Только выбранные работы; сохраненная оценка защищена; reload подтверждает состав,"8d36: POST project-experts только project_ids403/expert_ids64, затем 404/[64,95], оба 200. Неоцененное 95->404 снято и возвращено 200, промежуточное чтение подтверждает. Старый редактор 403 после оценки отправил expert_ids[] и получил 409; свежий редактор 64 checked/disabled, оценка после reload сохранена.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S51,Оценивание и пересчет результатов,V1 №39,Принятые оценки и quota дают результат по правилу программы,"8d36:403/64 сохранены 0,0,0/Нет/comment POST 201;404/64 сумма 10/Нет и 404/95 сумма 20/Да POST 201x2, reload. При quota 3 результат 404 предварительно 15; quota 2 дает ready 15 и место 6, ready всей программы 20->25. Возврат 3: preview 25->20, PUT 200 и reload3. Исходные оценки не изменялись.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S61,"Аналитика, все/completed/pending и выгрузки",V1 №39,Счетчики и файлы совпадают с данными/фильтром всех страниц,"8d36: аналитика 123 участников/62 проекта/50 сдано, assignments75 completed+48 pending=123. Списки содержат 75/48/123 строк; детализация 403 показывает 0/Нет/comment. XLSX результатов filtered2/all 50, оценки 3/all 123; эксперты 27/26. Полный analytics XLSX: участники 123, проекты 62, эксперты 26, назначения 123; исходные данные не публикуются. Excel runtime recalculation не запускался.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S71,"Работа с Project либо Solution, составом и snapshot",V1 №39,V1 сохраняет Project; V2 самостоятельное Solution и права команды,"8d36:403 создан капитаном 84 через program39 CTA POST 201, link 205; обязательные main/additional поля save/reload, основной save сохраняет кейс.404 создан штатно глобально, новый link 206 и profile337->404 подготовлены через разрешенную Django admin как fixture. Обе работы сданы UI PUT 200;126 принят POST 200, команда 403=[84,59]. Старое исключение 59 после сдачи DELETE 409, свежий просмотр сохраняет обоих. Project остается V1.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S12,"Настройки: чтение, сохранение всех разделов и повторное чтение",V2 №49 / закрытая QA №80,Сохраняются разрешенные изменения; reload возвращает серверное значение,"В №49 выполнены save/reload/restore основного, материалов, optional Solution field и draft анкеты; календарь сохранен по отдельному разрешению, числовой и boolean критерии добавлены до первой оценки. Недостающие записи выполнены в новой QA80: описание числового критерия PUT200/reload/возврат200; пустое описание нормализуется null -> пустая строка. Дополнительная QA-роль11 снята POST200/reload: остался организатор28. Исходные роли49 не менялись. Таким образом записи всех7 разделов проверены в обеих версиях, на изолированных данных там, где исходные критерии уже зафиксированы.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 -S22,"Приглашение, принятие, повтор и отзыв эксперта",V2 №49,Тестовый invitation lifecycle и кейсы сохраняются,"На 1054ed6c user 59 принял приглашение 49, POST 200; organizer roster показывает joined и только Город. ExpertId95 отличается от userId59/invitationId7. Неактивное приглашение 6 ранее отозвано. Повтор еще не проверен",NOT TESTED,—, +S22,"Приглашение, принятие, повтор и отзыв эксперта",V2 №49 / QA №80,Тестовый invitation lifecycle и кейсы сохраняются,"Прежнее принятие user59 в49: POST200, roster joined/Город; expert95 отличается от user59. На текущем коде в QA80 invitation11 для user341/Город: create201, fresh UI sent, resend200, reload sent, revoke204, reload отозвано с тем же кейсом. Ровно два согласованных письма. Принятие относится к историческому приглашению, resend/revoke к новой изолированной QA-записи.",PASS,—,current frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 S32,"Поиск, фильтры, массовый выбор и смена страницы",V2 №49 / закрытая QA №80,"Draft/отмена; весь фильтр; no-op сохраняет выбор, изменение сбрасывает","Исторический R1 в49: no-op сохраняет выбор19; реальная смена кейса сбрасывает; preview содержит только solution_ids[19],20 исключено. На опубликованном dev backend912dedc и том же frontend product tree в новой QA80 создан21 Solution: серверные страницы20+1 (offset20, последняя46). Выбор всего фильтра содержит все26–46 и сохраняется на странице2 и после no-op фильтра. Смена кейса на Образование оставляет только46, сбрасывает выбор и offset. Excel, полученный со страницы2, содержит все21 Solution26–46, независимо от страницы.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 S42,"Назначение, снятие и защита сохраненной оценки",V2 №49,Только выбранные работы; сохраненная оценка защищена; reload подтверждает состав,"b6ab5864: назначение 64->19 PUT 200; старый allocation/apply POST 409; новый preview добавляет 1 и reload19=[64,95],20=0,7=0. Неоцененное 95->19 снято PUT[]200, reload и возвращено PUT[19]200. Гонка снятия 64 после оценки: PUT[]409, после refresh19 checked/disabled, оценка сохранена. Дополнительно 64->20 PUT[19,20]200 сохраняет защищенное 19",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb S52,Оценивание и пересчет результатов,V2 №49,Принятые оценки и quota дают результат по правилу программы,"b6ab5864:19/64 POST 200 с 0/Нет/комментарием +reload;19/95 POST 200 с 6/Да +reload. Результат: предварительно 0 при 1/2 ->3 при 2/2; изменение 64 до 2 ->4. У 20 одна оценка 4; quota 2 дает partial, восстановление 1 дает ready. Оба решения имеют место 1/балл 4; все 3 оценки сохранены",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb S62,"Аналитика, все/completed/pending и выгрузки",V2 №49,Счетчики и файлы совпадают с данными/фильтром всех страниц,"b6ab: quota 2/1 и 3 сохраненные оценки сверены.8d36: после 21 Education сдано 4/оценено 2; временное 64->21 дает 3 completed+1 pending=4,75%. Модальные списки 3/1/4 и 14 листов полного analytics XLSX совпадают: 4 решения/4 assignments/9 строк критериев оценок. Временное 21 снято PUT[19,20]200, защищенные 19/20 сохранены. Дефект draft team XLSX вынесен X14.",PASS,—,8d36f4a833b9c664bea52c4806afe3484620f313 S72,"Работа с Project либо Solution, составом и snapshot",V2 №49,V1 сохраняет Project; V2 самостоятельное Solution и права команды,"Ранее 19/20: штатное создание, 0/Нет, сдача и frozen snapshot. На1e2f создан новый draft25 капитаном84, PATCH200/reload0/false. Одно разрешенное приглашение37 получателю341: POST201 и обычное принятие POST200. Reload обоих аккаунтов:84+341, роль PR517 QA участник, pending0. Наffe6 участнику can_edit/manage_team/invite/submit=false; can_leave=true. Draft25 не сдан ради воспроизведения R9.",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 1e2fb68d361896aba1a632f759568d4dac70e164; ffe677f5cefb4f2412f4b513954269ee1d846a10 N01,Конфликт изменений формы/решения,V1/V2,Revision-конфликт без перезаписи чужого изменения; нет auto-retry записи,"V2: форма B200/A409; refetch сохраняет локальный A и новый B без auto-write. Данные19 B PATCH200/A PATCH409; после сдачи staleA409. Дополнен V1: две вкладки формы39, B optional field PUT200, A stale PUT409/code stale_project_form с русским сообщением; локальный A сохранен. Новое поле B удалено PUT200, reload подтвердил точное совпадение исходных fields/cases. A отменен через подтверждение выхода без сохранения. Существующие ответы не менялись.",PASS,—,frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 32d1f92b1021f2021afce7f32f2582c9817f97c9 -N02,Устаревший allocation/назначение и гонка с оценкой,V1/V2,Старый план отклонен; актуальная оценка не удаляется,b6ab: V2 старый allocation/apply POST 409 после B manual assignment; новый preview сохраняет назначение. V2 grade/removal race409.8d36 V1 grade/removal race POST 403/[]409 и свежая защита checked/disabled. Автоматический apply V1 не выполнялся: штатный preview относится ко всей программе и включал прежние работы; разрешение охватывает назначения новых работ.,NOT TESTED,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313 +N02,Устаревший allocation/назначение и гонка с оценкой,V1/V2,Старый план отклонен; актуальная оценка не удаляется,"Исторические V2 stale allocation409 и grade/removal409 сохранены. Дополнен реальный V1 в новой QA79: A preview предлагал407->64/408->95; B вручную сохранил408->64 POST200. Подтверждение старого A получило409/stale_assignments с русским сообщением. Новый preview сохраняет B, добавляет только407->64; apply200 и reload подтверждают407->64/408->64. Исходные работы39 не участвовали в общем apply; прежняя V1 гонка снятия оцененного назначения также409.",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313; current frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 N03,"Другой кейс, своя команда, shortage и quota",V1/V2,Недопустимые назначения не появляются; shortage блокирует confirm,"b6ab V2 собственная команда 95/20: preview added0/shortage 2.8d36 V2 другой кейс 95/21: POST 200 added0/shortage 1, confirm disabled. V1 транспортный pool=[95] в реальном POST preview:403 сохраняет только 64, shortage 2;404 сохраняет 64/95, shortage 1; confirm disabled, общий preview отменен. Квоты 39 и 49 возвращены 3/1; сохраненные оценки не удалялись.",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313 -N04,Роли и чужие объекты,V1/V2,Авторизованные участник/эксперт не получают organizer права; object scope сохраняется,"Анонимные management401 на d378; эксперт 59 management39/49=403 на 1054; pure participant 84 management39/49=403 на b6ab.8d36 чужое Solution 19 у 84 GET 404 и русское Заявка не найдена, без save. Собственная V1-команда 403 у эксперта 95 недоступна для оценки в UI; V2 own20 GET 200 read-only. Прямой forbidden grade POST не отправляли, серверный write guard чужого объекта не заявлен. Финальный pure member341 наffe6: management49 GET403, чужое19 GET404, собственное25 GET200 с readonly permissions. Прямые forbidden grade writes не выполнялись.",NOT TESTED,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313 -N05,Хакатон и неконкурсные ограничения,V2 №50/51,Режим подтвержден настройками; неприменимые действия/метрики корректны,"1054ed6c:50 management200 solution/is_competitive=true, template Хакатон.51 management200 solution/is_competitive=false. R7: было Оценено 0 из 0/безбалльное оценивание/активный этап оценивания; исправлено b6ab и live retest51 пройден, фильтр оценки скрыт. Серверные запрещенные записи 50/51 не выполнялись Наffe6 повторены чтением50 analytics(open) и51 applications/filter/analytics/calendar: неприменимые аналитические метрики скрыты, ошибки календаря51 русские. Противоречивый fixture51 не менялся; запись/оценивание50/51 не выполнялись.",NOT TESTED,R7 исправлен; полный отрицательный сценарий не завершен, -X01,Письма участникам и массовая выдача сертификатов,V1/V2,Без отдельного разрешения не выполняются,Не запускались; изменения получателей/выдачи отсутствуют,NOT TESTED,—, +N04,Роли и чужие объекты,V1/V2; новые QA №79/80,Авторизованные участник/эксперт не получают organizer права; object scope сохраняется,"Прежние anonymous401, expert/member management403, foreign GET404 и own readonly сохранены. Дополнены явно разрешенные прямые записи на новых работах: pure member341 V1 rate407 POST403, fresh evaluation до/после точно совпадает. В опубликованной QA80 положительный контроль manager28 assignment64->29 PUT200 и grade29 POST200 с0/False/comment. Затем member341->чужое27 POST404/not_found и expert59->собственное27 POST403/own_team; оценки27 и полный manager frame точно неизменны. Это реальные HTTP-отказы после снятия draft visibility guard, а не disabled-кнопки. Существующая19 не использовалась для запрещенного POST.",PASS,—,b6ab5864ebc0ff577bc90b915606d1f6d4cd66fb; 8d36f4a833b9c664bea52c4806afe3484620f313; current frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 +N05,Хакатон и неконкурсные ограничения,V2 №50/51 чтение; QA №81/82 запись,Режим подтвержден настройками; неприменимые действия/метрики корректны,"Исторический R7 и чтение исходных50/51 сохранены, их данные не менялись. В опубликованной QA81 подтверждены competitive/hackathon, open evaluation, обязательный repository URL. Expert59 без предварительного назначения сохранил Solution47=0/False/comment POST200; reload сохраняет оценку. Его submit47 POST403/not_solution_captain, immutable form/answers/team/submission/name/version точно неизменны. В неконкурсной QA82 manager submit preview48 POST409/not_competitive на русском, версия/статус неизменны. Открытое оценивание хакатона разрешено настройкой и не объявляется дефектом.",PASS,R7 CLOSED; актуальные серверные проверки QA81/82 PASS,current frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 +X01,Письма участникам и массовая выдача сертификатов,V1 QA №79 / V2 QA №80,Только отдельно согласованные адресаты и объем; сертификаты без писем; временная публикация закрыта после проверки,"По явному согласию израсходованы4 invite/resend письма user341 в79/80 (sent в UI, затем revoke) и1 reminder79 только341: preview1/1, POST200 created_count1/skipped0; русское уведомление видно адресату. В80 audience=submitted/manual/sendEmail=false: activate201 создал batch12 ровно для59/349/350; journal3 ready/0 sent/0 failed, sentAt null. Пользователь59 видит готовый сертификат и скачал PDF; bulk ZIP содержит ровно3 одностраничных PDF, все отрисованы и просмотрены. Pause200, active=false. Согласованная временная публикация79–81 завершена unpublish200 каждой: fresh GET draft=true, регистрация закрыта;82 не публиковалась. Внешний почтовый ящик и фактическое попадание reminder во входящие не инспектировались.",PASS,—,current frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 A01,Безопасность исходных адресов участников и экспертов,V1 №39,Проверить состав по серверу и файлам; название не служит доказательством,Исходные 120 участников и 24 эксперта: уникальные синтетические dev-demo адреса @example.invalid; новые адреса отдельно разрешены пользователем,PASS,—,1d403fe0a1d4f663071d1b6c3deb2205d04645d8 A02,Выгрузка экспертов за пределами текущей страницы и выбора,V1 №39,Весь фильтр независимо от страницы 2 и одной выбранной строки,24 уникальные строки; числовые счетчики 120/72/48; fingerprint00576c77 совпал с API,PASS,—,1d403fe0a1d4f663071d1b6c3deb2205d04645d8 A03,Фильтрованная выгрузка экспертов,V1 №39,Учитывает поиск без учета регистра и не ограничена выбором одной строки,9 уникальных строк; счетчики 44/29/15; fingerprint84224e33 совпал с фильтрованным API,PASS,—,1d403fe0a1d4f663071d1b6c3deb2205d04645d8 @@ -32,7 +32,7 @@ A05,Отзыв неподходящего выделенного приглаш L10,Русские сообщения ошибок API,V1/V2 и вход/приглашения,Английский ответ API не показывается пользователю сырым текстом,8d36: обычная анонимная reset-email форма с несуществующим адресом example.invalid получила реальный POST /auth/reset_password/ HTTP 400 и английский email error unknown account. UI показывает только русский fallback: Не удалось отправить письмо. Проверьте адрес электронной почты. Также реальные 403/404/409 в проверенных program/team flows русские. Общеплатформенная полнота всех возможных ошибок не заявлена.,PASS,R2: реальный отрицательный retest пройден,8d36f4a833b9c664bea52c4806afe3484620f313 L11,Язык HTML-документа,V1/V2,Русскоязычный интерфейс объявляет lang=ru,b221ce4c: реальная локальная форма сброса объявляет lang=ru; проверено браузером,PASS,R3 исправлен и повторно проверен,b221ce4cc98a61cd901a198fc89066097c2a7960 L12,Форма нового пароля без ссылки,Вход,Русская ошибка ссылки; отказ не назван неправильным логином/паролем,На b221ce4c без токена показано: Ссылка восстановления недействительна или истекла. Запросите новую ссылку.,PASS,R4: неверное общее сообщение исправлено,b221ce4cc98a61cd901a198fc89066097c2a7960 -L13,Реальный сброс пароля Play station,Вход,Установить пароль по действующей ссылке и выполнить обычный вход,"Пользователь сообщил о выполненном сбросе. Обычный вход Play station подтвержден в E2 и отдельном капитанском контексте 59; фактический ответ reset-confirm не получен, причина исходного отказа не установлена. Синтетический 404 относится только к отдельной диагностике",NOT TESTED,R4 исправлен в UI; причина пользовательского отказа еще не установлена,b221ce4cc98a61cd901a198fc89066097c2a7960 +L13,Реальный сброс пароля Play station,Вход,Установить пароль по действующей ссылке и выполнить обычный вход,"На текущем runtime наблюден reset-request200. Пользователь сам открыл свежую ссылку, установил пароль и подтвердил выполнение; чувствительный reset-confirm HTTP в управляемом окне не захвачен. После этого обычный вход Play station дал401/401/200 и профиль59. Пользователь явно подтвердил новый пароль из этого сброса и опечатку в почте для первых двух попыток. Текущий reset/login проверен совместным ручным чувствительным шагом и реальным обычным входом; причина исходного исторического отказа не установлена, код/пароль/ссылка не считывались.",PASS,R4 CLOSED в UI; текущий reset/login PASS с ручным чувствительным шагом,b221ce4cc98a61cd901a198fc89066097c2a7960; current frontend ffe677f5cefb4f2412f4b513954269ee1d846a10; backend 912dedc439412279bf57aca6d47dd63f67eb40f2 V01,Сверка интерфейса с действующим V1,V1 №39 / V2 №49,Общие компоненты и стиль V1; отклонения показаны отдельно,"Завершена сверка всех7 вкладок и7 разделов настроек V1/V2:1440/390px, выбранные длинные состояния360px. Mont, тонкие кнопки, общий поиск/фильтры, экспорт иконкой, белые панели выбора, центрированные диалоги. Просмотрены длинные части, брендирование, формы/preview, защищенные назначения, раскрытые оценки, команда/история/смена кейса и3 шага сертификатов. Снимки и DOM-измерения приватно final-acceptance-20261103; loading/частичные кадры исключены. Бизнес-дефекты R9/R11 проверяются отдельно.",PASS,R10 исправлен и повторно проверен,1e2fb68d361896aba1a632f759568d4dac70e164; ffe677f5cefb4f2412f4b513954269ee1d846a10 S81,Описание и календарь: save/reload/restore,V1 №39,Маркер и+1 минута сохраняются; исходные значения восстановлены,Оба round trips выполнены; календарь PATCH 200; восстановление проверено повторной загрузкой,PASS,—,0152e19c62228663f42d5736015a9bd4e4b1dd15 S82,Описание: save/reload/restore,V2 №49,Маркер сохраняется; исходное описание возвращается,Маркер и возврат подтверждены после reload,PASS,—,0152e19c62228663f42d5736015a9bd4e4b1dd15 diff --git a/docs/program-v2-ui-audit/integration-517/README.md b/docs/program-v2-ui-audit/integration-517/README.md index 016e1965b..cff242c95 100644 --- a/docs/program-v2-ui-audit/integration-517/README.md +++ b/docs/program-v2-ui-audit/integration-517/README.md @@ -2,7 +2,7 @@ # Интеграционная приемка PR #517 -Промежуточный итог на 03.11.2026: **IN PROGRESS**. Серверные R9/R11 исправлены, смержены в dev и повторно проверены. Матрица: **65 PASS / 7 NOT TESTED / 0 FAIL**. PR #517 уже смержен и опубликован на dev по новому разрешению пользователя; полная приемка еще не объявлена завершенной. +Итог на 03.11.2026: **PASS в документированной области приемки**. Матрица: **72 PASS / 0 NOT TESTED / 0 FAIL**. R9/R11 исправлены на backend, смержены в dev и повторно проверены. PR #517 уже смержен и опубликован на dev по последующему разрешению пользователя. Финальные реальные проверки и уборка временной публикации завершены; этот отчет фиксируется в [PR #519](https://github.com/PROCOLLAB-github/procollab/pull/519). Последний проверенный продуктный commit и видимый runtime: `ffe677f5cefb4f2412f4b513954269ee1d846a10`. Предыдущий runtime `1e2fb68d361896aba1a632f759568d4dac70e164` использовался для создания 25, приглашения 37 и первого повтора экспорта. У исторических сценариев сохранены исходные SHA в [MATRIX.csv](MATRIX.csv); результаты старых проверок не переименованы в проверки последнего кода. Машиночитаемые сведения — [results.json](results.json). @@ -25,7 +25,7 @@ Frontend [PR #517](https://github.com/PROCOLLAB-github/procollab/pull/517) см ## Реальные функциональные результаты - R1: no-op фильтра сохраняет выбранное 19, реальная смена кейса сбрасывает выбор. Server preview передал только solution_ids[19], expert_ids[64,95];20 исключено. Отмена не создала назначений. -- Настройки V1/V2: разрешенные save/reload/restore описания, материалов, optional поля и draft анкеты; V1 календарь восстановлен, корректный V2 календарь оставлен по согласованию. Семь разделов прочитаны. Запись каждого раздела не заявлена: критерии зафиксированы, доступ организаторов не менялся ради теста. +- Настройки V1/V2: разрешенные save/reload/restore описания, материалов, optional поля и draft анкеты; V1 календарь восстановлен, корректный V2 календарь оставлен по согласованию. Недостающая запись критериев и организаторов дополнена в изолированных QA79/80: все7 разделов обеих версий имеют save/reload evidence, без изменения зафиксированных критериев и исходных ролей39/49. - Project403/link205 создан штатно капитаном 84;404/link206 — капитаном 11, новый link и профиль подготовлены разрешенной Django admin. Обе работы сданы PUT200. Приглашение 126 отдельно согласовано, отправлено один раз и принято 200; команда 403 после reload —84/59 с нужной ролью. - Project403/64:0/0/0/Нет/comment. Project404/64 и 95: суммы 10/20, Нет/Да; среднее 15. POST201/reload. Устаревшее снятие оцененного назначения и отдельно согласованное исключение 59 из сданной 403 дали 409; данные сохранились. Временная quota39=2 дала ready25 вместо 20, возврат 3 восстановил 20; исходные оценки сохранены. - Эксперты V1: no-op сохранил 2 выбранных на странице 2, весь фильтр выбрал 27; реальный фильтр сбросил выбор/страницу. Excel со страницы 2 содержит 27, joined-фильтр 26. Результаты по prefix —2 работы/3 оценки; Вся программа при поиске —50/123. Полный analytics:123 участника,62 проекта,50 сдано,75 completed/48 pending. Формулы и числа прочитаны из XLSX; Excel runtime recalculation не запускался. @@ -33,7 +33,19 @@ Frontend [PR #517](https://github.com/PROCOLLAB-github/procollab/pull/517) см - Solution19:64 сначала 0/Нет,95=6/Да; preliminary0 перешел в ready3. Изменение 64 до 2 дало 4. Solution20:64=4/Нет. После возврата quota49=1 обе готовые с 4, все 3 оценки сохранены. Гонка снятия оценившего 64 дала 409. Своя команда 95->20 и другой кейс 95->21 в preview дали added0/shortage, confirm disabled. - Solution21 другого кейса сдано 200 при creationFlag=false; snapshot Education/0/Нет и frozen team. Временное неоцененное 64->21 дало 75%/3 из 4, списки и полный 14-листовый XLSX совпали; назначение затем снято 200. По отдельному разрешению 21 отправлено в архив, preview0 оценок/назначений/ожидающих приглашений, apply200. - Финальный цикл команды: создан **draft25** капитаном 84, сохранены 0/false с reload. Получатель 341 зарегистрирован в 49 через разрешенную штатную Django admin, profile352. Одно приглашение 37 создано 201, карточка показывает sender84 и нужную роль;341 принял его обычной кнопкой 200. После reload обоих аккаунтов команда 84/341, pending0, роль PR517 QA участник. Это не отправка повторного письма. -- На последнем runtime обычный member341 получил management49=403, чужое 19=404, собственное 25=200. Permissions запрещают edit/manage_team/invite/submit; leave разрешен. Ранее обычный эксперт и участник получили management403 обеих версий, анонимный пользователь 401. Прямые forbidden grade writes не выполнялись. +- На последнем runtime обычный member341 получил management49=403, чужое 19=404, собственное 25=200. Permissions запрещают edit/manage_team/invite/submit; leave разрешен. Ранее обычный эксперт и участник получили management403 обеих версий, анонимный пользователь 401. В финальном цикле прямые forbidden grade writes выполнены только на отдельно согласованных новых QA407/27; реальные отказы403/404 и неизменность серверных данных подтверждены. + +## Финальные реальные проверки оставшихся сценариев + +- S21/S22: QA79 invitation10 и QA80 invitation11 для user341/Город — create201, sent, resend200, sent, revoke204 и reload с сохранением кейса. Прежнее принятие user59 в39/49 остается отдельным историческим доказательством. +- N02: в V1 A preview устарел после B manual assignment408->64 POST200. A apply409/stale_assignments; новый preview/apply200 добавил только407->64, назначение B сохранено. Исходная39 не участвовала в общем auto apply. +- N04: pure member341 rate407 V1 POST403 без изменений. В опубликованной80 положительный контроль assignment64->29 PUT200/grade200; member341->27 POST404 и expert59->собственное27 POST403/own_team, full evaluation точно неизменен. Draft visibility не подменяет проверку роли. +- N05: QA81/hackathon open evaluation позволяет expert59 сохранить47=0/False/comment POST200 без предварительного назначения. Его submit47 отклонен403/not_solution_captain, snapshot/команда/версия сохранены. QA82 noncompetitive submit preview48 отклонен409/not_competitive без изменений. Исходные50/51 не менялись. +- X01: после явного согласия выполнены4 expert invite/resend dispatch и1 reminder79 только341 (POST200 created1/skipped0); русское уведомление видно адресату. Фактическое попадание reminder во внешний почтовый ящик не инспектировалось, новых отправок сверх пяти нет. +- В QA80 submitted/manual/sendEmail=false: activate201 создал batch12 ровно для59/349/350; journal3 ready/0 sent/0 failed. Сертификат59 виден и скачивается из кабинета. Bulk ZIP содержит ровно3 одностраничных PDF; все отрисованы и просмотрены. QA-шаблон намеренно содержит только имя. Pause200, active=false, sentAt null. +- L13: reset-request200 наблюден; чувствительный сброс выполнен пользователем. Новый пароль подтвержден им явно, обычный token POST200 и профиль59 проверены. Reset-confirm HTTP не записывался; причина первоначального отказа не додумана. + +Все79–81 публиковались только по явному разрешению, регистрация сразу закрыта. После проверок каждый unpublish вернул200; свежий GET подтвердил draft=true. Регистрация оставлена закрытой,82 не публиковалась, creation flags не включались. Работы, оценки и готовые PDF сохраняются. ## Интерфейс и тексты @@ -43,7 +55,7 @@ Frontend [PR #517](https://github.com/PROCOLLAB-github/procollab/pull/517) см В 9c92/20ea восстановлены подписи/даты/статусы аналитики, общий tooltip, export32x32, отступы Добавить поле, responsive таблица заполнения формы и общий слот фильтра. Реальный повтор выполнен. В `ffe677f5cefb4f2412f4b513954269ee1d846a10` исправлены найденные при повторе разрывы слов итогов оценивания на узком экране и горизонтальная полоса нижней подсказки. Обе версии на 360px повторно просмотрены; Enter/Escape/outside работают. -Проверенные 403/404/409 и календарные ошибки русские. R2 реальным unknown-account400 получил английский ответ сервера и русский fallback в UI. R3/R4 разделяют ошибку ссылки восстановления и логина; первоначальная причина отказа reset-confirm Play station не установлена. Пользователь позже входил обычным способом. R5 исправляет подсказку draft, R6 согласует comment1000, R7 скрывает неприменимые аналитические этапы/метрики 51, R8 показывает sender Project invitation. Пользовательские данные и справочники не переписывались. Это не утверждение о каждом возможном сообщении всей платформы. +Пользовательские ошибки в проверенных UI-состояниях и календаре русские. R2 реальным unknown-account400 получил английский ответ сервера и русский fallback в UI; прямой запрещенный V1 grade probe также вернул английский raw detail, не показанный пользователю. R3/R4 разделяют ошибку ссылки восстановления и логина. В финальном цикле пользователь сам выполнил свежий сброс и явно подтвердил вход новым паролем; фактический обычный вход200/профиль59 наблюден, два401 объяснены опечаткой в почте. Reset-confirm HTTP не захвачен, причина первоначального исторического отказа не установлена. R5 исправляет подсказку draft, R6 согласует comment1000, R7 скрывает неприменимые аналитические этапы/метрики 51, R8 показывает sender Project invitation. Пользовательские данные и справочники не переписывались. Это не утверждение о каждом возможном сообщении всей платформы. ## Исправленные серверные дефекты @@ -58,12 +70,12 @@ Frontend сохраняет серверный workbook и отображает Исторические наборы: R1—75/6 файлов, R2—183/13, R3/R4—235/22, R5/R6—14/3, R7—30/2 (2 падения до исправления), R8—15/3. Визуальные изменения 9c92—68/3;20ea—12/2,5 пересекаются. Последние два CSS-исправления—13 существующих тестов/2 файла. Scoped lint/format и штатные production builds PASS с исходными budgets; последняя локальная сборка на source `ffe677f5cefb4f2412f4b513954269ee1d846a10`, NG_BUILD_MAX_WORKERS=1. Эти локальные наборы были адресными; отдельно на опубликованном frontend8337094 прошли полные format/lint/test:ci/build:pr в CI. Результаты разных запусков не суммируются. -## Текущее состояние dev и оставшиеся действия +## Итоговое состояние dev и границы вывода - №39: quota3 и исходный календарь. №49: quota1 и **creationFlag=false**. Согласованный календарь49 сохранен: регистрация/сдача04.11.2026 18:00, оценивание05.11 18:00, конец10.11 18:00 Москва. Исходные50/51 остаются без изменений. - Прежние prefixed Project403/404, Solution19/20 и их оценки остаются.21 в архиве,25 — draft с командой84/341. Новые QA79–82 закрыты, creation flags=false; Project407/408 сданы штатным manager apply200. Из новых79/80 удалена только дополнительная QA-роль11, остался организатор28. Критерии семантически восстановлены; пустая textarea нормализует null-описание в пустую строку. -- Новых писем и выдачи пока нет. Прежние разрешения включали4 expert invitations, Project126 и Solution37 и были использованы. На admin писем нет. В QA80 сохранены submitted/manual/sendEmail=false и аудитория3; batch еще не создан. -- Остаются7 NOT TESTED: полный resend lifecycle обеих версий (S21/S22), V1 общий auto apply/stale plan (N02), прямые forbidden grade writes (N04), серверные записи хакатона/неконкурсного режима (N05), письма/выдача (X01), свежий reset-confirm и обычный вход (L13). Для новых писем, выдачи и отрицательных записей подготовлен конкретный запрос согласия. Ручной сброс подготовлен в отдельном постоянном окне. Требуемый ввод пользователя еще не получен. +- Финальный согласованный объем использован полностью:4 письма приглашения/повтора и1 напоминание только341; на admin писем нет. Три сертификата80 выданы только на платформе59/349/350, sent0; batch12 приостановлен. Новых отправок и повторной выдачи не требуется. +- Оставшихся NOT TESTED в матрице нет. Область и пределы наблюдений сохранены: ручной reset-confirm без захвата HTTP, отсутствие проверки внешнего почтового ящика, исторические SHA у прежних сценариев, XLSX без запуска пересчета в отдельном Excel runtime. Это ограниченная приемка перечисленных сценариев, а не гарантия отсутствия любых ошибок всей платформы. - Автопроверка отклонила пробный POST оценки существующей19 из-за риска записи при неисправной защите; запрос не выполнен. Для безопасной альтернативы созданы новые неоцененные QA-работы. Отказ инструмента не записан как серверный403/404 и не засчитан PASS. -Приватная визуальная галерея: `.acceptance-517/final-acceptance-20261103/visual-review.html`. Новые безопасные проекции ответов и XLSX: `.acceptance-517/backend-closeout-20261103/`. В Git входят только сводные документы без учетных данных и персональных выгрузок. Дальнейшая приемка продолжится после требуемых согласия и ручного входа; **65 PASS не заменяют оставшиеся7 сценариев**. +Приватная визуальная галерея: `.acceptance-517/final-acceptance-20261103/visual-review.html`. Новые безопасные проекции ответов и XLSX: `.acceptance-517/backend-closeout-20261103/`. В Git входят только сводные документы без учетных данных и персональных выгрузок. Вердикт для PR #517: **приемка завершена в заявленной области, препятствий к слиянию в dev по проверенным сценариям нет**. Слияние и dev deploy уже выполнены по последующему разрешению; production не затрагивался. diff --git a/docs/program-v2-ui-audit/integration-517/results.json b/docs/program-v2-ui-audit/integration-517/results.json index 52083bfa1..40850d236 100644 --- a/docs/program-v2-ui-audit/integration-517/results.json +++ b/docs/program-v2-ui-audit/integration-517/results.json @@ -191,13 +191,13 @@ } ], "matrixSummary": { - "PASS": 65, - "NOT TESTED": 7, + "PASS": 72, + "NOT TESTED": 0, "FAIL": 0 }, - "integrationAcceptance": "IN PROGRESS: R9/R11 closed on dev;65 PASS/7 NOT TESTED/0 FAIL; required new mail/issuance/negative-write consent and manual reset pending", + "integrationAcceptance": "PASS:72 PASS/0 NOT TESTED/0 FAIL within documented scope; R9/R11 closed; authorized mail/portal issuance and temporary-publication cleanup complete", "mailSent": true, - "certificateDelivery": false, + "certificateDelivery": true, "merge": { "frontend517": "6d0c691917293fb16372a4be02e49dbdb7ac75ac", "frontend518": "8337094716c1886f54cad440b572f8b2957bda6f", @@ -252,13 +252,13 @@ "realBrowserSource": "9c92cd7fa274477575163ec0443205d47d51b591" } ], - "historicalScope": "baselineBrowser/codeFix, previousDesktopRun, desktopFunctionalRun20261102 and previousVisualRun20261103 are historical evidence. currentRun is the final continuation; old per-scenario SHAs have not been retagged.", + "historicalScope": "baselineBrowser/codeFix, previousDesktopRun, desktopFunctionalRun20261102 and previousVisualRun20261103 are historical evidence. currentRun is the final continuation; old per-scenario SHAs have not been retagged. previousBackendCheckpoint20261103 preserves the earlier65/7 checkpoint; currentRun records the completed continuation.", "currentRun": { "date": "2026-11-03", "timezone": "Europe/Moscow", - "phase": "backend closeout checkpoint", - "verdict": "IN PROGRESS", - "acceptanceComplete": false, + "phase": "completed real-dev acceptance", + "verdict": "PASS within the documented acceptance scope", + "acceptanceComplete": true, "testedProductCommit": "ffe677f5cefb4f2412f4b513954269ee1d846a10", "publishedFrontendSha": "8337094716c1886f54cad440b572f8b2957bda6f", "publishedProductTreeIdenticalToTestedProduct": true, @@ -269,7 +269,21 @@ "apiMocked": false, "visualComparisonCompleteWithinDocumentedScope": true, "visualEvidence": "previousFinalAcceptance20261103.realVisual; all7 tabs and7 settings,1440/390 and selected360; Mont; no approved VE exceptions", - "closedThisRun": ["S11", "S12", "S32", "N01", "X14", "X15"], + "closedThisRun": [ + "S11", + "S12", + "S32", + "N01", + "X14", + "X15", + "S21", + "S22", + "N02", + "N04", + "N05", + "X01", + "L13" + ], "closedDefects": [ { "id": "R9", @@ -296,7 +310,7 @@ } ], "openDefects": [], - "openScenarioIds": ["S21", "S22", "N02", "N04", "N05", "X01", "L13"], + "openScenarioIds": [], "codeChecks": { "backendRelatedRealPostgresTests": 81, "fixtureRealPostgresTests": 3, @@ -323,25 +337,86 @@ "previewRun": 41562326457, "applyRun": 41562451738, "creationSentMail": false, - "currentChanges": "Project407/408 submitted through manager UI200; extra QA-manager11 removed only79/80; criteria blank description null normalized to empty string; cert80 configured submitted/manual/sendEmail=false, no batch" + "currentChanges": "QA79:407/408 submitted, both assigned64; QA80:grade29 by64; QA81:open grade47 by95; portal batch12 exactly3ready/sent0/paused; all79-82 draft,79-81 registration closed; original39/49/50/51 not changed in this final cycle" }, - "pendingUser": [ - "Exact consent for4 expert letters+1 participant reminder to341, portal-only certificates59/349/350 and forbidden-write probes on new QA works", - "Fresh reset/normal login in permanent Chrome9442; no credentials or reset URLs read" - ], + "pendingUser": [], "safetyReview": { "request": "member341 rate existing Solution19", "executed": false, "rejected": true, "reason": "possible new grade without exact consent if guard failed", - "alternative": "new ungraded QA works with explicit scope pending consent" + "alternative": "Explicit consent obtained for new QA work; negative probes completed; original19 POST never retried" }, "privateEvidence": ".acceptance-517/backend-closeout-20261103", "credentialsRecorded": false, "harExported": false, - "permissionsForged": false + "permissionsForged": false, + "reportPR": 519, + "publishedFrontendShaScope": "Frontend dev at the E2E run, before final docs-only PR519; product tree identical to tested source", + "finalScenarioEvidence": { + "S21": "s21-final.json; invite79-after-resend.json", + "S22": "s22-final.json", + "N02": "n02-v1-stale-apply.json; n02-v1-fresh-plan.json; n02-v1-final.json", + "N04": "n04-member341-v1.json; n04-v2-positive-control29.json; n04-v2-published-guards.json", + "N05": "n05-noncompetitive48.json; n05-hack47.json", + "X01": "x01-final.json; cert80-issued-final.json; certificates80-pdf-proof.json; reminder79-recipient-visible.json; publication-cleanup-final.json", + "L13": "l13-reset-current-proof.json; explicit user confirmation of new password and email typo" + }, + "authorizedMail": { + "expertLetters": 4, + "recipientUserId": 341, + "programs": [79, 80], + "expertDeliveryObserved": "sent after create and resend; invitations then revoked", + "participantReminder": { + "program": 79, + "userId": 341, + "count": 1, + "postStatus": 200, + "createdCount": 1, + "skippedCount": 0, + "visibleInRecipientNotifications": true + }, + "allFiveDispatchesConsumed": true, + "adminMail": false, + "externalInboxInspected": false + }, + "portalCertificates": { + "program": 80, + "batchId": 12, + "userIds": [59, 349, 350], + "activateStatus": 201, + "ready": 3, + "sent": 0, + "failed": 0, + "sendEmail": false, + "pauseStatus": 200, + "batchActive": false, + "participant59PortalDownload": true, + "bulkPdfCount": 3, + "pdfPagesEach": 1, + "allThreeRenderedAndVisuallyInspected": true, + "qaTemplate": "Recipient name only; other elements intentionally hidden" + }, + "temporaryPublication": { + "explicitUserConsent": true, + "programs": [79, 80, 81], + "publishStatuses": [200, 200, 200], + "registrationClosedImmediately": true, + "unpublishStatuses": [200, 200, 200], + "finalDraftAll": true, + "finalRegistrationKeptClosed": true, + "program82NeverPublished": true, + "creationFlagsUnchangedFalse": true + }, + "observationLimits": [ + "Reset link/password handled by user; reset-confirm HTTP was not captured. Current new-password use confirmed explicitly, normal token POST200/profile59 observed. Historical initial reset failure cause remains unknown.", + "Four expert deliveries observed sent in UI; reminder send receipt200 and recipient notification observed. External mailbox/SMTP inbox delivery was not inspected.", + "Historical E2E entries retain their own SHAs. Not every historical case was rerun on current backend; original50/51 remain read-only and write checks use81/82 clones.", + "Russian UI messages were checked in covered flows. Raw V1 forbidden-grade API detail is English; it was a direct denied probe and is not a claim that all API responses or every platform text are translated.", + "XLSX numeric/formula contents inspected; external Excel-runtime recalculation was not run." + ] }, - "matrixSummaryScope": "72 actual acceptance scenarios; historical mocks and CI are not counted as E2E", + "matrixSummaryScope": "72 acceptance scenarios with real-dev evidence, including an explicitly manual sensitive reset step; historical CI/mocks are not counted as E2E", "previousDesktopRun": { "date": "2026-11-02", "timezone": "Europe/Moscow", @@ -890,5 +965,93 @@ "certificateDelivery": false, "merge": false, "deploy": false + }, + "previousBackendCheckpoint20261103": { + "date": "2026-11-03", + "timezone": "Europe/Moscow", + "phase": "backend closeout checkpoint", + "verdict": "IN PROGRESS", + "acceptanceComplete": false, + "testedProductCommit": "ffe677f5cefb4f2412f4b513954269ee1d846a10", + "publishedFrontendSha": "8337094716c1886f54cad440b572f8b2957bda6f", + "publishedProductTreeIdenticalToTestedProduct": true, + "backendFixMerge": "32d1f92b1021f2021afce7f32f2582c9817f97c9", + "backendCurrentMerge": "912dedc439412279bf57aca6d47dd63f67eb40f2", + "origin": "http://127.0.0.1:4317", + "api": "https://dev.procollab.ru", + "apiMocked": false, + "visualComparisonCompleteWithinDocumentedScope": true, + "visualEvidence": "previousFinalAcceptance20261103.realVisual; all7 tabs and7 settings,1440/390 and selected360; Mont; no approved VE exceptions", + "closedThisRun": ["S11", "S12", "S32", "N01", "X14", "X15"], + "closedDefects": [ + { + "id": "R9", + "status": "CLOSED", + "pr": 854, + "draft25Before": [84, 84, 341], + "draft25After": [84, 341], + "teamSize": 2, + "latestLiveBackend": "912dedc439412279bf57aca6d47dd63f67eb40f2" + }, + { + "id": "R11", + "status": "CLOSED", + "pr": 854, + "program49CountsBefore": { + "all": 5, + "submitted": 0 + }, + "program49CountsAfter": { + "all": 5, + "submitted": 3 + }, + "latestLiveBackend": "912dedc439412279bf57aca6d47dd63f67eb40f2" + } + ], + "openDefects": [], + "openScenarioIds": ["S21", "S22", "N02", "N04", "N05", "X01", "L13"], + "codeChecks": { + "backendRelatedRealPostgresTests": 81, + "fixtureRealPostgresTests": 3, + "backend854FullCi": "PostgreSQL and SQLite PASS; Docker/lint PASS", + "backend855FullCi": "PostgreSQL and SQLite PASS; Docker/lint and PG14/18 migration-role tests PASS", + "frontendDeployCi": "format:check,lint:ts,test:ci,build:pr and deploy PASS", + "frontend518Scope": "9 documentary Prettier files only; no product changes" + }, + "fixtures": { + "pr": 855, + "programs": [79, 80, 81, 82], + "draft": true, + "creationFlags": false, + "newProjects": [406, 407, 408, 409], + "newSolutions": [ + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 + ], + "syntheticUsers": [ + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366 + ], + "syntheticAccountsHaveUsablePasswords": false, + "addresses": "reserved .invalid", + "oldModelsUnchangedAtCreation": 43, + "previewRun": 41562326457, + "applyRun": 41562451738, + "creationSentMail": false, + "currentChanges": "Project407/408 submitted through manager UI200; extra QA-manager11 removed only79/80; criteria blank description null normalized to empty string; cert80 configured submitted/manual/sendEmail=false, no batch" + }, + "pendingUser": [ + "Exact consent for4 expert letters+1 participant reminder to341, portal-only certificates59/349/350 and forbidden-write probes on new QA works", + "Fresh reset/normal login in permanent Chrome9442; no credentials or reset URLs read" + ], + "safetyReview": { + "request": "member341 rate existing Solution19", + "executed": false, + "rejected": true, + "reason": "possible new grade without exact consent if guard failed", + "alternative": "new ungraded QA works with explicit scope pending consent" + }, + "privateEvidence": ".acceptance-517/backend-closeout-20261103", + "credentialsRecorded": false, + "harExported": false, + "permissionsForged": false } }