Land the third-edition tier scripts into the repository so paid runs reproduce from the tree, with rig floor, judge variance and own-draft arms

This commit is contained in:
heaven 2026-08-07 13:49:42 +03:00
parent 769a2c8451
commit ae311e7470
5 changed files with 552 additions and 37 deletions

View file

@ -15,45 +15,39 @@
## ИТОГ — вход для решения владельца
**Решения на этих числах принимать нельзя.** Пак даёт согласованные НАПРАВЛЕНИЯ, но ни один
контраст не проходит поправку Holm на пять сравнений (лучший Holm 0.0555), шумовой пол пайплайна
не измерен вовсе, и три из четырёх «значимых» контрастов несёт один судья — аварийная лёгкая
замена. Что нужно доснять, чтобы получить решаемый ответ, — §8.
**Жилец роли редактора: `deepseek-v4-pro`.** Он лучше `glm-5` по качеству (+1.94 [+0.69, +3.19],
12 единиц из 16, прямой контраст одним судьёй) и вдвое дешевле ($0.00486 против $0.01011 за
боевую единицу с ногой черновика). Обе оси указывают в одну сторону — размена нет.
⚠ Статус разведочный: контраст добавлен после объявленного семейства.
**Единственное направление, устойчивое ко всему, что проверялось:** второй проход поверх дешёвого
черновика покупает качество на zh (+1.88). Переживает выброс одной и двух единиц (0 из 15 и 0 из
105), исключение единиц с механическим конфаундом (+1.65), не объясняется длиной; подтверждено
батареей (утечка ханьцзы 24→0) и слепым чтением. Ограничения: значимость несёт gemini (у luna
+0.84 [0.72, +2.31]); Holm не проходит; покупается ЯЗЫК и ТЕРМИН, ВЕРНОСТЬ ноль не покидает.
**Топология: связка и однопроходка НЕРАЗЛИЧИМЫ по качеству** (+0.25 [1.03, +1.56], 7 единиц в
каждую сторону при двух ничьих). Выбор решается не качеством, а двумя другими вещами: связка
дешевле на 36% и позволяет менять жильца редакторской роли, однопроходка нет.
⚠ Прежние заголовки ОБЕИХ редакций сняты: первая утверждала, что однопроходка доминирует, вторая —
что проигрывает; обе мерили однопроходку С МАНДАТОМ перевёрстки, который сам по себе вредит.
**Не установлено — «однопроходка проигрывает связке».** Измерен арм D, то есть однопроходка
С МАНДАТОМ, который этот же отчёт признаёт вредным. Рекомендуемая однопроходка — D_; её контраст
с A не куплен, косвенная оценка 0.67 (p≈0.30). Плюс контраст `D/A` смешивает три фактора: файл
промта, наличие черновика на входе и закон-блок (у D он есть, у A нет).
**Мандат перевёрстки однопроходке не нужен.** На zh он вредит, на en эффекта не даёт; гипотеза
«мандат есть пар-данные» прямым тестом интеракции не подтверждена (p≈0.09) и остаётся гипотезой.
**Не установлено — «второй проход покупает качество на en» (+1.00).** ДИ накрывает ноль при
выбрасывании одной единицы в 8 случаях из 12; перестановочный p=0.073; нижняя граница +0.04
зависит от розыгрыша bootstrap (ноль накрывается у 16.5% сидов).
**Второй проход покупает ЯЗЫК и платит ФОРМОЙ.** Разложение по осям: ЯЗЫК +3.09 [+2.31, +3.91],
ФОРМА 2.25 [3.81, 0.56]. ⚠ Но «портит форму» здесь означает слипание абзацев, а слипание есть
прямое исполнение мандата дискурс-перевёрстки боевого `editor.md`. Судья считает это дефектом,
конвейер — работой. **Продуктовое решение владельца, замером не разрешаемое.**
| Вопрос | Ответ | Оговорка |
|---|---|---|
| Нужен ли второй проход | Да по направлению, у трёх инструментов | значимость несёт один судья; Holm не проходит |
| Не выгоднее ли сразу сильной моделью | **Нет** — единственный вывод, устойчивый к смене судьи | Holm не проходит (p=0.021, Holm 0.063) |
| Кто жилец роли редактора | `deepseek-v4-pro`: качество неотличимо от `glm-5`, цена вдвое ниже | — |
| Что покупает второй проход | **ЯЗЫК** (+1.11) и **ТЕРМИН** (+0.45), не верность | §2.1а |
| Что делает мандат перевёрстки | бьёт по **ФОРМЕ** (0.47), прочие оси нулевые | контраст `D/D_` изолирует мандат НЕ чисто (§3) |
| Что покупает закон-блок | **ВЕРНОСТЬ** +0.63 [+0.33, +0.97] | суммарный перевес +0.33 гасит это осями |
**Механический слой отделяется детерминированно, судья не нужен.** Черновик несёт брак
(разметка, непереведённые остатки, исходная письменность) на 7 единицах из 16, любой второй
проход — на 13. Гейт стоит $0 и обязан стоять ДО судьи.
**Цена (p50 / p95, промт требовал оба).** Редакторский проход `deepseek-v4-pro` $0.00388 / $0.00518;
однопроходка $0.00487 / $0.00792; `glm-5` в роли редактора $0.00892 / $0.00956. На хвосте разрыв
между связкой и однопроходкой растёт, а не исчезает — «равная цена» была свойством медианы. ⚠ Цена черновика в цену связки **не сложена**: армы правят
замороженный черновик из корпуса пакета-6, чья цена не сохранена и чей производитель по записи
не устанавливается (§2.6). Цифра «связка дешевле/дороже однопроходки» из этого замера НЕ следует.
**Единственный результат, переживший поправку на множественность:** `B/F3` +3.81, Holm(3)=0.0001.
Остальные два контраста объявленного семейства её не проходят.
**Четыре ограничения вывода.** (1) Материал zh моделью узнаётся (4/5); пара en чище (1/5) и даёт
то же направление. (2) Дрейф на связном отрезке глав не мерен. (3) Армы C/E/G не гнались. (4) Ни
один результат не переживает поправку на множественность — нужен либо больший n, либо сужение
таблицы до заранее объявленного одного контраста.
**Что НЕ измерено и требует решения владельца:** дрейф на связном отрезке 810 глав · армы C/E/G
(точечный ремонт, обратная связка, маршрутизация — центральные топологии заказа, не гнались ни
разу) · слепое чтение владельца, единственное, что калибрует судью · арбитр вне семейства сессии
(нужны кредиты xAI).
**Деньги.** Пак целиком $4.85: первая редакция $2.62 (снята), вторая $1.68, третья $0.55.
Судейство третьей редакции — $0 (агенты сессии).
## §0 Пре-рег второй редакции (зафризен `d472599` до трат)
@ -228,8 +222,14 @@ A_law против A +0.63 [+0.33,+0.97]* +0.02 [0.32,+0.32] 0.18 [0.5
```
Каждый фактор попадает в свою ось: второй проход покупает **ЯЗЫК** и **ТЕРМИН**, а не верность;
мандат перевёрстки бьёт по **ФОРМЕ** и только по ней; закон-блок покупает **ВЕРНОСТЬ** (+0.63), и
именно этот эффект терялся в суммарном +0.33.
мандат перевёрстки бьёт по **ФОРМЕ** и только по ней; закон-блок покупает **ВЕРНОСТЬ** (+0.63).
**Разложение по осям читается как гипотеза, а не как замер.** Аудит судейских голосов по текстам
(07.08) нашёл систематическую утечку между осями: дефект вёрстки, видимый грепом (сырой markdown,
непереведённый заголовок, реплики в кавычках при сквозном тире), получал ФОРМА 0, а его вес уходил
в ВЕРНОСТЬ — в 7 голосах из 12 проверенных. Приписывание фактора к оси на этих показаниях
недостоверно; направление и величина СУММАРНОГО перевеса от этого не страдают, потому что сумма
осей от их перепутывания не меняется.
### 2.2 en→ru, судьи (12 единиц, 192 голоса) — переносится ли вывод на другую пару
@ -573,6 +573,112 @@ editor-mono, judge-selector, terminologist, translator-banknote), а `langpack.g
| 3 | Добор до 32 единиц по всей таблице | $1.194 | после всех смен армов |
| 4 | `grok-4.3` на расходящихся контрастах | $2.00 | только как арбитраж; требует кредитов xAI |
**ИСПОЛНЕНО ярусом 1 (07.08).**
*Пол рига — отрицательный контроль, парный к декою.* Арм `A` против собственного повтора `A` на
том же замороженном черновике, 16 единиц, оба судьи, оба порядка, 64 голоса, $0.21.
```
перевес A против A : +0.050 95% ДИ [1.15, +1.28] n=15 p=0.957
gpt-5.6-luna 0.156 · gemini-3.1-flash-lite +0.067
sd по единицам: 2.377 ← шум ОДНОГО ВЫЗОВА
```
При отсутствии разницы протокол перевеса не выдумывает. Риг теперь зажат с двух сторон: декой
показывает, что судья ВИДИТ посаженную разницу, пол — что он не видит несуществующей. До этого
замера контроль был только один.
**Шум одного вызова (2.377) БОЛЬШЕ любого измеренного эффекта** (+1.88, 1.72, 1.05). Это и
есть причина, по которой при n=15 ничто не проходит поправку — не слабость судей и не дефект
раскладки. Разброс перевеса по единицам в `A/F` составлял 2.375, то есть практически ровно шум
вызова ⇒ разнородности единиц почти нет, эффект однороден по материалу, и наращивание единиц бьёт
точно в цель. Для `D/D_` (эффект 1.05) при семействе из трёх требуется n≈30 — объявленные 32
попадают впритык.
*Разброс судьи-замены на повторе.* 60 пар повторов тех же клеток, $0.088.
```
абсолютный счёт повторился точно: 24/60 (40%)
|разница перевеса|: медиана 1.0 · среднее 0.73 · максимум 4
sd шума перевеса на голос: 0.81 ⇒ на оценку контраста по 15 единицам ±0.15
```
Расхождение судей на `A/F` (+0.84 у luna против +3.03 у gemini) составляет 2.19 — **четырнадцать
стандартных отклонений** собственного шума замены. Собственным шумом оно не объясняется: судьи
видят разное. ⇒ Третий голос нужен как АРБИТР (подтверждает вывод рецензии), но не как мощность.
*Покупка «пост-процессор против арма» отменена ДО траты, см. ниже.*
*Агент-судья вместо платного (амендмент владельца 07.08).* Та же рубрика, те же 32 пакета
контраста `A/F`, оба порядка, вслепую, ключ раскладки отдельно. Сверх платного протокола — строка
ОБОСНОВАНИЕ с цитатой на каждую ненулевую ось. Стоимость по ключам провайдеров: **$0**.
```
инструмент перевес A/F фора
агент-судья +0.69 [0.75, +2.22] p=0.41 +2.50
gpt-5.6-luna (платный) +0.84 [0.72, +2.31] —
gemini-flash-lite (платн.) +3.03 [+2.17, +3.90] —
оба платных вместе +1.88 [+0.72, +3.02] +3.60
```
**Агент лёг на luna и не лёг на gemini.** Два независимых инструмента из трёх дают интервал,
накрывающий ноль; значимость `A/F` несёт ОДИН судья — аварийная замена, взятая при исчерпании
кредитов xAI. Направление держится (10 единиц из 16 за связку), значимость — нет.
Три свойства замены, установленные замером:
* **позиционная фора ниже, но не исчезает** (+2.50 против +3.60) ⇒ фора есть свойство языковых
моделей в роли судьи вообще, а не дефект вендора; зеркальная раскладка обязательна при любом судье;
* **показания стали проверяемыми**: обоснование цитатой на ось против 111 знаков голых чисел
у платных, по которым аудит-след от числа к тексту не существовал;
* **ось СТИЛЬ сошлась зеркально во всех 16 парах** (где в порядке 0 выиграл вариант 1, там в
порядке 1 выиграл вариант 2) ⇒ на этой оси позиционного перекоса нет. Ось куплена в обеих
редакциях и до сих пор ни разу не была прочитана.
*Аудит платных голосов по текстам (07.08).* До него ни один судейский счёт не сверялся с текстом,
который он оценивал: проверялось поведение инструмента (доля разбора, фора, разброс), но не
правильность показаний. Проверить по диску было нельзя — ответ судьи это 111 знаков голых чисел,
аудит-следа от числа к тексту не существовало. Выборка 12 голосов, отобранная до чтения текстов:
6 с наибольшим по модулю перевесом + 6 случайных.
**Подтверждено моим пере-счётом:**
* **позиционная компонента в 0.84.9 раза больше эффекта арма** (полуразность порядков против
полусуммы): `A/F`·luna арм +0.84 против позиции +4.09; `D/A`·luna +1.94 против +5.31;
* **ложный перевес на почти одинаковых текстах**: на единице `217e4fab17` армы A и F совпадают
в 38 предложениях из 53, и судьи всё равно выдали перевес. Контроль Ф0.6 этого не ловил, потому
что мерил на ПОБАЙТНО одинаковых парах — задача заведомо легче;
* **нули на дефектном тексте**: 3 голоса из 126 дали все четыре оси нулём тексту с сырой разметкой
или латиницей (аудит заявлял 9 — завышено втрое);
* **утечка между осями** — см. оговорку к §2.1а выше.
**Опровергнуто:** несущий вывод аудита «зеркальная раскладка фору не гасит, строить сравнение
армов нельзя» неверен для НЕПРЕРЫВНОГО перевеса. Для зеркальной пары перевес порядка 0 есть
`истина + P`, порядка 1 — `истина P`; полусумма даёт истину, P сокращается алгебраически. Это
подтверждено эмпирически полом рига: арм против собственного повтора даёт +0.050 при p=0.957.
Аудит этого числа не видел. Также завышены две частные оценки (сходство единицы `8855eadc95`
заявлено 0.803, фактически 0.345; нулевых голосов 9 против фактических 3).
**Что действительно сломано форой:** правило вердикта «знак совпал в ОБОИХ порядках». При
|P| > |эффект| знаки в двух порядках расходятся почти всегда — отсюда 14 ничьих из 15 на `D/D_`.
Это отказ правила, а не его строгость. Колонки вердиктов переведены в справочные; решения
строятся на непрерывном перевесе.
*Гейт до судьи (детерминированно, $0), заведён по итогам аудита.* Механический брак ловится
грепом, и судья не обязан его замечать:
```
арм клеток с механическим браком (из 16)
F 9 markdown · латиница · ханьцзы · преамбула
A 2
B 3
D 1
D_ 1
A_law 3
```
Второй проход снижает механический брак с 9 единиц до 13 **без всякого судьи**. Такой гейт
обязан стоять ДО судейства: иначе бюджет судьи тратится на то, чтобы непоследовательно замечать
очевидное.
**Три решения рецензии, принятые против первоначального плана:**
1. **Третий судья — не покупка мощности.** Разложение дисперсии: он снижает стандартную ошибку
@ -599,6 +705,90 @@ editor-mono, judge-selector, terminologist, translator-banknote), а `langpack.g
---
## §10 ТРЕТЬЯ РЕДАКЦИЯ — результаты (агент-судья, собственный черновик)
Замер по объявленному ЗАРАНЕЕ семейству из трёх контрастов (§9). Судья — агент сессии, $0 по
ключам провайдеров, обоснование цитатой на каждую ненулевую ось. Армы правят СОБСТВЕННЫЙ
черновик пака: текст и цена происходят из одного вызова, провенанс проверяем.
```
контраст перевес 95% ДИ p (знак.перест.) Holm(3)
B против F3 +3.81 [+2.94, +4.78] <0.0001 0.0001 ПРОХОДИТ
A против F3 +1.59 [0.53, +3.72] 0.185 0.370
D_ против A +0.25 [1.03, +1.56] 0.756 0.756
```
**Первый результат пака, переживающий поправку на множественность.**
**Три вывода, отменяющие обе прежние редакции.**
1. **Однопроходка и связка НЕРАЗЛИЧИМЫ.** `D_` против `A`: +0.25, семь единиц в каждую сторону
при двух ничьих, интервал узкий. Это ничья, а не нехватка мощности. Первая редакция
утверждала, что однопроходка доминирует, вторая — что проигрывает; обе мерили арм `D`
**с мандатом перевёрстки**, который сам по себе вредит. Рекомендуемая однопроходка — `D_`,
без мандата — равна связке.
2. **Решает не топология, а ЖИЛЕЦ второго прохода.** `glm-5` бьёт черновик на +3.81 (16 единиц из
16, 8 независимых судей); `deepseek-v4-pro` на том же месте даёт +1.59 и ноль не покидает.
Вопрос «связка или однопроходка» оказался не тем вопросом.
3. **Экономика — за связку.** Связка $0.00499 против однопроходки без мандата $0.00533: связка
дешевле на 6% при равном качестве (с ожидаемой ценой ре-генов — на 3%, знак тот же). Связка
вдобавок позволяет менять жильца редакторской роли, однопроходка нет.
**Разведочный контраст `A_law` против `B` — прямой вопрос о жильце роли редактора.**
Добавлен ПОСЛЕ получения результатов семейства, поэтому статус разведочный, не подтверждающий:
поправка Holm к нему не применяется без нового пре-рега. Судья — один агент на все 32 файла,
с явным запретом делегировать. Изоляция проверена до замера: у обоих армов закон-блок, один и тот
же черновик, идентичное user-сообщение; различие — модель и гашение мышления.
```
A_law (deepseek-v4-pro) против B (glm-5): +1.94 [+0.69, +3.19] p=0.0142
12 единиц за deepseek-v4-pro · 4 за glm-5 · 0 ничьих
```
**Этот контраст ПЕРЕВОРАЧИВАЕТ косвенный вывод.** Через общий черновик выходило `B/F3` +3.81
против `A/F3` +1.59, то есть «glm-5 лучше». Напрямую — наоборот. Причина названа была заранее:
`A/F3` судил один агент, `B/F3` — восемь, и разница судейских ПОРОГОВ оказалась больше разницы
моделей. Сравнение контрастов через общую опорную точку недействительно, когда судьи разные.
**Изъян одиночного судьи: зеркало вырождается.** Проверка исполнением: во ВСЕХ 16 парах оценка
порядка 1 оказалась точным транспонированием оценки порядка 0 — судья не пере-читал текст,
а переставил собственные числа (при том, что в ответе заявил обратное). Следствие: позиционного
контроля этот контраст не даёт вовсе, и на единицу приходится ОДНА оценка, а не две.
Это обратная беда к предыдущей, и вместе они задают правильную схему: **один судья на весь
порядок, РАЗНЫЕ судьи между порядками.** При раздаче внутри порядка путаются пороги; при одном
судье на оба порядка исчезает позиционный контроль.
**Оговорки, едущие с числами.**
* Два контраста из трёх судились НЕСКОЛЬКИМИ агентами: судья пачки самовольно раздал файлы
`B/F3` — восьми, в `D_/A` — нескольким), причём так, что `o0` и `o1` одного хеша всегда
попадали к разным судьям. Порядок и судья менялись вместе ⇒ позиционную компоненту в этих
контрастах изолировать нельзя. Она гасится усреднением (в `D_/A` составила +2.31), но её
собственная оценка загрязнена. **Причина — дефект моей постановки:** я просил одного судью и
не написал «не делегируй». Исправлено в инструкции следующего контраста.
* `A/F3` судил один агент, `B/F3` — восемь ⇒ прямое сравнение этих двух контрастов недопустимо:
разница +1.59 против +3.81 может быть разницей судейских порогов. Отсюда добавлен прямой
контраст `A_law` против `B` одним судьёй — см. ниже.
* Агент-судья видит всю пачку в одном контексте и потому опознаёт зеркальные пары. У платного
судьи такого знания нет: каждый его голос — отдельный вызов без памяти. Асимметрия объявлена.
* Разброс агента-судьи на повторе измерен побочно (четыре файла просужены дважды): вердикт по
стилю совпал 4/4, знак разрыва 4/4, абсолютные уровни разошлись втрое. ⇒ **Абсолютные уровни
между файлами несопоставимы, сопоставима только разность внутри файла.**
**Ось ФОРМА штрафует исполнение продуктового мандата — конфаунд, замером не разрешаемый.**
Разложение `A/F3` по осям: ЯЗЫК +3.09 [+2.31, +3.91], ФОРМА 2.25 [3.81, 0.56], ВЕРНОСТЬ и
ТЕРМИН ноль не покидают. То есть второй проход — РАЗМЕН: покупает русский язык, платит формой,
и эффекты почти гасятся. Но «портит форму» означает слипание абзацев, а слипание есть прямое
исполнение мандата дискурс-перевёрстки боевого `editor.md`. Замер: исходник 45 абзацев, оба
черновика 4446, редакторский проход 24, однопроходка 20. Судья считает слияние дефектом,
конвейер — выполненной работой. **Это продуктовое решение владельца, а не измеряемая величина.**
**Гейт до судьи (детерминированно, $0).** Механический брак на 16 единицах: черновик 7 единиц,
редакторские армы 13, однопроходки 1. Разделение чистое и судьи не требует.
---
## §7 Воспроизведение
```

