diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index b34881ae..c77e9b25 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # Журнал прогресса -> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-08, голова D39.229 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 1), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). +> **⟶ ТЕКУЩЕЕ СОСТОЯНИЕ** (на 2026-09-08, голова D39.230 — КУРС: движок и платформа до «работает и отдаёт результат», фронт ЗАМОРОЖЕН и P7 его НЕ размораживает (D39.147). **ОЧЕРЕДЬ №23** (единственный носитель — здесь; роль передана 06.09, №22 закрыт нотой передачи D39.217; ⚠ испр. 06.09: коммит передачи `c992ee5` бампнул голову и НЕ тронул номер — гейта на номер очереди нет вовсе, `counts.py` сверяет только голову, поэтому носитель разошёлся молча). ⚠ **ЗАКАЗ ВЛАДЕЛЬЦА 01.09 — ИСПОЛНЕН, испр. 08.09 (висел как «первым» неделю после исполнения):** (0а) ревизия документации на протухшее ОТРАБОТАНА 01.09 воркфлоу `docs-staleness-revision-A` (15 срезов), провенанс находок — `D39.185`; (0б) планы доработок в бэкенд и платформу — исполняются ПАКАМИ, за 07–08.09 закрыты два движковых (`D39.225`, `D39.226`); (0в) вынос неактуального в архив идёт батчами `DOC_CLEANUP_PLAN.md` (Б14/Б15/Б17 живы). ⇒ строка ниже — не заказ, а история: (0а) ревизия документации на ПРОТУХШЕЕ — по всем зонам; (0б) планы доработок в БЭКЕНД и ПЛАТФОРМУ; (0в) вынос неактуального в АРХИВ (`docs/archive/`, `platform/docs/archive/`) — за сутки 31.08 закрыто много, и часть носителей стала историей. ⚠ Трезвость по масштабу (пере-считано 02.09): **94** живых дока в `docs/` (пере-счёт 04.09: `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`), 8 в `platform/docs`, 9 в `backend/docs` — ⚠ из 94 ВРЕМЕННЫЙ остался ОДИН (`DOC_CLEANUP_PLAN`, живой до закрытия батчей Б14/Б15/Б17); два прежних временных уехали в `archive/reports/` 02.09; счёт бэклога — бюллетенем ниже, открытых рядов регистра платформы — 109 (major 1), всего рядов 465 (пере-счёт `python3 docs/scripts/counts.py`; с 04.09 оба числа под гардом `--check`, прежние 95/3 разошлись молча) ⚠ (ревизией 02.09 ряды **154** и **157** переведены из «скоро» в «когда-нибудь»: их гейтом стоял первый холодный прогон, он ОТРАБОТАЛ 31.08 и оба предусловия оказались другими — разбор в самих ячейках, ни одна НЕ закрыта). ⚠ Числа доков `counts.py` НЕ сторожит — при переносе файлов пере-считывать руками командой `find docs -name '*.md' -not -path 'docs/archive/*' | wc -l`. ⚠ И предупреждение о МЕТОДЕ, купленное сменой №21: «выглядит протухшим» ≠ «протухло». Три факта оркестратора опровергнуты ЗАМЕРОМ сессий, а якоря `15-money-path.md` в девяти случаях из двенадцати РОДИЛИСЬ верными и сгнили дрейфом — то есть ревизия обязана быть исполнением, а не чтением. ⚠ **ОЧЕРЕДЬ, унаследованная от №21** (три лендинга 31.08 — секция «СОСТОЯНИЕ ПАКОВ» ниже): **(1) ~~РАЗРЫВ ЦИКЛА~~ ЗАМКНУТ ЖИВЬЁМ 04.09** — пользователь получил EPUB настоящего ПЛАТНОГО перевода ЧЕРЕЗ API, `epubcheck` 5.3.0 на СКАЧАННОМ файле 0/0/0/0 (книга `bk_SS5VES2JELESJSTR`, потрачено $0.278319 из гранта $0.60 при потолке пака $1.5, санкция D39.189). Дверь выдачи построена и проверена исполнением: `202`+`Location`, поллинг с `Retry-After`, Range 206 · второй клиент 200 · аноним 401 · чужая книга 404, TTL с GC, идемпотентность третьего создающего вызова. Все ТРИ сценария строки 216 предъявлены живьём (подпись банка · halt на потолке с exit 4 · `409 run_not_resumable/ceiling_reached` и лечение новым прогоном). > ⛔ **ПЯТЬ ПОТОКОВ РАБОТЫ — состояние на 07.09 (пере-снято лендингами смены №23).** > **(1) ПОЛИГОН — «ремонт прибора»** (`docs/POLYGON_INSTRUMENT_REPAIR_SESSION_PROMPT.md`, строки 319 · 300 · 265 · 143): > ⚠ **ЕДИНСТВЕННЫЙ ПОТОК, НЕ СДВИНУВШИЙСЯ ЗА СМЕНУ — сессия по промту так и не стартовала.** Блокирующая линза @@ -13,6 +13,7 @@ > `3d90943`). Строки 285 · 305 · 325 закрыты. ⚠ **Синхронный разрез приёма принят ПОСТРОЕННЫМ, НО НЕ ГОТОВЫМ** — > сработало правило остановки (9 major из 11 в одном механизме), десять пунктов несёт строка **332**; ложный > инвариант бюджета заландён осознанно (окно лжи 8 секунд при дефолте в 16 минутах, ломается идемпотентность). +> **(9) ТРАНСПОРТ: КОНСИЛИУМ СОШЁЛСЯ, БИТ ВЛАДЕЛЬЦА ЗАКРЫТ — акт `D39.230`.** Оборванный НАМИ вызов: списывается по оценке с читателя, **пометка — УСЛОВИЕ решения**; платная проба отклонена (вопрос к вендору осознанно открыт); ожидание до ~20 мин разрешено ⇒ дедлайн от бюджета. ⛔ Попутно вскрыто: наш `research/21` §Q6 неверен ДВАЖДЫ и обе половины держали неверный дедлайн полтора месяца (эррата в его шапке); ось эскалации D2 фиктивна (строка **369**); нулевая ветвь не пишет чекпойнт ⇒ резюм ПЕРЕКУПАЕТ вызов. ⇒ **следующий движковый пак — строка 360**, пишется целиком. > **(8) ПЛАТФОРМЕННЫЙ ПАК «РАЗРЕЗ ПРИЁМА И ПРАВДА О СЕБЕ» — ✅ ПРИНЯТ И ЗАЛЕНДЕН 08.09, акт `D39.229`** (`ddcbf0c`, 26 путей, $0). Синхронный вход разреза под потолком (`x/sync/semaphore`, число из `jobs.DefaultWorkers`); граница хвоста выведена из кода; регистр приведён к правде — открытых 112 → **109**, major 3 → **1**. ⭐ Потолок сам назвал, чего НЕ ограничивает: материализатор и рекoнсайлер порождают процессы мимо него — строка **364**. Адверсариальный проход: 8 находок, 6 — дефекты этого же пака на ЗЕЛЁНОЙ батарее. > **(7) ДВИЖКОВЫЙ ПАК «ДВИЖОК УЖЕ ЗНАЕТ» — ✅ ПРИНЯТ С ДВУМЯ ДОФИКСАМИ И ЗАЛЕНДЕН 08.09, акт `D39.228`** (`2b6f1f4`, 21 путь). Закрыты строки 355 · 357 · 358; у **253** и **312** закрыта только ДВИЖКОВАЯ половина — платформенная жива и ждёт читателя (испр. 08.09 по кросс-модельному ревью ратификаций). Ратифицировано: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля. Третья смена поведения заказана приёмкой — лог и экран перестали спорить о полноте банка. Не взятое получило носители: **362** (ремонт против ремонта, 77 % денег чанка) и **363** (текстовый сайдкар молчит о неполноте). Батарея 19 ok · 0 FAIL · `EXIT=0`, каталог мутаций 259 → 276, тесты +17 / −0 — все числа пере-сняты оркестратором. > **(6) ВЫДАНЫ ДВА ПАКА 08.09, акт `D39.227`, оба $0.** Движковый «ДВИЖОК УЖЕ ЗНАЕТ» (`BACKEND_ENGINE_KNOWS_SESSION_PROMPT.md`: строки 253 · 357 · 358 · 355, попутно 312) и платформенный «РАЗРЕЗ ПРИЁМА И ПРАВДА О СЕБЕ» (`PLATFORM_INTAKE_TRUTH_SESSION_PROMPT.md`: строка 332, семь пунктов из десяти). Оба прошли опровергателя и разбор Fable 5. ⛔ **Заведена строка 360 — самый дорогой движковый класс (23–34 % цены редакторской руки), носителя у него не было;** её ДЕНЕЖНАЯ половина ждёт слова владельца (платит ли пользователь за вызов, оборванный нами) и сцеплена со строкой 331. До ответа пак по 360 не пишется. diff --git a/docs/architecture/05-decisions-index.md b/docs/architecture/05-decisions-index.md index 80d43c86..cd2328c8 100644 --- a/docs/architecture/05-decisions-index.md +++ b/docs/architecture/05-decisions-index.md @@ -1,4 +1,4 @@ -# Реестр D-нот — карта актуальности v2 (D1–D39.229; титул — носитель головы, бампать при каждом аппенде) +# Реестр D-нот — карта актуальности v2 (D1–D39.230; титул — носитель головы, бампать при каждом аппенде) > ⚠ **Колонку «тело» `counts.py --check` НЕ сторожит по устройству:** он сверяет полноту НОМЕРОВ, а не > место тела, поэтому колонка держится дисциплиной лендинга. Не нашёл тело по колонке — иди в слайсы, @@ -288,3 +288,4 @@ | D39.227 | 08.09 | **ТРИАЖ И ВЫДАЧА ДВУХ ПАКОВ** («движок уже знает» + «разрез приёма и правда о себе», оба $0). Заведена строка **360** — таймаут чтения маскируется под нечитаемое тело, ретраится и биллится по оценке (23–34 % цены редакторской руки), носителя у класса не было; строка **354** называла механизм свойством провайдера и исправлена. Пред-решение оркестратора «новый корневой `code`» ОТОЗВАНО: корневой закрыт, открыт `cause.code`. Фантом-гард спущен до номера ПУНКТА. Вопрос владельцу: платит ли пользователь за вызов, оборванный нами | триаж · паки · деньги · контракт | | D39.228 | 08.09 | **АКТ: движковый пак «движок уже знает» ПРИНЯТ С ДВУМЯ ДОФИКСАМИ** (`2b6f1f4`, 21 путь). Полнота банка доезжает до подписи и до stdout, классификатор вошёл в итог трат, банк-роли разведены в разложении. Закрыты строки 253 · 355 · 357 · 358 · 312. **Ратифицировано: аддитивное поле манифеста ключ НЕ двигает, но обязано быть отличимо от своего нуля** (прецедент `price`/`structure`; бамп перекупает каждую книгу). Третья смена поведения заказана приёмкой: лог и экран перестали спорить о полноте. Открыты строки 362 и 363 | приёмка · банк · деньги · манифест | | D39.229 | 08.09 | **АКТ: платформенный пак «разрез приёма и правда о себе» ПРИНЯТ** (`ddcbf0c`, 26 путей, $0). Синхронный вход разреза получил потолок; граница хвоста выведена из кода; шапка журнала и три ряда регистра приведены к правде. ⭐ Потолок сам назвал, чего НЕ ограничивает — остаток строкой **364**. Адверсариальный проход: 8 находок, 6 — дефекты этого же пака на ЗЕЛЁНОЙ батарее; норма про НАПРАВЛЕНИЕ заландена `c3039be`. Девятая находка — вечное зависание, класс вне досягаемости батареи и мутации | приёмка · приём · параллелизм · самопроверка | +| D39.230 | 08.09 | **СЛОВО ВЛАДЕЛЬЦА по оборванным вызовам** (по итогу консилиума с чистым Fable 5, строка 360): форма **А** — оценка списывается с читателя, но **пометка (`attempt_timeout` + `estimated=1` + публикация счёта и суммы оценочных строк рядом с `committed_usd`) есть УСЛОВИЕ решения**, не опция; платная проба баланса ОТКЛОНЕНА ⇒ вопрос «биллит ли вендор оборванное» осознанно остаётся открытым; ожидание провайдера до ~20 мин РАЗРЕШЕНО ⇒ дедлайн считается от бюджета. Бит закрыт, пак пишется целиком | деньги · транспорт · слово владельца | diff --git a/docs/architecture/05-decisions-log.md b/docs/architecture/05-decisions-log.md index 10e8de00..aa285543 100644 --- a/docs/architecture/05-decisions-log.md +++ b/docs/architecture/05-decisions-log.md @@ -1,4 +1,4 @@ -# Журнал решений оркестратора — контракт D1–D39.229 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) +# Журнал решений оркестратора — контракт D1–D39.230 (живой файл: карта · эрраты · живые тела · голова D39.124+ (подрезка D39.139); тела закрытых эр — в слайсах `docs/archive/architecture/`, указатель ниже; реестр всех нот — `05-decisions-index.md`) > **⟶ КАРТА АКТУАЛЬНОСТИ (ревизия D31, продлена до D38.2 [12.07]; исторические записи ниже НЕ переписываются — дисциплина D23.3).** Работая с контрактом (греп номера: живой файл → слайсы, целиком НЕ читать — D39.125), держи под рукой, что чем перекрыто: > ⚠ **Эррата 09.08 (D39.125):** D39.111 п.1 предписывал промту S3 «максимум = баланс МИНУС открытые холды» — формула ОШИБОЧНА (вычитание дважды), исправлена D39.115 п.2(а): максимум = Balance КАК ЕСТЬ; тело D39.111 — в слайсе `../archive/architecture/05-decisions-D39-106-123.md` (испр. 05.09: прежнее «живёт ниже в этом файле» протухло подрезкой D39.139) (голова D39.106+). @@ -3205,3 +3205,15 @@ bought NOTHING». ⇒ **`tmctl manifest` есть НИЖНЯЯ граница, **10. Дописка 08.09 — ГРАНИЦА п.2 и п.9 ЗАКРЫТА, и закрыта прогоном СТРОЖЕ моего.** Зона пере-сняла гейтовую батарею на ЗАЛАНДЁННОМ `f1404f0` со всеми четырьмя гейтами: 20 пакетов `ok` · FAIL 0 · скипов 5 · линтер 0 issues, дерево прогоном не тронуто. ⇒ «`MAKE-EXIT=0` принят со слов» снимается. ⛔ **И метод взятия вердикта важнее числа.** Первый прибор зоны был негоден: `echo "MAKE-EXIT=$?"` после подстановки `$(git rev-parse …)` ловит код `git`, а не `make`. Настоящий вердикт взят у САМОЙ цели — `make check` при провале СОХРАНЯЕТ `.check.log.` и выходит 1, при успехе удаляет; лога нет ⇒ прогон зелёный, и это утверждение `Makefile`, а не пересказ. Проверено мной чтением цели. ⚠ **Отсюда же поправка к моей собственной проверке:** `check` гоняет `go test ./... -race`, а мой приёмочный прогон шёл БЕЗ `-race` — то есть зонный прогон СТРОЖЕ приёмочного, и мой п.2 доказывал меньше, чем я думала. ⭐ Сама цель несёт норму контрольной величины В КОДЕ: пустой лог она объявляет КРАСНЫМ, потому что «a missing file is INDISTINGUISHABLE from a clean one to grep». **11. Дописка 08.09 — ДВА ДОФИКСА ПРИЁМКИ И КЛАСС, ПОВТОРИВШИЙСЯ У ЗОНЫ И У МЕНЯ В ОДИН ДЕНЬ.** Приёмочные верификаторы, поставленные ПОСЛЕ ратификации (норма требовала до — см. эрраты `08.09-г`, `08.09-д`), дали два дофикса, оба заландены. **(а)** `cutTailReserve()` держал рукописную тройку без пина — класс `D39.216` внутри пака, нанятого убрать рукописные числа из `UploadSettle`. Зона отвергла структурную форму с доводом: она вернула бы перечень шагов уровнем ниже; вместо неё сверка с ДРУГИМ выражением того же факта — резерв обязан равняться остатку прогулки после выноса разреза и единственной записи, идущей до него. Два выражения делят константы, но НЕ маршрут, поэтому это сверка, а не тавтология; предъявлено посадкой пятой записи. **(б)** `PD-464` приведён к лендингу: фраз «в дереве, статус флипает лендинг» в файле теперь 0 при 465 рядах. ⭐ **КЛАСС, СТОЯЩИЙ ЗАПИСИ, потому что он сработал у обеих сторон в один день:** норма чистит УНАСЛЕДОВАННОЕ и не видит того, что породил её же проход. У зоны §4.5 снял протухшую фразу с трёх чужих рядов и завёл её в четвёртом, написанном этим же паком; шапку зонного журнала пак починил по той же §4.5, и лендинг ТОГО ЖЕ пака сделал её неверной снова. У меня — акт объявил закрытыми строки 253 и 312, а закрыты их половины, и эррата к акту закрыла 1 носитель из 6. ⇒ **правило: проход по норме обязан включать строки, которые ЭТОТ ЖЕ проход и создал, а сверка носителей идёт ОДНИМ движением с актом.** Формулировка зоны, ратифицирую как есть. + +## D39.230 — СЛОВО ВЛАДЕЛЬЦА по оборванным вызовам: списывать с читателя ПО ОЦЕНКЕ и ПОМЕТКОЙ, платной пробы НЕ делать, ждать провайдера — можно (08.09, оркестратор №23) ✅ + +**Основание** — прямые ответы владельца 08.09 на три вопроса, поставленные по итогу консилиума с чистым Fable 5 (конструкция — строка бэклога **360**). + +**1. Деньги: форма А — оценка списывается с читателя, НО пометка есть УСЛОВИЕ, а не украшение.** Слово: «пока пусть с читателя списывается, только пометочку поставь». ⇒ ратифицируется: движок сеттлит `estimate` за вызов, который МЫ оборвали при доставленном запросе, и это уходит в счёт пользователя. ⛔ **Условие, без которого решение не действует:** строка несёт СВОЙ класс (`attempt_timeout`) и флаг `estimated=1`, а счёт и сумма оценочных строк публикуются машинно-читаемо РЯДОМ с `committed_usd`. ⇒ пункт «если дёшево» из плана консилиума ПЕРЕВОДИТСЯ В ОБЯЗАТЕЛЬНЫЕ: списывать с человека непроверенную оценку без видимой пометки — не то, на что дано слово. Это же закрывает движковую половину `PD-441` (строка **78**), которую платформа просила дословно. + +**2. Платная проба ОТКЛОНЕНА.** Слово: «не хочу, не делаем». Проба (≤$0.55, два контрольных и два оборванных вызова против баланса DeepSeek) не проектируется и повторно не предлагается. ⇒ **вопрос «биллит ли вендор оборванный non-streaming» остаётся ОТКРЫТЫМ, и это осознанная цена решения п.1:** оценка есть верхняя граница под гипотезой «вендор досчитывает» (слово OpenRouter, не DeepSeek) и завышение, если вендор не берёт ничего. Пометка п.1 — единственное, что делает эту неопределённость видимой; отсюда её обязательность. Инвойс, когда придёт, сверяется с суммой оценочных строк — ради этого они и публикуются. + +**3. Ожидание провайдера РАЗРЕШЕНО.** Слово: «да, готов ждать». ⇒ дедлайн считается от бюджета — `clamp(queue_slack_s + max_tokens/tok_s_floor, attempt_s, attempt_max_s)`, — и худший редакторский вызов может идти до ~20 минут (до 10 минут вендорской очереди плюс генерация). Проверено чтением чужого кода: сверху не убьёт ничто — `RuntimeMaxSec`/`WatchdogSec` **0 хитов при 16 файлах** с systemd-свойствами, у движка дедлайна нет, реконсайлер судит по `ActiveState`. Две названные цены принимаются вместе с решением: оператору нужна INFO-строка «жду провайдера: X из Y», а `waitForSettle` теперь ждёт до самого длинного летящего вызова. + +**4. Что это меняет в очереди.** Расходившийся бит закрыт ⇒ движковый пак по строке **360** пишется целиком, без остатка на слово владельца. Строки **369** (фиктивная ось эскалации) и **78** закрываются тем же паком; **368** (`est_tokens` ×5) — отдельным носителем, в пак не входит.