From a8a9927ed7a6ed48dfecc4b016b9164b4dad16b0 Mon Sep 17 00:00:00 2001 From: heaven Date: Sat, 19 Sep 2026 04:03:33 +0300 Subject: [PATCH] Draft the language-planes pack for the re-cut window and list it as not yet issuable while the chapter pack holds the backend slot --- .../BACKEND_LANGUAGE_PLANES_SESSION_PROMPT.md | 255 ++++++++++++++++++ docs/README.md | 1 + 2 files changed, 256 insertions(+) create mode 100644 docs/BACKEND_LANGUAGE_PLANES_SESSION_PROMPT.md diff --git a/docs/BACKEND_LANGUAGE_PLANES_SESSION_PROMPT.md b/docs/BACKEND_LANGUAGE_PLANES_SESSION_PROMPT.md new file mode 100644 index 00000000..ea31895d --- /dev/null +++ b/docs/BACKEND_LANGUAGE_PLANES_SESSION_PROMPT.md @@ -0,0 +1,255 @@ +# Промт бэкенд-сессии: ЯЗЫКОВОЕ ЗНАНИЕ ЯДРА — В ПЛОСКОСТЬ СВОЕГО ЯЗЫКА, ЕГО ВЕРСИЯ — У СВОИХ КНИГ + +> Оркестратор очереди №23. Пак **$0**, платных вызовов в нём нет. Зона записи — `backend/`. Ты не коммитишь: +> дерево передаётся оркестратору на лендинг. ⚠ ЧЕРНОВИК: не выдан; выдаётся после акта по паку «граница главы», +> якоря пере-сверяются по лендинг-дереву того пака. +> +> Предмет — **где в ядре живёт знание конкретного языка и какие книги платят, когда оно меняется.** Это второй +> и последний пак окна пере-кроя: всё, что двигает версии книг холодного прогона, ложится до его старта. + +--- + +## 1. Какая проблема и что решит твой результат + +Движок переводит длинные книги; пары языков — ДАННЫЕ, а не код; ревью-вопрос: «заработает ли пара, которой +в репо ещё НЕТ, без правки Go?». ⛔ **Слово владельца, под которым выдан пак:** «доделать бэкенд до приличного +уровня мультиязычности, закрыв дыры, сделанные под конкретный язык» и «Бэкенд не должен иметь конкретных +механизмов под язык\книгу, максимум в данных, и то они так же должны хорошо отрабатывать, где этих +французских слов нет». + +**Замер оркестратора (перепись языковых правил 19.09, исполнение на копии HEAD, $0):** знание конкретных +языков живёт в ядре в трёх плоскостях, и КАЖДАЯ сворачивается в одну версию на все книги: + +| плоскость | что внутри | куда сворачивается | что из этого следует | +|---|---|---|---| +| нормализация (`backend/internal/text/norm.go`) | trad→simp (китайский, `backend/internal/text/norm.go:47`=`//go:embed data/trad2simp.txt`), катакана→хирагана (японский, `backend/internal/text/norm.go:150`=`katakana → hiragana`), ё→е (русская цель, `backend/internal/text/norm.go:198`=`if r == 'ё' {`) — применяются к ЛЮБОЙ паре | версия памяти (`backend/internal/membank/memory.go:417`=`h.Write([]byte(text.NormVersion()`) И тег кроя с ключом манифеста (`backend/internal/pipeline/manifest.go:282`=`Norm: text.NormVersion()`) | правка китайской таблицы пере-кроит английские книги; японскому ключу достаётся китайская свёртка — `准`/`準` сливаются в один ключ | +| встроенные данные (`backend/internal/lang/embedded.go`) | 8 файлов разных языков: `target-ru` · `injection` (ru) · `refusal` (en/ru/zh/ja) · `sentence-abbrev` (en) · `lang-script` · `terminator` · `cjk-section` · `script-series` | один хеш на все (`backend/internal/lang/embedded.go:61`=`func hashEmbeddedFiles`) → снапшот (`backend/internal/pipeline/snapshot.go:478`=`EmbeddedVersion: lang.EmbeddedVersion()`), тег кроя, ключ | строка данных ОДНОГО языка перекупает ВСЕ книги ВСЕХ пар; файл, не названный в директиве `backend/internal/lang/embedded.go:22`=`//go:embed data/cjk-section.txt`, молча игнорируется (замер: `target-de.txt` вне директивы ⇒ данных нет, тесты зелёные) | +| пакет языка и пары (`configs/langpacks/`) | в т.ч. `speech-cue.txt` — только наблюдаемость, но свёрнут (`backend/internal/lang/langpack.go:366`=`"speech-cue.txt"`) | снапшот (`backend/internal/pipeline/snapshot.go:477`=`LangpackVersion: r.packVersion()`), тег, ключ | первая поставка файла после прогона перекупит пару | + +**Цена сдвига — не одна.** Бесплатный ре-пин разрешён только ходу, где разошлось одно поле — версия памяти +(`backend/internal/pipeline/repin.go:44`=`moveBankOnly — the ONLY differing component is the memory version`); +любое другое поле — полная перекупка. ⇒ **плоскость, выбранная сейчас, задаёт цену КАЖДОЙ будущей правки +языковых данных.** А сдвиг любой из трёх сегодня двигает версии обеих книг прогона ⇒ ложится только в окне. + +**Твой результат:** знание каждого языка живёт в данных СВОЕГО языка; книга сворачивает только данные своих +языков и только тех потребителей, что доходят до её провода или вердикта; правка данных одного языка не +двигает книги другого; новый язык добавляется файлами без правки Go и без перекупки существующих книг. Пары +репозитория переводятся побайтно так же — кроме названного вайр-батча §4.1(е). + +--- + +## 2. Зона записи и git + +Пишешь только в `backend/` и в свою секцию `docs/PROGRESS.md`. Чужие зоны читать можно, править нельзя. Не +коммитишь; в дереве могут работать другие сессии — их незакоммиченное не трогай. Фоновое гасишь по своему +PID. ⛔ **НИКОГДА не читай `.env` и `.env.*`.** Что должно пережить рестарт — в репозиторий; пробы и копии — +в скретчпаде; базы — только `mode=ro`. + +--- + +## 3. Карта чтения — минимум из пяти позиций + +Карта — МИНИМУМ (`D39.258` п.9): `docs/` грепай в любое время. Код-факты добываешь сама. + +1. `CLAUDE.md`. +2. `backend/internal/text/norm.go` и `backend/internal/lang/embedded.go` + `backend/internal/lang/bankdata.go` — + две плоскости и образец третьей, уже устроенной правильно (её докблок объясняет, почему она вне снапшота). +3. `backend/internal/pipeline/` — `snapshot.go`, `manifest.go`, `repin.go`: что куда сворачивается и что считается ре-пином. +4. `docs/BACKLOG.md`, ряды **446 · 14 · 115 · 124 · 119 · 182 · 250 · 320 · 443 · 444 · 463 · 86**. +5. Журнал решений: `D39.60` §6.2 (правило условной свёртки), `D39.268` п.5 (её форма, три условия), + `D39.194` п.9 (различитель бампа), эррата 19.09-а в карте шапки, нота выдачи этого пака. + +--- + +## 4. Работа + +### 4.0 Ратифицированное, вложенное сюда + +- **Вынос свёрток разрешён словом владельца 18.09** (цитата в §1); эррата 19.09-а: гейт `D39.76` касается + стеммера (класс C), а не таблиц свёрток; флаг ряда 14 «ё-фолд — у владельца» снят тем же словом. +- **Правило условной свёртки** (`D39.60` §6.2, форма — `D39.268` п.5): сворачивать тогда и только тогда, когда + результат доходит до оплаченного запроса, вердикта или `final_hash`; новая свёртка условна по наличию данных. +- **Различитель бампа** (`D39.194` п.9): версию двигать только при смене, способной пере-вердиктить СУЩЕСТВУЮЩИЙ снапшот. +- **Вайр-батч одним касанием** (ряд 182): правки провода копятся и вносятся разом — этот пак и есть то касание + для рядов §4.1(е). +- **Ряд 124 «принимать целиком» — отступление названо** (нота выдачи): оси (а) недо-чувствительность и (б) + пере-охват двигают версии ⇒ в этом паке; оси (в) дешёвая перекупка и (г) идентичность оплаченной работы + версий не двигают и имеют вес «перед масштабом» ⇒ вне пака. Решение пака не вправе их закрыть: назови, как + они лягут поверх. +- **Голос (ряд 410) и регистровая коллизия (ряд 505) — вне пака**: первый не двигает ничего, кроме ре-пинуемой + версии памяти и провода не имеет; второй едет своим паком в матчере. +- **Стандарт владельца** (`D39.258` п.3): где чистому решению нужна перестройка — перестраивай; отчёт называет, + что отрефакторено и почему. + +### 4.1 Что сделать + +**(а) СВЁРТКИ ИСТОЧНИКА — В ДАННЫЕ ЯЗЫКА ИСТОЧНИКА.** trad→simp — данные `zh`, катакана→хирагана — данные `ja`. +Не пары (zh→en пришлось бы копировать таблицу) и не письменности (японский тоже пишется ханью — отсюда +коллизия `准`/`準`). Алгоритм общий: «применить таблицы свёрток, объявленные языком источника»; пустой реестр — +инертный no-op (образцы в дереве: `family-morphology.txt`, стеммер). ⚠ Японские ключи после пака свёртку +trad→simp больше не получают — это заказанная смена поведения, назови её. + +**(б) СВЁРТКА ЦЕЛИ — В ДАННЫЕ ЯЗЫКА ЦЕЛИ.** ё→е — данные `ru`, схемой замен целевой орфографии, а не литералом +(ряд 446). ⚠ У языка цели версионированного дома сегодня НЕТ: каталог цели в хеш не входит, встроенные данные +— один глобальный хеш. Дом строишь ты — по тому же правилу, что (а). + +**(в) ВСТРОЕННЫЕ ДАННЫЕ — ПО ЯЗЫКУ И ПО ПОТРЕБИТЕЛЮ** (ряды 115, 124(б)). Книга сворачивает только данные своих +языков и только тех потребителей, что доходят до её провода или вердикта. `script-series.txt` читает только +сборка банка — по правилу, которое кодовая база уже записала сама +(`backend/internal/lang/bankdata.go:14`=`the BANK-ASSEMBLY data plane`), ему место там. Голосовые категории в +`target-ru.txt` (`tv_*`, `self_ref_generic`) — вне свёрнутой плоскости: флаггер голоса намеренно не свёрнут, и +его данные не вправе перекупать книги. Директива `go:embed` получает механическую сверку «каждый файл +каталога данных вшит» — сегодня пропуск молчалив. + +**(г) ВЕРДИКТ-НЕСУЩИЕ ВЫЗОВЫ x/text — В ВЕРСИЮ** (ряд 119 = ряд 124(а)). Детектор утечки CJK зависит от +свёртки ширины, экспортная нормализация меняет байты вне хешей, а константа версии x/text сверяется со +строкой `go.mod`, а не со скомпилированными таблицами. Свернуть явно, сверку сделать механической. Вопрос ряда +о громкости `unicode.Version` на осях, вердикта не двигающих, — реши с доводом по различителю `D39.194` п.9. + +**(д) `speech-cue.txt` — ИЗ СВЁРНУТОЙ ПЛОСКОСТИ.** Сегодня файла нет ни в одном паке, поэтому перенос нейтрален; +после первой поставки — уже нет. Пин на ПЛОСКОСТЬ, а не на отсутствие файла. + +**(е) ВАЙР-БАТЧ — всё решено, ты исполняешь.** Каждая правка меняет провод обеих книг прогона: +- ряды **250 + 443**: заголовок глоссария (`backend/internal/lang/data/injection.txt:6`=`glossary_header`) + объясняет модели снятую пометку ⟨проверить⟩ — убрать висячую ссылку; +- ряд **320**: (б) живой заголовок `backend/internal/lang/data/injection.txt:8`=`editor_unverified_header` при + том, что пометка и развилка по статусу сняты `D39.104` п.2; (а) совет `memseed.go`, который гард полисемии + не исполняет, — строка и тест; +- ряд **444** + решение владельца `D39.254` п.3 («перестроить фразу; если литературно не выходит — писать, как + лучше читается»): текст `backend/internal/lang/data/injection.txt:12`=`gender_hidden` и ложная атрибуция + `backend/internal/membank/memory.go:947`=`AVOID gender-marking constructions until the reveal`; +- ряд **463**: гард цели чувствителен к регистру кода языка, соседи — нет; привести к одному. +⛔ Тексты провода пишешь ТОЛЬКО то, что решено; спорное в формулировке — пинг, а не вкус. + +**(ж) МОЛЧАЛИВАЯ ИНЕРТНОСТЬ ГРОМКОЙ.** Язык книги без строки в `lang-script` сегодня молча выключает эхо, экран +языка и скрипт-гард ремонта; у канала морфологии предупреждение есть, здесь нет. Предупреждение при загрузке, +версию не двигает. + +**(з) РЯД 86 — ЗАМЕРОМ.** `zh/numeral.txt` канала майнера отстаёт от эталона на `〇两兩`: намеренно или +недосмотр? Замерь на китайском корпусе, сколько ложных кандидатов «числительное + ранг» даст добавление (`两` +— ещё и «пара, оба»), и реши числом. Правка — ход пакета `zh` ⇒ только в окне. + +### 4.2 Приёмочные инварианты + +- **Провод и вердикты книг репозитория — побайтно прежние, кроме названного батча (е):** golden — маскированный + дифф, где изменились только версии и тексты батча, и каждый изменившийся текст назван. +- **Будущие правки не задевают чужие книги — пинами, а не рассуждением:** правка таблицы `zh` не двигает ни одной + версии английской книги; добавление `target-xx.txt` или строки `xx` в `lang-script` не двигает ни одной версии + книг zh→ru и en→ru; правка голосовых данных цели не двигает снапшот. +- **Что доходит до КРОЯ — названо замером.** Если таблица свёрток ключа остаётся в теге кроя, её правка всё равно + пере-кроит книги своего языка (новые id юнитов, снос по ряду 198) — это решение, а не умолчание. +- **Пак «граница главы» не сломан:** его сопоставление ярлыка с заголовком идёт через ключ источника — после пака + ключ зависит от языка книги; Кристофф — те же 95 глав и те же имена, корпус — прежний. +- Ни одной ветки по языку, паре или письменности в Go — грепом с контрольной величиной. + +### 4.3 Деньги + +Все сдвиги пака — в окне, поверх того, что уже сдвинул пак «граница главы»; бесплатно при условии `D39.63` (3), +`D39.190` п.4: ни одна база с оплаченными чанками не продолжается. Строкой отчёта: какие версии каких книг +сдвинулись и какой будущей правке теперь какая цена (ре-пин · пере-крой своих книг · перекупка). + +### 4.4 Замер перед стройкой — первым делом, без строки Go + +Инвентарь: каждое языковое правило и файл ядра → язык → потребители → куда сворачивается сегодня → куда +должно → чем доказано, что доходит (или не доходит) до провода, вердикта и `final_hash`. Для каждого переноса ИЗ +свёрнутой плоскости — доказательство исполнением, что предмет не доходит ни до провода, ни до вердикта +(намеренная правка данных ⇒ побайтно те же вердикты и провод). Инвентарь входит в записку-план; советчик +смотрит его до стройки. + +### 4.5 Чего пак не делает + +Ряд 505 (свой пак) · ряд 124 (в)(г) · ряд 506 (эхо при общей письменности) · провод голоса · кап инъекции (131) +· ряды 160, 142 · чистка кластера Д1 переписи (пере-гейтинг чекеров на существующие данные) — после прогона. + +--- + +## 5. Самопроверка исполнением — и четыре места, где этот пак мягок + +Ревью исполнением. **Субагенты и воркфлоу разрешены.** Советчики — до двух фаблов (`model: "fable"` явно) с +постоянным контекстом; советоваться на проектировании и на приёмке; внутри воркфлоу тот же потолок. Механизм +обязателен: интервальная самоверификация субагентом против §13. + +1. ⛔ **Вынос из свёрнутой плоскости — это ровно то, от чего свёртка защищает.** Тихая смена вердикта на + зачекпойнченных чанках. Каждый перенос доказывается НАМЕРЕННОЙ правкой данных и побайтным равенством + вердиктов и провода, а не чтением кода. +2. ⛔ **«Нейтрально» на сегодняшнем корпусе ≠ нейтрально.** `speech-cue.txt` и голосовых файлов нет — пин + ставится на плоскость, иначе он зелен без предмета. +3. ⛔ **Компонент версии по языку и крой.** Разделить версию памяти по языку и оставить общую строку в теге кроя + значит перенести проблему, а не решить. Назови, что доходит до кроя, числом. +4. ⛔ **Пин, построенный на пустом реестре.** Пин «язык без таблиц ⇒ ключ = NFKC + апостроф + невидимые + регистр» + обязан иметь пару, где таблица ЕСТЬ и меняет ключ, иначе он не отличает правило от его отсутствия. + +**Мутации — часть пака.** Каталог `backend/cmd/tmmutate/mutations.json`, гейт — `-battery`. Найди записи, +атакующие версии и свёртки (`norm.go`, `embedded.go`, `bankdata.go`, `snapshot.go`, `manifest.go`, `repin.go`), — +в гейте и вне его; пере-прицелы объявляются; новые — в гейт. Три исхода, вердикт по тексту падения. + +--- + +## 6. Оси ревью (вправе заменить с аргументом) + +- **Деньги и версии:** какая правка чего теперь стоит — таблицей, с пином на каждую строку. +- **Общность:** новый язык файлами, без Go и без перекупки — синтетической парой в тесте. +- **Провод:** каждый изменившийся байт провода назван и решён. + +**Кодовому паку дополнительно:** пин на УСЛОВНОЕ сообщение обязан иметь фикстуру, где оно ОБЯЗАНО прозвучать · +перед отчётом сверь каждый клейм с результатом инструмента ЭТОЙ сессии · последний абзац отчёта оказался +планом — сделай сейчас · **править или удалять тесты ради зелени недопустимо**; правка, вызванная заказанной +сменой поведения, объявляется · дифф `^func Test` предъявляй исполнением · комментарий, несущий вывод, называет +условие, при котором он перестаёт держаться. + +--- + +## 7. Записка-план + +До первой правки кода: инвентарь §4.4 · замысел плоскостей и версий · порядок · что спорно · комплектность +против заказа. Советчик смотрит записку до стройки; я — тоже. + +--- + +## 8. Заявление есть команда + +Каждое число — с командой повторения; у каждого нуля — контрольная величина; эрудиция — не улика. +**Ловушки среды:** обёртка `grep` не видит `books/` (бери `command grep`); `books/` — симлинк (`find -L`); `find` — +bfs; CLI для баз нет; знаки и байты — разные популяции. + +--- + +## 9. Эхо старта + +Первым действием — ≤10 строк СВОИМИ словами: скоуп · инварианты · чего не делаешь. Оркестратору, адрес из канала. + +--- + +## 10. Что НЕ удалось и где прибор слеп + +Две половины: «что не получилось» и «что ты знаешь и не сказала». + +--- + +## 11. Канал вопросов и право отказаться + +Конфликт промта с деревом или журналом — пинг, а не интерпретация. Право сказать «этого делать не надо» с +аргументом есть. Дополнения к паку — только релеем владельца. + +--- + +## 12. Прямой канал + +`CLAUDE.md`, «Связь между сессиями». Файл — `/tmp/textmachine-channel`: впиши свой блок, адрес оркестратора возьми +оттуда и сверь с `ListAgents`. **Канала нет ⇒ НЕ искать**: вопрос — секцией отчёта. + +--- + +## 13. Когда пак считается завершённым + +- [ ] Инвентарь §4.4 предъявлен до первой правки Go. +- [ ] У каждого пункта §4.1 — исход: сделано · не делаю с доводом · пинг. +- [ ] Инварианты §4.2 — пинами и прогоном настоящим драйвером; golden — маскированный дифф с названным батчем. +- [ ] Таблица «правка каких данных → какая цена» — с пином на каждую строку. +- [ ] Новый язык синтетической парой: файлами, без Go, без сдвига версий существующих книг. +- [ ] Ни одной ветки по языку, паре или письменности в Go — грепом с контрольной величиной. +- [ ] Мутации: три исхода, вердикт по тексту падения; новые — в гейт. +- [ ] Круги сошлись; таблица «находка → что сделано → чем предъявлено». +- [ ] Что отрефакторено и почему; стандарт и аддендум `D39.258` п.3/п.9 — отдельным пунктом. +- [ ] Числа после последней правки; гейт зоны целиком, полнота списком пакетов. +- [ ] **«Работа завершена, править не планирую».** diff --git a/docs/README.md b/docs/README.md index c062098f..bac46b34 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,6 +25,7 @@ | Роль | Активный промт | Статус | |---|---|---| | **Бэкенд · ГРАНИЦА ГЛАВЫ** | [BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md](BACKEND_CHAPTER_STRUCTURE_SESSION_PROMPT.md) | 🔴 **ВЫДАН 19.09 → `textmachine-main-7b`** (свежая: паков не брала, по репо ни одного вызова — проверено опросом). ⛔ СЛОТ БЭКЕНДА ЗАНЯТ. Именование и границы — акт `D39.270`: этот промт ЕСТЬ «пак 2» по ряду 303, запрет `D39.224` п.7 им ИСПОЛНЯЕТСЯ; 346(б) едет в нём же (п.7). Предмет нашёл владелец: грамматику получает только текстовый путь ингеста. Три круга проверки, третий изменил ПРЕДМЕТ: граница — объединение двух наборов (12 глав в документах с целью), резка внутри документа необходима (28 документов по 2–7 глав), единица правила — абзац (построчно 20 ложных «I»). Решение не вправе зависеть от книжных данных (п.8). ОК советчика на финальный текст получен. ⛔ Пак СДВИНЕТ ключ манифеста китайской книги (эррата 18.09-б к `D39.269`) ⇒ лендится ДО фриза прогона. $0 | +| Бэкенд · ЯЗЫКОВЫЕ ПЛОСКОСТИ ЯДРА | [BACKEND_LANGUAGE_PLANES_SESSION_PROMPT.md](BACKEND_LANGUAGE_PLANES_SESSION_PROMPT.md) | ✍️ **ЧЕРНОВИК 19.09, НЕ ВЫДАН — холодной сессии НЕ брать:** слот бэкенда занят паком «граница главы»; выдаётся после его акта, якоря пере-сверяются по лендинг-дереву. Второй и последний пак окна пере-кроя: свёртки источника и цели — в данные своего ЯЗЫКА, встроенные данные — по языку и потребителю (ряды 115, 124(а)(б), 119), вайр-батч одним касанием (250 · 320 · 443 · 444 · 463, ряд 182), ряд 86 замером. Основание — перепись языковых правил 19.09. Рубежи и ОК советчика — впереди | | Бэкенд · ДОСТИЖИМОСТЬ ПАР-ДАННЫХ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 18.09** — акт **`D39.268`**, лендинг `9defda4` (38 файлов, 1855/66, $0) + `e6f9a3b`; промт в `archive/prompts/` с баннером. Кампания **336/336 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**. ⭐ Предмет пере-определён замером ДО выдачи: языковых ветвлений в Go шесть при контроле 154 файла, живых два и оба законны ⇒ остаточная зависимость есть НЕДОСТИЖИМОСТЬ ДАННЫХ. **Английская книга доезжает на боевом конфиге** и встаёт на потолке до первого вызова. Ряды 347 и 500 закрыты, 272 и 502 половинами | | Бэкенд · АНГЛИЙСКАЯ ПАРА en→ru | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 18.09** — акт **`D39.267`**, лендинг `ddadb3e` (32 файла, 1356/127, $0) + `63e3a0d`; промт в `archive/prompts/` с баннером-исходом. Кампания **327/327 поймано, 0 выживших, 0 НЕ ИЗМЕРЕНО**, сумма исходов = составу гейта. ⭐ Пак заменил защиту, державшуюся ОТСУТСТВИЕМ второго промт-пакета, на механизм, и нашёл это у себя сам. Живое продолжение предмета — пак достижимости пар-данных | | Платформа · ПРОГОН НЕ ВРЁТ О СЕБЕ | активного НЕТ | пак ОТРАБОТАН и **ПРИНЯТ 17.09** — акт **D39.265** (32 пути, $0, контрактный минор **0.17.0**); промт в [archive/prompts/](archive/prompts/PLATFORM_RUN_TELLS_THE_TRUTH_SESSION_PROMPT.md) с баннером-исходом. Ряды **398** · **399** · **400** · **486** закрыты работой, **394** и **396** — ПЕРЕ-РЕШЕНИЕМ (четвёртое значение в клиентский словарь не идёт: «мы сами перестали перезапускать» — другая ось, чем «стоит ли повторять», и границу между осями стережёт новый гейт на три носителя), **416** — платформенной половиной. Кампания пере-снята приёмкой: 26 записей · поймано 25 · выжила 1, объявленная ДО прогона · неизмеренных 0. ⛔ Гейт зоны красен на экземпляре ряда **484** (фикстурный бюджет записи под нагрузкой; оба упавших теста живут в чистом `HEAD`) — названо границей, а не зеленью. ⚠ Две ошибки приёмки названы в акте: оркестратор взял себе правку канона (откачена) и неточно сформулировал §4.1 промта. Живое — ряды **416** (движковая половина) · **484** · **493** · **494** |