Record what the memory bank holds for translation consistency, what it does not, and the five questions only the owner can answer
This commit is contained in:
parent
f9216cd373
commit
4ce1f67e2b
2 changed files with 106 additions and 1 deletions
|
|
@ -14,7 +14,7 @@
|
|||
- Топикальные входы (D39.126; НЕ источники истины, при конфликте побеждает D-лог): [15-money-path.md](architecture/15-money-path.md) — деньги от гранта до settle одним маршрутом · [16-events-emitter.md](architecture/16-events-emitter.md) — сборка-норматив эмиттера шва — обязательное пре-чтение перед кодом эмиттера · **[17-seam-inbound-law.md](architecture/17-seam-inbound-law.md) — закон ВХОДНОЙ двери шва движок↔платформа — РАТИФИЦИРОВАН D39.156: семь пунктов дисциплины, двери встают паками без нового решения владельца** · **[18-bank-ontology.md](architecture/18-bank-ontology.md) — онтология банка памяти (РАТИФИЦИРОВАНА D39.158): три роли носителей, единственные писатели, дисциплина проекции — обязательное пре-чтение перед кодом, трогающим банк или его артефакты** · [STACK.md](STACK.md) — карта «роль → модель → конфиг → квирки».
|
||||
- Исторические, читать через ⚠-баннеры: [01-decisions.md](architecture/01-decisions.md) (Р1–Р10) · [02-mvp-plan.md](architecture/02-mvp-plan.md) · [03-implementation-notes.md](architecture/03-implementation-notes.md) · [04-unhappy-paths.md](architecture/04-unhappy-paths.md) · [06-memory-risk-registry.md](architecture/06-memory-risk-registry.md).
|
||||
- `experiments/` — эмпирика полигона: [00-provider-quirks.md](experiments/00-provider-quirks.md) — **читать перед любым вызовом провайдера**; [08-cost-model-v2.md](experiments/08-cost-model-v2.md) — денежная модель; [09-pilot-protocol.md](experiments/09-pilot-protocol.md) — пилот Ф2.5; остальные — отчёты экспериментов. ⚠ **У каждого отчёта статус в его ревью-шапке: читай шапку прежде тела** — она первична и говорит, ратифицированы выводы или заморожены.
|
||||
- `research/` — фактура ресёрчей; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа · 25 холодное ревью шва — **читать перед любым кодом стыка** · 24 арбитраж банка · 26 официальные практики Anthropic · 28 контракт-ревью API v0 — **носитель для исполняющих сессий, читать оригинал, не пересказ** · 27 детекция глав · 33 техдолг бэкенда — **основание курса перекроя; диспозиции ратифицированы D39.224, адреса §3 читать через эррату шапки**.
|
||||
- `research/` — фактура ресёрчей; у принятых — ревью-шапки, часть тел под ⚠ superseded: **читай баннер прежде содержимого**. Ключевые для навигации: 15 голос · 16 ридер-IDE · 17 внешняя критика · 18 рычаги качества · 19 нарезка · 20 банк-майнинг · 21 обзор транспорта · 22 доменные харнессы · 23 шов движок↔платформа · 25 холодное ревью шва — **читать перед любым кодом стыка** · 24 арбитраж банка · 26 официальные практики Anthropic · 28 контракт-ревью API v0 — **носитель для исполняющих сессий, читать оригинал, не пересказ** · 27 детекция глав · 33 техдолг бэкенда — **основание курса перекроя; диспозиции ратифицированы D39.224, адреса §3 читать через эррату шапки** · **34 банк памяти и качество перевода — что механизм консистентности держит, чего не держит и что доработать; читать через ревью-шапку (14 находок из 15 отвергнуты верификацией по ВЕСУ, синтез написан после неё)**.
|
||||
- [PROGRESS.md](PROGRESS.md) — журнал: CURRENT-STATE + состояние паков + живой хвост хроники и зонные секции «Бэкенд»/«Полигон». НЕ источник решений.
|
||||
- [BACKLOG.md](BACKLOG.md) — **ЕДИНЫЙ БЭКЛОГ проекта** (единственный трекер; «строка N» — стабильный ID). Вынесен из `PROGRESS.md` 06.09 (D39.218; исключение из дословности названо в шапке того файла); зонные бэклоги — свои и с другими ID (`П-N`, `Ф-N`, `PD-N`).
|
||||
- **Тулчейн на чистой машине.** Версии не здесь — их носители: `backend/Makefile` и `platform/Makefile` (`GO_MIN_VERSION`, `GOLANGCI_VERSION`), `frontend/package.json` (`engines`), `platform/docs/STACK_DECISIONS.md` §«Postgres на стенде без root», `eval/requirements.txt` + `eval/.python-version`. Здесь только то, чего нет нигде: ставим в `~/.local/opt/<инструмент>` с симлинком в `~/.local/bin` (он уже в `PATH`), берём **последний патч пинованного минора, а не следующий минор** — линтер пинован точным равенством и разъедется. Root требуют ровно два пакета: `build-essential` (без C-компилятора нет `-race`, а снять `-race` значит выдать отсутствие тулчейна за зелёный прогон — см. комментарий над целью `test` в `backend/Makefile`) и `python3-venv` (в системном питоне нет `ensurepip`, и установка полигона по `eval/README.md` обрывается на первом шаге).
|
||||
|
|
|
|||
105
docs/research/34-memory-bank-quality-audit.md
Normal file
105
docs/research/34-memory-bank-quality-audit.md
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
# 34. Банк памяти и качество перевода — что он держит, чего не держит и что доработать
|
||||
|
||||
> ## ⚠ РЕВЮ-ШАПКА — прочти прежде содержимого
|
||||
>
|
||||
> **Статус: ФАКТУРА, НЕ РАТИФИЦИРОВАНА.** При конфликте с журналом решений побеждает журнал.
|
||||
>
|
||||
> **Откуда взялось.** Вопрос владельца 11.09: «что для качества перевода надо в банке памяти доработать».
|
||||
> Разобрано веером из 21 агента (2.7 млн токенов, 958 обращений к инструментам) — пять читателей по осям,
|
||||
> затем адверсариальная верификация КАЖДОЙ находки с мандатом «опровергни».
|
||||
>
|
||||
> **Дисциплина, с которой это читать.** Верификация **отвергла 14 находок из 15** — и почти все не за
|
||||
> ложность, а за **завышенный вес** или **нулевую новизну** (предмет уже стоит строкой бэклога либо объявлен
|
||||
> в том же доке, откуда взято число). Формально подтверждена ОДНА (`K3`, вопрос пост-проверки). Синтез ниже
|
||||
> написан ПОСЛЕ верификации и несёт её поправки — в частности, снято утверждение «канон ни разу не подан в
|
||||
> прогон» (неверно: ключ `glossary_seed` задан в 18 конфигах дерева).
|
||||
>
|
||||
> **Чего здесь нет:** суждений о качестве перевода на целевом жанре. Всё ниже — про МЕХАНИЗМ и его
|
||||
> наблюдаемость.
|
||||
>
|
||||
> ⚠ Числа сняты 11.09 на дереве `f9216cd`. Адреса `file:line` пере-снимать командой: движок двигали пять
|
||||
> паков за неделю.
|
||||
|
||||
# ЧТО В БАНКЕ ПАМЯТИ НАДО ДОРАБОТАТЬ ДЛЯ КАЧЕСТВА ПЕРЕВОДА
|
||||
|
||||
## 1. Что банк гарантирует сегодня
|
||||
|
||||
Одну вещь, и делает её сильно: **там, где термин ЕСТЬ в банке и его поверхность выстрелила в куске, модель видит одну и ту же строку.** Это подтверждено четырьмя независимыми A/B: переводческий провод 43 % → 95 % (`docs/research/24-bank-arbitration.md` §C, 21 клетка, 6 окон), редакторский 8–15/21 → 21/21 (`docs/experiments/18-editor-wire-probe.md` §A.1), 0.53 → 0.92 на 163 упоминаниях и 0.566 → 0.820 на 228 (`docs/experiments/21-role-topology.md` §14, §16.1). Заголовочные «99,3–100 %» дала именно эта **инъекция**, а не проверка.
|
||||
|
||||
Чего он **не** держит — шесть границ, каждая названа кодом или замером:
|
||||
- **Второй передачи рядом с канонной не видит.** Вопрос пост-проверки — «есть ли dst где-нибудь в куске», а не «какой формой отрендерён термин» (`backend/internal/membank/mempostcheck.go:139` → `if present { continue }`). «Фан Юань» и «Фанъюань» в одном абзаце дают 0 промахов (исполнено на копии). Сплошной дрейф — ловит.
|
||||
- **Неверного dst, которому модель послушалась, не видит по построению** — код сам называет это BLIND SPOT (`mempostcheck.go:18-26`).
|
||||
- **Термина, которого в банке нет, не видит вовсе** — молчание неотличимо от успеха. Порог добычи: реже 5 раз в книге термин не предлагается никогда (`backend/internal/miner/miner_emit.go:26`), потолок предложений — 200 на книгу (`:31`).
|
||||
- **Книжного вопроса не задаёт ни разу.** Все 4 не-тестовых вызова проверки — по чанку или правочной единице (`waverun.go:618`, `:738`, `repair.go:630-631`); книго-широкое — это суммы поколоночных счётчиков (`quality.go:270-272`). Никто не сравнивает главу 12 с главой 901.
|
||||
- **Остановить отгрузку может ровно одно место — `export.go:463` — и оно выключено везде:** `postcheck_gate` — 0 вхождений в `backend/configs/` при живом блоке `gates:` в 4 конфигах из 4 (пере-замерено мной); 0 из 281 сохранённого снапшота прогона нёс его включённым. 317 подтверждённых промахов глоссария отгружены.
|
||||
- **Голоса до модели не доезжают вообще:** `InjectVoice` — константа `false` без ручки (`bankmaterialize.go:295`), в промте переводчика 9 плейсхолдеров и 0 про персонажа, `gates.voice` — 0 в конфигах, а сам флаггер объявлен «PURE observability».
|
||||
|
||||
Одной фразой: **банк — это замок на входе в запрос и счётчик на выходе. Замка на выходе нет, книжного вопроса нет, и половина того, что вы называете каноном («голоса»), до запроса не доезжает.**
|
||||
|
||||
## 2. Что доработать в банке — пять предметов
|
||||
|
||||
**(1) Книжный свод расхождений — $0, день. Без него приоритет непроверяем в принципе.**
|
||||
Мера «сколько РАЗНЫХ форм дал один термин» уже построена: `Spread` и `Variants` в `backend/internal/pipeline/mining.go:383-384`. Но считается она по ЧЕРНОВИКУ, на стопе майнинга, ДО редакторской волны, и читает её только человеческая таблица подписи. Перенести тот же счёт на **отгружаемый текст** и печатать отчётом сборки: «термин X отдан тремя формами в главах 12, 340, 901». Ни одного платного вызова, переиспользование готового. Предмет не пуст: полигонный прибор на стенде дал 13–16 % терминов с более чем одной передачей и 6–8 % сменивших доминирующую форму (`docs/PROGRESS.md:3306`). Это единственная работа, которая делает качество ПРЕДЪЯВИМЫМ.
|
||||
|
||||
**(2) Спросить проверку о правильном — день (дешёвая половина).**
|
||||
Сегодня проверяется присутствие в куске; надо — форма на месте срабатывания и наличие конкурирующей рядом. Живой экземпляр измерен: `古月方源` заведён алиасом записи `方源` («Фан Юань»), выход «Гу Юэ Фан Юань» её содержит ⇒ промаха нет, а ваш подписанный канон `古月 → Гуюэ` (`books/gu-zhenren/guzhenren-seed-v2.yaml:38-39`) нарушен внутри составного имени. Дешёвое лечение названо самим полигоном: проверять алиас-ключ на СОБСТВЕННУЮ канонную форму. Дорогая половина (детектор значения по исходнику) — за замером, не сейчас.
|
||||
|
||||
**(3) Досеять ДАННЫЕ банка — день, и это прямо чинит точность. Не Go.**
|
||||
Три дыры в данных, из-за которых прибор врёт: (а) глагольные и многословные термины засеяны с пустыми формами — один `炼化` дал 7 ложных промахов и в одиночку пробил метрику прогона; (б) односимвольный ханьский ключ структурно вне автомата без `allow_short` (порог 2 знака, `membank/memory.go:71`), а это самый частый класс канона в китайском ранобэ — 蛊, 道, 气; (в) сид-линт об этом молчит. Цена бездействия измерена: у глоссарного класса чекера **точность 0,067 — 1 верное срабатывание на 14 ложных (n=258)**, и из 14 ложных **6 приходятся на один односимвольный `转`, ещё 4 на `蛊虫`** (`books/gu-zhenren/labels/metrics.json`). Именно из-за этой цифры гейт и не включают.
|
||||
|
||||
**(4) Редактор — источник разнобоя, а не страховка поверх банка. День + один заказ.**
|
||||
Замерено дважды: без закон-блока редактор ломает 5–12 из 20 уже ВЕРНЫХ клеток черновика (exp18 §A.1), а с подключённым банком боевой редактор держит ХУДШЕЕ покрытие канона в панели — 0.882 против 0.909 у черновика, который он правит (exp22 §6.2, чистый материал, 1124 упоминания). Два механических носителя: черновая волна выбирает по БАЗОВОМУ банку с исключением намайненного (`bankmaterialize.go:329`) — то есть на первом прогоне книги черновик идёт вообще без добытого банка; а редакторская волна, единственная с полным банком, теряет липкость между правочными единицами внутри главы (`waverun.go:717`, `nil`) при **86 % многоединичных глав (1962 из 2283)**. Закон-блок должен стать инвариантом конфига, а не следствием выбора модели редактора.
|
||||
|
||||
**(5) Голоса — узел без провода. Это не «доработать», это сначала ваш ответ (см. §4).**
|
||||
Мёртв в четырёх местах сразу: нет данных (0 непустых секций `voices:` из 47 сид-файлов дерева), нет производителя (майнер профили не эмитит — 0 упоминаний в 10 его файлах), нет инъекции (константа), нет запущенной проверки. И **ни одного числа за всю историю проекта**: носитель журнала обращений живёт в 6 Go-файлах и не встречается ни разу в 66 полигонных и ресёрч-доках (контроль: слово «канон» в тех же 66 файлах — 333 раза).
|
||||
|
||||
Чего в списке НЕТ намеренно: бюджет инъекции. Ходящее число «кап течёт на 40–60 %» считает ЭМИССИОННЫЙ кап майнера, а не бюджет провода. Бюджет не выбросил ни одной строки ни в одном прогоне дерева: **сумма вытеснений по 161 базе = 0** при живых соседних колонках (5885 точных попаданий, 2979 липких, 510 неоднозначных). Тратить на это не надо.
|
||||
|
||||
## 3. Что нельзя решить работой — ждёт замера на настоящей книге
|
||||
|
||||
Это определяет, что закладывать в прогон.
|
||||
|
||||
- **Точность и полнота проверки на подписанном каноне.** Сегодня 0,067 (выше), и ложные срабатывания сконцентрированы в одном классе: односимвольные и общеупотребительные ключи. ⚠ **Здесь ратифицированная формулировка неточна и это надо поправить прежде, чем строить по ней порядок работ:** «канон ни разу не подан в прогон, весь дрейф — дрейф с отключённым каноном» верно ТОЛЬКО про исследовательский стенд (там 0 из 30 конфигов несут ключ сида). В дереве 18 конфигов задают подписанный сид, пять прогонов держат 36–57 подписанных строк, а весь размеченный корпус — 91 единица — снят с прогонов С каноном. Дрейф ПРИ каноне тоже наблюдён (тот самый `古月方源`). Значит переизмерение — это не «сперва подключить канон», а «разметить класс, которого в корпусе не было», и стоит оно $0 на уже оплаченных артефактах плюс новый прогон.
|
||||
- **Впервые встретить настоящий объём.** Максимальный банк за всю историю дерева — 102 строки на 25 главах; потолок предложений 200, бюджет провода 800 токенов (≈141–180 строк). На 2283 главах оба потолка встретятся с реальностью впервые. **Снять с прогона, а не выводить.**
|
||||
- **Дрейф от потери банка между правочными единицами.** Экспозиция замерена (86 % глав; на срезе 25 глав теряется 49 банковых строк на 12 единицах), самих инцидентов — ноль наблюдений. Правка без замера была бы стрельбой вслепую.
|
||||
- **Кривая деградации по главам.** Её нет ни у кого, включая внешние харнессы. Нужен ряд «глава → число терминов с более чем одной передачей». Снимается $0 ПОСЛЕ прогона — но только если свод из §2.1 построен ДО.
|
||||
- **Порог частоты.** «Реже 5 раз — не предлагаем» ставился на 15 главах пилота. Какая доля канонических терминов настоящей книги живёт на частоте 3–4 — не спрошено ни разу.
|
||||
- **Активный ноль.** Ни один замер банка не нёс контроля «та же книга без банка». Направление подтверждено четырежды, ВЕЛИЧИНА «99,3–100 %» — ни разу.
|
||||
|
||||
**Что заложить в прогон конкретно:** подписанный сид с досеянными формами и явным `allow_short` у односимвольных; флаг остановки на подпись (иначе банк едет неподписанным по умолчанию); сохранять расхождение форм по ФИНАЛЬНОМУ тексту, а не по черновику; хотя бы один непустой профиль голоса, иначе голосовая половина снова вернётся с нулём, неотличимым от чистоты; книга целиком, а не срез.
|
||||
|
||||
## 4. Что требует вашего слова
|
||||
|
||||
1. **Стоп или флаг.** Сегодня разъехавшийся термин отгружается: механизм остановки построен и работоспособен, но выключен, и включается ОДНОЙ строкой данных без правки Go. Вы сами отложили это до замера ложных срабатываний («если он ложно положительно будет стрелять — это плохо, очень плохо»). Рекомендация: не включать до §3.1, но решить сейчас, что стоп делает — держит кусок целиком (сегодня это пустая отгрузка) или зовёт точечную перегенерацию; актуатора у промаха нет вовсе.
|
||||
2. **Входит ли голос в приоритет №1.** Ратифицированный список от 05.09 ставит в №1 ТОЛЬКО термины, голос — №3; канон проекта говорит «термины/голоса». Пока это не одно требование, сессия, собранная по такой формулировке, будет строить от неверной цели. И следом: **подпись профилей вы сняли, а реестр физически заполняла только она — если не подпись, то кто?**
|
||||
3. **Один перевод у неподписанного термина.** Ваше слово записано, но исполнено только для подписанных. Неподписанных — 92 % строк по всему корпусу баз, 15 % после дедупа по книге (оба числа верны, считают разное: первое — файлы, второе — книги). Три детектора противоречия только пишут в лог. Оба выхода стоят денег: уронить оплаченный прогон либо двинуть версию памяти и пере-купить редакторскую волну.
|
||||
4. **Накапливать ли банк между прогонами.** Авто-банк переписывается целиком из топ-200 текущего прогона; выпавшие поимённо названы в логе, подписанные защищены тремя стражами, но неподписанная строка едет на провод как закон и может смениться между главами. Слияние двигает версию памяти ⇒ пере-покупка. Код прямо адресует это вам.
|
||||
5. **Остановка на подпись — опция или свойство продукта.** Сегодня по умолчанию «никогда не останавливаться» (`backend/cmd/tmctl/invocation.go:141`), на API это галочка пользователя. Без неё движок пишет свои строки в банк и отдаёт редактору неподписанный канон — то есть «человек утверждает термины» сегодня не является свойством продукта.
|
||||
|
||||
---
|
||||
|
||||
## ЗАМЕРЕНО · ВЫВЕДЕНО · НЕ СПРОШЕНО
|
||||
|
||||
**ЗАМЕРЕНО** (приборы названы; звёздочкой — пере-проверено мной лично в этой сессии, остальное — пятью читателями):
|
||||
- ★ `postcheck_gate` и `voice` в `backend/configs/` — по 0 вхождений при контроле: 5 yaml на верхнем уровне, 8 рекурсивно, блок `gates:` найден в 4 из 4 боевых конфигов.
|
||||
- ★ `injection.txt` несёт РОВНО один целевой ключ `ru` при контроле — 5 ключей (en ja ko ru zh) в соседнем `lang-script.txt`. На любой другой цели оба банк-блока рендерятся в 0 байт (исполнено на копии: ru 366+542 байта, en 0+0, de 0+0).
|
||||
- ★ Не-тестовых вызовов пост-проверки — 4, все по чанку/юниту (`waverun.go:618,738`, `repair.go:630,631`) плюс определение.
|
||||
- ★ По 162 базам дерева: 161 с таблицей состояния выборки, 4865 строк, **сумма вытеснений 0** при контроле 5885 точных попаданий / 2979 липких / 510 неоднозначных; подтверждённых промахов глоссария 317.
|
||||
- ★ Точность глоссарного чекера: n=258, верных 1, ложных 14, пропусков 0 — и все 14 ложных разложены: `转` ×6, `蛊虫` ×4, `元石` ×2, `凡人`, `甲等`; все пять прогонов-источников — С подключённым каноном.
|
||||
- Снапшотов прогонов с включённым гейтом — 0 из 281 (18 «без поля» вскрыты: ручные пробы, не конвейер).
|
||||
- «99,3–100 %» воспроизведены байт-в-байт на копии (375/98.9/100.0 · 390/98.5/99.5 · 531/97.4/99.6 · 548/96.9/99.3) и разобраны: предикат — присутствие принятой формы в чанке, единица — пара «термин × чанк».
|
||||
- Пробы на копиях: смесь двух форм в одном куске → 0 промахов; сплошной дрейф → 1 промах; термин вне банка → 0/0; односимвольный ключ без `allow_short` не выстреливает.
|
||||
- Данные: 47 сид-файлов с терминами, 22 с секцией голосов, 21 из них пустая, непустых живых — 0. Субстрат майнера: zh 48 кандидатов из 120 рун против en 0/504, ko 0/200, катакана 0/160.
|
||||
|
||||
**ВЫВЕДЕНО** (не замер, помечаю честно):
|
||||
- Что кап 200 и бюджет 800 встретятся с настоящим объёмом: экстраполяция со 102 строк на 25 главах на 2283 главы.
|
||||
- Что потеря липкости между правочными единицами даёт дрейф в тексте: замерена только экспозиция (86 %), инцидентов ноль.
|
||||
- Что вторая передача распространена в отгруженном тексте: 13–16 % сняты на стенде БЕЗ канона; тем же прибором по подписанному прогону не ходили.
|
||||
- Что голоса входят в приоритет №1: канон и ратификация расходятся — поэтому это ваш вопрос, а не вывод.
|
||||
|
||||
**ЧЕГО ПЯТЬ ЧИТАТЕЛЕЙ НЕ СПРОСИЛИ:**
|
||||
1. **Полисемия по книге.** Банк — один исходный термин, один перевод, замороженный на прогон. Сцена, где 气 не «ци», в модели банка не существует, и ни один прибор её не ищет. Для 2283 глав это не теоретический класс.
|
||||
2. **Ёмкость человека.** Весь механизм консистентности упирается в вашу подпись, а сколько предложений на главу выдаст майнер на полной книге и сколько это минут — не смоделировано никем; в реестре рисков эта позиция стоит с пометкой «дыра» и не имеет носителя ни в одном трекере.
|
||||
3. **Цена самого свода.** Работу из §2.1 все оценивают «день», но время прохода по 5071 чанку полной книги никто не прикинул.
|
||||
4. **Вторая книга той же пары.** Классификатор типа термина — тот, что решает «транслитерировать или переводить» — обучен на каноне 蛊真人 прямо в общем промте пары (`backend/prompts/zh-ru/classifier.md`, шесть книжных поверхностей плюс два few-shot-ответа). Смещение на другой zh→ru книге не мерил никто.
|
||||
5. **Ретроактивность подписи.** Два прогона ОДНОЙ книги разошлись в самом каноне — 元石 «первокамень» против «первобытный камень», 真元 «истинная энергия» против «истинная ци», обе записи подписаны. Прибор удостоверяет верность тому канону, который загрузили, а не стабильность канона. Что делать с главами, отгруженными до того, как вы поменяли подпись на 300-й главе, — не спросил никто.
|
||||
Loading…
Add table
Reference in a new issue