Ratify the settled-basis pack as D39.266, carrying the backend zone's own report and the platform zone's PD-441 cell, and open the English pair prompt

This commit is contained in:
heaven 2026-09-17 20:59:53 +03:00
parent d25e418acb
commit 871e0affa9
8 changed files with 884 additions and 22 deletions

View file

@ -0,0 +1,427 @@
# Бэкенд-пак: АНГЛИЙСКАЯ ПАРА 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`). Конфиг-ручки
нет.
Для 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** | открыты | соседние предметы, не трогать |

View file

@ -3,7 +3,7 @@
> **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено. > **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и D-ноты ссылаются словами «строка N» / «строка бэклога N»: **ID строки стабилен навсегда**, не перенумеровывается и не переиспользуется (D39.80). Правки — только через оркестратора; каждая петля обязана иметь диспозицию: решено / отложено-с-записью / отклонено.
> ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`). > ⚠ **Это НЕ бэклог зоны `docs/`, а бэклог ПРОЕКТА.** У зон свои, с другими неймспейсами ID, и единый их строк не принимает (D39.84): платформа — [../platform/BACKLOG.md](../platform/BACKLOG.md) (`П-N`) и её регистр дефектов `platform/docs/DEFECT_REGISTER.md` (`PD-N`); фронт — [../frontend/docs/BACKLOG.md](../frontend/docs/BACKLOG.md) (`Ф-N`).
> ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции. > ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции.
> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **368** строк · зона бэкенд **195** строго / **248** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **195** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже). > - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **369** строк · зона бэкенд **196** строго / **249** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **196** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
> - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп. > - ⚠ **Переезд 06.09 (D39.218):** таблица вынесена из `PROGRESS.md` ДОСЛОВНО и ни один ID не сдвинут — **с единственным исключением: две ячейки (строки 220 и 306) тронуты РОВНО в номере якоря `docs/scripts/counts.py:566`→`:569` и `:592`→`:595`**, потому что цель сдвинул этот же коммит; текст ячеек не менялся, длины равны. В `PROGRESS.md` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп.
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора) ## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора)
@ -274,7 +274,7 @@
| 343 | **`counts.py` ДЕРЖИТ РЕГИСТР ОДНИМ ПУТ<D0A3>ём И НЕ ГЛОБИТ СЛАЙСЫ — предусловие нарезки `DEFECT_REGISTER.md`.** Вынос без этого молча уронит счёт открытых рядов, а гейт чисел покажет зелень: он читает ровно один файл. ⚠ План нарезки живёт в `docs/DOC_CLEANUP_PLAN.md` (Б14в) | доки | скоро | прибор читает регистр и его слайсы, счёт не меняется при выносе | вопросы платформы 07.09 | | 343 | **`counts.py` ДЕРЖИТ РЕГИСТР ОДНИМ ПУТ<D0A3>ём И НЕ ГЛОБИТ СЛАЙСЫ — предусловие нарезки `DEFECT_REGISTER.md`.** Вынос без этого молча уронит счёт открытых рядов, а гейт чисел покажет зелень: он читает ровно один файл. ⚠ План нарезки живёт в `docs/DOC_CLEANUP_PLAN.md` (Б14в) | доки | скоро | прибор читает регистр и его слайсы, счёт не меняется при выносе | вопросы платформы 07.09 |
| **— ТЕХДОЛГ БЭКЕНДА: разбор research/33 (D39.224) —** | | | | | | | **— ТЕХДОЛГ БЭКЕНДА: разбор research/33 (D39.224) —** | | | | | |
| 346 | ⚠ **ПОЛОВИНА (а) ЗАКРЫТА 07.09 (`D39.225`): пин расхождения и паритет-тест стоят, оба под мутациями. ОСТАЁТСЯ (б) — фикс в окне перенарезки.****ПРАВИЛО ЗАГОЛОВКА РАЗЪЕХАЛОСЬ ПО ТРЁМ ПРЕДИКАТАМ, И «第零章» ЛОМАЕТ ПРОЛОГ — две половины с РАЗНОЙ ценой.** Страж длины живёт только в ингесте (`chunk/ingest.go:307`=`const chapterHeaderMaxRunes = 60` `chapterHeaderMaxRunes = 60`, применён `:323`; в `chunker.go` `RuneCountInString` — 0 хитов), осмысленность номера — только в чанкере (`backend/internal/chunk/chunker.go:315-317`=`v := section + num` — ⚠ испр. 16.09: было :316, где утверждение несёт строка с `||`, непригодной для ячейки таблицы `if !any || v <= 0`). Воспроизведено исполнением 07.09 (выброшенная проба на копии дерева): `第零章:序幕` ингест режет главой, а чанкер заголовок НЕ снимает — `heading=""`, сырой CJK-маркер уезжает модели; `parseSectionNumeral` на `零`/`0`/`` даёт `0,false` (контроль: `一`=1, `十二`=12); номера расходятся (`第一章` = `Chapter 2` при «Глава 1»); 84-рунный заголовок: ингест `false`, чанкер `ok=true`. ⚠ **Испр. 07.09 — без этой оговорки строка читается как ЛОЖНАЯ:** расхождение живёт ТОЛЬКО у заголовка С СЕПАРАТОРОМ после юнита (`第四章:…`); без сепаратора оба предиката дают `false` на любой длине, потому что такую строку отвергают и `isHeaderSeparator` ингеста, и `matchHeaderLine` чанкера. Пере-снято оркестратором на копии `d6dfc49`: с сепаратором 59 и 60 рун — оба `true`; 61 и 84 — ингест `false` при чанкере `ok=true n=4`; без сепаратора 12/55/59/60/61/84 — `false`/`false` во всех шести. Граница ровно `chapterHeaderMaxRunes` = 60. Перекрёстного теста нет ни в одном из 97 тестов `internal/chunk`. **(а) $0 СЕЙЧАС — пин ИЗВЕСТНОГО расхождения, а не паритет:** красный тест в `main` не ложится (`Makefile:58` `battery: build vet fmt lint test`), скип — класс D39.208; поэтому тест утверждает, что на `第零章` и на 6184-рунной строке ингест и чанкер СЕГОДНЯ расходятся, назван этой строкой и краснеет ровно тогда, когда приземлится фикс (б), заставляя фиксера его перевернуть. Дизайн-пак 161 §4.5 паритет-тест ОПИСЫВАЕТ, пишет его пак стройки — пин (а) этому не мешает. **(б) В ОКНО ПЕРЕНАРЕЗКИ:** сам фикс меняет ТЕКСТ чанка ⇒ бампает `chunkerVersion` ⇒ снапшот обеих волн (`render.go:55-58` — «a deliberate re-translation»); отдельным актом он платит ту самую перепокупку, которую отменяет. ⚠ Ось «обязательность юнита» — НЕ трогать: носитель строка **303** (⚠ испр. 07.09: research/33 приписывал её `D39.207`, в теле ноты этого нет — греп по предмету 0 при 23 строках тела) | бэкенд | скоро для (а); (б) — в окне перекроя (шаг 3) | (а) пин расхождения · (б) сведение двух предикатов к ингестовским стражам внутри пака перекроя | research/33 Д3, research/27 §6 | | 346 | ⚠ **ПОЛОВИНА (а) ЗАКРЫТА 07.09 (`D39.225`): пин расхождения и паритет-тест стоят, оба под мутациями. ОСТАЁТСЯ (б) — фикс в окне перенарезки.****ПРАВИЛО ЗАГОЛОВКА РАЗЪЕХАЛОСЬ ПО ТРЁМ ПРЕДИКАТАМ, И «第零章» ЛОМАЕТ ПРОЛОГ — две половины с РАЗНОЙ ценой.** Страж длины живёт только в ингесте (`chunk/ingest.go:307`=`const chapterHeaderMaxRunes = 60` `chapterHeaderMaxRunes = 60`, применён `:323`; в `chunker.go` `RuneCountInString` — 0 хитов), осмысленность номера — только в чанкере (`backend/internal/chunk/chunker.go:315-317`=`v := section + num` — ⚠ испр. 16.09: было :316, где утверждение несёт строка с `||`, непригодной для ячейки таблицы `if !any || v <= 0`). Воспроизведено исполнением 07.09 (выброшенная проба на копии дерева): `第零章:序幕` ингест режет главой, а чанкер заголовок НЕ снимает — `heading=""`, сырой CJK-маркер уезжает модели; `parseSectionNumeral` на `零`/`0`/`` даёт `0,false` (контроль: `一`=1, `十二`=12); номера расходятся (`第一章` = `Chapter 2` при «Глава 1»); 84-рунный заголовок: ингест `false`, чанкер `ok=true`. ⚠ **Испр. 07.09 — без этой оговорки строка читается как ЛОЖНАЯ:** расхождение живёт ТОЛЬКО у заголовка С СЕПАРАТОРОМ после юнита (`第四章:…`); без сепаратора оба предиката дают `false` на любой длине, потому что такую строку отвергают и `isHeaderSeparator` ингеста, и `matchHeaderLine` чанкера. Пере-снято оркестратором на копии `d6dfc49`: с сепаратором 59 и 60 рун — оба `true`; 61 и 84 — ингест `false` при чанкере `ok=true n=4`; без сепаратора 12/55/59/60/61/84 — `false`/`false` во всех шести. Граница ровно `chapterHeaderMaxRunes` = 60. Перекрёстного теста нет ни в одном из 97 тестов `internal/chunk`. **(а) $0 СЕЙЧАС — пин ИЗВЕСТНОГО расхождения, а не паритет:** красный тест в `main` не ложится (`Makefile:58` `battery: build vet fmt lint test`), скип — класс D39.208; поэтому тест утверждает, что на `第零章` и на 6184-рунной строке ингест и чанкер СЕГОДНЯ расходятся, назван этой строкой и краснеет ровно тогда, когда приземлится фикс (б), заставляя фиксера его перевернуть. Дизайн-пак 161 §4.5 паритет-тест ОПИСЫВАЕТ, пишет его пак стройки — пин (а) этому не мешает. **(б) В ОКНО ПЕРЕНАРЕЗКИ:** сам фикс меняет ТЕКСТ чанка ⇒ бампает `chunkerVersion` ⇒ снапшот обеих волн (`render.go:55-58` — «a deliberate re-translation»); отдельным актом он платит ту самую перепокупку, которую отменяет. ⚠ Ось «обязательность юнита» — НЕ трогать: носитель строка **303** (⚠ испр. 07.09: research/33 приписывал её `D39.207`, в теле ноты этого нет — греп по предмету 0 при 23 строках тела) | бэкенд | скоро для (а); (б) — в окне перекроя (шаг 3) | (а) пин расхождения · (б) сведение двух предикатов к ингестовским стражам внутри пака перекроя | research/33 Д3, research/27 §6 |
| 347 | **ПАР-ДАННЫЕ НЕЛЬЗЯ ЗАВЕЗТИ ПО ЧАСТЯМ: манифест требует ≥1 канал, и транслитерационный канал зашит в китайскую форму.** `lang/langpack.go:632`=`manifest declares no channel` — «manifest declares no channel — omit the file to ship all channels, or list at least one»; каналов два и они закрыты в Go (`source-morphology`, `transliteration`, `:108-114`), а `validate()` при `transliteration` требует ПОИМЁННО пиньинь-категории (`:521-527`); морфологический канал просит общие таблицы (`:507-516`) и в китайскую форму не зашит. Отказ жёсткий: при `gates.terminology.enabled` и `pack == nil` прогон отказывает `RefusalBadConfig` (`backend/internal/pipeline/runner.go:364`=`Gates.Terminology.Enabled` — ⚠ испр. 16.09: было :349), а в боевом `pipeline-c1.yaml:151`=`Роль ТЕРМИНОЛОГА (пак-20, D39.42 п.1)` гейт включён ⇒ вторая пара выбирает между фиктивными данными китайской формы и прогоном БЕЗ банка терминов (продуктовая цель №1). ⚠ **Триггер — первая новая ИСХОДНАЯ пара, и он РАНЬШЕ строки 115:** манифест лежит в `<root>/<src>/` и хешируется языком-ИСТОЧНИКОМ (`langpack.go:252`), а 115 — про новую ЦЕЛЬ; ближайшая исходная пара в трекере — ja→ru (строка **81**), цель у неё ru. ⚠ **Пять строк снимают отказ, но банка на не-Han источнике НЕ дают** — детектора нет (строка **35**: en-детектор не существует, ja с zh-таблицами активно неверен); заказывать вместе, иначе строка обещает больше, чем покупает. Сегодня не оплачено ни разу: 0 `manifest.txt` в `configs/`, каталог пары один. ⚠ D39.64 П4 ратифицировала ОБРАТНОЕ намерение («источник без пиньинь-морфологии грузится без Palladius-файлов») — строка `list at least one` не дошла шаг до собственной цели | бэкенд | когда-нибудь (вход пака второй пары; триггер общий со строками 81 и 35) | разрешение нулевого числа каналов + решение по форме каналов | research/33 Д7, D39.64 П4 | | 347 | **ПАР-ДАННЫЕ НЕЛЬЗЯ ЗАВЕЗТИ ПО ЧАСТЯМ: манифест требует ≥1 канал, и транслитерационный канал зашит в китайскую форму.** `backend/internal/lang/langpack.go:644`=`manifest declares no channel` — «manifest declares no channel — omit the file to ship all channels, or list at least one»; каналов два и они закрыты в Go (`source-morphology`, `transliteration`, `:108-114`), а `validate()` при `transliteration` требует ПОИМЁННО пиньинь-категории (`:533-539`); морфологический канал просит общие таблицы (`:519-529`) и в китайскую форму не зашит. Отказ жёсткий: при `gates.terminology.enabled` и `pack == nil` прогон отказывает `RefusalBadConfig` (`backend/internal/pipeline/runner.go:364`=`Gates.Terminology.Enabled` — ⚠ испр. 16.09: было :349), а в боевом `pipeline-c1.yaml:151`=`Роль ТЕРМИНОЛОГА (пак-20, D39.42 п.1)` гейт включён ⇒ вторая пара выбирает между фиктивными данными китайской формы и прогоном БЕЗ банка терминов (продуктовая цель №1). ⚠ **Триггер — первая новая ИСХОДНАЯ пара, и он РАНЬШЕ строки 115:** манифест лежит в `<root>/<src>/` и хешируется языком-ИСТОЧНИКОМ (`backend/internal/lang/langpack.go:255`), а 115 — про новую ЦЕЛЬ; ближайшая исходная пара в трекере — ja→ru (строка **81**), цель у неё ru. ⚠ **Пять строк снимают отказ, но банка на не-Han источнике НЕ дают** — детектора нет (строка **35**: en-детектор не существует, ja с zh-таблицами активно неверен); заказывать вместе, иначе строка обещает больше, чем покупает. Сегодня не оплачено ни разу: 0 `manifest.txt` в `configs/`, каталог пары один. ⚠ D39.64 П4 ратифицировала ОБРАТНОЕ намерение («источник без пиньинь-морфологии грузится без Palladius-файлов») — строка `list at least one` не дошла шаг до собственной цели | бэкенд | когда-нибудь (вход пака второй пары; триггер общий со строками 81 и 35) | разрешение нулевого числа каналов + решение по форме каналов | research/33 Д7, D39.64 П4 |
| 350 | ⚠ **ИСПОЛНЕНО 07.09 (`D39.225`) КРОМЕ ОДНОГО: по каждой из шести функций назван исход — четыре получили причину жизни комментарием («NO CALLER TODAY: contract surface waiting on backlog row 12»), дубль инлайна свёрнут в `finalStageName()`. ОСТАЁТСЯ словарь родов в четырёх носителях; текст его собственной ошибки врать перестал.** **РЕФАКТОРИНГ ОБЛЕГЧЕНИЯ ВЕДЕНИЯ (санкция владельца 07.09) — снапшот-нейтрально, и заказ здесь «решить», а не «удалить».** Вызовов вне определения ноль у шести функций (греп 07.09; КОНТРОЛЬ — `SplitChunks` 34 живых вызова): `obs.SafeGo`, `text.TokenizeCyrillic`, `CheapGateResult.UnitScaleHard`/`UnitScaleSoft`, `Bank.Voices()`, `Bank.Pairs()`. ⚠ **Четыре из шести стоят НАМЕРЕННО, и слепое удаление снимет намеренное:** `UnitScaleHard/Soft` сами называют, кого ждут — `checks/cheapgates.go:155-156`=`Total() is unchanged` «for the report and a future hard gate», то есть строку **12**; `TokenizeCyrillic` — образец паттерна value-default, на который ссылаются `checks/sanitizer.go:21`=`value-default pattern, like text.TokenizeCyrillic` и `:197`; `SafeGo` — намеренный контраст к `obs/panic.go`, названный решением `backend/internal/pipeline/waverun.go:420`=`NOT obs.SafeGo` — ⚠ испр. 16.09: было :405 («NOT obs.SafeGo»), и его удаление повесит два комментария в воздухе — класс строки **299**; `Voices`/`Pairs` (`membank/memory.go:371-376`=`address-register journal (frozen for` «frozen for the job») ждут потребителя, которого держит строка **13б**. ⇒ по каждой ОДИН исход с объявлением в отчёте: удалить ЛИБО назвать причину жизни в комментарии. Плюс ИМЯ последней стадии дважды одинаковым инлайном — `r.Pipeline.Stages[n-1].Name` — ⚠ **испр. 16.09: ДУБЛЬ УСТРАНЁН, предмет закрыт кодом:** оба места берут теперь общий хелпер (`backend/internal/pipeline/export.go:281`=`lastStage := r.finalStageName()` и `quality.go:485` тем же вызовом; инлайна `Stages[n-1].Name` в обоих файлах ноль, `finalStageName` по движку 4 вхождения). Прежний адрес был `pipeline/export.go:283` и `quality.go:342` (адреса на `d6dfc49`). ⚠ **Испр. 07.09: и research/33 §7.1, и первая редакция этой строки называли здесь «готовый `finalStageWave()`» — это ДРУГАЯ функция**: она возвращает ВОЛНУ (`snapshot.go:247`, вызовов 13 — 10 прод и 3 теста), а хелпера для ИМЕНИ не существовало вовсе, и «при готовом хелпере» читалось как «работа уже сделана» и словарь родов в четырёх носителях (`membank/memory.go`, `membank/memseed.go`, `backend/internal/terminology/classify.go:40`=`Genders is the closed vocabulary` — ⚠ испр. 16.09: было :50, промт), где текст собственной ошибки врёт о принимаемом множестве. ⛔ Границы санкции: НЕ дробить `internal/pipeline` и НЕ переписывать `Runner` (`12-go-style-notes.md` §1, D39.23), ничего, что двигает снапшот / хеш запроса / ключ манифеста. ⚠ Адреса сняты research/33 на `e69902a`, а лендинг 07.09 тронул `memseed.go` и `export.go` — пере-снимать командой, не по тексту | бэкенд | когда-нибудь | попутный проход с батареей + объявление исхода по каждой функции | research/33 §7.1, санкция владельца 07.09 | | 350 | ⚠ **ИСПОЛНЕНО 07.09 (`D39.225`) КРОМЕ ОДНОГО: по каждой из шести функций назван исход — четыре получили причину жизни комментарием («NO CALLER TODAY: contract surface waiting on backlog row 12»), дубль инлайна свёрнут в `finalStageName()`. ОСТАЁТСЯ словарь родов в четырёх носителях; текст его собственной ошибки врать перестал.** **РЕФАКТОРИНГ ОБЛЕГЧЕНИЯ ВЕДЕНИЯ (санкция владельца 07.09) — снапшот-нейтрально, и заказ здесь «решить», а не «удалить».** Вызовов вне определения ноль у шести функций (греп 07.09; КОНТРОЛЬ — `SplitChunks` 34 живых вызова): `obs.SafeGo`, `text.TokenizeCyrillic`, `CheapGateResult.UnitScaleHard`/`UnitScaleSoft`, `Bank.Voices()`, `Bank.Pairs()`. ⚠ **Четыре из шести стоят НАМЕРЕННО, и слепое удаление снимет намеренное:** `UnitScaleHard/Soft` сами называют, кого ждут — `checks/cheapgates.go:155-156`=`Total() is unchanged` «for the report and a future hard gate», то есть строку **12**; `TokenizeCyrillic` — образец паттерна value-default, на который ссылаются `checks/sanitizer.go:21`=`value-default pattern, like text.TokenizeCyrillic` и `:197`; `SafeGo` — намеренный контраст к `obs/panic.go`, названный решением `backend/internal/pipeline/waverun.go:420`=`NOT obs.SafeGo` — ⚠ испр. 16.09: было :405 («NOT obs.SafeGo»), и его удаление повесит два комментария в воздухе — класс строки **299**; `Voices`/`Pairs` (`membank/memory.go:371-376`=`address-register journal (frozen for` «frozen for the job») ждут потребителя, которого держит строка **13б**. ⇒ по каждой ОДИН исход с объявлением в отчёте: удалить ЛИБО назвать причину жизни в комментарии. Плюс ИМЯ последней стадии дважды одинаковым инлайном — `r.Pipeline.Stages[n-1].Name` — ⚠ **испр. 16.09: ДУБЛЬ УСТРАНЁН, предмет закрыт кодом:** оба места берут теперь общий хелпер (`backend/internal/pipeline/export.go:281`=`lastStage := r.finalStageName()` и `quality.go:485` тем же вызовом; инлайна `Stages[n-1].Name` в обоих файлах ноль, `finalStageName` по движку 4 вхождения). Прежний адрес был `pipeline/export.go:283` и `quality.go:342` (адреса на `d6dfc49`). ⚠ **Испр. 07.09: и research/33 §7.1, и первая редакция этой строки называли здесь «готовый `finalStageWave()`» — это ДРУГАЯ функция**: она возвращает ВОЛНУ (`snapshot.go:247`, вызовов 13 — 10 прод и 3 теста), а хелпера для ИМЕНИ не существовало вовсе, и «при готовом хелпере» читалось как «работа уже сделана» и словарь родов в четырёх носителях (`membank/memory.go`, `membank/memseed.go`, `backend/internal/terminology/classify.go:40`=`Genders is the closed vocabulary` — ⚠ испр. 16.09: было :50, промт), где текст собственной ошибки врёт о принимаемом множестве. ⛔ Границы санкции: НЕ дробить `internal/pipeline` и НЕ переписывать `Runner` (`12-go-style-notes.md` §1, D39.23), ничего, что двигает снапшот / хеш запроса / ключ манифеста. ⚠ Адреса сняты research/33 на `e69902a`, а лендинг 07.09 тронул `memseed.go` и `export.go` — пере-снимать командой, не по тексту | бэкенд | когда-нибудь | попутный проход с батареей + объявление исхода по каждой функции | research/33 §7.1, санкция владельца 07.09 |
| 351 | **ЛИНТ СЛОВАРЯ КЛАССИФИКАТОРА ПИНИТ ОДНО НАПРАВЛЕНИЕ: слово, УБРАННОЕ из Go, не ловит ничто.** Гейт `TestEveryClassifierPromptSpeaksTheEnginesVocabulary` (лендинг `D39.225`) утверждает «каждое слово из `terminology.Types`/`Genders` названо в промте пары» — и потому сжимается вместе со своим предметом: выкинутый класс `title` оставляет батарею зелёной (замер 07.09 на копии: 19 ok / 0 FAIL). Вырожденный предел закрыт стражем `len(classifierVocabulary()) == 0`, общий случай — нет. Настоящий дом — пин САМОГО словаря, которого в репозитории нет (research/33 Д1: 0 тестов на `terminology.Types`). ⚠ Граница названа зоной самостоятельно, в заказ пака не входила | бэкенд | когда-нибудь | пин словаря (голден или рефлексивный тест) | `D39.225`, research/33 Д1 | | 351 | **ЛИНТ СЛОВАРЯ КЛАССИФИКАТОРА ПИНИТ ОДНО НАПРАВЛЕНИЕ: слово, УБРАННОЕ из Go, не ловит ничто.** Гейт `TestEveryClassifierPromptSpeaksTheEnginesVocabulary` (лендинг `D39.225`) утверждает «каждое слово из `terminology.Types`/`Genders` названо в промте пары» — и потому сжимается вместе со своим предметом: выкинутый класс `title` оставляет батарею зелёной (замер 07.09 на копии: 19 ok / 0 FAIL). Вырожденный предел закрыт стражем `len(classifierVocabulary()) == 0`, общий случай — нет. Настоящий дом — пин САМОГО словаря, которого в репозитории нет (research/33 Д1: 0 тестов на `terminology.Types`). ⚠ Граница названа зоной самостоятельно, в заказ пака не входила | бэкенд | когда-нибудь | пин словаря (голден или рефлексивный тест) | `D39.225`, research/33 Д1 |
| 352 | **ПЯТЬ РУКОПИСНЫХ СПИСКОВ АРМ-КОНФИГОВ ЖИВУТ РЯДОМ С ДВУМЯ ГЕЙТАМИ, КОТОРЫЕ ТЕПЕРЬ ГЛОБЯТ.** `pipeline/promptlabel_test.go:45`=`pipeline-arm-glm.yaml` · `config/echoregen_shipping_test.go:35`=`pipeline-arm-glm.yaml` · `config/content_labels_test.go:529`=`pipeline-c1.yaml` и `:575` · `config/prompt_pack_test.go:239`=`pipeline-arm-mistral.yaml` перечисляют армы поимённо; новый арм автоматически попадает в `TestAnArmIsTheProductionConfigWithADifferentEditor` и `TestSwapArmConfigs` и проходит мимо всех пяти. Найдено приёмкой `D39.225`, вне заказа пака; предсуществующее | бэкенд | когда-нибудь (со следующим касанием армов) | свести пять списков к глобу | `D39.225` | | 352 | **ПЯТЬ РУКОПИСНЫХ СПИСКОВ АРМ-КОНФИГОВ ЖИВУТ РЯДОМ С ДВУМЯ ГЕЙТАМИ, КОТОРЫЕ ТЕПЕРЬ ГЛОБЯТ.** `pipeline/promptlabel_test.go:45`=`pipeline-arm-glm.yaml` · `config/echoregen_shipping_test.go:35`=`pipeline-arm-glm.yaml` · `config/content_labels_test.go:529`=`pipeline-c1.yaml` и `:575` · `config/prompt_pack_test.go:239`=`pipeline-arm-mistral.yaml` перечисляют армы поимённо; новый арм автоматически попадает в `TestAnArmIsTheProductionConfigWithADifferentEditor` и `TestSwapArmConfigs` и проходит мимо всех пяти. Найдено приёмкой `D39.225`, вне заказа пака; предсуществующее | бэкенд | когда-нибудь (со следующим касанием армов) | свести пять списков к глобу | `D39.225` |
@ -404,3 +404,4 @@
| 493 | **ХАРНЕСС МУТАЦИЙ ЗОНЫ ЗАСЧИТЫВАЕТ ВЫЖИВШЕЙ ПОСАДКУ, ЧЕЙ ШАБЛОН `-run` НЕ ВЫБРАЛ НИ ОДНОГО ТЕСТА.** `platform/tools/mutate.py`, `verdict()`: ветка `if code == 0` возвращает «выжила» безусловно, не спрашивая, запускался ли пин вообще; `baseline()` гоняет тот же набор и требует нулевого кода, поэтому пустой шаблон проходит базу ЗЕЛЁНЫМ и после посадки засчитывается выжившей. ⚠ **Направление ошибки безопасное** — лишняя «дыра», а не лишняя «поимка», — и числа пака, который харнесс строил, не испорчены: замерено оркестратором, что все 26 якорей каталога встречаются в дереве ровно по разу и записей с несуществующим пином ноль. ⛔ Но фикстурный каталог самого харнесса несёт ШЕСТЬ форм исхода (пойман пином · красное другим тестом · выжила · якоря нет · база красная · пина нет), и седьмой — «шаблон не выбрал ни одного теста» — среди них НЕТ, то есть собственный пин прибора этого класса не стережёт. Родня ряда **486**, которым прибор и построен: там лечилось «любое красное засчитывается поимкой», здесь остаётся зеркальное «любое зелёное засчитывается выживанием» | платформа | скоро | пустой шаблон `-run` даёт исход «НЕ ИЗМЕРЕНА», и это запинено седьмой формой фикстурного каталога | линза приёмки 17.09, подтверждено чтением `verdict()` | | 493 | **ХАРНЕСС МУТАЦИЙ ЗОНЫ ЗАСЧИТЫВАЕТ ВЫЖИВШЕЙ ПОСАДКУ, ЧЕЙ ШАБЛОН `-run` НЕ ВЫБРАЛ НИ ОДНОГО ТЕСТА.** `platform/tools/mutate.py`, `verdict()`: ветка `if code == 0` возвращает «выжила» безусловно, не спрашивая, запускался ли пин вообще; `baseline()` гоняет тот же набор и требует нулевого кода, поэтому пустой шаблон проходит базу ЗЕЛЁНЫМ и после посадки засчитывается выжившей. ⚠ **Направление ошибки безопасное** — лишняя «дыра», а не лишняя «поимка», — и числа пака, который харнесс строил, не испорчены: замерено оркестратором, что все 26 якорей каталога встречаются в дереве ровно по разу и записей с несуществующим пином ноль. ⛔ Но фикстурный каталог самого харнесса несёт ШЕСТЬ форм исхода (пойман пином · красное другим тестом · выжила · якоря нет · база красная · пина нет), и седьмой — «шаблон не выбрал ни одного теста» — среди них НЕТ, то есть собственный пин прибора этого класса не стережёт. Родня ряда **486**, которым прибор и построен: там лечилось «любое красное засчитывается поимкой», здесь остаётся зеркальное «любое зелёное засчитывается выживанием» | платформа | скоро | пустой шаблон `-run` даёт исход «НЕ ИЗМЕРЕНА», и это запинено седьмой формой фикстурного каталога | линза приёмки 17.09, подтверждено чтением `verdict()` |
| 494 | **ФИКСТУРА ПРЕДЕЛА ПЕРЕЗАПУСКОВ ДЕРЖИТ ТРАТУ НУЛЁМ — ПИН ОТЧИТЫВАЕТСЯ ЗА КЛАСС, А МЕРЯЕТ СРЕЗ.** Все четыре денежных пина капа в `platform/internal/runs/attemptcap_test.go` гоняют `f.engine.set(… Spend: usd(0))` при `f.runner.alive = false`, поэтому утверждение «холд вернулся целиком» осмысленно ровно на НУЛЕВОЙ трате. Класс «предел сработал на прогоне, который УЖЕ что-то потратил» идёт другой веткой расчёта и не измерен ничем: пинов капа на ненулевой трате в зоне нет. ⚠ Это не дефект пака — поведение при нуле верно и запинено, — а НЕПОЛНОТА, названная приёмкой и принятая зоной в её же блок «где прибор слеп». Норма, под которую ряд заводится: если фикстура держит что-то постоянным, пин отчитывается за КЛАСС, а меряет СРЕЗ, и молчит о том, какой именно | платформа | скоро | предел перезапусков запинен на прогоне с ненулевой тратой, либо утверждение пина сужено до среза, который он действительно меряет | линза приёмки 17.09, пере-снято оркестратором | | 494 | **ФИКСТУРА ПРЕДЕЛА ПЕРЕЗАПУСКОВ ДЕРЖИТ ТРАТУ НУЛЁМ — ПИН ОТЧИТЫВАЕТСЯ ЗА КЛАСС, А МЕРЯЕТ СРЕЗ.** Все четыре денежных пина капа в `platform/internal/runs/attemptcap_test.go` гоняют `f.engine.set(… Spend: usd(0))` при `f.runner.alive = false`, поэтому утверждение «холд вернулся целиком» осмысленно ровно на НУЛЕВОЙ трате. Класс «предел сработал на прогоне, который УЖЕ что-то потратил» идёт другой веткой расчёта и не измерен ничем: пинов капа на ненулевой трате в зоне нет. ⚠ Это не дефект пака — поведение при нуле верно и запинено, — а НЕПОЛНОТА, названная приёмкой и принятая зоной в её же блок «где прибор слеп». Норма, под которую ряд заводится: если фикстура держит что-то постоянным, пин отчитывается за КЛАСС, а меряет СРЕЗ, и молчит о том, какой именно | платформа | скоро | предел перезапусков запинен на прогоне с ненулевой тратой, либо утверждение пина сужено до среза, который он действительно меряет | линза приёмки 17.09, пере-снято оркестратором |
| 495 | ⛔ **РЕШЕНИЕ ВЛАДЕЛЬЦА О РОДОВОЙ ДИРЕКТИВЕ ЗАПИСАНО В ЖУРНАЛЕ И НЕ ИСПОЛНЕНО В ДАННЫХ — носителя у него не было вовсе.** `backend/internal/lang/data/injection.txt:12` по-прежнему предписывает роли «при неизбежности — мужские», тогда как `D39.254` п.3 постановил «меняется ТОЛЬКО текст данных `injection.txt:12`: вместо «при неизбежности — мужские» — перестроить фразу, а если литературно не выходит, писать как читается лучше», и `D39.263` п.2 уже ОБЪЯВИЛ это исполненным («больше не предписывает»). ⚠ **Замер 17.09 с контролем:** строка в дереве жива (1 совпадение), упоминаний `injection.txt` в журнале решений **4**, рядов трекера на этот предмет — **0**. ⇒ решение существовало только в прозе ратификаций, а гейт чисел такого не видит по построению: он сторожит литералы, а не согласие решений с деревом. ⛔ **И это НЕ «правка данных за $0».** Файл встроен `go:embed` (28 упоминаний в `backend/internal/lang/embedded.go`), а `lang.EmbeddedVersion()` хеширует встроенные файлы целиком (`backend/internal/lang/embedded.go:79`=`hashEmbeddedFiles`) ⇒ хеш двигает тег кроя и ключ манифеста, у купленной книги стираются `unit_resolutions` платформы и пере-покупается нарезка. ⇒ правка идёт в ОКНО ПЕРЕКРОЯ вместе со свёртками исходника (ряд **446**) и ручкой голоса (ряд **410**); окно открыто словом владельца 17.09 и закрывается первым же продолжением книги. ⚠ Класс для следующей смены: **ратифицированное без носителя исполняется ноль раз, и вторая нота, объявившая исполнение, лжи не заметила** — акт судил намерение, а не дерево | бэкенд | скоро (в окне перекроя) | `injection.txt:12` не предписывает род по умолчанию, формулировка ратифицирована, и правка уехала ОДНИМ заходом со всеми прочими правками встроенных данных | верификация актов Fable 5 17.09, пере-снято оркестратором | | 495 | ⛔ **РЕШЕНИЕ ВЛАДЕЛЬЦА О РОДОВОЙ ДИРЕКТИВЕ ЗАПИСАНО В ЖУРНАЛЕ И НЕ ИСПОЛНЕНО В ДАННЫХ — носителя у него не было вовсе.** `backend/internal/lang/data/injection.txt:12` по-прежнему предписывает роли «при неизбежности — мужские», тогда как `D39.254` п.3 постановил «меняется ТОЛЬКО текст данных `injection.txt:12`: вместо «при неизбежности — мужские» — перестроить фразу, а если литературно не выходит, писать как читается лучше», и `D39.263` п.2 уже ОБЪЯВИЛ это исполненным («больше не предписывает»). ⚠ **Замер 17.09 с контролем:** строка в дереве жива (1 совпадение), упоминаний `injection.txt` в журнале решений **4**, рядов трекера на этот предмет — **0**. ⇒ решение существовало только в прозе ратификаций, а гейт чисел такого не видит по построению: он сторожит литералы, а не согласие решений с деревом. ⛔ **И это НЕ «правка данных за $0».** Файл встроен `go:embed` (28 упоминаний в `backend/internal/lang/embedded.go`), а `lang.EmbeddedVersion()` хеширует встроенные файлы целиком (`backend/internal/lang/embedded.go:79`=`hashEmbeddedFiles`) ⇒ хеш двигает тег кроя и ключ манифеста, у купленной книги стираются `unit_resolutions` платформы и пере-покупается нарезка. ⇒ правка идёт в ОКНО ПЕРЕКРОЯ вместе со свёртками исходника (ряд **446**) и ручкой голоса (ряд **410**); окно открыто словом владельца 17.09 и закрывается первым же продолжением книги. ⚠ Класс для следующей смены: **ратифицированное без носителя исполняется ноль раз, и вторая нота, объявившая исполнение, лжи не заметила** — акт судил намерение, а не дерево | бэкенд | скоро (в окне перекроя) | `injection.txt:12` не предписывает род по умолчанию, формулировка ратифицирована, и правка уехала ОДНИМ заходом со всеми прочими правками встроенных данных | верификация актов Fable 5 17.09, пере-снято оркестратором |
| 496 | ⛔ **ЦЕЛЬ `battery-stand` НА GIT-ВОРКРИ НЕ ПРОХОДИТ ПО ПОСТРОЕНИЮ, И ЕЁ СОБСТВЕННОЕ ОБЕЩАНИЕ ИСПОЛНЯЕТСЯ НАОБОРОТ.** Рецепт ставит флаги ВНУТРИ команды (`backend/Makefile:140`=`TM_MINER_PARITY=1 TM_CHECKER_LABELS=1`), то есть у оператора выбора нет — «я неудачно запустил» тут неверный диагноз. `standdata.Root()` ищет корень по маркеру (`backend/internal/standdata/standdata.go:35`=`Root finds the repository root by MARKER`) и в воркри разрешается в корень ВОРКРИ, где `eval/.gitignore` исключает `data/` правилом-классом ⇒ путь по умолчанию указывает туда, где файла не может быть никогда. Замер 17.09: `eval/exp16/data` в воркри отсутствует, гиту файл неизвестен (`git ls-files --error-unmatch` — 0), в основном чекауте лежит (5 071 852 байта), и цель падает `TM_MINER_PARITY=1 but required data is missing`. ⛔ Комментарий цели обещает «при отсутствии данных ПАДАТЬ, чтобы наличие корпуса УТВЕРЖДАЛОСЬ, а не предполагалось» — на воркри она утверждает отсутствие стенда, которого нет только здесь, и её сообщение читается как находка о дереве. ⚠ Лечение — НЕ оверрайд пути: `TM_MINER_PARITY_CONTRAST=<путь в основном чекауте>` живёт на одной машине и умрёт при переносе, как умирают вычисленные адреса. У артефакта есть воспроизводимое происхождение — регенерируется из jieba 0.42.1 с запиненным SHA (`docs/experiments/16-bank-mining.md:183`=`jieba_dict_general_zh.txt`) ⇒ цель обязана либо регенерировать его, либо объявлять отсутствие стенда ОТДЕЛЬНЫМ исходом, а не падением. Пять корпусных тестов при поданном стенде проходят — прибор годен, негоден его путь по умолчанию | бэкенд | скоро | цель проходит на воркри без ручных оверрайдов, либо печатает «стенда нет» отдельным исходом, отличимым от падения | замер оркестратора 17.09 при приёмке `D39.266` |

File diff suppressed because one or more lines are too long

View file

@ -24,8 +24,9 @@
- **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог): - **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог):
| Роль | Активный промт | Статус | | Роль | Активный промт | Статус |
|---|---|---| |---|---|---|
| **Бэкенд · АНГЛИЙСКАЯ ПАРА 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.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** |
| **Бэкенд · РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ** | [BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md](BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md) | **ВЫДАН 17.09** сессии `textmachine-main-57` (свежая: паков не брала, контекст пуст — проверено опросом, а не списком). ⚠ Свежих нашлось ДВЕ; вторая (`textmachine-main-78`) оставлена нетронутой, ей сказано не читать промт и не занимать зону — один промт на зону. Предмет: движок на каждой покупке заново платит банк-ролям за решённые термины — 12 из 69 и 14 из 66 смен передачи при неизменной улике у 25 из 26 строк; потолки ролей ПОЖИЗНЕННЫЕ. Строит базис решённого (ряд **130**) и стража разрыва окон (ряд **490**). Два рубежа пройдены: механическая сверка 13 блоков (27 якорей, все живы) и субагент-опровергатель — **12 находок, 9 денежных, все внесены**, включая мою ложь «текста в коде нет» о живой строке и материал замера, из которого предмет не строился. $0 | | Бэкенд · РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 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 |
| **Бэкенд · БАНК ЗА $0** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.257`**; промт в [archive/prompts/](archive/prompts/BACKEND_BANK_ZERO_LAYER_SESSION_PROMPT.md) с баннером-исходом. 29 путей, $0. ⭐ Посылка `D39.256` перестала быть посылкой: 25 из 26 смен при идентичном входе. ⛔ Мажоры — сдвинутые якоря (ряд 467) и арм по чужому знаменателю (ряд 462). ⚠ Остаток: полный прогон каталога мутаций (267) на момент акта не закончен. **Слот бэкенда СВОБОДЕН** | | **Бэкенд · БАНК ЗА $0** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.257`**; промт в [archive/prompts/](archive/prompts/BACKEND_BANK_ZERO_LAYER_SESSION_PROMPT.md) с баннером-исходом. 29 путей, $0. ⭐ Посылка `D39.256` перестала быть посылкой: 25 из 26 смен при идентичном входе. ⛔ Мажоры — сдвинутые якоря (ряд 467) и арм по чужому знаменателю (ряд 462). ⚠ Остаток: полный прогон каталога мутаций (267) на момент акта не закончен. **Слот бэкенда СВОБОДЕН** |
| **Бэкенд · КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.255`**; промт в [archive/prompts/](archive/prompts/BACKEND_BOUGHT_MEANS_DELIVERED_SESSION_PROMPT.md) с баннером-исходом. Лендинг `af88680`, 29 путей, $0. Закрыты строки **291** и **379** (вторая — ЗАМЕРОМ: мутант 8/8 против 7/8 в ряду). ⛔ Пак пережил ПОТЕРЮ сессии: `textmachine-b1` построила почти всё и исчезла при переезде окружения, доводила `textmachine-main-b1` разделом ПЕРЕДАЧИ ред. 5. ⚠ Остаток — строки **375** · **232** · **453****456**; три опубликованных ключа качества сменили смысл (п.5 акта). **Слот бэкенда СВОБОДЕН** | | **Бэкенд · КУПЛЕНО — ЗНАЧИТ ДОСТАВЛЕНО** | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 16.09 С НАЗВАННЫМ ОСТАТКОМ** — акт **`D39.255`**; промт в [archive/prompts/](archive/prompts/BACKEND_BOUGHT_MEANS_DELIVERED_SESSION_PROMPT.md) с баннером-исходом. Лендинг `af88680`, 29 путей, $0. Закрыты строки **291** и **379** (вторая — ЗАМЕРОМ: мутант 8/8 против 7/8 в ряду). ⛔ Пак пережил ПОТЕРЮ сессии: `textmachine-b1` построила почти всё и исчезла при переезде окружения, доводила `textmachine-main-b1` разделом ПЕРЕДАЧИ ред. 5. ⚠ Остаток — строки **375** · **232** · **453****456**; три опубликованных ключа качества сменили смысл (п.5 акта). **Слот бэкенда СВОБОДЕН** |
| Сквозной · ХОЛОДНЫЙ ПРОГОН B | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 11.09** — акт **D39.252**; промт в [archive/prompts/](archive/prompts/COLD_RUN_B_SESSION_PROMPT.md) с баннером-исходом. Книга второй раз от двери до ФАЙЛА, факт **$0.396657**. ⭐ Две меры денежной дыры разошлись в РАЗНЫЕ стороны на одних данных; **85.7 % оплаченного выхода — размышление, а не текст**. ⛔ Прибор приоритета №1 солгал вердиктом по подписанному имени героя. Качество впервые судилось по ОРИГИНАЛУ рядом с переводом: 26 находок, 1 крит | | Сквозной · ХОЛОДНЫЙ ПРОГОН B | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 11.09** — акт **D39.252**; промт в [archive/prompts/](archive/prompts/COLD_RUN_B_SESSION_PROMPT.md) с баннером-исходом. Книга второй раз от двери до ФАЙЛА, факт **$0.396657**. ⭐ Две меры денежной дыры разошлись в РАЗНЫЕ стороны на одних данных; **85.7 % оплаченного выхода — размышление, а не текст**. ⛔ Прибор приоритета №1 солгал вердиктом по подписанному имени героя. Качество впервые судилось по ОРИГИНАЛУ рядом с переводом: 26 находок, 1 крит |

View file

@ -1,4 +1,4 @@
# Реестр D-нот — карта актуальности v2 (D1D39.265; титул — носитель головы, бампать при каждом аппенде) # Реестр D-нот — карта актуальности v2 (D1D39.266; титул — носитель головы, бампать при каждом аппенде)
> ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не
> место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы,
@ -324,3 +324,4 @@
| D39.263 | 17.09 | **ОСТАТОК КОНСИЛИУМНЫХ РАСХОЖДЕНИЙ ЗАКРЫТ.** Д-1+Д-2 одной нотой: производитель проактивного `gender=hidden` — ЧЕЛОВЕК через сид, детектора не вводить; роль, названная ДВУМЯ ратифицированными нотами, в движке отсутствует (замер: 0 хитов при контроле 188). Д-6+Д-17: условия `D39.76`, ряда 192, `D39.144` п.1, `D21` п.2 ПРИОСТАНОВЛЕНЫ, а не отменены — сужение области не есть отмена. ⛔ Д-3 ОТКЛОНЁН (второй отказ после Д-13): адрес указывал в несуществующий путь, а по верному ветка статуса не касается, инвариант `D39.42` §C2-7 держится. ⭐ Но проверка вскрыла другое — `status:auto` с непустым `dst`, состояние, которое четыре комментария движка объявляют невозможным: ряд **487** | ЖИВОЕ: ряды 444 · 487; правка строки языковых данных — зона бэкенда | жив | банк процесс | | D39.263 | 17.09 | **ОСТАТОК КОНСИЛИУМНЫХ РАСХОЖДЕНИЙ ЗАКРЫТ.** Д-1+Д-2 одной нотой: производитель проактивного `gender=hidden` — ЧЕЛОВЕК через сид, детектора не вводить; роль, названная ДВУМЯ ратифицированными нотами, в движке отсутствует (замер: 0 хитов при контроле 188). Д-6+Д-17: условия `D39.76`, ряда 192, `D39.144` п.1, `D21` п.2 ПРИОСТАНОВЛЕНЫ, а не отменены — сужение области не есть отмена. ⛔ Д-3 ОТКЛОНЁН (второй отказ после Д-13): адрес указывал в несуществующий путь, а по верному ветка статуса не касается, инвариант `D39.42` §C2-7 держится. ⭐ Но проверка вскрыла другое — `status:auto` с непустым `dst`, состояние, которое четыре комментария движка объявляют невозможным: ряд **487** | ЖИВОЕ: ряды 444 · 487; правка строки языковых данных — зона бэкенда | жив | банк процесс |
| D39.264 | 17.09 | **ПРИЁМКА ПАКА «ЛЕСТНИЦА ПОПЫТКИ ДЛЯ БАНК-РОЛЕЙ»** — 18 путей, $0. Петля повторной попытки вынесена в общий контур, банк-роли подключены к вердикту, который движок вычислял и ВЫБРАСЫВАЛ; ступени бюджетируются политикой фазы, где `nil` = одиночный выстрел по построению. Кампания на финальной редакции: `MUT_EXIT=0`, 281 из 281 RED, выживших и неизмеренных 0, каталог 492. ⛔ Два пункта заказа закрыты ОТКАЗОМ С ЗАМЕРОМ и оба приняты: хоп банк-ролей (болезнь лечится бюджетом, не другой моделью) и ключ батча (посылка ряда 478 опровергнута прибором в дереве). ⭐ Полный прогон каталога нашёл то, чего не увидел ни один более дешёвый прибор: рефактор МОЛЧА обездвижил чужой пин при совпадающем якоре. Приёмка дала четыре находки, все починены: асимметрия записи счётчиков · отсутствие посадки у единственной денежной ручки в бою · поимка по неверно названной причине · число, снятое в середине работы и не пере-снятое | ЖИВОЕ: ряды 481 · 484 · 487 · 488; форма гейта названа точно — `make battery` целиком не отработал, цели прогнаны по отдельности | жив | банк деньги процесс | | D39.264 | 17.09 | **ПРИЁМКА ПАКА «ЛЕСТНИЦА ПОПЫТКИ ДЛЯ БАНК-РОЛЕЙ»** — 18 путей, $0. Петля повторной попытки вынесена в общий контур, банк-роли подключены к вердикту, который движок вычислял и ВЫБРАСЫВАЛ; ступени бюджетируются политикой фазы, где `nil` = одиночный выстрел по построению. Кампания на финальной редакции: `MUT_EXIT=0`, 281 из 281 RED, выживших и неизмеренных 0, каталог 492. ⛔ Два пункта заказа закрыты ОТКАЗОМ С ЗАМЕРОМ и оба приняты: хоп банк-ролей (болезнь лечится бюджетом, не другой моделью) и ключ батча (посылка ряда 478 опровергнута прибором в дереве). ⭐ Полный прогон каталога нашёл то, чего не увидел ни один более дешёвый прибор: рефактор МОЛЧА обездвижил чужой пин при совпадающем якоре. Приёмка дала четыре находки, все починены: асимметрия записи счётчиков · отсутствие посадки у единственной денежной ручки в бою · поимка по неверно названной причине · число, снятое в середине работы и не пере-снятое | ЖИВОЕ: ряды 481 · 484 · 487 · 488; форма гейта названа точно — `make battery` целиком не отработал, цели прогнаны по отдельности | жив | банк деньги процесс |
| D39.265 | 17.09 | **ПРИЁМКА ПЛАТФОРМЕННОГО ПАКА «ПРОГОН НЕ ВРЁТ О СЕБЕ»** — 32 пути, $0, контрактный минор **0.17.0** (`Run.progress_lagging` и `Run.rebill_consent_micro_usd`). Закрыты работой ряды **398** · **399** · **400** · **486**, ПЕРЕ-РЕШЕНИЕМ — **394** (четвёртое значение в клиентский словарь не идёт: «мы сами перестали перезапускать» — другая ось, чем «стоит ли повторять», и границу стережёт гейт на три носителя) и **396** («оставить, с капом как условием»), половиной — **416**. Кампания пере-снята оркестратором: 26 записей · поймано 25 · выжила 1 (объявлена до прогона) · неизмеренных 0. ⛔ Гейт зоны красен на экземпляре ряда **484** (фикстурный бюджет записи под нагрузкой), оба теста живут в чистом `HEAD`. Находки приёмки: канон описывал происхождение денежного согласия у́же кода · всегда-посылаемый член вне `required` · харнесс читает пустой шаблон как выжившую. ⚠ Две мои ошибки: взял себе правку канона (откачена) и неточная посылка §4.1 промта | приёмка | `docs/archive/prompts/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md` | | D39.265 | 17.09 | **ПРИЁМКА ПЛАТФОРМЕННОГО ПАКА «ПРОГОН НЕ ВРЁТ О СЕБЕ»** — 32 пути, $0, контрактный минор **0.17.0** (`Run.progress_lagging` и `Run.rebill_consent_micro_usd`). Закрыты работой ряды **398** · **399** · **400** · **486**, ПЕРЕ-РЕШЕНИЕМ — **394** (четвёртое значение в клиентский словарь не идёт: «мы сами перестали перезапускать» — другая ось, чем «стоит ли повторять», и границу стережёт гейт на три носителя) и **396** («оставить, с капом как условием»), половиной — **416**. Кампания пере-снята оркестратором: 26 записей · поймано 25 · выжила 1 (объявлена до прогона) · неизмеренных 0. ⛔ Гейт зоны красен на экземпляре ряда **484** (фикстурный бюджет записи под нагрузкой), оба теста живут в чистом `HEAD`. Находки приёмки: канон описывал происхождение денежного согласия у́же кода · всегда-посылаемый член вне `required` · харнесс читает пустой шаблон как выжившую. ⚠ Две мои ошибки: взял себе правку канона (откачена) и неточная посылка §4.1 промта | приёмка | `docs/archive/prompts/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md` |
| D39.266 | 17.09 | **ПРИЁМКА БЭКЕНД-ПАКА «РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ»**`d25e418`, 32 пути, $0. Решённая движком строка переживает покупку: носитель — таблица `bank_basis` (миграция v19, аддитивная, `memory_version` не двигает). РАТИФИЦИРОВАНЫ смена поведения (первый прогон после появления базиса платит ОДИН раз за переупаковку хвоста батчей: run1/run2 по `$0.001820`, run3/run4 по нулю) и пятая роль онтологии — ПАМЯТЬ РЕШЕНИЙ со второй петлёй защиты подписанного. Ряды: **490** закрыт по трём условиям (страж · живой путь · посадка), **130** получил ТРЕТИЙ исход — замысел достигнут другим механизмом, механизм ряда не построен намеренно, стоп-решение остаётся за владельцем, остаток сужен до двух предметов; **447** и сторож растущей книги — отказы с замером; заведён **496**. Числа приёмки сняты оркестратором: батарея `MAKE_EXIT=0` 24=24 при 11 названных скипах, пять корпусных тестов предъявлены исполнением, кампания **315/315 поймано, выживших 0, неизмеренных 0** с полнотой в обе стороны, M1 — **67 из 69** и **64 из 66** обслужено из памяти при верности реконструкции без расхождений. ⛔ Приёмка нашла в отчёте две дыры ОДНОГО класса — не неверное число, а отсутствующее утверждение (прибор, не названный прибором; заказанный ряд без исхода), и купила норму: **собственные проверки не находят отсутствующее, потому что знаменателем им служит свой же текст** ⇒ сверять перечень заказа по СПИСКУ ЗАКАЗЧИКА. ⚠ Шесть ошибок оркестратора названы в теле, включая два ложных ноля по `books/` от двух РАЗНЫХ приборов | приёмка | `docs/archive/prompts/BACKEND_SETTLED_STAYS_SETTLED_SESSION_PROMPT.md` |

View file

@ -1,4 +1,4 @@
# Журнал решений оркестратора — контракт D1D39.265 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) # Журнал решений оркестратора — контракт D1D39.266 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`)
> **КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > **КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто:
> ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+). > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+).
@ -4646,3 +4646,75 @@ Postgres — её предположение (движок работает на
**9. Что осталось названным, а не построенным.** Движковая половина ряда 416 (проекция пере-покупки). **9. Что осталось названным, а не построенным.** Движковая половина ряда 416 (проекция пере-покупки).
Пустой шаблон `-run` в харнессе и фикстура капа на нулевой трате — оба ограничения названы ЗОНОЙ в её Пустой шаблон `-run` в харнессе и фикстура капа на нулевой трате — оба ограничения названы ЗОНОЙ в её
собственном блоке «где прибор слеп». `PD-216` открыта с снятым блокером; заведены `П-24` и `П-25`. собственном блоке «где прибор слеп». `PD-216` открыта с снятым блокером; заведены `П-24` и `П-25`.
## D39.266 — ПРИЁМКА БЭКЕНД-ПАКА «РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ»: ПРИНЯТ (17.09) ✅
**1. Что заландено.** `d25e418`, **32 пути**, $0 — платных вызовов пак не делал ни одного. 31 путь в
`backend/` (21 правленый, 10 новых) и `docs/architecture/18-bank-ontology.md`. Носитель решённого — таблица
`bank_basis`, миграция v19, аддитивная: авто-банк и `memory_version` она не двигает.
**2. РАТИФИЦИРУЕТСЯ СМЕНА ПОВЕДЕНИЯ.** Первый прогон книги после появления базиса платит ОДИН раз за
переупаковку хвоста батчей. Замер зоны по четырём прогонам одной фикстуры: run1 `$0.001820` · run2
`$0.001820` · run3 `$0.000000` · run4 `$0.000000`. Механизм: базис — ТРЕТИЙ вход состава батчей, run2
встречает состав, которого у run1 не было, и не находит чекпойнта по хешу запроса. Лечение «встать в
сторону у книги, которая уже платила» ОТКЛОНЕНО: правило, решающее иначе на втором прогоне, не есть
правило резюма. Цена ограничена `gates.terminology.budget_usd` и объявлена сообщением оператору.
**3. РАТИФИЦИРУЕТСЯ ПЯТАЯ РОЛЬ ОНТОЛОГИИ.** `docs/architecture/18-bank-ontology.md` правил пак, страница
ратифицирована `D39.158`; настоящей нотой её новая строка получает своё основание — ПАМЯТЬ РЕШЕНИЙ как
пятая сущность и вторая петля защиты подписанного.
**4. Исходы рядов.** **490** — ЗАКРЫТ работой, и закрыт по ТРЁМ условиям, а не по одному: страж построен
(`backend/internal/membank/memvoice.go:404`=`TermWindowGaps reports a bank SURFACE`), стоит на живом пути
(`backend/internal/pipeline/seeding.go:68`=`if gaps := membank.TermWindowGaps(rows)`), логирует и НИКОГДА
не фатален — форма взята у образца голосов вместе с его гарантией, — и запинен записью каталога
`BASIS-term-window-gap-goes-unreported` с флагом `battery`. **130**НЕ ЗАКРЫТ, и получает ТРЕТИЙ исход
вместо молчания: замысел ряда достигнут ДРУГИМ механизмом, механизм самого ряда не построен и не построен
НАМЕРЕННО (накопительный мердж авто-банка двигает `memory_version`, а базис — аддитивная таблица, которая
банк не трогает) ⇒ гейт стоп-решения владельца паком не достигается по построению, решение остаётся за
владельцем, остаток сужен до двух предметов (накопительный мердж · слоты seed-rejects). Замер зоны:
изменённых строк 1153, по каждому из трёх предметов остатка — НОЛЬ. **447**ОТКАЗ с замером: подписанных
строк 2 из 69 и 2 из 66 ⇒ выгода ограничена 3 % прохода; вместо ряда отделено безопасное следствие —
подписанная строка больше не ДЕРЖИТ семью. Сторож растущей книги — ОТКАЗ с замером: посылка «исходник
приходит целиком» есть открытый вопрос владельцу, и сторож ответил бы за него молча. Заведён ряд **496**.
**5. Числа приёмки — сняты МНОЙ, на замороженном дереве, каждое своим прибором.** Гейт зоны `make battery`:
`MAKE_EXIT=0`, `go list` 24 = вердиктов 24, `comm -23` пуст, FAIL 0, скипов 11 и они НАЗВАНЫ поимённо.
Стендовая цель с поданным корпусом: пять корпусных тестов, молчавших у обычной батареи, идут и проходят
(`TestK6LabelsBaseline` · `TestK6TheTwoRelaxationsPricedSeparatelyOnTheSameLabels` ·
`TestCheckerLabelsBaseline` · `TestCheckerLabelsCandidates` · `TestTheInstrumentAgainstTheColdRunOracle`),
снято с `-v`, потому что без него ответа не существует. Кампания на отдельном корне штатной целью:
**315 записей гейта, 315 вердиктов, поймано 315, ВЫЖИВШИХ 0, НЕИЗМЕРЕННЫХ 0**, `MUT_EXIT=0`,
`anchors swept: 0 of 526 entr(ies) rotten`; полнота сверена в ОБЕ стороны — уникальных идентификаторов 315,
записей `battery` в каталоге того же прогона 315, обе разности пусты. M1 на копиях купленных прогонов:
A — кандидатов 69, предложено базису 68, обслужено **67 (97 %)**, пере-спрошен 1; B — 66, 65, **64 (97 %)**,
1; верность реконструкции 69/69 и 66/66 при `missing=0 extra=0`; контроли различают — `kwic_per_term` и
`kwic_width` теряют 0, положительный контроль `basis_width 40→80` теряет ВСЕ 67 и 64. Отпечаток состава
сдаваемого дерева воспроизведён методом зоны знак в знак.
**6. ⛔ ЧТО ПРИЁМКА НАШЛА В ОТЧЁТЕ, И ЭТО ОДИН КЛАСС.** Две дыры, и обе — **не неверное число, а
отсутствующее утверждение**. (а) Один из новых тестов — не пин, а ПРИБОР: `TestProbeBankBasisM1` гейчен
`TM_BASIS_M1`, которого не ставит ни одна цель Makefile ⇒ в батарее он скипается и его зелень не значит
ничего; в докблоке файла это было названо, в отчёте — нет. (б) Ряд **130** был ЗАКАЗАН промтом и в отчёте
не упомянут ни разу при требовании исхода по КАЖДОМУ пункту. Ни шесть кругов зоны, ни её адверсариальный
контролёр, ни полный прогон каталога их не видели. ⭐ **Норма, купленная этим (формулировка зоны):
собственные проверки не находят отсутствующее, потому что знаменателем им служит СВОЙ ЖЕ текст.** Спросить
у дерева, сходится ли отчёт, автор умеет; спросить у отчёта, все ли предметы названы, — нет, список
берётся оттуда же. ⇒ перечень заказа сверяется с перечнем отчёта по СПИСКУ ЗАКАЗЧИКА, тем же движением,
что `comm -23` над пакетами батареи. ⭐ Зона закрыла обе и добавила замер, которого никто не просил:
записей каталога, чей ЛОВЕЦ env-гейчен, — **0 из 34** при знаменателе 12 env-гейченных тестов в дереве.
**7. ⛔ МОИ ОШИБКИ ЭТОЙ ПРИЁМКИ — шесть, все пойманы приборами, не чтением.** (а) Приписал паку ТРИ
env-гейченных прибора вместо одного: две пробы пред-существуют, и поймано это диффом, а грепом файла —
нет. (б) Прочитал «31 путь» из середины предложения зоны как ИТОГ, тогда как фраза продолжалась словом
«плюс»; расхождения не было. (в) Объявил стендовую цель красной по своей вине — а флаги ставит сам рецепт
(`backend/Makefile:140`), и самообвинение спрятало бы дефект цели (ряд 496). (г) Спросил каталог мутаций
несуществующим полем `tags` и получил ноль при 526 прочитанных записях. (д) Счёл `FAIL` шаблоном,
ловившим строки-итога, и получил три падения вместо одного. (е) Дважды получил ложный ноль по `books/`:
обёртка грепа не видит каталог по `.gitignore`, а `find` не спускается в симлинк без `-L` — два РАЗНЫХ
прибора, один ноль, и оба выглядели ответом о дереве. ⇒ гардрейл про `find -L` заводится этой нотой.
**8. Что осталось названным, а не построенным.** Платформенная половина `settled_earlier` — носитель
ряд **492**. `basis_width` не заполнен ни одной парой (пар-данность построена и запинена, живьём не
исполняется). Смена `basisFingerprintVersion` обнуляет базис каждой книги разом; механизма пере-счёта без
покупки нет. M1 не судит КАЧЕСТВО и замерен на книге из трёх глав — на длинной число может быть другим.

View file

@ -1,5 +1,15 @@
# Бэкенд-пак: РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ — движок платит за ответ, который у него уже есть # Бэкенд-пак: РЕШЁННОЕ НЕ ПЕРЕ-СПРАШИВАЕТСЯ — движок платит за ответ, который у него уже есть
> ✅ **АРХИВ — ПАК ОТРАБОТАН И ПРИНЯТ 17.09: акт `D39.266`** (лендинг `d25e418`, **32 пути**, $0 — платных
> вызовов моделей пак не делал). Решённая движком строка переживает покупку: носитель — таблица
> `bank_basis`, миграция v19, аддитивная. Ряд **490** закрыт по трём условиям, ряд **130** получил ТРЕТИЙ
> исход (замысел достигнут другим механизмом, стоп-решение остаётся за владельцем), два отказа сданы с
> замером, заведён ряд **496**. Числа приёмки: кампания **315/315 поймано, выживших 0, неизмеренных 0**;
> M1 — **67 из 69** и **64 из 66** обслужено из памяти.
> **Инструкции отсюда НЕ ИСПОЛНЯТЬ** (правило архива): живое — в акте `D39.266` и в рядах **492** · **496**.
> ⚠ Якоря этого файла целились в строки, которые пак и был заказан переписать: они мертвы ПО ПОСТРОЕНИЮ и
> чинить их нельзя — пере-наводка «под то, что в цели оказалось» есть подгонка под зелень.
> Выдача №14 очереди №23. Зона — `backend/`. Платных вызовов моделей пак НЕ делает: $0. > Выдача №14 очереди №23. Зона — `backend/`. Платных вызовов моделей пак НЕ делает: $0.
> ⚠ **Числа и адреса этого промта сняты мной по дереву 17.09. Те, на которых ты строишь решение, пере-снимай сама** > ⚠ **Числа и адреса этого промта сняты мной по дереву 17.09. Те, на которых ты строишь решение, пере-снимай сама**
> заимствованное число улики не заменяет. За смену адреса в моих источниках уезжали семь раз, а два указывали > заимствованное число улики не заменяет. За смену адреса в моих источниках уезжали семь раз, а два указывали

File diff suppressed because one or more lines are too long