From 12a163a9d9de44e4abc7f0da16515b1f3da3e249 Mon Sep 17 00:00:00 2001 From: heaven Date: Mon, 7 Sep 2026 19:05:26 +0300 Subject: [PATCH] Retract the arm's money mechanism and state the opposite symptom the code actually shows --- docs/BACKLOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index be569e11..de35ccc5 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -289,6 +289,6 @@ | 345 | ⛔ **НОВАЯ ПАРА МОЖЕТ ОТВЕЧАТЬ СВОИМИ СЛОВАМИ КЛАССОВ, И ВСЯ БАТАРЕЯ ЗЕЛЁНАЯ — словари классификатора закрыты в Go и прозой промта.** `terminology/classify.go:18` `Types`, `:26` `CandidateTypes`, `:50` `Genders`; третья копия — `pipeline/banknote.go:80` `bankTypeOK` (не упомянут ни одним тестом); те же слова прозой в `prompts/zh-ru/classifier.md`. Леджер меток промтов смотрит на одну пару (`promptlabel_test.go:53` `const pair = "zh-ru"`), а off-vocabulary ответ модели — только `Log.WarnContext` (`terminologist.go:603`), отказа нет. ⟲ research/33: подложенная `prompts/ja-ru/classifier.md` с локализованными словами классов (人名 · 地名 · 称号 · 用語) проходит батарею БЕЗ единого шага автора; цена — молчаливая потеря качества на второй паре (тип неверен 12–22 %, `name/place` форсирует транслитерацию — D39.65). Бьёт прямо по цели №2: дежурный ревью-вопрос «заработает ли пара без правки Go» получает ответ «да, и молча неверно». Лечение $0: линт КАНОНИЧЕСКОЙ формы промта (комментарии снять — наивная версия ложно-зелёная, слова есть в HTML-шапке) в существующем `internal/config/prompt_lint_test.go` (89 строк; сам объявляет целью «ja-ru or en-ru pack authored by copying the zh-ru one») + свести `bankTypeOK` к `terminology.CandidateTypes` (одна строка импорта, уже экспортирован). ⛔ Обратная дорога (словарь в данные) двигает `prompt_sha256`/`RequestHash`/`classifierVersion` и ЗАПРЕЩЕНА — D39.194 п.9 и **D39.195 п.5** (⚠ испр. 07.09: research/33 и первая редакция этой строки ссылались на D39.199 п.5 — там закрытие строки 264, не запрет) | бэкенд | скоро (шаг 0 research/33, $0) | линт в `prompt_lint_test.go` + одна строка импорта | research/33 Д1 | | 346 | ⛔ **ПРАВИЛО ЗАГОЛОВКА РАЗЪЕХАЛОСЬ ПО ТРЁМ ПРЕДИКАТАМ, И «第零章» ЛОМАЕТ ПРОЛОГ — две половины с РАЗНОЙ ценой.** Страж длины живёт только в ингесте (`chunk/ingest.go:307` `chapterHeaderMaxRunes = 60`, применён `:323`; в `chunker.go` `RuneCountInString` — 0 хитов), осмысленность номера — только в чанкере (`chunk/chunker.go:316` `if !any || v <= 0`). Воспроизведено исполнением 07.09 (выброшенная проба на копии дерева): `第零章:序幕` ингест режет главой, а чанкер заголовок НЕ снимает — `heading=""`, сырой CJK-маркер уезжает модели; `parseSectionNumeral` на `零`/`0`/`〇` даёт `0,false` (контроль: `一`=1, `十二`=12); номера расходятся (`第一章` = `Chapter 2` при «Глава 1»); 84-рунный заголовок: ингест `false`, чанкер `ok=true`. ⚠ **Испр. 07.09 — без этой оговорки строка читается как ЛОЖНАЯ:** расхождение живёт ТОЛЬКО у заголовка С СЕПАРАТОРОМ после юнита (`第四章:…`); без сепаратора оба предиката дают `false` на любой длине, потому что такую строку отвергают и `isHeaderSeparator` ингеста, и `matchHeaderLine` чанкера. Пере-снято оркестратором на копии `d6dfc49`: с сепаратором 59 и 60 рун — оба `true`; 61 и 84 — ингест `false` при чанкере `ok=true n=4`; без сепаратора 12/55/59/60/61/84 — `false`/`false` во всех шести. Граница ровно `chapterHeaderMaxRunes` = 60. Перекрёстного теста нет ни в одном из 97 тестов `internal/chunk`. **(а) $0 СЕЙЧАС — пин ИЗВЕСТНОГО расхождения, а не паритет:** красный тест в `main` не ложится (`Makefile:58` `battery: build vet fmt lint test`), скип — класс D39.208; поэтому тест утверждает, что на `第零章` и на 61–84-рунной строке ингест и чанкер СЕГОДНЯ расходятся, назван этой строкой и краснеет ровно тогда, когда приземлится фикс (б), заставляя фиксера его перевернуть. Дизайн-пак 161 §4.5 паритет-тест ОПИСЫВАЕТ, пишет его пак стройки — пин (а) этому не мешает. **(б) В ОКНО ПЕРЕНАРЕЗКИ:** сам фикс меняет ТЕКСТ чанка ⇒ бампает `chunkerVersion` ⇒ снапшот обеих волн (`render.go:55-58` — «a deliberate re-translation»); отдельным актом он платит ту самую перепокупку, которую отменяет. ⚠ Ось «обязательность юнита» — НЕ трогать: носитель строка **303** (⚠ испр. 07.09: research/33 приписывал её `D39.207`, в теле ноты этого нет — греп по предмету 0 при 23 строках тела) | бэкенд | скоро для (а); (б) — в окне перекроя (шаг 3) | (а) пин расхождения · (б) сведение двух предикатов к ингестовским стражам внутри пака перекроя | research/33 Д3, research/27 §6 | | 347 | **ПАР-ДАННЫЕ НЕЛЬЗЯ ЗАВЕЗТИ ПО ЧАСТЯМ: манифест требует ≥1 канал, и транслитерационный канал зашит в китайскую форму.** `lang/langpack.go:632` — «manifest declares no channel — omit the file to ship all channels, or list at least one»; каналов два и они закрыты в Go (`source-morphology`, `transliteration`, `:108-114`), а `validate()` при `transliteration` требует ПОИМЁННО пиньинь-категории (`:521-527`); морфологический канал просит общие таблицы (`:507-516`) и в китайскую форму не зашит. Отказ жёсткий: при `gates.terminology.enabled` и `pack == nil` прогон отказывает `RefusalBadConfig` (`pipeline/runner.go:349`), а в боевом `pipeline-c1.yaml:151` гейт включён ⇒ вторая пара выбирает между фиктивными данными китайской формы и прогоном БЕЗ банка терминов (продуктовая цель №1). ⚠ **Триггер — первая новая ИСХОДНАЯ пара, и он РАНЬШЕ строки 115:** манифест лежит в `//` и хешируется языком-ИСТОЧНИКОМ (`langpack.go:252`), а 115 — про новую ЦЕЛЬ; ближайшая исходная пара в трекере — ja→ru (строка **81**), цель у неё ru. ⚠ **Пять строк снимают отказ, но банка на не-Han источнике НЕ дают** — детектора нет (строка **35**: en-детектор не существует, ja с zh-таблицами активно неверен); заказывать вместе, иначе строка обещает больше, чем покупает. Сегодня не оплачено ни разу: 0 `manifest.txt` в `configs/`, каталог пары один. ⚠ D39.64 П4 ратифицировала ОБРАТНОЕ намерение («источник без пиньинь-морфологии грузится без Palladius-файлов») — строка `list at least one` не дошла шаг до собственной цели | бэкенд | когда-нибудь (вход пака второй пары; триггер общий со строками 81 и 35) | разрешение нулевого числа каналов + решение по форме каналов | research/33 Д7, D39.64 П4 | -| 348 | ⛔ **ШАПКИ АРМ-КОНФИГОВ ОБЪЯВЛЯЮТ «ЕДИНСТВЕННОЕ ИЗМЕНЕНИЕ», А АРМ РАСХОДИТСЯ С БОЕВЫМ НА ДВА ДЕСЯТКА КЛЮЧЕЙ — включая снятый банк терминов; лжёт и сам гейт.** Замер 07.09, две независимые методики: голый дифф не-комментарных строк против `configs/pipeline-c1.yaml` — glm **26** / mistral **28** / deepseek-pro **23**; тот же дифф со снятыми пустыми и хвостовыми комментариями — **18/18/15** (КОНТРОЛЬ обеих: c1 против себя = 0). Популяции разные, вывод один: во всех трёх армах `banknote:` 0, `terminology:` 0, `contrast_path` 0, `classify_types` 0, `target_script` 0, `prompt_override` 0 — при ровно ОДНОМ YAML-ключе каждого имени в c1 (⚠ испр. 07.09: прежние «1/1/3/1/1/3» — подстрочный счёт, для этого вопроса негодный). ⚠ **Носителей лжи ТРИ, и они разной силы.** (1) Шапки армов («копия боевого C1 с ЕДИНСТВЕННЫМ изменением») — ложны буквально. (2) `internal/config/echo_mine_test.go:227/234` `TestSwapArmConfigs` обещает в доке «swaps ONLY the editor model … only the editor differs», а утверждает лишь модель редактора, `few_shot` и `rate_limit` — гейт, который назвал себя сторожем этого свойства и им не является (класс D39.208 п.5). (3) `docs/STACK.md:12` («резерв; флип = один арм-конфиг») буквально ВЕРНА — флип и правда подмена одного файла — и подлежит не правке, а дописке о цене подмены. Дрейф датирован: `b8154cd` (04.09) дал c1 +64 строки банкового контура, а всем трём армам — только `prompt_version`. ⚠ **Риск ЛАТЕНТНЫЙ, а не текущий:** деплой прибит к боевому (`platform/deploy/README.md:216`), кодового пути выбора арма нет, армы читают только тесты, платные прогоны идут по книго-локальным конфигам вне git. Цена наступает при ФЛИПЕ деплоя на арм, и она денежная: платформа берёт за банк плоские $2.00 по c1 (`platform/internal/ingest/manifest.go`), а движок без `contrast_path` возвращается до построения кандидатов (строка **251**) ⇒ пользователю выставят $2 за банк, которого никто не майнил. ⚠ **Наследования конфигов НЕТ — испр. 07.09:** research/33 §7.13 и первая редакция этой строки называли его ратифицированным `D39.23` п.(г); в теле ноты (г) — слой пар-КАЛИБРОВОК (`configs/pairs/<пара>`, fertility/len_ratio_bounds, промпт-резолв конвенцией), а в `internal/config/pipeline.go` `extends|inherit|base_config` — 2 хита, оба про ручку, которая «deliberately NOT inherited». Лечение — не «подтянуть наследованием», а пере-снять три арма копией c1 со сменённым редактором и заставить `TestSwapArmConfigs` утверждать «арм == c1 вне блока редактора». ⚠ **Названная цена пере-снятия (07.09):** пере-снятый арм получает банковый контур и банкнотный `prompt_override` черновика ⇒ снапшот ПРОГОНА ПО АРМУ становится другим, и удерживаемый для сравнения арм-прогон не резюмится, а пере-покупается. Оплаченных книг это не касается — деплой прибит к боевому (`platform/deploy/README.md:216`), кодового пути выбора арма нет | доки + бэкенд | скоро (до любого флипа деплоя на арм) | пере-снятые армы + гейт равенства + дописка в STACK | research/33 §7.13, строка 251 | +| 348 | ⛔ **ШАПКИ АРМ-КОНФИГОВ ОБЪЯВЛЯЮТ «ЕДИНСТВЕННОЕ ИЗМЕНЕНИЕ», А АРМ РАСХОДИТСЯ С БОЕВЫМ НА ДВА ДЕСЯТКА КЛЮЧЕЙ — включая снятый банк терминов; лжёт и сам гейт.** Замер 07.09, две независимые методики: голый дифф не-комментарных строк против `configs/pipeline-c1.yaml` — glm **26** / mistral **28** / deepseek-pro **23**; тот же дифф со снятыми пустыми и хвостовыми комментариями — **18/18/15** (КОНТРОЛЬ обеих: c1 против себя = 0). Популяции разные, вывод один: во всех трёх армах `banknote:` 0, `terminology:` 0, `contrast_path` 0, `classify_types` 0, `target_script` 0, `prompt_override` 0 — при ровно ОДНОМ YAML-ключе каждого имени в c1 (⚠ испр. 07.09: прежние «1/1/3/1/1/3» — подстрочный счёт, для этого вопроса негодный). ⚠ **Носителей лжи ТРИ, и они разной силы.** (1) Шапки армов («копия боевого C1 с ЕДИНСТВЕННЫМ изменением») — ложны буквально. (2) `internal/config/echo_mine_test.go:227/234` `TestSwapArmConfigs` обещает в доке «swaps ONLY the editor model … only the editor differs», а утверждает лишь модель редактора, `few_shot` и `rate_limit` — гейт, который назвал себя сторожем этого свойства и им не является (класс D39.208 п.5). (3) `docs/STACK.md:12` («резерв; флип = один арм-конфиг») буквально ВЕРНА — флип и правда подмена одного файла — и подлежит не правке, а дописке о цене подмены. Дрейф датирован: `b8154cd` (04.09) дал c1 +64 строки банкового контура, а всем трём армам — только `prompt_version`. ⚠ **Риск ЛАТЕНТНЫЙ, а не текущий:** деплой прибит к боевому (`platform/deploy/README.md:216`), кодового пути выбора арма нет, армы читают только тесты, платные прогоны идут по книго-локальным конфигам вне git. ⛔ **МЕХАНИЗМ ЦЕНЫ ЗДЕСЬ БЫЛ НАЗВАН НЕВЕРНО — снято 07.09 оркестратором по коду обеих зон, и правда ОБРАТНАЯ.** Снятая формулировка: «платформа берёт за банк плоские $2.00 ⇒ пользователю выставят $2 за банк, которого никто не майнил». Ложна дважды. (1) `book_once_usd` платформа не вычисляет, а ЧИТАЕТ из манифеста движка (`platform/internal/ingest/manifest.go:104`), производит его `bookOnceUSD()` (`backend/internal/pipeline/priceprojection.go`), и он возвращает **0**, когда терминология выключена или `contrast_path` пуст — ровно состояние до-пакового арма (замер: во всех трёх армах оба ключа отсутствовали) ⇒ поле было НОЛЬ, а не $2. (2) Платформа этот плоский $2 в холд НЕ складывает намеренно, и её же комментарий (`manifest.go:99-103`) объясняет почему: «folding a flat two dollars into the hold would make a five-chapter book unbuyable again». ⇒ **настоящий симптом противоположный и злее:** арм ехал БЕЗ банкового контура, `book_once_usd` книги молча падал в ноль, и контур не был ни настроен, ни оплачен, ни назван; идущий чинить по прежней букве искал бы лишнее списание, которого нет. ⚠ Класс моей ошибки: я прочёл комментарий, назвавший плоские $2, и процитировал ПЕРВУЮ половину предложения, которое написано ровно затем, чтобы запретить мой вывод. ⚠ **Наследования конфигов НЕТ — испр. 07.09:** research/33 §7.13 и первая редакция этой строки называли его ратифицированным `D39.23` п.(г); в теле ноты (г) — слой пар-КАЛИБРОВОК (`configs/pairs/<пара>`, fertility/len_ratio_bounds, промпт-резолв конвенцией), а в `internal/config/pipeline.go` `extends|inherit|base_config` — 2 хита, оба про ручку, которая «deliberately NOT inherited». Лечение — не «подтянуть наследованием», а пере-снять три арма копией c1 со сменённым редактором и заставить `TestSwapArmConfigs` утверждать «арм == c1 вне блока редактора». ⚠ **Названная цена пере-снятия (07.09):** пере-снятый арм получает банковый контур и банкнотный `prompt_override` черновика ⇒ снапшот ПРОГОНА ПО АРМУ становится другим, и удерживаемый для сравнения арм-прогон не резюмится, а пере-покупается. Оплаченных книг это не касается — деплой прибит к боевому (`platform/deploy/README.md:216`), кодового пути выбора арма нет | доки + бэкенд | скоро (до любого флипа деплоя на арм) | пере-снятые армы + гейт равенства + дописка в STACK | research/33 §7.13, строка 251 | | 349 | **ОСТАТКИ ОПРОВЕРГАТЕЛЕЙ research/33 — мелочи одной строкой, носителей не было.** (а) `pipeline/snapshotdiff.go:157-159` при движении одного `memory_version` дописывает оператору причину, которой НЕ проверял («the auto-bank grew between purchases»). (б) `pipeline/snapshot.go:206-218` — протухшие клаузы про «последовательный драйвер», драйвер один (`bookrun.go:242`). (в) `backend/README.md` называет `export.go`/`quality.go`/`status.go` read-only проекциями, а `status.go:1174` внутри `Runner.Redrive` (`:1047`) зовёт `Store.ResetChunkStages` (`store/chunkstatus.go:161`) — единственный деструктивный путь движка (сверено оркестратором 07.09); вторая половина находки — «`status_test.go:376` обещает замок, который в одиночку не держит» — со слов агента research/33, не пере-проверена. (г) `tracedCtx()` во флаг-фикстуре. ⚠ Заявленный мутационный пробел по `CacheWritePerM` СУЖЕН: ненулевая фикстура уже есть на уровне юнита (`ledger/pricing_test.go:20` `CacheWritePerM: 2.5`), пробел — если он есть — уровня пайплайна, где 25 YAML-фикстур `internal/pipeline/*_test.go` пишут явный 0, а ненулевых там 0 (счёт 07.09). Всё снапшот-нейтрально, берётся попутно | бэкенд | когда-нибудь (попутно с касанием этих файлов) | правки на месте | research/33 §7.7/7.11/7.12/7.14/7.17 | | 350 | **РЕФАКТОРИНГ ОБЛЕГЧЕНИЯ ВЕДЕНИЯ (санкция владельца 07.09) — снапшот-нейтрально, и заказ здесь «решить», а не «удалить».** Вызовов вне определения ноль у шести функций (греп 07.09; КОНТРОЛЬ — `SplitChunks` 34 живых вызова): `obs.SafeGo`, `text.TokenizeCyrillic`, `CheapGateResult.UnitScaleHard`/`UnitScaleSoft`, `Bank.Voices()`, `Bank.Pairs()`. ⚠ **Четыре из шести стоят НАМЕРЕННО, и слепое удаление снимет намеренное:** `UnitScaleHard/Soft` сами называют, кого ждут — `checks/cheapgates.go:155-156` «for the report and a future hard gate», то есть строку **12**; `TokenizeCyrillic` — образец паттерна value-default, на который ссылаются `checks/sanitizer.go:21` и `:197`; `SafeGo` — намеренный контраст к `obs/panic.go`, названный решением `pipeline/waverun.go:405` («NOT obs.SafeGo»), и его удаление повесит два комментария в воздухе — класс строки **299**; `Voices`/`Pairs` (`membank/memory.go:371-376` «frozen for the job») ждут потребителя, которого держит строка **13б**. ⇒ по каждой ОДИН исход с объявлением в отчёте: удалить ЛИБО назвать причину жизни в комментарии. Плюс ИМЯ последней стадии дважды одинаковым инлайном — `r.Pipeline.Stages[n-1].Name` в `pipeline/export.go:283` и `quality.go:342` (адреса на `d6dfc49`). ⚠ **Испр. 07.09: и research/33 §7.1, и первая редакция этой строки называли здесь «готовый `finalStageWave()`» — это ДРУГАЯ функция**: она возвращает ВОЛНУ (`snapshot.go:247`, вызовов 13 — 10 прод и 3 теста), а хелпера для ИМЕНИ не существовало вовсе, и «при готовом хелпере» читалось как «работа уже сделана» и словарь родов в четырёх носителях (`membank/memory.go`, `membank/memseed.go`, `terminology/classify.go:50`, промт), где текст собственной ошибки врёт о принимаемом множестве. ⛔ Границы санкции: НЕ дробить `internal/pipeline` и НЕ переписывать `Runner` (`12-go-style-notes.md` §1, D39.23), ничего, что двигает снапшот / хеш запроса / ключ манифеста. ⚠ Адреса сняты research/33 на `e69902a`, а лендинг 07.09 тронул `memseed.go` и `export.go` — пере-снимать командой, не по тексту | бэкенд | когда-нибудь | попутный проход с батареей + объявление исхода по каждой функции | research/33 §7.1, санкция владельца 07.09 |