diff --git a/docs/BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md b/docs/BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md index f1ffe5c2..47d1b481 100644 --- a/docs/BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md +++ b/docs/BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md @@ -25,21 +25,36 @@ объявил навигационную цель на каждый осколок ⇒ **62 цели из 71 указывают во ВТОРУЮ половину spine** (позиции целей 8…124 при 126 документах, медиана 89), тогда как проза лежит в первой. +⛔ **И вот замер, который переворачивает саму картину «навигация указывает не туда»: документов spine БЕЗ +навигационной цели — 55 из 126, и это ВСЯ ПРОЗА КНИГИ** (`index_split_005`…`_043`, от 9 до 157 тыс. знаков +каждый). Навигация адресует осколки оглавления и ровно четыре прозаических документа. ⇒ говорить «цели указывают +не туда» мягко: **текста книги навигация почти не адресует вообще.** + **Тела целей, разбиение полное и сумма сходится с 71:** **60** побуквенно равны своему ярлыку · **7** коротки, но ярлыку НЕ равны — два титула частей (`BOOK ONE`+`DEATHSEEKER`, `BOOK FOUR`+`THIS BLACKENED VEIL`) и пять осколков оглавления, у которых вторая строка есть имя СЛЕДУЮЩЕЙ части (`Chapter XIX. A Taste of Home` + `Book Three. To Kill a King`) · **4** несут прозу (`BOOK TWO/THREE/FIVE/SIX`, 14–82 тыс. знаков). -⛔ **А настоящих глав в книге — 84, и это первое, что я ставил неверно.** Открывает каждую **ДВА подряд абзаца -одного класса**: римское числительное, затем имя прописными, затем проза другим классом. Замер: абзацев, чей -текст есть голое римское числительное, — **84** (81 в шести частях и 3 в открывающей секции), все в одном и -том же классе; контроль, доказывающий, что прибор читал книгу, — абзацев с классом в ней **11 397**. +⛔ **А настоящих глав — 81, плюс пролог, и это первое, что я ставил неверно ДВАЖДЫ.** Форма главы: римское +числительное, затем имя прописными тем же классом, затем проза другим классом. Замер: голых римских +числительных **84**, из них **81 имеет имя следом** и **3 не имеют** — все три в открывающей секции `SUNSET`, +где за номером идёт сразу проза. ⇒ **«84 главы» есть ВЫВОД прибора, а не замер книги**: собственное оглавление +книги даёт «Sunset» одной строкой и 81 строку «Chapter». Контроль, доказывающий, что прибор читал книгу, — +абзацев с классом **11 397** (счётчиком по `
]*class="…"`; другой парсер на тот же вопрос даёт 11 522 — +подписывай способ счёта рядом с числом). +⛔ **СУДЬБА ПРОЛОГА — РАЗВИЛКА, И РЕШИТЬ ЕЁ ОБЯЗАН ТЫ, А НЕ УМОЛЧАНИЕ ПРАВИЛА.** Голое числительное разрежет +`SUNSET` на три безымянных главы, а единственное имя пролога уедет в преамбулу первой из них. Варианты: **81 + 3 +безымянных = 84** или **81 + 1 «Sunset» = 82**, и второй требует ТРЕТЬЕЙ формы заголовка (имя без числительного), +которой у грамматики сегодня нет. Назови выбор и довод; приёмочное число — тот, который ты назвала. ⚠ И мой первый замер дал **3** вместо 84, потому что регексп требовал `class` первым атрибутом, а у большинства первым стоит `id`. **Отрицательный замер здесь особенно дёшев и особенно лжив — печатай контрольную величину рядом.** -⭐ **ГЛАВНОЕ, и ради этого пак переписан.** Ярлык навигации «Chapter IV. Unforgiven» есть СКЛЕЙКА ровно того, -что проза держит двумя абзацами — `IV` и `UNFORGIVEN`. ⇒ **навигация несёт правильные ИМЕНА и неправильные +⭐ **ГЛАВНОЕ, и ради этого пак переписан.** Ярлык навигации «Chapter IV. Unforgiven» есть СКЛЕЙКА того, что +проза держит двумя абзацами — `IV` и `UNFORGIVEN`. ⚠ **Склейка НЕ побайтная, и без этой оговорки замер даёт +ноль:** ярлык в Title Case, проза капсом, апостроф типографский ⇒ побайтно **0 из 81**, с нормализацией +регистра и апострофа — **65 из 81**. Оставшиеся **16 глав навигация не называет вовсе** (их строки оглавления +лежат в документе без навигационной цели). ⇒ **навигация несёт правильные ИМЕНА и неправильные АДРЕСА; проза несёт правильные АДРЕСА и расщеплённое имя.** Ни один источник не лжёт целиком, и ни одного не хватает в одиночку. @@ -135,8 +150,12 @@ ⛔ **ОСТАТОК НАЗВАН ЧИСЛОМ, И ПРЯТАТЬ ЕГО НЕЛЬЗЯ: строгое тождество снимает 60, а ПЯТЬ осколков переживут** — у них вторая строка несёт имя следующей части. **«Почти-тождество» я запрещаю**: порога не заводить. Решай по -роду — либо правило формулируется так, что ловит и эти пять (например «каждая строка тела есть ярлык -навигации»), либо остаток НАЗЫВАЕТСЯ числом и принимается осознанно. ⛔ Чего нельзя — сдать «сделано» и +роду — либо правило формулируется так, что ловит и эти пять, либо остаток НАЗЫВАЕТСЯ числом и принимается +осознанно. ⛔ **Пример, который я сюда вписал первым — «каждая строка тела есть ярлык навигации» — ЛОЖЕН, и я +его снимаю: он ловит 0 из 5.** Вторые строки этих осколков («Book Three. To Kill a King») ярлыками не являются +(ярлык — «BOOK THREE»), а пятый осколок несёт вовсе хвост оглавления (`Dawn` · `Acknowledgments` · `Also by` · +`About the Author` · `Copyright`). ⚠ Точное разбиение: ЧЕТЫРЕ осколка со второй строкой-именем следующей части +и ОДИН с хвостом оглавления. Родовой признак ищи сама — или принимай остаток числом. ⛔ Чего нельзя — сдать «сделано» и получить 89 глав вместо 84. **(б) ТАМ, ГДЕ НАВИГАЦИЯ НЕ ПОСТАВИЛА ЦЕЛИ, ГРАНИЦУ СТАВИТ ГРАММАТИКА.** Настоящие начала глав живут внутри @@ -197,8 +216,7 @@ КРОЕ, а крой уже фолдит отпечаток структуры. **РЕШИ САМА,** что грамматика обязана уметь для этой книги. Приоры, каждый опровергается замером: -безмаркерный заголовок (сегодня маркер требуется) · класс римских числительных (сегодня арабские и CJK) · -класс римских числительных (сегодня арабские и CJK) · «абзац, чей текст есть голое числительное» · +безмаркерный заголовок (сегодня маркер требуется) · класс римских числительных (сегодня арабские и CJK) · «абзац, чей текст есть голое числительное» · «имя главы — СЛЕДУЮЩИЙ абзац того же класса». ⛔ **Приор «центрированный абзац» я СНИМАЮ, и вот почему — иначе он столкнул бы тебя лбом с §4.5.** @@ -245,7 +263,6 @@ **ПРЕДУПРЕЖДАЕТ, а не отказывает**; отказы — для механизма, который не может работать вовсе. Кривое оглавление — первое, а не второе. -⇒ книга без объявленной грамматики едет как сегодня в части (б), но человек **видит числом** ⚠ **Оговорка, без которой абзац лжёт:** правило (а) живёт в Go и действует на КАЖДЫЙ EPUB с осколками-тождествами, объявлена грамматика или нет. Без грамматики отсутствует только (б). ⇒ человек видит числом, что получил: сколько глав, @@ -258,10 +275,18 @@ ### 4.4 ⛔ ЗАМЕР ПЕРЕД СТРОЙКОЙ — ПЕРВЫМ ДЕЛОМ, И БЕЗ ЕДИНОЙ СТРОКИ Go -Прежде чем править код, **реализуй правило грамматики на python и прогони по книге прогона**. Ответь числом: -сколько глав даёт «центрированный короткий абзац + римская цифра + строка капсом» против записей навигации. +Прежде чем править код, **реализуй правило грамматики на python и прогони по книге прогона**. ⚠ **Прежняя +редакция этого абзаца протухла** — она звала «центрированный короткий абзац», а §4.2 приор «центрирован» снял, +и звала сверяться «против записей навигации», которых у прозы нет. -⇒ **это и есть приёмочное число пака.** Если правило даёт число, не похожее на настоящую структуру книги, — +**Правило меряй на ИЗВЛЕЧЁННОМ тексте, а не на разметке:** «абзац, чей текст есть голое римское числительное; +имя главы — следующая непустая строка того же класса». ⚠ Оговорка из замера: у 53 пар абзацы идут подряд, у 28 +между ними пустой абзац-спейсер; на извлечённом тексте он исчезает, в разметке «подряд» неверно. + +**Ответь числами:** сколько глав даёт правило · сколько из них получили имя · сколько осталось безымянных · +чему это равно против собственного оглавления книги (81 + Sunset) и против 71 записи навигации. +⇒ **приёмочное число — то, которое ты назовёшь, объявив судьбу пролога;** мои ориентиры — 84 по прибору и +82 по оглавлению книги, и расходятся они ровно на неё. Если правило даёт число, не похожее на настоящую структуру книги, — стройка начинается не с того, и лучше это узнать за ноль долларов и без правок дерева. Так же вчера был пере-снят механизм группировки, и это сэкономило пак. @@ -301,24 +326,46 @@ Ревью исполнением обязательно: своего кода, своих проб, своих результатов. **Субагенты разрешены.** **Fable 5 — ОДИН советчик** с постоянным контекстом; он советчик, а не источник истины. -**ЧЕТЫРЕ МЕСТА, ГДЕ ЭТОТ ПАК МЯГОК ИМЕННО ПОТОМУ, ЧТО ОН ТАКОЙ:** +**СЕМЬ МЕСТ, ГДЕ ЭТОТ ПАК МЯГОК ИМЕННО ПОТОМУ, ЧТО ОН ТАКОЙ:** 1. ⛔ **Твоя правка меняет КРОЙ, а крой versionируется.** По конвенции проекта правка правила нарезки бампает версию нарезки, а та фолдится БЕЗУСЛОВНО — то есть у КАЖДОЙ книги, включая китайскую. - **Сегодня это бесплатно** (книг продуктового пути с оплаченными чанками нет), и именно поэтому пак идёт - ДО прогона, а не после. Предъяви цену явно, не умолчи её. + **Сегодня это бесплатно, но условно, и условие я называю словами:** бесплатно ⇔ ни одну существующую базу + с оплаченными чанками никто не ПРОДОЛЖАЕТ. Замер: в `coldrun-a` 20 строк `chunk_status` на $0.024056, в + `coldrun-b` — 0; всех баз с оплаченными строками под `books/` — 161, и все объявлены одноразовыми + (`D39.63` п.3, `D39.190` п.4). ⚠ **Продуктовый путь на этом хосте НЕ проверен:** `TM_PLATFORM_BOOKS_DIR` + не задан, каталогов-кандидатов нет — то есть здесь «нет» значит «не нашёл», а не «проверил». + Предстоящий прогон стартует ПОСЛЕ лендинга ⇒ куплено ничего. Предъяви цену явно, не умолчи её. 2. ⛔ **Тождество легко сделать почти-тождеством, и тогда оно станет порогом.** «Равно ярлыку» и «начинается с ярлыка плюс немного» — разные правила: первое доказуемо, второе — эвристика с невидимой границей. - Замер: **60 тождеств и ОДНО почти-тождество** (титульная страница части). Если возьмёшь «почти», скажи, - где теперь граница и чем она обоснована. -3. ⛔ **Грамматика, которая режет ЭТУ книгу, легко окажется грамматикой этой книги.** Признак «римская - цифра в центрированном абзаце» обязан быть выведен из свойства ВЁРСТКИ, а не подобран под Кристоффа. + Замер (пере-снят вторым кругом, прежняя редакция говорила «одно почти-тождество» и была неверна): + **60 тождеств и СЕМЬ коротких не-тождеств** — два титула частей и пять осколков. Если возьмёшь «почти», + скажи, где теперь граница и чем она обоснована. ⛔ Я её брать запрещаю; см. §4.1(а). +3. ⛔ **Грамматика, которая режет ЭТУ книгу, легко окажется грамматикой этой книги.** Признак «абзац есть + голое числительное, имя — следующая непустая строка» обязан быть выведен из свойства ВЁРСТКИ, а не подобран + под Кристоффа. ⚠ Прежняя редакция звала «римскую цифру в центрированном абзаце» — приор снят в §4.2. ⛔ **Контрольный набор я назвал неверно, и неверно он звучал правдоподобно:** «китайская книга» — это TXT (`books/gu-zhenren`), и EPUB-пути она не касается вовсе. **Настоящий контроль — два EPUB дерева:** `books/isekai_majutsushi_jp.epub` (CJK-EPUB, получает умолчательную грамматику на EPUB-пути) и `books/fifty_shades_1_en.epub` (латиница, цели навигации 1:1 с документами — отрицательный контроль: правило (а) обязано на нём не сработать ни разу). Китайская книга — контроль только на сдвиг версии. -4. ⛔ **Пин на новую грамматику легко построить на той же фикстуре, из которой она выведена.** Тогда он +4. ⛔⛔ **ИМЯ, КОТОРОЕ ТЫ СБЕРЕЖЁШЬ, ДО КНИГИ ЧИТАТЕЛЯ СЕГОДНЯ НЕ ДОЕЗЖАЕТ — и §4.1(в) без этой оговорки + обещает больше, чем даёт.** Замер: в билдере выдачи `TitleRaw` — **0 вхождений** + (`backend/internal/pipeline/bookbuild.go`, контроль: в дереве он живёт в трёх файлах — `epubtoc.go`, + `ingest.go`, `manifest.go`), а заголовок главы в файле берётся из + `backend/internal/pipeline/bookbuild.go:554`=`t := ce.Heading`, то есть из шаблона пары, которого у `en-ru` + нет. ⇒ имя доедет до МАНИФЕСТА и до платформы, а в книге читателя главы останутся номерами. + **Это не повод не сберегать имя** — это повод НАЗВАТЬ границу: скажи в отчёте, докуда имя доезжает и где + остаётся долгом (ряды **284** и **201**). ⛔ И отдельно сверься с `D39.205` («без пропусков», слово + владельца): исключение документа-тождества не есть потеря текста книги — тело равно ярлыку, — но написать + это обязана ты, а не читатель твоего отчёта. +5. ⛔ **Каталог мутаций придётся пере-нацелить, и это часть пака, а не побочная уборка.** Перестройка + группировки уводит цель у посадки на `NO DOCUMENT IS DROPPED`, а «имя у носителя» — у посадки на источник + `title_raw`. **Посадка, потерявшая цель, даёт НЕИЗМЕРЕННУЮ, а не пойманную**, и неизмеренная, прочитанная + как пойманная, хуже выжившей. Пере-нацель и скажи, сколько записей тронуто. +6. ⛔ **Край платформы: отказ интейка `400 no_chapter_structure` при `ChaptersTotal < 2`.** EPUB из двух + документов, один из которых тождество, даст одну главу — и книга не пройдёт дверь. Поставь пин на этот край. +7. ⛔ **Пин на новую грамматику легко построить на той же фикстуре, из которой она выведена.** Тогда он докажет, что правило работает на том, из чего сделано. Образец правильной формы в дереве есть — пин, который режет книгу ИЗ ОДНОГО ФАЙЛА ДАННЫХ и падает без него. @@ -388,8 +435,10 @@ - [ ] Замер §4.4 предъявлен ЧИСЛОМ до первой правки Go. - [ ] У каждого пункта §4 — исход: сделано · не делаю с доводом · пинг. -- [ ] **Английская книга режется по своим настоящим главам**, и это предъявлено прогоном, а не рассуждением. -- [ ] **Китайская книга не изменилась** — предъявлено хешем. +- [ ] **Английская книга режется по своим настоящим главам — числом, которое ты объявила в §4.4** (81 + пролог; + расхождение с прибором названо), и это предъявлено прогоном, а не рассуждением. +- [ ] **Китайская книга не изменилась ПО ТЕКСТУ** — предъявлено побайтным равенством текстов глав и чанков. + ⚠ Её КЛЮЧ МАНИФЕСТА при этом сдвинется, и это ожидаемо — см. §4.4-бис; путать два утверждения нельзя. - [ ] Ни одной ветки по языку или паре не добавлено — предъявлено грепом с контрольной величиной. - [ ] Круги СОШЛИСЬ; прежние находки закрыты таблицей «находка → что сделано → **чем предъявлено**». - [ ] Таблица мутаций полная, ТРИ исхода: поймано · выжило · **НЕ ИЗМЕРЕНО**; новые записи введены в гейт. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 6304f3cd..60185871 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-18, голова D39.269 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **95** живых доков в `docs/` (⚠ испр. 17.09 вечером: стояло **98**, и это был ЛОЖНЫЙ литерал, а не потеря файлов — сверка дерева со срезом головы предписанной здесь же командой дала 95 в ОБЕИХ сторонах, ни одного файла не ушло и не пришло; ошибся сам пере-счёт, а прибор это число не сторожит и потому ложь прожила день. В 95 уже входит промт выдачи №14; пере-счёт после выноса каталога консилиума; прежние 97 разошлись с фактом 144 и это заметил ревизор, а не гейт) (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, **12** в `backend/docs`, **7** в `frontend/docs` (испр. 17.09: стояло 9) — ⚠ ⚠ испр. 11.09: из 97 ВРЕМЕННЫХ **три** (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 0), всего рядов 469 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-18, голова D39.270 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **95** живых доков в `docs/` (⚠ испр. 17.09 вечером: стояло **98**, и это был ЛОЖНЫЙ литерал, а не потеря файлов — сверка дерева со срезом головы предписанной здесь же командой дала 95 в ОБЕИХ сторонах, ни одного файла не ушло и не пришло; ошибся сам пере-счёт, а прибор это число не сторожит и потому ложь прожила день. В 95 уже входит промт выдачи №14; пере-счёт после выноса каталога консилиума; прежние 97 разошлись с фактом 144 и это заметил ревизор, а не гейт) (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, **12** в `backend/docs`, **7** в `frontend/docs` (испр. 17.09: стояло 9) — ⚠ ⚠ испр. 11.09: из 97 ВРЕМЕННЫХ **три** (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 0), всего рядов 469 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔ **ПЯТЬ ПОТОКОВ РАБОТЫ — состояние на 07.09 (пере-снято лендингами смены №23).** > **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143): > ⚠ **ЕДИНСТВЕННЫЙ ПОТОК, НЕ СДВИНУВШИЙСЯ ЗА СМЕНУ — сессия по промту так и не стартовала.** Блокирующая линза diff --git a/docs/README.md b/docs/README.md index 4a8b1522..5e1a6d2a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -24,6 +24,7 @@ - **Активные хендофф-промты — какой файл ТВОЙ** (состав обновляется при каждом лендинге, D39.80; хроника, причины и статусы РАБОТ — CURRENT-STATE и D-лог): | Роль | Активный промт | Статус | |---|---|---| +| **Бэкенд · ГРАНИЦА ГЛАВЫ** | [BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md](BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md) | ⭐ **ВЫДАН 18.09, акт `D39.270`** — этот промт ЕСТЬ «пак 2» по ряду **303**, и запрет `D39.224` п.7 им ИСПОЛНЯЕТСЯ, а не снимается (промт заказ, не ратификация ⇒ именование живёт нотой). Предмет нашёл владелец: грамматику источника получает только текстовый путь ингеста, `ingestEPUB` не получает её вовсе ⇒ на EPUB границу назначает навигация издателя единолично. Фактура: целей навигации 71 (6 частей + 65 глав) · тождеств 60 · документов spine БЕЗ цели **55 из 126, и это вся проза** · настоящих глав **81 плюс пролог** · ярлык есть склейка двух абзацев прозы, но **0/81 побайтно и 65/81 при нормализации** ⇒ 16 глав навигация не называет. ⛔ Пак СДВИНЕТ ключ манифеста и КИТАЙСКОЙ книги (эррата 18.09-б к `D39.269` B1) и протушит пре-регистрированные числа пака прогона ⇒ лендится ДО фриза. Два круга опровержения: 14 находок (9 мажоров) и ещё 10 — все обязательные внесены; шесть моих утверждений, звучавших замером, оказались выводами. Живое сверх пака: ряды **283** · **284** · **201** · **302** | | Бэкенд · ДОСТИЖИМОСТЬ ПАР-ДАННЫХ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 18.09** — акт **`D39.268`**, лендинг `9defda4` (38 файлов, 1855/66, $0) + `e6f9a3b`; промт в `archive/prompts/` с баннером. Кампания **336/336 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**. ⭐ Предмет пере-определён замером ДО выдачи: языковых ветвлений в Go шесть при контроле 154 файла, живых два и оба законны ⇒ остаточная зависимость есть НЕДОСТИЖИМОСТЬ ДАННЫХ. **Английская книга доезжает на боевом конфиге** и встаёт на потолке до первого вызова. Ряды 347 и 500 закрыты, 272 и 502 половинами | | Бэкенд · АНГЛИЙСКАЯ ПАРА en→ru | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 18.09** — акт **`D39.267`**, лендинг `ddadb3e` (32 файла, 1356/127, $0) + `63e3a0d`; промт в `archive/prompts/` с баннером-исходом. Кампания **327/327 поймано, 0 выживших, 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** | diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 5dcdf424..1db1bf12 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.269; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.270; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -328,3 +328,4 @@ | D39.267 | 18.09 | **ПРИЁМКА БЭКЕНД-ПАКА «АНГЛИЙСКАЯ ПАРА en→ru»** — `ddadb3e` (32 файла, 1356/127, $0) + `63e3a0d` (отчёт зоны). Кампания **327/327 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**, сумма исходов = составу гейта, корень сверен с `ddadb3e:backend` после кампании (0 расхождений). Ратифицирована замена защиты, державшейся ОТСУТСТВИЕМ, на механизм: пакет пары убирал пустоту, из-за которой английская книга отказывалась, и книга поехала бы китайским промтом молча. Веер 57 находок, 9 — дефекты собственной работы зоны. Решение владельца «данные работают там, где явления нет» исполнено подъёмом правила до КЛАССА. Ряды 501·502·503 заведены, 499 переписан четвёртой редакцией. ⚠ Мои ошибки: выдал следующий пак в НЕосвобождённую зону (норма через «я» слепа к делегированию) и пять ложных нулей прибора | приёмка | | D39.268 | 18.09 | **ПРИЁМКА БЭКЕНД-ПАКА «ДОСТИЖИМОСТЬ ПАР-ДАННЫХ»** — `9defda4` (38 файлов, 1855/66, $0) + `e6f9a3b`. Кампания **336/336 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**, сумма = составу гейта. ⭐ Предмет ПЕРЕ-ОПРЕДЕЛЁН замером до выдачи: языковых ветвлений в Go шесть при контроле 154 файла, живых два и оба законны ⇒ остаточная зависимость есть НЕДОСТИЖИМОСТЬ ДАННЫХ, а не грязь в коде. Ратифицированы условный фолд как ФОРМА (три условия, прецедент — пак заголовков) и пар-скоупный лейбл промта. Китайская половина неподвижна — доказано ВХОДАМИ (0 тронутых, 0 версий-констант), а не совпадением хешей. Два отказа зоны приняты с замером. Ряды 347 и 500 ЗАКРЫТЫ, 272 движковой половиной, 502 половиной, 303 не тронут. **Английская книга доезжает на боевом конфиге — вход прогона открыт** | приёмка | | D39.269 | 18.09 | **ПРИЁМКА АДВЕРСАРИАЛЬНОГО КРУГА + РАТИФИКАЦИЯ ГОТОВНОСТИ К ХОЛОДНОМУ ПРОГОНУ** — `dca0e06` (20 файлов, 1188/247, $0) + `2a2ba4a`. Кампания **346/346, 0 выживших, 0 НЕ ИЗМЕРЕНО**, третья подряд начисто (327/336/346). ⛔ Починка САМА внесла блокер: посылка «такова форма, которую производит ингест» ложна — 68 прогонов из 4842 ломались, батарея при этом зелена, а посадка фиксировала дефект как норму; закрыто дифференциальным замером (ноль расходящихся абзацев из 11 404). **ГОТОВНОСТЬ РАТИФИЦИРОВАНА** с явным перечнем того, чего акт НЕ утверждает (платформа — на служебной базе; хостовое — предстартовые условия; «доезжает» ≠ «переводится»). Платформа: полная батарея, 0 пропусков — но путь к числу важнее: зелень при 487 пропусках была ничем. Деньги: $4 есть ОСТАТОК, потолки ниже него, размер за владельцем | приёмка+ратификация | +| D39.270 | 18.09 | **ВЫДАЧА БЭКЕНД-ПАКА «ГРАНИЦА ГЛАВЫ» И ИМЕНОВАНИЕ ПАКА 2 ПО РЯДУ 303** — промт `docs/BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md`. Запрет `D39.224` п.7 УСЛОВЕН и этим паком ИСПОЛНЯЕТСЯ, а не отменяется; кто есть пак 2, промтом сказать нельзя — журнал бьёт промт. Предмет нашёл владелец: грамматику источника получает только текстовый путь ингеста, EPUB-путь не получает её вовсе. Фактура: целей навигации 71 (6 частей + 65 глав), тождеств 60, документов spine без цели 55 из 126 — и это вся проза; настоящих глав 81 плюс пролог; ярлык есть склейка двух абзацев, но 0/81 побайтно и 65/81 при нормализации. ⛔ Пак СДВИНЕТ ключ манифеста и китайской книги — `D39.269` B1 сужен эрратой 18.09-б. Два круга опровержения (14 находок и ещё 10) переписали пак; шесть моих утверждений, звучавших замером, названы выводами. | ЖИВАЯ | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 91e779ef..93e0f1b1 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.269 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.270 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия 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+). @@ -77,7 +77,7 @@ > ⚠ **Эррата 05.09-е (D39.190 п.2) — «ПОТЕРЯННЫЙ ЗАГОЛОВОК У ШЕСТИ ГЛАВ ИЗ СЕМНАДЦАТИ» НЕ ИМЕЕТ НОСИТЕЛЯ.** Пункт 2 обосновывает вес структурной строки «свежей уликой полигона» — вычиткой семнадцати глав боевого перевода, нашедшей потерянный заголовок у шести глав из семнадцати (≈800 на книге). **Число подано без единой ссылки на файл**, и поиск первоисточника не дал его ни мне, ни независимо коллеге-Fable 05.09: в `eval/dovodka/` находится план на семнадцать глав, но не счёт потерянных заголовков. ⇒ Число НЕ отзывается — оно может быть верным, — но **опирать на него скоуп ЗАПРЕЩЕНО**: механизм потери не установлен (роняет модель? теряется на экспорте? не показывает читалка?), а лечение зависит от механизма. Титульная работа структурного пака стоит на СОБСТВЕННОМ основании — заголовок, не едущий по проводу, невозможно отрендерить, — а не на этой улике. Кто найдёт первоисточник, впишет адрес сюда. > ⚠⚠ **Эррата 05.09-г — НОРМА «ДЕРЕВО МОРОЗИТСЯ ЛИБО РЕВЬЮЕРУ НАЗЫВАЕТСЯ КОММИТ» ПРИПИСАНА `D39.172` ОШИБОЧНО; в её теле этого НЕТ.** Проверено: тело `D39.172` (пак `sqlc`) не содержит ни «морозится», ни «КОНКРЕТНОЕ дерево», ни «ревьюер» — оно про то, что чужие застейдженные правки уехали в чужой коммит под чужой подписью, то есть про гигиену коммита, а не про суждение о названном дереве. ⚠⚠ **ИСПР. в тот же час: первая редакция ЭТОЙ ЭРРАТЫ САМА ОВЕР-АТРИБУТИРОВАЛА ДВАЖДЫ** — назвала `D39.201` (её тело `D39.172` не цитирует ВОВСЕ) и пропустила `D39.180` и `D39.202` п.8, которые цитируют; плюс перевернула исток. **Замер:** `grep -n 'D39\.172' 05-decisions-log.md` → тела `D39.174` (×2) · `D39.180` · `D39.199` · `D39.202` · `D39.206`; `git log -S'судит КОНКРЕТНОЕ дерево'` → `0393e7a` (30.08, ПРОМТ) старше `8977001` (`D39.174`). ⇒ **норма родилась в `docs/ORCHESTRATOR_SESSION_PROMPT.md`, а ноты её унаследовали**, и ложную атрибуцию несут: `D39.174` · `D39.180` · `D39.199` · `D39.202` п.8 · `D39.206` + сам промт. ⚠ Поймано внешним ревьюером через час после написания: **эррата про овер-атрибуцию, написанная небрежно, — четвёртый случай того же класса за смену и худший из них, потому что стоит в шапке журнала, куда следующая сессия идёт первой.** ⚠ **Сама норма ВЕРНА и остаётся в силе** — операгивный носитель `ORCHESTRATOR_SESSION_PROMPT.md`, греп `судит КОНКРЕТНОЕ дерево`; ложна только атрибуция. Тела нот не переписываются (D23.3) — читать их через эту эррату. **Класс — ОВЕР-АТРИБУЦИЯ: ссылка на ноту, которая цитируемого не содержит; оркестратор допустил её сегодня ТРЕТИЙ раз** (прежние два: фраза «деньги покидают движок только внутри `spend`», которой в журнале нет, и подномер `D2.3`, оказавшийся про другое). Поймано сплошной вычиткой корпуса. > ⚠⚠ **Эррата 05.09-д (D39.196 п.5) — «ДВИЖКОВАЯ ПОЛОВИНА (СТРОКА 277) ПЕРВОЙ, БЕЗ НЕЁ В СТЕНУ УПИРАЕТСЯ ЛЮБОЙ ПУТЬ» ИСПОЛНЕНО: строки 277 и 278 ПОСТРОЕНЫ и СНЯТЫ** (лендинг `81a89e9`, акт `D39.206`). ⇒ **промт формы заказа, цитирующий эту ноту, НЕ должен заказывать защёлку и проекцию цены заново** — он начинается со строк **279–283**. ⚠ И строка **279** (контрактный минор «`shortfall` у паузы») обязана быть прочитана через `D39.203`/строку **294**: поле ПЕРЕИМЕНОВЫВАЕТСЯ, потому что владелец выбрал форму «сколько добавить» (величина `max(shortfall, step_max − headroom)`, кандидат имени `top_up_micro_usd`, `StreamVersion` 1.3→1.4). Зеркалить в контракт имя `shortfall_micro_usd` значит зеркалить приговорённое. ⚠ **Инвариантный пол при этом ОСТАЛСЯ:** последние ~2 главы не покупаются, пока не построена платформенная половина (строка 280) — стену десяти глав пак снял, пол нет. -> ⚠⚠ **Эррата 05.09-в (D39.200 п.8б) — «ВСЕ 17 ПРОТУХШИХ ЯКОРЕЙ ТРАНЗИЕНТНЫ» НЕВЕРНО: СЕМЬ ГНИЮТ НА HEAD.** Пункт 8(б) обосновывал отказ чинить якоря тем, что все они целят в код под руками живых сессий, и предъявлял ЧЕТЫРЕ из семнадцати против `git show HEAD:` — четыре действительно стояли точно. **Обобщение с четырёх на семнадцать было выводом, а не замером, и ревизор его опрокинул проверкой всех.** Гниют на HEAD семь, все в `backend/docs/` (дерево этой зоны ЧИСТО, транзиентностью не объясняются): `DISCLOSURE_LAW_DESIGN.md:40` (`quality.go:228`, токен на `:233`) · `:41` (`status.go:684` → `:734`) · `:42` (`status.go:733` → `:817`) · `:43` (`bookbuild.go:221` → `:227`) · `:44` (`status.go:249` → `:275`) — эти СЪЕХАЛИ; а `:264` и `MONEY_HONESTY_REPORT.md:285` целят в `chunkrun.go:40`=`SourceEchoExpected: role == roleTerminologist` — этой подстроки на HEAD НЕТ ВОВСЕ, её съел вайр-батч (`isBankRole`), то есть якорь не съехал, а **умер**. ⇒ Десять остальных транзиентны, как и сказано, но вывод пункта в целом ложен. ✅ **ПОЧИНЕНО: `--lint` → 0 битых.** ⚠ **Раскол — ПЯТЬ и ДВА, а не шесть и один** (испр. по ревью, замерено `git show -U0`): `e7d6b3f` пере-навесил ПЯТЬ съехавших (`DISCLOSURE_LAW_DESIGN.md:40-44`), а ОБА МЁРТВЫХ (`:264` и `MONEY_HONESTY_REPORT.md:285`, целившие в исчезнувшую подстроку `chunkrun.go`) уехали раньше — дофиксом `616a8e4`. Шестой якорь коммита `e7d6b3f` — вообще другой предмет: архивный путь промта, в этом списке семи его не было. ⚠ И номера целей, названные выше по этой эррате, ЗОНА ПЕРЕ-СНЯЛА по содержимому — верить надо её замеру, а не спискам отсюда: продиктованные пингом номера были неверны. ⚠ И зона нашла БОЛЬШЕ, чем было в пинге: из шести пять оказались битыми ЕЩЁ ДО её пака — их скрывало то, что `backend/docs` добавили в корни линта только 04.09; чей это дрейф, она предъявила замером (`RebillBasis` стоял на 275 ещё в `81a89e9^`), иначе пять чужих долгов записались бы ей. ⚠ **Норма, которую это покупает, и она дороже самой ошибки: выборка, предъявленная как доказательство, доказывает ровно себя.** Четыре проверенных якоря обосновывают четыре, а не семнадцать; фраза «я проверил четыре, значит транзиентны все» — тот же класс, что «SURVIVED без доказательства, что посадка меняет поведение». Если проверять все дорого — так и писать: «проверено четыре из семнадцати, остальные НЕ проверены». +> ⚠⚠ **Эррата 05.09-в (D39.200 п.8б) — «ВСЕ 17 ПРОТУХШИХ ЯКОРЕЙ ТРАНЗИЕНТНЫ» НЕВЕРНО: СЕМЬ ГНИЮТ НА HEAD.** Пункт 8(б) обосновывал отказ чинить якоря тем, что все они целят в код под руками живых сессий, и предъявлял ЧЕТЫРЕ из семнадцати против `git show HEAD:` — четыре действительно стояли точно. **Обобщение с четырёх на семнадцать было выводом, а не замером, и ревизор его опрокинул проверкой всех.** Гниют на HEAD семь, все в `backend/docs/` (дерево этой зоны ЧИСТО, транзиентностью не объясняются): `DISCLOSURE_LAW_DESIGN.md:40` (`quality.go:228`, токен на `:233`) · `:41` (`status.go:684` → `:734`) · `:42` (`status.go:733` → `:817`) · `:43` (`bookbuild.go:221` → `:227`) · `:44` (`status.go:249` → `:275`) — эти СЪЕХАЛИ; а `:264` и `MONEY_HONESTY_REPORT.md:285` целят в якорь вида `chunkrun.go:40` на токен `SourceEchoExpected: role == roleTerminologist` — этой подстроки на HEAD НЕТ ВОВСЕ, её съел вайр-батч (`isBankRole`), то есть якорь не съехал, а **умер**. ⇒ Десять остальных транзиентны, как и сказано, но вывод пункта в целом ложен. ✅ **ПОЧИНЕНО: `--lint` → 0 битых.** ⚠ **Раскол — ПЯТЬ и ДВА, а не шесть и один** (испр. по ревью, замерено `git show -U0`): `e7d6b3f` пере-навесил ПЯТЬ съехавших (`DISCLOSURE_LAW_DESIGN.md:40-44`), а ОБА МЁРТВЫХ (`:264` и `MONEY_HONESTY_REPORT.md:285`, целившие в исчезнувшую подстроку `chunkrun.go`) уехали раньше — дофиксом `616a8e4`. Шестой якорь коммита `e7d6b3f` — вообще другой предмет: архивный путь промта, в этом списке семи его не было. ⚠ И номера целей, названные выше по этой эррате, ЗОНА ПЕРЕ-СНЯЛА по содержимому — верить надо её замеру, а не спискам отсюда: продиктованные пингом номера были неверны. ⚠ И зона нашла БОЛЬШЕ, чем было в пинге: из шести пять оказались битыми ЕЩЁ ДО её пака — их скрывало то, что `backend/docs` добавили в корни линта только 04.09; чей это дрейф, она предъявила замером (`RebillBasis` стоял на 275 ещё в `81a89e9^`), иначе пять чужих долгов записались бы ей. ⚠ **Норма, которую это покупает, и она дороже самой ошибки: выборка, предъявленная как доказательство, доказывает ровно себя.** Четыре проверенных якоря обосновывают четыре, а не семнадцать; фраза «я проверил четыре, значит транзиентны все» — тот же класс, что «SURVIVED без доказательства, что посадка меняет поведение». Если проверять все дорого — так и писать: «проверено четыре из семнадцати, остальные НЕ проверены». > ⚠ **Эррата 05.09-б (D39.199 п.3) — ГРАНИЦА ПРИЁМКИ ЗАКРЫЛАСЬ ЧЕРЕЗ НЕСКОЛЬКО МИНУТ ПОСЛЕ АКТА.** Пункт 3 говорит «верификатор №2 успел прогнать 5 записей из 19, остальные 12 принял НА СЛОВО зоны» — это было верно на час написания. Прогон добежал: **19 mutation(s) run, 0 unexpected outcome(s), EXIT=0** — 18 RED плюс `WB62` `survives` как записано. ⇒ Утверждение зоны «все 17 новых записей предъявлены красными» подтверждено **ПРОГОНОМ**, а не со слов; ни один вывод верификатора не пересмотрен. ⚠ Что этим НЕ отменяется: находки вне карты (строки 287–290) сидят ВНЕ авторского списка, и красный прогон авторских записей их не опровергает — в частности `WB58` красна лишь потому, что каталог пары лежит на диске; при его отсутствии та же запись ПЕРЕЖИВАЕТ (строка 290). Остаток границы прежний: `-race` целиком не гонялся, живой 401 на хопе — PLAUSIBLE. > ⚠⚠ **Эррата 05.09-а (D39.84 п.1 и D39.100 К-8) — ЗАПРЕТ «ДЕНЕЖНЫХ ПОЛЕЙ В UI НЕТ ВОВСЕ» ОТОЗВАН ВЛАДЕЛЬЦЕМ, тела нот об этом НЕ ЗНАЮТ.** Тела D39.84 («оплат в MVP нет, денежных полей в UI нет вовсе») и D39.100 («запрет денег на экране D39.84 в силе и НЕ superseded») переписывать нельзя (D23.3), а читающий их ПО НОМЕРУ — как велит канон — видит запрет действующим. **Читать оба через `D39.196`:** владелец 05.09 отозвал запрет, баланс аккаунта, потолок заказа и холд ВЫХОДЯТ наружу деньгами; запрещённым остаётся другое и оно НЕ отменялось — цены моделей, стоимость стадий и вызовов, структура НАШИХ расходов (ПТ-33). ⚠ Носители запрета, которые обязан закрыть пак формы заказа, полным списком (⚠ **испр. 05.09: прежняя редакция называла несуществующую секцию yaml «§Credit» — такой секции в каноне нет, и идущий по списку упирался в пустоту; верный адрес — схема `Usage` и путь `/usage`**): `14-api-contract/openapi.yaml` **§Boundaries** (⚠ испр. 05.09 второй раз: две предыдущие редакции звали этот абзац «§Transport» — секция `## Transport` в файле есть, но денежный абзац лежит в `## Boundaries`; ошибка того же класса, что несуществующий «§Credit») · схема **`Usage`** · **`CeilingBounds`** · `docs/architecture/15-money-path.md` §1 · §4 · таблица §6 · `docs/product-requirements.md` ПТ-35 · **`docs/glossary.md`** · **`docs/architecture/13-tech-debt-anchors.md` §Б-126** · зеркало фронта · `frontend/docs/API_CONTRACT_INPUT.md` §4.8 · `platform/docs/ENGINEERING_STANDARDS.md` (зонный) · **`platform/README.md`** (зонный; добавлен 05.09 — в первых двух редакциях списка его не было). Первая редакция списка в компаньоне канона была НЕПОЛНА — три носителя добавлены ревизией 05.09, ещё один и поправка адреса — ревизией того же дня. ⚠ **Прозаические указатели на отзыв уже проставлены 05.09** в `15-money-path` (§1/§4/§6), ПТ-35, глоссарии и в yaml (`Usage`/`CeilingBounds`/шапка §Transport); ПОЛЯ приезжают паком — схема впереди кода не едет. > ⚠⚠ **Эррата 04.09-д (D39.195) — ПАК НЕ ПРИНЯТ, заголовок ноты ЛОЖЕН, и ошибка классификации — оркестраторская.** Нота объявила движковый вайр-батч «ПРИНЯТ И ЗАКРЫТ» и перевела найденное кругом 4 в строки бэклога **256–264**. **Владелец поправил зону прямо: «сворачивал — да, но сдавать несданную багованную работу не говорил».** Он прав. «Прекратить полировку» было применено к вещам, полировкой НЕ бывшим: ложный пин (`WB15`, тот же дефект, что чинился в `WB36`), близнец денежной дыры на лейбловой ветке `CheckKeys`, разрыв фингерпринта каталога, и семь пинов, которые слабее собственных формулировок. **Отчитаться о баге — не значит его сдать**, и различение это принадлежит владельцу, а не сессии и не оркестратору. ⚠ **Классифицировала зона, но РАТИФИЦИРОВАЛ оркестратор** — ошибка моя не меньше: акт приёмки существует, чтобы такую подмену ловить, а он её узаконил. Зона чинит и держит сдачу; строки 256–264 закрываются её лендингом, а не остаются долгом. ⚠⚠ **ЭТА ЭРРАТА ИСЧЕРПАНА 05.09 АКТОМ `D39.199`: пак ПРИНЯТ С ДОФИКСОМ на приёмочном коммите `74ffe4f`. Читающий её сегодня — читает историю, а не действующее указание** (испр. 05.09: сутки она стояла первой строкой, которую видел идущий к D39.195 по номеру, и предписывала считать пак непринятым). Ниже — как было. **До нового акта пак считать НЕ ПРИНЯТЫМ**; коммиты `b8154cd`/`c77c3ba`/`ecf063e`/`2e13cd1` в дереве остаются (код рабочий и батарея зелёная), но приёмкой они не покрыты. ⚠ Норма, которую это покупает: **свёрнутый круг закрывает ПОИСК, а не ПОЧИНКУ уже найденного** — найденное и не починенное не превращается в долг решением о темпе. @@ -364,6 +364,16 @@ > ⚠ Провенанс: нашла `textmachine-main-c5` на входной батарее своего пака, назвала как «не мой предмет» и > не стала чинить — по §2 промта. Диагноз («отношение слепо к ИЗМЕНЕНИЮ нагрузки между половинами») и форма > лечения (A-B-A-B с медианой либо нормировка на опорный замер) — её, записаны в ряд дословно. +> ⛔ **Эррата 18.09-б (`D39.269` п. B1 — «китайская половина неподвижна»): УТВЕРЖДЕНИЕ СУЖЕНО, И СУЖЕНО +> ЗАРАНЕЕ, А НЕ ПОСЛЕ ПРОПАЖИ.** Пункт верен как сказан — про ТОТ пак: тронутых входов, сворачивающихся в ключ +> манифеста, было ноль. Но читается он как свойство ДЕРЕВА, а он есть свойство ОДНОГО ПАКА, и следующий же пак +> («граница главы», `D39.270`) его снимает: правка правила ингеста бампает версию нарезки по конвенции самого +> кода (`backend/internal/pipeline/manifest.go:355`=`treats an ingest-rule change as a chunkerVersion bump`), а +> отпечаток структуры несёт версию алгоритма даже у ПУСТОЙ грамматики +> (`backend/internal/lang/structure.go:104`=`structureAlgoVersion + "-none"`) ⇒ **ключ манифеста китайской книги +> сдвинется**. ⇒ читать B1 следует как «неподвижна ПО СОСТОЯНИЮ НА `dca0e06`», а не как гарантию на будущее. +> ⭐ Класс, ради которого эррата написана: **утверждение о неподвижности всегда датировано, и дату надо писать +> внутри него** — иначе следующая смена прочтёт снимок как инвариант и обнаружит разницу пере-оплатой. ## D22. Приёмка пакетов «бэкенд №3» и «полигон-erotica» + развязки 18+/эха/L3 (10.07, оркестратор). ✅ @@ -1914,7 +1924,7 @@ head-1 это семнадцать бюджетируемых операций, 3. **После пополнения баланса прогон возобновляется ЯВНЫМ действием пользователя, а не сам.** Пункт «авто-резюм `paused`» висел в листе владельца с 08.08 в форме, умершей вместе с оконной моделью; зона записала вывод сама (`PLATFORM_DIRECTION.md`), владелец его подтвердил — **пункт снят с листа**, вывод зоны становится ратифицированным. 4. **Фразы, которые видит пользователь (В-3 · К-6 · Приложение А), ДЕЛЕГИРОВАНЫ проекту** — слово: «оставляю проектирование фраз на вас, главное чтоб это было интернациональным». ⚠ Это не «свобода формулировки», а **инженерное требование**: фраза не может быть литералом ни в Go платформы, ни в TSX фронта — только данными, ключуемыми машинным кодом причины и локалью (механизм языков интерфейса уже построен, `ПТ-36`/`В-9`). Следствия: словарь фраз — носитель ДАННЫХ, один на продукт; `PD-246` (граница `attention`/`glance` — сегодня ДОГАДКА платформы по 15 причинам движка) закрывается вместе с ним, а не отдельно; строка **204** (движок не публикует причины флагов данными) становится его гейтом. Проектирование — оркестратор + зоны, подпись владельца больше не ожидается. 5. **Осталось на владельце из платформенного листа — ОДИН пункт, и он переформулирован** (`PD-421`): держит ли ОТКРЫТЫЙ поток событий сессию живой. Владелец ответа не дал, попросив раскрыть предмет; вопрос переформулирован в терминах продукта и вынесен заново. -6. ⚠ **Ключи провайдеров — развилка снята фактом, а не решением:** движок берёт их ДВУМЯ путями (`--keys-file` деплоя ПОБЕЖДАЕТ конвенционный `.env` рядом с `book.yaml` — `backend/cmd/tmctl/invocation.go:145`=`keys-file`), формат обоих — `KEY=VALUE`. Владелец 30.08 сообщил, что чинил ключи движка; **из этого следует, что холодный прогон движка (очередь №20 п.2) разблокирован, а живой прогон через API (п.3) — нет**: платформа читает СВОЙ путь (`TM_PLATFORM_ENGINE_KEYS_PATH`, `platform/internal/config/config.go:559`=`l.env("TM_PLATFORM_ENGINE_KEYS_PATH", "")`), и по записи P9 живых ключей в нём не было. Лечение — операционное и $0: направить переменную платформы на уже заполненный файл (формат совпадает), проверять — прогоном, не чтением (гардрейл `.env` в силе, оркестратор файлов ключей не открывал). +6. ⚠ **Ключи провайдеров — развилка снята фактом, а не решением:** движок берёт их ДВУМЯ путями (`--keys-file` деплоя ПОБЕЖДАЕТ конвенционный `.env` рядом с `book.yaml` — `backend/cmd/tmctl/invocation.go:145`=`keysFile := fs.String("keys-file", "", "translate: path to the DEPLOYMENT's provider-key file (KEY=VALUE lines). Loaded FIRST, so it wins over the .env beside book.yaml; a named file that cannot be read is a refusal, never a silent skip")`), формат обоих — `KEY=VALUE`. Владелец 30.08 сообщил, что чинил ключи движка; **из этого следует, что холодный прогон движка (очередь №20 п.2) разблокирован, а живой прогон через API (п.3) — нет**: платформа читает СВОЙ путь (`TM_PLATFORM_ENGINE_KEYS_PATH`, `platform/internal/config/config.go:559`=`l.env("TM_PLATFORM_ENGINE_KEYS_PATH", "")`), и по записи P9 живых ключей в нём не было. Лечение — операционное и $0: направить переменную платформы на уже заполненный файл (формат совпадает), проверять — прогоном, не чтением (гардрейл `.env` в силе, оркестратор файлов ключей не открывал). ## D39.177 — ПЕРЕДАЧА РОЛИ ОРКЕСТРАТОРА №20 → №21: что смена приняла и построила, четыре моих ошибки (две поймал владелец) и очередь, сверенная деревом (31.08). ✅ @@ -5026,3 +5036,55 @@ $0.38 из $6.65) измерен, не починен · **303** не трону процессов · `find` на относительном времени · копия под идущим мутатором · `awk`-диапазон по телу ноты · пофайльный `diff` по пути без префикса каталога. ⭐ Формулировка зоны, накрывающая класс: **оба прибора честны, и именно поэтому расхождение читается как порча данных, а не как разные вопросы.** + +## D39.270 — ВЫДАЧА БЭКЕНД-ПАКА «ГРАНИЦА ГЛАВЫ»: ЭТОТ ПРОМТ ЕСТЬ «ПАК 2» ПО РЯДУ 303 (18.09) + +**Носитель — `docs/BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md`.** Нота нужна потому, что промт есть ЗАКАЗ, а не +ратификация: `D39.224` п.7 запрещает трогать ось «обязательность юнита» **вне пака 2**, а кто есть пак 2 — в +ратифицированном тексте не сказано нигде (единственные вхождения имени — сам п.7 и ряды 302/303). Одной строкой +в промте такое не снимается: при конфликте промта с журналом побеждает журнал, и сессии предписано в этом +случае не строить, а пинговать. + +**1. ИМЕНОВАНИЕ.** Пак 2 по ряду **303** — это указанный промт. Запрет `D39.224` п.7 УСЛОВЕН («вне пака 2») и +потому **исполняется, а не отменяется**: внутри этого пака ось «обязательность юнита» трогать можно и нужно. +Ряды 302 (несколько глав в одном документе) и §9 дизайна (большой перекрой с миграциями) в пак НЕ входят. + +**2. ПРЕДМЕТ, и его нашёл владелец одной фразой** — «у нас есть статический код который смотрит глава ли это и +как она названа, там как то это все должно склеиваться». Замер подтвердил дословно: диспетчер ингеста отдаёт +грамматику источника только текстовому пути (`backend/internal/chunk/ingest.go:243`=`func ingestTXT(p, encoding, sourceLang string, st *lang.SourceStructure)`), +а `backend/internal/chunk/ingest.go:678`=`func ingestEPUB(p string, im *lang.InlineMarkup)` не получает её вовсе. +⇒ механизм, умеющий сказать «это глава и вот её имя», работает на одном пути из двух. + +**3. ФАКТУРА, снятая мною и пере-снятая кругом опровержения (книга прогона, EPUB 2.0, $0).** Целей навигации +**71** = 6 ярлыков частей + 65 ярлыков глав. Тела целей: **60** побуквенно равны ярлыку · **7** коротки и не +равны (2 титула частей + 5 осколков оглавления) · **4** несут прозу. Документов spine **без навигационной цели +— 55 из 126, и это вся проза книги**: навигация адресует осколки, а не текст. Настоящих глав **81** (форма: +голое римское числительное, затем имя прописными), плюс пролог `SUNSET` с тремя номерами БЕЗ имён. Ярлык +навигации есть склейка двух абзацев прозы, но **не побайтно: 0 из 81 побайтно и 65 из 81 при нормализации +регистра и апострофа** ⇒ шестнадцать глав навигация не называет вовсе. + +**4. ЧТО ПАК СДВИНЕТ В ДЕНЬГАХ — названо ДО выдачи.** Правка правила ингеста бампает версию нарезки по +конвенции самого кода (`backend/internal/pipeline/manifest.go:355`=`treats an ingest-rule change as a chunkerVersion bump`), +а в ключ манифеста сворачиваются и она, и отпечаток структуры, причём отпечаток несёт версию алгоритма даже у +ПУСТОЙ грамматики (`backend/internal/lang/structure.go:104`=`structureAlgoVersion + "-none"`). ⇒ **ключ манифеста +китайской книги сдвинется тоже.** Сегодня это бесплатно, и условие названо словами: бесплатно ⇔ ни одну +существующую базу с оплаченными чанками никто не продолжает (все 161 объявлены одноразовыми — `D39.63` п.3, +`D39.190` п.4), а продуктовый путь на хосте НЕ проверен (`TM_PLATFORM_BOOKS_DIR` не задан ⇒ «не нашёл», а не +«проверил»). Пак лендится ДО фриза холодного прогона; пре-регистрированные числа среза в +`docs/COLDRUN_TWO_BOOKS_SESSION_PROMPT.md` после него протухают и пере-регистрируются паком прогона. + +**5. ДВА КРУГА ОПРОВЕРЖЕНИЯ, и оба переписали пак, а не украсили его.** Круг 1 — 14 находок, 9 мажоров; круг 2 +— ещё 10 плюс ответы на четыре заданных вопроса. Все обязательные внесены. ⛔ **Мои ошибки, названные прямо, +потому что они одного класса:** «настоящих глав шесть» (неверно дважды подряд) · «навигация о заголовках не +знает» (она называет 65 поимённо и целит не туда) · «дом ратифицирован — книжный оверлей» (оверлей такой файл +ОТКАЖЕТ: `backend/internal/lang/langpack.go:463`=`an overlay merges only the source/pair manifest files`) · +«84 главы» подано замером, тогда как это ВЫВОД прибора · пример родового правила для остатка, ловящий 0 из 5 · +приор «центрированный абзац», требующий правки функции, которую тот же пак запрещает трогать. +⭐ **Класс, ради которого это записано:** все шесть — утверждения, которые ЗВУЧАЛИ как замер и держались на +одном приборе. Первый мой счётчик дал 3 главы вместо 84, потому что регексп требовал `class` первым атрибутом, +а первым стоит `id`; поймано печатью контрольной величины рядом с числом, и только ею. + +**6. ГРАНИЦА АКТА.** Акт утверждает ИМЕНОВАНИЕ пака 2 и выдачу промта. Он НЕ утверждает: судьбу пролога (её +объявляет сессия числом в §4.4) · форму лечения ряда 303 (дизайн §8.2 не ратифицирован) · что имя главы доедет +до книги читателя — замерено, что НЕ доедет (`TitleRaw` в билдере выдачи 0 вхождений, заголовок берётся из +`backend/internal/pipeline/bookbuild.go:554`=`t := ce.Heading`), и это остаётся долгом рядов 284 и 201.