textmachine/docs/archive/reports/NEXT_PACKS_PLAN_2026-09-03.md

36 KiB
Raw Blame History

ПЛАН ДВУХ СЛЕДУЮЩИХ ПАКОВ — бэкенд и платформа (оркестратор №22, 03.09.2026)

⚠⚠ АРХИВ. ПЛАН ОТРАБОТАН — РЕШЕНИЯ ПРИНЯТЫ, ПРОМТЫ ВЫДАНЫ. ИНСТРУКЦИИ ОТСЮДА НЕ ИСПОЛНЯЮТСЯ. Составлен 03.09, сведён с разбором контролёра (Fable 5.1) по всему бэклогу и всему журналу, ратифицирован D39.190 04.09. Живые носители его содержания: решения — D39.190 (160 отложена ПОРЯДКОМ, 142 после полигона, пере-снапшот батча единым актом) · состав паков — выданные промты BACKEND_WIREBATCH_SESSION_PROMPT.md и PLATFORM_EXPORT_SESSION_PROMPT.md · санкция платных прогонов — D39.189 с эрратой 04.09-а о механизме потолка. ⚠ Улики плана, которых не было больше нигде, ПЕРЕНЕСЕНЫ в носители 04.09 перед архивацией: пере-вес 246 и «ФЧ-6 по коду закрыт» — в ячейки бэклога 246 и 197 · судьба 131/105(а)/14 и состав окна — в ячейку 182 · остаток PD-438 — в его ряд регистра. Ничего не потеряно с файлом.

Статус: РЕДАКЦИЯ 2 — сведена с разбором контролёра (Fable 5.1) 04.09; десять его обязательных правок приняты, каждая с уликой, и две его находки понизили вес моих собственных утверждений. Промты по нему НЕ выдаются, пока оркестратор и контролёр (Fable 5.1) не скажут «ок» друг другу — распоряжение владельца 03.09. Файл — предмет этой сверки. Что прочитано перед составлением: единый бэклог целиком (176 строк, из них 53 «скоро») · открытые ряды регистра платформы (97, major 3) · research/30 (ответ полигона на два вопроса владельца, 03.09) · CURRENT-STATE и очередь №22 · оба акта приёмки (D39.187, D39.188) · оба наряда дофикса и отчёт приёмки по ним.

0. Что решает состав — три ограничения, а не вкус

  1. ВАЙР-БАТЧ (строка 182) — обязателен по СРОКУ, а не по деньгам сегодня. ⚠ Первая редакция этого плана утверждала «дриблить по одной = платить пере-снапшот несколько раз» как абсолют, и контролёр это ОПРОВЕРГ уликой: пере-снапшот стоит денег только на книге, которую ПРОДОЛЖАТ, а таких сегодня нет — coldrun-v16 закрыт словом владельца «не доводить», стендовый корпус одноразовый (D39.63 п.3: «перекупать их не для чего»). Настоящее ограничение другое и оно держится: все провод-правки обязаны лечь до следующего продолжаемого платного прогона и до первой книги внешнего пользователя (D39.136 п.3: «дешёвое окно закрывается первой книгой»). Внутри этого срока пункты разводимы; инженерная цена дробления — N пере-захватов голдена вместо одного.
  2. ОЧЕРЕДЬ ВЛАДЕЛЬЦА (CURRENT-STATE п.14). Разрыв цикла — книга не отдаётся файлом пользователю; открыта ПЛАТФОРМЕННАЯ половина (createExport/getExport канон обещает, платформа не монтирует). Гейт этого пункта — живой сквозной прогон через API (п.3), и его блокер снят 31.08.
  3. ЦЕНА ОШИБКИ ПРИОРИТЕТА. research/30 §5 прямо ранжирует: механический пре-гейт перед редактором (D39.117, строка 142) «выше в очереди, чем любой непроверенный K7», а половина доводов за переделку протокола снята замером (редактор правит 4.05.8% знаков, а не переписывает текст).

1. БЭКЕНД — пак «ВАЙР-БАТЧ: род, экран цели, заголовки инъекций»

