Add the backend pack prompt for keeping settled bank rows unasked, and register it in the prompt table and the queue issue log

This commit is contained in:
heaven 2026-09-17 09:17:59 +03:00
parent f468bfa2f7
commit 31f8ee6f14
3 changed files with 369 additions and 0 deletions

View file

@ -0,0 +1,366 @@
# Бэкенд-пак: РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ — движок платит за ответ, который у него уже есть
> Выдача №14 очереди №23. Зона — `backend/`. Платных вызовов моделей пак НЕ делает: $0.
> ⚠ **Числа и адреса этого промта сняты мной по дереву 17.09. Те, на которых ты строишь решение, пере-снимай сама**
> заимствованное число улики не заменяет. За смену адреса в моих источниках уезжали семь раз, а два указывали
> в НЕСУЩЕСТВУЮЩИЕ файлы.
## 1. Какая проблема и что решит твой результат
На каждой покупке глав движок заново платит банк-ролям — терминологу и классификатору — за термины, которые уже
решены. Замерено на двух купленных прогонах: на подписи сменились **12 из 69** и **14 из 66** передач, и словом,
а не регистром, — 10 из 12 и 12 из 14. При этом собственная улика не менялась у **25 из 26** строк: мы платим за
пере-решение без новой информации, а ответ может разойтись с тем, что уже стоит в отгруженных главах.
Цена конкретна. Потолки банк-ролей **пожизненные**`budget_usd: 1.00` и `classify_budget_usd: 1.00`
(`backend/configs/pipeline-c1.yaml`); исчерпание необратимо, и книга остаётся без консолидированного банка
навсегда, о чём не говорит ни одно сообщение (ряд **356**). Длинная книга при сегодняшней пере-покупке съедает
потолок примерно за 616 покупок.
Твой результат: строка, решённая движком, переживает покупку — её ответ берётся из носителя, а не покупается
снова, и пере-спрашивается она только при названном событии.
## 2. Зона записи и git
Пишешь `backend/` и свою секцию в `docs/PROGRESS.md`. **Не коммитишь** — дерево передаёшь мне, лендинг мой.
Чужие незакоммиченные файлы не трогаешь. `.env` не читаешь никогда.
## 3. Карта чтения — ЗАКОН, пять позиций
1. `CLAUDE.md` в корне — канон проекта целиком.
2. `backend/internal/pipeline/terminologist.go` — **платный путь банк-ролей: сборка кандидатов, фильтр решённых
(`dropBankSettled`, вызов на `:401`), батчи, разбор ответа и то, что делается с ним дальше.** Читать целиком,
включая докблок `:1347-1395`: там записано, ПОЧЕМУ сегодняшний фильтр устроен из двух условий, и эта причина —
твоя главная опора и главное ограничение.
3. `backend/internal/pipeline/mining.go` — эмиссия дельты, авто-банк и **граница сигнатурной остановки**.
4. `docs/architecture/18-bank-ontology.md` — что такое банк, чьё слово в нём живёт, и три правила дисциплины
носителей. Страница короткая, читать целиком: твой пак её правит.
5. `docs/research/35-bank-memory-consilium.md` — §1.2 (П1), §1.5, §2.0. ⛔ **Читать как ПРОЕКТ, не как
ратифицированное:** документ сдан БЕЗ сходимости, правилом остановки; свёртка N-2 в N-1 сделана после
последнего круга проверки и **не судилась ничем**; четыре минора судьи на момент сдачи внесены не были;
часть адресов писана по копии кода от 15.09 и указывает в файлы, которых нет.
## 4. Что построить
### 4.1. Замер M1 — ПЕРВЫМ БЛОКОМ, и второй блок без моего ответа не начинается
Форма предиката без замера не принимается — это условие §4 итога консилиума, и оно не формальность: предикат
решает, за что мы платим.
Отпечаток и предикат делай чистыми функциями. Прибор — env-гейченный тест по образцу корпусных пинов
(`D39.255` п.2), который гоняет их **над копиями** купленных баз и печатает: кандидатов · решённых ·
пере-спрошенных по классам (родня подписанных · нерешённые `auto` · новые · сменилась улика).
**Два контроля обязательны, и оба различающие:**
- подменить исходник вокруг ОДНОГО вхождения одного кандидата ⇒ пере-спрошен ровно он и его юнит;
- два прогона под одним базисом ⇒ состав батчей байт-идентичен.
⚠ Контроль «два одинаковых прогона дали 0 % пере-спроса» ВЫРОЖДЕН: он меряет детерминизм харнесса, а не силу
предиката. Не засчитывай его.
**Материал замера — ТРИ вещи, а не одна, и это найдено опровергателем промта.** Из базы отпечаток не считается:
таблицы чанков в схеме НЕТ (контроль: в `tm-coldrun-b/evidence/paid-final-project.db` таблиц 17, в
`tm-coldrun-a/evidence/v16-readonly/project.db` — 16, `chunks` среди них ноль). Нужны: **(1)** копия базы — ответы ролей,
банк, чекпойнты; **(2)** ИСХОДНИК книги, он лежит отдельно: `/home/ubuntu/tm-coldrun-a/material/guzhenren-ch1-3.gb18030.txt`
(⚠ кодировка gb18030) и `evidence/*/source.txt`; **(3)** `book.yaml` того прогона. Отпечаток, посчитанный по единственному
тексту, который база хранит, — по ОТВЕТАМ модели, — измерил бы не тот предмет.
**Сырьё куплено и невосстановимо. Работай на КОПИЯХ.** Базы: `/home/ubuntu/tm-coldrun-a` (14 баз,
`evidence/v16-readonly/project.db`) и `/home/ubuntu/tm-coldrun-b` (26 баз, `evidence/paid-final-project.db`,
`evidence/paid-bankstop/project.db`). База прогона A несёт схему 16 при голове 18: `OpenReadOnly` её отвергает,
а `Open` МИГРИРУЕТ (ряд **475**). Я пере-снял: миграции v17/v18 аддитивны — `CREATE TABLE IF NOT EXISTS` и
`ALTER TABLE … ADD COLUMN`, ни одного `DROP`/`RENAME`/`DELETE FROM`, — то есть на копии `Open` безопасен, а
оригинал не открывай вовсе. `sqlite3` как CLI на машине НЕТ: python3 + модуль `sqlite3`, режим `mode=ro`.
Числа блока 1 — в отчёт. **Блок 4.2 не начинается, пока я не принял форму предиката.**
### 4.2. Базис — ИСТОЧНИК ОТВЕТОВ, а не фильтр. Это несущее, и здесь самая тихая регрессия пака
Соблазн описать N-1 как «фильтр снимает решённого кандидата» — и этого НЕДОСТАТОЧНО. Проверено чтением:
снятый кандидат не попадает в консолидированные, а `attachConsolidatedDst` стампит передачу только при непустом
значении — её докблок говорит дословно: «Terms the role did not answer are left untouched»
(`backend/internal/pipeline/terminologist.go:1291`=`Terms the role did not answer are left untouched`). Дальше
двухрежимная эмиссия ставит `draft` ТОЛЬКО при непустом `dst`
(`backend/internal/miner/miner_emit.go:279`=`st.Dst, st.Status = m.Dst, "draft"`), иначе строка остаётся `auto`.
⇒ Наивный фильтр молча ОБНУЛИТ уже купленную передачу: авто-банк потеряет её, а таблица стопа и проекция
покажут строку неотвеченной. Прогон станет выглядеть дешевле, а банк — беднее. Это ровно тот класс, за который
здесь бьют: выгода видна, потеря молчит.
**Поэтому базис подставляет ответ** — передачу, тип, род — там, где роль не спрашивали. Перечисли в записке
ВСЕХ читателей ответа и покажи в отчёте, что каждый получил своё; начни с `attachConsolidatedDst`,
`attachClassifiedGender` (`backend/internal/pipeline/terminologist.go:1306`), их соседа по типу, `consolidatedRows`, строк стоп-таблицы и
проекции консолидации.
⛔ **И ДВА читателя, которых докблок фильтра называет ПРИЧИНОЙ своей двух-условности — мой первый список их упускал,
нашёл опровергатель промта.** `backend/internal/pipeline/terminologist.go:1352`=`CanonConflicts and ConsolidationKeyConflicts` говорит прямо:
роль спрашивают о банкованных поверхностях НАРОЧНО, потому что её ответ читают эти две проверки, и они ставят
владельцу на лист отметку «книга уже называет термин иначе». Вызовы живые —
`backend/internal/pipeline/terminologist.go:624`=`terminology.CanonConflicts(cands, out, canon)` и
`backend/internal/pipeline/terminologist.go:646`=`membank.ConsolidationKeyConflicts(consolidatedRows(cands, out), bank)`.
**реши и объяви ЯВНО: судится ли подставленный базисом ответ этими двумя.** «Да» — отметки поедут на лист за
передачу, которую в эту покупку никто не покупал, и поедут на КАЖДОЙ покупке. «Нет» — отметки исчезнут у населения,
ради которого фильтр и сделан двух-условным. Молчание здесь — выбор вслепую, и он денежный.
**Отдельно `Invented`:** `backend/internal/pipeline/mining.go:502`=`row.Invented = dst != "" && !proposedByDrafts(dst, c.Variants)` — передача,
подставленная базисом, черновиками ЭТОЙ покупки не предлагалась и будет помечена «выдумано движком»: ложное
обвинение собственного канона книги на листе подписи. Смежное, назови оба: `backend/internal/pipeline/stopcontest.go:75`=`if r.SettledByBank`
молча исключает такую строку из очереди спорных, а счётчик `backend/internal/pipeline/terminologist.go:618`=`res.Consolidated++` сменит
смысл, если базисные ответы влить в общий набор до цикла счёта.
Список мой — проверь его полноту сама, я уже дважды не увидел читателя, которого называет сам код.
### 4.3. Две границы записи — ДЕЛАЙ РОВНО ТАК, потому что одной недостаточно по построению
Базис пишет ПРОГОН на своих выходных границах, и границ **две**:
- `run-finished``backend/internal/pipeline/bookrun.go:258`=`r.exportBank(ctx, "run-finished")`, и она стоит
под `if err == nil` (`backend/internal/pipeline/bookrun.go:254`);
- `bank-mining/signature-stop``backend/internal/pipeline/mining.go:270`=`bank-mining/signature-stop`.
Одной мало не по вкусу, а по коду: сигнатурная остановка возвращается ЗНАЧЕНИЕМ-ОШИБКОЙ —
`backend/internal/pipeline/waverun.go:185`=`return nil, &WaveSignatureStop{` (тип объявлен `:89`, метод `Error()`
на `:104`). ⇒ прогон, кончившийся стопом подписи, базиса бы не написал вовсе, и резюм после подписи оплатил бы
весь проход.
**Чего делать НЕЛЬЗЯ: писать базис сразу после платного прохода, до развилки.** Базис, присутствующий на
краш-резюме, сжимает состав батчей, чекпойнты не находятся, и резюм перекупает то, что уже оплачено.
**Место в порядке записи названо, потому что на границе стопа порядок — инвариант:** карта → таблица стопа →
проекция банка → **базис** → память флажка. ⚠ **Это отклонение от буквы консилиума (он ставил базис пятым,
последним), и довод взят у самого кода — нашёл опровергатель промта.** Комментарий над записью памяти флажка
формулирует правило: `backend/internal/pipeline/mining.go:271`=`a crash between the two costs one benign re-stop` — последней
пишется запись, чья потеря ДЕШЕВЛЕ. Потеря памяти флажка стоит одного лишнего доброкачественного стопа; потеря
базиса стоит пере-покупки банк-ролей из ПОЖИЗНЕННОГО потолка (ряд **356**). ⇒ базис идёт раньше. Выберешь иначе —
назови, чем громкая строка компенсирует окно краша, и запини это.
Ветка отказа по форме такая же, но громче по последствию: **стоп остаётся стопом, а неудача записи базиса обязана
КРИЧАТЬ** — она означает, что резюм пере-спросит роли, то есть это денежное событие, а не строка бухгалтерии.
**Писатель ОДИН — прогон; границ у него две.** Формулируй именно так. Онтология судит носитель с двумя
писателями так же строго, как проекцию без читателя (`docs/architecture/18-bank-ontology.md:70-72`), и
консилиум на этом уже спотыкался.
### 4.4. Форма отпечатка — РЕШИ САМА, но развилку знай: от неё зависит, переживёт ли пак следующую работу
Отпечаток — хеш того, что читает роль. Консилиум пишет «строки `ctx`». ⛔ **Так делать опасно**, и вот почему:
`ctx` — это окна KWIC, а их отбор, число и ширина управляются тремя независимыми ручками
(`AttachKWIC`, `backend/internal/terminology/terminology.go:340`=`func AttachKWIC`; вызов
`backend/internal/pipeline/terminologist.go:310`; ключи `kwic_per_term`/`kwic_width` — пар-данные). Любая из них молча обнулит набор
решённых у КАЖДОЙ книги: отпечатки не совпадут ни у одного кандидата, и книга потратит остаток пожизненного
потолка на пере-консолидацию.
Это не гипотеза: стратифицированный отбор окон — заказанная работа (ряд **449**, контроль: `stratif` — **0**
совпадений при 53 не-тестовых Go-файлах двух пакетов), и она придёт.
⇒ Ищи форму, **инвариантную к способу выбора окон**: текст вокруг вхождений ключа, а не то подмножество, которое
отобрали для роли. ⛔ **Но ширину отпечатка НЕ зашивай константой в Go** (моя первая редакция велела именно это —
поймал опровергатель): `D39.50` п.4 ратифицировал, что «`kwic_width` в РУНАХ = утечка пары в общий слой» и вынес ширину
в пар-данные, построено `D39.51`/`D39.53`, носитель — `backend/internal/lang/langpack.go:744`=`kwic_per_term`. Константа в Go стала бы
единственной шириной и была бы пар-слепой по случайности, причём на ДЕНЕЖНОМ предикате. ⇒ ширина — пар-данное с
движковым умолчанием, и в отчёте ответь на ревью-вопрос канона: заработает ли пара, которой в репозитории нет, без
правки Go. Инвариантность достигается тем, что отпечаток не читает ОТОБРАННЫЕ окна, а не тем, что ширина зашита. Якорь канона бери **по кандидату**, не по
батчу: `CanonFor` принимает батч (`backend/internal/terminology/terminology.go:856`), и отпечаток по батчу вернул бы зависимость от состава,
от которой пак как раз уходит. В отпечатке НЕТ вариантов черновиков, `freq` и `since_ch`.
**Посылка «исходник книги приходит целиком» — ОТКРЫТЫЙ вопрос владельцу от 17.09, а не допущение пака**, и это
поправка опровергателя к моей первой редакции. Шапка журнала решений говорит: для РАСТУЩЕГО сериала посылка ложна
по построению, и вопрос вынесен владельцу отдельно. ⇒ сторож «хеш исходника разошёлся — кричим» у растущей книги
срабатывал бы на каждом выпуске и обнулял базис целиком, то есть молча отвечал бы за владельца. Заголовок носителя
всё равно несёт версию схемы отпечатка и хеш исходника, но сторож обязан **различать «исходник дописан в конец» и
«исходник подменён»**: в первом случае решение старых строк падать не обязано. Не строишь различение — объяви
растущую книгу вне скоупа ЯВНО и напиши, что механизм делает при разошедшемся хеше.
### 4.5. Условие «решено» — и состояние, которое движок считает невозможным
Предикат требует: строка движка со статусом **`draft`** и непустой передачей · отпечаток совпал с записанным ·
то же верно для всех членов её юнита.
**Статус спрашивать ОБЯЗАТЕЛЬНО, «непустой передачи» мало.** Майнер производит пару `status:auto` с непустым
`dst`: `backend/internal/miner/miner_emit.go:268`=`st.Dst = props[0].Dst` — ветка при `props[0].Via == ""`
статуса не трогает, и он остаётся `auto`. Четыре комментария движка объявляют эту пару невозможной; пина нет ни
одного. Это ряд **487**, твой пак его НЕ чинит — но посылку «решено ⇒ draft» запини, иначе починка ряда 487
завтра скачком двинет набор решённых, то есть деньги.
**И про «юнит целиком» знай ограничение.** Семьи и серии детектируются НАД `paid`, то есть ПОСЛЕ фильтра
(`backend/internal/pipeline/terminologist.go:483-487`), и комментарий `:481-482` объясняет причину: детектировать над полным набором
значит рассогласовать юниты с батчами, из них построенными. ⇒ это развилка, а не приказ: либо юнит для
предиката считается отдельным проходом, не трогая батчер, либо «семья целиком» сужается и это называется.
Решение — в записку-план.
### 4.6. Носитель — развилка, и я её НЕ закрываю за тебя
Класс ратифицирован: «ПАМЯТЬ РЕШЕНИЙ» — писатель прогон, момент граница, читатель предикат до первой траты
(эррата 17.09-д в шапке `docs/architecture/05-decisions-log.md`). Форму носителя класс не фиксирует.
- **Файл рядом с базой** — буква консилиума (`bank-basis.yaml`). Образец готов:
`backend/internal/pipeline/mining.go:703`=`return r.Book.ProjectDB + ".auto-bank.yaml"`, запись атомарная
(`backend/internal/pipeline/artifact.go:26`=`func writeFileAtomic`).
- **Таблица хранилища** — аддитивная миграция по образцу памяти флажка: денежный предикат не читает файл,
который правится рукой; запись атомарна и идёт в своей транзакции. Образец — `backend/internal/store/stopmemory.go:33`=`func (s *Store) MarkStopPresented`
(55 строк: «dumb storage», предикат живёт в пайплайне, набор только РАСТЁТ и удаления нет намеренно).
**Общей транзакции с чекпойнтами у образца НЕТ** — моя первая редакция приписала ему эту гарантию, поймал
опровергатель (контроль: слово `checkpoint` в файле — 0 вхождений). Нужна такая транзакция — это НОВОЕ свойство,
его строят и называют ценой, а не наследуют.
Назови выбор и довод в записке-плане. ⛔ Отпечаток в СТРОКЕ авто-банка — мёртвая форма: `writeAutoBank` в
продакшне зовётся ровно один раз, внутри ветки «не останавливаемся» (`backend/internal/pipeline/mining.go:242` под `if !stopping` на
`:235`), то есть на стопе подписи ему негде лечь.
### 4.7. Что пак задевает наружу — поле контракта
Сегодня `never_asked` в проекции равно числу снятых банком (`backend/internal/pipeline/bankexport.go:118`) и
означает «сид держит поверхность и все черновики согласны». Поле живёт в каноне
(`docs/architecture/14-api-contract/openapi.yaml`) и читается платформой в десятке мест. ⇒ строки, решённые
базисом, в это поле класть НЕЛЬЗЯ без смены смысла: заводи **аддитивное** поле, это минор контракта, и назови
его в отчёте — пинг платформе даю я.
**И носителей этого смысла БОЛЬШЕ ОДНОГО: три фразы солгут дословно, если их не тронуть** (находка
опровергателя). Экран подписи: `backend/cmd/tmctl/render.go:282`=`the bank already renders those surfaces and every` (сводка) и
`backend/cmd/tmctl/render.go:328`=`NOT ASKED: the bank already renders this surface` (построчно); текстовый сайдкар:
`backend/internal/pipeline/mining.go:579`=`nothing to decide`. Для строки, решённой базисом, обе половины фразы ложны — банк
поверхность не держит, и черновиков об этом не спрашивали. Это ровно класс «сообщение лжёт о собственной причине»,
который код уже запрещает у соседа (`D39.93` п.2). ⚠ И отметка `SettledByBank` на шов НЕ едет вовсе: проекция несёт
`Invented`, `Contradicts`, `BankHolds` (`backend/internal/pipeline/bankexport.go:251`=`Contradicts: row.Contradicts, BankHolds: row.BankHolds`) и её не
переносит ⇒ аддитивное поле проекции и есть единственный шовный носитель нового состояния.
### 4.8. Хвост, который сбрасывается без вреда для пака
- **Ряд 490 — страж РАЗРЫВА окон глав у банковых строк.** Загрузчик ловит пересечение, разрыв не ловит никто;
готовый образец для другой сущности — `backend/internal/membank/memvoice.go:271`=`func VoiceWindowGaps`.
Бери у образца не только форму, но и гарантию: намеренный разрыв законен, поэтому исход — громкая строка, а
не отказ загрузки. $0.
- **Ряд 447** — подписанная поверхность снова спрашивается у роли во втором проходе. ⚠ Это смена продуктового
поведения: сегодняшний фильтр платит за разнобой черновиков НАРОЧНО (докблок `:1350-1357` объясняет, зачем).
Берёшь — объявляй как смену поведения, а не как починку.
- **Ряд 448** — предупреждение о разовой цене после N-1 станет лгать. ⛔ **ИСПР.: моя первая редакция писала «текста
в коде УЖЕ НЕТ, 0 совпадений» — это ЛОЖЬ, найденная опровергателем.** Текст жив дословно:
`backend/internal/pipeline/terminologist.go:541`=`This is a ONE-TIME cost; every later run replays for $0` (он в хвосте длинной строки —
я обрезал вывод по ширине и прочёл обрезок как факт). Устарел только адрес ряда (`:498`). **Носителей ТРИ:** сама
строка · голден каталога операторских сообщений `backend/internal/pipeline/testdata/operator-messages.txt:136`=`terminology: this book had already paid`,
который гейтит отдельный тест · два пина `backend/internal/pipeline/banksettled_test.go:193` (резюм: ноль обращений к провайдеру, $0,
и вдобавок ОТСУТСТВИЕ ключа `reconsolidated=true` в логе) и `:417` (обе половины: молчать на свежем прогоне,
сработать в описанном случае). ⇒ пере-формулировка обязана обновить И голден: это не подгонка под зелень, а
обслуживание заказанной смены поведения (`D39.183`), и она ОБЪЯВЛЯЕТСЯ в отчёте.
### 4.9. Что в пак НЕ входит — чтобы молчание не читалось отказом
**N-3** (одна строка закона на ключ) — нужен замер M2, ряд **477**. **Стратифицированный отбор** (ряд **449**) —
⛔ гейт `D39.50` НЕ снят: слово владельца дало санкцию на замер M4, а не разрешение строить; я исправил это в
трекере и плане сегодня. **N-4** и **Б-5** — ПОСТРОЕНЫ паком `D39.257`, заказом больше не являются. **N-6**
(журнал-телеметрия) — гейчен разморозкой фронта, ряды **214** и **221**. **N-5** — закрыт `D39.263`:
производитель — человек через сид. **Точечная перегенерация** (`D39.205` п.5) — банковый пак её не трогает, и
молчание здесь не отказ.
### 4.10. Стандарт работы — слово владельца, ратифицировано `D39.258` п.3
Чистый код, рефакторинг там, где он нужен, никаких заплаток, техдолга не копить. Мерило проекта —
**качество художественного перевода длинной книги**; механизм строится там, где несёт качество или деньги.
## 5. Самопроверка ИСПОЛНЕНИЕМ
Гейт зоны (`make battery`) обязателен и самопроверкой **не является**. Сверх него — адверсариальный проход по
своей готовой работе; субагентов поднимать разрешаю явно. Глубину выбираешь сама, направление даю я — пять мест,
где этот пак мягок:
1. **Потеря передачи у снятого кандидата** (§4.2) — самая тихая регрессия. Проверяй тем, что авто-банк и
стоп-таблица после прогона с базисом несут ТЕ ЖЕ ответы, что без него.
2. **Точка записи** (§4.3) — посадка, ставящая базис до развилки, обязана краснеть пином резюма.
3. **Отпечаток** (§4.4) — посадка, меняющая число или ширину окон, НЕ должна обнулять набор решённых.
4. **Первый резюм после записи базиса** — он платит за переупаковку хвоста один раз. ⛔ **Пин обязан различать ДВЕ
оси, и одну мою редакцию опровергатель снял как повторяющую ровно ту ложь, которую велит убрать ряд 448:**
(1) резюм ТОЙ ЖЕ покупки — $0 со второго; (2) СЛЕДУЮЩАЯ покупка, где решилась хоть одна новая строка, — хвост
батчей переупаковывается и платится снова. Вторая ось — та, ради которой пак существует («строка переживает
ПОКУПКУ»), и формулировка «каждый последующий прогон за $0» запрещена.
5. **`auto`-хвост** — строка, которую модель устойчиво считает не-термином, платится КАЖДУЮ покупку на
тождественном входе. Это цена, названная консилиумом; напечатай её числом.
**Мутации:** новые посадки вводи в гейт, иначе «поймана» — разовый прогон смены, а не рубеж проекта. Полный
прогон каталога после рефактора обязателен. ⛔ Гнать его **в переднем плане**: гейт движка не помещается в
фоновую задачу харнесса (ряд **488**), и это не про нехватку памяти машины.
## 6. Оси ревью
Две-три, можешь заменить с аргументом: **денежная** (ни один путь не покупает дважды и мимо бюджета) ·
**сохранность ответов** (ничего уже купленного не потеряно — §4.2) · **рефакторинг без регресса** (что переехало
и чем доказано, что поведение прежних вызывающих не изменилось).
## 7. Записка-план
До первой правки кода — короткая записка в свою секцию журнала: схема носителя и выбор его формы с доводом ·
форма отпечатка · таблица читателей ответа · что решила по юнитам (§4.5) · денежная семантика резюма.
## 8. Заявление = команда
Любое число и любая категорика отчёта идут **с командой, которой они получены**, — так, чтобы я повторил их у
себя, не переспрашивая. «Кампания зелёная», «мутации пойманы», «резюм бесплатен» без команды — утверждение О
проверке, а не проверка: читатель видит слово вместо числа. ⚠ Рядом с любым НУЛЁМ печатай контрольную величину,
доказывающую, что вопрос задан существующему предмету: «ноль строк» и «нет такой таблицы» в выводе неразличимы
и оба выглядят успехом. ⚠ Приёмка пере-ранит выборочно, и расхождение числа с его же командой дороже, чем
отсутствие числа.
## 9. Эхо-протокол старта
**Первым действием** — десять строк **своими словами**: скоуп, инварианты, чего не делаешь. Дословный пересказ
промта подтверждает канал, но не понимание.
## 10. Что не удалось — и где прибор слеп
Секция «не удалось / не проверено» обязательна. ⚠ И вторая половина: **«где мой прибор слеп и я это знаю»** —
что невидимо, почему не чинила, чем закрывается. Норма зоны: **в коде названо, в отчёте нет — значит для
следующей смены не названо.**
## 11. Канал вопросов, право отказа, советчик
Конфликт промта с кодом — **пинг**, не интерпретация: промт мог устареть между написанием и чтением, и за смену
это случалось. Право сказать «этого делать не надо» с аргументом у тебя есть, и два пункта этого пака я жду
скорее отказанными с замером, чем построенными наспех.
Тебе разрешён **один** старший советчик (`model: "fable"` явно) для развилки, которую не закрывает своё
суждение; досылай вопросы ему, а не поднимай новых — его контекст и есть ценность. Он советчик, не источник
истины: его посылки проверяются деревом. ⚠ Мой собственный советчик по этому паку дал девять замечаний, и
проверка деревом подтвердила не все: одно его предложение спорило с ратифицированным доводом в коде.
## 12. Прямой канал
Механизм — `CLAUDE.md` §«Связь между сессиями»; здесь он не повторяется, но **исполняется первым делом**: впиши
свой блок в `/tmp/textmachine-channel` (роль · имя из `ListAgents` · ссылка на ЭТОТ файл · дата · что делаешь и
чего не трогаешь), дописывая в конец и не трогая чужие блоки. Адрес оркестратора бери оттуда же, и туда же шли
эхо из блока 9 — оно и служит проверкой канала.
⚠ **Адрес из файла — НЕ доказательство, что сессия жива: файл переживает смерть сессии, а `ListAgents` — нет.**
⚠ **Нужной роли в файле нет, файла нет или имя не отвечает ⇒ КАНАЛА НЕТ, и это НОРМАЛЬНЫЙ случай: НЕ опрашивай
сессии подряд.** Вопрос — секцией в свой отчёт, работа продолжается; владелец прочитает и пере-передаст.
## 13. Критерий завершённости — проверяемый
- у **каждого** пункта заказа исход: сделано · не делаю с доводом · пинг;
- **числа блока 4.1 предъявлены и форма предиката принята мной** до того, как написан носитель;
- круги **сошлись**: последний не дал новых находок, прежние закрыты таблицей «находка → что сделано → **чем
предъявлено**»;
- таблица мутаций полная, выжившие названы поимённо, полный прогон каталога пройден;
- **список «что отрефакторено и почему»** — либо явное «рефакторинга не потребовалось» с доводом;
- числа сняты **после последней правки**, у каждого команда повторения; всё живое — **в дереве**;
- гейт зоны зелёный **целиком** (сверка списком целей, а не отсутствием слова FAIL);
- сказано явно: **«работа завершена, править не планирую»**.
## Приложение. Ряды, на которые пак опирается
Строит: **130** · **490**. Задевает и обязан назвать: **330** · **438** · **440** · **461** · **466** · **481** ·
**487**. Условия работы: **475** (купленные улики) · **488** (гейт в переднем плане) · **356** (пожизненный потолок).
**Ряд 478 — ЛАТЕНТНЫЙ, и называть его без оговорки нельзя** (поправка опровергателя): его посылка опровергнута
замером зоны 17.09 на настоящем батчере — снятие решённого кандидата даёт **0 сдвигов ординала из 246 снятий** при
положительном контроле 18 из 19, боевые конфиги размер батча не задают. ⇒ ключ покупки не трогать; перекупка первой
покупки после базиса идёт от смены СОДЕРЖИМОГО батча, а не ординала. Условие оживления класса — мелкий `batch_runes`.
⛔ **Две ноты 17.09 — условия работы твоего пака, и обе про деньги ровно тех ролей, которые он фильтрует.**
`D39.264` вынес петлю повторной попытки в общий контур и подключил банк-роли к вердикту; `D39.259` включил
`gates.terminology.regenerate: 1` во ВСЕХ трёх боевых конвейерах (`backend/configs/pipeline-c1.yaml:193`,
`backend/configs/pipeline-arm-glm.yaml:72`, `backend/configs/pipeline-arm-mistral.yaml:79`). ⇒ на батч возможна ВТОРАЯ платная ступень, и
промт обязывает тебя назвать: **чей ответ ложится в базис, если батч куплен лестницей** (ответ выигравшей ступени, не
первой) · не ломает ли базис посылку пина `backend/internal/pipeline/bankladder_test.go:111`=`func TestAHealthyBankTableIsNeverAskedAgain`
(«здоровая таблица покупается ровно раз»), чья посылка утверждается отдельной строкой —
`backend/internal/pipeline/bankladder_test.go:131`=`Gates.Terminology.Regenerate` — и без неё пин измерял бы ОТСУТСТВИЕ механизма,
о чём его докблок предупреждает сам · входит ли ступень в «$0 на резюме». Не входят, но названы: **447** · **448** · **449** · **477** · **214** · **221**.
⚠ Ряд **489** — ревизия документации твоей зоны, тринадцать дней без исполнителя: четыре пункта измерены живыми,
пять не измерены. Возьми в работу то, что дёшево, и назови остальное.

