[CL-1176] Type-honesty: канон ::text+toNum для NUMERIC из raw в payments/cron #1189

Merged
andrei merged 1 commit from feature/claude-cl1176-type-honesty into master 2026-07-23 00:20:48 +00:00
Owner

Что сделано

Хвост свипа четвёртого прохода (7 кандидатов, из них 6 «работают, но тип лжёт»): 5 файлов приведены к канону ::text-каст в SELECT + toNum() на использовании:

  • payment-balance.service.ts — oversell-guard availableShares;
  • payment-stripe/expire-fail.ts — возврат shares в пул + числовой guard (строка '0' truthy — прежний falsy-guard был number-only);
  • admin-payment/force-operations.ts — то же для force-expire;
  • institutional-payment/execute-bulk.ts — oversell-guard bulk-пути;
  • cron/p2pCircuitBreaker.ts — minPrice/maxPrice/totalVolume: честные типы + toNum перед арифметикой (работала через случайную ToPrimitive-коэрцию Decimal; включая ловушку Decimal(0) || 0 — truthy).

Зачем

Класс auto-match-бага (raw NUMERIC приходит Decimal-объектом; строгие хелперы decimal.ts молча дают 0) закрыт структурно во всех оставшихся местах: лживый number-тип больше нигде не пускает сырое значение в guard/арифметику. Рецидив при будущем рефакторинге теперь ловит компилятор.

План тестирования

tsc чист; eslint правленых файлов 0 warnings; таргетные юниты payments/cron 500 passed; полный сьют 10998 passed / 0 failed.

Где могу ошибаться

  • Ужесточение guard'ов shares (truthiness → shareCount > 0) меняет поведение ТОЛЬКО для строки '0' (прежде после ::text-правки была бы truthy) — для number-случая семантика идентична.
  • circuitBreaker: замена inline-выражений на локальные minPrice/maxPrice/totalVolume — чистый рефакторинг, числа не меняются (toNum = та же Number-коэрция, что делал ToPrimitive).
## Что сделано Хвост свипа четвёртого прохода (7 кандидатов, из них 6 «работают, но тип лжёт»): 5 файлов приведены к канону `::text`-каст в SELECT + `toNum()` на использовании: - `payment-balance.service.ts` — oversell-guard `availableShares`; - `payment-stripe/expire-fail.ts` — возврат shares в пул + числовой guard (строка '0' truthy — прежний falsy-guard был number-only); - `admin-payment/force-operations.ts` — то же для force-expire; - `institutional-payment/execute-bulk.ts` — oversell-guard bulk-пути; - `cron/p2pCircuitBreaker.ts` — minPrice/maxPrice/totalVolume: честные типы + toNum перед арифметикой (работала через случайную ToPrimitive-коэрцию Decimal; включая ловушку `Decimal(0) || 0` — truthy). ## Зачем Класс auto-match-бага (raw NUMERIC приходит Decimal-объектом; строгие хелперы decimal.ts молча дают 0) закрыт структурно во всех оставшихся местах: лживый `number`-тип больше нигде не пускает сырое значение в guard/арифметику. Рецидив при будущем рефакторинге теперь ловит компилятор. ## План тестирования tsc чист; eslint правленых файлов 0 warnings; таргетные юниты payments/cron 500 passed; полный сьют 10998 passed / 0 failed. ## Где могу ошибаться - Ужесточение guard'ов shares (truthiness → `shareCount > 0`) меняет поведение ТОЛЬКО для строки '0' (прежде после ::text-правки была бы truthy) — для number-случая семантика идентична. - circuitBreaker: замена inline-выражений на локальные minPrice/maxPrice/totalVolume — чистый рефакторинг, числа не меняются (toNum = та же Number-коэрция, что делал ToPrimitive).
[CL-1176] type-honesty: канон ::text+toNum для всех NUMERIC из raw в payments/cron
All checks were successful
CI / Telegram Mini App (pull_request) Successful in 2m2s
CI / Python SDK (pull_request) Successful in 30s
CI / Contracts (pull_request) Successful in 2m52s
CI / Secrets Scan (pull_request) Successful in 29s
CI / Prisma Migrate Gate (pull_request) Successful in 1m53s
CI / API (pull_request) Successful in 19m36s
CI / App (pull_request) Successful in 22m3s
878045d484
Хвост свипа четвёртого прохода: 5 файлов с лживыми number-типами полей из
$queryRaw (raw NUMERIC приходит Decimal-объектом) приведены к канону
::text-каст + toNum() на использовании. Поведенчески работали через
случайную ToPrimitive-коэрцию; теперь класс auto-match-бага (isFinite-guard
хелперов молча даёт 0) закрыт структурно. Попутно ужесточены truthiness-
guard'ы shares (строка '0' truthy) до числовых shareCount > 0.
tsc чист, eslint 0, полный сьют 10998 passed.
andrei scheduled this pull request to auto merge when all checks succeed 2026-07-23 00:18:39 +00:00
andrei merged commit 48ad76ab9e into master 2026-07-23 00:20:48 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
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!1189
No description provided.