Аудит 2026-10-19, CQ-007/OE-07, план п.22. По решению владельца меняется конвенция: прежнее исключение для связных CRUD-сервисов (.ai/conventions/data.md:37-44, .ai/architecture.md) отменяется.
Результат
Обновлены data.md и architecture.md: application-слой не обращается к Prisma, транзакция и CAS живут в репозитории, а проверка инварианта находится рядом с CAS внутри репозиторного метода.
Запросы из auth.service, bank-cards.service, bank-operations.service и expense-categories.service перенесены в репозитории (BankCardsRepository, новый AuthRepository), граница write(tx) сохранена.
Lint-запрет prismaImports распространён на src/**/application/**; type-only импорты допустимы, только если без них не обойтись. Тест в test/eslint-config.cjs обновлён.
AC
В application/ нет runtime-импортов Prisma и PrismaService; lint это обеспечивает.
Семантика транзакций, CAS, ротации refresh-токена и P2002 не меняется.
npm run verify, e2e app/bank-cards и test:durability проходят.
Аудит 2026-10-19, CQ-007/OE-07, план п.22. По решению владельца меняется конвенция: прежнее исключение для связных CRUD-сервисов (`.ai/conventions/data.md:37-44`, `.ai/architecture.md`) отменяется.
## Результат
- Обновлены `data.md` и `architecture.md`: application-слой не обращается к Prisma, транзакция и CAS живут в репозитории, а проверка инварианта находится рядом с CAS внутри репозиторного метода.
- Запросы из `auth.service`, `bank-cards.service`, `bank-operations.service` и `expense-categories.service` перенесены в репозитории (`BankCardsRepository`, новый `AuthRepository`), граница `write(tx)` сохранена.
- Lint-запрет `prismaImports` распространён на `src/**/application/**`; type-only импорты допустимы, только если без них не обойтись. Тест в `test/eslint-config.cjs` обновлён.
## AC
- [ ] В `application/` нет runtime-импортов Prisma и PrismaService; lint это обеспечивает.
- [ ] Семантика транзакций, CAS, ротации refresh-токена и P2002 не меняется.
- [ ] `npm run verify`, e2e app/bank-cards и `test:durability` проходят.
После перепроверки scope: auth.service.ts 216 строк и три банковских service (~700 строк) содержат 48 прямых Prisma/tx операций. Попытка перенести их все одновременно затрагивает refresh-token CAS, idempotent operation replay и конкурентные банковские записи. Начну с auth как самостоятельной поставки; полную смену конвенции и запрет lint введём только после успешного переноса всех владельцев. Не буду заявлять AC выполненными до проверки durability с отдельным baseline.
После перепроверки scope: `auth.service.ts` 216 строк и три банковских service (~700 строк) содержат 48 прямых Prisma/tx операций. Попытка перенести их все одновременно затрагивает refresh-token CAS, idempotent operation replay и конкурентные банковские записи. Начну с auth как самостоятельной поставки; полную смену конвенции и запрет lint введём только после успешного переноса всех владельцев. Не буду заявлять AC выполненными до проверки durability с отдельным baseline.
Подзадачи готовы: PR #180 выносит auth DB/CAS в AuthRepository; PR #181 выносит expense-categories в BankCardsRepository. Оба прошли npm run verify и test:e2e. Остались bank-cards.service.ts и bank-operations.service.ts, затем изменение .ai/conventions/data.md, .ai/architecture.md и lint-правила. Сервис карт (~150 строк) при наивном переносе целиком в репозиторий стал pass-through оболочкой — отменил этот вариант; следующий шаг — спроектировать шов, который сохраняет бизнес-правила в application. Issue оставляю открытой.
Подзадачи готовы: PR #180 выносит auth DB/CAS в AuthRepository; PR #181 выносит expense-categories в BankCardsRepository. Оба прошли `npm run verify` и `test:e2e`. Остались bank-cards.service.ts и bank-operations.service.ts, затем изменение `.ai/conventions/data.md`, `.ai/architecture.md` и lint-правила. Сервис карт (~150 строк) при наивном переносе целиком в репозиторий стал pass-through оболочкой — отменил этот вариант; следующий шаг — спроектировать шов, который сохраняет бизнес-правила в application. Issue оставляю открытой.
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.
Аудит 2026-10-19, CQ-007/OE-07, план п.22. По решению владельца меняется конвенция: прежнее исключение для связных CRUD-сервисов (
.ai/conventions/data.md:37-44,.ai/architecture.md) отменяется.Результат
data.mdиarchitecture.md: application-слой не обращается к Prisma, транзакция и CAS живут в репозитории, а проверка инварианта находится рядом с CAS внутри репозиторного метода.auth.service,bank-cards.service,bank-operations.serviceиexpense-categories.serviceперенесены в репозитории (BankCardsRepository, новыйAuthRepository), границаwrite(tx)сохранена.prismaImportsраспространён наsrc/**/application/**; type-only импорты допустимы, только если без них не обойтись. Тест вtest/eslint-config.cjsобновлён.AC
application/нет runtime-импортов Prisma и PrismaService; lint это обеспечивает.npm run verify, e2e app/bank-cards иtest:durabilityпроходят.После перепроверки scope:
auth.service.ts216 строк и три банковских service (~700 строк) содержат 48 прямых Prisma/tx операций. Попытка перенести их все одновременно затрагивает refresh-token CAS, idempotent operation replay и конкурентные банковские записи. Начну с auth как самостоятельной поставки; полную смену конвенции и запрет lint введём только после успешного переноса всех владельцев. Не буду заявлять AC выполненными до проверки durability с отдельным baseline.Подзадачи готовы: PR #180 выносит auth DB/CAS в AuthRepository; PR #181 выносит expense-categories в BankCardsRepository. Оба прошли
npm run verifyиtest:e2e. Остались bank-cards.service.ts и bank-operations.service.ts, затем изменение.ai/conventions/data.md,.ai/architecture.mdи lint-правила. Сервис карт (~150 строк) при наивном переносе целиком в репозиторий стал pass-through оболочкой — отменил этот вариант; следующий шаг — спроектировать шов, который сохраняет бизнес-правила в application. Issue оставляю открытой.