WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-071 · Задача · Инфраструктура · web

[GATE-3] Invite-gate: включить на проде (env+миграция) + негативный прод-пробник

Закрыт P1 · важно ведёт: —
Суть
inviteGate.ts реализован, 6/6 PASS, wiring в register/route.ts есть, НО isInviteGateEnabled() default-OFF везде; включение = INVITE_GATE_ENABLED=true + миграция. Скрин-волны 20.08 подтвердили: /register invite-only UI-стеной, но onboarding Skip открывает анонимный workspace — проверить, считается ли это «публичной регистрацией» по критерию гейта. ОСТАЛОСЬ: env-флип + migrate на Pi (dev, default-yes), негативный пробник (регистрация без инвайта → отказ), receipt.

Эпик: WEB-282. Норматив: PROD-MIGRATION-PLAN-R4.md §7. Аудит-срез: M4 MIGAUDIT-REPORT.md (20.08). Owner 20.08: «по гейтам дожимайте все до конца».

## 21.08 ГЕЙТ 3: ПРИЁМКА НЕВОЗМОЖНА — ГЕЙТ ВЫКЛЮЧЕН НА ПРОДЕ ⚠️
Фактическое состояние снято с прода: `INVITE_GATE_ENABLED` UNSET → детерминированно null → гейт выключен. Доказательство статическое (env + байты), волна сознательно не гоняла живую регистрацию, чтобы не плодить мусорные учётки — при UNSET ветвлений нет.
⚠️ ОТДЕЛЬНАЯ НАХОДКА: выставить `INVITE_GATE_ENABLED=true` САМО ПО СЕБЕ гейт не включит (подробности в отчёте) — то есть «включим флаг перед запуском» не сработало бы. Это ровно то, что гейт и должен был выявить ДО открытия трафика.
ОСТАЛОСЬ: (1) починить включение по флагу; (2) включить на проде; (3) живой негативный пробник регистрации без инвайта; (4) проверить обход через onboarding Skip (скрин-волны 20.08 показывали анонимный workspace).
Источник: волна gate3579, отчёт M4 `/Users/milamarty/work/GATE3579-REPORT.md` (21.08). Эпик WEB-282, норматив PROD-MIGRATION-PLAN-R4.md.

## 21.08 — ВЫЕХАЛО НА ПРОД
**Посадка 30 состоялась 21.08 03:53 IST.** serving = `v4-504af77f`, релиз `arm64-504af77f-20260821T025311Z`, артефакт sha `a0afc41415db60377aeb4cf399d91b98a4c407217fc8839b0b1369a2542af362`, аттестация v18. Проверено после переключения: `active`, `NRestarts=0`, `paidReady=true`, `posture=enforce_ready`, `mode=enforce`, `failures=[]`, фатальных строк boot-контракта **0**, секрет сторожа файл≡процесс (`cbabe4a2b16008e3`), nft переприменены, канон проштампован (`CANON.json: serving=504af77f marker=v4-504af77f`).
Проверка байтов релиза и живая проба выполнены после переключения; подробный трейл посадки — в WEB-282.

## 2026-08-23 BOARDSWEEP: DEAD-SOUL-CLAIM
- Evidence: updatedAt=2026-08-21T02:55:35.615Z, older than 24h; gate3579 is archived and no active invite-gate wave/process is present. Candidate for return to todo; status unchanged.
- buildFixed: <empty>; canonical: v4-081ff4fb5 / 081ff4fb5f6110f8001daec7ed910ccef2e395dc.
- Status preserved by sweep: in_progress.
Доказательства
[24.08 ~00:15] ВКЛЮЧЁН по owner-решению (voice 23:04): INVITE_GATE_ENABLED=true в shared/.env.local, restart, paidReady=true. Миграция 20260810120000_invite_code_gate уже была в схеме (InviteCode=0, AccessRequest=0 строк — таблицы есть). НЕГАТИВНЫЙ ПРОБНИК (валидные MX/пароль/возраст): без кода → 403 invite_code_required; с левым кодом → 403 invite_code_invalid; User НЕ создан (0 rows). Логин-путь инвайтом не гейтится (register-only; возвращающиеся юзеры логинятся свободно — ответ на вопрос owner). Осталось (owner визуально + возможно тикеты): /admin/invite-codes генерация UI, полный happy-path регистрация по коду, публичная форма «запросить доступ» на /register (в коде есть admin access-requests + eu-waitlist; наличие public-формы на регистрации не подтверждено). Родня: WEB-282 (эпик), WEB-320. Owner-notify: 13114.

[24.08 16:20] Owner-приёмка живьём (24.08 00:37-00:46): инвайт-гейт работает (генерация кодов в /admin/invite-codes, регистрация по коду, used up/revoked статусы — скрины в чате). Найденные при приёмке смежные баги (письмо молча не шлётся + врущая ошибка логина + лишнее 2FA-поле) вынесены в WEB-345/346 и ИСПРАВЛЕНЫ посадкой 41 (+грейс-период по решению owner). Гейт-функция принята де-факто. Кандидат на closed.


[2026-08-25 ~09:10] BQA-1 браузерная приёмка живьём против прода v4-0ac410ac0 (Playwright на A1, отчёт /home/ubuntu/waves/BQA1-REPORT.md, скрины bqa1/shots/, консоль-логи console-WEB-NNN.log): WORKS — негативный пробник: регистрация БЕЗ инвайта отклонена, пользователь НЕ создан. Инвайт-гейт enforcing живьём → done.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-071","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-25T00:13:49.703Z