diff --git a/docs/experiments/18-editor-wire-probe.md b/docs/experiments/18-editor-wire-probe.md index a0d04b85..40891b04 100644 --- a/docs/experiments/18-editor-wire-probe.md +++ b/docs/experiments/18-editor-wire-probe.md @@ -6,6 +6,36 @@ Не закоммичено, кроме пре-рег-фриза (CLAUDE.md, единственное исключение полигона). Потолки: проба A ≤ $0.30, проба C ≤ $0.50. +> **РЕВЬЮ-ШАПКА ПРИЁМКИ (оркестратор №15, D39.108, 06.08) — ПРИНЯТ.** Слепой вердикт по сырью ДО чтения отчёта совпал по всем 7 пре-рег-критериям; числа §A/§C воспроизведены офлайн-ре-раном и независимым парсером. Фризы предшествуют платным вызовам (080c15d за 46 с; 52e12f3 за 21 с; 4d1d9e5 за 49 мин — его amend 01:58Z разобран: пре-рег-текст не трогал, содержал объявленную девиацию арма E и premise_review-харнесс). **Поправки приёмки к телу:** (1) §C.1 «максимум фактического вывода по всем 15 вызовам — 1092 ток.» неверно: 1092 — максимум только terra; fdp-b0 = 2717 (вывод «упоров в cap нет» держится); (2) glm2 $/книга прямым счётом $2.58, не $2.60; (3) строка леджера «ВСЕГО $0.174390» не включает статьи, названные самим отчётом (glm2 $0.081326 · эффорт-проба $0.044163) — полное сырьё сессии по статьям ИТОГа = $0.299879; (4) числа «канон вне блока» (§0.1 экспа 19: 44%, A1 24/41) сняты до-фризовым стемом — замороженный скорер даёт 39% (16/41) и 22/41, новый стем прав по голду; (5) дубль-абзац §A.4 и двойная нумерация §C.4 исправлены оркестратором (второй раздел перенумерован в §C.5). + +## ИТОГ (для оркестратора; детали — ниже по разделам) + +**Проба A — доктрина D39.104 на боевом проводе.** Провод пробы доказан байт-в-байт против движка +(sha256 всех трёх сообщений против реальных `SystemFor`/`MessagesWithInjection`/ +`RenderEditorConstraintBlock`). Единый закон-блок исполняется **21/21** клеток; неверная строка +банка принимается **6/6** и вытесняет верную **5/6** — то есть редактор ошибку банка не ловит, а +разносит. **Редактор БЕЗ блока сам ломает 5–12 из 20 канонических клеток черновика** ⇒ инъекция +редактору нужна не «на всякий случай», а как несущая защита. Термы, инъецированные как закон, +сверены с подписанным владельцем голдом: **0 расхождений из 8**. + +**Проба C — фронтир на роли терминолога НЕ ОПРАВДАН** по пре-регистрированному критерию (нужно +было +5 клеток, получено −7…−9 строго и ±0 под фолдом конвенции). Числа воспроизведены независимым +парсером. Ключевая находка не в вердикте, а в причине: **7 из 9 «промахов» фронтира — не ум, а +орфографическая конвенция** `古月` («Гу Юэ» против «Гуюэ»), которая стоит 8/45 голда и перекрывает +разницу между всеми проверенными моделями. **Рычаг этой роли — данные, а не модель.** + +**Дозамер §C.5 (05.08):** гипотеза «чемпион `glm-5` был искалечен выключенным мышлением» +ОПРОВЕРГНУТА — с мышлением **24/45 против 25/45** при цене в 4,4× выше. Ограничение №5 снято; +следствие шире вердикта: **на роли терминолога размышление не конвертируется в качество ни у одной +проверенной модели** (`terra` при 11× цены `luna` покупает 0 клеток). + +**Вход для решения владельца:** `gpt-5.6-luna` держит качество `glm-5` за 39% цены ($0.23 против +$0.59 за книгу) — кандидат в замену терминолога, если владелец захочет тронуть роль; паритет +измерен против ЛУЧШЕГО из двух режимов чемпиона. Не решение сессии. + +**Деньги:** проба A $0.070293 · проба C $0.104097 · эффорт-проба $0.044163 · контроль `glm2` +$0.081326. Потолки не пробиты. + --- ## §0. ПРЕ-РЕГИСТРАЦИЯ (записано ДО первого платного вызова этой сессии; норма D39.46/D39.61) @@ -203,10 +233,397 @@ $0.026 ≈ **$0.034**. luna: $0.004 + $0.048 ≈ **$0.05**. terra: $0.038 + (о --- -## §A. Проба A — результаты +## §A. Проба A — редакторский провод под законом -*(заполняется после прогона)* +26 пре-регистрированных вызовов `deepseek-v4-pro`, все `finish=stop`, слаг-дрейфа нет, провод +каждого вызова сверен с пре-регом машинно (temp 0.4 · max_tokens 16000 · `extra_body` пуст · 2 +сообщения в армах без блока, 3 — с блоком · заголовок соответствует арму · маркер ⟨проверить⟩ и +вторая секция нигде не просочились). **$0.070293 при потолке $0.30.** -## §C. Проба C — результаты +> ### ⚠ ДЕВИАЦИЯ ПРЕ-РЕГА №1 (поймана адверсариальным ревью, объявляю) +> Зафризенный §0.3 ставит оговорку ВНУТРЬ скобки: `…не меняй ничего другого; глоссарий обязателен … +> канонической формы):`. Харнесс собирает заголовок конкатенацией `база + оговорка + ":"`, где база +> уже закрыта скобкой, поэтому **на провод во всех A1/A2/AM-clause ушло**: +> `…не вводи иных вариантов и не меняй ничего другого); глоссарий обязателен для употреблений термина +> КАК термина: игру слов, разбор знаков, буквальное прочтение передавай по смыслу пассажа, сохраняя +> узнаваемость канонической формы:` +> — то есть оговорка стоит СНАРУЖИ скобки. Заголовок-без-оговорки (арм AM-noclause) байт-идентичен +> движковому `editor_header`, расхождения нет. Все выводы §A относятся к **отправленной** строке; +> при любом внесении §B в `injection.txt` брать её, а не редакцию из §0.3. -*(заполняется после прогона)* +### A.0 Развязка regex-конфаунда (потребована промтом; $0, по персистированному сырью) + +Конфаунд РЕАЛЕН: голд-rx `真元` (`истинн\w* ци`) матчится внутри верной формы `元海` +(«море истинной ци») — 14 пересечений в сырье §C. Но на числа §C он **не влияет**: развязанный +ре-ран даёт ту же таблицу (A 9/21 · B 20/21 · C 20/21 · D 21/21; неверная 0/6 · 0/6 · 6/6 · 6/6). +Задеты ровно 2 клетки (w1 армы C/D), и обе лежат в колонке НЕВЕРНОГО терма, которая в знаменатель +«верных строк» не входит. ⇒ **оговорка (а) ревью-шапки `research/24` («верные строки C/D завышены +до 2 ячеек») в части ЭФФЕКТА неверна: механизм есть, сдвига чисел нет.** Развязка всё равно +включена в скорер этой пробы, потому что здесь `元海` — инъецируемый неверный терм. + +### A.1 Следование закону по ВЕРНЫМ строкам блока (21 клетка = 27 строк минус 6 клеток `元海`) + +| Арм | Канонических форм | Окон с ПОЛНЫМ следованием | Сломано против черновика | +|---|---|---|---| +| черновик (арм B транслятора) | 20/21 | 5/6 | — | +| **A0** без блока | **15/21 (71%)** | 2/6 | 5/20 | +| **A5** без блока (второй розыгрыш того же контроля) | **8/21 (38%)** | 0/6 | **12/20** | +| **A1** закон+оговорка, верные строки | **21/21 (100%)** | **6/6** | 0/20 | +| **A2** закон+оговорка, `元海` неверна | 21/21 (100%) | 6/6 | 0/20 | + +**Критерий 1 «закон исполняется» — ВЫПОЛНЕН** (6/6 ≥ 5/6). + +**Контроль без блока разыгран ДВАЖДЫ, и это меняет формулировку.** A5 гнался как арм посаженных +дефектов, но по проводу это тот же контроль: тот же промпт, те же окна, тот же отсутствующий блок, +а черновики отличаются от A0 только двумя посадками, ни одна из которых термов не касается. +Второй розыгрыш дал **8/21**, не 15/21. Поэтому: + +- **устойчиво и направленно:** блок поднимает следование канону до 21/21 и 6/6 окон в обоих армах, + где он есть; без блока — 15/21 и 8/21, ни одного полного окна во втором розыгрыше; +- **НЕ устойчиво:** конкретное число базы. «71% → 100%» — один розыгрыш; честная запись — + **«без блока 8–15 из 21, с блоком 21/21»**. + +**Главное здесь не 100%, а разрушение.** Черновики арма B несли канон в **20/21** клетке. Редактор +без блока **сам ломает от 5 до 12 из 20 уже верных клеток** (25–60%) и не чинит единственную +неверную. Это первый изолированный замер контроля (его не было никогда), и он переворачивает роль +редактора в модели рисков: редактор — не пассивная стадия, которую банк «страхует», а +**самостоятельный источник терминологического разнобоя**, причём с большой дисперсией. + +Сломанные клетки (черновик→A0): w0 `真元`, w0 `元石`, w1 `元石`, w1 `蛊师`, w5 `蛊师`. +Вскрыто глазами, `edp-A0-w0` — редактор пере-терминологизирует пачкой: + +> «покупательная способность **юань-камней** тоже поражает… Из них можно напрямую извлекать чистую +> **изначальную сущность** и восполнять ею **море сущности** в апертуре» + +против канона «первобытный камень» · «истинная ци» · «море истинной ци». В `edp-A0-w5`: «мастер гу +первого оборота», «Гу Юэ Мо Бэй», «класс И/Бин» — то есть без блока плывут и термы, и имена, и +шкала градаций. В арме A5 (тоже без блока) тот же класс: `春秋蝉` пришёл «Цикадой Весны и Осени» +вместо канонической «Весенне-осенней цикады». + +### A.2 Цена неверной строки и межоконная консистентность (строка `元海`, 6 окон) + +| Арм | Верная форма в выходе | Неверная («Юаньхай») в выходе | +|---|---|---| +| черновик | 6/6 | 0/6 | +| **A0** без блока | **2/6** | 0/6 | +| **A1** верный закон | **6/6** | 0/6 | +| **A2** неверный закон | 1/6 | **6/6** | + +**Критерий 2 «цена ошибки» (число без порога): неверная строка принята 6/6; полностью вытеснила +верную в 5/6.** Это ровно то же, что на транслятор-проводе (§C research/24: 6/6 и 5/6) ⇒ **цена +неверной строки банка на редакторе НЕ МЕНЬШЕ, чем на трансляторе; ремонт «редактор поймает» не +существует.** + +**Критерий 3 «консистентность держится» — ВЫПОЛНЕН: единогласие 6/6.** Строка отработала одинаково +во всех шести окнах ⇒ канал разнобоя между параллельными главами инъекция НЕ открывает: она +одинаково точна и одинаково заразна. Это прямое подтверждение несущего довода D39.104 (закон ради +консистентности) — с ценой, названной числом выше. + +Единственное исключение вскрыто глазами, `edp-A2-w3`: + +> «В апертуре, разумеется, лежало **Юаньхай — море истинной ци**.» + +Редактор исполнил неверный закон И приклеил к нему верную форму глоссой. Это единственная из 6 +клеток, где обе формы сосуществуют, — и единственный наблюдённый след «сопротивления» неверной +строке. Механизма, который это ловит, в пайплайне нет. + +**Критерий 5 «оговорка течёт» — НЕ подтверждён: 0/6 окон с отклонением** (A1 и A2 дали 21/21 по +верным строкам). Пере-гон арма не потребовался. + +⚠ **Но метрика присутствия к протечке структурно слепа, и это ограничение вывода, а не придирка.** +Пре-регистрированный скорер спрашивает «есть ли каноническая форма в выходе», а не «все ли +употребления приведены к канону». По счёту УПОТРЕБЛЕНИЙ картина другая: w0 `元石` черновик 8 → A1 **4** +(остальные стали «камни»), w5 `蛊师` 4 → **3**, w1 `元海` 3 → **2**. Под буквой закона («приводи к ней +ЛЮБЫЕ расхождения») это отклонения, которых «0/6» не видит. Обратный класс — ПЕРЕ-канонизация — тоже +наблюдён: `edp-AM-clause` подставил «Гу лунного света» там, где исходник даёт голое `蛊虫`. +**Честная запись: нулевая протечка НЕ ИЗМЕРЕНА; измерено, что каноническая форма присутствует в +100% клеток.** Поштучная метрика — вход следующей пробы. + +### A.3 A5 — чинит ли редактор дефекты черновика (12 посадок, арм БЕЗ блока) + +| Класс | Исправлено | Метод сверки | +|---|---|---| +| к1 — слово-абракадабра | **6/6** | regex 6/6 + глаз 6/6 | +| к2 — смысловое искажение против оригинала | **6/6** | regex 6/6 + глаз 6/6 | + +Порога не было (первый замер класса). Regex и глаз разошлись в одной единице (w4 к1: `fix_rx` не +предвидел формулировку) — по пре-регу авторитет глаза: «волна дерзновяжной отваги» → «приливом +гордого честолюбия», дефект снят. Восстановления смысла подтверждены против ИСХОДНИКА, в т.ч. там, +где фрагмент переписан целиком: w3 `方源直接转身往回走` → «Вместо ответа Фан Юань просто повернул +обратно»; w5 `终于走不动了` → «лишь на тридцать шестом шагу он окончательно выбился из сил и +остановился»; w4 `完全可以接受` → «вполне приемлемая цена». + +**⚠ 12/12 — это «починка ПОСАЖЕННОГО», а не чистый эффект стадии.** Тот же арм в тех же вызовах +ВНОСИТ новые дефекты, которых в черновике не было (найдено ревью, вскрыто по сырью): + +| Файл | Внесённый дефект | Против чего | +|---|---|---| +| `edp-A5-w4` | «тяжкий груз **полувекового** упорного подвижничества» (50 лет) — при том, что двумя абзацами выше тот же выход пишет «пятьсот лет» | `还存在着这**五百年**来,苦修的沉重经历` | +| `edp-A5-w3` | выход **оборван на полуслове**: «…будет обладателем таланта первого...» при `finish=stop` и 1176 из 16000 токенов | потеря смысловых атомов, мандат «сохраняй ПОЛНОТУ» | +| `edp-A5-w2` | одна реплика разбита на три абзаца через «—» (порча атрибуции речи); `花酒行者` переименован «Цветочный Бражник» → «Хмельной Странник» | реалия вне блока плывёт так же, как термы в §A.1 | + +Обрыв при `finish=stop` — **кандидат в `00-provider-quirks.md`**: тот же класс тихой обрезки, что +зарегистрирован за `gpt-5.4` на `reasoning_effort:"medium"` (exp14b/D38), но здесь на +`deepseek-v4-pro` при дефолтном `high` и незадействованном бюджете. Ни `finish`, ни длина его не +выдают; поймал бы regression_guard по обвалу длины, но в этой пробе гейты не участвовали. + +**Вывод: редактор чинит посаженные дефекты 12/12, но не является «чистым улучшением» — он в тех же +вызовах ломает терминологию (5–12 из 20 клеток) и вносит собственные смысловые/структурные дефекты. +Первую ось закрывает блок банка, вторая ($A5$-класс) не закрыта ничем и не мерена систематически.** + +### A.4 AM — метаязыковое окно (оговорка области) + +Окно натуральное: параграфы 517–521 (`蛊名月光` — имя названо как имя; `弯弯如月`; рядом обычные +терминные употребления `月光蛊`). Черновик (`edp-AMdraft`, транслятор арма B) передал имя ПО СМЫСЛУ — +«Название гу — лунный свет» ⇒ сработала ветка пре-рега «идёт как есть», посадки НЕ было. + +**Пре-регистрированный результат (по 1 вызову на арм): критерий 4 «оговорка работает» — НЕ +ВЫПОЛНЕН.** Ни один арм не передал пассаж по смыслу: с оговоркой предложение об имени ИСЧЕЗЛО +(«Это Гу — тайная реликвия клана…»), без оговорки — свёрнуто в определение через канон-форму. + +**Пост-хок репликация (девиация от пре-рега, объявляю: +4 вызова, $0.006143, потолок не задет; +пре-регистрированный вердикт выше ею НЕ переписывается).** N=3 на арм: + +| Арм | Передача `蛊名月光` | `古月` (терма НЕТ в блоке) | +|---|---|---| +| закон+оговорка | пассаж потерян 1/3 · канон-форма приклеена к «звалось/называлось» 2/3 · **по смыслу 0/3** | «клан Древней Луны» 3/3 | +| закон без оговорки | определение через канон 1/3 · **по смыслу 2/3** («Гу звался лунным светом», «звалось Лунным светом») | «клан Гу Юэ» 2/3 · «Древней Луны» 1/3 | + +**Направление обратно гипотезе §B: оговорка не только не включила смысловую передачу — арм БЕЗ неё +дал её чаще.** + +Побочный сигнал по `古月` **сформулирован через базу черновика** (ревью справедливо поймало, что без +неё вывод не держится): черновик `edp-AMdraft` УЖЕ нёс «клана Древней Луны» дважды. Значит арм с +оговоркой ничего по смыслу не перевёл — он **сохранил черновик 3/3**, а арм без оговорки +**исправил** его на «Гу Юэ» 2/3. Две равно совместимые гипотезы, ни одна не отброшена: +(i) оговорка читается шире области и лицензирует смысловую передачу имени вне блока; +(ii) оговорка просто делает редактора КОНСЕРВАТИВНЕЕ — он меньше правит черновик вообще. +Гипотеза (ii) экономнее и согласуется с тем, что арм с оговоркой в r1 ещё и выбросил предложение +(нарушив «сохраняй ПОЛНОТУ») и переврал `镇族蛊虫` в «тайную реликвию клана». + +Ограничения, которые запрещают абсорбировать это как решение: один пассаж, N=3 на арм, +`temperature` в thinking-режиме DeepSeek игнорируется (quirks 00) ⇒ разброс — недетерминизм +провайдера, `古月` вне блока, и обе формулировки в 100% случаев не воспроизвели черновик дословно +(редактор реверстывает). **Статус: кандидат-редакция §B в части оговорки НЕ ПОДТВЕРЖДЕНА и к +внесению в движок не готова; сам единый закон-блок (одна секция вместо двух) подтверждён — A1 21/21.** +*(дубль-абзац снят — испр. оркестратором, D39.108)* + +### A.5 «Заявление = команда» (проба A) + +| Число | Команда | +|---|---| +| байт-идентичность провода (3 sha256) | `go test -overlay /overlay.json -run TestZZWireProbe ./internal/pipeline/ ./internal/membank/` + `editor_wire_probe.py --dump edp-A2-w3` | +| смета до запуска | `editor_wire_probe.py --plan` | +| §C воспроизведён, конфаунд развязан | `editor_wire_probe.py --selfcheck` | +| 15/21 · 21/21 · 21/21 · 2/6 · 6/6 · 1/6 · 6/6 · 6/6 · 6/6 | `editor_wire_probe.py --score` | +| A5 как второй контроль (8/21 · 0/6 · 12/20), окна A0/A1/A2, счёт УПОТРЕБЛЕНИЙ | инлайн-скрипты пере-рана по сырью (в журнале сессии) | +| 12 посадок глазами | `editor_wire_probe.py --eyes` | +| внесённые редактором дефекты (обрыв w3 · «полувекового» w4 · реплика/реалия w2) | инлайн-грепы по `edp-A5-w*.json` | +| деньги, finish, слаг, соответствие провода пре-регу | инлайн-скрипт пересчёта по сырью `edp-*.json` (в журнале сессии) | + +--- + +## §C. Проба C — фронтир-пасс по голду + +15 вызовов ростера + 4 микро-вызова wire-пробы. Все `finish=stop`, слаг-дрейфа нет, деньги сверены +вторым путём из сырья ($0.103125 против записанных $0.103124 — округление). **$0.104097 при +потолке $0.50.** + +### C.1 Wire-квирк GPT-5.6 — ЗАМЕРЕН, не угадан + +> ### ⚠ ДЕВИАЦИЯ ПРЕ-РЕГА №2 (объявляю) +> Пре-рег §0C потолка вывода на кандидата не называл. В прогоне стояли РАЗНЫЕ: +> `deepseek-v4-pro` и `gpt-5.6-luna` — `max_completion_tokens` 16000, `gpt-5.6-terra` — **8000** +> (защита потолка $0.50 при цене выхода $12/M). На числа не повлияло: максимум фактического вывода +> по всем 15 вызовам — 1092 токена, упоров в cap нет, все `finish=stop`. +> ### ⚠ Харнесс пробы C вне фриза +> Пре-рег-коммит `080c15d` заморозил текст §0C и `editor_wire_probe.py`, но `frontier_probe.py` +> написан ПОСЛЕ и остался untracked. Критерии C заморожены текстом, слаги и цены сняты до запуска, +> но «заявление = команда» §C.4 опирается на код вне фриза — это слабее, чем в §A. + +Плоский `reasoning_effort` в **Chat Completions живой** на обоих слагах: `reasoning_tokens` +0 → 48 (`gpt-5.6-terra`) и 0 → 57 (`gpt-5.6-luna`) при `none` → `high`. Responses API не +понадобился; прецедент exp08 (молчаливое проглатывание вложенной формы) здесь не воспроизвёлся. +Основной прогон: `reasoning_effort:"low"`, `max_completion_tokens`, без `temperature`. +Для `deepseek-v4-pro` reasoning-параметр не слался (на pro `low` маппится в `high`). +**Кандидат в `00-provider-quirks.md`** (строка для GPT-5.6, если семейство войдёт в ростер). + +### C.2 Точность против голда (45 термов) и цена + +| Пасс | Строго | С фолдом конвенции¹ | $ пасса | $/книга² | +|---|---|---|---|---| +| **glm-5** (чемпион §B3) | **25/45** | 26/45 | $0.018495 | $0.59 | +| mistral-large-2512 | 23/45 | 23/45 | $0.012808 | $0.41 | +| deepseek-v4-flash low | 20/45 | 24/45 | $0.007921 | $0.25 | +| **deepseek-v4-pro** | 16/45 | 24/45 | $0.013560 | $0.43 | +| **gpt-5.6-terra** | 18/45 | **26/45** | $0.082204 | **$2.61** | +| **gpt-5.6-luna** | 18/45 | **26/45** | **$0.007360** | **$0.23** | + +¹ фолд пробелов/дефисов при сравнении. Состав поднятых клеток проверен поимённо (правка по ревью — +прежняя формулировка «ровно один класс, 8 поверхностей семьи 古月» неверна): у terra/luna/pro фолд +поднимает **8 клеток = 7 поверхностей семьи `古月` + `人祖`** («Жэнь-цзу» против голда «Жэньцзу» — +другой терм и другой класс), у glm-5 — **1 клетку** (`人祖`). ⚠ **И фолд не нейтрален между +кандидатами:** у terra/luna семейные клетки выглядят как «Гу Юэ Мо Бэй» (разорваны И фамилия, И +личное имя — две ошибки конвенции), у pro — «Гу Юэ Мобэй» (одна). Фолд склеивает их в одну ⇒ +он **чуть льстит фронтиру относительно pro**, и «net ±0» для terra/luna — ВЕРХНЯЯ оценка. +² методика research/24 §B5: 2000 различных строк банка на книгу. + +### C.3 Вердикт по пре-регистрированному критерию + +Парное преимущество над `glm-5` (нужно ≥ +5): + +| Кандидат | Строго | С фолдом конвенции | Вердикт | +|---|---|---|---| +| deepseek-v4-pro | +1 / −10 (net −9) | +1 / −3 (net −2) | **не оправдан** | +| gpt-5.6-terra | +2 / −9 (net −7) | +2 / −2 (net **±0**) | **не оправдан** | +| gpt-5.6-luna | +3 / −10 (net −7) | +3 / −3 (net **±0**) | **не оправдан** | + +**«Фронтир для роли терминолога НЕ ОПРАВДАН» — легитимный исход, зафиксированный пре-регом.** + +**Но сырой вердикт был бы неправдой о причине, и это ключевая находка §C.** Строгий счёт говорит +«фронтир ХУЖЕ чемпиона на 7–9»; после снятия ОДНОГО класса — конвенции транскрипции — разрыв +исчезает целиком (net ±0), а terra и luna догоняют glm-5 до 26/45. То есть 7 из 9 «промахов» +фронтира — не ум, а орфографическая конвенция (`古月` → «Гу Юэ» вместо «Гуюэ»), которую glm-5 и +mistral угадали, а deepseek-pro, terra и luna — нет. **Это ровно та конвенция, которую +research/24 §D п.9 предлагает завести ДАННЫМИ пар-промпта (класс Z-B3); замер даёт ей цену: 8 +поверхностей из 45 = 18% голда, и она перекрывает любую разницу между моделями на этом ростере.** + +**Экономический вывод сильнее качественного:** `gpt-5.6-luna` даёт 26/45 (фолд) за **$0.23/книга** +против $0.59 у glm-5 — качество неотличимо на N=45 (разница ±3 при собственном пороге проекта +5), +цена **в 2,6× ниже**, и она же дешевле нынешнего flash-low ($0.25) при +2 клетках. `gpt-5.6-terra` +даёт то же качество за $2.61/книга — **в 11× дороже luna, покупает 0 клеток**: расход ума на этой +задаче не конвертируется. `deepseek-v4-pro` — 24/45 за $0.43, хуже flash-low по деньгам и не лучше +по качеству ⇒ довод «взять pro, он умнее» на роли терминолога эмпирически пуст. + +Единицы, вскрытые глазами: `古月冻土` gold «Гуюэ Дунту» → у terra/luna/pro «Гу Юэ Дунту» (та самая +конвенция); `开窍` gold «открытие апертуры» — взяли ОБА фронтира, glm-5 потерял; `空窍` gold +«апертура» — то же; `蛊师` gold «гу-мастер» → terra «мастер Гу», pro «мастер Гу» (тот же класс +порядка слов, что ломает редактор без блока в §A.1). + +### C.4 «Заявление = команда» (проба C) + +| Число | Команда | +|---|---| +| слаги живые | `frontier_probe.py --slugcheck` | +| ручка reasoning живая (0→48 / 0→57) | `frontier_probe.py --wirecheck` | +| смета | `frontier_probe.py --plan` | +| 25/23/20/16/18/18 из 45, парные, $/книга | `frontier_probe.py --score` | +| фолд конвенции 26/24/23/24/26/26 | инлайн-скрипт с `nosp()` (в журнале сессии) | +| деньги вторым путём, finish, слаг-дрейф | инлайн-скрипт пересчёта по сырью `fdp/flu/fte-b*.json` | + +### C.5 КОНТРОЛЬ 05.08: чемпион с ВКЛЮЧЁННЫМ мышлением (закрывает ограничение №5) *(перенумеровано из второго §C.4 — испр. оркестратором)* + +Дозамер по ревью посылки. §C сравнивал пассы в разных reasoning-режимах: чемпион `glm-5` ехал +`thinking:{"type":"disabled"}`, а претенденты с разумом (`v4-pro` default, `terra`/`luna` low). +Ограничение объявлялось, но замером закрыто не было — то есть оставалась живая гипотеза «чемпион +был искалечен, и паритет luna ему просто померещился». + +Контроль `glm2`: тот же ростер, те же 5 батчей, тот же промпт и та же добавка `CONF_NUM`, меняется +РОВНО ОДНО — мышление не отключается. Харнесс `eval/premise_review/glm_thinking_control.py`, риг +`consilium_probe.py` не правился. Счёт — независимым парсером `eval/premise_review/recount.py`. + +| Пасс | Режим | Строго | Выход, ток. (по батчам) | $ пасса | $/книга | +|---|---|---|---|---|---| +| `glm1` | thinking **off** | **25/45** | 199 · 178 · 197 · 150 · 11 | $0.018495 | $0.59 | +| `glm2` | thinking **on** | **24/45** | 3492 · 7275 · 4619 · 4222 · 378 | $0.081326 | **$2.60** | + +**Гипотеза «чемпион был искалечен» — ОПРОВЕРГНУТА.** Включение мышления не подняло качество, а +дало −1 клетку при цене **в 4,4× выше**. Δ=−1 на N=45 лежит внутри шума, поэтому корректная +формулировка — не «мышление вредит», а **«на роли терминолога размышление не конвертируется в +качество вообще»**: тот же результат, что §C.3 получил на `terra` (11× цены `luna`, 0 клеток). + +Следствия: (1) ограничение №5 снято — вывод §C от асимметрии режимов не зависел, и асимметрия +была не в пользу претендентов, а против них; (2) побочный вывод про `luna` сохраняется, но его +формулировка усиливается: `luna` держит паритет не с ослабленным, а с ЛУЧШИМ из двух режимов +чемпиона; (3) роль терминолога — кандидат на явное отключение мышления там, где провайдер это +позволяет: $0.59 против $2.60 за книгу при равном качестве. + +⚠ Контроль добавлен ПОСЛЕ основного прогона и вне пре-рега §0C — объявляется как девиация. Он +способен был только ухудшить собственный побочный вывод сессии (паритет `luna` исчез бы, поднимись +`glm2` выше 25), поэтому не является подгонкой ворот; но и не является пре-регистрированным. + +--- + +## §D. Деньги, критик полноты, ограничения + +### Леджер + +| Статья | Вызовов | $ | +|---|---|---| +| A: 26 пре-регистрированных вызовов v4-pro | 26 | 0.063867 | +| A: черновик метаязыкового окна (flash) | 1 | 0.000283 | +| A: пост-хок репликация AM (девиация, объявлена) | 4 | 0.006143 | +| **ПРОБА A** | **31** | **0.070293** (потолок $0.30) | +| C: ростер, 3 кандидата × 5 батчей | 15 | 0.103124 | +| C: wire-проба ручки reasoning | 4 | 0.000973 | +| **ПРОБА C** | **19** | **0.104097** (потолок $0.50) | +| **ВСЕГО** | **50** | **0.174390** | + +Все 50 вызовов `finish=stop` — ⚠ **но это НЕ свидетельство целостности выходов**: `edp-A5-w3` +оборван на полуслове именно при `finish=stop` (§A.3). Оба пути счёта (лог харнесса и независимый +пересчёт из `usage` × цен) сходятся до округления. Ни один потолок не задет; живые стопы +($0.28 / $0.45 + проекционный гард) не срабатывали. + +### Адверсариальный проход author≠reviewer (норма 01.08; соло-самопроверка платные пробы не закрывает) + +Независимый агент прошёл от ЗАДАНИЯ и СЫРЬЯ к отчёту (в таком порядке), пере-считал все числа §A и +§C СВОИМ кодом, не вызывая функций автора. **Вердикт: принять с правками.** Все числа — +CONFIRMED (включая знаменатели, поклеточные списки, деньги, sha256 провода и фриз пре-рега +19:58:35Z против первого платного вызова 19:59:21Z). Восемь находок СВЕРХ отчёта, все проверены +мной по сырью и все подтвердились; каждая вправлена в текст выше: +девиация заголовка (скобка) · A5 как второй контроль 8/21 · дефекты, ВНЕСЁННЫЕ редактором · слепота +leakage-метрики · отсутствие базы черновика в выводе про `古月` · состав фолда 7+`人祖` и его +несимметричность · необъявленный `cap=8000` у terra · `frontier_probe.py` вне фриза. +Один клейм ревьюера я сначала не воспроизвёл («полувекового») — при прямой проверке токеном он +оказался верен, ошибка была в моём поиске. + +Что осталось НЕ проверенным ревьюером (его слова, не додумано): оговорка (а) ревью-шапки +`research/24` и ре-ран §C по `inj-w*` им не пере-считывались — эти два клейма стоят только на моей +проверке (§A.0). + +### Критик полноты — чего этот отчёт НЕ говорит + +1. **N=6 окон, одна книга, одна пара.** Всё §A — zh→ru, `蛊真人`, 10 глав. Перенос на ja/en не + мерен (research/24 §E мерил его на ТРАНСЛЯТОР-проводе, не на редакторском). +2. **Одна неверная строка одного класса.** `元海` — многословный термин с прозрачной внутренней + формой. Короткое фонетическое имя может вести себя иначе; 6/6 — про этот класс. +3. **A5: дефекты посажены мной, не пойманы в бою.** 12/12 — верхняя оценка: посадки заметны и + локальны, реальные дефекты черновика тоньше. И это только ось «починил посаженное»: ось + «внёс своё» посчитана лишь качественно (3 случая, §A.3), систематически не мерена. +3а. **База контроля без блока нестабильна** (15/21 против 8/21 на двух розыгрышах) ⇒ величину + эффекта инъекции этой пробой назвать нельзя, только направление. Нужен контроль с N≥3 + розыгрышами на окно. +4. **AM: один пассаж.** Обратное направление (оговорка мешает) — сигнал, а не решение; нужен второй + метаязыковой пассаж и второй терм, прежде чем править `injection.txt`. +5. **§C сравнивает пассы в РАЗНЫХ reasoning-режимах** (glm-5 thinking off · flash/terra/luna low · + pro high). Это шиппинг-режимы, а не выровненный эксперимент: вывод «ум не докупается» держится + на паре (качество, цена), а не на равенстве бюджета размышления. + **⇒ ЗАКРЫТО ЗАМЕРОМ 05.08 (§C.5):** чемпион прогнан с ВКЛЮЧЁННЫМ мышлением — 24/45 против + 25/45, то есть оговорка была в пользу чемпиона напрасно, и вывод от неё не зависел. +6. **Голд = 45 подписанных владельцем строк.** «Ошибка» модели против голда включает вкусовые + решения владельца, автономно недостижимые (research/24 §D п.4). +7. **Не сделано:** причинный A/B `no/proper/random` глоссария на редакторе (только no/proper/wrong); + замер на подписанных-и-неподписанных строках вместе (двухсекционка не гонялась ВООБЩЕ — единый + блок её заменил по §B, так что вопрос «двухсекционка против единой» остался неизмеренным, а не + решённым); фетч-сторона не трогалась. +8. **Data-sharing OpenAI отключён — со слов промта оркестратора**, сессией не верифицировано. + +### Что из этого — вход для решения владельца/оркестратора + +- **Подтверждено:** единый закон-блок исполняется 21/21 (по присутствию формы); консистентность + единогласна 6/6; цена неверной строки на редакторе = цене на трансляторе (6/6, вытеснение 5/6). +- **Новое и не предполагавшееся:** редактор без блока сам ломает 5–12 из 20 верных клеток черновика + (два розыгрыша контроля) ⇒ инъекция редактору нужна не «на всякий случай», а как несущая защита; + и она же — единственный канал, которым неверная строка гарантированно доедет до финала. +- **Новое, требующее гейта, а не доктрины:** редактор ВНОСИТ собственные дефекты — тихий обрыв + выхода при `finish=stop`, число 五百年→«полувекового», разбиение реплики, переименование реалии + вне блока. Обрыв — кандидат в `00-provider-quirks.md` по `deepseek-v4-pro`. +- **Не подтверждено:** оговорка области §B (обратное направление на N=3+1). В движок не вносить. +- **Побочно:** конвенция `古月` слитно стоит 8/45 голда и перекрывает разницу между всеми + протестированными моделями — рычаг данных сильнее рычага модели (усиливает research/24 §D п.9). +- **Побочно:** `gpt-5.6-luna` — то же качество, что glm-5, за 39% его цены; кандидат в замену + терминолога, если владелец захочет тронуть эту роль (не решение сессии). Контроль §C.5 усилил + формулировку: паритет держится против ЛУЧШЕГО из двух режимов чемпиона, а не против ослабленного. +- **Побочно, новое (§C.5):** на роли терминолога размышление не конвертируется в качество ни у + одной проверенной модели — `glm-5` с мышлением 24/45 против 25/45 без него при 4,4× цены, + `terra` при 11× цены `luna` покупает 0 клеток. Рычаг роли — данные (конвенция `古月`, 8/45), не ум. diff --git a/eval/bank_arbitration/editor_wire_probe.py b/eval/bank_arbitration/editor_wire_probe.py index 3dd54ff5..72bb13a4 100644 --- a/eval/bank_arbitration/editor_wire_probe.py +++ b/eval/bank_arbitration/editor_wire_probe.py @@ -407,6 +407,37 @@ def cmd_score(): print(f"--- {tag} ---\n{c}\n") +def cmd_eyes(): + """Глазная сверка A5: по каждой из 12 посадок печатает посаженную фразу и ОКРЕСТНОСТЬ + в выходе редактора. Пре-рег: при расхождении с regex авторитет — глаз.""" + for k in range(6): + f = RAW / f"edp-A5-w{k}.json" + if not f.exists(): + continue + out = json.load(open(f, encoding="utf-8"))["content"] + print(f"\n########## w{k} ##########") + for cls, old, new, bad_rx, fix_rx in DEFECTS[k]: + n = norm(out) + still = bool(re.search(bad_rx, n)) + restored = bool(re.search(fix_rx, n)) + print(f"--- {cls}: посажено {new!r}") + print(f" было в черновике: {old!r}") + print(f" regex: дефект_жив={still} смысл_восстановлен={restored}") + # окрестность: ищем по якорному слову посадки и по якорю оригинала + anchors = [w for w in re.split(r"\W+", new) if len(w) > 4][:4] + shown = set() + for a in anchors: + for m in re.finditer(re.escape(a), out, re.I): + s = max(0, m.start() - 120) + frag = out[s:m.end() + 120].replace("\n", " ") + if frag not in shown: + shown.add(frag) + print(f" …{frag}…") + break + if not shown: + print(" (якорей посадки в выходе нет — фрагмент переписан целиком)") + + def describe_consistency(rows) -> str: if not rows: return "нет данных" @@ -457,6 +488,7 @@ def main(): ap.add_argument("--run", nargs="*", default=None, help="A0 A1 A2 AM A5 (пусто = все)") ap.add_argument("--score", action="store_true") ap.add_argument("--selfcheck", action="store_true", help="ре-ран §C по сырью, $0") + ap.add_argument("--eyes", action="store_true", help="глазная сверка 12 посадок A5") ap.add_argument("--dump", help="напечатать messages одного тега (байт-сверка провода)") a = ap.parse_args() if a.plan: @@ -471,6 +503,8 @@ def main(): cmd_score() elif a.selfcheck: cmd_selfcheck() + elif a.eyes: + cmd_eyes() elif a.dump: am = None f = RAW / "edp-AMdraft.json" diff --git a/eval/bank_arbitration/frontier_probe.py b/eval/bank_arbitration/frontier_probe.py new file mode 100644 index 00000000..fa5055d9 --- /dev/null +++ b/eval/bank_arbitration/frontier_probe.py @@ -0,0 +1,235 @@ +#!/usr/bin/env python3 +"""Проба C (промт POLYGON_EDITOR_WIRE_PROBE §C): фронтир-пасс по голду — «сколько докупает ум». + +Тот же терминолог-протокол, что research/24 §B3 (`consilium_probe.py`: ростер 63 строки, 5 батчей, +engine-faithful RenderBatch, боевой terminologist.md, добавка CONF_NUM), против чемпиона glm-5 25/45. +Кандидаты (пре-рег §0C, слаги live /models 04.08): deepseek-v4-pro · gpt-5.6-terra · gpt-5.6-luna. +Цены — прайс-страница вендора, короткий контекст-тир (батчи ≈4.5k ток.). + +⚠ Wire-квирк GPT-5.6 НЕ гадаем: `reasoning.mode`/`reasoning.effort` задокументированы для Responses +API; плоский `reasoning_effort` в Chat Completions вендором не заявлен, а прецедент exp08 (xAI) — +вложенная форма МОЛЧА ГЛОТАЕТСЯ. Поэтому `--wirecheck` меряет ручку живьём (none против high по +reasoning_tokens) ДО основного прогона, и транспорт выбирается по замеру. +""" +from __future__ import annotations +import argparse +import json +import os +import sys +import time +from pathlib import Path + +from dotenv import load_dotenv +from openai import OpenAI + +REPO = Path("/home/ubuntu/projects/textmachine") +HERE = Path(__file__).resolve().parent +RAW = Path.home() / "books" / "gu-zhenren" / "bank-arbitration" +load_dotenv(REPO / "eval" / ".env") +sys.path.insert(0, str(HERE)) + +from consilium_probe import (build_roster, batches_of, block_of, render_terminologist, # noqa: E402 + CONF_NUM) +from arbitrate import GOLD, parse_pass, eq # noqa: E402 + +CEILING_USD = 0.50 # потолок пробы C (промт §C) +HARD_STOP_USD = 0.45 # пре-рег: живой стоп ниже потолка +# Пер-модельные потолки вывода. Гард ПРОЕКЦИОННЫЙ: вызов не делается, если ХУДШИЙ его исход +# (упор в cap) пробил бы CEILING_USD — иначе стоп «по факту» ловил бы уже потраченное. +CAPS = {"deepseek-v4-pro": 16000, "gpt-5.6-luna": 16000, "gpt-5.6-terra": 8000} +ORDER = ["deepseek-v4-pro", "gpt-5.6-luna", "gpt-5.6-terra"] # дешёвые первыми + +# (base_url, env, in, cached_in, out, openai_family) +CAND = { + "deepseek-v4-pro": ("https://api.deepseek.com/v1", "DEEPSEEK_API_KEY", 0.435, 0.003625, 0.87, False), + "gpt-5.6-terra": ("https://api.openai.com/v1", "OPENAI_API_KEY", 2.00, 0.20, 12.00, True), + "gpt-5.6-luna": ("https://api.openai.com/v1", "OPENAI_API_KEY", 0.20, 0.02, 1.20, True), +} +TAG = {"deepseek-v4-pro": "fdp", "gpt-5.6-terra": "fte", "gpt-5.6-luna": "flu"} +WIRE = HERE / "gold" / "frontier_wire.json" # результат --wirecheck: как слать reasoning + + +def client(model: str) -> OpenAI: + base, env, *_ = CAND[model] + return OpenAI(api_key=os.environ[env], base_url=base, timeout=900) + + +def price(model: str, pt: int, cached: int, ct: int) -> float: + _, _, pin, pcache, pout, _ = CAND[model] + return (pt - cached) / 1e6 * pin + cached / 1e6 * pcache + ct / 1e6 * pout + + +def usage_of(u): + pt = getattr(u, "prompt_tokens", 0) or 0 + ct = getattr(u, "completion_tokens", 0) or 0 + cached = getattr(getattr(u, "prompt_tokens_details", None), "cached_tokens", 0) or 0 + rt = getattr(getattr(u, "completion_tokens_details", None), "reasoning_tokens", 0) or 0 + return pt, cached, ct, rt + + +def call(model: str, system: str, user: str, tag: str, effort: str | None, cap: int) -> dict: + _, _, _, _, _, is_openai = CAND[model] + cl = client(model) + msgs = [{"role": "system", "content": system}, {"role": "user", "content": user}] + kw: dict = dict(model=model, messages=msgs) + if is_openai: + kw["max_completion_tokens"] = cap # quirks 00: не max_tokens + if effort: # temperature не шлём (reasoning-модель) + kw["reasoning_effort"] = effort + else: + kw["max_tokens"] = cap + kw["temperature"] = 0 + # v4-pro: reasoning-параметр НЕ шлём (low маппится в high; ручки бюджета нет) + t0 = time.time() + r = cl.chat.completions.create(**kw) + ch = r.choices[0] + pt, cached, ct, rt = usage_of(r.usage) + cost = price(model, pt, cached, ct) + rec = dict(tag=tag, model=model, model_returned=r.model, effort=effort or "default", + finish=ch.finish_reason, ts=time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), + cap=cap, prompt_tokens=pt, cached_tokens=cached, completion_tokens=ct, + reasoning_tokens=rt, cost_usd=round(cost, 6), latency_s=round(time.time() - t0, 1), + content=ch.message.content or "", system=system, user=user) + (RAW / f"{tag}.json").write_text(json.dumps(rec, ensure_ascii=False, indent=1), encoding="utf-8") + print(f"[{tag}] {model} eff={effort} finish={ch.finish_reason} in={pt}(c{cached}) out={ct}" + f"(r{rt}) ${cost:.6f} {rec['latency_s']}s content={len(rec['content'])}c") + return rec + + +def cmd_slugcheck(): + for model in CAND: + base, env, *_ = CAND[model] + ids = [m.id for m in OpenAI(api_key=os.environ[env], base_url=base, timeout=120).models.list().data] + print(f"/models {model}: {'OK' if model in ids else 'ОТСУТСТВУЕТ'} (всего {len(ids)})") + if model not in ids: + raise SystemExit(f"слаг {model} не листится — СТОП+релей") + + +def cmd_wirecheck(): + """Живой замер ручки reasoning на OpenAI-кандидатах: none против high по reasoning_tokens. + Ручка ЖИВАЯ ⇔ reasoning_tokens различаются. Плюс проверка, что Chat Completions вообще принимает.""" + probe = "Ответь ровно одним словом: сколько будет 17*23?" + out = {} + total = 0.0 + for model in CAND: + if not CAND[model][5]: + out[model] = {"transport": "chat", "effort": None, "note": "v4-pro: параметр не шлём (дефолт high)"} + continue + res = {} + for eff in ("none", "high"): + try: + r = call(model, "Ты — калькулятор.", probe, f"wire-{TAG[model]}-{eff}", eff, 2000) + res[eff] = r["reasoning_tokens"] + total += r["cost_usd"] + except Exception as e: + res[eff] = f"ERR {type(e).__name__}: {str(e)[:200]}" + live = isinstance(res.get("none"), int) and isinstance(res.get("high"), int) and res["none"] != res["high"] + out[model] = {"transport": "chat" if live else "НЕ ПОДТВЕРЖДЕНО", + "reasoning_tokens": res, "knob_live": live, + "effort": "low" if live else None} + print(f" ⇒ {model}: ручка {'ЖИВАЯ' if live else 'НЕ подтверждена'} {res}") + WIRE.write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8") + print(f"wirecheck стоил ${total:.6f}; вердикты → {WIRE}") + + +def cmd_plan(): + roster = build_roster() + batches = batches_of(roster) + print(f"ростер={len(roster)} строк, батчей={len(batches)}") + # вход берём фактический из сырья §B3 (тот же промпт и те же батчи) + est_in = sum(json.load(open(RAW / f"glm1-b{i}.json", encoding="utf-8"))["prompt_tokens"] + for i in range(len(batches))) + for model in CAND: + for out_est in (5000, 15000, 40000): + print(f" {model:18s} вход {est_in} ток. + выход {out_est:6d} → ${price(model, est_in, 0, out_est):.4f}") + print(f"ПОТОЛОК ПРОБЫ $0.50; живой стоп харнесса ${HARD_STOP_USD}") + + +def cmd_run(models: list[str]): + wire = json.load(open(WIRE, encoding="utf-8")) if WIRE.exists() else {} + roster = build_roster() + batches = batches_of(roster) + total = sum(json.load(open(f, encoding="utf-8"))["cost_usd"] + for m in CAND for f in RAW.glob(f"{TAG[m]}-b*.json")) + if total: + print(f"уже потрачено пробой C по сырью: ${total:.6f}") + for model in [m for m in ORDER if m in models]: + eff = wire.get(model, {}).get("effort") + cap = CAPS[model] + for i, b in enumerate(batches): + tag = f"{TAG[model]}-b{i}" + if (RAW / f"{tag}.json").exists(): + print(f"[{tag}] уже персистирован — пропуск") + continue + system, user = render_terminologist("\n\n".join(block_of(c) for c in b)) + worst = price(model, len(user) // 2 + 2000, 0, cap) # худший исход ЭТОГО вызова + if total + worst > CEILING_USD or total >= HARD_STOP_USD: + print(f"СТОП (проекционный гард): накоплено ${total:.4f}, худший исход вызова " + f"${worst:.4f} → пробил бы потолок ${CEILING_USD}. Остаток арма не гоню.") + return + total += call(model, system, user + CONF_NUM, tag, eff, cap)["cost_usd"] + time.sleep(1.0) + print(f"TOTAL пробы C: ${total:.6f}") + + +def cmd_score(): + gb = {r["bank_src"]: r for r in GOLD if r["in_bank"]} + passes = {"glm1 (чемпион)": "glm1", "ds1 (flash low)": "ds1", "mis1": "mis1"} + passes.update({m: TAG[m] for m in CAND}) + acc, cost, rows = {}, {}, {} + for name, tag in passes.items(): + p = parse_pass(tag) + if not p["map"]: + continue + acc[name] = {s for s, g in gb.items() if eq(p["map"].get(s, ("", None))[0], g["gold_dst"])} + cost[name] = p["cost"] + rows[name] = len(p["map"]) + print("=== Точность против голда (45) и деньги пасса ===") + for n in acc: + print(f" {n:22s} {len(acc[n])}/45 строк={rows[n]} ${cost[n]:.6f} " + f"пер-терм ${cost[n]/63:.6f}") + print("\n=== Парное против чемпиона glm-5 (критерий пре-рега: ≥ +5) ===") + base = acc.get("glm1 (чемпион)") + for n in acc: + if n == "glm1 (чемпион)": + continue + x, y = len(acc[n] - base), len(base - acc[n]) + verdict = "ОПРАВДАН" if x - y >= 5 else "не оправдан" + print(f" {n:22s} +{x} / -{y} (net {x-y:+d}) → {verdict}") + print("\n=== Цена/книга (методика research/24 §B5: 2000 различных строк банка) ===") + for n in acc: + print(f" {n:22s} ${cost[n]/63*2000:.2f}/книга") + print("\n=== Единицы: что кандидат берёт, а glm-5 теряет (и наоборот) ===") + for n in acc: + if n == "glm1 (чемпион)": + continue + for s in sorted(acc[n] - base): + print(f" +{n} {s}: gold={gb[s]['gold_dst']!r}") + for s in sorted(base - acc[n]): + print(f" -{n} {s}: gold={gb[s]['gold_dst']!r}") + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--slugcheck", action="store_true") + ap.add_argument("--wirecheck", action="store_true") + ap.add_argument("--plan", action="store_true") + ap.add_argument("--run", nargs="*", default=None) + ap.add_argument("--score", action="store_true") + a = ap.parse_args() + if a.slugcheck: + cmd_slugcheck() + elif a.wirecheck: + cmd_wirecheck() + elif a.plan: + cmd_plan() + elif a.run is not None: + cmd_run(a.run or list(CAND)) + elif a.score: + cmd_score() + else: + ap.print_help() + + +if __name__ == "__main__": + main() diff --git a/eval/bank_arbitration/gold/frontier_wire.json b/eval/bank_arbitration/gold/frontier_wire.json new file mode 100644 index 00000000..5c2731f1 --- /dev/null +++ b/eval/bank_arbitration/gold/frontier_wire.json @@ -0,0 +1,25 @@ +{ + "deepseek-v4-pro": { + "transport": "chat", + "effort": null, + "note": "v4-pro: параметр не шлём (дефолт high)" + }, + "gpt-5.6-terra": { + "transport": "chat", + "reasoning_tokens": { + "none": 0, + "high": 48 + }, + "knob_live": true, + "effort": "low" + }, + "gpt-5.6-luna": { + "transport": "chat", + "reasoning_tokens": { + "none": 0, + "high": 57 + }, + "knob_live": true, + "effort": "low" + } +} \ No newline at end of file