Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Project Agent Rules — MSCodeBase Hybrid Architecture (64 Registered Tools)
# Project Agent Rules — MSCodeBase Hybrid Architecture (65 Registered Tools)

> Global system prompt / context injection for the AI Agent in Zed IDE. Applied across all projects.
> Optimized for the hybrid model: 16 Intel Layer + 31 Core MCP (включая `codebase` hub + 6 LSP + `predict_change`) + 13 Inline/Diagnostic + 4 Dev Tools = 64 registered (+1 `execute_script` при `MSCODEBASE_EXECUTE_SCRIPT_ENABLED=true` → 65)
> Optimized for the hybrid model: 16 Intel Layer + 32 Core MCP (включая `codebase` hub + 6 LSP + `predict_change` + `bootstrap_pipeline`) + 13 Inline/Diagnostic + 4 Dev Tools = 65 registered (+1 `execute_script` при `MSCODEBASE_EXECUTE_SCRIPT_ENABLED=true` → 66)

> \* `execute_script` отключён по умолчанию. Включить: `MSCODEBASE_EXECUTE_SCRIPT_ENABLED=true` в `.env`.

Expand Down
13 changes: 13 additions & 0 deletions AGENT_DIARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -403,3 +403,16 @@ VERDICT H3: CONFIRMED
**RED TEAM:** класс/метод/функция раздельно; методы не дублируются как FUNCTION; BOM-файл читается; идемпотентность через ON CONFLICT UPSERT.
**verified_from_clean_state:** ⚠️ не прогонялся (полный pytest 1753 passed — verify_diary-gate ниже; live-check CLI на мини-проекте: entities=1, tests=1 (100% linked), TESTS-edges=1, 672ms).
**Связки:** KNOWN_ISSUES [FEATURE] (блок «Шаг 3 РЕАЛИЗОВАН 2026-09-18»), tests/test_bootstrap_pipeline.py (5 интеграционных), tests/test_bootstrap_tests.py (+3 на index_src_functions), src/core/bootstrap_pipeline.py, src/mcp/tools/bootstrap_tool.py.

## [2026-09-19] Прод-инцидент миграций lanceDB (silent ImportError + destructive rebuild) + Exp E10 REFUTED

**Status:** Fixed (миграции) + Research closed (E10 REFUTED, откачено)
**Problem:** во время E10-исследования поиска индексировали свежую БД, когда миграция колонок молча не срабатывала, и вылезли ДВА реальных бага (эмуляция HEAD подтвердила, это не мусор):
1. `db_manager` импортировал `_migrate_text_full_inplace` / `_migrate_add_metadata_columns` как module-level функции (`from src.core.indexing.indexer_table import _migrate_text_full_inplace`), а они — методы класса `IndexerTableMixin` (DEFINED_IN indexer_table.py:17,66,94) → ImportError → миграция НЕ выполнялась, схема разъезжалась с кодом.
2. `db_writer.is_table_missing` трактовал `"in table schema"` (schema-mismatch) как «таблица отсутствует» → ПОЛНЫЙ rebuild (drop + re-embed ~13 мин) вместо soft-миграции при каждой смене схемы.
**Fix:** локальные `_migrate_text_full_inplace(table)` / `_migrate_add_metadata_columns(existing_fields, table)` с `pa.field(name, field.type)` из `self.schema`; `is_table_missing` исключает `"in table schema"` — recreate только при реальном отсутствии таблицы. +200 строк регрессионных тестов (`tests/test_lancedb_recreate.py`): миграция legacy→file_mtime_ns/file_size, идемпотентность, «НЕ пересоздавать при schema-mismatch». test_lancedb_recreate 12 passed; фокус-группа 43 passed.
**Exp E10 (затрачено ~2ч, результат отрицательный):** E10a full-text-эмбеддинг + e5-префиксы (llama.cpp-ветке их не хватало — ONNX/OpenVINO имели _ensure_prefix) + пул 50. Чистый прогон 599 файлов / 9514 чанков за 799.9s: fast hit@1=0% hit@5=50%; quality hit@1=20% hit@5=40%; baseline автора 0/50% и 30/30% → **REFUTED (N=10, шум)**. Изменённый код откален к HEAD; выжил только нейтральный env-тумблер `MAX_RERANKER_INPUT` (default 30).
**RED TEAM (атака на решение «оставить E10 под флагом»):** переключение требует полного реиндекса (~13 мин) ради нуля → впустую; флаг «50» может незаметно поднять latency хитов; откат = безопасный «поведение клиента = HEAD» (единственный diff settings — env-гейт default 30, тумблер нейтрален).
**verified_from_clean_state:** ⚠️ не прогонялся (ветка → PR; полный pytest 1753 passed — verify_diary-gate при коммите).
**Next:** AST/Graph-hybrid re-ranking (graph_query scope_id + text-match) вместо эмбеддинговых твиков; live-check полного реиндекса на прод-БД после миграции (запрос владельцу).
**Связки:** KNOWN_ISSUES 2026-09-19 (2 записи), EXPERIMENTS_LOG Exp E10, tests/test_lancedb_recreate.py, scripts/e2e_quality_search.py, experiments/search_quality/E10_full_text_embed.py, exp-43 portfolio lab.
33 changes: 32 additions & 1 deletion EXPERIMENTS_LOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2159,4 +2159,35 @@ unique src funcs in trace: 1212

