# Handoff: 361 unresolved_relation — инструкция агенту ## Контекст Полный цикл оптимизации завершён. Все config-правки, фиксы промптов, DuckDB rebuild — сделаны. Осталась **одна категория** предупреждений: `unresolved_relation: 361`. Общее снижение за сессию: **~3200 → 361 = ↓89%**. ## Что уже починено (не трогать) | Категория | Было | Стало | |-----------|:----:|:-----:| | schema_tag_forbidden_by_complexity | 719 | 0 | | schema_tag_not_for_contract_type | 668 | 0 | | c2_relation_conflict | 420 | 0 | | schema_def_format_deprecated | 262 | 0 | | schema_invalid_relation_predicate | 114 | 0 | | schema_invalid_enum_value | 169 | 0 | | schema_unknown_tag | 206 | 0 | | invalid_tier | 4 | 0 | | unresolved_relation | 664 | **361** | ## Что осталось (361) Все 361 — `@RELATION PREDICATE -> [Target]` где Target не существует в индексе. Требуют осознанного решения: либо создать контракт, либо перевести на `[EXT:...]`. ### Тип 1: Внешние библиотеки (~80) `@RELATION DEPENDS_ON -> [pydantic]`, `[sqlalchemy]`, `[bcrypt]`, `[hashlib.sha256]`, `[httpx]`, `[yaml]`, `[json]`, `[secrets]`, `[functools]`, `[enum]`, `[datetime]` и т.д. **Фикс:** `[EXT:Python:pydantic]`, `[EXT:SQLAlchemy:orm]`, `[EXT:Python:bcrypt]` ### Тип 2: Внутренние модули без контрактов (~80) `@RELATION DEPENDS_ON -> [DashboardRouter]`, `[AuthRepository]`, `[AsyncAPIClient]`, `[get_datasets_with_status]`, `[GitRouter]` и т.д. Эти классы/функции существуют в коде, но не имеют `#region` контракта. **Фикс:** Либо: а) Создать `#region TargetName [C:N] [TYPE ...]` вокруг класса/функции б) Или `@RELATION DEPENDS_ON -> [EXT:module:TargetName]` ### Тип 3: Frontend компоненты/хранилища (~60) `@RELATION BINDS_TO -> [toasts]`, `[gitService]`, `[taskService]`, `[api.js]`, `[sidebar]`, `[authStore]`, `[mockedGoto]`, `[configData]` Ссылки на Svelte-стори, JS-модули или переменные, у которых нет контрактов. **Фикс:** `[EXT:frontend:toasts]`, `[EXT:frontend:gitService]` ### Тип 4: Пути вместо ID (~15) `@RELATION DEPENDS_ON -> [src.core.logger]`, `[backend.src.models.git]`, `[src/core/logger.py]` Полные файловые пути вместо contract_id. **Фикс:** `search_contracts` по ключевому слову → найти правильный ID или `[EXT:path:src.core.logger]` ### Тип 5: Dockerfile и shell-зависимости (~7) `@RELATION CALLS -> [docker/backend.entrypoint.sh]`, `[backend/requirements.txt]` **Фикс:** `[EXT:docker:backend.entrypoint.sh]` ### Тип 6: Неразобранное (~119) `@RELATION USES -> [BranchSelector]`, `[ConflictResolver]`, `@RELATION CALLS -> [gitService]`, `@RELATION DEPENDS_ON -> [PluginBase]`, `[LoginForm]` и т.д. Смесь компонентов которые существуют но не имеют контракта, и внешних зависимостей. **Фикс:** Проверить через `search_contracts` — если найден → оставить. Если нет → `[EXT:]`. ## План действий ```bash # 1. Найти все уникальные targets axiom_semantic_validation audit_contracts | grep "missing target" | sed 's/.*missing target //' | sort -u > missing_targets.txt # 2. Для каждого — проверить, существует ли контракт axiom_semantic_discovery search_contracts query="TargetName" # 3. Если контракт есть — оставить (баг резолвера) # Если контракта нет — заменить на [EXT:category:TargetName] # Если это внутренний класс/функция — создать #region контракт # 4. После каждой пачки фиксов: axiom_semantic_index rebuild rebuild_mode="full" use_duckdb=true axiom_semantic_validation audit_contracts ``` ## Уже починено (примеры для справки) ``` VERIFIES → BINDS_TO (20 файлов) :Class/:Function суффиксы удалены (11 файлов) backend.src.* пути → contract_id (17 файлов) @LAYER Model/Test/Infra → Domain/Tests (29 значений) ```