Перейти к содержанию

OneWallet — Отчёт для Product Manager

Период 2026-04-13 → 2026-04-23
Документ Сводный отчёт по выполненной работе + открытые планы
Обновлён 2026-04-23

Оглавление

  1. Сводка
  2. onewallet_base — Serverpod backend + Flutter app
  3. admin-panel — SvelteKit
  4. kyc-service — Node.js OCR worker
  5. blnkfinance-service — ledger
  6. internal-p2p-service — Dart adapter
  7. public-tech-docs
  8. Cross-cutting — архитектура, спеки, инфраструктура
  9. Открытые и заблокированные планы
  10. Известные проблемы
  11. Что впереди — roadmap

1. Сводка

За 10 дней (13–23 апреля) закрыто 15 из 17 структурных планов, выполнено 91 коммит. Собран работающий E2E-скелет платформы:

  • Backend E2E (регистрация → KYC → кошелёк) работает
  • Mobile UX зашлифован (PIN, биометрия, auth-telemetry, screenshot protection)
  • Admin Panel MVP в проде, включая blnkfinance UI
  • Payment Manager — M1–M5 готовы, Phase 1 sweep (Tasks 1–15) в активной работе: 4 задачи закрыты, 3 в работе
  • Архитектурный разворот (2026-04-23): INTERNAL P2P теперь синхронный внутри PM через settleSync() (multi-destination Hold + commit). Сервис internal-p2p-service деактивирован.
  • KYC-микросервис на Node.js с Gemini OCR + CompreFace в работе

Фокус на ближайшие 2 недели — завершение Phase 1 sweep (settleSync INTERNAL + transaction_events history + Flutter polish) → далее PM M6–M9 (Redis Streams + Settlement + Limits для external-каналов) + закрытие хвостов (S3 cleanup, CompreFace resilience).


2. onewallet_base — Serverpod backend + Flutter app

2.1 Phase 1 — Фундамент (2026-04-13, 100%)

Backend (Serverpod) - Core-модели БД: user, миграции - RegistrationService + KYCService — разделённая архитектура - Cleanup cron: sendRegistrationReminders, archiveExpiredRegistrations, hardDeleteArchivedUsers - AuthService — хеш паролей, lockout, rate limit, генерация токенов - StorageService — S3 (Garage, 10.10.10.19:3900), presigned upload/download, buckets kyc-documents / user-avatars - KYCService — full state machine: pending → inReview → autoApproved/manualReview → approved → pendingOperatorReview → fullyVerified - WalletService — 2-фазная активация + интеграция с blnkfinance

Frontend (Flutter) - Архитектура: go_router, flutter_riverpod, dio, cached_network_image, image_picker, permission_handler, dotenv - Auth-экраны: Splash, SignIn, регистрация (Email → OTP → Referral → Password), валидаторы, auth guard в роутере - KYC-флоу: Intro → Document → Pending, Riverpod KycNotifier, KycImagePickerCard - Home Dashboard: BalanceCard, ActionButtonGrid (Top-up/Send/P2P/History), WalletNotifier

Blocker решён: Redis в Serverpod 3.x — через session.serverpod.redisController (есть get/set/del, нет incr/expire/setex → счётчики через get-parse-set).

2.2 Phase 2 — Backend E2E (2026-04-13–14, ~100%)

Архитектурный разворот: самописные JWT/bcrypt/Redis OTP → serverpod_auth_idp (встроенный). Убрало ~4 планируемых модуля.

  • E2E регистрация: email → OTP → реферальный код → пароль → KYC
  • SMTP (SendGrid) через mailer + passwords.yaml
  • S3: миграция s3_dartminio 3.5.8 (pathStyle: true, statObject вместо workaround на listAllObjects)
  • onAfterAccountCreated hook в server.dart — линковка authUserId (UUID!) → users
  • AuthValidateEndpoint
  • BlnkService — POST /ledgers + POST /balances + GET /balances/{id} через dio
  • KYC wizard (3 шага): паспорт / селфи / штамп (опционально)
  • Роутинг по статусу: kyc_pending блокирует /home, pending_operator_review пускает с синим баннером
  • _KycBanner (жёлтый) + _KycReviewBanner (синий) на Home

Известные TODO: rate limiting (M4, 20%) — отложен на пост-MVP.

2.3 Mobile UX Hardening (2026-04-14–15, 100%)

