Skip to content

Commit 409596a

Browse files
author
MSCodeBase Agent
committed
refactor: remove dead progress_state, ProjectContext jobs -> job_manager.list_jobs + jobs_failed (open thread closed)
1 parent 02237e4 commit 409596a

9 files changed

Lines changed: 305 additions & 328 deletions

File tree

AGENT_DIARY.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,23 @@
1212

1313
---
1414

15+
## [2026-08-05 21:56] — Открытая нить закрыта: progress_state удалён (dead code), project_context → job_manager (единый источник прогресса)
16+
17+
**Status:** ✅ Fixed
18+
**Root Cause:** `_create_progress_callback`/`_last_progress` (src/core/progress_state.py) в проде не вызывались (внутренний callback layer.py маппит прогресс в `job.progress`, не в `_last_progress`) → get_last_progress() всегда пуст → `ProjectContext._capture_jobs` вечно 0/0. `JobManager.cleanup_old_jobs()` определён, но не вызывался нигде (латентный рост `jobs`).
19+
**Fix:** механизм удалён целиком: progress_state.py (92 строки) + 6 реэкспортов в mcp/server.py + 11 легаси-тестов; `_capture_jobs` переключен на `job_manager.list_jobs()` (новый метод с ленивым cleanup — cleanup_old_jobs теперь реально работает); в снэпшот добавлен честный счётчик `jobs_failed`; исторические комментарии (architecture_linter, test_architecture_lifecycle) обновлены.
20+
**Guard:** tests/test_index_progress.py переписан (9 тестов: JobManager lifecycle/list/cleanup + _capture_jobs mapping running/completed/failed); полный pytest 796 passed / 4 skipped (0 failed); grep `progress_state|_create_progress_callback|_last_progress` — 0 ссылок в src/tests (только обновлённые комментарии).
21+
**Pattern:** NEW-класс «диагностический accessor без проверки прод-использования» — механизм держался 1 версию «для диагностики», никто не проверил, что он мёртв. Guard: открытая нить закрыта явно, по плану владельца.
22+
**verified_from_clean_state:** ⚠️ не проверено — clean-clone не запускался (нет repo URL/сети); полный pytest 796 passed запущен явно. Runtime (после install+reload): ✅ MCP PID 12076, BUILD_ID=HEAD; live-проверка — intel_trigger_reindex (инкрементальный job) → intel_get_project_context().jobs = {running:0, completed:1, failed:0} (до фикса было вечно 0/0).
23+
24+
---
25+
1526
## [2026-08-05 22:50] — Следующий шаг: get_last_progress → core, фикс bump_version, фикс sys.path-загрязнения теста (FIXED, будет закоммичено)
1627

1728
**Status:** ✅ Fixed (не закоммичено — коммит следом)
1829
**Root Cause:** (1) техдолг из ARCH-03-цепочки: `project_context` импортировал `get_last_progress` из mcp.server — направление core→mcp оставалось; (2) `version_manager.check_consistency` ловил ВСЕ `X.Y.Z` (версии зависимостей, старых записей) как дрифты; `scripts/bump_version.py` вставлял заголовок после первого `---`, для ru/zh он попадал в середину файла; (3) `test_architecture_lifecycle` на уровне модуля делал `sys.path.insert(0, extension_dir)` — вся pytest-сессия импортировала УСТАРЕВШУЮ копию src из установленного расширения → ModuleNotFoundError для новых core-модулей (вскрыто переносом progress_state).
1930
**Fix:** (1) новый `src/core/progress_state.py` (состояние+callback+cleanup), mcp.server реэкспортирует, project_context импортирует из core, исключения в architecture_linter убраны; (2) per-file версионные паттерны в check_consistency, вставка ПЕРЕД первым `## [X.Y.Z]` в обоих bump (scripts + version_manager), version_manager обновляет все три CHANGELOG; (3) sys.path/env-загрязнение перенесено в autouse-fixture с восстановлением (намерение теста «установленное расширение» сохранено).
20-
**Guard:** tests/test_version_manager.py (4 регрессионных: ложные дрифты, реальный дрифт, вставка заголовка, три CHANGELOG); полный pytest 799 passed / 4 skipped (0 failed); вскрытая аномалия: `_create_progress_callback` в проде не вызывается → `get_last_progress()` всегда пуст — открытая нить.
31+
**Guard:** tests/test_version_manager.py (4 регрессионных: ложные дрифты, реальный дрифт, вставка заголовка, три CHANGELOG); полный pytest 799 passed / 4 skipped (0 failed); вскрытая аномалия: `_create_progress_callback` в проде не вызывается → get_last_progress() всегда пуст — открытая нить.
2132
**Pattern:** P-002 «предположение вместо проверки» (симптом: «тесты флейкят» → реальная причина: глобальное загрязнение sys.path чужим тестом).
2233
**verified_from_clean_state:** ⚠️ не проверено — clean-clone скрипт не запускался (нет repo URL/сети); полный pytest 799 passed запущен явно, 2 раза подряд (стабильно).
2334

