Record the second-pair reachability report and its adversarial round, written by the backend session in its own journal section

This commit is contained in:
heaven 2026-09-18 17:42:15 +03:00
parent dca0e06887
commit 2a2ba4a451

View file

@ -210,6 +210,152 @@
## Бэкенд
#### ДОПОЛНЕНИЕ к отчёту пака «ДОСТИЖИМОСТЬ ПАР-ДАННЫХ»: АДВЕРСАРИАЛЬНЫЙ ПРОХОД ПО СДАННОМУ (18.09, та же сессия `textmachine-main-c8`). НЕ КОММИЧУ
**Почему дополнение вообще есть.** Пак требовал адверсариального прохода по СВОЕЙ готовой работе (§5), и я его
не сделала — были проверки по ходу, отдельного захода «атаковать то, что уже сдано» не было, и в отчёте про
это не написано. Дыру назвал владелец. Проход проведён после приёмки `D39.268`: три ревьюера по разным
линзам плюс советчик, все read-only, свои пробы держали в /tmp. Нашлось **21 наблюдение, из них 13 —
настоящие дефекты МОЕЙ работы**, и три из них меняют утверждения акта, а не только код. Деньги: **$0**.
**ТРИ НАХОДКИ УРОВНЯ АКТА.**
**1. ⛔ Байты комментариев langpack-файлов входят в `Pack.Version()`.** Замер: правка ТОЛЬКО комментариев в
`configs/langpacks/en-ru/*.txt` сдвинула версию английского пака (`429e72063a26``c98785fc0974`), китайская
не двинулась. ⇒ в проекте два слоя данных с ПРОТИВОПОЛОЖНОЙ ценой комментария: у промтов он снимается перед
хешем, и соседний доккомментарий обещает это вслух («an edited comment costs nobody a re-purchase»), у
langpack-файлов он стоит пере-покупки всех книг пары. Обещание одного слоя читатель обобщает на другой.
⇒ ⛔-шапка в каждом из трёх файлов + пин `TestACommentInAPackFileIsPartOfItsVersion`, предъявляющий свойство
исполнением. Сам фолд не тронут: снятие комментариев двинуло бы и китайский пак.
**2. ⛔ Алгоритм распознавания курсива не версионировался ничем — и я это нарушила в том же дереве.** Данные
пары фолдятся через `packVersion`, а КОД детектора был прикрыт только конвенцией «правка ингеста бампает
версию нарезки», записанной прозой. Я расширила сканер (рекурсия в `@media`/`@supports`, Unicode-имена
классов) при неизменной версии. На боевых книгах это замеренный no-op (4842 носителя и тот же текст глав до
и после), но механизм «расширили сканер — молча сдвинули провод» работал. ⇒ остаток (в) акта ЗАКРЫТ той же
ратифицированной формой: `inlineMarkupAlgoVersion` фолдится УСЛОВНО, только когда пара несёт
`inline-markup.txt`. Пара без файла байт-идентична.
⚠ И пин на это я сперва написала ПУСТЫМ: он утверждал «объявление файла двигает версию», а это двигают сами
байты файла — тег он не отличал. Поймал инструмент (мутация ВЫЖИЛА), пере-написан так, чтобы подменять тег.
**3. ⛔ Порча ЧИТАТЕЛЬСКОГО файла, которой в акте нет.** Один потерянный моделью маркер ИНВЕРТИРОВАЛ
выделение до конца абзаца: `сноску* и сказал *важно*` давало `сноску<i> и сказал </i>важно*` — книга выделяет
слова, которых модель не выделяла, и файл при этом валиден. Тем же счётом ломался авторский разделитель сцены
`* * *``<i> </i> *`. ⇒ фланкирующее правило при равных глифах: открывающим не может быть маркер после
буквы или цифры, закрывающим — после пробела. Это ровно форма, какую производит ингест, поэтому законное
выделение не теряется, а авторская пунктуация не трогается.
**ЧТО ЕЩЁ ПОЧИНЕНО** (каждое с пином, каждый пин пере-проверен посадкой): счётчик `italic_carriers` считал
носителей в ИСКЛЮЧЁННЫХ служебных документах (обложка с одним курсивом прятала ноль, ради которого счётчик и
заведён) · пара, объявившая разметку над `.txt`-книгой, получала ТИШИНУ вместо честного нуля — а боевая
китайская книга именно `.txt` · блочная обёртка с курсивным классом (`<blockquote class="ital">` — так верстают
стихи и эпиграфы) теряла ВСЁ выделение молча · `<br><br>` внутри прогона разрывал пару маркеров между чанками ·
вложенный `<span>` закрывал внешний `<span class="italic">` раньше времени · правило `h1.prologue` красило
заголовки как класс на любом теге (во второй английской книге дерева таких 26) · белый список полей брифа и
его проводка были двумя копиями одного списка · ключ `prompt_versions` с опечаткой был мёртвым и молча
оставлял общий лейбл · пробелы в значении брифа трактовались двояко · писатель книги вооружался маркерами и
для `.txt`-источника, которого ингест не размечал · пустой курсивный спан (`**слово**`) съедался без следа.
**ТРИ ПОПРАВКИ К МОИМ СОБСТВЕННЫМ УТВЕРЖДЕНИЯМ.**
1. Условие у ключа `batch_runes` («ни один пак в дереве не несёт `terminology.txt`») **опровергнуто тем же
коммитом**, который этот файл и добавляет. Вывод «бампать не надо» верен, но по ДРУГОМУ правилу; следующая
сессия, честно проверив названное условие, нашла бы его ложным и могла бампнуть тег — а он сидит в версии
КАЖДОГО пака.
2. Утверждение в `inline-markup.txt` «маркер переживает сплиттер предложений как обычная пунктуация» **ложно**:
замерено 17 190 → 17 159 предложений и 385 → 386 чанков на боевой книге.
3. Посылка выбора глифа снята на ОДНОЙ книге: вторая английская книга дерева несёт **12 авторских звёздочек**
(SMS в тексте). Движок теперь ПЕЧАТАЕТ `source_marker_glyphs` рядом с `italic_carriers`.
**ОТДЕЛЬНОЙ ОСЬЮ — ратифицированная правка данных, о которой просил оркестратор.**
`internal/lang/data/injection.txt:12` предписывал «при неизбежности — мужские родовые формы». Решение владельца
(«Просить редактора перестроить, если литературно художественно не получается, то пусть пишет как лучше
читается») ратифицировано, и нота journalа объявила его ИСПОЛНЕННЫМ — а в данных оно исполнено не было.
⇒ строка приведена к решению; доккомментарий `membank/memory.go` (`genderConstraintNote`), описывавший
несуществующий мужской дефолт со ссылкой на `D19.3`, исправлен тем же движением; пин `TestDC3GenderInjection`
усилен — он проверял только первые слова строки и пропустил бы дефолт.
**ЦЕНА НАЗВАНА:** файл фолдится БЕЗУСЛОВНО через `lang.EmbeddedVersion()` ⇒ сдвигается снапшот КАЖДОЙ книги,
включая китайскую. Ключ манифеста китайской пробы ушёл `ac9c075a…``ec8788ea…`, и **это заявленная ось, а не
регресс**: для холодного прогона (свежие проекты) $0, для книги с оплаченными чекпойнтами следующий резюм
потребует `--resnapshot`. Ре-капчур голденов предъявлен ПО ОДНОЙ ОСИ: маскированный структурный дифф
(хеши/версии → плейсхолдер) **пуст**, сдвинулся один файл `capture.golden`, 86/86 строк — только хеши.
⚠ И честно: ни один голден не рендерит саму `gender_hidden` — прибор это назвал (`пол СКРЫТ` в голденах 0 при
контроле `муж. —` 16), поэтому новую строку стережёт `TestDC3GenderInjection`, а не голден.
**ЧИСЛА, СНЯТЫЕ ПОСЛЕ ПОСЛЕДНЕЙ ПРАВКИ.** `make battery`**MAKE_EXIT=0, строк FAIL ноль**; полнота списком:
24 пакета против 24 вердиктов, `comm` пуст в обе стороны; скипов 6, все корпусные, поимённо те же.
**Мутации: 10 новых записей, все введены в гейт** (каталог 547 → 557, в гейте 336 → 346), исход **10 RED,
0 выживших, 0 неизмеренных** — но это ПОСЛЕ починки прибора: первый прогон дал 7 RED, одну ВЫЖИВШУЮ (пустой
пин, см. выше) и одну НЕИЗМЕРЕННУЮ (посадка не собралась), и обе разобраны, а не списаны. Статический обход
якорей 557/557 чист; одна прежняя запись (`SP-epub-italics-not-carried-to-the-chunk`) сгнила от моей же правки
кода и пере-нацелена. Английская книга по-прежнему доезжает: `EXIT=4`, `TOTAL $0.000000`, 386 чанков,
`italic_carriers=4842`.
**ФЛЕЙК, КОТОРЫЙ НЕ МОЙ — и доказано это правильным контролем, а не удобным.** Прогон гейта один раз упал в
ПРОХОДЕ СБОРА СКИПОВ (`Makefile:132`, второй полный `go test` без `-race`) на
`TestARefusalIsNotAPurchaseEvenWhenTheReplyOutrunsTheWrite` в `internal/llm`. ⚠ Сперва я написала «пакет не
трогала» — **неверно**: заландённый коммит добавил в `httpllm.go` 19 строк (`CreditsExhausted`), поймал это
оркестратор. Пере-снято против правильного контроля — дерева `9defda4^`, где моей правки НЕТ: под равной
нагрузкой **2 падения из 30 в контрольном дереве и 0 из 30 в моём**. Причина понята, а не угадана: тест гонит
11 МБ тела, которое сервер не читает, отдаёт обрывок статус-строки и спит фиксированные 200 мс перед RST —
под нагрузкой планировщик не успевает. Мой предикат при этом внутри пакета не зовётся ни разу (0 вызовов).
⇒ ряд на флейк — предмет оркестратора, не мой.
**ЧЕГО НЕ ЧИНИЛА И ПОЧЕМУ.** Сам фолд комментариев (снятие двинуло бы китайский пак) · ключ `prompt_versions`,
который именует существующий файл, но не взят ни одной стадией (законно: плоский `translator` живёт для c2) ·
асимметрия `prompt_override`, который пар-лейбла не получает (сегодня им не пользуется ни один боевой конфиг) ·
платформенная половина ряда 272 · детектор выделения для японского (`text-emphasis`, 傍点) и вторая пара
маркеров (жирный) — это Go и отдельный предмет, ряд.
⛔⛔ **КРУГ СХОДИМОСТИ НЕ СОШЁЛСЯ С ПЕРВОГО РАЗА, И БЛОКЕР ВНЕСЛА САМА ПОЧИНКА.** Третий круг (атака на
ПОЧИНКИ второго, а не на исходную работу) дал семь наблюдений, одно из них — блокер читательского пути,
созданный моим же фланкирующим правилом.
**Посылка правила была ложной, и выведена она ЧТЕНИЕМ КОДА, а не замером его выхода.** Я написала в
комментарии: «открывающий маркер никогда не стоит после буквы или цифры, потому что такова форма, какую
производит `wrap`». Замер на выходе ингеста боевой книги: **68 прогонов из 4842 открываются сразу после
буквы или знака** — курсив падает на точку (`HIM*.*`), на запятую (`heat*,*`), внутрь слова
(`Fucks*sakes*`). Такие маркеры правило отвергало как открывающие и ПРОПУСКАЛО, после чего их закрывающий
становился открывающим. Замер порчи на боевой книге: **68 выделений потеряно, 136 звёздочек вышло наружу
как пунктуация, 67 абзацев отрендерено иначе** — в EPUB, который откроет читатель.
**Три свойства сделали это невидимым, и все три были у меня налицо:** батарея зелёная (порча живёт в
СОДЕРЖАНИИ отгружаемого файла, а не в его валидности) · **мой собственный новый пин держал постоянной ровно
ту форму, которая ломается** — во всех пяти кейсах открывающий стоял после пробела или в начале строки ·
**мутация под починку фиксировала сломанное поведение как норму**, то есть гейт защищал дефект. Третье
коварнее всего: посадка выглядит доказательством, а доказывает обратное.
**Лечение по роду:** правило опирается теперь ТОЛЬКО на то, что `wrap` гарантирует ПО ПОСТРОЕНИЮ —
внутренняя сторона маркера не пробел (открывающий, за которым следует не-пробел; закрывающий, перед которым
не-пробел). Внешняя сторона не спрашивается вовсе. **Предъявлено дифференциальным замером на боевой книге
против состояния ДО правки: 4842 выделения из 4842, ноль звёздочек снаружи, НОЛЬ расходящихся абзацев** —
то есть на книге, чьи маркеры наши и сбалансированы, правило байт-в-байт прозрачно, а от потерянного
маркера защищает. Пин пере-написан так, что ВЕДУТ его те самые формы, на которых правило ломалось.
⚠ Названный предел: когда обе стороны авторского глифа — текст (`5*5=25`), отличить его нельзя ничем; ответ
на это — замер `source_marker_glyphs` (0 на боевой книге, 12 на второй английской), а не более хитрый
предикат. Именно «более хитрый предикат» и стоил 68 прогонов.
**Ещё шесть находок того же круга, все закрыты:** починка `dc:description` была **ИНЕРТНОЙ** — глифы
ставились на книгу ПОСЛЕ ассемблера, который её и рендерит (теперь рендер идёт после) · гейт «пара учит свой
глиф промтам» был **ПУСТЫМ**: его удовлетворял markdown-буллет, и ревьюер доказал это, вырезав из промтов
всё объяснение глифа и получив зелёный (теперь строки-буллеты не считаются свидетельством) · гейт файлов
пака не ловил «верное имя не в том каталоге» (теперь имена ключуются РОДОМ каталога) · CSS-сканер бросал
весь остаток стилей на скобке внутри строкового литерала и на незакрытом правиле — регресс против прежнего
кода (теперь строковые литералы пропускаются, а незакрытое правило дочитывается) · названо условие, при
котором блочное курсивное исключение перестаёт держаться (незакрытый блок красит остаток документа — это
верное чтение сломанной разметки, но чтение, которого никто не выбирал) · наблюдение о стоимости `inItalic()`
на патологической вложенности записано как наблюдение, не как дефект.
⛔ **СОСТОЯНИЕ ЭТОГО ДЕРЕВА МЕНЯЛОСЬ ДВАЖДЫ ПОСЛЕ СЛОВА О ЗАВЕРШЕНИИ, и акт обязан назвать, на каком из них
сняты его числа.** Я сказала «работа завершена» по ПАМЯТИ о сделанном, а затем пошла сверяться со списком
§13 промта — и нашла два буллета первого ревью, которые считала исполненными и которые исполнены не были:
обещание «оба формата отвечают за маркеры» (при равных глифах txt-отображение есть байтовый no-op, то есть
непарность видна ТОЛЬКО в EPUB, а комментарий утверждал симметрию) и `dc:description`, собиравшееся из строк
с движковыми глифами в метаданные, где разметка не допускается вовсе. Правка пришла ПОСЛЕ слова и стоила
оркестратору полной мутационной кампании: его 346 из 346 описывают замороженную копию, а не это дерево.
⇒ класс ошибки — «самоотчёт „проверено“ без исполнения»; лечение — сверяться со списком ДО слова, а не после.
**Работа завершена, править не планирую.**
#### ОТЧЁТ пака «ДОСТИЖИМОСТЬ ПАР-ДАННЫХ ДО ХОЛОДНОГО ПРОГОНА» (18.09, сессия `textmachine-main-c8`). НЕ КОММИЧУ — дерево передаю оркестратору №23
**Деньги пака: $0.** Платных вызовов моделей — ноль. Живые пробы движка гонялись на боевом