Фаза A — Критические баги - KYC Terms → redirect loop (fix) - Дубль-email: кнопка "Sign in instead" - OWErrorBanner вместо SnackBar

Фаза B — Недостающие UX потоки - Welcome Screen + корректный роутер - Forgot Password (3 экрана + authProvider) - GlassNavigationBar + StatefulShellRoute - Inline камера KycCameraOverlay (вместо модалки) - PIN 6 цифр + биометрия + auto-lock 5 мин (требование НацБанк) - OTP-экран регистрации → Pinput

Фаза C — Security Hardening - Jailbreak/Root Detection - Screenshot Protection (Android MainActivity.kt + iOS SecureOverlay) - OTP Rate Limiting — 3 попытки → 60 сек - Session Freshness — resume > 15 мин → reload - Certificate Pinning — заблокировано (ждёт SHA-256 от DevOps)

Фаза D: kycProvider → NotifierProvider (Riverpod 2.x)

Фаза E — Auth Telemetry - auth_events таблица + GEO IP (ip-api.com) + хуки в EmailIdpEndpoint/AuthValidateEndpoint + миграция - Installation ID (UUID v4 в SecureStorage) - "Security Activity" экран в профиле (AuthEventEndpoint + ActivityScreen)

Фаза F - isLocked в user_profile + profile_audit_logs - Guard в confirmKycData - Блокировка при finalizeVerification + миграция

PIN/Биометрия улучшения - Холодный старт: isLocked=true при наличии PIN - Биометрия приоритет над PIN: auto-trigger + крупная иконка - SplashScreen ждёт isInitialized, → /welcome

Hotfixes 2026-04-15 (8 пунктов) - БД WARNING isLocked DEFAULT (DROP DEFAULT) - AuthEventService crash (session closed → новая InternalSession) - PIN-экран зависал после ввода (правило 2b в роутере) - Биометрия не показывалась (условие на canCheckBiometrics) - Биометрия зависала Android (FlutterActivityFlutterFragmentActivity) - Разрешения: USE_BIOMETRIC, USE_FINGERPRINT, NSFaceIDUsageDescription - initializeClient крашил при недоступном сервере (TimeoutException → try-catch) - Вспышка home при холодном старте (!pinState.isInitialized в роутере)

2.4 KYC Phase 3 — Микросервис интеграция (2026-04-14, 100%)

Server-side - user_profile.spy.yaml +11 KYC-полей + termsAcceptedAt - kyc_ocr_result.spy.yaml — сериализуемый класс для клиента - Миграция 20260414101108409 - kyc_queue_service.dart — fire-and-forget HTTP POST в микросервис - kyc_service.dartsubmitForReview / confirmKycData / retryKycProcessing / getOcrResult / getFailureReason - kyc_endpoint.dart - passwords.yamlkycServiceUrl, kycServiceSecret

Flutter - kyc_camera_screen.dart — in-app камера (CameraLensDirection.front для селфи) - kyc_processing_screen.dart — анимация + polling 10s + экраны ошибок по failureCode - kyc_review_screen.dart — форма с предзаполнением из OCR, 10 редактируемых полей - kyc_terms_screen.dart — T&C + checkbox + confirmKycData() - app_router.dart — +3 маршрута, fix: pending_operator_review/home

2.5 Blnk Identity Linking (2026-04-17, 100%)

  • user_profile.blnkIdentityId + миграция 20260417065117678
  • BlnkService.createIdentity() + linkIdentityToBalance()
  • WalletService.activateBlnkIdentity() + обновлён activatePhase2()
  • AdminKycEndpoint.activatePhase2 теперь fatal (не non-fatal warning)

2.6 PM Prereq — KYC Tier (2026-04-19, 100%)

  • kycTier в user_profile + миграция + data migration
  • Auto-promotion: BASIC при создании → STANDARD при верификации
  • Admin override через AdminKycEndpoint

2.7 Payment Manager Phase 1 — M1–M5 (2026-04-19–20)

Модуль Статус Коммит Содержание
M1 DB Schema 6267597 6 таблиц (intents, outbox, psp_tx_map, fee_rules, payment_routes, limits) + индексы + seed + integration test
M2 Intent CRUD bdedda5 IntentRepository + IdempotencyService + PaymentEndpoint (createIntent / getIntent / cancelIntent)
M3 Rule Engine 824422e + ff12440 SimpleFeeRuleService (flat + percent) + PspRouterService + LimitsService (per-tx) + SagaService.validate() → VALIDATED
M4 Balance Hold 875ac6a + 8325209 + d2efa0a BlnkService.getBalanceRaw/createInflightTransaction/commitInflight/voidInflight + SagaService.authorize() → AUTHORIZED
M5 Flutter P2P UI M5 multi-commit 5 экранов + P2PPaymentNotifier + polling + TransactionProvider