Почему одним паком. Провод двигают четыре пункта из шести, и каждый — свою ось: 210 — байты батчей терминолога и memory_version (⇒ edit-снапшот), 46ClassifierVersion (⇒ снапшот, RequestHash НЕ трогает), 134RequestHash редактора и транслятора (а при правке данных ещё и EmbeddedVersion с cutTag — см. мину ниже), 140RequestHash черновика книг на c1, 184(а)BriefHash, то есть КАЖДЫЙ RequestHash. Провод НЕ двигают два: 113 (фикстура) и дофикс (пины). ⚠ Собрать их вместе стоит не потому, что иначе «платим четыре раза» — это утверждение снято в §0.1, — а потому что голден пере-захватывается ОДИН раз вместо пяти, и потому что все они обязаны лечь до одного и того же срока. Строка 182 заведена ровно под это и ждёт промта.

Состав (в этом порядке):

  1. Строка 210 — РОД НЕ ПРОИЗВОДИТСЯ ВОВСЕ, цель №1 бэклога. Механизм доставки построен (membank/memory.go кладёт genderConstraintNote в черновую инъекцию для Confirmed-строк по директиве D39.21), а данных ему не даёт никто: промпт терминолога возвращает ровно три поля (термин · перевод · уверенность), поля рода в ответе нет; майнер берёт gender только из СИДА. ⇒ на любой книге без ручного сида ось рода мертва по построению. Это не дефект рендера — это отсутствие входа у ратифицированной директивы. ⚠ Промт обязан назвать ДВЕ вещи, которых нет в самой строке 210 (улика контролёра): (а) развилка не выбрана — поле рода в ответе терминолога · отдельный проход · признать сид-только; (б) второй замок: род рендерится только у Confirmed-строк (membank/memory.go, греп genderConstraintNote), а произведённое терминологом приезжает auto-строкой ⇒ без снятия замка поле у терминолога НИЧЕГО не меняет на проводе. Снятие следует из доктрины D39.104 (банк на проводе — закон для всех строк независимо от статуса), но обязано быть СКАЗАНО и ратифицировано оркестратором, а не выведено сессией молча. ⚠ Улика веса: полигон пишет, что его следующий платный замер (15 глав с характер-листами, ~$2) «ложно-отрицателен ПО ПОСТРОЕНИЮ: полей пола в банке нет вовсе» — то есть 210 предпосылка их шага 3.

  2. Строка 46 + предпосылка 113 — экран целевого языка. Дизайн ЗАМОРОЖЕН и ратифицирован (D39.92 п.1 closed-set + D39.93 изолированный модуль с именованными причинами), промт ждёт выдачи. ⚠ Порядок §5.4: сначала 113 — корпус-фикстура (~20 off-target + ~40 здоровых) и регресс-тест на реальный запас, потому что число «18 из 20 · 0 ложных на 1055 · запас 13×» получено ВРЕМЕННЫМ тестом, который сессия удалила, и воспроизвести его сегодня нечем. СТОП, если фикстура не даёт 18/20 при нуле ложных или запас меньше 3×. ⚠ Три дописки по улике контролёра: (i) EFFORT_HANDLE §5.4 шаг 6 велит переиспользовать FlagCJKArtifact — это СНЯТО D39.93 п.2 (именованный флаг + явный вход в escalatable()), промт цитирует ноту ПОВЕРХ спеки; (ii) вторая половина дыры — detectLatinInsertion без TargetScriptNonLatin() (backend/internal/checks/sanitizer.go, реестр §Б-46: «чинить тем же диффом»); (iii) новый именованный флаг — это 16-я причина, а карта платформы рукописная на 15 (platform/internal/ingest/notes.go, grep -c '":' → 15) ⇒ платформа отдаст unspecified с ERROR. Носитель — строка 204 / ряд PD-246, гейт которой «со следующим касанием эмиссии флагов»; этот батч и есть касание, значит пинг платформе обязателен.

  3. Строка 134 — инжект-заголовки под доктрину D39.105. Гейт ПАЛ (D39.108): текст = отправленная строка пробы 18 БЕЗ оговорки области (оговорка опровергнута §A.4 — НЕ вносить). ⚠ Точная форма (улика контролёра): ТЕКСТ заголовка не меняется вовсе. Меняется рендер: секция editor_unverified_header не рендерится (двухсекционка → один блок) · маркер ⟨проверить⟩ не рендерится · то же у заголовка транслятора. Статусы и подписная таблица не трогаются (D39.104 п.1). Мина: правка lang/data/injection.txt двигает EmbeddedVersion БЕЗУСЛОВНЫМ фолдом (D39.64 П0) и cutTag манифеста ⇒ пере-чеканку ВСЕХ unit.id ⇒ платформа при смене manifest_key СНОСИТ unit_resolutions книги (platform/internal/pgstore/readmodel.go:127 recut := storedKey != in.ManifestKey, :166 delete from unit_resolutions) — это строка 198. Рычаг у сессии есть: снять рендер в Go, ДАННЫЕ не трогать — тогда двигается только RequestHash. Промт обязан назвать выбор явно, а не оставить сессии.

  4. Строка 140 — банковый контур в shipping-c1: СТРОЙКА, а не развилка. ⚠ Исправлено по улике контролёра: текст строки («СТОП-решение») старше ратификации. D39.147 п.2(в) уточнением владельца 17.08 говорит дословно — внесение «ратифицированно живёт в wire-батче 182 — одним касанием перед первым платным прогоном; отдельной развилки нет». Журнал бьёт бэклог. Факт не построен: grep -n 'terminology\|banknote\|classify' backend/configs/pipeline-c1.yaml → 0. ⚠ При внесении суб-бюджеты банк-ролей калибровать ×4.47 — 15-money-path.md §2 прямо говорит, что сегодня они «режут ОПЛАЧЕННУЮ работу по протухшей калибровке». Цена в паке НАЗЫВАЕТСЯ, но не спрашивается.

  5. ДОФИКС предыдущего пака + ФЧ-7 — одним пунктом (остаток приёмки 03.09, D39.187 п.4). ⚠ Сюда же ФЧ-7 фикс-листа (строка 197): паника поверх ПОЙМАННОГО потолка — денежный шов, и он не проверялся ни приёмкой, ни контролёром. Форма — проверка исполнением, а не стройка: воспроизвести, и чинить ТОЛЬКО если воспроизводится. Тем же касанием пере-скоупить строку 197: ФЧ-1/4/5 закрыты консент-паком, ФЧ-6 по коду выглядит закрытым (backend/internal/pipeline/status.go, греп RebillBasisFailed — отказ проекции репортится базисом, отчёт не валится), ФЧ-2/3/8 — НЕ ПРОВЕРЕНЫ и обязаны остаться названными как непроверенные. ⚠ По канону дофикс адресуется ТОЙ ЖЕ сессии («отработавшей пишут только по её же паку»), и контролёр справедливо это напомнил. Проверено: сессий больше нет — ListAgents 04.09 не показывает ни textmachine-77, ни платформенную. Значит остаток законно едет пунктом нового пака, и промт обязан сказать, ПОЧЕМУ он тут: это чужая недоделка, а не новый заказ. Остаток: развилка операторской строки прибита с ОДНОЙ стороны (две посадки в новый код VolumeStop.String() переживают весь пакет и печатают «reached the END of the book» при непустом остатке) · граница bound() (Carried > 0Carried > 1) не прибита, и прогон с одним перенесённым юнитом на конце книги не отдаёт отчёт вовсе · три числа отчёта протухли снова.

  6. Строка 184(а) — снять {{genre}} из промптов пары. ⚠ Внесено по улике контролёра: это самый дешёвый ратифицированный провод-пункт, и оставлять его снаружи значит заплатить сдвиг BriefHash (то есть КАЖДЫЙ RequestHash) ещё раз потом. Слово владельца 16.08 — «жанр из продукта уходит совсем», D39.138 п.2в дословно «Просто выкидываем»; строка требует внести «ТОЛЬКО в общее resnapshot-окно» — окно это. Состав не держим числом: grep -rln '{{genre}}' backend/prompts/ (сегодня — шесть файлов) плюс поле из канона брифа.

