textmachine/docs/NEXT_PACKS_PLAN.md

260 lines
34 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ПЛАН ДВУХ СЛЕДУЮЩИХ ПАКОВ — бэкенд и платформа (оркестратор №22, 03.09.2026)
> **Статус: РЕДАКЦИЯ 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-снапшот), **46**`ClassifierVersion` (⇒ снапшот,
`RequestHash` НЕ трогает), **134**`RequestHash` редактора и транслятора (а при правке данных ещё и
`EmbeddedVersion` с `cutTag` — см. мину ниже), **140**`RequestHash` черновика книг на 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 > 0``Carried > 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`), поедет `cutTag``manifest_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`** и правило ухода из класса — решение ОРКЕСТРАТОРА, не зоны; оно моё, а не паковое.
**РАЙДЕРЫ — дешёвые пункты, которые контролёр нашёл пропущенными:**
- **246** — `platform/internal/ingest/exit.go` всё ещё обещает «nothing this process would have
written was written», тогда как движок это прямо отрицает. ⚠ Вес ПЕРЕОЦЕНЕН прежней формулировкой
(«разрушительно по полосе»): интейк удаляет загрузку только на классе 11, а exit 15 производит
только `bank-apply`. Остаток — комментарий плюс константа 16, которую дверь и так добавит.
- **234** — `platform/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 из состава
исключена, ни один пункт от неё не зависит.