View file

@ -217,6 +217,55 @@ def build_msgs(arm: str, u: dict) -> list[dict]:
return Q.messages(spec["contract"], src, draft, blk)
def own_draft(uid: str) -> str:
"""Черновик, КУПЛЕННЫЙ этим паком и прошедший гейт годности. Пусто — годного нет.
Заведено 07.08 по адверсариальному ревью. До этого арм F брал ТЕКСТ из корпуса пакета-6,
а ЦЕНУ из докупленных черновиков; тексты не совпадали ни на одной единице (близость 0.195),
а поля модели в записи корпуса нет, то есть провенанс был непроверяем. Здесь текст и цена
происходят из ОДНОГО вызова, и он воспроизводим кодом в дереве.
"""
best = ""
for f in sorted(OUT.glob(f"bo2-DRAFT-{uid}*.json")):
c = json.loads(f.read_text(encoding="utf-8")).get("content", "")
if c and not draft_reject_reason(c):
best = c
return best
def build_msgs3(arm: str, u: dict) -> list[dict]:
"""Сообщения арма ТРЕТЬЕЙ редакции: тот же сбор, но черновик — собственный."""
spec = ARMS[arm]
if spec["contract"] in ("direct", "direct-reflow"):
return build_msgs(arm, u) # однопроходки черновика не видят
src = u["source"]
terms = [t for t in IP.TERMS if t in src]
blk = P.editor_block(terms, P.HEADER_LAW_PLAIN, None) if (spec["block"] and terms) else None
return Q.messages(spec["contract"], src, own_draft(u["uid"]), blk)
def run_arm3(arm: str, u: dict) -> dict:
spec = ARMS[arm]
model = spec["model"]
kw: dict = dict(model=model, messages=build_msgs3(arm, u), max_tokens=16000, temperature=0.4)
if spec["think"] == "off":
if not model.startswith("glm"):
raise SystemExit(f"гашение размышления у {model} не описано в quirks — не гадаю")
kw["extra_body"] = {"thinking": {"type": "disabled"}}
return BUY.purchase(LED_ARMS, f"bo4-{arm}-{u['uid']}", model, client(model), kw,
arm=arm, uid=u["uid"], edition=3)
def text3_of(arm: str, u: dict) -> str:
"""Выход арма третьей редакции. F3 — сам купленный черновик: текст и цена из одного вызова."""
if arm in ("F", "F3"):
return own_draft(u["uid"])
f = OUT / f"bo4-{arm}-{u['uid']}.json"
if f.exists():
return json.loads(f.read_text(encoding="utf-8"))["content"]
return text_of(arm, u) # однопроходки не пере-гоняются
def run_draft(u: dict) -> dict:
"""Черновик боевой конфигурации НА ЭТИХ ЖЕ единицах — нога цены всех связок.
@ -449,8 +498,11 @@ def cmd_score() -> None:
bias = position_bias()
print(f"ПОЗИЦИОННАЯ ФОРА СУДЬИ (контроль исправности раскладки): {bias:+.2f} ошибки в пользу "
f"первого варианта\n")
print("ПАРНЫЕ ВЕРДИКТЫ. Перевес единицы = среднее ДВУХ зеркальных голосов; вердикт требует,\n"
"чтобы знак сохранился в ОБОИХ порядках у ОБОИХ судей.\n")
print("⚠ КОЛОНКИ ВЕРДИКТОВ СПРАВОЧНЫЕ, решения на них не строятся. Правило «знак совпал в обоих\n"
"порядках» отказывает при позиционной форе больше эффекта: перевес в порядке 0 есть\n"
"истина+P, в порядке 1 — истинаP, и при |P|>|истина| знаки расходятся почти всегда\n"
"(отсюда 14 ничьих из 15 на D/D_). Несущая статистика — НЕПРЕРЫВНЫЙ перевес: полусумма\n"
"двух порядков, в которой P сокращается тождественно (проверено полом рига: +0.05, p=0.96).\n")
print(f"{'контраст':16s}{'единиц':>8s}{'за первый':>11s}{'за второй':>11s}{'ничья':>8s}"
f"{'перевес':>10s}{'95% ДИ':>18s}")
print("-" * 82)
@ -484,6 +536,29 @@ def cmd_score() -> None:
print(f"{a + ' против ' + b:16s}{n:8d}{wins_a:11d}{wins_b:11d}{tie:8d}{eff:+10.2f}"
f" [{lo:+.2f}, {hi:+.2f}]{star}")
print("\nГЕЙТ ДО СУДЬИ (детерминированно, $0). Механический брак ловится грепом, и судья не\n"
"обязан его замечать — на 126 голосах он трижды выставил ВСЕ НУЛИ тексту с сырой\n"
"разметкой или латиницей. Такие клетки помечаются здесь, а не покупаются у судьи.")
import re as _re
flags = {}
for arm in ("F", *ARMS):
for u in us:
t_ = text_of(arm, u)
d = []
if _re.search(r"^\s{0,3}#{1,6}\s|\*\*", t_, _re.M):
d.append("markdown")
if _re.findall(r"[\u4e00-\u9fff]", t_):
d.append("ханьцзы")
if _re.findall(r"\b[A-Za-z]{4,}\b", t_):
d.append("латиница")
if _re.match(r"^\s*(?:вот\s+)?перевод[^\n:]{0,80}:", t_, _re.I):
d.append("преамбула")
if d:
flags.setdefault(arm, []).append((u["uid"][:6], "+".join(d)))
for arm in ("F", *ARMS):
v = flags.get(arm, [])
print(f" {arm:6s} клеток с механическим браком: {len(v):2d} {v[:4]}")
print("\nПО СУДЬЯМ ОТДЕЛЬНО. ⚠ Эффект, который несёт ОДИН судья, — свойство судьи, а не армов.")
print(f"{'контраст':16s}" + "".join(f"{j.split('-')[0]:>26s}" for j in J.JUDGES))
for a, b in CONTRASTS:

View file

@ -0,0 +1,33 @@
<!-- УРАВНЕННАЯ ПАРА ПРОМТОВ D / D_ для контраста «мандат перевёрстки», заведена полигоном 07.08.
Причина: прежний контраст мандат НЕ изолировал. D брался из eval/editor_harness/translator-reflow.md,
D_ — из боевого translator.md, и они различались ТРЕМЯ вещами сразу: наличием блока перевёрстки,
собственной вёрсточной строкой у D_, и не-вёрсточным правилом про чэнъюй внутри блока у D.
Системный промт D был длиннее в 1.92 раза. Найдено адверсариальным ревью второй редакции.
Уравнивание: ОБА промта несут общую базу — боевой translator.md плюс правило про чэнъюй,
вынесенное из блока перевёрстки (оно про верность, а не про вёрстку). Единственное различие —
НАЛИЧИЕ блока ДИСКУРС-ПЕРЕВЁРСТКИ. Остаточный конфаунд объявляется: мандат по своей природе
есть добавочный текст, поэтому промт с ним длиннее; убрать это, не убрав сам мандат, нельзя. -->
Ты — профессиональный литературный переводчик с языка «{{source_lang}}» на язык «{{target_lang}}».
Жанр книги: {{genre}}. Аудитория: {{audience}}. Книга: «{{title}}».
Правила перевода (translation brief):
- Хонорифики: {{honorifics}}. Транскрипция имён и реалий: {{transcription}}.
- Баланс форенизация/доместикация (0 — полная адаптация, 1 — сохранение чужого): {{venuti}}.
- Сноски: {{footnotes}}.
- Переводи ВСЕ предложения исходника: ничего не пропускай, не сокращай и не добавляй от себя.
- Вёрстка — по нормам русского языка, НЕ копируй построчную разбивку исходника: реплики прямой речи оформляй с нового абзаца через тире «—».
- Пиши живым литературным русским языком; избегай канцелярита и калек с исходного языка.
Единицы и приёмы (общие для zh→ru):
- МЕРЫ переводи в привычные читателю единицы: китайский 时辰 = 2 часа (三个时辰 ≈ шесть часов, 半个时辰 ≈ час), сам термин не транслитерируй. Доля 成 — это десятые (六成 = 60%, 六成六 = 66%), а НЕ десятичная дробь «6,6».
- СТИХИ и названия классики передавай ПО СМЫСЛУ (не транслитерацией), опираясь на существующие русские переводы.
- Род и форму имён собственных и терминов бери из приложенного глоссария (если он есть).
- ИДИОМЫ и чэнъюй передавай ОБОИМИ смысловыми компонентами, не сворачивая в общий смысл (物是人非 = «вещи те же, люди не те», а не «всё изменилось»).
Выведи ТОЛЬКО перевод, без служебных преамбул, комментариев, пояснений и markdown-заголовков.
---USER---
Переведи следующий фрагмент:
{{text}}

View file

@ -0,0 +1,38 @@
<!-- УРАВНЕННАЯ ПАРА ПРОМТОВ D / D_ для контраста «мандат перевёрстки», заведена полигоном 07.08.
Причина: прежний контраст мандат НЕ изолировал. D брался из eval/editor_harness/translator-reflow.md,
D_ — из боевого translator.md, и они различались ТРЕМЯ вещами сразу: наличием блока перевёрстки,
собственной вёрсточной строкой у D_, и не-вёрсточным правилом про чэнъюй внутри блока у D.
Системный промт D был длиннее в 1.92 раза. Найдено адверсариальным ревью второй редакции.
Уравнивание: ОБА промта несут общую базу — боевой translator.md плюс правило про чэнъюй,
вынесенное из блока перевёрстки (оно про верность, а не про вёрстку). Единственное различие —
НАЛИЧИЕ блока ДИСКУРС-ПЕРЕВЁРСТКИ. Остаточный конфаунд объявляется: мандат по своей природе
есть добавочный текст, поэтому промт с ним длиннее; убрать это, не убрав сам мандат, нельзя. -->
Ты — профессиональный литературный переводчик с языка «{{source_lang}}» на язык «{{target_lang}}».
Жанр книги: {{genre}}. Аудитория: {{audience}}. Книга: «{{title}}».
Правила перевода (translation brief):
- Хонорифики: {{honorifics}}. Транскрипция имён и реалий: {{transcription}}.
- Баланс форенизация/доместикация (0 — полная адаптация, 1 — сохранение чужого): {{venuti}}.
- Сноски: {{footnotes}}.
- Переводи ВСЕ предложения исходника: ничего не пропускай, не сокращай и не добавляй от себя.
- Вёрстка — по нормам русского языка, НЕ копируй построчную разбивку исходника: реплики прямой речи оформляй с нового абзаца через тире «—».
- Пиши живым литературным русским языком; избегай канцелярита и калек с исходного языка.
Единицы и приёмы (общие для zh→ru):
- МЕРЫ переводи в привычные читателю единицы: китайский 时辰 = 2 часа (三个时辰 ≈ шесть часов, 半个时辰 ≈ час), сам термин не транслитерируй. Доля 成 — это десятые (六成 = 60%, 六成六 = 66%), а НЕ десятичная дробь «6,6».
- СТИХИ и названия классики передавай ПО СМЫСЛУ (не транслитерацией), опираясь на существующие русские переводы.
- Род и форму имён собственных и терминов бери из приложенного глоссария (если он есть).
- ИДИОМЫ и чэнъюй передавай ОБОИМИ смысловыми компонентами, не сворачивая в общий смысл (物是人非 = «вещи те же, люди не те», а не «всё изменилось»).
Выведи ТОЛЬКО перевод, без служебных преамбул, комментариев, пояснений и markdown-заголовков.
ДИСКУРС-ПЕРЕВЁРСТКА (обязательная операция передачи китайского паратаксиса в русскую гипотактическую прозу — это КОНВЕНЦИЯ русского языка, а не вольность):
1. Молча определи смысловые ходы фрагмента: единый фокал/наблюдатель; действие и его непосредственная реакция; одна тема рассуждения; границы — смена говорящего, времени, места или фокала.
2. Один повествовательный ход оформляй ОДНИМ русским абзацем, ДАЖЕ если китайский исходник разбит на однофразовые строки. Инструмент слияния — причастные и деепричастные обороты, подчинительные союзы и связки. Не сливай ТОЛЬКО ради длины и не теряй смысловые атомы.
3. Разрешено объединять и делить русские предложения; число предложений и абзацев совпадать с исходником НЕ обязано.
---USER---
Переведи следующий фрагмент:
{{text}}

179
eval/role_topology/tiers.py Normal file
View file

@ -0,0 +1,179 @@
#!/usr/bin/env python3
"""ЯРУСЫ ТРЕТЬЕЙ РЕДАКЦИИ — платные прогоны, воспроизводимые ИЗ РЕПОЗИТОРИЯ.
Заведён 07.08 по собственной находке: покупки ярусов 1 и 2 были сделаны скриптами, лежавшими
во временном каталоге сессии, а не в дереве. Это ровно тот дефект, за который снята первая
редакция («$2.57 из $2.62 потрачены незафиксированным кодом»), и я его повторил. Здесь тот же
код лежит в зоне и коммитится пре-рег-фризом; все покупки кэшируются по тегу, поэтому повторный
запуск ничего не перекупает, а лишь пере-выводит числа.
Порядок ярусов задан каскадом зависимостей (§9 отчёта) и не переставляется:
--floor пол рига: арм A против собственного повтора A' на том же замороженном черновике.
Отрицательный контроль, парный к декою: декой проверяет, что судья ВИДИТ посаженную
разницу, пол что он не видит несуществующей.
--variance разброс судьи-замены на повторе: решает, нужен ли третий судья как арбитр.
--arms3 армы третьей редакции на СОБСТВЕННОМ черновике: текст и цена из одного вызова.
--report свод всех трёх, $0.
Запуск: eval/.venv/bin/python eval/role_topology/tiers.py --floor|--variance|--arms3|--report
"""
from __future__ import annotations
import json
import statistics as st
import sys
import time
from pathlib import Path
REPO = Path("/home/ubuntu/projects/textmachine")
sys.path.insert(0, str(REPO / "eval" / "role_topology"))
import bakeoff as BO # noqa: E402
import buy as BUY # noqa: E402
import judges as J # noqa: E402
OUT = Path.home() / "books" / "role-topology"
# Потолки ярусов объявлены здесь и в §9 отчёта ДО первой покупки.
LED_FLOOR_ARMS = BUY.Ledger("пол рига: армы", 0.20, ("bo3-*.json",), default_expect=0.006)
LED_FLOOR_JUDGE = BUY.Ledger("пол рига: судьи", 0.30, ("jf-*.json",), default_expect=0.003)
LED_VARIANCE = BUY.Ledger("разброс судьи-замены", 0.15, ("jr-*.json",), default_expect=0.003)
def cmd_floor() -> None:
"""Пол рига. Второе назначение — разделение дисперсии: сколько даёт шум одного вызова,
а сколько разнородность единиц. От этого зависит, что покупать дальше: единицы или повторы."""
for u in BO.units():
spec = BO.ARMS["A"]
m = spec["model"]
kw = dict(model=m, messages=BO.build_msgs("A", u), max_tokens=16000, temperature=0.4)
r = BUY.purchase(LED_FLOOR_ARMS, f"bo3-Aprime-{u['uid']}", m, BO.client(m), kw,
arm="Aprime", uid=u["uid"])
if r.get("skipped"):
print("⛔ потолок армов пола")
return
time.sleep(0.15)
def text_ap(u: dict) -> str:
return json.loads((OUT / f"bo3-Aprime-{u['uid']}.json").read_text(encoding="utf-8"))["content"]
for u in BO.units():
ta, tb = BO.text_of("A", u), text_ap(u)
if not ta.strip() or not tb.strip():
continue
for jd in J.JUDGES:
for o in (0, 1):
v1, v2 = (ta, tb) if o == 0 else (tb, ta)
r = BUY.purchase(LED_FLOOR_JUDGE, f"jf-AvAprime-{u['uid']}-o{o}-{jd}-r1", jd,
J.client(jd), J.vote_kw(jd, J.packet(u["source"], v1, v2)),
contrast="AvAprime", uid=u["uid"], order=o, judge=jd)
if r.get("skipped"):
print("⛔ потолок судейства пола")
return
time.sleep(0.1)
report_floor()
def report_floor() -> None:
per, by_j = [], {}
for u in BO.units():
pj = []
for jd in J.JUDGES:
ms = []
for o in (0, 1):
e = BO.vote_errors(OUT / f"jf-AvAprime-{u['uid']}-o{o}-{jd}-r1.json")
if e:
ms.append((e[1] - e[0]) if o == 0 else (e[0] - e[1]))
if len(ms) == 2:
pj += ms
by_j.setdefault(jd, []).append(st.mean(ms))
if len(pj) == 2 * len(J.JUDGES):
per.append(st.mean(pj))
if not per:
print("голосов пола нет")
return
lo, hi = BO.boot_ci(per)
print(f"ПОЛ РИГА: A против A' = {st.mean(per):+.3f} 95% ДИ [{lo:+.2f}, {hi:+.2f}] "
f"n={len(per)} p={BO.sign_perm_p(per):.4f}")
print(f" sd по единицам {st.pstdev(per):.3f} ← ШУМ ОДНОГО ВЫЗОВА; истинная разница здесь НОЛЬ")
for jd, v in by_j.items():
print(f" {jd:24s} {st.mean(v):+.3f}")
def cmd_variance() -> None:
"""Разброс судьи-замены: повторяем УЖЕ КУПЛЕННЫЕ клетки тем же запросом."""
cand = "gemini-3.1-flash-lite"
pairs = []
for a, b in (("A", "F"), ("D", "A")):
for u in BO.units():
for o in (0, 1):
src = OUT / f"jv2-{a}v{b}-{u['uid']}-o{o}-{cand}-r1.json"
if not src.exists():
continue
ta, tb = BO.text_of(a, u), BO.text_of(b, u)
v1, v2 = (ta, tb) if o == 0 else (tb, ta)
rec = BUY.purchase(LED_VARIANCE, f"jr-{a}v{b}-{u['uid']}-o{o}-r2", cand,
J.client(cand), J.vote_kw(cand, J.packet(u["source"], v1, v2)),
contrast=f"{a}v{b}", uid=u["uid"], order=o, judge=cand)
if rec.get("skipped"):
print("⛔ потолок разброса")
break
e1 = BO.vote_errors(src)
e2 = BO.vote_errors(OUT / f"jr-{a}v{b}-{u['uid']}-o{o}-r2.json")
if e1 and e2:
pairs.append((sum(e1), sum(e2), e1[1] - e1[0], e2[1] - e2[0]))
time.sleep(0.1)
if not pairs:
print("пар повтора нет")
return
exact = sum(1 for x in pairs if x[0] == x[1])
mar = [abs(x[2] - x[3]) for x in pairs]
print(f"РАЗБРОС СУДЬИ-ЗАМЕНЫ: пар {len(pairs)} · ${LED_VARIANCE.spent():.5f}")
print(f" абсолютный счёт повторился точно: {exact}/{len(pairs)} ({exact / len(pairs):.0%})")
print(f" |разница перевеса|: медиана {st.median(mar):.1f} среднее {st.mean(mar):.2f} макс {max(mar)}")
print(f" sd шума перевеса на голос: {st.pstdev([x[2] - x[3] for x in pairs]) / 2 ** 0.5:.2f}")
def cmd_arms3() -> None:
"""Армы третьей редакции на собственном черновике. Черновик добирается до годного."""
for u in BO.units():
if not BO.own_draft(u["uid"]):
BO.run_draft(u)
miss = [u["uid"][:8] for u in BO.units() if not BO.own_draft(u["uid"])]
if miss:
print(f"⚠ единиц без годного черновика: {len(miss)} {miss}")
for arm in ("A", "A_law", "B"):
for u in BO.units():
r = BO.run_arm3(arm, u)
if r.get("skipped"):
print("⛔ потолок армов")
return
time.sleep(0.15)
print(f"армы третьей редакции готовы · касса ${BO.LED_ARMS.spent():.5f} из ${BO.CEIL_ARMS}")
report_econ()
def report_econ() -> None:
costs = [sum(json.loads(f.read_text(encoding="utf-8")).get("cost_usd", 0.0) or 0.0
for f in OUT.glob(f"bo2-DRAFT-{u['uid']}*.json")) for u in BO.units()]
att = [len(list(OUT.glob(f"bo2-DRAFT-{u['uid']}*.json"))) for u in BO.units()]
print(f"\nЧЕРНОВИК: медиана ${st.median(costs):.5f} · ОЖИДАЕМАЯ ${st.mean(costs):.5f} "
f"· ре-ген на {sum(1 for a in att if a > 1)}/{len(att)} единиц")
for arm in ("A", "A_law", "B"):
c = [json.loads((OUT / f"bo4-{arm}-{u['uid']}.json").read_text(encoding="utf-8"))["cost_usd"]
for u in BO.units() if (OUT / f"bo4-{arm}-{u['uid']}.json").exists()]
if c:
print(f" {arm:6s} собственный вызов ${st.median(c):.5f} · "
f"ПОЛНАЯ связка ${st.median(costs) + st.median(c):.5f}")
def cmd_report() -> None:
report_floor()
print()
cmd_variance.__doc__ # noqa: B018
report_econ()
if __name__ == "__main__":
a = sys.argv[1:] or ["--report"]
{"--floor": cmd_floor, "--variance": cmd_variance, "--arms3": cmd_arms3,
"--report": cmd_report}.get(a[0], lambda: print(__doc__))()