Статус-машина инвайта (pending→accepted|declined|revoked|expired,
declined_at миграция, прецеденс терминалов над TTL); AllowAny preview с
маскированием емейла и scoped-троттлом (INVITATION_THROTTLE conf);
decline (email-match, row-locked); claim → auth.issue_login_grant
(create_if_missing, language из Accept-Language; инвайт не consumed —
accept отдельный осознанный шаг; auth недоступен → честный 503, не
degrade). Письмо-линк → {FRONTEND_URL}/invite/{token}.
TokenPathNoLogMixin: Django log_response светил токен в request.path на
любом 4xx — заглушено точечно, гейт-тест по caplog.
226 passed (+30), contract/i18n/ruff/migration-lint чистые.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>