diff --git a/docs/experiments/23-editor-tier.md b/docs/experiments/23-editor-tier.md index 2d93c8a3..ce5166e6 100644 --- a/docs/experiments/23-editor-tier.md +++ b/docs/experiments/23-editor-tier.md @@ -3459,3 +3459,150 @@ RG glm-5 0.0029 0 1 600 ← НОЛЬ факт **$0.1546** за 32 клетки, все `finish=stop`, гейт годности не поднял ни одной. Оба чужих вендора оказались кратно дешевле `dspro` в этой роли: `glm-5` в 9.6 раза, `grok-4.3` в 4.1 раза. Риск «grok разгонит размышление ×163» НЕ реализовался: 737 токенов против 6 139 у `dspro`. + +## Д26 — ⭐ ВТОРАЯ ПАРА: КИТАЙСКАЯ ПАНЕЛЬ ТЕМ ЖЕ ПРИБОРОМ. РЕПЛИКАЦИЯ И ЕЁ ГРАНИЦА + +12 глав китайской пары, 8 архитектур, один читатель на главу, из УЖЕ КУПЛЕННОГО — $0. +Сессия #96 журнала, идентичность читателей записана ДО. Аудит: 12 читателей, по 4–9 вызовов, +по 2 пути у каждого, запретных обращений 0, чужих глав 0. Сборка сверена гейтом `--verify-read`: +96 текстов побайтно против клеток, совпадающих армов нет, раскладок 12 разных. + +⚠ 4 главы из 16 пропущены и это НАПЕЧАТАНО: у них нет клетки `Z8R`. Промт-роль (`RN`) в панель не +взята сознательно — её клеток на zh 14 из 16, и включение срезало бы выборку до 7 глав. После +сегодняшнего же урока про размер выборки это плохой размен; вывод о промте-роли на китайской паре +остаётся НЕ ВЫНЕСЕННЫМ, а не вынесенным на семи главах. + +### Д26.1 Порядок + +``` +арм ср. место (zh) место на en что это +Z1 3.17 5.20 критик → ПОЛНЫЙ перепис +ZP 3.21 5.57 однопроходка-склейка +Z0 3.29 4.17 боевая связка, продакшен +Z7 3.79 5.70 однопроходка + канон-фиксер +Z8R 4.00 5.50 обогащённый черновик + перепис +ZF 4.21 3.63 боевая связка, 2-я генерация +ZD 7.08 8.20 голый черновик +Z8 7.25 9.30 обогащённый черновик без переписа + +пол Z0/ZF: −0.92 при пороге 2.23 — НЕразличимы, как обязаны (контроль ЗЕЛЁНЫЙ) +декой ZD : внизу на 11 главах из 12 (контроль ЗЕЛЁНЫЙ) + +связка ↔ Z1 −0.58 порог 1.93 в пределах +связка ↔ ZP −0.54 порог 1.81 в пределах +связка ↔ Z7 +0.04 порог 1.81 в пределах +связка ↔ Z8R +0.25 порог 2.26 в пределах +связка ↔ ZD +3.33 порог 1.28 РАЗЛИЧИМ p=0.0005 +связка ↔ Z8 +3.50 порог 1.29 РАЗЛИЧИМ p=0.0010 +``` + +### Д26.2 ⭐⭐ ЧТО РЕПЛИЦИРОВАЛОСЬ, А ЧТО — НЕТ. Это главный вывод дуги + +**Реплицировалось в точности, на обеих парах, обоими контролями зелёными:** +1. **Второй проход нужен.** `ZD` различимо последний и там, и там (en +4.30, zh +3.33). +2. **Обогащение промта черновика вредит.** `Z8` — единственный арм, стоящий НИЖЕ голого черновика + на ОБЕИХ парах. Прежде это было утверждение на грани; теперь оно различимо дважды. +3. **Всё остальное — в пределах порога.** Шесть (en) и четыре (zh) арма середины неразличимы + от продакшена ни на одной паре. + +⛔ **НЕ реплицировалось: ПОРЯДОК ВНУТРИ СЕРЕДИНЫ.** На английской паре боевая связка забрала первые +два места; на китайской она третья, а впереди стоят критик-перепис и однопроходка. Разрывы при +этом с обеих сторон меньше порога — то есть **перестановка середины и есть наблюдаемый шум**, +а не открытие о китайской паре. + +⇒ **Формулировку Д24.3 №1 («боевую связку не обошёл никто») читать вместе с этим: она верна для +английской панели и НЕ верна для китайской.** Это ровно та норма, которую фаза записала 20.08 и +тут же нарушила: эффект, замеренный на одной паре, не называть свойством, пока он не проверен на +второй. Правильная формулировка одна: **ни одна архитектура второго прохода не отличима от другой +ни на одной паре.** + +### Д26.3 Что это значит для продукта + +Если четыре схемы второго прохода неразличимы по качеству на 27 главах двух пар при зелёных +контролях, то **выбирать между ними надо не качеством, а ценой, детерминизмом и простотой** — +качество их не различает, и дальнейшие замеры этого класса покупают шум. + +Практический порядок кандидатов при равенстве качества: +* **однопроходка** — ОДИН дорогой вызов вместо двух, и по банку терминов она уже выигрывала на + обеих парах (zh 1.38 против 2.88, en 0.31 против 0.56); +* **боевая связка** — два вызова, зато дешёвый черновик выносит письмо из дорогого канала + размышления (механизм Д-трейса) и результат промежуточной стадии виден и переиспользуем; +* **критик → полный перепис** — два дорогих вызова, преимущества по качеству не показал; +* **обогащённый черновик** — ОТРИЦАТЕЛЬНО дважды, снимается с рассмотрения. + +⛔ Оговорки те же и не смягчаются: одно судейское семейство · один читатель на главу · +один жилец в роли переводчика. + +## Д27 — АУДИТ ПРОГОНА СУДЕЙСТВА (вопрос владельца 21.08: «прошло без инцидентов?») + +Проверялось ИСПОЛНЕНИЕМ, а не по памяти. Четыре линии. + +### Д27.1 Получили ли читатели ровно то, что задумано + +``` +en/arch2 165 текстов побайтно = клетки своих армов · 15 раскладок разных · имён армов 0 +zh/zhpanel 96 текстов побайтно = клетки своих армов · 12 раскладок разных · имён армов 0 +исходник каждой главы — тот самый · «торопиться не надо» в каждом пакете +аудит транскриптов: 27 читателей, по 2 пути у каждого (свой пакет, свой ответ), + запретных обращений 0, чужих глав 0, дифф-инструментов 0 +``` + +### Д27.2 ⛔ ИНЦИДЕНТ 1: панель показывала МЕНЬШЕ текстов, чем армов + +`Z7` ≡ `ZP` побайтно на 12 английских главах из 15 (Д23.6). Читатели это НАШЛИ САМИ и связали +знаком `=`. Задумано было 11 различных текстов — фактически показано 10. +**Следствие для вердикта:** место `Z7` на этих главах есть место `ZP`; арм «однопроходка + +канон-фиксер» отсужен фактически на 3 главах. Прочих армов не касается. + +### Д27.3 ⛔ ИНЦИДЕНТ 2: в китайскую панель прошла ОБОРВАННАЯ клетка продакшена + +Глава `41599f30df`, арм `Z0`: `finish=length` (упёрлась в потолок вывода 16 000), 5 759 знаков +против медианы панели 6 888. Читатель законно поставил её последней — у текста оборвана +кульминация сцены. + +**Причина найдена в коде, а не угадана:** `contour.base_a0` (источник арма `Z0`) читает `content` +БЕЗ проверки `finish`, тогда как соседний `base_draft` гейт годности имеет на обеих ветках. +Щель ровно в одну функцию. Масштаб замерен: **из 22 клеток боевой связки оборвана ОДНА**; +у второй генерации (`ZF`) такая клетка тоже есть, но она уже была в карантине и в панель не попала. + +**Чувствительность посчитана и печатается, а не прячется** (`--drop=41599f30`): +``` + все 12 глав без оборванной (11) +Z0 3.29 2.86 ← из третьего места в первое +ZP 3.21 3.32 +Z1 3.17 3.36 +контроль пола −0.92 / 2.23 −1.36 / 2.05 (оба раза НЕразличимы) +ZD / Z8 различимо последние в обоих сводах +``` +⇒ **Качественный вердикт устоял:** середина неразличима, низ различим, контроли зелёные. +**Порядок внутри середины перевернулся от ОДНОЙ главы** — что само по себе третье независимое +подтверждение Д26.2: этот порядок и есть шум. + +**Лечение — гейт, а не правка данных.** `--verify-read` теперь роняет сборку, если текст арма +короче 0.85 медианы панели. Проверен на больном входе (ловит `41599f30`) и молчит на английской +панели. Правку самого `base_a0` сессия НЕ делает: он питает ВСЕ прошлые замеры фазы, и тихая +смена его поведения рассогласовала бы их с уже вынесенными вердиктами. **Это вопрос владельцу.** + +### Д27.4 Ошибки в выводах читателей — искали, не нашли + +* **Разбор порядка однозначен.** В каждом из 27 ответов ровно ОДНА цепочка полной длины + (следующая по длине — 2–3 метки), метки не повторяются, разобранный порядок совпадает с тем, + что читатель назвал словами. +* **Все 12 английских заявлений «совпадают дословно» — ВЕРНЫ** (проверено побайтно). Ни одного + ложного заявления о тождестве. +* **Три китайских заявления, помеченных моей проверкой как ложные, оказались ЛОЖНОЙ ТРЕВОГОЙ + ПРОВЕРКИ.** Читатели писали «совпадают ПРАКТИЧЕСКИ дословно» и тут же называли расхождение; + мой матчер цеплялся за слово «дословн» и за соседнее предложение о другой паре. Вскрыто чтением + самих строк — не отменено. Класс уже известен фазе (ложная тревога 20.08 про слово «метки»). +* **Выборочная проверка содержательных утверждений — 4 из 4 подтвердились побайтно:** + «единственное расхождение Т1/Т7» (различаются ровно два слова) · «у варианта выпало первое + предложение исходника» (выпало) · «текст оборван на середине фразы» (оборван — это инцидент 2) · + «девиз инвертирован» («Пусть нас всегда больше… Зато мы всегда сильнее» против «в меньшинстве, + но никогда не слабее»). + +### Д27.5 Что осталось НЕ проверенным и это не смягчается + +Одно судейское семейство · один читатель на главу (разброс прибора не мерен ни разу) · +английский исходник подаётся моделям одним блоком без авторских абзацев (наш баг экстрактора, +Д-долг бэкенду) — читателям он показан таким же, каким его видели все армы, поэтому контраст +честен, но материал искажён у ВСЕХ одинаково. diff --git a/eval/dovodka/rol.py b/eval/dovodka/rol.py index 4c5ffc52..34991d0e 100644 --- a/eval/dovodka/rol.py +++ b/eval/dovodka/rol.py @@ -889,6 +889,17 @@ def verify_read(tag_: str, p: str) -> int: bad.append(f"{uid8}: имя арма {arm} стоит в пакете") if "торопиться не надо" not in txt: bad.append(f"{uid8}: нет указания владельца «торопиться не надо»") + # ⚠ ОБОРВАННАЯ КЛЕТКА В ПАНЕЛИ. `contour.base_a0` (арм `Z0`) читает `content` БЕЗ проверки + # `finish`, в отличие от `base_draft`, у которого гейт есть на обеих ветках. Через эту щель + # в китайскую панель прошла клетка с `finish=length` (21.08), и читатель законно поставил + # продакшен последним за оборванную кульминацию. Гейт стоит ЗДЕСЬ, потому что ловит класс + # независимо от источника: текст, который короче медианы панели, панель ломает. + ln = {a: len(t) for a, t in var.items()} + med = st.median(ln.values()) + for lab, v in ln.items(): + if med and v / med < 0.85: + bad.append(f"{uid8}: {lay[lab]} короче медианы панели ({v} против {med:.0f}, " + f"{v / med:.2f}) — похоже на оборванную клетку") seen: dict = {} for lab, body in var.items(): if body in seen: @@ -910,8 +921,11 @@ def verify_read(tag_: str, p: str) -> int: return 1 if bad else 0 -def score_arch(tag_: str = "arch2", p: str = "en") -> int: +def score_arch(tag_: str = "arch2", p: str = "en", drop: tuple = ()) -> int: + """`drop` — РЫЧАГ ЧУВСТВИТЕЛЬНОСТИ, не способ получить нужный ответ. Печатается в шапке свода, + и вывод, который живёт только при выброшенной главе, обязан называться вместе с ней.""" keys = sorted((OUT / "blind-keys-rol").glob(f"rol-KEY-{tag_}-*.json")) + keys = [k for k in keys if k.stem.split(f"{tag_}-")[1] not in drop] if not keys: raise SystemExit(f"⛔ ключей тега {tag_} нет") ranks: dict = {} @@ -943,7 +957,8 @@ def score_arch(tag_: str = "arch2", p: str = "en") -> int: if var.get(rev["Z7"]) == var.get(rev["ZP"]): ident.append((uid8, abs(r["Z7"] - r["ZP"]))) n = len(twins) - print(f"\n=== СВОД {tag_}, пара {p}: глав отсужено {n} из {len(keys)} ===") + print(f"\n=== СВОД {tag_}, пара {p}: глав отсужено {n} из {len(keys)} ===" + + (f"\n ⚠ ВЫБРОШЕНЫ ГЛАВЫ: {', '.join(drop)} — свод УСЛОВНЫЙ" if drop else "")) for uid8, why in bad: print(f" ⚠ {uid8}: {why}") if not n: @@ -1025,7 +1040,8 @@ if __name__ == "__main__": sys.exit(verify_read(_tag, next((x for x in a[1:] if x in PAIRS), "en"))) elif a[0] == "--score-arch": _tag = next((x.split("=", 1)[1] for x in a if x.startswith("--tag=")), "arch2") - sys.exit(score_arch(_tag, next((x for x in a[1:] if x in PAIRS), "en"))) + _drop = tuple(next((x.split("=", 1)[1].split(",") for x in a if x.startswith("--drop=")), [])) + sys.exit(score_arch(_tag, next((x for x in a[1:] if x in PAIRS), "en"), _drop)) elif a[0] == "--coverage": for p in ([x for x in a[1:] if x in PAIRS] or list(PAIRS)): print(f"\n=== ПОКРЫТИЕ БОЕВЫХ ПРОМТОВ, пара {p} ===")