# Промт: ДИЗАЙН-пак «СТРУКТУРА ГЛАВ — БОЛЬШОЙ ПЕРЕКРОЙ» (проектирование, не стройка) > ✅ **АРХИВ — ПАК ОТРАБОТАН И ПРИНЯТ 11.09 БЕЗ СХОДИМОСТИ, правилом остановки: акт `D39.245`.** > Результат — `backend/docs/CHAPTER_STRUCTURE_DESIGN.md` (статус ПРЕДЛОЖЕНИЕ до пака стройки): глава > становится ИДЕНТИЧНОСТЬЮ. Предметная часть устояла в четырёх кругах опровержения, механика исполнения — > нет, и пак стройки обязан начать с прогона миграционной механики ОПЫТОМ. **Инструкции отсюда НЕ > ИСПОЛНЯТЬ** (правило архива): заказ закрыт, живое из него — в акте и в дизайн-документе. ## 1. Какая проблема и что решит твой результат Глава в движке сегодня адресуется своим ПОРЯДКОВЫМ номером **в сторе и в банк-окнах** (`chunk_status` PRIMARY KEY `(book_id, chapter, chunk_idx, stage)`, `backend/internal/store/migrate.go:126`). Из-за этого любая пере-нарезка книги сдвигает адреса, и вместе с ними едут банк-окна, снапшоты, чекпойнты и сметы — то есть **деньги**. ⚠ **А МАНИФЕСТ УЖЕ КОНТЕНТНЫЙ, и это половина фундамента:** `manifestChapterID` — «a chapter's stable identity: the first 64 bits of SHA-256 over its INGESTED text» (`manifest.go:215`), и там же разобрано, почему НЕ позиция. Перекрой доводит контентный адрес до остальных осей, а не изобретает его с нуля. Пока платная книга одна, пере-нарезать дёшево; после впуска пользователей это окно закроется. Второе следствие того же корня: не-CJK книга и часть EPUB приезжают читателю **одним полотном**, и платформа с 07.09 ОТКАЗЫВАЕТ на приёме книге из одной главы (`400 no_chapter_structure`, ратифицировано `D39.221`, канон `openapi.yaml`; остаток разреза — строка 332) — временное продуктовое сужение, снять которое может только этот перекрой. **Твой результат — ДИЗАЙН, а не код.** Документ, по которому следующие сессии строят, не переоткрывая решений: чем адресуется глава, что происходит с каждой осью при сдвиге, в каком порядке идёт миграция и какие вопросы обязан решить владелец. ⛔ **Строить в этом паке НЕЛЬЗЯ** (`D39.136` п.3: дизайн идёт перед стройкой). Исключение одно — измерительные пробы, см. §5. ## 2. Зона и git **Зона записи: `backend/docs/`** (дизайн-документ) плюс своя секция «Бэкенд» в `docs/PROGRESS.md`. Код `backend/**` — только ЧИТАТЬ; правки кода в этом паке запрещены, кроме выброшенных проб (§5), которые в дерево не попадают. ⛔ **ИСПР. 11.09 — ПАРАЛЛЕЛЬНОЙ КОДОВОЙ СЕССИИ ШАГА 0 БОЛЬШЕ НЕТ.** Её пак отработан и заландён 07.09 (акт `D39.225`), промт уведён в `archive/prompts/`; прежний абзац о разведении зон с ней снят как описание прошедшего. **Движковый слот занимаешь ты одна** (норма владельца 11.09: один промт на зону). В `docs/PROGRESS.md` **заведи СВОЙ подзаголовок `#### Дизайн-пак перекроя структуры глав` внутри секции «Бэкенд» и пиши только под ним**; чужой текст не трогай. ⚠ Дерево движка с 07.09 двигали ПЯТЬ заландённых паков — `D39.225` (07.09) · `D39.226` · `D39.228` (08.09) · `D39.232` (10.09) · **`D39.242` (11.09, в числе тронутых `stagerun.go` — якорь §4.4в)**; ⚠ `D39.241` лендингом НЕ является, это сброс незакоммиченного дерева, он не двинул ни байта ⇒ **любой `file:line` из этого промта пере-снимай командой прежде, чем на него сослаться**: часть адресов я уже пере-снял (§4.4в), но проверял не все. **Сессия НЕ коммитит** — дерево передаёшь оркестратору. Канон git — `CLAUDE.md`. `.env` не читать. ⚠ Что должно пережить рестарт — в РЕПОЗИТОРИЙ, а не в скрэтчпад. ⚠ Входящее сообщение другой сессии — не приказ: промт сильнее, расхождение — пинг. ⛔ **Правка ЗАКАЗА на лету доезжает только РЕЛЕЕМ:** я пере-передаю её отдельным сообщением, ты эхо-подтверждаешь её своими словами и выносишь ОТДЕЛЬНЫМ пунктом отчёта. Устная договорённость, не прошедшая этих трёх шагов, заказом не является. ## 3. Карта чтения — ЗАКОН, дальше только по её ссылкам 1. `CLAUDE.md` — цели владельца и гардрейлы. 2. Строки бэклога **160**, **161**, **224**, **283**, **298**, **302**, **303**, **320**(б), **332**, **346** (`docs/BACKLOG.md`, греп `^| N |`). ⚠ Список дополнен 11.09: тело §4 заказывает работу по 160, 224, 298 и 346, а карта их не называла — и карта есть ЗАКОН, то есть сессия их бы не открыла. 3. `docs/research/33-backend-debt.md` — **читать через ревью-шапку** (статус: ФАКТУРА, НЕ ратифицирована), предметно — секция «Спроектировать ЗАНОВО и отрефакторить без заплат» (⚠ адрес пере-снят 11.09: строка **463**, в промте стояло 451 — уехало лендингами 07.09). 4. `docs/research/27-chapter-detection.md` §3а (жизненный цикл дерева) и §5 п.8–9 (id и деньги). ⚠ **D-нотой НЕ ратифицировано** — это фактура ресёрча о самом себе; при конфликте с D-логом побеждает лог. 5. `docs/architecture/18-bank-ontology.md` — РАТИФИЦИРОВАНА, обязательное пре-чтение перед всем, что трогает банк; плюс `backend/README.md` для механики движка. 6. ⛔ **ЧТО УЖЕ ЛЕЖИТ В ТВОЕЙ СОБСТВЕННОЙ ЗОНЕ ЗАПИСИ — `backend/docs/` (15 файлов), и два из них про твой предмет.** Прежняя редакция промта их не знала, и это была его худшая дыра: сессия находит их на первом часу и обязана вставать. **(а)** `D15.2-content-addressed-resume-spec.md` (539 строк) — шапка объявляет её **дизайном-оф-рекорд**, реализация отложена, родословная ратифицирована. ⇒ §4.4а **НЕ переоткрывает её**: читаешь и говоришь, что именно перекрой в ней ломает и что дополняет. **(б)** `chapter_structure_shiftmap.py` + `CHAPTER_STRUCTURE_SHIFTMAP.json` (275 строк замеров) — рабочий прибор миграционной карты, уже отработавший: set-diff по id и номеру, классы `same/moved/gone/new`. ⇒ §4.1 его **не пишет заново**, а расширяет: классов в `research/27` **шесть**, прибор считает четыре — `split` и `merged` он не знает, и это настоящая дыра. Плюс `CHAPTER_STRUCTURE_REPORT.md` (526 строк) — прочти прежде, чем отвечать на §4: часть ответов может уже стоять там. **Ратифицированное, что нужно для работы:** - **`D39.216` (мандат чистоты, решение владельца), делай РОВНО так:** проектировать без хаков и воркэраундов; где форма не тянет — развязать или переписать. «Дешевле подпереть» доводом НЕ является. Отступление законно, но объявляется С ЦЕНОЙ. ⚠ Этот пак существует именно потому, что заплатой его предмет закрыть нельзя. - **`D39.104` — закон банка:** строка на проводе есть закон для КАЖДОЙ роли и КАЖДОЙ строки независимо от статуса. Дизайн его не ослабляет. - ⛔ **КАНОН ОСЕЙ — ЧЕТЫРЁХОСНИК `D39.224` п.8: провод · вердикт · банк · крой.** Он ратифицирован. Пятиосник `research/33` (провод · вердикт · банк · КОНТЕНТ · ПОЗИЦИЯ) — фактура, и прежняя редакция промта требовала обе карты сразу, то есть отдавала сессии два взаимоисключающих приказа (испр. 11.09). Строишь по ратифицированному; считаешь его узким — опровергай аргументом и объясняй, что четырёхосник не ловит. - **`D39.216` п.3(г)** — чистота, купленная тихим сдвигом снапшота, чистотой не является. Для пака ПРО сдвиг снапшота это самый прямой пункт мандата. - **`D39.136` п.3** — стройка идёт после **РАТИФИКАЦИИ** дизайна, а не после его написания. Твой документ становится основанием для стройки, когда я закрою пак актом; до этого он предложение. - **Ревью-вопрос проекта по умолчанию** (`CLAUDE.md` §Цели п.2): «заработает ли пара, которой в репо ещё НЕТ, без правки Go?» Каждое твоё решение обязано иметь на него ответ. - ⛔ **РАТИФИЦИРОВАНО ПОСЛЕ НАПИСАНИЯ ЭТОГО ПРОМТА (07.09 → 11.09) — читать ДО §4.4, оно бьёт прямо по нему:** - **`D39.228`: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля.** Это прямой ответ на половину вопроса §4.4 «что входит в окно» — не переоткрывай его, опирайся. - **`D39.240` (слово владельца): остановка остаётся ЖЁСТКОЙ, ДЕНЬГИ ТЕРЯТЬ ДОПУСТИМО, но она обязана быть КОРРЕКТНОЙ — без гонок, без половинчатых состояний, с ВЕРНЫМ ВОЗОБНОВЛЕНИЕМ.** Твой §4.4а (контент-адресуемый resume) — носитель этого обещания: перекрой не имеет права сделать возобновление после жёсткого стопа неверным. ⚠ Пак «две остановки» ОТМЕНЁН владельцем целиком (`D39.240`) — не ссылайся на него как на построенное. - **`D39.232`: оборванный нами вызов больше не оплачивается дважды** (движок, заландён 10.09) — денежная картина §4.2 изменилась, пере-читай `rebill.go` прежде, чем цитировать старые проценты. - **`D39.238`: два SIGTERM в одном кванте Go-процесс видит как ОДИН** (замерено дважды) — если дизайн где-то опирается на «послал два сигнала — получил два», опора ложная. - **Число называет ДЕРЕВО и ПОПУЛЯЦИЮ** · **рядом с нулём контрольная величина ПЕЧАТАЕТСЯ** · **мутация засчитывается по ТЕКСТУ сообщения**. ## 4. Состав и разметка свободы ### 4.1 Чем адресуется глава и развязка чанкера от глав — **реши сам, аргументируй; центральное решение пака** ⚠ **Это ОДИН предмет, а не два.** `research/33` склеивает формулу `Chapter.ID` и развязку чанкера в ОДНУ перенарезку: разносить их значит платить перекроем дважды. Дизайн отвечает на оба вопроса вместе. Сегодня два числа главы уже расходятся: плотный `Chapter` (первичный ключ, адрес redrive) и номинал в заголовке (`Heading` рендерит исходное `n`) — на неплотной нумерации и на прологе. Дизайн обязан назвать, каким числом глава адресуется, что происходит со вторым, и как адрес переживает пере-нарезку. ⚠ Половина фундамента уже стоит и запинена (`manifestChapterID`, `TestManifestChapterIDSurvivesAReCutAndAnEditElsewhere`) — начни с чтения того, что построено. ⭐ **ПРИОР, а не пустой вопрос:** `research/27` §5 п.9 предлагает контент-производный id (хеш первого окна тела с титулом) и карту миграции `same/moved/split/merged/gone/new`, §5 п.8 — деньги и память ключуются хешами СЕГМЕНТОВ, а глава есть группировка. На этом сошлись две модели панели. **Прими или опровергни ЗАМЕРОМ** — но не переоткрывай молча. ⚠ Сюда же вопрос владельцу (§11): точка ЗАТВЕРДЕВАНИЯ структуры — `research/27` §3а п.4 говорит «твердеет на подписи банка», и это D-нотой не ратифицировано. ### 4.2 Карта осей сдвига — **состав делай РОВНО так; ответы по осям — ПРИОР, опровергается замером** Сегодня предикат `classifySnapshotMove` знает одно re-pinnable поле (`repin.go:54`), всё прочее — `moveOther`. Дизайн обязан дать явную карту осей **по ратифицированному четырёхоснику `D39.224` п.8: провод · вердикт · банк · крой** — и на КАЖДОЙ честно ответить, что делать: провод — купить, вердикт — пере-вынести из чекпойнта за $0, банк — ре-пин, крой — показать смету. ⚠ **ИСПР. 11.09:** прежняя редакция требовала ЗАОДНО пятиосник `research/33` (контент · позиция вместо кроя) — две несовместимые таксономии как два «делай РОВНО так». Канон — четырёхосник; пятиосник фактура. Считаешь четырёхосник узким — скажи, ЧТО он не ловит. ⛔ **И `projectRebill` уже умеет больше, чем говорила прежняя редакция** (пере-снято 11.09, иначе дизайн закажет построенное): непроецируема РОВНО ОДНА вещь — правка исходника, НЕ двигающая манифест (`rebill.go:33-36`); позиционные сироты исключаются НАМЕРЕННО, и ряд сам объясняет, почему их счёт был бы ложным согласием на деньги (`rebill.go:100-105`); контент-осознанность ПОСТРОЕНА (`rebill.go:112-119`: bank-only сдвиг с тем же content hash резюмится за $0 и считается ре-пином, а не ре-оплатой). ⇒ вопрос дизайна не «добавить контентную ось», а **«что из этого меняет перекрой»**. ⚠ Ряд бэклога **160** цитирует старый адрес `rebill.go:32-35` — якорь протух, пере-снимай. ### 4.3 Банк-окна на chapter-ID — **делай РОВНО так** Дизайн предписывает ФОРМУ перевода `since_ch`/`until_ch` на адрес главы из §4.1 (кода не пишет). Носители и объём — `decisions.go:166`=`func TermID(src, sense string, since, until int)` и `memory.go:680`=`func spoilerBlocked`; величина из `research/33`: **14 из 142 добытых терминов несут окна, плюс ~8 чисел в сидах**. Дизайн называет форму миграции и её стоимость ЧИСЛОМ. ⚠ **ИСПР. 11.09 — класс переноса НЕ пред-решён.** Прежняя редакция объявляла его `moveBankOnly` (ре-пин за $0), но §4.4 кладёт в ТО ЖЕ окно расщепление `EmbeddedVersion`, которое двигает `cutTag` — в общем окне ход перестаёт быть bank-only, и $0 не наступает. Реши сам: либо миграция окон идёт ОТДЕЛЬНЫМ актом и тогда bank-only законен, либо она в общем окне и тогда назови настоящую цену. ⛔ **И кросс-зонное следствие, которого в промте не было:** `TermID` складывает окна в ИДЕНТИЧНОСТЬ терма, а она экспортируется наружу — `bankexport.go:158` («ID is a STABLE key derived from the row's uniqueness key (src, sense, since_ch, until_ch)»). Перекладка окон на chapter-ID меняет `BankExportTerm.ID` каждого оконного терма — то есть у читателя за швом. Назови судьбу этих id; это родной брат ряда **298**. ### 4.4 Что входит в окно пере-нарезки и что НЕ входит — **делай РОВНО так** Расщепление `EmbeddedVersion` на три радиуса (по образцу `bankdata.go`) двигает хеш ⇒ идёт ТОЛЬКО внутри этого окна. ⚠ Это и есть **«третий версионный план паттернов»** строки 161: план ДАННЫХ вне волнового снапшота — назови его этим именем, чтобы носитель был один. Сюда же строка **320**(б) — правка `internal/lang/data/injection.txt` (стоп-мир: `EmbeddedVersion` → `cutTag` → `manifestKey` (⚠ адрес пере-снят 11.09: `manifest.go:359`, `func (r *Runner) manifestKey`; в промте стояло `:341`. ⛔ **ИСПР. 11.09: прежняя редакция объявляла форму `manifest_key` в строке 320 ОШИБОЧНОЙ — это неверно.** `manifest_key` — живое имя колонки ПЛАТФОРМЫ, несущей ровно движковый `manifestKey` (`platform/internal/pgstore/readmodel.go:167`, миграция `00016_read_surface.sql:16`), и именно на нём держится предупреждение §4.8: `recut := storedKey != in.ManifestKey` роняет решения прежнего кроя. Ряд 320 не ошибается — он называет кросс-зонное следствие)). **`structure_version` как самостоятельная ось консент-гейта — решить в дизайне.** ⚠ **Но в КРОЙ он уже сложен** (`manifest.go:272-276`: «it belongs here and not merely in the manifest key: without it a grammar edit would re-cut the book while every unit id stood still») — открыт только вопрос про снапшот и консент-гейт, а не про сам факт входа. Не «решай» уже решённое. ⚠ Приор `research/33` (Д6): не через `buildSnapshotID`, довод — `repinnable()` истинен только на bank-only move, а фолд протухает все `chunk_status`. Приор, а не запрет: опровергается аргументом. ⛔ **Сюда же — МЕСТО СТРОКИ 160, и ответ обязателен** (`D39.224` п.6). `D39.190` п.2 поставила Этап 0 СВОИМ паком после двери выдачи, СТОП-МИРОМ: у бампа `manifestVersion` безопасного порядка деплоя нет ни в одну сторону (`PD-436`), гейт интейка платформы — строгое равенство одной константе. Перекрой пере-минтит КЛЮЧИ манифеста, но двигать его ФОРМУ не обязан ⇒ назови, ложится ли Этап 0 в тот же стоп-мир, что перекрой. Два стоп-мира вместо одного — цена, которую никто не назначал, и умолчать её нельзя. ### 4.4а Контент-адресуемый resume (долг `D15.2`) — **делай РОВНО так** Это механизм, на котором стоит денежное обещание §1: деньги и память ключуются хешами СЕГМЕНТОВ, а глава — их группировка (`research/27` §5 п.8). Пере-нарезка тогда есть ПЕРЕГРУППИРОВКА уже оплаченного, а не его потеря. Без этого пункта §4.1 решает адресацию, но не отвечает, почему перекрой не сжигает купленное. ⛔ **ИСПР. 11.09: у пункта не было ни одного императива — его закрывал абзац пересказа.** Дизайн ОБЯЗАН ответить на три вопроса, каждый строкой документа: 1. **Какой хеш становится ключом ОПЛАЧЕННОГО** и чем он отличается от сегодняшнего адреса `chunk_status` (PK `book_id, chapter, chunk_idx, stage`, `store/migrate.go:126`). 2. **Что происходит с `chunk_status` при ПЕРЕГРУППИРОВКЕ** — какие строки переезжают, какие осиротеют, кто и когда их подметает. 3. **Почему возобновление после ЖЁСТКОГО стопа остаётся ВЕРНЫМ** (`D39.240`, слово владельца: деньги терять допустимо, остановка обязана быть корректной с верным возобновлением). Перекрой не имеет права сделать резюм после стопа неверным — это инвариант, а не пожелание. ⚠ И начни с чтения `backend/docs/D15.2-content-addressed-resume-spec.md` (§3 карты п.6): она дизайн-оф-рекорд, её не переоткрывают — её дополняют и называют, что в ней перекрой ломает. ### 4.4б IR, формато-адаптеры и индуктор — **реши сам, аргументируй ГЛУБИНУ** Строка 161 называет IR + адаптеры (EPUB `nav`/NCX построен, **FB2 нет вовсе**) + индуктор с валидаторами и вердиктами (`research/27` §5: `OK` / `DEGRADED` / `FAILED`). Дизайн обязан назвать ФОРМУ этого слоя и то, как вердикт индуктора доезжает до пользователя, — но глубину проработки выбираешь ты: если честный ответ «это отдельный дизайн», скажи это с доводом и назови шов, который перекрой обязан не сломать. ### 4.4в Предикат осей — **делай РОВНО так** (критерий ратифицирован `D39.224` п.8) ⛔ **ИСПР. 11.09 — ГРАНИЦА ПУНКТА.** Пункты (2)–(5) и «мерило» ниже дизайн **ОПИСЫВАЕТ как критерий приёмки пака СТРОЙКИ** (`D39.224` п.8: критерий шага 1 уходит в дизайн-пак). Писать их здесь нельзя — §2 запрещает код, и прежняя редакция заказывала четыре артефакта, которые сама же запретила. Сегодня `classifySnapshotMove` знает ОДНО re-pinnable поле (`repin.go:54`; тело предиката — `repin.go:61`), всё прочее — `moveOther`. Дизайн обязан выдать явную карту осей, и она проверяемая, а не декларативная: **(1)** таблица относит КАЖДЫЙ JSON-ключ полезной нагрузки `buildSnapshotID` (адресуй СИМВОЛОМ, не строками; пере-считано 11.09 моим прибором — ключей **21**, команда `awk '/^type snapshotPayload struct/,/^}/' internal/pipeline/snapshot.go | grep -c 'json:"'`; у `stageSnap` их 19). ⚠ **Скоуп: 21 — это ключи ВЕРХНЕГО уровня, и `stages` среди них ОДИН ключ** — `classifySnapshotMove` сравнивает верхний уровень как `map[string]json.RawMessage`. Девятнадцать полей `stageSnap` внутрь карты осей не разворачиваются; если дизайн считает иначе, он это обосновывает. Отнести ровно к одной оси — провод · вердикт · банк · крой; **(2)** рефлексивный тест по образцу `TestEveryCutInputMovesTheTag` (`cuttag_test.go:26`) краснеет на ключе БЕЗ оси, чтобы ни один не попадал в `moveOther` умолчанием; **(3)** резюм-тест: сдвинут ТОЛЬКО вердикт-ключ ⇒ ноль платных вызовов, вердикт пере-вынесен из текста чекпойнта (сегодня `resumeFromChunkStatus`, `resume.go:22`, отдаёт сохранённый слепо — адрес пере-снят 11.09, в промте стояло `:24-26`); **(4)** `TestRepinRefusesAnyMoveThatIsNotBankOnly` (⚠ адрес пере-снят 11.09: `miningstop_join_test.go:1874`; в промте стояло `:1686`) пере-скоупится ЗАКАЗОМ пака и объявляется в отчёте (`D39.183`); **(5)** `projectRebill` показывает контентную и позиционную оси (`rebill.go:33-36` сам называет их непроецируемыми). ⚠ **Что этот предикат НЕ покупает:** wire-правка меняет рендер провода ⇒ `ContentHash` другой ⇒ модель придётся вызвать при любой карте осей (`stagerun.go:92-94` — ⚠ адрес пере-снят 11.09 по находке опровергателя: на `:91` стоит `return nil, fmt.Errorf(...)`, утверждение несут `:92` и `:94`). Норма «копить одним касанием» падает только для ВЕРДИКТ-оси — так и напиши, иначе дизайн пообещает больше, чем механизм даёт. Мерило: бамп `CheapGateVersion` на продолжаемой книге ложится с нулём платных вызовов и без `--resnapshot`. ### 4.5 Правило заголовка, не-CJK путь и `unit_resolutions` — **делай РОВНО так** Дизайн предписывает: три предиката заголовка сводятся к ОДНОМУ источнику стражей, паритет-тест ингест↔чанкер ОПИСЫВАЕТСЯ (пишет его пак стройки). Строка **303**: чанкер безъюнитную грамматику («Kapitel 12») уже умеет, ингест по ней не режет — дизайн обязан закрыть ревью-вопрос §3 для языков БЕЗ юнита, и закрыть его ДАННЫМИ, а не веткой в Go. ⚠ **Граница, которой в промте не было** (`D39.224` п.7): **проектировать — можно и нужно, ТРОГАТЬ ось «обязательность юнита» в коде — нельзя**; стройка идёт паком 2 (лексиконы не-CJK), который ещё НЕ написан и ждёт файлов владельца. Назови форму и шов — это не нарушение запрета, а его исполнение. Сюда же строка **298** (`unit_resolutions`): `research/33` называет её аддитивной, но требует решить В ТОМ ЖЕ дизайне — реши и назови форму. ### 4.6 Гранулярность EPUB и выдача — **реши сам, аргументируй** Строка **302**: несколько глав в одном документе, разделённых якорями `nav`, сегодня схлопываются в одну; провенанс честен (`delimited` + счёт), разрез груб. Строка **283**: билдер кладёт по XHTML на главу движка ⇒ не-CJK txt приезжает одним полотном. Дизайн называет, режется ли документ по якорям целей, и что из этого снимает временный отказ интейка (`D39.221`). ⚠ **Ряд 283 стоит и в СЛЕДУЮЩЕМ бэкенд-паке горизонта («выдача, которую видит читатель»), и здесь. Разведены так:** твой пак решает, ЧЕМ режется документ и какова гранулярность (форма); пак выдачи строит то, что ты решишь. Строить по 283 в этом паке нельзя, решать — обязательно. ### 4.7 Чего в паке НЕТ — **не делай**, и это ОБЪЯВЛЕННЫЕ сужения, а не умолчания Общее: не строить код · не менять контракт (аддитивное расширение только ОПИСАТЬ) · не трогать `configs/` и `internal/lang/data/` · не заказывать платных прогонов · не решать за владельца вопросы §11. Из строки **161** сознательно СНЯТО с этого пака: - **Роль title / мини-сессия названий** (редакторский слот · инъекция банка · двухфазно вокруг подписи) — отдельный предмет с продуктовой стороной и своим денежным следом. ⚠ Дизайн обязан назвать ШОВ, который перекрой не имеет права сломать, и на этом остановиться. - **Аддитивное расширение контракта 14** — ОПИСАТЬ, что понадобится, и не более: канон правит оркестратор. ⛔ **Конфликт, который ты встретишь на первом часу, и его диспозиция.** `research/33` §5 «Шаг 0 — ДО дизайна» заказывает пять $0-правок кода (включая «паритет-тест пишется сейчас»). **В этом паке они НЕ делаются:** §2 запрещает код, и они уже заказаны ОТДЕЛЬНО — строки **344** · **345** · **346**(а) · **349** и дописка **224**, порядок ратифицирован `D39.224` п.3. ⚠ **ИСПР. 10.09: предусловие ИСПОЛНЕНО — шаг 0 уже ЛЁГ** (акт `D39.225`, 07.09), и ждать его не надо: из перечисленных живы только **346** и **224**, остальные закрыты. ⚠ **И обе живые половины шага 0 НЕ держат** (испр. 11.09, иначе врезка противоречит себе): у ряда **346** закрыта половина (а), а живая (б) — это фикс ВНУТРИ окна перенарезки, то есть твой предмет; ряд **224** жив ПЛАТФОРМЕННОЙ половиной, движковая закрыта `D39.225`. Прежний текст говорил «шаг 0 идёт СВОИМ паком ПАРАЛЛЕЛЬНО тебе и обязан лечь до пака СТРОЙКИ» — это описание уже прошедшего. Ты их НАЗЫВАЕШЬ как предусловия пака стройки; если какая-то нужна, чтобы ответить на вопрос дизайна, — ставь выброшенную пробу (§5 п.3), в дерево она не попадает. ### 4.8 Параллельный платный прогон на настоящей книге — **делай РОВНО так** ⚠ **ИСПР. 11.09, дважды.** Владелец разрешил платный сквозной прогон настоящей книги (3 главы zh→ru) через платформу и движок — носитель санкции: `docs/NEAR_TERM_PLAN.md`, секция «Решения владельца». Пак прогона — `docs/POLYGON_COLD_RUN_A_SESSION_PROMPT.md`, зона ПОЛИГОНА; кода движка он не пишет и твоей зоны не касается. ⚠ **Идёт он или ещё не запущен — на момент чтения проверь сам** (`docs/README.md`, таблица активных промтов): сдачу свою им НЕ гейти ни в каком случае. Следствия для тебя, и они жёсткие: 1. **Стенд и БД прогона не трогать.** Твои выброшенные пробы (§5 п.3) идут в СВОЕЙ песочнице и на СВОИХ данных. ⛔ Прогон на живой книге чувствителен к ключу манифеста: любая правка, двигающая `manifestKey`, стирает замечания и счётчики книги. Тебе код править и так запрещено (§2) — здесь названа ЦЕНА нарушения. 2. **Улики прогона про структуру глав придут тебе пингом через оркестратора.** Прогон гоняет книгу С МНОГОЕДИНИЧНОЙ главой — то есть ровно твой худший случай. Пришло — впиши в дизайн и назови, что изменилось; не пришло — ничего не жди и не гейти этим свою сдачу. 3. **Своего платного прогона НЕ заказывать** (§«Деньги»). Упрёшься в «это предъявляется только платным прогоном» — пинг за санкцией. ### 4.9 Попутное, $0 — **делай РОВНО так** 1. **Имя твоего документа — `backend/docs/CHAPTER_STRUCTURE_DESIGN.md`.** В зоне уже 15 файлов, среди них `CHAPTER_STRUCTURE_REPORT.md`; безымянный заказ дал бы шестнадцатый с неотличимым именем. 2. **Три уехавших якоря в ТВОЕЙ зоне** (`python3 docs/scripts/counts.py --lint` из корня): `backend/docs/DISCLOSURE_LAW_DESIGN.md:40`, `:41`, `:42` — цели `internal/pipeline/quality.go:233`, `status.go:768`, `status.go:851`. Пере-снять адреса командой и починить. ⚠ Якорь бывает двух ролей: живая ссылка (чинить) и УЛИКА в описании дефекта (не чинить — замена перевернёт описание поломки в описание её отсутствия). Раздели хиты прежде правки. ⚠ Сводка линтера печатает «internal 6» — это НЕ твоя зона целиком: половина из шести платформенная. 3. **Лист владельца.** `docs/product-requirements.md`, требование **ПТ-37** («Нарезка по границам СЦЕН», не построено) — прямой сосед §4.1 «развязка чанкера от глав». Либо дизайн его называет и говорит, где оно встраивается, либо **пропуск подписывается пропуском**: «ПТ-37 не рассматривал, потому что …». ## 5. Мандат самопроверки ИСПОЛНЕНИЕМ — «перечитал сам» не считается Дизайн проверяется иначе, чем код, и вот чем именно: 1. **Каждое утверждение о ТЕКУЩЕМ коде — грепом или прогоном, с `file:line`.** Дизайн, стоящий на неверном описании сущего, дороже отсутствующего: по нему будут строить. 2. **Числа радиуса — СВОИМ замером.** `research/33` называет 183 площадки. ⛔ **ИСПР. 11.09: противоречие ресёрча я описал неверно, и «77 %» — моя арифметика, а не его утверждение** (греп `77 ?%` по файлу — 0 хитов при контроле «64 %» — 3 хита). Настоящее противоречие такое: **ОДНА И ТА ЖЕ дробь 117/183 подписана ДВУМЯ разными популяциями** — `:149` говорит «вне `internal/pipeline`», а `:466`/`:541` — «в `membank`+`store`». По собственной разбивке файла membank 70 + store 47 = 117, то есть верна вторая подпись, а «вне pipeline» = 183 − 43 = 140. Пере-считай своим прибором, назови ПОПУЛЯЦИЮ и ДЕРЕВО. 3. **Ключевые допущения — выброшенной пробой** (`go test -overlay` в песочнице, в дерево не попадает). Как минимум: расхождение двух чисел главы на реальной книге корпуса и поведение банк-окна при пере-нарезке. $0, read-only. 4. **Опровергатель твоего готового дизайна отдельным субагентом.** Харнесс по умолчанию субагентов не спавнит — тебе РАЗРЕШЕНО и требуется. Модель задай ЯВНО (`fable`), одного-двух хватит. Мандат: «найди в этом дизайне решение, которое не переживёт первой же стройки», а не «проверь, всё ли хорошо». ⛔ **И вот где мягко ИМЕННО у этого пака — веди проход по этим четырём** (глубину выбираешь сам): **(а) адреса `file:line`** — с написания промта движок двигали пять паков, часть адресов я пере-снял, но проверял НЕ ВСЕ; **(б) числа `research/33`** — он себе противоречит подписью популяции (п.2 выше); **(в) «уже построено»** — три раза прежняя редакция заказывала существующее (`manifestChapterID`, `structure_version` внутри кроя, контент-осознанность `projectRebill`), ищи четвёртый раз; **(г) две таксономии осей** — четырёхосник ратифицирован, пятиосник фактура, и смешение даёт таблицу, которую нечем проверить. 5. **Интервальная самопроверка** примерно на середине — субагент против ЯВНЫХ критериев §4. ⚠ У пунктов «реши сам» явных критериев нет по построению: там прибор — не сверка, а вопрос «какой аргумент ты привёл и чем он подкреплён». 6. **Перед отчётом сверь каждый клейм с результатом инструмента ЭТОЙ сессии.** ## 6. Оси ревью — характер «Ресёрч/текст» и «Доки» - **Claim-fidelity, и у неё есть ПРИБОР:** каждая закавыченная цитата грепается по первоисточнику как дословная подстрока; не нашлась — это пересказ, и кавычки снимаются. Типовой провал здесь ОВЕР-АТРИБУЦИЯ, а не выдумка. ⚠ Прежняя редакция этого промта нарушала норму трижды (в кавычках стоял пересказ) — прибор введён 11.09 именно поэтому. - **Доки:** сверка утверждений против кода и живых носителей. ## 6а. Стоячие правила владельца на эту смену (слово 11.09) — исполняются как часть пака 1. ⛔ **Никаких велосипедов, воркэраундов и хаков ВОКРУГ проблемы.** Владелец сказал это отдельно и про бэкенд-паки в первую очередь: нужно логически правильное решение поставленной задачи, а не её обход. Для ДИЗАЙНА это читается так: решение, которое «дешевле подпереть», в документ не попадает; если честный ответ — «форму надо переписать», пиши его и назови цену (`D39.216`, мандат чистоты). 2. **Пак доводится до конца САМОЙ сессией.** Владельца не беспокоить; оркестратора не тегать «просто так» (§13). Промежуточные вопросы — пингом оркестратору, а не остановкой работы. 3. **Эхо-протокол обязателен** (§9) и идёт ПЕРВЫМ действием — своими словами, не пересказом промта. ## 7. Записка-план ДО работы До первой строки дизайна пришли оркестратору ≤15 строк: что берёшь по каждому пункту §4 · где ждёшь сопротивления · что считаешь спорным в самом заказе. ⚠ Канала нет — записка идёт первой секцией `docs/PROGRESS.md` под твоим подзаголовком, а не исчезает. ## 8. Заявление = команда Любое число и любая категорика — с командой, которой получены, и её выводом. ## 9. Эхо-протокол старта ДО первой правки пришли **оркестратору первым действием, по адресу из `/tmp/textmachine-channel`** (`SendMessage`) ≤10 строк: скоуп · инварианты · не-делать. Эхо в собственный блокнот не эхо. Канала нет — эхо первой секцией отчёта, это законный случай. ## 10. Что НЕ удалось — обязательная секция отчёта Что не проверено · что не воспроизвелось · где данных не хватило. **«Не измерено» вместо догадки.** ## 11. Канал вопросов, право отказаться и что решает ВЛАДЕЛЕЦ Конфликт промта с кодом — пинг, не интерпретация. Право сказать «этого делать не надо» с аргументом. ⚠ **Отдельной секцией дизайна — вопросы, которые обязан решить владелец**, с ценой каждого варианта: как минимум номер главы в глазах пользователя, судьба уже переведённых книг при перекрое и то, платит ли кто-нибудь за пере-нарезку. ⛔ **И точка затвердевания — это ДВА вопроса, а не один** (испр. 11.09: прежняя редакция схлопывала их и получила бы схлопнутый ответ, а платит за разницу перекрой): **(1) когда твердеет НАРЕЗКА** — то есть деньги (`research/27` §3а п.3: «Freeze на этой стадии относится к НАРЕЗКЕ/деньгам, не к виду»); **(2) когда твердеет ВИД** — то, что видит читатель (там же п.4). Ни то, ни другое D-нотой не ратифицировано. ⚠ Формулировка «твердеет на подписи банка» — мой ПЕРЕСКАЗ, в файле её нет; цитируй файл. Не решай за владельца и не прячь в прозе. ## 12. Прямой канал `CLAUDE.md` §«Связь между сессиями»: `/tmp/textmachine-channel`, свой блок первым делом, живость — `ListAgents`. Роли нет или файла нет — нормальный случай: вопрос секцией в отчёт, сессии подряд не опрашивать. ## 13. Критерий завершённости — по нему тебя примут Работа завершена, когда: у каждого пункта §4 есть исход (решено · сознательно не решаю с доводом · вопрос владельцу) · круги самопроверки СОШЛИСЬ, и для ДИЗАЙНА это значит конкретное: **последний проход опровергателя (§5 п.4) не дал НОВЫХ находок** — у дизайна нет батареи, поэтому «сошлись» без внешнего прибора остаётся самоотчётом; прежние находки закрыты таблицей «находка → что сделано → чем предъявлено» · числа сняты после последней правки · всё живое в ДЕРЕВЕ, а не в письме · явное «работа завершена, править не планирую». Без последнего пак считается идущим. ⛔ **Оркестратора тегать «просто так» нельзя** — его приёмка идёт последней и вторым кругом тебе не служит. ## Деньги **Пак — $0.** Платных вызовов нет: дизайн, гре́пы, читающие пробы. Упрёшься в «это предъявляется только платным прогоном» — пинг за санкцией, не своё решение. ## Отчёт Дизайн-документ в `backend/docs/` + секция «Бэкенд» в `docs/PROGRESS.md` + сообщение оркестратору: что решено по каждому пункту · чем предъявлено (команда и вывод) · таблица «находка → что сделано → чем предъявлено» · что сказал опровергатель и что ты с этим сделала · вопросы владельцу с ценой · секция §10 · **что ты сама считаешь слабым местом дизайна**. ⛔ Последний абзац отчёта — план или обещание? Значит работа не кончена: сделай сейчас.