> Входная инженерная сверка. Независимый review готового прототипа опубликован отдельным документом. Native-реализация ожидает разрешения Owner. # #522 — Native readiness, инженерная сверка 08.11.2026 Read-only. Никаких source/lease/SDK install/build/credentials/PROD операций. Источник: HEAD1e4d4cb52a305a384fe925c51855b5db8828e361; GitHub dev и публичный /v1/meta совпадают360e308199da1fd58afda631cef9e432c427ff07, API0.40.0. Parent доказал tree equivalence. Live auth methods: vk/yandex/email available=true. Отправка писем/реальный OAuth/device login здесь NOT_TESTED. ## Факты и переиспользование |Категория|Факт/действие| |---|---| |Есть, переиспользуем|HTTPS API: города/площадки/игры/профили, серверные вместимость/права/attendance/reviews/Cases; identities, ролевые предпочтения push и события/outbox; тексты/tokens/допустимые assets. Не переносить ORM/server-only secrets.| |Есть в web, адаптируем|Cookie+CSRF OAuth, email-коды, returnPath/drafts; DOM/Next→native presentation заново. Web MapLibre GL JS+pmtiles.Protocol→native binding. WebPush endpoints/SW→native APNs/FCM delivery. Общие account UUID сохранить, auto-link по email запрещён.| |Новая mobile реализация|В apps/mobile только README: нет package.json/app config/Expo Router/app sources/native projects/builds. Нужны navigation, safe areas/keyboard/a11y, secure credentials, verified links, native auth exchange/rotating refresh, device binding и native UI.| |Owner/external|Концепция/MVP; iOS4.8 path; юридический оператор/страны/каналы; Apple Developer/Play roles/IDs/signing/macOS builder. Доступы NOT_VERIFIED, не «отсутствуют».| Контрольные пути: docs/platforms/IOS_ANDROID.md:3 TECH_SELECTED RN+Expo Router; apps/mobile/README.md:3 отсутствие проекта. docs/integrations/AUTH.md Native flow — целевая спецификация, не поставка. apps/api/src/auth/auth.controller.ts:22–55 предоставляет providers/start/callback/logout; start вызывает startBrowserAuth. В текущем auth source нет native handoff/exchange/refresh route: grep native/handoff/refreshToken находит лишь provider adapters (refresh provider не application refresh). Это блокер M2, не готовая функция. Email существует: email-auth.controller.ts:9–45 методы/challenge/resend/verify; email-auth.service.ts:69–79 требует allowlisted WEB Origin и browser binding, а успешная проверка использует собственную browser session. Нельзя просто вызвать из RN и назвать готовым native login; необходим согласованный handoff либо отдельный native-bound challenge+exchange без ослабления Origin/CSRF. UI показывает только доступные actualmethods, не password/SMS/Apple/Google. Устройства не получают provider client secret. Удаление: controllers не содержат account deletion endpoint по адресному поиску; найденные удаления заметок/looking не являются удалением User. Политику/cleanup-comments нельзя считать серверным self-service механизмом. #461 переиспользовать, провести адресную verification перед Store; не утверждать полный аудит всех deletion путей. ## Проверенная связка и технические spikes Официальный registry npm /expo/latest на дату проверки:58.0.23; его опубликованный bundledNativeModules.json: React19.3.0, RN0.88.1, ExpoRouter~58.0.30, screens~4.30.1, SecureStore~58.0.2, Notifications~58.1.8. Получено чтением tarball в памяти, без установки. Это **кандидат совместимой baseline**, не lockfile/BUILD_READY. При M1 фиксировать exact package lock и expo install/doctor, проверить MapLibre/configplugins на этой NewArchitecture; старую стабильную SDK допускается выбрать только при доказанной native несовместимости с текущей. Не подменять свежую связь устаревшим SDK56/RN0.85 из поискового сниппета. MapLibre RN официально оборачивает Native Android13.6.1/iOS6.31.0, RN≥0.80, v11 NewArchitecture-only. JS addProtocol из GamesVenueMap.tsx:48 не переносим. Native PMTiles существует (официальный Android doc), нужен точный RN binding/configplugin build-spike ОБЕИХ платформ: absolute pmtiles://https URL, Range/206/CORS/TLS, glyphs/sprites/style compatibility, реальные московские/СПб/региональные archive, selected city/filter/pins/gallery attribution. Нет доказательства, что конкретный текущий набор уже отрисован native. Не нужен новый backend/каталог/тайловый сервис без реального blocker. Push: Expo Notifications позволяет Expo Push Service (дополнительный processor/receipts) или native token→direct APNs/FCM (больше собственных credentials/protocol handling). Рекомендация для DEV: ограниченный Expo development-build spike, затем выбрать транспорт после privacy/credential/access сверки; платная подписка не обязательное условие. Существующий outbox/event policy/dedupe/preferences переиспользуются; новые native device registration/token ownership/revocation/delivery adapters. OS grant ≠ серверная подписка ≠ согласие на все типы. Logout/account switch удаляют прежнюю binding, старый tap повторно проверяет доступ, нейтральный lockscreen текст. Физическое iPhone/Android delivery NOT_TESTED. Ссылки: Associated Domains+AASA; Android intent-filter+assetlinks и signing fingerprints. HTTPS game/profile fallback; auth transaction PKCE handoff + allowlisted redirect; persist только безопасную intended destination и незашифрованный несекретный draft. После входа reread актуального объекта, explicit confirm перед mutation. Deferred deep link через store install отдельно DEFERRED, обычный universal link этого не гарантирует. OAuth системным браузером, отдельный native verifier, short-lived one-use code, access в памяти, refresh в Keychain/Keystore. Revoke/replay family/server rights и account-switch очищение приватных query caches. Не использовать WebView/копирование cookie браузера/токены в URL. Email collisions не связывают accounts автоматически. Apple4.8: при social primary login нужен эквивалент с предписанными privacy-свойствами либо применимое исключение. Предложенный путь — Owner одобряет отдельный Sign in with Apple slice при сохранении VK/Яндекс/email. Альтернатива — определить и обосновать полноценный first-party-only iOS login path и его compliance, не просто спрятать socialкнопку при server-side auto-link. Email-code сам по себе не доказывает 4.8 compliance. Apple approval не гарантируется. Не рисовать Apple как работающий provider до backend/Developer setup. ## Последовательность после одобрения концепции |Этап|Пользовательский результат / scope / новое|Зависимости и reuse|Проверка и завершение / Owner| |---|---|---|---| |M0|Согласован первый путь и ограниченный MVP; UX prototype + auth/maps feasibility решения|Current StyleGuide/Astra; #522/#461|DESIGN_APPROVED только Owner; engineering review не approval. Решить вариант концепции/MVP/iOSlogin/каналы; не покупать аккаунты| |M1|Android/iOS development app запускается, guest город→реальная игра/площадка|Expo baseline, Router, IDs/build profiles, existing public API; собственная mobile shell/query layer|SOURCE_READY после QA; BUILD_READY отдельно по platform artifacts/signatures/install receipt. Android Linux feasible при установленном toolchain; iOS requires macOS/Xcode или согласованный builder. ExpoGo/typecheck недостаточно| |M2|Новый/старый аккаунт входит и возвращается к той же игре без auto-submit|Native broker/exchange/refresh, secure storage, actual methods; link setup|Code expiry/replay/state/redirect/account collision/cancel/restart/offline/logout/revoke tests+dev builds; DEVICE_TESTED только реальные устройства. Owner Apple4.8+аккаунты| |M3|Найти игру→условия→явная заявка→реальный serverstatus|M1+M2, existing game commands/idempotency/capacity/rights|Concurrent last-seat, doubletap, terminal/private404, stale conditions, timezone, accessibility; actualDEV receipts без fake confirmations| |M4|Выбранный первый native scope: MyGames/profile, затем messaging/maps/push/Postgame по приоритету|Существующие APIs/events; новые RN views/native adapters; current moderation contracts|Отдельные узкие срезы, каждый QA/build/device where available. Рекомендация firstMVP discovery+venues+auth+join+MyGames/basicprofile; chat/maps/push включать только как явно выбранные Owner release blockers, полный webparity не обещать| |M5|Установка на Android и iPhone, private internal distribution|Signing/Developer roles, macOS builder, testers, device availability|Cold/warm links, keyboard largefont VoiceOver/TalkBack, denied/approximate location, notifications/photo limited access, slow network, account switch. TestFlight/Android testing через отдельное разрешённое распространение, не publiclaunch| |M6|Проверяемая Store readiness|#461 operator/privacy/support/deletion/age/UGC/reports/block/review access; actual server deletion remediation if needed|AppPrivacy/DataSafety/permission strings, no secrets logs, accepted store review config. STORE_READY только allgates evidence; публикация отдельный OwnerGO| Первые реальные задачи после M0: (1) Expo workspace+Android/iOS dev build; (2) native broker/exchange/refresh contract+secure storage; (3) verifiedlinks+auth destination restoration; (4) guestpublic discovery with honest empty/manualcity; (5) explicit join/serverstatus. Map/nativepush spikes — отдельные bounded tests внутри выбранного M4, не новый продуктовый train. Критический путь: concept/MVP approval → native foundation+builder → native auth/session → full game path → physical device proof → store/operator/privacy gates. Ни сроки, ни стоимость без фактических аккаунтов/build measurements не оценивались. ## Статусы и внешние зависимости DESIGN_APPROVED=PENDING Owner; SOURCE_READY=NOT_IMPLEMENTED (mobile README-only); BUILD_READY=NOT_BUILT обеОС; DEVICE_TESTED=NOT_TESTED; STORE_READY=NOT_READY. Android SDK/Xcode/macOS/signing/store roles не инвентаризировались через credentials; availability UNKNOWN, запросить у Owner только после выбора направления. Нет claims о binary, SMTP delivery или native OAuth success. ## Первичные источники, проверены 08.11.2026 - https://registry.npmjs.org/expo/latest и опубликованный dist tarball bundledNativeModules.json (наблюдение выше); https://docs.expo.dev/versions/latest/ - https://maplibre.org/maplibre-react-native/docs/setup/getting-started/ - https://github.com/maplibre/maplibre-native/blob/main/platform/android/docs/data/PMTiles.md - https://docs.expo.dev/push-notifications/overview/ - https://developer.apple.com/app-store/review/guidelines/#login-services (4.8; также UGC/account-deletion sections) - https://developer.android.com/develop/ui/views/notifications/notification-permission (Android13 runtime POST_NOTIFICATIONS; отказ не ломает core) - https://support.google.com/googleplay/android-developer/answer/13327111 (in-app и web deletion route) Наблюдались документация/публичные HTTP GET/source, не установленные сторонние приложения. Дополнительные HIG/permissions сценарии покрывает отдельный Astra дизайн; независимая UX/product QA и инженерная проверка конкретных макетов ещё обязательны. Этот файл — вход для них, не self-approval. ## Addendum: минимальный профиль и первое полезное действие |Поле/действие|Реальный обязательный минимум / что НЕ требовать в onboarding|Source evidence| |---|---|---| |Публичное имя|Новый PUBLIC social profile всегда получает безопасное «Игрок»: safeAutogeneratedPublicDisplayName игнорирует provider/account displayName (MOD-V2-A). Private users.display_name может содержать provider name; не копировать его в public. Email также создаёт safe «Игрок», не mailbox. Пользовательская ручная анкета имени не является обязательным шагом самого auth. Предложить изменить безопасное имя позже/в контексте действия; не публиковать email.|identity.service.ts:85–89,121–124 (private account); email-auth.service.ts:336–344; profiles/social-profile-defaults.ts:19–24,48–53,80–85 (public)| |Город|Social profile cityId nullable, provisioning input optional. Manual discovery city сохраняется как выбор каталога, не создавать обязательную запись профиля/не заменять молча Москвой.|social-profile-defaults.ts:85; profiles.service.ts:1203| |Уровень|Профиль level nullable; отсутствует обязательный level/profile-completion gate в request participation. Помощь — добровольная самооценка существующего продукта, не verified rating.|profiles.service.ts:1205; participations.service.ts:120–323| |Фото|Не требуется provisioning/auth/request participation. Инициировать system file picker только при добровольном выборе; moderation существующего media pipeline сохраняется.|identity.service.ts:95–108 nullable provider avatar; request signature participations.service.ts:120–127 не содержит фото| |Первая заявка|Реальная authenticated mutation: session+cookie/CSRF для текущего web, idempotency-key, expectedGameVersion≥1, доступ/модерация, published, deadline ещё открыт, игра не началась, существующий participation/terminal state. Ответ pending/confirmed определяется сервером; подача не гарантирует место. Native должен получить собственный разрешённый auth contract, не подделывать web cookie headers.|participations.controller.ts:41–64; participations.service.ts:128–185,194–323. Фото/город/уровень не добавлять как выдуманные blockers| |Создание игры|Не общий onboarding gate: в контексте create нужны actual venue/activity, hostDisplayName1–160, нормализованный публичный контакт, timezone/time/deadline/capacity/levelRule/settlement. У игры собственное имя организатора и условия; это не требование заполнить всё в публичном профиле.|games.service.ts:1384–1515; createDraft:284+| |Видимость и ЛС|Новый active social profile: directory_visible=true, contact_policy='requests'; ON CONFLICT DO NOTHING сохраняет пользовательский opt-out. «ЛС включены» означает разрешённый существующий request-based contact flow, не открытый прямой чат с любым. Не изображать requests как closed и не превращать consent в unlimited messages.|social-profile-defaults.ts:89–121; profiles.service.ts:1207–1212| |Radar|radarConsented=false в пустом профиле и при default insert; OS location permission отдельно, автоматического RadarON после регистрации нет.|profiles.service.ts:383–388,1211–1213| Это адресная инженерная сверка фактических контрактов и вход для дизайнера. Проверка готовых сценариев Astra будет инженерным review реализуемости; она НЕ SOURCE_READY, BUILD_READY или DEVICE_TESTED и не заменяет реальный native binary/device login.