ЧТО НАМЕРЕННО НЕ БЕРЁМ и почему:

  • Строка 161 (структура глав, «большой перекрой»). Это «единственное дешёвое resnapshot-окно», и он требует ДИЗАЙН-пака до стройки (D39.136 п.3). Смешивать его с вайр-батчем нельзя: батч платит один пере-снапшот, а 161 перекраивает нарезку целиком.
  • Строка 160 (структура глав, Этап 0) — НЕ «не берём», а РЕШЕНИЕ с названной ценой. Первая редакция плана свалила её в один пункт с 161, и контролёр это разобрал: у 160 свой гейт, и он ПАЛ — слово владельца 15.08 (D39.136 п.3) «ставится ближайшим бэкенд-паком», а стоявший впереди блокер 236 закрыт D39.175. Улика веса свежая и она про пользователя: вычитка полигона нашла потерянный заголовок у 6 глав из 17 (≈800 на книге) — и это ровно то, что уедет читателю через дверь выдачи, которую строит второй пак. Настоящая цена: бамп manifestVersionу бампа формы манифеста безопасного порядка деплоя НЕТ ни в одну сторону (PD-436, стоп-мир) плюс строка 198. Решение — владельца: брать сейчас вместе с дверью или после. Молчать о ней нельзя.
  • Строка 142 (пре-гейт перед редактором). Ратифицирован формой, но research/30 ставит его ПОСЛЕ шага 01 полигона (починка глоссарного флага с precision 0.067 и прибор верности): без прибора его эффект неизмерим, а мерило — половина цены редактора.
  • Строка 232 остаток / 233. Семантика переноса отложена СЛОВОМ ВЛАДЕЛЬЦА 03.09 («подумаем»); трогать до его решения нельзя.
  • 119 + 124 + 115. Строка 182 требует брать их ОДНИМ дизайн-паком, а не хвостом батча.
  • 131 (кап инъекции) · 105(а) (вердикт-половина классификатора) · 14 (ё-фолд) — жильцы той же строки 182, в этот пак НЕ входят и это сказано вслух, а не умолчано: у 131 своя цена и своё СТОП-решение, и сама строка велит «пере-замерить после 134» — то есть её очередь ПОСЛЕ этого пака, а не внутри него; 105(а) и 14 остаются в 182 до следующего окна.

