417 lines
44 KiB
Markdown
417 lines
44 KiB
Markdown
# Промт бэкенд-сессии: ДОСТИЖИМОСТЬ ПАР-ДАННЫХ — ЗАКРЫТЬ ДО ХОЛОДНОГО ПРОГОНА
|
||
|
||
> Выдан оркестратором очереди №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** |
|
||
| тегов `<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.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?* Ответ «нет» — решение не готово, сколько бы тестов ни было зелёными.
|