From 2f9e388b740b28423441eff9a9c5a595d43f2054 Mon Sep 17 00:00:00 2001 From: MSCodeBase Agent Date: Fri, 28 Aug 2026 18:21:59 +0300 Subject: [PATCH] docs: close reindex-Finalizing KI (#18) and record loop-lesson --- AGENT_DIARY.md | 8 ++++++++ KNOWN_ISSUES.md | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/AGENT_DIARY.md b/AGENT_DIARY.md index 31c3139..6f73405 100644 --- a/AGENT_DIARY.md +++ b/AGENT_DIARY.md @@ -28,6 +28,14 @@ --- +## [2026-08-28 14:30] — Reindex Finalizing deadlock (write-lock held across optimize/create_index) +**Status:** ✅ Fixed (#18, 1578a1bb) — блокер live-верификации снят +**Root Cause:** `IndexProjectRunner.run()` держал глобальный `_write_lock` (RLock) весь reindex, включая LanceDB `optimize()/create_index()` в `_safe_ivf_index()` → оба процесса 0% CPU, фаза Finalizing не завершалась, `is_reindexing` не снимался → символ-индекс не догружался → write-тулы падали `FileNotFoundError`. +**Fix:** `_suspend_write_lock()` отпускает лок вокруг optimize/create_index; `create_index` ограничен `timeout=300s` + non-blocking `shutdown(wait=False)`. Reindex-guard `is_reindexing()` сохранён (search заблокирован во время reindex, безопасно). +**Guard:** tests/test_reindex_finalizing_deadlock.py (2 passed); CI green ubuntu+windows+clean-state. +**Meta (loop-ловушка):** агент неделю обходил СИМПТОМ (stale-код / FileNotFoundError / «сервер не видит правки») вместо починки задокументированного OPEN-блокера (KNOWN_ISSUES reindex-Finalizing). Rule: при OPEN-блокере — чинить блокер, не расследовать симптом. Также агент инъектил debug-маркеры `write_text(r"C:\temp\mscb_*.txt")` в 4 копии write_tools.py (реинтродукция KI-мусора из 2026-08-28) — удалены; нужен pre-commit guard на stray `write_text`/`C:\temp\mscb` в src/. +**verified_from_clean_state:** ✅ yes — clean-state job green on PR #18 (tests/test_reindex_finalizing_deadlock.py 2 passed, CI green ubuntu+windows). + ## [2026-08-26 21:00] — DatabaseLock ORPHAN-kill → A+ fail-closed (PID 20052 killed) **Status:** ✅ Fixed (код+тесты; live-smoke PASSED; exp2 holder survived) **Root Cause:** `DatabaseLock.classify_holder()` возвращал `ORPHAN` для ЖИВОГО MCP чужого окна (parent-chain walk обрывался на мёртвом предке ДО живого Zed — venvwlauncher-цепочка), затем `_terminate_holder()` убивал его `TerminateProcess`. Так PID 20052 (ARCLUX MCP) убит 12524 при `refresh_db_connection`. diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index 7948c5f..3b13040 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -16,9 +16,9 @@ ## 2026-08-28 — Full reindex зависает в фазе «Finalizing» (PropertyGraph.optimize/create_index) (OPEN / WATCHING) **Что:** При live-верификации фиксов A/B (полный реиндекс job 1ff77294) embedding-фаза прошла БЕЗ заморозки сервера (подтверждает фикс A — QueueHandler), chunks записались корректно (1-based; см. AGENT_DIARY post-mortem off-by-one: save_symbol_index=341). После embed job завис в фазе «Finalizing» (отладка через intel_get_job_status + лог + netstat/py-spy: оба процесса 0% CPU — заблокированы, не считают) на `PropertyGraph.optimize()`/`create_index()` (`src/core/intelligence/layer.py:741` и `:1786`). Флаг `set_reindexing(True)` не снимается → блокирует concurrent search. Это PRE-EXISTING баг индексатора/графа, НЕ вызван фиксами A/B (фиксы касаются только логирования и display-строки; они live-верифицированы на этапе embed). -**Fix (плановая задача индексатора):** исследовать deadlock/зависание в PropertyGraph.optimize/create_index (возможен contention на write-lock или незавершающийся цикл в optimize). Временное обходное: ручной restart сервера снимает флаг, уже записанный во время embed индекс перегружается корректно (runtime status 🟢 9191 chunks / 563 files / 11032 symbols). +**Fix:** #18 — `IndexProjectRunner.run()` держал `db_manager.begin_write()` (глобальный `_write_lock` RLock) весь reindex, включая тяжёлые LanceDB `optimize()/create_index()` в `_safe_ivf_index()` → deadlock в фазе Finalizing (оба процесса 0% CPU). Фикс: `_suspend_write_lock()` отпускает лок вокруг optimize/create_index (reindex-guard `is_reindexing()` по-прежнему блокирует search), `create_index` ограничен `timeout=300s` + non-blocking `shutdown(wait=False)`. Символ-индекс теперь догружается → write-тулы верифицируемы live. **Guard:** check_index.py подтверждает корректность записанных chunks (341/332) независимо от зависания финализации; re-verify после restart показал валидный индекс. -**Статус:** 🔴 наблюдается (блокирует завершение full reindex) | **Deadline:** следующая сессия | **Владелец:** misha. +**Статус:** ✅ CLOSED (fix #18, 1578a1bb; guard test_reindex_finalizing_deadlock.py 2 passed, CI green ubuntu+windows) | **Deadline:** — | **Владелец:** misha. **Note:** Новых реальных багов от фиксов A (logging deadlock) и B (off-by-one) НЕТ — оба live-верифицированы (embed-фаза без freeze; LanceDB 341/332). Finalization-hang — отдельный pre-existing инцидент индексатора, не связан с A/B. ## 2026-08-28 — Codebase hub write-actions: 4 бага (git routing, dry-run, move import, safe_delete) (OPEN / WATCHING) @@ -28,9 +28,9 @@ 2. `replace`/`insert_before`/`insert_after` с `apply=false` — dry-run НЕ соблюдается, лезут в write → `Permission denied` (guard не применён). 3. `move` генерирует невалидный import `from D:\.Project.MSCodeBase import ...` (raw drive + backslash вместо dotted module). 4. `safe_delete` недосчитывает usages: reports `usage count: 0`, тогда как `rename` корректно нашёл 2 call sites (`indexer.py:327,760` / `index_project_runner.py:473`) — сканирует только definitions, не callers. -**Fix (плановая задача mcp/tools):** (1) `git` action роутить на git-log, не path-resolver; (2) `apply=false` обязан предотвращать любой write (в т.ч. open для записи); (3) move import-rewrite — нормализовать путь в dotted module; (4) safe_delete считать callers через reference-index. +**Fix:** #16 — (1) `git` action роутится на git-log; (2) `apply=false` предотвращает любой write; (3) move import-rewrite нормализует путь в dotted module; (4) safe_delete считает callers через reference-index. Live-верификация #1 (git log) подтверждена (41 коммит); #2/#3/#4 блокировались отсутствием символ-индекса из-за reindex-deadlock (#18) — теперь устранено, требуют re-verify после reindex. **Guard:** регресс-тесты на каждый case (dry-run nil-write; git log возвращает commits; move валидный import; safe_delete считает callers). -**Статус:** 🔴 наблюдается | **Deadline:** следующая сессия | **Владелец:** misha. +**Статус:** 🟡 pending live-reverify (#2/#3/#4) — блокер reindex устранён #18, нужен прогон reindex + live-проверка | **Deadline:** текущая сессия | **Владелец:** misha. ## 2026-08-28 — LSP-тулы: basedpyright не установлен (OPEN / ENV)