Backend lint проверяет production TypeScript, тесты, JS/CJS/MJS scripts и configs. ESLint 10.11.0 и typescript-eslint 8.70.1 дополнены recommended-пресетами Node, NestJS typed, Jest, import-x с TypeScript resolver, SonarJS, RegExp, Security, Perfectionist и Stylistic. Prettier удалён; форматирование выполняет ESLint. Тернарные выражения допускают одну строку; в многострочном варианте ? и : стоят в начале строк друг под другом. Положение остальных операторов сохранено.
Удалён общий числовой ignore из no-magic-numbers: 289 замечаний устранены предметными локальными и общими константами с сохранением значений и границ. Регрессионная проверка охватывает все ранее разрешённые числа и bigint. Сохранены ограничения на non-null и definite assignment; включён no-explicit-any. Jest globals ограничены тестами, Nest rules — production TS. Порядок объектов, классов, модулей и декораторов не сортируется из-за runtime semantics. Ложные срабатывания документированы точечно.
Исправления включают явный forbidUnknownValues, корректное описание Swagger arrays, одновременное ожидание async assertions и fake timers, линейное удаление дробных нулей, упрощение NCR regex и повторно используемый serializer. Артефакты нагрузочного теста записываются в уникальный временный каталог. dotenv 17.4.2 объявлен прямой runtime-зависимостью для production Prisma config. Публичный OpenAPI не изменился.
Коды ошибок HTTP/auth/banking/Prisma/integrations и используемые значения протокола T-Bank перенесены в строковые enum у соответствующих владельцев. no-restricted-syntax запрещает inline-коды в полях code/errorCode, значения известных protocol families, шаблоны и строковые сравнения кодов; no-unsafe-enum-comparison закреплён как error. Проверки охватывают и однократное использование строки. Fixtures сохраняют независимые wire assertions; новые словари требуют расширения selectors и review.
Строковые значения, обработка неизвестных внешних кодов и публичный OpenAPI сохранены. Значения T-Bank проверяются по vendored proto. Чистые protocol/error imports не загружают DI/Prisma; новая защита не требует дополнительных зависимостей и не расширяет suppression baseline.
Исправлено превышение бюджета p95 в /brokerage-accounts/all/events: общий CatalogDiscoveryRepository.readSources группирует UID через IN по точному сочетанию source/kind/rangeKey вместо отдельных OR для каждой записи. Фильтры, freshness, проверки ревизий и денежные расчёты сохранены. SQLite-регрессия проверяет изоляцию UID, источников и периодов, дубликаты, отсутствующие UID и пустой запрос. На одинаковой синтетической БД профиль 100 запросов / 10 клиентов показал p95 260 → 136 мс, ответы событий и итоги совпадают. Полный исходный e2e после исправления: p95 259 мс, RPC 0; порог 500 мс не менялся. Это локальные измерения, результат CI проверяется отдельно.
Оставшийся технический долг
eslint-suppressions.json содержит 85 существующих нарушений трёх SonarJS rules в 33 файлах: cognitive-complexity (28), no-nested-conditional (51), no-nested-template-literals (6). Baseline ограничивает количество нарушений по файлам, но не измеряет дальнейшее усложнение конкретной функции. Ошибки Security/TypeScript/Jest туда не включены; замена числовых литералов baseline не расширяет.
Проверки
Чистый запуск без dist: npm ci, prisma generate, полный npm run verify — успешно. n/no-missing-require в трёх runtime-скриптах проверяет пути сборки по исходникам; отсутствующие файлы и пакеты продолжают отклоняться. Регрессионный тест не зависит от наличия локальной сборки.
После слияния актуального develop повторно пройдены npm ci и полный npm run verify. Merge меняет только workflows и README; последующая оптимизация чтения каталога проверена полным e2e-набором.
## Что изменилось
Backend lint проверяет production TypeScript, тесты, JS/CJS/MJS scripts и configs. ESLint 10.11.0 и typescript-eslint 8.70.1 дополнены recommended-пресетами Node, NestJS typed, Jest, import-x с TypeScript resolver, SonarJS, RegExp, Security, Perfectionist и Stylistic. Prettier удалён; форматирование выполняет ESLint. Тернарные выражения допускают одну строку; в многострочном варианте `?` и `:` стоят в начале строк друг под другом. Положение остальных операторов сохранено.
Удалён общий числовой ignore из no-magic-numbers: 289 замечаний устранены предметными локальными и общими константами с сохранением значений и границ. Регрессионная проверка охватывает все ранее разрешённые числа и bigint. Сохранены ограничения на non-null и definite assignment; включён no-explicit-any. Jest globals ограничены тестами, Nest rules — production TS. Порядок объектов, классов, модулей и декораторов не сортируется из-за runtime semantics. Ложные срабатывания документированы точечно.
Исправления включают явный forbidUnknownValues, корректное описание Swagger arrays, одновременное ожидание async assertions и fake timers, линейное удаление дробных нулей, упрощение NCR regex и повторно используемый serializer. Артефакты нагрузочного теста записываются в уникальный временный каталог. dotenv 17.4.2 объявлен прямой runtime-зависимостью для production Prisma config. Публичный OpenAPI не изменился.
Коды ошибок HTTP/auth/banking/Prisma/integrations и используемые значения протокола T-Bank перенесены в строковые enum у соответствующих владельцев. `no-restricted-syntax` запрещает inline-коды в полях `code`/`errorCode`, значения известных protocol families, шаблоны и строковые сравнения кодов; `no-unsafe-enum-comparison` закреплён как error. Проверки охватывают и однократное использование строки. Fixtures сохраняют независимые wire assertions; новые словари требуют расширения selectors и review.
Строковые значения, обработка неизвестных внешних кодов и публичный OpenAPI сохранены. Значения T-Bank проверяются по vendored proto. Чистые protocol/error imports не загружают DI/Prisma; новая защита не требует дополнительных зависимостей и не расширяет suppression baseline.
Исправлено превышение бюджета p95 в `/brokerage-accounts/all/events`: общий `CatalogDiscoveryRepository.readSources` группирует UID через `IN` по точному сочетанию source/kind/rangeKey вместо отдельных `OR` для каждой записи. Фильтры, freshness, проверки ревизий и денежные расчёты сохранены. SQLite-регрессия проверяет изоляцию UID, источников и периодов, дубликаты, отсутствующие UID и пустой запрос. На одинаковой синтетической БД профиль 100 запросов / 10 клиентов показал p95 260 → 136 мс, ответы событий и итоги совпадают. Полный исходный e2e после исправления: p95 259 мс, RPC 0; порог 500 мс не менялся. Это локальные измерения, результат CI проверяется отдельно.
## Оставшийся технический долг
eslint-suppressions.json содержит 85 существующих нарушений трёх SonarJS rules в 33 файлах: cognitive-complexity (28), no-nested-conditional (51), no-nested-template-literals (6). Baseline ограничивает количество нарушений по файлам, но не измеряет дальнейшее усложнение конкретной функции. Ошибки Security/TypeScript/Jest туда не включены; замена числовых литералов baseline не расширяет.
## Проверки
- Чистый запуск без `dist`: `npm ci`, `prisma generate`, полный `npm run verify` — успешно. `n/no-missing-require` в трёх runtime-скриптах проверяет пути сборки по исходникам; отсутствующие файлы и пакеты продолжают отклоняться. Регрессионный тест не зависит от наличия локальной сборки.
- После слияния актуального develop повторно пройдены npm ci и полный npm run verify. Merge меняет только workflows и README; последующая оптимизация чтения каталога проверена полным e2e-набором.
- npm ci: воспроизводимая установка, npm audit — 0 vulnerabilities.
- npm run verify: lint, 6 проверок конфигурации ESLint, оба typecheck, 226 unit tests / 37 suites, Prisma generation и build.
- npm run test:e2e: все 263 теста / 21 suite на изолированных SQLite DB.
- npm run test:openapi-contract: проверка после фиксации runtime dotenv.
- Сгенерированный OpenAPI полностью совпадает с документом до изменений.
- Отдельная npm ci --omit=dev --omit=optional --ignore-scripts установка: Prisma config загружается без devDependencies (проверка dependency resolution, не container smoke).
- git diff --check и semantic/Boy Scout review.
Связано с [WealthLedger/main#18](https://git.personal.ksv741.ru/WealthLedger/main/issues/18).
Use owner enums for error and T-Bank protocol values with ESLint regression checks.
Preserve open wire fallbacks and keep protocol imports independent of DI and Prisma.
Verified npm ci, verify, 226 unit tests, 262 isolated e2e tests and unchanged OpenAPI.
codex-bot
changed title from chore: strengthen backend eslint and numeric policy to chore: strengthen backend eslint and value policies2026-09-28 15:20:45 +03:00
Resolve dist imports in runtime scripts against their TypeScript sources.
Keep missing-module checks enabled and cover absent build output in the lint gate.
Verified npm ci, prisma generate and full verify with dist absent at startup.
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.
Что изменилось
Backend lint проверяет production TypeScript, тесты, JS/CJS/MJS scripts и configs. ESLint 10.11.0 и typescript-eslint 8.70.1 дополнены recommended-пресетами Node, NestJS typed, Jest, import-x с TypeScript resolver, SonarJS, RegExp, Security, Perfectionist и Stylistic. Prettier удалён; форматирование выполняет ESLint. Тернарные выражения допускают одну строку; в многострочном варианте
?и:стоят в начале строк друг под другом. Положение остальных операторов сохранено.Удалён общий числовой ignore из no-magic-numbers: 289 замечаний устранены предметными локальными и общими константами с сохранением значений и границ. Регрессионная проверка охватывает все ранее разрешённые числа и bigint. Сохранены ограничения на non-null и definite assignment; включён no-explicit-any. Jest globals ограничены тестами, Nest rules — production TS. Порядок объектов, классов, модулей и декораторов не сортируется из-за runtime semantics. Ложные срабатывания документированы точечно.
Исправления включают явный forbidUnknownValues, корректное описание Swagger arrays, одновременное ожидание async assertions и fake timers, линейное удаление дробных нулей, упрощение NCR regex и повторно используемый serializer. Артефакты нагрузочного теста записываются в уникальный временный каталог. dotenv 17.4.2 объявлен прямой runtime-зависимостью для production Prisma config. Публичный OpenAPI не изменился.
Коды ошибок HTTP/auth/banking/Prisma/integrations и используемые значения протокола T-Bank перенесены в строковые enum у соответствующих владельцев.
no-restricted-syntaxзапрещает inline-коды в поляхcode/errorCode, значения известных protocol families, шаблоны и строковые сравнения кодов;no-unsafe-enum-comparisonзакреплён как error. Проверки охватывают и однократное использование строки. Fixtures сохраняют независимые wire assertions; новые словари требуют расширения selectors и review.Строковые значения, обработка неизвестных внешних кодов и публичный OpenAPI сохранены. Значения T-Bank проверяются по vendored proto. Чистые protocol/error imports не загружают DI/Prisma; новая защита не требует дополнительных зависимостей и не расширяет suppression baseline.
Исправлено превышение бюджета p95 в
/brokerage-accounts/all/events: общийCatalogDiscoveryRepository.readSourcesгруппирует UID черезINпо точному сочетанию source/kind/rangeKey вместо отдельныхORдля каждой записи. Фильтры, freshness, проверки ревизий и денежные расчёты сохранены. SQLite-регрессия проверяет изоляцию UID, источников и периодов, дубликаты, отсутствующие UID и пустой запрос. На одинаковой синтетической БД профиль 100 запросов / 10 клиентов показал p95 260 → 136 мс, ответы событий и итоги совпадают. Полный исходный e2e после исправления: p95 259 мс, RPC 0; порог 500 мс не менялся. Это локальные измерения, результат CI проверяется отдельно.Оставшийся технический долг
eslint-suppressions.json содержит 85 существующих нарушений трёх SonarJS rules в 33 файлах: cognitive-complexity (28), no-nested-conditional (51), no-nested-template-literals (6). Baseline ограничивает количество нарушений по файлам, но не измеряет дальнейшее усложнение конкретной функции. Ошибки Security/TypeScript/Jest туда не включены; замена числовых литералов baseline не расширяет.
Проверки
dist:npm ci,prisma generate, полныйnpm run verify— успешно.n/no-missing-requireв трёх runtime-скриптах проверяет пути сборки по исходникам; отсутствующие файлы и пакеты продолжают отклоняться. Регрессионный тест не зависит от наличия локальной сборки.Связано с WealthLedger/main#18.
chore: strengthen backend eslint and numeric policyto chore: strengthen backend eslint and value policies