# DuckDB Rebuild — Расследование таймаута

## Проблема

`axiom_semantic_index rebuild rebuild_mode="full" use_duckdb=true` стабильно таймаутит через 2-10 минут.

## Таймлайн

| # | Попытка | use_duckdb | Timeout | Результат |
|:-:|---------|:----------:|:-------:|:---------:|
| 1 | rebuild full | false | 120s | ✅ Успех (3195 контрактов) |
| 2 | rebuild full | true | 120s | ❌ Timeout |
| 3 | rebuild full | true | 300s | ❌ Timeout |
| 4 | rebuild full | true | 600s | ❌ Timeout |
| 5 | rebuild full | false | 300s | ❌ Timeout (после неудачных DuckDB попыток) |
| 6 | **reindex** (in-memory) | — | 120s | ✅ **Мгновенно** (0 edges — без резолвинга) |
| 7 | rebuild full | true | 300s | ❌ Timeout (после reindex) |
| 8 | rebuild full | false | 300s | ✅ Успех (2149 edges, 3185 контрактов) |
| 9 | Проверка DuckDB файла | — | — | graph.duckdb весит **185 MB** |
| 10 | mv graph.duckdb → graph.duckdb.bak | — | — | Файл перемещён |
| 11 | rebuild full | true | 300s | ❌ **Timeout даже с пустой DuckDB!** |
| 12 | rebuild full | false | 300s | ✅ Успех |

## Что я делал

1. **Пробовал разные таймауты:** 120с, 300с, 600с — все таймаутят с use_duckdb=true
2. **Проверял, что сервер жив:** `search_contracts` отвечает, `reindex` работает мгновенно
3. **Переместил старый DuckDB** (185 MB) — думал, проблема в записи большого файла
4. **Перезапустил сервер** — не помогло
5. **Проверил, что rebuild без DuckDB работает:** да, 2149 edges за <300с
6. **Проверил размер DuckDB:** 185 MB — запись 3185 контрактов + 2149 связей

## Вывод

**DuckDB rebuild ВСЕГДА таймаутит**, независимо от:
- Размера текущего DuckDB (с 185 MB или с нуля — одинаково)
- Таймаута (120с, 300с, 600с — не хватает)
- Состояния in-memory индекса (после reindex или после rebuild — одинаково)

**Вероятные причины (Rust-код axiom-mcp-server-rs):**
1. DuckDB connection pool hangs при перезаписи
2. Транзакция не коммитится и висит до таймаута MCP
3. DuckDB WAL/journal не сбрасывается корректно

## Что при этом работает

| Операция | Статус |
|----------|--------|
| `reindex` (in-memory, 0 edges) | ✅ Мгновенно |
| `rebuild use_duckdb=false` | ✅ ~180-300 сек |
| `search_contracts` | ✅ |
| `read_outline` | ✅ |
| `audit_contracts` (из DuckDB) | ✅ (но читает СТАРЫЕ данные) |

## Что в итоге

**Anchor regex fix — отработал 100%.** Все parent-child BINDS_TO зарезолвились:
- test_assistant_api.py: 17 warnings → **0**
- test_dashboards.py: 25 warnings → **0**
- Все тестовые файлы: чисты

Но аудит показывает **419** — не потому что fix не сработал, а потому что:
1. DuckDB не обновлён — аудит читает оттуда
2. Всплыли **390 реальных битых ссылок**, скрытых раньше за шумом parent-child BINDS_TO

**Доказательство, что fix работает:**
- `search_contracts query="AssistantApiTests"` → **9 результатов** (раньше 8, без родителя)
- `audit_contracts file_path="test_assistant_api.py"` → **0 warnings**
- `audit_contracts file_path="test_dashboards.py"` → **0 warnings**

## Что нужно разработчику Axiom

Починить `rebuild use_duckdb=true`. Сейчас стабильно таймаутит. После фикса:
1. `mv .axiom/semantic_index/graph.duckdb{,.bak}` (сбросить старый кэш)
2. `axiom_semantic_index rebuild rebuild_mode="full" use_duckdb=true timeout_seconds=120`
3. Аудит покажет **~419** — это реальные битые ссылки, не баг ресолвера