M4 Post-Review фиксы - ACTIVE_HOLD_EXISTS double guard: IntentRepository.findActiveForUser() — DB-проверка AUTHORIZED/IN_PROGRESS перед blnkfinance - Amount scaling bug: createInflightTransaction передавал amount в сатангах с precision=100 → blnkfinance умножал повторно → hold 100× → insufficient funds. Фикс: делим на _currencyMultiplier(currency) перед отправкой

M5 детали - participantId: int?String? (blnkAccountId или телефон) - PaymentError как SerializableException — структурированные ошибки на клиенте - PaymentEndpoint.listIntents — список операций для главного экрана - QrDispatcher — EMV TLV + CRC-16/CCITT, роутинг по типу QR - 5 экранов: P2P Home / My QR / QR Scanner / Preview / Status - P2PPaymentNotifier (AutoDispose) + polling getIntent - TransactionProvider — реальный список операций с датой - BalanceCard hold display, баннер "сервис недоступен" - Fix: сага помечает FAILED если authorize бросает PaymentError - Fix: authProvider синхронизирован с FlutterAuthSessionManager через authInfoListenable - Fix: transactionProvider guarded by authProvider.isAuthenticated

2.8 WebSocket real-time updates

Каркас real-time апдейтов для PM (подготовка к M7).

2.9 PM Phase 1 sweep — INTERNAL Sync + Transaction History (2026-04-22–23, в работе)

Цель: реализовать синхронный Internal P2P (CREATED → SETTLED за ~150ms), единую историю через transaction_events, идемпотентный voidInflight, обогащённая Hold meta_data.

Архитектурный разворот: INTERNAL больше не использует адаптер / Redis Streams / transit balance. settleSync() выполняется в одной DB-транзакции с row lock (SELECT FOR UPDATE через raw SQL). Все терминальные события пишутся в transaction_events. InternalRecoveryCall восстанавливает AUTHORIZED INTERNAL intents после краша.

Статус задач (15 задач, plan 2026-04-22-payment-manager-phase1.md):

# Задача Статус
1 Модели — YAML + кодогенерация + миграция (transaction_events, limitRuleId, errorCode, remove wallet.balance)
2 LimitsService.checkPerTxFuture<int?> + validate() сохраняет limitRuleId
3 BlnkService — идемпотентный voidInflight (409) + createInflightMultiDestination (INTERNAL) + явная meta в createSettlementTransaction (EXTERNAL) 🔄
4 authorize() — ветка по channel (INTERNAL = multi-dest Hold; EXTERNAL = single-dest → transit) 🔄
5 SagaService.settleSync() — commit-only для INTERNAL (без settlement POST) 🔄
6 Transaction events — запись в fail(), rollback(), settle()
7 Новые эндпоинты — getTransactionHistory + getActiveIntent
8 InternalRecoveryCall — новый FutureCall для восстановления AUTHORIZED INTERNAL после краша
9 StartupReconciliationService — ветка INTERNAL
10 Инфраструктура — деактивировать internal-p2p-service ✅ (2026-04-23)
11 Интеграционный тест — m5_settle_sync_test_real.dart
12 Интеграционный тест — m5_history_test_real.dart
13 Flutter — wallet balance (убрать wallet.balance, считать на клиенте) ✅ (упреждающе)
14 Flutter — payment flow (SETTLED без polling)
15 Flutter — история транзакций (реальные данные)

Ключевые документы обновлены - docs/04-payment-manager.md — описание INTERNAL flow переписано (multi-dest Hold, settleSync commit-only) - docs/superpowers/specs/2026-04-22-payment-manager-design.md — раздел 3.7 «Деактивация internal-p2p-service» - docs/diagrams/pm-uml/06-blnk-transaction-tree.mmd — обновлена диаграмма для INTERNAL multi-dest Hold


3. admin-panel — SvelteKit 2 + Svelte 5 + TS + Tailwind v4

3.1 MVP (2026-04-15, 100%)

