chore(mobile): RN 0.85 platform reset — workspaces + android/ + core submodule (Stage 2 D0)#19
Merged
Merged
Conversation
…submodule (Stage 2 D0)
…t (D0) The pinned SHA for actions/setup-java did not resolve to any ref (unable to find version), so build-android failed at job setup before gradle ran. Correct it to the real v4.7.0 commit.
temrjan
added a commit
that referenced
this pull request
Jul 8, 2026
## Что и зачем (A4 · Этап 2, последний A-слайс) Восстановление кошелька записанной 12-словной BIP-39-фразой: **Welcome → ImportPhrase → CreatePin → ConfirmPin → commit → unlocked**. Активирует инертную кнопку «Импортировать фразу». **Закрывает go-live-блокер #21** (KPI-recovery — после потери устройства/ключа фраза снова ведёт к кошельку). Второй из двух PR арки; core-часть (`validate_mnemonic`) уже на main (rustok-org/core#85), сабмодуль бампнут на неё. ## Ключевое - **Валидность решает ТОЛЬКО Rust FFI** (`validateMnemonic`, без KDF, честный тег `InvalidInput`). JS-словарь — лишь подсказка (полоса автодополнения + подчёркивание), не гейт. - **Экран ввода = самая чувствительная поверхность:** фраза живёт только в JS-памяти, стирается на success/cancel/back; анти-утечка-пропсы на всех 12 полях (`visible-password` глушит Gboard-подсказки); ноль чтений клипборда/сети/логов/persist. - **Paste** — только OS-нативный: пробел-в-конце фиксирует слово; multi-word раскладывается по полям; >12 слов → ошибка целиком (без обрезки). - **Полоса автодополнения** под 3 замками: локальный словарь / без кэша / только явный tap. - **Таксономия ошибок коммита:** exists / ffi / storage — три различимых сообщения + Retry. ## Гейты - `npm run typecheck` → чисто - `npm run lint` → 0 ошибок (изменённые файлы 0/0) - `npm test` → **196 passed / 196** (+46 новых; покрытие phraseInput+onboardingStore 100%, ImportPhrase 95.8%, ConfirmPin 85.7%) - Red→green доказан мутациями (prefix-guard, lowercase, таксономия-collapse, invalid-дискриминация, overflow index-blind, словарь-корозия) - **Device-smoke 8/8 при Капитане** (round-trip #21: создать→wipe→импорт→адрес совпал; Gboard-подсказки отсутствуют) Гейт-1 и Гейт-2 (fleet 5 линз + security ЧИСТО) — оба APPROVED; МИНОРы вшиты. Mobile CI = workflow_dispatch (заглушён, #3/#16) → мерж по локальному зелёному, build-android остаётся #16. **Вне скоупа (записано):** #22 (ru→en sweep существующих экранов), #19 (FLAG_SECURE для ImportPhrase), #23 (вход без биометрии).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что
Превращает замороженный скелет (RN 0.76, без
android/) в собираемый пустой RN 0.85.2-каркас под харвест D1+ (мост) и D2+ (экраны). Экранов/моста/стора нет — только фундамент.Изменения
com.rustokmobile → com.rustokwallet(namespace + Kotlin + applicationId; временный бренд-id до Play). Launcher «Rustok».packages/*) +packages/.gitkeep.blockListЗАЯКОРЕН на^<root>/vendor/core(не на RN-собственныйLibraries/vendor/core) — иначе бандл 500 + inotify-защита Fedora.vendor/core→rustok-org/coreпинa77df87(мост D1 нацелит ubrn наvendor/core/crates/mobile-bindings).App.tsx(nativewind-токены гоняют пайплайн),AGENTS.md→ консоль-канон (chat = Этап 4, файрвол), CI остаётсяworkflow_dispatch.Гейт D0 — пройден
typecheck0 ·lint0 ·jest1 passed../gradlew assembleDebug→ BUILD SUCCESSFUL (APK 197 МБ)./typescript-review0 critical/error.Firewall
chat/агент-консоль = Этап 4 — НЕ строим. Легаси
mobile/— только шаблон. Никаких экранов/стора.CI на
workflow_dispatch; push/PR-триггеры вернём в D1 по зелёному мосту. Спека:core/.claude/specs/2026-06-29-stage2-D0-mobile-platform-reset.md.