From 23b00a31afa1662c6fda266085861ed4266dfffc Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 5 Sep 2026 21:50:54 +0300 Subject: [PATCH] Keep the embedded cut data untouched so the landing rule still holds, give the gate configs that exist, and let the stand's langpack root be read where it actually lives --- docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md | 50 +++++++++++++++++++----- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md b/docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md index 8c7f6266..8d459237 100644 --- a/docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md +++ b/docs/CHAPTER_STRUCTURE_SESSION_PROMPT.md @@ -71,6 +71,11 @@ ⚠ **А `langpack_root` / `langpack_extend` НЕ трогай** — они только читаются, и подмена дала бы другой `Pack.Version()`, то есть другой `cutTag`: пин снялся бы с другого разреза, и сравнивать было бы нечего. + ⛔ **И знай, КУДА они указывают: у большинства стендовых конфигов `langpack_root` смотрит в + СОСЕДНЕЕ дерево** (`/home/ubuntu/projects/textmachine/backend/configs/langpacks`), а деревья + различаются — комментарий одного из конфигов прямо говорит, что `ru/` есть только там. **Поэтому + §7 разрешает ЧТЕНИЕ соседнего дерева ровно по тем путям, на которые указывают конфиги стенда.** + Перенаправлять их нельзя (см. выше), писать туда нельзя. 2. **Синтетические фикстуры по стандартам:** EPUB 3 с `nav`, EPUB 2 с NCX. Сегодня тестовый билдер пишет только `container→OPF→spine→xhtml` и **nav/NCX не пишет вовсе** (`chunktest/epub.go:42-82`). 3. **Оракул — КОД, не замер:** EPUB с `nav` разворачивается в txt, путь разреза обязан восстановить @@ -78,8 +83,14 @@ 4. **Замеры ДО правок, каждый числом в отчёт:** есть ли `\f` в стенд-книгах · есть ли главы-огрызки от print-TOC · сбрасывается ли нумерация по томам. -**Файлы стенда — поимённо** (см. §7 о доступе): 蛊真人 (GB18030 txt, ~2283 «第N节») · EPUB владельца -Кристофф/en · EPUB владельца isekai/ja. ⚠ Платная книга платформы `bk_SS5VES2JELESJSTR` живёт в +**Файлы стенда — поимённо** (см. §7 о доступе): 蛊真人 (GB18030 txt, **ровно 2283** «第N节») · EPUB +владельца Кристофф/en · EPUB владельца isekai/ja. +⛔ **ПРО НОСИТЕЛЬ ГЕЙТА, иначе пин повиснет в воздухе:** конфигов `book.yaml` для 蛊真人 в дереве книг +ДЕСЯТОК, и **ни один не указывает на полную книгу** — все на срезы (`slice25`, `ch1-10`, `ch1-5`, +`ch4-5`). Полный `guzhenren-gb18030.txt` не привязан ни к одному конфигу. +⇒ **Гейт §3 = КАЖДЫЙ существующий конфиг 蛊真人 воспроизводит свой разрез байт-в-байт.** Пин снимается +по каждому, не по «стенду вообще». Полную книгу гоняешь ОТДЕЛЬНО, своим конфигом в своём каталоге; +её результат идёт числом в отчёт и гейтом НЕ является — базовой линии для неё не существует. ⚠ Платная книга платформы `bk_SS5VES2JELESJSTR` живёт в workdir платформы, **гейту §3 не видна и в него не входит**; её заметки теряются по слову оркестратора. ### 2.2 Данные структуры — ПО ИСТОЧНИКУ, вне пар-пака @@ -124,11 +135,15 @@ workdir платформы, **гейту §3 не видна и в него не **unit-id**. `manifestKey` фолдит компоненты ПОРОЗНЬ (`manifest.go:336-354`), и одного его НЕДОСТАТОЧНО: правка данных перережет книгу, а id юнитов переживут — ровно тот дефект, ради которого тег и заведён. **В снапшот волн — НЕ класть.** Тест `TestEveryCutInputMovesTheTag` -(`cuttag_test.go:26`) получает новый компонент. +(`cuttag_test.go:26`) подвинется САМ — он идёт по полям рефлексией. ⚠ Ручной список живёт в соседнем +**`TestTheCutTagActuallyCarriesTheEngineData` (`cuttag_test.go:54-61`)** — новый компонент туда сам +не попадёт, добавляй руками. **ФОРМА компонента — не на твоё усмотрение, она уже задана прецедентом:** `Structure: <версия парсера> + sha256(байты структурных данных, РЕАЛЬНО загруженных для этой книги — -`/structure.txt` либо дефолт по скрипту)`. **Никогда `omitempty`** — дефолт есть всегда. +`/structure.txt` либо дефолт по скрипту)`. **Никогда `omitempty`** — дефолт есть всегда. ⚠ И не копируй тег с `Langpack` +буквально: у него `omitempty` КАК РАЗ стоит, и в голдене `langpack_version` отсутствует вовсе. Бери +из его формы ПРИНЦИП — «считается одинаково на пишущем и читающем пути», — а не строку тега. Считается ОДИНАКОВО на пишущем и читающем пути (`runner.go:384-386`: «loaded on BOTH the write path and the read-only path so status/export/report reproduce the identical snapshot»). Это ровно форма `Langpack: r.packVersion()`. @@ -137,7 +152,17 @@ and the read-only path so status/export/report reproduce the identical snapshot **остаются в `data/cjk-section.txt`**. Их читает не только ингест — на них стоят ДЕНЕЖНЫЕ $0-гейты величины чисел (`checks/cheapgates.go:601, 636, 649, 666` — `lang.DefaultCJKSection()`), а это ВЕРДИКТНЫЕ данные, и им место в снапшоте. Уносишь числительные — **молча меняются вердикты гейтов**. -Переезжают ТОЛЬКО `marker` / `units` / грамматика шаблона. +Переезжают ТОЛЬКО `marker` / `units` / грамматика шаблона — **и переезжают они из ПАР-ФАЙЛА + (`zh-ru/heading.txt`), а НЕ из `cjk-section.txt`.** + ⛔⛔ **`internal/lang/data/cjk-section.txt` НЕ ПРАВИТСЯ ВООБЩЕ — ни одной строкой.** Он уже объявляет + себя единственным источником истины для разреза, и чанкер просто начинает читать ЕГО (через + `lang.DefaultCJKSection()`) вместо своей отставшей копии — **вот этим дрейф и закрывается.** + Тронешь файл — сдвинется `EmbeddedVersion`, а он тянет три вещи, каждая из которых тебя остановит: + голден несёт **четыре строки `embedded_version`** наравне с `chunker_version`; + `TestChapterMarkerIsData` (`langpack_test.go:454`) краснеет НЕ заказанным; и — главное — + **CURRENT-STATE (`docs/PROGRESS.md`) держит правило лендинга: правка `lang/data/*.txt` двигает + `EmbeddedVersion` → `cutTag`, и такой лендинг НЕ кладётся, пока жива книга платного прогона.** + Оставить там же мёртвые копии ключей тоже нельзя — это класс строки 299. ### 2.3 EPUB по стандарту @@ -321,8 +346,10 @@ and the read-only path so status/export/report reproduce the identical snapshot - **Платформенное:** предикат «двух свидетелей» и `structure_version` · снятие временного правила по `declared` (строка 297) · глагол «перечитать журнал» — **всё это НЕ твоя зона.** Не добавляй полей «для платформы». -- ⛔ **Рендер при сбросе нумерации по томам — ВОПРОС ВЛАДЕЛЬЦА, не чинить.** Ты УВИДИШЬ в `nav` - платного EPUB несколько глав с одним номером. Это выбор рендера (номер книги против плотного +- ⛔ **Рендер при сбросе нумерации по томам — ВОПРОС ВЛАДЕЛЬЦА, не чинить.** ⚠ Прежняя редакция + обещала, что ты увидишь это «в `nav` платного EPUB» — **неверно и снято**: платная книга платформы + собрана из десятиглавого txt-среза, `nav` там нет вовсе, и сброса по томам в главах 1–10 быть не + может. Увидеть это можно только на ПОЛНОЙ 蛊真人, где нумерация и сбрасывается. Это выбор рендера (номер книги против плотного ординала), он вне пака. Увидел — запиши числом в отчёт и иди дальше. - **`narezka.py` полигона** (второй приватный zh-детектор) — пинг полигону от оркестратора, не твоё. - ⛔ **Сквозного прогона не-CJK НЕ БУДЕТ и не заказывается:** промтов пары для en/ja не существует @@ -353,7 +380,10 @@ and the read-only path so status/export/report reproduce the identical snapshot - **Доступ к книгам.** `books/` — симлинк в соседнее дерево. **ЧИТАТЬ файлы под `books/` РАЗРЕШЕНО и необходимо** (§2.1 без этого неисполним). ⛔ **ЗАПРЕЩЕНО:** любая запись под `books/`, любые - git-операции там, и что-либо ещё в `/home/ubuntu/projects/textmachine` вне `books/`. + git-операции там, и любая ЗАПИСЬ в `/home/ubuntu/projects/textmachine`. ⚠ **ЧТЕНИЕ соседнего + дерева разрешено там, куда указывают конфиги стенда** — прежде всего `backend/configs/langpacks` + (`langpack_root`): без этого §2.1 неисполним, потому что пин обязан сниматься ровно с тем + пар-паком, с которым книга резалась. - **Тесты и гейты не подгонять под зелень.** ⚠ Правка, вызванная **заказанной** сменой поведения, — обслуживание. **Заказанные здесь правки тестов, поимённо:** · `priceprojection_test.go:144` — кейс «a form feed is the format speaking» ждёт @@ -361,7 +391,9 @@ and the read-only path so status/export/report reproduce the identical snapshot · тест V2-7 «формат провёл ВСЕ границы» — меняются ДВА кейса, не один: «один случайный `\f` среди шапок» (шапки побеждают, книга `detected`) **и ПЕРВЫЙ кейс `ingest_test.go:68` «the format drew every boundary» (`ГЛАВА A\fГЛАВА B` → `StructureDeclared`), который становится - `delimited`**. ⚠ А у кейса `ingest_test.go:74` ожидание НЕ меняется (`detected` и до, и после) — + `delimited`**. ⚠ Уточнение, чтобы ты не искал несуществующего: **ассерт переезжает РОВНО ОДИН** — + тест сверяет только `doc.Structure`; у кейса с одним `\f` среди шапок ожидание то же и до, и + после, у него меняются объясняющий комментарий и ЧИСЛО глав (§4 п.5). ⚠ А у кейса `ingest_test.go:74` ожидание НЕ меняется (`detected` и до, и после) — у него меняется **ЧИСЛО ГЛАВ**, которого никто не проверяет: см. §4 п.5. ⛔ И **само имя** `TestTXTStructureIsDeclaredOnlyWhenTheFormatDrewEVERYBoundary` после конкуренции ни во что не разрешается — **переименовать тем же актом** (класс строки 299, который этот же промт требует ниже для комментариев);