Issue the backend pack that makes second-pair data reachable before the cold run, ordered so the loud refusal on the production config is lifted first

This commit is contained in:
heaven 2026-09-18 03:45:19 +03:00
parent cefedd0649
commit dbbfd522f9
2 changed files with 418 additions and 0 deletions

View file

@ -0,0 +1,417 @@
# Промт бэкенд-сессии: ДОСТИЖИМОСТЬ ПАР-ДАННЫХ — ЗАКРЫТЬ ДО ХОЛОДНОГО ПРОГОНА
> Выдан оркестратором очереди №23. Пак $0 по умолчанию. Зона записи — `backend/`.
> Ты не коммитишь: дерево передаётся оркестратору на лендинг.
>
> ⚠ **Редакция 2.** Первая переписана после опровергателя (восемь мажоров), пяти верификаторов и ревью
> сдавшей сессии. Из них: три моих якоря целили не туда, один пункт вынут из пака целиком, а один был
> сформулирован так, что его можно было закрыть честно и НЕ сделать. Числа помечены тем, чем сняты.
---
## 1. Какая проблема и что решит твой результат
Движок переводит книги мультиагентным пайплайном. Объявленная цель — **один общий движок, а пары языков
живут ДАННЫМИ**; «бэкенд только под китайский» есть объявленная АНТИЦЕЛЬ.
**Замер, ради которого стоит прочесть абзац целиком: языковых ВЕТВЛЕНИЙ в Go почти не осталось.** Греп по
не-тестовым файлам движка даёт шесть упоминаний кодов языка при контроле 154 файла, живых ветвлений из них
два, и оба законны и обоснованы на месте. ⇒ **остаточная зависимость движка от одной пары есть не ветвление
кода, а НЕДОСТИЖИМОСТЬ ДАННЫХ.** Твой предмет — не «убрать китайское из Go», а сделать так, чтобы данные
второй пары вообще доезжали.
Через несколько часов пойдёт **платный холодный прогон двух книг параллельно** — около 20 глав китайской и
английская книга сопоставимого объёма, обе через API платформы. Владелец ратифицировал траты и поставил
гейт: готовность бэкенда ратифицируется актом ДО прогона.
Критерий каждого твоего решения один: **заработает ли пара, которой в репозитории ещё НЕТ, без правки Go?**
**Слово владельца 18.09, дословно, сильнее любого моего пункта:** «Бэкенд не должен иметь конкретных
механизмов под язык\книгу, максимум в данных и то они так же должны хорошо отрабатывать где этих французских
слов нет». И: «пусть сессии не пишут воркэраунды и хаки».
---
## 2. Зона записи и git
Пишешь только в `backend/`. Чужие зоны — читать можно, править нельзя; расхождение там — пинг. Исключение
одно: своя секция в `docs/PROGRESS.md`. Ты не коммитишь. В дереве работают другие сессии — их
незакоммиченные файлы не трогай.
**НИКОГДА не читай `.env` и `.env.*`** — там боевые ключи.
---
## 3. Карта чтения — пять позиций, и она ЗАКОН
**Код-факты добываешь САМА: адреса ниже суть отправные точки, а не истина.** Три адреса первой редакции
указывали не туда, и нашла это проверка по содержимому, а не чтение.
1. `CLAUDE.md` — канон, цели, гардрейлы.
2. `backend/README.md` — устройство движка.
3. `backend/docs/EN_RU_PAIR_BASIS.md` — разбор английской пары предыдущей сессией. ⚠ Часть механизмов там
опровергнута замером; её §4.7 несёт находку, вошедшую в твой §4.7.
4. `docs/architecture/12-go-style-notes.md` — нормы стиля, больные места.
5. `docs/BACKLOG.md`, ряды **347 · 272 · 303 · 500 · 502**.
---
## 4. Работа
### 4.0 Порядок фиксирован, и это не пожелание
⛔⛔ **§4.1 ИДЁТ ПЕРВЫМ.** Причина механическая: **английская книга сегодня ОТКАЗЫВАЕТ на боевом конфиге до
первого цента.** Пока отказ стоит, остальные пункты нечем предъявить на предмете, ради которого пак
существует; любая «живая проба» на английской книге упрётся в тот же отказ, и соблазн будет прогнать её на
китайской и назвать результат общим. Это класс «утверждение удовлетворяется ЧУЖОЙ клеткой».
**ЛОВУШКА АДРЕСА, НА КОТОРОЙ ОШИБЛИСЬ ТРОЕ ПОДРЯД, включая меня.** Боевой гейт терминолога —
`backend/configs/pipeline-c1.yaml:157`=`enabled: true` под ключом `terminology:` (`:152`). На `:151` стои́т
ТАКОЕ ЖЕ `enabled: true`, но принадлежит ключу `banknote:` (`:144`). Якорь на `:151` зеленеет **на соседнем
гейте** и неотличим от правды. ⇒ свои якоря в этом файле проверяй печатью окрестности, а не поиском токена.
⚠ И этот файл сейчас незакоммичен: при лендинге строки могут уехать. Пере-нацель их первым делом.
**ДЕТЕКТОРЫ СМЫСЛА ИЗМЕРЕНЫ И НЕГОДНЫ — но это НЕ про перенос разметки.** Три кандидата на вердикт «это
стих» проверены: вложенность блока в блок ловит 37 из 88 и слепа к 51; семантика `epub:type`/`role` мертва на
ВСЕХ четырёх книгах проекта (у книги прогона 0 при контроле `class=` 17 955); статистика длин ловит 5 из 88.
**Клаузула, без которой §4.0 противоречит §4.3:** негодны детекторы **СМЫСЛА**. Перенос **РАЗМЕТКИ**
другой предмет, и там класс CSS есть единственный живой носитель. Не спутай: в §4.0 «класс» мёртв как
признак смысла, в §4.3 он жив как носитель разметки.
### 4.1 Английская книга не стартует на боевом конфиге — ОДНА причина, и она первая
**Стена, пере-снятая исполнением верификатором и подтверждённая сдавшей сессией:**
`backend/internal/pipeline/runner.go:364`=`if forWrite && r.Pipeline.Gates.Terminology.Enabled && r.pack == nil`
— на пути ЗАПИСИ прогон **ГРОМКО ОТКАЗЫВАЕТ** (`RefusalBadConfig`, текст «gates.terminology is enabled but
this book cannot mine a bank: it needs a langpack…»), когда гейт включён, а пар-пак пуст. Каталогов лангпаков
в дереве три — `ru`, `zh`, `zh-ru`; каталога `en-ru` **нет**.
**Формулировка важна: контур НЕ «тихо пропускается», он отказывает.** В первой редакции я написал
«пропускается», и исполнитель пошёл бы искать молчаливое место, которого нет.
**Почему нельзя просто положить каталог.** Пак без манифеста объявляет ВСЕ каналы, а объявленный канал
требует своих файлов ⇒ пустой английский пак потребует таблиц, которых у латиницы не бывает. Носитель —
`backend/internal/lang/langpack.go:644`=`manifest declares no channel`. Ряд **347** называет это прямо.
**ЧТО НЕ НАДО ПРОВЕРЯТЬ, потому что уже проверено:** валидатор лангпака **НЕ** зашит под китайскую форму —
чтение файлов канало-гейтед, и ратифицированное `D39.64` п.4 в коде ИСПОЛНЕНО, а не только объявлено. Первая
редакция заказывала эту проверку зря.
**РОВНО ТАК:** предмет — дать манифесту объявить НОЛЬ каналов и завести английский пар-пак так, чтобы он
грузился. ⛔ **Китайский пакет обязан остаться БАЙТ-ИДЕНТИЧНЫМ** — предъяви неподвижным хешем до и после.
Верификатор показал, что это достижимо; выйдет иначе — это находка, и её надо назвать, а не обойти.
**РЕШИ САМА:** состав данных английского пар-пака. ⛔ Значение НЕ подгоняется под книгу прогона: объясни, из
какого измеримого свойства ПАРЫ оно выведено, чтобы третья и четвёртая пара получили своё тем же способом.
**Что открывается даром вместе с этим пунктом — назови в отчёте:** английская книга сегодня не получает
детерминированного заголовка главы вовсе, потому что шаблон рендерится только при непустом паке.
### 4.2 Сайзинг терминолога: пар-путь есть у ДВУХ ручек из ТРЁХ
**Здесь первая редакция позволяла закрыть пункт честно и НЕ сделать работу.** Она говорила «параметризация
построена, строить нечего», а предметом называла две величины — ширину окна и размер батча. Проверка показала
бы, что ширина с диска доезжает (доезжает), пункт закрылся бы — и **китайский по форме батч уехал бы в
прогон**. Нашла это сдавшая сессия, ревьюируя промт; классом это «заказ, который можно исполнить отчётом».
**РОВНО ТАК: проверь ПОФАЙЛЬНО, у какой из трёх ручек пар-путь есть.** Парсер пар-файла принимает ровно три
ключа (`backend/internal/lang/langpack.go:783` — текст ошибки перечисляет их дословно). Пак влияет только на
две из них; третья берётся из явного ран-конфига, иначе из константы
`backend/internal/pipeline/terminologist.go:74`=`terminologyDefaultBatchRunes`. **Скажи, нужен ли пар-дом
третьей, и аргументируй.** Это деньги, а не эстетика: руны ханьцзы и руны латиницы несут содержания примерно
вчетверо по-разному ⇒ у английской книги батчей больше, вызовов больше, и берутся они из ПОЖИЗНЕННОГО
бюджета роли.
**НАЗОВИ ВСЕ ТРИ КЛЮЧА ЯВНО, когда будешь писать первый английский файл пары.** Третий ключ —
`basis_width` — единственный, чей тюнинг **ПЕРЕ-ПОКУПАЕТ БАНК**: его докблок (`langpack.go:143`) объясняет,
что склеенный с шириной окна он «invalidate every fingerprint of every book and re-buy each bank out of a
LIFETIME role budget». Заведёшь файл с одним ключом — второй останется на дефолте, и первый же его тюнинг
станет пере-покупкой.
**«Построено и запинено» ≠ «используется»:** файла сайзинга нет и у БОЕВОЙ пары (`configs/langpacks/zh-ru/`
несёт четыре файла, и `terminology.txt` среди них нет). ⇒ все ручки едут на дефолтах движка у обеих пар, а
пин доказывает путь, которым не пользуется никто. Не ищи у китайского референсный файл — его нет, и это не
твоя ошибка.
**МИНА, СВЯЗЫВАЮЩАЯ ЭТОТ ПУНКТ С 4.1.** Сегодня английская книга до сайзинга не доходит — она отказывает
раньше. Китайский дефолт станет достижим ровно в тот момент, когда ты закроешь 4.1. ⇒ **сайзинг обязан
приехать ТОЙ ЖЕ правкой**, иначе починка одной дыры молча откроет другую, и виноват будет твой пак.
⚠ Число, ходившее по нашим письмам, неверно: окно берётся в обе стороны, поэтому сорок рун на английской
прозе дают около шестнадцати слов, а не семи. **Считай сама, моим числам здесь не верь.**
### 4.3 Курсив не доезжает до модели — крупнейшая потеря качества на боевой книге
**Замер по коду, мой:** обходчик ингеста не различает инлайновую разметку ВООБЩЕ — ноль упоминаний `span`,
`i`, `em`, `italic`, `font-style`, `class=` на 1239 строк файла; безусловная запись текстового токена —
`backend/internal/chunk/ingest.go:1234`=`body.WriteString(text)`.
⚠ Соседняя `:1230` пишет то же, но она ВНУТРИ ветки ruby и условна; в первой редакции я указал именно её.
**ЧИСЛА ПЕРЕ-СНЯТЫ, И МОИ ПРЕЖНИЕ ПРОМАХИВАЛИСЬ В 24.5 РАЗА.** Бери эти (прибор: `python3` + `zipfile`
по epub книги прогона; контроль: 126 документов, 11 397 абзацев):
| предмет | число |
|---|---|
| носителей курсива всего | **4842** |
| тегов `<i>` / `<em>` | **0 / 0** |
| правил `font-style: italic` в CSS книги | ровно **одно**, класс `.italic` |
| **абзацев `<p class="italic">`** | **0 — ВСЕ носители суть `<span>`** |
| полностью курсивных абзацев | **937** (изолированных 619, в прогонах 318) |
| прогонов подряд ≥2 / строк в них | **92 блока / 318 строк** |
| частично курсивных абзацев | **2538** |
| коротких выделений (спан ≤3 слов) | **3481** |
**Самое важное здесь — строка про абзацы.** Моё прежнее описание «гимны набраны курсивными абзацами по
строке» **ЛОЖНО**: таких абзацев ноль. Сессия, посланная искать курсивные абзацы, найдёт ноль и может
заключить, что явления нет вовсе. Носитель один — спан.
**Цена маркера посчитана:** два знака на носитель даёт +0.6 % к объёму прозы. Литеральных звёздочек во входе
нет: в прозе epub — 0 при 1 588 694 прочитанных знаках, в четырёх китайских текстах — 0 при 38.9 МБ. ⇒
утверждение «китайский исходник маркеров не несёт» подтверждено с контролем.
**РОВНО ТАК — форма:** движок **НЕ выносит вердикт** «это стих», «это мысль», «это акцент». Он **доносит
структуру на провод**, а решает модель. Образец взят у зрелого конвертера, а не изобретён.
**РЕШИ САМА:** маркер, способ добычи курсивности (приор: единственное CSS-правило файла), нужен ли разбор CSS
или хватает сканера простых классовых правил. ⛔ Полноценный CSS-движок — велосипед, не строй.
**Три звена, все обязательны:**
- **(а) РЕШИ САМА:** ингест оборачивает курсивный текст маркером.
- **(б) РОВНО ТАК по форме, РЕШИ САМА по объёму:** в промте КАЖДОЙ пары появляется один языко-слепой абзац о
том, что маркер значит, инертный там, где маркеров нет. ⛔ **Цена этого звена названа, и она неочевидна:**
абзац в промте банк-роли пере-минтит её личность (`backend/internal/pipeline/bankbasis.go:183`) ⇒ решённые
термины перестают отдаваться из базиса и пере-спрашиваются из ПОЖИЗНЕННОГО бюджета роли; абзац в стадийном
промте двигает подпись промта в снапшоте ⇒ громкий ре-снапшот. **Взвесь, в промты каких стадий он нужен, и
назови цену каждого.** ⚠ И правка `translator.md` обязана уехать в `translator-banknote.md` ТЕМ ЖЕ
движением: иначе покраснеет пин зеркальности, а байтовый гейт при этом промолчит.
- **(в) РОВНО ТАК:** экспорт отображает маркер обратно, и поверхностей **ДВЕ**: тело главы пишется
`backend/internal/bookfile/epub.go:133`=`sb.WriteString(" <p>" + xmlText(p) + "</p>` (⚠ не `:128` — там
преамбула нулевой главы, я ошибся), и рядом второй писатель
`backend/internal/bookfile/txt.go:19`=`func WriteTXT(w io.Writer, b *Book) error`, вызываемый тем же циклом
сборки. **Маркер, отображённый только в epub, уедет читателю звёздочками в txt.**
**РЕШИ САМА, но предъяви:** знаменатели, которые сдвинет маркер — оценка токенов, коридор длины, доля письма
исходника, плотность. «Маркер не буква, границы ключей целы» есть утверждение, а не факт, пока не показано.
### 4.4 Пар-связанные ключи брифа сидят в пар-агностичном шаблоне книги (ряд 272)
**Цепь пере-снята ИСПОЛНЕНИЕМ через настоящий раннер:** шаблон книги несёт
`platform/deploy/README.md:222`=`transcription: palladius` и `:221`=`honorifics: keep` в КАЖДУЮ книгу →
движок принимает свободной строкой без валидации (`backend/internal/config/book.go:61`=`Transcription`) →
значение кладётся в плейсхолдер (`backend/internal/pipeline/render.go:207`=`"transcription"`) → и рендерится
в инструкцию. Английская книга получает на провод «Транскрипция имён и реалий: palladius» — систему для
КИТАЙСКОГО, молча, на всю книгу.
**Адрес денежного промта именно такой:** боевой конфиг ставит
`backend/configs/pipeline-c1.yaml:79`=`prompt_variant: banknote`, то есть на деньги уходит
`backend/prompts/en-ru/translator-banknote.md:5`=`Транскрипция имён и реалий`, а не `translator.md`.
Плейсхолдер несут **3 ролевых файла из 6** в каталоге пары (в каталоге есть ещё два класса ремонта, всего
восемь `.md` — считая `find`-ом, не удивляйся числу).
**Честно про величину: измеренного ущерба на английском тексте НЕТ**, и советчик считает его малым.
**Чинится как КЛАСС:** он повторится с каждой парой, а на японской книге тот же токен вреден по смыслу.
**РОВНО ТАК по инварианту:** множество допустимых политик объявляет ПАРА; книга выбирает ИМЯ; **Go не знает
ни одного имени политики**. Ключа в книге нет → пар-умолчание. Ключ есть, а пара имени не знает → **громкий
отказ до первой траты**. Прецедент того же рода уже ратифицирован в этом же загрузчике для двух других полей
— найди его и следуй ему, а не изобретай третий путь.
**РЕШИ САМА, и это несущее решение: ГДЕ живёт таблица политик.** Очевидный дом —
`backend/configs/pairs/<pair>.yaml` — имеет ловушку: **этот слой не фолдится НИ В ОДИН снапшот**, поэтому
правка ТЕКСТА политики двигала бы каждый хеш запроса и **молча пере-покупала бы книгу** — без отказа
ре-снапшота и без предупреждения. У проекта есть штатный дом для «пар-данные-ТЕКСТ, доезжающий до выхода»:
шаблон заголовка в лангпаке, который фолдится через версию пакета. ⇒ **выбери дом С ЦЕНОЙ НА РУКАХ и назови
её**; я снял с этого пункта «РОВНО ТАК» именно потому, что первая редакция навязывала дом, не посчитав цену.
⚠ Платформенная половина (убрать пар-связанные ключи из шаблона деплоя) — **ЧУЖАЯ ЗОНА**. Опиши в отчёте,
оркестратор отнесёт пингом.
### 4.5 Упор в баланс провайдера не имеет своего исхода — ряд 502
Провод классифицирует отказ по деньгам верно и под пином: терминальный, без пустых ретраев. **Но
типизированная ошибка не покидает пакет транспорта**, и перечислимых причин в движке 43, из которых ни одна
не про кредиты провайдера (контроль: строк со словом «reason» — 943). ⇒ «у провайдера кончились деньги» и
«стадия упала терминально» на уровне исхода неразличимы; тело отказа доезжает до человека только внутри
текста обёрнутой ошибки, то есть в журнале процесса.
Почему здесь: предстоит платный прогон двух книг, и прогон, встретивший отказ по балансу на середине,
останавливается наполовину купленным. Событие не гипотетическое — на одной оси замеров проекта 44 записи из
52 суть ровно такой отказ.
**РЕШИ САМА:** строить исход или объявить отложенным. ⛔ **Но исход обязан быть назван** — «сделано» либо «не
делаю, потому что …». В первой редакции этот ряд стоял в карте чтения и не имел работы, и опровергатель
поймал это как дефект заказа: пункт проваливался молча.
### 4.6 Ключи банка латиницей сталкиваются со строчными омографами — бьёт по приоритету №1
Находка предыдущей сессии, в первую редакцию НЕ попавшая. Нормализация ключа складывает регистр, поэтому у
латиницы имя собственное и обычное слово становятся одним ключом: замеренные пары — 167 против 143, 11 против
84, 155 против 2, и это **3 из 25** реально предложенных банкнотой поверхностей. Носитель разбора —
`backend/docs/EN_RU_PAIR_BASIS.md` §4.7.
⇒ это не опрятность: банк терминов английской книги получает склеенные ключи, а консистентность терминов
через книгу есть приоритет №1 владельца.
**РЕШИ САМА** форму лечения. **РОВНО ТАК** одно: оно не ветвится по языку. Свойство «регистр различает имя
собственное» принадлежит письменности, а не английскому; китайский его не имеет по построению, и правка
обязана быть инертна для него.
### 4.7 ЧТО ВЫНУТО ИЗ ПАКА — чтобы ты не вернула это по своей инициативе
**Детерминированный гейт латиницы слеп к диакритике** (считает буквами только ASCII, поэтому имя с
диакритикой распадается на осколки). Дефект настоящий, и он **вынут замером**: потребителей два, ремонт в
боевом конфиге выключен целиком (0 хитов слова `repair` в `pipeline-c1.yaml` при контроле 2 хита `gates` на
269 строк), а выход дешёвых гейтов — чистая наблюдаемость, «в отчёт, никогда не роняя чанк». ⇒ на ЭТОМ
прогоне он не меняет ничего, что видит модель или читатель, зато его обязательный бамп версии двигает
глобальную ось снапшота ОБЕИХ книг. **Цена есть, пользы для прогона нет.** Ряд остаётся открытым.
---
## 5. Самопроверка исполнением — и где у ЭТОГО пака мягко
Ревью исполнением обязательно: своего кода, своих проб, своих результатов. **Субагенты прямо разрешены.**
Сверх исполнения — адверсариальный проход по СВОЕЙ готовой работе; глубину и веер выбираешь сама.
**Fable 5 — ОДИН советчик на сессию, с постоянным контекстом.** Он советчик, не источник истины. ⚠ У меня он
дважды ошибся в адресах, включая файл, которого в дереве нет. Проверяй его так же, как меня.
**ПЯТЬ МЕСТ, ГДЕ ЭТОТ ПАК УЯЗВИМ ИМЕННО ПОТОМУ, ЧТО ОН ТАКОЙ:**
1. ⛔ **Закрыв четыре пункта из шести и не закрыв 4.1, ты получишь ЗЕЛЁНУЮ БАТАРЕЮ на книге, которая всё
равно откажет.** Пункты 4.24.6 невозможно предъявить на английской книге, пока стоит отказ пустого пака,
и любая проба на китайской книге будет замером в чужой клетке.
2. **Маркер курсива уходит в текст, который считают ЧЕТЫРЕ прибора, и ни один об этом не знает.** Дефект тут
не покраснеет: числа просто станут другими, а «другое число» и «верное число» выглядят одинаково.
3. **Экспортных поверхностей две, и вторая молчит в тестах ингеста.** Забытое отображение вылезет в файле у
читателя — после прогона и после денег.
4. **Данные английской пары зеленеют при ЛЮБОМ содержании.** Ни один гейт не судит, хороши ли значения, —
только что файл разобрался. Единственный рубеж содержимого — твой советчик и твой довод «откуда взято
значение». Назови это прямо, не выдавая зелёный разбор за подтверждение содержимого.
5. ⛔ **ТРИ ЛОЖНЫЕ ПОБЕДЫ, переданные сдавшей сессией — каждая выглядит закрытым пунктом и им не является:**
- **бампнуть версию промта, чтобы «починить» байтовый гейт** — пере-именует ключ ВТОРОЙ пары, у которой
байты не двигались, и превратит реестр в носитель ложного утверждения. Лечение — сделать лейбл
пар-скоупным, а не бампать. Условие протухания нынешнего «безвредно» названо заранее: **первая же
покупка на английской книге**;
- **положить `em`/`i` в список блочных тегов** — не починка курсива, а ВТОРАЯ порча: теги инлайновые, и ты
получишь разрыв абзаца на каждом из тысяч выделений. Блочных тегов там 31, определение на
`backend/internal/chunk/ingest.go:976`=`var blockTags = map[string]bool{`;
- **завести файл структуры для английского языка** — выглядит дешёвой победой: дверь открыта, загрузчик
прочтёт, отчитаться легко. Но манифест на контрольной английской книге побайтно тот же и с файлом, и без
него: маркерная грамматика до не-CJK текстового пути не доходит (ряд **303**). ⇒ либо чинится путь и
ТОГДА заводятся данные, либо данные не заводятся вовсе.
⭐ Общее у всех трёх и у дефекта §4.2: **артефакт появился, а поведение не изменилось.** У каждого своего
пункта спрашивай не «сделано ли», а **«что в поведении дерева стало другим и чем я это предъявлю»**.
**ДИСЦИПЛИНА НАД ВСЕМ ПАКОМ, А НЕ НАД ОДНИМ ПУНКТОМ: китайская половина не должна сдвинуться.** Глобальные
оси снапшота двигают ТРИ твоих пункта: правка ингеста по конвенции проекта бампает версию нарезки, правка
промта пары двигает стадийную подпись, правка правил дешёвых гейтов — их версию. Все фолдятся БЕЗУСЛОВНО, то
есть у ОБЕИХ книг. ⇒ **предъяви один раз на пак, что китайский провод байт-идентичен**, и делай это ПЕРВЫМ
замером после каждой правки, а не последним.
---
## 6. Оси ревью
- **Код:** батарея + живые пробы + СВОИ адверсариальные посадки вне твоего же списка. Пак, меняющий
отгружаемые байты, принимается прогоном через настоящий драйвер, а не чтением диффа.
- **Швы:** у стыка с экспортом и с платформой — инвентарь ВСЕХ каналов другой стороны чтением ЧУЖОГО кода.
- **Данные:** каждое значение — с доводом, откуда выведено; «по аналогии с китайским» доводом не является,
если не назван признак, по которому аналогия законна.
Вправе заменить ось с аргументом.
**Кодовому паку дополнительно, и это обязательно:**
- ⛔ **пин на УСЛОВНОЕ сообщение обязан иметь фикстуру, где оно ОБЯЗАНО прозвучать.** Твой §4.1 и §4.4
заказывают громкие отказы — тест, утверждающий только молчание, вакуумен ровно там, где сообщение ложно;
- перед отчётом сверь КАЖДЫЙ клейм с результатом инструмента ЭТОЙ сессии;
- последний абзац отчёта оказался планом или обещанием — сделай сейчас, а не обещай;
- ⛔ **править или удалять тесты ради зелени НЕДОПУСТИМО.** Твои бампы версий гарантированно покрасят
голдены; правка, вызванная ЗАКАЗАННОЙ сменой поведения, — обслуживание, и она ОБЪЯВЛЯЕТСЯ: что изменилось,
какой тест это описывал, куда уехала гарантия. Правка «чтобы прошло» — нет;
- дифф `^func Test` предъявляй исполнением, а не памятью;
- в длинной сессии — интервальная самоверификация субагентом против ЯВНЫХ критериев.
---
## 7. Записка-план
До первой правки кода — короткая записка: что делаешь по каждому пункту и что считаешь спорным. Присылай
оркестратору. ⚠ Порядок работ запиской НЕ решается: §4.1 первым, это задано.
---
## 8. Заявление есть команда
Каждое число и каждая категоричная фраза отчёта — с командой, которой получена. Приёмка пере-снимает.
У каждого НУЛЯ печатай контрольную величину, доказывающую, что прибор спросил существующий предмет.
**Ловушки среды, каждая даёт тихий ложный ноль:**
- обёртка `grep` чтит `.gitignore` и не видит `books/` — по корню бери `command grep`;
- `find` здесь **bfs**, и дефекта у него ДВА: относительное время принимает только `-mmin` (форма
`-newermt '-10 minutes'` даёт ошибку, а с `2>/dev/null` — чистый ноль), и он **тоже чтит игнор-файлы**,
поэтому книги под `books/` им не находятся вовсе (проверено: поиск epub даёт 0 при трёх существующих
файлах, а `ls` их видит);
- `sqlite3` как CLI нет; базы читать `python3`, только на чтение, и только на копиях;
- ⚠ и одна не про среду, а про счёт: **знаки и байты — разные популяции.** Кириллица весит два байта, и
`len()` против `wc -c` разойдутся в 1.7 раза на русском тексте. Я на этом сегодня попался.
---
## 9. Эхо старта
До работы — ≤10 строк **СВОИМИ словами**: скоуп · инварианты · чего не делаешь. Дословный пересказ промта
подтверждает канал, но не понимание, и повторяет ошибку промта вместе с ним. Шли первым действием.
---
## 10. Что НЕ удалось и где прибор слеп
Обязательная секция, две половины. Первая — «что не получилось». Вторая — **«что ты знаешь и не сказала»**:
что невидимо · почему не чинила · чем закрывается.
⭐ **В коде названо, в отчёте нет — значит для следующей смены НЕ названо.**
---
## 11. Канал вопросов и право отказаться
Конфликт промта с кодом или доками — **пинг, а не интерпретация**. У тебя есть право сказать «этого делать не
надо» с аргументом, и это поощряется.
⚠ Эта редакция родилась из восьми мажоров опровергателя и ревью сдавшей сессии: три моих якоря целили не
туда, один пункт вынут целиком, а §4.2 был сформулирован так, что его можно было закрыть честно и не сделать
работу. **Нашла ещё — говори: это починка промта, а не придирка.**
⚠ И одно противоречие называю сам: приоритет ряда 347 в трекере — «когда-нибудь», а промт трактует его как
первый пункт. Прав промт: ряд писался до того, как прогон стал делом часов.
---
## 12. Прямой канал
Механизм — `CLAUDE.md` §«Связь между сессиями», файл `/tmp/textmachine-channel`. Впиши туда свой блок первым
делом. ⚠ Адрес из файла не доказывает, что сессия жива: сверься с `ListAgents`. Нужной роли нет — канала нет,
и это нормально: вопрос секцией в отчёт, работа продолжается.
---
## 13. Когда пак считается завершённым
Ты доводишь работу до конца САМА. Приёмка идёт последней и вторым кругом тебе не служит.
- [ ] У каждого из пунктов §4.1§4.6 — исход: сделано · не делаю с доводом · пинг. **Шесть пунктов, и §4.5
тоже требует исхода**, а не молчания.
- [ ] **Английская книга доезжает на БОЕВОМ конфиге** — предъявлено прогоном, а не рассуждением.
- [ ] **Китайский провод байт-идентичен** — предъявлено хешем, один раз на пак.
- [ ] Круги СОШЛИСЬ: последний не дал НОВЫХ находок; прежние закрыты таблицей «находка → что сделано → **чем
предъявлено**».
- [ ] ⛔ **Таблица мутаций полная, и у неё ТРИ исхода, а не два: поймано · выжило · НЕ ИЗМЕРЕНО.** Третий —
это записи, у которых базовый прогон пакета не был зелёным, команда не собралась или фикстуре сбросили
соединение. **Неизмеренное, прочитанное как пойманное, хуже выжившего: оно закрывает вопрос, не задав
его.** С двумя исходами можно честно отчитаться «выживших нет», имея неизмеренные записи.
- [ ] **Числа сняты ПОСЛЕ последней правки.**
- [ ] Гейт зоны прогнан целиком; названо, ЧТО прогнано; рядом с числом `ok` напечатан счёт скипов.
- [ ] Всё живое — в ДЕРЕВЕ, а не в письме.
- [ ] Явное **«работа завершена, править не планирую»**.
**И последнее.** Предмет пака — не «починить английскую книгу», а **сделать данные второй пары
достижимыми**. Проверка каждого решения одна: *заработает ли пара, которой в репозитории ещё НЕТ, без правки
Go?* Ответ «нет» — решение не готово, сколько бы тестов ни было зелёными.

View file

@ -24,6 +24,7 @@
- **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог):
| Роль | Активный промт | Статус |
|---|---|---|
| **Бэкенд · ДОСТИЖИМОСТЬ ПАР-ДАННЫХ (готовность к прогону)** | [BACKEND_RUN_READINESS_SESSION_PROMPT.md](BACKEND_RUN_READINESS_SESSION_PROMPT.md) | **ВЫДАН 18.09** свежей сессии `textmachine-main-c8`. Предмет — не «убрать китайское из Go» (ветвлений там почти не осталось: 6 упоминаний кодов языка при контроле 154 файла, живых два и оба законны), а **недостижимость данных второй пары**: английская книга сегодня ГРОМКО отказывает на боевом конфиге до первого цента. Шесть пунктов, порядок ФИКСИРОВАН — §4.1 первым, иначе остальные нечем предъявить. Редакция 2: первая переписана после опровергателя (8 мажоров), пяти верификаторов и ревью сдавшей сессии — три якоря целили не туда, один пункт вынут замером (гейт латиницы: на этом прогоне не меняет ничего, что видит модель, а бамп версии двигает снапшот ОБЕИХ книг), а §4.2 был сформулирован так, что его можно было закрыть честно и НЕ сделать работу. Оба рубежа пройдены: механическая сверка 13 блоков (13 якорей, битых 0, коротких 0, голых адресов 0) и субагент-опровергатель |
| **Бэкенд · АНГЛИЙСКАЯ ПАРА en→ru** | [BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md](BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md) | **ВЫДАН 17.09** сессии `textmachine-main-c5` (холодная по всем трём носителям: блока в канале нет, упоминаний в живых доках нет, в D-логе ноль). ⭐ **Центр пака — СЛОЙ ДАННЫХ английского языка** (слово владельца 17.09: «код может быть и да, но вот данные надо написать… уникально описать английский язык… от этого качество перевода зависит»); китайский берётся как образец ФОРМЫ вопросов, ответы пишутся английскими категориями. Две стены (`EXIT 10`): нет промт-пакета пары и гейт терминолога при пустом паке. Тихое: порог эха `0.15` унаследован от китайского бенчмарка и на латинице ЭСКАЛИРУЕТ ложно; второй детектор латиницы работает без гейта и требует аллоу-листа, а не правки порога. Материал — Кристофф «Империя рассвета», мера по ТОКЕНАМ (решение владельца). Fable 5 разрешён исполнителю ОДИН, под верификацию данных. Два рубежа пройдены: механическая сверка 13 блоков (27 адресов, битых 0) и субагент-опровергатель — **15 находок, 9 приняты, 6 уточнены моими числами**, включая ЧЕТЫРЕ моих ошибки популяции. $0 по умолчанию |
| Платформа · ПРОГОН НЕ ВРЁТ О СЕБЕ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 17.09** — акт **D39.265** (32 пути, $0, контрактный минор **0.17.0**); промт в [archive/prompts/](archive/prompts/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md) с баннером-исходом. Ряды **398** · **399** · **400** · **486** закрыты работой, **394** и **396** — ПЕРЕ-РЕШЕНИЕМ (четвёртое значение в клиентский словарь не идёт: «мы сами перестали перезапускать» — другая ось, чем «стоит ли повторять», и границу между осями стережёт новый гейт на три носителя), **416** — платформенной половиной. Кампания пере-снята приёмкой: 26 записей · поймано 25 · выжила 1, объявленная ДО прогона · неизмеренных 0. ⛔ Гейт зоны красен на экземпляре ряда **484** (фикстурный бюджет записи под нагрузкой; оба упавших теста живут в чистом `HEAD`) — названо границей, а не зеленью. ⚠ Две ошибки приёмки названы в акте: оркестратор взял себе правку канона (откачена) и неточно сформулировал §4.1 промта. Живое — ряды **416** (движковая половина) · **484** · **493** · **494** |
| Бэкенд · РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 17.09** — акт **`D39.266`** (`d25e418`, 32 пути, $0); промт в [archive/prompts/](archive/prompts/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md) с баннером-исходом. Решённая строка переживает покупку: носитель — таблица `bank_basis`, миграция v19, аддитивная. Ряд **490** закрыт по трём условиям, **130** получил ТРЕТИЙ исход (замысел достигнут другим механизмом, стоп-решение за владельцем), два отказа с замером, заведён **496**. Числа приёмки оркестратора: кампания **315/315 поймано, выживших 0, неизмеренных 0**; M1 — **67 из 69** и **64 из 66** обслужено из памяти. ⛔ Приёмка нашла две дыры ОДНОГО класса — не неверное число, а отсутствующее утверждение — и купила норму «сверять перечень заказа по СПИСКУ ЗАКАЗЧИКА». Выдавался 17.09 сессии `textmachine-main-57` (свежая: паков не брала, контекст пуст — проверено опросом, а не списком). ⚠ Свежих нашлось ДВЕ; вторая (`textmachine-main-78`) оставлена нетронутой, ей сказано не читать промт и не занимать зону — один промт на зону. Предмет: движок на каждой покупке заново платит банк-ролям за решённые термины — 12 из 69 и 14 из 66 смен передачи при неизменной улике у 25 из 26 строк; потолки ролей ПОЖИЗНЕННЫЕ. Строит базис решённого (ряд **130**) и стража разрыва окон (ряд **490**). Два рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**, включая мою ложь «текста в коде нет» о живой строке и материал замера, из которого предмет не строился. $0 |