OneWallet — Отчёт для Product Manager¶
| Период | 2026-04-13 → 2026-04-23 |
| Документ | Сводный отчёт по выполненной работе + открытые планы |
| Обновлён | 2026-04-23 |
Оглавление¶
- Сводка
- onewallet_base — Serverpod backend + Flutter app
- admin-panel — SvelteKit
- kyc-service — Node.js OCR worker
- blnkfinance-service — ledger
- internal-p2p-service — Dart adapter
- public-tech-docs
- Cross-cutting — архитектура, спеки, инфраструктура
- Открытые и заблокированные планы
- Известные проблемы
- Что впереди — 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_dart→minio 3.5.8(pathStyle: true,statObjectвместо workaround наlistAllObjects) onAfterAccountCreatedhook вserver.dart— линковкаauthUserId(UUID!) → usersAuthValidateEndpointBlnkService— 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 (FlutterActivity → FlutterFragmentActivity)
- Разрешения: 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.dart — submitForReview / confirmKycData / retryKycProcessing / getOcrResult / getFailureReason
- kyc_endpoint.dart
- passwords.yaml — kycServiceUrl, 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+ миграция20260417065117678BlnkService.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.checkPerTx → Future<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.ts → validateToken() на каждый запрос → 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 queuekyc-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.js—updateKycResult()/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 + typesenseblnk.json— статическая конфигурацияSETUP.mdrunbook — ledgers, system balances, API keys,MASTER_KEY,passwords.yaml- Docker-фиксы:
- Typesense healthcheck:
wget→curl,start_period: 60s - Networks:
onewallet-net, drop top-level declaration дляinclude:compatibility blnkfinanceждёт typesensehealthy.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 Enginedocs/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 недели¶
- PM Phase 1 sweep — закрыть оставшиеся 8 задач (settleSync INTERNAL → SETTLED, transaction_events history, эндпоинты, InternalRecoveryCall, интеграционные тесты, Flutter polish — SETTLED без polling, реальная история)
- PM M6–M9 (EXTERNAL) — Redis Streams + Settlement + Limits для внешних PSP (после Phase 1 sweep)
- CompreFace resilience — named volume + recovery runbook (после инцидента)
- S3 KYC cleanup — cron +
userIdв пути + TTL унификация - 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/.