diff --git a/docs/BACKEND_RUN_READINESS_SESSION_PROMPT.md b/docs/BACKEND_RUN_READINESS_SESSION_PROMPT.md new file mode 100644 index 00000000..870cec34 --- /dev/null +++ b/docs/BACKEND_RUN_READINESS_SESSION_PROMPT.md @@ -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 и условна; в первой редакции я указал именно её. + +⛔ **ЧИСЛА ПЕРЕ-СНЯТЫ, И МОИ ПРЕЖНИЕ ПРОМАХИВАЛИСЬ В 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?* Ответ «нет» — решение не готово, сколько бы тестов ни было зелёными. diff --git a/docs/README.md b/docs/README.md index fbc5320a..6da69827 100644 --- a/docs/README.md +++ b/docs/README.md @@ -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 |