{ "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:00–23: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 пп» — числа переставлены, и это меняет направление: печатаемый разрыв 85−73 = 11.9 пп, починенный 75.7−55.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в, строки 601–603), `axiscal.py:218`; доктрина порога — `absjudge.py:668–682`. Значение для sol объявлено числом ДО первого ответа фазы: 23-editor-tier.md:842 (Д0.7) и :1003–1004 (Д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:221–240): 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 (:1003–1004) вместе со следствием «подпись 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(1−0.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.41–6.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.93–3.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), а замер §3–4 указывает в противоположную сторону. Знаковые p (Холм) от пола вообще не зависят.\n\nЧто остаётся живого: у пола n=15 и он оценка (df=14) — но это уже учтено эрратой Э-3, и она про t-квантиль, а не про схожесть текстов.", "corrected": "Выживает только описательная часть, без последствия: пол оси Д4 снят на паре, чьи половины схожи на 0.979 медианно (n=15 судимых), тогда как первичные контрасты сравнивают тексты со схожестью 0.63–0.82. Это объявленное устройство нулевого контраста (Д0.6 :817-819, Э-12), а не непойманный дефект, и на величину порога оно не действует: при НУЛЕВОЙ текстовой разнице (побайтно один текст, две сессии) разброс равен 2.31–3.24 у claude и 5.41–6.61 у sol, то есть не ниже пола (2.14 / 5.05), а поединичный разброс самих боевых контрастов даёт пороги 1.00–1.61 (claude) и 1.93–3.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 не зависит), и p1−p2 на 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) показал, что p1−p2 положителен на всех 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) — оба прочитаны целиком. Вердикты не двигаются: 84–95% вне покрытия флагов не зависят от вдвое меньшего 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:03–21: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.03–0.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.04–5.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.04–5.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 записи 22–28 несут 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/` и `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(p1−p2)=+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 оставляет все три перевеса идентичными до 1e−9. Оба декой-контроля (`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:818–821) пре-регистрирует, что пол судят РАЗНЫЕ сессии именно затем, чтобы поймать межсессионную компоненту, и что «порог берётся из своего пола без ручной поправки» — в эксп-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), среднее (p1−p2) = +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 1–2, то есть фиксер нашёл указания и не исполнил ни одного — потолок, объявленный в П-9 («канон-фиксер исполняет 46% прямых указаний — это ПОТОЛОК арма, известный до всякого судейства»). То же у A1/A1B: A1B нашёл БОЛЬШЕ мест (2 против 1, 4 против 3), выход тот же.\n\nПОСЛЕДСТВИЕ 2 (декой рядом с донором) — это конструкция, а не изъян. Д0.12 требует «декой в каждой пачке», ключ несёт `decoy_from: A0`, и `itog_d4.py` шагом 2 меряет именно «ГРУБЫЙ декой ПРОТИВ ДОНОРА» парной разностью — без донора в пачке измерения не существует. Замеренная схожесть 0.9977 в среднем (0.9939–1.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:201–217) делает только подстрочный поиск этих шести строк.\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:38–39` («после каждой пачки гоняется греп-аудит транскриптов (`--audit`)») и `~/sud-d4/annulled.txt` («поймано греп-аудитом транскриптов», «фильтром служит АУДИТ, а не инструкция»).\n\n6. Ссылка находки на `23-editor-tier.md:386` не подтверждается: строка 386 — пункт 5 отзыва эксп-22 про двусмысленную инструкцию про оборванный вариант.\n\n7. Вывод фазы: численные вердикты Д4 не меняются — пачки в карантине (`*.ANNULLED.txt`) и пере-сужены (ответы 22:24–23:08 против 21:10–21: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:38–39` («после каждой пачки гоняется греп-аудит транскриптов (--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:38–39 носителя не имеют — правятся либо расширением `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.9984–0.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.7244–0.9990, и 12 из 62 значений ниже 0.99 (0.7244 ×2, 0.9259 ×2, 0.9333 ×2, 0.9633 ×2, 0.9684 ×2, 0.9878 ×2). Интервал «0.9984–0.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 из номера слепой метки `Т` в `~/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 против 6784–8793 у остальных).\n\n3. Механика подтверждена по коду: `sud.py:143 floor_pair()` возвращает пусто при `finish != \"stop\"`, поэтому в наборе П2 у `474f822806` метки CTRLfloor нет, а в П1 она есть. `itog_d4.floor_sd` (itog_d4.py:117–125) требует ОБЕ половины, значит непарная метка выбрасывается.\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.02–6.03 почти уравнены), но обязательная и проверяемая норма заказа механизма в фазе не имеет, а реестр закрывает её гейтом другого пака.", "grounded": "проверено исполнением", "verdict": { "refuted": false, "why": "Опровергнуть не удалось: пере-ран моими скриптами воспроизвёл находку числом и по механизму. (1) Ограничением нигде не объявлено — наоборот, норма утверждается дважды в пре-реге фазы Д: 23-editor-tier.md:829 (Д0.6) и :1027 (Д0.12 «нормы, обязательные для ОБОИХ семейств»); греп «наклон|позицион|раскладк» по строкам 713–1151 в эрратах Д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--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--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:43–01: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()` (строки 216–270) считает только контроли сговорчивости/чувствительности и долю подтверждённых претензий по армам; `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 (строки 1059–1076), в `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. Фактически все 8–11 вариантов единицы лежат в ОДНОМ файле задания (~/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а. «8–11 вариантов» — фактически 7–11 (по 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 (:1091–1099, принят до первого вердикта) прямо отменяет тезис Д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 («все армы единицы — в одном пакете одной сессии»): в одном файле задания лежат все 7–11 вариантов единицы подряд (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.38–2.66), sol не проходит (+2.96 против 3.65; при импутации 2.74–3.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 слотов единицы несут усечённый текст; остальные армы той же пачки — 6764–7380 знаков.\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.2–3.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, ключ: 7–11 меток на задание), поэтому контраст A3−A0 берётся внутри одной сессии; а пол — половина из p1 против половины из p2, т.е. между сессиями (sud.py:15-21, itog_d4.py:118-125). Мой замер систематики: средний сдвиг p1−p2 по боевым армам +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 задания по 7–11 меток, одно задание = одна единица со ВСЕМИ армами + 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; сдвиг p1−p2 по боевым армам 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 = число находки). Замер компоненты: одиночная метка, ПОБАЙТНО тот же текст, p1−p2 — 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 ровно. Число внутренне согласовано с собственной трёх-сессионной областью журнала и с удержанной пачкой. Весь разрыв 15−11 — это одна 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 из 1–2 указаний. Контраст 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), индекс метки Т в счёт не входит нигде; шаги 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_{1−0.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); оба дальше от границы, чем поправка, в 4–11 раз. Для сравнения, в том же поле: среднее самих разностей пола +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:898–1051) и Д0.13 (:1052–1151) знаковой конвенции печати не оговаривает; П-2 (:1085) называет декойную величину тем же словом «перевес», что и контрасты. (4) Вывод фазы от этого не меняется — проверено: гейт `mm > thr` (itog_d4.py:191), счёт пойманных `x > 0` (:186) и правило расхождения П-1 (:227) каждый работает внутри одной конвенции, порог из floor_sd (:118–125) знако-нейтрален; прогон даёт 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 не проходит при любом из двух порогов." } } ] }