Skip to content

chore(mobile): RN 0.85 platform reset — workspaces + android/ + core submodule (Stage 2 D0)#19

Merged
temrjan merged 3 commits into
mainfrom
feat/stage2-d0-platform-reset
Jun 30, 2026
Merged

chore(mobile): RN 0.85 platform reset — workspaces + android/ + core submodule (Stage 2 D0)#19
temrjan merged 3 commits into
mainfrom
feat/stage2-d0-platform-reset

Conversation

@temrjan

@temrjan temrjan commented Jun 29, 2026

Copy link
Copy Markdown
Member

Что

Превращает замороженный скелет (RN 0.76, без android/) в собираемый пустой RN 0.85.2-каркас под харвест D1+ (мост) и D2+ (экраны). Экранов/моста/стора нет — только фундамент.

Изменения

  • RN 0.76 → 0.85.2 / react 19 (свежий community-template).
  • Пакет com.rustokmobile → com.rustokwallet (namespace + Kotlin + applicationId; временный бренд-id до Play). Launcher «Rustok».
  • npm-workspaces (packages/*) + packages/.gitkeep.
  • Целевые deps: react-navigation v7, screens, gesture-handler, reanimated 4.5 + worklets 0.10, mmkv + nitro, zustand, nativewind + tailwind.
  • metro: NativeWind v4 + blockList ЗАЯКОРЕН на ^<root>/vendor/core (не на RN-собственный Libraries/vendor/core) — иначе бандл 500 + inotify-защита Fedora.
  • submodule vendor/corerustok-org/core пин a77df87 (мост D1 нацелит ubrn на vendor/core/crates/mobile-bindings).
  • Пустой App.tsx (nativewind-токены гоняют пайплайн), AGENTS.md → консоль-канон (chat = Этап 4, файрвол), CI остаётся workflow_dispatch.

Гейт D0 — пройден

  • typecheck 0 · lint 0 · jest 1 passed.
  • ./gradlew assembleDebugBUILD SUCCESSFUL (APK 197 МБ).
  • boot верифицирован вживую (Redmi): рендерит «Rustok», бандл чистый, nativewind-классы применились. light-фон = дефолт пустого shell (dark — D2+).
  • /typescript-review 0 critical/error.

Firewall

chat/агент-консоль = Этап 4 — НЕ строим. Легаси mobile/ — только шаблон. Никаких экранов/стора.

CI на workflow_dispatch; push/PR-триггеры вернём в D1 по зелёному мосту. Спека: core/.claude/specs/2026-06-29-stage2-D0-mobile-platform-reset.md.

temrjan added 3 commits June 29, 2026 17:01
…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 temrjan merged commit f0b5c0c into main Jun 30, 2026
4 checks passed
@temrjan temrjan deleted the feat/stage2-d0-platform-reset branch June 30, 2026 03:55
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 (вход без биометрии).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant