# Промт бэкенд-сессии: ДОСТИЖИМОСТЬ ПАР-ДАННЫХ — ЗАКРЫТЬ ДО ХОЛОДНОГО ПРОГОНА > Выдан оркестратором очереди №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 и условна; в первой редакции я указал именно её. ⛔ **ЧИСЛА ПЕРЕ-СНЯТЫ, И МОИ ПРЕЖНИЕ ПРОМАХИВАЛИСЬ В 2–4.5 РАЗА.** Бери эти (прибор: `python3` + `zipfile` по epub книги прогона; контроль: 126 документов, 11 397 абзацев): | предмет | число | |---|---| | носителей курсива всего | **4842** | | тегов `` / `` | **0 / 0** | | правил `font-style: italic` в CSS книги | ровно **одно**, класс `.italic` | | **абзацев `

`** | **0 — ВСЕ носители суть ``** | | полностью курсивных абзацев | **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("

" + xmlText(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/.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.2–4.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?* Ответ «нет» — решение не готово, сколько бы тестов ни было зелёными.