# Handoff: Remaining 17 warnings + Axiom feature request

## Текущее состояние

| Метрика | Значение |
|---------|----------|
| Индекс | 3469 контрактов, 2140 связей |
| Предупреждений | **17** (все `unresolved_relation`) |
| DuckDB rebuild | ✅ Стабилен |
| Импорты | ✅ Все починены (3 файла после агента-наследника) |
| Снижение с ~3200 | **↓99.5%** |

---

## Остаток: 17 unresolved_relation

### Группа 1: `EXT:frontend:DashboardRouter` — 3 warnings

**Файлы:** `_action_routes.py`, `_detail_routes.py`, `_listing_routes.py`

```python
# backend/src/api/routes/dashboards/_action_routes.py
@RELATION DEPENDS_ON -> [EXT:frontend:DashboardRouter]

# backend/src/api/routes/dashboards/_detail_routes.py
@RELATION DEPENDS_ON -> [EXT:frontend:DashboardRouter]

# backend/src/api/routes/dashboards/_listing_routes.py
@RELATION DEPENDS_ON -> [EXT:frontend:DashboardRouter]
```

**Фикс:** Добавить в `_external_stubs.py`:
```python
# #region EXT:frontend:DashboardRouter [C:1] [TYPE External]
# @BRIEF Frontend dashboard router stub
# #endregion EXT:frontend:DashboardRouter
```

### Группа 2: `EXT:list:*` — 7 warnings

**Файлы:** `git/__init__.py`, `test_native_filters.py`, `migration_engine.py` (×2), `git.e2e.js`, `migration.e2e.js`, `translation.e2e.js`, `smoke.e2e.js`

```python
@RELATION CALLS -> [EXT:list:GitPackage_all_routes]
@RELATION BINDS_TO -> [EXT:list:FilterState_ParsedNativeFilters_ExtraFormDataMerge]
@RELATION DEPENDS_ON -> [EXT:list:MigrationEngine_internal_methods]
@RELATION DEPENDS_ON -> [EXT:list:MigrateEngine_transform_methods]
@RELATION BINDS_TO -> [EXT:list:GitDashboardPage_GitConfigRoutes]
@RELATION BINDS_TO -> [EXT:list:MigrationApi_SettingsPage]
@RELATION BINDS_TO -> [EXT:list:TranslatePage_TranslateJobRoutes]
@RELATION BINDS_TO -> [EXT:list:LoginPage_SettingsPage_TranslateJob_GitConfig]
```

Эти `EXT:list:` — список маршрутов/методов, сгенерированные агентами как групповые ссылки.

**Фикс:** Добавить stubs для каждого.

### Группа 3: `EXT:internal:*` — 2 warnings

```python
# backend/src/plugins/translate/__tests__/test_dictionary_utils.py
@RELATION BINDS_TO -> [EXT:internal:_utils]

# backend/src/plugins/translate/__tests__/test_text_cleaner.py  
@RELATION BINDS_TO -> [EXT:internal:_text_cleaner]
```

**Фикс:** Проверить, существуют ли реальные контракты `_utils` или `_text_cleaner` в этих файлах. Если нет — добавить stubs.

### Группа 4: `EXT:frontend:*` — 3 warnings

```python
# frontend/playwright.config.js
@RELATION DEPENDS_ON -> [EXT:frontend:EnvConfig]

# frontend/src/lib/components/reports/__tests__/report_type_profiles.test.js
@RELATION DEPENDS_ON -> [EXT:frontend:ReportTypeProfiles]

# frontend/src/lib/stores/__tests__/assistantChat.test.js
@RELATION BINDS_TO -> [EXT:frontend:AssistantChatTest]
```

**Фикс:** Добавить stubs.

### Группа 5: `EXT:method:*` — 1 warning

```python
# frontend/src/lib/components/health/ScheduleAtAGlance.svelte
@RELATION CALLS -> [EXT:method:ValidationApi.fetchTasks]
```

**Фикс:** Добавить stub.

---

## Feature request: Handle EXT:* in Axiom validator

### Проблема

Текущий валидатор проверяет `@RELATION PREDICATE -> [Target]` на существование контракта с ID `Target`. Для `EXT:*` это неправильно — `EXT:` означает «external, не требует контракта».

### Временный костыль

Создан `backend/src/schemas/_external_stubs.py` — ~250 пустышек-контрактов для всех `EXT:*` ссылок. Это шум в индексе и ручная поддержка.

### Правильный фикс (Rust)

```rust
// Текущий код — требует контракт для любого ID:
fn check_resolved(target_id: &str, contracts: &ContractIndex) -> bool {
    contracts.contains(target_id)
}

// Фикс — игнорировать EXT:*:
fn check_resolved(target_id: &str, contracts: &ContractIndex) -> bool {
    if target_id.starts_with("EXT:") {
        return true;  // external — контракт не нужен
    }
    contracts.contains(target_id)
}
```

### Альтернатива: валидация формата EXT

```yaml
# axiom_config.yaml
external_namespaces:
  - EXT:Python, EXT:Library, EXT:frontend, EXT:path, 
  - EXT:code, EXT:method, EXT:docker, EXT:internal, EXT:list
```

Валидатор проверяет формат `^EXT:\w+:\S+$` вместо поиска контракта.

### После фикса

```bash
rm backend/src/schemas/_external_stubs.py
axiom_semantic_index rebuild rebuild_mode="full" use_duckdb=true
# → 17 warnings должны упасть до естественного остатка (не-EXT ссылки)
```
