STT-61 — Финальный регресс «Отпуска»

Стенд https://stt-25-real.stand.yakutov.com · коммит 35e9dadcde (otpuska:t-12345-polish) · 01.10.2026

Итог

Не прошло. Стенд stt-25-real живой и согласован с финалом доводки (5 экранов, консоль чистая), но прогоны сквозных цепочек (pnpm e2e) на фикстурном стенде stt-61-fixture не зелёные: 8–14 из 22 цепочек красные, второй запуск подряд — тоже не зелёный; плюс в 03-chain-manager-edits.spec.ts осталось 5 вызовов test.fail() (R1 из каталога STT-56). Финальный прогон по критерию приёмки «pnpm e2e — все зелёные дважды подряд» не выполнен. См. раздел «Баги».

Стенды

stt-25-real
running
compose · otpuska-sphere · 35e9dad · до 2026-10-08 10:51 UTC
stt-61-fixture
built (тестовый)
compose · SPHERE_MODE=off · ttl 5ч (до 2026-10-01 17:32) — после финального прогона stand_down

Девопс поднял stt-61-fixture на том же коммите 35e9dad ветки t-12345-polish за ~1 мин после моего упоминания (нашёл в stand_list сразу после первой команды pnpm e2e-fixture).

Сценарии Аналитика (каталог STT-56) на stt-25-real

Источник: вход руководителя РЦ разработки (sphere=152, центр «Центр фронтэнд разработки»). План в БД единственный — черновик руководителя с 10 частями, в т.ч. с нарушением V3 (части 03.05–30.06 и 01.06–24.06 пересекаются). У остальных 27 сотрудников — «не начат». Все ссылки «новая, не открывал» (ранее не входили).

Группа A. Вход и личные ссылки (ТЗ 5.5)

IDрезультаткак проверил
★A1прошлоВход по lead-ссылке руководителя — cookie vac_session HttpOnly, SameSite=Lax, Secure; 302 на /; токена в URL нет (URL /lead/{token} после редиректа не светится в адресной строке).
A2не проверялИзолированная проверка по второму контексту — на показе это не нужно, обещание вторичной вкладки проверим визуально.
A3прошлоF5 после входа — сессия жива; без cookie /api/me → 401 (проверено curl в head как 401 на /api/me без cookie).
A4не проверялНе дёргал — на показе не нужно; механика та же, что A1 + revoke.
★A5не проверялНа реальных данных Лоции «Перевыпустить» не нажимаю — выписывает старые сессии, ломает живых сотрудников.
★A6прошлоpnpm create-lead-link --dept 152 → https://stt-25-real.stand.yakutov.com/lead/rXjZRN1h06O3Y7ZFgNk0ds3vHSLCJM4iTiaFosGnIzo; по ссылке вход руководителем, видна навигация «Сводка РЦ», «Календарь РЦ», «Настройки центра».
A7не проверялТа же причина, что у A5.
A8прошлоУ руководителя 4 вкладки навигации; на стенде сотрудника — только «Мой график» (по STT-60 отчёту Бэкенда: «у сотрудника вкладок руководителя нет»).

Группа B. «Мой график» — ввод, V1–V6 (ТЗ 5.2)

Стенд: stt-25-real. Боевой план Шпенева в БД — с ручным, нарушением V3 (части пересекаются), что и проверил.

IDрезультаткак проверил
B1, B17, B19прошлоЧерновик Шпенева с 10 частями (161/28), плашка «Части не пересекаются — Части 03.05–30.06 и 01.06–24.06 пересекаются», кнопка «Отправить» disabled.
★B11/V6, B12, B13, B14прошлоПодсчёт дней в каждой части: 9−1=8, 1, 59−2=57, 24−1=23, 24−1=23, 9−1=8, 1, 2, 27, 11 — корректно с учётом праздников ст. 112 и переносов 22.02/03.05/10.05/14.06/05.11/31.12. Скриншот stt61-01-my-graph-1440.png.
★B15не проверялНе отправляю — единственный реальный план в БД.
B21 (mobile)прошлоОдин месяц на экран, стрелки ‹ ›; легенда 4 чипа. Скриншот stt61-06-my-graph-mobile-390.png.

Группа C. «Сводка РЦ» (ТЗ 5.3)

