books/dovodka/priemka-D4-14-08.json

606 lines
No EOL
393 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"lines": [
{
"checked": "Читал построчно eval/dovodka/{itog_d4,adjud,spanjoin,sud}.py, сверял с eval/dovodka/{power,contour}.py и eval/role_topology/{absjudge,bakeoff}.py.\nПрогнал (eval/.venv/bin/python, $0, сетевых вызовов нет): itog_d4.py (полный вывод), adjud.py --score, spanjoin.py, power.py.\nСвои диагностические скрипты в скретчпаде (репо не правил): пере-счёт margins() попарно внутри наборов против усреднения по наборам; состав пола и его знаковый тест через bakeoff.sign_perm_p; пороги 2.8·sd/√n при n=15/16/31/54 и power.mde(k=1,3) на замеренных sd; сверка sha1 восстановленного текста варианта с полем sig обоих ключей d4p1/d4p2 (579 меток); разбор ~/books/dovodka/adjud-key.json и ~/adjud-d4/{tasks,answers} по контролям; difflib-схожесть половин пола против схожести сравниваемых армов; воспроизведение adjud.collect() и сверка со сданным ключом (154/154 совпало).\nИнвентарь сырья: ключи d4p1/d4p2 (290+289 меток, дублей (uid,arm) нет), 31+31 живых файла ответов у обоих семейств, 15 файлов .ANNULLED у claude, поля клеток dv-a-flo1/flo2.\nНичего не покупал, файлы репозитория не менял, .env не читал."
},
{
"checked": "1) Целостность сырья: свой парсер разложил все 62 пачки `~/sud-d4/p{1,2}-tasks/*.txt` на блоки Т-меток и сверил каждый блок с текстом арма из ключа (`S.text_of`/`floor_pair`/`AJ._plant` при AJ.KEYS=blind-keys-d4) и с полем `sig` — 0 несоответствий, 0 расхождений sig в обоих проходах.\n2) Деньги: `eval/.venv/bin/python eval/dovodka/money_d.py` → ПАК 2.393243; независимая сумма `cost_usd` по 311 файлам `~/books/dovodka/dv-*.json` → 2.393243 (a6+a6-crit+a6f = 0.492755 = ФД-F). Сходится побайтно, включая карантинные `.FLAGSV1`/`.LENGTH`/`.ERROR`.\n3) Карантин: файлы `.FLAGSV1`/`.LENGTH` в пачки не попали — это следует из п.1 (все тексты пачек совпали с текущими клетками, у которых finish=stop).\n4) Судейство: `itog_d4.py` прогнан как есть и с патчами (снятие отдельных пачек), пересчитан пол, порог, маржевый гейт и три первичных контраста; отдельно посчитан позиционный наклон, разрез старые-16/новые-15 по происхождению базы A0 (перевесы совпадают в пределах 0.6, разрез ничего не меняет).\n5) Транскрипты: 22 судейских суб-агента в `~/.claude/projects/-home-ubuntu-projects-textmachine/565edf3f-.../subagents/` разобраны построчно — кто какие ответы записал, какими Bash-командами; сверено с `~/sud-d4/annulled.txt`, `agent-runs.json` и mtime ответов; `sud.py --audit` прогнан на транскриптах аннулированных сессий.\n6) Промты: первый user-промт пилотного агента вынут из транскрипта и сдиффен с замороженным `~/sud-d4/prompts/p1-session-01.md`.\n7) Не покупалось ничего, файлы репозитория и сырья не менялись, `.env` не открывался."
},
{
"checked": "Заказ прочитан целиком (docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md), пре-рег Д0.1Д0.13 (23-editor-tier.md:719-1151), реестр eval/dovodka/requirements.md.\nПрогнано ИСПОЛНЕНИЕМ, $0, без сети: itog_d4.py · sud.py --selftest · sud.py --audit ~/.codex/sessions/2026/08/11 · contour.py --selftest · canon.py · money_d.py --report/--selftest · runs.py --selftest · power.py · paritet.py · adjud.py --score · spanjoin.py · conformance.py --plan.\nНезависимо от харнесса пересчитано своим кодом: сверка 1158 слотов обоих семейств — sha1 текста в файле задания против поля sig в ключе (совпало 1158/1158, расхождений 0); состав пачек по blind-keys-d4/*KEY.json (доноры декоя, число декоев на пачку, uid→пачка); наличие текста клетки finish!=stop в пачках (0); позиционный наклон и контрасты с поправкой на него; покрытие банка по выходу КАЖДОГО арма и потраченное по КАЖДОМУ арму; контрасты A1/A2/A4/A6F, которых свод не печатает; MDE при замеренном своём поле через power.mde.\nСверены провенанс и порядок: mtime всех клеток ~/books/dovodka против mtime ключей и заданий (все покупки до эмита 08-11 13:52); mtime заданий против ответов обоих семейств; agent-runs.json против mtime ответов (регистрация судьи до ответа — 92 из 92 живых); журналы Sol ~/.codex/sessions/2026/08/11 (17 логов: p1 и p2 в разных сессиях, root-сессия текстов вариантов не содержит).\nСверены git-провенанс (requirements.md закоммичен 08-10 07:06, первая покупка 08-10 22:01) и незакоммиченный дифф eval/dovodka/adjud.py.\nНЕ проверялось (вне линзы либо вне зоны): оси Д1/Д2/Д3/Д6/Д7 по существу, чужие риги эксп-22/23, содержание .env, любые сетевые вызовы."
},
{
"checked": "Написал свой разбор с нуля (не импортируя eval/dovodka): /tmp/.../scratchpad/mine.py, mine2.py, mine3.py, mine4.py — парсер ответов по регексу `^Т\\d+-(ВЕРНОСТЬ|ТЕРМИН|ЯЗЫК|ФОРМА): N`, склейка с ключами ~/books/dovodka/blind-keys-d4/d4p{1,2}-KEY.json, свой точный знаковый тест (динамика по достижимым суммам), свой пол, свои пороги, свои декои.\nСверил с `eval/.venv/bin/python eval/dovodka/itog_d4.py`: РАСХОЖДЕНИЙ НЕТ. Совпало всё до последнего знака — 579 меток на семейство; перевесы Claude A1B/A0 3.50, A3/A0 2.16, A6/A0 1.03; Sol 4.74, 3.13, 0.62; p знакового теста 0.0000/0.0000/0.0367 и 0.0000/0.0000/0.5739; пол n=15 sd 2.14 и 5.05; пороги 1.54 и 3.65; грубый декой медиана +3.0 (62/62) и +4.0 (61/62); маржевый +2.56 и +2.96.\nСредние ошибки на слот (В+Я / все4): Claude A0 4.03/5.45, A1B 7.53/9.65, A3 6.19/8.52, A6 5.03/7.09, A4 4.15/5.60, декой 7.23/9.86; Sol A0 12.16/14.07, A1B 16.90/20.76, A3 15.29/18.71, A6 12.13/15.03, A4 12.02/13.98, декой 15.74/18.94.\nЗНАК проверен тремя способами: (1) промт судьи ~/sud-d4/p1-tasks/0dce349331.txt:3 «Посчитай ОШИБКИ» — больше = хуже; (2) itog_d4.py:147 margins = ошибки(A0) ошибки(арма), минус = у арма ошибок больше; (3) эмпирический якорь — заведомо испорченный CTRLdecoy даёт 3.19/3.58 по той же формуле. Отрицательный перевес = арм ХУЖЕ переписа. Знак верен.\nДополнительно проверено исполнением: паритет обвязок (paritet.py — зелёный, но сверяет файлы репо, не отправленное), греп-аудит 17 транскриптов Sol в ~/.codex/sessions/2026/08/11/ (запрещённых путей 0), аудит 8 транскриптов пере-судейства 13.08 22:0023:15 (diff/difflib/blind-keys — 0), аудит 13 транскриптов первой волны (нашёл 4 сессии с diff/difflib), сверка sig=sha1(content)[:12] на 31 клетке A4 — 31/31.\nНе покупал ничего, файлов не правил, .env не открывал."
}
],
"findings": [
{
"title": "adjud.py режет названия осей регексом: реальные претензии несут «ОСТЬ»/«РМИН»/«ОРМА» вместо ВЕРНОСТЬ/ТЕРМИН/ФОРМА — фильтр несущих осей отбрасывает ВСЮ ВЕРНОСТЬ",
"severity": "критично",
"evidence": "adjud.py:123-126 `re.split(r\"(?=[А-ЯЁ]{4,}:)\", why)` режет в КАЖДОЙ позиции, где дальше 4+ заглавных и двоеточие; проверено: re.split даёт ['','В','Е','Р','Н','ОСТЬ: …'], и re.match(r\"([А-ЯЁ]{4,}):\") ловит только хвост → axis='ОСТЬ'. В сданном ключе ~/books/dovodka/adjud-key.json: оси реальных претензий Counter({'ЯЗЫК':48,'ОСТЬ':38,'ОРМА':20,'РМИН':18}). Фильтр adjud.py:253 `v.get(\"axis\") in (\"ВЕРНОСТЬ\",\"ЯЗЫК\")` со строкой 'ОСТЬ' не совпадает никогда.",
"consequence": "Печатаемая доля верифицированных претензий «по несущим осям ВЕРНОСТЬ+ЯЗЫК» считается по ЯЗЫК ОДНОМУ (48 из 86 меток отброшено). Код печатает A3 85% (n=26) / A0 73% (n=22); при починке обрезки (ОСТЬ+ЯЗЫК) те же ответы дают A3 76% (n=37) / A0 55% (n=49) — разрыв между армами 12 пп вместо 21 пп. Вердикт «условие П-1 ≥80% НЕ выполнено» сохраняется, но число поправки, на которое опирается эскалация A3/A0, другое. Плюс adjud.py:206 печатал адъюдикатору «здесь ошибка типа ОСТЬ/РМИН/ОРМА» — 88 из 154 заданий (грep по ~/adjud-d4/tasks: ЯЗЫК 51, ОСТЬ 48, ОРМА 21, РМИН 19).",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Не опроверг: механизм и все первичные числа воспроизведены моим исполнением; в пре-реге и эрратах Д0.11/Д0.13 это ограничение НЕ объявлено. Но в следствии находки две цифры перевёрнуты, и одна из них меняет знак вывода.\n\nЧТО ПОДТВЕРДИЛОСЬ (проверено исполнением)\n1. Регекс. `eval/.venv/bin/python -c \"re.split(r'(?=[А-ЯЁ]{4,}:)', why)\"` на строке с четырьмя осями даёт `['', 'В', 'Е', 'Р', 'Н', 'ОСТЬ: …', 'ЯЗЫК: …', 'Т', 'Е', 'РМИН: …', 'Ф', 'ОРМА: …']`. Позиции линий: adjud.py:123 (split), adjud.py:206 (печать претензии), adjud.py:253 (фильтр `v.get(\"axis\") in (\"ВЕРНОСТЬ\",\"ЯЗЫК\")`).\n2. Ключ. `~/books/dovodka/adjud-key.json`, 154 метки. Оси реальных претензий (не fake, не planted, n=124): Counter({'ЯЗЫК':48,'ОСТЬ':38,'ОРМА':20,'РМИН':18}) — совпадает с находкой посимвольно. Армы реальных: A0 62, A3 62.\n3. Печать. `eval/.venv/bin/python eval/dovodka/adjud.py --score` → «A3: 85% подтверждено (n=26) · A0: 73% подтверждено (n=22)», далее «⛔ условие П-1 ≥80% НЕ выполнено».\n4. Починенный счёт. Пересчёт по тем же 154 ответам из `~/adjud-d4/answers/` с осями ('ОСТЬ','ЯЗЫК'): A3 0.7568 (n=37), A0 0.5510 (n=49). Совпадает с находкой.\n5. Вердикт П-1 действительно сохраняется: 76% и 55% оба ниже 0.80.\n6. Утечка в задания: `grep -o \"ошибка типа X\" ~/adjud-d4/tasks/*.txt` → ЯЗЫК 51, ОСТЬ 48, ОРМА 21, РМИН 19, ТЕРМИН 10, ФОРМА 4, ВЕРНОСТЬ 1. Обрезанные имена показаны в 88 метках из 154.\n7. Ничего похожего в пре-реге нет: в `docs/experiments/23-editor-tier.md` строка 1107 (П-5) объявляет несущими ВЕРНОСТЬ+ЯЗЫК, но об обрезке имён осей ни Д0.11 (стр. 898+), ни Д0.13 (стр. 1052+) не говорят; грепа 'ОСТЬ' как имени оси по пре-регу и по заказу владельца — нет вхождений.\n\nЧТО В НАХОДКЕ НЕВЕРНО\nA. «48 из 86 меток отброшено» — наоборот: 86 = ЯЗЫК 48 + ОСТЬ 38; отброшено 38 (ОСТЬ), удержано 48 (ЯЗЫК).\nB. «разрыв между армами 12 пп вместо 21 пп» — числа переставлены, и это меняет направление: печатаемый разрыв 8573 = 11.9 пп, починенный 75.755.1 = 20.6 пп. Починка НЕ сужает разрыв, а РАСШИРЯЕТ его вдвое, в пользу A3. Формулировка находки читается как «поправка съедает преимущество A3», фактически она его удваивает.\nC. «88 из 154 заданий» — единица не та: заданий-файлов в `~/adjud-d4/tasks/` семь (`ls | wc -l` = 7); 88 из 154 — это метки-претензии.\n\nЧТО НАХОДКА НЕДОБРАЛА (усиление, проверено исполнением)\nЛожные претензии строятся другим путём — adjud.py:141 `axis=rnd.choice(zero)`, где `zero` берётся из списка AX, то есть ПОЛНЫМИ именами. Отсюда: fake-метки несут Counter({'ТЕРМИН':10,'ФОРМА':4,'ВЕРНОСТЬ':1}), а реальные и посаженные — только обрезки и ЯЗЫК. Прогон по файлам заданий: меток с полным именем оси ровно 15, все 15 — fake, не-fake среди них 0, и все fake покрыты. Значит контроль сговорчивости (13%, n=15) слеп только по факту невнимательности адъюдикатора: строка «ошибка типа ТЕРМИН/ФОРМА/ВЕРНОСТЬ» опознаёт ложную претензию с точностью 15/15. Использовал ли адъюдикатор эту сигнатуру — из ответов не видно; но конструктивно контроль различим, а он и есть допуск всей адъюдикации.\n\nОдин вывод от этого сдвигается, вопреки тексту находки: если ≥80% П-1 читать по арму, чьи находки эскалируются (стр. 1068: «эскалация к адъюдикации ЕГО находок»), то багованный счёт давал A3 85% — выше порога, а починенный даёт 76% — ниже. Печатаемая итоговая строка одинакова в обоих случаях только потому, что код требует ≥80% у ОБОИХ армов.",
"corrected": "adjud.py режет названия осей: `re.split(r\"(?=[А-ЯЁ]{4,}:)\", why)` (adjud.py:123) рвёт строку в каждой позиции, где дальше 4+ заглавных и двоеточие, и `re.match(r\"([А-ЯЁ]{4,}):\")` (adjud.py:124) ловит только хвост → ВЕРНОСТЬ→'ОСТЬ', ТЕРМИН→'РМИН', ФОРМА→'ОРМА'; ЯЗЫК (ровно 4 буквы) уцелевает. В сданном ключе оси реальных претензий Counter({'ЯЗЫК':48,'ОСТЬ':38,'ОРМА':20,'РМИН':18}), поэтому фильтр несущих осей adjud.py:253 `v.get(\"axis\") in (\"ВЕРНОСТЬ\",\"ЯЗЫК\")` отбрасывает ВСЮ ВЕРНОСТЬ — 38 меток из 86 несущих, оставляя счёт на одном ЯЗЫКе (48).\n\nПоследствие. `adjud.py --score` печатает A3 85% (n=26) / A0 73% (n=22); те же 154 ответа при исправленной обрезке дают A3 76% (n=37) / A0 55% (n=49). Разрыв между армами при починке РАСШИРЯЕТСЯ с 11.9 пп до 20.6 пп — в пользу A3, а не сужается. Печатаемый вердикт «условие П-1 ≥80% НЕ выполнено» сохраняется, потому что код требует порог у обоих армов; но если читать П-1 (23-editor-tier.md:1068) по арму, чьи находки эскалируются, то багованный счёт ставил A3 выше порога (85%), а починенный — ниже (76%). Величина поправки, на которую опирается эскалация A3/A0, в обоих чтениях другая.\n\nПлюс два следствия в самих заданиях. Адъюдикатору печаталось «здесь ошибка типа ОСТЬ/РМИН/ОРМА» (adjud.py:206) в 88 метках из 154, разложенных по 7 файлам заданий. И — не замеченное ранее — ложные претензии получают ось другим путём (adjud.py:141 `rnd.choice(zero)`, из списка AX полными именами), поэтому все 15 fake-меток несут ПОЛНОЕ имя оси (ТЕРМИН 10, ФОРМА 4, ВЕРНОСТЬ 1), а ни одна реальная или посаженная — нет. Проверено по файлам заданий: меток с полным именем оси ровно 15, все 15 fake, покрытие полное. Контроль сговорчивости (13%, n=15), от которого зависит допуск всей адъюдикации, конструктивно различим по форматированию имени оси."
}
},
{
"title": "Контроль сговорчивости адъюдикатора не слепой: все 15 ложных претензий опознаваемы по двум признакам формата",
"severity": "критично",
"evidence": "Следствие той же обрезки: полные имена осей остались ТОЛЬКО у ложных претензий (они строятся из AX, adjud.py:141-143). Грep по ~/adjud-d4/tasks/*.txt: «типа ТЕРМИН» 10 · «типа ФОРМА» 4 · «типа ВЕРНОСТЬ» 1 = ровно 15 = N_FALSE; все 139 остальных несут обрезанные токены. Второй признак — adjud.py:153-155 `r[\"ctx\"] = context(r[\"quote\"], r[\"quote\"])`: разбор заданий даёт ('ложная','окно==цитата') 15/15 и 14 из 15 без многоточия, тогда как ('реальная'/'посаженная','окно шире') 139/139 и все с «…».",
"consequence": "Печатаемое «сговорчивость: подтвердил 13% ЛОЖНЫХ претензий → ГОДЕН» получено на позициях, отличимых от боевых по форме задания, то есть не измеряет склонность соглашаться с предъявленным. Годность адъюдикатора — а на ней стоит вся поправка П-1 по A3/A0 — не подтверждена. Использовал ли адъюдикатор признак, я не проверял.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Проверено моим исполнением, обе улики воспроизвелись точно. (1) Механизм обрезки: re.split(r\"(?=[А-ЯЁ]{4,}:)\", why) (adjud.py:129) пере-матчится на каждом смещении длинного прописного слова, поэтому выживает сегмент с последних 4 букв — мой прогон re.split по строке «ВЕРНОСТЬ: «a». ТЕРМИН: «b».» дал ['', 'В','Е','Р','Н','ОСТЬ: «a». ','Т','Е','РМИН: «b».'], оси парсятся как ОСТЬ/РМИН/ЯЗЫК. Ложные же берут ось из AX (adjud.py:141-143) — номера строк в находке верны. (2) Гистограмма по реальным заданиям (grep -ho \"ПРЕТЕНЗИЯ: здесь ошибка типа [^ ]*\" ~/adjud-d4/tasks/*.txt | sort | uniq -c): ЯЗЫК 51 · ОСТЬ 48 · ОРМА 21 · РМИН 19 · ТЕРМИН 10 · ФОРМА 4 · ВЕРНОСТЬ 1 — то есть 10+4+1=15 полных имён, ровно N_FALSE. (3) Сшивка 154 разобранных блоков заданий с ~/books/dovodka/adjud-key.json: «полное имя ВЕРНОСТЬ/ТЕРМИН/ФОРМА» → 15 позиций, из них fake 15/15; «окно==цитата после norm()» → 15 позиций, из них fake 15/15; у всех 139 не-ложных окно шире цитаты и несёт «…»; 14 из 15 ложных без «…». Разделимость полная по двум независимым признакам. (4) Пере-ран eval/dovodka/adjud.py --score воспроизводит печать «сговорчивость: подтвердил 13% ЛОЖНЫХ претензий (n=15) → ГОДЕН». (5) Объявленным ограничением это НЕ является: Д0.13/П-1 (docs/experiments/23-editor-tier.md:1052-1151) оговаривает слепоту только к метке арма и автору находки; Д0.11 (:898-982) молчит; шапка adjud.py объявляет дефект окна norm() для оси ФОРМА, но не этот. Grep «адъюдик» по отчёту даёт единственный содержательный хит :1076. Неточны две вещи (см. corrected): формулировка про «все 139 обрезаны» и масштаб последствия.",
"corrected": "Исправленная формулировка. УЛИКА: ложные претензии опознаваемы по двум признакам формата, разделимость 15/15 без ложных срабатываний. Признак 1 — ось написана полностью словом ВЕРНОСТЬ/ТЕРМИН/ФОРМА (10+4+1=15, ровно N_FALSE), тогда как реальные и посаженные несут обрезку до последних 4 букв (ОСТЬ 48+10 · ОРМА 21 · РМИН 19). Уточнение к находке: неверно, что «все 139 остальных несут обрезанные токены» — ЯЗЫК длиной 4 буквы обрезку переживает целым и стоит на 51 не-ложной позиции (48 реальных + 3 посаженные); обрезанных 88, не 139. Дискриминант — именно тройка многобуквенных имён, и она отделяет 15/15 ложных без единого ложного срабатывания, так как ни одна ложная претензия не выпала на ось ЯЗЫК. Признак 2 подтверждается дословно: adjud.py:153-155 r[\"ctx\"] = context(r[\"quote\"], r[\"quote\"]) даёт («ложная», «окно==цитата») 15/15 и 14 из 15 без многоточия против («реальная»/«посаженная», «окно шире») 139/139, все с «…». ПОСЛЕДСТВИЕ (масштаб исправлен): печатаемое «сговорчивость: подтвердил 13% ЛОЖНЫХ → ГОДЕН» получено на позициях, отличимых от боевых по форме задания, поэтому склонности соглашаться с предъявленным оно не измеряет — это верно. Но «на ней стоит вся поправка П-1 по A3/A0» преувеличено: мой пере-ран --score печатает A3 85% (n=26) · A0 73% (n=22) и «⛔ условие П-1 «≥80% выборки верифицируются» НЕ выполнено», то есть эскалация упирается в НЕ ПОДТВЕРЖДЕНО независимо от вердикта о годности адъюдикатора; аннулирование по контролю сговорчивости ведёт к тому же не-подтверждению. Ни один вердикт от находки не переворачивается — она бьёт по доверию к прибору, а не по уже полученному исходу. Кроме того, само печатаемое «ГОДЕН» пока живёт только в выводе скрипта: отчёт обрывается на Д0.13 (docs/experiments/23-editor-tier.md, 1151 строк), секций Д1Д8 с этим числом в нём нет. ДОБАВЛЕНИЕ, найденное мной попутно и усиливающее находку: 14 из 15 ложных претензий сидят на НЕсущих осях (ТЕРМИН 10, ФОРМА 4), причём ФОРМА — та самая ось, которую код в собственном комментарии объявляет непроверяемой через norm()-окно. На несущих осях ВЕРНОСТЬ+ЯЗЫК, по которым и считается поправка, ложная претензия ровно одна, и адъюдикатор ответил на неё ДА: замеренная сговорчивость по несущим осям = 1/1 = 100% при n=1. Заголовочные 13% почти целиком набраны вне тех осей, где поправка применяется. Использование признака адъюдикатором я, как и автор находки, не проверял; косвенно: он подтвердил 2 из 15 ложных (fake ТЕРМИН 1/10, ФОРМА 0/4, ВЕРНОСТЬ 1/1), что для эксплуатации формата нетипично, но доказательством не является."
}
},
{
"title": "Контроль чувствительности адъюдикатора считает посадкой любую цитату из маржевого декоя: 11 из 15 «посаженных дефектов» лежат ВНЕ места посадки",
"severity": "критично",
"evidence": "adjud.py:135-136: в plant_pool попадает КАЖДАЯ цитата судьи из варианта CTRLmargin, а не цитата в месте замены. Проверка: для каждой из 15 меток с planted=True сверил, отличает ли нормализованная цитата испорченный текст от базы (S.margin_plant(C.base_a0(uid)) против C.base_a0(uid)) — совпало 4 (П002, П063, П065, П133), не совпало 11 (напр. П021 «— Когда на душе радость, и дух бодр», П144 «давление прижало их к земле»).",
"consequence": "Печатаемое «чувствительность: опознал 67% ПОСАЖЕННЫХ (n=15) → ГОДЕН» — доля по пулу, где у 11 позиций истина не известна, а «верный ответ ДА» задан ошибочно. По настоящим посадкам ответы 4/4. Порог аннулирования 60% (adjud.py:237) отстоял на один пункт: 10/15=67%, при 8/15 вся адъюдикация была бы снята по причине, которой нет.",
"grounded": "проверено исполнением",
"verdict": {
"corrected": "Контроль чувствительности адъюдикатора построен на пуле, где посадка не гарантирована: в `plant_pool` попадает КАЖДАЯ цитата судьи из варианта CTRLmargin (eval/dovodka/adjud.py:135-136), тогда как собственная шапка рига требует «цитата из маржевого декоя ровно в месте посадки, где истина известна побайтно» (adjud.py:20). Из 15 меток с `planted=True` в ~/books/dovodka/adjud-key.json цитата пересекает место замены у 4 (П002, П063, П065, П133); у 11 — нет (среди них П021, П144). Для этих 11 «верный ответ ДА» задан ключом, а не известен: цитата присутствует в базе A0 неизменной, то есть говорит не о посадке. Печатаемое «чувствительность: опознал 67% ПОСАЖЕННЫХ (n=15) → ГОДЕН» (мой прогон `adjud.py --score`) относится к смешанному пулу. Уточнения масштаба к исходной формулировке: (1) вердикт контроля НЕ переворачивается — по настоящим посадкам 4/4 = 100% ≥ 60%, аннулирования нет ни при каком чтении; ломается размер доказательной базы (n=15 → n=4) и само число 67%; (2) «порог отстоял на один пункт» неверно: запас — ДВА ответа, 9/15 = 60% ещё проходит (`9/15 >= 0.60` → True), снимает адъюдикацию только 8/15 = 53%, как и указано в самой находке; в пунктах запас 7 п.п., не один.",
"refuted": false,
"why": "Опровергнуть не удалось — воспроизвёл своим исполнением, двумя независимыми проверками, и получил тот же состав меток. (1) Улика на месте: `if arm == \"CTRLmargin\": plant_pool.append(rec)` — eval/dovodka/adjud.py:135-136, без всякой связи с местом замены; `var` для CTRLmargin строится как `S.margin_plant(C.base_a0(uid))` (adjud.py:111-112), и единственный фильтр цитаты — `if norm(q) not in norm(var)` (adjud.py:130), то есть любая цитата из испорченного текста. (2) Проверка №1 (метод находки): для 15 меток planted сверил `norm(quote)` против `norm(C.base_a0(uid))` и `norm(S.margin_plant(...)[0])` — цитата отличает испорченный текст от базы у 4 (П002, П063, П065, П133), совпадает в обоих у 11 (П021, П022, П037, П040, П057, П077, П102, П106, П144, П149, П154). (3) Проверка №2 (независимая, не по следу отчёта): пословный difflib-диф база↔испорченный, спаны реальных замен, и проверка перекрытия спана цитаты со спаном замены — тот же разбор 4/11, `overlaps_plant=True` ровно у П002, П063, П065, П133. Коллизия «цитата случайно встретилась в базе в другом месте» исключена: у всех 11 `occ_base = occ_cor = 1`. Класс посадок словесный (снятие отрицания · подмена числительного · инверсия сравнения — eval/dovodka/sud.py:104-106), поэтому `norm()` (снимает пунктуацию и регистр) посадку не стирает и метод сверки применим. (4) Ответы адъюдикатора: `adjud.py --score` печатает «опознал 67% ПОСАЖЕННЫХ дефектов (n=15) → ГОДЕН»; по моему разбору ДА стоит у 4/4 настоящих посадок и у 6/11 остальных (10/15 = 67%). (5) Объявленным ограничением это не является: в пре-реге и эрратах — docs/experiments/23-editor-tier.md, Д0.11 (:898-…) и Д0.13 (:1052-…), включая П-1 (:1059) и П-2 (:1079) — маржевый декой описан как контроль чувствительности СУДЬИ, про пул контроля адъюдикатора не сказано ничего, а шапка самого рига (adjud.py:20) обещает обратное коду. (6) Меняется ли вывод: вердикт «ГОДЕН» и, следовательно, засчитанная адъюдикация устоят и на очищенном пуле (4/4), так что вниз по цепочке (доли по армам A3 85% / A0 73%, «условие П-1 НЕ выполнено») ничего не переворачивается; неверны напечатанное число и заявленный размер контроля. Смежное, вне этой находки, но грунтованное моей командой: в ключе оси хранятся обрезанными — Counter даёт 'ОСТЬ' 48 против 'ВЕРНОСТЬ' 1, 'РМИН' 19, 'ОРМА' 21 (последствие `re.split(r\"(?=[А-ЯЁ]{4,}:)\")` в adjud.py:122), из-за чего фильтр несущих осей в score() (adjud.py:246-248) почти все претензии ВЕРНОСТЬ отбрасывает — это отдельная линия, не часть проверяемой находки."
}
},
{
"title": "itog_d4: порог различимости строится на n ПОЛА (15) и применяется к средним по 31, 16 и 54 наблюдениям — переворачивает два печатаемых вердикта семейства sol",
"severity": "критично",
"evidence": "itog_d4.py:173 `thr = 2.8 * sd / (n_pairs ** 0.5)`, где n_pairs — число пар пола (15 у обоих семейств), и этот же thr сравнивается со средним маржевого декоя по 54 наблюдениям (строка 189) и со средними контрастов по 31/16 единицам (строка 217). Замеренные величины: sol sd=5.053, порог печатается 3.653; при n сравниваемого среднего то же правило даёт 2.8·5.053/√54=1.925 и 2.8·5.053/√31=2.541. Средние: маржевый декой sol +2.963, A3/A0 sol 3.129.",
"consequence": "(1) Гейт чувствительности sol: печатается «⛔ НЕ ПРОЙДЕН» и семейство понижается до описательного по H-2а/H-2б; при пороге, посчитанном на n того же среднего (1.925 по правилу рига, 2.466 по правилу power.mde k=3 без ×1.23), гейт ПРОЙДЕН. (2) A3/A0 sol: печатается «ниже порога» → П-1 даёт «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ»; при 2.8·sd/√31=2.541 перевес 3.13 порог ПЕРЕХОДИТ и П-1 даёт CONFIRM по главной ставке владельца H-2б. Вердикты claude при любой из версий не меняются.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Механика находки воспроизведена моим прогоном полностью, опровергнуть не удалось; неточны атрибуция («дефект кода itog_d4»), одно из подставленных n и формулировка последствия.\n\nПРОВЕРЕНО ИСПОЛНЕНИЕМ (`eval/.venv/bin/python eval/dovodka/itog_d4.py` + мой пере-счёт через модуль, скрипт в scratchpad/chk.py):\n- sol: sd=5.0526, n_пола=15, thr=3.6528 (печатается «3.65», не «3.653»); маржевый декой n_obs=54 среднее +2.9630 → «⛔ НЕ ПРОЙДЕН»; A3/A0 n=31 среднее 3.1290, p Холма 0.0000, печатается «ниже порога»; П-1 печатает «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ».\n- claude: sd=2.1354, thr=1.5438; A6/A0 1.0312 при thr на n=16 = 1.495 → не переворачивается. Клейм «вердикты claude не меняются» верен.\n- Пороги на n сравниваемого среднего: √54→1.9252, √31→2.5407, √27→2.7227. Гейт чувствительности sol проходит при всех трёх; A3/A0 sol переходит порог при 2.5407 (и p Холма 0.0000 < 0.05, так что `crossed` действительно становится True).\n\nЧТО В НАХОДКЕ НЕВЕРНО ПО МАСШТАБУ:\n1. Это не локальный дефект `itog_d4`, а стоячее правило рига, пре-регистрированное ДО ответов. Та же формула с n ПОЛА: `verify23.py:151` (сторожит печать порога), `solscore.py:104` (там порог из пола n=16 сравнивается с боевыми контрастами на n=32 — опубликовано в §12в, строки 601603), `axiscal.py:218`; доктрина порога — `absjudge.py:668682`. Значение для sol объявлено числом ДО первого ответа фазы: 23-editor-tier.md:842 (Д0.7) и :10031004 (Д0.12) — «sd 5.05, порог различимости 3.53» (=2.8·5.05/√16), с прямо названным следствием «подпись Sol под отрицательным выводом почти автоматична». П-2 (:1086) требует сравнения с «его СОБСТВЕННЫМ порогом» — код исполняет текст пре-рега буквально. Печатаемые вердикты пре-регу СООТВЕТСТВУЮТ.\n2. Из-за этого «переворачивает два вердикта» условно: переворот наступает только при подмене пре-регистрированного правила, а подмена запрещена в этой фазе (:1057 «после первого судейского ответа менять пороги и правила запрещено»; промт:183 «Детекторы и пороги после взгляда на вердикты не менять»). Пере-считать вердикты Д4 по новому правилу нельзя; годная диспозиция — печатаемая оговорка + правка правила следующей фазой.\n3. Число 1.925 (√54) не защитимо: 54 наблюдения маржевого декоя — это 27 уникальных uid × 2 половины (замерено: uid=27), независимых единиц 27, честная альтернатива 2.7227. Вывод «гейт прошёл бы» устоит, но не по названному в находке числу. Плюс масштабная несоизмеримость в обе стороны: sd пола — это sd разности ОДИНОЧНЫХ судейств, а боевой перевес в `margins` усреднён по двум половинам, то есть sd_пола/√n «правильным» порогом тоже не является — это другая эвристика, а не починка.\n4. Формулировка последствия (2) вводит в заблуждение знаком. carry — счёт ошибок (грубый декой против донора печатается ПЛЮСОМ и «пойман 62/62»), `margins(a,b)=ошибки(b)−ошибки(a)`, значит A3/A0 = 3.13 читается «у A3 на 3.13 ошибки БОЛЬШЕ, чем у A0». CONFIRM там был бы совместным подтверждением, что A3 ХУЖЕ A0, то есть опровержением H-2б, а не «CONFIRM по главной ставке владельца».\n5. Один вывод при этом действительно бы изменился, и это стоит сказать точно: текущая ветка эскалации уже отработана — `eval/.venv/bin/python eval/dovodka/adjud.py --score` печатает «A3: 85% (n=26) · A0: 73% (n=22) · ⛔ условие П-1 «≥80%» НЕ выполнено», то есть сейчас по H-2б «НЕ ПОДТВЕРЖДЕНО»; при пороге на n среднего было бы «CONFIRM: A3 хуже A0». Смена ветки — в сторону ужесточения опровержения ставки владельца, а не её подтверждения.\n\nСМЕЖНОЕ, найдено попутно (грунт: мой прогон + itog_d4.py:221240): sol печатается «⛔ НЕ ПРОЙДЕН» по П-2, но в блоке П-1 не аннулируется и не понижается — его 4.74 идёт в «CONFIRM» по A1B/A0. Пре-рег в этом месте сам двоится: :1071 говорит «пачка аннулируется», :1086 — «понижается до описательного»; код не исполняет ни того, ни другого.",
"corrected": "itog_d4 печатает порог различимости 2.8·sd/√n_пола (n_пола=15) и сравнивает его со средними по 54/31/16 наблюдениям (itog_d4.py:173, :189, :217). Это не дефект, внесённый ригом фазы Д, а стоячее пре-регистрированное правило рига: та же формула в verify23.py:151, solscore.py:104, axiscal.py:218, а значение для sol (sd 5.05, порог 3.53 = 2.8·5.05/√16) объявлено числом ДО первого ответа фазы в Д0.7 (23-editor-tier.md:842) и Д0.12 (:10031004) вместе со следствием «подпись Sol под отрицательным выводом почти автоматична»; П-2 (:1086) сравнивает именно с «собственным порогом» семейства. Замеры (мой прогон): sol sd 5.0526, порог печатается 3.65; маржевый декой n_obs=54 (27 uid × 2 половины) среднее +2.9630 → «⛔ НЕ ПРОЙДЕН»; A3/A0 sol n=31 среднее 3.1290 при p Холма 0.0000 → «ниже порога» → П-1 «ЭСКАЛАЦИЯ». При пороге на n сравниваемого среднего (√27=2.7227 для декоя — честная альтернатива вместо названного √54=1.9252; √31=2.5407 для A3/A0) оба печатаемых вердикта sol действительно меняются, вердикты claude — нет (A6/A0 1.0312 против 1.495). Но: (а) подмена правила в этой фазе запрещена пре-регом (:1057) и промтом (:183), поэтому находка даёт оговорку и правку правила следующей фазой, а не пере-счёт вердиктов Д4; (б) знак перевеса отрицательный, carry — счёт ошибок, значит гипотетический CONFIRM по A3/A0 означает «A3 ХУЖЕ A0», то есть опровержение H-2б, а не подтверждение ставки владельца; (в) фактическая смена итога по H-2б была бы «НЕ ПОДТВЕРЖДЕНО» → «CONFIRM, что A3 хуже»: текущая ветка эскалации уже отработана, adjud.py --score печатает «A3 85% (n=26) · A0 73% (n=22) · ⛔ условие П-1 ≥80% НЕ выполнено»."
}
},
{
"title": "Множитель порога 2.8 в itog_d4 противоречит собственному пре-регу мощности: power.mde при k=3 считает через Стьюдента и даёт другой порог",
"severity": "важно",
"evidence": "power.py:154-163 прямым текстом: «КОНСТАНТА 2.8 ВЕРНА ТОЛЬКО ПРИ k=1», множитель = t(10.05/2k, df)+t(0.8, df), плюс BETWEEN=1.23. itog_d4.py:173 применяет 2.8 к семейству из ТРЁХ контрастов (itog_d4.py:58-60, Холм по трём — строка 209). Прогон power.mde на замеренных полах: claude sd=2.135 n=31 → 1.679 (between) / 1.365 (без) против печатаемых itog 1.544; sol sd=5.053 n=31 → 3.974 / 3.231 против печатаемых 3.653.",
"consequence": "Величина, названная в отчёте «порогом различимости», не является ни MDE пре-рега, ни SE-порогом рига для сравниваемого среднего: три числа расходятся, и на этом расхождении стоит именно граничный вердикт sol A3/A0 (3.13 против 2.54 / 3.23 / 3.65 — переход порога зависит от выбора формулы).",
"grounded": "проверено исполнением",
"verdict": {
"corrected": "Что от находки остаётся после пере-рана (и это НЕ то, что она утверждает):\n\n1. Единственный настоящий дефект — устаревшая шапка `power.py:13-14`: «MDE ... — 2.8·sd/√n, то же правило, по которому риг печатает порог различимости». Функция `mde()` после Э-3 (Д0.11, docs/experiments/23-editor-tier.md:915) считает t-множитель с Холмом, а шапка осталась от прежней редакции. Дефект чисто документационный: ни одно печатаемое число из шапки не выводится (`power.py:162` — единственное место, где множитель считается).\n\n2. Порог `itog_d4.py:173` = 2.8·sd_пола/√n_пола — это ПРЕ-РЕГИСТРИРОВАННОЕ правило рига, а не самодеятельность: Д0.6 (:820-822) «Порог берётся из своего пола без ручной поправки: пол, судимый разными сессиями, ловит и межсессионную компоненту»; тем же правилом посчитаны пороги паков 22/23 (§12 :521-522 — 1.02 = 2.8·1.45/√16, 1.48 = 2.8·2.12/√16; §12в :601 — 3.53 = 2.8·5.05/√16); и порог Sol 3.53 напечатан ДО первого ответа фазы в Д0.7 (:842) и Д0.12 (:1003). `power.mde` пре-рег объявляет величиной ПЛАНА, а не результата (`power.py:244`, Д0.3 :773-775). Двух формул на одну величину нет: это две разные величины с разными ролями.\n\n3. Множественность в риге применяется ОДИН раз — Холмом к p точного знакового теста (`itog_d4.py:209`), а порог служит вторым, независимым условием (`itog_d4.py:217`: `abs(mean) > thr and pa < 0.05`). Внести k ещё и в порог значило бы посчитать поправку дважды.\n\n4. Замечание, которое находка не сделала и которое верно: порог берётся при n ПОЛА (15), а сравнивается среднее по 31 единице, то есть порог систематически СТРОЖЕ поконтрастного SE-порога (1.54 против 1.07 у claude, 3.65 против 2.54 у sol). Направление ошибки — в сторону непризнания эффекта; напечатанные положительные вердикты этим выбором создать нельзя.",
"refuted": true,
"why": "ОПРОВЕРГНУТО пере-раном по трём независимым линиям.\n\n(1) ЧИСЛА УЛИКИ ПОСЧИТАНЫ НЕ НА ЗАМЕРЕННОМ ПОЛЕ. Находка пишет «прогон power.mde на замеренных полах: claude sd=2.135 n=31 · sol sd=5.053 n=31». Замеренный пол — n=15 пар, не 31. `eval/.venv/bin/python eval/dovodka/itog_d4.py` печатает: claude «n=15 · sd=2.14 → ПОРОГ 1.54», sol «n=15 · sd=5.05 → ПОРОГ 3.65». Прямой вызов внутренностей рига (`floor_sd` по обоим семействам) даёт claude sd=2.1354 n=15 thr=1.5438 · sol sd=5.0526 n=15 thr=3.6528 — sd совпадают с находкой до третьего знака, n нет. n=31 — это n КОНТРАСТА (`itog_d4` печатает «ед. 31»), а не пола. Числа 1.679/1.365 и 3.974/3.231 я воспроизвёл ровно — они получаются только при подстановке n=31: mde(2.1354,31,3,between=True,df=15)=1.679, mde(5.053,31,3,False,15)=3.231. То есть заявленное «расхождение» на большую часть создано подменой n, а не множителем.\n\n(2) ПРИМЕНИ ФОРМУЛУ НАХОДКИ ПОСЛЕДОВАТЕЛЬНО — ВЕРДИКТ НЕ МЕНЯЕТСЯ, А УХОДИТ ДАЛЬШЕ ОТ ПЕРЕХОДА. При n самого пола: mde(2.1354,15,k=3,between=False,df=15)=1.963 · mde(5.053,15,3,False,15)=4.645. Прогнав сетку n∈{15,31}×k∈{1,3}×between×df∈{14,15,30}, я сверил каждый вариант с боевыми перевесами (claude A1B 3.50, A3 2.16, A6 1.03; sol A1B 4.74, A3 3.13, A6 0.62). Ни один вариант, совместимый с Д0.6 (between=False, потому что свой пол судится РАЗНЫМИ сессиями и межсессионную компоненту уже несёт), ни одного вердикта не переворачивает: sol A3/A0 |3.13| ниже 3.231 (k=3,n=31), 3.653 (печатаемый) и 4.645 (k=3,n=пола); claude A3/A0 |2.16| выше 1.365, 1.544 и 1.963. Sol A3/A0 переходит порог ровно при двух числах — 2.541 (2.8·sd/√31) и 2.721 (t, k=1, n=31), — и оба МЕНЬШЕ печатаемого, то есть требуют ослабить порог, тогда как весь довод находки состоит в том, что при k=3 множитель должен быть БОЛЬШЕ (3.56 против 2.8 при df=15). Две половины находки тянут в противоположные стороны; её собственное лекарство напечатанный вердикт подтверждает.\n\n(3) ЭТО ОБЪЯВЛЕННОЕ ПРАВИЛО ПРЕ-РЕГА, А НЕ ПРОТИВОРЕЧИЕ С НИМ. Правило «порог из своего пола без ручной поправки» — Д0.6 (docs/experiments/23-editor-tier.md:820-822). Тем же 2.8 посчитаны все прежние пороги паков (§12 :521-522, §12в :601). Порог Sol 3.53 = 2.8·5.05/√16 напечатан ДО первого ответа фазы (Д0.7 :842, Д0.12 :1003-1004), замеренный 3.65 из той же формулы — постфактум-подгонки нет. `power.py:244` сам печатает «MDE — свойство ПЛАНА, а не результата. Свой пол каждого прохода меряется в фазе и печатается рядом», а Д0.3 (:773-775) добавляет «Решает СВОЙ пол». Множественность применяется один раз — Холмом к p знакового теста (`itog_d4.py:209`), и переход требует ОБОИХ условий (`itog_d4.py:217`).\n\n(4) ПОСЛЕДСТВИЕ, ЗАЯВЛЕННОЕ НАХОДКОЙ, НЕ МАТЕРИАЛИЗУЕТСЯ И НИЖЕ ПО ТЕЧЕНИЮ. `eval/.venv/bin/python eval/dovodka/adjud.py --score` (154 из 154 ответов, контроли адъюдикатора: сговорчивость 13% при n=15, чувствительность 67% при n=15 — оба ГОДЕН): A3 85% подтверждено (n=26), A0 73% (n=22) → «⛔ условие П-1 ≥80% НЕ выполнено». Эскалация, в которую упирается граничный sol A3/A0, разрешилась в «НЕ ПОДТВЕРЖДЕНО» уже по своим уликам.\n\nНе проверено пере-раном (со слов кода, не мои замеры): происхождение прайоров FLOORS из паков 22/23 — я сверял только их арифметическое соответствие напечатанным в §12/§12в порогам."
}
},
{
"title": "Замеренный пол хуже прайора, но пере-классификация оси, обещанная пре-регом, не исполняется — itog печатает ПЕРЕШЁЛ ПОРОГ и CONFIRM",
"severity": "важно",
"evidence": "contour.py:558-561: «ВСЯ несущесть оси Д4 держится на ЗАИМСТВОВАННОМ прайоре sd 2.12 … при sd 2.13 ось уже описательная»; power.py комментарий перед GRID: «если он выйдет хуже прайора — ось пере-классифицируется ТОГДА ЖЕ». Замер: claude pstdev(пол)=2.135, sol=5.053. Прогон power.py на прайоре 2.12 уже печатает «⛔ НЕДОМОЩЕН» всем трём первичным контрастам (A1B/A0 и A3/A0: MDE 1.67 > цели 1.50; A6/A0: 2.32 > 1.50). itog_d4.py таких статусов не читает и не печатает.",
"consequence": "Итоговая таблица оси Д4 объявляет «ПЕРЕШЁЛ ПОРОГ» и «CONFIRM» по контрастам, которые собственный файл мощности пре-регом объявил описательными, а замеренный пол это подтвердил (у claude — впритык, у sol — вдвое хуже прайора).",
"grounded": "проверено исполнением",
"verdict": {
"corrected": "Остаётся верным узкое: itog_d4.py не импортирует power.py и не печатает поконтрастный статус мощности (единственный импорт power из зоны — sud.py:272, и только для селф-теста совпадения семейства контрастов). Читатель вывода itog не видит, что при ЗАИМСТВОВАННОМ прайоре ось была объявлена описательной. Это дефект печати/связности файлов, а не дефект вердикта: ни один из напечатанных вердиктов от подключения power.py не меняется. Дополнительно верно, что пол sol (5.053) хуже честного прайора 2.61 в 1.94 раза, из-за чего A3/A0 и A6/A0 у sol недомощны — но itog их и печатает как «ниже порога», а единственный CONFIRM (A1B/A0, 3.50 и 4.74) проходит MDE обоих семейств на их собственных полах с запасом.",
"refuted": true,
"why": "Числа находки воспроизвёл, вывод — нет. Проверено моими прогонами: `eval/.venv/bin/python eval/dovodka/power.py` печатает по трём первичным контрастам «⛔ НЕДОМОЩЕН» (1.67 · 1.67 · 2.32 против цели 1.50); `eval/.venv/bin/python eval/dovodka/itog_d4.py` даёт пол claude pstdev=2.1354 (n=15 пар, порог 1.5438) и sol pstdev=5.0526 (порог 3.6528), и «ПЕРЕШЁЛ ПОРОГ» + «CONFIRM» по A1B/A0. Опровергается три раза.\n\n(1) ПРЕМИСА «пол хуже прайора» смешивает шкалы. power.py:16-18 и :41: прайоры — полы прошлых паков, чьи половины судил ОДИН судья, и именно поэтому к ним применяется ×1.23; §12б эксп-23 (23-editor-tier.md:549-563) это и замерил: «пара, у которой ОБЕ половины судит один и тот же судья» → se 0.513 наивная → 0.629 честная. Пол Д4 меряется ПАРОЙ, чьи половины судят РАЗНЫЕ сессии (itog_d4.py:117-125 берёт CTRLfloor p1 против CTRLfloor p2; требование промта :160), то есть межсессионная компонента в нём УЖЕ сидит. Сопоставимое сравнение: 2.12×1.23 = 2.608 против замеренных 2.1354 — пол claude на 18% ЛУЧШЕ прайора, а не хуже. Порог Э-3 «sd ≤ 1.91» тоже наивный (power.py:208-209 делит на BETWEEN), в честной шкале это 2.349, и 2.1354 в него укладывается.\n\n(2) ПЕРЕ-КЛАССИФИЦИРОВАТЬ НЕЧЕГО, и это объявлено. Эррата Д0.11 Э-3 (23-editor-tier.md:915-921) дословно: «При заимствованном прайоре sd 2.12 ось Д4 ОПИСАТЕЛЬНАЯ», с теми же 1.67 · 1.67 · 2.32, и «Несущей её делает только СВОЙ пол… A6/A0 требует sd ≤ 1.37 и при n=16 не спасается ничем». То есть статус, который печатает power.py, — это пред-объявленное ограничение, а не находка; обещание «выйдет хуже прайора → пере-классифицируется» есть обещание ПОНИЗИТЬ, а понижать нечего: на прайоре ось уже описательная («описательных осей: 2 из 4» в выводе power.py).\n\n(3) НИ ОДИН ВЫВОД НЕ МЕНЯЕТСЯ, и «СВОЙ ПОЛ РЕШАЕТ» itog исполняет — правилом рига Д0.6 (itog_d4.py:173, thr = 2.8·sd/√n на ЗАМЕРЕННОМ поле), которое строже MDE на том же поле: claude 1.544 против MDE 1.365, sol 3.653 против MDE 3.231 (mult k=3, df=15 = 3.56 из power.mde). Все напечатанные пересечения проходят даже самое консервативное прочтение MDE (с повторным ×1.23: 1.679 и 3.974): claude A1B 3.50, A3 2.16; sol A1B 4.74. Контраст A6/A0 — тот самый, про который Э-3 говорит «не спасается ничем», — напечатан «ниже порога» у ОБОИХ семейств (1.03 и 0.62), то есть несущего клейма по H-1 никто не выдал. Недомощность = риск II рода (прибор может ПРОЗЕВАТЬ эффект размера цели 1.50), а не запрет на детекцию перевеса втрое больше MDE; ровно это направление риска зафиксировано в §12б (:565-570). Плюс знак: все пересечения отрицательные, то есть «хуже», а понижение по П-2 (:1079-1088) касается права говорить «не хуже» — sol его и лишён гейтом чувствительности, что itog печатает сам."
}
},
{
"title": "Пол меряется на почти одинаковых текстах: половины пары схожи на 98%, а сравниваемые армы — на 80%",
"severity": "важно",
"evidence": "contour.py:576-585: обе половины пола — генерации ОДНОГО лечения (фиксер по одному списку мест над одной базой). difflib.SequenceMatcher: пол flo1/flo2 медиана 0.9797 (мин 0.9377, n=15); A0 против A3 медиана 0.7991; A0 против A1B 0.8164; A0 против flo1 0.7953.",
"consequence": "sd, из которого строится порог различимости, снят на паре near-twin текстов, тогда как каждый первичный контраст сравнивает тексты вдвое-впятеро более разные. Порог занижен для той величины, к которой применяется, — это тот же класс, что урок «близнеца» эксп-23, только не побайтный и потому не пойманный селфтестом sud.py:261.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": true,
"why": "Премиса воспроизводится, следствие — нет.\n\n1) ЧИСЛА ПРЕМИСЫ ПОДТВЕРЖДАЮ своим прогоном difflib (SequenceMatcher, autojunk=False, скрипт мой, не из отчёта): пол flo1/flo2 медиана 0.9793 (n=16 сырых пар; 16-я в судейство не идёт — floor_pair отдаёт \"\" при finish!=stop, судимых 15, их медиана совпадает с заявленной 0.9797); A0 против A3 0.7991; A0 против A1B 0.8164; A0 против flo1 0.7953. Дополнительно: A0 против A2 0.6343, против A6 0.6390, против A4 0.9986. То есть «пол — near-twin, контрасты — нет» фактически верно.\n\n2) ЭТО ОБЪЯВЛЕНО, А НЕ ПРОПУЩЕНО. Пре-рег Д0.6 (23-editor-tier.md:817-819) и эррата Э-12 (:1000) задают пол именно так: «Обе половины — ОТДЕЛЬНЫЕ генерации» одного лечения; docstring contour.py:556-568 повторяет это как норму. Пара нулевого контраста near-twin ПО ОПРЕДЕЛЕНИЮ: под H0 «армы — одно лечение» тексты и обязаны быть похожи. Урок «близнеца» эксп-23 (:541-547) — про побайтное переиспользование БОЕВОЙ клетки, отчего контроль был пуст (перевес ровно 0 в 16/16); здесь контроль не пуст (sd 2.14, смещение +1.80), так что «тот же класс» не держится.\n\n3) СЛЕДСТВИЕ «ПОРОГ ЗАНИЖЕН» ОПРОВЕРГАЮ ЗАМЕРОМ. Механизм находки требует, чтобы разброс судейской разности рос с непохожестью текстов. Замерил обратное на нулевой непохожести: один и тот же ПОБАЙТНО текст, судимый двумя разными сессиями (arm p1 против p2), даёт claude sd 2.32 (A0), 3.12 (A1B), 3.13 (A3), 2.51 (A2), 2.31 (A4) — все НЕ МЕНЬШЕ пола 2.14; sol 5.416.61 против пола 5.05. При нулевой текстовой разнице разброс не схлопывается, он на уровне пола или выше: величиной правит судейский шум, а не расстояние между текстами.\n\n4) НА САМОЙ ВЕЛИЧИНЕ, К КОТОРОЙ ПОРОГ ПРИМЕНЯЕТСЯ, ПОЛ КОНСЕРВАТИВЕН. Поединичный разброс боевых контрастов (claude): A1B/A0 sd 2.58, A3/A0 2.06, A6/A0 1.65 при поле 2.14; свои SE-пороги 2.8·sd/√n = 1.30 / 1.03 / 1.16 против взятого из пола 1.54. По одной сессии (яблоки к яблокам по числу оценок): 1.61/1.20, 1.34/1.00, 1.19/1.32 — всё, кроме одной ячейки A1B-p1 (1.61), ниже 1.54. У sol зазор больше: свои 1.933.32 против порога из пола 3.65. Плюс структурная причина этого запаса, тоже пре-регистрированная: пол ПО ПОСТРОЕНИЮ межсессионный (flo1→П1, flo2→П2, sud.py:145-152 и :191), а боевые контрасты внутрисессионные по норме «все армы единицы — в одном задании одной сессии», то есть пол несёт компоненту дисперсии, которой у контрастов нет.\n\n5) НИ ОДИН ВЫВОД ФАЗЫ НЕ ДВИГАЕТСЯ. Свод (itog_d4.py, мой прогон): claude пол 2.14/порог 1.54, A1B/A0 3.50, A3/A0 2.16, A6/A0 1.03; sol пол 5.05/порог 3.65, 4.74, 3.13, 0.62; вердикты П-1: CONFIRM · эскалация · не подтверждено. Чтобы снять хоть один переход порога, sd пола нужно поднять на +40% (claude A3/A0) или +30% (sol A1B/A0), а замер §34 указывает в противоположную сторону. Знаковые p (Холм) от пола вообще не зависят.\n\nЧто остаётся живого: у пола n=15 и он оценка (df=14) — но это уже учтено эрратой Э-3, и она про t-квантиль, а не про схожесть текстов.",
"corrected": "Выживает только описательная часть, без последствия: пол оси Д4 снят на паре, чьи половины схожи на 0.979 медианно (n=15 судимых), тогда как первичные контрасты сравнивают тексты со схожестью 0.630.82. Это объявленное устройство нулевого контраста (Д0.6 :817-819, Э-12), а не непойманный дефект, и на величину порога оно не действует: при НУЛЕВОЙ текстовой разнице (побайтно один текст, две сессии) разброс равен 2.313.24 у claude и 5.416.61 у sol, то есть не ниже пола (2.14 / 5.05), а поединичный разброс самих боевых контрастов даёт пороги 1.001.61 (claude) и 1.933.32 (sol) против взятых из пола 1.54 и 3.65 — пол консервативен, а не занижен."
}
},
{
"title": "itog_d4 не воспроизводит вердикт рига о честности пола; на данных claude этот вердикт — «ПОЛ СМЕЩЁН, боевые числа снимаются»",
"severity": "важно",
"evidence": "absjudge.py:679-684 печатает по полу знаковый тест и вердикт «⛔ ПОЛ СМЕЩЁН: ноль ВНЕ интервала, боевые числа снимаются». itog_d4.floor_sd (строки 117-125) берёт из пола только pstdev и mean не проверяет. Замер: claude diffs=[1,2,0,5,1,1,-1,2,3,4,7,-1,2,1,0], mean +1.80, bakeoff.sign_perm_p=0.0061 (<0.05); sol mean +1.93, p=0.2007.",
"consequence": "Унаследованный гейт, снимающий боевые числа, к фазе Д не применён; на семействе claude — том самом, что несёт оба CONFIRM — он бы сработал. Систематический сдвиг +1.8 между наборами p1/p2 в сбалансированных контрастах сокращается, но сам факт непроверенного и непечатаемого гейта означает, что смещение пола осталось незаявленным.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"corrected": "Верно на уровне кода и снижено по масштабу. ВЕРНО: itog_d4.floor_sd (itog_d4.py:117-125) берёт из пола только pstdev, среднее пола ни один риг фазы Д не считает и не печатает (прогон itog_d4.py печатает лишь «n=15 · sd=2.14 → ПОРОГ 1.54»), и систематический наклон между наборами нигде — ни в Д0.6, ни в Д0.11, ни в Д0.13 — не объявлен. Числа находки воспроизводятся до знака: claude diffs [1,2,0,5,1,1,-1,2,3,4,7,-1,2,1,0], mean +1.8000, pstdev 2.1354, sign_perm_p 0.0061; sol mean +1.9333, pstdev 5.0526, p 0.2007. НЕВЕРНО: «унаследованный гейт сработал бы и боевые числа снимаются». Гейт absjudge.py:662-686 написан для пола, обе половины которого лежат в ОДНОЙ пачке у ОДНОГО судьи (absjudge.py:196-206), а фаза Д от этой конструкции отступила объявленно — sud.py:15-21 и норма Д0.6 (23-editor-tier.md:817-820) требуют половин, судимых РАЗНЫМИ сессиями; штатный FLOOR_HOOK отключён (sud.py:176-177), пол входит псевдо-армом CTRLfloor (sud.py:190-192), ключей CTRLfloorA/B в данных Д нет, и блок инертен по построению. Природа сдвига измерена: боевые армы в обоих наборах — побайтно один и тот же текст (TEXT_HOOK, sud.py:170-171, от half не зависит), и p1p2 на claude положителен на ВСЕХ армах — A0 +1.16 (p 0.0125), A1 +1.72, A1B +1.90, A2 +1.74, A3 +1.74, A4 +1.13, A6 +1.56, A6F +2.12, CTRLdecoy +1.55, CTRLmargin +1.11, все p<0.05; на sol 0.30…+1.35, все p>0.28. Пол claude +1.80 лежит внутри этой полосы, то есть это аддитивная строгость набора p1, а не смещение пары пола. Все три контраста сбалансированы по половинам полностью (31/31/16 единиц, несбалансированных ноль), поэтому аддитивный сдвиг в margins сокращается точно; поднаборные перевесы claude A1B/A0 3.87/3.13, A3/A0 2.45/1.87, A6/A0 1.00/1.06 — знак один в обеих половинах, объединённые 3.50/2.16/1.03, вердикты не меняются. Остаток находки — дефект ОТЧЁТНОСТИ (наклон набора не замеряется и не печатается), а не гейт, снимающий боевые числа; sd считается вокруг среднего, поэтому порог 1.54 сдвигом не заражён.",
"why": "Пере-ран своими командами: eval/.venv/bin/python eval/dovodka/itog_d4.py и свой скрипт поверх itog_d4.read_family/margins и bakeoff.sign_perm_p. Числа находки воспроизвелись точно (claude пол mean +1.8000, p 0.0061; sol +1.9333, p 0.2007), и код-факт подтверждён по строкам (itog_d4.py:117-125, :171-172, :181-182 — mean не считается и не печатается). Опровергнута трактовка: гейт absjudge.py:662-686 предполагает пол в ОДНОЙ пачке у одного судьи (absjudge.py:196-206), а фаза Д объявленно развела половины по разным сессиям (sud.py:15-21; Д0.6, 23-editor-tier.md:817-820), отключив FLOOR_HOOK (sud.py:176-177) и заведя псевдо-арм CTRLfloor (sud.py:190-192), — ключей CTRLfloorA/B в данных Д нет. Собственный замер на побайтно одинаковых боевых текстах (TEXT_HOOK не зависит от half, sud.py:170-171) показал, что p1p2 положителен на всех 11 армах claude (+1.11…+2.12, все p<0.05) — сдвиг принадлежит набору p1, а не паре пола; на sol такого нет (0.30…+1.35, p>0.28). Все контрасты полностью сбалансированы по половинам (31/31/16, несбалансированных ноль), поднаборные перевесы совпадают знаком (A1B/A0 3.87/3.13, A3/A0 2.45/1.87, A6/A0 1.00/1.06), объединённые вердикты не меняются. Незаявленным остался только сам наклон набора — этого в пре-реге и эрратах Д0.11/Д0.13 действительно нет (грепы по 23-editor-tier.md и eval/dovodka/*.py)."
}
},
{
"title": "itog_d4 восстанавливает текст грубого декоя ЧУЖИМ списком посадок: 62/62 меток не сходятся с sig ключа, печатаемая доля «цитат не найдено» завышена вшестеро",
"severity": "важно",
"evidence": "itog_d4.py:77 `AJ._plant(S.C.base_a0(u[\"uid\"]))`; absjudge._plant читает PLANTS.json из AJ.KEYS, а AJ.KEYS переставляется на blind-keys-d4 только в sud.setup() (sud.py:181), который itog никогда не вызывает. Проверено: absjudge.KEYS = /home/ubuntu/books/role-topology/blind-keys, его PLANTS.json — список эксп-21 («через N дн»→«спустя N год», «двадцать»→«семьдесят»), а blind-keys-d4/PLANTS.json другой. Сверка sha1 восстановленного текста с полем sig ключей: A0 0/62, A1B 0/62, A3 0/62, CTRLfloor 0/31, CTRLmargin 0/54 — и CTRLdecoy 62/62 расхождений.",
"consequence": "Печатаемая строка «цитат 4994 · не найдено в своём варианте 255 (5%)» на 222 позиции состоит из артефакта: без CTRLdecoy у claude 33 из 4357 = 0.8%, у sol 219 из 8991 = 2.4%. Пункт 1 годности пачки («цитата, которой нет в своём варианте») при этом всё равно не влияет ни на что: в bad (itog_d4.py:102-107) он не записывается вовсе.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Опровергнуть не удалось: воспроизведено собственным исполнением, все числа находки сошлись точно. (1) `itog_d4.py` нигде не зовёт `S.setup()` (греп по файлу: единственные обращения — `S.floor_pair`, `AJ._plant`, `S.text_of`, `S.units`, `S.C.base_a0`), а `AJ.KEYS = KEYS` живёт только в `sud.py:181` внутри `setup()`. Мой прогон печатает после `_load(\"sud\", …)`: `AJ.KEYS = /home/ubuntu/books/role-topology/blind-keys`. (2) Сверка sha1(текст)[:12] с полем `sig` обоих ключей `blind-keys-d4/d4p{1,2}-KEY.json` по всем меткам: A0 0/62, A1 0/58, A1B 0/62, A2 0/62, A3 0/62, A4 0/62, A6 0/32, A6F 0/32, CTRLfloor 0/31, CTRLmargin 0/54 — и CTRLdecoy 62/62 несходств. С `AJ.KEYS = sud.KEYS` (то, что делает setup) CTRLdecoy сходится 62/62, то есть эмитировался именно список `blind-keys-d4/PLANTS.json` (книго-независимый, 6 правил), а восстанавливается чужой список эксп-21 (7 правил, «через N дн»→«спустя N год», «двадцать»→«семьдесят»). (3) `itog_d4.py --gates` печатает claude «цитат 4994 · не найдено 255 (5%)» и sol «цитат 10151 · не найдено 514 (5%)»; разбивка по классам меток моим скриптом: claude 222/637 промахов приходится на CTRLdecoy, без него 33/4357 = 0.8%; sol 295/1160 на CTRLdecoy, без него 219/8991 = 2.4%. (4) Последствие ограничено печатной строкой: `quotes_missing` пишется в `itog_d4.py:113` и читается только в `:178-179`; в `bad` идут ровно два условия (`:102` «не все оси», `:107` «ненулевая без обоснования»), пункта про цитату там нет. Оценки судей парсятся из ответа по метке, `variant()` участвует только в счёте промахов, поэтому пол, пороги, гейт чувствительности, грубый декой и первичные контрасты не затронуты — ни один вывод фазы не меняется. (5) Объявленным ограничением это не является: `Д0.6` (23-editor-tier.md:814) нормы «цитата обязана находиться в своём варианте» не содержит — она есть только в шапке самого `itog_d4.py`; в эрратах Д0.11 (:898) и Д0.13 (:1052) дефект не упомянут.",
"corrected": "Находка верна по механике и по всем приведённым числам; неточен только масштаб в заголовке. «Завышена вшестеро» относится к семейству claude (5.1% → 0.8%, ×6.7); у sol завышение ×1.9 (5.1% → 2.7%). Кроме того, правильный контрфакт — не выбросить метки CTRLdecoy, а восстановить их верным списком посадок: с `AJ.KEYS = blind-keys-d4` промахи цитат на самих метках декоя составляют 5/637 = 0.8% (claude) и 57/1160 = 4.9% (sol), а печатаемая строка должна читаться claude 38/4994 = 0.8% и sol 276/10151 = 2.7%. Смежное (вне рамок находки, для сведения): `sud.py:253` в `selftest()` зовёт `AJ._plant` под тем же непереставленным `AJ.KEYS`, то есть самопроверка «грубый декой ГРУБЕЕ маржевого» тоже гоняется на чужом списке посадок."
}
},
{
"title": "Аннулирование пачки за непойманный грубый декой объявлено в шапке itog_d4, но не исполняется; у sol такая пачка есть",
"severity": "мелко",
"evidence": "itog_d4.py:16 «ГРУБЫЙ ДЕКОЙ. Не пойман — пачка аннулируется целиком (норма Д0.6)»; код (строки 184-186) только печатает «пойман 61/62». Найдена пачка sol debb2c1aef/p1: carry декоя 16 против carry донора A0 19. Пере-счёт без неё: A1B/A0 4.742→4.726, A3/A0 3.129→3.113 (n=31, p=0.0000), пол и порог не меняются, маржевый +2.96→+3.06.",
"consequence": "Гейт, объявленный аннулирующим, к числам не применён. Величина эффекта мала (0.016 по A3/A0), но вердикт «пойман 61/62» печатается без последствия, которое сам файл объявил обязательным.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверено собственными командами, находка стоит по существу, но масштаб и механика описаны неточно в двух местах. (1) Код: itog_d4.py:16 объявляет аннулирование шагом 4, единственный код по грубому декою — строки 183-186, только печать «пойман N/M», фильтра нет. (2) Однако механизм аннулирования существует вне кода: файлы, переименованные в *.ANNULLED, пропускаются всеми тремя потребителями (itog_d4.py:89, adjud.py:96, spanjoin.py:82). В ~/sud-d4 таких файлов 15 (7 в p1, 8 в p2), у каждого есть живой пере-суженный дубль того же стема; в ~/sol-d4-work их ноль. То есть гейт полу-механизирован переименованием и к этой пачке не применён — это точнее, чем «не исполняется». (3) Пачка опознана моим пере-счётом: у sol ровно одна пачка с непойманным грубым декоем (у claude ноль) — uid debb2c1aef, половина p1, файл ~/sol-d4-work/p1-answers/5624d69feb.txt, carry декоя 16 против carry A0 19 (diff 3). Тот же стем в claude p1 аннулирован и пере-сужен, причём декой пойман в обеих версиях (+3), значит аннулирование claude там было по другой причине. (4) Числа находки воспроизведены до трёх знаков: A1B/A0 4.7419→4.7258, A3/A0 3.1290→3.1129 (n=31, p=0.0000), маржевый +2.9630→+3.0566, пол n=15 sd=5.053 порог 3.6528 без изменений, грубый становится 61/61. (5) Ни один вердикт не двигается: гейт чувствительности sol по-прежнему не пройден (3.06 < 3.65), A1B по-прежнему переходит порог, A3 по-прежнему ниже → эскалация к адъюдикации сохраняется, таблица расхождения семейств идентична. (6) Масштаб шире, чем указано в находке, но не по числам: adjud.py:collect() берёт претензии только из ~/sud-d4 (claude), поэтому адъюдикация не затронута; spanjoin.py читает ОБА семейства и эту пачку потребляет — при её аннулировании колонки sol двигаются на ≤0.19 п.п. (A3 94.46%→94.37%, A4 88.68%→88.49%, A0 92.16%→92.03%), печатаемое округление не меняется. (7) Как объявленное ограничение это нигде не описано: греп по docs/ и eval/ не даёт ни debb2c1aef, ни 61/62, ни упоминания неисполненного аннулирования; в Д0.11 (Э-1…Э-14) и Д0.13 (П-1…П-9) этого нет. Смежное, мной не разрешённое: Д0.6 (:816) формулирует норму на уровне СЕССИИ («сессия … аннулируется целиком»), а норма для обоих семейств (:1023) и таблица Д0.13 П-1 (:1070) — на уровне ПАЧКИ; и та же строка П-1 говорит, что семейство, не прошедшее маржевый контроль, аннулируется пачкой, тогда как тело П-2 и код понижают вердикт до описательного, а sol этот гейт не прошёл.",
"corrected": "Гейт «непойманный грубый декой → пачка аннулируется» (itog_d4.py:16, норма Д0.6 / Д0.13 П-1) не исполняется В КОДЕ: строки 183-186 только печатают «пойман 61/62». Аннулирование при этом полу-механизировано вне кода — переименование в *.ANNULLED, которое пропускают itog_d4.py:89, adjud.py:96 и spanjoin.py:82 (в ~/sud-d4 таких файлов 15, у каждого живой пере-суженный дубль; в ~/sol-d4-work ноль), — и к единственной провалившей пачке не применено. Пачка: sol uid debb2c1aef половина p1, файл ~/sol-d4-work/p1-answers/5624d69feb.txt, carry декоя 16 против carry донора A0 19. У claude таких пачек ноль. Пере-счёт с её аннулированием (мой ре-ран): A1B/A0 4.7419→4.7258, A3/A0 3.1290→3.1129 (n=31, p=0.0000), маржевый декой +2.9630→+3.0566, пол n=15 sd=5.053 и порог 3.6528 неизменны, грубый 61/61. Ни один вердикт фазы не меняется: гейт чувствительности sol остаётся непройденным (3.06 < 3.65), A1B остаётся перешедшим порог, A3 остаётся ниже порога, эскалация к адъюдикации и таблица расхождения семейств те же. Затронут ещё один потребитель, не названный в находке: spanjoin.py читает оба семейства и эту пачку включает — сдвиг колонок sol ≤0.19 п.п. (A3 94.46%→94.37%), печатаемое округление не меняется; adjud.py берёт претензии только у claude и не затронут. Как объявленное ограничение это в пре-реге и эрратах Д0.11/Д0.13 не описано. Остаток находки — расхождение объявленного и исполненного гейта при нулевом влиянии на вердикты."
}
},
{
"title": "margins(): усреднение по наборам действительно смещает при асимметрии, но на этих данных асимметрии нет — дефект латентный",
"severity": "мелко",
"evidence": "itog_d4.py:140-148 берёт st.mean по имеющимся половинам отдельно для a и для b, поэтому при арме, присутствующем только в p1, средние сравниваются между наборами с разной строгостью (замеренный межнаборный сдвиг +1.8/+1.9 по полу). Пере-счёт по всем трём первичным контрастам: асимметричных единиц 0 из 31/31/16 у обоих семейств; попарный внутри-наборный счёт даёт те же числа до третьего знака (claude A1B/A0 3.500, A3/A0 2.161, A6/A0 1.031).",
"consequence": "На сданных числах смещения нет; риск реализуется, если в наборе окажется арм с пропущенной половиной (в ключах такие армы уже есть: A1 29 из 31, CTRLfloor 16/15, CTRLmargin 27).",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-ран мой, не по следу отчёта.\n\nЧТО ПОДТВЕРДИЛОСЬ (проверено исполнением)\n1. Код. itog_d4.py:140-148 — `va`/`vb` собираются независимо по имеющимся половинам, `st.mean(vb) - st.mean(va)`; при разном составе половин у a и b сравниваются средние из разных наборов. Читал файл целиком.\n2. Числа контрастов. `eval/.venv/bin/python eval/dovodka/itog_d4.py` → claude A1B/A0 3.50 (n=31), A3/A0 2.16 (n=31), A6/A0 1.03 (n=16); sol 4.74 / 3.13 / 0.62. Мой отдельный счёт: 3.5000 / 2.1613 / 1.0312 — совпадает с заявленными 3.500 / 2.161 / 1.031.\n3. Асимметрия = 0. Свой скрипт по `read_family` обоих семейств: во всех трёх первичных контрастах число единиц с разным составом половин у a и b — 0 из 31 / 31 / 16, у обоих семейств. Внутри-наборный попарный счёт даёт РОВНО те же средние (3.5000/2.1613/1.0312 и 4.7419/3.1290/0.6250), не «до третьего знака», а тождественно: при полном составе обеих половин разность средних алгебраически равна среднему внутри-половинных разностей.\n4. Межнаборный сдвиг существует. Пол: claude парно (те же uid) +1.800, sol парно +1.933 (непарные средние: claude 7.125 vs 5.200 = +1.925; sol 14.188 vs 12.667 = +1.521). p1 систематически строже и на боевых армах: claude A0 4.61/3.45, A1B 8.48/6.58, A3 7.06/5.32.\n5. Ни в пре-реге, ни в эрратах это не объявлено: `grep -n \"усредн\\|margins\" docs/experiments/23-editor-tier.md docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md` — 0 совпадений; Д0.11/Д0.13 прочитаны, речь там про MDE/поконтрастную мощность/несущую сумму, не про усреднение по наборам.\n6. Вывод не меняется: на сданных числах смещения нет, вердикты (CONFIRM по A1B, эскалация по A3, не подтверждено по A6) остаются.\n\nГДЕ НАХОДКА НЕТОЧНА (масштаб и улика «последствия»)\n7. Два из трёх примеров «армов с пропущенной половиной» — не такие. Прямой разбор сырых ключей ~/books/dovodka/blind-keys-d4/d4p1-KEY.json и d4p2-KEY.json (31 пачка в каждой половине, 1 пачка = 1 uid): A1 — 29 единиц, у ВСЕХ 29 обе половины; CTRLmargin — 27 единиц, у всех 27 обе половины. Это недобор ЕДИНИЦ, а не половин, и margins() он не задевает. Единственный реально полу-асимметричный арм — CTRLfloor: 16 единиц, у 15 обе половины, uid 474f822806 только в p1.\n8. CTRLfloor до margins() не доходит: margins вызывается ровно в одном месте (itog_d4.py:204) и только по трём PRIMARY (A1B/A0, A3/A0, A6/A0); пол идёт в floor_sd (:121-124), который требует ОБЕ половины, контроли — в control() (:131-136), где перевес берётся внутри одной половины. Структурно половино-зависим только CTRLfloor: text_of (sud.py:116) параметра half не имеет, CTRLmargin и декой производны от A0, половину берёт лишь floor_pair (sud.py:145-151, подстановка на :191).\n9. Живой путь реализации риска другой: побочный отсев ОДНОЙ метки в read_family (itog_d4.py:100-103, «не все оси» → continue). Он выбивает арм в одной половине при сохранившейся другой — ровно та асимметрия. В этом прогоне «замечаний годности: 0» у обоих семейств, поэтому не сработал.\n10. Величина смещения на контрасте меньше, чем читается из «+1.8/+1.9»: сдвиг частично сокращается, так как обе руки контраста едут в одну сторону. Симуляция (снял p1 у арма-числителя): claude при потере p1 во ВСЕХ единицах A1B 3.500→2.548, A3 2.161→1.290, A6 1.031→0.250 (дельты +0.95/+0.87/+0.78); sol +0.03/+0.23/+0.06; при потере p1 в 1-3 единицах — 0.00-0.13. То есть смещение на контрасте ≤ ~0.95 балла у claude и ≤ ~0.23 у sol, а не 1.8-1.9. Вердикто-значимо это всё равно: 1.290 у claude A3/A0 ушло бы ниже порога 1.54.",
"corrected": "margins() (itog_d4.py:140-148) действительно усредняет по имеющимся половинам отдельно для a и для b, и при разном составе половин сравнивает средние из наборов разной строгости (замеренный межнаборный сдвиг по полу: claude +1.800, sol +1.933 парно). На сданных данных дефект латентный: асимметричных единиц 0 из 31/31/16 у обоих семейств, внутри-наборный попарный счёт даёт те же средние тождественно (claude 3.5000 / 2.1613 / 1.0312), ни один вердикт не меняется.\n\nПоправки к формулировке последствия: (а) из трёх названных «армов с пропущенной половиной» такими не являются два — по сырым ключам A1 (29 единиц) и CTRLmargin (27 единиц) имеют ОБЕ половины у всех своих единиц, это недобор единиц, а не половин; единственный полу-асимметричный арм — CTRLfloor (uid 474f822806 только в p1); (б) CTRLfloor до margins() не доходит — margins вызывается только по трём PRIMARY (itog_d4.py:204), пол идёт в floor_sd, требующий обе половины, контроли — в control() внутри одной половины; структурно половино-зависим только CTRLfloor (text_of половины не знает, sud.py:116); (в) реальный путь реализации риска — отсев одиночной метки в read_family (itog_d4.py:100-103, «не все оси»), в этом прогоне 0 срабатываний; (г) масштаб смещения на контрасте — не 1.8-1.9, а ≤0.95 балла у claude и ≤0.23 у sol (симуляция полной потери p1 у арма-числителя: A1B 3.500→2.548, A3 2.161→1.290, A6 1.031→0.250), при этом claude A3/A0 в таком сценарии ушёл бы ниже порога 1.54, то есть риск вердикто-значим."
}
},
{
"title": "Мелочи, не меняющие вердиктов: мёртвая ветка FLOOR_HOOK, подпись столбца spanjoin, расхождение счёта карантина",
"severity": "мелко",
"evidence": "sud.py:176-177 `FLOOR_HOOK=lambda u: ((...) if False else None)` — всегда None, из-за чего в absjudge отрабатывает ветка по умолчанию (absjudge.py:202-206, файлы bo2-A-*/bo3-Aprime-*); проверено, что таких файлов в ~/books/dovodka нет (0), поэтому чужой пол в пачки не попал — инвентарь армов ключа это подтверждает (CTRLfloorA/B отсутствуют). spanjoin.py:117 печатает столбец «единиц», а в нём число меток: 62 = 31 единица × 2 набора (A6: 32 = 16×2). ~/sud-d4/annulled.txt пишет «файлов отправлено в карантин: 11», в дереве 15 файлов *.ANNULLED.txt (7 в p1, 8 в p2); у всех 15 есть живой пере-суд с другим содержимым (md5 отличаются).",
"consequence": "Числа оси не меняются; в отчёт может уехать n вдвое больше реального (spanjoin) и неверный счёт карантина.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-ран подтвердил все три пункта по существу, но улика пункта 1 неверна в механике и в основании. FLOOR_HOOK в sud.py:176 — это ЛЯМБДА, а не None, поэтому в absjudge.py:196 берётся ветка `if FLOOR_HOOK is not None`, pair=None, и ветка по умолчанию absjudge.py:201-206 НЕ отрабатывает (она недостижима), вопреки формулировке находки. Основание «таких файлов в ~/books/dovodka нет (0)» проверяет не тот каталог: ветка читает absjudge.OUT = ~/books/role-topology (absjudge.py:57), а sud.py переопределяет только AJ.KEYS (:181) и DIRS_HOOK, но не AJ.OUT (грепом по eval/dovodka/ ни одного `AJ.OUT`); в ~/books/role-topology таких файлов 32, то есть будь ветка живой, чужой пол эксп-21 попал бы в пачки. Вывод пункта 1 при этом верен: инвентарь ключей d4p1/d4p2-KEY.json даёт CTRLfloor 31 и ноль CTRLfloorA/CTRLfloorB. Пункт 2 подтверждён исполнением: `eval/.venv/bin/python eval/dovodka/spanjoin.py` напечатал CLAUDE A0 62, A1 58, A1B/A2/A3/A4 62, A6/A6F 32 (SOL — то же, кроме A0 61 и A4 61), а мой независимый счёт по ключу даёт 62 метки при 31 различном uid (31+31 по p1/p2), A6 32 при 16 uid, A1 58 при 29 uid; столбец «единиц» (spanjoin.py:117) печатает наблюдения = единица × 2 прохода. Пункт 3 подтверждён: annulled.txt пишет 11, в дереве 15 (7 в p1-answers, 8 в p2-answers; find по ~/sud-d4 ~/sol-d4-work ~/adjud-d4 — тоже 15), у всех 15 есть живой пере-суд, md5 отличаются 15/15. Ни один из трёх пунктов не объявлен в Д0.11 (23-editor-tier.md:898) и Д0.13 (:1052) — оба прочитаны целиком. Вердикты не двигаются: 8495% вне покрытия флагов не зависят от вдвое меньшего n, пол мёртв в обоих прочтениях, а все 15 карантинных файлов и так отсекаются фильтром spanjoin.py:82.",
"corrected": "Мелочи, не меняющие вердиктов: мёртвая ветка FLOOR_HOOK, подпись столбца spanjoin, расхождение счёта карантина. (1) sud.py:176-177 задаёт FLOOR_HOOK ЛЯМБДОЙ, всегда возвращающей None. Поскольку лямбда не None, в absjudge.py:196 берётся именно эта ветка, pair falsy — и ветка по умолчанию absjudge.py:201-206 (bo2-A-*/bo3-Aprime-*) НЕДОСТИЖИМА. Чужой пол в пачки не попал по этой причине, а не из-за отсутствия файлов: ветка читает absjudge.OUT = ~/books/role-topology (absjudge.py:57), который sud.py не переопределяет (переопределены только AJ.KEYS:181 и DIRS_HOOK), и там таких файлов 32 — будь ветка живой, пол эксп-21 уехал бы в пачки D4. Инвентарь ключа подтверждает исход: CTRLfloor 31, CTRLfloorA/B — ноль. (2) spanjoin.py:117 печатает столбец «единиц», а в нём число меток-наблюдений: 62 = 31 единица × 2 прохода (A6/A6F: 32 = 16×2; A1: 58 = 29×2); тем же счётом взвешена и печатаемая средняя доля — каждая единица входит в неё дважды. (3) ~/sud-d4/annulled.txt пишет «файлов отправлено в карантин: 11», в дереве 15 файлов *.ANNULLED.txt (7 в p1, 8 в p2); у всех 15 есть живой пере-суд с другим содержимым (md5 отличаются 15/15). Последствие: числа оси не меняются; в отчёт может уехать n вдвое больше реального (spanjoin) и неверный счёт карантина, а мёртвая ветка пола — латентная мина, потому что её каталог по умолчанию указывает на чужой пак."
}
},
{
"title": "Пачка 69de717f3f осталась в замере, хотя её судила сессия, аннулированная за сравнение вариантов",
"severity": "критично",
"evidence": "Транскрипт `agent-ad00dbe7471469543.jsonl` (subagents сессии 565edf3f) содержит Bash-вызовы `cd /home/ubuntu/sud-d4/p1-tasks && python3 - <<'EOF' import re, difflib ... d('Т1','Т2'); d('Т1','Т5'); d('Т1','Т9'); d('Т3','Т6') ...` по файлам 61e2c09c91, 63aad20593, 6840cb75d6 И 69de717f3f — то есть по ВСЕМ четырём своим пачкам. Первые три лежат как `~/sud-d4/p1-answers/*.ANNULLED.txt`, четвёртый — как обычный `69de717f3f.txt` (mtime 08-13 21:32, окно агента 21:0321:34 локального) и читается `eval/dovodka/itog_d4.py:88-89` (пропускаются только имена с `.ANNULLED`). Пере-суда этой пачки нет: ни один другой агент её не писал.",
"consequence": "Норма «сессия, не поймавшая декой/нарушившая протокол, аннулируется ЦЕЛИКОМ» (23-editor-tier.md:104) не исполнена. Снятие этой пачки: пол claude n=15 sd=2.14 порог 1.54 → n=14 sd=2.21 порог 1.65; A3/A0 2.16 → 2.21; sol порог 3.65 → 3.89, A1B/A0 4.74 → 4.81. Все печатаемые числа обоих семейств сдвигаются.",
"grounded": "проверено исполнением",
"verdict": {
"corrected": "Пачка `69de717f3f` действительно осталась в замере, хотя судившая её сессия аннулирована за межвариантные сравнения; масштаб последствий в находке завышен, а сама находка не новая.\n\nЧТО ПОДТВЕРЖДЕНО МОИМ ПЕРЕ-РАНОМ\n1. Авторство и нарушение. Транскрипт `agent-ad00dbe7471469543.jsonl` (meta: «Judge session p1-04») содержит Write ровно по четырём файлам `p1-answers`: 61e2c09c91, 63aad20593, 6840cb75d6, 69de717f3f, и Bash-вызовы попарного `difflib` по всем четырём, включая `d('Т1','Т2'); d('Т1','Т5'); d('Т1','Т9'); d('Т3','Т6')…` по файлу 69de717f3f.\n2. Механика утечки. `~/sud-d4/annulled.txt` (mtime 21:31) называет p1-session-04 аннулированной и пишет «файлов отправлено в карантин: 11»; `69de717f3f.txt` записан в 21:32 — ПОСЛЕ карантина, поэтому под переименование не попал.\n3. Пере-суда нет. Прогон Write/Edit по всем 29 транскриптам субагентов сессии: агент «Judge redo p1-02» (`a185c8af17c79fbdd`) пере-судил только 61e2c09c91, 63aad20593, 6840cb75d6, а четвёртой позицией взял `e21d60f008` — до того не судимую пачку. `69de717f3f` не писал больше никто; в `a185c8af` этот id встречается только внутри вывода `ls`.\n4. Фильтр. `eval/dovodka/itog_d4.py:89` (и `adjud.py:96`) пропускают только имена с `.ANNULLED`, так что пачка входит и в свод, и в выборку адъюдикации.\n5. Не объявлено пре-регом. Ни `23-editor-tier.md` (включая Д0.11 и Д0.13), ни `docs/PROGRESS.md`, ни заказ `POLYGON_EXP2223_REDO_SESSION_PROMPT.md` id `69de717f3f` не упоминают — грепом по `docs/` и `eval/` нуль хитов.\n\nГДЕ МАСШТАБ НАДО ИСПРАВИТЬ\n6. Сдвиг чисел Sol требует симметричного снятия, которого норма не требует. Пачку 69de717f3f у семейства Sol судила НЕ аннулированная сессия (`~/sol-d4-work/p1-answers/69de717f3f.txt` на месте, семейство отдельное). Я прогнал два контрфактуала подменой `FAMILIES` (симлинк-деревья в скрэтчпаде, файлы проекта не тронуты):\n • снято только у claude: claude n=15 sd=2.14 порог 1.54 → n=14 sd=2.21 порог 1.65; A3/A0 2.16 → 2.21; A1B/A0 3.50 → 3.53; A6/A0 1.03 без изменений. Sol не двигается ВООБЩЕ: порог 3.65, A1B/A0 4.74, A3/A0 3.13.\n • снято у обоих: воспроизводятся ровно числа находки — sol порог 3.65 → 3.89, A1B/A0 4.74 → 4.81.\n То есть все четыре числа находки верны арифметически, но пара «sol 3.65 → 3.89 / 4.74 → 4.81» получается лишь при снятии единицы у обоих семейств; по норме аннулирования снимается только пачка claude.\n7. «Все печатаемые числа обоих семейств сдвигаются» — неточно. При норме-верном (claude-only) снятии числа sol не меняются ни одним знаком, а у claude A6/A0 (1.03, p 0.0367) остаётся тем же.\n8. Ни один вывод фазы не меняется — в ОБОИХ контрфактуалах. Вердикты идентичны базовому прогону: A1B/A0 CONFIRM; A3/A0 ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ (порог перешло только claude); A6/A0 не подтверждено ни одним семейством. Гейт чувствительности: claude ПРОЙДЕН (+2.57 против 1.65), sol НЕ ПРОЙДЕН (+2.96 против 3.89). Адъюдикация тоже устаивает: из 154 претензий на эту пачку приходится ровно одна (П079, арм A3, подтверждена), снятие даёт A3 85% → 84% при A0 неизменных 73%, то есть условие П-1 «≥80% у обоих» не выполнено и до, и после.\n9. Находка не новая: сама полигон-сессия уже отчиталась о ней владельцу дословно — «Пачка `69de717f3f` осталась в замере… вместо неё в пере-суд ушла другая пачка. Дыра в моём же аннулировании» (транскрипт `565edf3f`, финальный отчёт, в списке «четыре критичных находки я проверил сам»). Не исправлено: файл по-прежнему лежит без суффикса `.ANNULLED`, в пре-рег/эрраты ограничение не внесено.\n\nИТОГОВАЯ ФОРМУЛИРОВКА: нарушение нормы «сессия аннулируется целиком» (23-editor-tier.md:104, Д0.6) реально и не устранено; оно сдвигает пол и пороги семейства claude (n 15→14, sd 2.14→2.21, порог 1.54→1.65) и все контрасты claude на 0.030.05, не двигает ни одного числа семейства sol, не меняет ни одного вердикта фазы и ни одного гейта, и уже названо самой сессией в отчёте владельцу, но не занесено в пре-рег и не исправлено на диске.",
"refuted": false,
"why": "Опровергнуть не удалось: факт воспроизведён четырьмя независимыми проверками — (а) транскрипт `agent-ad00dbe7471469543.jsonl` показывает Write по всем четырём пачкам p1-session-04 и попарный `difflib` в том числе по `69de717f3f`; (б) `~/sud-d4/annulled.txt` (21:31) называет p1-session-04 аннулированной и считает 11 файлов карантина, тогда как `69de717f3f.txt` записан в 21:32 — после карантина; (в) скан Write/Edit по всем 29 транскриптам субагентов: пере-суд этой пачки не делал никто, редо-агент `a185c8af17c79fbdd` вместо неё взял `e21d60f008`; (г) `itog_d4.py:89` фильтрует только `.ANNULLED`, и мои два контрфактуала (симлинк-деревья + подмена `FAMILIES`, файлы проекта не правились) воспроизвели все четыре числа находки. Неверны в находке две вещи масштаба: сдвиг чисел sol (3.65→3.89, 4.74→4.81) возникает только при снятии единицы У ОБОИХ семейств, тогда как норма аннулирования касается пачки claude — при norm-верном снятии sol не двигается вовсе; и «все печатаемые числа обоих семейств сдвигаются» неверно (у claude A6/A0 1.03 не меняется). Ни один вывод фазы, гейт или адъюдикационный порог не меняется ни в одном из двух сценариев. Кроме того, находка не новая: полигон-сессия сама отчиталась о ней владельцу в финальном сообщении; в пре-рег/эрраты Д0.11/Д0.13 она не внесена и на диске не исправлена."
}
},
{
"title": "Вердикт по H-1 (A6/A0) определяется двумя пачками прогона, объявленного «валидацией цепочки», судимого 11.08 по НЕ замороженному промту",
"severity": "критично",
"evidence": "`~/books/dovodka/agent-runs.json` запись n=1: at 2026-08-11T10:53, judge «д-01», tokens [\"0dce349331\",\"0ffee70740\"], note «валидация цепочки: 2 пачки». Ответы датированы 08-11 14:06 и 14:15, тогда как все файлы `~/sud-d4/prompts/p1-session-*.md` записаны 08-11 14:52; первый user-промт агента `agent-aa9688762dc325180.jsonl` отличается от `p1-session-01.md` (дифф 66 строк: другая шапка, другой список заданий, «`.env` не читать» вместо «Файлы с ключами и секретами не читать», нет комментария о паритете обвязок). Средний счёт по боевым армам в этих двух пачках 9.94 против 6.39 у основной волны 13.08 и 5.045.18 у p2.",
"consequence": "Снятие этих двух пачек даёт пол n=13 sd=1.4058 порог 1.0917 и A6/A0 1.0938, то есть |перевес|−порог = +0.0020 → «ПЕРЕШЁЛ ПОРОГ» вместо нынешнего «ниже порога». Вердикт по несущей гипотезе владельца H-1 меняется знаком решения в зависимости от того, считается ли прогон-валидация боевым замером; паритет обвязок (норма Д0.13 П-4, гейт `paritet.py`) для этих двух пачек не проверялся ничем.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Опровергнуть не удалось: все числа воспроизведены собственным пере-раном, а три попытки списать эффект на объявленное ограничение, на общую шумовую чувствительность и на свойства единиц провалились. (1) Пере-ран itog_d4.py даёт базу n=15 sd=2.1354 порог 1.5438 A6/A0 1.0312 gap 0.5126 «ниже порога»; тот же скрипт на копии дерева без 0dce349331/0ffee70740 даёт n=13 sd=1.4058 порог 1.0917 A6/A0 1.0938 gap +0.0020 «ПЕРЕШЁЛ ПОРОГ» — совпадение с находкой до знака. (2) Пре-рег и эрраты Д0.11/Д0.13 этого не объявляют: грепом по 23-editor-tier.md нет ни «валидац», ни токенов пачек, ни судьи «д-01». (3) Паритет П-4 действительно не покрывал эти пачки механически: paritet.py диффует только шаблоны eval/dovodka/judge-prompts/, а core.md создан 08-11 14:46:05 при ответах 14:06:17 и 14:15:09; core.md дословно в фактическом промте транскрипта не содержится, дифф против p1-session-01.md — 73 строки unified (нет шапки о паритете, 2 задания вместо 4, «.env не читать» вместо «Файлы с ключами и секретами не читать», плюс добавленное требование назвать самый частый класс ошибок). (4) Проверка на генерическую хрупкость: из 465 комбинаций leave-2-out по 31 пачке p1 порог переводит РОВНО ОДНА — эта пара; привязка не артефакт шума. (5) Контр-гипотеза «трудные единицы» не проходит: те же две единицы дают carry 9.94 в p1 и 4.06 в p2 против 6.45/5.18 у прочих, то есть эффект волны, а не материала; их floor-диффы +7 и +5 — два крупнейших из 15, отсюда sd 2.14 вместо 1.41. Греп-аудит транскрипта чист: 12 вызовов инструментов, только p1-tasks/p1-answers, обращений к blind-keys/, dv-*, .env нет — подглядывания нет, порок именно в непаритетной обвязке и уровне волны. Неточны две второстепенные цифры и формулировка последствия, они исправлены в corrected.",
"corrected": "Вердикт по H-1 (A6/A0) держится на двух пачках прогона, объявленного в ~/books/dovodka/agent-runs.json записью n=1 как «валидация цепочки: 2 пачки» (at 2026-08-11T10:53, судья «д-01», токены 0dce349331/0ffee70740), и судимого промтом, который не совпадает с зафризенной обвязкой. Улики, проверенные исполнением: ответы датированы 08-11 14:06:17 и 14:15:09, тогда как все ~/sud-d4/prompts/p1-session-*.md записаны 14:52:43, а шаблоны обвязки eval/dovodka/judge-prompts/core.md и claude.md — 14:46:05 и 14:46:27, то есть ПОЗЖЕ обоих ответов; фактический первый user-промт агента agent-aa9688762dc325180.jsonl отличается от p1-session-01.md на 73 строки unified-диффа (нет шапки о паритете обвязок, 2 задания вместо 4, «`.env` не читать» вместо «Файлы с ключами и секретами не читать», добавлено требование назвать одной фразой самый частый класс ошибок) и не содержит core.md дословно. Гейт paritet.py на этих пачках не мог сработать по построению: он диффует только три шаблона в eval/dovodka/judge-prompts/ и фактически выданный промт не читает.\n\nМасштаб эффекта. Средний счёт по боевым армам в этих двух пачках 9.94 против 6.45 у остальной p1-волны 13.08 и 5.18 у p2 (в находке 6.39 и 5.045.18 — расхождение непринципиальное, моя раскладка: p1-остальные 6.45, p2 целиком 5.10, p2-остальные 5.18). Это эффект ВОЛНЫ, а не материала: те же две единицы (de3916de62, 3a21e0b4a3) в p2 дают 4.06, то есть НИЖЕ p2-среднего. Их floor-диффы +7 и +5 — два крупнейших из пятнадцати, и именно они поднимают пол claude с sd 1.4058 до 2.1354.\n\nПоследствие, воспроизведённое пере-раном itog_d4.py. База: n=15 sd=2.1354 порог 1.5438, A6/A0 1.0312, |перевес|−порог 0.5126, «ниже порога», П-1 печатает «не подтверждено ни одним семейством». Без двух пачек: n=13 sd=1.4058 порог 1.0917, A6/A0 1.0938, |перевес|−порог +0.0020, p Холма 0.0369, «ПЕРЕШЁЛ ПОРОГ».\n\nДве поправки к формулировке последствия. Во-первых, переключается не «CONFIRM», а клетка правила П-1: вердикт по H-1 становится «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ — порог перешло только семейство claude», а адъюдикация по H-1 не покупалась вовсе (в agent-runs.json записи 2228 несут note «адъюдикация H-2б»); то есть при снятии пачек фаза остаётся БЕЗ вердикта по H-1 до непроведённого прохода, а не получает подтверждение. Во-вторых, запас перехода +0.0020 — это 0.2% порога, так что корректная формулировка последствия не «вердикт переворачивается», а «вердикт по несущей гипотезе владельца определяется двумя пачками сомнительного статуса с запасом в третьем знаке». Специфичность привязки при этом проверена и высокая: из 465 комбинаций leave-2-out по 31 пачке p1 порог переводит ровно одна — эта пара.\n\nЧто находка НЕ показывает и что снято проверкой: подглядывания судьи не было — греп-аудит транскрипта даёт 12 вызовов инструментов, все внутри p1-tasks/p1-answers, обращений к blind-keys/, dv-* и .env нет; норма Д0.6 «половины пола судят РАЗНЫЕ сессии» и персистенция идентичности через runs.py --claim на этих пачках соблюдены."
}
},
{
"title": "Запись о карантине занижает и число аннулированных сессий, и число файлов",
"severity": "важно",
"evidence": "`ls ~/sud-d4/p1-answers/*.ANNULLED.txt ~/sud-d4/p2-answers/*.ANNULLED.txt` → 7 + 8 = 15 файлов. `~/sud-d4/annulled.txt` заканчивается строкой «файлов отправлено в карантин: 11» и называет ТРИ сессии (p1-session-03, p1-session-04, p2-session-02). По транскриптам аннулированный выход дали ЧЕТЫРЕ агента исходной волны: a0fe0b7413e822d81 (p1, 4 пачки), ad00dbe7471469543 (p1, 3 из 4), a4b35ebf094032734 (p2, 4), ac15f71bb9a7c8428 (p2, 4).",
"consequence": "Документ карантина не описывает фактическое состояние каталога: 15 файлов против 11 заявленных, 4 сессии против 3. Любая сверка «аннулированное исключено» по этому файлу пройдёт мимо четвёртой сессии и мимо оставленной пачки 69de717f3f.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-ран моими командами подтверждает оба числа находки и добавляет причину и границу последствия.\n\nЧИСЛА (проверено исполнением).\n1) Файлов в карантине 15: `ls ~/sud-d4/p1-answers/*.ANNULLED.txt` → 7, `p2-answers` → 8. `~/sud-d4/annulled.txt` (mtime 2026-08-13 21:31:38) заканчивается строкой «файлов отправлено в карантин: 11».\n2) Сессий четыре, а не три. Сопоставление промтов и ключей: p1-session-03 = {455acfd07a,464548150d,4896f07774,5624d69feb} — все 4 в карантине; p1-session-04 = {61e2c09c91,63aad20593,6840cb75d6,69de717f3f} — 3 из 4; p2-session-02 = {2f9d8d8426,436dbff414,45e94bc6a0,489ecbe01a} — все 4; p2-session-06 = {9c1f7dd03e,a22cc51b51,acd4fdce1c,ad6cff5902} — все 4, и эта сессия в annulled.txt не названа. Агент-id из транскриптов совпадают с находкой: a0fe0b7413e822d81→p1-session-03, ad00dbe7471469543→p1-session-04, a4b35ebf094032734→p2-session-02, ac15f71bb9a7c8428→p2-session-06 (грепом по `p[12]-tasks/<id>` и `p[12]-session-0N` в agent-*.jsonl).\n3) Нарушение четвёртой сессии в транскрипте есть, хотя нигде не записано: ac15f71bb9a7c8428 бьёт задание на Т-файлы и гоняет `diff <(fold -w70 -s Тa.txt) <(fold -w70 -s Тb.txt)` по парам Т3/Т4, Т6/Т4, Т5/Т1, Т7/Т5 (пачка acd4fdce1c) и Т3/Т7, Т4/Т7, Т9/Т7 (ad6cff5902) — тот же класс, что у p1-session-03/04 (`difflib`).\n\nПРИЧИНА РАСХОЖДЕНИЯ (моя реконструкция по mtime). annulled.txt — снимок на 21:31:38, а не учёт итогового состояния каталога. На тот момент существовали ровно 11 нарушительских ответов: 4 (p1-s03) + 3 (p1-s04) + 4 (p2-s02). `69de717f3f.txt` записан в 21:32:58, ответы p2-session-06 — 21:32:54…21:48:55, то есть после записи ноты; дописан документ не был.\n\nГРАНИЦА ПОСЛЕДСТВИЯ (здесь находка шире факта). Исключение аннулированного в коде идёт по ИМЕНИ файла, а не по annulled.txt: `if \".ANNULLED\" in f.name: continue` — itog_d4.py:89, spanjoin.py:82, adjud.py:96. Ни один скрипт зоны и ни один док (грепы по `annulled` в eval/ и docs/) этот файл не читают. Значит все 15 файлов, включая четыре от p2-session-06, из расчётов выпадают механически; «сверка мимо четвёртой сессии» возможна только у человека, читающего ноту глазами. Все 15 к тому же пере-сужены: redo-p1-01 (4) + redo-p1-02 (3) + redo-p2-01 (4) + redo-p2-02 (4) = 15.\n\nЧТО ДЕЙСТВИТЕЛЬНО ВЛИЯЕТ НА ЧИСЛА — только `69de717f3f.txt`: он от дисквалифицированного агента ad00dbe7471469543 (в его транскрипте `difflib` гоняется и по 69de717f3f.txt), в карантин не отправлен, в пере-суживание не включён и в свод входит — 11 меток из 579 у семейства claude.\n\nПРОВЕРКА ВЫВОДОВ (мой ре-ран, $0). База `itog_d4.py`: claude пол n=15 sd=2.14 порог 1.54; грубый декой 62/62; маржевый +2.56 ПРОЙДЕН; A1B/A0 3.50, A3/A0 2.16, A6/A0 1.03. Ре-ран с деревом-симлинками без 69de717f3f (FAMILIES подменён в скрэтчпаде, файлы репо и сырья не тронуты): пол n=14 sd=2.21 порог 1.65; декой 61/61; маржевый +2.57 ПРОЙДЕН; A1B/A0 3.53, A3/A0 2.21, A6/A0 1.03. Все три вердикта по контрастам и все три исхода правила расхождения П-1 (CONFIRM · ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ · не подтверждено) совпадают побуквенно. Ни один вывод фазы не меняется.\n\nВ пре-реге и эрратах Д0.11/Д0.13 (docs/experiments/23-editor-tier.md) карантин этой волны не описан вовсе — грепы «карантин», «11 файл», «15 файл», «session-06», «69de717f3f» по этому файлу и по docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md пусты. То есть объявленным ограничением расхождение не является; но и ратифицированный док ошибочные 11/3 никуда не унёс.",
"corrected": "Нота карантина `~/sud-d4/annulled.txt` описывает состояние на момент своей записи (13.08 21:31:38) и не была дописана: в ней 11 файлов и три сессии (p1-session-03, p1-session-04, p2-session-02), тогда как в каталоге лежат 15 файлов `*.ANNULLED.txt` (7 в p1-answers, 8 в p2-answers) от ЧЕТЫРЁХ сессий — четвёртая, p2-session-06 (агент ac15f71bb9a7c8428, пачки 9c1f7dd03e·a22cc51b51·acd4fdce1c·ad6cff5902), не названа, хотя её транскрипт показывает тот же класс нарушения (`diff` между извлечёнными вариантами задания). Расхождение 15/11 и 4/3 объясняется временем: `69de717f3f.txt` и все четыре ответа p2-session-06 записаны ПОСЛЕ 21:31:38.\n\nПоследствие уже́, чем заявлено. Код исключает карантин по имени файла (`if \".ANNULLED\" in f.name` — eval/dovodka/itog_d4.py:89, spanjoin.py:82, adjud.py:96), annulled.txt не читает ни один скрипт и ни один док, поэтому все 15 файлов, включая четыре от p2-session-06, из расчётов выпадают; «сверка пройдёт мимо четвёртой сессии» верно только для человека, читающего ноту, а не для прибора. Все 15 пере-сужены (redo-p1-01/02, redo-p2-01/02).\n\nМатериален лишь один остаток — `p1-answers/69de717f3f.txt`: он от дисквалифицированного агента ad00dbe7471469543 (difflib гонялся и по этому заданию), записан через минуту после аудита, в карантин не попал, не пере-сужен и входит в свод (11 меток из 579 у claude). Мой ре-ран `itog_d4.py` без этой пачки: порог 1.54→1.65, A1B/A0 3.50→3.53, A3/A0 2.16→2.21, A6/A0 1.03 без изменения, оба декой-гейта по-прежнему пройдены. Все вердикты по контрастам и все исходы правила расхождения П-1 идентичны базовым — ни один вывод фазы не меняется. Правка — дописать ноту (15 файлов, 4 сессии) и решить судьбу 69de717f3f; на числа фазы решение не влияет."
}
},
{
"title": "Свод и селфтест восстанавливают декой правилами посадки ЧУЖОГО пака: печатаемая годность цитат завышена в 6.7×",
"severity": "важно",
"evidence": "`eval/dovodka/itog_d4.py:77` зовёт `AJ._plant(...)` для метки CTRLdecoy, но `AJ.KEYS` на пути свода никто не переставляет: присваивание `AJ.KEYS = KEYS` стоит только в `eval/dovodka/sud.py:181` внутри `setup()`, а `setup()` вызывается лишь из `emit()`. Печать при импорте itog_d4 даёт `AJ.KEYS = /home/ubuntu/books/role-topology/blind-keys`; md5 тамошнего PLANTS.json efefa641e90e768da4bb57049d307840 против 8d5ed5fdf64056ce64a687b47e83ad7f у фазы Д. Пере-счёт с правильным каталогом: claude «цитат 4994 · не найдено 255 (5%)» → 38 (0.8%), из них на декое 222 → 5; sol 514 (5%) → 276 (2.7%). `sud.py --selftest` (строка 253 — тот же вызов без setup) печатает «грубый декой ГРУБЕЕ маржевого: грубый 0.9975 против маржевого 0.9985», на реальных правилах фазы — 0.9984 против 0.9985.",
"consequence": "Гейт годности пачки №1 («цитата, которой нет в своём варианте») для декоя считается против текста, которого судья не видел: 87% печатаемых промахов claude — артефакт. Разрыв по точности цитирования между семействами (0.8% против 2.7%) в текущей печати не виден вовсе. Проверка «грубый декой грубее маржевого» на реальных правилах держится на 0.0001, а не на 0.0010, то есть два контроля отличаются по размеру порчи на порядок меньше заявленного.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверено своими прогонами: механизм и числа цитат подтверждены, но масштаб двух утверждений неточен.\n\nПОДТВЕРЖДЕНО. Печать AJ.KEYS после импорта eval/dovodka/itog_d4.py даёт /home/ubuntu/books/role-topology/blind-keys; присваивание AJ.KEYS = KEYS есть только в eval/dovodka/sud.py:181 внутри setup(), а setup() зовётся лишь из emit(). absjudge._plant читает KEYS/PLANTS.json в момент вызова (eval/role_topology/absjudge.py:260), поэтому itog_d4.py:77 и sud.py:253 сажают ЧУЖИЕ правила. md5 совпали: efefa641e90e768da4bb57049d307840 против 8d5ed5fdf64056ce64a687b47e83ad7f. Пере-счёт read_family с AJ.KEYS = sud.KEYS: claude цитат 4994, не найдено 255 -> 38, из них на CTRLdecoy 222 -> 5; sol 10151, 514 -> 276. Все числа находки воспроизвелись.\n\nДОПОЛНИТЕЛЬНО. Взял из ~/books/dovodka/blind-keys-d4/d4p1-KEY.json первую метку с arm=CTRLdecoy, вырезал её сегмент из файла заданий и сравнил: текст равен _plant() под blind-keys-d4 (True) и не равен под role-topology (False). Дефект живёт только на пути свода и селфтеста, пачки судьям выданы штатные.\n\nВ ПРЕ-РЕГЕ И ЭРРАТАХ НЕ ОБЪЯВЛЕНО. Греп по docs/experiments/23-editor-tier.md (цитат, PLANTS, декой, _plant) и чтение Д0.11 целиком, Д0.13 П-2/П-3: такого ограничения нет.\n\nНЕТОЧНОСТЬ 1 — ГЕЙТ. Формулировка про гейт годности пачки №1 верна только для докстринга itog_d4.py. В коде read_family промах цитаты НЕ попадает в список bad: туда пишутся лишь \"не все оси\" и \"ненулевая без обоснования\" (замечаний годности 0 у обоих семейств при любом каталоге). Завышена ПЕЧАТЬ, но ни одна пачка этим не бракуется. Прогнал itog_d4.py как есть и с AJ.KEYS = sud.KEYS: diff = ровно две строки. Пороги, свой пол, грубый декой, гейт чувствительности, контрасты, p Холма и вердикты П-1 — те же. Ни один вывод фазы не меняется. Печатается при этом 1% и 3% (формат .0%), а не 0.8% и 2.7%.\n\nНЕТОЧНОСТЬ 2 — СЕЛФТЕСТ. Печать \"грубый 0.9975 против маржевого 0.9985\" воспроизвелась. Но \"на реальных правилах фазы — 0.9984 против 0.9985\" не воспроизводится. Прогнал штатный selftest() с AJ.KEYS = sud.KEYS: печатается \"[ПРОВАЛ] грубый декой ГРУБЕЕ маржевого грубый 0.9990 против маржевого 0.9985\", итог ПРОВАЛОВ: 1, строка СУДЕЙСКИЙ ХАРНЕСС ГОДЕН не печатается. То есть проверка не \"держится на 0.0001\", а не проходит. Причина в конструкции: грубый считается на одной единице us[0], маржевый берётся минимумом по us[:8]. Поштучно грубый грубее маржевого на 27 из 27 единиц с посадкой (медиана 0.99852 против 0.99914, посадок 4-5 против 2 у чужого каталога) — содержательное свойство держится, ломается печатаемый тест.",
"corrected": "Свод и селфтест оси Д4 реконструируют грубый декой правилами ЧУЖОГО пака: absjudge.KEYS на пути свода остаётся равным /home/ubuntu/books/role-topology/blind-keys, потому что AJ.KEYS = KEYS присваивается только в sud.py:181 внутри setup(), а setup() вызывается лишь из emit(); _plant читает KEYS/PLANTS.json в момент вызова (absjudge.py:260). Судьям пачки выданы штатным путём, правильный декой они видели — проверено сверкой сегмента задания с _plant под обоими каталогами.\n\nПоследствие 1 (печать, не гейт): строка \"цитат ... не найдено в своём варианте\" завышена — claude 255 вместо 38 (6.7x, из них на декое 222 вместо 5, то есть 87% печатаемых промахов claude — артефакт), sol 514 вместо 276 (1.9x), оба семейства вместе 769 вместо 314 (2.4x); разрыв по точности цитирования между семействами (0.8% против 2.7%) в текущей печати не виден. Однако промах цитаты в read_family НЕ попадает в список замечаний годности (туда идут только \"не все оси\" и \"ненулевая без обоснования\"), поэтому объявленный в докстринге гейт годности пачки №1 по цитатам в коде не механизирован и ни одну пачку не бракует. Прогон itog_d4.py с исправленным каталогом отличается от шипнутого ровно двумя печатаемыми строками: пороги, свой пол, оба декоя, гейт чувствительности, контрасты, p Холма и вердикты П-1 идентичны. Ни один вывод фазы не меняется.\n\nПоследствие 2 (селфтест, масштаб иной, чем заявлено): проверка \"грубый декой ГРУБЕЕ маржевого\" на реальных правилах фазы не ослабевает до 0.0001, а ПАДАЕТ — штатный selftest() с корректным AJ.KEYS печатает \"[ПРОВАЛ] грубый 0.9990 против маржевого 0.9985\", даёт ПРОВАЛОВ: 1 и не печатает \"СУДЕЙСКИЙ ХАРНЕСС ГОДЕН\". Падает конструкция проверки, а не свойство: грубый берётся на единице us[0], маржевый — минимумом по us[:8]; поштучно грубый грубее маржевого на 27 из 27 единиц с посадкой (медиана 0.99852 против 0.99914, посадок 4-5 против 2 у чужого каталога)."
}
},
{
"title": "Набор p1 систематически строже набора p2 на побайтно одинаковых текстах — сдвиг размером со весь порог различимости",
"severity": "важно",
"evidence": "274 пары (uid, arm) с совпадающим `sig`, судимые p1 и p2: среднее (p1 p2) = +1.55 при sd 2.68 у claude (SE 0.16), у sol +0.30 при sd 6.12. По волнам claude: основная 6.39 (p1) против 5.04 (p2), пере-суд 6.62 против 5.18. Средний счёт пачки p1 6.69, p2 5.11. Официальный пол `CTRLfloor` имеет СРЕДНЕЕ +1.80 (значения [1,1,0,0,1,1,1,1,2,2,2,3,4,5,7]) при sd 2.14; у sol среднее +1.93.",
"consequence": "Шумовой пол наполовину состоит не из шума, а из постоянного смещения когорты сессий; порог считается по одному sd (`itog_d4.py:173` — `2.8*sd/√n`), то есть смещение +1.55…+1.80 замеряется и выбрасывается. Систематический эффект величиной с весь порог 1.54 остаётся в приборе и погашается только тем, что все три первичных контраста случайно сбалансированы по наборам.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Улика воспроизвелась моим счётом побитно, вывод — нет.\n\nЧТО ПОДТВЕРДИЛОСЬ (мой пере-ран, /tmp/.../scratchpad/chk8.py поверх itog_d4.read_family):\nclaude — 274 пары (uid,arm) с одинаковым sha1 текста, судимые обоими наборами: mean(p1p2)=+1.55, sd=2.68, SE=0.16. sol: +0.30, sd=6.13. CTRLfloor claude: n=15, mean +1.80, значения [1,1,0,0,1,1,1,1,2,2,2,3,4,5,7], pstdev 2.14, порог 1.54; sol +1.93. Средний carry без контролей: p1 6.70 / p2 5.10 (в находке 6.69/5.11 — округление или чуть иной срез).\n\nЧТО НЕ ПОДТВЕРДИЛОСЬ — обе части «последствия».\n\n1. «Погашается только тем, что контрасты СЛУЧАЙНО сбалансированы по наборам». Баланс не случаен и не частичен: судятся оба набора на всех единицах, поэтому 274 из 289 клеток (все, кроме CTRLfloor, у которого половины разные по построению) имеют оценку в КАЖДОМ наборе, а первичные контрасты дают 31/31, 31/31, 16/16 в каждом наборе ОТДЕЛЬНО. `itog_d4.margins()` берёт `mean(vb)mean(va)` по обеим половинам внутри единицы, поэтому статистика точно инвариантна к уровневому сдвигу — проверено исполнением: вычитание 1.55 из ВСЕХ оценок p1 оставляет все три перевеса идентичными до 1e9. Оба декой-контроля (`control()`, itog_d4.py:131) пары «арм против A0» берут внутри ОДНОГО `half`, то есть сдвиг сокращается и там.\n\n2. «Смещение замеряется и выбрасывается / систематический эффект размером с порог остаётся в приборе». Константа не входит в sd по определению, значит порог 2.8·sd/√n на уровневый сдвиг не реагирует по построению; отбрасывание среднего здесь не утечка, а единственное корректное поведение — подмешать среднее пола в порог значило бы завести смещение, которого в контрастах нет. Сравнение «+1.55 ≈ порог 1.54» — сопоставление разнородного: 1.54 это 2.8·SE среднего из 15, а 1.55 — уровень на клетку (его собственная SE 0.16).\n\n3. Ни один вывод фазы не двигается. Пере-счёт по наборам отдельно (claude, порог 1.54): A1B/A0 3.87 / 3.13; A3/A0 2.45 / 1.87; A6/A0 1.00 / 1.06. sol (порог 3.65): 4.58/4.90; 3.16/3.10; 1.06/0.19. Вердикты по каждому набору совпадают с общими (CONFIRM на A1B, эскалация к адъюдикации на A3, не подтверждено на A6) и с гейтом чувствительности (claude ПРОЙДЕН +2.56, sol НЕ ПРОЙДЕН +2.96 против 3.65).\n\n4. Частично это объявленное ограничение: Д0.6 (23-editor-tier.md:818821) пре-регистрирует, что пол судят РАЗНЫЕ сессии именно затем, чтобы поймать межсессионную компоненту, и что «порог берётся из своего пола без ручной поправки» — в эксп-23 её отсутствие занижало порог на 19%. То есть межсессионная компонента в полу — заведённое свойство, а не необъявленная утечка.\n\n5. Формулировка «когорта сессий систематически строже» шире замера: у sol сдвига практически нет (+0.30 при sd 6.13), а у claude в аннулированной первой волне p1 7.76 против p2 7.54 (+0.22) — сдвиг живёт в финально забанкованных пачках claude, а не в наборах как таковых. Волновые числа находки (6.39/5.04 и 6.62/5.18) моим разбиением не воспроизвелись: по признаку «пере-сужена ли пачка» без контролей выходит основная 6.54/5.30, пере-суд 7.33/4.52 — знак тот же, величины другие.\n\nНе пере-проверял (со слов находки): что 6.69/5.11 получены именно на срезе без контролей и что «волны» в находке определены так же, как у меня.",
"corrected": "Между судейскими наборами p1 и p2 у семейства claude есть уровневый сдвиг строгости, замеренный на побайтно одинаковых текстах: 274 клетки (uid,arm), среднее (p1p2) = +1.55 при sd 2.68 (SE 0.16); у sol сдвига практически нет (+0.30 при sd 6.13). Тот же сдвиг виден в паре пола: CTRLfloor claude среднее +1.80, sol +1.93. Сдвиг реален и точно оценён, но ИНЕРТЕН для всех печатаемых фазой чисел: контраст считается как разность средних по обоим наборам внутри единицы (`itog_d4.margins`), оба декой-контроля — внутри одного набора (`itog_d4.control`), а порог 2.8·sd/√n к аддитивной константе нечувствителен по построению. Инвариантность проверена исполнением: вычитание 1.55 из всех оценок p1 не меняет ни одного перевеса; контрасты, посчитанные по каждому набору отдельно, дают те же вердикты, что и общие. Балансировка по наборам не случайна — она структурна: каждая клетка каждой единицы судится обоими наборами (274 из 289; исключение — CTRLfloor, чьи половины разные по замыслу), контрасты 31/31, 31/31, 16/16 в каждом наборе. Статус находки: описательное свойство сырья (плюс аргумент за то, чтобы уровневые сравнения между наборами не печатались как абсолюты), а не дефект прибора; вывода фазы не меняет."
}
},
{
"title": "Судьи ставили побайтно одинаковым меткам одинаковые числа — независимость оценок внутри пачки нарушена и у ПРИНЯТЫХ сессий",
"severity": "важно",
"evidence": "В ключах 18 случаев, когда две метки одной пачки несут один `sig`: A1=A1B на 5 единицах (13c5f52fa3, 53e0f3d653, 6df3dd3eb6, de3916de62, fb9ed5709e) и A0=A4 на 4 (474f822806, b2a7464dbd, debb2c1aef, fb9ed5709e). У claude все четыре оси совпали в 18/18 случаев, текст `ПОЧЕМУ` совпал дословно в 15/18; у sol — 16/18 и 16/18. При этом тот же текст, судимый ДРУГОЙ сессией, расходится в среднем на 2.36 (claude) и 4.72 (sol) балла.",
"consequence": "Правило «оценивай каждый вариант ОТДЕЛЬНО, не подстраивая оценку одного под оценку другого» нарушено не только тремя названными сессиями: связывание меток видно в сохранённых ответах принятых сессий. Контраст A4/A0 на четырёх единицах равен ровно нулю по построению, а поимка декоя (62/62, медиана +3.0) получена в пачке, где рядом лежит его донор с схожестью 0.999.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": true,
"why": "Наблюдение воспроизвёл дословно, вывод и оба последствия — нет.\n\nЧТО ПОДТВЕРДИЛОСЬ (мой пере-ран по ~/books/dovodka/blind-keys-d4/d4p{1,2}-KEY.json). 18 групп с общим `sig` внутри пачки = 9 различных (единица × пара армов) × 2 набора; A1=A1B на 5 единицах, A0=A4 на 4 (fb9ed5709e в обеих), объединение — 8 единиц. У claude четыре оси совпали 18/18, `ПОЧЕМУ` дословно 15/18; у sol 16/18 и 16/18 — совпадает с находкой цифра в цифру. Межсессионное расхождение по несущей сумме: claude 2.32, sol 4.67 (n=265) — находка даёт 2.36/4.72, отличие минорное.\n\nПОЧЕМУ ВЫВОД «независимость нарушена» НЕ СЛЕДУЕТ.\n1. Оценка по оси — это СЧЁТ процитированных мест, а не мнение. Проверил механически: число на оси равно количеству цитат в `ПОЧЕМУ` по этой оси в 2053/2316 = 88.6% клеток у claude и 2175/2316 = 93.9% у sol. Побайтно один текст даёт один и тот же список ошибок, значит и одно и то же число. Совпадение чисел — штатный выход рубрики, а не улика сравнения.\n2. Контроль находки меряет другую величину. 2.32/4.67 — межсессионный разброс; фаза его уже оплачивает как СВОЙ шумовой пол, и пол по построению меряется парой, чьи половины судят РАЗНЫЕ сессии (`eval/dovodka/itog_d4.py:118` floor_sd, sd 2.14 → порог 1.54 у claude, 5.05 → 3.65 у sol). Сопоставлять внутрисессионный детерминизм с межсессионной дисперсией — не тест внутрипачечной независимости.\n3. Механическое связывание опровергается самими данными: у claude в 3/18 групп `ПОЧЕМУ` РАЗЛИЧАЕТСЯ при равных числах, у sol в 2/18 различаются и сами числа (4896f07774: 10 vs 11; 5624d69feb: 3 vs 9). Судья, копирующий метку в метку, дал бы одинаковый выход везде.\n4. Греп по всем принятым ответам обоих семейств на «совпада|идентич|побайт|дублик|как и Т\\d» — 0 файлов. В сохранённых ответах принятых сессий связывания не видно; видно только совпадение чисел, объяснённое п.1.\n5. Инцидент уже разобран и закрыт другим фильтром: ~/sud-d4/annulled.txt (13.08) — три сессии пойманы ГРЕП-АУДИТОМ ТРАНСКРИПТОВ на `diff`/`difflib`, пачки пере-сужены; это ровно механизм Д0.13 П-3 («изоляция ПЛЮС журнал»). 13 из 18 групп лежат в пачках, которые вообще не аннулировались, 5 — в пере-суженных.\n\nПОСЛЕДСТВИЕ 1 (A4/A0 = ноль на четырёх единицах) — верно фактически, но ничего не подрывает. A4/A0 объявлен ОПИСАТЕЛЬНЫМ в `eval/dovodka/power.py` SECONDARY до денег, с основанием «его несущая ось — покрытие канона, а оно детерминировано и шума не имеет»; несущих контрастов три — A1B/A0, A3/A0, A6/A0. Нулевая дельта — не дефект судейства, а записанное поведение арма: dv-a-a4-474f822806.json несёт `free: True`, `places: 0`, `cost_usd: 0.0` — прямо клетка эрраты Э-11 («выход арма на такой единице = его вход»); остальные три A4-клетки оплачены с places 12, то есть фиксер нашёл указания и не исполнил ни одного — потолок, объявленный в П-9 («канон-фиксер исполняет 46% прямых указаний — это ПОТОЛОК арма, известный до всякого судейства»). То же у A1/A1B: A1B нашёл БОЛЬШЕ мест (2 против 1, 4 против 3), выход тот же.\n\nПОСЛЕДСТВИЕ 2 (декой рядом с донором) — это конструкция, а не изъян. Д0.12 требует «декой в каждой пачке», ключ несёт `decoy_from: A0`, и `itog_d4.py` шагом 2 меряет именно «ГРУБЫЙ декой ПРОТИВ ДОНОРА» парной разностью — без донора в пачке измерения не существует. Замеренная схожесть 0.9977 в среднем (0.99391.0000), не 0.999.\n\nГЛАВНОЕ: НИ ОДИН ВЫВОД НЕ ДВИГАЕТСЯ. Пере-гнал itog_d4 без всех 8 затронутых единиц. Было → стало: пол claude 2.14/1.54 → 1.68/1.26, sol 5.05/3.65 → 5.23/3.91; грубый декой 62/62 → 46/46; маржевый гейт claude +2.56 → +2.50 ПРОЙДЕН, sol +2.96 → +2.90 НЕ ПРОЙДЕН; A1B/A0 claude 3.50 → 3.70, sol 4.74 → 4.63, вердикт CONFIRM; A3/A0 claude 2.16 → 2.26 перешёл, sol 3.13 → 3.04 ниже порога, вердикт ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ; A6/A0 1.03 → 0.79 и 0.62 → 0.21, не подтверждено ни одним. Все три вердикта П-1 и оба гейта чувствительности сохраняются побуквенно.\n\nСкрипты пере-рана: /tmp/claude-1000/-home-ubuntu-projects-textmachine/565edf3f-c90e-4aaf-8418-c2ec250acedc/scratchpad/chk9.py, chk9b.py, chk9c.py. Задетые файлы фазы: /home/ubuntu/projects/textmachine/eval/dovodka/itog_d4.py, /home/ubuntu/projects/textmachine/eval/dovodka/power.py, /home/ubuntu/sud-d4/annulled.txt.\n\nПобочно, вне этой находки и без пере-проверки последствий: annulled.txt пишет «файлов отправлено в карантин: 11», а .ANNULLED-файлов в ~/sud-d4 лежит 15 (7 в p1, 8 в p2); и на единице c35a779371 грубый декой сажает 0 порч (текст равен донору).",
"corrected": "Что остаётся после опровержения — описательный факт об АРМАХ, не о судьях: на 8 единицах из 31 выход пары армов побайтно совпал (A1=A1B на 5, A0=A4 на 4), поэтому описательные контрасты A1/A1B и A4/A0 на них вырождены. Это записанное поведение арма, а не нарушение судейского протокола: одна клетка помечена `free` по эррате Э-11, остальные оплачены с найденными местами и нулевым исполнением — потолок фиксера, объявленный в П-9. Совпадение судейских чисел на побайтно равных текстах уликой связывания не является: оценка по оси есть счёт процитированных мест (равенство числа и числа цитат в 88.6% клеток у claude, 93.9% у sol). Ни один вердикт фазы от исключения этих 8 единиц не меняется."
}
},
{
"title": "Кодовый аудит транскриптов не видит того класса нарушения, за который сессии аннулированы",
"severity": "важно",
"evidence": "`eval/.venv/bin/python eval/dovodka/sud.py --audit <каталог с транскриптами четырёх аннулированных агентов>` печатает «[OK ] … запрещённых путей не касался» по всем четырём и «АУДИТ ЧИСТ», код возврата 0. Список `FORBIDDEN` (`sud.py:198`) — только пути к сырью (`blind-keys`, `dv-a-`, `dv-f-`, `/books/dovodka`, `contour.py`, `sud.py`); ни `difflib`, ни `diff`, ни чтение чужих ответов в нём нет.",
"consequence": "Заявленный в отчёте (23-editor-tier.md:386) $0-греп-аудит как фильтр пачек пропускает 100% реально случившихся нарушений; фактический отбор был ручным, и на нём же держится утверждение annulled.txt «фильтром служит АУДИТ, а не инструкция».",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверено собственным исполнением; все опорные факты подтвердились, один оказался сильнее заявленного.\n\n1. Код. `eval/dovodka/sud.py:198` — `FORBIDDEN = (\"blind-keys\", \"dv-a-\", \"dv-f-\", \"/books/dovodka\", \"contour.py\", \"sud.py\")`; ни `diff`, ни `difflib`, ни чтения чужих ответов в списке нет. `audit()` (sud.py:201217) делает только подстрочный поиск этих шести строк.\n\n2. Пере-ран улики. Транскрипты четырёх аннулированных агентов — в `/home/ubuntu/.claude/projects/-home-ubuntu-projects-textmachine/565edf3f-c90e-4aaf-8418-c2ec250acedc/subagents/`: `agent-a0fe0b7413e822d81.jsonl`, `agent-ad00dbe7471469543.jsonl`, `agent-a4b35ebf094032734.jsonl`, `agent-ac15f71bb9a7c8428.jsonl`. Скопировал в скрэтчпад, прогнал `eval/.venv/bin/python eval/dovodka/sud.py --audit <каталог>`: четыре строки «[OK ] … запрещённых путей не касался», «АУДИТ ЧИСТ», RC=0. Совпадает с находкой.\n\n3. Нарушения в тех же файлах есть и аудиту невидимы: `difflib` 18 и `SequenceMatcher` 9 в `agent-ad00dbe7471469543.jsonl`; `diff ` 25/17/14 в трёх остальных. Ни одна строка не входит в `FORBIDDEN`.\n\n4. Сильнее заявленного: `sud.py --audit` не вызывался ни разу. Прошёл по родительскому транскрипту `565edf3f-….jsonl` — 0 вызовов Bash с `--audit`. Фактический фильтр — инлайновый bash-греп 2026-08-13T18:30:37Z по каталогу subagents с ДРУГИМИ шаблонами (`answers/\\*\\.txt`, `ls .*answers`, `diff |difflib|SequenceMatcher|сверил варианты|идентичны`), разово по последним 12 транскриптам, а не «после каждой пачки».\n\n5. Что объявлено в пре-реге. Д0.13 П-3 (`docs/experiments/23-editor-tier.md:1098`) описывает аудит УЗКО: «$0-греп-аудит на запрещённые пути (`blind-keys/`, `dv-*`)», и `FORBIDDEN` этому соответствует; класс «сравнение вариантов» пре-рег закрывал инструкцией (Д0.12, строка 1025). Значит узость списка сама по себе не отступление; отступление — в двух местах, где аудит назван сработавшим фильтром: `sud.py:3839` («после каждой пачки гоняется греп-аудит транскриптов (`--audit`)») и `~/sud-d4/annulled.txt` («поймано греп-аудитом транскриптов», «фильтром служит АУДИТ, а не инструкция»).\n\n6. Ссылка находки на `23-editor-tier.md:386` не подтверждается: строка 386 — пункт 5 отзыва эксп-22 про двусмысленную инструкцию про оборванный вариант.\n\n7. Вывод фазы: численные вердикты Д4 не меняются — пачки в карантине (`*.ANNULLED.txt`) и пере-сужены (ответы 22:2423:08 против 21:1021:29 у аннулированных). Меняется статус механизации: кодифицированного детектора класса «сравнение вариантов / чтение чужих ответов» в репо нет (греп по `eval/dovodka/*.py` шаблонов не находит).\n\nНе проверял: чисты ли по тому же критерию пере-суженные сессии; расхождение «3 сессии / 11 файлов» в annulled.txt против 15 файлов `*.ANNULLED.txt` — отдельная находка.",
"corrected": "Находка верна; уточняются адрес претензии и масштаб.\n\nВЕРНО и пере-проверено: `sud.py --audit` на транскриптах четырёх аннулированных агентов (`a0fe0b7413e822d81`, `ad00dbe7471469543`, `a4b35ebf094032734`, `ac15f71bb9a7c8428`) печатает «[OK ]» по всем четырём, «АУДИТ ЧИСТ», RC=0, тогда как в тех же файлах лежат `difflib` (18), `SequenceMatcher` (9) и `diff ` (25/17/14). `FORBIDDEN` (sud.py:198) содержит только пути к сырью — класса нарушения, за который сессии аннулированы, он не видит.\n\nУТОЧНЕНИЕ 1 (адрес). Претензия не к пре-регу: Д0.13 П-3 (23-editor-tier.md:1098) объявляет аудит узко — «на запрещённые пути (blind-keys/, dv-*)», и `FORBIDDEN` этому объявлению соответствует; класс «сравнение вариантов» пре-рег закрывал инструкцией (Д0.12, строка 1025). Носителей ложного утверждения два ДРУГИХ: докстринг `sud.py:3839` («после каждой пачки гоняется греп-аудит транскриптов (--audit)») и `~/sud-d4/annulled.txt` («поймано греп-аудитом транскриптов», «фильтром служит АУДИТ, а не инструкция»). Ссылка на 23-editor-tier.md:386 неверна — там пункт 5 отзыва эксп-22 про оборванный вариант.\n\nУТОЧНЕНИЕ 2 (масштаб, сильнее заявленного). Дело не только в том, что аудит пропустил бы нарушения: `sud.py --audit` не вызывался ни разу за сессию (0 вызовов в родительском транскрипте). Фильтром служил разовый инлайновый bash-греп 2026-08-13T18:30:37Z с шаблонами `answers/\\*\\.txt`, `ls .*answers`, `diff |difflib|SequenceMatcher|сверил варианты|идентичны` по последним 12 транскриптам, а не «после каждой пачки». В код эти шаблоны не перенесены — на следующей пачке фильтра не существует.\n\nУТОЧНЕНИЕ 3 (последствие). Ни один численный вердикт фазы Д не меняется: нарушившие пачки в карантине и пере-сужены. Меняется одна процедурная строка: утверждение annulled.txt «фильтром служит АУДИТ, а не инструкция» и обещание sud.py:3839 носителя не имеют — правятся либо расширением `FORBIDDEN` до фактически сработавших шаблонов, либо переписыванием обоих текстов на «отбор ручной»."
}
},
{
"title": "Донор декоя — арм A0 во всех 62 пачках, при норме пре-рега «донор уравнен по армам»",
"severity": "важно",
"evidence": "`eval/dovodka/sud.py:174` — `DECOY_HOOK=lambda slots: slots.get(\"A0\") or \"\"`. Подсчёт по обоим ключам: поле `decoy_from` равно A0 в 62 случаях из 62. Схожесть текста CTRLdecoy с A0 (правила фазы Д) 0.99840.9990 на замеренных 8 единицах. Пре-рег: 23-editor-tier.md:830 «**Донор декоя уравнен по армам**».",
"consequence": "Норма не исполнена ровно тем способом, который сам риг ставит в вину паку 23 (комментарий sud.py:172-173). В каждой пачке лежит почти-копия A0 — знаменателя всех трёх первичных контрастов; вместе с находкой о связывании меток это работающий канал деанонимизации базы сравнения.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Опровергнуть не удалось: ядро находки воспроизведено моими командами. (1) Пре-рег: `docs/experiments/23-editor-tier.md:830` дословно «**Донор декоя уравнен по армам**» — норма Д0.6 фазы Д; смысл «уравнен» задан там же на :155 (эксп-23: «было — порча во всех 32 единицах из R0; стало — 16 из R0, 16 из R2»), то есть ротация по армам, а не «один и тот же донор у всех армов». (2) Мой пере-счёт по обоим ключам `~/books/dovodka/blind-keys-d4/d4p{1,2}-KEY.json`: 31+31=62 единицы, поле `decoy_from` = `A0` в 62 из 62. Донор жёстко зашит дважды: `sud.py:174` `DECOY_HOOK=lambda slots: slots.get(\"A0\") or \"\"` и `itog_d4.py:83` `variant()` пере-строит декой как `AJ._plant(S.C.base_a0(uid))`. (3) Объявленного исключения нет: прочитал Д0.11 (:898-981, Э-1…Э-14) и Д0.13 (:1052-1130, П-1…П-7) целиком — про донора декоя ни слова; шапка `sud.py` перечисляет ТРИ отступления от унаследованного рига, донора среди них нет; комментарий `sud.py:172-173` объявляет только факт пака 23, а не отступление фазы Д от собственной нормы. (4) Гейта на это в фазе Д нет: `eval/dovodka/requirements.md:97` (R61 «донор декоя уравнен») адресует проверку в `eval/editor_tier/verify23.py` — верификатор ЧУЖОГО пака; в `eval/dovodka/*.py` слова «уравнен» про донора нет. Масштаб при этом в находке занижен и одно её следствие не подтверждено — см. corrected.",
"corrected": "Норма Д0.6 «донор декоя уравнен по армам» (:830) в фазе Д не исполнена: донор — A0 в 62/62 пачках (замер по обоим ключам), захардкожен в `sud.py:174` и `itog_d4.py:83`, отступление нигде не объявлено (Д0.11, Д0.13, шапка `sud.py` — прочитаны), собственного гейта у фазы нет (R61 ссылается на `verify23.py` чужого пака).\n\nТри поправки к масштабу, все — своим пере-раном по всем 62 пачкам, а не по 8 единицам:\n\n1. Схожесть шире заявленной. `difflib.SequenceMatcher` слот-к-слоту по заданиям `~/sud-d4/p{1,2}-tasks`: CTRLdecoy↔A0 медиана 0.9983, но диапазон 0.72440.9990, и 12 из 62 значений ниже 0.99 (0.7244 ×2, 0.9259 ×2, 0.9333 ×2, 0.9633 ×2, 0.9684 ×2, 0.9878 ×2). Интервал «0.99840.9990» описывает 8 замеренных единиц, а не фазу.\n\n2. Масштаб ЗАНИЖЕН: почти-копий A0 в пачке не одна, а две. Маржевый декой `CTRLmargin` тоже строится из A0 — `sud.py:text_of` → `margin_plant(C.base_a0(uid))`; схожесть с A0 медиана 0.9990 на 54 пачках, где посадок хватило (MARGIN_MIN=2). Слотов со схожестью ≥0.95 к A0: три в 48 пачках из 62, два в 12, один в 2 (A4 побайтно равен A0 в 6 пачках — законное следствие Э-11 «выход = вход»). Сверх того A0 — база обоих гейтов: `itog_d4.control()` («перевес контроля против своего донора A0») меряет и грубый декой, и гейт чувствительности П-2 против той же A0, которая стоит знаменателем всех трёх первичных контрастов.\n\n3. Следствие «работающий канал деанонимизации» — со слов, уликами не подтверждено. Мой греп всех 124 файлов ответов обоих семейств (`~/sud-d4/p{1,2}-answers`, `~/sol-d4-work/p{1,2}-answers`) на «копи/идентичн/дубл/тот же текст/совпадает с Т» даёт 2 файла, оба — ложные срабатывания на «накопили»/«накопительные»: ни один голос не называет вариант копией другого. Это ровно тот статус, который эксп-23 сам записал про R0 (:468 «прямой улики за или против нет»). Канал латентный: открыт по построению, использование не показано.\n\nНи один вердикт фазы этим не переворачивается и обратное тоже не доказуемо на $0. Мой прогон `itog_d4.py` даёт claude 3.50/2.16/1.03 при пороге 1.54, sol 4.74/3.13/0.62 при 3.65, декой пойман 62/62 и 61/62. Естественное сравнение 8 пачек без маржевого декоя против 54 с ним (то есть одна почти-копия A0 против двух) не даёт согласованного сдвига A0: claude carry 3.50 против 4.11, sol 12.00 против 12.19 — направления разные, n=8. Проверки уровня эксп-23 («донор R0 0.81 против донора R2 0.81», :160-161), которая закрыла бы вопрос числом, у фазы Д нет и без пере-суда быть не может — при постоянном доноре сравнивать не с чем. Остаток находки: невычитаемая компонента, общая всем трём контрастам и обоим гейтам, размер которой фаза не замерила и своими данными замерить не способна."
}
},
{
"title": "Позиционный наклон в фазе Д не замеряется и не вычитается ничем, хотя объявлен нормой",
"severity": "мелко",
"evidence": "`grep -rn \"наклон\\|позици\" eval/dovodka/*.py` — ни одной реализации (только комментарии canon.py:87 и contour.py:16,399). Штатный `absjudge.position()` (absjudge.py:519) работает от `_by_unit()`, то есть от результатов `ingest`, а каталога `~/sud-d4/votes` не существует; `itog_d4.py` поправки на позицию не содержит. Мой замер по 579 меткам: наклон +0.0321 (claude) и +0.0775 (sol) ошибки ВЕРНОСТЬ+ЯЗЫК на шаг метки; контрасты с поправкой: A1B/A0 3.50→3.50, A3/A0 2.16→2.16, A6/A0 1.03→1.02 (sol: 4.74→4.75, 3.13→3.12, 0.62→0.61).",
"consequence": "Норма Д0.6 (23-editor-tier.md:829 «замеряется, вычитается и сторожится гейтом числом») не исполнена. На вердикты не влияет: поправка ≤0.01 балла, ни один знак и ни одна значимость не меняются. Раскладка при этом заметно неравномерна (A0 стоит меткой Т8 в 9 пачках p1 из 31).",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверил своими командами, опровергнуть не удалось.\n\n1) Нормы. Требование стоит ДВАЖДЫ и без оговорок: `docs/experiments/23-editor-tier.md:829` (Д0.6 «Позиционный наклон замеряется, вычитается и сторожится гейтом числом») и `:1027` (Д0.12, список норм, обязательных ДЛЯ ОБОИХ семейств). Прочёл Д0.11 (Э-1…Э-14) и Д0.13 (П-1…П-6) целиком — ни одной диспозиции по позиционному наклону там нет, объявленным ограничением фазы Д он нигде не назван. Прочие вхождения «наклон» в файле — :15, :258-270 — это ПАК 23 (проходы tier/border), где наклон замерен и сторожится `verify23`; к фазе Д они не относятся.\n\n2) Реализации в коде фазы Д нет. `grep -rn \"slot|наклон|позици|slope|tilt\" eval/dovodka/*.py` — только комментарии (canon.py:87, contour.py:16,399) и не относящийся к делу `sud.py:174 DECOY_HOOK=lambda slots:`. `itog_d4.py` прочитан полностью (245 строк): годность → пол → гейты декоев → контрасты → правило расхождения; поправки на позицию нет, и `slot` в нём не фигурирует. Штатный `absjudge.position()` (`eval/role_topology/absjudge.py:519`) читает `_by_unit()` → каталог `VOTES`; `~/sud-d4/votes` не существует (`ls`: только annulled.txt, p1/p2-tasks, p1/p2-answers, prompts). Уточняю механику против формулировки находки: дело не только в отсутствующем каталоге — в харнессе фазы Д НЕТ пути `--ingest` вообще (`sud.py` знает ровно `--selftest --emit --audit`, строка 291), а `itog_d4.read_family` парсит ответы своим регексом мимо absjudge. То есть `position()` из фазы Д недостижим в принципе, а не «не запущен».\n\n3) Числа воспроизвёл своим скриптом (чтение, $0; scratchpad/tilt.py), взяв slot из номера слепой метки `Т<k>` в `~/books/dovodka/blind-keys-d4/d4p{1,2}-KEY.json` и центрирование внутри пачки, как в absjudge. Совпало точно: 579 меток у обоих семейств, наклон +0.0321 (claude) и +0.0775 (sol) на ошибку ВЕРНОСТЬ+ЯЗЫК за шаг метки. Базовые контрасты `itog_d4.py` тоже совпали: claude 3.50 / 2.16 / 1.03, sol 4.74 / 3.13 / 0.62. Раскладка A0 в p1 — Т8 в 9 пачках из 31 (полная: Т1:3 Т2:1 Т3:3 Т4:4 Т5:3 Т6:5 Т7:1 Т8:9 Т9:1 Т10:1), подтверждено.\n\n4) На выводы не влияет — подтверждаю. С поправкой: claude 3.5026 / 2.1556 / 1.0232, sol 4.7482 / 3.1153 / 0.6056; p: claude A6/A0 0.0367→0.0343, sol A6/A0 0.5739→0.5632, остальные 0.0000. Ни один знак, ни одно пересечение порога (claude 1.54, sol 3.65) и ни один вердикт правила П-1 не меняется.\n\nЕдинственная неточность находки — масштаб: максимальный сдвиг 0.019 (sol A6/A0 0.6250→0.6056), а не «≤0.01»; второй по величине 0.0137 (sol A3/A0). Поэтому refuted=false с исправленной формулировкой.",
"corrected": "Позиционный наклон в фазе Д не замеряется, не вычитается и не сторожится гейтом, хотя норма объявлена дважды и без оговорок (23-editor-tier.md:829 Д0.6 и :1027 Д0.12 «обязательно для ОБОИХ семейств»), а в эрратах Д0.11/Д0.13 диспозиции по нему нет. В `eval/dovodka/*.py` реализации нет ни под каким именем; `itog_d4.py` поправки на позицию не содержит. Штатный `absjudge.position()` (absjudge.py:519) из фазы Д недостижим в принципе: харнесс `sud.py` знает только `--selftest/--emit/--audit`, шага `--ingest` нет, каталога `~/sud-d4/votes` не существует, а `itog_d4.read_family` парсит ответы собственным регексом мимо absjudge. Независимый пере-замер по 579 меткам подтверждает наклон +0.0321 (claude) и +0.0775 (sol) ошибки ВЕРНОСТЬ+ЯЗЫК на шаг метки при заметно неравномерной раскладке (A0 стоит меткой Т8 в 9 пачках p1 из 31). На вердикты не влияет: сдвиг контрастов ≤0.02 балла (максимум 0.019 у sol A6/A0 0.625→0.606, затем 0.014 у sol A3/A0), знаки, пересечения порогов (claude 1.54, sol 3.65) и исходы правила П-1 сохраняются."
}
},
{
"title": "Пол несимметричен по наборам: CTRLfloor есть в 16 пачках p1 и в 15 пачках p2",
"severity": "мелко",
"evidence": "Подсчёт меток по ключам: CTRLfloor — 16 в d4p1-KEY.json и 15 в d4p2-KEY.json; `dv-a-flo1-*.json` 16 годных + 2 `.ERROR`, `dv-a-flo2-*.json` 16, из них одна не проходит `finish==stop`. `itog_d4.floor_sd` даёт n=15 пар.",
"consequence": "Одна метка пола в p1 оценивается судьёй и не может войти ни в одну пару — работа потрачена, в пол не вошла; сам пол стоит на n=15, и снятие двух пар (см. находку про 11.08) двигает порог на 29%.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-ран подтвердил каждое число находки.\n\n1. Счёт меток по ключам (мой скрипт по `~/books/dovodka/blind-keys-d4/*-KEY.json`, пачек в каждом наборе 31): CTRLfloor в 16 пачках `d4p1-KEY.json` и в 15 пачках `d4p2-KEY.json`. По РЕАЛЬНЫМ uid (`meta[\"uid\"]`, слепые id наборов не совпадают): пересечение 15, только-p1 = `474f822806`, только-p2 = пусто.\n\n2. Сырьё: `dv-a-flo1-*.json` — 18 файлов = 16 уникальных uid + 2 `.ERROR.json` (`3754987548`, `9120ad112e`), причём у обоих есть и годная запись `finish=stop`, то есть ERROR — это записи неудачной попытки тех же единиц, а не лишние единицы. `dv-a-flo2-*.json` — 16 файлов на те же 16 uid, из них ровно один `dv-a-flo2-474f822806.json` имеет `finish=length` (content 4335 против 67848793 у остальных).\n\n3. Механика подтверждена по коду: `sud.py:143 floor_pair()` возвращает пусто при `finish != \"stop\"`, поэтому в наборе П2 у `474f822806` метки CTRLfloor нет, а в П1 она есть. `itog_d4.floor_sd` (itog_d4.py:117125) требует ОБЕ половины, значит непарная метка выбрасывается.\n\n4. `itog_d4.py --gates` (мой прогон): оба семейства — «СВОЙ ПОЛ … n=15»; claude sd=2.14 → порог 1.54, sol sd=5.05 → порог 3.65. Отдельно инструментировал `read_family`: непарная метка `474f822806`/p1 существует и оценена судьями обоих семейств — carry 9 (claude) и 8 (sol). То есть работа судьи по ней потрачена, а в пол не вошла. В `control()`/`margins()` арм CTRLfloor не участвует, так что метка нигде больше не всплывает.\n\n5. «Двигает порог на 29%»: перебрал все C(15,2)=105 снятий пар. Для claude максимальное падение порога 29.3% (снятие двух наибольших дельт: `de3916de62`=7 и `3a21e0b4a3`=5), максимальный рост +15.3%. Для sol те же границы 44.3% / +15.4%.\n\nДубликатом объявленного ограничения находка не является. Пре-рег объявляет ПРИЧИНУ (Д0.6, 23-editor-tier.md:826: «Клетка с `finish=length` в судейскую пачку НЕ допускается — ни боевым армом, ни половиной пола»), но не следствие: греп по 23-editor-tier.md, docs/PROGRESS.md и заказу не даёт ни «n=15», ни «несиммет», ни `474f822806`; в Д0.11 перечислены две клетки `finish=length` арма A4 (Э-9, 41599f30df и f6da9f76b2), а половина пола `474f822806` не названа нигде. То есть асимметрия — механическое следствие объявленного гейта, но нигде не задекларирована и не подписана как потеря.\n\nНи один вывод фазы от этого не переворачивается на текущих данных: порог 1.54/3.65 и так посчитан на n=15, гейт чувствительности claude пройден (+2.56 против 1.54), sol не пройден (+2.96 против 3.65).",
"corrected": "Пол несимметричен по наборам ровно на ОДНОЙ единице. CTRLfloor стоит в 16 пачках П1 и в 15 пачках П2; расходится единица `474f822806`, у которой `dv-a-flo2-474f822806.json` имеет `finish=length` (content 4335) и потому по объявленной норме Д0.6 в пачку не допускается. Сырьё: `dv-a-flo1-*` — 16 уникальных uid плюс 2 `.ERROR.json` тех же uid (не лишние единицы), `dv-a-flo2-*` — те же 16 uid, один брак. Следствие: метка пола `474f822806` в П1 оценена судьями обоих семейств (carry 9 у claude, 8 у sol) и не может войти ни в одну пару — работа потрачена, в пол не вошла; `itog_d4.floor_sd` даёт n=15 у обоих семейств. Причина объявлена пре-регом (Д0.6, гейт `finish=length` для половины пола), но следствие — асимметрия наборов, n=15 вместо 16 и одна выброшенная оплаченная судейская метка — не задекларировано ни в пре-реге, ни в эрратах Д0.11/Д0.13 (в Э-9 названы только две клетки A4). Хрупкость: 29% — это НЕ эффект снятия произвольных двух пар, а МАКСИМУМ по всем 105 снятиям пар для семейства claude (порог падает с 1.54 на 29.3% при снятии двух наибольших дельт `de3916de62`=7 и `3a21e0b4a3`=5); для sol тот же максимум 44.3%, рост в обоих семействах ограничен +15%. Ни один вердикт фазы при этом не меняется: пороги 1.54/3.65 уже посчитаны на n=15, маржевый гейт claude пройден, sol — нет."
}
},
{
"title": "Ось «канон-покрытие» не печатается ни по одному арму, и канон-гейт не применяется к ВЫХОДУ армов",
"severity": "критично",
"evidence": "Заказ :95 «Ответ по каждому арму печатать ТРЕМЯ осями: судья · канон-покрытие · цена» и :92 «детерминированная сверка покрытия банка после каждого арма». Все вызовы гейта — по ВХОДУ: contour.py:239 canon_gaps(u['source'], draft) и contour.py:530 canon_gaps(src, target) для A4; spanjoin.py:99-104 тоже считает флаги на базе. `grep -rn canon_gaps eval/` даёт ровно эти 4 строки. itog_d4.py:161-241 печатает только судейскую ось. Свой пересчёт покрытия банка по выходу армов: DRAFT 0.913 · A0 0.889 · A1 0.958 · A1B 0.960 · A2 0.877 · A3 0.925 · A4 0.937 · A6 0.924 · A6F 0.945.",
"consequence": "H-1/H-2а/H-2б сверяются по одной оси вместо трёх. Невидимо, что A2 единственный УХУДШАЕТ канон против A0 (0.877 против 0.889) и по лексикографическому гейту П-7 п.1 подлежит дисквалификации, а A1B даёт лучшее покрытие панели.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Проверял своими командами, не по следам находки.\n\n1. Механика подтверждена. `grep -rn canon_gaps eval/ --include=*.py` даёт ровно 4 строки: определение contour.py:147 и три вызова — contour.py:239 (`canon_gaps(u[\"source\"], draft)` внутри `flags_of`), contour.py:530 (`canon_gaps(src, target)` для A4, где target=base_a0), spanjoin.py:62 (в `flag_words`). Все три — по ВХОДУ контура. `BANK.coverage` (eval/tenant_panel/bank.py:217) в eval/dovodka/ не зовётся ни разу; единственный печатающий покрытие скрипт зоны — canon.py:218-219, и он про Д5/R0, а не про армы Д4.\n\n2. Печать. Прогнал `eval/.venv/bin/python eval/dovodka/itog_d4.py` целиком: вывод = пол/декои/маржевый гейт + три первичных контраста + правило расхождения. Ни канона, ни цены; арм A2 в выводе отсутствует как класс (PRIMARY = A1B/A0, A3/A0, A6/A0, itog_d4.py:58-60). Третья ось тоже не по армам: `money_d.py` печатает пофазные суммы (ФД-A 1.900488 · ФД-F 0.492755), `plan.py` — пофазную смету.\n\n3. Числа воспроизвёл независимым скриптом через `S.text_of(arm,u)` (с гейтом finish=stop) и `BANK.coverage(u[\"source\"], out)`: A0 0.8893 (1365/1535, n=31) · A1 0.9582 (n=29) · A1B 0.9603 · A2 0.8769 · A3 0.9251 · A4 0.9375 · A6 0.9244 (n=16) · A6F 0.9448 (n=16) · DRAFT 0.9134. Совпадение с находкой до третьего знака по всем девяти.\n\n4. Парная сверка на общих единицах (пулы армов разные, находка этого не оговаривает): A2 0.0124 против A0 (хуже на 12 единицах, лучше на 8) — единственная отрицательная дельта; A1 +0.0734 · A1B +0.0710 · A3 +0.0358 · A4 +0.0482 · A6 +0.0427 · A6F +0.0632 · DRAFT +0.0241. «A2 единственный ухудшает канон» устояло и в парном виде.\n\n5. Объявленным ограничением это не является. Д0.10 канон-ось не упоминает; Д0.11 в блоке «что ревью ОПРОВЕРГЛО» снимает подозрение к канон-гейту как ПРИБОРУ (срабатывание на выходе чужой единицы 67.1% против 28.5% на своём), но об оси результата не говорит; Д0.13 П-7 п.1, наоборот, делает покрытие на ВЫХОДЕ первым лексикографическим гейтом. Шапка contour.py:19-21 сама заявляет «печатается отдельной осью результата» — код этому не соответствует.\n\nНе подтвердились две детали масштаба (см. corrected): spanjoin считает флаги на базе НАМЕРЕННО, это подписано комментарием spanjoin.py:98; «подлежит дисквалификации» опирается на допуск, которого в пре-реге нет.",
"corrected": "Ось «канон-покрытие на выходе арма» не считается и не печатается ни одним скриптом фазы: все три вызова `canon_gaps` (contour.py:239, contour.py:530, spanjoin.py:62) берут ВХОД контура, `BANK.coverage` в eval/dovodka/ не зовётся, `itog_d4.py` печатает только судейскую ось. Цена по армам тоже не печатается — money_d.py и plan.py дают лишь пофазные суммы, так что из трёх заказанных осей (заказ :95) построена одна. Это расходится с шапкой contour.py:19-21 и с Д0.13 П-7 п.1, где покрытие на выходе — первый лексикографический гейт; ни Д0.10, ни эрраты Д0.11/Д0.13 такого ограничения не объявляют. В зонном реестре eval/dovodka/requirements.md R31 и R32 стоят с уликой «—», и `conformance.py --final` на них падает: пробел зарегистрирован как открытый, а не скрыт.\n\nПоправка (а): spanjoin.py уликой дефекта не является — он считает флаги на базе по построению (комментарий spanjoin.py:98 «флаги считаются на ВХОДЕ того арма, чей контур мы проверяем»), потому что П-8 меряет, попали ли судейские цитаты в поле зрения того, что ВИДЕЛ фиксер. Уликами остаются contour.py:239 и :530 плюс отсутствие вычисления по выходу где бы то ни было.\n\nПоправка (б): «A2 подлежит дисквалификации по П-7 п.1» сильнее, чем позволяет пре-рег. П-7 п.1 звучит «не ниже A0 минус объявленный допуск», а самого допуска нигде нет (слово встречается в этом значении один раз, 23-editor-tier.md:1125, без числа). Проверяемая формулировка: A2 — единственный арм с покрытием НИЖЕ A0 (парно на тех же 31 единице 0.8769 против 0.8893, 1.24 п.п., хуже на 12 единицах при лучше на 8); падает ли он под гейт, решает число допуска, которого фаза не назвала, и это отдельный пробел пре-рега.\n\nИзменение выводов ограничено: ни один напечатанный вердикт не переворачивается. A2 в первичное семейство не входит (после Э-1/Э-2 k=3: A1B/A0, A3/A0, A6/A0) и в выводе itog_d4 не появляется вовсе; на канон-оси знак у A1B/A3/A6 тот же, что у судьи, а по оговорке Гудхарта в П-7 детерминированная ось для A1/A1B короновать и не имеет права. Реально меняется другое: гейт П-7 п.1 в текущем коде НЕИСПОЛНИМ, лексикографический выбор «кто едет в прод» строится без своей первой ступени, и факт «A2 — единственный арм ниже A0 по канону» в отчёт фазы не попадает ниоткуда."
}
},
{
"title": "Вердикт напечатан по 3 армам из 8; A4 — названный заказом «немедленный кандидат в прод» — без вердикта",
"severity": "критично",
"evidence": "itog_d4.py:58-60 PRIMARY = только A1B/A0, A3/A0, A6/A0; прогон печатает три строки. Свой пересчёт тем же кодом (itog_d4.margins + BO.sign_perm_p) по всем армам: claude порог 1.54 → A1/A0 3.43 · A2/A0 2.55 · A4/A0 0.11 (p=0.3281) · A6F/A0 1.94; sol порог 3.65 → A1/A0 4.67 · A2/A0 2.87 · A4/A0 +0.15 (p=0.6953) · A6F/A0 1.72.",
"consequence": "A4 — единственный арм панели, не отличимый от A0 по судье у ОБОИХ семейств и при этом поднимающий покрытие банка с 0.889 до 0.937. Это прямой ответ на заказ :86-87 («полировка … немедленный кандидат в прод»), и его в выводе фазы нет.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-ран мой, не по следам отчёта. itog_d4.py действительно печатает три контраста (PRIMARY :58-60), мой прогон дал ровно три строки. Мой пересчёт по всем армам воспроизвёл числа находки до цифры: claude (порог 1.54) A1 3.43 · A1B 3.50 · A2 2.55 · A3 2.16 · A4 0.11 (p=0.3281) · A6 1.03 · A6F 1.94; sol (порог 3.65) A1 4.67 · A1B 4.74 · A2 2.87 · A3 3.13 · A4 +0.15 (p=0.6953) · A6 0.62 · A6F 1.72. Покрытие банка я посчитал сам (bank.coverage, 31 парная единица): A0 1365/1535 = 0.8893, A4 1439/1535 = 0.9375 — совпало. Однако две части формулировки неверны. (1) Сокращение семейства с пяти контрастов до трёх ОБЪЯВЛЕНО заранее: power.py:70-100 («остальные контрасты объявлены ОПИСАТЕЛЬНЫМИ, печатаются с числами и поправку не несут»), SECONDARY прямо содержит «A4/A0 — канон-фиксер ПОСЛЕ переписа: его несущая ось — покрытие канона», и эррата Э-1 (Д0.11) ратифицирует раскладку кода против «Холм по пяти» (Д0.5:805). Значит отсутствие A4 в Холм-семействе — пре-регистрированный дизайн, а не пропуск; пропуск — в том, что объявленная печать описательных чисел не сделана НИ для одного из четырёх (A1, A2, A4, A6F), и ни один скрипт фазы не печатает оси покрытия и цены по армам, которых требует заказ :95 (money_d.py даёт цену только по фазам). (2) «Единственный арм, не отличимый от A0 у ОБОИХ семейств» — неверно: по правилу порога A6 тоже ниже порога у обоих (claude 1.03 < 1.54, sol 0.62 < 3.65), и вердикт по нему напечатан. Уникальность A4 держится на другом и более сильном критерии — пре-регистрированной марже Д0.4.",
"corrected": "Описательные контрасты, объявленные к печати с числами (power.py SECONDARY: A1/A0, A2/A0, A4/A0; плюс A6F после эрраты Э-6), в своде фазы не печатаются вовсе: itog_d4.py выводит только три первичных. Само сужение до трёх законно (Э-1 Д0.11 ратифицирует k=3 power.py против «Холм по пяти» Д0.5:805), незаконна невыполненная печать. Цена находки — арм A4, названный заказом :86 «немедленным кандидатом в прод», у которого по пре-регу несущей объявлена ОСЬ ПОКРЫТИЯ (power.py SECONDARY), а её тоже не печатает ни один скрипт фазы (bank.coverage в eval/dovodka/ не зовётся; money_d.py даёт цену по фазам, не по армам — то есть требование заказа :95 «три оси на арм» не выполнено ни для одного арма). Мой пересчёт: покрытие A0 0.8893 (1365/1535) → A4 0.9375 (1439/1535) на 31 парной единице. По судье A4 — не «единственный неотличимый» (A6 тоже ниже порога у обоих семейств), а единственный арм панели, чей 95% ДИ укладывается в пре-регистрированную маржу эквивалентности ±1.50 (Д0.4) у ОБОИХ семейств: claude 0.11 [0.29, +0.05], sol +0.15 [0.31, +0.69]; A6 её не проходит (claude 1.03 [1.84, 0.25] = «не установлено»), A1B проходит в «ХУЖЕ» ([4.45, 2.61] и [6.11, 3.37]). Оговорка П-2: sol маржевый декой не прошёл (+2.96 против своего порога 3.65), поэтому право говорить «не хуже» есть только у claude — у sol это описательно. По покрытию A4 не лидер (A1B 0.960 · A1 0.958 · A6F 0.945), но все лидеры судьёй признаны хуже A0, поэтому A4 — единственный арм, проходящий лексикографические гейты П-7 (1) покрытие не ниже A0 и (3) судейское «не хуже» одновременно; гейт (2) батареи я не проверял. Ни один несущий вердикт фазы от этого не двигается — мой пере-ран дал те же A1B CONFIRM, A3 эскалация к адъюдикации, A6 не подтверждён; добавляется отсутствующий сейчас ответ на заказ :86-87."
}
},
{
"title": "Пере-классификация оси по СВОЕМУ полу, пред-объявленная эрратой Э-3, не исполнена: свой пол хуже порога, а вердикты печатаются как несущие",
"severity": "критично",
"evidence": "23-editor-tier.md:917-920 (Э-3): «при заимствованном прайоре sd 2.12 ось Д4 ОПИСАТЕЛЬНАЯ. Несущей её делает только СВОЙ пол: при sd ≤ 1.91 контрасты A1B/A0 и A3/A0 становятся несущими»; :775-776 «если он выйдет хуже прайора, ось пере-классифицируется в описательную ТОГДА ЖЕ — до чтения боевых перевесов». Замеренный свой пол: claude sd=2.14, sol sd=5.05 (itog_d4.py, шаг 1). power.mde(2.14, 31, 3) = 1.68 против цели 1.50; power.mde(5.05, 31, 3) = 3.97. itog_d4.py:217-240 печатает «ПЕРЕШЁЛ ПОРОГ» и «CONFIRM» без пометки описательности.",
"consequence": "CONFIRM по A1B/A0 выдан по оси, которая по собственному пре-регистрированному правилу в момент замера пола стала описательной. Формулировка вердикта фазы завышена на класс.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": true,
"why": "Опровергнуто своим пере-раном: числа 1.68/3.97 получены двойным применением межсессионной поправки ×1.23 к полу, который эту компоненту уже содержит, — прямо вопреки пре-регу.\n\n1) Пере-ран `eval/.venv/bin/python eval/dovodka/itog_d4.py`: claude — свой пол n=15 пар, sd=2.14, порог различимости 1.54; sol — n=15, sd=5.05, порог 3.65. Перевесы и вердикты воспроизвелись дословно (A1B/A0 claude 3.50, sol 4.74 → CONFIRM). Числа находки в этой части верны.\n\n2) Ошибка в применении. `power.mde()` по умолчанию `between=True`, то есть множит sd на BETWEEN=1.23. Эта поправка заведена ровно для ЗАИМСТВОВАННЫХ полов: §12б (:549-585) — «шумовой пол этого рига меряет пару, у которой ОБЕ половины судит один и тот же судья… порог занижен», и вывод там же: «шумовой пол обязан браться парой, чьи половины судят РАЗНЫЕ сессии. Тогда он ловит ОБЕ компоненты, и порог НЕ ТРЕБУЕТ ручной поправки». То же зафризено нормой Д0.6 (:819-821): «Порог берётся из своего пола БЕЗ ручной поправки». Свой пол фазы Д по построению кросс-сессионный (`itog_d4.floor_sd`: половина p1 против половины p2). Значит `mde(2.14,31,3)`=1.683 считает межсессионный шум дважды.\nЧестный расчёт по своему полу: `mde(2.14,31,3,between=False)` = **1.37** (df=15) / 1.38 (df=14) — МЕНЬШЕ цели 1.50 ⇒ A1B/A0 и A3/A0 остаются НЕСУЩИМИ.\n\n3) Порог 1.91 из Э-3 сравнивается не с той величиной. В `power.py` он вычисляется как `need_sd = t*√n/((t+t)*BETWEEN)`, то есть выражен в шкале ЗАИМСТВОВАННОГО (односессионного) пола, который потом инфлируется ×1.23. Свой пол в той же шкале = 2.14/1.23 = **1.74 ≤ 1.91**. Эквивалентно в обратную сторону: прайор в шкале своего пола = 2.12×1.23 = 2.61 против замеренных 2.14, то есть свой пол ЛУЧШЕ прайора на 18%, а не хуже. Триггер пере-классификации (:775-776 «если он выйдет хуже прайора») сравнением 2.14 с 2.12 в лоб срабатывает только при смешении двух несовместимых шкал; операционное правило Д0.3 (:769) сформулировано не через sd, а через «MDE больше цели», и по нему ось несущая.\n\n4) sd=5.05 у sol — не «замеренный хуже прайора», а СБЫВШИЙСЯ пред-объявленный прайор: Д0.7 (:842) и §12в объявляют «внешний судья вне семьи Claude имеет шумовой пол sd 5.05» ДО прогона, и П-1/Д0.6 дают каждому семейству свой пол и свой порог. Порог 3.65 из него и посчитан.\n\n5) Ни один вывод фазы не меняется: A6/A0 (единственный контраст, недомощный и по честному счёту — нужен свой пол ≤1.69, замерено 2.14) вышел «ниже порога / не подтверждено ни одним семейством», то есть завышать там нечего.\n\nСо слов находки цитаты пре-рега приведены точно, кроме ярлыка контраста: Э-3 (:918) пишет `A1/A0`, а не `A1B/A0` (арм A1B заведён эрратой Э-4 и стоит в PRIMARY кода).",
"corrected": "Выживает только остаток без последствий для класса вердикта: `itog_d4.py` печатает свой пол и порог различимости, но НЕ печатает пред-объявленную Э-3 проверку «MDE при своём поле против цели 1.50» и итоговый ярлык несущая/описательная. Исполненная вручную, эта проверка даёт MDE 1.37 < 1.50 (свой пол 2.14 без повторной ×1.23), то есть ось Д4 остаётся НЕСУЩЕЙ и вердикт CONFIRM по A1B/A0 в классе не завышен. Дефект — отсутствие печати пре-регистрированного шага, а не неверная классификация."
}
},
{
"title": "Донор декоя не уравнен по армам: во всех 62 пачках донор — A0",
"severity": "важно",
"evidence": "Заказ :163 «Донор декоя уравнен по армам». sud.py:174 DECOY_HOOK=lambda slots: slots.get('A0') or ''. Свой разбор ключей: p1 доноры {'A0': 31}, p2 доноры {'A0': 31}; декоев на пачку ровно 1 в 31/31 пачках обоих проходов.",
"consequence": "Поимка декоя (claude 62/62, sol 61/62) характеризует чувствительность только на ткани боевого переписа. Норма заказа не исполнена и нигде не объявлена невыполненной — в реестре R61 её улика подменена гейтом чужого пака verify23.py.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверено исполнением, все три улики подтвердились моими командами. (1) `eval/dovodka/sud.py:174` действительно `DECOY_HOOK=lambda slots: slots.get(\"A0\") or \"\"`. (2) Мой разбор ключей `~/books/dovodka/blind-keys-d4/d4p{1,2}-KEY.json` по полю `decoy_from` (а не по лямбде): p1 {'A0': 31}, p2 {'A0': 31}, декоев на пачку ровно 1 в 31/31 обоих проходов — 62/62 пачек, донор A0. (3) `docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md:163` дословно «Донор декоя уравнен по армам», та же норма в пре-реге Д0.6 (`docs/experiments/23-editor-tier.md:829`). Я прочёл Д0.11 (Э-1…Э-14) и Д0.13 (П-1…П-9) целиком: отмены/послабления этой нормы там нет; отчёта фазы Д с ограничениями ещё не существует (последние коммиты добавили только код `itog_d4.py`, `adjud.py`, `spanjoin.py`). Числа последствия воспроизвёл своим прогоном `eval/.venv/bin/python eval/dovodka/itog_d4.py --gates`: грубый декой пойман claude 62/62, sol 61/62. Улика R61 (`eval/dovodka/requirements.md:97`) — `eval/editor_tier/verify23.py` — проверена чтением: она итерирует `JU.PASSES=(\"tier\",\"border\")` (`eval/editor_tier/judge.py:46`), то есть проходы пака 23, и проверки уравнивания донора не содержит вовсе. Опровергнуть находку не удалось; ниже — уточнение масштаба в обе стороны.",
"corrected": "Донор декоя не уравнен по армам: во всех 62 пачках (31+31) донор — A0, и это шире, чем сказано в находке.\n\n1. Донор доказывается не лямбдой, а полем ключа: `decoy_from` = A0 в 31/31 пачек каждого прохода; ровно один грубый декой на пачку.\n\n2. Пропущено находкой: МАРЖЕВЫЙ декой сидит на той же ткани. `sud.py:121-123` — `CTRLmargin = margin_plant(C.base_a0(uid))`, по ключам он есть в 27+27=54 пачках. Именно он — гейт чувствительности П-2, решающий право семейства говорить «не хуже» (по моему прогону он понизил Sol до описательного: +2.96 против своего порога 3.65). Значит на ткани боевого переписа замерена не только поимка грубого декоя, но и ВСЯ assay sensitivity фазы. В пачке с маржевым декоем текст A0 присутствует трижды (чистый + две порчи), у прочих армов — по разу.\n\n3. «Нигде не объявлена невыполненной» верно для документов, но не для кода: `sud.py:172-173` несёт комментарий «декой сажается в БОЕВОЙ ПЕРЕПИС, и донор объявлен» со ссылкой на разбирательство пака 23. Комментарий объявляет донора, но НЕ объявляет конфликта с нормой Д0.6 и заказом :163, и вне кода этого объявления нет ни в Д0.11, ни в Д0.13, ни в реестре.\n\n4. R61 хуже, чем «подменена»: `verify23.py` не просто чужой гейт — он не касается ни данных фазы Д (только проходы `tier`/`border` пака 23), ни самой нормы (проверки донора в нём нет). Вторая половина R61 тоже без улики: `grep -rn \"наклон\\|slope\" eval/dovodka/*.py` пуст — позиционный наклон в фазе Д не замеряется ни одним скриптом.\n\n5. Масштаб последствия. Внутрифазового контрфактуала по грубому декою НЕ существует: он во всех 62 пачках (пак 23 после починки имел 16/16 из R0/R2 и потому смог напечатать «вклад донора неотличим от нуля», 0.81 против 0.81). Единственный доступный контрфактуал — наличие маржевого декоя (54 слота против 8): по моему счёту A0 carry 4.11 против 3.50 (claude) и 12.19 против 12.00 (sol), контраст A1B/A0 3.52 против 3.38 (claude) и 4.65 против 5.38 (sol) — при n=8 сдвига не видно. Поэтому ни один вердикт фазы моими числами не переворачивается; невыполненной остаётся сама норма, а утверждение о чувствительности прибора (и грубой, и маржевой) остаётся привязанным к ткани A0 и на армы A1B/A3/A6 переносится допущением, а не замером."
}
},
{
"title": "Позиционный наклон в фазе Д не замерен, не вычтен и гейтом не сторожится",
"severity": "важно",
"evidence": "Заказ :163. В eval/dovodka/ нет ни одного упоминания наклона (`grep -rn 'наклон|slant' eval/dovodka/*.py` — только canon.py:87 про позицию предложения). Механизм absjudge.position() (absjudge.py:519-551) требует --ingest, каталога ~/sud-d4/votes не существует. Свой замер по тем же ответам: наклон claude +0.032, sol +0.078 ошибки на шаг метки (n=579); контрасты с поправкой: A1B/A0 3.50 (Δ 0.003), A3/A0 2.16 (Δ +0.006), A6/A0 1.03 (Δ +0.008).",
"consequence": "Числовых последствий для трёх напечатанных контрастов нет (сдвиг ≤0.02, средние позиции армов 5.026.03 почти уравнены), но обязательная и проверяемая норма заказа механизма в фазе не имеет, а реестр закрывает её гейтом другого пака.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Опровергнуть не удалось: пере-ран моими скриптами воспроизвёл находку числом и по механизму. (1) Ограничением нигде не объявлено — наоборот, норма утверждается дважды в пре-реге фазы Д: 23-editor-tier.md:829 (Д0.6) и :1027 (Д0.12 «нормы, обязательные для ОБОИХ семейств»); греп «наклон|позицион|раскладк» по строкам 7131151 в эрратах Д0.11 (:898) и Д0.13 (:1052) не даёт ни одного упоминания. (2) Механизма в фазе нет: grep -rniE 'наклон|slant|позици' eval/dovodka/*.py → только canon.py:87 и contour.py:16,399, к позиционному наклону отношения не имеющие; absjudge.position() (absjudge.py:519-551) работает через _by_unit() → OUT/aj-<pass>-votes/*.json, а Д4 такого артефакта не производит вовсе (sud.py/itog_d4.py читают сырые *.txt). Строка R61 реестра eval/dovodka/requirements.md:97 закрыта уликой eval/editor_tier/verify23.py; я его прогнал — он печатает «tier: НАКЛОН -0.006 n=128» и «border: НАКЛОН +0.708 n=128», то есть голоса пака 23, ни одной метки Д4. (3) Числа верны: мой независимый парсер (слот = число в метке Тn, центрирование внутри пачки) сходится с itog_d4.py побитно на порогах 1.54/3.65, марже +2.56/+2.96 и декое 62/62 и 61/62 — и даёт наклон claude +0.032, sol +0.078 при n=579 в каждом семействе; поправленные контрасты claude 3.50 (Δ 0.003), 2.16 (Δ +0.006), 1.02 (Δ +0.008), sol 4.75/3.12/0.61. (4) Ни один вывод не двигается: под поправкой порог 1.54→1.57 и 3.65→3.70, гейт чувствительности сохраняет ПРОЙДЕН/НЕ ПРОЙДЕН, знаки и статусы всех трёх контрастов и p Холма те же. Скрипт замера: /tmp/claude-1000/-home-ubuntu-projects-textmachine/565edf3f-c90e-4aaf-8418-c2ec250acedc/scratchpad/slant_d4.py, файлы репозитория не правились, покупок нет.",
"corrected": "Позиционный наклон в фазе Д не замерен, не вычтен и гейтом фазы не сторожится, хотя норма заявлена дважды (Д0.6, 23-editor-tier.md:829; Д0.12, :1027) и в эрратах Д0.11/Д0.13 не отменена. В eval/dovodka/ упоминаний наклона нет; absjudge.position() (absjudge.py:519-551) считает по каталогу голосов OUT/aj-<pass>-votes, которого пайплайн Д4 (sud.py → itog_d4.py по сырым *.txt) не создаёт. Реестр закрывает норму строкой R61 (eval/dovodka/requirements.md:97) уликой eval/editor_tier/verify23.py — гейтом ПАКА 23: его прогон печатает наклон только по проходам tier (0.006, n=128) и border (+0.708, n=128), ни одной метки Д4. Собственный замер по тем же ответам: наклон claude +0.032, sol +0.078 ошибки на шаг метки (n=579 в каждом семействе). Числовых последствий нет ни для одного напечатанного вывода Д4: поправленные контрасты claude 3.50 / 2.16 / 1.02 (Δ 0.003 / +0.006 / +0.008), sol 4.75 / 3.12 / 0.61 (Δ 0.006 / +0.014 / +0.019); порог различимости 1.54→1.57 и 3.65→3.70; маржевый гейт чувствительности остаётся ПРОЙДЕН у claude и НЕ ПРОЙДЕН у sol; грубый декой 62/62 и 61/62 без изменений. То есть дефект — отсутствие обязательного и проверяемого механизма и подмена улики гейтом другого пака, а не сдвиг чисел."
}
},
{
"title": "Д5: классификация мест потери канона снята решением сессии, при этом артефакт по-прежнему несёт классы",
"severity": "важно",
"evidence": "Заказ :106-108 требует «КАЖДОЕ место потери покрытия у R0 классифицировать (термин исчез / парафраз / другой перевод), таблица по терминам и местам». canon.py:22-28: «Первая редакция классифицировала КАЖДОЕ место… Адверсариальное ревью её сняло… классом он больше не размечается». Прогон печатает 24 места без классов. При этом canon.py:302-305 продолжает писать поле cls, и в ~/books/dovodka/canon-dissect.json: Counter({'парафраз': 19, 'другой': 4, 'исчез': 1}).",
"consequence": "Обязательный элемент заказа не исполнен (исполнена только половина: таблица по терминам и список мест), а носитель-артефакт, объявленный в реестре как R35 «регрессионный набор», содержит именно те классы, которые шапка объявляет недействительными. Читатель артефакта получит снятое измерение как данные.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-ран своими командами подтвердил каждый элемент. Заказ :106-108 дословно требует классификации КАЖДОГО места. canon.py:20-27 снимает её («классом он больше не размечается»), прогон (EXIT=0, 115 строк) печатает 24 места без классов, единственное упоминание классов в stdout — дисклеймер. При этом canon.py:301-305 продолжает писать cls и why; после моего собственного повторного прогона ~/books/dovodka/canon-dissect.json содержит 24 записи с ключами uid, term, dst, cls, why, draft, edit и Counter({'парафраз': 19, 'другой': 4, 'исчез': 1}) — совпадает с находкой посимвольно. classify() (canon.py:134-149) жив и вызывается на :203. Артефакт — плоский массив без шапки и без предупреждения. Объявленным ограничением это НЕ является: ни Д0.11 (:898), ни Д0.13 (:1052) о снятии классификации Д5 не говорят (пункт Д0.11 «Что ревью ОПРОВЕРГЛО» — про другой прибор, канон-гейт contour.py); единственный пре-рег-след — норма Д0.6 (:835-838), и та даёт 82.5% против 79%, тогда как шапка canon.py называет 84%. Реестр eval/dovodka/requirements.md:66-67 держит R34 в полной формулировке с уликой «код возврата 0» — гейт читает R34 зелёным при исполненной половине; R35 объявляет этот же JSON регрессионным набором.",
"corrected": "Верна с уточнением масштаба. Точно: R34 исполнен наполовину (таблица по терминам + список 24 мест), классификация снята решением сессии и в пре-реге/эрратах Д0.11 и Д0.13 как ограничение не объявлена (косвенный след — только норма Д0.6 о контроле $0-детекторов, с числом 82.5% против 84% в шапке canon.py); артефакт R35 canon-dissect.json несёт по всем 24 записям поле cls (парафраз 19 · другой 4 · исчез 1) и вдобавок поле why — улику того же снятого классификатора («этот», «Цинь (сходство 0.67)»), без шапки и без пометки недействительности. Дополнительно: улика R34 в реестре — код возврата 0 команды canon.py, поэтому conformance читает R34 зелёным при неисполненной половине. Сужение: ни один ОПУБЛИКОВАННЫЙ вывод фазы на классах не стоит — stdout классов не печатает, секции результатов Д5 в 23-editor-tier.md нет вовсе; поражены реестр требований и артефакт-носитель, а не числа отчёта."
}
},
{
"title": "Срез Д5 сделан решением сессии без СТОПа и пинга владельцу",
"severity": "важно",
"evidence": "Заказ :180 «Панель, ось или кандидата НЕ резать решением сессии — СТОП и пинг владельцу» и :183-184 «любая девиация = СТОП и пинг В МОМЕНТ, а не примечание пост-фактум». В docs/PROGRESS.md последняя запись полигона по фазе Д — строка 225 от 10.08 («Потолок фазы $4.50… Покупок на момент записи ноль»); упоминаний Д5, снятия классификации, отказа от A5 и подъёма потолка до $6.15 в журнале нет (`grep -n 'Д5|канон-вскрыт|классифиц' docs/PROGRESS.md`).",
"consequence": "Девиация существует только в шапке кода, до владельца не доведена; журнал координации показывает фазу в состоянии «покупок ноль» при потраченных $2.393243 из потолка $6.15.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Ядро находки подтвердилось моими командами: заказ :101-108 требует классификации КАЖДОГО места потери, закоммиченный реестр eval/dovodka/requirements.md:66 (R34) это требование держит, а eval/dovodka/canon.py классификацию не даёт и печатает «КЛАССАМИ НЕ РАЗМЕЧАЮТСЯ ... снята ревью»; при этом улика R34 — сам canon.py — возвращает код 0, то есть conformance-гейт проходит по требованию, чья суть снята. Ни Д0.11, ни Д0.13, ни docs/PROGRESS.md снятия не упоминают (грепы по «классифиц», «Д5», «канон-вскрыт»), тела отчёта Д1Д8 не существует, пункта CONFIRM/DENY на это нет. Но масштаб в находке неточен по четырём пунктам. (1) Снятие НЕ живёт «только в шапке кода»: оно в git, в самом фриз-коммите пре-рега da5f4d0 от 10.08 (git log --follow -- eval/dovodka/canon.py даёт один коммит), и печатается в выводе инструмента. (2) Утверждение «журнал показывает фазу в состоянии покупок ноль» ложно: свежая запись полигона — блок docs/PROGRESS.md:196 «ФАЗА Д — СТАТУС НА ВЕЧЕР 10.08» (коммит 90c23cb, 10.08 19:01), где куплен A1 30/30 за $0.226944 и пакет $0.234846 из $4.50; строка 225 с «покупок ноль» — более ранняя запись того же дня, лежащая НИЖЕ по секции. Дефект журнала — устарелость, а не показ нуля. (3) Подъём потолка до $6.15 несёт названную санкцию владельца (money_d.py:104 «санкция владельца 11.08, «поднимай»», коммит 2fed3d0 «on the owner's sanction») — со слов сессии, словом владельца проверить не могу, но как решение сессии он не оформлен. (4) A5 объявлен «опция при остатке» и заказом :87, и реестром R29 — его неисполнение внутри условия заказа, а не срез кандидата. Правило :180 говорит о панели/оси/кандидате; снятая классификация — $0-прибор, снятый по нулевой модели (регекс срабатывал на 84% произвольных окон), так что применима формулировка :183-184 «любая девиация = СТОП и пинг В МОМЕНТ». Ни один числовой вывод фазы не двигается: деньги $2.393243 из $6.15 (мой пере-ран money_d.py) сходятся, оси и вердикты не затронуты; меняется процессная картина — незакрытое требование R34 при зелёной улике и журнал, отставший на четыре дня.",
"corrected": "Требование Д5 (R34 реестра: классифицировать КАЖДОЕ место потери канона на «исчез/парафраз/другой перевод») снято решением сессии по итогам собственного ревью, без СТОПа и пинга владельцу. Снятие зафиксировано в git (фриз-коммит пре-рега da5f4d0, 10.08) и печатается в выводе canon.py, но не доведено ни до Д0.11/Д0.13, ни до тела отчёта, ни до docs/PROGRESS.md, ни до списка CONFIRM/DENY; при этом улика R34 в закоммиченном реестре — запуск того же canon.py — возвращает код 0, поэтому conformance-гейт зелен на требовании, чья суть не исполнена. Отдельно: журнал координации отстал — свежая запись полигона (docs/PROGRESS.md:196, коммит 90c23cb от 10.08 19:01) фиксирует $0.234846 из $4.50 и куплённый A1, тогда как фактически потрачено $2.393243 из $6.15 (пере-ран money_d.py); эрраты Д0.11/Д0.13, пере-покупка A1B и подъёмы потолка $5.40→$6.00→$6.15 в журнале отсутствуют. Не входит в находку: подъём потолка до $6.15 несёт названную санкцию владельца 11.08 (money_d.py:104, коммит 2fed3d0 — со слов сессии), а A5 объявлен заказом :87 и реестром R29 как «опция при остатке», то есть его неисполнение — не срез кандидата. Выводы фазы не меняются."
}
},
{
"title": "Арм A5 не взят, решение не объявлено, хотя остаток есть",
"severity": "важно",
"evidence": "Заказ :87-88 «A5 (опция при остатке): сильный редактор × узкий мандат по флагам (гейт реактивации строки 106)». `grep -rn A5 docs/experiments/23-editor-tier.md eval/dovodka/*.py docs/PROGRESS.md` даёт одно попадание — eval/dovodka/requirements.md:60, где A5 пересказан, а колонка улики «—». Ни в Д0.5 (перечень армов), ни в Д0.10 («чего фаза НЕ меряет») A5 не назван. money_d.py --report: ПАК потрачено 2.393243 при потолке 6.15, резерв 3.756757.",
"consequence": "Опция заказа молча не исполнена: ни «взято», ни «не взято по такой-то причине». Строка 106 бэклога остаётся без гейта реактивации, и владелец об этом из отчёта не узнает.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверил своими командами. Наблюдаемая часть находки устояла: `grep -rn \"\\bA5\\b\"` по docs/ и eval/ (кроме node_modules) даёт по фазе Д ровно два хита — заказ :87-88 и `eval/dovodka/requirements.md:60` (R29, колонка улики «—»); прочие хиты относятся к экспам 16/18 и research 18/24. Прочитал Д0.5 (перечень армов: A0·A1·A1B·A2·A3·A4·A6·A6F, :794-812), Д0.10 (:892-896), эрраты Д0.11 (:898-982) и Д0.13 (:1052-1151) — A5 не назван нигде, решения по опции нет. Числа денег сошлись: `money_d.py --report` печатает ПАК 2.393243 / 6.15 / резерв 3.756757; независимый пересчёт по сырью `~/books/dovodka/dv-*.json` мимо харнесса дал ту же сумму 2.393243 (A1 0.226944 · A1B 0.577290 · A2 0.172370 · A3 0.451476 · A4 0.286136 · A6 0.267825 · A6F 0.224930 · полы 0.186272). Опровергнута улика «остаток есть»: сумма подпотолков `CEILINGS` (money_d.py:114-116) = 6.10 при PACK_CEILING 6.15, то есть нерасписанных денег в паке $0.05; печатаемый «резерв 3.756757» = 0.049512 (остаток ФД-A) + 0.227245 (ФД-F) + 0.63 + 0.17 + 0.05 + 2.37 + 0.21 (пять ещё не купленных подпотолков) + 0.05 — арифметика сходится точно. Пре-рег дважды объявляет «РЕЗЕРВ ФАЗЫ $0.00» (money_d.py:16-20; Э-13, 23-editor-tier.md:967-972), и из-за его отсутствия Д1 уже урезан до 15 клеток gemini из 16. Опровергнута и часть про последствие: отчёта, из которого владелец «не узнает», пока нет — файл обрывается на Д0.13 (1151 строка), результатных секций Д1Д8 нет, куплены 2 подпотолка из 7. Ни один вывод фазы не двигается: несущие контрасты Д4 объявлены A1B/A0, A3/A0, A6/A0 (itog_d4.py:58, sud.py:84), A5 в семейство Холма не входит. Отдельно: фиксер A1/A1B — `FIXER = \"deepseek-v4-pro\"` (contour.py:70), то есть боевой редакторский движок, а не «дешёвый фиксер», которым оговорена строка 106; сильный ТИР (gemini/glm-5) это не заменяет, но часть оговорки строки 106 уже закрыта замером.",
"corrected": "A5 (опция заказа :87-88 — сильный редактор × узкий мандат по флагам, гейт реактивации строки 106) не назван ни в перечне армов Д0.5, ни в Д0.10 «чего фаза НЕ меряет», ни в эрратах Д0.11/Д0.13; единственный след — R29 в `eval/dovodka/requirements.md:60` с пустой уликой. Решение по опции нигде не записано — это верно. Но основание «хотя остаток есть» неверно: «резерв 3.756757» в строке ПАК есть непотраченная часть подпотолков ещё НЕ купленных осей (ФД-B 0.63 · ФД-C 0.17 · ФД-D 0.05 · ФД-E 2.37 · ФД-G 0.21 плюс остатки ФД-A 0.0495 и ФД-F 0.2272), а свободных, ни на что не расписанных денег в паке $0.05 (6.15 минус сумма подпотолков 6.10); пре-рег дважды объявляет «РЕЗЕРВ ФАЗЫ $0.00», и из-за его отсутствия Д1 уже урезан до 15 клеток из 16. Самый дешёвый арм этой оси стоил $0.172 за 32 клетки (A2) при боевом жильце, а A5 требует жильца сильного тира — то есть дороже. Значит условие «опция ПРИ ОСТАТКЕ» на сегодня не наступило, и точная формулировка не «опция молча не исполнена», а «условие опции не наступило, и это не записано». Масштаб последствия меньше заявленного: отчёта фазы ещё нет (23-editor-tier.md кончается на Д0.13, результатных секций Д1Д8 нет, куплены 2 подпотолка из 7), ни один вывод фазы от A5 не зависит — несущие контрасты Д4 объявлены как A1B/A0, A3/A0, A6/A0. Остаточное действие — одна строка в Д0.10 или в графе улики R29: «A5 не берётся: свободных денег $0.05 при объявленном резерве $0.00»; при этом фиксер A1/A1B — deepseek-v4-pro (боевой редактор), то есть оговорка строки 106 про «дешёвый фиксер» уже частично снята замером, а непроверенным остаётся именно сильный ТИР."
}
},
{
"title": "Замок кассы снимается не поставившим его процессом: проверки живости PID нет",
"severity": "важно",
"evidence": "Заказ :165 «Замок кассы снимает только поставивший его процесс (проверка живости PID)». eval/tenant_panel/money.py:209-222 — _claim открывает .lock через O_CREAT|O_EXCL и НИЧЕГО в него не пишет; money.py:234-240 — ожидающий процесс после 240 итераций по 5 с делает (OUT/f'{tag}.lock').unlink() и покупает сам. `grep -rn 'getpid|kill\\(|pid' eval/tenant_panel/money.py eval/role_topology/buy.py eval/dovodka/money_d.py` — пусто. Для сравнения, журнал агент-сессий норму исполняет: runs.py:73-101 пишет PID и снимает замок только после os.kill(pid, 0).",
"consequence": "Через 20 минут ожидания любой процесс снимает чужой живой замок и покупает клетку повторно — это ровно тот класс двойной оплаты, ради которого замок и заводился. Норма исполнена в журнале сессий и НЕ исполнена в кассе; в реестре у R63 улика «—».",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверено своими командами, все три опорных факта подтвердились.\n\n1) Код. `eval/tenant_panel/money.py:218-223` — `_claim` открывает `.lock` через `O_CREAT|O_EXCL|O_WRONLY`, затем сразу `os.close(fd)`; в дескриптор не пишется ничего. `money.py:234-242` — не занявший замок процесс крутит `for _ in range(240)` по `time.sleep(5)` (= 1200 с), и если файла клетки так и нет, печатает «замок протух», делает `(OUT/f'{tag}.lock').unlink(missing_ok=True)` (:241) и `_claim(tag)` (:242) — снимает замок, поставленный ДРУГИМ процессом, без проверки, жив ли тот.\n\n2) Грепом: `grep -rn 'getpid|kill\\(|pid' eval/tenant_panel/money.py eval/role_topology/buy.py eval/dovodka/money_d.py` возвращает пусто (exit 1). Проверки живости нет ни в одном из трёх файлов.\n\n3) Это касса ИМЕННО фазы Д, а не чужая: `eval/dovodka/money_d.py:52` грузит `money.py` эксп-22 по пути, `:118-121` настраивает его через `configure(...)` и ре-экспортирует `purchase = M22.purchase`. Собственного замка у money_d.py нет — значит R63 адресован ровно этому коду.\n\n4) Контр-норма исполнена в журнале сессий: `eval/dovodka/runs.py:69-99` — `os.write(fd, str(os.getpid()).encode())` при взятии, `os.kill(pid, 0)` перед снятием чужого, снятие в `finally` только при совпадении PID. Разрыв между двумя механизмами реален.\n\n5) Объявленным ограничением НЕ является. Прогрепал Д0.11 (`23-editor-tier.md:898+`) и Д0.13 (`:1052+`) — про замок кассы там нет ничего. Два хита «живости PID» в отчёте: `:407` — §8 п.7 ПРОШЛОГО пака («Я СНЯЛ ЗАМКИ У ЖИВОГО ПОКУПАЮЩЕГО ПРОГОНА»), где пункт стоит как «В прибор:», то есть это ИСТОЧНИК нормы, а не вейвер; `:824` — про `runs.py`, и там утверждение верное. Ложного клейма «сделано» по кассе отчёт не содержит.\n\n6) Реестр: `eval/dovodka/requirements.md:99` — у R63 улика «—». Прогон `eval/conformance.py eval/dovodka/requirements.md --plan` печатает по R63 «ОЖИДАЕТ ← улика не объявлена»; по шапке реестра (`requirements.md:17`) «—» в режиме `--final` = провал.\n\nЧто уточняю по масштабу (потому refuted=false, а не «верно дословно»): ссылка «money.py:234-240» обрывается на строку раньше — снятие чужого замка на :241, повторный захват на :242; `_claim` — :209-223. Условие двойной оплаты уже, чем «через 20 минут любой процесс»: цикл :237 каждые 5 с проверяет `f.exists()` и при появлении клетки возвращает кэш, так что пере-покупка требует, чтобы держатель замка прожил >20 мин, НЕ записав файл. Зато в том же классе есть второй разрыв, находкой не названный и 20 минут не требующий: `finally` на :256 снимает `.lock` безусловно, поэтому процесс, у которого замок уже отобрали по таймауту, при завершении удаляет ЧУЖОЙ заново поставленный замок. Фактического ущерба в фазе Д не показано и показать нечем: лежалых `*.lock` в ~/books/dovodka 0 при 311 купленных клетках, а второй путь счёта — сами файлы клеток, поэтому вторая оплата «незаметна по построению» (собственная шапка `money.py:212-216`). Ни одно число и ни один вердикт фазы от находки не двигается — двигается только статус R63, который и так стоит «ОЖИДАЕТ» и валит `--final` (в прогоне: требований 89 · ожидают 58 · провалов 3 · СВЕРКА НЕ ПРОЙДЕНА).",
"corrected": "Норма заказа :165 (R63) кассой фазы Д не исполнена: замок клетки снимается не поставившим его процессом, проверки живости PID нет. `eval/tenant_panel/money.py:218-223` — `_claim` открывает `.lock` через `O_CREAT|O_EXCL` и не пишет в него PID; `money.py:234-242` — ожидающий процесс после 240 итераций по 5 с (20 мин) делает `unlink` чужого замка (:241) и захватывает его сам (:242). Второй разрыв того же класса, таймаута не требующий: `finally` на :256 снимает `.lock` безусловно, поэтому процесс, у которого замок уже отобрали, при завершении удаляет заново поставленный чужой. Касса фазы Д — именно этот код: `eval/dovodka/money_d.py:52,118-121` грузит money.py эксп-22 по пути и ре-экспортирует `purchase = M22.purchase`; `grep -rn 'getpid|kill\\(|pid'` по money.py, buy.py, money_d.py пуст. Норма исполнена только в журнале сессий (`runs.py:69-99`: запись PID, `os.kill(pid,0)`, снятие лишь при совпадении PID). Объявленным ограничением в Д0.11/Д0.13 не является; хит «живости PID» на :407 — пункт §8 п.7 прошлого пака в формулировке «В прибор:», то есть источник нормы, а хит на :824 относится к runs.py и верен. Масштаб: пере-покупка требует, чтобы держатель замка прожил >20 мин, не записав файл клетки (цикл :237 каждые 5 с отдаёт кэш, как только клетка появилась); фактической двойной оплаты в фазе Д не показано и показать нечем — лежалых `*.lock` в ~/books/dovodka 0 при 311 клетках, а вторая оплата «незаметна по построению» (`money.py:212-216`). Ни одно число и ни один вердикт фазы не меняется; меняется только статус R63 в реестре (`requirements.md:99`, улика «—»), который в `--plan` уже стоит «ОЖИДАЕТ», а в `--final` = провал."
}
},
{
"title": "Детектор адъюдикации изменён после прихода части вердиктов и не закоммичен",
"severity": "важно",
"evidence": "Заказ :183 «Детекторы и пороги после взгляда на вердикты не менять». `ls -l --time-style=+%m-%d_%H:%M ~/adjud-d4/answers/` — adj-04 01:43, adj-03 01:48, adj-02 01:50, adj-01 01:51; eval/dovodka/adjud.py — 08-14 02:01; коммит d1f42c5 — 02:00:17. `git diff eval/dovodka/adjud.py`: в выборку добавлен фильтр `and v.get('axis') in ('ВЕРНОСТЬ','ЯЗЫК')`, то есть изменён состав претензий, по которому считается порог ≥80%.",
"consequence": "Правило, решающее судьбу эскалации A3/A0, отредактировано между четвёртым и пятым ответом адъюдикатора и на момент проверки лежит незакоммиченным. Текущий результат: A3 85% (n=26), A0 73% (n=22), «условие П-1 НЕ выполнено».",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверено своими командами; все четыре фактических утверждения находки воспроизводятся.\n\n1) Тайминги. `ls -l --time-style=+%m-%d_%H:%M:%S ~/adjud-d4/answers/` даёт СЕМЬ файлов, а не четыре: adj-04 01:43:11, adj-03 01:48:55, adj-02 01:50:27, adj-01 01:51:29, adj-07 02:06:17, adj-05 02:07:32, adj-06 02:11:46. mtime eval/dovodka/adjud.py — 08-14 02:01:13; `git log -1 d1f42c5` — 2026-08-14 02:00:17. Правка легла после 4 из 7 пачек ответов и до 3 остальных; в коммит не вошла.\n\n2) Незакоммиченность. `git status --porcelain` → ` M eval/dovodka/adjud.py`. Верно.\n\n3) Дифф. Добавлено `and v.get('axis') in ('ВЕРНОСТЬ','ЯЗЫК')` (adjud.py:245-247) плюс комментарий, где обоснование по ФОРМЕ («окно МЕСТО В ПЕРЕВОДЕ подаётся через norm()») названо дефектом, найденным САМИМ адъюдикатором, то есть выведено из уже пришедших вердиктов. Состав претензий под порогом ≥80% действительно изменён.\n\n4) Числа. `eval/.venv/bin/python eval/dovodka/adjud.py --score` → 154/154 ответов, сговорчивость 13% (n=15) ГОДЕН, чувствительность 67% (n=15) ГОДЕН, A3 85% (n=26), A0 73% (n=22), «условие П-1 НЕ выполнено». Совпадает посимвольно.\n\nНеточности масштаба — три, все проверены пере-раном.\n\nа) Направление фильтра пре-регистрировано. docs/experiments/23-editor-tier.md, Д0.13: П-5 «Несущая сумма судьи — ВЕРНОСТЬ + ЯЗЫК» (ТЕРМИН и ФОРМА выведены), П-7(3) прямо связывает это с П-1. Сами пороги 80%/p<0.05, которые П-1 запрещает менять, не тронуты; после вердиктов изменён состав выборки.\n\nб) Ни один вывод фазы не меняется. На тех же ключе и 154 ответах (мой скрипт reck.py в скрэтчпаде): все оси, т.е. версия HEAD — A3 60% (n=62), A0 45% (n=62); фильтр как написан — A3 85% (n=26), A0 73% (n=22); задуманный ВЕРНОСТЬ+ЯЗЫК — A3 76% (n=37), A0 55% (n=49). Порог ≥80% у обоих армов не берётся ни в одном варианте; «условие П-1 НЕ выполнено» стоит всюду.\n\nв) Попутный дефект, находкой не названный: фильтр не делает того, что написано в его комментарии. В ~/books/dovodka/adjud-key.json метки осей у РЕАЛЬНЫХ претензий обрезаны — Counter({'ЯЗЫК': 48, 'ОСТЬ': 38, 'ОРМА': 20, 'РМИН': 18}). Причина в adjud.py:124-125: `re.split(r\"(?=[А-ЯЁ]{4,}:)\", why)` — лукахед нулевой ширины срабатывает на каждой позиции, уцелевает только последний сегмент, то есть последние 4 буквы имени оси; ЯЗЫК цел, так как в нём ровно 4 буквы. У ложных претензий метка полная (берётся из константы AX), поэтому глазами в ключе дефект незаметен. Итог: `axis in ('ВЕРНОСТЬ','ЯЗЫК')` отбирает ТОЛЬКО ЯЗЫК — 26+22=48 равно числу ЯЗЫК-претензий, и прогон «только ЯЗЫК» даёт те же 85%/73% (n=26/22). Все 38 претензий ВЕРНОСТЬ выпали молча; печатаемая строка «только несущие оси ВЕРНОСТЬ+ЯЗЫК» посчитанному не соответствует.",
"corrected": "Детектор адъюдикации правился после прихода части вердиктов и лежит незакоммиченным; вывод фазы при этом не меняется, а сам фильтр не работает как объявлено.\n\nФакт правки подтверждён: eval/dovodka/adjud.py — mtime 08-14 02:01:13, `git status` → ` M`, коммит d1f42c5 (02:00:17) её не несёт; из семи пачек ответов четыре (adj-01..04, 01:4301:51) написаны ДО правки, три (adj-07 02:06, adj-05 02:07, adj-06 02:11) — после. Это девиация от строки 183 заказа, требовавшая СТОП и пинг в момент, а не незакоммиченного файла.\n\nМасштаб уже, чем в находке, в двух пунктах. (1) Ось отбора пре-регистрирована: Д0.13 П-5 объявляет несущую сумму ВЕРНОСТЬ+ЯЗЫК, П-7(3) привязывает к ней вердикт по П-1; пороги 80%/p<0.05, которые П-1 запрещает трогать, не тронуты — после вердиктов внесён состав выборки и пост-хок обоснование по ФОРМЕ (дефект norm()-окна, замеченный по ответам адъюдикатора). (2) Судьба эскалации A3/A0 не переворачивается: на тех же 154 ответах П-1 проваливается при любом составе — все оси 60%/45% (n=62/62), фильтр как написан 85%/73% (n=26/22), задуманный ВЕРНОСТЬ+ЯЗЫК 76%/55% (n=37/49).\n\nМасштаб шире в другом месте: фильтр отбирает не две оси, а одну. В adjud-key.json метки реальных претензий обрезаны разбором в adjud.py:124-125 (`re.split(r\"(?=[А-ЯЁ]{4,}:)\")` оставляет последние 4 буквы): ВЕРНОСТЬ→'ОСТЬ', ФОРМА→'ОРМА', ТЕРМИН→'РМИН', ЯЗЫК цел. Поэтому `axis in ('ВЕРНОСТЬ','ЯЗЫК')` берёт только ЯЗЫК — 48 из 48 ЯЗЫК-претензий, все 38 ВЕРНОСТЬ выброшены молча. Опубликованные A3 85% / A0 73% — доля по ОДНОЙ оси ЯЗЫК, на объявленной паре осей вышло бы 76%/55%. Любые числа фазы вида «доля верифицированных претензий по несущим осям» подлежат пере-снятию после починки разбора оси."
}
},
{
"title": "Второе условие пре-регистрированного правила П-1 не реализовано",
"severity": "важно",
"evidence": "23-editor-tier.md:1068: CONFIRM при эскалации требует «≥80% выборки цитат верифицируются слепо как реальные И знаковый тест по одним верифицированным дельтам даёт p<0.05». adjud.py:247-259 считает только долю подтверждённых претензий по армам; знакового теста по верифицированным дельтам в файле нет (в score() нет ни одного вызова BO.sign_perm_p).",
"consequence": "Ветка «CONFIRM с пометкой: вынесен одним семейством, подтверждён адъюдикацией» недостижима по построению — второй половины гейта не существует. Эскалация A3/A0 (ставка владельца H-2б) разрешается только половиной объявленного правила.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверил своими командами. Факт кода подтверждается: в `eval/dovodka/adjud.py` `score()` (строки 216270) считает только контроли сговорчивости/чувствительности и долю подтверждённых претензий по армам; `BO.sign_perm_p` в файле не вызывается ни разу (`grep -n \"BO\\.\" eval/dovodka/adjud.py` — ни одного хита; BO импортирован и не используется). `itog_d4.py` адъюдикацию не импортирует и после печати «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ» (строка 235) вердикт не досчитывает; `git diff` показывает, что в HEAD-версии знакового теста тоже нет (диф трогает только фильтр осей П-5). Объявленным ограничением это нигде не описано: греп «адъюдик|adjud» по `docs/experiments/23-editor-tier.md` даёт только текст самого правила П-1 (строки 10591076), в `docs/PROGRESS.md` — ноль хитов.\n\nНо масштаб в находке завышен, и это меняет её последствие. Мой ре-ран `adjud.py --score`: контроли пройдены (ложные 13% ≤ 20%, посаженные 67% ≥ 60%), доли по несущим осям — A3 85% (n=26), A0 73% (n=22), пул 38/48 = 79.2%. Реализованная половина гейта уже возвращает ОТКАЗ при обоих прочтениях, которые не привязывают порог к одному арму, а правило П-1 соединяет условия через И — значит вердикт «НЕ ПОДТВЕРЖДЕНО» для A3/A0 стоит независимо от отсутствующего теста. Отдельно посчитал недостающую половину сам (скрэтчпад-скрипт поверх `itog_d4.read_family`/`margins`, поправка = сырой carry × доля арма, как описано в шапке adjud.py): скорректированные дельты n=31, среднее 2.31 (сырое 2.16), знаки 28 минус / 3 плюс, точный знаковый тест p<0.0001 — то есть второе условие, будь оно реализовано, ПРОШЛО бы, а завалено первое. Поэтому «ветка недостижима по построению» неверно как утверждение о результате: ветка не выдана из-за проваленной доли, а не из-за отсутствия теста. Решающим пробел становится ровно в одном сценарии — если «≥80% выборки цитат» читать по одному арму A3 (85%), а не по обоим/пулу; код использует прочтение «оба арма».",
"corrected": "Второе условие П-1 (знаковый тест по верифицированным дельтам, p<0.05) в коде отсутствует: `adjud.py` `score()` останавливается на долях подтверждения по армам, `BO.sign_perm_p` в файле не вызывается, `itog_d4.py` результат адъюдикации не потребляет; как объявленное ограничение это не описано ни в пре-реге, ни в эрратах Д0.11/Д0.13, ни в журнале. На вердикт фазы пробел, однако, не влияет: реализованная половина гейта провалена (A3 85%, A0 73%, пул 79.2% < 80%), а правило соединяет условия через И, поэтому A3/A0 остаётся «НЕ ПОДТВЕРЖДЕНО» и с полным правилом. Отсутствующая половина, посчитанная отдельно моим скриптом, дала бы p<0.0001 (n=31, знаки 28/3, среднее скорректированных дельт 2.31), то есть прошла бы. Решающим пробел стал бы только при прочтении порога 80% по одному арму A3 (85%) — прочтение, которого код не использует."
}
},
{
"title": "Реестр требований расходится с фактом, а conformance-гейт зеленит требование, которого не проверяет",
"severity": "важно",
"evidence": "conformance.py --plan: R3 ПРОВАЛ (улика `grep -q \"САНКЦИЯ ВЛАДЕЛЬЦА .4.00\" eval/dovodka/plan.py` при действующем потолке $6.15 в money_d.py:9-13), R55 ПРОВАЛ («/bin/sh: Syntax error» — улика неисполнима в принципе), R71 ПРОВАЛ (verify22 красный). R34 — «КАЖДОЕ место … классифицировано» — помечен OK, потому что улика есть «canon.py вернул 0», а canon.py:22-28 объявляет классификацию снятой. Итог прогона: «требований 89 · ожидают 58 · провалов 3 · СВЕРКА НЕ ПРОЙДЕНА», при этом код возврата 0.",
"consequence": "Гейт, заведённый после аннулирования гейта эксп-23, подтверждает исполнение требования Д5, которое не исполнено, и не размыкает прогон при непройденной сверке (EXIT=0).",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-снял всё своими командами. Что подтвердилось дословно: `eval/.venv/bin/python eval/conformance.py eval/dovodka/requirements.md --plan` печатает ровно «требований 89 · ожидают 58 · провалов 3» и «СВЕРКА НЕ ПРОЙДЕНА». R3 ПРОВАЛ (код 1): улика `requirements.md:30` грепает `\"САНКЦИЯ ВЛАДЕЛЬЦА .4.00\"` в `plan.py`, а `plan.py:10,28` уже несёт $4.50. R55 ПРОВАЛ: улика `requirements.md:90` содержит markdown-экранированный `\\|`, парсер таблицы его не снимает, шелл получает `test $(grep -l ... \\| wc -l) -ge 7` → `sh: 1: test: ... unexpected operator`, exit 2 — исполнима действительно не бывает. R71 ПРОВАЛ: `eval/tenant_panel/verify22.py` у меня отдал код 1, «РАСХОЖДЕНИЙ: 1 — ОТЧЁТ НЕ СДАЁТСЯ», конкретно `[ПРОВАЛ] верхняя граница двойной оплаты $0.000000 напечатана`. R34 помечен OK, потому что `canon.py` у меня вернул 0, а `canon.py:20-26` снимает классификацию мест («классом он больше не размечается и числом по классам не подводится») — расхождение улики с требованием реальное.\n\nОпровергнуто исполнением ядро последствия — «не размыкает прогон при непройденной сверке (EXIT=0)». Код возврата равен 1, а не 0, в ОБОИХ режимах: `--plan` → EXIT=1, `--final` → «провалов 61», FINAL_EXIT=1. Механика в `eval/conformance.py:171`: `return 1 if bad else 0`, и `sys.exit(main())` на 175. Гейт прогон размыкает.\n\nДве числовые ошибки в самой находке. (1) «действующем потолке $6.15 в money_d.py:9-13» — строки 9-14 говорят $5.40; $6.15 стоит в `money_d.py:116` (`PACK_CEILING = 6.15`) с историей на 104. Величина названа верно, адрес — нет, и по названному адресу лежит третье число. (2) R55 — улика сломана, но само требование ИСПОЛНЕНО: `grep -l \"баннер фазы Д\" docs/experiments/*.md | wc -l` даёт 7, то есть `-ge 7` прошло бы. Это ложно-отрицательное срабатывание прибора, а не невыполненное требование; формулировка находки этого не различает.\n\n«Гейт зеленит требование, которого не проверяет улика» на уровне строки R34 верно, но объявлено ограничением самого инструмента до находки: `eval/conformance.py:24-27` — «Он проверяет, что у требования ЕСТЬ проходящая улика, а не что улика доказывает именно это требование: связь „требование ↔ улика“ устанавливает автор таблицы, и подменить её ничего не мешает». В Д0.11/Д0.13 темы нет; ближайшая объявленная — шапка отчёта `23-editor-tier.md:32-36` про аннулированный гейт эксп-23.\n\nНи один вывод фазы не двигается. Реестр в git и совпадает с закоммиченным (`git status --short` чист, фриз-гейт `--final` пропускает), прогон красный в обоих режимах, и ни одно утверждение фазы Д не опирается на его зелень — грепом по `23-editor-tier.md`/`PROGRESS.md` ссылок на пройденную сверку фазы Д нет.",
"corrected": "В реестре требований фазы Д три улики расходятся с фактом дерева, а связь «требование ↔ улика» в одной строке не держит требования. R3 (`eval/dovodka/requirements.md:30`) грепает в `plan.py` санкцию $4.00, тогда как `plan.py:28` несёт $4.50, а действующий пакетный потолок — $6.15 (`eval/dovodka/money_d.py:116`; докстринг того же файла на строках 9-14 всё ещё описывает $5.40) — улика отстала на два подъёма потолка. R55 (`requirements.md:90`) неисполнима из-за markdown-экранирования `\\|`, которое парсер таблицы не снимает: шелл падает с `unexpected operator`, exit 2 — при этом само требование выполнено (7 отчётов несут баннер, порог `-ge 7` прошёл бы), то есть это ложно-отрицательное срабатывание прибора. R71 краснеет по существу: `eval/tenant_panel/verify22.py` возвращает 1 с одним расхождением (`верхняя граница двойной оплаты $0.000000 напечатана`). R34 («КАЖДОЕ место потери классифицировано») помечен OK по улике «`canon.py` вернул 0», хотя `canon.py:20-26` классификацию мест снял явным решением — улика проходит, требование не исполнено; это ровно тот класс подмены, который инструмент объявляет своей границей в `eval/conformance.py:24-27` и не ловит по построению.\n\nПоследствие ограничено реестром и не распространяется на размыкание прогона: гейт прогон размыкает штатно — `--plan` даёт EXIT=1 при «провалов 3», `--final` даёт EXIT=1 при «провалов 61» (`eval/conformance.py:171`, `return 1 if bad else 0`). Утверждения «код возврата 0» и «гейт зеленит» на уровне прогона неверны: сверка объявлена НЕ ПРОЙДЕННОЙ и таковой сдаётся. Выводы фазы не затронуты — ни одно её утверждение на зелень этого гейта не опирается."
}
},
{
"title": "Норма «судье запрещено читать варианты рядом» не исполнима вместе с нормой «все армы единицы — в одном пакете» и исполнена только словом инструкции",
"severity": "важно",
"evidence": "Заказ :161 и :164. Фактически все 811 вариантов единицы лежат в ОДНОМ файле задания (~/sud-d4/p1-tasks/2428a3dec8.txt, метки Т1…Т11 подряд, 1452 строки), запрет живёт только текстом (judge-prompts/core.md:13 «Не сравнивай варианты между собой»). Что запрет не самоисполним, подтверждено сырьём: ~/sud-d4/annulled.txt — три сессии Claude поймано на diff/difflib и на чтении чужих ответов, 11 файлов в карантин, пачки пере-суждены.",
"consequence": "Конфликт двух норм заказа разрешён в пользу одной без объявления; работающим контролем оказался пост-фактум аудит транскриптов, а не изоляция. Для семейства Sol симметричный аудит проведён его же root-сессией (16 суб-агентов, diff не найден) — то есть контроль есть, но он не тот, который норма описывает.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-проверил своими командами; ядро находки стоит, но масштаб и часть «без объявления» требуют правки.\n\nПОДТВЕРЖДЕНО ИСПОЛНЕНИЕМ.\n1. Обе нормы действительно стоят в заказе рядом: `grep -n` даёт :161 «Все армы единицы — в одном пакете одной сессии» и :164 «Судье запрещено сравнивать варианты между собой и читать их рядом». Те же две строки продублированы в пре-реге: 23-editor-tier.md:830 и в списке «Нормы, обязательные для ОБОИХ семейств» (Д0.12, :1023).\n2. Все варианты единицы физически лежат в ОДНОМ файле задания. Прогнал по всем 31 файлу `~/sud-d4/p1-tasks/`: метки-разделители `Тn:` идут подряд в одном файле (в 2428a3dec8.txt — Т1 на :158 … Т11 на :1370).\n3. Запрет живёт текстом. `eval/dovodka/judge-prompts/core.md:13` — «Оценивай каждый вариант ОТДЕЛЬНО против исходника. Не сравнивай варианты между собой…». Половины «не читать рядом» в инструкции НЕТ ВООБЩЕ — то есть находка тут даже занижает: до сессий доехал только запрет сравнения, а требование пре-рега (:382 «В прибор: запрещать не только сравнение, но и чтение вариантов рядом») в прибор не попало. Тела промтов обоих семейств побайтно совпали (`diff` тел p1-session-03 Claude vs Sol → идентичны), значит у Sol ровно то же.\n4. Механизированный контроль норму НЕ покрывает — проверено пере-раном, а не чтением. `sud.py --audit` сверяет транскрипт только со списком путей `FORBIDDEN = (\"blind-keys\",\"dv-a-\",\"dv-f-\",\"/books/dovodka\",\"contour.py\",\"sud.py\")` (sud.py:198). Собрал синтетический транскрипт, делающий ровно то, за что аннулированы сессии (diff между строчными диапазонами файла задания, `import difflib`, чтение `~/sud-d4/p1-answers/0dce349331.txt`), и прогнал `--audit`: вывод «АУДИТ ЧИСТ», EXIT=0. То есть поимка 13.08 сделана рукой поверх кодового гейта, а не гейтом.\n5. `~/sud-d4/annulled.txt` подтверждает три сессии (p1-session-03 diff, p1-session-04 difflib, p2-session-02 чтение чужих ответов).\n\nЧТО В НАХОДКЕ НЕТОЧНО.\nа. «811 вариантов» — фактически 711 (по 7 меток в 1508ef3e82, 455acfd07a, a24c563f69).\nб. «1452 строки» — в 2428a3dec8.txt 1456 строк (`wc -l`).\nв. «11 файлов в карантин» — это число из самого annulled.txt, на диске их 15: 7 в `~/sud-d4/p1-answers/*.ANNULLED.txt` + 8 в `p2-answers`. Лишние четыре (9c1f7dd03e, a22cc51b51, acd4fdce1c, ad6cff5902) — ЧЕТВЁРТАЯ сессия p2-session-06, в annulled.txt не упомянутая; и наоборот, у аннулированной p1-session-04 файл 69de717f3f в карантине отсутствует. Т.е. журнал карантина расходится с диском в обе стороны — отдельная мелочь, находкой не названная.\nг. «конфликт разрешён без объявления» — наполовину. Пост-фактум аудит как контроль ПРЕ-ЗАРЕГИСТРИРОВАН: Д0.13 П-3 (:10911099, принят до первого вердикта) прямо отменяет тезис Д0.12 «изоляция — единственный контроль» и вводит формулу «изоляция ПЛЮС журнал» с обязательным сохранением транскриптов и греп-аудитом после каждой пачки. Не объявлен именно КОНФЛИКТ норм :161/:164 и то, что заявленный аудит по построению ловит только запрещённые ПУТИ, а не со-чтение/сравнение внутри разрешённого файла.\nд. «симметричный аудит Sol его же root-сессией, 16 суб-агентов, diff не найден» — артефакта в сырье нет: в `~/sol-d4-work/` только p1/p2-tasks, p1/p2-answers, prompts; своего annulled.txt там нет. Число 16 сходится с числом судейских промтов семейства (8 p1 + 8 p2), но сам результат аудита — СО СЛОВ отчётной сессии, исполнением мной не воспроизведён.\n\nМЕНЯЕТ ЛИ ВЫВОД ФАЗЫ — нет. Все три счётчика фазы исключают карантин по коду: itog_d4.py:89, spanjoin.py:82, adjud.py:96 — `if \".ANNULLED\" in f.name: continue`; аннулированные пачки пере-суждены (redo-p1-01..03, redo-p2-01..04). Находка — про гигиену нормы и прибора, ни одно число фазы не двигает.",
"corrected": "Норма заказа :164 («судье запрещено сравнивать варианты между собой И ЧИТАТЬ ИХ РЯДОМ») несовместима с нормой :161 («все армы единицы — в одном пакете одной сессии»): в одном файле задания лежат все 711 вариантов единицы подряд (2428a3dec8.txt, 1456 строк, метки Т1:158 … Т11:1370), одна сессия = один контекст. Конфликт разрешён в пользу :161, и половина «не читать рядом» до прибора не доехала вовсе: инструкция (judge-prompts/core.md:13, побайтно одинаковая у обоих семейств) запрещает только сравнение и ранжирование. Пост-фактум аудит как контроль пре-зарегистрирован (Д0.13 П-3, «изоляция ПЛЮС журнал»), но его КОДОВАЯ реализация нормы не покрывает: `sud.py --audit` сверяет транскрипт лишь со списком запрещённых путей (sud.py:198), и синтетический транскрипт, делающий diff по диапазонам файла задания, `difflib` и чтение чужого ответа, проходит его с вердиктом «АУДИТ ЧИСТ», EXIT=0 (пере-ран мой). Реально сработал ручной греп-аудит 13.08: аннулированы четыре сессии (p1-session-03, p1-session-04, p2-session-02 — в annulled.txt; p2-session-06 — только на диске), в карантине 15 файлов `*.ANNULLED.txt`, а не 11, как считает сам annulled.txt. Симметричность аудита семейства Sol («16 суб-агентов, diff не найден») — со слов отчётной сессии: в `~/sol-d4-work/` артефакта аудита нет. Выводы фазы не двигаются: itog_d4.py:89, spanjoin.py:82, adjud.py:96 исключают `*.ANNULLED.txt`, пачки пере-суждены."
}
},
{
"title": "Маржевый декой — гейт чувствительности всей non-inferiority — стоит в 27 пачках из 31",
"severity": "мелко",
"evidence": "Свой разбор ключей: p1 маржевых пачек 27 из 31, p2 — 27 из 31 (грубый декой — 31/31 в обоих). Причина в коде объявлена: sud.py:108 MARGIN_MIN = 2, sud.py:121-123 возвращает пусто, если посадок меньше двух; sud.py --selftest печатает «маржевый декой сажается на большинстве единиц 27 из 31».",
"consequence": "Гейт П-2 замерен на 54 наблюдениях вместо 62; на самом гейте это не сказалось (claude +2.56 против порога 1.54 — пройден; sol +2.96 против 3.65 — не пройден, вердикты Sol по H-2а/H-2б понижены до описательных, как и предписано).",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Опровергнуть не удалось — числа воспроизвелись моими командами.\n\n1. Пере-счёт посадок с нуля (загрузил sud.py, прогнал margin_plant по всем C.units_ok()): единиц 31; распределение числа применённых замен — 1 замена у 4 единиц (de3916de62, d6cbc0179d, 6df3dd3eb6, 7d0258aec0), 2 замены у 19, 3 у 8. При MARGIN_MIN=2 в декой идут 27 из 31. Частоты классов на этом же сырье: снятие отрицания 31/31, инверсия сравнения 19/31, подмена числительного 16/31.\n2. Независимая сверка по уликам, не по коду: разбор ~/books/dovodka/blind-keys-d4/d4p1-KEY.json и d4p2-KEY.json — CTRLmargin присутствует в 27 пачках из 31 в ОБОИХ наборах, CTRLdecoy — в 31/31 в обоих. Совпадает с находкой.\n3. sud.py:108 MARGIN_MIN = 2 и sud.py:121-123 (`return planted if n >= MARGIN_MIN else \"\"`) — цитаты верны. sud.py --selftest у меня печатает «[OK ] маржевый декой сажается на большинстве единиц 27 из 31».\n4. Последствие: itog_d4.py --gates у меня даёт claude — грубый декой n=62, маржевый n=54, среднее +2.56 против порога 1.54, ПРОЙДЕН; sol — грубый n=62, маржевый n=54, +2.96 против 3.65, НЕ ПРОЙДЕН с понижением H-2а/H-2б до описательных. 54 = 27+27, 62 = 31+31. Все четыре числа находки совпали.\n5. Объявленность: в пре-реге и эрратах Д0.11/Д0.13 (греп по docs/experiments/23-editor-tier.md) ни «27», ни MARGIN_MIN, ни порог «не меньше двух посадок» не упоминаются — Д0.13 П-2 говорит только «ДВЕ тонкие посадки» и перечисляет ТРИ других класса (идиома · адресат · разряд числа). То есть ограничение объявлено в коде и печатается в выводе, но в тексте пре-рега его нет.\n6. Меняется ли вывод фазы: нет. Проверил направление смещения — перевес монотонно растёт с числом посадок: claude plants=2 n=38 +2.24, plants=3 n=16 +3.31; sol plants=2 +2.58, plants=3 +3.88. Значит выпавшие единицы с одной посадкой дали бы значения НИЖЕ среднего, то есть исключение завышает оценку чувствительности. Импутация по линейной экстраполяции (claude ~+1.17, sol ~+1.28 на 8 наблюдений): claude 2.38 > 1.54 (проходит), sol 2.74 < 3.65 (не проходит). Даже при максимально благоприятной импутации (выпавшие как 3-посадочные): claude 2.66 проходит, sol 3.08 всё равно ниже 3.65. Чтобы гейт Sol перевернулся, 8 недостающих наблюдений должны дать среднее +8.3 при наблюдаемом +2.96.",
"corrected": "Маржевый декой встаёт в 27 пачках из 31 в каждом наборе (грубый — 31/31), поэтому гейт П-2 замерен на 54 наблюдениях против 62 у грубого декоя. Порог «не меньше двух посадок» механизирован (sud.py:108 MARGIN_MIN=2, sud.py:121-123) и печатается и селф-тестом («27 из 31»), и сводом (n=54 против n=62), но в тексте пре-рега/эррат Д0.11Д0.13 не объявлен — Д0.13 П-2 задаёт только «ДВЕ тонкие посадки» и три ДРУГИХ класса. Выпадают ровно единицы, где сажается одна замена, а перевес монотонно растёт с числом посадок (claude +2.24 при двух против +3.31 при трёх; sol +2.58 против +3.88), поэтому исключение смещает оценку чувствительности ВВЕРХ, а не вниз. На вердиктах это не сказывается ни при какой правдоподобной импутации: claude проходит (+2.56 против 1.54; при импутации 2.382.66), sol не проходит (+2.96 против 3.65; при импутации 2.743.08) — переворот гейта Sol потребовал бы среднего +8.3 на восьми недостающих наблюдениях."
}
},
{
"title": "Прогноз пре-рега Д0.9 п.2 опровергнут замером, и это нигде не напечатано",
"severity": "мелко",
"evidence": "23-editor-tier.md:880-881: «A4 (канон-фиксер ПОСЛЕ переписа) даст лучшее покрытие канона из всей панели». Свой пересчёт покрытия банка по выходам: A1B 0.960 и A1 0.958 против A4 0.937.",
"consequence": "Заказ (:204) требует таблицу сверки с фактом «включая опровержения»; секций Д1Д8 в 23-editor-tier.md нет вовсе — документ обрывается на Д0.13 (строка 1151), поэтому ни прогнозы, ни сводная таблица «пробел → чем закрыт → носитель» пока не сданы.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-ран мой, не по следам отчёта. (1) Числа воспроизводятся точно. Свой скрипт (метрика canon.py: min(hits_в_выходе, n_в_исходнике)/n по банку tenant_panel/bank.py, единицы contour.units_ok(), исключена эхо-мина 63ab55ac5c, файлы .LENGTH/.ERROR не в счёт): DRAFT 0.9134 · A0 0.8893 · A1 0.9582 (n=29) · A1B 0.9603 (n=31) · A2 0.8769 · A3 0.9251 · A4 0.9375 (n=31) · A6 0.9244 (n=16) · A6F 0.9448 (n=16). Совпадает с уликой находки до третьего знака. (2) Неравенство n прогноз не спасает: на общих 29 единицах A1 = A1B = 0.9582 против A4 0.9348. (3) Чтение «лучший ПРИРОСТ, а не уровень» тоже не спасает: A4 поднял свой вход A0 0.8893→0.9375 (+0.0482), A1 поднял черновик 0.9088→0.9582 (+0.0494), A1B 0.9134→0.9603 (+0.0469) — A4 не первый ни по уровню, ни по приросту. (4) Прогноз нигде не снят: в Д0.11 A4 касается только Э-9 (две клетки finish=length, пере-куплены), Э-4/Э-6 заводят A1B/A6F, Д0.13 про A4 не говорит. Оговорка Гудхарта П-7 запрещает КОРОНОВАТЬ A1/A1B по детерминированной оси, но текст прогноза говорит про покрытие, и по покрытию он опровергнут. (5) «Нигде не напечатано» подтверждено: заголовки Д в 23-editor-tier.md кончаются на Д0.13 (:1052), файл обрывается на :1151, секций Д1Д8 нет; itog_d4.py при прогоне печатает только судейскую ось и контроли (47 строк), покрытия по армам не печатает вовсе; в docs/PROGRESS.md чисел фазы Д нет. Скрипты пере-счёта: /tmp/claude-1000/-home-ubuntu-projects-textmachine/565edf3f-c90e-4aaf-8418-c2ec250acedc/scratchpad/cov.py, cov3.py, cov4.py.",
"corrected": "Прогноз Д0.9 п.2 опровергнут в части «лучшее покрытие канона из всей панели», и опровержение нигде не напечатано. Замер (мой пере-ран, метрика bank.coverage, 31 допустимая единица): A1B 0.9603 · A1 0.9582 (n=29) · A6F 0.9448 (n=16) · A4 0.9375 · A3 0.9251 · A6 0.9244 против базы A0 0.8893 и черновика 0.9134. Устойчиво к неравенству n (на общих 29 единицах A1 = A1B 0.9582 против A4 0.9348) и к чтению «прирост» (A1 +0.0494 против A4 +0.0482). Масштаб уточняется тремя пунктами: (а) опровергнута только превосходная степень — вторая половина прогноза («не двигая судейский перевес») держится: A4/A0 у обоих семейств не отличим от нуля (со слов приёмки, +0.15, p=0.6953; свой ре-ран судейского контраста A4/A0 не гонял), и канон-фиксер работает как объявлено, поднимая свой вход A0 с 0.8893 до 0.9375; (б) ни один вердикт фазы от этого не меняется: канон — лексикографический ГЕЙТ П-7 п.1 («не ниже A0 минус допуск»), его проходят все армы кроме A2 (0.8769 < A0), а первичные контрасты итога стоят на судейской оси, и П-7 прямо запрещает короновать A1/A1B по оси, которой их фиксер питался; (в) это не ошибка в сданном тексте, а незакрытое обязательство незавершённого отчёта: заказ :204 требует сверку H-1…H-4 и прогнозов с фактом «включая опровержения», а секций Д1Д8 и сводной таблицы «пробел → чем закрыт → носитель» в 23-editor-tier.md пока нет вовсе. Класс — строка в таблицу калибровки прогнозов; severity как в самой приёмке: мелко."
}
},
{
"title": "Что по букве заказа ИСПОЛНЕНО и проверено пере-раном (перечень, чтобы находки читались на фоне)",
"severity": "мелко",
"evidence": "Армы A0/A1(A1B)/A2/A3/A4 куплены и судятся: A1B 31, A2 31, A3 32, A4 31, A6 16, A6F 16 единиц; A3 (ставка H-2б) на месте. Клетка finish=length в пачку не попала — свой пересчёт: 0 слотов из 1158 несёт текст клетки с finish!=stop. Все армы единицы — в одной пачке (uid в >1 пачке: пусто в обоих проходах). Половины пола судят разные сессии: p1 и p2 никогда не в одной записи agent-runs.json (21 запись), у Sol — 17 журналов codex, где сессия трогает либо p1, либо p2. Идентичность судьи персистится ДО ответа: 92 живых ответа из 92 позже своей записи. Подписи текстов: 1158/1158 sha1 совпали с ключом у обоих семейств. Задания семействам побайтно равны с точностью до пути (0 различающихся из 31). Реестр в git 08-10 07:06 < первой покупки 08-10 22:01. Мощность в пре-реге до покупок (power.py). Прайс DeepSeek пере-снят (00-provider-quirks, R66 OK). Несущий вердикт подписан судьёй вне Claude: ~/sol-d4-work/p{1,2}-answers по 31 файлу, пере-счёт itog_d4.py.",
"consequence": "Механическая часть рига — блайндинг, провенанс, изоляция, журнал сессий, порядок «покупки → эмит → судейство» — держится и воспроизводится мимо харнесса.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": true,
"why": "Пере-ран своими скриптами: из перечня НЕ держится пункт про finish=length, и это не объявленное ограничение.\n\nОПРОВЕРГНУТО (пере-ран). «Клетка finish=length в пачку не попала — 0 слотов из 1158»: у меня 4 слота из 1158. Метод: разобрал все 124 файла заданий (~/sud-d4/p{1,2}-tasks, ~/sol-d4-work/p{1,2}-tasks) по разделителю из 60 «=», взял sha1(текст.strip())[:12], сверил с ключами blind-keys-d4, затем сопоставил каждую подпись с полем finish клетки-первоисточника по индексу sha1 всех ~3600 клеток в ~/books/**/*.json. Итог по армам: A0 stop 120 / length 4, все прочие армы и CTRLfloor — только stop. Виновник один и тот же текст: A0 единицы 41599f30df = /home/ubuntu/books/tenant-panel/tp2-edit-E-deepseek-v4-flash-41599f30df.json (finish=length, completion_tokens=16000, cost 0.015727, 5759 знаков, обрыв на середине фразы «…Дай мне только добраться до тебя»). Он стоит меткой Т6 в пачке p1 6840cb75d6 и в пачке p2 9bcc41ba7f, у обоих семейств. Проверено вызовом кода проекта: contour.base_a0('41599f30df') побайтно равен content этой клетки; среди 31 судимой единицы такая база одна.\nМасштаб на этой единице шире четырёх слотов: CTRLdecoy (5760) и CTRLmargin (5755) сажаются НА этот же оборванный донор, то есть 12 из 22 слотов единицы несут усечённый текст; остальные армы той же пачки — 67647380 знаков.\n\nПричина механическая, найдена чтением кода. eval/dovodka/sud.py:117-131: ветка `if arm == \"A0\": return C.base_a0(uid)` возвращает текст ДО гейта `if d.get(\"finish\") != \"stop\": return \"\"`, который стоит ниже и работает только по файлам C.OUT/dv-*. Самопроверка sud.py:232-237 перебирает ARMS_D4+ARMS_OLD (A0 в списке) через `C.OUT / tag(a,uid)`.exists(), а файлов dv-a-a0-*.json не существует вовсе (ls: No such file) — условие ложно на всех 31 единице, и проверка пуста по построению. Пере-снял селфтест: `.venv/bin/python dovodka/sud.py --selftest` печатает «[OK ] клетка finish=length в пачку не попадает []» и «СУДЕЙСКИЙ ХАРНЕСС ГОДЕН» при живом нарушении.\n\nЗаявленным ограничением это не описано. Норма Д0.6 (23-editor-tier.md:826-828) звучит «ни боевым армом, ни половиной пола», A0 в ключе помечен kind «боевой», и та же норма прямо называет этот класс: «в эксп-22 таких судимых слотов семь… одна в базе всех контрастов (§15 эксп-22)». В 22-tenant-panel.md:1271,1275,1288-1290 эта база названа поимённо — `tp2-edit-E-deepseek-v4-flash-41599f30df`, 5759 знаков. Эррата Э-9 (:948) закрыла только две клетки A4 (41599f30df, f6da9f76b2), базу A0 той же единицы не тронула.\n\nВыводы фазы от этого не меняются — проверил пере-счётом. itog_d4.py воспроизводится один в один. Пере-считал контрасты без единицы 41599f30df (пол, пороги, маржевый гейт и Холм пере-считаны на 30 единицах): claude A1B/A0 3.50 → 3.50 (перешёл), A3/A0 2.16 → 2.20 (перешёл), A6/A0 1.03 → 1.17 (ниже порога 1.54 → 1.65); sol A1B/A0 4.74 → 5.02 (перешёл), A3/A0 3.13 → 3.40 (ниже порога 3.65 → 3.87), A6/A0 0.62 → 1.03 (ниже); маржевый гейт sol не проходит в обоих вариантах (+2.96 против 3.65 и +3.00 против 3.87). Ни один вердикт не переворачивается. Направление смещения: перевес считается как ошибки(A0) ошибки(арма), усечённый A0 набирает ошибок больше, то есть дефект работал В ПОЛЬЗУ контурных армов; отрицательные вердикты по H-2а/H-2б устояли бы и без него.\n\nЧто из перечня подтвердилось моим пере-раном: 1158 слотов и 1158/1158 совпадений sha1 с ключом у обоих семейств; uid ни разу не в двух пачках (p1 31/31, p2 31/31, пересечений нет); задания семействам побайтно равны после нормализации пути — 0 различающихся из 31 в КАЖДОМ проходе (то есть 0 из 62); реестр eval/dovodka/requirements.md в git коммитом da5f4d0 08-10 07:06, первая клетка с ценой 08-10 22:01:17; power.py в том же фриз-коммите; гейт R66 проходит (00-provider-quirks.md:82 содержит «3в. ВАХТА D39.92 ИСПОЛНЕНА ПОВТОРНО 2026-08-10»); ни один судья не встречается в обоих проходах (agent-runs.json: 28 записей = 11 p1 + 10 p2 + 7 adjud, pass_ скаляр); ~/sol-d4-work/p1-answers и p2-answers — по 31 файлу.\n\nТри числа перечня, кроме опровергнутого, воспроизводятся иначе. «A3 32» — 32 клетки куплены, судится 31: dv-a-a3-63ab55ac5c.json на диске есть, а uid 63ab55ac5c отсутствует в обоих ключах (Э-8). «92 живых ответа из 92» — у меня 69 (62 судейских + 7 адъюдикации); в ледджере 84 токена, на диске 84 файла ответов (62 живых + 15 .ANNULLED + 7 adjud), и свойство держится 69/69: каждый живой ответ по mtime позже поля `at` своей записи. «17 журналов codex, где сессия трогает либо p1, либо p2» — 16 журналов трогают ровно один проход (8 и 8), семнадцатый (rollout-2026-08-11T19-03-23-019ff190…) есть КООРДИНАТОР («Сам ничего не судишь», спавнит 16 сессий) и трогает оба каталога; проверил его 37 уникальных команд — по answers только `find` с `-printf` имён и размеров, чтения содержимого нет, так что норма «половины пола судят разные сессии» им не нарушена, но формулировка перечня его описывает неверно.",
"corrected": "Механическая часть рига держится в перечисленном, КРОМЕ нормы Д0.6 о finish=length, и с тремя уточнёнными числами.\n\nНе держится: клетка finish=length в пачку попала — 4 слота из 1158 несут A0 единицы 41599f30df (~/books/tenant-panel/tp2-edit-E-deepseek-v4-flash-41599f30df.json, finish=length, 5759 знаков, обрыв на середине фразы) как метку Т6 в пачках p1/6840cb75d6 и p2/9bcc41ba7f у обоих семейств; на той же единице CTRLdecoy и CTRLmargin сажаются на этот же оборванный донор, итого 12 усечённых слотов из 22. Гейт по построению слеп к A0: sud.py:117-118 возвращает C.base_a0(uid) до проверки finish, а селфтест sud.py:232-237 ищет A0 по несуществующему пути C.OUT/dv-a-a0-*.json и печатает «[OK ] … []». Норма Д0.6 (:826-828) распространяется на боевые армы и сама называет этот класс со ссылкой на §15 эксп-22, где файл поимённо назван «базой всех контрастов»; Э-9 закрыла только две клетки A4, базу A0 той же единицы — нет. Ни один вердикт фазы при выбросе единицы не меняется (claude A1B/A0 3.50→3.50, A3/A0 2.16→2.20, A6/A0 1.03→1.17; sol 4.74→5.02, 3.13→3.40, 0.62→1.03; маржевый гейт sol не проходит в обоих вариантах), и смещение шло в пользу контурных армов, а не A0.\n\nУточнения чисел: A3 — 32 клетки куплены, судится 31 (63ab55ac5c исключён Э-8 и отсутствует в обоих ключах). Идентичность судьи персистится до ответа — 69 живых ответов из 69 (62 судейских + 7 адъюдикации; в ледджере 28 записей и 84 токена против 84 файлов ответов), не 92. У Sol 16 судейских журналов codex трогают ровно один проход каждый, семнадцатый — координатор, который оба каталога ответов только перечисляет `find`, не читая содержимого.\n\nПодтверждено пере-раном без изменений: 1158/1158 совпадений sha1 с ключом у обоих семейств; uid ни разу не в двух пачках; задания семействам побайтно равны с точностью до пути (0 из 31 в каждом проходе); реестр в git 08-10 07:06 < первой покупки 08-10 22:01; power.py в том же фриз-коммите; гейт R66 проходит; ни один судья не в обоих проходах; ~/sol-d4-work/p{1,2}-answers по 31 файлу; itog_d4.py пере-считывается один в один."
}
},
{
"title": "Санкции владельца на потолки $4.50 → $5.40 → $6.15 подтверждаются только текстом сессии",
"severity": "мелко",
"evidence": "money_d.py:9-13 и коммиты 2fed3d0 «Raise the pack ceiling to 6.15 on the owner's sanction», 6faa52f. Заказ :20 называет пакетный потолок $10.00 со сверкой словом владельца при запуске. Первоисточника слова владельца в дереве нет; docs/PROGRESS.md:225 всё ещё говорит «$4.50 … покупок ноль».",
"consequence": "Проверить исполнением нельзя: подъёмы потолка внутри разрешённых заказом $10.00, но основание живёт в сообщениях коммитов, а координационный журнал им противоречит.",
"grounded": "со слов сессии",
"verdict": {
"refuted": false,
"why": "Проверял своими командами. Подтвердилось: `PACK_CEILING = 6.15` (money_d.py:116), обоснование живёт в комментарии money_d.py:104 и в сообщении коммита 2fed3d0; репо-греп `6\\.15` по *.md/*.py/*.json/*.txt даёт только money_d.py:104/116 (и посторонний ajv в frontend/package-lock.json) — вне кода числа нет. Полигон-секция docs/PROGRESS.md обрывается вечером 10.08 и ни одного подъёма 11.08 не несёт. Неточности находки (потому refuted=false, а не true): (1) цепочка неполна — фактически $10.00 (заказ) → $4.00 → $4.50 → $5.40 → $6.00 → $6.15 плюс суб-потолок ФД-A 1.660 → 1.680 (коммит 6faa52f, пакетный не тронут) → 1.950; (2) «только текстом сессии» верно лишь для последних шагов: $4.50 объявлен в пре-реге (23-editor-tier.md:754), $5.40 — в эррате Э-13 секции Д0.11 (:969), $6.00 косвенно в Д0.13 (:1146 «профинансировано внутри $6.00») и в сообщении cf85678; вне доков остаётся только $6.15; (3) «журнал противоречит» — PROGRESS.md:225 это датированный снимок «ИДЁТ (10.08) … Покупок на момент записи ноль», а свежайшая полигон-запись (:196-199, вечер 10.08) даёт «$0.234846 из $4.50»; это устаревание на сутки, а не противоречащее утверждение; (4) «проверить исполнением нельзя» опровергается частично: `money_d.py --report` — потрачено $2.393243 из 6.15 (ФД-A 1.900488/1.95, ФД-F 0.492755/0.72, остальные 0.000), пробоев нет; `--selftest` — 18/18, «КАССА ГОДНА», сумма фазовых потолков 6.10 ≤ 6.15. Суммарная трата ниже ЛЮБОЙ названной цифры, включая первую $4.00, и втрое ниже заказных $10.00; материально использован лишь суб-потолок ФД-A (1.900 > 1.680) — перекладка внутри пакета. Ни один вывод фазы не двигается: выводы стоят на замерах. Дополнительно: шапка самой кассы (money_d.py:9-13, улика находки) объявляет «ПОТОЛОК ФАЗЫ — САНКЦИЯ ВЛАДЕЛЬЦА $5.40», отставая от принуждаемой константы на два шага.",
"corrected": "Из цепочки потолков фазы Д ($10.00 заказ → $4.00 → $4.50 → $5.40 → $6.00 → $6.15, плюс суб-потолок ФД-A 1.660 → 1.680 → 1.950) в пре-реге/эрратах объявлены только $4.50 (23-editor-tier.md:754) и $5.40 (Э-13, Д0.11, :969); $6.00 упомянут в Д0.13 косвенно (:1146) и в сообщении коммита cf85678, а действующий $6.15 существует ТОЛЬКО в money_d.py:104/116 и в сообщении коммита 2fed3d0 — ни в пре-реге, ни в журнале его нет. Полигон-секция docs/PROGRESS.md обрывается записью вечера 10.08 ($0.234846 из $4.50) и подъёмов 11.08 не несёт: это устаревание датированного снимка, а не противоречие. Шапка кассы (money_d.py:9-13) отстала на два шага — объявляет $5.40 при принуждаемой константе 6.15. Проверка исполнением возможна и проведена: `money_d.py --report` — потрачено $2.393243 из $6.15 без пробоев (ФД-A 1.900488/1.95, ФД-F 0.492755/0.72, прочие 0.000); `--selftest` 18/18 зелёный, сумма фазовых потолков 6.10 ≤ 6.15. Суммарная трата ниже даже первой санкции $4.00 и втрое ниже заказных $10.00; материально сработал лишь суб-потолок ФД-A (1.900 > 1.680) — перекладка внутри пакета. Дефект документарный (последний подъём и его основание не доехали ни до пре-рега, ни до координационного журнала, ни до шапки кассы); ни один вывод фазы он не меняет."
}
},
{
"title": "Порог различимости считается по n шумового пола (15), а не по n самого контраста (31/27) — два напечатанных вердикта переворачиваются",
"severity": "критично",
"evidence": "eval/dovodka/itog_d4.py:173 `thr = 2.8 * sd / (n_pairs ** 0.5)`, где n_pairs = число пар пола = 15. Унаследованное правило рига: absjudge.py:668-682 «Порог кладёт стандартная ошибка СРЕДНЕГО, то есть sd/√n, и парный дизайн именно этим и полезен» — n там равно числу парных наблюдений ТОГО контраста, который тестируют (в эксп-23 пол и бой имели одинаковое n, и подмена была невидима; фаза Д развела половины пола по двум проходам и n стало 15 против 31). Мой пере-счёт: Sol A3/A0 перевес 3.129 при n=31 → порог по своему n = 2.8·5.053/√31 = 2.541 (напечатан 3.653); маржевый декой Sol +2.963 при n=27 → порог 2.8·5.053/√27 = 2.723 (напечатан 3.653). Claude ни один вердикт не меняет (1.074/1.494 против 1.543).",
"consequence": "Меняются две строки вывода фазы. (1) «A3/A0 ... → ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ — порог перешло только семейство claude» становится «CONFIRM — оба перешли свой порог в одну сторону»: несущий вердикт по главной ставке владельца H-2б (смысловой edit-контур ХУЖЕ переписа на 2.23.1 ошибки) выносится обоими семействами, а не одним, и адъюдикация ~/adjud-d4 под него не нужна. (2) Строка «⛔ НЕ ПРОЙДЕН ⇒ семейство НЕ имеет права говорить «не хуже» ... понижаются до ОПИСАТЕЛЬНЫХ (П-2)» исчезает: Sol гейт чувствительности проходит.",
"grounded": "проверено исполнением",
"verdict": {
"corrected": "Что выживает от находки (масштаб исправлен): itog_d4.py:173 действительно берёт n шумового пола (15), а не n контраста (31/27) — и это ЕДИНАЯ конвенция рига, а не подмена: absjudge.py:673, solscore.py:104, verify23.py:151, axiscal.py:218 все делят на len(flo). Реальная находка — не «унаследованное правило нарушено», а ВНУТРЕННЕЕ ПРОТИВОРЕЧИЕ ДВУХ ПРЕ-РЕГИСТРИРОВАННЫХ АРТЕФАКТОВ: Д0.3/power.py считает MDE поконтрастно (CONTRAST_N 31/31/16, power.py:82-95) и сам пишет «то же правило, по которому риг печатает порог» (power.py:12-14), тогда как Д0.7/Д0.12 объявляют ОДИН порог на семейство из его пола (3.53 для Sol), и П-1/П-2 ключуются на «СВОЙ порог» семейства. Это расхождение стоит объявить в теле фазы. НО НИ ОДИН НАПЕЧАТАННЫЙ ВЕРДИКТ ОТ ЭТОГО НЕ ПЕРЕВОРАЧИВАЕТСЯ: по единственной поконтрастной машинке, которая у фазы пре-регистрирована (power.mde, множитель Холма вместо плоского 2.8 — power.py:151-163), Sol A3/A0 3.129 при n=31 ниже своего MDE 3.231 (k=3) / 3.460 (k=5), то есть строка «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ» по H-2б устаивает; маржевый гейт Sol +2.963 проходит или не проходит в зависимости от выборов, сделанных ПОСЛЕ вскрытия (2.915 при n=27 без ×1.23 → проходит на 0.05; 3.585 с ×1.23 → не проходит; 2.061 при n=54, как их и собирает код, → проходит). Плюс: демоция П-2 снимает право говорить «не хуже», а Sol по A1B/A3 говорит «хуже» (4.74/3.13), то есть живой претензии эта строка не покрывает.",
"refuted": true,
"why": "Арифметика находки воспроизведена точно (мой пере-счёт через itog_d4.read_family/floor_sd/margins: Sol пол n=15 sd=5.0526 → 3.6528; A3/A0 3.1290 n=31 → 2.8·sd/√31=2.5409; маржевый +2.9630 n=27 → 2.7227; Claude 1.0739/1.4948 против 1.5438). Опровергнуты ДВА несущих звена. (1) ГРУНТ ПРОВЕНАНСА ЛОЖЕН. Правило рига нигде не берёт n контраста: absjudge.py:673 `se = sd / len(flo)**0.5`, и так же solscore.py:104, verify23.py:151, axiscal.py:218 — все четыре делят на n ПОЛА. И утверждение «в эксп-23 пол и бой имели одинаковое n, подмена была невидима» опровергнуто исполнением: `eval/.venv/bin/python eval/editor_tier/solscore.py` печатает `ПОЛ n=16 sd=5.05 → ПОРОГ 3.53` при `R2 vs R0 n=32`, а мой прогон absjudge._by_unit() по обоим проходам даёт `border: единиц 32 · ПОЛ n=16 sd=2.121 → порог 1.485` при контрасте n=32. То есть расхождение n пола и n контраста существовало в эксп-23, было НАПЕЧАТАНО в отчёте числами 1.48 и 3.53, и именно 3.53 пре-рег Д0.7 (23-editor-tier.md:840-852) и Д0.12 (:1003-1008) объявил порогом Sol ДО первого ответа фазы — как аргумент о грубости прибора. Кроме того n пола=15 — свойство дизайна, а не потери данных: CTRLfloor посажен на 16 единиц, у 15 есть обе половины (мой подсчёт по read_family). (2) ПОСЛЕДСТВИЕ НЕ УСТАНОВЛЕНО. Переворот держится ровно на плоском множителе 2.8, который сам пре-рег объявил дефектом: power.py:151-163 применяет множитель с поправкой Холма и записывает, что применение 2.8 при k>1 «переворачивало вердикт» и снято адверсариальным ревью. Мой прогон power.mde(5.0526, 31, k) даёт 3.231 при k=3 и 3.460 при k=5 (без ×1.23) — Sol A3/A0 3.129 НИЖЕ своего поконтрастного MDE, строка «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ» по главной ставке H-2б не меняется. Маржевый гейт: 2.963 против 2.915 (k=1, n=27) — 0.05 запаса; против 3.585 (с ×1.23) не проходит; против 2.061 (n=54, ровно те наблюдения, что собирает control()) проходит — то есть вторая строка зависит от выборов, сделанных после вскрытия слепоты, а не от одного «правильного n». Наконец, пере-счёт порога после чтения боевых перевесов прямо запрещён законом фазы (itog_d4.py:22-24; промт заказа :183; Д0.13 «Пороги … объявлены ЗДЕСЬ и потом не меняются»), а adjud.py --score (мой прогон: A3 85%, A0 73% → условие ≥80% не выполнено) показывает, что переворот менял бы существо вывода, а не оформление."
}
},
{
"title": "Шумовой пол меряет межсессионную компоненту, которой в боевом контрасте нет по построению — порог завышен, и собственный гейт честности пола не гоняется",
"severity": "важно",
"evidence": "Все армы единицы лежат в ОДНОЙ пачке одной сессии (sud.py:20-21, ключ: 711 меток на задание), поэтому контраст A3A0 берётся внутри одной сессии; а пол — половина из p1 против половины из p2, т.е. между сессиями (sud.py:15-21, itog_d4.py:118-125). Мой замер систематики: средний сдвиг p1p2 по боевым армам +1.587 ошибки (Claude, n=31 единиц, sd 2.389); среднее пары пола +1.800 при знаковом тесте p=0.0061. Прямой замер внутрисессионного судейского шума на побайтно одинаковых вариантах (18 пар, sig совпадает: A1≡A1B и A0≡A4): Claude sd 0.000, 18/18 нулей; Sol sd 1.42, 16/18 нулей — против sd пола 2.14 и 5.05, из которых считается порог. Отдельно: унаследованный риг на этом же поле печатает ВЕРДИКТ `ok = BO.sign_perm_p(flo) >= 0.05` → «⛔ ПОЛ СМЕЩЁН: ноль ВНЕ интервала, боевые числа снимаются» (absjudge.py:678-681); itog_d4.py этого шага не делает вовсе, а у Claude p=0.0061 < 0.05.",
"consequence": "Порог у обоих семейств завышен: он несёт дисперсию строгости между сессиями, которая в каждом контрасте вычитается. Направление ошибки — фаза прозёвывает реальные различия, а не выдумывает их; конкретно на этом завышении держится «ниже порога» у Sol A3/A0. Плюс: гейт пола унаследованного рига, если бы его прогнали, снял бы боевые числа семейства Claude до чтения перевесов.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Опровергнуть не удалось: механизм воспроизведён и измерен своими прогонами. Структура подтверждена по сырью: `~/books/dovodka/blind-keys-d4/d4p1-KEY.json` — 32 задания по 711 меток, одно задание = одна единица со ВСЕМИ армами + CTRLfloor + CTRLdecoy (пример: {Т1:A6, Т2:A2, Т3:A6F, Т4:CTRLfloor, Т5:CTRLdecoy, Т6:A3, Т7:A1, Т8:A1B, Т9:A4, Т10:A0}), то есть контраст внутрипачечный, а пол (itog_d4.py:117-125) — p1 против p2. Числа находки сходятся: Claude пол n=15 mean +1.800 pstdev 2.135 sign_perm_p 0.0061; сдвиг p1p2 по боевым армам n=31 mean +1.587 sd(выб) 2.389; близнецы (побайтно равные A1≡A1B, A0≡A4 в одной пачке) 18 пар — Claude 18/18 нулей sd 0.000, Sol 16/18, pstdev 1.380 (выборочная 1.420 = число находки). Замер компоненты: одиночная метка, ПОБАЙТНО тот же текст, p1p2 — Claude sd 2.777 (n=216), Sol sd 6.055. Снятие сдвига набора с пола: Claude 2.135→1.301 (порог 1.54→0.94), Sol 5.053→1.754 (3.65→1.27); сдвигом объяснено 63% дисперсии пола у Claude и 88% у Sol. Что компонента вычитается в контрасте — проверено прямо: перевес, посчитанный ВНУТРИ p1 и внутри p2, совпадает (Sol A3/A0 3.16 против 3.10; Claude A3/A0 2.45 против 1.87; Claude A6/A0 1.00 против 1.06) при том, что тот же прибор на тех же текстах даёт межсетевой разброс sd 6.06. Объявленным ограничением это не является: Д0.6 (23-editor-tier.md:815-820), нормы Д0.13 (:1030), sud.py:15-21 и power.py:15-17,32,41 трактуют межсессионную компоненту как обязанность порога и нигде не отмечают, что во внутрипачечном контрасте она отсутствует; §12б (:553-559) мерил межсессионную дисперсию ПЕРЕВЕСОВ (sd 1.030, ×1.23) — другая и много меньшая величина. Гейт пола в itog_d4.py действительно не гоняется (знаковый тест применён только к первичным контрастам, :208).",
"corrected": "Находка верна по направлению; уточняется масштаб и последняя фраза. (1) Размер завышения замерен: снятие замеренного сдвига набора даёт пол 2.135→1.301 у Claude (порог 1.54→0.94) и 5.053→1.754 у Sol (3.65→1.27); сдвигом объяснено 63% и 88% дисперсии пола соответственно. (2) Последствие шире, чем «ниже порога у Sol A3/A0»: при пороге без межсетевой компоненты двигаются ТРИ пре-регистрированных исхода — гейт чувствительности Sol (маржевый декой +2.96: НЕ ПРОЙДЕН против 3.65 → ПРОЙДЕН против 1.27, снимается понижение П-2), Sol A3/A0 (3.13: эскалация к адъюдикации → CONFIRM) и Claude A6/A0, носитель H-1 (1.03 при p Холма 0.0367: «ниже порога» → перешёл). (3) Клауза про унаследованный гейт арифметически верна (p=0.0061 < 0.05), но нормативно не переносится: absjudge.py:662-663 строит пол из CTRLfloorA/CTRLfloorB ВНУТРИ одной пачки, где ненулевое среднее = систематика, а Д4 выпускает одну метку CTRLfloor и данных этому гейту не даёт вовсе — он неприменим, а не просто не запущен; вдобавок после снятия замеренного сдвига среднее пола Claude +0.183 (sign_perm_p 0.6188), тогда как у Sol остаток +1.442 (0.0080), то есть остаточная смещённость — у Sol, а не у Claude. Строки гейта — absjudge.py:681-684, а не 678-681; sd близнецов Sol 1.42 — выборочная (pstdev 1.380)."
}
},
{
"title": "Sol не поймал грубый декой на пачке 5624d69feb — норма требует аннулировать пачку, код только печатает «61/62»",
"severity": "важно",
"evidence": "Мой пере-счёт: единица debb2c1aef, проход p1, задание 5624d69feb — CTRLdecoy получил на 3 ошибки МЕНЬШЕ своего донора A0 (перевес 3 в конвенции «декой хуже = плюс»). Норма пре-рега: 23-editor-tier.md:816 «Декой в каждой пачке; сессия, не поймавшая его отрицательным знаком, аннулируется целиком» и :1023 «семейство, не поймавшее декой ... аннулируется на этой пачке целиком». itog_d4.py:183-186 считает `ok = sum(1 for x in coarse if x > 0)` и печатает «пойман 61/62», ветки отбрасывания пачки в файле нет.",
"consequence": "Пачка, которую пре-рег объявляет негодной, остаётся во всех числах Sol. Величина смещения мала: A1B/A0 4.742 → 4.726, A3/A0 3.129 → 3.113, A6/A0 без изменений; вердикты не двигаются. Но механизация нормы отсутствует, и при большем числе промахов декоя это не всплывёт.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Пере-считал сам, находка подтверждается, но её оценка последствия («смещение мало, вердикты не двигаются») верна лишь при ОДНОМ из двух прочтений нормы, и не при том, которое находка сама цитирует.\n\nЧТО ПОДТВЕРДИЛОСЬ ИСПОЛНЕНИЕМ.\n1. Промах декоя есть и он ровно один. Скрипт на базе itog_d4.read_family по семейству sol: `ПРОМАХ uid=debb2c1aef p1 decoy_carry=16 a0_carry=19 перевес=-3.0`, всего пар декой/донор 62, промахов 1; у claude 0/62. Первоисточник: ~/sol-d4-work/p1-answers/5624d69feb.txt:37-46 — Т7-ВЕРНОСТЬ 5, Т7-ЯЗЫК 11 (carry 16); Т8-ВЕРНОСТЬ 9, Т8-ЯЗЫК 10 (carry 19). Ключ ~/books/dovodka/blind-keys-d4/d4p1-KEY.json: 5624d69feb Т7 = {'arm':'CTRLdecoy','uid':'debb2c1aef','decoy_from':'A0'}, Т8 = A0. Знак и конвенция сходятся: control() = carry(декой) carry(A0), «пойман» = x>0.\n2. Кода отбрасывания нет. `eval/.venv/bin/python eval/dovodka/itog_d4.py` печатает «СЕМЕЙСТВО SOL … 2. ГРУБЫЙ декой … пойман 61/62» и идёт дальше к контрастам. `grep -n CTRLdecoy eval/dovodka/*.py` → только itog_d4.py:76 и :174; ни в adjud.py, ни в spanjoin.py, ни в paritet.py/plan.py/runs.py грубый декой не гейтит (adjud.py:24 упоминает норму только в докстринге). Единственный механизм аннулирования — ручное переименование файла ответа (пропуск `.ANNULLED` в itog_d4.py:89, adjud.py:96, spanjoin.py:82). При этом докстринг itog_d4.py:16 объявляет шаг «4. ГРУБЫЙ ДЕКОЙ. Не пойман — пачка аннулируется целиком (норма Д0.6)», которого в теле файла нет.\n3. Как объявленное ограничение это нигде не описано: `grep -rn \"61/62\" docs/ eval/` пусто; в Д0.11 (23-editor-tier.md:898+) и Д0.13 (:1055+) пункта о немеханизированном аннулировании нет.\n4. Числа последствия находки воспроизводятся точно. Удаление 8 меток пачки 5624d69feb из счёта sol: A1B/A0 4.7419 → 4.7258, A3/A0 3.1290 → 3.1129, A6/A0 0.6250 без изменений; порог 3.653 не меняется (пола в этой пачке нет), маржевый гейт 2.963 → 3.057, всё равно НЕ ПРОЙДЕН. Вердикты при пачечном прочтении действительно не двигаются.\n5. Контр-гипотезу «норма применялась вручную» проверил: в семействе claude 15 файлов `.ANNULLED` (7 в p1, 8 в p2, те же стемы пере-судились), но пере-счёт по ним даёт перевес декоя +2…+5 во ВСЕХ пятнадцати — аннулировали их по другой причине. Единственная пачка, которая норму по декою реально включает, не аннулирована.\n\nГДЕ НАХОДКА НЕ ДОТЯГИВАЕТ. Она цитирует 23-editor-tier.md:816 «сессия, не поймавшая его отрицательным знаком, аннулируется целиком» (та же формулировка — слово владельца в заказе, docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md:158), а считает последствие по ПАЧКЕ (:1023, :1070). Сессия — 4 пачки: eval/dovodka/sessii.py:29 `PER_SESSION = 4`, и транскрипт ~/.codex/sessions/2026/08/11/rollout-2026-08-11T19-09-39-019ff196-….jsonl называет ровно 455acfd07a, 464548150d, 4896f07774, 5624d69feb. Пере-счёт с удалением этой сессии (34 метки, только sol/p1): пол n 15→14, sd 5.053→3.159, порог 3.653→2.364; маржевый гейт +2.963 «НЕ ПРОЙДЕН» → +3.039 «ПРОЙДЕН» (Sol возвращает себе право говорить «не хуже», П-2 больше не понижает его до описательного); A3/A0 2.9355, p 0.00010, p Холма 0.00020 → ПЕРЕШЁЛ ПОРОГ, то есть H-2б по правилу П-1 переходит из «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ (перешло только claude)» в «CONFIRM — оба семейства». A1B/A0 остаётся перешедшим (4.5968), A6/A0 ниже порога (0.7188). Причина сдвига названа числом: вместе с сессией уходит половина пары пола uid 2484f16eac (p1 carry 30 против p2 13, дельта 17) из пачки 464548150d той же сессии — она и держала sd 5.05.",
"corrected": "Норма аннулирования по грубому декою не механизирована: itog_d4.py:183-186 считает `ok = sum(1 for x in coarse if x > 0)`, печатает «пойман 61/62» и продолжает; ветки отбрасывания нет ни в одном скрипте eval/dovodka (grep CTRLdecoy → только itog_d4.py:76,174), доступно лишь ручное переименование в `.ANNULLED`. Сработавший случай — семейство sol, проход p1, пачка 5624d69feb (uid debb2c1aef): CTRLdecoy carry 16 против донора A0 19, перевес 3.0 (~/sol-d4-work/p1-answers/5624d69feb.txt:37-46). Пачка осталась во всех числах Sol.\n\nМасштаб зависит от прочтения нормы, и оба прочтения живут в источниках:\n· ПАЧЕЧНОЕ (Д0.12 :1023, эррата Д0.13 П-1 :1070 «его пачка аннулируется») — смещение мало: A1B/A0 4.742→4.726, A3/A0 3.129→3.113, A6/A0 без изменений, порог 3.653 и маржевый гейт «НЕ ПРОЙДЕН» не меняются, вердикты те же.\n· СЕССИОННОЕ (Д0.6 :816 и заказ владельца PROMPT:158 «сессия … аннулируется целиком»; сессия = 4 пачки, sessii.py:29, состав подтверждён транскриптом rollout-2026-08-11T19-09-39: 455acfd07a, 464548150d, 4896f07774, 5624d69feb) — вердикты ДВИГАЮТСЯ: пол sol n 15→14, sd 5.053→3.159, порог 3.653→2.364; маржевый гейт П-2 +2.963 НЕ ПРОЙДЕН → +3.039 ПРОЙДЕН; A3/A0 2.9355 при p Холма 0.00020 переходит порог, и H-2б по правилу П-1 идёт из «эскалация к адъюдикации» в «CONFIRM обоими семействами». Двигатель — уходящая вместе с сессией половина пары пола uid 2484f16eac (дельта 17), державшая sd 5.05.\n\nТо есть дефект не только в отсутствии механизации: под неразрешённой двусмысленностью «сессия против пачки» лежит несовпадающий вердикт по главной ставке владельца, и выбор прочтения делается сейчас, уже видя боевые числа, — чего пре-рег запрещает. Ручной механизм при этом существует и применялся 15 раз в семействе claude, но все 15 аннулированных пачек декой ПОЙМАЛИ (перевес +2…+5), а единственная пачка, включающая норму, не аннулирована."
}
},
{
"title": "Два пре-рег-правила о маржевом гейте противоречат друг другу, код исполняет мягкое — и на этом стоит единственный CONFIRM фазы",
"severity": "важно",
"evidence": "docs/experiments/23-editor-tier.md:1070 (таблица П-1): «семейство не поймало декой ЛИБО не прошло маржевый контроль (П-2) | его пачка аннулируется». Там же :1084-1086 (тело П-2): «не имеет права выдавать «не хуже» при этой марже — его вердикт по H-2а/H-2б понижается до описательного». itog_d4.py:190-194 реализует второе, после чего Sol участвует в правиле расхождения на общих правах (itog_d4.py:221-240) и даёт «A1B/A0 ... CONFIRM — оба перешли свой порог в одну сторону».",
"consequence": "Если читать П-1 буквально (аннулировать пачку Sol, провалившего маржевый гейт), то по A1B/A0 остаётся одно семейство и вердикт становится «ЭСКАЛАЦИЯ К АДЪЮДИКАЦИИ», а не CONFIRM — то есть единственный CONFIRM фазы держится на том, какое из двух пре-регистрированных правил выбрал код. Выбор в отчёте не объявлен как девиация.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Опровергнуть не удалось в части текстового расхождения, но механизм и масштаб находкой описаны неверно. Что я выполнил сам.\n\n1) Пере-ран `eval/.venv/bin/python eval/dovodka/itog_d4.py`: sol — маржевый декой n=54 среднее +2.96 против своего порога 3.65 → НЕ ПРОЙДЕН; A1B/A0 claude 3.50 · sol 4.74 → «CONFIRM»; A3/A0 → эскалация; A6/A0 → не подтверждено. Судейство фазы существует только на оси Д4 (в `~` есть только `sud-d4`, `sol-d4-work`, `adjud-d4`), так что «единственный CONFIRM фазы» подтверждаю.\n\n2) Расхождение текстов реально и нигде не сведено: 23-editor-tier.md:1070 (ремедия «его пачка аннулируется») против :1085-1087 (ремедия «понижается до описательного»). Грепы по «П-2», «маржев», «аннулир» по всему репо дают только :1070, :1079, :1128 — ни в Д0.11 (:898-983), ни в остальной Д0.13 сведения нет.\n\n3) «Код исполняет мягкое правило» — неверно. itog_d4.py:189-194 только ПЕЧАТАЕТ понижение; в комбинацию П-1 Sol заходит без всякого условия (:218 `verdict[(name,a)]=...` вне гейта, :231 CONFIRM). Буквальное исполнение П-2 («его вердикт по H-2а/H-2б понижается до описательного») дало бы ровно ту же эскалацию, что и П-1. Код не исполняет НИ ОДНО из двух правил: печатает одно, применяет ноль.\n\n4) «Пачка» в пре-реге — единица аннулирования per-batch (:816, :1023), а маржевый декой лежит по клеткам: у Sol 54 клетки, отрицательным знаком не пойман в 1; грубый декой не пойман в пачке ('debb2c1aef', p1). Пере-считал сам, выбросив эту пачку: A1B/A0 sol = 4.73, p=0.0000 — CONFIRM стоит. Ярлык переворачивает только семейно-широкое прочтение «аннулируется», не буквальное per-batch.\n\n5) Направление CONFIRM. `carry` — счёт ОШИБОК (judge-prompts/core.md:26 «твоя задача — СЧЁТ ОШИБОК»; CTRLdecoy даёт +3.0 против донора, itog_d4.py:184-186), значит 3.50/4.74 = A1B ХУЖЕ A0, то есть CONFIRM опровергает H-2а, а не выдаёт «не хуже». П-2 снимает право именно на «не хуже» (:1085-1086) и обоснован риском ложного «не хуже» (:1089). При этом Sol на A1B перешёл СВОЙ порог (|4.74| > 3.65), а маржевый декой видит с +2.96 при SE 0.176 (n=54, мой пере-счёт): порог 3.65 = 2.8·5.05/√15 построен на n=15, при n=54 та же формула даёт 1.93 и Sol проходит.\n\n6) Ни один вывод об армах не переворачивается. По пре-рег-правилу Д0.4 (:786-791) одно семейство claude даёт 95% ДИ A1B/A0 [4.46, 2.54] (мой счёт по margins() + t), верхняя граница ниже 1.50 → «ХУЖЕ, H-2а опровергнута» без всякого Sol. Меняется только сила строки: при семейно-широком аннулировании она стала бы «эскалация», а материала для неё нет — adjud.py:65 `ARMS=(\"A3\",\"A0\")`, и мой ре-ран `adjud.py --score` (рабочее дерево, файл модифицирован) даёт A3 85% / A0 73% → условие ≥80% НЕ выполнено.\n\n7) Клейм «выбор в отчёте не объявлен как девиация» проверить нечем: в закоммиченном 23-editor-tier.md секций результатов Д1Д8 нет вовсе — последний заголовок Д0.13 (:1052), файл кончается на 1151.",
"corrected": "Исправленная формулировка. В Д0.13 ремедия маржевого гейта задана дважды и по-разному: таблица П-1 (:1070) приписывает СЕМЕЙНОМУ по построению гейту пачечную ремедию «его пачка аннулируется», тело П-2 (:1085-1087) — понижение вердиктов по H-2а/H-2б до описательных. Сведения нет ни в Д0.11, ни в Д0.13. Код не «выбрал мягкое»: itog_d4.py:189-194 печатает понижение П-2, но применяет его к нулю — Sol входит в комбинацию П-1 на общих правах (:218, :231), так что в одном выводе одновременно стоят «вердикты Sol по H-2а/H-2б описательные» и CONFIRM, опирающийся на вердикт Sol.\n\nМасштаб последствия меньше заявленного, в трёх местах. (а) Ярлык A1B/A0 переворачивается только при семейно-широком прочтении «аннулируется»; при буквальном пачечном (как слово «пачка» употреблено в :816 и :1023, а маржевый декой у Sol не пойман в 1 клетке из 54) sol A1B/A0 = 4.73, p=0.0000 — CONFIRM стоит. (б) CONFIRM здесь отрицательный: 3.50/4.74 в счёте ошибок = A1B ХУЖЕ A0, то есть H-2а опровергнута, тогда как и П-1, и П-2 сторожат ложное «не хуже» (:1085-1086, :1089); при этом Sol перешёл собственный порог (4.74 > 3.65), а его провал гейта — свойство n в пороге (2.8·5.05/√15 = 3.65 против 2.8·5.05/√54 = 1.93 при замеренных +2.96, SE 0.176). (в) Вывод об H-2а не меняется ни в одном прочтении: по пре-рег-правилу Д0.4 семейство claude в одиночку даёт ДИ [4.46, 2.54], верхняя граница ниже маржи 1.50 → «ХУЖЕ». Настоящий дефект, который остаётся: ремедия семейного гейта в П-1 не определена (пачечная формулировка к семейной статистике неприменима), и код это разрешает не выбором правила, а неисполнением обоих — что должно быть объявлено при печати вердикта; кроме того, ни грубо-декойное аннулирование (пачка sol 'debb2c1aef'/p1), ни понижение П-2 в коде не механизированы, хотя докстринг itog_d4.py:16 обещает первое."
}
},
{
"title": "Журнал карантина расходится с деревом: не объявлена четвёртая нарушившая сессия, и одна пачка объявленной сессии в карантин не отправлена",
"severity": "важно",
"evidence": "~/sud-d4/annulled.txt называет три сессии (p1-session-03, p1-session-04, p2-session-02) и «файлов отправлено в карантин: 11». В дереве 15 файлов *.ANNULLED.txt (7 в p1-answers, 8 в p2-answers). Лишние четыре — 9c1f7dd03e, a22cc51b51, acd4fdce1c, ad6cff5902 (p2-session-06). Её транскрипт agent-ac15f71bb9a7c8428.jsonl содержит команду `... && cd task9c && for a in 1 3 6; do echo \"=== T$a vs T8 ===\"; diff <(fold -w80 -s Т$a.txt) <(fold -w80 -s Т8.txt)`, то есть тот же класс нарушения; в журнале сессии нет. Обратно: p1-session-04 объявлена нарушившей, но её пачка 69de717f3f (единица ef9cd38ec4) в карантин не отправлена и участвует в числах — её difflib-команды в agent-ad00dbe7471469543.jsonl касаются только 61e2c09c91, 63aad20593, 6840cb75d6.",
"consequence": "Артефакт-носитель дисциплины судейства (annulled.txt), на который будет ссылаться отчёт, недосчитывает одну сессию и четыре файла. Влияние удержанной пачки на числа: Claude A1B/A0 3.500 → 3.532, A3/A0 2.161 → 2.210, A6/A0 без изменений — вердикты не двигаются.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Не опровергнута: все элементы воспроизвелись моим исполнением. (1) Дерево: 15 файлов *.ANNULLED.txt (7 в p1-answers, 8 в p2-answers) против «11» и трёх сессий в ~/sud-d4/annulled.txt. (2) `eval/.venv/bin/python eval/dovodka/sessii.py` воспроизводит раскладку: p2-session-06 = 9c1f7dd03e a22cc51b51 acd4fdce1c ad6cff5902 — все четыре в карантине; `grep -rn` по имени сессии и всем четырём токенам в docs/, eval/ и annulled.txt даёт ноль хитов, то есть сессия действительно не объявлена. (3) p1-session-04 = 61e2c09c91 63aad20593 6840cb75d6 69de717f3f, у последней пачки .ANNULLED-двойника нет. (4) Мой собственный детектор (не по следу отчёта: прогон по всем 197 транскриптам ~/.claude/projects/-home-ubuntu-projects-textmachine/*/subagents/, поиск команд, связывающих варианты) находит ровно четыре нарушившие сессии и ни одной пятой: p1-s03 cross=12, p1-s04 cross=9, p2-s02 cross=7, p2-s06 cross=8. (5) Числа сошлись до четвёртого знака: A1B/A0 3.5000 → 3.5323, A3/A0 2.1613 → 2.2097, A6/A0 1.0312 без изменений; базовые числа сверены прогоном `itog_d4.py`. (6) В пре-реге/эрратах это не объявлено: Д0.13 П-3 (docs/experiments/23-editor-tier.md:1091) объявляет только греп-аудит на запрещённые ПУТИ (blind-keys/, dv-*) и обязательное сохранение транскриптов, про расхождение журнала с деревом там ничего нет. Направление находки верное, но масштаб требует трёх поправок — см. corrected.",
"corrected": "Журнал карантина ~/sud-d4/annulled.txt недосчитывает одну нарушившую сессию (p2-session-06, 4 файла); дефект документационный и на числа фазы не влияет.\n\nПоправка 1 — «11» не арифметическая ошибка. 4 (p1-s03) + 3 (p1-s04) + 4 (p2-s02) = 11 ровно. Число внутренне согласовано с собственной трёх-сессионной областью журнала и с удержанной пачкой. Весь разрыв 1511 — это одна p2-session-06. Формулировка «недосчитывает одну сессию И четыре файла» читается как два независимых просчёта; фактически это один пропуск плюс НЕОБЪЯВЛЕННОЕ правило гранулярности: карантин применён по-пачечно по улике, а не по-сессионно, и журнал этого правила не формулирует (иначе у p1-session-04 было бы 4 файла, а не 3).\n\nПоправка 2 — процесс отработал все четыре сессии, недообъявлена только проза. Найдены транскрипты пере-суда: agent-ad9db370bda6d3f6c.jsonl чисто пере-судит четыре пачки p2-session-06, agent-a185c8af17c79fbdd.jsonl пере-судит ровно три пачки p1-session-04. Все потребляющие скрипты фильтруют по имени файла .ANNULLED (eval/dovodka/itog_d4.py:89, adjud.py:96, spanjoin.py:82), а `grep -rl 'annulled.txt' eval/` даёт 0 файлов — журнал не читается ни одним куском кода. Значит ни одно посчитанное число этим расхождением не заражено; риск — только в том, что отчёт сошлётся на артефакт, недоговаривающий про четвёртую сессию.\n\nПоправка 3 — последствие описано неполно. Удержание пачки 69de717f3f двигает не только три контраста, но и ПОЛ, к которому привязаны все вердикты: n 15→14, sd 2.135→2.210, порог различимости 1.544→1.654. Находка перечисляет только перевесы. Проверено, что вывод всё равно устоял: маржевый декой +2.57 против нового порога 1.654 — ПРОЙДЕН; A6/A0 1.031 по-прежнему ниже порога; грубый декой 61/61. То есть «вердикты не двигаются» верно, но по причине, которую находка не проверяла."
}
},
{
"title": "Клетки A4 и A1B оплачены при нулевом изменении текста — фиксер не исполнил ни одного указанного места",
"severity": "важно",
"evidence": "sig в ключе = sha1(content)[:12] (absjudge.py:230; сверил сам на 31 клетке A4 — 31/31). Совпадение sig: A4 ≡ A0 на 4 единицах из 31, из них три оплачены при заявленных местах — b2a7464dbd $0.006296 мест 1, debb2c1aef $0.012642 мест 2, fb9ed5709e $0.006509 мест 1 (четвёртая, 474f822806, честно free=True, мест 0). Сумма $0.025447 при общей цене арма A4 $0.2545. A1B ≡ A1 на 5 единицах: fb9ed5709e, 6df3dd3eb6, 13c5f52fa3, 53e0f3d653, de3916de62 — суммарно $0.028788, причём A1B на них объявляет БОЛЬШЕ мест, чем A1 (2 против 1 и т.д.).",
"consequence": "10% сметы арма A4 куплено вхолостую, и это прямой замер к П-9 («исполняемость печатается рядом с судейским числом», заявленный потолок фиксера 46%): на этих единицах исполнено 0 из 12 указаний. Контраст A4/A0 (0.11 у Claude) на 4 единицах из 31 нулевой по построению, а не по замеру. Контроль «близнец» унаследованного рига (absjudge.py:687-696), который это печатает штатно, itog_d4.py не гоняет.",
"grounded": "проверено исполнением",
"verdict": {
"corrected": "ИСПРАВЛЕННАЯ ФОРМУЛИРОВКА (масштаб и адресация правятся, ядро остаётся)\n\n1. A4 — подтверждено полностью и моим счётом. 4 клетки из 31 побайтно равны своему входу base_a0; 3 оплачены: b2a7464dbd $0.006296 (places=1, finish=stop, completion 5175 tok), debb2c1aef $0.012642 (places=2, completion 12349), fb9ed5709e $0.006509 (places=1, completion 5314); четвёртая 474f822806 free=True places=0. Сумма $0.025447 при сумме арма по 31 судимой клетке $0.254500 → ровно 10.0% (по ВСЕМ 34 файлам a4, включая две .LENGTH и одну .ERROR, $0.286136 → 8.9%). Модель отдала полный текст и вернула вход без единой правки.\n\n2. A1B — улика подменена. Пара «A1B ≡ A1 на 5 единицах, $0.028788» воспроизводится точно (fb9ed5709e, 6df3dd3eb6, 13c5f52fa3, 53e0f3d653, de3916de62), но это близнец МЕЖДУ АРМАМИ, а не нулевое изменение: против своей базы (черновика) совпадает только 53e0f3d653; на остальных четырёх фиксер текст менял — len(draft)→len(out): 7287→7332, 7805→7810, 7064→7087, 7624→7629. Клеймо «оплачены при нулевом изменении текста, фиксер не исполнил ни одного указанного места» для 4 из 5 неверно.\n\n3. Настоящий no-op-набор A1B — другие 3 клетки, $0.018274: 1431129de6 (places=6) $0.003724, 53e0f3d653 (places=2) $0.007747, b0a5efaa11 (places=2) $0.006803.\n\n4. Пропущен самый крупный носитель того же дефекта — арм A1: 4 клетки из 29 равны черновику, $0.030325 (ed068182cf places=3, cf9a90d9fe places=1, 53e0f3d653 places=1, 3727846a2c places=1). Итог по трём детерминированным армам: $0.074046 оплачено при нулевом изменении текста. A3/A6/A6F — 0 таких клеток.\n\n5. «Контраст A4/A0 нулевой по построению на 4 единицах» верно для Claude и неверно для Sol. Прогнав контроль «близнец» руками по обоим ключам: 18 побайтно одинаковых пар ВНУТРИ одного судейского задания (A0/A4 — 8, A1/A1B — 10). Claude: ровно ноль в 18/18. Sol: 16/18, разошлись debb2c1aef A0/A4 на 6 и 13c5f52fa3 A1/A1B на 1 (несущая сумма ВЕРНОСТЬ+ЯЗЫК, набор p1). То есть отсутствующий контроль ловит не только тавтологию, но и невоспроизводимость оценки второго семейства.\n\n6. Ни один вердикт фазы не двигается — это надо сказать вслух рядом с находкой. Исключение no-op-клеток: A1B/A0 claude 3.50→3.71 (n 31→28, p 0.0000), sol 4.74→5.07 (p 0.0000) — CONFIRM держится; A4/A0 claude 0.11→0.13 (p 0.3281), sol +0.15→+0.06 (p 0.9370) — ниже порогов 1.54/3.65 в обе стороны. Находка бьёт по деньгам, по замеру П-9 и по отсутствию контроля, а не по выводам.\n\n7. «10% сметы» — по факту 10% ФАКТИЧЕСКОЙ траты арма; сметная строка ФД-A ($0.877, 23-editor-tier.md:856) покрывает A1·A2·A3·A4 вместе.",
"refuted": false,
"why": "Опровергнуть не удалось: ядро находки воспроизводится моим собственным счётом, мимо отчёта. Что я исполнил и что получил.\n\n(а) Написал свой сверщик (импорт contour.py, сравнение content каждой клетки с её ВХОДОМ: base_a0 для A4, base_draft для A1/A1B/A3, base_draft2 для A6/A6F) — /home/ubuntu/projects/textmachine/eval/.venv/bin/python scratchpad/chk.py. Вывод: A4 n=31, побайтно равны входу 4, оплачено на них $0.025447 при сумме арма $0.254500 (=10.0%); три оплаченные — b2a7464dbd $0.006296 places=1, debb2c1aef $0.012642 places=2, fb9ed5709e $0.006509 places=1; четвёртая 474f822806 free=True places=0. Числа находки по A4 совпали до цента. Все три finish=stop, completion 5175/12349/5314 токенов — модель отдала ПОЛНЫЙ текст и вернула вход без изменений, то есть деньги реальные, дельта нулевая.\n\n(б) Улика «sig = sha1(content)[:12]» верна: eval/role_topology/absjudge.py:230 (`sig=hashlib.sha1(slots[n].encode()).hexdigest()[:12]`), ключи Д4 строит именно absjudge.build_unit (sud.py:66,164,181).\n\n(в) ГДЕ НАХОДКА НЕВЕРНА. Её улика по A1B — не улика заявленного. Пара «A1B ≡ A1 на 5 единицах, $0.028788» воспроизводится точно (chk2.py), но это совпадение ВЫХОДОВ ДВУХ АРМОВ, а не «нулевое изменение текста»: против своей базы совпадает лишь 53e0f3d653; на четырёх остальных фиксер текст правил (len(draft)→len(out) 7287→7332, 7805→7810, 7064→7087, 7624→7629). Реальный no-op-набор A1B — другие три клетки на $0.018274. Плюс находка вовсе не смотрела арм A1, где no-op-клеток больше всех: 4 из 29 на $0.030325. Суммарно по A1+A1B+A4 — $0.074046, а не «A4 + пять клеток A1B».\n\n(г) «Нулевой по построению» — только у Claude. Я реализовал контроль «близнец» absjudge.py:687-698 поверх ключей Д4 (chk4.py): 18 побайтно одинаковых пар внутри одного задания (A0/A4 ×8, A1/A1B ×10). Claude — ровно ноль в 18/18; Sol — 16/18, debb2c1aef A0/A4 разошлись на 6, 13c5f52fa3 A1/A1B на 1. У Sol контраст на этих единицах нулевым по построению НЕ является.\n\n(д) Отсутствие контроля подтверждено: прочитал itog_d4.py целиком (245 строк) — логики близнеца нет; grep по eval/dovodka даёт единственное упоминание в комментарии sud.py:263. Прогон itog_d4.py ($0) печатает пол/декои/три первичных контраста и близнеца не считает.\n\n(е) Объявленным ограничением это не является. Э-11 (23-editor-tier.md:960-964) объявляет только БЕСПЛАТНЫЕ клетки «мест не нашлось»; оплаченная клетка, вернувшая вход без правок, не описана ни в Д0.11, ни в Д0.13. Тела Д1Д8 в отчёте отсутствуют вовсе (файл кончается на 1151 строке Д0.13), так что и «объявлено в отчёте» негде. Ссылка на П-9 (:1140-1143) уместна: скрипта, считающего исполняемость указаний, в eval/dovodka нет (grep «исполн» даёт только комментарии).\n\n(ж) Что находка не сказала и что надо приписать: ни один вердикт не меняется. Пере-счёт без no-op-клеток (chk5.py): A1B/A0 claude 3.50→3.71 (p 0.0000), sol 4.74→5.07 (p 0.0000) — CONFIRM держится; A4/A0 claude 0.11→0.13 (p 0.3281), sol +0.15→+0.06 (p 0.9370) — ниже порогов 1.54/3.65 и с клетками, и без."
}
},
{
"title": "Позиционный наклон не замерен, не вычтен и не сторожится гейтом, вопреки норме Д0.6",
"severity": "мелко",
"evidence": "Норма: 23-editor-tier.md:830 «Позиционный наклон замеряется, вычитается и сторожится гейтом числом» (повторена :1029). В itog_d4.py слова «наклон»/позиции нет ни разу. Мой замер по 579 меткам: наклон +0.0329 ошибки на позицию (Claude), +0.0133 (Sol); средние по позициям Claude 5.77…6.65. Средняя позиция армов: A0 5.27, A1B 5.19, A3 5.45, A6 5.78, CTRLdecoy 4.94, CTRLfloor 6.16.",
"consequence": "Норма не исполнена. Числа при этом не двигаются: максимальный перекос позиций между армом и A0 равен 0.51 (A6), что даёт ≤0.02 ошибки — на два порядка меньше замеренных перевесов. Дефект отчётности, не результата.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Проверено собственным исполнением, находка стоит; поправлен только масштаб одного числа.\n\n1. НОРМА ЖИВА И НЕ СНЯТА. Тело нормы: docs/experiments/23-editor-tier.md:829 «Позиционный наклон замеряется, вычитается и сторожится гейтом числом», повтор :1027 в блоке «Нормы, обязательные для ОБОИХ семейств». Сверх пре-рега она же — жёсткая норма рига в заказе владельца: docs/POLYGON_EXP2223_REDO_SESSION_PROMPT.md:163 «Позиционный наклон замерить, вычесть, сторожить гейтом», под шапкой :159 «Нормы рига (ЖЁСТКИЕ; нарушение = аннулирование куска)». Прочитал целиком Д0.11 (:898-981), Д0.12, Д0.13 (:1052-1150) и Д0.10 «Чего эта фаза НЕ меряет» (:892-896) — ни один пункт наклон не отменяет, не ограничивает и не переносит. Объявленным ограничением находка НЕ покрыта.\n\n2. КОДА НЕТ. `grep -rn \"наклон\\|slant\\|position\\|позиц\" eval/dovodka/*.py` даёт два хита, оба не о том: contour.py:16 (проза про «измеряемую позицию» арма A4) и canon.py:87 (полоса вокруг пропорциональной позиции предложения). itog_d4.py прочитан целиком (245 строк): метка разбирается через ключ (read_family, :80-113), индекс метки Т<i> в счёт не входит нигде; шаги 1-6 в шапке (:9-24) наклона не содержат. Для сравнения — прошлый пак норму механизировал: eval/editor_tier/verify23.py:159-169 считает демином-по-пачке наклон и сторожит его печать числом. В фазе Д аналога нет ни в одном файле зоны.\n\n3. ЧИСЛА НАХОДКИ ВОСПРОИЗВЕЛИСЬ ТОЧНО. Свой скрипт (scratchpad/slant.py, разбор тех же ключей ~/books/dovodka/blind-keys-d4/d4p{1,2}-KEY.json и ответов ~/sud-d4, ~/sol-d4-work): 579 меток у каждого семейства (совпадает с «меток разобрано: 579» в выводе itog_d4.py), сырой наклон +0.0329 (claude) и +0.0133 (sol), средние carry по позициям claude от 5.77 (поз. 1) до 6.65 (поз. 10), средние позиции армов A0 5.27 · A1B 5.19 · A3 5.45 · A6 5.78 · CTRLdecoy 4.94 · CTRLfloor 6.16 — все шесть чисел сошлись.\n\n4. ВЫВОДЫ НЕ ДВИГАЮТСЯ — и это я проверил сильнее, чем сама находка (она рассуждала через оценку сверху, я пере-гнал конвейер). scratchpad/corr.py вычитает slope*pos из каждого carry и пере-считывает штатными функциями itog_d4 (floor_sd, control, margins, BO.sign_perm_p, holm): claude A1B -3.500 -> -3.503, A3 -2.161 -> -2.156, A6 -1.031 -> -1.023; sol A1B -4.742 -> -4.748, A3 -3.129 -> -3.115, A6 -0.625 -> -0.606. Пороги 1.544 -> 1.568 и 3.653 -> 3.704, маржевый декой claude ПРОЙДЕН / sol НЕ ПРОЙДЕН в обоих вариантах, грубый декой 62/62 и 61/62. Ни один вердикт (ПЕРЕШЁЛ/ниже порога, CONFIRM/ЭСКАЛАЦИЯ) не меняется.\n\nЧТО ПОПРАВЛЕНО. Находка приводит СЫРОЙ наклон. Оценщик, принятый самим проектом (verify23.py:159-167 — деминовка по пачке, потому что контрасты парные внутри единицы), даёт у Sol +0.0775, то есть в ~6 раз больше процитированного +0.0133; тогда перекос 0.51 позиции даёт 0.040 ошибки, а не «≤0.02». Оценка сверху в улике занижена; фактический сдвиг перевесов в пере-ране максимум 0.019 (sol A6/A0), так что вывод «дефект отчётности, не результата» устоял, но обоснование в находке опирается на более слабый оценщик, чем требует риг.",
"corrected": "Позиционный наклон в фазе Д не замерен, не вычтен и не сторожится гейтом — вопреки норме, зафиксированной дважды в пре-реге (23-editor-tier.md:829, :1027) и отдельно в жёстких нормах рига заказа владельца (POLYGON_EXP2223_REDO_SESSION_PROMPT.md:163, где нарушение = аннулирование куска). Ни Д0.11, ни Д0.13, ни Д0.10 норму не снимают. В eval/dovodka/ слова «наклон» нет ни в одном файле; itog_d4.py разбирает метку через ключ и индекс метки не использует, тогда как прошлый пак норму механизировал (verify23.py:159-169). Мой замер по 579 меткам: сырой наклон +0.0329 (Claude) и +0.0133 (Sol); оценщиком, который применяет сам проект (деминовка по пачке), — +0.0321 (Claude) и +0.0775 (Sol). Средние по позициям Claude 5.77…6.65; средние позиции армов A0 5.27 · A1B 5.19 · A3 5.45 · A6 5.78 · CTRLdecoy 4.94 · CTRLfloor 6.16. Максимальный перекос позиции против A0 — 0.51 (A6), что при внутрипачечном наклоне Sol даёт до 0.040 ошибки (а не ≤0.02, как сказано в улике: та цифра выведена из более слабого сырого наклона). Пере-ран свода с вычтенной поправкой (обоими оценщиками) двигает перевесы не более чем на 0.019 и не меняет ни одного порога, ни гейта чувствительности, ни вердикта. Итог: норма не исполнена — дефект отчётности и гейта, не результата."
}
},
{
"title": "sd шумового пола считается как pstdev (ddof=0) на выборке из 15 пар — порог занижен на 3.4%",
"severity": "мелко",
"evidence": "itog_d4.py:125 `st.pstdev(diffs)`. Мой счёт: Claude sd(ddof=0)=2.135 против sd(ddof=1)=2.210, пороги 1.543 против 1.598; Sol 5.053 против 5.230, пороги 3.653 против 3.781. Пре-рег сам требует обратного: Д0.11 Э-3 (23-editor-tier.md:905-907) — «Множитель мощности брал квантиль НОРМАЛИ, тогда как sd — ОЦЕНКА».",
"consequence": "Ни один вердикт не меняется (Claude A3/A0 2.16 выше обоих порогов, Sol A3/A0 3.13 ниже обоих). Порог систематически мягче объявленного на 3.4%, при том что вся фаза строится вокруг того, что порог занижать нельзя.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "ЧТО ВОСПРОИЗВЕЛОСЬ (проверено исполнением). `eval/.venv/bin/python eval/dovodka/itog_d4.py` печатает «n=15 · sd=2.14 → ПОРОГ 1.54» (claude) и «n=15 · sd=5.05 → ПОРОГ 3.65» (sol). Мой пере-счёт тех же 15 разностей пола (скрипт импортирует `itog_d4.read_family`/`floor_sd`): claude diffs = [-1,-1,0,0,1,1,1,1,2,2,2,3,4,5,7], pstdev=2.1354, stdev=2.2104, пороги 1.5438 против 1.5980; sol pstdev=5.0526, stdev=5.2300, пороги 3.6528 против 3.7810; отношение stdev/pstdev = 1.0351 в обоих семействах, то есть порог на 3.39% ниже. Все четыре числа находки и вывод «ни один вердикт не меняется» подтверждаются: код в `eval/dovodka/itog_d4.py:125` действительно `st.pstdev(diffs)`, порог в `:173` — `2.8*sd/√n`.\n\nЧТО НЕ ПОДТВЕРДИЛОСЬ — обе опоры формулировки.\n\n1. «Порог мягче ОБЪЯВЛЕННОГО» неверно: объявленный порог сам pstdev-овый. Правило зафризено как «порог различимости = 2.8·sd/√n по правилу рига» (`eval/dovodka/itog_d4.py:10`), а «правило рига» механически — pstdev во ВСЕХ смежных ригах: `eval/editor_tier/solscore.py:104,107`, `eval/editor_tier/axiscal.py:218-220`, `eval/role_topology/absjudge.py:672`, `eval/editor_tier/verify23.py:150`. Грепа `ddof|pstdev|несмещ` по `docs/experiments/23-editor-tier.md` и по заказу владельца — ноль хитов, то есть конвенция нигде не объявлена иначе. Наследуемый порог Sol, напечатанный в пре-реге числом («Шумовой пол Sol — sd 5.05, порог различимости 3.53», `docs/experiments/23-editor-tier.md:1003`, то же на `:610`, `:842`), я пере-снял: `eval/.venv/bin/python eval/editor_tier/solscore.py` → «ПОЛ 1.88 · n=16 sd=5.05 → ПОРОГ 3.53» из `st.pstdev` в `solscore.py:104`. Расхождения «код против объявленного» нет; есть расхождение «объявленная конвенция против несмещённой оценки».\n\n2. Ссылка на Э-3 как на «пре-рег требует обратного» — не то расхождение. Э-3 (`23-editor-tier.md:905-907`) про МНОЖИТЕЛЬ: квантиль нормали там, где sd — оценка. Починка Э-3 сделана и живёт в `eval/dovodka/power.py:135-160` — `_t()` через `scipy.stats.t.ppf` при `PRIOR_DF=15`, множитель `t_{10.05/2k}+t_{0.8}`; ddof выборочной sd Э-3 не касается вовсе. Если применить требование Э-3 к порогу рига (df=14 при n=15 парах), множитель = t(0.975,14)+t(0.8,14) = 3.0128 против 2.8, и порог с несмещённой sd = 1.7195 (claude) и 4.0684 (sol). Тогда занижение порога составляет 10.2%, а не 3.4%, и основная его часть — z вместо t, а не ddof.\n\n3. Устойчивость вердиктов шире, чем в находке. Я пере-считал все решения на трёх порогах (2.8·pstdev / 2.8·stdev / t·stdev): claude A1B +3.50, A3 +2.16 переходят порог при 1.5438, 1.5980 и 1.7195; A6 +1.03 ниже всех трёх; гейт чувствительности claude (маржевый декой +2.5556) пройден при всех трёх. Sol: A1B +4.74 переходит при 3.6528, 3.7810 и 4.0684; A3 +3.13 ниже всех трёх; маржевый декой +2.9630 не проходит ни один. Вердиктов не меняет ни ddof, ни полная поправка Э-3.\n\nМАСШТАБ. Цена ddof в очках: 0.054 у claude и 0.128 у sol. Ближайший к границе вердикт — sol A3 (3.13 против 3.65, зазор 0.52) и claude A3 (2.16 против 1.54, зазор 0.62); оба дальше от границы, чем поправка, в 411 раз. Для сравнения, в том же поле: среднее самих разностей пола +1.80 (claude) и +1.93 (sol) при объявленной «истинной разнице ноль».",
"corrected": "Верно: `itog_d4.py:125` берёт `st.pstdev` (ddof=0) на 15 парах пола, и относительно несмещённой оценки порог ниже на 3.4% (claude 1.5438 против 1.5980, sol 3.6528 против 3.7810) — числа находки воспроизводятся точно.\n\nНеверна атрибуция и масштаб. Это НЕ расхождение кода с объявленным: правило «2.8·sd/√n по правилу рига» реализовано через pstdev во всех смежных ригах (solscore.py:104, axiscal.py:218, absjudge.py:672, verify23.py:150), и наследуемый порог Sol 3.53, напечатанный в пре-реге (23-editor-tier.md:1003), пере-снимается из pstdev тем же способом — то есть pstdev и есть объявленная конвенция, а ddof в доках не оговорён нигде. Э-3 требует не ddof=1, а квантиля Стьюдента вместо нормали, и эта починка уже внесена в `power.py` (`_t`, PRIOR_DF=15), но к порогу рига не применялась: при честном применении Э-3 (df=14, множитель 3.0128 вместо 2.8) порог занижен на 10.2%, а не на 3.4%, и вклад ddof в этом — меньшая часть.\n\nПоследствие подтверждается и расширяется: ни один вердикт не меняется ни при ddof=1, ни при полном t-множителе — claude A1B/A3 переходят порог, claude A6 ниже, гейт чувствительности claude пройден, sol A1B переходит, sol A3/A6 ниже, гейт чувствительности sol не пройден при всех трёх порогах (1.5438/1.5980/1.7195 и 3.6528/3.7810/4.0684)."
}
},
{
"title": "В одном выводе слово «перевес» напечатано в двух противоположных знаковых конвенциях",
"severity": "мелко",
"evidence": "itog_d4.py:147 (контрасты) `st.mean(vb) - st.mean(va)` — ошибки A0 минус ошибки арма, минус = арм хуже. itog_d4.py:136 (декои) `d[(uid,a,half)]['carry'] - base['carry']` — ошибки декоя минус ошибки A0, плюс = декой хуже. Печать: «МАРЖЕВЫЙ декой ... среднее +2.56» и «A3/A0 ... 2.16». Норма пре-рега и унаследованный риг говорят третьим знаком: 23-editor-tier.md:816 «сессия, не поймавшая его ОТРИЦАТЕЛЬНЫМ знаком» / absjudge.py:659 «нужен отрицательный знак».",
"consequence": "Читатель отчёта видит у маржевого декоя +2.56, а у ставки владельца A3 2.16 и может прочесть это как «декой лучше A3». По факту обе величины означают одно: хуже A0 на 2.56 и на 2.16 ошибки соответственно — то есть смысловой edit-контур наказан судьёй почти как намеренно испорченный текст. Числа верны, подпись к ним двусмысленна.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Проверено исполнением, опровергнуть не удалось: обе величины действительно печатаются в одном выводе в противоположных знаковых конвенциях, числа сошлись при независимом пере-счёте, а объявленным ограничением это нигде не является. (1) Пере-счёт своим парсером (скрипт /tmp/claude-1000/-home-ubuntu-projects-textmachine/565edf3f-c90e-4aaf-8418-c2ec250acedc/scratchpad/indep.py, несущая сумма ВЕРНОСТЬ+ЯЗЫК, единая конвенция «ошибки(арм) ошибки(A0)»): claude CTRLmargin +2.56, A3 +2.16, CTRLdecoy +3.19; sol CTRLmargin +2.96, A3 +3.13, CTRLdecoy +3.58. Прогон eval/.venv/bin/python eval/dovodka/itog_d4.py печатает те же величины как «МАРЖЕВЫЙ декой … среднее +2.56» и «A3/A0 … 2.16». Знаки в коде: itog_d4.py:136 `d[(uid,a,half)][\"carry\"] - base[\"carry\"]` (плюс = декой хуже) против itog_d4.py:147 `st.mean(vb) - st.mean(va)` (минус = арм хуже) — конвенции противоположны, обе величины в одном выводе. (2) Сопоставимость точная, а не приблизительная: per-half (n=54/62) и per-uid (n=27/31) агрегации дают одинаковые средние до сотых, то есть 2.56 и 2.16 сравнимы напрямую. (3) Объявленным ограничением не является: греп по Д0.11 (23-editor-tier.md:8981051) и Д0.13 (:10521151) знаковой конвенции печати не оговаривает; П-2 (:1085) называет декойную величину тем же словом «перевес», что и контрасты. (4) Вывод фазы от этого не меняется — проверено: гейт `mm > thr` (itog_d4.py:191), счёт пойманных `x > 0` (:186) и правило расхождения П-1 (:227) каждый работает внутри одной конвенции, порог из floor_sd (:118125) знако-нейтрален; прогон даёт claude ПРОЙДЕН / sol НЕ ПРОЙДЕН и те же вердикты по трём контрастам.",
"corrected": "Находка верна по сути, но масштаб уточняется в двух местах — одно ослабляет формулировку, второе усиливает.\n\nОСЛАБЛЕНИЕ (неточность улики). Слово «перевес» в ПЕЧАТИ встречается ровно один раз — в шапке таблицы контрастов (itog_d4.py:211). Декойные строки печатаются словами «медиана» (:185) и «среднее» (:190). Общее слово «перевес» для обеих конвенций живёт в докстрингах (:129 «Перевес контроля против своего донора A0» — плюс = хуже; :141 «Перевес ЗА арм a» — плюс = лучше) и в пре-реге П-2 (23-editor-tier.md:1085 «перевес на маржевом декое»), а не дважды в выводе. Точная формулировка: в одном выводе рядом напечатаны две величины в противоположных знаковых конвенциях БЕЗ легенды знака, а не «одно слово в двух конвенциях».\n\nУСИЛЕНИЕ (то, что находка не назвала). (а) Унаследованный риг легенду печатал: absjudge.py:516 выводит «Перевес > 0 ⇒ ПЕРВЫЙ арм лучше по этой оси»; в выводе itog_d4.py такой строки нет вовсе — проверено чтением полного прогона. (б) Расхождение с пре-регом не словесное, а буквальное: норма Д0.6 (23-editor-tier.md:816) и её повтор для обоих семейств (:1023) требуют ловить декой ОТРИЦАТЕЛЬНЫМ знаком, absjudge.py:659 печатает «(нужен отрицательный знак)», а itog_d4.py:186 засчитывает поимку как `x > 0` и печатает «медиана +3.0 · пойман 62/62». То есть печать формально противоречит букве той самой нормы, по которой пачка аннулируется. (в) Величина сравнения: A3 (2.16) сопоставляется с МАРЖЕВЫМ декоем (2.56), а не с грубым (3.19 claude / 3.58 sol); у семейства sol A3 (3.13) маржевый декой (2.96) уже ПРЕВОСХОДИТ по ошибкам.\n\nЧто не меняется: ни один вердикт фазы. Гейт чувствительности, счёт пойманных декоев и правило расхождения семейств П-1 каждый замкнут внутри своей конвенции, порог знако-нейтрален; дефект — только в подписи к числам для читателя."
}
},
{
"title": "Пол собран из 15 пар вместо 16: одна половина судилась впустую, а селфтест сверяет ровно достигнутое число",
"severity": "мелко",
"evidence": "В ключе d4p1 арм CTRLfloor стоит на 16 единицах, в d4p2 — на 15; без пары осталась единица 474f822806 (файла dv-a-flo2-474f822806.json в ~/books/dovodka нет; всего flo-файлов 34, из них flo1 18, flo2 16, включая один *.ERROR.json). itog_d4.py:117-125 парует по uid и берёт 15. Селфтест sud.py:260 проверяет `len(pairs) >= 15` — ровно достигнутое значение, запаса нет.",
"consequence": "Одна судейская метка каждого семейства оплачена вниманием впустую; n пола 15 вместо 16 напрямую входит в порог (см. находку про n): при 16 парах порог Claude был бы 1.494 вместо 1.543. Порог оси зависит от того, что одна клетка не догенерировалась, и гейт это не ловит по построению.",
"grounded": "проверено исполнением",
"verdict": {
"refuted": false,
"why": "Headline verified by my own execution, evidence chain partly false, causal story inverted.\n\nVERIFIED BY MY RE-RUN. `eval/.venv/bin/python eval/dovodka/itog_d4.py` prints for BOTH families \"СВОЙ ПОЛ (пары, судимые РАЗНЫМИ сессиями): n=15\" (claude sd=2.14 → порог 1.54; sol sd=5.05 → 3.65). My own scan of ~/books/dovodka/blind-keys-d4/*-KEY.json: CTRLfloor stands on 16 units in d4p1 and 15 in d4p2; the unpaired uid is exactly 474f822806 (computed p1-minus-p2 set = ['474f822806'], p2-minus-p1 = []). Cited line numbers are accurate: itog_d4.py:117-125 is floor_sd, which pairs by uid and requires both p1 and p2; sud.py:260 is ck(\"пар пола не меньше 15\", len(pairs) >= 15), and `sud.py --selftest` prints \"[OK ] пар пола не меньше 15 15\". Threshold arithmetic is exact — recomputed with unrounded sd, 2.8*sd/sqrt(15)=1.5438 vs 2.8*sd/sqrt(16)=1.4948 (sol 3.6528 vs 3.5368), matching the finding's 1.543/1.494.\n\nFALSE IN THE EVIDENCE. (1) \"файла dv-a-flo2-474f822806.json в ~/books/dovodka нет\" is wrong. `ls -la ~/books/dovodka/dv-a-flo2-474f822806.json` → 8358 bytes, mtime 2026-08-11 03:37:10. Its fields: finish=\"length\", cost_usd=0.013987, completion_tokens=16000, content length 4335 (flo1 counterpart: finish=\"stop\", content 7866). The cell WAS generated and WAS paid for; it is truncated, not absent. (2) \"включая один *.ERROR.json\" is wrong — there are two (dv-a-flo1-3754987548.ERROR.json, dv-a-flo1-9120ad112e.ERROR.json). Counting non-ERROR files: flo1 16, flo2 16. Both halves produced 16 units, so \"одна половина судилась впустую\" is not caused by an ungenerated cell.\n\nCAUSE INVERTED. \"гейт это не ловит по построению\" is backwards: the gate is what dropped the cell. sud.py:151 `return (d.get(\"content\") or \"\") if d.get(\"finish\") == \"stop\" else \"\"` and sud.py:130-131 implement the pre-registered norm Д0.6, declared verbatim at docs/experiments/23-editor-tier.md:826 (\"Клетка с `finish=length` в судейскую пачку НЕ допускается — ни боевым армом, ни половиной пола\") and restated in the power module at eval/dovodka/power.py:111 (\"в фазе Д такие клетки в пачку не допускаются вовсе\"). So the exclusion is an announced limitation executed by design.\n\nWHAT SURVIVES AS A REAL GAP (different from what the finding says). The pre-reg declares the exclusion rule but never declares the resulting floor n; Д0.3 (23-editor-tier.md:756-765) declares axis n, not floor n, and no \"n=15\" appears anywhere in 23-editor-tier.md (grep). Errata Э-9 (23-editor-tier.md:948) states the two A4 finish=length cells \"пере-покупаются\", but the floor's finish=length cell was not, and structurally cannot be: contour.py:582 `if (OUT / f\"{tg}.json\").exists(): continue` skips any tag whose file exists, so `--floor` re-runs will never regenerate the dud. Timing supports the selftest half: floor material bought 2026-08-11 03:21-03:52, while sud.py carrying `>= 15` was committed 2026-08-11 12:46:45 (18a8179) — the bound was authored ~9h after the achievable value was already 15.\n\nNO CONCLUSION MOVES. Under the counterfactual (sd held fixed, n=16): claude threshold 1.4948 — A1B/A0 -3.50 and A3/A0 -2.16 still cross, A6/A0 -1.03 still does not; sol threshold 3.5368 — A1B/A0 -4.74 still crosses, A3/A0 -3.13 still does not; margin-decoy sensitivity gate claude +2.56 still passes, sol +2.96 still fails. No verdict and no family-disagreement outcome changes.",
"corrected": "Пол оси Д4 собран из 15 пар вместо 16 — это верно и воспроизводится (itog_d4.py печатает n=15 для обоих семейств; в ключе d4p1 CTRLfloor на 16 единицах, в d4p2 на 15; без пары единица 474f822806). Но причина в находке названа неверно. Файл dv-a-flo2-474f822806.json СУЩЕСТВУЕТ (8358 байт, mtime 2026-08-11 03:37:10) и ОПЛАЧЕН ($0.013987); у него finish=\"length\", content 4335 знаков против 7866 у здоровой половины flo1. Клетка не «не догенерировалась» — она обрезана. Из пачки её убрал гейт, и убрал ПО ОБЪЯВЛЕННОЙ норме: Д0.6 (23-editor-tier.md:826) прямо запрещает клетку finish=length «ни боевым армом, ни половиной пола», механизировано в sud.py:130-131 и sud.py:151, продублировано в power.py:111. Формулировка «гейт это не ловит по построению» инвертирует механизм: гейт как раз сработал. Также в улике ошибка счёта — *.ERROR.json два (flo1-3754987548, flo1-9120ad112e), а не один; не-ERROR файлов flo1 16 и flo2 16, то есть обе половины сгенерированы полностью.\n\nНастоящий остаток находки, уже в верной форме: (1) пре-рег объявляет правило исключения, но НЕ объявляет получившееся n пола — строки «n=15» в 23-editor-tier.md нет вовсе, Д0.3 объявляет n оси, не n пола; (2) асимметрия починки: эррата Э-9 (23-editor-tier.md:948) говорит, что две клетки A4 с finish=length «пере-покупаются», а клетка пола — нет и не может быть пере-куплена, потому что contour.py:582 пропускает любой тег, чей файл уже существует, и повторный --floor обрежка не заменит; (3) селфтест sud.py:260 действительно проверяет ровно достигнутое: порог `>= 15` закоммичен 2026-08-11 12:46:45 (18a8179), а сырьё пола куплено 03:21-03:52 того же дня, то есть граница написана, когда достижимое значение уже равнялось 15.\n\nМасштаб последствия меньше заявленного. Арифметика порога верна (пере-считал по неокруглённой sd: 1.5438 при n=15 против 1.4948 при n=16; sol 3.6528 против 3.5368), но это счёт по формуле при ЗАФИКСИРОВАННОЙ sd — реальная 16-я пара сдвинула бы и sd, так что 1.494 есть контрфактуал формулы, а не предсказание. Ни один вывод при этом не меняется: claude A1B/A0 -3.50 и A3/A0 -2.16 переходят оба порога, A6/A0 -1.03 не переходит ни одного; sol A1B/A0 -4.74 переходит, A3/A0 -3.13 не переходит; гейт чувствительности маржевого декоя claude +2.56 проходит, sol +2.96 не проходит при любом из двух порогов."
}
}
]
}