На прод-движке (openai, дефолт) контрольная заметка приходит с первой ступени кандидатом №1 из 250. Первая ступень исправна. Замер 28.07 шёл по запасному движку e5 — отсюда и увело.
Подъём воронки не помогает вообще: заметки нет в топ-12 при K = 60 / 150 / 250 / 400.
✅ Настоящий корень: файл представлял НЕ ТОТ абзац доказано
Дедуп по файлу стоял ДО реранкера: из файла оставался один чанк, выбранный косинусом, и кросс-энкодер судил весь файл по нему.
чанк заметки
косинус
есть спрошенная фраза
оценка реранкера
#4298 — его и выбирал косинус
+0.4674 ← лучший
нет
−10.25 (последнее место)
#4303
+0.4310
да — «Компилятор производного слоя»
−4.94
Файл проигрывал не потому, что нерелевантен, а потому что его представлял абзац без ответа. Реранкер ставил −10.25 честно — ему показали не то.
2. Что сделано
В реранкер идёт до 3 чанков каждого файла, дедуп — ПОСЛЕ реранка
Представителя файла теперь выбирает тот, кто умеет читать запрос, а не косинус. Воронка осталась 60: её подъём вредит и стоит latency. Ручки вынесены в env (BRAIN_CHUNKS_PER_FILE, BRAIN_TOPK_RETRIEVE) и клампятся к минимуму 1.
конфигурация
контрольный запрос в топ-12
реранк
K=60, 1 чанк/файл (было)
❌ нет
0.73 с
K=250, 1 чанк/файл
❌ нет
1.64 с
K=400, 1 чанк/файл
❌ нет
2.48 с
K=60, 3 чанка/файл(стало)
✅ 7-е место
1.07 с
K=250, 3 чанка/файл
❌ шум вытесняет обратно
4.52 с
На 5 контрольных запросах верхняя оценка не ухудшилась ни разу, у двух выросла: +8.66 → +9.48 и −0.20 → +2.68.
Разделение «свои vs чужие» вопросы ИСЧЕЗЛО перемер §4 после фикса
вопрос
ответ в волте?
27.07
04.08
правило что причина такой же claim как вывод
есть
+8.66
+9.48
как мы синхронизируем машины через Syncthing
есть
+5.87
+5.87
архитектура памяти цифрового двойника
есть
+1.57
+1.57
компилятор производного слоя — фраза из тела заметки
есть дословно
−4.54
−4.21 ← ниже всех «чужих»
рецепт неаполитанской пиццы
нет
−1.03
−1.03
билет на автобус в Куала-Лумпуре
нет
−3.82
−4.14
глубина батискафа «Триест»
нет
−4.53
−2.22
Порог rr = 0 заглушил бы вопрос, на который система только что дала правильный ответ, и пропустил бы батискаф. Чистое разделение 27.07 было артефактом выборки: все три «своих» вопроса совпадали с ЗАГОЛОВКАМИ заметок. Вывод: оценка реранкера не годится как мера «есть ли ответ в волте». Вариант C3 закрыт по существу, а не «до выяснения».
4. Сторонние глаза
Codex — нашёл настоящую дыру починено
BRAIN_CHUNKS_PER_FILE=0 давало пустой пул кандидатов: ноль хитов, а пустая выдача читается сессией как «в волте про это ничего нет». Нечисловое значение роняло модуль на импорте — сразу три движка. Теперь кривое значение = громкая строка в stderr + дефолт.
Grok — 2 претензии из 3 опровергнуты замером 1 принята
⛔ «в реранкер уходит ~20 файлов вместо 60» — замерено ровно 60 файлов / 169 чанков.
⛔ «сняли circuit breaker → мусор» — обрезка никогда не была включена, снимать было нечего.
⚠️ «топ-12 забьётся длинными заметками» — подтвердилось частично. Средний размер файла в топ-12 вырос в 5 запросах из 6 (напр. 4.83 → 7.08 чанка при среднем по индексу 2.35); у контрольного упал 18.50 → 10.42. Перекос был и ДО фикса, фикс его слегка усиливает. Лечится нормировкой на число чанков — пока цена не оправдывает усложнение.
Gemini — рельса пропущена явно вердикт → ⚠️
У t3 нет локальной CLI-двери, только браузерная с ручной вставкой, а прогон был безлюдный по расписанию. Вендор не мёртв — закрыта дверь. По канону явный скип опускает вердикт /tt до ⚠️, поэтому фикс помечен ⚠️, несмотря на зелёные тесты.
5. Раскатка на флот
Круг потребителей — 2 узла, назван по факту, а не по памяти
Живой API Syncthing: папка claude-imports = E:\Obsidian\_imports, sendreceive, ровно два устройства — хаб A-2022BayArea и HP17-ZBook. Остальные узлы флота эту папку не держат, движка у них нет.
посылка brain-recall-chunkfix-20260804 в PENDING, .py едут Syncthing'ом
Сторож от отката — _imports/_test_brain_recall.py, в ночной регресс-сетке. Отдельный инвариант гоняет тот же путь со сломанной настройкой и требует, чтобы заметка ПОТЕРЯЛАСЬ: если тест зелёный и так, он ничего не доказывает.