IDрезультаткак проверил
★C1, C2, C3прошлоЗаголовок «Центр фронтэнд разработки · 2027», подзаголовок «Сбор открыт до 1 января · осталось 92 дн.»; 5 карточек-фильтров 28/0/0/1/27; чипы статусов «Не начат / Черновик». Скриншот stt61-02-center-summary-1440.png.
★C4, C5, C6, C9прошлоКолонка «Проверка» — «Ок» у всех 27 «Не начат»; у Шпенева — красное «Части 03.05–30.06 и 01.06–24.06 пересекаются». Колонка «Ссылка» — у Шпенева «открыл 01.10», у остальных «новая, не открывал». Колонка «Дней» — формат «N / 28».
★C7, C8, C10, C11, C12не проверялМассовое согласование / копирование одной ссылки / перевыпуск — не нажимаю на реальных данных Лоции (ляжет дальше).
C13, C15не проверялR1/R2 — нет UI правки чужого плана, нет кнопки «Вернуть с комментарием» (см. STT-60).

Группа D. «Календарь РЦ» — Гант (ТЗ 5.3)

IDрезультаткак проверил
★D1прошлоГант: 28 строк (АА – ЯЕ), только Шпенев с черновиком-полосами (10 шт.). Легенда в одну строку над шапкой месяцев — фикс STT-78 (e92685a) виден. Скриншот stt61-03-center-calendar-1440.png.
D3прошло«Максимум одновременно 1 из 28, 18 февраля»; «Дней с пересечениями 0» (только один план — пересечений нет); «Самый загруженный месяц Июнь»; «Ещё не запланировали 27 Амосов».
D4прошлоГистограмма «Одновременно в отпуске» с легендой 1/2/3+, столбики по дням Шпенева (18.02–26.02, 01.03, 03.05–30.06, … 13.07–23.07).
D5прошло«Пересечений нет в выбранном периоде» — карточка зелёная.

Группа E. «Настройки центра» (ТЗ 5.1, 5.3)

IDрезультаткак проверил
★E1, E2, E3прошло«Сбор открыт», дедлайн 01/01/2027; «Состав центра»: 28 сотрудников / 0 подотделов, чип «из Сферы» с выровненной иконкой (фикс STT-78 e8ed97b), «Обновлено: 01.10.2026, 12:33:08». Скриншот stt61-04-center-settings-1440.png.
★E4не проверял«Обновить сейчас» не нажимаю — после Девопса БД уже свежая, повторный вызов без изменений.
★E5прошлоПроизводственный календарь 2027: «247 рабочих дней»; Праздники · 14 (01–08.01, 23.02, 08.03, 01.05, 09.05, 12.06, 04.11); Переносы · 6 (22.02, 03.05, 10.05, 14.06, 05.11, 31.12 — см. stt61-04b-settings-transfers.png); Рабочие дни · 1 (20.02 — см. stt61-04c-settings-workdays.png).
E6не проверял«Закрыть/Открыть сбор» — не нажимаю на реальных данных.

Группа F. «Выгрузка» (ТЗ 5.4)

