Land accepted editor-wire probe 18 with acceptance review header, frontier harness and gold, and section renumber fix
This commit is contained in:
parent
d2c20dbd18
commit
41cde9f54d
4 changed files with 715 additions and 4 deletions
|
|
@ -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 <scratch>/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), не ум.
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
235
eval/bank_arbitration/frontier_probe.py
Normal file
235
eval/bank_arbitration/frontier_probe.py
Normal file
|
|
@ -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()
|
||||
25
eval/bank_arbitration/gold/frontier_wire.json
Normal file
25
eval/bank_arbitration/gold/frontier_wire.json
Normal file
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue