Add the zero-cost bank pack prompt, claim the backend slot for it, and record the false-zero class a wrapper around a shell builtin produces

This commit is contained in:
heaven 2026-09-16 18:27:02 +03:00
parent 70fd56e60e
commit e89280a66e
4 changed files with 297 additions and 1 deletions

View file

@ -0,0 +1,278 @@
# Пак бэкенда: «БАНК — ЧТО МОЖНО УЗНАТЬ И ПОЧИНИТЬ ЗА $0»
> Оркестратор №23. Пак **$0**: ни одного платного вызова моделей. Всё, что ниже, либо детерминированный код,
> либо замер по УЖЕ КУПЛЕННОМУ сырью. Если тебе покажется, что предмет требует покупки — это вопрос
> оркестратору (§11), а не повод купить.
## 1. Какая проблема и что решит твой результат
Банк памяти — таблица `(src, sense, since_ch, until_ch) → dst, gender, status`, которую движок инжектит
переводчику и редактору, чтобы имена и термины были одинаковы на всю книгу. Владелец назвал это место
**самым умным участком движка**: «там скорее консилиум алгоритмов должен работать, который выведет, что
инжектить редактору».
Этот пак — НЕ тот консилиум. Это его **фундамент**: четыре вещи, которые сегодня либо молчат, либо не
измерены, и каждая из них делает будущий «умный участок» либо невозможным, либо недоказуемым.
**Почему именно $0-слой первым, и это не осторожность, а порядок работ.** Умная маршрутизация кандидатов
(кого спрашивать, с каким контекстом, когда считать решённым) стоит на двух вещах, которых сегодня нет:
на предикате «спорный» с ИЗМЕРЕННОЙ популяцией и на честном разборе ответа роли. Построить маршрутизатор
раньше — значит маршрутизировать по признаку, чьё распределение никто не видел.
## 2. Зона и git
Твоя зона записи — `backend/`. Ты **не коммитишь**: готовишь дерево и передаёшь на лендинг оркестратору.
Чужие незакоммиченные файлы не трогай. Свои итоги пиши в `docs/PROGRESS.md`, секция «Бэкенд» — это
единственное исключение из «`docs/` — зона оркестратора».
Читать чужое можно и нужно. Расхождение, которое ты нашёл вне своей зоны, — пинг в отчёт, а не правка.
## 3. Карта чтения — ЗАКОН, дальше только по её ссылкам
1. **Этот файл целиком.**
2. `docs/research/35-bank-memory-consilium.md` — итог консилиума. Читай §П3 «Исходы решения», §2.0 «что
двигает каждый шаг» и **обязательно пометку в КОНЦЕ файла** (16.09): §П3 верен про ноту и неверен про
дерево, и это прямо касается §4.2 ниже.
3. `docs/BACKLOG.md` — ряды **441**, **445**, **449**, **459** (заказаны) и ряды **435**, **438** (НЕ
заказаны, но прочти: там названы две денежные мины следующего пака, и твой код не должен их углубить).
4. `docs/architecture/05-decisions-log.md` — тела `## D39.102` (греп) и `## D39.254`. Первое закрывает
МОДЕЛЬНЫЙ совет замером, второе несёт пять решений владельца 16.09.
5. Предмет в коде: `backend/internal/pipeline/terminologist.go` и `backend/internal/pipeline/mining.go`.
⛔ Журнал решений целиком НЕ читать. Номер грепается: тело — строка `^## D<номер>`; подномер (`D39.2`)
собственного тела не имеет, отбрось хвост.
## 4. Состав и разметка свободы
### 4.1 Цель без текстов инъекции обязана останавливать прогон ГРОМКО — **делай РОВНО так**
**Посылка сформулирована ТОЧНО, потому что первая редакция этого промта была тут НЕВЕРНА.** Сегодня книга с
не-русской целью до молчания НЕ доходит: загрузчик падает раньше и громко, потому что промтов пары нет —
`backend/internal/config/pipeline.go:870`=`A missing convention prompt` («a book whose pair has no prompt pack must
stop, never silently run another pair's conventions»), а в `backend/prompts/` лежит только `zh-ru`. **Молчаливый
путь достижим для БУДУЩЕЙ пары**, у которой промты и langpack уже есть, а строк инъекции ещё нет: тогда прогон
покупается, а оба банк-блока рендерятся в **ноль байт** молча. Гейт стоит в рендерерах: `backend/internal/membank/memory.go:745`=`func RenderGlossaryBlock`
и `backend/internal/membank/memory.go:841`=`func RenderEditorConstraintBlock`, оба начинаются с
`if !tx.HasData() { return "" }`, где `HasData` — это всего лишь наличие заголовка
(`backend/internal/lang/embedded.go:406`=`func (t InjectionTexts) HasData() bool`). А источник молчания —
строкой выше по потоку: `backend/internal/lang/embedded.go:425`=`return InjectionTexts{}` возвращает
нулевое значение **без ошибки**.
**Где ставить отказ:** в `openRunner`, рядом с уже существующим отказом того же рода —
`backend/internal/pipeline/runner.go:356`=`forWrite && r.Pipeline.Gates.Terminology.Enabled && r.pack == nil`.
Там в руках и книга, и пайплайн, и флаги гейтов, и это **до открытия волн и до первого платного вызова**.
Форма — `RefusalBadConfig`, как у соседа, а не WARN: граница между ними названа в комментарии рядом
(`backend/internal/pipeline/runner.go:361-371`=`THE BANKNOTE CHANNEL BUYS OUTPUT NOBODY WILL READ`) — «механизм не может работать вовсе» против «стоит лишних денег».
**Не ставь это в `runTerminologist`.** Первый платный вызов книги — ЧЕРНОВАЯ волна, а банк-роли платятся
позже, на стопе майнинга. Гейт у роли опоздает на целую волну, каждый вызов которой уже нёс банкнотный
промт. Довод дословно тот же, что у соседнего `CheckMiningContrast`: «costs nothing to verify now and a
whole draft wave to discover later».
**Условие отказа ШИРЕ, чем «включён гейт», и это второй денежный путь, а не придирка.** Инъекция строится при
`r.baseMemory != nil` (`backend/internal/pipeline/waverun.go:592`=`if r.baseMemory != nil`), то есть **мимо гейтов**:
книга с сидом (`backend/internal/config/book.go:92`=`GlossarySeed string`) и ВЫКЛЮЧЕННОЙ терминологией даёт тот же
молчаливый ноль. Условие бери такое: `forWrite && (Gates.Terminology.Enabled || Gates.Banknote.Enabled ||
book.GlossarySeed != "") && !lang.InjectionTextsFor(book.TargetLang).HasData()`.
**Текст отказа обязан сказать, ЧТО делать:** строки живут в go:embed-файле `backend/internal/lang/data/injection.txt`,
и добавление цели двигает `lang.EmbeddedVersion()` ⇒ снапшот. Отказ, который этого не называет, отправляет будущую
пару в молчаливую пересборку Go.
**Пин обязателен**, и он должен краснеть на ДАННЫХ, а не на отказе соседа: фикстура обязана ПРОЙТИ загрузчик и
соседний отказ `:356` (синтетическая пара: промты + каталог langpack) и сверять СВОЙ текст и класс отказа. Иначе
пин удовлетворяется чужой уликой и зелен ни о чём.
### 4.2 Отказ роли не должен становиться передачей — **делай РОВНО так по форме, границу реши сам и обоснуй**
Ряд 445: роль отвечает прозой («не термин») или мусором («90»), и это сегодня едет редактору **законом**,
побайтно так же, как подписанное человеком решение.
**Сначала прочти ряд 459 и пометку в конце `research/35`** — там развилка, которую ты обязан закрыть
явно, а не по умолчанию. В боевом промте zh-ru отказ **приглашается**:
`backend/prompts/zh-ru/terminologist.md:36`=`не можешь выбрать перевод уверенно` велит вернуть сентинел и
называет это нормальным исходом; парсер его ждёт
(`backend/internal/terminology/terminology.go:694`=`const NoDst = "⟦TM-NO-DST⟧"`,
`backend/internal/terminology/terminology.go:1183`=`func isNoDst`), счёт печатается прогоном
(`backend/internal/pipeline/terminologist.go:621`=`"declined", res.Declined`). При этом ратифицированная
нота `D39.102` числит отказ-сигнал закрытым.
**Выбора у тебя здесь НЕТ — исполним только путь (а), и это исправление первой редакции промта.** Снятие
сентинела есть отмена ратифицированного режима, а не настройка: «A declined term emits status:auto (inert) instead
of a guess — §C2-7's other mode» (`backend/internal/terminology/terminology.go:693`=`A declined term emits status:auto`), а ИСТОЧНИК — нота: `D39.42` п.1 ратифицирует дословно
«двухрежимная эмиссия §C2-7 (есть dst → `draft`, нет → `auto`)», и нота сильнее комментария в коде. Считаешь, что сентинел надо снять, — это **вопрос оркестратору на ноту** (§11) с расчётом перекупки,
а не диспозиция сессии.
**Что делаешь: ужесточаешь РАЗБОР ответа, не трогая сентинел.** И раскладываешь по ДВУМ корзинам — сегодня они
разные, и следующий пак маршрутизирует именно по этому различию:
- **отказ** (сентинел, а также отказ прозой) → ветка `isNoDst``Declined`
(`backend/internal/terminology/terminology.go:1115`=`if isNoDst(dst)` кладёт `out[key] = ""`;
`backend/internal/pipeline/terminologist.go:553`=`res.Declined++`);
- **мусор** (`dst` БЕЗ БУКВ ВООБЩЕ — «90», пунктуация) → плохая строка, ключа в ответе нет ⇒
`backend/internal/pipeline/terminologist.go:551`=`res.Unanswered++`.
**Класть отказ в «неотвечено» НЕЛЬЗЯ:** это слово означает, что роль промолчала, и комментарий счётчика прямо
так и говорит. Смешав, ты сломаешь и счётчик, и будущую маршрутизацию (отказ → фоллбек другим семейством; пустота
и обрыв → регенерация).
**Два уточнения критерия, оба проверены деревом:** «`dst` без букв ЦЕЛЕВОГО языка» уже построено (`OffLanguage`) —
не перестраивай его; дыра именно в «без букв вообще». И **не** отвергай `dst` с цифрой: цифры законны внутри имён и
серий, критерий — отсутствие букв, а не наличие цифр.
**Отказные фразы — ЯЗЫКОВЫЕ ДАННЫЕ, а не литералы в Go:** русские строки в коде прямо нарушают цель «движок
один, пара — данные». Реестр фраз живёт в langpack, пустой реестр = инертный no-op.
**Что здесь дешевле, чем кажется, и это проверено:** правка ПАРСЕРА меняет содержимое банка (а с ним
`memory_version` и пере-редактуру под согласием), но **не** трогает тождество запроса — парсер в кортеж
`attemptRequest` не входит. То есть путь (а) не перекупает батчи.
### 4.3 Предикат «спорный» — это ДВА предиката, а не один — **делай РОВНО так**
Будущий фоллбек и рецензент будут звать модель «на спорных кластерах». Слово «спорный» сегодня знаменателя
не имеет. Построй его детерминированно и **измерь популяцию за $0** на уже купленном сырье. Читать ТОЛЬКО на чтение
(`sqlite3.connect('file:<путь>?mode=ro', uri=True)`; CLI `sqlite3` на машине нет). Понадобится звать
`buildBankCandidates`/`bankStopRows` вне платного прогона — это $0-харнесс реплея по БД, и он часть заказа.
⛔ **ДВЕ БАЗЫ ЕСТЬ, НО ОНИ В РАЗНЫХ СОСТОЯНИЯХ, и наивный реплей намеряет артефакт состояния вместо популяции.**
Замерено мной 16.09:
- **B — снимок НА СТОПЕ:** `/home/ubuntu/tm-coldrun-b/evidence/paid-bankstop/project.db``glossary` **0**,
`bank_stop_presented` 67, `request_log` 18, `checkpoints` 24. Рядом сайдкары (`*.bank.json` 66 кандидатов,
`*.bank-stop.txt` 648 строк).
- **A — состояние ПОСЛЕ прогона:** `/home/ubuntu/tm-coldrun-a/stand/books/bk_ROEHZBD46ALFI43E/project.db`
`glossary` **69**, `bank_stop_presented` 70, `request_log` 33. Сайдкары A лежат ОТДЕЛЬНО, в
`/home/ubuntu/tm-coldrun-a/evidence/bankstop-paid/` (69 кандидатов, 660 строк листа), самой БД там нет, а пути в
манифесте указывают на ЧУЖОЙ хост и протухли.
⇒ на A фильтр решённых увидит ЗАПОЛНЕННЫЙ глоссарий и «решит банком» то, что на покупке никто не решал. Либо гони
реплей на A с глоссарием, откатанным к стопу, либо считай pre-call-признаки по сайдкарам — и назови, что выбрал.
**ДРЕЙФ СХЕМЫ САЙДКАРОВ — готовый ложный ноль:** в A поля `conventions` нет **вовсе** (0 записей из 69), в B оно
есть у всех 66. Посчитаешь «conventions ≥ 2» на A наивно — получишь 0 и это будет число об ОТСУТСТВИИ ПОЛЯ, а не о
предмете; пересчитывай из `variants` той же свёрткой. ⚠ И ключи бери по ВСЕМ записям, а не по первой: часть полей
пишется с `omitempty` (`invented` есть в 11 записях из 69 у A и в 17 из 66 у B).
**ЧТО УЖЕ ИЗВЕСТНО ДО ТВОЕГО ЗАМЕРА — чтобы ты не отчитался нулём как свойством предмета.** Мои числа:
A `spread ≥ 2` = 9, `invented` = 11 (из 69); B `spread ≥ 2` = 8, `conventions ≥ 2` = 8, `invented` = 17 (из 66).
**А вот post-call-признаки конфликта на обоих источниках имеют популяцию НОЛЬ:** в листах стопа `CONTRADICTS`,
`THE BANK ALREADY HOLDS` и `NOT ASKED` — по 0 вхождений при непустых файлах (660 и 648 строк — контроль напечатан).
Значит живые post-call-сигналы здесь только два, и предикат, построенный на конфликтах, ты проверить на этом сырье
НЕ сможешь: так и скажи, а не выдавай ноль за измерение.
⛔ **Предикатов ДВА, и у них разные поля и разные места. Если сделаешь один, маршрутизация ДО вызова
останется пустой, а отчёт скажет «предикат есть».**
- **pre-call** (решает, кого и с каким контекстом спрашивать). Доступно до первой траты — там, где живёт
«$0-половина роли»: `backend/internal/pipeline/terminologist.go:262`=`buildBankCandidates is the $0 half of the role`,
она «runs whether or not the gate is on». Поля: разброс вариантов, конвенции, сигналы ранжирования,
и «уже решено банком» — последнее снимается фильтром `backend/internal/pipeline/terminologist.go:371`=`r.dropBankSettled(ctx, cands)`,
который стоит ДО первого платного вызова (`backend/internal/pipeline/terminologist.go:405`=`r.runClassifier(ctx, snapID, paid)`).
⚠ Назови честно ограничение: до классификатора тип кандидата эвристический, поэтому pre-call-предикат
видит «спорный по черновикам», а не «спорный по типу».
- **post-call** (решает, кого отправлять на фоллбек). Поля живут в строках стопа:
`backend/internal/pipeline/mining.go:450`=`func bankStopRows`. ⚠ И там же — ловушка знаменателя: при
выключенном гейте результат роли пуст (`backend/internal/pipeline/mining.go:451-456`=`A stop can fire with the terminology gate OFF` объясняет почему), то есть популяция считается
по-разному в двух режимах, и это надо назвать, а не усреднить.
**Знаменатели ЗАДАНЫ здесь, а не выбираются тобой** — иначе «доля спорных» окажется утверждением о твоём пороге:
- pre-call: знаменатель = кандидаты на входе роли (дошедшие до `buildBankCandidates` после фильтра решённых);
- post-call: знаменатель = строки, на которые роль ОТВЕТИЛА (у неотвеченных признаки не определены вовсе).
**Результат — не одно число, а таблица чувствительности:** доля «спорных» при нескольких порогах, на обоих
источниках, с обоими знаменателями, плюс ответ «сколько строк ушло бы на второй вызов, если бы он существовал».
Одно число при невыбранном пороге замером не является.
### 4.4 Посылка «новой улики не было» обязана получить носитель — **делай РОВНО так**
Экономика будущего базиса решённого стоит на утверждении «у 25 из 26 смен решения новой улики не было».
Тела запросов к банк-ролям **не логировались**, то есть якорь модели не отделён от её стохастики. Это $0:
по уже купленному сырью собери, что РЕАЛЬНО менялось во входе между двумя покупками одной строки.
**Скорее всего честный ответ — «тел нет»:** чекпойнты хранят ОТВЕТ, лог запросов — хеш и токены, тела пишутся
только в лог под отдельным флагом. Тогда результат пака — не число, а **дизайн персистенции**: что именно надо
сохранять (тело запроса банк-роли, снимок канона и кандидатов), чтобы вопрос стал отвечаемым, и чего это стоит.
**Опасное умолчание, назови его сам:** пере-рендерить сообщения роли по ТЕКУЩЕЙ базе и заключить «вход не
менялся» — значит ответить о сегодняшнем состоянии, а не о той покупке. «Не воспроизвелось» без названной цепи
звеньев отчётом не считается.
### 4.5 Чего в паке НЕТ**не делай**, и это объявленные сужения
- **Регенерация банк-роли и фоллбек на другую модель** — следующий пак. ⛔ И вот почему их нельзя взять
«заодно»: у внутренних вызовов хоп нулевой НАМЕРЕННО
(`backend/internal/config/internal_call.go:80`=`no escalation hop`), `maybeEscalate` выходит на пустом
хопе (`backend/internal/pipeline/escalation.go:125`=`st.ResolvedHop == ""`), а все три боевых
`escalate_to` стоят у стадии `draft`. Включение `escalation.budget_usd` банку не поможет и включит
эхо-эскалацию черновика. Плюс проба «уже оплачено» у банк-батча спрашивает попытку 0 с БАЗОВЫМ бюджетом
(`backend/internal/pipeline/terminologist.go:811`=`paidAfterBurns(st, st.Model`) — она обходит сгоревшие индексы,
но только на ТОМ ЖЕ бюджете, — а бюджет попытки входит в тождество запроса, поэтому регенерация с другим
бюджетом пробе невидима.
- **Базис решённого (N-1), род-улика (N-5), стратифицированный KWIC (ряд 449)** — не в этом паке.
- **Модельный совет в любой форме** — закрыт замером `D39.102` п.2 и не переоткрывается.
## 5. Мандат самопроверки ИСПОЛНЕНИЕМ — «перечитал сам» не считается
Промт требует ревью **исполнением**: своего кода, своих замеров и своих чисел. Самоотчёт «проверено» без
исполнения регулярно оказывается ложным.
- Каждый пин — прогнать и показать вывод. Пин, который на твоей машине скипается, не стережёт ничего.
- Каждое число — пере-снять вторым прибором либо напечатать рядом контрольную величину. **Отрицательный
замер обязан доказать, что спросил существующее:** «0 совпадений» и «нет такого поля» неразличимы.
- Сверх исполнения — **адверсариальный проход по собственной готовой работе**. Где твой пак уязвим: предикат
§4.3 легко померить на удобной половине данных; отказ §4.1 легко проверить на конфиге, который и так
не запускается.
## 6. Оси ревью
Характер «Код» плюс ось денег: любой твой механизм обязан ответить, что он делает с чужими деньгами, если
сработает ошибочно. Ось вправе заменить с аргументом.
## 7. Записка-план ДО работы
До первой правки — короткая записка в `docs/PROGRESS.md`: что берёшь, в каком порядке, чем будешь мерить.
## 8. Заявление = команда
Любое «проверено / измерено / не воспроизводится» в отчёте обязано быть командой, которую можно повторить.
## 9. Эхо-протокол старта
Первым сообщением — своими словами: что заказано, где предмет уже, чем ты его смеришь, и **какие опасности
ты видишь в самом заказе**. Право сказать «этого делать не надо» у тебя есть (§11).
## 10. Что НЕ удалось — обязательная секция отчёта
Пустой она не бывает. Если кажется, что бывает, — значит не назван остаток.
## 11. Канал вопросов и право сказать «этого делать не надо»
Вопрос — секцией в отчёт; работа продолжается. Владелец прочитает и пере-передаст. Если ты видишь, что
пункт заказа неверен, — **скажи это и не делай**, с доводом. Это норма, а не отказ от работы.
**Тебе разрешён ОДИН советчик-фабл** (`model: "fable"` задавай явно). Он советчик, а не источник истины:
его посылки проверяются деревом — у меня две его ссылки из десяти оказались с неверными номерами строк.
## 12. Прямой канал
Связь между сессиями — `/tmp/textmachine-channel`: впиши свой блок (`role=` `session=` `ref=` `written=`
`note=`), дописывая в конец и не трогая чужие.
## 13. Критерий завершённости — по нему тебя примут
1. §4.1 построен, отказ краснеет пином на данных, и пин прогнан.
2. §4.2: разбор ужесточён по пути (а); отказ и мусор РАЗВЕДЕНЫ по корзинам (`Declined` против `Unanswered`), обе
ветви запинены; реестр отказных фраз лежит в langpack, а не литералами в Go.
3. §4.3: два предиката; $0-харнесс реплея по БД работает; таблица чувствительности по порогам снята на обоих
источниках, оба ЗАДАННЫХ знаменателя использованы и названы в отчёте.
4. §4.4: ответ или честное «данных нет, нужен такой-то лог».
5. Гейт зоны зелёный целиком — `make battery`, а не `go test`; в отчёте названо, что прогнано.
6. Мутации новых мест введены в гейт, а не прогнаны разово.
7. Секция «что не удалось» заполнена.
## Деньги
**Пак $0.** Платных вызовов моделей нет ни одного. Замеры — по уже купленному сырью. Если предмет требует
покупки, это вопрос оркестратору, а не решение сессии.
## Отчёт
`docs/PROGRESS.md`, секция «Бэкенд»: что построено, чем проверено, какие числа сняты и каким прибором, что
осталось. Дерево передаёшь на лендинг — не коммитишь.

View file

@ -50,7 +50,7 @@
| 7 | ~~полигон~~ | ⛔ **ЗОНА ВНЕ СКОУПА — слово владельца 11.09**; четыре промта уведены в `archive/prompts/` с баннерами | — | снято |
| 8 | **бэкенд/деньги** | ⛔ **«ПАДЕНИЕ, КОТОРОЕ ВИДНО»** — четверть COGS в одном механизме (**415**), слепые приборы отказа (**414**, **422**), молчащая подстановка цены. ⚠ Пин цены **413** из пака ВЫНУТ: это данные и отдельное решение | пак, $0 | ✅ **ЗАКРЫТ АКТОМ `D39.251`** (испр. 15.09; дальше — запись 11.09) · ✍️ **НАПИСАН 11.09**`BACKEND_FAILURE_YOU_CAN_SEE_SESSION_PROMPT.md`; выдаётся СВЕЖЕЙ сессии сразу по закрытии 4 ⛔ **КРИТЕРИЙ ПРИЁМКИ ПАКА — МЕХАНИЗМ, А НЕ ПРОПОРЦИЯ** (поправка старшего коллеги 11.09): лекарство есть распространение ратифицированного образца `D2` п.3 на вторую причину, и оно верно при 25 % и при 5 % — пропорция задаёт очерёдность, не форму. ⇒ судить по строкам «ни одного удвоения без вердикта о вырождении; каждая выброшенная попытка — строкой леджера с причиной», а не по «с 25.4 % до X». Значит прогон B пак не гейтит и паком не гейтится.|
| 9 | **платформа+бэкенд** | ⭐ **ХОЛОДНЫЙ ПРОГОН B — платформа → бэкенд → файл, ВТОРОЙ раз.** Уточнение владельца 11.09: спрашивая «перепрогоны нужны», он имел в виду именно сквозной прогон, а не пере-запуск тестов. Покупает ЧЕТЫРЕ вещи, которых нет ни у кого: **(1)** миграция **v17** (`wave_selection`) пака консистентности ни разу не шла на живом прогоне — только в тестах; **(2)** прибор консистентности впервые даст числа с ЖИВОГО прогона, а не с пере-скана сохранённой базы прогона A — сегодня все `I1`/`I2` получены повторным чтением одних и тех же данных; **(3)** платформенный пак (идемпотентный резюм, терминальное состояние) проверяется сквозь, а не юнитами; **(4)** ⛔ **вторая точка по денежной дыре, и она нужна по норме, а не для красоты** — весь довод «четверть денег купила пустоту» стоит на ЧЕТЫРЁХ одиночных розыгрышах, а квирки §3д прямо говорят: смета DeepSeek с одиночного вызова может ошибиться на порядок, сметы строятся на ПОВТОРАХ. ⇒ у числа 25.4 % есть знак и нет величины, пока прогон не повторён. **Цена ≈$0.42 по образцу прогона A, машинный кап ≈$2.5.****ПРЕ-РЕГИСТРАЦИЯ ЗНАМЕНАТЕЛЯ, иначе B ответит числом на другой вопрос** (поправка старшего коллеги 11.09): B — ЕЩЁ ОДИН одиночный прогон, и две точки распределением не станут. Настоящая ценность B не «вторая точка к 25.4 %», а `request_log` ВСЕХ единиц прогона ⇒ **доля выброшенных первых попыток ПО ЕДИНИЦАМ, а не по вызовам.** Это и пре-регистрируется. ⚠ И идёт B **ПАРАЛЛЕЛЬНО** паку о падениях, а не после: они в РАЗНЫХ слотах (бэкенд против платформы), и правило «один промт на зону» их не сталкивает | ≈$0.42 | ✅ **ЗАКРЫТ АКТОМ `D39.252`**, факт $0.396657 |
| 10 | **бэкенд** | ⛔ **БАНК: РЕШЁННОЕ ОСТАЁТСЯ РЕШЁННЫМ** — предмет пере-определён проверкой 15.09. Пак 12.09 «в банк по разнобою» (`BACKEND_WHAT_THE_BANK_IS_MADE_OF_SESSION_PROMPT.md`) снят баннером: все термы со `spread ≥ 2` уже в банке (A 9 из 9, B 8 из 8). Настоящий дефект приоритета №1 — пере-решение банка терминологом: на подписи замерено (у неподписанных строк сменились передачи A 12 из 69, B 14 из 66), на каждой следующей покупке глав выведено из кода — отгруженные главы по порядку слотов остаются со старыми передачами (`backend/internal/pipeline/volume.go`, греп `DELIVERY BEFORE REWORK`). Ряды 130 · 330 · 438 · 440 | $0 + центы перекупки банк-ролей | ⛔ **ПРОЕКТ ОРКЕСТРАТОРА ОТОЗВАН 15.09.** «Банк — журнал решений с окнами» (две редакции Fable 5) расходился с 12 пунктами решённого, замеренного и этого же плана и опирался примерно на десятую часть относящегося; улики — `archive/reports/BANK_CONSILIUM_INPUTS_2026-09-15/`. ✅ **КОНСИЛИУМ ОТРАБОТАЛ, акт `D39.253` (16.09).** Итог — `research/35-bank-memory-consilium.md`: банк как решение по уликам с пятью событиями пересмотра, N-1 на построенном фильтре, N-3 на сборке вида, ряды бэклога 441450. ✅ **СЛОВО ВЛАДЕЛЬЦА ПОЛУЧЕНО 16.09** (`D39.254`): держать решение между покупками — да · при невозможной безродовой форме — перестроить фразу, иначе «как лучше читается» · богаче контекст — да, меру решает замер M4 · голос и ты↔вы — строить. ⚠ **Вопрос об отказе терминолога ПЕРЕ-ОПРЕДЕЛЁН владельцем:** у банк-ролей нет ни ретрая, ни фоллбека (ряды 435, 438), и он считает это дырой ⇒ заведён ряд 451 «умный участок в точке банка», ряд 452 — голос. ⏳ Осталось: слово владельца о границах ратифицированного закрытия совета моделей (D39.102 п.2) и слот бэкенда под пак 1. Вопросы владельцу, в том числе ряд 130 (`research/34` §4 п.4), ставит его итог; он же решает порядок относительно 5(в). Довод «перекрой глав без якоря пере-решил бы банк платной книги» остаётся входом |
| 10 | **бэкенд** | ⛔ **БАНК: РЕШЁННОЕ ОСТАЁТСЯ РЕШЁННЫМ** — предмет пере-определён проверкой 15.09. Пак 12.09 «в банк по разнобою» (`BACKEND_WHAT_THE_BANK_IS_MADE_OF_SESSION_PROMPT.md`) снят баннером: все термы со `spread ≥ 2` уже в банке (A 9 из 9, B 8 из 8). Настоящий дефект приоритета №1 — пере-решение банка терминологом: на подписи замерено (у неподписанных строк сменились передачи A 12 из 69, B 14 из 66), на каждой следующей покупке глав выведено из кода — отгруженные главы по порядку слотов остаются со старыми передачами (`backend/internal/pipeline/volume.go`, греп `DELIVERY BEFORE REWORK`). Ряды 130 · 330 · 438 · 440 | $0 + центы перекупки банк-ролей | ⛔ **ПРОЕКТ ОРКЕСТРАТОРА ОТОЗВАН 15.09.** «Банк — журнал решений с окнами» (две редакции Fable 5) расходился с 12 пунктами решённого, замеренного и этого же плана и опирался примерно на десятую часть относящегося; улики — `archive/reports/BANK_CONSILIUM_INPUTS_2026-09-15/`. ✅ **КОНСИЛИУМ ОТРАБОТАЛ, акт `D39.253` (16.09).** Итог — `research/35-bank-memory-consilium.md`: банк как решение по уликам с пятью событиями пересмотра, N-1 на построенном фильтре, N-3 на сборке вида, ряды бэклога 441450. ✅ **СЛОВО ВЛАДЕЛЬЦА ПОЛУЧЕНО 16.09** (`D39.254`): держать решение между покупками — да · при невозможной безродовой форме — перестроить фразу, иначе «как лучше читается» · богаче контекст — да, меру решает замер M4 · голос и ты↔вы — строить. ⚠ **Вопрос об отказе терминолога ПЕРЕ-ОПРЕДЕЛЁН владельцем:** у банк-ролей нет ни ретрая, ни фоллбека (ряды 435, 438), и он считает это дырой ⇒ заведён ряд 451 «умный участок в точке банка», ряд 452 — голос. **ГРАНИЦЫ ДАНЫ ВЛАДЕЛЬЦЕМ 16.09** — «в границах ратифицированного», и слот бэкенда освобождён приёмкой `D39.255`. ⏳ **ПРОМТ ПАКА 1 НАПИСАН 16.09**`BACKEND_BANK_ZERO_LAYER_SESSION_PROMPT.md`, пак $0 (громкий отказ при цели без инъекционных текстов до первой траты · отказ роли перестаёт ехать законом · предикат «спорный» как ДВА предиката с заданными знаменателями · носитель посылки «новой улики не было»); круг опровергателя пройден, ждёт слова владельца о выдаче. Вопросы владельцу, в том числе ряд 130 (`research/34` §4 п.4), ставит его итог; он же решает порядок относительно 5(в). Довод «перекрой глав без якоря пере-решил бы банк платной книги» остаётся входом |
**ПОЧЕМУ 4 ВСТАЛ ПЕРЕД 5 (решение 11.09 по мерилу владельца).** Мерило — «качественный КОНСИСТЕНТНЫЙ
перевод длинных книг». Аудит банка 11.09 показал, что **книжного вопроса о консистентности не задаёт ни один

View file

@ -24,6 +24,7 @@
- **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог):
| Роль | Активный промт | Статус |
|---|---|---|
| **Бэкенд · БАНК ЗА $0** | [BACKEND_BANK_ZERO_LAYER_SESSION_PROMPT.md](BACKEND_BANK_ZERO_LAYER_SESSION_PROMPT.md) | ⏳ **НАПИСАН 16.09, ЖДЁТ СЛОВА ВЛАДЕЛЬЦА О ВЫДАЧЕ.** Пак **$0**, фундамент «умного участка» банка: громкий отказ при цели без инъекционных текстов ДО первой траты (и мимо гейтов — через сид) · отказ роли перестаёт ехать редактору законом, отказ и мусор разведены по корзинам · предикат «спорный» как ДВА предиката с ЗАДАННЫМИ знаменателями · носитель для посылки «новой улики не было». Круг опровергателя пройден: 7 мажоров — 5 внесены, 1 ОПРОВЕРГНУТ моим замером (у опровергателя был ложный ноль по базам), 1 уточнён. ⚠ Регенерация банк-роли и фоллбек другим семейством — СЛЕДУЮЩИМ паком, их мины названы в §4.5 |
| **Бэкенд · КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.255`**; промт в [archive/prompts/](archive/prompts/BACKEND_BOUGHT_MEANS_DELIVERED_SESSION_PROMPT.md) с баннером-исходом. Лендинг `af88680`, 29 путей, $0. Закрыты строки **291** и **379** (вторая — ЗАМЕРОМ: мутант 8/8 против 7/8 в ряду). ⛔ Пак пережил ПОТЕРЮ сессии: `textmachine-b1` построила почти всё и исчезла при переезде окружения, доводила `textmachine-main-b1` разделом ПЕРЕДАЧИ ред. 5. ⚠ Остаток — строки **375** · **232** · **453****456**; три опубликованных ключа качества сменили смысл (п.5 акта). **Слот бэкенда СВОБОДЕН** |
| Сквозной · ХОЛОДНЫЙ ПРОГОН B | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 11.09** — акт **D39.252**; промт в [archive/prompts/](archive/prompts/COLD_RUN_B_SESSION_PROMPT.md) с баннером-исходом. Книга второй раз от двери до ФАЙЛА, факт **$0.396657**. ⭐ Две меры денежной дыры разошлись в РАЗНЫЕ стороны на одних данных; **85.7 % оплаченного выхода — размышление, а не текст**. ⛔ Прибор приоритета №1 солгал вердиктом по подписанному имени героя. Качество впервые судилось по ОРИГИНАЛУ рядом с переводом: 26 находок, 1 крит |
| Оркестратор | [ORCHESTRATOR_SESSION_PROMPT.md](ORCHESTRATOR_SESSION_PROMPT.md) | роль и нормы; счётчик роли — CURRENT-STATE |

View file

@ -107,6 +107,7 @@ UNKNOWN 1 — её, дошёл один раз до правок; десять
| 10 | сквозной | ХОЛОДНЫЙ ПРОГОН B, платный, с вычиткой всего текста | textmachine-82 | ✅ своими словами, 5 опасностей — три исправили промт | ✅ **ПРИНЯТ актом `D39.252`**, факт $0.396657 |
| 11 | бэкенд | ДОВОДКА пака 9 после потери сессии — раздел ПЕРЕДАЧИ ред. 5 того же промта | textmachine-main-b1 | ✅ своими словами, хеш индекса сверен, +5 недоделок сверх семи (две протухшие строки отчёта · цвет пинов снят не на HEAD · противоречие счёта читателей · §4.5(а) без исполнения · редрайв без катчера) — исходы отправлены | выдан 15.09 после трёх кругов опровергателя (21 → 3 мажора → 0) и confirm владельца · ⏸ СДАН 15.09 по правилу остановки П4, приёмка отложена словом владельца «Не отвлекайся пока от банка памяти, работай по нему» · ✅ **ПРИНЯТ актом `D39.255`** 16.09 по слову «Да, начинай приёмку»: пять осей приёмки (батарея 23/23 · мой полный каталог мутаций 441/441 · её логи пере-разобраны моим прибором 437+4 · ось «отчёт↔код» 26 подтверждений, 0 мажоров · ось денег 79 чисел, все четыре пробы точны). Лендинг `af88680`, 29 путей, $0. ⚠ Мои ложные нули смены — в п.7 акта |
| 12 | — (вне кодовых зон) | КОНСИЛИУМ «банк памяти длинной книги — как строить»: наследует банковую работу смены после отзыва проекта оркестратора; совет агентов, Fable 12 | textmachine-main-1e | ✅ своими словами; три опасности: шесть открытых решений против лимита в пять вопросов · исход «не термин» против закрытия D39.102 п.2 · угол «журнал с окнами» против почти пустых окон — все по делу, ответы отправлены | ✅ **ПРИНЯТ актом `D39.253`** 16.09: сдан по правилу остановки, приёмка — пять осей вне консилиума (50 находок, 14 мажоров), затем круг дофикса и узкий закрывающий. ⭐ Совет нашёл ратифицированный ответ на заглавный кейс владельца (D5 п.1, D7 правка 1), мимо которого прошли оба отозванных проекта. ⚠ Мои ошибки смены — в п.6 акта. Выдан 16.09 после механической сверки 13 блоков и ЧЕТЫРЁХ кругов опровергателя: 4 мажора + 15 миноров → 1 + 7 → 1 + 2 → 0 + 2, миноры последнего внесены. ⭐ Опровергатель нашёл то, мимо чего прошли оба отозванных проекта: ратифицированный ответ на заглавный кейс владельца (D5 п.1, D7 правка 1) и что у движковых строк банка окон почти нет (`since_ch` > 0 у 2 строк на книгу, `until_ch` = 0 у всех). ⚠ Дважды мажор родила МОЯ правка: цитата о заморозке без её предмета · баннер выписки, объявивший опровергнутым верное утверждение |
| 13 | бэкенд | БАНК ЗА $0 — фундамент «умного участка»: ряды 441 · 445 · 449 · 459 | — (не выдан) | — | ⏳ **промт написан 16.09**, прошёл круг опровергателя фабла (7 мажоров: 5 внесены, **M1 опровергнут моим замером** — опровергатель напечатал «баз нет», а их 19, включая `bank_stop_presented` на 67 строк; 1 уточнён по ссылке). Ждёт слова владельца о выдаче свежей сессии |
**ПОЛИГОН СНЯТ ВЛАДЕЛЬЦЕМ 11.09.** Я предлагал пак трижды — `ed`, `5c` (обе отработавшие, отказались ПО НОРМЕ и были правы) и свежей `37`, — после чего владелец сказал «полигон не надо выдавать». Выдача `37` ОТОЗВАНА тем же часом. ⚠ Урок не про полигон: **я трижды искал адресата для заказа, приоритет которого не подтверждал у владельца.** Слот зоны свободен ≠ работу зоны надо заказывать.
@ -202,3 +203,19 @@ UNKNOWN 1 — её, дошёл один раз до правок; десять
в её пак §4.5. Свои пять я починил (`f9216cd`). Остальные раздать ПАКАМИ их зон, не чинить самому.
- **Воркфлоу про банк памяти (`wm0j2l4kz`) умер, отдав пустой файл** — вопрос владельца «что банку памяти
нужно для качества перевода» носителя не получил; пере-задать при паке «выдача, которую видит читатель».
## ⛔ Класс ложного нуля, купленный 16.09: обёртка вокруг ВСТРОЕННОЙ команды даёт 127, а счётчик печатает «0»
Мой советчик-фабл отчитался «баз прогонов на хосте нет: `project.db` — 0 под `/home/ubuntu`». Баз девятнадцать.
Механизм он назвал сам, и он воспроизводим: прибор был `timeout 60 command find … | wc -l`. **`timeout`
запускает ВНЕШНЮЮ программу, а `command` — встроенная оболочки** ⇒ `exit 127` («команда не найдена»), ноль
строк на выходе, и `wc -l` честно печатает `0` — как будто это результат ПОИСКА.
**И вот что делает класс опасным, а не просто глупым: контрольные величины рядом БЫЛИ.** Он напечатал
«`books/` — 17 записей» и «`*.db` под репозиторием — 0». Обе верны и обе отвечают на ДРУГОЙ вопрос — про
репозиторий, где баз и правда нет. ⇒ **контроль обязан стоять у ТОГО прибора, который дал ноль**, а не рядом
с ним: контроль от соседнего прибора доказывает работоспособность соседа, и ничего больше.
⇒ Практика: у любой пайплайн-команды, чей ноль несёт вывод, печатать `PIPESTATUS`/код возврата ПЕРВОГО звена,
а не только число строк. `find_exit=127` виден сразу, «0» — не виден никогда.