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
183 changes: 183 additions & 0 deletions KNOWN_ISSUES.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@

---

## 2026-09-28 — Шкала реранкера + top-N floor (salvage из PR #52, tier-anchor пропущен)

- **Спасено из конфликтного PR #52:** `_sigmoid`-нормализация логитов llama.cpp → [0,1] (без неё MIN_RERANK_SCORE=0.3 отсекал 70–97% выдачи), top-N recall floor `reranker_topn_keep` (default 0 = выключено), holdout-калибровка порога с запретом eval-источников кодом. Guard: 4 sigmoid-теста + 13 тестов top-N/калибровки.
- **Пропущено осознанно:** `anchor_tier_winners` — P2 закрыт влитым #54 (`_anchor_identifier_chunks_async`) в той же точке пула; второй P2-механизм без собственного A/B — нарушение. Ветка #52 сохранена как референс.
- **Статус:** ✅ Salvaged (PR #63).

## 2026-09-28 — Pre-commit hook fail-open при потере маркеров (Fixed)

- **Локация:** `.githooks/pre-commit:31-53` (`find_project_root` + `run_script`).
Expand Down Expand Up @@ -249,3 +255,180 @@
**Контекст:** исследование поиска/RAG — что именно измерять, прежде чем утверждать результат.
**Решение (приоритет):** KI-R1 (пер...
- **Статус:** автоматически синхронизировано

## 2026-09-20 — Exp E13: текстовый RAG (doc-chunks) vs кодовый baseline (E10/E11)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** Measured (refuted hypothesis)
**Hypothesis:** doc-chunks (README + docs/en/ + docstrings) retrieve as well as code-chunks via search_with_mode quality.
**Method:** 16 EN doc-queries, live ...
- **Статус:** автоматически синхронизировано


## 2026-09-11 — Burst-rename: fail-closed VOR отзывает 100% при ONE rename-sweep (ответ Statewave на dev.to)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** Closed (эксперименты, ответ опубликован)
**Root Cause:** VOR (ADR-0003) проверяет ПУТЬ-якоря против текущего HEAD. Rename/move = старый путь отсутствует = SILENT_ABSENCE = отзыв, хотя файл...
- **Статус:** автоматически синхронизировано


## 2026-09-09 — H1: фоновый VOR-проход (IdleScheduler) — память перепроверяется без вызова агента

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** Fixed (6 новых тестов + 1674 полный pytest green; ветка chore/experiments-es1-es2-0909)
**Root Cause:** VOR вызывался ровно из 1 места (intel_get_project_memory, layer.py:1097); idle-задач...
- **Статус:** автоматически синхронизировано


## 2026-09-09 — H2: .h заголовки C включены в AST-индексацию (PARSE_EXTENSIONS + C-парсер)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** Fixed (commit 0301fa93; KNOWN_ISSUES 2026-09-09 19:35 закрыт)
**Root Cause:** ".h" был в INDEX_EXTENSIONS (вектор-чанкинг шёл), но НЕ в PARSE_EXTENSIONS → CodeParser.parse_file возвращал [...
- **Статус:** автоматически синхронизировано


## 2026-09-07 — Cypher-движок: анонимные узлы/рёбра ломали MATCH; ActionReceipt не писался из write-пути

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** Fixed (оба блока закрыты, тесты зелёные)
**Root Cause:** (1) Cypher: `from_node_alias` дефолтил в `n1`, а генератор создавал `n{path_idx*2}` для анонимного узла → `no such column: n0.id`; ...
- **Статус:** автоматически синхронизировано


## 2026-09-02 20:51 — drift_gate заблокировал коммит: контроль остановил самого автора

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ? Fixed (коммит A 08281f37 приземлился; B — отдельная незакоммиченная квитанция)
**Root Cause:** предсуществующий BROKEN drift_gate: GitBash bin/ (C:\Program Files\Git\bin) НЕ в PATH проце...
- **Статус:** автоматически синхронизировано


## 2026-09-02 21:40 — COMMIT B (head-freshness) приземлился: cb88c961; + cp1251 encoding-инцидент

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed (коммит B cb88c961; все 5 pre-commit hook'ов OK; рабочее дерево чистое)
**Root Cause 1 (B):** после A (fail-closed symbol, никогда REFUTED) свежесть индекса не проверялась — отсутс...
- **Статус:** автоматически синхронизировано


## 2026-09-03 — Fake reindex ETA "~8s" + frozen progress in Finalizing (both fixed)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed (commit 32f11662; 5 pre-commit hooks OK; full pytest 1587 passed, 2 pre-existing unrelated env_extractor failures)
**Root Cause 1 (ETA "~8s"):** `_enrich_job_response` had a dead h...
- **Статус:** автоматически синхронизировано


## 2026-09-03 19:30 — CI RED: circular import layer ↔ tools_reg (architecture_linter)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed (commit f210ed7c; CI all-jobs green on ubuntu+windows)
**Root Cause:** My ETA refactor added `tools_reg → layer` import for `_embed_progress_from_log`, closing an existing `layer →...
- **Статус:** автоматически синхронизировано


## 2026-09-04 11:15 — CI RED: ruff lint errors caught only after push (3 commits)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed (commit 986c9be7)
**Root Cause:** Pre-commit hook did not run ruff. CI (`ruff check src/ tests/` in ci.yml) caught F401/W292 only after push, forcing fix-commits. Repeated 3 times ...
- **Статус:** автоматически синхронизировано


## 2026-09-05 12:30 — FIX: stale_detector + predict_change стабильно таймаутили через MCP (-32001): блокирующий sync-код в async-контексте

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed (code only, не запушено) — src/mcp/tools/doc_tools.py + predict_tools.py
**Root Cause:** `error_boundary` применяет `asyncio.wait_for(timeout_ms)` вокруг `execute`, но внутри `exec...
- **Статус:** автоматически синхронизировано


## 2026-09-06 21:00 — Починка lock_guard: таймаут 60s ломал весь .locks-протокол

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed / **Root Cause:** `scripts/lock_guard.py` `_run` default timeout=60s — любой `git commit` прогоняет pre-commit hook (verify_diary → полный pytest 5-10 мин на Windows), поэтому acqu...
- **Статус:** автоматически синхронизировано


## 2026-09-06 21:30 — sync-subprocess в async-MCP (context_tool, system_tools) — fixed

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed (code only) / **Root Cause:** системная проверка после фикса stale/predict: нашлись ещё sync `subprocess.run` внутри async `execute`. `GetContextTool._section_git` (git log через s...
- **Статус:** автоматически синхронизировано


## 2026-09-06 22:00 — P-001 рецидив: cmd-окна при запуске/открытии проекта (powershell/nvidia-smi без CREATE_NO_WINDOW) — FIXED

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed / **Root Cause:** повтор инцидента 2026-08-14 (P-001, «чёрные окна CMD»). Фикс 2026-08-14 добавил CREATE_NO_WINDOW для git/netstat/wmic/taskkill в runtime, но ПОЗВОЛИЛ дыру: `resou...
- **Статус:** автоматически синхронизировано


## 2026-09-08 — B3: grammar-карты parser.py (imports/calls/assigns/conditions) внесены + живые фиксы

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed / **Root Cause и итог:** внесены из study 05 карты CALL_NODES/IMPORT_NODE_MAP/ASSIGNMENT_NODE_MAP/CONDITIONAL_NODE_MAP (пер-язычные) в `src/core/indexing/parser.py`. Живые tree-sit...
- **Статус:** автоматически синхронизировано


## 2026-09-08 12:35 — B4: import-экстракция через language_imports (деривация карт + флаг-гейт)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed / **Root Cause:** два источника node-типов импортов (parser.IMPORT_NODE_MAP и литерал LANGUAGE_IMPORT_NODES) расходились (kt/dart/php); ungated fallback-2 в мосте.
**Fix:** LANGUAG...
- **Статус:** автоматически синхронизировано


## 2026-09-08 19:40 — collect() в Cypher: json_group_array + типизированный декод (fixed)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed. / **Root Cause:** KNOWN_ISSUES 2026-09-07 ⏳ — `_translate_return_expr` заявлял `collect` как Supported, но SQLite не имеет функции COLLECT («no such function»); ни одного теста на...
- **Статус:** автоматически синхронизировано


## 2026-09-10 — H1 idle-VOR + system_alerts (цепь «файл изменён → STALE → VOR → alert агента» собрана)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed / **Root Cause (Exhibit #23, 2026-09-09):** компоненты цепи существовали по отдельности, но VOR вызывался ровно из 1 места (layer.py:intel_get_project_memory), mark_stale("memory")...
- **Статус:** автоматически синхронизировано


## 2026-09-11 — VOR read-path fix (PR #34) + «8-минутный коммит» = НЕ баг (решение владельца)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ PR #34 создан, hooks green; скорость тестов — осознанное решение, код НЕ менялся.
**Root Cause:** (1) read-path VOR ре-сканировал prose тела ADR через `_PATH_RE`, хотя явные `data.anchor...
- **Статус:** автоматически синхронизировано


## 2026-09-10 — Exp 1 (Catch-up Rate) + Exp 3 (HEAD polling): VOR масштабирование и внешний дрифт

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fix (замеры, кода не менялось). **Root Cause (KNOW ISSUES «Lazy-only верификация»):** вопрос, успевает ли VOR проверить ACTIVE-узлы в рамках budget_ms=50 (read-path) / 250 (background id...
- **Статус:** автоматически синхронизировано


## 2026-09-10 — Exp 2 (Agent Behavior) + Exp 4 (Fail-Closed Freshness Gate)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** ✅ Fixed. **Root Cause (Exhibit #23, 2026-09-09):** inform-the-agent approach insufficient — agent can ignore STALE alerts; PlanFence 30/30 failures confirms action-validation unreliable; s...
- **Статус:** автоматически синхронизировано


## 2026-09-11 — H3 TTL-гниение: last_checked для всех проверенных + label stale_ttl (doc 10 closed)

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** Fixed (9 новых тестов + 1725 полный pytest green; doc 10-continuous-verification H1+H2+H3 done)
**Root Cause:** INCONCLUSIVE/непроверенные узлы «висят вечно» без следа проверки: live-срез ...
- **Статус:** автоматически синхронизировано


## 2026-09-13 — H4: agent-memory lifecycle в масштабе dev.to KB — бутылочное горлышко = сетевой capture, не граф

- **Источник:** AGENT_DIARY.md
- **Описание:** **Status:** Fixed (эксперимент подтверждён; сопровождение задачи closed)
**Root Cause:** при росте базы 3,989 → 13,519 статей (3.4x), refresh own занял 10м38с на 13.5k статей/82.5k комментов (134 сете...
- **Статус:** автоматически синхронизировано

11 changes: 11 additions & 0 deletions src/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,17 @@ class PerformanceConfig:
default_factory=lambda: float(os.getenv("DOCS_BUCKET_WEIGHT", "0.5"))
)

# Reranker top-N recall floor (adopt/reranker-threshold-and-pool):
# сколько лучших по скору чанков переживают MIN_RERANK_SCORE-фильтр
# безусловно (union с прошедшими порог). 0 = выключено (текущее поведение:
# фильтр + fallback "вернуть всё", если не прошёл никто).
# P3-прецедент: цель 0.271<0.3 отсекалась при 2 прошедших; top_n_keep>=3
# вернул бы её как 3-ю по скору. Калибровка значения — только на holdout
# (см. src/providers/reranker/threshold_calibration.py), default 0.
reranker_topn_keep: int = field(
default_factory=lambda: int(os.getenv("MAX_RERANKER_TOPN", "0"))
)

# SYSTEM PROFILE (v2.6.0+)
system_profile: str = os.getenv("SYSTEM_PROFILE", "light")

Expand Down
29 changes: 28 additions & 1 deletion src/providers/reranker/multi_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import asyncio
import logging
import math
import time
from typing import Any, Dict, List, Optional

Expand Down Expand Up @@ -88,6 +89,14 @@ def _truncate_rerank_pair(
MIN_RERANK_SCORE = 0.3


def _sigmoid(x: float) -> float:
"""Логит -> вероятность [0,1], численно устойчиво для |x| > 700."""
if x >= 0.0:
return 1.0 / (1.0 + math.exp(-x))
e = math.exp(x)
return e / (1.0 + e)


class MultiProviderReranker(IReranker):
"""Реранкер на основе внешних LLM-провайдеров (Ollama / LM Studio).

Expand Down Expand Up @@ -631,6 +640,11 @@ async def rerank(
]
scores = await self._llama_cpp_rerank(query, passages)
if scores:
# llama.cpp отдаёт сырые логиты кросс-энкодера (≈[-11,+11]),
# а не нормализованный [0,1] по Cohere-контракту. Без
# приведения MIN_RERANK_SCORE отсекает 70-97% выдачи.
# Сортировка не меняется: сигмоида монотонна.
scores = [_sigmoid(s) for s in scores]
scored = [{"index": i, "score": s} for i, s in enumerate(scores)]
chunks = apply_scores(chunks, scored, top_n)
self.last_timing["reranker_ms"] = (_time.perf_counter() - t1) * 1000
Expand Down Expand Up @@ -664,11 +678,24 @@ async def rerank(

self.last_timing["total_ms"] = (_time.perf_counter() - t_start) * 1000

# Фильтр низкорелевантных чанков (мусор — JSON локали, битые fallback)
# Фильтр низкорелевантных чанков (мусор — JSON локали, битые fallback).
# На этом месте chunks уже отсортированы по reranker_score desc
# (apply_scores) и обрезаны до top_n.
_filtered = [
c for c in chunks[:top_n]
if c.get("reranker_score", 1.0) >= MIN_RERANK_SCORE
]
# Top-N recall floor (MAX_RERANKER_TOPN, default 0 = выключено):
# union прошедших порог с top-N по скору. Абсолютный порог хрупок на
# некалиброванных кросс-энкодерных скорах (P3: цель 0.271<0.3);
# floor гарантирует, что N лучших всегда доходят до выдачи.
_topn_keep = get_config().performance.reranker_topn_keep
if _topn_keep > 0 and len(_filtered) < min(_topn_keep, top_n):
_n = min(_topn_keep, top_n, len(chunks))
_keep_ids = {id(c) for c in _filtered} | {
id(c) for c in chunks[:_n]
}
_filtered = [c for c in chunks if id(c) in _keep_ids]
if _filtered:
return _filtered
return chunks[:top_n]
Expand Down
Loading
Loading