KNOWN_ISSUES.md

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@
1212

1313
---
1414

15+
## 2026-08-05 — progress_state удалён (dead code), project_context → job_manager — открытая нить закрыта (FIXED)
16+
17+
**Symptom:** `_create_progress_callback` в проде не вызывался → `get_last_progress()` всегда пуст → `intel_get_project_context().jobs` вечно `{running: 0, completed: 0}` (открытая нить из записи 2026-08-05 «get_last_progress → core»). `cleanup_old_jobs()` не вызывался нигде.
18+
**Root Cause:** два механизма прогресса: прод-путь (job_manager, layer.py `_index_progress_callback`) и легаси-путь (`_last_progress`, только тесты). Легаси-путь — dead code с 3.3.12.
19+
**Fix:** удалён `src/core/progress_state.py` (92 строки) + 6 реэкспортов в mcp/server.py + 11 легаси-тестов; `_capture_jobs` переключен на `job_manager.list_jobs()` (новый метод: снимок + ленивый cleanup); снэпшот: добавлен `jobs_failed`.
20+
**Status:** ✅ Fixed | **Guard:** tests/test_index_progress.py переписан (9 тестов); полный pytest 796 passed / 4 skipped (0 failed); grep-развёртка 0 ссылок в коде.
21+
1522
## 2026-08-05 — get_last_progress → core (техдолг ARCH-03 закрыт) + bump_version фиксы + sys.path-загрязнение теста (FIXED)
1623

1724
**Symptom:** (1) core→mcp импорт оставался: `project_context` брал `get_last_progress` из mcp.server; (2) bump_version: ложные дрифты (версии зависимостей), кривая вставка заголовка в ru/zh CHANGELOG; (3) при полном прогоне pytest падали 13 тестов с `ModuleNotFoundError: src.core.progress_state` только при запуске вместе с test_architecture_lifecycle.
@@ -2650,3 +2657,149 @@ Three fixes from the same review:
26502657
**Root Cause:** 6 ❌ P1/P2 пунктов из experiments/audit.md требовали фикса: Heartbeat GetLastError, hardcoded reranker weights, BM25 sync reindex, SQLite sch...
26512658
- **Статус:** автоматически синхронизировано
26522659

