textmachine/docs/BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md

427 lines
45 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Бэкенд-пак: АНГЛИЙСКАЯ ПАРА en→ru — движок обязан ЗАПУСТИТЬСЯ и отдать книгу, которую можно читать
> Выдача №15 очереди №23. Зона — `backend/`. Пак **$0 по умолчанию**; единственный платный шаг назван в
> §4.10 и без моего слова не делается.
> ⚠ **Числа и адреса этого промта сняты МНОЙ по дереву 17.09, каждое — названным прибором.** Те, на
> которых ты строишь решение, пере-сними своим: заимствованное число улики не заменяет.
> ⛔ **И честно о цене этого правила: первая редакция промта содержала ЧЕТЫРЕ моих ошибки**, все нашёл
> опровергатель, и все — одного класса: **число снято не на той популяции**. Я мерил текст документа там,
> где движок читает ГРУППУ документов; цитировал отозванную формулировку ряда, не прочитав его баннер;
> обрезал строку ноты на 200 знаках и заключил, что тела нет. Ниже — исправленное. Считай это не
> извинением, а описанием того, как именно здесь ошибаются.
## 1. Какая проблема и что решит твой результат
Проект объявляет: движок один, пара — ДАННЫЕ, и ревью-вопрос по умолчанию — «заработает ли пара, которой
в репо ещё нет, без правки Go?». На английском ответ сегодня — **нет, и даже не «плохо», а «не стартует»**.
Замерено мной:
- `backend/configs/pairs/en-ru.yaml`**293 байта, 6 строк**: только `pair: en-ru` и коридор
`len_ratio_bounds: [0.70, 1.4]`. ⭐ Его собственный комментарий уже называет обе стены: «своей калибровки
нарезки нет, пакета промптов `prompts/en-ru/` нет (книга на этой паре упадёт громко на загрузке)».
**Это не открытие пака — это пин в данных, написанный раньше нас.**
- `backend/prompts/`**один** пакет (`zh-ru`, 11 файлов). `backend/configs/langpacks/`**три**
(`ru`, `zh`, `zh-ru`).
- Целевой слой (русский) привязан к **ЦЕЛИ**, а не к источнику ⇒ английская пара наследует слой 7,
банк-инъекцию и читательские слова **бесплатно**. Работа лежит на осях ИСТОЧНИК и ПАРА.
**Твой результат:** английская книга проходит от интейка до файла, который читает человек, а деньги, эхо и
нарезка ведут себя на латинице так же честно, как на китайском.
**Три решения владельца (17.09) — исполняются, не обсуждаются:** книга — **«Империя рассвета»**
(Кристофф, том 3 «Империи вампиров», `books/Kristoff_Jay_-_Empire_of_the_Vampire_3_-_Empire_of_the_Dawn.epub`,
18 634 457 байт, в дереве); размер среза меряется **по токенам** — равной работой и деньгами; **эксперимент
двух переводов идёт ПОСЛЕ этого пака**, обе половины сразу.
## 2. Зона записи и git
Пишешь `backend/` и свою секцию в `docs/PROGRESS.md`. **Не коммитишь** — дерево передаёшь мне. Чужие
незакоммиченные файлы не трогаешь. **`.env` не читаешь никогда.** Запрещены `git add -A` / `git add .` /
`git commit -a`, `reset --hard`, переписывание истории, `checkout` поверх грязного дерева. Книги и
производные не коммитятся: `books/` — симлинк в отдельный репозиторий со своим origin.
**`books/` невидим двум приборам сразу, и оба дают ложный ноль:** обёртка `grep` чтит `.gitignore`, а
`find` не спускается в симлинк без `-L`. Замер: `find books -type f`**0**, `find -L books -type f`
**10534**. Бери `command grep` и `find -L`, и печатай знаменатель рядом с любым нулём.
**ВХОД ЗОНЫ.** Дерево передаётся тебе ПОСЛЕ лендинга предыдущего пака (`backend/` сейчас держит 31
незакоммиченный путь чужой банк-работы). Твоя первая команда — `make battery` на полученном дереве, и её
результат ты **записываешь числом в записку-план как ВХОДНУЮ строку**. Красное на входе — пинг мне, а не
починка: это не твой предмет.
## 3. Карта чтения — ЗАКОН, пять позиций
1. `CLAUDE.md` (корень) — канон, гардрейлы, роли зон.
2. `docs/architecture/09-target-architecture.md` §0.1 и §Цели — почему пара это ДАННЫЕ.
3. `docs/architecture/12-go-style-notes.md` §1 — норматив зоны.
4. `docs/experiments/00-provider-quirks.md` — провайдерские ловушки, ПЕРЕД правкой вызовов.
5. `docs/experiments/01-token-calibration.md` — калибровка: английский **3.64** знака без пробелов на
токен, китайский **1.38**.
**Код первичен:** адреса ниже — отправные точки, не истина.
## 4. Что построить
### 4.1. ОСТАНОВКА ПЕРВАЯ — до единой строки кода. ДЕЛАЙ РОВНО ТАК
**Слово владельца:** «обязательно остановись на селф ревью и выдай сессии… фабла5 который верифицирует
алгоритм исполнения и данных в бэкенде для английского + адверсариальное селф ревью и контроль исполнения».
1. **Инвентарь исполнением.** Пройди путь английской книги СВОИМИ прогонами и выпиши, где он встаёт.
Отправные точки (все четыре проверены мной по содержимому цели):
`backend/internal/config/pipeline.go:1063` · `backend/internal/pipeline/runner.go:364` ·
`backend/internal/lang/structure.go:158-161` · `backend/internal/pipeline/runner.go:432-439`.
2. **Прочитай, что УЖЕ померено живьём на этой самой книге** — ряд **315** бэклога закрыт замером 06.09:
`tmctl manifest`, `EXIT 0`, $0, `structure: declared`, **71 глава / 351 юнит / 356 чанков**, нумерация
плотная 1..71, `title_raw` на проводе 71 из 71, `heading` пуст у ВСЕХ глав. ⛔ Не открывай это заново.
3. **Подними советчика Fable 5 — ОДНОГО, с постоянным контекстом** (`model: "fable"` явно; канон: один
фабл на сессию, вопросы ДОСЫЛАЮТСЯ тому же агенту, второго не поднимают). Предмет задай: «вот алгоритм
исполнения английской пары и данные, которые я заведу; найди, где он ломается на латинице и где данные
не выражают того, что обещают». Он **советчик, а не источник истины** — посылки проверяются деревом.
⚠ Обычные субагенты потолком не ограничены; их поднимать разрешаю явно.
4. **Только после этого** — записка-план (§7) и первая строка кода.
### 4.2. Стена 1 — промт-пакет пары. Это СОДЕРЖАНИЕ, и оно главное. РЕШИ САМА состав
Загрузчик ищет промт по конвенции `<promptsRoot>/<пара>/<роль>.md`
(`backend/internal/config/pipeline.go:545`); файла нет — `RefusalBadConfig`, `EXIT 10`.
**Стена НЕ абсолютна, и это уже использовано:** у пар-конфига есть ручка `prompts_root`
(`backend/internal/config/pair.go:33`), и именно ею предыдущий пак прогнал ЭТУ книгу без каталога
`prompts/en-ru/` в дереве (ряд 315). ⇒ **пакет строится не для того, чтобы обойти стену, а потому что он
ПРОДУКТ** — прямой рычаг против translationese, цель №1 канона.
⛔⛔ **И ВОТ ГЛАВНОЕ В ЭТОМ ПАКЕ — СЛОВО ВЛАДЕЛЬЦА 17.09, ДОСЛОВНО:** «код может быть и да, но вот
**данные надо написать**. Посмотреть на китайский и по аналогии, но при этом **уникально описать
английский язык**. Это очень важно так как от этого **качество перевода зависит**. Именно поэтому я тебе и
разрешал выдать фабла 5 другой сессии которая этот пак будет исполнять».
**Центр пака — не стены и не тихие дефекты, а СЛОЙ ДАННЫХ АНГЛИЙСКОГО ЯЗЫКА.** Китайский смотришь как
образец ФОРМЫ — какие вопросы язык обязан о себе ответить, — и отвечаешь на них **про английский, его
собственными категориями**. ⛔ Перенос китайских категорий на латиницу — это и есть та «копия без
предмета», которая зеленеет и портит перевод молча.
**Образец в числах (замер мой, непустые строки).** `configs/langpacks/zh/` — одиннадцать обязательных
таблиц канала морфологии, и вот их наполнение: `title-suffix` 26 · `ordinal-title` 15 ·
`surnames-compound` 15 · `rank-word` 8, а `alias-particle` · `grade-prefix` · `numeral` ·
`sentence-terminator` · `surnames-single` · `title-formant` · `topo-suffix` — по **одной**.
`configs/langpacks/zh-ru/` — четыре файла пары: `palladius` 87 · `dc-checkers` 42 ·
`palladius-phonotactics` 16 · `heading` 1. `configs/langpacks/ru/reader.txt` — 7 строк, и **его английская
пара наследует даром**: целевой слой привязан к цели.
**Отсюда свобода, которую надо знать до начала:** загрузчик требует, чтобы объявленная таблица была
**НЕПУСТОЙ**, а не полной (`backend/internal/lang/langpack.go:519-529`, каждая строка — `req(...)`). Семь
китайских таблиц из одиннадцати удовлетворяют это одной строкой. ⇒ **английский вправе описать себя
по-своему и коротко там, где ему нечего сказать, — но НЕ вправе соврать**, положив туда китайское.
**Что английский обязан рассказать о себе, и чего в китайском нет вовсе** (это направление, а не список —
состав решаешь ты и защищаешь аргументом):
- **Регистр как сигнал имени.** В китайском регистра нет; в английском заглавная буква — главный носитель
«это имя собственное», и нормализация ключа его СТИРАЕТ (§4.7). Что тогда несёт сигнал?
- **Частицы и приставки фамилий** — `de` · `van` · `von` · `O'` · `Mc` · `Mac` · `Fitz`: где кончается
частица и начинается имя, и как это едет в русский.
- **Титулы и звания** — их у английского два слоя: препозитивные (`Sir`, `Lord`, `Captain`) и
постпозитивные (`Jr.`, `Sr.`, `PhD`), и китайская таблица `title-suffix` описывает только второй род.
- **Дефисные и многословные имена собственные**, которых китайская односложная морфология не знает.
- **Топонимические форманты** — `-ton`, `-shire`, `-ville`, `-burg`: аналог `topo-suffix`, но с другой
механикой границы слова.
- **Числительные словами** — `One`, `Twelve`, `Thirty-first`: в китайском это иероглифы-цифры, в
английском слова, и именно на этом ломается разрез глав (§4.4).
- **Терминаторы предложения и сокращения**, где точка не кончает предложение (`Mr.`, `St.`, `vs.`) —
⚠ секция `en` в `backend/internal/lang/data/sentence-abbrev.txt` уже существует и её НЕ дублируй.
**ТРАНСЛИТЕРАЦИЯ — ОТДЕЛЬНЫЙ ВОПРОС, И ОТВЕТИТЬ НА НЕГО НАДО ЯВНО.** Канал транслитерации требует
поимённо пиньинь-категории (`backend/internal/lang/langpack.go:531-540`): `palladius/initials` · `finals` ·
`yw` · `special_i` плюс три фонотактических. Английская практическая транскрипция — **другая система**, и
в этой схеме она невыразима. Штатный механизм для источника, который НЕ везёт этот канал, в движке есть:
`manifest.txt` объявляет, какие каналы источник ШЛЁТ (`backend/internal/lang/langpack.go:612`), и
`D39.64` (строка реестра `docs/architecture/05-decisions-index.md`, пункт П4) ратифицировала ровно это
намерение — источник без пиньинь-морфологии грузится без палладиевых файлов.
**Механизм подтверждён МОИМ чтением по пяти точкам, а не предположен** (`backend/internal/lang/langpack.go`):
манифест отсутствует ⇒ включаются ВСЕ каналы (`:624`=`no manifest → every channel`); пустое объявление
падает громко (`:644`=`manifest declares no channel`); файлы пары читаются ТОЛЬКО под гейтом канала
(`:280`=`if channels[channelTransliteration]`); требование пиньинь-категорий стоит под тем же гейтом
(`:531`=`if p.channels[channelTransliteration]`); свёртка хеша оверлея отсутствующий файл ТЕРПИТ
(`:410`=`if !ok {``return nil`). ⇒ **`en/manifest.txt` с единственной строкой `channel<TAB>source-morphology`
снимает пиньинь целиком, без единой строки Go.**
**ДЕЛАЙ РОВНО ТАК: проверь этот путь СКВОЗНЫМ прогоном первым делом** — моё чтение говорит, что он
работает; твой прогон говорит, что он работает НА САМОМ ДЕЛЕ, и это разные утверждения.
⚠ Разойдётся — это находка, пинг мне, и заказ меняется.
⚠ И назови в отчёте цену выбранного пути: без канала транслитерации передача английских имён в русский
держится промтом и сидом, а не движком.
**Советчик Fable 5 (§4.1) поднимается ИМЕННО ПОД ЭТО.** Слово владельца связывает его с данными прямо:
он верифицирует «алгоритм исполнения И ДАННЫХ в бэкенде для английского». Спрашивай его не «хорош ли
файл», а **«что английский язык обязан о себе сказать, чтобы перевод не стал translationese, и чего в
моём описании не хватает»**. Его посылки проверяй деревом.
Состав живой пары `zh-ru` — 11 файлов: `translator.md` · `editor.md` · `editor-mono.md` ·
`terminologist.md` · `classifier.md` · `translator-banknote.md` · `judge-selector.md` и `repair/` с
четырьмя (`broken_word` · `dc1_fractional` · `dc1_time_units` · `latin_residue`).
**РЕШИ САМА, с аргументом**, какие нужны английской паре. Мой приор, опровергаемый твоим замером:
`dc1_fractional` и `dc1_time_units` — про китайские числительные и часы, предмета у латиницы нет.
**Не копируй файл, у которого нет предмета: копия без предмета — вид лжи, которая зеленеет.**
**НО У ЭТОГО СОВЕТА ЕСТЬ УСЛОВИЕ, И БЕЗ НЕГО ОН ОПАСЕН.** `loadRepairTemplates`
(`backend/internal/pipeline/repair.go:151`) возвращает `nil` сразу при выключенном гейте (`:152-154`), а
при ВКЛЮЧЁННОМ отсутствие файла класса — **громкий отказ с именем пути** (`:170-172`). Дефолтный набор
актуаторов — ровно два класса, и первый из них `RepairLatinResidue` (`:117-120`). Сегодня совет безопасен,
потому что `gates.repair` не включён нигде: **0 из 5** файлов `backend/configs/*.yaml`; единственное
упоминание в 26 конвейерах книг — комментарий, прямо говорящий «repair выключен». ⇒ **условие названо:
совет держится, пока гейт выключен; включишь — отсутствие файла станет падением.**
Пиши промты как переводчик, а не как инженер: английский источник несёт то, чего нет в китайском — артикли,
время глагола как носитель сюжета, атрибуцию прямой речи внутри абзаца. Русские целевые данные НЕ трогаешь.
### 4.3. Стена 2 — гейт терминолога. ДЕЛАЙ РОВНО ТАК: сперва путь данными
`backend/internal/pipeline/runner.go:364`: при `forWrite && Gates.Terminology.Enabled && r.pack == nil`
отказ. Замер со знаменателем: гейт включён в **трёх** конфигах из четырёх (`backend/configs/pipeline-c1.yaml:150`,
`backend/configs/pipeline-arm-glm.yaml:60`, `backend/configs/pipeline-arm-mistral.yaml:67`); у `pipeline-c2.yaml` секции нет, но ⚠ это
**не обходной путь**: `c2` — скелет ДРУГОГО ядра (generate-then-select), неисполнимый раннером фазы 0.
**Путь данными существует.** Гейты живут в ПАЙПЛАЙН-файле, который книга называет полем `pipeline:`
(`backend/internal/config/book.go:79`). Замер: **все 23** `book.yaml` объявляют конвейер, из них **19**
называют `pipeline.yaml` и **4** — не-дефолтное имя. ⇒ конвейер английской книги с выключенным
`gates.terminology` снимает отказ **без единой строки Go**.
**Правку Go под ряд 347 НЕ делай без моего слова:** ряд **35** предупреждает, что снятие отказа без
не-Han детектора «обещает больше, чем покупает» — банка на латинице всё равно не будет.
**Назови цену пути данными в отчёте:** без добытого банка нет сквозной консистентности терминов, то есть
частично теряется цель №1. Вторую цену движок называет сам (`backend/internal/pipeline/runner.go:380`): канал банкноты при пустом
паке **платит за выход, который никто не прочтёт** — гаси `gates.banknote` тем же конфигом.
### 4.4. Нарезка глав — предмет ПЕРЕ-ОПРЕДЕЛЁН. РЕШИ САМА форму, но популяцию бери движковую
⛔⛔ **ЧИТАЙ ЭТО КАК ПРЕДУПРЕЖДЕНИЕ О МЕТОДЕ.** Первая редакция промта утверждала «71 глава, из них 67
ПУСТЫ». Это было **ложно**, и ложно ровно потому, что число снято не на той популяции: я померил текст
документа-цели `navPoint`, а движок читает **ГРУППУ**. `groupChapters`
(`backend/internal/chunk/epubtoc.go:293-321`) в ветке `default` делает `last.docs = append(last.docs, i)`
каждый читаемый не-граничный документ приписывается к ПРЕДЫДУЩЕЙ главе; рядом стоит инвариант сохранения
(`backend/internal/chunk/ingest.go:836-843`), а комментарий чтения гласит «Reading happens per GROUP so a
chapter split across documents arrives whole».
**Популяция движка, пере-снята мной его же правилом (python-реимплементация `resolveTOC`+`groupChapters`):**
| | |
|---|---|
| глав | **71** · приписано документов **53** · **ПУСТЫХ 0** |
| сумма прозы | **1 313 224** знака без пробелов ≈ 360 775 токенов — вся книга |
| крупных глав | **6**: BOOK TWO 321 191 · BOOK ONE 283 459 · BOOK FIVE 227 308 · BOOK FOUR 213 052 · BOOK THREE 148 922 · BOOK SIX 115 310 |
| крошечных (<200 знаков) | **65** |
**Следствие для меры владельца: срез СУЩЕСТВУЕТ УЖЕ СЕГОДНЯ.** Цель 41 027 токенов (20 китайских
глав). **BOOK THREE = 148 922 знака ≈ 40 912 токенов, промах 0.3 %.** Одна глава движка, без единой
правки. **нарезка НЕ блокирует эксперимент**, и заказывать её как блокер было бы ложью.
**Настоящий дефект другой и он о КАЧЕСТВЕ:** шесть «глав» по 115321 тыс. знаков это не главы, а части
книги, и 65 границ стоят на страницах-разделителях. Читатель получит шесть полотен вместо семидесяти одной
главы. Это предмет ряда **283**.
**РЕШИ САМА**, чинить ли это в паке; если чинишь порог «сколько знаков делает главу главой» живёт в
ДАННЫХ, а не в Go, и правило проверяется на ВТОРОЙ живой английской книге: `books/fifty_shades_1_en.epub`
и `books/fifty_shades_1_en.txt` (909 093 байта; строк вида `Chapter …` в начале строки **26**, разрывов
страницы **0**; оба числа мои, команда `command grep -cE '^[[:space:]]*Chapter '`).
**Соседний предмет, ТВОЙ вход, а не открытие по ходу — ряд 303:** не-CJK **TXT** режется в одну главу
(лестница отдаёт `nil`, фолбэк разрыв страницы, которых в живом английском txt ноль). Наша книга EPUB,
её это не задевает. **Назови границу явно**, иначе следующая смена прочтёт пак как «не-CJK нарезка
починена».
### 4.5. Порог эха — ДЕНЬГИ. ДЕЛАЙ РОВНО ТАК: сперва замер, потом число
`backend/internal/pipeline/disposition.go:465`: `const cjkEchoThreshold = 0.15`, применяется на `:403` к
доле рун ИСХОДНОГО скрипта в выходе; доля считается от ВСЕХ рун, включая пробелы (`:472-484`). Конфиг-ручки
нет.
Для enru исходный скрипт **латиница** (`backend/internal/lang/data/lang-script.txt`: `en latin`), а
здоровый русский перевод английской книги несёт латиницу штатно. 15 % достижимы без эха, а **ложный флаг
ЭСКАЛИРУЕТ**, то есть покупает платный хоп за здоровый текст.
**ЧИСЛО 0.15 СНЯТО НЕ В ЭТОЙ КЛЕТКЕ** оно унаследовано от китайского бенчмарка отказов. Измерь его на
латинице ТЕМ ЖЕ кодом, что и движок, и покажи распределение. Носитель предмета ряд **260**.
**Литерал порога ВХОДИТ в версию классификатора — пере-снято мной:**
`backend/internal/pipeline/disposition.go:186` несёт `classify-v3-refusal+srcscript-echo015+…`, то есть
подстроку `echo015`. движение порога двигает ВЕРДИКТЫ и требует пере-снапшота. Порядок работ отсюда
следует жёстко: порог трогается в ТОМ ЖЕ окне, что и нарезка, либо не трогается вовсе.
### 4.6. ⛔ ВТОРОЙ ДЕТЕКТОР ЛАТИНИЦЫ — его не было в первой редакции, и он противоречит §4.2
На каждом финальном чанке enru работает ВТОРОЙ счётчик латиницы, и он **не гейчен ничем, кроме цели**:
`lintLatinResidue` (`backend/internal/checks/checkers.go:561`, порог `minLatinResidueLen = 3` на `:559`)
вызывается из `RunCheapGates` (`backend/internal/checks/cheapgates.go:194`), а та бежит при
`r.checkers.TargetActive()` (`backend/internal/pipeline/waverun.go:626` и `:760`) для цели `ru` всегда.
**Его докблок (`backend/internal/checks/checkers.go:550-553`) утверждает ПРОТИВОПОЛОЖНОЕ тому, что §4.2 велит вписать
переводчику:** целое латинское слово в не-латинской цели утечка, «в русской цели латинское имя
собственное **должно быть транслитерировано**», и правило объявлено **language-general** Latin is not
pair data»).
**Штатный механизм канон называет сам, и он НЕ порог:** «a legitimately-kept brand lives on the
per-project allowlist, not on a has a capital heuristic». законная латиница английской книги едет через
**аллоу-лист проекта**, а не через правку порога и не через промт переводчика.
**ДЕЛАЙ РОВНО ТАК:** сперва замерь, сколько срабатываний даёт этот детектор на здоровом русском переводе
английской прозы; потом решай. И помни условие §4.2: пока `gates.repair` выключен, детектор только
считает; включённый становится актуатором с классом `latin_residue` в дефолте.
### 4.7. Ключи банка на латинице — РЕШИ САМА, но сперва измерь
`backend/internal/text/norm.go` завершает нормализацию ключа `unicode.ToLower`. Для китайского это no-op;
для английского стирает признак, отличающий имя от обычного слова. Порог допуска не-Han ключа 3 руны
(`backend/internal/membank/memory.go:78-83`), `collisionProneKey` ловит только 3 (`:88-90`), а демоушен
пост-чека Han-only (`backend/internal/membank/mempostcheck.go:151-156`) для английского не применяется
никогда.
**Это подозрение, а не замер.** Первый шаг измерить на нашем материале, сколько ключей фирят на
обычных словах, и только потом решать.
### 4.8. Бюджет нарезки — РЕШИ САМА, и оценка законна вместо прогона
`backend/internal/chunk/chunker.go:85-96`: `est_out = FertCJK·cjk + FertOther·other`; у английского плотных
рун ноль. Последний фолбэк 1.1978 / 0.3852 с комментарием в самом файле: это **zh-ru пар-калибровка, а не
языко-нейтральная константа**. У `en-ru.yaml` блока `segmentation` нет.
**Ряд 14 держит этот предмет с оговоркой «калибровка ждёт боевого токенизатора», и рядом в той же строке
предупреждает, что громкий segmentation-фолбэк ломает контракт коридора и голден-фикстуру на нём.**
калибровочный ПРОГОН деньгами §4.10 не выдан. **Заведи блок по ОЦЕНКЕ, назови её оценкой** либо скажи
«не делаю» с доводом. Правки Go это не требует.
### 4.9. Что в пак НЕ входит
- **Не-Han майнер банка** (ряд **35**): майнер Han-only по построению
(`backend/internal/miner/miner_substrate.go:44-63`), на латинице кандидатов ноль. Отдельный пак.
- **Правка Go под ряд 347** без моего слова 4.3).
- **Целевая латинописьменная пара (→en)** ряд **259**.
- **Транслитерационный канал** под пиньинь: требование категорий `backend/internal/lang/langpack.go:531-540`
(⚠ ряд 347 несёт устаревший адрес `:521-527`, который указывает в блок МОРФОЛОГИИ; ряд мой, пере-наведу я).
- **Японская пара.** Мой замер по ходу: CJK-дефолт не режет ни одну из двух живых японских книг
ратифицирую отдельной нотой я, тебе не предмет. Метод замера назову в ноте: движок сравнивает по
`strings.TrimSpace` (`backend/internal/chunk/chunker.go:210`), а не по началу строки.
- **`gates.repair` остаётся выключенным.** Включение отдельное решение с ценой 4.2, §4.6).
### 4.10. Деньги — и здесь ДВА разных предмета, которые нельзя путать
Пак **$0** до момента, когда пара собрана. Тогда **одна дымовая покупка** на ОДНОЙ главе (не на срезе),
чтобы доказать, что путь доходит до файла. **Перед ней — пинг мне с ценой ДО траты:** оценка в токенах и
долларах, потолок в `book.yaml` самой книги. Полный срез принадлежит ЭКСПЕРИМЕНТУ, не паку.
**Пере-снапшот — НЕ одно и то же на двух книгах, и первая редакция промта это смешивала.**
`--resnapshot` дословно: «re-pin existing jobs to the current config snapshot (**re-translates
already-paid chunks** explicit consent (`backend/cmd/tmctl/invocation.go:131`), согласие
`--accept-rebill` (`:133`). на **английской** книге пере-снапшот **$0**: оплаченных прогонов там нет,
платить нечего. На **китайских стендовых** базах это ДЕНЬГИ и требует явного согласия в пак они не
входят. Голден-файл в дереве **один** (`backend/internal/pipeline/testdata/golden/capture.golden`).
Потолки банк-ролей **пожизненные**; на английской книге они тратиться не должны если тратятся, это
находка.
### 4.11. Стандарт работы
Ценность продукта архитектура необходимый рефакторинг без велосипедов. Сверка с индустриальным
первоисточником прежде собственного изобретения. Книжный термин в общем пар-слое утечка.
## 5. Самопроверка ИСПОЛНЕНИЕМ — и где у ЭТОГО пака мягко
Мандат: **самопроверка исполнением, не перечитыванием.** Субагентов поднимать **разрешаю явно**. Тест на
вырожденность: пункт, удовлетворяемый фразой «перечитал сам», дефектен.
**Контроль исполнения — ПО ХОДУ, а не в конце** (слово владельца): раз в заметный кусок работы сверяй
сделанное с ПЕРЕЧНЕМ ЗАКАЗА этого промта списком, не по памяти.
**Прибор для этого, купленный приёмкой 17.09 (формулировка зоны):** собственные проверки не находят
ОТСУТСТВУЮЩЕЕ, потому что знаменателем им служит твой же текст. Спросить у дерева, сходится ли отчёт, ты
умеешь; спросить у отчёта, все ли предметы названы, нет, список берётся оттуда же. **сверяй перечень
заказа с перечнем отчёта по СПИСКУ ЗАКАЗЧИКА** тем же движением, что `comm -23` над пакетами батареи.
**Мутации — часть заказа, а не только критерия приёмки.** Каталог сегодня `backend/cmd/tmmutate/mutations.json`
(526 записей, 315 в гейте `battery`). Заведи записи на КАЖДУЮ новую ветку, которую пак создаёт (нарезка ·
порог эха · аллоу-лист · путь данными вокруг гейта), пометь их `battery` и прогони каталог ЦЕЛИКОМ, а не
поодиночке. Не сужай прогон через `-run`, чтобы влезть в память: подмножество не есть пакет.
**Где у ЭТОГО пака мягко — пять мест; глубину и веер выбираешь ты:**
1. **Промты пары — единственное, что не ловится ни одним гейтом.** Батарея зелена при любом их содержании.
2. **Порог эха**: соблазн подвинуть число, не измерив; ошибиться можно в обе стороны.
3. **Популяция**, на которой снято любое число о главах: документ группа. Здесь я уже ошибся проверь
каждое своё число вопросом «на чём его читает ДВИЖОК».
4. **Детектор латиницы спрошен на ЦЕЛИ, а не на источнике** гейт `TargetScriptNonLatin` отвечает про
русскую цель и от английского источника не защищает.
5. **Путь данными вокруг гейта терминолога** снимает ОТКАЗ, но не даёт банка. Легко отчитаться «английский
пошёл» и умолчать, что пошёл без механизма, ради которого гейт стоял.
**Адверсариальный проход по СВОЕЙ готовой работе — обязателен**, отдельным заходом после объявления
готовности. Мандат: «найди, что этот пак сломал и о чём умолчал».
## 6. Оси ревью — предметные, а не гигиенические
1. **Число снято на документе, а не на группе** (и шире: на популяции, которой движок не пользуется).
2. **Детектор спрошен на цели там, где предмет — источник** (и наоборот).
3. **Промт пары проверен НАЛИЧИЕМ файла, а не текстом**, который он производит.
## 7. Записка-план
После §4.1 и до первой строки кода: что строишь, в каком порядке, чем предъявишь каждый пункт, плюс
ВХОДНАЯ строка батареи числом. Пишешь в свою секцию `docs/PROGRESS.md`.
## 8. Заявление = команда
Каждое число и каждая категорика отчёта **с командой, которой получены**. Приёмка пере-ранит своим
прибором; число без команды принимается «со слов» и так называется в акте.
## 9. Эхо-протокол старта
До работы **10 строк СВОИМИ словами**: скоуп · инварианты · что НЕ делаешь. Дословный пересказ
подтверждает канал, но не понимание, и повторяет ошибку промта вместе с ним.
## 10. Что не удалось и где прибор слеп — обязательная секция
Две половины: **«что не получилось»** и **«что ты знаешь и не сказала»** в форме «что невидимо · почему
не чинила · чем закрывается». **В коде названо, в отчёте нет — значит для следующей смены НЕ названо.**
## 11. Канал вопросов, право отказа, советчик
Конфликт промта с кодом или доками **пинг, а не интерпретация**. У тебя есть **право сказать «этого
делать не надо»** с аргументом, и я это поощряю. **Замер бьёт по посылке задачи стоп и вопрос, а не
артефакт под подпись.** Этот промт уже был исправлен четырежды по такому замеру.
## 12. Прямой канал
Механизм `CLAUDE.md` §«Связь между сессиями»: файл `/tmp/textmachine-channel`, свой блок дописываешь
первым делом, чужие не трогаешь. **Адрес из файла НЕ доказывает, что сессия жива: перед отправкой сверься
с `ListAgents`.** Эхо-протокол 9) шли первым действием. **Нужной роли нет канала нет, это НОРМАЛЬНЫЙ
случай: сессии подряд не опрашивать.**
## 13. Критерий завершённости — проверяемый
- У **каждого** пункта заказа исход: сделано · не делаю с доводом · пинг. Сверка по СПИСКУ ЗАКАЗЧИКА 5).
- Круги **сошлись**: последний не дал новых находок; прежние закрыты таблицей «находка что сделано
**чем предъявлено**».
- Гейт зоны (`make battery`) зелёный; названо, **что прогнано** и **сколько скипов** рядом с числом `ok`.
`go test ./...` без `-v` скипы не печатает «ноль скипов» и «скипы не показаны» неразличимы.
- Мутации: таблица полная, выжившие поимённо, новые записи помечены `battery`, каталог прогнан целиком.
- Числа сняты **после последней правки**; промежуточные не цитируются.
- Всё живое **в ДЕРЕВЕ**, а не в письме.
- Явное **«работа завершена, править не планирую»**. Без него пак считается идущим.
## Приложение. Ряды, на которые пак опирается
Проверены мной по живому трекеру 17.09 (прибор прочёл 359 строк таблицы):
| ряд | состояние | отношение к паку |
|---|---|---|
| **315** | **ЗАКРЫТ замером 06.09** | вход §4.1: `tmctl manifest` на ЭТОЙ книге уже дал 71 главу / 351 юнит / 356 чанков, `EXIT 0`, $0. Там же назван механизм `prompts_root` |
| **303** | открыт, «скоро» | вход §4.4 (TXT-половина); его граница: проверено по коду и фикстуре, живая не-CJK книга через ингест не прогонялась |
| **283** | открыт, «скоро» | настоящий предмет §4.4 структура глав для выдачи |
| **347** | открыт, «когда-нибудь» | §4.34.9; несёт устаревшие адреса `langpack.go`, пере-наведу я |
| **35** | открыт, «когда-нибудь» | §4.9: объясняет, почему снятие отказа не даёт банка |
| **260** | открыт, «скоро» | §4.5 ложный `off_target` на латинице-тяжёлом русском ЭСКАЛИРУЕТ |
| **14** | открыт, «когда-нибудь», владелец | §4.8; предупреждает о голден-фикстуре на коридоре |
| **79 · 81 · 259** | открыты | соседние предметы, не трогать |