⚠ ДВЕ СТРОКИ, КОТОРЫЕ БАТЧ ЗАДЕВАЕТ САМ, И ПЕРВАЯ РЕДАКЦИЯ ПЛАНА ИХ НЕ УВИДЕЛА:

  • 198 — апгрейд движка стирает замечания книги БЕЗВОЗВРАТНО. Если батч тронет данные (lang/data/*.txt), поедет cutTagmanifest_key → платформа снесёт unit_resolutions (readmodel.go:127 и :166), и замечания читателя исчезнут. Гейт самой строки — «до первого реального пользователя И до холодного прогона с апгрейдами». Носителя не было ни в одном паке; теперь он ЗДЕСЬ: либо батч не трогает данные (рычаг у сессии есть), либо 198 чинится ДО батча.
  • 204 / PD-246 — карта причин флагов платформы рукописная на 15, а экран цели (46) добавляет 16-ю. Гейт строки 204 — «со следующим касанием эмиссии флагов»; это касание и есть.

2. ПЛАТФОРМА — пак «ЗАКРЫТЬ ЦИКЛ: сквозной прогон и дверь выдачи»

Почему это, а не мажоры регистра. Очередь владельца называет разрыв цикла пунктом 1, и его платформенная половина — единственное, что стоит между «движок пишет файл» и «пользователь получил книгу». Движок отдаёт EPUB 3 + txt с 30.08 (D39.175), холодный прогон 31.08 предъявил это живьём (epubcheck 0/0/0/0). Платформа смонтировала 15 операций канона из 20; createExport/getExport среди недостающих, долг числится с P8 и ни один пак после P7 его не взял.

Состав:

  1. Строка 202 — живой сквозной прогон через API.ТРЕБУЕТ СЛОВА ВЛАДЕЛЬЦА: прогон ПЛАТНЫЙ. Всё после «прогон стартовал и остановился» покрыто батареей против живого Postgres, но с движком-заглушкой; настоящий манифест, сайдкар банка и причины флагов будут ПЕРВЫМИ данными, форму которых платформа не сочинила сама. Замер 31.08 на десятиглавой книге: $0.436110. Живой блокер один и он операционный ($0): TM_PLATFORM_ENGINE_KEYS_PATH абсолютным путём на уже заполненный файл. ⚠ Санкция ДАНА (D39.189), но сумма в первой редакции плана была занижена — исправлено по улике контролёра. $0.436110 — цена НЕПОЛНОГО захода (три юнита из четырнадцати); дверь выдачи и строка 16 («цена ДОВЕДЁННОЙ книги») требуют ЗАВЕРШЁННОЙ книги, а собственная проекция движка на неё — projected_book_usd = 1.1377… при оттоке кассы ≈$1.44. Потолок пака: ≈$1.5. МЕХАНИЗМ потолка на API-пути — НЕ флаг, и первая редакция этого плана велела невозможное (улика контролёра, пере-проверена мной по коду). Руками --ceiling-usd на этом пути не ставит никто: платформа выводит его сама — bookCap = committed + increment (internal/runs/spawn.go, греп func (m meter) bookCap), а increment считается по ставке DefaultPerChapter = 30_000 ($0.03, internal/pricing/pricing.go), которая занижена ×4.47 (D39.179 п.1). Следствие: покупка «10 глав» отдаёт движку ≈$0.30, прогон встаёт по потолку задолго до конца книги, а resume остановленного потолком отбивается (internal/runs/runs.go, греп ErrCeilingReached; PD-217: «лечение пользователя — НОВЫЙ прогон»). Сессия, исполняющая букву «едет --ceiling-usd», полезла бы крутить TM_PLATFORM_USD_PER_CHAPTER — это хак под тест, и он запрещён. Правильная форма: потолок пака = ГРАНТ тест-аккаунту ровно на $1.5 (tmplatformctl grant --user <id> --usd 1.5), потому что холд делает перерасход невозможным ПО ПОСТРОЕНИЮ; а путь до завершённой книги идёт цепочкой покупка → пауза по потолку → пополнение → новый прогон. Это не обход, а ровно третий сценарий строки 216 и D39.176 п.3 (возобновление явным действием пользователя) — то есть продуктовый путь, который прогон и обязан предъявить. --ceiling-usd при этом на движковый вызов уходит всегда, но число — производное платформы, и промт обязан это сказать, иначе сессия будет искать флаг, которого у неё нет. ⚠ Стартовать в ДОЛИНУ: у DeepSeek пиковые окна 0104 и 0610 UTC дают ×2 (строка 172а) — операционное правило дешевле любой правки Go. ⚠ Тремя явными сценариями закрыть строку 216: подпись банка · halt на потолке · резюм после пополнения. И сверить то, что до сих пор не сверялось: на шов вышло ОДНО значение flag_reason из пятнадцати, а манифест против platform/internal/ingest/manifest.go не сверялся вовсе.
  2. Дверь выдачи — createExport/getExport. ⚠ Слово владельца 30.08: дверь ВСЕГДА строит файл — отказ пользователю не отдаётся, неполная книга уходит с пометкой, то есть дверь зовёт tmctl build --partial; отказ по умолчанию остаётся операторской ручкой CLI. Требует минора канона — значит контрактное касание планировать вместе. ⚠ Четыре факта кода, которые промт обязан нести (улика контролёра): ExportFormats захардкожен пустым (cmd/tmplatformd/runner.go, греп ExportFormats), а форматы движок публикует только Go-переменной bookfile.Formats — импорт чужого модуля запрещён D39.85, значит нужен КАНАЛ (переменная деплоя либо движок публикует данными), и это вопрос закона входной двери 17 · декодера tm-build-v1/BuildReport в платформе НЕТ (ноль хитов при живых DecodeExport, DecodeBank) · build открывает стор read-only без flock, значит канонное «книгу можно экспортировать во время перевода» исполнимо · ExitBookIncomplete = 16 у платформы отсутствует. Состав минора канона назвать в промте: Export.failure_code становится enum с первым построенным форматом (contract-10 строки 243, условие наступило) · механизм подписанной ссылки и TTL/GC файлов · строка 241 (канон противоречит себе на дочитанной книге — «следующее касание контракта»). Кто правит канон — сказать явно: прецедент есть, миноры 0.6.0/0.7.0/0.9.0 приезжали с паками зоны через ратификацию.
  3. PD-424 — терминальная ручка для живого прогона с заблокированной расплатой (major, половина «невидим» вылечена P12, половина «ручки нет» стоит). run abandon ветвится по runs.finished_at и на живом прогоне уходит в живую ветку; AbandonRun отказывает над попыткой, ещё называющей юнит. Это НОВАЯ разрушительная операторская поверхность над деньгами — её дизайн (кто вправе звать, чем доказывается отсутствие процесса, что если процесс вернётся) назвать в паке явно. ⚠ Дописать PD-418: та же ветвь по finished_at, и долговечное лечение — «ветвить по НАЛИЧИЮ осиротевшей попытки» — либо входит в тот же дизайн, либо явно объявляется вне его.
  4. ДОФИКС предыдущего пака — одним пунктом (D39.188 п.5а). ⚠ Та же оговорка, что у бэкенда: по канону дофикс шёл бы ТОЙ ЖЕ сессии, но её больше нет (ListAgents 04.09), поэтому остаток едет пунктом нового пака — и промт обязан сказать, что это чужая недоделка, а не новый заказ. Записка зоны о предусловии хоста различает хосты ИМЕНЕМ МАШИНЫ, а имя у этого хоста то же самое при противоположных условиях (~/go/bin существует и держит sqlc, make tools-check на дефолтном PATH падает, сокет 55433). Различает пользователь, а не хост.

ЧТО НАМЕРЕННО НЕ БЕРЁМ:

  • PD-410 (полоса против движкового плана) — архитектурное, направление есть (D39.165 §1), но лечение требует либо передавать движку план работ, либо выводить total полосы из движкового плана; это отдельный пак по слову оркестратора 28.08 и он крупнее двери.
  • PD-412/PD-413 (LATERAL в полосном агрегате) — контенция, не корректность денег.
  • PD-386/387/389/390/392 (такт свипа, телеметрия, метрики без ручки) — класс «операторская поверхность», просится отдельным паком наблюдаемости; смешивать с дверью выдачи значит разбавить оба.
  • PD-439 и правило ухода из класса — решение ОРКЕСТРАТОРА, не зоны; оно моё, а не паковое.

РАЙДЕРЫ — дешёвые пункты, которые контролёр нашёл пропущенными:

  • 246platform/internal/ingest/exit.go всё ещё обещает «nothing this process would have written was written», тогда как движок это прямо отрицает. ⚠ Вес ПЕРЕОЦЕНЕН прежней формулировкой («разрушительно по полосе»): интейк удаляет загрузку только на классе 11, а exit 15 производит только bank-apply. Остаток — комментарий плюс константа 16, которую дверь и так добавит.
  • 234platform/internal/runs/bank.go объясняет отказ снятой посылкой («status projects the STORED memory…»), опровергнутой D39.170: одна правка комментария.
  • PD-438 — остаток назвать явно: лечение в дереве, но парковка не видна ни в runs, ни гейджем, ни колонкой. План первой редакции не назвал его ни взятым, ни отложенным.

3. РЕШЕНИЯ — ВСЕ ЗАКРЫТЫ 04.09 (D39.190), лист пуст

Владелец 04.09: «делаем как ты и Fable 5 рекомендуете». Ниже — исходный лист; каждый пункт несёт исход. ⚠ При сведении нашлось ЧЕТВЁРТОЕ, которого не видели ни план, ни разбор: строка 160 бампает manifestVersion, а платформенный пак в это же окно гонит ЖИВОЙ ПЛАТНЫЙ прогон — бамп сорвал бы его, потому что гейт интейка строгое равенство. Поэтому 160 отложена ПОРЯДКОМ, а не приоритетом.

  1. Санкция на платный сквозной прогонДАНА 03.09 (D39.189): «разрешаю платные прогоны с ключами для тестов». ⚠ Потолок числом НЕ назван, поэтому его называет пак: оценка своим замером + обязательный --ceiling-usd + правило «перелёт оценки — СТОП и пинг». Опора — холодный прогон 31.08: $0.436110 на десяти главах полной цепью.
  2. Строка 160 — структура глав, Этап 0: брать сейчас или после? Гейт пал, улика веса свежая (заголовок потерян у 6 глав из 17, и это уедет читателю через дверь выдачи), но цена настоящая — бамп manifestVersion, у которого безопасного порядка деплоя нет ни в одну сторону.
  3. Строка 142 — пре-гейт перед редактором: сейчас или после шага 01 полигона? Строка ждёт «команды владельца». Рекомендация — ПОСЛЕ: research/30 §3.2 показывает у глоссарного флага precision 0.067, то есть 14 ложных на одно верное, и пре-гейт приедет с мусорным входом.
  4. Санкция на пере-снапшот батча как ЕДИНЫЙ акт. §5.4 шаг 6 требует подписи владельца; сегодня цена пере-снапшота $0 (продолжаемых книг нет), поэтому ратифицировать может и оркестратор по строке 182 — но сказать это вслух обязан.

СНЯТО С ЛИСТА по уликам контролёра: строка 140 — решена D39.147 п.2(в), отдельной развилки нет, вносится батчем · семантика переноса слота — открыта, но НЕ гейт: строка 232 из состава исключена, ни один пункт от неё не зависит.