**Implication:** Шаг B уточняется без делегирования цифр на волю: **(1)** статический L1-call — ценный статический якорь для ранжирования (TCTracer-style ensemble может использовать его как tier-1); **(2)** Шаг 2 (DECORATES для @mcp_app.tool) — УЖЕ реализован (живой граф: mcp.tool→14, mcp_app.tool→20 рёбер; источник `19378296` vendor tree-sitter tags.scm) — KNOWN_ISSUES:245 устарел; **(3)** dynamic trace остаётся драйвером TESTS-edge: он даёт recall 100% на linked (1551/1727) и не требует early-decision по единственной «target»-функции; статика — fallback для динамически-пустых (88/176 мок-тестов имеют стат. кандидатов) и pre-filter ранжирования. **moc: не путать hit (любой из G) с recall (доля G) — hit 90% ≠ покрытие 90%.**

**Artifacts:** experiments/bootstrap/static_vs_dynamic.py; EXP_LOG Exp 9; exp-41 portfolio lab.
**Artifacts:** experiments/bootstrap/static_vs_dynamic.py; EXP_LOG Exp 9; exp-41 portfolio lab.

## [2026-09-19] Exp E10 (Search Quality): full-text chunk embedding + e5-prefix + reranker pool 50 — REFUTED

**Контекст:** плато векторного тира на 10-задачной панели качества (baseline автора: fast hit@1=0%, hit@5=50%; quality hit@1=30%, hit@5=30%), при уже-реализованной E8-composite (поле full-текста в BB-снимке). Гипотеза: три одновременных «выключателя» поднимают hit каждого режима: (1) E10a — индексировать полный текст чанка (`chunk_texts_full`) вместо компактного сниппета; (2) e5-префиксы `query:`/`passage:` (в llama.cpp-ветке отсутствовали — ONNX/OpenVINO уже имели `_ensure_prefix`); (3) E10c — пул кандидатов в reranker 30→50 (`MAX_RERANKER_INPUT`), т.к. RRF per-site при limit=5 давал только 10 кандидатов на источник.

**Команда:** `python experiments/search_quality/E10_full_text_embed.py` (артефакт в репо; embed/rerank live через llama.cpp 8080/8081; E5-style панель из 10 задач, 2 режима, majority-оценка).

**Сырой результат (прогон 1 — «грязный», существующий индекс):**
```
run1 (existing index): fast: hit@1=0/10 (0%) hit@5=6/10 (60%) | quality: hit@1=3/10 (30%) hit@5=5/10 (50%)
```

**Сырой результат (прогон 2 — ЧИСТЫЙ индекс, полный реиндекс):**
```
[embed] indexed 599 files / 9514 chunks in 799.9s (llama.cpp 8080)
run2 (clean index): fast: hit@1=0/10 (0%) hit@5=5/10 (50%) | quality: hit@1=2/10 (20%) hit@5=4/10 (40%)
KMeans warning: duplicate vectors (LLL-фолбек идемпотентный) — не фейл
```

**Вердикт: ❌ REFUTED (N=10, дельты в пределах шума).**
- fast: hit@1=0 (базово 0) — БЕЗ ИЗМЕНЕНИЯ; hit@5=50% (базово 50%, грязный прогон 60%) — БЕЗ ИЗМЕНЕНИЯ/шум.
- quality: hit@1=20% (базово 30%, грязный 30%) — ХУЖЕ/шум; hit@5=40% (базово 30%, грязный 50%) — шум.
None из трёх «выключателей» (full-text-эмбеддинг / e5-префиксы / пул 50) не дал подтверждаемого сдвига.

**Implication:**
1. E10-код ОТКАЛЕН к HEAD (клиент идентичен продакшену). Остаток — env-тумблер `MAX_RERANKER_INPUT` (default 30, нейтрален): перепроверка пула остаётся одним env-флагом без правки кода.
2. **BREAKING-CHANGE-урок:** применение этих «выключателей» требует ПОЛНОГО реиндекса прода (~13 мин на 599 файлов / 9514 чанков) ради нулевого прироста — инженерная впустую тот простое я, и любой будущий твик эмбеддинга обязан мерить ЧИСТЫЙ индекс, а не грязный (первый прогон дал завышающие 60%/50%).
3. Отрицательный результат фиксирует плато «pure-vector»: поиск не находит то, что не текстуально в индексе (ср. Exp-29 ceiling search-only ~0.23) — следующий ход AST/Graph-hybrid re-ranking (graph_query scope_id + поверхностный text-match), не эмбеддинговые твики.
4. Диагностический harness `scripts/e2e_quality_search.py` (E5-style, 10 задач, 2 режима) оставлен в репо как reusable instrument.

**Artifacts:** experiments/search_quality/E10_full_text_embed.py, scripts/e2e_quality_search.py; EXP_LOG Exp E10; exp-43 portfolio lab.
Loading
Loading