textmachine/docs/CHAPTER_STRUCTURE_DESIGN_SESSION_PROMPT.md

50 KiB
Raw Blame History

Промт: ДИЗАЙН-пак «СТРУКТУРА ГЛАВ — БОЛЬШОЙ ПЕРЕКРОЙ» (проектирование, не стройка)

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 п.89 (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 (стоп-мир: EmbeddedVersioncutTagmanifestKey (⚠ адрес пере-снят 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 · что ты сама считаешь слабым местом дизайна. Последний абзац отчёта — план или обещание? Значит работа не кончена: сделай сейчас.