External-review memory bank v2: accept with 6 confirmed findings in the short-key/collision/gate zone, F1 and injection surface clean

This commit is contained in:
Claude (backend session) 2026-07-05 13:38:48 +03:00
parent aa00339abb
commit 068f59d22f

View file

@ -454,6 +454,17 @@ keep-alive (Ф12), инъекция глоссария (`selective`), пор
**Заложено/отложено (реестр §5, поля/место есть, реализация — Ф2/веха+):** Палладий/Поливанов B6 (reading как мост заложен), гейт фактичности резюме D1, эмбеддинг-слой A7/D2, морфо-гейт глагольного рода C3 (pymorphy-сайдкар), бэкап файла F4, автопопуляция/адъюдикация G1/F5, series-bible ты/вы-журнал, инъекция глоссария в редактор (dst-констрейнты) — fast-follow на той же поверхности. Ставка (селективная инъекция vs длинный контекст) гейтится in-house eval'ом пилота Ф2.5 (параллельно, не блокер). Правки только в коде `backend/` + этот журнал; `architecture/06`/`research/*` не трогались.
> **Внешнее ревью оркестратора банка памяти v2 (05.07): ПРИНЯТО, 0 живых блокеров на дефолтном конфиге, 6 подтверждённых (5 различных, 3 major; gate-находка независимо продублирована 2 линзами), 0 отсеяно — ВСЕ прогоном реального кода.** **Ядро держится:** F1 (материализация/resume/детерминизм — тихий расходящийся ре-пэй), нормализация A4 (симметрия ключ↔текст), спойлер C1, инъекц-поверхность (сам проверил) — **чисты, находок нет.** Все гэпы в одной зоне — **короткие/коллизионные ключи + гейт инвертирует свою же safety** — ровно те «hard traps», что `research/13` §«Честные слабые места» **предсказал непроверенными** (материализовались в коде, пойманы до продакшена).
> **Major (закрыть до флипа гейта / до ja-kana в проде):**
> 1. **[major, ONE-LINER, делать первым] PostcheckGate флагает по ОБЩЕМУ числу miss без фильтра disposition** (runner.go:744; продублировано 2 линзами). AMBIGUOUS-only miss (кандидат, который модель ВПРАВЕ отклонить) роняет чанк → `FinalText=""`**выбрасывает корректный перевод**. Инвертирует A2/E1: модель, ПОСЛЕДОВАВШАЯ неверной инъекции, проходит; модель, ПРАВИЛЬНО отклонившая — наказана. Контракт (E1/B4/gate-list/config, 4 источника) скоупит гейт на approved. Фикс: считать в гейт только `Disp==confirmed` miss; ambiguous — только в retrieval-state (наблюдаемость). Опт-ин (дефолт=флаггер) → на дефолте не горит, но чинить ДО флипа.
> 2. **[major] Source-side матч без word/script-границы + `dispositionFor` только по статусу** (memory.go:361, ac.matches). A2-ветка «коллизия поверхности → AMBIGUOUS» НЕ реализована; source-сторона без границы (асимметрия с target `containsWholeWord`, фикс селфревью #3). 2-символьный коллизионный ключ фичит **CONFIRMED внутри обычного слова** (リン→Рин в リンゴ/яблоко, AI→ИИ в RAID, 天下 в 天下无双). Post-check ИНВЕРТИРУЕТ: ложный confirmed-miss на КОРРЕКТНОМ выходе, и **не ловит FOLLOWED-отравление** (presence-only ловит только ДРОПнутый термин). Фикс: A2-даунгрейд коллизионных коротких ключей в AMBIGUOUS (не CONFIRMED); source-граница где есть смена скрипта/не-буква.
> 3. **[major] `min_key_len` per-язык НЕ разведён** (memory.go:42 `defaultMinKeyLen=2` хардкод). Реестр A3 называет `glossary.min_key_len` per-язык как механизм — не разведён. Precision-1.0/MIN=2 мерена на zh-Han-ловушках, **не переносится на ja-kana** (#2 язык, 46-символьная слоговая → 2-kana ключи = частые подстроки). **NB: селфревью REFUTED это как «документированный размен» — но замер был zh-Han-scoped; для kana это реальный гэп.** Фикс: развести per-язык (в `memoryMatchVersion`+snapshot), kana ≥3, или 2-kana за `allow_short`.
> **Minor (гарды от авторской описки, закрыть тихие дыры):**
> 4. **[minor] 1 src → 2 dst с ПЕРЕСЕКАЮЩИМИСЯ спойлер-окнами** → две противоречивые авторитетные строки, **молча** (асимметрия: зеркальный B2 2src→1dst логируется громко). Фикс: overlap-проверка same (src,sense) → WARN/fail-loud.
> 5. **[minor] approved-термин с пустым dst — молча инертен** (memseed.go:62; нет empty-dst-гарда на approved). Не матчится, не инъектится, 0 предупреждений → тихая потеря recall на всю книгу (ruby-auto с пустым dst легитимен, но там status=auto). Фикс: reject `status∈{approved,draft}` с пустым dst в loadGlossarySeed.
> **Протокол включения гейта (важно):** твой E1-замер меряет false-flag **approved**-терминов на русской морфологии — но находки 1/2/3 вскрывают **другие оси** false-flag (ambiguous-decline, коллизионные короткие ключи), которые E1-протокол НЕ покрывает. Значит либо чинить 3 major ДО флипа (что убирает эти оси), либо расширить протокол валидации на них. Рекомендую первое.
> **Приоритет:** #1 (one-liner, немедленно) → #2+#3 (коллизия/kana, до ja-kana или флипа гейта) → #4/#5 (дешёвые гарды). Ничего не блокирует дефолтный конфиг; всё блокирует флип гейта и прод ja-kana.
## Полигон
(секция параллельной сессии — записи добавлять сюда)