View file

@ -24,6 +24,7 @@
- **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог):
| Роль | Активный промт | Статус |
|---|---|---|
| **Бэкенд · РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ** | [BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md](BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md) | **ГОТОВ 17.09, исполнитель НЕ НАЗНАЧЕН** — слот бэкенда свободен, живой свежей сессии в канале нет, а отработавшей пак не выдаётся (канон). Предмет: движок на каждой покупке заново платит банк-ролям за решённые термины — 12 из 69 и 14 из 66 смен передачи при неизменной улике у 25 из 26 строк; потолки ролей ПОЖИЗНЕННЫЕ. Строит базис решённого (ряд **130**) и стража разрыва окон (ряд **490**). Два рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**, включая мою ложь «текста в коде нет» о живой строке и материал замера, из которого предмет не строился. $0 |
| **Бэкенд · БАНК ЗА $0** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.257`**; промт в [archive/prompts/](archive/prompts/BACKEND_BANK_ZERO_LAYER_SESSION_PROMPT.md) с баннером-исходом. 29 путей, $0. ⭐ Посылка `D39.256` перестала быть посылкой: 25 из 26 смен при идентичном входе. ⛔ Мажоры — сдвинутые якоря (ряд 467) и арм по чужому знаменателю (ряд 462). ⚠ Остаток: полный прогон каталога мутаций (267) на момент акта не закончен. **Слот бэкенда СВОБОДЕН** |
| **Бэкенд · КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 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 крит |

View file

@ -109,6 +109,8 @@ UNKNOWN 1 — её, дошёл один раз до правок; десять
| 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 уточнён по ссылке). ✅ **ПРИНЯТ актом `D39.257`** 16.09: пять приборов (батарея 24/24 · мой прогон её 37 мутаций 37/37 без осечек · три оси вне сдачи · числа пере-сняты третьим прибором парсер-свободно · деньги 0 платных путей при контроле 192 файла). Два мажора названы, остаток принят. ⚠ Моя ошибка смены: снёс её рабочий корень мутаций — норма записана выше. ⚠ В самой выдаче явно попрошено ВЕРНУТЬ заказ, если сессия не свежая: норма «новый пак — новой сессии» стоит на том, что карта чтения писана для свежего читателя, а занятость чужого контекста снаружи не видна |
| 14 | бэкенд | РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ: базис решённого как ИСТОЧНИК ОТВЕТОВ (ряд 130) + страж разрыва окон (ряд 490) | — (не выдан) | — | ⏳ **промт написан 17.09**, оба рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы, токен по адресу, коротких нет) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**. ⭐ Чем окупился опровергатель: (1) я вписал «текста в коде УЖЕ НЕТ, 0 совпадений» о строке, которая ЖИВА ДОСЛОВНО, — грепал по одному файлу, увидел начало длинной строки, обрезанной по ширине, и прочёл обрезок как ФАКТ; у неё вдобавок третий носитель, голден операторских сообщений, которого я не видел вовсе; (2) замер M1 был заказан на копиях купленных баз, а таблицы чанков в них НЕТ (17 и 16 таблиц) — предмет из них не строится, нужен исходник отдельным файлом; (3) порядок записи на границе стопа задаёт САМ КОД («последним пишется то, чья потеря дешевле»), и по нему базис идёт ПЕРЕД памятью флажка, а не пятым, как велел консилиум; (4) ширину отпечатка я заказал константой Go — это утечка пары в общий слой, закрытая `D39.50`, причём на денежном предикате. ⛔ **И урок абзацем ниже — про эту самую выдачу: приоритет пака у владельца я НЕ подтверждал.** Слот бэкенда свободен, но «слот свободен ≠ работу зоны надо заказывать»; поэтому промт лежит файлом, исполнитель не назначен, и решение о выдаче — за владельцем. ⚠ В самой выдаче, когда она состоится, повторить норму строки 13: ВЕРНУТЬ заказ, если сессия не свежая |
**ПОЛИГОН СНЯТ ВЛАДЕЛЬЦЕМ 11.09.** Я предлагал пак трижды — `ed`, `5c` (обе отработавшие, отказались ПО НОРМЕ и были правы) и свежей `37`, — после чего владелец сказал «полигон не надо выдавать». Выдача `37` ОТОЗВАНА тем же часом. ⚠ Урок не про полигон: **я трижды искал адресата для заказа, приоритет которого не подтверждал у владельца.** Слот зоны свободен ≠ работу зоны надо заказывать.
## Что я должен помнить, пока паки идут