textmachine/docs/BACKEND_ENGLISH_PAIR_SESSION_PROMPT.md

45 KiB
Raw Blame History

Бэкенд-пак: АНГЛИЙСКАЯ ПАРА en→ru — движок обязан ЗАПУСТИТЬСЯ и отдать книгу, которую можно читать

Выдача №15 очереди №23. Зона — backend/. Пак $0 по умолчанию; единственный платный шаг назван в §4.10 и без моего слова не делается. ⚠ Числа и адреса этого промта сняты МНОЙ по дереву 17.09, каждое — названным прибором. Те, на которых ты строишь решение, пере-сними своим: заимствованное число улики не заменяет. И честно о цене этого правила: первая редакция промта содержала ЧЕТЫРЕ моих ошибки, все нашёл опровергатель, и все — одного класса: число снято не на той популяции. Я мерил текст документа там, где движок читает ГРУППУ документов; цитировал отозванную формулировку ряда, не прочитав его баннер; обрезал строку ноты на 200 знаках и заключил, что тела нет. Ниже — исправленное. Считай это не извинением, а описанием того, как именно здесь ошибаются.

1. Какая проблема и что решит твой результат

Проект объявляет: движок один, пара — ДАННЫЕ, и ревью-вопрос по умолчанию — «заработает ли пара, которой в репо ещё нет, без правки Go?». На английском ответ сегодня — нет, и даже не «плохо», а «не стартует».

Замерено мной:

  • backend/configs/pairs/en-ru.yaml293 байта, 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 f0, find -L books -type f10534. Бери 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). Конфиг-ручки нет.

Для en→ru исходный скрипт — латиница (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

На каждом финальном чанке en→ru работает ВТОРОЙ счётчик латиницы, и он не гейчен ничем, кроме цели: 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.3/§4.9; ⚠ несёт устаревшие адреса langpack.go, пере-наведу я
35 открыт, «когда-нибудь» §4.9: объясняет, почему снятие отказа не даёт банка
260 открыт, «скоро» §4.5 — ложный off_target на латинице-тяжёлом русском ЭСКАЛИРУЕТ
14 открыт, «когда-нибудь», владелец §4.8; ⚠ предупреждает о голден-фикстуре на коридоре
79 · 81 · 259 открыты соседние предметы, не трогать