# Backend ## Назначение и authority NestJS API WealthLedger владеет доменной логикой, данными, конфигурацией и server-side интеграциями. Shared SDD policy, common reading pointers, audit routing и `../references/**` policy задаёт root `AGENTS.md`. Canonical SDD authority находится в `wealth-ledger-specs`, физически в `../specs/openspec` от этого репозитория. Любая OpenSpec command, читающая или изменяющая change, должна использовать `--store wealth-ledger-specs`. Для устойчивых backend decisions читать [`../docs/adr/README.md`](../docs/adr/README.md). ## Canonical gate Перед Node-командами активировать `.nvmrc` через `nvm use --silent`; это выбирает Node 22. Не запускать отдельную проверку версии, кроме диагностики runtime issue. После lockfile install единственный completion gate: ```bash npm ci npm run verify ``` Gate non-mutating и последовательно проверяет ESLint, application/test TypeScript, risk-based Jest suite и build. `npm run lint:fix` и `npm run format` изменяют files и выполняются только явно; `npm run test:cov` — диагностика без общего threshold. `npm run test:e2e` не входит в passing gate до WL-P2-05 trigger из remediation registry. `npm run test:openapi-contract` — отдельный contract gate для изменений обеих сторон API contract. Актуальные scripts проверять в `package.json`/`npm run`. ## Enforceable boundaries - Style задают `eslint.config.mjs` и TypeScript configs; zero-warning lint и оба typecheck обязательны. - Публичный HTTP API версионируется как `/api/v1`; generated backend OpenAPI — contract authority для frontend snapshot. - Frontend не вызывает T-Bank напрямую; credentials, rate limiting и integration resilience остаются server-side. - Не размещать frontend code, generated client или durable documentation в backend. - Security, money, data integrity, concurrency, public contracts, critical journeys и regressions требуют risk-based tests. DTO, declarative config и thin scripts не требуют отдельного unit test без собственной logic. Непроверяемые предпочтения являются guidance и не заменяют canonical gate.