# 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 значений)
```
