Аудит main/audits/2026-10-19-code-quality-architecture/02-findings.md, CQ-020 (план, пункт 21): три Prisma Json-колонки восстанавливаются через as unknown as:
portfolio.service.ts — tbankPortfolio.payload без проверки разворачивается в тело ответа API;
tbank-sync.service.ts — tbankSyncWork.intent приводится к ScreenIntent;
Облегчённая проверка формы на границе чтения для portfolio payload и screen intent; лишние cast'ы на записи удалены. Валидные данные обрабатываются как раньше; повреждённый payload даёт явную внутреннюю ошибку (сейчас — TypeError на .positions.map, то есть тот же 500). Wire contract не меняется.
Acceptance Criteria
В src/ не осталось as unknown as для Prisma Json payload (portfolio, tbank-sync).
Чтение portfolio snapshot и screen intent проходит через одну функцию проверки формы, у неё есть unit-тест на валидный и повреждённый payload.
npm run verify и релевантные e2e (portfolio, sync) проходят.
## Проблема
Аудит `main/audits/2026-10-19-code-quality-architecture/02-findings.md`, CQ-020 (план, пункт 21): три Prisma `Json`-колонки восстанавливаются через `as unknown as`:
- `portfolio.service.ts` — `tbankPortfolio.payload` без проверки разворачивается в тело ответа API;
- `tbank-sync.service.ts` — `tbankSyncWork.intent` приводится к `ScreenIntent`;
- `tbank-sync.repository.ts` — лишний cast литерала `{ sections: [] }` (плюс no-op `JSON.parse(JSON.stringify(...))` рядом).
## Результат и scope
Облегчённая проверка формы на границе чтения для portfolio payload и screen intent; лишние cast'ы на записи удалены. Валидные данные обрабатываются как раньше; повреждённый payload даёт явную внутреннюю ошибку (сейчас — TypeError на `.positions.map`, то есть тот же 500). Wire contract не меняется.
## Acceptance Criteria
- [ ] В `src/` не осталось `as unknown as` для Prisma Json payload (portfolio, tbank-sync).
- [ ] Чтение portfolio snapshot и screen intent проходит через одну функцию проверки формы, у неё есть unit-тест на валидный и повреждённый payload.
- [ ] `npm run verify` и релевантные e2e (portfolio, sync) проходят.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Проблема
Аудит
main/audits/2026-10-19-code-quality-architecture/02-findings.md, CQ-020 (план, пункт 21): три PrismaJson-колонки восстанавливаются черезas unknown as:portfolio.service.ts—tbankPortfolio.payloadбез проверки разворачивается в тело ответа API;tbank-sync.service.ts—tbankSyncWork.intentприводится кScreenIntent;tbank-sync.repository.ts— лишний cast литерала{ sections: [] }(плюс no-opJSON.parse(JSON.stringify(...))рядом).Результат и scope
Облегчённая проверка формы на границе чтения для portfolio payload и screen intent; лишние cast'ы на записи удалены. Валидные данные обрабатываются как раньше; повреждённый payload даёт явную внутреннюю ошибку (сейчас — TypeError на
.positions.map, то есть тот же 500). Wire contract не меняется.Acceptance Criteria
src/не осталосьas unknown asдля Prisma Json payload (portfolio, tbank-sync).npm run verifyи релевантные e2e (portfolio, sync) проходят.