[SEC-Q2] AML: streaming-обработка large payouts вместо batch #1152
Closed
opened 2026-07-19 17:05:42 +00:00 by andrei
·
4 comments
No Branch/Tag specified
master
agent/devops/pix-15311
agent/devops/pix-15306
agent/cto/pix-15177
main
agent-fullstack/pix-8664
feature/claude-cl1176-payout-e2e
feature/claude-cl1176-guard-dbname-fix
feature/claude-cl1176-e2e-in-ci
feature/claude-cl1176-conditional-prisma-mock
feature/claude-cl1176-exchange-buyback-e2e
agent/devops/pix-14678
feature/claude-cl1176-webhook-distribution-e2e
feature/claude-cl1176-type-honesty
feature/claude-cl1176-cancel-expire-e2e
fix/sentry-lenis-empty-touch
agent/fullstack/pix-13735-news-title-scope
agent/fullstack/pix-13735-newsai-fixtures
agent/fullstack/pix-13735-news-safelist
fix/low-audit-20260719
chore/monthly-deps-20260719
agent/compliance/pix-13735
agent/fullstack/pix-14259
fix/blog-properties-links-20260718
fix/news-sitemap-public-parity-20260718
fix/nowpayments-probe-alert-hygiene-20260718
agent/sentry/pix-14176
agent/cto/pix-14168
agent/fullstack/pix-14161
agent/cto/pix-14162
codex/react-doctor-suppression-20260717
agent/fullstack/pix-14153
agent/cto/pix-14151
agent/fullstack/pix-14150
agent/fullstack/pix-14132
agent/fullstack/pix-14144
deploy/pix-14136
agent/fullstack/pix-14136
codex/docs-audit-status-20260717
codex/fix-ma0710-m2-lending-confirmations-20260717
codex/fix-ma0710-m1-lazy-hydrate-accessibility-20260717
codex/fix-ma0710-h5-timelock-bootstrap-contract-20260717
codex/fix-ma0710-h4-eurt-timeout-reconciliation-20260717
codex/fix-ma0710-h3-purchase-accounting-20260717
codex/fix-ma0710-h2-stripe-post-actions-20260716
agent/fullstack/pix-14122
agent/fullstack/pix-14118
agent/cto/pix-14065
codex/fix-hero-fallback-copy-20260716
agent/fullstack/pix-14030
codex/fix-react-doctor-lazyhydrate-20260716
agent/fullstack/pix-13809
codex/stripe-payment-create-atomic-20260714
agent/devops/pix-13984
agent/cto/pix-13978
agent/compliance/pix-13968
agent/fullstack/pix-13935
agent/fullstack/pix-13886
agent/fullstack/pix-13744
fix/pix-13874-zod-record-schema
agent/fullstack/pix-13760-v2
fix/pix-13839-compliance-locale
agent/fullstack/pix-13846
agent/fullstack/pix-13760
fix/pix-13844-cabinet-meta
agent/devops/pix-13833-pr1074
fix/PIX-13775-rooms-share-price
fix/pix-13738-compliance-copy
agent/cto/pix-13726
codex/institutional-bulk-lock-order-20260711
codex/payment-lock-legacy-audit-20260711
codex/payment-lock-order-20260711
codex/idempotency-legacy-compat-20260710
codex/idempotency-fingerprint-conflict-20260710
codex/stripe-fallback-idempotency-20260710
codex/payout-serialization-retry-20260710
codex/tg-balance-idempotency-20260710
codex/lending-repay-race-20260710
feature/claude-vault-withdraw-failclosed-20260710
feature/claude-mega-audit-20260710-5
feature/claude-mega-audit-20260710-4
feature/claude-mega-audit-20260710-3
feature/claude-mega-audit-20260710-2
fix/qa-password-reset-email
feature/claude-api-eaddrinuse-retry
archive/master-deploy-pix8054
archive/pr-913
archive/pix-7201-apr-hero-fix-v2
archive/fix--rate-limit-ipv6-networkform-20260614
archive/pix-7201-apr-hero-fix-clean
archive/local-pix-8195
archive/fix--pix-9866-it-faq-launch-date
archive/fix--public-activity-pii-fallback-test
archive/fix--pix-ci-pr-janitor-checkout
archive/fix--pix-9573-faq-withdrawal-minimum
archive/fix--pix-9384-consolidated-overclaim-sweep
archive/fix--pix-9125-mui-color-resolve
archive/fix--pix-9092-swap-mui-color-resolve
archive/fix--pix-8998-i18n-votes-securities
archive/fix--pix-9050-v2
archive/fix--pix-8297-income-overclaim
archive/fix--pix-8381-bridge-lz-disabled
archive/fix--pix-8943-launch-date-i18n-202606161833
archive/fix--pix-8239-compliance-rebase
archive/fix--pix-8284-blog-remaining-overclaims
archive/fix--pix-8284-blog-remaining-overclaims-v2
archive/fix--pix-8190-legal-structure-overclaim
archive/fix--pix-8164-rebase
archive/fix--pix-8239-compliance-followup
archive/fix--pix-7916-remaining-overclaims
archive/fix--pix-8105-v3
archive/fix--pix-7901-cashflow-v2
archive/fix--pix-7901-cashflow-messaging
archive/fix--pix-7860-compliance-messaging
archive/fix--pix-7839-apply-seed-workflow
archive/fix--pix-7766-compliance-fr-es
archive/fix--pix-7766-fr-es-compliance-overclaim
archive/fix--pix-7808-ru-launch-date
archive/fix--pix-7734-seo-price-live
archive/fix--pix-7713-spv-erc1155
archive/fix--pix-7749-blog-normalize
archive/fix--pix-6193-contract-info
archive/fix--pix-7294-guaranteed-secondary-marketplace
archive/fix--pix-7613-blog-disclaimers
archive/fix--pix-13865-prerender-fix
archive/fix--pix-6172-public-news-guard
archive/fix--pix-13865-prerender-warnings
archive/fix--pix-13720-ci-skill-md-and-plan-phrases
archive/fix--pix-13713-regression-test-rooms-pagination
archive/fix--pix-12450-rooms-pagination
archive/fix--pix-10565-guaranteed-tokenization-guide
archive/fix--pix-11214-appError-eslint
archive/fix--pix-10617-protobufjs-security
archive/fix--news-ai-provider-chain
archive/fix--pix-10285-comma-splice
archive/fix--pix-10067-id-consob-faq
archive/fix--claude-cl-redis-adapter-mock-on
archive/fix--deploy-prev-sha-nonsticky
archive/fix--deploy-release-gate-timeout
archive/fix--PIX-4255-db-restore-readiness
archive/feature--twitter-oauth-prod
archive/fix--PIX-10911-mica-bio-overclaim
archive/feature--tg-notify-deploy-integration
archive/feature--claude-remediation-b3
archive/feature--pix-6445-compliance-sanitizer
archive/feature--claude-pix-9050-rebase
archive/feature--claude-pix-9116-rebase
archive/feature--claude-pr-janitor
archive/feature--claude-pix-9041-rebase
archive/feature--claude-pix-8943-rebase
archive/feature--claude-pix-8991-rebase
archive/feature--claude-pix-8556-api-compliance
archive/feature--claude-pix-8674-rebase
archive/feature--claude-pix-8644-rebase
archive/feature--claude-pix-7878-rebase
archive/feature--claude-pix-8259-rebase
archive/feature--claude-pix-8105-rebase
archive/feature--claude-pix-10315-rebase
archive/feature--claude-pix-10084-rebase
archive/feature--claude-pix-6734-apr-disclaimer
archive/feature--claude-google-admin-login
archive/feature--claude-mega-audit-w-20260629
archive/feature--claude-marketing-copy-fix
archive/feature--claude-cl-softdelete-consistency
archive/feature--claude-dep-update-2026-06-14
archive/feature--claude-cl-rm-stale-telegram-mock
archive/feature--claude-cl-kyc-idem-stale-recovery
archive/feature--claude-cl-rm-fomo-countdown
archive/feature--claude-cl-regsummary-softdelete
archive/feature--claude-cl-fix-deploy-push-413
archive/feature--claude-cl-fix-forecasttab-mock-path
archive/feature--claude-cl-kraken-fetch-timeout
archive/feature--claude-cl-escrow-deposit-window
archive/feature--claude-audit-wave4-admin-2fa
archive/feature--admin-modernize-116
archive/feat--pix-10603-vault-cleanup
archive/feat--cto-eslint-fixes
archive/feat--pix-6076-public-compliance-copy
archive/feat--PIX-8170-soften-blog-income-claims
archive/feat--PIX-7409-health-limiter-v2
archive/feat--PIX-7860-public-copy-safety
archive/feat--PIX-7409-health-limiter
archive/cto--pix-6373-prod
archive/devops--pix-12433-telegram-config
archive/codex--static-release-retention-20260702
archive/codex--session-blacklist-audit-doc-sync-20260701
archive/compliance-pix-6561-final
archive/codex--remove-article-preview-cdn-20260701
archive/codex--obj-id-static-redirect-20260604
archive/codex--i18n-aria-namespace-audit-20260702
archive/codex--google-oauth-admin-guard-20260701
archive/codex--dao-timelock-admin-handoff-20260701
archive/codex--europatech-csp-zero-hash
archive/backup--agent-devops-pix-12477
archive/backup--agent-devops-pix-13505-brotli
archive/codex--b3-yield-distribution-reconcile-20260701
archive/agent-ir-investor-relations--pix-9995
archive/agent-sentry--pix-8509
archive/agent-ir-investor-relations--pix-9966
archive/agent-ir-investor-relations--pix-9863
archive/agent-ir-investor-relations--pix-9048
archive/agent-ir-investor-relations--pix-9658
archive/agent-ir-investor-relations--pix-7057
archive/agent-ir-investor-relations--pix-7058
archive/agent-ir-investor-relations--pix-8976
archive/agent-ir-investor-relations--pix-7019
archive/agent-ir-investor-relations--pix-6521
archive/agent-ir-investor-relations--pix-6494
archive/agent-ir-investor-relations--pix-6353
archive/agent-ir-investor-relations--pix-6478
archive/agent-ir-investor-relations--pix-6335
archive/agent-fullstack--pix-8953
archive/agent-fullstack--pix-9412
archive/agent-ir-investor-relations--pix-10201
archive/agent-fullstack--pix-8839
archive/agent-fullstack--pix-8828
archive/agent-fullstack--pix-8786
archive/agent-fullstack--pix-8599
archive/agent-fullstack--pix-8297
archive/agent-fullstack--pix-8501
archive/agent-fullstack--pix-8284
archive/agent-fullstack--pix-8239
archive/agent-fullstack--pix-8259
archive/agent-fullstack--pix-8190
archive/agent-fullstack--pix-8170
archive/agent-fullstack--pix-8195
archive/agent-fullstack--pix-8105
archive/agent-fullstack--pix-8072
archive/agent-fullstack--pix-8164
archive/agent-fullstack--pix-7916
archive/agent-fullstack--pix-7915
archive/agent-fullstack--pix-7939
archive/agent-fullstack--pix-7901
archive/agent-fullstack--pix-7884
archive/agent-fullstack--pix-7878
archive/agent-fullstack--pix-7857
archive/agent-fullstack--pix-7860
archive/agent-fullstack--pix-7844
archive/agent-fullstack--pix-7808
archive/agent-fullstack--pix-7838
archive/agent-fullstack--pix-7839
archive/agent-fullstack--pix-7790
archive/agent-fullstack--pix-7791
archive/agent-fullstack--pix-7772
archive/agent-fullstack--pix-7713
archive/agent-fullstack--pix-7734
archive/agent-fullstack--pix-7771
archive/agent-fullstack--pix-7650
archive/agent-fullstack--pix-7687
archive/agent-fullstack--pix-7623
archive/agent-fullstack--pix-7597
archive/agent-fullstack--pix-7578
archive/agent-fullstack--pix-7552
archive/agent-fullstack--pix-7540
archive/agent-fullstack--pix-7539
archive/agent-fullstack--pix-7527
archive/agent-fullstack--pix-7510
archive/agent-fullstack--pix-7436
archive/agent-fullstack--pix-7507
archive/agent-fullstack--pix-7416
archive/agent-fullstack--pix-7425
archive/agent-fullstack--pix-7409
archive/agent-fullstack--pix-7399-delivery
archive/agent-fullstack--pix-7400-compliance-copy
archive/agent-fullstack--pix-7400-compliance-copy-v2
archive/agent-fullstack--pix-7389
archive/agent-fullstack--pix-7375
archive/agent-fullstack--pix-7376
archive/agent-fullstack--pix-7337
archive/agent-fullstack--pix-7344
archive/agent-fullstack--pix-7360
archive/agent-fullstack--pix-7304
archive/agent-fullstack--pix-7318
archive/agent-fullstack--pix-7317
archive/agent-fullstack--pix-7010
archive/agent-fullstack--pix-7172
archive/agent-fullstack--pix-7001
archive/agent-fullstack--pix-6961
archive/agent-fullstack--pix-6980
archive/agent-fullstack--pix-6867
archive/agent-fullstack--pix-6743
archive/agent-fullstack--pix-6744
archive/agent-fullstack--pix-6866
archive/agent-fullstack--pix-6659
archive/agent-fullstack--pix-6710
archive/agent-fullstack--pix-6690
archive/agent-fullstack--pix-6618
archive/agent-fullstack--pix-6607
archive/agent-fullstack--pix-6639
archive/agent-devops--pix-8163
archive/agent-devops--pix-8189
archive/agent-devops--pix-8054
archive/agent-devops--pix-6394
archive/agent-devops--pix-13687
archive/agent-devops--pix-7974
archive/agent-cto--pix-9487
archive/agent-cto--pix-9610
archive/agent-devops--pix-11297
archive/agent-cto--pix-9486
archive/agent-cto--pix-9457
archive/agent-cto--pix-9483
archive/agent-cto--pix-9148
archive/agent-cto--pix-9116
archive/agent-cto--pix-9089
archive/agent-cto--pix-8944
archive/agent-cto--pix-9050
archive/agent-cto--pix-8943
archive/agent-cto--pix-8878
archive/agent-cto--pix-8881
archive/agent-cto--pix-8882
archive/agent-cto--pix-8755
archive/agent-cto--pix-8724
archive/agent-cto--pix-8744
archive/agent-cto--pix-8655
archive/agent-cto--pix-8695
archive/agent-cto--pix-8674
archive/agent-cto--pix-8644
archive/agent-cto--pix-8592
archive/agent-cto--pix-8518
archive/agent-cto--pix-8494
archive/agent-cto--pix-8469
archive/agent-cto--pix-8480
archive/agent-cto--pix-7532
archive/agent-cto--pix-8371
archive/agent-cto--pix-7655
archive/agent-cto--pix-7495
archive/agent-cto--pix-7201
archive/agent-cto--pix-7494
archive/agent-cto--pix-7195
archive/agent-cto--pix-7178
archive/agent-cto--pix-7196
archive/agent-cto--pix-7133
archive/agent-cto--pix-7143
archive/agent-cto--pix-7138
archive/agent-cto--pix-7097
archive/agent-cto--pix-7040
archive/agent-cto--pix-7109
archive/agent-cto--pix-7032
archive/agent-cto--pix-7039
archive/agent-cto--pix-7038
archive/agent-cto--pix-6977
archive/agent-cto--pix-7022
archive/agent-cto--pix-7014
archive/agent-cto--pix-6967
archive/agent-cto--pix-6962
archive/agent-cto--pix-6960
archive/agent-cto--pix-6949
archive/agent-cto--pix-6953
archive/agent-cto--pix-6918
archive/agent-cto--pix-6850
archive/agent-cto--pix-6891
archive/agent-cto--pix-6867
archive/agent-cto--pix-6685
archive/agent-cto--pix-6734
archive/agent-cto--pix-6703
archive/agent-cto--pix-6678
archive/agent-cto--pix-6675
archive/agent-cto--pix-6664
archive/agent-cto--pix-6648
archive/agent-cto--pix-6658
archive/agent-cto--pix-6650
archive/agent-cto--pix-6632
archive/agent-cto--pix-6634
archive/agent-cto--pix-6642
archive/agent-cto--pix-6602
archive/agent-cto--pix-6623
archive/agent-cto--pix-6613
archive/agent-cto--pix-6601
archive/agent-cto--pix-6570
archive/agent-cto--pix-6554
archive/agent-cto--pix-6553
archive/agent-cto--pix-6540
archive/agent-cto--pix-6542
archive/agent-cto--pix-13359-api-build-fix-rebased
archive/agent-cto--pix-13359-api-build-fix
archive/agent-cto--pix-6396-doc-update
archive/agent-cto--pix-12568
archive/agent-cto--pix-12858
archive/agent-cto--pix-13073-redis-ci-fix
archive/agent-cto--pix-11506
archive/agent-cto--pix-11505
archive/agent-cto--pix-11576-review-complete
archive/agent-content-writer--pix-7457
archive/agent-cto--pix-11101
archive/agent-compliance--pix-9887
archive/agent-compliance--pix-7344-v2
archive/agent-compliance--pix-7173
archive/agent-compliance--pix-9696
archive/agent-compliance--pix-6577
archive/agent-compliance--pix-10382-rebased
archive/agent-compliance--pix-10382
archive/agent-compliance--pix-10315
archive/agent-compliance--pix-10084
archive/agent-cmo--pix-6407
archive/agent
archive/agent-4922b3c6-a783-4afd-941b-e22186f4f40f--pix-7016
archive/agent-27a1dc8e-9e87-48b3-8ab7-0603a2d5374a--pix-9387
sale-ready-20260629
v9.0
v4.0
v3.0
No labels
ci-failing
duplicate
needs-rebase
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
europa-tech-srl/europatech#1152
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Из SEC-Q2 MEDIUM backlog (аудит, срез 2026-07-10).
Крупные выплаты проходят AML-проверку батчем; окно между batch-прогонами — слепая зона. Перевести на streaming/по-событийную проверку крупных payout до исполнения (порог из конфига, precise money math через mulEur, критические секции FOR UPDATE).
Гап подтверждён точной цепочкой (анализ 2026-07-20, master). В отличие от #1151/#1154/#1155 — это РЕАЛЬНЫЙ остаточный гап.
Слепая зона для payout в диапазоне €5,000–€25,000:
LARGE_PAYOUT_THRESHOLD=€5,000(api/src/services/aml/thresholds.ts:31).payoutAmount > €25,000(request-bank-payout.ts:164→ statusPENDING_REVIEW).PENDINGи немедленно исполняется:request-bank-payout.ts:340-341(SEPA-AUTO-02) —initiateStripePayoutсразу после commit. Крипто-путь аналогично.checkLargePayouts(api/src/services/aml/rules/large-payouts.ts), запускается cronaml-monitoringпо расписанию1,16,31,46 * * * *= каждые 15 мин (startCrons.metadata.ts:54). Скан флагит даже ужеCOMPLETEDpayout — постфактум.Итог: вывод €5K–€25K уходит из системы до любой AML/sanctions-проверки; окно слепоты до 15 мин. inline-гейты на пути есть (KYC
checkKyc:true, Travel Rule TFR, daily/monthly caps, CTR), но AML sanctions/watchlist-скрининг крупного вывода ДО исполнения отсутствует для этого диапазона.Блокер на реализацию — compliance/product decision (regulatory implication, не чистая техника):
PENDING_REVIEW(ручной разбор) / авто-hold с авто-очисткой если чисто / снизить сам review-порог €25K→€5K?Технический план после решения: inline-хук в
request-bank-payout.ts/request-crypto-payout.tsПЕРЕД SEPA-AUTO-02/крипто-исполнением — синхронный sanctions/watchlist-скрин; при hit → status HOLD/PENDING_REVIEW вместо авто-payout; идемпотентность; batch остаётся backstop; TDD + i18n новых сообщений.Policy решена (CEO 2026-07-20): полный inline AML (все правила) перед исполнением payout. Готовый план реализации (дизайн изучен, worktree-разведка выполнена).
Архитектура (аддитивная, обратно совместимая — batch-путь scan.ts не ломается):
checkX(since, opts?: { userId?: string })(api/src/services/aml/rules/*.ts): приopts.userIdзаменятьuserId: { not: SYSTEM_USER_ID }наuserId: opts.userId(single-user скрин). scan.ts вызывает без opts → без изменений.runAmlScan(scan.ts:98-140: dedup по userId:ruleCode против OPEN/INVESTIGATING +amlAlert.create+ risk-score recalc + авто-SAR для CRITICAL/HIGH) в общуюpersistAmlResults(results)— переиспользуется inline и batch (DRY).screenUserPayoutInline(userId): Promise<{ flagged: boolean; alerts: RuleResult[] }>— гонит все применимые правила с{userId}за релевантные окна (Promise.all), persist-ит через (2).request-bank-payout.tsиrequest-crypto-payout.tsПЕРЕД SEPA-AUTO-02 (request-bank-payout.ts:340) / крипто-исполнением: еслиpayoutAmount >= LARGE_PAYOUT_THRESHOLD(€5K) →screenUserPayoutInline; приflagged→ создавать payout со статусомPENDING_REVIEW(блок авто-исполнения) вместоPENDING. Batch-скан остаётся backstop.Почему не реализовано в этой сессии (named blocker, не усталость): это путь ВЫВОДА СРЕДСТВ (самый дорогой money/compliance). Правильная реализация = 12-файловый рефактор + persist-экстракция + 2 money-хука + полное покрытие. По L20 (cost-of-error = real money) вкатывать сырой AML-код в withdrawal-path наспех = риск заблокировать легитимные выводы или пропустить санкционные. Требует свежей выделенной сессии + CEO approval на merge (Rule C financial logic). Дизайн выше — готов к исполнению.
Часть 1/2 реализована и закоммичена (commit
3abce21, ветка feature/claude-sec-q2-1152-aml-inline).api/src/services/aml/inline-screen.ts—screenUserPayoutInline(userId, now): прогоняет 8 применимых batch AML-правил за 72h-окно (widest rule window) и возвращает флаги только целевого пользователя. Чистая функция детекции, переиспользует правила as-is (ноль изменений rule-логики, scan.ts, money-path). 4 unit-теста green, tsc+eslint clean.ponytail-ceiling помечен: O(window)-скан на payout (приемлемо — payout редкий, ≤3/user/day, pre-execution gate не hot-path); часть 2 может протолкнуть userId в WHERE правил для O(user).
Часть 2/2 (следующий инкремент, money-critical, требует CEO merge-approval — Rule C):
persistAmlResults(results)изscan.ts:82-210(dedup + amlAlert.create + risk-score + авто-SAR + escalation + TG) в общий модуль; scan.ts и inline-screen переиспользуют (DRY).request-bank-payout.ts(перед SEPA-AUTO-02, :340) иrequest-crypto-payout.ts: если payoutAmount >= LARGE_PAYOUT_THRESHOLD →screenUserPayoutInline; при flagged → persist + статус PENDING_REVIEW (блок авто-исполнения). Batch остаётся backstop.Часть 2 меняет путь ВЫВОДА СРЕДСТВ — по Rule C требует explicit CEO approval на merge + code-reviewer + 7/7 CI.
Реализовано и смержено (PR #1165, CI 8/8 green, 2 раунда code-review).
Слепая зона €5K–€25K закрыта: inline AML pre-screen перед авто-исполнением вывода.
aml/inline-screen.ts— screenUserPayoutInline: 12 payout-релевантных правил за окно пользователя, dismissal-suppression (кроме санкций/гео-риска).aml/persist.ts— persistAmlResults вынесен из scan.ts (DRY, batch+inline).request-bank-payout.ts/request-crypto-payout.ts— screen до SEPA-AUTO/крипто; флаг → PENDING_REVIEW; scheduled-канал тоже скринится (gate по Math.max(amount,maxAmount)).Code-review поймал и закрыл: CRITICAL scheduled-bypass, HIGH недостающие правила, MEDIUM suppression + sanctions-ruleCode. Fail-closed на падение screen. 10957 API + 191 integration tests green.