Freeze the buying code for the Japanese leg noise floor: a second editor generation instead of the near-deterministic fixer floor

This commit is contained in:
Claude (backend session) 2026-08-15 20:30:05 +03:00
parent 21ad28250b
commit 22a8a6b70f
4 changed files with 227 additions and 5 deletions

View file

@ -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.114.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.23.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.52.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 ×612. 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` + декой + пол + маржевый.
~23 сессии. Результат ОПИСАТЕЛЬНЫЙ (ось разведочная, n=9).
3. Закрыть сессии `runs.py --done <n>` (#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.24.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 на диске.

View file

@ -92,7 +92,7 @@ def phase_letter(arm: str) -> str:
# ⚠ ВТОРОЙ РЕДАКТОР ПАРЫ живёт в СВОЕЙ кассе, а не в кассе оси: он куплен под гипотезу H-4 # ⚠ ВТОРОЙ РЕДАКТОР ПАРЫ живёт в СВОЕЙ кассе, а не в кассе оси: он куплен под гипотезу H-4
# («порядок жильцов — свойство пары»), а не под замер самой оси, и смешивать их потолки # («порядок жильцов — свойство пары»), а не под замер самой оси, и смешивать их потолки
# значит потерять границу того, что санкционировано подо что. E6 — ФД-G (en), J6 — ФД-H (ja). # значит потерять границу того, что санкционировано подо что. 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: def phase_of(arm: str) -> str:
@ -100,8 +100,8 @@ def phase_of(arm: str) -> str:
P = pair() P = pair()
if P.key == "zh-ru": if P.key == "zh-ru":
return "ФД-F" if arm.startswith("A6") else "ФД-A" return "ФД-F" if arm.startswith("A6") else "ФД-A"
if arm in ("E6", "J6"): if arm in ("E6", "J6", "JFLO"):
return {"E6": "ФД-G", "J6": "ФД-H"}[arm] return {"E6": "ФД-G", "J6": "ФД-H", "JFLO": "ФД-H"}[arm]
return {"en-ru": "ФД-B", "ja-ru": "ФД-C"}[P.key] return {"en-ru": "ФД-B", "ja-ru": "ФД-C"}[P.key]

View file

@ -130,6 +130,38 @@ def cmd_j6() -> None:
MONEY.report() 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: def cmd_bases() -> None:
wire() wire()
C.buy_bases("ФД-C", units(), PFX, "D0", "J0", DRAFT_MODEL, EDITOR, "ja-ru", _law, 0.006) 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__": if __name__ == "__main__":
a = sys.argv[1] if len(sys.argv) > 1 else "--dry" a = sys.argv[1] if len(sys.argv) > 1 else "--dry"
fn = {"--dry": cmd_dry, "--bases": cmd_bases, "--arms": cmd_arms, "--floor": cmd_floor, 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) "--selftest": lambda: sys.exit(1 if cmd_selftest() else 0)}.get(a)
fn() if fn else print(__doc__) fn() if fn else print(__doc__)

View file

@ -153,8 +153,13 @@ TAGS = {
# редактора glm-5 $0.0052 (замер по ФД-G на en) = $0.047; потолок $0.10 несёт запас на одну # редактора glm-5 $0.0052 (замер по ФД-G на en) = $0.047; потолок $0.10 несёт запас на одну
# перекупку усечённой клетки ($0.022 — замеренная цена годной клетки против пустой). # перекупку усечённой клетки ($0.022 — замеренная цена годной клетки против пустой).
# Z.AI, поэтому подорожание DeepSeek с 16.08 16:00 UTC этой строки НЕ касается. # 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, 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 PACK_CEILING = 6.85
M22.configure(ZONE=ZONE, OUT=OUT, TAGS=TAGS, CEILINGS=CEILINGS, M22.configure(ZONE=ZONE, OUT=OUT, TAGS=TAGS, CEILINGS=CEILINGS,