diff --git a/development/audit-remediation.md b/development/audit-remediation.md index c066dba..81977e3 100644 --- a/development/audit-remediation.md +++ b/development/audit-remediation.md @@ -227,7 +227,7 @@ authority. | WL-P2-03 | Сделать refresh rotation атомарной. | backend, specs, docs | done | [`2026-08-23-harden-auth-and-cache-concurrency`](../../specs/openspec/changes/archive/2026-08-23-harden-auth-and-cache-concurrency/) | — | 2026-08-23; backend `c77b3cf`, specs `6e20cdf`, docs `8568e7b`; CAS one-winner regression test passed. | | WL-P2-04 | Синхронизировать runtime, OpenAPI и auth success statuses. | backend, frontend | done | [`2026-08-24-align-api-contract-and-client-resilience`](../../specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/) | — | 2026-08-24; backend `9bd3400`, frontend `6d892da`, specs `800450d`, docs `b91280c`; metadata regression, frontend OpenAPI check и runtime/snapshot SHA совпали. | | WL-P2-05 | Восстановить runnable backend e2e gate. | backend | deferred | — | Пересмотреть после следующей stable Prisma: три чистых `migrate deploy` на Node 22 должны пройти подряд. | 2026-08-23; Prisma 7.9.1 на Node 22 воспроизводимо возвращает пустой schema-engine error даже для fresh SQLite DB; published latest также 7.9.1. | -| WL-P2-06 | Добавить проходящий app/test TypeScript gate backend. | backend | done | [`2026-08-23-make-local-verification-agent-safe`](../../specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/) | — | 2026-08-23; backend `71d57d6`, specs `72444db`, docs `293df9c`; `npm run typecheck:app` и `npm run typecheck:test` — passed. | +| WL-P2-06 | Добавить проходящий app/test TypeScript gate backend. | backend | done | [`2026-08-23-make-local-verification-agent-safe`](../../specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/) | — | 2026-08-23; backend `71d57d6`, specs `72444db`, docs `293df9c`; `npm run typecheck:app` и `npm run typecheck:test` — passed. [2026-09-13: включён strict по P1-10](#2026-09-13--wl-p2-06-strict-typescript). | | WL-P2-07 | Сохранять cached data во время background refetch. | frontend | done | [`2026-08-24-align-api-contract-and-client-resilience`](../../specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/) | — | 2026-08-24; frontend `6d892da`, specs `800450d`, docs `b91280c`; observable Accounts/Portfolio refetch tests и `npm run verify` — passed (17 files, 55 tests). | | WL-P2-08 | Нормализовать cold-start refresh failure. | frontend | done | [`2026-08-24-align-api-contract-and-client-resilience`](../../specs/openspec/changes/archive/2026-08-24-align-api-contract-and-client-resilience/) | — | 2026-08-24; frontend `6d892da`, specs `800450d`, docs `b91280c`; cold-start и protected-401 transport-failure tests passed. | | WL-P2-09 | Проверять backend runtime OpenAPI против frontend snapshot. | backend, frontend | done | [`2026-08-23-make-local-verification-agent-safe`](../../specs/openspec/changes/archive/2026-08-23-make-local-verification-agent-safe/) | — | 2026-08-23; frontend `7a3048c`, backend `71d57d6`, specs `72444db`, docs `293df9c`; runtime и snapshot SHA-256 совпали, frontend `npm run openapi:check` — passed. | @@ -253,6 +253,85 @@ authority. Terminal evidence добавляется сюда только после завершения соответствующего change. +### 2026-09-13 — WL-P2-06: strict TypeScript + +Поставка backend: commit `346a6f0` (`refactor: enforce strict backend typing`). + +По продолжению P1-10 в [общем tsconfig](../../backend/tsconfig.json) включён +`strict: true` без отключения отдельных strict-проверок; +`noFallthroughCasesInSwitch` сохранён отдельно. Убраны избыточные настройки, +которые теперь включает `strict`. + +После замечания владельца вариант с definite-assignment `!` заменён: +в 14 файлах 315 полей DTO объявлены через `declare`. Заполнение входных DTO +принадлежит Nest/class-transformer, ответные DTO описывают возвращаемые объекты. +`declare` не генерирует поля со значением `undefined` и не подменяет проверку +входных данных. Optional/nullable-типы, декораторы и валидация сохранены. +В [TbankClient](../../backend/src/tbank/tbank.client.ts) +`getOpenAccounts` и `getDividends` задают тип результата на `call`, +как соседние RPC; тип параметра `.then` выводится из этого результата. + +В [ESLint](../../backend/eslint.config.mjs) включён +`@typescript-eslint/no-non-null-assertion: error`. Он не охватывает `field!: Type`, +поэтому `no-restricted-syntax` отдельно запрещает definite-assignment `!` +в свойствах и переменных. Устранены также 51 прежний non-null assertion и +четыре definite-assignment assertions в тестах: используются сужение типов, +локальные значения, типизированные результаты фильтрации и runtime assertions +в тестах. Транзакции, проверки доступа, cache generation и денежная точность +сохранены; отсутствующая категория в сводке приводит к явной внутренней ошибке. + +Проверено на Node 22.21.0, backend `3cf883e` с указанными изменениями: + +- `npm run verify` — passed: lint без warnings, strict app/test typechecks, + 35 Jest suites / 257 tests, Prisma generation и production build. +- `DATABASE_URL=file:/tmp/wealthledger-declared-dto-openapi-20260913.db npm run test:openapi-contract` + — passed, 1 test; frontend snapshot не менялся. +- TypeScript Compiler API подтвердил все strict options в app/test/build/dev + configs. Каждый config отклоняет шесть примеров: неинициализированное поле, + несовместимый callback, `null` вместо строки, implicit `any`/`this`, доступ + к `unknown` в `catch` (TS2564, TS2345, TS2322, TS7006, TS2683, TS18046). +- Проверка ESLint через `lintText` подтверждает ошибки для `value!`, `field!` + и `let value!`; декларация DTO без `!` разрешена. +- Новые тесты ValidationPipe проходят до и после замены деклараций: + обязательные credentials, нормализация email, вложенные money DTO и + обязательный version с optional-полями `PartialType`. Дополнены проверки + инструментов без UID; отдельный тест проверяет имя категории и ошибку + при нарушенной ссылке в банковской сводке. +- `NODE_ENV=development NODE_OPTIONS=--experimental-vm-modules npx jest --config test/jest-e2e.json --runInBand bank-cards.e2e-spec.ts` + с новой `DATABASE_URL=file:/tmp/bank-cards-*/test.db` — passed, 21 tests, + включая реальные миграции, валидацию HTTP, права владельца, возвраты, + транзакции и перезапуск. Runner использует `RUST_LOG=info` для миграций. + Первый прогон дал 19 passed / 2 timeout в сценариях возвратов и потребовал + остановки оставшегося Jest-процесса. Повтор на новой базе прошёл 21/21; + исходный `3cf883e` в отдельной копии с теми же dependencies также прошёл + 21/21. Это не доказательство стабильности общего e2e gate. +- Полный `strict` проходит; 317 diagnostics из предыдущей оценки устранены. + Общий DB/e2e gate и ограничение WL-P2-05 остаются отдельной задачей. + +### 2026-09-13 — WL-P2-06: backend TypeScript + +Выполнен пункт P1-10 списка инженерных улучшений от 13.09.2026 +как продолжение существующего TypeScript gate. В [общем tsconfig](../../backend/tsconfig.json) +включены `noImplicitAny`, `strictBindCallApply`, `noFallthroughCasesInSwitch`; +app/test typechecks, production и dev build наследуют эти настройки. +Исходный код, зависимости, unsafe-checks и публичный API не менялись. + +Проверено на Node 22.21.0, backend `3cf883e` с указанным изменением tsconfig: + +- `npm run verify` до и после изменения — passed: zero-warning ESLint, + оба TypeScript gate, 33 Jest suites / 253 tests, Prisma generation и build. +- Проверка через TypeScript Compiler API с виртуальным ошибочным файлом для + каждого из четырёх configs — passed: implicit-any параметр даёт TS7006, + неверные аргументы `call`/`apply`/`bind` — TS2345/TS2322, проваливание `switch` + — TS7029. Контроль с выключенными тремя flags принимает тот же файл. +- `DATABASE_URL=file:/tmp/wealthledger-p1-10-openapi-20260913.db npm run test:openapi-contract` + — passed, 1 test; runtime OpenAPI совпал с frontend snapshot. +- `npx tsc --project tsconfig.typecheck.test.json --incremental false --strict --noImplicitAny --strictBindCallApply --noFallthroughCasesInSwitch --pretty false` + — оценка полного `strict`: 317 diagnostics, из них 315 TS2564 для полей DTO + и две TS2345 в `TbankClient.getOpenAccounts` / `getDividends` из-за callback + для `Promise`. Полный `strict` пока не включён; это отдельный этап. +- Общий DB/e2e gate не запускался; WL-P2-05 сохраняет прежний статус. + ### 2026-08-26 — SDD26-01–SDD26-03, SDD26-09, SDD26-12, SDD26-17, SDD26-21, SDD26-28–SDD26-30: done Change синхронизирован в canonical specs и архивирован в [`2026-08-26-harden-openspec-sdd-quality`](../../specs/openspec/changes/archive/2026-08-26-harden-openspec-sdd-quality/).