Backend (Serverpod) - NginxAuthRoute (GET /nginx/auth) — JWT + user status + isLocked check - NginxAdminAuthRoute (GET /nginx/auth/admin) — JWT + admin_user_roles check - RBAC-миграция 20260415065035561: admin_roles, admin_user_roles, admin_audit_log - ValidateResult.roles: List<String> + _getAdminRoles() SQL JOIN - AdminKycEndpoint: approve / reject / finalize + audit log - AdminUserEndpoint: blockUser / unblockUser + audit log

Frontend (SvelteKit) - Scaffold: SvelteKit 2 + Svelte 5 + TypeScript + Tailwind CSS 4 - Login → POST /emailIdp/login → httpOnly cookie - hooks.server.tsvalidateToken() на каждый запрос → RBAC guard - Разделы: Dashboard, Users, KYC Review, Transactions, Payments, Agents, Logs, Settings - /kyc — список pending_operator_review + badge в sidebar - /kyc/[userId] — фото (S3 presigned), OCR, кнопки Approve/Finalize/Reject + история попыток - /users — список с ILIKE-поиском, фильтр по статусу, пагинация - /users/[userId] — аккаунт, профиль, KYC-статус, кошелёк, блокировка + история KYC - Layout sidebar + KYC badge + logout

Архитектурные решения - Prisma исключена — риск prisma migrate к Serverpod-схеме + WASM-баги в Vite dev - Гибрид: auth через Serverpod, reads через raw pg Pool, writes через Serverpod endpoints - $env/dynamic/private для DATABASE_URL (не process.env) - CSRF — встроенный SvelteKit (Origin header) - DB squash: 10 миграций → 1 (20260415113043784)

Инфра - Seed: scripts/seed-superadmin.sql (idempotent, -v email=...) - S3: @aws-sdk/client-s3 + @aws-sdk/s3-request-presigner (TTL 1ч, forcePathStyle)

3.2 blnkfinance UI (2026-04-16, 100%)

Фаза 1 — Foundation - CSS-токены бренда в layout.css (@theme) - src/lib/server/blnk.ts — типизированный клиент - Sub-nav: Overview / Ledgers / Balances / Transactions / Identities / Reconciliation - Role guard (superadmin, finance) - Overview: метрики, 10 последних tx, таблица INFLIGHT > 1ч, SVG bar-chart за 7 дней - Ledgers CRUD

Фаза 2 — Core - Balances: список с фильтрами, создание, detail с breakdown (balance/inflight/credit/debit), timeline, snapshot, adjustment - Transactions: список с фильтрами (status, currency, date, balance, reference), commit/void INFLIGHT, detail с sources/destinations/lineage, Refund - UI-компоненты: StatusBadge, AmountDisplay, MetadataViewer, ConfirmModal, BlnkTable

Фаза 3 — Advanced - Identities: список + поиск + создание + detail с linked balances + edit (PUT) - Reconciliation: список сессий + upload CSV + запуск + результаты matched/unmatched - CSV-экспорт

Критический backend-фикс - blnk_service.dart: добавлен currency_multiplier при создании balance (без него суммы хранились как 0) - _currencyMultiplier() с поддержкой zero/two/three-decimal валют - Существующие тестовые балансы с currency_multiplier: 0 невозможно исправить через API — только пересоздание

UI-фиксы - blnkAmount убрана из SvelteKit load (не сериализуется), конвертация в AmountDisplay - Typesense: query_by: 'balance_id' → 0 результатов → ledger_id,currency - Typesense: чужие транзакции → filter_by: 'source:=id || destination:=id'

3.3 KYC & Users Fixes (2026-04-15, 90%)

  • S3 presigned GET для документов в Admin Panel
  • admin_kyc_endpoint.dart — try-catch вокруг activatePhase2 (non-fatal warning; позже сделано fatal, см. Blnk Identity)
  • Секции "История KYC" + "Действия оператора" на странице пользователя

3.4 Payment Manager Limits UI (2026-04-20)

  • План + спека готовы, реализация — в очереди
  • UI Unification — выполнено

4. kyc-service — Node.js OCR worker

