chore(openspec): рулинг R-7 (policy: подзапрос IN вместо outerjoin) в design.md

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
This commit is contained in:
Andrey Epifancev 2026-10-04 21:21:12 +04:00
parent d142c6f69e
commit 01187b550d

View File

@ -148,3 +148,4 @@ WHERE is_current`; `ALTER TYPE audit_action ADD VALUE` ×2 (`LEGAL_ENTITY_CHANGE
| 15 | 2026-10-04 | R-4 (SDD фаза 1, pre-flight): `q` в списке ЮЛ ищет по `name` и `inn` (подстрока) | спека `directories-api`; план не уточнял | нет: надмножество поиска |
| 16 | 2026-10-04 | R-5 (SDD фаза 1, Task 1): upgrade 0002 пересоздаёт `related_group_member` (копия → drop → create в порядке колонок DBML → insert), а не `ADD COLUMN`; downgrade — по плану | DBML v5.14 ставит `kind` после `legal_entity_id`, а `ADD COLUMN` добавляет в конец; тест Среза 0 `test_migrated_schema_equals_orm_create_all` сверяет порядок колонок | вернуть `ADD COLUMN` и ослабить сравнение колонок (без порядка) в тесте и миграции; пересоздание теряет GRANT/RLS/триггеры, добавленные платформой вне Alembic (T1.2) |
| 17 | 2026-10-04 | R-6 (SDD фаза 1, Task 2): сессия запроса объявляется как `SessionDep = Annotated[AsyncSession, Depends(get_async_session, scope="function")]` (`api/src/api/dependencies/db.py`), а не голым `Depends(get_async_session)`; `get_request_audit(session: SessionDep, …)`; guard-тест падает на объявлении без `scope="function"` | в FastAPI 0.135 yield-зависимость по умолчанию закрывается ПОСЛЕ отправки ответа — commit шёл бы после 201, и его ошибка не доходила бы до клиента; scope входит в ключ кэша зависимостей — смешение даёт две сессии (нарушает R-1) | заменить `SessionDep` на `Depends(get_async_session)` (1 строка) ценой потери гарантии «commit до ответа» |
| 18 | 2026-10-04 | R-7 (SDD фаза 1, Task 4): `legal_entities_visible` фильтрует подзапросом `company_group_id IN (SELECT id FROM company_group WHERE base_regional_office_id = :office) OR (company_group_id IS NULL AND regional_office_id = :office)`, а не outerjoin; ГК без филиала и монозаёмщики без филиала видны только ГО | подзапрос не конфликтует с join'ами вызывающего и с count-запросами, не размножает строки; NULL-семантика закреплена интеграционным тестом на PostgreSQL | при необходимости вернуть outerjoin; изменение видимости «бесхозных» объектов — одна правка фильтра и тестов |