# #522 — последовательный план Android / iOS Основа: React Native + Expo / Expo Router, `TECH_SELECTED`. Сравнение Flutter/WebView не требуется. Концепция A рекомендована, DESIGN_APPROVED=PENDING. До Owner approval не запускается author, не создаётся Expo source и не меняется web. Существующий продуктовый train продолжается. ## Текущее положение Проверенная read-only source alias: local HEAD `1e4d4cb52a305a384fe925c51855b5db8828e361`, tree `ca63d3708ed21aaaab41263c0d6ed7daefaca208`; принятый DEV / GitHub dev `360e308199da1fd58afda631cef9e432c427ff07` имеет тот же tree. Это равенство дерева, а не утверждение local HEAD=360. DEV alpha.59 / API 0.40.0; receipt `r42521707427-a1` — web/API, не native release. `apps/mobile` содержит README, но нет Expo project/package.json/config/router/native projects/binaries. Web VK/Яндекс/email доступны по переданной проверке методов; реальные native login, SMTP delivery и device session не выполнялись. Native exchange/refresh в целевой AUTH.md описаны, но в текущих routes не реализованы. Account deletion endpoint не подтверждён адресным поиском; #461 остаётся gate. Дополнительно адресно прочитан LegalPage: юридические тексты/operator/support сейчас не опубликованы. | Готовность | Сейчас | Доказательство следующего статуса | |---|---|---| | DESIGN_APPROVED | PENDING | Явное принятие Owner после независимых UX/product и engineering review | | SOURCE_READY | NOT_IMPLEMENTED | Native source + применимые deterministic tests + независимая QA + CI | | BUILD_READY Android / iOS | NOT_BUILT / NOT_BUILT | Отдельные signed development artifacts, source SHA, build profile и receipt по каждой ОС | | DEVICE_TESTED Android / iOS | NOT_TESTED / NOT_TESTED | Установка, сценарии и device/OS/version evidence на физическом устройстве | | STORE_READY | NOT_READY | Legal/privacy/deletion/access/signing/review/distribution gates по выбранным каналам | HTML, screenshot, Expo Go, typecheck и Product CI не заменяют эти доказательства. Browser screenshots проверяют дизайн, не native runtime. ## Предложение первого native scope **Первый полезный MVP:** явный город → публичные игры/площадки/профили → существующий/новый аккаунт → заявка → настоящий статус в «Мои игры»; базовый профиль/privacy. Открытие уже существующего аккаунта web без дубликатов обязательно. **M4 по приоритету и решению Owner:** сообщения/запросы и игровой чат, native notifications, карта и медиа, затем Postgame. Первые три можно выбрать как release blockers, но полный web parity одним PR не обещается. Для M1–M3 достаточно списка площадок и подтверждённого внешнего navigation link; native-карта не условие первой заявки. Radar остаётся OFF по умолчанию и может быть отложен целиком как capability, его consent-дизайн уже задан. ## M0 — согласовать путь и закрыть основные решения - **Результат:** понятный согласованный onboarding и ограниченный native MVP. - **Scope:** эта галерея, переходы, permissions, privacy/legal copy, инженерное review готового flow. Перепроверить city-before-join, email browser handoff, private notification destination и реальные event preferences. - **Зависимости / reuse:** #522, Style Guide, current public APIs/defaults, входная `engineer-READINESS.md`; #461 для store/legal. Не повторять аудит всего backlog. - **Новое:** только дизайн-решения и bounded child task specifications после approval. Сейчас native code нет. - **Проверка:** независимый короткий Codex UX/product review и адресная инженерная проверка финальных артефактов. Авторские проверки не подменяют их. Известные findings ремонтируются здесь же. - **Gate:** конкретный вариант и границы MVP приняты Owner; DESIGN_APPROVED фиксируется отдельно. Это не source/build readiness. - **Owner:** A/B/C; MVP priorities; iOS login direction; страны/каналы и контакт владельца внешних аккаунтов. Юридические вопросы связать с #461, не создавать дублирующий родитель. ## M1 — настоящая foundation и гостевой DEV - **Результат:** установленная development app обеих ОС открывает настоящий DEV каталог, город, игру/площадку/публичный профиль. - **Scope:** Expo workspace, Router, theme/tokens, safe areas, keyboard/a11y shell, loading/error/offline states, environment configuration, shared SDK/query layer. Bundle/package IDs, development build profiles и feature flags. - **Зависимости:** M0; согласованные IDs, build infrastructure, SDK baseline. Android toolchain availability UNKNOWN. Для iOS нужен macOS/Xcode либо отдельно согласованный builder; Linux VPS сама по себе не даёт iOS binary. - **Reuse:** HTTPS API/contracts, правила публичной видимости, assets/тексты/tokens. Shared contracts импортировать через client-safe package, не server-only domain. - **Новое:** RN screens/navigation, city/filter local state, error boundary, per-environment config, Android/iOS native config. No secrets in bundle; public API origin — allowlist. - **Тесты:** один targeted contract test города/public entities; пустой/неподдерживаемый город; no Moscow fallback; private404 остаётся private; cold start, guest browse; реальная сборка обеих ОС на согласованном builder. - **Gate:** SOURCE_READY после QA/CI; BUILD_READY по каждой ОС только artifact+signature+receipt. Guest smoke на DEV с exact SHA и версиями. Если одна ОС не собиралась, статус раздельный. - **Owner:** подтвердить внешние аккаунты/роли/IDs и builder, если ещё неизвестны. Новые расходы/подписки отдельно, не подразумеваются. **Baseline кандидат:** registry 08.11.2026: Expo 58.0.23, RN 0.88.1, React 19.3.0, Router ~58.0.30, screens ~4.30.1, SecureStore ~58.0.2, Notifications ~58.1.8. `expo-registry-proof.json` — published metadata/tarball, без install/build. В M1 закрепить exact lock, `expo install`/doctor и dev builds. Если native dependency реально несовместима, документировать failing build и выбирать поддерживаемую связку; не downgrade по старому поисковому snippet. ## M2 — аккаунт, сессия и сохранение цели - **Результат:** новый и существующий пользователь входит через действительные методы и возвращается к исходному действию без автоматической отправки. - **Scope:** backend native auth transaction, system-browser callback, one-time handoff exchange, rotating application refresh, SecureStore, logout/revoke/switch; verified game/profile links. Email/browser handoff как начальная рекомендуемая стратегия, с отдельным native-bound transaction. - **Зависимости:** M1; согласованный auth contract; provider return configuration; associated domains/assetlinks; legal registration requirements и iOS 4.8 decision. Реальный SMTP/provider access — отдельные approved DEV checks. - **Reuse:** identities/User UUID, server broker/provider adapters, web email challenge semantics, existing account preferences. Web endpoints требуют WEB Origin/browser binding и browser cookie; RN не подделывает Origin/CSRF и не копирует cookie. - **Новое:** native verifier/challenge, broker transaction binding, short-lived single-use code, exchange/refresh/revoke APIs, refresh family/replay handling, client-safe session adapter, intended-action coordinator. Access в памяти; refresh в Keychain/Keystore. Handoff PKCE не равен provider PKCE. Токены не идут в URL/логи/analytics. - **Ссылки:** AASA + Associated Domains; Android intent filter + assetlinks с точными signing fingerprints. HTTPS fallback на публичную web карточку. Auth redirect allowlist. Deferred deep link через store installation DEFERRED. - **Тесты:** actual dev build browser return; new/repeat account; code wrong/expired/replay; state/redirect/provider mismatch; cancel/error; process death; logout/revoke/refresh reuse; collision same email не объединяет accounts; private cache очищается при switch. Cold/warm links и intent restoration после reread; не автоподавать заявку/сообщение. - **Gate:** source QA/security/CI, real DEV session evidence по каждому методу/ОС; device proof отдельно. Не объявлять native auth готовым на основании web availability. Утверждённые legal тексты/необходимые consents и версия документов до реальной открытой регистрации. - **Owner:** iOS path и необходимые внешние provider/Developer роли. При отсутствии обязательного внешнего доступа задача отмечается blocked по факту, без его подмены mock success. **iOS 4.8 конкретный выбор:** рекомендуем отдельный Sign in with Apple slice при сохранении VK/Яндекс/email, после решения Owner и проверки actual policies/configuration. До реализации Apple button не отображается. Альтернатива — обоснованный полноценный first-party-only iOS login с необходимыми privacy-свойствами и review analysis. Просто наличие email-кода, скрытая кнопка или совпадающий email не доказывают compliance. Применимость исключений не предполагается; approval Apple не гарантируется. Не включать production provider в этой задаче. ## M3 — первая настоящая заявка - **Результат:** найти игру → прочитать свежие условия → подтвердить заявку → увидеть реальный pending/confirmed status. - **Scope:** Game detail, server reread после входа, explicit action review, request participation, My Games status, error/unknown reconciliation. Не добавлять обязательную photo/name/level анкету. - **Зависимости:** M1+M2, DEV fixture с разрешёнными данными и доступным местом. Fixture ограниченный, именованный, не создан за счёт чужой учётной записи. - **Reuse:** existing participation command, idempotency, expectedGameVersion, deadline/start/capacity/rights/terminal rules. City nullable в профиле; web city-only setup не считается server join requirement. - **Новое:** native presenter/command orchestration, in-flight lock, expectedVersion refresh, accepted/pending display, targeted cache invalidation. - **Тесты:** stale conditions → new confirm; last-seat race; doubletap; private/terminal404; deadline/timezone; network loss after submit → reread, не повторный insert; existing participation restored; session expiry. Proportional checks, не многократная полная матрица. - **Gate:** независимая QA, обязательный CI, DEV accepted + smoke в development builds; точные source SHA, app version, receipt. Owner UAT=NOT_TESTED до собственного прогона Owner. - **Owner:** стандартный этап в согласованном MVP; нового micro-GO каждой кнопки не нужно. ## M4 — выбранные функции первого выпуска - **Результат:** полезное продолжение участия: профиль/«Мои игры», затем выбранные общение, карта, native push и Postgame. - **Scope:** ограниченные независимые срезы в том же native train. Рекомендованный порядок: M4a basic profile/privacy/My Games; M4b messages/request/game chat; M4c push; M4d map/media; M4e Postgame. Order можно скорректировать по выбранному Owner MVP, без обещания всей web parity. - **Зависимости:** M3 и реальные контракты каждого модуля; capabilities server-driven. Map и push spikes имеют отдельные bounded результаты ниже. - **Reuse:** profile versioning/defaults/LevelGuide, message permission/block/report, game access, outbox/events/preferences/dedupe, media processing, postgame rules. Не возвращать автоматический рейтинг или исторические T6/T7. - **Новое:** RN views, native media picker/camera bridge, transport adapters/device ownership, MapLibre native binding и navigation handlers. - **Тесты:** privacy opt-out, profile safe public name, partial/limited media, messages request/block/access; push logout/reassignment/duplicate event; map filters/pins; Postgame actual states. Каждый срез — адресная QA, CI и DEV smoke; не весь продукт повторно. - **Gate:** каждый включённый capability имеет source/build/device evidence. Отложенный capability скрыт/disabled честно и не считается доступным в release notes. - **Owner:** выбрать какие срезы являются условиями первого native release. Новый платный service не входит автоматически. **Map feasibility:** web `MapLibre GL JS + pmtiles.Protocol/addProtocol` не переносится в RN. По входному engineer review MapLibre RN v11 — New Architecture, RN≥0.80, native Android13.6.1/iOS6.31.0. Проверить exact chosen binding/config plugin на candidate SDK в development build обеих ОС. Spike должен реально загрузить существующие московские/СПб/региональные PMTiles, absolute `pmtiles://https` URL, Range/206, TLS, glyphs/sprites/styles и camera/pins. Сохранить единый city/filter source и actual allowed pins, gallery и attribution. Если bridge не открывает archive, сначала доказать failure и bounded adapter решение; не начинать новый backend/тайловый сервис по предположению. Внешняя навигация по подтверждённым координатам — полезный промежуточный путь. **Native push transport:** Expo Notifications может получать Expo token либо native APNs/FCM token. Для DEV предлагаем bounded development-build spike, затем решение по privacy/access/reliability. Expo Push Service даёт унифицированный gateway/receipts, но добавляет processor и его operational constraints. Direct APNs/FCM уменьшает посредников, требует своих adapters/credentials/receipts/rotation и retry handling. Платная подписка не обязательна ни как идея tooling, ни как условие дизайна. Существующие Web Push/SW не являются APNs/FCM. Новое device registration связывает token+installation+account+environment, обрабатывает stale token, detach/revoke и повторный login. Event type preferences сохраняются, grant не включает всё. Физические delivery/tap tests обязательны. ## M5 — устройства и внутреннее распространение - **Результат:** приложение реально установлено на iPhone и Android; ограниченная группа может проверить полезный путь. - **Scope:** development/ad hoc/approved internal builds, затем TestFlight / выбранный Android internal testing. Только согласованное внутреннее распространение; не public store launch. - **Зависимости:** signing/Developer roles, macOS/Xcode или approved builder, Android toolchain/keystore, физические устройства и testers. Credentials не запрашивать в чат и не добавлять в Git. - **Reuse:** source/build artifacts предыдущих срезов, CI results unchanged code, current DEV fixtures и smoke process. - **Новое:** только platform fixes/packaging/release profile, secure credential handoff и documented support path, никаких новых scheduler/daemon. - **Тесты:** 375×667/390×844 и 360×740/412×915 equivalent devices; OS fonts 200%, VoiceOver/TalkBack, keyboard, safe areas, Reduce Motion; denied/restricted/approximate location, photo picker, push permission+binding+tap; cold/warm links, auth restart, slow/offline, logout/switch. Не путать emulator с physical proof. - **Gate:** DEVICE_TESTED по каждой ОС только exact device/OS/build/version/source receipt + результаты. FAIL и ремонты сохраняются; Owner UAT отдельный. - **Owner:** доступ к тестирующим/устройствам и роли для private distribution, если не предоставлены ранее. ## M6 — Store readiness и решение о публикации - **Результат:** проверяемый submission package для выбранных стран/каналов. - **Scope:** #461, operator/support/deletion URL, legal docs/consents, privacy labels/Data safety, возрастная политика, UGC moderation/report/block, review access, permission strings/screenshots, signing retention/backup/recovery, release history. - **Зависимости:** M5, iOS 4.8 path, verified developer accounts/roles, server account deletion. Адресный поиск не подтвердил deletion endpoint; policy page не заменяет in-app initiation + web deletion route и фактическое удаление/retention handling. - **Reuse:** существующие moderation/restriction/domain policies, #461 docs, release-agent process. Не создавать новый framework store readiness. - **Новое:** только подтверждённые пробелы удаления/согласий/review configuration и магазинные материалы. Ретенция обязательных данных должна быть объяснена, withdrawal/session revoke/device detach обработаны. - **Тесты:** complete deletion request actual allowed QA account, sessions/media/devices handling, review account paths, disclosures совпадают с фактическими SDK/data flows. Проверить актуальные правила магазинов перед submission. - **Gate:** STORE_READY только после всех evidence. Public publish/PROD — отдельное точное Owner решение; даже STORE_READY не является разрешением публикации. - **Owner:** юридический оператор, страны/магазины (Google Play/RuStore/другие при необходимости), разрешение public release, любые новые деньги. ## Первые исполнимые назначения после M0 | Срез | Вход | Проверяемый выход | |---|---|---| | Foundation + guest | Утверждённый MVP, candidate SDK, API origin, IDs/build access | Source PR, точные lock/versions, два development artifacts, guest-city-game smoke | | Native session contract | M2 flow и existing auth code | Exchange/refresh/revoke contract + adversarial targeted checks; secure client session | | Links / intent return | Domains/signing fingerprints, validated destination schema | Cold/warm game/profile link, browser return, cancel/restart без потери цели | | Participation | Реальные native session и разрешённый DEV fixture | Explicit join + actual pending/confirmed + lost-response reconciliation | | M4 spikes | Выбранный scope, approved credentials path | Реальный native map либо physical push evidence, строго по выбранной функции | Все срезы остаются под существующей #522 и её канонической политикой author-route, включая применимые AGY условия после approval. Этот документ не квалифицирует AGY Author и не разрешает provider calls. PMA использует текущий принятый admission/Context Exchange, один source writer и immutable task revision. Автор → независимая QA другой модели → применимые CI/security → trusted merge dev → DEV ACCEPTED/smoke → Owner UAT. Публикацию/merge/install/deploy выполняет trusted process. Новый родительский Issue не создаётся. ## Критический путь и неизвестное Concept/MVP approval → builder/IDs + native foundation → настоящий native auth/session → полезная заявка → physical device evidence → legal/deletion/store gates. Проверка карты и push может быть ограниченной параллельной инженерной работой только внутри разрешённого процесса и выбранного scope; эта сессия дополнительных агентов не запускает. Внешние аккаунты, macOS builder, signing/keystore, права провайдеров, страны/каналы и реальные расходы сейчас UNKNOWN/NOT_VERIFIED. Ничего не искалось в credentials или home config. Сроки и стоимость без доступов и замеров не оцениваются. Принимаемые версии приложения, API-контракта и отдельного deploy не смешиваются. Release-agent до выпуска готовит номер/описание, после ACCEPTED фиксирует exact source SHA, receipt/date/UAT и обновляет историю существующим механизмом.