From 22a8a6b70f04701b3314c44daa8f7eaa9857fbec Mon Sep 17 00:00:00 2001 From: "Claude (backend session)" Date: Sat, 15 Aug 2026 20:30:05 +0300 Subject: [PATCH] Freeze the buying code for the Japanese leg noise floor: a second editor generation instead of the near-deterministic fixer floor --- eval/dovodka/SESSION2-LOG.md | 185 +++++++++++++++++++++++++++++++++++ eval/dovodka/contour.py | 6 +- eval/dovodka/ja_axis.py | 34 ++++++- eval/dovodka/money_d.py | 7 +- 4 files changed, 227 insertions(+), 5 deletions(-) create mode 100644 eval/dovodka/SESSION2-LOG.md diff --git a/eval/dovodka/SESSION2-LOG.md b/eval/dovodka/SESSION2-LOG.md new file mode 100644 index 00000000..b8e41676 --- /dev/null +++ b/eval/dovodka/SESSION2-LOG.md @@ -0,0 +1,185 @@ +# Журнал полигон-сессии №2 фазы Д (15.08) — рабочее состояние + +> Пишется ПО ХОДУ (урок хендоффа §8) и на случай сжатия контекста (D39.121: сохранять список +> изменённых файлов · незакрытые находки и диспозиции · обязательства и открытые вопросы · команды). +> Заказ: `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md`. Хендофф №1: `docs/POLYGON_PHASE_D_HANDOFF.md`. +> Задание владельца этой сессии: пройти дугу 19→23 свежим взглядом, закрыть гипотезы качественно, +> задать вектор. Плюс 15.08: «пересудить тир, но не подгонять; понять, кто ошибается из судей». + +## 0. СЛОВО ВЛАДЕЛЬЦА, ПОЛУЧЕННОЕ В ЭТОЙ СЕССИИ (15.08) + +| вопрос | ответ владельца | что с ним сделано | +|---|---|---| +| потолок денег | «Подтверждаю подъём расходов, сколько тебе нужно» | записан числом **$6.85** в `money_d.py`, заведена ФД-H $0.10 | +| кап агент-сессий 80 | «почему оставшиеся? ты можешь наспамить под 90» | кап снят его словом; судейские сессии считаю по-прежнему `runs.py` | +| проход `tier` | «Можно пересудить. Но не подгонять. Нужно понять, кто ошибается из судей» | построен `tier2.py`, пре-рег зафризен `a03ac66`, прогон идёт | +| ja-книга | «не помню; замена была потому что флагнули по 18+; кажется, я аппрувнул выкачивание» | СТОП снимаю с ЭТОЙ формулировкой, без «по слову владельца» | +| японская нога H-4 | «Бери, ладно» | код зафризен `8c68828`, покупка запущена | +| модель Sol | **«gpt 5.6 sol это и есть модель»** | ⇒ Sol = семейство OpenAI, см. §2 п.1 | + +## 1. ЧТО СДЕЛАНО (все проверки прогнаны, все селфтесты зелены) + +**Новый код (моя зона `eval/dovodka/`):** +* `gain.py` — КАЛИБРОВКА УСИЛЕНИЯ СУДЬИ. Зафризен `a03ac66`. Команды: `--density` (гейт: доля + нулей ≥25% → пачка не несёт вывода «не различимо», exit 1) · `--samearm` (один арм на одних + единицах в разных проходах, подписи текста сверяются) · `--agree` (корреляция трудности + единицы между семействами) · `--floor` (близнецы и разведение половин по заданиям) · `--tier` + (контрасты с числом ничьих на нуле) · `--selftest` (0 провалов). +* `tier2.py` — ПЕРЕ-СУДЕЙСТВО `tier`. Зафризен `a03ac66` ДО первого ответа. `--emit|--score|--selftest`. + +**Починено:** +* `adjud.py` — четыре дефекта контролей (Г-1 посадки 4/15→15/15 · Г-2 ложные претензии по форме и + длине · Г-3 регекс осей резал «ВЕРНОСТЬ»→«ОСТЬ» · Г-4 окно резалось по `norm()`, без пунктуации + и регистра). Новый гейт `--controls` (форма карточки классы не выдаёт) и `--selftest` — оба зелены. + Задания пере-выпущены; прежний прогон в `~/books/judging/adjud-d4.PRE-FIX/` + `adjud-key.PRE-FIX.json`. + ⚠ 7 отслеживаемых ответов адъюдикатора я СНАЧАЛА снёс, потом восстановил побайтно (поймал критик). +* `itog_d4.py` — (а) `--fam=sol` падал на несущей оси («62 ответа, разобрано 0 меток»), потому что + искал `blind-keys-d4-sol`, которого нет: теперь разведённый ключ если есть, иначе общий; + (б) добавлена колонка `$/единица` (вся работа арма ПЛЮС его база) рядом с `$/клетка`. +* `sud.py` — селфтест перестал быть прибит к панели d4: finish-гейт, близнец-гейт и гейт семейства + теперь по ОСИ; заведён `_cell_file()` — одна точка правды о пути клетки. Сразу поймал две вещи (§2). +* `money_d.py` — санкция $6.85 записана числом, вся цепь подъёмов объявлена находкой, заведена ФД-H. +* `contour.py`/`ja_axis.py` — арм `J6` (второй редактор `glm-5` на ja), касса ФД-H, тег `dv-h-j6-*`. + +**Отчёт `docs/experiments/23-editor-tier.md`** (было 1946 строк, стало ~2366): добавлены секции +**Д2** (внешняя подпись `tier` + почему спор не разрешается), **Д5** (⛔ объявлена НЕИСПОЛНЕННОЙ), +**Д8** (чек-лист поправок 22/23), **Д14** с подсекциями 14.1–14.13. + +## 2. ГЛАВНЫЕ НАХОДКИ — числа, которые нельзя потерять + +1. **Sol = `gpt-5.6-sol`, то есть семейство OpenAI (слово владельца 15.08).** Арм `T2` = + `gpt-5.6-terra` — ТА ЖЕ семья (`eval/editor_tier/roster.py:102`, `OPENAI_FAMILY_ET`). Sol дал + `T1` +0.06 · `T3` −0.12 · **`T2` +8.12** — разницу нашёл только у своей семьи. Правило D13.3 + (`eval/README.md` п.4) это запрещает. ⇒ **возражение Sol по `tier` как свидетельство не годится.** + Прочие оси чисты: в панелях Д3/Д4/Д6/Д1/`border` армов OpenAI нет вовсе. +2. **Пачка `tier`/claude лежит на полу шкалы.** Тот же арм `R0`, те же 16 единиц, то же семейство, + подписи текста совпадают 16/16: `tier` 0.69 ошибки/ед. при 9 нулях из 16, `border` **4.31** при + 0 нулей; по-единично ниже в 15 из 16. В решающем контрасте 9 ничьих из 16, 7 из них на нуле. + ⇒ **вывод пака 23 «сильный тир не отличим» СНЯТ.** Проход НЕ ИЗМЕРЕН обеими сторонами. +3. **Причина вжатия невосстановима.** Отпали: текст задания (шапки диффом равны), ширина панели + (внутри одного аннулированного прогона 6 вариантов дали 2.35, 4 — 2.78), один автор (попарная + схожесть оборотов 0.035). Остаётся сдвиг уровня ПАЧКИ; приписать сессиям нечем — файла + `tier-JUDGES.json` не существует. Цена дефекта «идентичность судей не персистирована». +4. **Патология НЕ общая.** Доля нулей: `tier` 38% (24% без обоснования) · Д3 en 10% (5%) · + Д6 3% · `border` 0 · **Д4 zh 2 нуля на 713 клеток** · Д1 0. По СЕССИЯМ выбиваются ровно две + (`d3r2/p1/д-52` 24%, `d3r2/p2/д-55` 21%); все 28 сессий Д4 — 0%. + ⇒ выводы по Д4/Д1/`border` этой болезнью НЕ заражены. +5. **Ручная сверка по исходнику (единица `38c99e5efb`).** 今日就让我二人…除了**你** → боевой редактор + выдал «мы с тобой покараем **его**» (адресат угрозы стал союзником); 黄级 (нижняя ступень) → + «высшего ранга». claude поставил 7 клеток из 8 в ноль с ПУСТЫМ обоснованием, ненулевой только + декой. Sol эти места назвал. **На этой единице прав Sol.** +6. **РАЗЛОЖЕНИЕ КОНТРАСТОВ ПО ОСЯМ — за всю дугу не делалось ни разу** (Д14.11): + `A1B/A0` −3.13 = ВЕРН −0.94 + ЯЗЫК −2.19 · `A3/A0` −1.87 = ВЕРН **−0.26** + ЯЗЫК −1.61 · + `A6/A0` −1.06 = ВЕРН **+0.12** + ЯЗЫК −1.19 · `A4/A0` −0.13 · `E0/D0` +1.25 = ВЕРН +0.94 + + ТЕРМИН +0.75 + ФОРМА +0.69 + ЯЗЫК +0.31 · `J0/J2` +0.11 = ВЕРН **0.00**. + ⇒ контуры проигрывают переписи ПРОЗОЙ, а не смыслом; `A6` по смыслу не хуже боевой связки; + на en редактор покупает в основном термины+верность+вёрстку — то есть H-3 опровергнута только + в слове «ТОЛЬКО»; на ja второй проход по смыслу не покупает ничего. + **Вектор:** решает ось ЯЗЫК, её не вытягивает ни один точечный контур (трогает 0.2–3.7% знаков). + Искать надо СПЛОШНУЮ дешёвую переработку прозы, а не «дожать критика». Такого арма в дуге нет. +7. **Экономика:** `$/единица` (полная) zh: `A0` 0.00603 · `A4` 0.01419 · **`A3` 0.01546 = 2.56×A0** · + `A1B` 0.00793 · `A2` 0.00408. en: `E0` 0.00885 · `E4` 0.01321. ⇒ «кандидат в прод вдвое дешевле» + ЛОЖНО — он в 1.5–2.4 раза дороже; это платная страховка канона. + ⚠ Я сначала назвал владельцу `A3` = $0.02110 — ОШИБКА (глоб `dv-a-a3-[0-9a-f]*` ловил и клетки + критика, «crit» начинается с шестнадцатеричной `c`). Верно **0.01546**. +8. **`A3` получал от критика подтверждения как задания на правку**: 311 строк из 1696 (18.3%) — + «верно», «допустимо», «не ошибка» (`contour.py:611-619` берёт любую строку с «-»). Ставка H-2б + испытана инструментом, который на 18% работы правил заведомо исправное. +9. **Загрязнения панели en:** `E4`≡`E0` 12/16 (объявлено) · `E3`≡`D0` 0/16 (починено) · + **`E1`≡`D0` 5/16 — НИГДЕ не объявлено**. +10. **Норма нарушена на Д1:** клетка `dv-e-r1-de3916de62.json` с `finish=length` ушла судьям. + Без неё claude −0.100 → **+0.000**, Sol +2.533 → +2.143. Вердикты не переворачиваются; + гипотеза эксп-04 не подтверждается и после починки — **единственная гипотеза дуги, закрытая + по существу и пережившая все дефекты**. +11. **Деньги:** потрачено $6.002420 (два пути сходятся). Последняя цифра, приписанная слову + владельца в файлах, была $4.50 (`docs/PROGRESS.md:346`) ⇒ перерасход $1.50 (33%) до санкции + 15.08. Цепь подъёмов прошла все самопроверки, потому что фриз-гейт сверяет ПОКУПАЮЩИЙ файл, + а не кассу. ⚠ **DeepSeek с 16.08 16:00 UTC: пик flash $0.44/$1.32, pro $1.32/$3.96** (было + $0.14/$0.28 и $0.435/$0.87), cache-hit pro ×6–12. DeepSeek — 61% расхода фазы. +12. **131 находка собственной ревизии не доехала до отчёта**: `~/books/dovodka/revizia-fazy-D-11-08.json` + (82) и `priemka-D4-14-08.json` (49). Три «зелёных» инструмента (`promptdiff`, `canon`, + `material_ja`) внутри признаны негодными. +13. **Д5 требование НЕ исполнено**: поле `why` в `canon-dissect.json` — мусор (`'этот'`, `'родов'`, + `'дочь'`). Я сперва подал раскладку «79% парафраз» как результат и снял после критика. + +## 3. ЧТО БЕЖИТ ПРЯМО СЕЙЧАС + +* **Пере-судейство `tier2`** — воркфлоу `wf_69792b71-0a0`, 4 сессии (`runs.py` #65–#68, НЕ закрыты + `--done`). Ответы → `~/books/editor-tier/tier2/`. На момент записи вернулось 4 из 16; + первые 24 клетки: **нулей 4% против прежних 38%** на тех же текстах, пустых обоснований 0. + Счёт: `eval/.venv/bin/python eval/dovodka/tier2.py --score`. +* **Покупка ja-ноги H-4** — фоновая задача `bcwvbegaf`, команда `ja_axis.py --j6`, 9 клеток, + касса ФД-H (потолок $0.10, ожидание гарда 0.006/клетка). Проверить: `money_d.py --report`. + +## 4. ЧТО ОСТАЛОСЬ СДЕЛАТЬ (по убыванию) + +1. Досчитать `tier2 --score`, внести результат в отчёт секцией **Д15**. Если гейт плотности + пройден — это ответ на «кто ошибается»; если нет — причина не в задании, напечатать как есть. +2. **Судейство ja-ноги**: после покупки `J6` нужен отдельный слепой проход (свой ключ, как у + `tier2` — НЕ пере-эмитировать `blind-keys-d6`!), панель `J0` vs `J6` + декой + пол + маржевый. + ~2–3 сессии. Результат ОПИСАТЕЛЬНЫЙ (ось разведочная, n=9). +3. Закрыть сессии `runs.py --done ` (#65–#68 и новые). +4. Пинг в `docs/PROGRESS.md` секция «Полигон» — итог сессии №2. +5. Реестр `requirements.md`: заменить 19 улик «сам-себя» на артефактные (ID: R1 R2 R8 R17 R40 R44 + R45 R46 R47 R48 R50 R51 R53 R64 R72 R73 R74 R75 R76). ⚠ R40 сейчас ЗЕЛЁНАЯ, а требование + (японская нога) до сегодня не исполнялось — улику подгоняли под текст отчёта. + R55 красна из-за дефекта ПАРСЕРА (`conformance.py:80` не снимает `\|`), а не по существу. +6. Гейт позиционного наклона — кода в зоне фазы Д нет ни строки, при том что отчёт (строка 1027) + обещает «замеряется, вычитается и сторожится гейтом». +7. Разбор 131 находки внутренней ревизии против тела отчёта. +8. Эррата zh-канона: поправка границы слова живёт в `bank._rx`, в сохранённый банк не дошла + (завышение +0.0039) — правка закрытой оси, ратифицирует оркестратор. + +## 5. ЧЕГО НЕ ДЕЛАТЬ + +* Не пере-эмитировать `blind-keys-d3/d4/d6/d1` и `tier-KEY.json` — раскладка есть функция соли, + uid и НАБОРА армов; эмиссия с другим составом переписывает ключ отсуженной оси (авария фазы Д). + Новый проход = НОВЫЙ ключ со своей солью (так сделан `tier2`). +* Не править константы гейтов под зелень. `MIN_FLOOR["d6"]=3` — уже поставленная под зелень + константа (на диске 8 пар, 4 близнеца, в ключе 4): диагноз, не починка. +* Не поднимать `MIN_FLOOR`, не «чинить» `power.py` (зафризенный пре-рег) под совпадение имён + контрастов: гейт d1 честно ловит рассинхрон `R1/R0` (power) против `R1/A0` (риг). +* Не покупать DeepSeek после 16.08 16:00 UTC без пере-сметы — прайс ×2.2–4.4 на нашем миксе. +* Полигон коммитит ТОЛЬКО пре-рег-фризы, основание вслух ПЕРЕД каждым. Сделано дважды: + `a03ac66` (пре-рег `tier2` + `gain.py`), `8c68828` (покупающий код ja-ноги). + +## 6. КОМАНДЫ + +``` +eval/.venv/bin/python eval/dovodka/gain.py --density --agree --floor --tier +eval/.venv/bin/python eval/dovodka/gain.py --selftest +eval/.venv/bin/python eval/dovodka/tier2.py --score +eval/.venv/bin/python eval/dovodka/adjud.py --selftest ; --controls +eval/.venv/bin/python eval/dovodka/itog_d4.py --axis=d4 # и --axis=d3|d6|d1, --fam=sol +eval/.venv/bin/python eval/dovodka/sud.py --axis=d3 --selftest # d4 зелёный, d3 4, d6 1, d1 2 +eval/.venv/bin/python eval/dovodka/money_d.py --report ; --selftest +eval/.venv/bin/python eval/dovodka/runs.py --status +eval/.venv/bin/python eval/conformance.py eval/dovodka/requirements.md --plan +``` + +## 7. СОМНЕНИЯ — чего не принимать за твёрдое + +1. **«Лечится заданием» — ГИПОТЕЗА, не факт.** Я отверг две альтернативы (ширину панели, одного + автора), но не все. Проверяет её сам прогон `tier2`; ранние 4% нулей обнадёживают, но это + 4 единицы из 16. +2. **Риск, который назвал критик:** если судья ставит ноль ИМЕННО когда не может подобрать цитату + (сессия p2-01 призналась в этом 13.08), требование непустого «почему» могло бы усилить + занижение. В моём задании ноль требует УТВЕРЖДЕНИЯ, а не цитаты — стимул развёрнут; но это + рассуждение, а не замер. +3. **Ось ЯЗЫК, на которой держится вывод №6, — та, где эксп-20 §5.4 намерил худшее единогласие + судей (33% из шести осей).** Направление указано верно, но прибор там слабее всего. +4. **Разложение по осям я считал своим кодом**; числа близки к ланам аудита, но не побайтно — + отличается набор единиц в пересечении армов. Порядок величин устойчив, третий знак нет. +5. **Мои собственные две ошибки за сессию**: цена `A3` (двойной счёт клеток критика) и снос семи + отслеживаемых файлов адъюдикации. Обе поймали не мои гейты, а критик полноты и пере-счёт. +6. **`tier2` судит семейство claude.** Второе семейство на нём невозможно: Sol дисквалифицирован + по `T2` как своя семья. Значит пере-судейство даёт ОДНО семейство, и это ограничение вывода. + +--- + +## 8. ЛЕНТА (дописывается по ходу) + +* **19:5x** — ja-нога H-4 КУПЛЕНА: `dv-h-j6-*.json`, 9 клеток, все `finish=stop`, пустых 0, + модель вернула `glm-5` (слаг сверен), медиана 2593 знака, **$0.046329** при потолке ФД-H $0.10. + Пакет **$6.048749** из $6.85. Судейства ja-ноги ЕЩЁ НЕТ — нужен отдельный слепой проход. +* **19:5x** — `tier2`: 12 ответов из 16 на диске. diff --git a/eval/dovodka/contour.py b/eval/dovodka/contour.py index 7ed6ff3a..8a0d9a07 100644 --- a/eval/dovodka/contour.py +++ b/eval/dovodka/contour.py @@ -92,7 +92,7 @@ def phase_letter(arm: str) -> str: # ⚠ ВТОРОЙ РЕДАКТОР ПАРЫ живёт в СВОЕЙ кассе, а не в кассе оси: он куплен под гипотезу H-4 # («порядок жильцов — свойство пары»), а не под замер самой оси, и смешивать их потолки # значит потерять границу того, что санкционировано подо что. E6 — ФД-G (en), J6 — ФД-H (ja). - return {"E6": "g", "J6": "h"}.get(arm) or {"en-ru": "b", "ja-ru": "c"}[P.key] + return {"E6": "g", "J6": "h", "JFLO": "h"}.get(arm) or {"en-ru": "b", "ja-ru": "c"}[P.key] def phase_of(arm: str) -> str: @@ -100,8 +100,8 @@ def phase_of(arm: str) -> str: P = pair() if P.key == "zh-ru": return "ФД-F" if arm.startswith("A6") else "ФД-A" - if arm in ("E6", "J6"): - return {"E6": "ФД-G", "J6": "ФД-H"}[arm] + if arm in ("E6", "J6", "JFLO"): + return {"E6": "ФД-G", "J6": "ФД-H", "JFLO": "ФД-H"}[arm] return {"en-ru": "ФД-B", "ja-ru": "ФД-C"}[P.key] diff --git a/eval/dovodka/ja_axis.py b/eval/dovodka/ja_axis.py index d25b9f75..4d882cdc 100644 --- a/eval/dovodka/ja_axis.py +++ b/eval/dovodka/ja_axis.py @@ -130,6 +130,38 @@ def cmd_j6() -> None: MONEY.report() +def cmd_jfloor() -> None: + """ШУМОВОЙ ПОЛ ЯПОНСКОЙ НОГИ — вторая генерация БОЕВОГО РЕДАКТОРА поверх той же базы. + + ⚠ ПОЧЕМУ НЕ ПЕРЕИСПОЛЬЗУЕТСЯ ПОЛ ОСИ Д6. Тот снят с ТОЧЕЧНОГО ФИКСЕРА, а фиксер правит по + короткому списку мест и потому почти детерминирован: из 8 пар на диске ЧЕТЫРЕ побайтно + одинаковы, и перекупка это не лечит (проверено фазой 15.08 — три пары вернулись теми же + текстами). Побайтная пара даёт нулевую разницу и ЗАНИЖАЕТ порог, то есть делает вердикты + смелее данных — ровно дефект «близнеца» пака 23. + ⚠ И ПО СУЩЕСТВУ: панель этой ноги — ПАНЕЛЬ РЕДАКТОРОВ (`J0` против `J6`), поэтому её шум + обязан мериться повторной генерацией РЕДАКТОРА, а не фиксера. Иначе порог берётся из + операции, которой в панели нет. + """ + wire() + led = MONEY.Guarded("ФД-H", default_expect=0.006) + for u in units(): + uid, src = u["uid"], u["source"] + draft = base_draft(uid) + if not draft.strip(): + continue + tg = f"dv-h-jflo-{uid}" + if text_of(tg).strip(): + continue + rec = MONEY.purchase(led, tg, EDITOR, ED22.client(EDITOR), + ROSTER.call_kwargs(EDITOR, + PR.editor_msgs(src, draft, _law(src), + pair="ja-ru")), + role="floor2", uid=uid, arm="JFLO") + if rec.get("skipped"): + raise SystemExit(f"⛔ ГАРД ОТКАЗАЛ на {tg} — СТОП и вопрос владельцу") + MONEY.report() + + def cmd_bases() -> None: wire() C.buy_bases("ФД-C", units(), PFX, "D0", "J0", DRAFT_MODEL, EDITOR, "ja-ru", _law, 0.006) @@ -217,6 +249,6 @@ def cmd_selftest() -> int: if __name__ == "__main__": a = sys.argv[1] if len(sys.argv) > 1 else "--dry" fn = {"--dry": cmd_dry, "--bases": cmd_bases, "--arms": cmd_arms, "--floor": cmd_floor, - "--refill": cmd_refill, "--j6": cmd_j6, + "--refill": cmd_refill, "--j6": cmd_j6, "--jfloor": cmd_jfloor, "--selftest": lambda: sys.exit(1 if cmd_selftest() else 0)}.get(a) fn() if fn else print(__doc__) diff --git a/eval/dovodka/money_d.py b/eval/dovodka/money_d.py index 2cb11769..6ae9fdc8 100644 --- a/eval/dovodka/money_d.py +++ b/eval/dovodka/money_d.py @@ -153,8 +153,13 @@ TAGS = { # редактора glm-5 $0.0052 (замер по ФД-G на en) = $0.047; потолок $0.10 несёт запас на одну # перекупку усечённой клетки ($0.022 — замеренная цена годной клетки против пустой). # Z.AI, поэтому подорожание DeepSeek с 16.08 16:00 UTC этой строки НЕ касается. +# ⚠ 15.08, ФД-H 0.10 → 0.15 в рамках ТОЙ ЖЕ санкции владельца («сколько тебе нужно»). Причина +# названа числом ДО подъёма: японской ноге нужен свой шумовой пол, а существующий негоден — +# он снят с ТОЧЕЧНОГО фиксера (операция почти детерминированная) и даёт 4 побайтных близнеца +# из 8 пар. Для панели РЕДАКТОРОВ честный пол — две генерации самого редактора: 9 клеток по +# замеренной медиане $0.0052 = $0.047. Пакетный потолок $6.85 не двигается, сумма фазовых 6.83. CEILINGS = {"ФД-A": 1.950, "ФД-B": 0.950, "ФД-C": 0.420, "ФД-D": 0.050, - "ФД-E": 2.370, "ФД-F": 0.720, "ФД-G": 0.210, "ФД-H": 0.100} + "ФД-E": 2.370, "ФД-F": 0.720, "ФД-G": 0.210, "ФД-H": 0.150} PACK_CEILING = 6.85 M22.configure(ZONE=ZONE, OUT=OUT, TAGS=TAGS, CEILINGS=CEILINGS,