Skip to content

docs(agents): add TypeScript + React Native rules (Codex Compact)#16

Closed
temrjan wants to merge 1 commit into
mainfrom
docs/mobile-agents-update
Closed

docs(agents): add TypeScript + React Native rules (Codex Compact)#16
temrjan wants to merge 1 commit into
mainfrom
docs/mobile-agents-update

Conversation

@temrjan

@temrjan temrjan commented Jun 3, 2026

Copy link
Copy Markdown
Member

ci(dependabot): ignore major action updates

ci(dependabot): ignore major action updates
@temrjan

temrjan commented Jun 30, 2026

Copy link
Copy Markdown
Member Author

Superseded by the D0 platform reset (#19, merged f0b5c0c): AGENTS.md was rewritten to the console-canon and the repo moved to RN 0.85.2 + workspaces, so this June-03 docs branch is stale and conflicting. Closing; reopen if any rule here is still wanted.

@temrjan temrjan closed this Jun 30, 2026
@temrjan temrjan deleted the docs/mobile-agents-update branch June 30, 2026 04:01
temrjan added a commit that referenced this pull request Jul 6, 2026
…nvalidated recovery) (#29)

Stage-2 slice A3 — the locked-phase unlock screen, closing the Stage-2
loop: create (A2) → cold start → unlock.

## What
- `UnlockPin` screen (flipbook "Вход — Locked" frame, English strings):
PIN path via the A1c ladder, biometric-circle shortcut, 1s lockout
countdown (persists across force-quit), 200ms spinner threshold.
- `deviceWallet.unlock` single-flight (mirrors `commitWallet`; sync
`NoWalletError` precondition outside the slot).
- `walletStore.unlock` action publishing the live `UnlockedSession`; no
`reconcile` (A1c contract).
- `PinKeypad` `disabled` prop (lockout/verifying), A2 callers untouched.
- `KeyPermanentlyInvalidated` → recovery banner → verbatim-tested
confirm (`Delete & start over`) → `wipeWallet` → onboarding. Never
auto-wipes.
- Keychain mock extended (`getSupportedBiometryType`, `BIOMETRY_TYPE`,
hang helper); `keystoreSecret` docstring fixed (save-side auth prompt —
carry-over #20 resolved).

## Evidence
- Gates (exact CI commands, local — CI is workflow_dispatch-muted,
carry-over #3/#16): `npm run typecheck` clean, `npm run lint` 0 errors,
`npm test -- --coverage` **150/150** (was 125). Coverage: stores 100%,
UnlockPin 93%. `gradlew assembleDebug` proven by the smoke build.
- Red→green proven: 3 red runs + 4 mutations (error-toggle, lock
predicate, KPI predicate ×2), each failing exactly its guarding tests.
- Device smoke PASS (Captain-witnessed, JFLFG6MZSSL7WCF6): lock screen
live, shake, lockout+countdown+force-quit persistence, PIN→OS
sheet→Home, biometric circle→Home. KPI recovery UNVERIFIED-on-device
(destructive to provoke; jest-proven).
- Gate-1 APPROVED WITH NITS; Gate-2 APPROVED WITH NITS, M1–M6 applied
in-round (delta in
`core/.claude/reports/2026-07-06-stage2-a3-unlock-locked.md`).

Carry-overs recorded: #21 (import inert until A4 — go-live blocker), #23
(no-biometrics unlock/PIN-reset path — gate before real users).

Spec: `core/.claude/specs/2026-07-06-stage2-a3-unlock-locked.md`
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