WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-019 · Дефект · Вход · web

[eyes] Age-confirm после деплоя роняет сессию: подтверждение 18+ → редирект /login → гостевая пустота

Закрыт P2 ведёт: —
Суть
Приёмка 11.08 ~09:45 (после кумулятивного деплоя 8ecdf2e): в залогиненной сессии всплыл age-gate; после подтверждения — редирект на /login, затем возврат на главную уже ГОСТЕМ («No notebooks yet»), прямые URL тетрадей 404. Бэкенд при этом здоров (health/login 200, API-прогоны идут). Похоже на семью CODE90 (agegate stale-session trap): age-confirm флоу не переживает смену билда и роняет куку вместо переустановки. Репро: активная сессия + деплой → открыть тетрадь → age-confirm → logout.
Доказательства
[2026-08-27 03:20Z] web019age в очереди A1: корень падения сессии на age-confirm после деплоя + фикс + негатив.
[2026-08-27 06:20Z] WEB019 DONE: fix(auth) preserve session after age affirmation — age-affirmation route + тесты (route/staleClaimHealing/reaffirm-callback), коммит 484a6e69 (A1 wt-web019). Волна пережила убийство её самовольного next build (сборка для задачи не нужна). -> review.
[2026-08-27 20:29:19Z tickacc5] ВЕРДИКТ: частично доказано
Что проверил: открыл WEB019-REPORT.md; проверил commit 484a6e69/l58 base; сверил route/JWT regression 25/25, eslint/type-gate и local negative cases.
Что увидел: regression покрывает один cookie и сохранение sub/sessionId; ageConfirmed=false и dead/mismatched session дают ожидаемые отказы. Commit/report относятся к l58, current l61 authenticated route/deploy не предъявлен; session/DB не создавал, production не мутировал.
Отрицательный тест: local harness ageConfirmed=false возвращает 400 без consent/cookie, dead/mismatched session 401; positive current deployed reload/dashboard trace отсутствует.
Чего не хватает: current l61 deployed commit receipt и authenticated positive POST → reload/dashboard trace.

[2026-08-27 ~22:56Z ПОСАДКА l63 — ВЫШЛО НА ПРОД]
Релиз: /home/pi/note-clone/releases/arm64-l63-20260827T225328Z, коммит 0a4f8c87f993bd7ecb30860ed25bb029407c3286, артефакт sha256 aa07b977553c20cb0abafd8fe51771c67399dda864997c86b3e24d7073cbc6cc (207 404 319 байт). Каталог запуска /home/pi/note-clone/shared/run/l63-0a4f8c87. Откат: /home/pi/l62-standalone-artifact.conf.rollback.
Сборка прошла ВСЕ гейты. Родословная: предыдущий прод b3b03cfd (l62: роли + движок Gate D) — ПРЕДОК, проверено merge-base до сборки; следовательно движок и роли НЕ откачены. Паритет флагов: 37 ключей NEXT_PUBLIC_*, расхождений 0/0, отдача JS 1126 — ровно как в l62; GATED_WRITER вшит "1", SHADOW_W1 "0", тёмные семейства MUTATING_AI/COLLAB — 0 совпадений.
СЛЕД В БАНДЛЕ ДОКАЗАН ДЛЯ ВСЕХ ЧЕТЫРЁХ (отдельный гейт: нет следа = провал сборки): движок (nonbreakingspace ×8, insertionOffset ×8, insertedText ×4); WEB-390/391 (factcheck.verdict.sourceCount.one, sourceCountLabel, «based on {count} source»); WEB-019 (age-affirmation в странице/маршруте/middleware, «stale age claim» ×2); WEB-024 (editor-actions и «Admin defaults preview spec has no model-route registry entry»).
Подпись: локально ключом owner (доверенность 26.08), отпечаток 0b83e0d3… сошёлся; verify — позитив PASS + два негатива (подмена artifactSha256, перевёрнутый байт подписи) отвергнуты.
Доставка: VM -> M4 -> M1 -> Pi, sha сверена на всех четырёх хопах.
ПРОВЕРКА ПОСАДКИ: systemctl active; /api/ready/paid = ok, paidReady=true, enforce_ready, failures=[]; /api/db/health 200; метка sw.js ИЗ ПРОЦЕССА v4-0a4f8c87 == НА ДИСКЕ v4-0a4f8c87; публичный https://nb.wool2.online/sw.js = v4-0a4f8c87, health 200. Посадка прошла С ПЕРВОГО РАЗА.
УРОК: сплошная сверка каталога запуска поймала МОЮ СОБСТВЕННУЮ ошибку — регулярное выражение ключа `[A-Z_]+` не ловит имена с цифрами, поэтому строки SPEND_*_SHA256 молча не проверялись (печаталось 2 значения вместо 7), а сверка при этом выглядела зелёной. Исправлено на `[A-Z0-9_]+` + обязательный вывод «всего проверено: N». Записано в память.
Починено в
484a6e69
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-019","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-27T22:57:03.226Z