From 3970fa56ac2d2b5fd87602ed926cce36d95ec1cc Mon Sep 17 00:00:00 2001 From: heaven Date: Thu, 17 Sep 2026 02:07:21 +0300 Subject: [PATCH] Raise a row for the contract tombstones the audit found and recount the platform register literals the zone is moving --- docs/BACKLOG.md | 3 +- docs/PROGRESS.md | 114 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 115 insertions(+), 2 deletions(-) diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 0490442e..3f763223 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -3,7 +3,7 @@ > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. -> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **358** строк · зона бэкенд **189** строго / **242** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **188** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). +> - **СЧЁТ ОЧЕРЕДИ на 16.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **359** строк · зона бэкенд **189** строго / **242** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **188** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) @@ -394,3 +394,4 @@ | 477 | **ЗАМЕР M2 — ПОПУЛЯЦИЯ КНИГ С ДВОЙНИКОМ КЛЮЧА НЕ ИЗМЕРЕНА, А НА НЕЙ СТОИТ ДОВОД «ПАК 1 БЕСПЛАТЕН ПО СНАПШОТАМ».** Прибор ряда 330 (`backend/internal/membank/memseed.go:714`=`func UnverifiedKeyConflicts`) ключуется на `entryFiringKeys`, поэтому пере-определённый вопрос M2 он вернёт тем же НУЛЁМ ПО ПОСТРОЕНИЮ — то есть «ноль» будет ответом прибора на свой вопрос, а не о предмете. Чтобы вопрос был задан, нужны три правки `membank`: снять пропуск пары подписанных (`backend/internal/membank/memseed.go:733`=`ApprovedSharedKeyCollisions`), снять пропуск одинаковой передачи (`backend/internal/membank/memseed.go:735`=`ei.Dst == ej.Dst`) и экспортировать порог ключа (`backend/internal/membank/memory.go:78`=`func minKeyLenFor`). ⚠ Значит это правка ДВИЖКА, а не $0-ресёрч, как значилось прежде. ⛔ Цена молчания: пока популяция не измерена, довод консилиума о бесплатности пака 1 по снапшотам остаётся недоказанным. Ряд 330 — ДРУГОЙ предмет (решение владельца по противоречию, цена там уже замерена на 142 книгах) | бэкенд | скоро | популяция книг с двойником ключа измерена прибором, который этот вопрос действительно задаёт | консилиум `D39.253` §3 строка 0-M2, ответ автора 16.09 | | 478 | **ОРДИНАЛ БАТЧА ВХОДИТ В КЛЮЧ ПОКУПКИ ⇒ СНЯТИЕ ОДНОЙ РЕШЁННОЙ СТРОКИ ПЕРЕ-ПОКУПАЕТ ВСЕ ПОСЛЕДУЮЩИЕ БАТЧИ.** Ключ берёт номер куска (`backend/internal/pipeline/render.go:366`=`strconv.Itoa(req.ChunkIdx)`), а терминолог нумерует батчи порядком (`backend/internal/pipeline/terminologist.go:1003`=`Chapter: 0, ChunkIdx: i`). ⇒ когда фильтр решённого убирает кандидата из раннего батча, ординалы ВСЕХ следующих сдвигаются, хеши меняются, чекпойнт не находится — и они покупаются заново, ДАЖЕ когда их сообщения не изменились ни на байт. Замерено советчиком на купленном сырье B (батчи покупки 1 с номерами 1 и 2 стали в покупке 2 номерами 0 и 1), оба адреса пере-сняты оркестратором. ⛔ Бьёт прямо по экономике `D39.256`: чем лучше работает «решённое остаётся решённым», тем больше сдвиг ординалов и тем дороже он обходится. Комментарий у фильтра называет только смену СОСТАВА батча и про ординал молчит. ⛔ **ПОСЫЛКА ОПРОВЕРГНУТА ЗАМЕРОМ ЗОНЫ 17.09 — ряд остаётся ЛАТЕНТНЫМ.** Пере-мерено на НАСТОЯЩЕМ батчере, а не выведено: снятие одного решённого кандидата даёт **0 сдвигов из 246 снятий**, снятие блока при боевом размере батча — **0** и на 66, и на 300 кандидатах. ⭐ Ноль не слепота прибора: положительный контроль (убрать батч целиком) даёт **18 из 19**. Причина — боевые конфиги размер батча не задают, работает умолчание, и снятие строки перекладывает кандидатов ВНУТРИ батча, не меняя их числа. ⇒ ключ покупки не трогать, пере-чеканка не нужна. ⚠ Условие, при котором вывод перестаёт держаться (назвала зона): МЕЛКИЙ размер батча оживляет класс — при 400 рунах замер даёт 475 сдвигов. ⚠ Моя ошибка названа прямо: я пере-снял два адреса и НЕ проверил саму посылку на боевом батчере, вывод советчика поехал в трекер непроверенным | бэкенд | когда-нибудь (гейт: мелкий batch_runes) | посылка пере-мерена на боевом размере батча либо класс закрыт как латентный | `D39.257` п.7, замер сессии 17.09 | | 479 | **ВАРИАНТЫ ЧЕРНОВИКОВ УХОДЯТ НАРУЖУ СКЛЕЕННЫМ ЯРЛЫКОМ, И КЛИЕНТ НЕ МОЖЕТ ПОКАЗАТЬ ИХ НА ЯЗЫКЕ ЧИТАТЕЛЯ.** В проекции банка вариант едет одной строкой вида «передача ×N», а при алиасе — с англоязычным хвостом про то, для какой поверхности он предложен: части (сама передача · число чанков · алиас) НЕ опубликованы отдельными полями. ⇒ платформа вынуждена везти это как непрозрачный текст, а разобрать ярлык у себя не вправе — движок держит парсер рядом с писателем именно потому, что второй, пере-выведенный, «продолжит работать до дня, когда у ярлыка появится поле, и тогда вернёт числа вместо ошибки». ⚠ Пара-специфики в форме нет, но **английский фрагмент в данных ломает общность по языку интерфейса**: ревью-вопрос «заработает ли пара, которой в репозитории ещё нет, без правки Go» здесь отвечается «нет на уровне ПОКАЗА». Лечение движковое: публиковать части ярлыка полями. Найдено платформенной сессией 17.09 на купленном сырье при исполнении п.4 аддендума владельца | бэкенд | когда-нибудь | части ярлыка опубликованы полями либо решено, что показ вариантов читателю не нужен | зона платформы 17.09, `D39.258` п.9 | +| 480 | **В КОНТРАКТЕ ЖИВУТ НАДГРОБИЯ: 121 СТРОКА, КОТОРУЮ НЕ ОТДАЁТ НИКТО — и у одного куска нет носителя решения ВООБЩЕ.** Аудит 17.09 (сплошное чтение спеки и компаньона): мусора 3.5 % при 3497 строках, и это не забытый хлам — у каждого куска свой баннер «ретировано», то есть история, которой не хватило последнего шага. Состав: схема потолка в главах (46 строк, НОЛЬ ссылок во всём документе — единственный орфан из 68 схем, ретирована ордер-формой `0.11.0`, держится только генерённым кодом ЗАМОРОЖЕННОГО фронта) · локализованное сообщение и его поле в конверте ошибки (23 строки; ⛔ **пере-снято мной 17.09: ноль упоминаний в не-тестовом коде платформы** — и, по аудиту, ноль хитов по журналу решений и обоим бэклогам, то есть ЕДИНСТВЕННЫЙ кусок контракта без носителя решения) · поле потолка в заявке прогона (16 строк, ⚠ УДАЛЯТЬ НЕЛЬЗЯ: единственное `deprecated` в файле, оно РАБОТАЕТ отказом на входе, чтобы старый клиент не купил молча не то). ⚠ Снимать разумно ТЕМ ЖЕ актом, что синк зеркала фронта, иначе фронт при разморозке сгенерит их заново. ⚠ Локализованное сообщение либо обосновать нотой, либо снять: сегодня его не защищает ничто | платформа + оркестратор | когда-нибудь (вместе с синком зеркала при разморозке фронта) | мёртвые схемы сняты либо у каждой назван носитель решения | аудит контракта 17.09 | diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 79aab5ed..d0e95fb3 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-16, голова D39.258 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **98** живых дока в `docs/` (пере-счёт 17.09 после выноса каталога консилиума; прежние 97 разошлись с фактом 144 и это заметил ревизор, а не гейт) (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, **12** в `backend/docs`, **7** в `frontend/docs` (испр. 17.09: стояло 9) — ⚠ ⚠ испр. 11.09: из 97 ВРЕМЕННЫХ **три** (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 108 (major 1) (major 1), всего рядов 466 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-16, голова D39.258 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **98** живых дока в `docs/` (пере-счёт 17.09 после выноса каталога консилиума; прежние 97 разошлись с фактом 144 и это заметил ревизор, а не гейт) (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, **12** в `backend/docs`, **7** в `frontend/docs` (испр. 17.09: стояло 9) — ⚠ ⚠ испр. 11.09: из 97 ВРЕМЕННЫХ **три** (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 110 (major 1) (major 1), всего рядов 468 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔ **ПЯТЬ ПОТОКОВ РАБОТЫ — состояние на 07.09 (пере-снято лендингами смены №23).** > **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143): > ⚠ **ЕДИНСТВЕННЫЙ ПОТОК, НЕ СДВИНУВШИЙСЯ ЗА СМЕНУ — сессия по промту так и не стартовала.** Блокирующая линза @@ -205,6 +205,118 @@ ⚠ Ниже точки реза якорей не было ни одного (пере-снято прибором перед выносом), так что больше у вас ничего не сдвинулось. +#### ЗАПИСКА-ПЛАН пака «ЛЕСТНИЦА ПОПЫТКИ ДЛЯ БАНК-РОЛЕЙ» (17.09, сессия `textmachine-main-12`). До первой правки движка. НЕ КОММИЧУ + +**Предмет, пере-снятый по дереву, а не по промту.** Банк-роли зовут `runAttempt` напрямую +(`terminologist.go:861`, попытка 0, фиксированный потолок) и читают из результата ТОЛЬКО текст +(`terminologist.go:1055`). Вердикт `att.cls`, который `classifyOutput` уже посчитал внутри `runAttempt`, +не читает ни одна ветка. Лестницы нет: один вызов, один потолок, тишина. + +**Почему лекарство именно «больше потолок».** По прогону B (`docs/experiments/25-door-to-file-b.md` §7): +`batch=0 asked=22 answered=4` (`length`) и `batch=2 asked=24 answered=0` (`empty`), оба оплачены. Причина +названа там же и в `configs/models.yaml`: у DeepSeek размышление считается ВНУТРИ `completion_tokens`, и у +всех семи выброшенных вызовов оно съело ПОЛНЫЙ потолок (8496/8496 ×3, 8000/8000, …). Хоп на другую модель +такого не лечит; лечит удвоение бюджета — на черновой стадии того же прогона оно вылечило 5 из 5. Там же +ратифицирована экономика: **перебор бюджета бесплатен (резервация транзитна, списание по факту), недобор +стоит ЦЕЛОЙ генерации.** Бюджет фазы при этом не был ограничителем: лимит $1.00, потрачено $0.029749. + +##### Разрез + +Цикл попытки из `runStage` (`stagerun.go:197–268`) переезжает в отдельную функцию с ДВУМЯ вызывающими. +`runStage` = резюм по `chunk_status` + лестница + эскалация + диспозиция; банк-роль = лестница + разбор +таблицы. `runStage` из терминолога НЕ зовётся: у банк-батча нет ни чанка, ни строки статуса, ни шаблона. + +**Три параметра, и все три несущие:** + +| параметр | у стадии | у банк-роли | +|---|---|---| +| ключ ступени | число УДВОЕНИЙ (`maxTokensForAttempt(base, escalations)`) | то же самое, один перечислитель | +| допуск ступени | счётчик регенераций (`regenerate_before_escalate`); книжный потолок живёт в резервации | счётчик + **ролевой суб-бюджет**, иначе §4.2 | +| судья ступени | `classifyOutput` внутри попытки | он же ПЛЮС вердикт после разбора таблицы | + +⛔ **Ступень ключуется числом удвоений, а НЕ номером попытки.** `attempt` считает КЛЮЧИ и перешагивает +сожжённые (walk по `burnedByCut`), `escalations` считает деньги; в `RequestHash` они входят РАЗНЫМИ полями +(`Attempt` и `MaxTokens`). Подмена одного другим — смена ключа покупки. + +##### Прибор построен ПЕРВЫМ, до выноса + +`backend/internal/pipeline/bankkeygolden_test.go` — голден ЗНАЧЕНИЯ хеша банк-батча. Привязан к ФИКСТУРЕ +(книга, снапшот, модель, усилие, сообщения, пол `min_max_tokens` заданы самим тестом), а не к боевому +конфигу: голден на боевом краснел бы от пере-пина цены или правки промта, то есть от вещей, к ключу +отношения не имеющих, и его начали бы обновлять не глядя. Два слоя: чистая деривация через продакшн-шов и +**исполнение** — реальный проход `runBankRoleBatches` покупает, и хеш читается из хранилища. + +⛔ **Первая редакция голдена была ложно-зелёной, и это найдено посадкой, а не глазом.** Сообщения были +короткими, потолок упирался в `MinMaxTokens=512`, и вся арифметическая ветвь формулы `est/2 + floor` в ключ +не входила: сдвиг `terminologyReplyFloor` 256→257 оставлял файл ЗЕЛЁНЫМ. Чинится тем, что батч 0 сидит В +полу, а батч 1 его перерастает, и **посылка утверждается внутри теста** — иначе фикстура тихо съедет обратно +в один режим. Посадки после починки: `attempt 0→1` RED · ординал `i→i+1` RED · пол 256→257 RED · +формула `est/2→est/3` RED · роль выпала из `bankStage` RED · температура в `InternalCall` RED (по посылке). +Копия для посадок — `/home/ubuntu/tm-bankladder-mut`, вне скретчпада; после каждой цели проверено, что ЦЕЛЬ +на месте, и `diff -rq` против живого дерева даёт 0 расхождений. + +##### Эскалация банк-ролей (§4.3) — НЕ строю, и вот что защищает нулевой хоп + +Прочитал `internal_call.go` и `escalation.go`. Комментарий защищает не одну вещь, а пять, и они разного рода: + +1. **Чужой пул.** `escalationBudgetRemains` читает `Pipeline.Escal.BudgetUSD` и `EscalationSpentUSD(книга)` — + пул КНИГО-ШИРОКИЙ и принадлежит волне. Банк-хоп ел бы его молча. +2. **Способ деградации.** «these calls degrade by leaving their work unchanged rather than by paying a second + model»: неотвеченный терм остаётся `auto` и ничего не портит, в отличие от чанка, который отгрузил бы брак. +3. **Предварительная сборка клиентов.** `gateModels()` кладёт в достижимые модели только модели ВКЛЮЧЁННЫХ + гейтов; модель хопа туда не попадает — и `buildClients`/`CheckKeys` пропустят её, а прогон умрёт на + банк-стопе «no pre-built client» ПОСЛЕ оплаченной волны. Это уже случалось (комментарий `gateModels`). +4. **Аддитивный буфер.** `InternalCall` держит `ReasoningMaxTokens: 0`, и это безопасно лишь потому, что + загрузчик ОТКАЗЫВАЕТ аддитивному провайдеру для моделей гейтов. Модель хопа потребовала бы того же отказа. +5. **Имя отказа в стоп-марке.** `ceilingStopDetail` (`cutcall.go`) утверждает, что отказ потолка называет + РЕ-АТАКУ, и это верно, пока каждый прочий платный шаг ловит `errReserveCeiling` и деградирует. + +⇒ **Хоп не строю, и довод не «дорого», а «не то лекарство»:** измеренная болезнь — размышление, съевшее +потолок; другая модель потолка не лечит. Лестница (мой предмет) лечит ровно её. Класс, для которого хоп +осмыслен, — `refusal` (тот же вызов на той же модели пере-откажет, D2.2) — на банк-ролях имеет замеренную +популяцию ноль. Если владелец захочет хоп, пять пунктов выше — его спецификация, и они уходят в отчёт. + +##### Тождество банк-батча (§4.4) — развилку НЕ беру, потому что ПОСЫЛКА РЯДА 478 НЕ ПОДТВЕРЖДАЕТСЯ + +Ряд 478 утверждает: «снимет фильтр одну решённую строку — номера всех последующих батчей сдвигаются, и они +покупаются заново при неизменном тексте». Пере-мерил на настоящем `terminology.Batch`. + +**Механика.** Упаковка жадная. Снятие кандидата из батча k либо ПОДТЯГИВАЕТ содержимое из k+1 (тогда у всех +последующих меняется ТЕКСТ, и ординал ни при чём), либо не подтягивает (тогда у них не меняется ничего — +ни текст, ни номер). Сдвиг номера при неизменном тексте требует, чтобы батч исчез ЦЕЛИКОМ из середины. + +**Числа.** Снятие ОДНОГО кандидата, 246 снятий в четырёх режимах: сдвинутых-с-тем-же-текстом **0** +(при живых `content-changed` 239…630 — прибор различает классы). Снятие БЛОКА (как и работает +`dropBankSettled` — он снимает множество), по 200 случайных блоков на режим: + +| режим | батчей | сдвинуто с тем же текстом | +|---|---|---| +| `batch_runes=400`, 60 кандидатов | 19 | **475** | +| `batch_runes=6000`, 66 кандидатов (боевой) | 2 | **0** | +| `batch_runes=6000`, 300 кандидатов (боевой) | 6 | **0** | + +Положительный контроль: убрать батч 1 целиком — прибор показывает **18 сдвигов из 19**, то есть ноль выше +не слепота прибора. + +**Боевой режим — это вторая и третья строки:** `batch_runes` не задан ни в одном из трёх боевых конфигов, +значит работает движковый умолчательный 6000; на прогоне B это дало 3 батча на 66 термов (22 · 19 · 24). + +⇒ **Ключ не трогаю.** Не потому, что дорого, а потому, что механизм ряда 478 в боевом режиме имеет +популяцию ноль, а обе ветви стоят одноразовой пере-чеканки ВСЕХ банк-чекпойнтов. ⚠ **Условие, при котором +вывод перестаёт держаться, называю сразу:** мелкий `batch_runes` (сотни рун) делает класс живым — 475 на +200 снятий. Ряд 478 остаётся открытым с этим замером и этим условием; доминирующий драйвер пере-покупки — +пере-упаковка СОДЕРЖИМОГО — ни одной из двух ветвей не лечится и назван ограничением в самом +`dropBankSettled` («a checkpoint identity that survives a change of batch composition … belongs in its own +decision»). + +##### Что ещё в заказе + +- **§4.2** — допуск и проба обязаны говорить об одних ступенях: сегодня проба `bankCheckpointExists` + спрашивает только попытку 0 (`terminologist.go:840`), а суб-бюджет считается только по неоплаченным + батчам. Ступени лестницы уйдут мимо бюджета фазы — это чиню вместе с лестницей. +- **§4.5** — доля ответов: поднимаю СУЩЕСТВУЮЩИЙ построчный счётчик до итога и развожу его с числом + батчей, выброшенных бюджетом; третьего счётчика не завожу. + #### ОТЧЁТ пака «БАНК — ЧТО МОЖНО УЗНАТЬ И ПОЧИНИТЬ ЗА $0» (16.09, сессия `textmachine-main-11`). НЕ КОММИЧУ — дерево передаю оркестратору №23 **Деньги пака: $0.** Платных вызовов моделей не было ни одного. Все числа сняты по уже купленному сырью прогонов A и B, открытому только на чтение и только с КОПИЙ в скретчпаде.