Phase 3 (2026-04-14, 100%)

  • Express POST /api/v1/process + BullMQ queue kyc-jobs (переименовано с kyc:jobs: запрещён в BullMQ)
  • BullMQ Worker: concurrency=3, MAX_ATTEMPTS=5, exponential backoff
  • Gemini OCR: gemini-3-flash-preview (сменили с gemini-1.5-pro → 404)
  • services/s3.js — presigned GET (forcePathStyle для Garage)
  • services/db.jsupdateKycResult() / updateKycFailed() с failureCode
  • Валидация фото:
  • OCR all-null → INVALID_PHOTO:passport
  • Face score=0 → INVALID_PHOTO:selfie
  • UnrecoverableError (без ретраев)
  • Аудит-логи: AUDIT OK / AUDIT INVALID_PHOTO с ключами S3
  • Fix: isFinal учитывает isInvalidPhoto (UnrecoverableError ≠ final attempt)

Известные ограничения

  • Gemini API требует биллинг (free tier = 0 quota на некоторых аккаунтах)

5. blnkfinance-service — ledger (Docker + seed)

Seed Setup (2026-04-20)

  • docker-compose-blnkfinance.yml — фрагмент: blnkfinance + worker + typesense
  • blnk.json — статическая конфигурация
  • SETUP.md runbook — ledgers, system balances, API keys, MASTER_KEY, passwords.yaml
  • Docker-фиксы:
  • Typesense healthcheck: wgetcurl, start_period: 60s
  • Networks: onewallet-net, drop top-level declaration для include: compatibility
  • blnkfinance ждёт typesense healthy
  • .gitignore — whitelist для config-файлов

Инцидент 2026-04-15 (CompreFace)

  • CompreFace потерял данные после рестарта (неверная application при создании Verification service) → все KYC-джобы зависли
  • Исправлено вручную (правильная база → новый API key → jobs возобновились)
  • Root cause: нет persisted volumes + нет инструментов восстановления
  • План service-resilience (10%) — см. §9

6. internal-p2p-service — ДЕАКТИВИРОВАН (2026-04-23)

⚠️ Сервис больше не используется. INTERNAL канал выполняется синхронно внутри Payment Manager через SagaService.settleSync(): - Multi-destination inflight Hold (sender → [recipient, revenue]) в authorize() - Commit в одной PG-транзакции в settleSync() - Безадаптерная схема — no Redis Streams, no transit balance

Исторический контекст - Design spec (2026-04-19) — P2P adapter Node.js - Implementation plan — был готов, не реализован - Код оставлен как архивная эталонная реализация паттерна Redis Streams адаптера — пригодится для IPPS/QP адаптеров в Phase 2

Обоснование разворота — см. docs/superpowers/specs/2026-04-22-payment-manager-design.md §3.7.


7. public-tech-docs

  • CLAUDE.md (скелет)

8. Cross-cutting — архитектура, спеки, инфраструктура

8.1 Архитектурные спеки

  • Payment Manager: v2 → v4 → финальный дизайн (2026-04-22, docs/superpowers/specs/2026-04-22-payment-manager-design.md)
  • docs/04-payment-manager.md — архитектура PM (Phase 1/2)
  • docs/18-rule-engine.md — Rule Engine
  • docs/00-system-architecture.md — общая картина (диаграммы обновлены)
  • docs/service-map.md — зависимости + Redis Streams каналы
  • docs/adr/ — директория с шаблоном
  • Transaction history design — blnk как source of truth (упрощение meta_data — auto-propagation Hold meta на children)
  • UML-пакет PM (9 диаграмм .mmd + .png):
  • Intent state machine
  • Responsibility zones
  • Phase 1 INTERNAL P2P
  • Phase 2 External PSP
  • Data consistency timeline
  • Blnk transaction tree
  • Recovery paths
  • Deploy phases
  • Flutter calls

8.2 Инфраструктура / workspace

  • Workspace restructure (2026-04-19): root CLAUDE.md (RU), .claudeignore, .claude/settings.json, CLAUDE.md для каждого проекта (onewallet_base, admin-panel, kyc-service, internal-p2p-service, public-tech-docs)
  • PLANS_MANAGEMENT.md — методология планов
  • TIMELINE.md (RU + EN)
  • Security policy (docs/11-security-policy.md), PPXC security questionnaire, TODO-pii-encryption.md
  • Accountant questions (docs/accountant-questions.md)
  • Router map (puml + png)
  • Garage-S3-SETUP.md — инструкция по S3

9. Открытые и заблокированные планы

9.1 Готовые планы (ожидают реализации)