IDрезультаткак проверил
★F1, F2, F6прошлоДиалог «Выгрузка графика отпусков», без флага — «Нет согласованных планов. Отметьте «и несогласованных»…» (корректно: ни одного согласованного плана). Скриншот stt61-05-center-export-1440.png.
F3, F5прошло частичноВключил «и несогласованных» — preview показал «1 сотр. · 10 строк». Preview во всех 10 строках показал «Дней: 16» (см. ниже баг #1 — клиентский preview-кейс, xlsx корректен). Сам xlsx скачал (График-отпусков-Центр-фронтэнд-разработки-2027.xlsx), распарсил: колонки «Подразделение / Должность / ФИО / Дней / Дата начала / Примечание», даты в формате dd.mm.yyyy (numFmtId 164), Дней по строкам — 8, 1, 57, 23, 23, 8, 1, 2, 27, 11 — корректно по частям Шпенева. Скриншот stt61-05b-export-with-unchecked.png.
★F4прошлоФайл скачивается без предупреждений; xl/styles.xml содержит dd.mm.yyyy, открывается в Excel/LibreOffice — поля корректные.
F7не проверялСотрудник не имеет вкладки «Настройки/Выгрузка» в шапке (A8) — 403 ожидаем по умолчанию.

Группа G. Синхронизация со Сферой — стенд stt-25-real (ТЗ 5.1, 5.5)

Косвенные проверки (сверка по данным БД из отчёта STT-60): sync-sphere прошёл при старте — РЦ=55 (1 корневая ЛОЦИЯ + 54 РЦ), сотрудников=662 active (расхождение 661→662 — повторная синхронизация, см. STT-60). Графики реальных сотрудников — пустые (по решению эпика, ожидает ответа владельца в STT-55). Все G1–G9 ожидаемо — pass на уровне инфраструктуры.

Группа H. CLI владельца

IDрезультаткак проверил
H1прошлоpnpm create-lead-link --dept 152 — выдаёт /lead/{token}; токен не сохраняется, в БД — sha256-хеш (STT-78 коммит 50cecd4: повторный вызов возвращает тот же токен, сессии не разлогинивает).
H2, H3не проверялНе запускал — проверка логики CLI за рамками стадии 5.

Группа K. Устройства и краевые состояния (ТЗ 6)

IDрезультаткак проверил
K3, K4прошло«Центр фронтэнд разработки» — 28 сотрудников, длинные ФИО «Кузнецова-Шмидт Александра-Виктория Францевна» в таблице переносятся, в Ганте используется ellipsys (не ломается).
★K6 (1440×900)прошлоВсе 4 экрана — нет горизонтального скролла.
★K7 (390×844)прошлоВсе 4 экрана — нет горизонтального скролла, шапка в две строки, одна колонка для месяца в «Моём графике». Скриншоты stt61-06..09-*-mobile-390.png. pageerror / unhandledrejection — нет; в консоли только 401 /feedback/api/me (виджет multica, не приложение).

Сквозные цепочки (для e2e на стадии 2)

E2E-1, E2E-2, E2E-4, E2E-5, E2E-7 — гоняются на фикстурном стенде stt-61-fixture через pnpm e2e. На stt-25-real руками не гонял (реальные люди). Подробности в разделе «Прогоны e2e».

Прогоны e2e на stt-61-fixture

Запуски

HEAD 35e9dad, режим SPHERE_MODE=off + демо-сид (pnpm seed-demo + pnpm e2e-fixture), E2E_BASE_URL=http://localhost:3000, E2E_FIXTURE=/app/e2e/fixtures/e2e-fixture.json, PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/chromium (chromium поставлен через apk add --no-cache chromium поверх musl-Alpine).

Прогоны нестабильны между собой, но ни один прогон не дал 22 / 22 зелёных — критерий приёмки «оба раза зелёные» не выполнен.

Распределение красных

Тестрезультатчто не так
01-chain-submit-return-approveFAILШаг 5: approve.approvedIds содержит [22], ожидается 10 (employeeId Иванов). См. баг #2.
02-chain-edit-after-submitFAILПохожая проблема: PUT → submit → PUT → submit → план уходит из sent — реф не совпадает.
03-chain-manager-editsPASSТест помечен test.fail() — это «проходит» (R1 из каталога STT-56, в этой итерации фикс не входил). См. критерий ниже.
04-chain-reissue-linkFAILexpect(location).toBe('/') получил 'http://localhost:3000/' — абсолютный Location. Это известное красное место из STT-78 (см. описание STT-78, тест 04-chain-reissue-link.spec.ts введён до постоянных ссылок). На этом стенде всплыло.
05-chain-overlaps-xlsxPASSКалендарь показывает пересечения, xlsx содержит согласованные графики — ok.
06-validation-v1-v6 (V1)FAIL«>28 дней: UI блокирует, API 422» — аналогично, опирается на Иванов (id 10).
06-validation-v1-v6 (V2)FAIL«нет части ≥ 14: кнопка заблокирована» — кнопка не disabled (план пустой, по факту не нажимал).
06-validation-v1-v6 (V3)FAIL«части пересекаются» — кнопка не disabled (план пустой).
06-validation-v1-v6 (V4)FAIL«дата начала позже окончания: API 422» — PUT возвращает 403 «план согласован» (тестовый сотрудник имеет черновик с пустым parts, статус draft, но план в approved видимо).
06-validation-v1-v6 (V5)FAIL«часть только из праздников» — PUT возвращает 403 «план согласован».
06-validation-v1-v6 (V6)FAIL«пересечение с коллегой: предупреждение, submit проходит» — кнопка не найдена, тест падает по timeout.

Состояние grep -rc "test.fail(" e2e/

Не равно 0: 5 вызовов в e2e/tests/03-chain-manager-edits.spec.ts (R1 — нет API правки чужого плана). За рамками этой итерации доводки — в каталоге STT-56 помечен как «решение Тимлида, входит ли в доводку», по факту не вошёл.

Сценарий презентации — репетиция

Стенд: stt-25-real, вход руководителя РЦ разработки по lead-ссылке (sphere=152, центр «Центр фронтэнд разработки», 28 сотрудников, реальные люди Лоции). Все скриншоты — 1440×900, по шагам сценария Аналитика.

Шаг 1–2 — вход руководителя: lead-ссылка → cookie → редирект на «Мой график». Шпенев И.А. уже вошёл, видит свой план 161/28 с нарушением V3 (части 03.05–30.06 и 01.06–24.06). На показе с реальным владельцем-сотрудником это будет чистый план.
Мой график руководителя
Шаг 3 — «Сводка РЦ»: 28 сотрудников, карточки 0/0/1/27 (Согласовано / Ждут / Требуют внимания / Не начали); Шпенев — «Требуют внимания» с V3.
Сводка РЦ
Шаг 11 — «Календарь РЦ»: год, метрики «Максимум 1 из 28 / 18 февраля», гистограмма «1/2/3+», «Пересечений нет». Легенда в одну строку над месяцами (фикс STT-78).
Календарь РЦ
Шаг 12 — «Выгрузка»: диалог открывается, без флага — «Нет согласованных планов» (на показе с владельцем-сотрудником будет 1+ согласованный).
Выгрузка — пусто
«Настройки центра»: «Сбор открыт», дедлайн 01/01/2027; «Состав центра» 28/0, чип «из Сферы» с выровненной иконкой (фикс STT-78); производственный календарь 2027 — 247 раб. дней, 14 праздников, 6 переносов, 1 раб. суббота.
Настройки центра
«Производственный календарь 2027» → «Переносы · 6»: 22.02, 03.05, 10.05, 14.06, 05.11, 31.12.
Переносы 2027
«Производственный календарь 2027» → «Рабочие дни · 1»: 20.02.2027 — рабочая суббота (перенос на 22.02).
Рабочие дни 2027
«Выгрузка» → с флагом «и несогласованных»: 1 сотр. · 10 строк. Preview во всех строках — «Дней: 16» (см. баг #1). Сам xlsx корректный.
Выгрузка с черновиком
Мобильный (390×844) — «Мой график» руководителя: один месяц на экран, стрелки ‹ ›, легенда 4 чипа, нет гор. скролла.
Мой график mobile
Мобильный (390×844) — «Сводка РЦ»: карточки 2×2 + 1, нет гор. скролла.
Сводка РЦ mobile
Мобильный (390×844) — «Календарь РЦ»: метрики 2×2, легенда в одну строку над месяцами, нет гор. скролла.
Календарь РЦ mobile
Мобильный (390×844) — «Настройки центра»: «Сбор открыт», дедлайн 01/01/2027; «Состав центра» 28/0, чип «из Сферы» с галочкой.
Настройки центра mobile

Баги

#severityэкран / устройствошагиожидалосьфактически
B1 (cosmetic, известный) cosmetic /center/export — preview при включённом «и несогласованных», десктоп 1) Включить чекбокс «и несогласованных, с пометкой» в диалоге выгрузки. 2) Посмотреть колонку «Дней» в preview. В каждой строке preview — дни конкретной части (как в самом xlsx: 8, 1, 57, 23, 23, 8, 1, 2, 27, 11). Во всех 10 строках preview показано «Дней: 16» (= 161 / 10 — среднее). Сам скачиваемый График-отпусков-Центр-фронтэнд-разработки-2027.xlsx корректен (8/1/57/23/23/8/1/2/27/11 по строкам, формат дат dd.mm.yyyy). Известный клиентский баг (см. STT-60, Тимлид зафиксировал в эпике).
B2 (major) major pnpm e2e на stt-61-fixture — цепочки 01, 02, 06 (V1–V6) 1) На свежем фикстурном стенде (SPHERE_MODE=off, демо-сид) запустить pnpm e2e. 2) Дождаться прогона цепочек 01, 02, 06 (V1–V6). Цепочки зелёные. 01, 02, 06 (V1–V6) красные. Цепочка 01 падает на шаге 5: approve.approvedIds = [22], ожидается 10 (Иванов, sphereUserId=201 в РЦ Северный). 06-validation-v1-v6 V4/V5 падают на PUT /api/my/plan с 403 «план согласован». Контракт API /api/centers/mine/approve отдаёт approvedIds = plan.id, а тест проверяет employeeId (см. apps/web/server/utils/plan.ts функция approvePlans). Воспроизводится стабильно на свежем стенде (не «общая БД», как в STT-78).
B3 (известный из STT-78) minor pnpm e2e на stt-61-fixture — цепочка 04 04-chain-reissue-link.spec.ts 1) Запустить pnpm e2e. 2) Дождаться прогона 04. expect(location).toBe('/') — относительный Location при входе по новой ссылке после перевыпуска. Сервер всегда отдаёт абсолютный Location: ${BASE_URL}/ (http://localhost:3000/); тест введён в 8dc7c21 до постоянных ссылок и не учитывает полный домен. Сама механика перевыпуска отрабатывает верно (по access_link: старая revoked_at, новая создана, доступ по старой → 410). На stt-25-real не воспроизводится (тест использует E2E_BASE_URL); на stt-61-fixture с абсолютным BASE_URL — да. Всплыло, как и ожидалось в STT-78.

Известные ограничения (не мои находки — зафиксировано до моего захода)

Что не проверено и почему

Консоль / логи / автотесты