diff --git a/AGENT_DIARY.md b/AGENT_DIARY.md index eea0dfd2..db690c7c 100644 --- a/AGENT_DIARY.md +++ b/AGENT_DIARY.md @@ -1941,3 +1941,8 @@ BREACH: MSC-P-19 | date: 2026-10-03 | rule: §12 | guard_at_time: no | detected_ **3. Код установщика в диффах есть.** `gh pr diff 120 | grep auto_yes` → удалённая строка `range(0 if auto_yes …)`, добавленная `range(1 if auto_yes …)` и тест `test_auto_yes_runs_each_step_once`. `gh pr diff 121 | grep "def _"` → `models_enabled`, `_doctor_report`, `_doctor_cli`, `_clean_targets`, `_clean_cli` (имена не `cmd_*`; поиск по `cmd_clean|cmd_doctor` пуст по этой причине). **4. Гипотеза «clean-state до фикса валидировал пустую установку» — опровергнута.** `scripts/verify_clean_state.sh` вообще не вызывает `install.py`: он сам создаёт venv и делает `pip install -e .`; `grep "install.py --yes"` по `.github/` и `scripts/` пуст. Значит баг `--yes` с v3.0 не влиял ни на один прогон CI — ровно поэтому его никто и не поймал; поймал только ручной прогон по README. **Урок:** «CI зелёный» и «инструкция работает» — разные утверждения. Пока установщик не запускали как пользователь (по README, в пустом каталоге), его неинтерактивная ветка была мёртвой, а все гейты оставались зелёными. + +## [2026-11-13] KNOWN_ISSUES: ротация + запись про slow-тесты +**Сделано:** три закрытые (🟢) записи — `2026-11-11 smoke_e2e`, `2026-11-11 slow LSP/VFS`, `2026-11-09 RU→EN` — уехали в `docs/archive/KNOWN_ISSUES_2026_11.md`; живой файл 295 → **242 строки** при лимите 300. Добавлена новая запись про 5 красных в `test_freshness_checker` (PR #126) со ссылками `src/core/indexing/indexer.py:146-154` и `SearchConfig.sqlite_chunks`. +**Проверка:** `python scripts/check_known_issues.py` → `KNOWN_ISSUES.md: OK (size ≤ 300 lines, archival up to date)`; перемещённые записи отсутствуют в живом файле и присутствуют в архиве; `2026-10`-архив на месте (R2). +**Урок:** запись в реестр — это ещё и арифметика: лимит 300 строк проверяется гейтом, поэтому новая запись без ротации = красный pre-commit. Ротация — не уборка, а условие добавления. diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index 3980f7d6..a6445873 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -4,35 +4,12 @@ > Формат: дата | что было | статус | fix --- -## 2026-11-11 — `smoke_e2e` шаг 4 требует dense-индекс, дефолт репозитория — текстовый — 🟢 +## 2026-11-13 — slow-тесты прятали смену хранилища: 5 красных в `test_freshness_checker` — 🟢 -- **Измерено:** `python scripts/smoke_e2e.py --project .` → шаг 4 - `❌ search error: There is no vector column in the data. Please specify the - vector column name for vector search`; `.mscodebase/` содержит только - `chunks.db`, потому что индекс собран `scripts/reindex_text_only.py` при - `MSCODEBASE_DENSE_OFF=true` (дефолт проекта). -- **Не регресс:** шаг не зависит от `_abstains`; `--services-only` проходит - (`embed dim=768`, `rerank top=1`). -- **Fix:** шаг пробует вектор и при его отсутствии честно падает в текстовый - индекс SQLite (`chunks_fts`), называя режим в отчёте. Проверка: - `python scripts/smoke_e2e.py --project .` → `✅ SMOKE E2E: PASSED (проверок: 4)`, - шаг 4 `режим=text (vector: …); term=…, results=3`. - ---- -## 2026-11-11 — 4 slow-теста LSP/VFS не проходили на `main` — 🟢 - -- **Измерено (не наш регресс):** на `origin/main` (`74191a5`) падали - `tests/test_lsp_vfs_indexing.py::TestLSPVFSIndexing::test_lsp_vfs_content_indexed_without_disk`, - `…::test_lsp_vfs_content_beats_disk`, `…::test_indexed_at_timestamp`, - `…::test_hash_based_on_content_not_disk` — все с - `ValueError: Indexer requires an explicit WorkspaceSource`. -- **Причина:** тесты конструируют `Indexer` без `source=`, а API требует - explicit `WorkspaceSource`; маркер `slow` исключён `addopts`, поэтому дрейф не - видел ни pre-commit, ни CI. -- **Fix:** тестовый хелпер передаёт `LocalFsSource(project_path)`; проверка - `python -m pytest tests/test_lsp_vfs_indexing.py -o addopts="" -q` → `4 passed`. - Полный прогон с slow: `pytest tests/ -m "not integration and not benchmark"` → - `2560 passed, 10 skipped`. +- **Измерено:** на `main` (`a6524d6`, `801621d`) `pytest tests/test_freshness_checker.py -m "not benchmark"` → `5 failed, 2 passed`; в дефолтном гейте файл не виден (`pytestmark = pytest.mark.slow`). +- **Корень:** тесты читали `indexer.table` (LanceDB), а дефолт — SQLite (`src/core/indexing/indexer.py:146-154`, `SearchConfig.sqlite_chunks=true`); запись шла в `SQLiteChunkStore`, таблица LanceDB пустая. +- **Не регресс Цели 1/2:** те же 5 падают на до-мержевом `main` `a6524d6`. +- **Fix (PR #126):** чтение через `_file_rows()` (слой, который реально используется) + `test_store_is_the_default_one` пиннит дефолт; `slow`-маркер снят (файл 4.2 s). Проверка: `8 passed` 3× подряд; мутация `verify_index_freshness → return 0` даёт `4 failed`; гейт `2518 passed, 0 failed`. --- ## 2026-11-11 — E73: что осталось открытым после снятия ложного отказа — 🟡 @@ -55,20 +32,6 @@ (`` — каталог с клонами, команды клонирования в `experiments/bench_2026_11/REPORT.md`). ---- -## 2026-11-09 — RU→EN: перевод сильнее dense; ревью поймало 2 ложных доказательства — 🟢 - -- **Замер (12 вопросов, 2 репо):** RU-лексика 2/12, слепой EN-перевод 12/12, - dense 768 8/12, перевод без реранка 12/12 за 14 мс — `ru_vs_dense/REPORT.md`. -- **После ревью:** матчер gold считал тест-файл реализацией (C 9→8); `dense_score - is not None` всегда истинно → `>0`; negative control был литералом → проверяет - текст и падает. Guard: `matcher_selftest.py`, `negative_control.py --arm A|C`. -- **Границы:** hard subset = 1/12; старые 4/5 и 5/5 superseded. -- **Gate-долги:** WISDOM test count обновлён (2317 collected). K3 `P-006` был не - ошибкой реестра, а устаревшим путём гейта: протокол v2 перенёс реестр в - `agent_docs/pitfalls-registry.md`, а гейт читал старый `skills/...`. Исправлено - в `tools/knowledge/check_knowledge.py` (оба пути, новый первым; K7 читает таблицу). - --- ## 2026-11-09 — pre-commit: `gate_cli.py --selftest` правит трекнутый манифест — 🟡 @@ -117,7 +80,6 @@ gold такие исключал). Свой E1: positive 0.438 → 0.786 (тол правилу это ложное «нашёл». Кандидат — не печатать соседей без явного флага. --- - ## 2026-11-08 — CI `clean-state` иногда идёт 13m30s — 🟡 Замер (не «по ощущениям»): job `128772053549` — 13m29s, job `128797932683` — 13m31s, остальные прогоны той же джобы — 2m10s. В логе второго прогона — **743.7 s тишины** @@ -129,7 +91,6 @@ runner» не объясняет двух прогонов с точностью превращается в красный `main` без падения теста. --- - ## 2026-11-08 — XERJ-пакет: run по протоколу (research / эксперимент / внедрение) — 🟡 Пакет `experiments/xerj_2026_11/`: добавлены `DECISION.md`, `RESEARCH.md`, `baseline_raw.txt` + `run_baseline.py`, `tests/test_no_silent_success.py`. @@ -161,7 +122,6 @@ P0-5 (`pyproject.toml`) проверен командой — уже испра `PLAN.md` сработал: заявлять «investigate лучше» нельзя. 🟡 --- - ## 2026-11-08 — Аудит планов: что реализовано, что осталось — 🟡 Проверены все планы (`ISSUE.md`, `docs/research/*PLAN|patterns|chain*`, `docs/ISSUES/*`). Реализовано и подтверждено кодом: Universal Engine Ф1–Ф4 (sources, plugins, transport-e2e, @@ -185,7 +145,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind исправлены там же. --- - ## 2026-10-25 — E55/E56: chain modes; docs gold-language bottleneck — 🟡 - **E55:** hybrid/quality/deep 0.688/0.771 (p50 45–48 ms); fast 0.542/0.729 (p50 19 ms); `nodemote/intent/ru/p3` — 0 эффекта на hit@1. @@ -201,7 +160,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind - Production: graph 12,753 nodes; index 7,314 chunks (0 experiments); tests 32 pass. --- - ## 2026-10-25 — E52: clean baseline — hit@1 0.688, hit@5 0.750; docs=0 — 🟡 - Clean index: 7,258 chunks (удалено 9,089 experiments); leakage 0/48. - **clean production 0.688/0.750** (p50 72ms); contaminated 0.688/0.771. @@ -211,7 +169,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind ~0.9167 hit@5**. 95% требует усиления code-канала или LLM-агента. --- - ## 2026-10-25 — E51: frozen-панель проиндексирована (panel leakage) — 🔴 P0 - `experiments/4A_unit_of_return/frozen/f5/queries.md` содержит те же probes и находится в `chunks.db`; BM25 возвращает его как top-1 почти на всех запросах. @@ -224,7 +181,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind LLM-планировщик, а не фиксированная эвристика. --- - ## 2026-10-25 — E49/E50: docs-reserve и score-router — zero-sum — 🟡 - **E49:** reserve15 0.250/0.500/0.583 (хуже base 0.271 на 1k); reserve25 0.208/0.458/0.604; oracle 0.396/0.604/0.729; p50 245 ms. @@ -235,7 +191,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind даёт потолок ~37–40% на 1k, 95% недостижимо. --- - ## 2026-10-25 — E48: two-channel map — docs BM25 сильный, routing ломает — 🟡 - **base** 1k/2k/4k = 0.271/0.458/0.562; **route** 0.292/0.458/0.562; **oracle** 0.396/0.625/0.729; p50 323 ms. @@ -245,7 +200,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind token-reserve; code 1k улучшать BM25-top-files + PageRank hybrid. --- - ## 2026-10-25 — E47: docs в PageRank разбавляют code-граф — 🔴 - **base** (code-only) 1k/2k/4k = 0.271/0.458/0.562; **docs** = 0.042/0.188/0.458; **docs_bm25** = 0.042/0.229/0.479; p50 1,113 ms. @@ -254,7 +208,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind слияние по бюджету; один PageRank на запрос. H1–H7 FAIL. --- - ## 2026-10-25 — E46/E46b: PageRank repo map — работает, но не 95% — 🟡 - **Граф:** 9,315 nodes / 47,286 edges / 759 code files (docs нет). - **E46 personalized:** 1k/2k/4k = 0.271/0.417/0.521; code-only 0.325/0.500/0.625; docs 0. @@ -264,7 +217,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind - **Артефакты:** `experiments/e46_pagerank_map/`, `e46b_pagerank_ru/`. --- - ## 2026-10-25 — E44: agent rewrites — keywords +1 h1; fusion/identifiers хуже — 🟡 - **Плечи:** baseline / keywords / identifiers / agent_all на 48 запросах E30. - **Результат:** baseline 0.688/0.771, 84 ms; keywords **0.708**/0.771, 78 ms; @@ -273,7 +225,6 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind а не фьюзить все варианты. **Артефакты:** `experiments/e44_agent_rewrite/`. --- - ## 2026-10-25 — E41–E43: chain audit — docs intent, experiments, concept tags — 🟡 open - **Диагностика:** RRF top5 35/48; 13 misses (8 docs gold, 5 recall). - **E41:** исключение `experiments/` — 0.688/0.771 → 0.688/0.750, p50 81→43 ms. @@ -283,13 +234,9 @@ manifest-parity), `TrustBoundary`, modification-guard (HMAC `ack_impact` + `bind - **Артефакты:** `experiments/e41_no_experiments/`, `e42_intent_demote/`, `e43_concepts/`. --- - ## 2026-10-25 — E40: RU→EN синонимы — ноль — 🟡 neutral - **Плечи:** baseline / ru_synonyms на 48 запросах E30; `synonyms_ru.py`. - **Результат:** оба 0.688/0.771, p50 159/176 ms. H6 PASS; H1/H2/H3/H4/H5 FAIL. - **Вердикт:** варианты дают те же top-5; RRF схлопывает дубликаты. Словарь — утилита, не рычаг. 95% на панели недостижимо. - **Артефакты:** `experiments/e40_ru_synonyms/`. - ---- - diff --git a/docs/archive/KNOWN_ISSUES_2026_11.md b/docs/archive/KNOWN_ISSUES_2026_11.md index 06f022c4..f67ce917 100644 --- a/docs/archive/KNOWN_ISSUES_2026_11.md +++ b/docs/archive/KNOWN_ISSUES_2026_11.md @@ -3,6 +3,49 @@ > Закрытые записи, перенесённые из `KNOWN_ISSUES.md` по гейту (≤300 строк). > Формат записей не меняется; ссылки на них — по дате и заголовку. +--- +## 2026-11-11 — `smoke_e2e` шаг 4 требует dense-индекс, дефолт репозитория — текстовый — 🟢 + +- **Измерено:** `python scripts/smoke_e2e.py --project .` → шаг 4 + `❌ search error: There is no vector column in the data. Please specify the + vector column name for vector search`; `.mscodebase/` содержит только + `chunks.db`, потому что индекс собран `scripts/reindex_text_only.py` при + `MSCODEBASE_DENSE_OFF=true` (дефолт проекта). +- **Не регресс:** шаг не зависит от `_abstains`; `--services-only` проходит + (`embed dim=768`, `rerank top=1`). +- **Fix:** шаг пробует вектор и при его отсутствии честно падает в текстовый + индекс SQLite (`chunks_fts`), называя режим в отчёте. Проверка: + `python scripts/smoke_e2e.py --project .` → `✅ SMOKE E2E: PASSED (проверок: 4)`, + шаг 4 `режим=text (vector: …); term=…, results=3`. +--- +## 2026-11-11 — 4 slow-теста LSP/VFS не проходили на `main` — 🟢 + +- **Измерено (не наш регресс):** на `origin/main` (`74191a5`) падали + `tests/test_lsp_vfs_indexing.py::TestLSPVFSIndexing::test_lsp_vfs_content_indexed_without_disk`, + `…::test_lsp_vfs_content_beats_disk`, `…::test_indexed_at_timestamp`, + `…::test_hash_based_on_content_not_disk` — все с + `ValueError: Indexer requires an explicit WorkspaceSource`. +- **Причина:** тесты конструируют `Indexer` без `source=`, а API требует + explicit `WorkspaceSource`; маркер `slow` исключён `addopts`, поэтому дрейф не + видел ни pre-commit, ни CI. +- **Fix:** тестовый хелпер передаёт `LocalFsSource(project_path)`; проверка + `python -m pytest tests/test_lsp_vfs_indexing.py -o addopts="" -q` → `4 passed`. + Полный прогон с slow: `pytest tests/ -m "not integration and not benchmark"` → + `2560 passed, 10 skipped`. +--- +## 2026-11-09 — RU→EN: перевод сильнее dense; ревью поймало 2 ложных доказательства — 🟢 + +- **Замер (12 вопросов, 2 репо):** RU-лексика 2/12, слепой EN-перевод 12/12, + dense 768 8/12, перевод без реранка 12/12 за 14 мс — `ru_vs_dense/REPORT.md`. +- **После ревью:** матчер gold считал тест-файл реализацией (C 9→8); `dense_score + is not None` всегда истинно → `>0`; negative control был литералом → проверяет + текст и падает. Guard: `matcher_selftest.py`, `negative_control.py --arm A|C`. +- **Границы:** hard subset = 1/12; старые 4/5 и 5/5 superseded. +- **Gate-долги:** WISDOM test count обновлён (2317 collected). K3 `P-006` был не + ошибкой реестра, а устаревшим путём гейта: протокол v2 перенёс реестр в + `agent_docs/pitfalls-registry.md`, а гейт читал старый `skills/...`. Исправлено + в `tools/knowledge/check_knowledge.py` (оба пути, новый первым; K7 читает таблицу). + --- ## 2026-11-08 (позже) — четыре «открытых пункта» закрыты, найден дефект frozen-gold — 🟢