План Создан Приоритет Объём
PM Phase 1 sweep (INTERNAL sync + history) 2026-04-22 Активен 15 задач. Закрыто: 1, 2, 6, 10, 13. В работе: 3, 4, 5. Осталось: 7, 8, 9, 11, 12, 14, 15.
PM M6 Redis Streams Publish (EXTERNAL) 2026-04-21 Высокий RedisStreamsPublisher + SagaService.dispatch() — нужно после Phase 1 sweep
PM M7 Redis Streams Consume (EXTERNAL) 2026-04-21 Высокий ResultHandler + long-poll endpoint → COMPLETED/FAILED
PM M8 Outbox Worker + Settlement (EXTERNAL) 2026-04-21 Высокий commitInflight + multi-destination для external channels → SETTLED
PM M9 Limits full 2026-04-21 Высокий Daily/monthly limits + Valkey + E2E P2P
PM Limits UI 2026-04-20 Средний Admin Panel секция лимитов
Security async fixes 2026-04-18 Средний 1304-строчный план, статус не отслеживался
~~Internal P2P adapter (Node.js)~~ ~~2026-04-19~~ ОТМЕНЁН INTERNAL стал sync в PM (2026-04-23) — адаптер не нужен

9.2 Не завершённые (in-progress)

План Прогресс Что осталось
admin-panel-kyc-fixes 90% E2E верификация (seed superadmin, Approve→Finalize поток, проверка presigned URLs, admin_audit_log записи)
service-resilience 10% CompreFace: compreface_data volume + docs/ops/compreface-recovery.md + startup API key check; BullMQ: /admin/jobs/retry-failed + /admin/jobs/status, watchdog при старте для stuck in_review; Auth: OTP bottom sheet "already registered", resendOtp() email_exists → /signin, cleanup expired account_request > 24ч
s3-kyc-storage-improvements 0% Cron S3 cleanup (StorageService.deleteFile()), userId в S3-пути, Admin Panel на presigned GET (TTL 10 мин), унификация TTL (код 1ч vs доки 5–10 мин), S3 lifecycle policy на kyc-data

9.3 Заблокированные

План Блокер
mobile-ux-fixes / C-1 Certificate Pinning Ждёт SHA-256 fingerprint от DevOps

10. Известные проблемы

Критические

# Проблема Статус Решение
P-1 CompreFace потерял данные после перезапуска — KYC-джобы зависли Исправлено вручную Named volume + процедура восстановления (план service-resilience 10%)

Средние

# Проблема Статус
P-2 TTL presigned URL расходится — в коде Admin Panel 1 час, в документации 5–10 мин Не исправлено
P-3 S3 cleanup не реализован — удалённые пользователи/KYC не чистят файлы Запланировано
P-4 userId отсутствует в S3-пути — нельзя легко найти файлы конкретного пользователя Запланировано
P-7 Балансы с currency_multiplier: 0 в blnkfinance невозможно исправить через API — только пересоздание Затрагивает только тестовые данные

Низкий приоритет

# Проблема Статус
P-5 CompreFace не проверяет API key при старте Запланировано
P-6 admin-panel-kyc-fixes на 90% — мелкие UI-правки Доделать
P-8 Rate limiting (Phase 2 M4) — отложен, только базовая структура Не критично для MVP
P-9 [DEBUG] OTP логирование в server logs Убрать когда SMTP стабилен

11. Что впереди — roadmap

Ближайшие 2 недели

  1. PM Phase 1 sweep — закрыть оставшиеся 8 задач (settleSync INTERNAL → SETTLED, transaction_events history, эндпоинты, InternalRecoveryCall, интеграционные тесты, Flutter polish — SETTLED без polling, реальная история)
  2. PM M6–M9 (EXTERNAL) — Redis Streams + Settlement + Limits для внешних PSP (после Phase 1 sweep)
  3. CompreFace resilience — named volume + recovery runbook (после инцидента)
  4. S3 KYC cleanup — cron + userId в пути + TTL унификация
  5. admin-panel-kyc-fixes — закрыть 10% хвост, E2E верификация

Следующие крупные фазы

  • IPPS PPXC — PromptPay / Thai QR (Tag 29 + Tag 30)
  • QP API — СБП Top Up, polling статусов
  • Notifications — FCM / APNs + шаблоны + preferences
  • Webhooks — IPPS refund endpoint, signature verification, IP whitelist
  • Agent Portal — SvelteKit PWA для агентов
  • i18n — мультиязычность (Flutter + Admin Panel)

Источники: git log (91 коммит), plans/plans.zip (17 status.md), docs/17-project-status.md, docs/superpowers/specs/, docs/superpowers/plans/.