2660+
## 2026-08-05 21:56 — Открытая нить закрыта: progress_state удалён (dead code), project_context → job_manager (единый источник прогресса)
2661+
2662+
- **Источник:** AGENT_DIARY.md
2663+
- **Описание:** **Status:** ✅ Fixed
2664+
**Root Cause:** `_create_progress_callback`/`_last_progress` (src/core/progress_state.py) в проде не вызывались (внутренний callback layer.py маппит прогресс в `job.progress`, не в...
2665+
- **Статус:** автоматически синхронизировано
2666+
2667+
2668+
## 2026-08-05 22:50 — Следующий шаг: get_last_progress → core, фикс bump_version, фикс sys.path-загрязнения теста (FIXED, будет закоммичено)
2669+
2670+
- **Источник:** AGENT_DIARY.md
2671+
- **Описание:** **Status:** ✅ Fixed (не закоммичено — коммит следом)
2672+
**Root Cause:** (1) техдолг из ARCH-03-цепочки: `project_context` импортировал `get_last_progress` из mcp.server — направление core→mcp оставалось;...
2673+
- **Статус:** автоматически синхронизировано
2674+
2675+
2676+
## 2026-08-05 22:10 — experiments/audit.md: 16 пунктов верифицировано, 12 исправлено (FIXED, не запушено)
2677+
2678+
- **Источник:** AGENT_DIARY.md
2679+
- **Описание:** **Status:** ✅ Fixed (не закоммичено — по команде владельца)
2680+
**Root Cause:** audit.md накопил 4 наложенных аудита; свежий (ARCH/BL/WIN/ZED/SEC/TEST) содержал подтверждаемые проблемы: version drift (pyp...
2681+
- **Статус:** автоматически синхронизировано
2682+
2683+
2684+
## 2026-08-05 21:15 — Триаж KNOWN_ISSUES#2026-08-04-21:00 (Zed crash-loop) — цифры верифицированы замером
2685+
2686+
- **Источник:** AGENT_DIARY.md
2687+
- **Описание:** **Status:** 🟡 Partial — loop остановлен (последний краш 08-04 21:27), риск сохраняется; дедлайн владельца 08-11
2688+
**Root Cause:** подтверждён: Zed commit 8.54GB при commit-лимите 18.5GB (свободно 1.14GB...
2689+
- **Статус:** автоматически синхронизировано
2690+
2691+
2692+
## 2026-08-05 — D1: schema-слой из Neuro-Symbolic спайка → CypherExecutor (архитектурное закрытие P-004, FIXED, не запушено)
2693+
2694+
- **Источник:** AGENT_DIARY.md
2695+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии; push — по команде владельца)
2696+
**Root Cause:** P-004 «разрыв валидации между слоями»: неизвестные label/rel (галлюцинация LLM: `MATCH (f:SERVICE)`) принимались...
2697+
- **Статус:** автоматически синхронизировано
2698+
2699+
2700+
## 2026-08-05 20:10 — C1-C4 Cypher-стек: 4 бага KNOWN_ISSUES#2026-08-05 (FIXED, не запушено)
2701+
2702+
- **Источник:** AGENT_DIARY.md
2703+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии; push — по команде владельца)
2704+
**Root Cause:** C1 — label/edge сравнивались точно (=/IN) в cypher_sql.py, лексер принимает любой регистр LABEL → тихий пустой р...
2705+
- **Статус:** автоматически синхронизировано
2706+
2707+
2708+
## 2026-08-05 — A2 (внешний аудит): sandbox threat model — ADR-0001 ✅ Accepted (Вариант A)
2709+
2710+
- **Источник:** AGENT_DIARY.md
2711+
- **Описание:** **Status:** ✅ Done (решение по умолчанию, §1.10 — владелец не выбрал B/C; переопределение возможно)
2712+
**Root Cause:** внешний аудит: blacklist-модель sandbox принципиально обходима (чистый Python без ОС...
2713+
- **Статус:** автоматически синхронизировано
2714+
2715+
2716+
## 2026-08-05 01:50 — Tech debt: subprocess text=True без encoding ×7 закрыт + пин ruff (DONE)
2717+
2718+
- **Источник:** AGENT_DIARY.md
2719+
- **Описание:** **Status:** ✅ Done (коммит в этой сессии)
2720+
**Root Cause:** text=True без encoding в 7 местах декодирует вывод через locale (cp1251/cp1252 на Windows) — UnicodeDecodeError при не-ASCII выводе (тот же кл...
2721+
- **Статус:** автоматически синхронизировано
2722+
2723+
2724+
## 2026-08-05 00:05 — CI красный: ruff I001 (10 импорт-блоков, НЕ coverage) (FIXED)
2725+
2726+
- **Источник:** AGENT_DIARY.md
2727+
- **Описание:** **Status:** ✅ Fixed (коммит a7a7a9e7, запушен)
2728+
**Root Cause:** CI-прогоны b121ab19/6dc8d2ae упали на lint-шаге `ruff check src/ tests/` — 10 ошибок I001 (неотсортированные импорты) в 8 файлах: src/cor...
2729+
- **Статус:** автоматически синхронизировано
2730+
2731+
2732+
## 2026-08-04 23:59 — CI: кэш pip + coverage 41% (FIXED)
2733+
2734+
- **Источник:** AGENT_DIARY.md
2735+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии)
2736+
**Root Cause:** Next Action #9-#10: CircuitBreaker «dead» — ❌ REFUTED (подключён к embedder напрямую, di_container:337-345); coverage отсутствовал.
2737+
**Fix:** ...
2738+
- **Статус:** автоматически синхронизировано
2739+
2740+
2741+
## 2026-08-04 23:59 — Триаж bare-except: 4 рискованных silent-блока залогированы (PARTIAL)
2742+
2743+
- **Источник:** AGENT_DIARY.md
2744+
- **Описание:** **Status:** 🟡 partial (коммит в этой сессии)
2745+
**Root Cause:** scan нашёл 106 silent-блоков (except → pass); большинство намеренные (CancelledError/таймауты/best-effort).
2746+
**Fix:** логирование в 4 местах...
2747+
- **Статус:** автоматически синхронизировано
2748+
2749+
2750+
## 2026-08-04 23:59 — Баг-клоуза: layer.py порт LM + резолв 7 VERIFY (FIXED)
2751+
2752+
- **Источник:** AGENT_DIARY.md
2753+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии)
2754+
**Root Cause:** из 3 аудитов остались VERIFY-пункты; единственный реальный баг — layer.py:504 хардкод порта LM Studio 1234 (рядом код уже читал порты из conf...
2755+
- **Статус:** автоматически синхронизировано
2756+
2757+
2758+
## 2026-08-04 23:58 — Hotfix: pickle P1 закрыт restricted unpickler'ом (FIXED)
2759+
2760+
- **Источник:** AGENT_DIARY.md
2761+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии)
2762+
**Root Cause:** index_guard.py:367 обычный pickle.load на legacy symbol_index.pkl — RCE-вектор (OWASP десериализация).
2763+
**Fix:** `_LegacyPickleLoader(pickle.U...
2764+
- **Статус:** автоматически синхронизировано
2765+
2766+
2767+
## 2026-08-04 23:50 — Глубокий аудит (2-й проход): верификация 26 пунктов (TRIAGE)
2768+
2769+
- **Источник:** AGENT_DIARY.md
2770+
- **Описание:** **Status:** 🟡 триаж завершён, фиксы запланированы (коммит в этой сессии)
2771+
**Root Cause:** второй внешний аудит (async, subprocess, BLE001, coverage, порты). Проверено по коду: create_task fire-and-forg...
2772+
- **Статус:** автоматически синхронизировано
2773+
2774+
2775+
## 2026-08-04 23:30 — Триаж внешнего ревью: 165 находок, тесты зелёные (TRIAGE)
2776+
2777+
- **Источник:** AGENT_DIARY.md
2778+
- **Описание:** **Status:** 🟡 триаж завершён, фиксы запланированы (коммит в этой сессии)
2779+
**Root Cause:** внешний инструмент нашёл 165 проблем; критические проверены по коду: SQL_INJECTION (graph.py x4) — ❌ ложные (па...
2780+
- **Статус:** автоматически синхронизировано
2781+
2782+
2783+
## 2026-08-04 23:00 — CI clean-state: No module named pytest (FIXED)
2784+
2785+
- **Источник:** AGENT_DIARY.md
2786+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии)
2787+
**Root Cause:** Linux-ветка verify_clean_state.sh ставила `pip install -e ".[dev]" --no-deps` — dev-зависимости (pytest и др.) не входят в requirements-lock....
2788+
- **Статус:** автоматически синхронизировано
2789+
2790+
2791+
## 2026-08-04 22:25 — scripts/monitor.py: UnboundLocalError avg_log (FIXED)
2792+
2793+
- **Источник:** AGENT_DIARY.md
2794+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии)
2795+
**Root Cause:** переменная `avg_log` присваивалась только в ветке фаз эмбеддинга (PHASE_EMBED/WRITING/IVF), а читалась в блоке «Тренд» при любой фазе — при ф...
2796+
- **Статус:** автоматически синхронизировано
2797+
2798+
2799+
## 2026-08-04 22:40 — test_job_history: изоляция от переиспользования tmp_path (FIXED)
2800+
2801+
- **Источник:** AGENT_DIARY.md
2802+
- **Описание:** **Status:** ✅ Fixed (коммит в этой сессии)
2803+
**Root Cause:** JobHistoryStore пишет во внешний `<data_root>/projects/<hash>/metrics/job_history.json`, а pytest переиспользует temp-пути между запусками (с...
2804+
- **Статус:** автоматически синхронизировано
2805+

scripts/architecture_linter.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@
3434
"mcp.tools",
3535
}
3636

37-
# Core больше не импортирует MCP (resolve_project_root — закрыт в 3.3.11,
38-
# get_last_progress — закрыт в 3.3.12). Оставшиеся исключения — tools.base
39-
# из intelligence.layer (документированный мост для _grep_fallback).
37+
# Core больше не импортирует MCP (resolve_project_root — закрыт в 3.3.11;
38+
# progress_state/get_last_progress — удалён, единый источник прогресса —
39+
# job_manager в src/core/intelligence/jobs.py). Оставшиеся исключения —
40+
# tools.base из intelligence.layer (документированный мост для _grep_fallback).
4041
_ALLOWED_CORE_MCP_IMPORTS: dict[str, list[str]] = {
4142
"src.core.intelligence_layer": ["src.mcp.tools.base"],
4243
"src.core.intelligence.layer": ["src.mcp.tools.base"],

src/core/intelligence/jobs.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import time
1212
import uuid
1313
from dataclasses import dataclass
14-
from typing import Any, Dict, Optional
14+
from typing import Any, Dict, List, Optional
1515

1616
__all__ = [
1717
"BackgroundJob",
@@ -73,6 +73,17 @@ def get_job(self, job_id: str) -> Optional[BackgroundJob]:
7373
"""Возвращает задачу по ID."""
7474
return self.jobs.get(job_id)
7575

76+
def list_jobs(self) -> List[BackgroundJob]:
77+
"""Возвращает снимок всех задач (после ленивой очистки завершённых).
78+
79+
Единственная точка перечисления job_manager'а — используется
80+
ProjectContext._capture_jobs для агрегированной статистики.
81+
Ленивый cleanup на чтении держит self.jobs ограниченным:
82+
cleanup_old_jobs() иначе не вызывается нигде (латентный рост).
83+
"""
84+
self.cleanup_old_jobs()
85+
return list(self.jobs.values())
86+
7687
def cleanup_old_jobs(self, max_age_seconds: int = 3600):
7788
"""Удаляет старые завершённые задачи (защита от memory leak)."""
7889
now = time.time()

0 commit comments

Comments
 (0)