Аудит main/audits/2026-10-19-code-quality-architecture/02-findings.md, CQ-023/CQ-024 (план, пункт 6):
stock.controller.tssearchScreener после ValidationPipe({ forbidNonWhitelisted: true }) повторно проверяет ключи сырого request.body захардкоженным Set, дублируя список полей StockScreenerCriteriaDto.
StockScreenerService получает TbankAccessService через строковый алиас 'TBANK_ACCESS' (instruments.module.ts) вместо прямого класса-провайдера.
Результат и scope
Удалить дублирующую проверку и алиас; wire contract (400 на неизвестное поле, ответ 200) не меняется.
Acceptance Criteria
Ручной allowed-Set удалён; неизвестные поля тела screener search по-прежнему дают 400 (существующий e2e stocks.e2e-spec.ts).
'TBANK_ACCESS' удалён; StockScreenerService инжектит TbankAccessService напрямую, unit-тест сервиса не ослаблен.
npm run verify проходит.
## Проблема
Аудит `main/audits/2026-10-19-code-quality-architecture/02-findings.md`, CQ-023/CQ-024 (план, пункт 6):
- `stock.controller.ts` `searchScreener` после `ValidationPipe({ forbidNonWhitelisted: true })` повторно проверяет ключи сырого `request.body` захардкоженным `Set`, дублируя список полей `StockScreenerCriteriaDto`.
- `StockScreenerService` получает `TbankAccessService` через строковый алиас `'TBANK_ACCESS'` (`instruments.module.ts`) вместо прямого класса-провайдера.
## Результат и scope
Удалить дублирующую проверку и алиас; wire contract (400 на неизвестное поле, ответ 200) не меняется.
## Acceptance Criteria
- [ ] Ручной `allowed`-Set удалён; неизвестные поля тела screener search по-прежнему дают 400 (существующий e2e `stocks.e2e-spec.ts`).
- [ ] `'TBANK_ACCESS'` удалён; `StockScreenerService` инжектит `TbankAccessService` напрямую, unit-тест сервиса не ослаблен.
- [ ] `npm run verify` проходит.
Уточнение по AC1: вывод аудита CQ-023 не подтвердился. После удаления ручного allowed-Set e2e stocks.e2e-spec.ts ("validates screener input…") вернул 200 вместо 400: глобальный ValidationPipe({ whitelist: true }) из configureApp срезает неизвестные ключи раньше, чем param-pipe с forbidNonWhitelisted успевает их увидеть. Поэтому проверка сырого body сохранена и снабжена поясняющим комментарием. Корректное устранение дубля — перенести forbidNonWhitelisted в глобальный pipe. Это меняет wire-поведение всех endpoint'ов (400 вместо тихого среза), поэтому вынесено за scope этой задачи.
AC2 ('TBANK_ACCESS' → прямой TbankAccessService) выполнен. npm run verify exit 0 (41 suites / 308 tests), e2e stocks.e2e-spec.ts 48/48.
Уточнение по AC1: вывод аудита CQ-023 не подтвердился. После удаления ручного `allowed`-Set e2e `stocks.e2e-spec.ts` ("validates screener input…") вернул 200 вместо 400: глобальный `ValidationPipe({ whitelist: true })` из `configureApp` срезает неизвестные ключи раньше, чем param-pipe с `forbidNonWhitelisted` успевает их увидеть. Поэтому проверка сырого body сохранена и снабжена поясняющим комментарием. Корректное устранение дубля — перенести `forbidNonWhitelisted` в глобальный pipe. Это меняет wire-поведение всех endpoint'ов (400 вместо тихого среза), поэтому вынесено за scope этой задачи.
AC2 (`'TBANK_ACCESS'` → прямой `TbankAccessService`) выполнен. `npm run verify` exit 0 (41 suites / 308 tests), e2e `stocks.e2e-spec.ts` 48/48.
Решение владельца (2026-11-02): глобальный forbidNonWhitelisted не включаем. Остальные endpoint'ы продолжают молча отбрасывать лишние поля, 400 на них не вводится. Ручная проверка сырого body в searchScreener остаётся намеренно и не является дублированием: CQ-023 закрыт как «не подтверждён».
Решение владельца (2026-11-02): глобальный `forbidNonWhitelisted` не включаем. Остальные endpoint'ы продолжают молча отбрасывать лишние поля, 400 на них не вводится. Ручная проверка сырого body в `searchScreener` остаётся намеренно и не является дублированием: CQ-023 закрыт как «не подтверждён».
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-023/CQ-024 (план, пункт 6):stock.controller.tssearchScreenerпослеValidationPipe({ forbidNonWhitelisted: true })повторно проверяет ключи сырогоrequest.bodyзахардкоженнымSet, дублируя список полейStockScreenerCriteriaDto.StockScreenerServiceполучаетTbankAccessServiceчерез строковый алиас'TBANK_ACCESS'(instruments.module.ts) вместо прямого класса-провайдера.Результат и scope
Удалить дублирующую проверку и алиас; wire contract (400 на неизвестное поле, ответ 200) не меняется.
Acceptance Criteria
allowed-Set удалён; неизвестные поля тела screener search по-прежнему дают 400 (существующий e2estocks.e2e-spec.ts).'TBANK_ACCESS'удалён;StockScreenerServiceинжектитTbankAccessServiceнапрямую, unit-тест сервиса не ослаблен.npm run verifyпроходит.Уточнение по AC1: вывод аудита CQ-023 не подтвердился. После удаления ручного
allowed-Set e2estocks.e2e-spec.ts("validates screener input…") вернул 200 вместо 400: глобальныйValidationPipe({ whitelist: true })изconfigureAppсрезает неизвестные ключи раньше, чем param-pipe сforbidNonWhitelistedуспевает их увидеть. Поэтому проверка сырого body сохранена и снабжена поясняющим комментарием. Корректное устранение дубля — перенестиforbidNonWhitelistedв глобальный pipe. Это меняет wire-поведение всех endpoint'ов (400 вместо тихого среза), поэтому вынесено за scope этой задачи.AC2 (
'TBANK_ACCESS'→ прямойTbankAccessService) выполнен.npm run verifyexit 0 (41 suites / 308 tests), e2estocks.e2e-spec.ts48/48.Решение владельца (2026-11-02): глобальный
forbidNonWhitelistedне включаем. Остальные endpoint'ы продолжают молча отбрасывать лишние поля, 400 на них не вводится. Ручная проверка сырого body вsearchScreenerостаётся намеренно и не является дублированием: CQ-023 закрыт как «не подтверждён».