From 222e72ad50029f456640cfb69c846336d3a37536 Mon Sep 17 00:00:00 2001 From: heaven Date: Fri, 11 Sep 2026 16:03:04 +0300 Subject: [PATCH] Make the row catch both halves of the lost gate, and say that a vanished skip proves a test runs, not that it holds --- CLAUDE.md | 6 ++++++ docs/BACKLOG.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index f743637b..0a7e22fa 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -174,6 +174,12 @@ Go-бэкенд издательского художественного пер красное, инструмент — «unexpected outcome». ⇒ денежный пин гоняется НЕ ОДИН РАЗ, а фикстура строится так, чтобы деньги были НЕИЗБЕЖНЫ, а не вероятны (после перестройки 8/8 зелёных на дереве и 8/8 красных на мутанте). Нашла зона у СЕБЯ, инструментом, а не глазом. + ⛔ **«SKIP ПРЕВРАТИЛСЯ В PASS» ДОКАЗЫВАЕТ, ЧТО ТЕСТ ИДЁТ, А НЕ ЧТО ОН ДЕРЖИТ** (формулировка зоны 11.09). + Введя корпусные переменные в гейт, легко счесть дело сделанным по тому, что скипы исчезли. Это про + ЗАПУСК. Что ступень НЕСУЩАЯ, доказывает только одно: посадка, сломавшая предмет, краснеет ИМЕННО ЕЮ. + ⭐ Замер: `C-verdict-leaves-the-anchored-column` поймана ДВУМЯ тестами — синтетическим пином и оракулом + холодного прогона; значит сломать первичную колонку и получить зелёный гейт нельзя даже мимо + синтетики. ⇒ **после включения любой ступени в гейт спроси её посадкой, а не списком скипов.** ⛔ **МУТАЦИЯ ЗАСЧИТЫВАЕТСЯ ПО ТЕКСТУ СООБЩЕНИЯ, А НЕ ПО ФАКТУ КРАСНОТЫ.** Читай ТЕКСТ падения: говорит ли он про сломанное тобой. Правый вердикт по неправой причине — дыра, а не поимка, и от настоящей поимки отличается только тем, прочёл ли кто-нибудь текст, а не цвет (`D39.217` п.2в). diff --git a/docs/BACKLOG.md b/docs/BACKLOG.md index 67cae713..d466897d 100644 --- a/docs/BACKLOG.md +++ b/docs/BACKLOG.md @@ -350,4 +350,4 @@ | 428 | ⛔ **ЧЕТВЁРТАЯ ЛОВУШКА ДЛЯ СЧИТАЮЩИХ ДЕНЬГИ, и она умножает счёт на число КОПИЙ базы.** Замер оркестратора 11.09 при приёмке (контроль: `find` дал **449** файлов `*.db`, таблицу `spend` несут **406**, строк `spend` — **295**, различных дат — 18): сумма `committed_usd` по всем базам машины за 11.09 даёт **$4.354443 на 13 строках**, тогда как настоящая трата дня — **$0.419423 ОДИН раз**. Разница — не ошибка движка: таблица `spend` ключуется `(book_id, date)` и переезжает вместе с файлом, а рабочая сессия сделала девять копий базы прогона (`runA`, `runA-frozen`, `dbcopy`, обзорные копии, пред-миграционные бэкапы) — **одна и та же строка сосчиталась десять раз**. Плюс промежуточный бэкап на $0.16021 добавил одиннадцатый счёт того же прогона в другой момент времени. ⛔ **И тем же множителем больна ВТОРАЯ таблица, что я обнаружил только пере-замером по наводке аудита: `request_log` — 58 886 строк-экземпляров на 449 базах суть **5 413 УНИКАЛЬНЫХ**, множитель **10.88×**.** Я опубликовал по нему числа подстановки цены (ряд 413) и контроль ряда 422, не применив к ним собственную норму из ЭТОГО ряда — между заведением нормы и её нарушением прошёл час. ⇒ **любой денежный свод, собранный обходом файлов по диску, завышает трату кратно числу копий**, и это первое, к чему потянется рука при вопросе «сколько мы потратили за день». ⚠ Родня трёх ловушек акта `D39.247` п.5 (`run_attempts.spend_micro_usd` накопленная · `err` пуст на провалах · `chunk_status` недобирает терминологию) — у всех один класс: **прибор денег отвечает на вопрос, которого ему не задавали.** Лечение — не код, а норма свода: деньги считаются по УНИКАЛЬНОМУ `(book_id, date)` либо по одной авторитетной базе, и рядом печатается, сколько файлов прибор обошёл | оркестратор | скоро | норма денежного свода в ролевом промте + дедупликация по `(book_id, date)` | приёмка пака консистентности, 11.09 | | 429 | **БОЕВОЙ КОНФИГ НЕСЁТ ОТОЗВАННЫЙ ВЕНДОРСКИЙ КЛЕЙМ, И ЧИТАТЕЛЬ ЕМУ ВЕРИТ.** `backend/configs/pipeline-c1.yaml:86`=`v4-pro maps low` дословно: «v4-pro maps low→high, effective effort unchanged». Это было верно до 30.08 и **ОТОЗВАНО**: вендор сменил маппинг (`docs/experiments/00-provider-quirks.md` §3а — таблица теперь ОДНА на обе модели, `low→low`), и поведенческая проба полигона 30.08 за $0.038276 показала, что `low` до `pro` ДОХОДИТ. ⇒ комментарий в дереве утверждает ровно обратное живой правде, и стоит он в том самом файле, который промты велят читать. ⚠ Цена не гипотетическая: на этом клейме строилась оценка «ручки у редактора нет вовсе», и она уже уводила решение. ⛔ **Класс шире одной строки: вендорский факт, вмороженный в комментарий, протухает молча — у комментария нет ни даты, ни гейта, ни владельца.** Лечение узкое — привести строку в соответствие; лечение широкое — правило, по которому вендорский факт в коде несёт дату снятия и указатель на квирки, а не живёт вечно | бэкенд | скоро | правка строки 86 + правило «вендорский факт в комментарии несёт дату и адрес» | аудит смены 11.09 | | 430 | **ОПЕРАЦИОННЫЙ ДОЛГ СМЕНЫ 11.09, У КОТОРОГО НЕ БЫЛО НОСИТЕЛЯ НИГДЕ — заведён аудитом.** **(а) Стенд платного прогона A оставлен ПОДНЯТЫМ полигонной сессией и жив вторые сутки:** `tmplatformd` уже мёртв, но кластер postgres работает (`~/.local/share/tmstand/pgdata`, сокет `/tmp:55433`, ~245 МБ на девяти процессах — замерено `ps`). ⛔ **Гасить СЕЙЧАС нельзя, и это решение, а не забывчивость:** бэкенд-батарея без живого postgres СКИПАЕТ денежные пути (замерено при приёмке прогона A: первая «зелень» имела 420 пропущенных тестов, все «нет живого Postgres»), а её финальный гейт идёт прямо сейчас. ⇒ гасить ПО PID после закрытия бэкенд-пака актом; полигонная сессия велела «только по pid», и это верно — на машине живут чужие прогоны. **(б) Улики прогона A закоммичены (`ef0509f`, 33 файла) и НЕ ОТПРАВЛЕНЫ:** репозиторий книг на один коммит впереди `origin/main`, санкция владельца получена 11.09 («Да»), выполнить пуш должен он у себя — мой классификатор прав это действие не пропускает. ⇒ **единственная копия улик платного прогона живёт на ОДНОЙ машине.** ⚠ Класс обоих: операционное состояние, о котором знают только участники разговора, носителем не является — ровно тот класс, что эта смена ловила у себя дважды | оркестратор/владелец | **скоро** | (а) гашение по pid после акта; (б) `git -C books push origin HEAD` — действие владельца | аудит смены 11.09 | -| 431 | ⛔ **СЕССИИ ЗОН НЕ МОГУТ СНЯТЬ ПОЛНЫЙ МУТАЦИОННЫЙ КАТАЛОГ ПО СРЕДЕ, А ОРКЕСТРАТОР МОЖЕТ — и это делает «оркестратор добирает за зону» НОРМОЙ ПО УМОЛЧАНИЮ.** Замер 11.09: бэкенд-сессию убило ЧЕТЫРЕ раза подряд на пере-снятии десяти записей (дважды 0 из 10, падало на первой). Причина — не машина и не нагрузка: `dmesg` даёт **26** убийств, **все с `constraint=CONSTRAINT_MEMCG`**, каждое в своём транзиентном юните `tm.slice/tm-runs.slice/tm-test-*`; сами слайсы при этом `memory.max = max`. А прогон оркестратора идёт в `/init.scope` с `memory.max = max` и доходит до конца (проверено: тот же каталог, та же команда, 10 из 10 сняты). ⇒ **разница не в умении, а в СКОУПЕ**, и пока она есть, полный каталог структурно может снять только оркестратор. ⛔ **Цена этого — ползучая подмена рубежа:** приёмка обязана СУДИТЬ чужую работу, а не производить её измерения; если зона по среде не может снять свой главный гейт, то «пере-снял своим прибором» (норма) незаметно превращается в «сделал за неё» (подмена). ⭐ Различение, которым это лечится, ратифицируется актом пака консистентности: **пере-снял = повторил ИМЕЮЩЕЕСЯ измерение зоны; сделал за неё = произвёл измерение, которого у зоны НЕТ, и вписал как её.** ⇒ лечение по существу: поднять потолок транзиентных юнитов до замеренного пика `tmmutate` ЛИБО гонять полный каталог в скоупе без потолка объявленно, с числом из `dmesg` рядом — но не оставлять это молчаливым свойством среды | оркестратор/владелец | **скоро** | потолок юнитов поднят до замеренного пика ЛИБО объявлено, что полный каталог снимает оркестратор, и почему | замер оркестратора 11.09, разбор со старшим коллегой | +| 431 | ⛔ **СЕССИИ ЗОН НЕ МОГУТ СНЯТЬ ПОЛНЫЙ МУТАЦИОННЫЙ КАТАЛОГ ПО СРЕДЕ, А ОРКЕСТРАТОР МОЖЕТ — и это делает «оркестратор добирает за зону» НОРМОЙ ПО УМОЛЧАНИЮ.** Замер 11.09: бэкенд-сессию убило ЧЕТЫРЕ раза подряд на пере-снятии десяти записей (дважды 0 из 10, падало на первой). Причина — не машина и не нагрузка: `dmesg` даёт **26** убийств, **все с `constraint=CONSTRAINT_MEMCG`**, каждое в своём транзиентном юните `tm.slice/tm-runs.slice/tm-test-*`; сами слайсы при этом `memory.max = max`. А прогон оркестратора идёт в `/init.scope` с `memory.max = max` и доходит до конца (проверено: тот же каталог, та же команда, 10 из 10 сняты). ⇒ **разница не в умении, а в СКОУПЕ**, и пока она есть, полный каталог структурно может снять только оркестратор. ⛔ **Цена этого — ползучая подмена рубежа:** приёмка обязана СУДИТЬ чужую работу, а не производить её измерения; если зона по среде не может снять свой главный гейт, то «пере-снял своим прибором» (норма) незаметно превращается в «сделал за неё» (подмена). ⭐ Различение, которым это лечится, ратифицируется актом пака консистентности: **пере-снял = повторил ИМЕЮЩЕЕСЯ измерение зоны; сделал за неё = произвёл измерение, которого у зоны НЕТ, и вписал как её.** ⛔ **И ВТОРАЯ ПОЛОВИНА, названная САМОЙ ЗОНОЙ, без которой ряд лечит не то: дело не только в потолке.** Её слова: даже без потолка она потеряла бы прогон ДВАЖДЫ — первый раз потому, что пустила второй мутатор по чужому корню, второй раз потому, что `diff -rq` убедил её, будто результаты целы. ⇒ **из четырёх потерь две — СРЕДЫ, две — МЕТОДА.** Ряд обязан ловить оба: «зона не может снять свой гейт по среде» И «зона портит собственный гейт методом». Иначе потолок починят и удивятся, что не помогло. ⇒ лечение по существу: поднять потолок транзиентных юнитов до замеренного пика `tmmutate` ЛИБО гонять полный каталог в скоупе без потолка объявленно, с числом из `dmesg` рядом — но не оставлять это молчаливым свойством среды | оркестратор/владелец | **скоро** | потолок юнитов поднят до замеренного пика ЛИБО объявлено, что полный каталог снимает оркестратор, и почему | замер оркестратора 11.09, разбор со старшим коллегой |