From 2a2ba4a45172167ea20c71de4e0ab5e3b60f47fc Mon Sep 17 00:00:00 2001 From: heaven Date: Fri, 18 Sep 2026 17:42:15 +0300 Subject: [PATCH] Record the second-pair reachability report and its adversarial round, written by the backend session in its own journal section --- docs/PROGRESS.md | 146 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index b1a2e421..214c6528 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -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. ⛔ Порча ЧИТАТЕЛЬСКОГО файла, которой в акте нет.** Один потерянный моделью маркер ИНВЕРТИРОВАЛ +выделение до конца абзаца: `сноску* и сказал *важно*` давало `сноску и сказал важно*` — книга выделяет +слова, которых модель не выделяла, и файл при этом валиден. Тем же счётом ломался авторский разделитель сцены +`* * *` → ` *`. ⇒ фланкирующее правило при равных глифах: открывающим не может быть маркер после +буквы или цифры, закрывающим — после пробела. Это ровно форма, какую производит ингест, поэтому законное +выделение не теряется, а авторская пунктуация не трогается. + +**ЧТО ЕЩЁ ПОЧИНЕНО** (каждое с пином, каждый пин пере-проверен посадкой): счётчик `italic_carriers` считал +носителей в ИСКЛЮЧЁННЫХ служебных документах (обложка с одним курсивом прятала ноль, ради которого счётчик и +заведён) · пара, объявившая разметку над `.txt`-книгой, получала ТИШИНУ вместо честного нуля — а боевая +китайская книга именно `.txt` · блочная обёртка с курсивным классом (`
` — так верстают +стихи и эпиграфы) теряла ВСЁ выделение молча · `

` внутри прогона разрывал пару маркеров между чанками · +вложенный `` закрывал внешний `` раньше времени · правило `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.** Платных вызовов моделей — ноль. Живые пробы движка гонялись на боевом