# 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 ссылки) ```