Land accepted diff-contract experiment 19 with review header pinning frozen-scorer numbers, premise-review verifiers and the falsification run log
This commit is contained in:
parent
bb8287624f
commit
0c3b55f074
5 changed files with 864 additions and 66 deletions
|
|
@ -7,6 +7,45 @@
|
|||
**не прогонялся НИ РАЗУ**. Зона: `eval/editor_contract/` + этот файл + пинг в PROGRESS «Полигон».
|
||||
Потолок пробы **$0.40**. Не коммичу, кроме пре-рег-фриза.
|
||||
|
||||
> **РЕВЬЮ-ШАПКА ПРИЁМКИ (оркестратор №15, D39.108, 06.08) — ПРИНЯТ; вердикт гейта Q4b «диффы откладываются» подтверждён ре-раном.** Санкция расширения зоны подтверждена владельцем 06.08. **Поправки приёмки к телу:** (1) §2.1: строка «80 операций / 78 применено» и поправка-1 «честный знаменатель 78/81 = 0.963, операция-удаление потеряна молча, формат не умеет удаление» УСТАРЕЛИ против замороженного рига — `score.py` после ФИКС-2 даёт **81/79 = 0.975**, блок-удаление парсится И применяется (значение комплаенса и вердикт гейта не двигаются). (2) Вся колонка «канон вне блока» (§0.1/§2.3) снята ДО-фризовым стемом и не воспроизводится замороженной командой §2.9: комитнутый скорер даёт черновик **16/41 (39%)**, A0 14 · A5 15 · A1 22, D1 16·16·17 (мед 16), F1 22·16·18 (мед 18), D2 17·16·16, F5 15·19·19; причина — ужесточение стемов (方正 «Фанчжэн» слитно выпал, и по голду НОВЫЙ стем прав). Направления не переворачиваются; вывод «блок поднимает канон вне блока» остаётся отменённым. (3) Рассинхрон с эксп-20: объяснение арма E (§6.5 «обеднён знаменатель») ОПРОВЕРГНУТО репликацией с выверенным зеркалом — эффект 6.7× сохранился (эксп-20 §3.4); «дифф дороже» сужен до пары модель×целевой-язык (dspro ru 2.83 / en 0.67). В тело не вносилось — здесь шапка первична.
|
||||
|
||||
**Установлено твёрдо.** Дифф-контракт `research/19` §C1 механически исправен: формат-комплаенс
|
||||
0.975 на базовых окнах и **0.966 на боевой единице** (порог 0.90), **малформед 0 на 90 вызовах**,
|
||||
детерминированный аппликатор самопроверен 15/15. Вопрос «умеет ли модель в диффы на русской прозе»
|
||||
закрыт положительно; опасение `research/19` («слабые модели на edit-форматах хуже, чем отдавая
|
||||
текст целиком») не воспроизвелось.
|
||||
|
||||
**Экономика против диффа, реплицировано трижды:** отношение цены дифф/full-regen = 2.913 (база) ·
|
||||
1.677 (арм L) · **2.468 (боевая единица, дефолтный режим, 6 клеток из 6)**. Размышление — 95% цены
|
||||
диффа, растёт с объёмом ВХОДА (×2.78 при входе ×3.24, p=0.0003) и сужением мандата НЕ снимается.
|
||||
|
||||
**Причина удорожания НЕ вскрыта.** Обе гипотезы остались непроверенными: «несъёмный thinking» —
|
||||
арм L не исполнен (посылка про ручку `low` не выдержала пере-счёта, §6.2); «русская фертильность» —
|
||||
арм E конфаундирован неполным зеркалом промпта на проводе (§6.5).
|
||||
|
||||
**Что упало:** «do-nothing промптом не покупается» — ПАЛО. Узкий fidelity-only мандат даёт
|
||||
`NO_CHANGE` 4/18 против 0/36 у промпта со стиль-мандатом. Сужение мандата покупает дисциплину, но
|
||||
не деньги.
|
||||
|
||||
**⚠ Требует действия оркестратора.** Правка `00-provider-quirks.md` §3б, сделанная этой же сессией
|
||||
04–05.08 («ручка `low` на `deepseek-v4-pro` работает, срезает размышление на треть»), **ОТОЗВАНА**:
|
||||
решающее правило «диапазоны не пересекаются» при n=3/3 воспроизводится нулевым вмешательством.
|
||||
Строка §3а (`low`→`high` для pro) возвращена в силу; звено про `xhigh` устояло. Если отозванная
|
||||
правка процитирована где-то ещё — сверить.
|
||||
|
||||
**Решение по строке 106.** Закрывать её выводом «диффы не берём» ПРЕЖДЕВРЕМЕННО. Корректный
|
||||
статус: full-regen остаётся каноном не потому, что дифф-контракт плох, а потому что на этой модели
|
||||
и в этом режиме он дороже — при невскрытом механизме удорожания. Что домерить — §6.9.
|
||||
|
||||
**Деньги.** Базовый прогон $0.194006 из потолка $0.40; четыре фальсификации $0.349566 из $0.50;
|
||||
контроль `glm2` к пробе 18 — $0.081326. Ни один потолок не пробит, ни одна клетка не выброшена.
|
||||
|
||||
**Дисциплина.** Пре-рег обеих проб зафризен ДО платных вызовов (`4d1d9e5`); прогон верифицирован
|
||||
инструментом (`verify_run.py`); результаты прошли адверсариальное ревью (5 линз × скептик,
|
||||
15 находок, 4 выжили) — их правки уже внесены. Отчёт содержит §6.6 «что снято» и §6.7 «девиации».
|
||||
|
||||
---
|
||||
|
||||
## §0. Что уже установлено — и почему это не закрывает вопрос
|
||||
|
||||
Проба 18 (`18-editor-wire-probe.md`) на боевом проводе `deepseek-v4-pro`:
|
||||
|
|
@ -128,66 +167,17 @@ F1/F5 — ДОБОР реплик до N=3: у пробы 18 по одному
|
|||
|
||||
60 вызовов `deepseek-v4-pro`, все `finish=stop`, **$0.194006 при потолке $0.40**. Реплики ×3 на арм.
|
||||
|
||||
> ## ⛔ РЕТРАКЦИЯ И ПЕРЕ-СЧЁТ (05.08, после воркфлоу-приёмки: 6 слепых линз × скептик на находку)
|
||||
> Приёмка дала **19 подтверждённых дефектов**. Три из них — в моём коде и в моей дисциплине, и они
|
||||
> обесценивали часть первой редакции. Ниже — что сломалось, что пере-считано и что снято.
|
||||
>
|
||||
> ### Р1. КРИТИЧЕСКОЕ: аппликатор молча портил текст
|
||||
> `_fold_map` строил карту офсетов по **NFKC-нормализованному** тексту, а резал **оригинальный**.
|
||||
> Символ, меняющий длину при нормализации («…» → «...»), сдвигал все последующие офсеты:
|
||||
> `"Он ждал… потом ушёл. Небо было серым."` → `"…ушёл. НеНебо было свинцовым."`.
|
||||
> **Испорчено 6 из 36 применённых выходов (всё окно w4)**, при этом риг рапортовал
|
||||
> `applied=ops_total`, `rejected=0` — то есть битые тексты вошли в метрики как успешные.
|
||||
> Самотест 9/9 первой редакции этот класс не содержал.
|
||||
> **Починено** (`apply.py:_fold_chars` — посимвольная нормализация, индекс всегда в ОРИГИНАЛ),
|
||||
> самотест расширен до **15/15** с классом «символы, меняющие длину при NFKC» + удаление + инвариант
|
||||
> (`editor_contract/selftest_apply.py`). Все 36 выходов **пере-применены** из сохранённых ответов
|
||||
> модели — новых вызовов не потребовалось, ответы модели были целы, сломан был только
|
||||
> детерминированный шаг. Текст изменился ровно в 6 файлах.
|
||||
> ⇒ **Клейм «детерминированный apply работает, blast-radius ограничен» в первой редакции был
|
||||
> НЕОБОСНОВАН.** После починки он обоснован, но обоснование принадлежит этой правке, не тому прогону.
|
||||
>
|
||||
> ### Р2. Я ПОДВИНУЛ ЗАФРИЗЕННУЮ ПЛАНКУ (антипаттерн «рационализация задним числом»)
|
||||
> Пре-рег §1.5 требует «фикс-рейт посадок диффа НЕ ХУЖЕ full-regen», знаменатель **12**.
|
||||
> Факт: дифф 11/12, full-regen 12/12. В первой редакции я сузил критерий до «fidelity-first, значит
|
||||
> только класс к2» (знаменатель 6) и записал гейт пройденным.
|
||||
> **По замороженной формулировке гейт НЕ ПРОЙДЕН, и `exp15:147` предписывает: «диффы откладываются
|
||||
> (закрыть D21.4/D21.10 явно)».** Восстанавливаю исходный знаменатель; вывод §2.8 переписан.
|
||||
>
|
||||
> ### Р3. Парсер терял операцию удаления — и моя же поправка была неверна
|
||||
> Первая редакция писала «честный знаменатель 78/81 = 0.963» и «формат не умеет выражать удаление».
|
||||
> Оба неверны: формат удаление выражает штатно, теряет его `OP_RE`. После починки
|
||||
> **D1 = 79/81 = 0.975**, D2 = 74/78 = 0.949. Гейт ≥0.90 проходится, конструктивного пробела
|
||||
> у формата нет — был баг рига.
|
||||
>
|
||||
> ### Р4. Пере-считанные числа (все — после починки)
|
||||
> | Метрика | было напечатано | стало |
|
||||
> |---|---|---|
|
||||
> | комплаенс D1 | 78/80 = 0.975 | **79/81 = 0.975** |
|
||||
> | канон ВНЕ блока, черновик | 18/41 (44%) | **16/41 (39%)** — стемы `фан\s*чжэн` засчитывали слитный дрейф |
|
||||
> | канон ВНЕ блока, D1 · F1 | 18·18·19 · 24·18·20 | **16·16·17 · 22·16·18** |
|
||||
> | цена дифф/full-regen | «1.5–2×» | **кэш-нейтрально ×1.63** (с кэшем ×2.05); по окнам 0.69…3.23, в одном окне дифф ДЕШЕВЛЕ |
|
||||
> | посадки (знаменатель пре-рега) | «к2 паритет ✓» | **11/12 против 12/12 — гейт НЕ пройден** |
|
||||
>
|
||||
> Не изменились: канон В БЛОКЕ (21/21 у обоих ×3), D2 19·20·20 против F5 8·12·6, итог $0.194006.
|
||||
>
|
||||
> ### Р5. Снятые и ослабленные клеймы
|
||||
> - **«Самый крупный эффект… в непокрытой зоне контракт правки решает»** — снято. Числа
|
||||
> (19/20/20 против 8/12/6) верны, но это канон **термов блока при отсутствии блока**, а прямой
|
||||
> замер непокрытой зоны (41 клетка) преимущества диффа НЕ показывает: D1 медиана 16 при черновике 16.
|
||||
> - **«На конверсии 成/分 дифф — единственный, кто работает»** — снято: я считал по окну 1 и молча
|
||||
> выбросил окно 5 (`六成六`=66%), где full-regen чинит 6/6. Направление живёт (19/24 против 8/24).
|
||||
> - **Атом-omission мерен против ЧЕРНОВИКА, а пре-рег §1.4 п.5 требует против предложений ИСХОДНИКА.**
|
||||
> Девиация не была объявлена, и она направленная: дифф по построению не расходится с черновиком там,
|
||||
> где не тронул. Метрика к сравнению контрактов непригодна.
|
||||
> - **Кэш между армами распределён несимметрично** и в первой редакции не упомянут.
|
||||
> - **Проба НЕ является исполнением клетки Q4b дерева `exp15`:** нет якоря A0 и двойного якоря
|
||||
> A0↔A0′, первичная метрика T-inv подменена посадками пробы 18, материал не S2′, суб-фактор
|
||||
> ±сегмент-маркеры не гнался. Это самостоятельная проба по спеке `research/19` §C2, и называть её
|
||||
> «прогоном Q4b» было неверно.
|
||||
> - Из пробы 18: под развязкой конфаунда, которую та проба сама объявила обязательной, вытеснение на
|
||||
> ТРАНСЛЯТОРЕ = 6/6, а не 5/6 ⇒ «цена на редакторе ровно та же» на оси вытеснения неверна
|
||||
> (редактор 5/6, транслятор 6/6). Вывод «редактор не поймает ошибку банка» устоял — он на принятии 6/6.
|
||||
> **⛔ Первая редакция §2 частично отозвана (05.08).** Приёмка воркфлоу дала 19 подтверждённых
|
||||
> дефектов; несущие: (1) аппликатор диффов молча портил 6 из 36 выходов — карта офсетов строилась по
|
||||
> NFKC-тексту, а резался оригинал, при этом риг рапортовал `applied=ops_total, rejected=0`;
|
||||
> починен, самотест расширен 9/9 → **15/15**, все 36 выходов пере-применены из сохранённых ответов
|
||||
> за $0, числа ниже — уже пере-считанные; (2) я сузил зафризенный знаменатель посадок 12→6 ПОСЛЕ
|
||||
> результатов — возвращено, по замороженной формулировке гейт **не пройден** (11/12 против 12/12);
|
||||
> (3) метрика полярности ловила `не ` внутри слов («мне», «камни», «крайне») — 21 ложное из 58,
|
||||
> клейм «~10× преимущество на омиссии» **снят**, под токенной метрикой остаётся ~1.3× в шуме;
|
||||
> (4) выигрыш на 成/分 был посчитан по одному окну из двух — исправлено ниже.
|
||||
> Механика проверок и воспроизведение — `eval/premise_review/README.md`; полный текст ретракции —
|
||||
> в истории git (коммит `4d1d9e5`), в отчёте он не воспроизводится по норме владельца 04.08.
|
||||
|
||||
### 2.1 Формат-комплаенс — ГЕЙТ ПРОЙДЕН
|
||||
|
||||
|
|
@ -364,11 +354,13 @@ reasoning биллится ВНУТРИ `completion_tokens` (`models.yaml`, `rea
|
|||
ДЕШЕВЛЕ, так что «дороже» верно как среднее, а не как свойство каждого вызова;
|
||||
- механизм цены: **96% completion диффа — размышление** (прямая улика: `reasoning_content` медиана
|
||||
10 244 знака у диффа против 2 504 у full-regen, при видимом тексте 486 против 1 835);
|
||||
- ⚠ **вывод «конфигом не чинится» ФАЛЬСИФИЦИРОВАН собственным замером 05.08** (`00-provider-quirks.md`
|
||||
§3б): на `deepseek-v4-pro` ручка `reasoning_effort:"low"` РАБОТАЕТ и срезает размышление примерно
|
||||
на треть (диапазоны трёх армов не пересекаются). Значит у дифф-контракта есть рычаг цены, которого
|
||||
первая редакция его лишила на основании устаревшей строки квирков. Цена этого рычага не бесплатна:
|
||||
квирки §4 фиксируют, что `low` пере-вооружает эхо-мину, и для pro это не мерено;
|
||||
- ⚠ **СНЯТО адверсариальным ревью 05.08 (см. §6.2).** Здесь стояло: «вывод „конфигом не чинится“
|
||||
ФАЛЬСИФИЦИРОВАН собственным замером: ручка `low` на pro РАБОТАЕТ и срезает размышление на треть
|
||||
(диапазоны трёх армов не пересекаются)». Пере-счёт показал, что решающее правило «диапазоны не
|
||||
пересекаются» при n=3/3 воспроизводится НУЛЕВЫМ вмешательством — два блока ДЕФОЛТА на побайтно
|
||||
одном запросе разделяются так же и с тем же размером эффекта. ⇒ вывод «конфигом не чинится»
|
||||
возвращается в статус **НЕ фальсифицированного** (а не «подтверждённого»): рычаг цены не показан
|
||||
ни существующим, ни отсутствующим;
|
||||
- **do-nothing промптом не покупается** (NO_CHANGE 0/36) — но тестировался промпт со СТИЛЬ-мандатом
|
||||
(51 из 80 операций D1 — чистая лексика), а цитата `research/19` §C1 относится к fidelity-only
|
||||
проходу, который не гнался.
|
||||
|
|
@ -410,7 +402,7 @@ Reflow-проход (Q4c) не гонялся — проза и переверс
|
|||
|
||||
| Арм | Какой вывод убивает | Дизайн | Вызовов |
|
||||
|---|---|---|---|
|
||||
| **L** | «дифф дороже» — артефакт несъёмного thinking? | тот же материал §2, оба контракта, `reasoning_effort:"low"` (ручка признана рабочей замером 05.08, quirks §3б) | 36 |
|
||||
| **L** | «дифф дороже» — артефакт несъёмного thinking? | тот же материал §2, оба контракта, `reasoning_effort:"low"` ⚠ квалификатор «ручка признана рабочей замером 05.08» СНЯТ по ревью 05.08 — посылка не выдержала пере-счёта, §6.2 | 36 |
|
||||
| **G** | «комплаенс 0.95–0.98» снят на окнах ВПЯТЕРО короче боевых? | единица **~3200 ру-ток. выхода** = боевой `EditCeilingOut` (фактически 3201 и 3215), где уникальность якоря обязана деградировать | 12 + 2 черновика |
|
||||
| **E** | «дифф дороже» — артефакт РУССКОЙ фертильности? | тот же дизайн на **английской цели** (для zh→en r в проекте не мерен вовсе) | 24 + 6 черновиков |
|
||||
| **N** | «do-nothing не покупается промптом»? | **fidelity-only** дифф-промпт без стиль-мандата — там, где `research/19` §C1 и ставит NO_CHANGE | 18 |
|
||||
|
|
@ -428,3 +420,243 @@ Reflow-проход (Q4c) не гонялся — проза и переверс
|
|||
- **N** — вывод §2.2 падает, если доля `NO_CHANGE` на fidelity-only промпте **>0** (в §2 было 0/36).
|
||||
|
||||
Средние исходы печатаются как «неопределённо», не абсорбируются. Девиации объявляются.
|
||||
|
||||
---
|
||||
|
||||
## §4. РЕВЬЮ ПОСЫЛКИ (сделано ДО платных вызовов, требование владельца 05.08)
|
||||
|
||||
Владелец 05.08: «важно ревьювить не только результат но и посылку». Поводом были два подряд
|
||||
дефекта посылки, невидимых в результатах: аппликатор молча портил 6 из 36 выходов, рапортуя
|
||||
`applied=ops_total, rejected=0`; арм zh→en поехал бы поверх РУССКИХ черновиков. Харнесс и
|
||||
воспроизведение — `eval/premise_review/` (README там же), всё $0 поверх персистированного сырья.
|
||||
|
||||
### 4.1 Что доказано исполнением
|
||||
|
||||
| Посылка | Инструмент | Итог |
|
||||
|---|---|---|
|
||||
| Риг пробы C воспроизводит движковые `RenderBatch`/`Batch` | overlay-тест по НАСТОЯЩЕМУ движку (`premise_batch_test.go.txt`; в `backend/` ничего не писалось) | 63/63 блока байт-в-байт; `DetectSeries` из язык-слоя даёт те же 4 серии, что риг задавал руками; состав батчей совпал, [16,16,17,13,1], все под 6000 рун |
|
||||
| Числа §C посчитаны верно | `recount.py` — свой парсер, своя нормализация, свой знаменатель, ничего не импортируется из `arbitrate.py` | воспроизвелись все 6 клеток: glm-5 25/45 · mistral 23 · flash 20 · pro 16 · terra 18 · luna 18 |
|
||||
| Посадки дефектов пробы A корректны | `strict_defects.py` | 12/12 регексов валидны (`fix_rx` ловит оригинал, `bad_rx` — нет, на посаженном наоборот); канон черновиков 20/21 воспроизведён |
|
||||
| Аппликатор диффов | `selftest_apply.py` | 15/15, включая NFKC-классы, на которых прежняя версия ломалась |
|
||||
| Константы боевой единицы | сверка с `internal/chunk/chunker.go` | `EditCeilingOut=3200` · `FertCJK=1.1978` · `FertOther=0.3852`, формула та же (chunker.go:95) |
|
||||
| Запросы четырёх армов — то, что заявлено | `dryrun_arms.py` | блок закона и черновик одинаковы в diff/full, различается ТОЛЬКО контракт; плейсхолдеров нет; арм E английский |
|
||||
|
||||
### 4.2 Найденные дефекты посылки
|
||||
|
||||
1. **Метрика посадок пробы A считала ИСЧЕЗНОВЕНИЕ, а не восстановление**: зачёт шёл по
|
||||
`not re.search(bad_rx, out)`, поэтому удаление фразы целиком засчиталось бы как правка.
|
||||
Пере-считано строго (`снят И fix_rx совпал`): восстановлено **47 из 48** клеток по четырём
|
||||
армам, «выпало» 3. Дефект метрики реален, **вывод не двигается**.
|
||||
2. **Асимметрия reasoning-режимов в §C** — объявлена в отчёте 18 §D п.5, но замером не закрыта.
|
||||
**Закрыта 05.08** контролем `glm2` (18 §C.5): чемпион с мышлением 24/45 против 25/45 без него.
|
||||
3. **`since_ch: 0`** в риге против непустого значения в проде: блок короче на 1–2 руны на
|
||||
кандидата, а батч 2 стоит на 5967/6000 ⇒ в проде граница батча могла бы сдвинуться. На
|
||||
сравнение моделей не влияет — батчи у всех кандидатов одни и те же.
|
||||
4. **`long_units` набирает абзацы ЗА потолок** (3201 и 3215 ру-ток.), тогда как движок группирует
|
||||
ДО превышения (`chunker.go:370`). Разница в один токен, но направление противоположное.
|
||||
5. **Английский черновик нельзя делать боевым `zh-ru/translator.md`**: он параметризован лишь в
|
||||
строке 1, а в строках 9/10/14 русский зашит ПРОЗОЙ («по нормам русского языка», «Пиши живым
|
||||
литературным русским языком», «опираясь на существующие русские переводы»). Первый прогон дал
|
||||
черновики на русском (E0: 1499 знаков кириллицы против 22 латиницы) — арм измерял бы русскую
|
||||
фертильность под видом английской. Заведено зеркало `prompts/translator-en.md`, черновики
|
||||
пере-сняты: 0 кириллицы, канон-формы блока соблюдены.
|
||||
|
||||
### 4.3 Ложные тревоги (проверены, дефекта нет)
|
||||
|
||||
- `parse_common.py` «отсутствует» — живёт в `eval/bank_autonomy/`, путь добавляется в `sys.path`.
|
||||
- `parse_common` «теряет» `aliases`/`related`/`since_ch` — этих полей в bank-stop нет вообще.
|
||||
- Знаменатель §A «21 вместо 27» — `元海` исключён намеренно, он скорится отдельно (в A2
|
||||
инъецирован неверной формой): 27 клеток − 6 окон = 21.
|
||||
- Первая версия `dryrun_arms.py` объявила у fidelity-промпта «стиль-мандат» — подстрочный регекс
|
||||
поймал ЗАПРЕТ («Стиль… НЕ ТРОГАЙ ВООБЩЕ»). Тот же класс ложных срабатываний, что `не ` внутри
|
||||
«мне/камни» в §2.5. Проверка исправлена на полярность.
|
||||
|
||||
---
|
||||
|
||||
## §5. ПРОГОН ЧЕТЫРЁХ ФАЛЬСИФИКАЦИЙ: верификация исполнения
|
||||
|
||||
Владелец 05.08: «после прогона так же понять, что он прошёл правильно». Проверялась не осмысленность
|
||||
результатов, а санитария — `eval/premise_review/verify_run.py`, $0.
|
||||
|
||||
| Проверка | Итог |
|
||||
|---|---|
|
||||
| П1 множество тегов ровно запланированное, без пропусков и лишних | 90 вызовов, L 36 · N 18 · G 12 · E 24 |
|
||||
| П2 нет обрывов по потолку вывода | `finish=stop` на всех 90 |
|
||||
| П3 модель на проводе одна | `deepseek-v4-pro` ×90 |
|
||||
| П3а режим арма L — ПРЯМО из артефакта, а не косвенно | `extra_body={"reasoning_effort":"low"}` на всех 36 вызовах L, `{}` на N/G/E |
|
||||
| П4 у каждого диффа есть файл применения | пропусков нет; отказы: `notfound` 1, `ambiguous` 5, `overlap` 0, `empty` 0, **малформед 0** |
|
||||
| П5 деньги сходятся вторым путём | вызовы $0.344919 + черновики $0.004647 = **$0.349566**, совпало с печатью скрипта до 1e-6 |
|
||||
| П6 короткие дифф-ответы объяснены | 9 коротких, все 9 — настоящий `NO_CHANGE` |
|
||||
|
||||
Потрачено **$0.349566** из потолка пре-рега $0.50; проекционный гард не срабатывал, ни одна клетка
|
||||
не выброшена.
|
||||
|
||||
---
|
||||
|
||||
## §6. ВЫВОДЫ ЧЕТЫРЁХ ФАЛЬСИФИКАЦИЙ (после адверсариального ревью 05.08)
|
||||
|
||||
Результаты прогона прошли второй рубеж: пять независимых линз атаковали выводы на убийство, каждая
|
||||
находка проверялась скептиком на состоятельность. 15 находок, **4 выжили, все с вердиктом «убивает»**.
|
||||
Три из них бьют по формулировкам автора, одна — по правке источника истины, сделанной этой же
|
||||
сессией. Ниже — уже исправленные формулировки; что именно снято, перечислено в §6.6.
|
||||
|
||||
### 6.1 Механизм: размышление масштабируется с ВХОДОМ, а сужением задачи не снимается
|
||||
|
||||
Доля `reasoning_chars` в выходе дифф-контракта медианно **0.95** (ec-D1 0.953 · ec-D2 0.942 ·
|
||||
fp-LD 0.955 · fp-N 0.979 · fp-GD 0.980 · fp-ED 0.992) против **0.55** у русского full-regen
|
||||
(ec-F1 0.573 · ec-F5 0.515, n=24). Видимый текст диффа — единицы процентов его цены.
|
||||
|
||||
- **Сужением МАНДАТА размышление не покупается.** Fidelity-only промпт срезал правки 4.50→1.94 на
|
||||
вызов (81/18 → 35/18) и видимый текст 486→244 зн., а размышление не упало: 10244→11301 медианно,
|
||||
MW p=0.752, среднее 11868→10128, выросло в 3 окнах из 6 ⇒ эффект не показан ни в одну сторону.
|
||||
- **От объёма ВХОДА зависит, и сильно.** На боевой единице `prompt_tokens` 2084→6761 (×3.24),
|
||||
размышление диффа 10244→28511 (×2.78, MW **p=0.0003**) при неизменном видимом выходе (486→428 зн.).
|
||||
- **От найденной работы тоже зависит:** внутри ec-D1 Спирмен `rho(размышление, правки)=+0.781`
|
||||
(p=0.0003) и `rho(размышление, длина выхода)=+0.651` (p=0.003).
|
||||
|
||||
⇒ **Правильная формулировка:** размышление масштабируется с объёмом входа и с найденной работой, но
|
||||
не снимается сужением задачи. Поэтому дифф не даёт той экономии выхода, ради которой затевался.
|
||||
|
||||
⚠ Прежняя формулировка автора — «размышление не зависит от объёма работы» — **опровергнута**: она
|
||||
строилась на одном контрасте (широкий→узкий мандат) и игнорировала корреляцию с входом и с правками.
|
||||
|
||||
### 6.2 Арм L — НЕ исполненная фальсификация; и посылка, и правка квирков отозваны
|
||||
|
||||
Измеренное отношение цены дифф/full — **1.677 по медиане окон** (w0 1.94 · w1 3.72 · w2 2.55 ·
|
||||
w3 1.42 · w4 1.07 · w5 0.53; медиана клеток 1.396; 11 клеток из 18 >1). Число верно и воспроизведено.
|
||||
|
||||
**Но фальсификация не проведена**, потому что её посылка — «ручка `reasoning_effort:"low"` на
|
||||
`deepseek-v4-pro` признана рабочей замером 05.08 (`00-provider-quirks.md` §3б)» — не выдержала
|
||||
пере-счёта по всему доступному сырью:
|
||||
|
||||
| Улика | Что показывает |
|
||||
|---|---|
|
||||
| Решающее правило §3б «диапазоны не пересекаются» при n=3/3 | минимально достижимый двусторонний p=0.100 — дизайн не может достичь значимости по построению |
|
||||
| **Нулевой контраст**: два блока ДЕФОЛТА на побайтно одном запросе (sha `92924c85b5fc`) | разделяются ТАК ЖЕ (p=0.100) и с тем же размером ×1.47, что и «эффект ручки» (13421/9125=1.47) |
|
||||
| Объединённый пул на побайтно одном входе, дефолт n=6 против low n=6 | диапазоны ПЕРЕСЕКАЮТСЯ, MW p=0.589 и по `completion_tokens`, и по `reasoning_chars` |
|
||||
| По арму целиком | дифф думает −8.1% (p=0.367), full-regen **+29.0%** (p=0.983) — разнонаправленно, что несовместимо с механизмом «срезает треть» |
|
||||
| `prompt_tokens` при побайтно одинаковых messages | 2124 у дефолта И у `low`, 2203 у `xhigh` ⇒ провайдер серверно реагирует на xhigh и НЕ реагирует на low |
|
||||
| По всей папке: 12 sha-групп, разыгранных обоими армами (39 вызовов) | low ниже дефолта лишь в 7 из 12, MW p=0.379 |
|
||||
|
||||
⇒ Гипотеза «премия диффа — артефакт несъёмного thinking» **остаётся НЕПРОВЕРЕННОЙ**. Арм L
|
||||
засчитывается как **вторая независимая репликация вывода «дифф дороже»** на 36 свежих вызовах
|
||||
(параметр ушёл на провод 36/36 в обеих подветвях ⇒ отношение внутренне контролируемо; клетки LD/LF
|
||||
разнесены на 22–110 с и дрейфом не объясняются), а НЕ как выдержанная проверка гипотезы.
|
||||
|
||||
**Мощность оговаривается явно:** утверждать «ручка нулевая» данные не позволяют — MW при n=6/6
|
||||
ловит истинный эффект ×0.67 лишь в 37% случаев (бутстрап 20k). Корректный статус — **воздействие не
|
||||
верифицировано**, при том что бремя лежит на посылке: клейм «работает» сделан на n=3/3 и
|
||||
воспроизводится нулевым вмешательством.
|
||||
|
||||
**Опора, которая переживает падение статуса арма L.** «Дифф дороже» реплицирован **трижды**, причём
|
||||
один раз на дефолтном эффорте и новом материале:
|
||||
|
||||
| Замер | Отношение дифф/full | Клеток >1 |
|
||||
|---|---|---|
|
||||
| база §2 (ec-D1/ec-F1) | 2.913 по окнам (2.313 по клеткам) | 10 из 12 |
|
||||
| арм L (`low`) | 1.677 по окнам | 11 из 18 |
|
||||
| **арм G, боевая единица, `extra_body={}`** | **2.468** | **6 из 6** |
|
||||
|
||||
### 6.3 Арм G — вывод §2.1 УСТОЯЛ, но арм слабее, чем кажется
|
||||
|
||||
Комплаенс на боевой единице **28/29 = 0.966 ≥ 0.90**: `notfound` 1, **`ambiguous` 0**, `overlap` 0,
|
||||
малформед 0. Пре-регистрированный порог не пробит, деградации уникальности якоря не видно.
|
||||
|
||||
**Обязательный хвост:** знаменатель — 29 операций с 5 результативных вызовов на 2 текстах (шестой,
|
||||
`fp-GD-u1-r1`, дал NO_CHANGE и вышел из знаменателя как 0/0). «Неоднозначных 0 из 29» при верхней
|
||||
95% границе Клоппера–Пирсона **11.9%** и базовой доле 1/81 = 1.2% означает: арм не отличает 0% от
|
||||
десятикратного к базе. Утверждать можно «катастрофической деградации нет», но не «деградации нет».
|
||||
|
||||
### 6.4 Арм N — вывод §2.2 ПАЛ: do-nothing покупается сужением мандата
|
||||
|
||||
`NO_CHANGE` **4 из 18** на fidelity-only промпте против **0 из 36** на промпте со стиль-мандатом.
|
||||
Дисциплина «ничего не делать, если черновик хорош» уговорами не берётся, а **сужением мандата —
|
||||
берётся**. Это ровно то, что `research/19` §C1 и предписывал тремя узкими проходами.
|
||||
|
||||
Атрибуция причины переписана по §6.1: сужение мандата покупает NO_CHANGE и режет правки, но
|
||||
**размышление им не срезается** — то есть узкий проход даёт дисциплину, а не дешевизну.
|
||||
|
||||
### 6.5 Арм E — формально пал, НЕ засчитан; причина пере-обоснована ПО ПРОВОДУ
|
||||
|
||||
Медиана отношения цены **0.617** по 12 парам (0.629 по-оконно), 10 клеток из 12 <1 — по букве
|
||||
критерия вывод §2.7 на английской цели падает. **Не засчитан из-за неполного зеркала промпта.**
|
||||
|
||||
⚠ Названная автором причина — «в зеркале нет ПРИМЕРОВ перевёрстки» — **была ложной**: примеров не
|
||||
было и у русского компаранда, потому что `editor_wire_probe.py:43` `FEW_SHOT = False` дропает блок
|
||||
`---FEWSHOT---` (проверено на 48/48 русских full-вызовов). Настоящее различие — на проводе:
|
||||
|
||||
| Что | ru full | en full |
|
||||
|---|---|---|
|
||||
| системный промпт | 3071 зн. / 16 непустых строк | 1174 зн. / 10 строк (0.38) |
|
||||
| блок ДИСКУРС-ПЕРЕВЁРСТКА (`editor.md:15-19`) | есть, 1199 зн. = 39% | **отсутствует вовсе** |
|
||||
| размышление full-regen | 2183 зн. (ec-F1+F5) | **14711 зн.** (×6.7) |
|
||||
| размышление диффа | 10244 зн. | 8650 зн. (×0.84) |
|
||||
|
||||
Прорежение **асимметрично именно по контрактам**: отношение en/ru системного промпта 0.38 на full
|
||||
против 0.65 на диффе ⇒ обеднён преимущественно знаменатель. Дифф на английском ведёт себя как на
|
||||
русском (даже думает чуть меньше), а «перевернулся» full-regen. ⇒ вопрос пре-рега («премия диффа —
|
||||
артефакт русской фертильности?») **остаётся без ответа**; для ответа нужен полный en-компарандум.
|
||||
|
||||
### 6.6 Что снято этим ревью
|
||||
|
||||
1. Слово **«УСТОЯЛ»** у арма L — фальсификация не проведена (§6.2).
|
||||
2. **`00-provider-quirks.md` §3б, звено (а)** («`low` на pro срезает размышление на треть, бюджет
|
||||
управляем») — отозвано; строка §3а («`low`→`high` для pro») НЕ опровергнута и возвращается в силу
|
||||
до замера с мощностью. Звено (б) про `xhigh` **сохраняется и усиливается**: min(xhigh) 17588 >
|
||||
max(дефолта) 15720, p=0.0238.
|
||||
3. **Баннер «вывод „конфигом не чинится“ ФАЛЬСИФИЦИРОВАН»** — снят; вывод возвращается в статус
|
||||
НЕ фальсифицированного (не «подтверждённого»).
|
||||
4. **Квалификатор в дизайне арма L** «ручка признана рабочей замером 05.08» — удалён.
|
||||
5. **Обоснование эхо-девиации** «единичные знаки — цитаты в сносках» — ложно, заменено (§6.7 п.1).
|
||||
6. **Формулировка §6.1** «размышление не зависит от объёма работы» — опровергнута корреляциями.
|
||||
|
||||
### 6.7 Объявленные девиации и оговорки
|
||||
|
||||
1. **Девиация от эхо-критерия.** Пре-рег: «ненулевое эхо делает `low` непригодным независимо от
|
||||
цены»; скорер применил порог 5%. Наблюдено 2 вызова, 4 знака. `fp-LD-w4-r1` (`修行`) — дословный
|
||||
SEARCH-якорь по сноске САМОГО черновика, REPLACE пуст, операция сноску удаляет ⇒ модель знаков не
|
||||
порождала. `fp-LF-w3-r2` (`潜能`, доля 0.117%) — сносок в выходе нет, знаки внутри повествования
|
||||
(«символом жизненной潜能»), черновик в этом месте несёт корректное «жизненного потенциала» ⇒
|
||||
**порождённая моделью микро-утечка исходника**. Порог 5% строже боевого гейта
|
||||
(`disposition.go` `cjkEchoThreshold = 0.15`) и на два порядка выше наблюдённого; явление quirks §4
|
||||
(выход исходником целиком, доля 0.83–0.999) не наблюдалось. **Low-специфичность НЕ показана:** на
|
||||
дефолтном эффорте ханьцзы тоже есть (ec-D1 2/18, ec-D2 1/18 — та же сноска черновика). ⇒ по БУКВЕ
|
||||
пре-рега рекомендация «поставить редактору `low`» остаётся **закрытой независимо от цены**.
|
||||
2. **Две конвенции медианы в одном скорере**: арм L — медиана по-оконных медиан, арм E — медиана
|
||||
клеток. Обе устойчивы (L по клеткам 1.396; E по окнам 0.629), вердикты не переворачиваются, но
|
||||
конвенции надо привести к одной.
|
||||
3. **Межсессионный дрейф крупный и реальный.** Шесть дефолтных розыгрышей побайтно одного запроса в
|
||||
хронологическом порядке: 1952 → 9104 → 10818 → 11157 → 13421 → 15720 знаков размышления, строго
|
||||
монотонно (вероятность 1/720). Любое сравнение блоков, разнесённых во времени, конфаундировано;
|
||||
защищены только парные внутриблочные отношения.
|
||||
4. **Дыра в самом ревью посылки:** §5/П3а проверяло, что параметр УШЁЛ на провод, но не что он
|
||||
ПОДЕЙСТВОВАЛ. Через неё посылка арма L и проехала. Инструмент под П3а дописан
|
||||
(`verify_run.py`), предупреждение об этом различии печатается в самом отчёте прогона.
|
||||
5. **Контроль §C.5 отчёта 18** (`glm2`) добавлен после прогона и вне пре-рега — объявлен там же.
|
||||
|
||||
### 6.8 Что это даёт продукту (строка 106)
|
||||
|
||||
- **Дифф-контракт механически исправен.** Формат-комплаенс 0.975 на базе, 0.966 на боевой единице,
|
||||
**малформед 0 на 90 вызовах**, аппликатор 15/15 на самотесте. Контракт `research/19` §C1 работает —
|
||||
вопрос «умеет ли модель в диффы» закрыт положительно.
|
||||
- **Экономически он проигрывает full-regen, и это реплицировано трижды** (2.913 · 1.677 · 2.468),
|
||||
включая боевой размер единицы на дефолтном режиме.
|
||||
- **Причина проигрыша НЕ установлена.** Обе гипотезы остались непроверенными: «несъёмный thinking»
|
||||
(арм L не исполнен, §6.2) и «русская фертильность» (арм E конфаундирован, §6.5). Установлено
|
||||
только, что размышление — 95% цены диффа, растёт с входом и не снимается сужением мандата.
|
||||
- **Узкий проход покупает дисциплину, а не деньги:** fidelity-only даёт NO_CHANGE 4/18 против 0/36,
|
||||
но размышление не режет.
|
||||
|
||||
⇒ **Строку 106 закрывать выводом «диффы не берём» ПРЕЖДЕВРЕМЕННО.** Правильный статус: полный
|
||||
ре-ген остаётся каноном не потому, что дифф-контракт плох, а потому что на этой модели и в этом
|
||||
режиме он дороже — при том, что механизм удорожания не вскрыт, а два его кандидата не проверены.
|
||||
|
||||
### 6.9 Что домерить, чтобы закрыть по-настоящему
|
||||
|
||||
1. **Отличимость `low` от дефолта** — интерливинг дефолт/low в ОДНОМ блоке (защита от дрейфа §6.7 п.3),
|
||||
n≥10 на арм. До этого замера `00-provider-quirks.md` §3а остаётся в силе.
|
||||
2. **Полный en-компарандум** — зеркало `editor-en.md` с блоком дискурс-перевёрстки, чтобы вопрос
|
||||
фертильности получил ответ.
|
||||
3. **Дифф на модели без несъёмного размышления** — единственный прямой тест гипотезы §6.2.
|
||||
4. **Качество правок** — ни один арм его не мерил; дифф может быть дешевле или дороже и при этом
|
||||
делать ХУЖЕ. Судейского рига в скоупе не было и нет.
|
||||
|
|
|
|||
254
eval/editor_contract/score_final.py
Normal file
254
eval/editor_contract/score_final.py
Normal file
|
|
@ -0,0 +1,254 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Счёт четырёх фальсификаций СТРОГО по критериям, замороженным в 19-editor-contract-q4b §3.
|
||||
|
||||
Критерии не мои и после прогона не меняются:
|
||||
L — §2.7 падает, если медианное отношение цены дифф/full ≤1.0. Плюс ОБЯЗАТЕЛЬНЫЙ эхо-контроль:
|
||||
ненулевая доля ханьцзы в выходе делает `low` непригодным независимо от цены.
|
||||
G — §2.1 падает, если формат-комплаенс (applied/ops_total) на боевой единице <0.90.
|
||||
E — §2.7 падает, если на английской цели отношение цены ≤1.0. Точность перевода НЕ скорится.
|
||||
N — §2.2 падает, если доля NO_CHANGE на fidelity-only промпте >0.
|
||||
|
||||
Средние исходы печатаются как «неопределённо». Ничего не абсорбируется молча: недостающие
|
||||
клетки печатаются поимённо, а не выпадают из знаменателя.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json
|
||||
import statistics
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
RAW = Path.home() / "books" / "gu-zhenren" / "bank-arbitration"
|
||||
|
||||
|
||||
def rec(tag: str):
|
||||
f = RAW / f"{tag}.json"
|
||||
return json.loads(f.read_text(encoding="utf-8")) if f.exists() else None
|
||||
|
||||
|
||||
def app(tag: str):
|
||||
f = RAW / f"{tag}.applied.json"
|
||||
return json.loads(f.read_text(encoding="utf-8")) if f.exists() else None
|
||||
|
||||
|
||||
def hanzi_share(s: str) -> float:
|
||||
if not s:
|
||||
return 0.0
|
||||
h = sum(1 for c in s if 0x3400 <= ord(c) <= 0x9FFF)
|
||||
return h / len(s)
|
||||
|
||||
|
||||
def money_block(tags: list[str], label: str) -> dict:
|
||||
rs = [r for r in (rec(t) for t in tags) if r]
|
||||
if not rs:
|
||||
return {}
|
||||
return {"label": label, "n": len(rs),
|
||||
"usd": sum(r["cost_usd"] for r in rs),
|
||||
"out": sum(r["completion_tokens"] for r in rs),
|
||||
"finish": {r["finish"] for r in rs}}
|
||||
|
||||
|
||||
def pair_ratios(dtag, ftag, cells) -> tuple[list[tuple], list[str]]:
|
||||
"""[(клетка, отношение цены дифф/full)] + пропуски поимённо.
|
||||
|
||||
⚠ Возвращается ИМЕННО пара с клеткой: ранняя версия отдавала голый список отношений, и
|
||||
группировка по окнам делалась `zip` с пере-фильтрованным списком клеток — при любом пропуске
|
||||
отношения съезжали на чужие окна, а медиана считалась бы по перепутанным данным.
|
||||
"""
|
||||
out, missing = [], []
|
||||
for c in cells:
|
||||
d, f = rec(dtag(c)), rec(ftag(c))
|
||||
if not d or not f:
|
||||
missing.append(f"{dtag(c)}|{ftag(c)}")
|
||||
continue
|
||||
out.append((c, d["cost_usd"] / f["cost_usd"]))
|
||||
return out, missing
|
||||
|
||||
|
||||
def compliance(tags: list[str]) -> tuple[int, int, dict, list[str]]:
|
||||
ops = ap = 0
|
||||
reasons = {"notfound": 0, "ambiguous": 0, "overlap": 0, "empty": 0,
|
||||
"malformed": 0, "no_change": 0}
|
||||
missing = []
|
||||
for t in tags:
|
||||
a = app(t)
|
||||
if not a:
|
||||
missing.append(t)
|
||||
continue
|
||||
ops += a["ops_total"]
|
||||
ap += a["applied"]
|
||||
reasons["notfound"] += a["rejected_notfound"]
|
||||
reasons["ambiguous"] += a["rejected_ambiguous"]
|
||||
reasons["overlap"] += a["rejected_overlap"]
|
||||
reasons["empty"] += a["rejected_empty"]
|
||||
reasons["malformed"] += a["malformed"]
|
||||
reasons["no_change"] += a["no_change"]
|
||||
return ops, ap, reasons, missing
|
||||
|
||||
|
||||
def verdict(name: str, falls: bool | None, detail: str) -> None:
|
||||
mark = {True: "ВЫВОД §ПАДАЕТ", False: "вывод устоял", None: "НЕОПРЕДЕЛЁННО"}[falls]
|
||||
print(f" ⇒ {name}: {mark} — {detail}")
|
||||
|
||||
|
||||
def arm_L():
|
||||
print("\n=== АРМ L: «дифф дороже» — артефакт несъёмного thinking? (reasoning_effort=low) ===")
|
||||
cells = [(k, r) for k in range(6) for r in (1, 2, 3)]
|
||||
pairs, missing = pair_ratios(lambda c: f"fp-LD-w{c[0]}-r{c[1]}",
|
||||
lambda c: f"fp-LF-w{c[0]}-r{c[1]}", cells)
|
||||
if missing:
|
||||
print(f" ⚠ нет пары для {len(missing)} клеток: {', '.join(missing[:6])}")
|
||||
if not pairs:
|
||||
return verdict("L", None, "нет ни одной полной пары")
|
||||
# медиана ПО ОКНАМ: сперва медиана розыгрышей внутри окна, затем медиана окон
|
||||
ratios = [r for _, r in pairs]
|
||||
by_win = {}
|
||||
for (k, _rep), ratio in pairs:
|
||||
by_win.setdefault(k, []).append(ratio)
|
||||
win_med = {k: statistics.median(v) for k, v in sorted(by_win.items())}
|
||||
med = statistics.median(win_med.values())
|
||||
print(" отношение цены дифф/full по окнам: "
|
||||
+ " ".join(f"w{k}={v:.2f}" for k, v in win_med.items()))
|
||||
print(f" медиана окон = {med:.3f} (всех клеток {len(ratios)}, медиана клеток "
|
||||
f"{statistics.median(ratios):.3f})")
|
||||
|
||||
d = money_block([f"fp-LD-w{k}-r{r}" for k, r in cells], "дифф low")
|
||||
f = money_block([f"fp-LF-w{k}-r{r}" for k, r in cells], "full low")
|
||||
for b in (d, f):
|
||||
if b:
|
||||
print(f" {b['label']}: n={b['n']} ${b['usd']:.6f} выход {b['out']} ток. finish={b['finish']}")
|
||||
|
||||
# ЭХО-КОНТРОЛЬ. Пре-рег §3 сказан буквально: «ненулевое эхо делает low непригодным».
|
||||
# ⚠ ИСПРАВЛЕНО по адверсариальному ревью 05.08. Прежний комментарий утверждал, что все
|
||||
# найденные знаки — «цитаты в сносках»; это было ЛОЖНО и опиралось на разбор ОДНОГО случая
|
||||
# из двух. Сырьё: `fp-LD-w4-r1` (修行) — дословный SEARCH-якорь по сноске САМОГО черновика,
|
||||
# REPLACE пуст, операция сноску удаляет ⇒ модель знаков не порождала; `fp-LF-w3-r2` (潜能) —
|
||||
# сносок в выходе нет вообще, знаки стоят внутри повествования («символом жизненной潜能»),
|
||||
# а черновик в этом месте несёт корректное «жизненного потенциала» ⇒ это ПОРОЖДЁННАЯ
|
||||
# моделью микро-утечка исходника. Порог 5% ниже боевого гейта (`disposition.go`
|
||||
# cjkEchoThreshold = 0.15) и на два порядка выше наблюдённого; явление quirks §4 (выход
|
||||
# исходником целиком, доля 0.83–0.999) не наблюдалось. Low-специфичность НЕ показана:
|
||||
# на дефолтном эффорте ханьцзы тоже есть (ec-D1 2/18, ec-D2 1/18 — та же сноска черновика).
|
||||
from collections import Counter
|
||||
chars, per_call = Counter(), {}
|
||||
for k, r in cells:
|
||||
for t in (f"fp-LD-w{k}-r{r}", f"fp-LF-w{k}-r{r}"):
|
||||
rr = rec(t)
|
||||
if not rr:
|
||||
continue
|
||||
hz = [c for c in rr["content"] if 0x3400 <= ord(c) <= 0x9FFF]
|
||||
if hz:
|
||||
chars.update(hz)
|
||||
per_call[t] = hanzi_share(rr["content"])
|
||||
literal_nonzero = bool(per_call)
|
||||
worst = max(per_call.values()) if per_call else 0.0
|
||||
print(f" эхо-контроль, БУКВА пре-рега (ханьцзы > 0): "
|
||||
f"{'есть' if literal_nonzero else 'нет'} — вызовов с ханьцзы {len(per_call)}, "
|
||||
f"всего знаков {sum(chars.values())}, худшая доля {worst:.4%}")
|
||||
if chars:
|
||||
print(f" какие знаки: {dict(chars)} ⇒ разбор глазами обязателен")
|
||||
if worst >= 0.05:
|
||||
print(" ⛔ ЭХО-МИНА: доля исходника в выходе ≥5% — это не цитата")
|
||||
verdict("L", None, "цена нерелевантна: `low` пере-вооружил эхо-мину ⇒ режим непригоден")
|
||||
else:
|
||||
if literal_nonzero:
|
||||
print(" ⚠ ДЕВИАЦИЯ ОТ БУКВЫ пре-рега: порог 5% вместо «ненулевого». Разбор сырья: "
|
||||
"часть знаков — SEARCH-якорь по сноске ЧЕРНОВИКА (модель их не порождала), "
|
||||
"часть — настоящая микро-утечка исходника в повествование. Сплошного эха "
|
||||
"(quirks §4, доля 0.83+) нет. По БУКВЕ пре-рега рекомендация «редактору low» "
|
||||
"закрыта независимо от цены; на медианный вердикт ниже это не влияет")
|
||||
# ⚠ НЕ печатаем «вывод устоял»: по адверсариальному ревью 05.08 (отчёт 19 §6.2) арм L —
|
||||
# НЕ исполненная фальсификация. Его посылка («ручка low на pro работает», quirks §3б)
|
||||
# не выдержала пере-счёта: решающее правило n=3/3 воспроизводится НУЛЕВЫМ вмешательством,
|
||||
# на побайтно одном входе дефолт и low пересекаются (MW p=0.589). Число верно, статус — нет.
|
||||
print(f" ⇒ L: НЕ ФАЛЬСИФИКАЦИЯ — отличимость `low` от дефолта не установлена (§6.2). "
|
||||
f"Медиана {med:.3f} > 1.0 засчитывается как ВТОРАЯ РЕПЛИКАЦИЯ вывода «дифф дороже», "
|
||||
f"а не как выдержанная проверка гипотезы про несъёмный thinking")
|
||||
|
||||
ops, ap, reasons, miss = compliance([f"fp-LD-w{k}-r{r}" for k, r in cells])
|
||||
if ops:
|
||||
print(f" побочно, комплаенс диффа на low: {ap}/{ops} = {ap / ops:.3f}; {reasons}")
|
||||
|
||||
|
||||
def arm_N():
|
||||
print("\n=== АРМ N: покупается ли do-nothing узким fidelity-промптом? ===")
|
||||
tags = [f"fp-N-w{k}-r{r}" for k in range(6) for r in (1, 2, 3)]
|
||||
ops, ap, reasons, missing = compliance(tags)
|
||||
present = len(tags) - len(missing)
|
||||
if missing:
|
||||
print(f" ⚠ нет выхода для {len(missing)}: {', '.join(missing[:6])}")
|
||||
if not present:
|
||||
return verdict("N", None, "нет данных")
|
||||
nc = reasons["no_change"]
|
||||
print(f" вызовов {present}/{len(tags)} · операций {ops} · применено {ap} "
|
||||
f"· NO_CHANGE {nc} · малформед {reasons['malformed']}")
|
||||
print(f" комплаенс {ap / ops:.3f}" if ops else " операций 0")
|
||||
b = money_block(tags, "fidelity-дифф")
|
||||
if b:
|
||||
print(f" {b['label']}: ${b['usd']:.6f} выход {b['out']} ток. finish={b['finish']}")
|
||||
verdict("N", nc > 0, f"NO_CHANGE {nc} из {present} вызовов (в §2 было 0 из 36)")
|
||||
|
||||
|
||||
def arm_G():
|
||||
print("\n=== АРМ G: держится ли комплаенс на БОЕВОЙ единице (~3200 ру-ток.)? ===")
|
||||
cells = [(u, r) for u in range(2) for r in (1, 2, 3)]
|
||||
dtags = [f"fp-GD-u{u}-r{r}" for u, r in cells]
|
||||
ops, ap, reasons, missing = compliance(dtags)
|
||||
if missing:
|
||||
print(f" ⚠ нет apply для {len(missing)}: {', '.join(missing)}")
|
||||
if not ops:
|
||||
return verdict("G", None, "операций 0 — считать нечего")
|
||||
comp = ap / ops
|
||||
print(f" операций {ops} · применено {ap} · комплаенс {comp:.3f}")
|
||||
print(f" причины reject: {reasons}")
|
||||
gpairs, miss2 = pair_ratios(lambda c: f"fp-GD-u{c[0]}-r{c[1]}",
|
||||
lambda c: f"fp-GF-u{c[0]}-r{c[1]}", cells)
|
||||
ratios = [r for _, r in gpairs]
|
||||
if ratios:
|
||||
print(f" отношение цены дифф/full на длинной единице: медиана "
|
||||
f"{statistics.median(ratios):.3f} ({len(ratios)} пар)")
|
||||
for b in (money_block(dtags, "дифф длинный"),
|
||||
money_block([f"fp-GF-u{u}-r{r}" for u, r in cells], "full длинный")):
|
||||
if b:
|
||||
print(f" {b['label']}: n={b['n']} ${b['usd']:.6f} выход {b['out']} ток. finish={b['finish']}")
|
||||
verdict("G", comp < 0.90, f"комплаенс {comp:.3f} против порога 0.90")
|
||||
|
||||
|
||||
def arm_E():
|
||||
print("\n=== АРМ E: «дифф дороже» — артефакт РУССКОЙ фертильности? (английская цель) ===")
|
||||
cells = [(k, r) for k in range(6) for r in (1, 2)]
|
||||
epairs, missing = pair_ratios(lambda c: f"fp-ED-w{c[0]}-r{c[1]}",
|
||||
lambda c: f"fp-EF-w{c[0]}-r{c[1]}", cells)
|
||||
ratios = [r for _, r in epairs]
|
||||
if missing:
|
||||
print(f" ⚠ нет пары для {len(missing)}: {', '.join(missing[:6])}")
|
||||
if not ratios:
|
||||
return verdict("E", None, "нет ни одной полной пары")
|
||||
med = statistics.median(ratios)
|
||||
print(f" отношение цены дифф/full: медиана {med:.3f} по {len(ratios)} парам "
|
||||
f"({' '.join(f'{r:.2f}' for r in ratios)})")
|
||||
dt = [f"fp-ED-w{k}-r{r}" for k, r in cells]
|
||||
ops, ap, reasons, miss = compliance(dt)
|
||||
if ops:
|
||||
print(f" формат-комплаенс на английском: {ap}/{ops} = {ap / ops:.3f}; {reasons}")
|
||||
for b in (money_block(dt, "дифф en"),
|
||||
money_block([f"fp-EF-w{k}-r{r}" for k, r in cells], "full en")):
|
||||
if b:
|
||||
print(f" {b['label']}: n={b['n']} ${b['usd']:.6f} выход {b['out']} ток. finish={b['finish']}")
|
||||
print(" ⚠ точность перевода этим армом НЕ измеряется: en-голда в проекте нет (пре-рег §3)")
|
||||
verdict("E", med <= 1.0, f"медиана {med:.3f} против порога 1.0")
|
||||
|
||||
|
||||
def main():
|
||||
spent = sum(json.loads(f.read_text(encoding="utf-8"))["cost_usd"]
|
||||
for f in RAW.glob("fp-*.json") if not f.name.endswith(".applied.json"))
|
||||
for fn in (arm_L, arm_N, arm_G, arm_E):
|
||||
try:
|
||||
fn()
|
||||
except Exception as e: # noqa: BLE001 — арм не должен ронять счёт остальных
|
||||
print(f" ⛔ счёт арма упал: {type(e).__name__}: {e}")
|
||||
print(f"\nПОТРАЧЕНО на фальсификации: ${spent:.6f} (потолок пре-рега $0.50)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
sys.exit(0)
|
||||
147
eval/premise_review/final_run.log
Normal file
147
eval/premise_review/final_run.log
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
черновики готовы, доплата $0.000000
|
||||
план: 90 вызовов; уже потрачено $0.004647
|
||||
[fp-LD-w0-r1] finish=stop in=2124(c2048) out=2684 $0.002376 43.8s content=422c
|
||||
apply: ops=5 applied=5 no_change=False malformed=False
|
||||
[fp-LF-w0-r1] finish=stop in=2271(c2176) out=1353 $0.001226 25.4s content=1832c
|
||||
[fp-LD-w1-r1] finish=stop in=2011(c1920) out=6591 $0.005781 111.6s content=490c
|
||||
apply: ops=5 applied=4 no_change=False malformed=False
|
||||
[fp-LF-w1-r1] finish=stop in=2158(c2048) out=1462 $0.001327 28.0s content=1845c
|
||||
[fp-LD-w2-r1] finish=stop in=2096(c2048) out=4769 $0.004177 91.8s content=253c
|
||||
apply: ops=3 applied=3 no_change=False malformed=False
|
||||
[fp-LF-w2-r1] finish=stop in=2243(c2176) out=1838 $0.001636 33.8s content=1704c
|
||||
[fp-LD-w3-r1] finish=stop in=2038(c1920) out=1634 $0.001480 27.7s content=2380c
|
||||
apply: ops=8 applied=8 no_change=False malformed=False
|
||||
[fp-LF-w3-r1] finish=stop in=2185(c2176) out=1188 $0.001045 21.2s content=1709c
|
||||
[fp-LD-w4-r1] finish=stop in=2164(c2048) out=3435 $0.003046 65.2s content=600c
|
||||
apply: ops=5 applied=5 no_change=False malformed=False
|
||||
[fp-LF-w4-r1] finish=stop in=2311(c2304) out=7046 $0.006141 126.3s content=2014c
|
||||
[fp-LD-w5-r1] finish=stop in=2073(c2048) out=3456 $0.003025 68.9s content=306c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-LF-w5-r1] finish=stop in=2220(c2176) out=6586 $0.005757 117.8s content=1890c
|
||||
[fp-LD-w0-r2] finish=stop in=2124(c2048) out=4787 $0.004205 88.6s content=627c
|
||||
apply: ops=6 applied=6 no_change=False malformed=False
|
||||
[fp-LF-w0-r2] finish=stop in=2271(c2176) out=1245 $0.001132 25.3s content=1960c
|
||||
[fp-LD-w1-r2] finish=stop in=2011(c1920) out=4725 $0.004157 104.5s content=312c
|
||||
apply: ops=3 applied=2 no_change=False malformed=False
|
||||
[fp-LF-w1-r2] finish=stop in=2158(c2048) out=1222 $0.001118 27.4s content=1831c
|
||||
[fp-LD-w2-r2] finish=stop in=2096(c2048) out=6406 $0.005602 152.8s content=769c
|
||||
apply: ops=8 applied=8 no_change=False malformed=False
|
||||
[fp-LF-w2-r2] finish=stop in=2243(c2176) out=1265 $0.001138 32.2s content=1858c
|
||||
[fp-LD-w3-r2] finish=stop in=2038(c1920) out=1694 $0.001532 45.1s content=92c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-LF-w3-r2] finish=stop in=2185(c2176) out=1136 $0.001000 26.7s content=1709c
|
||||
[fp-LD-w4-r2] finish=stop in=2164(c2048) out=3648 $0.003232 88.5s content=204c
|
||||
apply: ops=3 applied=3 no_change=False malformed=False
|
||||
[fp-LF-w4-r2] finish=stop in=2311(c2304) out=3467 $0.003028 78.1s content=1976c
|
||||
[fp-LD-w5-r2] finish=stop in=2073(c2048) out=2001 $0.001759 49.6s content=435c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-LF-w5-r2] finish=stop in=2220(c2176) out=2010 $0.001776 53.4s content=1764c
|
||||
[fp-LD-w0-r3] finish=stop in=2124(c2048) out=4357 $0.003831 98.5s content=725c
|
||||
apply: ops=5 applied=5 no_change=False malformed=False
|
||||
[fp-LF-w0-r3] finish=stop in=2271(c2176) out=4691 $0.004130 109.2s content=1765c
|
||||
[fp-LD-w1-r3] finish=stop in=2011(c1920) out=5792 $0.005086 132.6s content=923c
|
||||
apply: ops=6 applied=6 no_change=False malformed=False
|
||||
[fp-LF-w1-r3] finish=stop in=2158(c2048) out=1512 $0.001371 35.1s content=1773c
|
||||
[fp-LD-w2-r3] finish=stop in=2096(c2048) out=1006 $0.000904 17.6s content=1849c
|
||||
apply: ops=10 applied=10 no_change=False malformed=False
|
||||
[fp-LF-w2-r3] finish=stop in=2243(c2176) out=1276 $0.001147 43.5s content=1618c
|
||||
[fp-LD-w3-r3] finish=stop in=2038(c1920) out=3665 $0.003247 68.5s content=334c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-LF-w3-r3] finish=stop in=2185(c2176) out=4782 $0.004172 76.7s content=1745c
|
||||
[fp-LD-w4-r3] finish=stop in=2164(c2048) out=8026 $0.007041 126.1s content=345c
|
||||
apply: ops=4 applied=4 no_change=False malformed=False
|
||||
[fp-LF-w4-r3] finish=stop in=2311(c2304) out=5873 $0.005121 93.9s content=2057c
|
||||
[fp-LD-w5-r3] finish=stop in=2073(c2048) out=1131 $0.001002 18.7s content=1679c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-LF-w5-r3] finish=stop in=2220(c2176) out=2186 $0.001929 36.9s content=1891c
|
||||
[fp-N-w0-r1] finish=stop in=1738(c0) out=4552 $0.004716 94.7s content=640c
|
||||
apply: ops=4 applied=4 no_change=False malformed=False
|
||||
[fp-N-w1-r1] finish=stop in=1625(c0) out=4872 $0.004946 72.6s content=201c
|
||||
apply: ops=2 applied=1 no_change=False malformed=False
|
||||
[fp-N-w2-r1] finish=stop in=1710(c640) out=928 $0.001275 15.8s content=456c
|
||||
apply: ops=4 applied=3 no_change=False malformed=False
|
||||
[fp-N-w3-r1] finish=stop in=1652(c640) out=2721 $0.002810 40.3s content=136c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-N-w4-r1] finish=stop in=1778(c640) out=2834 $0.002963 44.8s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-N-w5-r1] finish=stop in=1687(c640) out=4326 $0.004221 59.3s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-N-w0-r2] finish=stop in=1738(c1664) out=4662 $0.004094 91.1s content=1217c
|
||||
apply: ops=4 applied=4 no_change=False malformed=False
|
||||
[fp-N-w1-r2] finish=stop in=1625(c1536) out=4346 $0.003825 63.4s content=201c
|
||||
apply: ops=2 applied=1 no_change=False malformed=False
|
||||
[fp-N-w2-r2] finish=stop in=1710(c1664) out=4647 $0.004069 70.9s content=386c
|
||||
apply: ops=3 applied=3 no_change=False malformed=False
|
||||
[fp-N-w3-r2] finish=stop in=1652(c1536) out=4346 $0.003837 65.7s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-N-w4-r2] finish=stop in=1778(c1664) out=5780 $0.005084 87.7s content=400c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-N-w5-r2] finish=stop in=1687(c1664) out=2752 $0.002410 37.6s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-N-w0-r3] finish=stop in=1738(c1664) out=2807 $0.002480 42.5s content=309c
|
||||
apply: ops=3 applied=3 no_change=False malformed=False
|
||||
[fp-N-w1-r3] finish=stop in=1625(c1536) out=3595 $0.003172 50.6s content=287c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-N-w2-r3] finish=stop in=1710(c1664) out=3329 $0.002922 44.9s content=139c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-N-w3-r3] finish=stop in=1652(c1536) out=4481 $0.003954 63.0s content=361c
|
||||
apply: ops=3 applied=3 no_change=False malformed=False
|
||||
[fp-N-w4-r3] finish=stop in=1778(c1664) out=5264 $0.004635 73.5s content=620c
|
||||
apply: ops=3 applied=3 no_change=False malformed=False
|
||||
[fp-N-w5-r3] finish=stop in=1687(c1664) out=2978 $0.002607 46.3s content=108c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-GD-u0-r1] finish=stop in=6615(c1024) out=5980 $0.007638 92.2s content=477c
|
||||
apply: ops=4 applied=3 no_change=False malformed=False
|
||||
[fp-GF-u0-r1] finish=stop in=6762(c1152) out=4384 $0.006259 102.8s content=10222c
|
||||
[fp-GD-u1-r1] finish=stop in=6907(c1024) out=10542 $0.011734 134.8s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-GF-u1-r1] finish=stop in=7054(c1152) out=5481 $0.007340 69.5s content=10204c
|
||||
[fp-GD-u0-r2] finish=stop in=6615(c6528) out=13271 $0.011607 173.4s content=941c
|
||||
apply: ops=8 applied=8 no_change=False malformed=False
|
||||
[fp-GF-u0-r2] finish=stop in=6762(c6656) out=4282 $0.003796 54.2s content=10403c
|
||||
[fp-GD-u1-r2] finish=stop in=6907(c6784) out=12253 $0.010738 158.0s content=378c
|
||||
apply: ops=4 applied=4 no_change=False malformed=False
|
||||
[fp-GF-u1-r2] finish=stop in=7054(c7040) out=4774 $0.004185 79.2s content=10200c
|
||||
[fp-GD-u0-r3] finish=stop in=6615(c6528) out=10729 $0.009396 137.5s content=971c
|
||||
apply: ops=9 applied=9 no_change=False malformed=False
|
||||
[fp-GF-u0-r3] finish=stop in=6762(c6656) out=4476 $0.003964 50.1s content=10375c
|
||||
[fp-GD-u1-r3] finish=stop in=6907(c6784) out=12446 $0.010906 160.7s content=362c
|
||||
apply: ops=4 applied=4 no_change=False malformed=False
|
||||
[fp-GF-u1-r3] finish=stop in=7054(c7040) out=4643 $0.004071 55.5s content=10100c
|
||||
[fp-ED-w0-r1] finish=stop in=1323(c0) out=4196 $0.004226 64.4s content=634c
|
||||
apply: ops=4 applied=4 no_change=False malformed=False
|
||||
[fp-EF-w0-r1] finish=stop in=1190(c0) out=4006 $0.004003 60.5s content=2003c
|
||||
[fp-ED-w1-r1] finish=stop in=1276(c0) out=4196 $0.004206 68.6s content=59c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-EF-w1-r1] finish=stop in=1143(c0) out=3880 $0.003873 129.3s content=2031c
|
||||
[fp-ED-w2-r1] finish=stop in=1283(c0) out=2353 $0.002605 37.0s content=128c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-EF-w2-r1] finish=stop in=1150(c0) out=5203 $0.005027 81.5s content=2045c
|
||||
[fp-ED-w3-r1] finish=stop in=1238(c384) out=3010 $0.002992 110.6s content=78c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-EF-w3-r1] finish=stop in=1105(c256) out=4817 $0.004561 77.8s content=1819c
|
||||
[fp-ED-w4-r1] finish=stop in=1252(c384) out=1789 $0.001935 27.1s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-EF-w4-r1] finish=stop in=1119(c256) out=4106 $0.003949 61.9s content=2004c
|
||||
[fp-ED-w5-r1] finish=stop in=1279(c384) out=1434 $0.001638 21.5s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-EF-w5-r1] finish=stop in=1146(c256) out=3943 $0.003818 61.3s content=2048c
|
||||
[fp-ED-w0-r2] finish=stop in=1323(c1280) out=3504 $0.003072 52.4s content=421c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-EF-w0-r2] finish=stop in=1190(c1152) out=6081 $0.005311 83.8s content=1987c
|
||||
[fp-ED-w1-r2] finish=stop in=1276(c1152) out=2843 $0.002532 46.1s content=63c
|
||||
apply: ops=1 applied=1 no_change=False malformed=False
|
||||
[fp-EF-w1-r2] finish=stop in=1143(c1024) out=4094 $0.003617 58.6s content=2019c
|
||||
[fp-ED-w2-r2] finish=stop in=1283(c1280) out=3118 $0.002719 47.3s content=190c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-EF-w2-r2] finish=stop in=1150(c1024) out=3861 $0.003418 140.6s content=2083c
|
||||
[fp-ED-w3-r2] finish=stop in=1238(c1152) out=1863 $0.001662 32.5s content=481c
|
||||
apply: ops=2 applied=2 no_change=False malformed=False
|
||||
[fp-EF-w3-r2] finish=stop in=1105(c1024) out=5747 $0.005039 95.4s content=1809c
|
||||
[fp-ED-w4-r2] finish=stop in=1252(c1152) out=2372 $0.002111 43.6s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-EF-w4-r2] finish=stop in=1119(c1024) out=7043 $0.006172 124.4s content=2079c
|
||||
[fp-ED-w5-r2] finish=stop in=1279(c1152) out=2487 $0.002223 43.3s content=9c
|
||||
apply: ops=0 applied=0 no_change=True malformed=False
|
||||
[fp-EF-w5-r2] finish=stop in=1146(c1024) out=3244 $0.002879 63.5s content=2056c
|
||||
TOTAL финальных проб: $0.349566
|
||||
52
eval/premise_review/glm_thinking_control.py
Normal file
52
eval/premise_review/glm_thinking_control.py
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
#!/usr/bin/env python3
|
||||
"""КОНТРОЛЬ к §C отчёта 18: чемпион glm-5 ехал с ВЫКЛЮЧЕННЫМ мышлением, претенденты — с включённым.
|
||||
|
||||
Отчёт 18 §D объявляет эту асимметрию как ограничение, но замером её не закрывает. Здесь она
|
||||
закрывается: тот же ростер, те же 5 батчей, тот же промпт и та же добавка CONF_NUM — меняется
|
||||
РОВНО ОДНО: `thinking` не отключается (тег `glm2`).
|
||||
|
||||
Зачем это нужно именно так: контроль может только УХУДШИТЬ мой собственный побочный вывод
|
||||
«luna даёт качество чемпиона за 39% цены» — если glm-5 с мышлением поднимется выше 25/45, паритет
|
||||
исчезнет. Контроль, способный убить лишь удобный мне результат, — не подгонка ворот, а её обратное.
|
||||
|
||||
Риг НЕ правится: `consilium_probe.py` импортируется как есть.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import sys
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
sys.path.insert(0, str(HERE.parent / "bank_arbitration"))
|
||||
|
||||
import consilium_probe as C # noqa: E402
|
||||
|
||||
CEILING_USD = 0.12 # потолок этого контроля; glm-5 = $1.0 вход / $3.2 выход за 1M
|
||||
|
||||
|
||||
def main() -> None:
|
||||
roster = C.build_roster()
|
||||
batches = C.batches_of(roster)
|
||||
print(f"ростер {len(roster)} · батчей {len(batches)}")
|
||||
C.slug_check("glm-5")
|
||||
|
||||
total = 0.0
|
||||
cl = C.client_for("glm-5")
|
||||
for i, b in enumerate(batches):
|
||||
tag = f"glm2-b{i}"
|
||||
if (C.RAW / f"{tag}.json").exists():
|
||||
print(f"[{tag}] уже есть, пропуск")
|
||||
continue
|
||||
if total > CEILING_USD:
|
||||
print(f"СТОП по потолку: ${total:.6f} > ${CEILING_USD}")
|
||||
return
|
||||
system, user = C.render_terminologist("\n\n".join(C.block_of(c) for c in b))
|
||||
# thinking_off=False ⇒ extra_body без {"thinking":{"type":"disabled"}} ⇒ мышление ВКЛЮЧЕНО
|
||||
rec = C.call(cl, "glm-5", system, user + C.CONF_NUM, tag, None, False)
|
||||
total += rec["cost_usd"]
|
||||
time.sleep(1.0)
|
||||
print(f"контроль glm2 стоил ${total:.6f}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
113
eval/premise_review/verify_run.py
Normal file
113
eval/premise_review/verify_run.py
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Проверка, что ПРОГОН прошёл правильно (владелец 05.08: «после прогона понять, что он прошёл верно»).
|
||||
|
||||
Проверяется не смысл результатов, а их санитария — то, что молча портит выводы:
|
||||
П1 множество тегов ровно то, что запланировано: ни пропусков, ни лишних (пере-прогон чужого);
|
||||
П2 ни одного обрыва по потолку вывода (`finish` ≠ stop) — обрыв даёт «модель не нашла правок»;
|
||||
П3 модель и режим на проводе те, что заявлены армом (L — low, остальные — дефолт);
|
||||
П4 у КАЖДОГО диффового вызова есть файл применения, и применение не молчит об отказах;
|
||||
П5 деньги сходятся двумя путями: сумма записей против напечатанного скриптом итога;
|
||||
П6 дифф-выходы не выродились: пустой/односимвольный ответ ≠ «NO_CHANGE по делу».
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import json
|
||||
import sys
|
||||
from collections import Counter
|
||||
from pathlib import Path
|
||||
|
||||
RAW = Path.home() / "books" / "gu-zhenren" / "bank-arbitration"
|
||||
FAIL = 0
|
||||
|
||||
|
||||
def check(name: str, ok: bool, note: str = "") -> None:
|
||||
global FAIL
|
||||
if not ok:
|
||||
FAIL += 1
|
||||
print(f"[{'OK ' if ok else 'ПРОВАЛ'}] {name}" + (f" — {note}" if note else ""))
|
||||
|
||||
|
||||
def expected() -> set[str]:
|
||||
t = set()
|
||||
for k in range(6):
|
||||
for r in (1, 2, 3):
|
||||
t |= {f"fp-LD-w{k}-r{r}", f"fp-LF-w{k}-r{r}", f"fp-N-w{k}-r{r}"}
|
||||
for r in (1, 2):
|
||||
t |= {f"fp-ED-w{k}-r{r}", f"fp-EF-w{k}-r{r}"}
|
||||
for u in range(2):
|
||||
for r in (1, 2, 3):
|
||||
t |= {f"fp-GD-u{u}-r{r}", f"fp-GF-u{u}-r{r}"}
|
||||
return t
|
||||
|
||||
|
||||
def main() -> None:
|
||||
recs = {}
|
||||
for f in RAW.glob("fp-*.json"):
|
||||
if f.name.endswith(".applied.json") or f.name.startswith("fp-draft"):
|
||||
continue
|
||||
recs[f.stem] = json.loads(f.read_text(encoding="utf-8"))
|
||||
|
||||
exp = expected()
|
||||
got = set(recs)
|
||||
check("П1 все запланированные вызовы есть", not (exp - got),
|
||||
f"нет: {sorted(exp - got)[:8]}" if exp - got else f"{len(got)} шт.")
|
||||
check("П1 лишних вызовов нет", not (got - exp), f"лишние: {sorted(got - exp)[:8]}")
|
||||
|
||||
fin = Counter(r["finish"] for r in recs.values())
|
||||
check("П2 нет обрывов по потолку вывода", set(fin) == {"stop"}, str(dict(fin)))
|
||||
|
||||
models = Counter(r.get("model_returned", "?") for r in recs.values())
|
||||
check("П3 модель одна на всех вызовах", len(models) == 1, str(dict(models)))
|
||||
|
||||
# П3а — режим НА ПРОВОДЕ, прямо из артефакта. ⚠ Инструмент добавлен по адверсариальному
|
||||
# ревью 05.08: строка П3а стояла в отчёте как выполненная проверка, а кода под ней не было.
|
||||
want = {t: ('{"reasoning_effort": "low"}' if t.startswith(("fp-LD", "fp-LF")) else "{}")
|
||||
for t in recs}
|
||||
bad = {t: json.dumps(recs[t].get("extra_body"), ensure_ascii=False)
|
||||
for t in recs
|
||||
if json.dumps(recs[t].get("extra_body"), ensure_ascii=False) != want[t]}
|
||||
check("П3а режим на проводе совпадает с заявленным армом", not bad,
|
||||
f"расходится у {len(bad)}: {list(bad)[:5]}" if bad
|
||||
else f"low на {sum(1 for t in want.values() if 'low' in t)} · {{}} на "
|
||||
f"{sum(1 for t in want.values() if t == '{}')}")
|
||||
|
||||
# ⚠ П3а проверяет, что параметр УШЁЛ, но НЕ что он ПОДЕЙСТВОВАЛ. Отличимость `low` от дефолта
|
||||
# на этой модели пере-счётом 05.08 НЕ подтверждена (отчёт 19 §6.2) — держать это в виду.
|
||||
print(" ⚠ уход параметра ≠ его действие: отличимость low от дефолта не установлена")
|
||||
|
||||
diffs = [t for t in recs if t.startswith(("fp-LD", "fp-GD", "fp-ED", "fp-N-"))]
|
||||
noapp = [t for t in diffs if not (RAW / f"{t}.applied.json").exists()]
|
||||
check("П4 у каждого диффа есть файл применения", not noapp, f"нет у: {noapp[:6]}")
|
||||
|
||||
rej = Counter()
|
||||
for t in diffs:
|
||||
f = RAW / f"{t}.applied.json"
|
||||
if f.exists():
|
||||
a = json.loads(f.read_text(encoding="utf-8"))
|
||||
for k in ("rejected_notfound", "rejected_ambiguous", "rejected_overlap",
|
||||
"rejected_empty", "malformed"):
|
||||
rej[k] += a[k]
|
||||
print(f" отказы аппликатора по всем диффам: {dict(rej)}")
|
||||
|
||||
tot = sum(r["cost_usd"] for r in recs.values())
|
||||
drafts = sum(json.loads(f.read_text(encoding="utf-8"))["cost_usd"]
|
||||
for f in RAW.glob("fp-draft-*.json"))
|
||||
print(f" деньги: вызовы ${tot:.6f} + черновики ${drafts:.6f} = ${tot + drafts:.6f}")
|
||||
check("П5 итог сошёлся с напечатанным скриптом ($0.349566)",
|
||||
abs(tot + drafts - 0.349566) < 1e-5, f"расхождение {tot + drafts - 0.349566:+.6f}")
|
||||
|
||||
tiny = [(t, len(recs[t]["content"])) for t in diffs if len(recs[t]["content"]) < 20]
|
||||
nc = []
|
||||
for t, _ in tiny:
|
||||
a = json.loads((RAW / f"{t}.applied.json").read_text(encoding="utf-8"))
|
||||
nc.append((t, a["no_change"]))
|
||||
check("П6 короткие дифф-ответы объяснены как NO_CHANGE",
|
||||
all(v for _, v in nc), f"короткие БЕЗ no_change: {[t for t, v in nc if not v]}")
|
||||
if nc:
|
||||
print(f" коротких дифф-ответов {len(nc)}, из них NO_CHANGE {sum(v for _, v in nc)}")
|
||||
|
||||
print(f"\n{'ПРОГОН ЧИСТ' if not FAIL else f'ПРОВАЛОВ: {FAIL}'}")
|
||||
sys.exit(1 if FAIL else 0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Add table
Reference in a new issue