Open two tracker rows for the EPUB ingest: nested block quotes multiply line breaks inside verse, and italic spans may not reach the chunk at all

This commit is contained in:
heaven 2026-09-17 22:23:34 +03:00
parent 1ffd3202af
commit 873d436a15

View file

@ -3,7 +3,7 @@
> **Единственный трекер проекта.** Здесь живут строки, на которые доки, промты и 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`).
> ⚠ **Состояние проекта — не здесь.** Очередь, курс, CURRENT-STATE, состояние паков и живая хроника — шапка [PROGRESS.md](PROGRESS.md). Здесь только долг и его диспозиции.
> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **371** строк · зона бэкенд **198** строго / **251** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **198** (перечень — грепом по таблице, рукописный список снят D39.126) · гейт-строка эксп-22: 153 (плюс 150 — руки владельца; ⚠ 55 из гейтов СНЯТА — D39.198 п.5); строка 5 — остаток гейчен ре-пробой 74, носитель события теперь строка 188 (аудит D39.140); остальное «когда-нибудь». ⚠ Счёт — НИЖНЯЯ граница долга, не потолок (разбор — легенда таблицы ниже).
> - **СЧЁТ ОЧЕРЕДИ на 17.09 (скриптом по таблице — `python3 docs/scripts/counts.py`; обновлять при каждом лендинге):** всего **373** строк · зона бэкенд **200** строго / **253** широко (⚠ колонки счётчик читает С КОНЦА — испр. D39.116) · **блокеров очереди 0** (236 закрыта D39.175; **371** — актом D39.233, **360** — актом D39.232, обе 10.09), платные прогоны разблокированы · «скоро» **200** (перечень — грепом по таблице, рукописный список снят 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` на прежнем месте оставлен заголовок-указатель, поэтому ссылки «секция „Бэклог“» доезжают в один хоп.
## Бэклог (ЕДИНЫЙ, собран 26.07, актуализация 04.08 D39.99/D39.101; правки — только через оркестратора)
@ -407,3 +407,5 @@
| 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` |
| 498 | ⛔⛔ **`prompt_override` НЕ СПРАШИВАЕТ ПРО ПАРУ, И ВСЕ ЧЕТЫРЕ БОЕВЫХ КОНФИГА УЖЕ НАЦЕЛЕНЫ НА `zh-ru` ⇒ АНГЛИЙСКАЯ КНИГА ПОЕДЕТ КИТАЙСКИМ ПРОМТОМ ПЕРЕВОДЧИКА МОЛЧА.** Конвенционный путь `<prompts root>/<pair>/<role>.md` падает ГРОМКО на отсутствующей паре именно затем, чтобы конвенции чужой пары не подставлялись тихо; `prompt_override` проверяет только ЧИТАЕМОСТЬ файла и про пару не спрашивает никогда. Замер с контролем (`tmctl manifest` на настоящей английской книге, `source_lang: en`): override на настоящий `backend/prompts/zh-ru/translator-banknote.md`**`EXIT=0`**, конфиг грузится и в той же сводке печатает `en→ru`; контроль — override на несуществующий файл того же каталога → `EXIT=10` «prompt_override template … is not readable». ⇒ гард есть, но он про файл, а не про принадлежность. Зашито во ВСЕХ боевых: `backend/configs/pipeline-c1.yaml:77`, `backend/configs/pipeline-arm-glm.yaml:38`, `backend/configs/pipeline-arm-mistral.yaml:42` (все `../prompts/zh-ru/translator-banknote.md`), `backend/configs/pipeline-c2.yaml:43` (`../prompts/zh-ru/judge-selector.md`). ⛔ **Цена конкретна и она в КАЧЕСТВЕ, а не в падении:** английская книга получит промт, который велит «китайский 时辰 = 2 часа», «доля 成 — десятые» и требует банкнотную таблицу по китайским правилам. ⚠ Класс — «промт проверен НАЛИЧИЕМ файла, а не тем, чему он принадлежит»; это дверь, через которую возвращается латентный баг, ради которого конвенционный путь и сделан громким. **Обход данными существует** (своя пайплайн-копия книги с override на свою пару) и применён паком английской пары — но обход прячет цену: следующая пара наступит на то же и наступит молча. **Лечение:** override обязан лежать внутри каталога пары ЭТОЙ книги, иначе громкий отказ, называющий и путь, и пару; осознанный вариант роли (`editor-mono`, банкнота) этим не ломается — он и так в каталоге своей пары. ⚠ `PromptSHA256` берётся по СОДЕРЖИМОМУ, а не по пути ⇒ пере-снапшота правка не требует (предъявить замером до правки конфигов) | бэкенд | **скоро (БЛОКЕР ратификации готовности)** | гард отказывает на override вне каталога пары книги, пин краснеет ИМЕННО этим (текст про пару, а не про читаемость), запись каталога с флагом `battery`, четыре боевых конфига переведены на путь от пары | замер `textmachine-main-c5` 17.09 на английской книге, разрешение оркестратора |
| 497 | ⛔ **ПИН КВАДРАТИЧНОСТИ ФЛЕЙКУЕТ НА ЗДОРОВОМ ДЕРЕВЕ И КРАСИТ ЧУЖОЙ ЛЕНДИНГ.** `TestEvidenceWindowsDoesNotGrowQUADRATICALLYWithTheBook` (`backend/internal/terminology/evidence_test.go:77`=`linear ≈4, quadratic ≈16`; размеры входа объявлены строками выше — `measure(2000)` и `measure(8000)`) утверждает ОТНОШЕНИЕ времён, и его докблок объясняет выбор так: «IT ASSERTS A RATIO, NOT A DURATION. A wall-clock threshold on a shared machine is a flake; the shape of the curve is the property». ⛔ **Посылка опровергнута замером: отношение защищает от РОВНОЙ нагрузки и слепо к её ИЗМЕНЕНИЮ между половинами.** Обе половины меряются ПОСЛЕДОВАТЕЛЬНО, а `go test ./...` гоняет пакеты параллельно — выросла контенция между малым и большим замером, и отношение раздулось, ничего об этом не сказав. ⚠ **Улика — два вердикта на ОДНОМ коммите `871e0af`:** приёмка оркестратора дала `MAKE_EXIT=0`, входная батарея следующей сессии — `MAKE_EXIT=2` с `ratio ×16.5` при пороге 16 (малый замер прошёл на 42.5 мс против изолированных 22, то есть уже вдвое медленнее). Изолированно пять прогонов оркестратора дают 4.3 · 4.3 · 3.1 · 4.6 · 5.7 — свойство ДЕРЖИТСЯ, негоден прибор. ⇒ **зелень приёмки была везением, а не замером**, и цена дефекта не в этом тесте, а в том, что он красит лендинг чужой зоны и заставляет её доказывать невиновность. **Форма лечения названа сессией:** мерить половины ВПЕРЕМЕЖКУ (A-B-A-B, брать медиану) либо нормировать на опорный замер той же секунды — тогда общая нагрузка сокращается по-настоящему, а не по предположению. ⚠ Родня ряда про «пин, флейковый на мутанте, измеряет пустой сценарий», но здесь хуже: флейк на ЗДОРОВОМ дереве | бэкенд | скоро | пин краснеет только на настоящей квадратичности: посадка «вернуть квадратичный `window()`» краснеет им, а десять прогонов полной батареи подряд — зелёные | найдено `textmachine-main-c5` на входной батарее 17.09, пере-снято оркестратором пятью изолированными прогонами |
| 499 | ⛔ **ИНГЕСТ EPUB РВЁТ СТИХ И ЭПИГРАФ ПОСРЕДИ ФРАЗЫ — ВЛОЖЕННОСТЬ БЛОЧНОЙ ЦИТАТЫ УМНОЖАЕТ ПЕРЕНОСЫ.** `backend/internal/chunk/ingest.go:978`=`"h5": true, "h6": true, "li": true, "blockquote": true` — каждый блочный тег отдаёт перенос, и набор существует НАМЕРЕННО: соседний докблок (`:975`=`survives extraction; without them a whole chapter collapses into one paragraph`) объясняет, что без него глава схлопывается в один абзац. ⛔ Но у книги, где эпиграф набран ВЛОЖЕННЫМИ `blockquote` — по одному на типографскую строку, — переносы умножаются на глубину. **Замер пере-снят оркестратором своим прибором и сошёлся с зонным знак в знак: 382 тега `blockquote` в 12 документах из 126, максимальная вложенность 10.** Следствие на входе модели (замер сессии по всем 71 главам движка): непустых абзацев 11 203, из них **726 не кончаются знаком конца предложения** — 6.5 % абзацев и 1.7 % рун, то есть обрывки фразы; прогонов из 8 подряд переносов — 101, из 16 — 66, встречается до 24. Обычная проза при этом ЦЕЛА (контроль: 2532 абзаца в крупнейшей главе) ⇒ предмет именно вложенность, а не блочность. ⛔ **Цена — качество перевода:** модель получает стих как набор обрывков, разделённых восемью пустыми строками, и сшивает их по своему усмотрению. ⚠ **Сегодня это обойдено ПРАВИЛОМ В ПРОМТЕ английской пары («собери такой блок в целую фразу»), и сессия сама назвала это КОСТЫЛЁМ вслух** — обход прячет цену, пока нет механизма. Лечение по роду: вложенная цитата есть ОДИН блок, а не N; условие снятия костыля — пин, краснеющий на вложенности ≥2 | бэкенд | скоро | вложенный `blockquote` даёт один перенос, а не по одному на уровень; пин на книге с вложенностью ≥2; правило-костыль снято из промта и названо в отчёте | замер `textmachine-main-c5` 17.09, пере-снят оркестратором (382/12/10 — сошлось) |
| 500 | ⚠ **ПОДОЗРЕНИЕ, А НЕ ЗАМЕР: ИНГЕСТ EPUB, ПОХОЖЕ, ТЕРЯЕТ КУРСИВ ЦЕЛИКОМ — и носитель курсива тут НЕ инлайн-тег.** `backend/internal/chunk/ingest.go:1085`=`func extractXHTML(data []byte) (string, []RubyReading, error)` пишет текстовые токены; разметка следа не оставляет. Для художественного перевода курсив несёт эмфазу, мысль героя, чужеязычное слово и эпиграф — авторское средство, и восстановить его данными нельзя: его нет на входе. ⛔ **Разметка честная: сквозного замера «курсив не доезжает до чанка» НЕ делал никто** — ни сессия, ни оркестратор; сделано только чтение кода и счёт спанов. ⚠ **И поправка к МЕХАНИЗМУ, снятая оркестратором: `<i>` — 0, `<em>` — 0.** Курсив в этой книге несёт **CSS-класс**, и счёт спанов расходится по популяциям: у оркестратора 4842 (`class="…ital…"`), у советчика сессии 4863. ⇒ формулировка «инлайн-теги не оставляют следа» описывает не тот носитель, и починка «читать `<i>`/`<em>`» не сработала бы вовсе: читать надо класс. Прежде чем строить — сквозной замер на одном документе: доезжает ли хоть один курсивный спан до текста чанка | бэкенд | скоро (сперва ЗАМЕР, потом решение) | предъявлен сквозной замер «курсив на входе → курсив в чанке» с названным знаменателем; по его итогу — ряд на починку либо закрытие с доводом | подозрение сессии `textmachine-main-c5` 17.09; механизм поправлен оркестратором (класс, а не тег) |