Full optimization cycle: Protocol (15 files): - 4-layer SSOT architecture for agent prompts & skills - Anti-Corruption Protocol consolidated from 5 duplicates - Tag-to-tier permissiveness matrix (all @tags allowed at all tiers) Axiom config: - complexity_rules: all 22+ tags available on C1-C5 - contract_type_overrides: removed (was narrowing per-type) - 18 new tags added, LAYER enum expanded (Infra, Frontend, Atom, etc.) - RELATION predicates expanded (USES, CONTAINS, BELONGS_TO, etc.) Code fixes: - 2216 @TAG: normalized to @TAG (colon→space) - 518 [DEF] blocks migrated to #region/#endregion (37 files) - VERIFIES→BINDS_TO, :Class/:Function suffixes removed, paths→IDs - 1173-line _external_stubs.py deleted (EXT: handled natively) - Batch EXT: reference audit (240 targets: 132 external, 99 internal, 9 fix) - QA regression check: 0 regressions across all checks Infrastructure: - DuckDB rebuild stabilized (appender API, INSERT OR IGNORE) - Anchor regex fix (parent-child BINDS_TO now resolves) - EXT:*/DTO:/NEED_CONTEXT: regex fixed in validator - 34MB Doxygen API portal (3194 contract pages)
141 lines
5.0 KiB
Markdown
141 lines
5.0 KiB
Markdown
# 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 ссылки)
|
||
```
|