Add the panel gate for truncated cells and record the judging-run audit with its two incidents

This commit is contained in:
Claude (backend session) 2026-08-21 00:17:20 +03:00
parent f8fbac367d
commit 22820288b2
2 changed files with 166 additions and 3 deletions

View file

@ -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 читателей, по 49 вызовов,
по 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 ответов ровно ОДНА цепочка полной длины
(следующая по длине — 23 метки), метки не повторяются, разобранный порядок совпадает с тем,
что читатель назвал словами.
* **Все 12 английских заявлений «совпадают дословно» — ВЕРНЫ** (проверено побайтно). Ни одного
ложного заявления о тождестве.
* **Три китайских заявления, помеченных моей проверкой как ложные, оказались ЛОЖНОЙ ТРЕВОГОЙ
ПРОВЕРКИ.** Читатели писали «совпадают ПРАКТИЧЕСКИ дословно» и тут же называли расхождение;
мой матчер цеплялся за слово «дословн» и за соседнее предложение о другой паре. Вскрыто чтением
самих строк — не отменено. Класс уже известен фазе (ложная тревога 20.08 про слово «метки»).
* **Выборочная проверка содержательных утверждений — 4 из 4 подтвердились побайтно:**
«единственное расхождение Т1/Т7» (различаются ровно два слова) · «у варианта выпало первое
предложение исходника» (выпало) · «текст оборван на середине фразы» (оборван — это инцидент 2) ·
«девиз инвертирован» («Пусть нас всегда больше… Зато мы всегда сильнее» против «в меньшинстве,
но никогда не слабее»).
### Д27.5 Что осталось НЕ проверенным и это не смягчается
Одно судейское семейство · один читатель на главу (разброс прибора не мерен ни разу) ·
английский исходник подаётся моделям одним блоком без авторских абзацев (наш баг экстрактора,
Д-долг бэкенду) — читателям он показан таким же, каким его видели все армы, поэтому контраст
честен, но материал искажён у ВСЕХ одинаково.

View file

@ -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} ===")