diff --git a/KNOWN_ISSUES.md b/KNOWN_ISSUES.md index c7b8c7dd..7fab94fd 100644 --- a/KNOWN_ISSUES.md +++ b/KNOWN_ISSUES.md @@ -5,6 +5,14 @@ --- +## 2026-09-29 — FTS-тир молча выпадает по таймауту 2s, ранки плавают run-to-run (Open) + +- **Локация:** `src/core/search/engine.py:970-976` (`wait_for(..., timeout=2.0)` вокруг `_fts5_search_async`; `TimeoutError` → tier `[]` + warning в лог). +- **Симптом:** членство FTS-тира в RRF-пуле недетерминировано от прогона к прогону: наблюдалось P2 rank 1↔2, воббл H6/H11/H12 на том же индексе и коде. Холодный FTS-билд (~0.5–2.5s lazy `to_pandas`) съедает бюджет целиком — первый замер в свежем процессе систематически без FTS-тира (частный случай уже учтён warm-up-правилом в записи 2026-09-28, но теплый индекс тоже флипает у границы 2s). +- **Почему это ловушка для гейтов:** silent-degraded — ни флаг в выдаче, ни строка в harness-таблице; воббл выглядит как эффект кода, а не бюджета. `void`-флаг (`timing=={}`) и degraded-флаг (`reranker_ms==0`) этот класс НЕ ловят. +- **Fix options (решение владельца):** (a) явный `fts_timed_out` флаг в результат/трейсер + degraded-строка в гейтах; (b) бюджет/квота вместо жёсткого капа (адаптивный timeout, повтор с урезанным лимитом); (c) прогрев FTS до замеров как обязательный шаг harness (уже частично: discarded warm-up). +- **Статус:** 🟡 Open (процедурное правило до фикса: gate-серия обязана идти в одном процессе с discarded warm-up + фиксировать число FTS-таймаутов по логу `FTS5 search timed out`). + ## 2026-09-28 — Pre-commit hook fail-open при потере маркеров (Fixed) - **Локация:** `.githooks/pre-commit:31-53` (`find_project_root` + `run_script`). diff --git a/experiments/reranker_p3/PREREG.md b/experiments/reranker_p3/PREREG.md new file mode 100644 index 00000000..9ee67f15 --- /dev/null +++ b/experiments/reranker_p3/PREREG.md @@ -0,0 +1,37 @@ +# P3 module-head anchor — preregistration (2026-09-29) + +Status: PREREGISTERED — written BEFORE implementing the anchor. No numbers +invented here; thresholds/caps referenced are the existing ones +(`_O1_ANCHOR_TOTAL`, `MAX_RERANKER_INPUT=30`, `MIN_RERANK_SCORE=0.3` untouched). + +## Hypothesis + +P3 (`src/core/artifact_gc.py` gold file below threshold) is a pool-entry / +ranking problem of the same family as P2: the chunk the reranker scores +highest (module-head/docstring) never reaches the reranker, while the code +chunk that does reach it scores a negative logit and dies at the threshold. + +## Decision rule (verbatim) + +"anchor a file's module-head/docstring chunk into the pre-rerank pool iff it +scores above threshold on holdout queries; falsified if (i) docstring chunks +do not outscore code chunks on holdout, (ii) anchoring regresses holdout H-set, +(iii) pool cost exceeds caps". + +## Reading of the three clauses + +- (i) is checked by the persisted probes + (`rerank_probe_run1.json`: gold_doc #1 on 6/6 holdout-style queries; + `rerank_probe_run2.json`: module_head top on P3/R2, code chunks negative). +- (ii) is checked by the no-regression holdout H1–H12 + P/R + doc-control + gate (fresh-process discipline — reranker-cache trap). +- (iii) is checked structurally: anchors bounded by the existing caps + (`_O1_ANCHOR_TOTAL`, `MAX_RERANKER_INPUT=30`). + +## Scope + +- Validate on holdout only — NEVER the frozen eval-16. +- `MIN_RERANK_SCORE=0.3` untouched (threshold sweep on the eval set was + explicitly refuted in `EXPERIMENTS_LOG.md:2815-2816`). +- Minimal diff extending the P2 `_anchor_identifier_chunks_async` precedent + (`engine.py:772-805`), same style. diff --git a/experiments/reranker_p3/README.md b/experiments/reranker_p3/README.md new file mode 100644 index 00000000..2bbd2d4c --- /dev/null +++ b/experiments/reranker_p3/README.md @@ -0,0 +1,46 @@ +# reranker_p3 probes — module-head / docstring anchor evidence + +Persisted 2026-09-29 from `%TEMP%\opencode\` (byte-identical copies, hashes in SHA256SUMS). + +## What + +Two fresh-process direct-reranker probes that bypass retrieval and POST +straight to the reranker. Finding: the gold module-head/docstring chunk of +`src/core/artifact_gc.py` outscores every code chunk on holdout-style queries, +while the `_prune`-body code chunk scores a negative logit (P3 -0.99, R2 -2.60 +in the eval path). Motivation for the P3 module-head anchor: guarantee the +docstring chunk a place in the pre-rerank pool. + +## When / how run + +- Both scripts stdlib-only (`urllib`), run as `python